Merge branch 'develop' into feature/safari

This commit is contained in:
EnixCoda 2022-01-14 16:34:05 +08:00
commit 7ab1c95b99
82 changed files with 6583 additions and 4197 deletions

2
.env.arm.mac Normal file
View file

@ -0,0 +1,2 @@
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true
PUPPETEER_EXEC_PATH=/opt/homebrew/bin/chromium

4
.github/FUNDING.yml vendored
View file

@ -1,8 +1,8 @@
# These are supported funding model platforms
github: enixcoda
patreon: enixcoda
open_collective: enixcoda
patreon: # enixcoda
open_collective: # enixcoda
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 37 KiB

View file

@ -4,6 +4,11 @@ FULL_VERSION=v$(RAW_VERSION)
pull-icons:
git clone git@github.com:vscode-icons/vscode-icons.git vscode-icons --depth=1
update-icons:
cd vscode-icons && git pull
node scripts/resolve-languages-map
node scripts/generate-icon-index
build:
rm -rf dist
yarn build

View file

@ -1,45 +1,47 @@
# Gitako
<p align="center">
<img width="256" src="src/assets/icons/Gitako.png" />
<img width="192" src="src/assets/icons/Gitako.png" />
</p>
Gitako is a file tree extension for GitHub, available for Chrome, Firefox and Edge. And more than that, it has lots of useful features.
Gitako is a free file tree extension for GitHub, available on Chrome, Firefox and Edge.
### Features
- 📂 neat file tree for repository and pull request
- 🔎 instant file search and navigation
- 🕶️ support private repositories and [GitHub enterprise](https://github.com/EnixCoda/Gitako/wiki/Use-in-GitHub-enterprise-and-other-sites)
- 🏎 extremely fast even in gigantic projects
- ⌨️ intuitive keyboard accessibility
- 🗂 support git submodule
- ↔️ resizable layout
- 📋 copy snippets and file
- 🎨 friendly UI and rich icons
- 📂 File tree for repository and pull request
- 🔎 Instant file search and navigation
- 🕶️ Support private repositories
- 🧩 Support [GitHub enterprise](https://github.com/EnixCoda/Gitako/wiki/Use-in-GitHub-enterprise-and-other-sites), Gitea, Gitee, and [more](https://github.com/EnixCoda/Gitako/issues/60)
- 🏎 Always performant, even in gigantic projects
- ⌨️ Intuitive keyboard navigation
- 📋 Copy snippets and file content
- 🎨 Various icons and official themes support
- 🗂 Support git submodule
- 📏 Fold source code
### Installation
### Install
[![Install for Chrome](./ChromeWebStoreBadge.svg)](https://chrome.google.com/webstore/detail/gitako-github-file-tree/giljefjcheohhamkjphiebfjnlphnokk)
<a href="https://chrome.google.com/webstore/detail/gitako-github-file-tree/giljefjcheohhamkjphiebfjnlphnokk"><img width="64" alt="Chrome" src="./assets/Chrome.svg" /></a>
<a href="https://microsoftedge.microsoft.com/addons/detail/alpoloddcggjhakjemghahlkofjekbca"><img width="64" alt="Edge" src="./assets/Edge.svg" /></a>
<a href="https://addons.mozilla.org/en-US/firefox/addon/gitako-github-file-tree/"><img width="64" alt="Firefox" src="./assets/Firefox.svg" /></a>
[for Edge](https://microsoftedge.microsoft.com/addons/detail/alpoloddcggjhakjemghahlkofjekbca)
[for Firefox](https://addons.mozilla.org/en-US/firefox/addon/gitako-github-file-tree/)
It is more recommended for Edge users to install from Chrome store. It may delay for weeks before updates got published to Edge store because its review process is slow.
### Help Gitako
If you appreciate Gitako and would like to help it grow better, please either
- Give it a star ⭐️ at GitHub
- Leave a review 👍 in the extension store
Gitako is **FREE**. If you like it, please
Feature request discussions and bug reports are welcome, feel free to draft an [issue](https://github.com/EnixCoda/Gitako/issues/)!
- ⭐️ Star it at GitHub
- 👍 Review in the extension store
[Feature discussions](https://github.com/EnixCoda/Gitako/discussions) and [bug reports](https://github.com/EnixCoda/Gitako/issues/) are also welcome!
### About
#### Name and logo?
#### Source of the name and logo?
The totem of GitHub is a cute octopus. And octopus in Japanese is `タコ`(tako).
Then link them together:
Then concat them together:
git + tako -> gitako

View file

@ -1,4 +1,4 @@
import { expectToFind, expectToNotFind, sleep, waitForLegacyPJAXRedirect } from '../utils'
import { expectToFind, expectToNotFind, sleep, waitForLegacyPJAXRedirect } from '../../utils'
describe(`in Gitako project page`, () => {
beforeAll(() => page.goto('https://github.com/EnixCoda/Gitako/commits/develop'))

View file

@ -1,4 +1,4 @@
import { expectToFind, expectToNotFind, sleep, waitForLegacyPJAXRedirect } from '../utils'
import { expectToFind, expectToNotFind, sleep, waitForLegacyPJAXRedirect } from '../../utils'
describe(`in Gitako project page`, () => {
beforeAll(() => page.goto('https://github.com/EnixCoda/Gitako/tree/develop/src'))
@ -9,8 +9,9 @@ describe(`in Gitako project page`, () => {
`.js-details-container div[role="row"] div[role="rowheader"] a[title*="."]`,
)
if (commitLinks.length < 2) throw new Error(`No enough files`)
await commitLinks[i].click()
await waitForLegacyPJAXRedirect()
await waitForLegacyPJAXRedirect(async () => {
await commitLinks[i].click()
})
await expectToFind('table.js-file-line-container')
await sleep(1000)

View file

@ -4,8 +4,8 @@ import {
patientClick,
selectFileTreeItem,
sleep,
waitForLegacyPJAXRedirect,
} from '../utils'
waitForLegacyPJAXRedirect
} from '../../utils'
describe(`in Gitako project page`, () => {
beforeAll(() => page.goto('https://github.com/EnixCoda/Gitako/tree/develop/src'))

View file

@ -5,8 +5,8 @@ import {
patientClick,
selectFileTreeItem,
sleep,
waitForPJAXAPIRedirect,
} from '../utils'
waitForLegacyPJAXRedirect
} from '../../utils'
describe(`in Gitako project page`, () => {
beforeAll(() => page.goto('https://github.com/EnixCoda/Gitako'))
@ -16,17 +16,17 @@ describe(`in Gitako project page`, () => {
await expandFloatModeSidebar()
await patientClick(selectFileTreeItem('.babelrc'))
await waitForPJAXAPIRedirect()
await waitForLegacyPJAXRedirect()
// The selector for file content
await expectToFind('table.js-file-line-container')
page.goBack()
await waitForPJAXAPIRedirect()
await waitForLegacyPJAXRedirect(async () => {
await sleep(1000) // This prevents failing in some cases due to some mystery scheduling issue of puppeteer or jest
page.goBack()
})
// The selector for file content
await expectToNotFind('table.js-file-line-container')
// await waitForPJAXAPIRedirect()
})
})

View file

@ -3,8 +3,8 @@ import {
expectToFind,
expectToNotFind,
scroll,
selectFileTreeItem,
} from '../utils'
selectFileTreeItem
} from '../../utils'
describe(`in Gitako project page`, () => {
beforeAll(() => page.goto('https://github.com/EnixCoda/Gitako'))
@ -22,11 +22,11 @@ describe(`in Gitako project page`, () => {
const filesEle = await page.waitForSelector('.gitako-side-bar .files')
// node of tsconfig.json should NOT be rendered before scroll down
await expectToNotFind(selectFileTreeItem('tsconfig.json'))
const box = await filesEle.boundingBox()
await expectToNotFind(selectFileTreeItem('package.json'))
const box = await filesEle?.boundingBox()
if (box) {
await page.mouse.move(box.x + 40, box.y + 40)
await scroll({ totalDistance: 100, duration: 1000 })
await scroll({ totalDistance: 200, duration: 1000 })
// node of tsconfig.json should be rendered now
await expectToFind(selectFileTreeItem('tsconfig.json'))

View file

@ -1,8 +1,8 @@
/**
* Make sure some basic behaviors of puppeteer assertions
* Confirm basic behaviors of puppeteer assertions
*/
import { expectToFind, expectToNotFind } from '../utils'
import { expectToFind, expectToNotFind } from '../../utils'
describe(`in random page`, () => {
beforeAll(() => page.goto('https://google.com'))

View file

@ -0,0 +1,25 @@
import {
expectToFind,
selectFileTreeItem,
sleep,
waitForLegacyPJAXRedirect
} from '../../utils'
describe(`in Gitako project page`, () => {
beforeAll(() => page.goto('https://github.com/EnixCoda/Gitako/tree/develop/src'))
it('expand to target on load and after PJAX', async () => {
await sleep(3000)
// Expect Gitako sidebar to have expanded src to see contents
await expectToFind(selectFileTreeItem('src/components'))
await page.click(
`.js-details-container div[role="row"] div[role="rowheader"] [title="components"]`,
)
await waitForLegacyPJAXRedirect()
// Expect Gitako sidebar to have expanded components and see contents
await expectToFind(selectFileTreeItem('src/components/Gitako.tsx'))
})
})

View file

@ -1,4 +1,4 @@
import { expectToNotFind } from '../utils'
import { expectToNotFind } from '../../utils'
describe(`in GitHub homepage`, () => {
beforeAll(() => page.goto('https://github.com'))

View file

@ -1,4 +1,4 @@
import { expectToFind } from '../utils'
import { expectToFind } from '../../utils'
describe(`in Gitako project page`, () => {
beforeAll(() => page.goto('https://github.com/EnixCoda/Gitako/pull/71'))

185
__tests__/jest.config.js Normal file
View file

@ -0,0 +1,185 @@
// For a detailed explanation regarding each configuration property, visit:
// https://jestjs.io/docs/en/configuration.html
module.exports = {
// All imported modules in your tests should be mocked automatically
// automock: false,
// Stop running tests after `n` failures
// bail: 0,
// Respect "browser" field in package.json when resolving modules
// browser: false,
// The directory where Jest should store its cached dependency information
// cacheDirectory: "/private/var/folders/6j/kp9yt47x4872_k7d4gdjbwfm0000gn/T/jest_dx",
// Automatically clear mock calls and instances between every test
// clearMocks: false,
// Indicates whether the coverage information should be collected while executing the test
// collectCoverage: false,
// An array of glob patterns indicating a set of files for which coverage information should be collected
// collectCoverageFrom: null,
// The directory where Jest should output its coverage files
// coverageDirectory: null,
// An array of regexp pattern strings used to skip coverage collection
// coveragePathIgnorePatterns: [
// "/node_modules/"
// ],
// A list of reporter names that Jest uses when writing coverage reports
// coverageReporters: [
// "json",
// "text",
// "lcov",
// "clover"
// ],
// An object that configures minimum threshold enforcement for coverage results
// coverageThreshold: null,
// A path to a custom dependency extractor
// dependencyExtractor: null,
// Make calling deprecated APIs throw helpful error messages
// errorOnDeprecated: false,
// Force coverage collection from ignored files using an array of glob patterns
// forceCoverageMatch: [],
// A path to a module which exports an async function that is triggered once before all test suites
// globalSetup: null,
// A path to a module which exports an async function that is triggered once after all test suites
// globalTeardown: null,
// A set of global variables that need to be available in all test environments
// globals: {},
// The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers.
maxWorkers: 8,
// An array of directory names to be searched recursively up from the requiring module's location
// moduleDirectories: [
// "node_modules"
// ],
// An array of file extensions your modules use
// moduleFileExtensions: [
// "js",
// "json",
// "jsx",
// "ts",
// "tsx",
// "node"
// ],
// A map from regular expressions to module names that allow to stub out resources with a single module
// moduleNameMapper: {},
// An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader
// modulePathIgnorePatterns: [],
// Activates notifications for test results
// notify: false,
// An enum that specifies notification mode. Requires { notify: true }
// notifyMode: "failure-change",
// A preset that is used as a base for Jest's configuration
preset: 'jest-puppeteer',
// Run tests from one or more projects
// projects: null,
// Use this configuration option to add custom reporters to Jest
// reporters: undefined,
// Automatically reset mock state between every test
// resetMocks: false,
// Reset the module registry before running each individual test
// resetModules: false,
// A path to a custom resolver
// resolver: null,
// Automatically restore mock state between every test
// restoreMocks: false,
// The root directory that Jest should scan for tests and modules within
// rootDir: null,
// A list of paths to directories that Jest should use to search for files in
// roots: [
// "<rootDir>"
// ],
// Allows you to use a custom runner instead of Jest's default test runner
// runner: "jest-runner",
// The paths to modules that run some code to configure or set up the testing environment before each test
// setupFiles: [],
// A list of paths to modules that run some code to configure or set up the testing framework before each test
// setupFilesAfterEnv: [],
// A list of paths to snapshot serializer modules Jest should use for snapshot testing
// snapshotSerializers: [],
// The test environment that will be used for testing
// testEnvironment: 'node',
// Options that will be passed to the testEnvironment
// testEnvironmentOptions: {},
// Adds a location field to test results
// testLocationInResults: false,
// The glob patterns Jest uses to detect test files
testMatch: ['**/?(*.)+(spec|test).ts?(x)'],
// An array of regexp pattern strings that are matched against all test paths, matched tests are skipped
testPathIgnorePatterns: ['/node_modules/', '.d.ts$', '<rootDir>/vscode-icons/'],
// The regexp pattern or array of patterns that Jest uses to detect test files
// testRegex: [],
// This option allows the use of a custom results processor
// testResultsProcessor: null,
// This option allows use of a custom test runner
// testRunner: "jasmine2",
// This option sets the URL for the jsdom environment. It is reflected in properties such as location.href
// testURL: "http://localhost",
testTimeout: 20000,
// Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout"
// timers: "real",
// A map from regular expressions to paths to transformers
// transform: null,
// An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation
// transformIgnorePatterns: [
// "/node_modules/"
// ],
// An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them
// unmockedModulePathPatterns: undefined,
// Indicates whether each individual test should be reported during the run
// verbose: null,
// An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode
// watchPathIgnorePatterns: [],
// Whether to use watchman for file crawling
// watchman: true,
}

View file

@ -3,5 +3,5 @@ const baseConfig = require('./jest.config')
module.exports = {
...baseConfig,
maxWorkers: 1,
testMatch: ['**/__tests__/non-parallel-cases/*.ts?(x)'],
testMatch: [...baseConfig.testMatch, '**/__tests__/cases/non-parallel/*.ts?(x)'],
}

View file

@ -0,0 +1,6 @@
const baseConfig = require('./jest.config')
module.exports = {
...baseConfig,
testMatch: [...baseConfig.testMatch, '**/__tests__/cases/parallel/*.ts?(x)'],
}

View file

@ -1,6 +1,7 @@
{
"extends": "../tsconfig.json",
"include": ["."],
"exclude": ["tsconfig.json"],
"compilerOptions": {
"target": "ES3",
"module": "CommonJS",

View file

@ -68,12 +68,10 @@ export function once(event: string, target: 'document' | 'window') {
})
}
export function waitForLegacyPJAXRedirect() {
return once('pjax:end', 'document')
}
export function waitForPJAXAPIRedirect() {
return once('pjax:ready', 'document')
export async function waitForLegacyPJAXRedirect(action?: () => void | Promise<void>) {
const promise = once('pjax:end', 'document')
await action?.()
return promise
}
export function selectFileTreeItem(path: string): string {

1
assets/Chrome.svg Normal file
View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" viewBox="0 0 190 190"><linearGradient id="d" x1="28.3" x2="80.8" y1="75" y2="44.4" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#a52714" stop-opacity=".6"/><stop offset=".7" stop-color="#a52714" stop-opacity="0"/></linearGradient><linearGradient id="f" x1="109.9" x2="51.5" y1="164.5" y2="130.3" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#055524" stop-opacity=".4"/><stop offset=".3" stop-color="#055524" stop-opacity="0"/></linearGradient><linearGradient id="h" x1="121.9" x2="136.6" y1="49.8" y2="114.1" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ea6100" stop-opacity=".3"/><stop offset=".7" stop-color="#ea6100" stop-opacity="0"/></linearGradient><radialGradient id="a" cx="91.2" cy="55" r="84.1" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3e2723" stop-opacity=".2"/><stop offset="1" stop-color="#3e2723" stop-opacity="0"/></radialGradient><radialGradient id="i" cx="20.9" cy="47.5" r="78" xlink:href="#a"/><radialGradient id="j" cx="94.8" cy="95.1" r="87.9" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#263238" stop-opacity=".2"/><stop offset="1" stop-color="#263238" stop-opacity="0"/></radialGradient><radialGradient id="k" cx="33.3" cy="31" r="176.8" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#fff" stop-opacity=".1"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></radialGradient><clipPath id="b"><circle cx="95" cy="95" r="88"/></clipPath><g clip-path="url(#b)"><use fill="#db4437" xlink:href="#c"/><use fill="url(#d)" xlink:href="#c"/><use fill="#0f9d58" xlink:href="#e"/><use fill="url(#f)" xlink:href="#e"/><use fill="#ffcd40" xlink:href="#g"/><use fill="url(#h)" xlink:href="#g"/><g fill-opacity=".1"><path fill="#3e2723" d="M61.3 114.7L21 47.4l39 67.8z"/><path fill="#263238" d="M128.8 116.3l-.8-.4-37.3 67 38.3-67z"/></g><path id="e" d="M7 183h83.8l39-39v-29H60.2L7 23.5z"/><path id="g" d="M95 55l34.6 60L91 183h92V55z"/><path id="c" d="M21 7v108h39.4L95 55h88V7z"/><path fill="url(#a)" d="M95 55v21l78.4-21z"/><path fill="url(#i)" d="M21 47.5l57.2 57.2L60.4 115z"/><path fill="url(#j)" d="M90.8 183l21-78.3 17.8 10.3z"/><circle cx="95" cy="95" r="40" fill="#f1f1f1"/><circle cx="95" cy="95" r="32" fill="#4285f4"/><circle cx="95" cy="95" r="88" fill="url(#k)"/><g fill="#3e2723" fill-opacity=".1"><path fill="#fff" d="M129.6 115a40 40 0 01-69.2 0L7 24.5 60.4 116a40 40 0 0069.2 0z"/><path d="M96 55h-.5a40 40 0 110 80h.5c22 0 40-18 40-40s-18-40-40-40zm-1 127a88 88 0 0088-87.5v.5A88 88 0 017 95v-.5A88 88 0 0095 182z"/><g fill-opacity=".2"><path fill="#fff" d="M130 116.3a39.3 39.3 0 003.4-32 38 38 0 01-3.8 30.7L92 183l38.2-66.5zM95 8a88 88 0 0188 87.5V95A88 88 0 007 95v.5A88 88 0 0195 8z"/><path d="M95 54c-22 0-40 18-40 40v1c0-22 18-40 40-40h88v-1z"/></g></g></g></svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

1
assets/Edge.svg Normal file
View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 27600 27600"><linearGradient id="A" gradientUnits="userSpaceOnUse"/><linearGradient id="B" x1="6870" x2="24704" y1="18705" y2="18705" xlink:href="#A"><stop offset="0" stop-color="#0c59a4"/><stop offset="1" stop-color="#114a8b"/></linearGradient><linearGradient id="C" x1="16272" x2="5133" y1="10968" y2="23102" xlink:href="#A"><stop offset="0" stop-color="#1b9de2"/><stop offset=".16" stop-color="#1595df"/><stop offset=".67" stop-color="#0680d7"/><stop offset="1" stop-color="#0078d4"/></linearGradient><radialGradient id="D" cx="16720" cy="18747" r="9538" xlink:href="#A"><stop offset=".72" stop-opacity="0"/><stop offset=".95" stop-opacity=".53"/><stop offset="1"/></radialGradient><radialGradient id="E" cx="7130" cy="19866" r="14324" gradientTransform="matrix(.14843 -.98892 .79688 .1196 -8759 25542)" xlink:href="#A"><stop offset=".76" stop-opacity="0"/><stop offset=".95" stop-opacity=".5"/><stop offset="1"/></radialGradient><radialGradient id="F" cx="2523" cy="4680" r="20243" gradientTransform="matrix(-.03715 .99931 -2.12836 -.07913 13579 3530)" xlink:href="#A"><stop offset="0" stop-color="#35c1f1"/><stop offset=".11" stop-color="#34c1ed"/><stop offset=".23" stop-color="#2fc2df"/><stop offset=".31" stop-color="#2bc3d2"/><stop offset=".67" stop-color="#36c752"/></radialGradient><radialGradient id="G" cx="24247" cy="7758" r="9734" gradientTransform="matrix(.28109 .95968 -.78353 .22949 24510 -16292)" xlink:href="#A"><stop offset="0" stop-color="#66eb6e"/><stop offset="1" stop-color="#66eb6e" stop-opacity="0"/></radialGradient><path id="H" d="M24105 20053a9345 9345 0 01-1053 472 10202 10202 0 01-3590 646c-4732 0-8855-3255-8855-7432 0-1175 680-2193 1643-2729-4280 180-5380 4640-5380 7253 0 7387 6810 8137 8276 8137 791 0 1984-230 2704-456l130-44a12834 12834 0 006660-5282c220-350-168-757-535-565z"/><path id="I" d="M11571 25141a7913 7913 0 01-2273-2137 8145 8145 0 01-1514-4740 8093 8093 0 013093-6395 8082 8082 0 011373-859c312-148 846-414 1554-404a3236 3236 0 012569 1297 3184 3184 0 01636 1866c0-21 2446-7960-8005-7960-4390 0-8004 4166-8004 7820 0 2319 538 4170 1212 5604a12833 12833 0 007684 6757 12795 12795 0 003908 610c1414 0 2774-233 4045-656a7575 7575 0 01-6278-803z"/><path id="J" d="M16231 15886c-80 105-330 250-330 566 0 260 170 512 472 723 1438 1003 4149 868 4156 868a5954 5954 0 003027-839 6147 6147 0 001133-850 6180 6180 0 001910-4437c26-2242-796-3732-1133-4392-2120-4141-6694-6525-11668-6525-7011 0-12703 5635-12798 12620 47-3654 3679-6605 7996-6605 350 0 2346 34 4200 1007 1634 858 2490 1894 3086 2921 618 1067 728 2415 728 2952s-271 1333-780 1990z"/><use fill="url(#B)" xlink:href="#H"/><use fill="url(#D)" opacity=".35" xlink:href="#H"/><use fill="url(#C)" xlink:href="#I"/><use fill="url(#E)" opacity=".4" xlink:href="#I"/><use fill="url(#F)" xlink:href="#J"/><use fill="url(#G)" xlink:href="#J"/></svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

1
assets/Firefox.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.3 KiB

View file

@ -1,11 +1,19 @@
const path = require('path')
if (process.arch === 'arm64' && process.platform === 'darwin') {
require('dotenv').config({
path: '.env.arm.mac',
})
}
const CRX_PATH = path.resolve(__dirname, 'dist')
module.exports = {
launch: {
executablePath: process.env.PUPPETEER_EXEC_PATH, // set by mujo-code/puppeteer-headful
headless: false, // required for extensions
// set by mujo-code/puppeteer-headful on GitHub actions
// also for usages on ARM chip Mac
executablePath: process.env.PUPPETEER_EXEC_PATH,
// required for enabling extensions
headless: false,
args: [`--disable-extensions-except=${CRX_PATH}`, `--load-extension=${CRX_PATH}`],
},
}

View file

@ -91,7 +91,7 @@ module.exports = {
// notifyMode: "failure-change",
// A preset that is used as a base for Jest's configuration
preset: 'jest-puppeteer',
// preset: undefined,
// Run tests from one or more projects
// projects: null,
@ -141,7 +141,7 @@ module.exports = {
// testLocationInResults: false,
// The glob patterns Jest uses to detect test files
testMatch: ['**/__tests__/cases/*.ts?(x)', '**/?(*.)+(spec|test).ts?(x)'],
testMatch: ['**/?(*.)+(spec|test).ts?(x)'],
// An array of regexp pattern strings that are matched against all test paths, matched tests are skipped
testPathIgnorePatterns: ['/node_modules/', '.d.ts$', '<rootDir>/vscode-icons/'],
@ -158,7 +158,7 @@ module.exports = {
// This option sets the URL for the jsdom environment. It is reflected in properties such as location.href
// testURL: "http://localhost",
testTimeout: 20000,
testTimeout: 5000,
// Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout"
// timers: "real",

View file

@ -1,6 +1,6 @@
{
"name": "gitako",
"version": "3.1.0",
"version": "3.6.1",
"description": "File tree for GitHub, and more than that.",
"repository": "https://github.com/EnixCoda/Gitako",
"author": "EnixCoda",
@ -15,8 +15,8 @@
"build": "VERSION=v$(node scripts/get-version.js) NODE_ENV=production webpack",
"roll": "make release",
"test": "yarn run test:parallel && yarn run test:non-parallel",
"test:parallel": "NODE_ENV=test jest",
"test:non-parallel": "NODE_ENV=test jest --config jest.non.parallel.config.js"
"test:parallel": "NODE_ENV=test jest --config __tests__/jest.parallel.config.js",
"test:non-parallel": "NODE_ENV=test jest --config __tests__/jest.non-parallel.config.js"
},
"dependencies": {
"@primer/components": "^22.0.2",
@ -55,21 +55,22 @@
"@babel/preset-typescript": "^7.3.3",
"@sentry/cli": "^1.64.2",
"@types/firefox-webext-browser": "^70.0.1",
"@types/jest": "^24.0.25",
"@types/jest": "^26.0.23",
"@types/node": "^11.10.4",
"@types/puppeteer": "^3.0.2",
"@types/puppeteer": "^5.4.3",
"babel-loader": "^8.0.5",
"babel-plugin-transform-es2015-modules-commonjs": "^6.26.2",
"copy-webpack-plugin": "^5.0.0",
"css-loader": "^2.1.0",
"dotenv": "^6.2.0",
"dotenv-webpack": "^1.7.0",
"file-loader": "^3.0.1",
"fork-ts-checker-webpack-plugin": "^0.5.2",
"jest": "^24.9.0",
"jest-puppeteer": "^4.4.0",
"jest": "^27.0.6",
"jest-puppeteer": "^5.0.4",
"json-loader": "^0.5.7",
"mini-css-extract-plugin": "^0.9.0",
"puppeteer": "^5.4.1",
"puppeteer": "^10.1.0",
"raw-loader": "^4.0.0",
"sass": "^1.26.2",
"sass-loader": "^8.0.2",

14
scripts/check-emit-dir.js Normal file
View file

@ -0,0 +1,14 @@
const path = require('path')
const fs = require('fs').promises
const emitDirPath = path.resolve(__dirname, 'tmp')
exports.emitDirPath = emitDirPath
async function checkEmitDir() {
try {
await fs.mkdir(emitDirPath)
} catch (err) {
await fs.stat(emitDirPath)
}
}
exports.checkEmitDir = checkEmitDir

View file

@ -5,16 +5,16 @@
const fs = require('fs').promises
const path = require('path')
function modify(source = '', pairs = [], loose = true) {
function modify(source = '', pairs = []) {
for (const [original, replace] of pairs) {
if (source.includes(original)) {
source = source.replace(original, replace)
if (source.includes(original)) {
throw new Error(`More than one original string found`, JSON.stringify(original))
}
} else {
if (loose) console.log(`Skipped missing snippet`, original)
else throw new Error(`Original string not found`, JSON.stringify(original))
throw new Error(`Original string not found: ${JSON.stringify(original)}`)
}
if (source.includes(original)) {
throw new Error(`More than one original string found`, JSON.stringify(original))
}
}
@ -54,11 +54,16 @@ async function fixPJAXAPI(loose) {
}`,
],
]
const filePath = path.resolve(__dirname, '..', `node_modules/pjax-api/dist/pjax-api.js`)
const source = await fs.readFile(filePath, 'utf-8')
const modified = modify(source, pairs, loose)
fs.writeFile(filePath, modified, 'utf-8')
try {
const filePath = path.resolve(__dirname, '..', `node_modules/pjax-api/dist/pjax-api.js`)
const source = await fs.readFile(filePath, 'utf-8')
const modified = modify(source, pairs, loose)
await fs.writeFile(filePath, modified, 'utf-8')
} catch (err) {
console.error((err && err.message) || err)
const shouldTerminate = process.env.IGNORE_FIX_PJAX_API_FAILURE !== 'true'
if (shouldTerminate) process.exit(1)
}
}
const loose = process.argv.includes('loose')
fixPJAXAPI(loose)
fixPJAXAPI()

View file

@ -1,18 +1,21 @@
const languageIds = require('./language-id-ext.json')
const { languages } = require('./tmp/languages')
const fileName = 'file-icons-index'
function generateCSV() {
const link = 'https://github.com/vscode-icons/vscode-icons/wiki/ListOfFiles'
function parsePageContent() {
const records = []
document.body
.querySelector('table')
.querySelectorAll('tbody tr')
.forEach(tr => {
const [name, id, dark, light] = Array.from(tr.querySelectorAll('td'))
const exts = []
const ids = []
const names = []
id.innerHTML
.replace(/<sub>|<\/sub>/g, '')
.split(', ')
id.querySelector('sub')
.innerHTML.split(', ')
.map(part => {
const tags = part.match(/<(\w+)>(.*?)<\/\1>/g)
if (tags) {
@ -21,51 +24,50 @@ function generateCSV() {
if (match) {
const [, tag, content] = match
if (tag === 'strong') {
// filenames in bold
names.push(content)
// filenames
names.push(content.toLowerCase())
} else if (tag === 'code') {
// language ids in code block
const map = Object.values(languageIds).find(({ ids }) =>
(Array.isArray(ids) ? ids : [ids]).includes(content),
)
if (map && map.exts) exts.push(map.exts)
// language ids
ids.push(content)
} else {
console.warn(`Found unrecognized format`, subPart, tag) // unknown
}
}
})
} else if (part) {
// extensions are in regular fonts
exts.push(part.replace(/^\./, ''))
// extensions
exts.push(part.toLowerCase())
}
})
records.push({
name: name.innerText,
exts,
names,
exts,
ids,
icon: getSrc(dark.querySelector('img')) || getSrc(light.querySelector('img')),
})
})
return records
function getSrc(img) {
return img && img.src
}
const prepend = 'https://github.com/vscode-icons/vscode-icons/raw/master/icons/file_type_'
const append = '.svg?sanitize=true'
const separator = ':'
const csv = records
.map(({ name, names, exts, icon }) =>
[
name,
names.join(separator),
exts.join(separator),
// icon.replace(prepend, '').replace(append, ''), // assumption: name is equal to this
].join(','),
)
.join('\n')
return csv
}
console.log(generateCSV())
function prepareCSV({ name, names, exts, ids, icon }) {
ids.forEach(content => {
const defaultExtension = Object.values(languages)
.find(({ ids }) => (Array.isArray(ids) ? ids : [ids]).includes(content))
.defaultExtension.toLowerCase()
if (!exts.includes(defaultExtension)) exts.push(defaultExtension)
})
const iconFile = icon.replace(/^.*?file_type_(.*?)\..*$/, '$1')
const cols = [name, names.join(':'), exts.join(':')]
if (!['file'].includes(name) && name !== iconFile) cols.push(iconFile)
return cols
}
exports.fileName = fileName
exports.link = link
exports.parsePageContent = parsePageContent
exports.prepareCSV = prepareCSV

View file

@ -1,3 +1,7 @@
const fileName = 'folder-icons-index'
const link = 'https://github.com/vscode-icons/vscode-icons/wiki/ListOfFolders'
function parsePageContent() {
const records = []
document.body
@ -16,26 +20,27 @@ function parsePageContent() {
})
})
return records
function getSrc(img) {
return img && img.src
}
}
function getSrc(img) {
return img && img.src
function prepareCSV({ name, names, icon }) {
const [iconFileOpen, iconFileClosed] = [
icon.open.replace(/^.*?folder_type_(.*?)_opened\..*$/, '$1'),
icon.closed.replace(/^.*?folder_type_(.*?)\..*$/, '$1'),
]
const cols = [name, names.join(':')]
if (
!['folder', 'root_folder'].includes(name) &&
(name !== iconFileOpen || iconFileOpen !== iconFileClosed)
)
cols.push(iconFileOpen, iconFileClosed)
return cols
}
function generateCSV(records) {
const prepend = 'https://github.com/vscode-icons/vscode-icons/raw/master/icons/folder_type_'
const append = '.svg?sanitize=true'
const separator = ':'
const csv = records
.map(({ name, names, icon }) =>
[
name,
names.join(separator),
// icon.replace(prepend, '').replace(append, ''), // assumption: name is equal to this
].join(','),
)
.join('\n')
return csv
}
console.log(generateCSV(parsePageContent()))
exports.fileName = fileName
exports.link = link
exports.parsePageContent = parsePageContent
exports.prepareCSV = prepareCSV

View file

@ -0,0 +1,49 @@
const path = require('path')
const { promises: fs, existsSync } = require('fs')
const puppeteer = require('puppeteer')
const generateFileIconIndex = require('./generate-file-icon-index')
const generateFolderIconIndex = require('./generate-folder-icon-index')
const { emitDirPath, checkEmitDir } = require('./check-emit-dir')
let browser
async function getPage() {
const headless = process.env.HEADLESS !== 'false'
browser = browser || (await puppeteer.launch({ headless }))
return await browser.newPage()
}
async function generateCSV() {
await checkEmitDir()
await Promise.all(
[generateFileIconIndex, generateFolderIconIndex].map(
async ({ fileName, link, parsePageContent, prepareCSV }) => {
let records
const emitJSONPath = path.resolve(emitDirPath, fileName + '.json')
if (!existsSync(emitJSONPath)) {
const page = await getPage()
await page.goto(link)
records = await page.evaluate(parsePageContent)
await page.close()
await fs.writeFile(emitJSONPath, JSON.stringify(records))
} else {
records = require(emitJSONPath)
}
const rowSeparator = '\n'
const columnSeparator = ','
const csv = records.map(prepareCSV)
const emitPath = path.resolve(__dirname, '..', 'src/assets/icons')
await fs.writeFile(
path.resolve(emitPath, fileName + '.csv'),
csv.map(cols => cols.join(columnSeparator)).join(rowSeparator),
)
},
),
)
if (browser) await browser.close()
}
generateCSV()

View file

@ -0,0 +1,32 @@
const path = require('path')
const fs = require('fs').promises
const typescript = require('typescript')
const { emitDirPath, checkEmitDir } = require('./check-emit-dir')
const files = [path.resolve(__dirname, '..', 'vscode-icons/src/iconsManifest/languages.ts')]
const options = {
module: typescript.ModuleKind.CommonJS,
target: typescript.ScriptTarget.ES2015,
strict: true,
suppressOutputPathCheck: false,
}
async function main() {
await checkEmitDir()
const compilerHost = typescript.createCompilerHost(options)
compilerHost.writeFile = async (fileName, data, writeByteOrderMark, onError, sourceFiles) => {
if (sourceFiles.some(file => files.includes(file.fileName))) {
await fs.writeFile(path.resolve(emitDirPath, path.basename(fileName)), data)
console.log(`Emitted`, fileName)
} else {
console.log(`Skipped`, fileName)
}
}
const program = typescript.createProgram(files, options, compilerHost)
program.emit()
}
main()

View file

@ -58,9 +58,9 @@ Sentry.init(sentryOptions)
export const withErrorLog: Middleware = function withErrorLog(method, args) {
return [
async function (...args: any[]) {
async function () {
try {
await method.apply(null, args)
await method.apply(null, arguments as any)
} catch (error) {
raiseError(error)
}

View file

@ -60,6 +60,7 @@ ng_smart_component_ts2,,page.ts:container.ts
ng_smart_component_js2,,page.js:container.js
ng_service_ts2,,service.ts
ng_service_js2,,service.js
ng_tailwind,ng-tailwind.js,
affectscript,,affect
ansible,,ansible
antlr,,g4
@ -67,36 +68,46 @@ anyscript,,any
apache,,htaccess
apex,,cls
apib,,apib
api_extractor,api-extractor.json:api-extractor-base.json,
apl,,apl
applescript,,applescript
appsemble,.appsemblerc.yaml:app-definition.yaml,
appveyor,appveyor.yml:.appveyor.yml,
arduino,,ino:pde
asciidoc,,adoc
asp,,asp:asp
asp,,asp
aspx,,aspx:ascx
assembly,,asm:asm
assembly,,asm
astro,,astro
astroconfig,astro.config.js:astro.config.cjs:astro.config.mjs,
ats,,ats
audio,,aac:act:aiff:amr:ape:au:dct:dss:dvf:flac:gsm:iklax:ivs:m4a:m4b:m4p:mmf:mogg:mp3:mpc:msv:oga:ogg:opus:ra:raw:tta:vox:wav:wma
aurelia,aurelia.json,
autohotkey,,ahk
autoit,,au3
avif,,avif
avro,,avcs
awk,,awk
aws,,
azure,,azcli
azurepipelines,azure-pipelines.yml:.vsts-ci.yml,azure-pipelines.yml
babel,.babelrc:babelrc.js:.babelrc.js:babelrc.json:babel.config.js:.babelignore,
babel2,.babelrc:babelrc.js:.babelrc.js:babelrc.json:babel.config.js:.babelignore,
babel,.babelrc:.babelignore:.babelrc.js:.babelrc.cjs:.babelrc.mjs:.babelrc.json:babel.config.js:babel.config.cjs:babel.config.mjs:babel.config.json,
babel2,.babelrc:.babelignore:.babelrc.js:.babelrc.cjs:.babelrc.mjs:.babelrc.json:babel.config.js:babel.config.cjs:babel.config.mjs:babel.config.json,
ballerina,,bal
bat,,bat
bats,,bats
bazaar,.bzrignore,
bazel,.bazelrc:bazel.rc:bazel.bazelrc,bzl
befunge,,bf:bf
bazel,BUILD.bazel:.bazelrc:bazel.rc:bazel.bazelrc,bzl:bazel
befunge,,bf
bicep,,bicep
biml,,biml
binary,,a:app:bin:cmo:cmx:cma:cmxa:cmi:dll:exe:hl:ilk:lib:n:ndll:o:obj:pyc:pyd:pyo:pdb:scpt:scptd:so
bithound,.bithoundrc,
bitbucketpipeline,bitbucket-pipelines.yml,
blade,,blade.php:blade.php
blade,,blade.php
blitzbasic,,bb:blitzbasic
bolt,,bolt
bosque,,bsq
bower,.bowerrc:bower.json,
browserslist,.browserslistrc:browserslist,
buckbuild,.buckconfig,
@ -107,28 +118,31 @@ c2,,c
c3,,c
c_al,,cal
cabal,,cabal
caddy,,Caddyfile
caddy,,caddyfile
cake,,cake
cakephp,,
capacitor,capacitor.config.json,
cargo,cargo.toml:cargo.lock,
casc,,casc
cddl,,cddl
cert,,csr:crt:cer:der:pfx:p12:p7b:p7r:src:crl:sst:stl
ceylon,,ceylon
cf,,lucee:cfml:cfml
cf2,,lucee:cfml:cfml
cf,,lucee:cfml
cf2,,lucee:cfml
cfc,,cfc
cfc2,,cfc
cfm,,cfm
cfm2,,cfm
cheader,,h
chef,chefignore:berksfile:berksfile.lock:policyfile,
chef,chefignore:berksfile:berksfile.lock:policyfile.rb:policyfile.lock.json,
class,,class
circleci,circle.yml,
clojure,,cjm:cljc:clojure
clojurescript,,cljs:clojurescript
cloudfoundry,.cfignore,
cmake,,cmake:CMakeCache.txt
cloudfoundry,.cfignore,yml
cmake,,cmake:cmakecache.txt
cobol,,cbl
codeql,,ql
codacy,.codacy.yml:.codacy.yaml,
codeclimate,.codeclimate.yml,
codecov,codecov.yml:.codecov.yml,
@ -139,6 +153,7 @@ coffeescript,,coffee
conan,conanfile.txt:conanfile.py,
conda,.condarc,
config,,plist:properties:env
commitlint,commitlint.config.js:.commitlintrc.js:.commitlintrc.json:.commitlintrc.yml,
compass,,
composer,composer.json:composer.lock,
chef_cookbook,,ckbk
@ -147,7 +162,7 @@ coveralls,.coveralls.yml,
cpp,,cpp
cpp2,,cpp
cpp3,,cpp
cppheader,,hpp
cppheader,,hpp:hh:hxx:h++
crowdin,crowdin.yml,
crystal,,cr
csharp,,csx:cs
@ -166,28 +181,32 @@ dal,,dal
darcs,.boringignore,
dartlang,,dart
db,,db
dependabot,dependabot.yml,
dependencies,dependencies.yml,
delphi,,pas:pas
django,,djt:html:html
dlang,,d:d:d:d
delphi,,pas
devcontainer,devcontainer.json,
django,,djt:html
dlang,,d
diff,,diff
docker,docker-compose.yml:docker-compose.ci-build.yml:docker-compose.override.yml:docker-compose.vs.debug.yml:docker-compose.vs.release.yml:docker-cloud.yml,dockerfile:dockerignore
docker2,docker-compose.yml:docker-compose.ci-build.yml:docker-compose.override.yml:docker-compose.vs.debug.yml:docker-compose.vs.release.yml:docker-cloud.yml,dockerfile:dockerignore
docker,compose.yaml:compose.yml:docker-compose.yaml:docker-compose.yml:docker-compose.ci-build.yaml:docker-compose.ci-build.yml:docker-compose.override.yaml:docker-compose.override.yml:docker-compose.vs.debug.yaml:docker-compose.vs.debug.yml:docker-compose.vs.release.yaml:docker-compose.vs.release.yml:docker-cloud.yaml:docker-cloud.yml,dockerfile:dockerignore
docker2,compose.yaml:compose.yml:docker-compose.yaml:docker-compose.yml:docker-compose.ci-build.yaml:docker-compose.ci-build.yml:docker-compose.override.yaml:docker-compose.override.yml:docker-compose.vs.debug.yaml:docker-compose.vs.debug.yml:docker-compose.vs.release.yaml:docker-compose.vs.release.yml:docker-cloud.yaml:docker-cloud.yml,dockerfile:dockerignore
dockertest,docker-compose.test.yml,
dockertest2,docker-compose.test.yml,
docpad,,eco
docz,.doczrc:docz.js:docz.json:.docz.js:.docz.json:doczrc.js:doczrc.json:docz.config.js:docz.config.json,
dojo,.dojorc,
doxygen,,dox
drawio,,drawio:dio .drawio.png:.drawio.svg
drone,.drone.yml:.drone.yml.sig,
drools,,drl
dotjs,,dot
dustjs,,dust
dylan,,dylan:dylan
dvc,.dvc,
dylan,,dylan
editorconfig,.editorconfig,
edge,,edge
edge2,,edge
eex,,eex:eex
eex,,eex
ejs,,ejs
elastic,,es
elasticbeanstalk,,
@ -201,11 +220,13 @@ eps,,eps
erb,,erb
erlang,emakefile:.emakerfile,erl
erlang2,emakefile:.emakerfile,erl
eslint,.eslintrc:.eslintignore:.eslintcache:.eslintrc.js:.eslintrc.json:.eslintrc.yaml:.eslintrc.yml,
eslint2,.eslintrc:.eslintignore:.eslintcache:.eslintrc.js:.eslintrc.json:.eslintrc.yaml:.eslintrc.yml,
eslint,.eslintrc:.eslintignore:.eslintcache:.eslintrc.js:.eslintrc.mjs:.eslintrc.cjs:.eslintrc.json:.eslintrc.yaml:.eslintrc.yml,
eslint2,.eslintrc:.eslintignore:.eslintcache:.eslintrc.js:.eslintrc.mjs:.eslintrc.cjs:.eslintrc.json:.eslintrc.yaml:.eslintrc.yml,
excel,,xls:xlsx:xlsm:ods:fods
excel2,,xls:xlsx:xlsm:ods:fods
expo,app.json:app.config.js:app.config.json:app.config.json5,
falcon,,falcon
fauna,.faunarc,fql
favicon,favicon.ico,
fbx,,fbx
firebase,.firebaserc,
@ -219,43 +240,51 @@ flow,.flowconfig,
flutter,.flutter-plugins:.metadata,
flutter_package,pubspec.lock:pubspec.yaml:.packages,
font,,woff:woff2:ttf:otf:eot:pfa:pfb:sfd
fortran,,f:f:f:f
fortran,,f
fossa,.fossaignore,
fossil,ignore-glob,
fsharp,,fs
fsproj,,fsproj
freemarker,,ftl
fthtml,,fthtml
fusebox,fuse.js,
galen,,gspec
galen2,,gspec
git,.gitattributes:.gitconfig:.gitignore:.gitmodules:.gitkeep:.mailmap,git:git
git,.gitattributes:.gitconfig:.gitignore:.gitmodules:.gitkeep:.mailmap,git
gamemaker,,gmx:gml
gamemaker2,,yy:yyp:gml
gamemaker81,,gml
gatsby,gatsby-config.js:gatsby-config.ts:gatsby-node.js:gatsby-node.ts:gatsby-browser.js:gatsby-browser.ts:gatsby-ssr.js:gatsby-ssr.ts,
gcode,,gcode
genstat,,gen
gitlab,.gitlab-ci.yml,
gitpod,.gitpod.yaml:.gitpod.yml:gitpod.yaml:gitpod.yml,
glide,glide.yml,
glitter,.glitterrc,
glsl,,glsl
glyphs,,glyphs
gnuplot,,gp
go,,go
go_package,go.sum:go.mod,
godot,,gd
gradle,,gradle
gradle2,,gradle
graphql,.gqlconfig,gql
graphql_config,.graphqlconfig:.graphqlconfig.yml:.graphqlconfig.yaml,
graphviz,,gv
greenkeeper,greenkeeper.json,
gridsome,gridsome.config.js:gridsome.config.ts:gridsome.server.js:gridsome.server.ts:gridsome.client.js:gridsome.client.ts,
groovy,,groovy
groovy2,,groovy
grunt,gruntfile.js:gruntfile.coffee:gruntfile.ts:gruntfile.babel.js:gruntfile.babel.coffee:gruntfile.babel.ts,
gulp,gulpfile.js:gulpfile.coffee:gulpfile.ts:gulpfile.babel.js:gulpfile.babel.coffee:gulpfile.babel.ts,
gulp,gulpfile.js:gulpfile.coffee:gulpfile.ts:gulpfile.mjs:gulpfile.esm.js:gulpfile.esm.coffee:gulpfile.esm.ts:gulpfile.esm.mjs:gulpfile.babel.js:gulpfile.babel.coffee:gulpfile.babel.ts:gulpfile.babel.mjs,
haml,,haml
handlebars,,hbs
handlebars2,,hbs
harbour,,prg
haskell,,hs:lhs
haskell2,,hs:lhs
haxe,haxelib.json,haxe:haxe:haxe
haxe,haxelib.json,haxe
haxecheckstyle,checkstyle.json,
haxedevelop,,hxproj
helix,.p4ignore,
@ -263,18 +292,22 @@ helm,,helm.tpl
hjson,,hjson
hlsl,,hlsl
homeassistant,,yaml
horusec,horusec-config.json,
host,,hosts
html,,html
htmlhint,.htmlhintrc,
http,,http
hunspell,,aff:aff
husky,.huskyrc:.huskyrc.js:.huskyrc.json:.huskyrc.yaml:.huskyrc.yml,
hunspell,,aff
husky,.huskyrc:husky.config.js:.huskyrc.js:.huskyrc.json:.huskyrc.yaml:.huskyrc.yml,
hy,,hy
hygen,,ejs.t
hypr,,hypr
icl,,icl
idris,,idr:lidr
idrisbin,,ibc
idrispkg,,ipkg
image,,jpeg:jpg:gif:png:bmp:tiff:ico
imba,,imba
imba,,imba:imba2
inc,,inc:include
infopath,,infopathxml:xsn:xsf:xtp2
informix,,4gl
@ -285,54 +318,63 @@ ionic,ionic.project:ionic.config.json,
jake,jakefile:jakefile.js,
janet,,janet
jar,,jar
jasmine,jasmine.json,
java,,java
jbuilder,,jbuilder
jest,jest.config.js:jest.json:jest.config.json:.jestrc:.jestrc.js:.jestrc.json,
jest,jest.config.json:jest.config.base.json:jest.config.common.json:jest.config.ts:jest.config.base.ts:jest.config.common.ts:jest.json:.jestrc:.jestrc.js:.jestrc.json:jest.config.js:jest.config.cjs:jest.config.mjs:jest.config.base.js:jest.config.base.cjs:jest.config.base.mjs:jest.config.common.js:jest.config.common.cjs:jest.config.common.mjs:jest.config.babel.js:jest.config.babel.cjs:jest.config.babel.mjs,
jest_snapshot,,js.snap:jsx.snap:ts.snap:tsx.snap
jekyll,,jekyll
jenkins,,jenkins:jenkins:jenkins
jenkins,,jenkins
jinja,,jinja
jpm,.jpmignore,
js,,js
js_official,,js
jsbeautify,.jsbeautifyrc:jsbeautifyrc:.jsbeautify:jsbeautify,
jsconfig,jsconfig.json,
jscpd,.jscpd.json:jscpd-report.xml:jscpd-report.json:jscpd-report.html,
jshint,.jshintrc:.jshintignore,
jsmap,,js.map
json,,json:JSON-tmLanguage:jsonc
json_official,,json:JSON-tmLanguage:jsonc
json2,,json:JSON-tmLanguage:jsonc
json,,json:json-tmlanguage:jsonc
json_official,,json:json-tmlanguage:jsonc
json2,,json:json-tmlanguage:jsonc
jsonnet,,jsonnet
json5,,json5:json5
json5,,json5
jsonld,,jsonld:json-ld
jsp,,jsp
jss,,jss
julia,,jl:jl
julia2,,jl:jl
julia,,jl
julia2,,jl
jupyter,,ipynb
io,,io
iodine,,id
karma,karma.conf.js:karma.conf.coffee:karma.conf.ts,
key,,key:pem
kite,.kiteignore,
kitchenci,.kitchen.yml,
kitchenci,.kitchen.yml:kitchen.yml,
kivy,,kv
kos,,ks
kotlin,,kt
kusto,,.kusto
latino,,lat
layout,,master:layout.html:layout.htm
layout,layout.html:layout.htm,
lerna,lerna.json,
less,,less
lex,,flex
license,,enc
license,license:licence:license.md:license.txt:licence.md:licence.txt,
license,license:licence:copying:copying.lesser:license.md:license.txt:licence.md:licence.txt:copying.md:copying.txt:copying.lesser.md:copying.lesser.txt,
licensebat,.licrc,
lighthouse,.lighthouserc.js:.lighthouserc.json:.lighthouserc.yaml:.lighthouserc.yml,
lisp,,lisp
lime,,hxp
lime,include.xml,
lintstagedrc,.lintstagedrc:lint-staged.config.js:.lintstagedrc.js:.lintstagedrc.json:.lintstagedrc.yaml:.lintstagedrc.yml,
liquid,,liquid
livescript,,ls
lnk,,lnk
locale,,
log,,log:tlg
log,,log:tlg
lolcode,,lol
lsl,,lsl
lua,,lua
@ -356,8 +398,9 @@ mercurial,.hgignore,
meson,,meson.build
meteor,,
mjml,,mjml
mlang,,pq:pq
mlang,,pq
mocha,mocha.opts:.mocharc.js:.mocharc.json:.mocharc.jsonc:.mocharc.yaml:.mocharc.yml,
modernizr,modernizr:modernizr.js:modernizrrc.js:.modernizr.js:.modernizrrc.js,
mojolicious,,ep
moleculer,moleculer.config.js:moleculer.config.json:moleculer.config.ts,
mongo,,mongo
@ -389,25 +432,31 @@ nest_pipe_ts,,pipe.ts
nest_service_js,,service.js
nest_service_ts,,service.ts
netlify,netlify.toml,
next,next.config.js,
nginx,nginx.conf,
nim,,nim:nim
nim,,nim
nimble,,nimble
ninja,build.ninja,
nix,,nix
njsproj,,njsproj
node,.node-version:.nvmrc,
node2,.node-version:.nvmrc,
nodemon,nodemon.json,
npm,.npmignore:.npmrc:package.json:package-lock.json:npm-shrinkwrap.json,
nsi,,nsi:nsi:nsi:nsi
nsri,.nsrirc:.nsriignore:.nsrirc.js:.nsrirc.json:.nsrirc.yaml:.nsrirc.yml:.nsrirc.config.js,
nsi,,nsi
nsri,.nsrirc:.nsriignore:nsri.config.js:.nsrirc.js:.nsrirc.json:.nsrirc.yaml:.nsrirc.yml,
nsri-integrity,.integrity.json,
nuget,,nupkg:nuspec:psmdcp
nuget,,nupkg:snupkg:nuspec:psmdcp
numpy,,npy:npz
nunjucks,,nunj:njs:nunjucks
nuxt,nuxt.config.js:nuxt.config.ts,
nyc,.nycrc:.nycrc.json,
objectivec,,m
objectivecpp,,mm
ocaml,.merlin,ml:ml:ml
ocaml,.merlin,ml
ogone,,o3
onenote,,one:onepkg:onetoc:onetoc2:sig
openscad,,scad
opencl,,cl:opencl
openHAB,,things
org,,org
@ -436,18 +485,20 @@ phpunit,phpunit:phpunit.xml:phpunit.xml.dist,
phraseapp,.phraseapp.yml,
pine,,pine
pip,pipfile:pipfile.lock,requirements.txt
platformio,platformio.ini,dbgasm:dbgasm:dbgasm
pipeline,,pipeline
platformio,platformio.ini,dbgasm
plantuml,,pu:plantuml:iuml:puml
plsql,,ddl:ddl
plsql,,ddl
plsql_package,,pck
plsql_package_body,,pkb
plsql_package_header,,pkh
plsql_package_spec,,pks
pnpm,pnpmfile.js:pnpm-lock.yaml:pnpm-workspace.yaml,
poedit,,po:mo
polymer,,polymer
pony,,pony
postcss,,pcss
postcssconfig,.postcssrc:.postcssrc.json:.postcssrc.yml:.postcssrc.js:postcss.config.js,
postcssconfig,.postcssrc:.postcssrc.json:.postcssrc.yaml:.postcssrc.yml:.postcssrc.ts:.postcssrc.js:.postcssrc.cjs:postcss.config.ts:postcss.config.js:postcss.config.cjs,
powerpoint,,pot:potx:potm:pps:ppsx:ppsm:ppt:pptx:pptm:pa:ppa:ppam:sldm:sldx
powerpoint2,,pot:potx:potm:pps:ppsx:ppsm:ppt:pptx:pptm:pa:ppa:ppam:sldm:sldx
powershell,,ps1
@ -460,15 +511,15 @@ powershell_psm2,,psm1
powershell_psd2,,psd1
precommit,.pre-commit-config.yaml,
prettier,.prettierrc:.prettierignore,
prettier,prettier.config.js:prettier.config.ts:prettier.config.coffee,
prettier,.prettierrc.js:.prettierrc.json:.prettierrc.yml:.prettierrc.yaml,
prettier,prettier.config.js:prettier.config.cjs:prettier.config.ts:prettier.config.coffee,
prettier,.prettierrc.js:.prettierrc.cjs:.prettierrc.json:.prettierrc.json5:.prettierrc.yml:.prettierrc.yaml,
prisma,,prisma
processinglang,,pde
procfile,procfile,
progress,,w
prolog,,pro:P:pro
prolog,,pro:P
prometheus,,rules
protobuf,,proto:proto
protobuf,,proto
protractor,protractor.conf.js:protractor.conf.coffee:protractor.conf.ts,
publisher,,pub:puz
puppet,,pp
@ -476,6 +527,7 @@ pug,.jade-lintrc:.pug-lintrc:.jade-lint.json:.pug-lintrc.js:.pug-lintrc.json,pug
purescript,,purs
pyret,,arr
python,,py
pytyped,py.typed,
pyup,.pyup:.pyup.yml,
q,,q
qbs,,qbs
@ -490,7 +542,7 @@ rails,,
rake,,rake
rake,rakefile,
raml,,raml
razor,,cshtml:cshtml
razor,,cshtml
razzle,razzle.config.js,
reactjs,,jsx
reacttemplate,,rt
@ -498,22 +550,29 @@ reactts,,tsx
reason,,re
red,,red
registry,,reg
rego,,rego
rehype,.rehyperc:.rehypeignore:.rehyperc.js:.rehyperc.json:.rehyperc.yml:.rehyperc.yaml,
remark,.remarkrc:.remarkignore:.remarkrc.js:.remarkrc.json:.remarkrc.yml:.remarkrc.yaml,
renovate,.renovaterc:renovate.json:.renovaterc.json,
rescript,,res
rest,,rst
retext,.retextrc:.retextignore:.retextrc.js:.retextrc.json:.retextrc.yml:.retextrc.yaml,
rexx,,rex
riot,,tag
robotframework,,robot
robots,robots.txt,
rollup,rollup.config.js:rollup.config.mjs:rollup.config.coffee:rollup.config.ts:rollup.config.common.js:rollup.config.common.mjs:rollup.config.common.coffee:rollup.config.common.ts:rollup.config.dev.js:rollup.config.dev.mjs:rollup.config.dev.coffee:rollup.config.dev.ts:rollup.config.prod.js:rollup.config.prod.mjs:rollup.config.prod.coffee:rollup.config.prod.ts,
rollup,rollup.config.js:rollup.config.cjs:rollup.config.mjs:rollup.config.coffee:rollup.config.ts:rollup.config.common.js:rollup.config.common.cjs:rollup.config.common.mjs:rollup.config.common.coffee:rollup.config.common.ts:rollup.config.dev.js:rollup.config.dev.cjs:rollup.config.dev.mjs:rollup.config.dev.coffee:rollup.config.dev.ts:rollup.config.prod.js:rollup.config.prod.cjs:rollup.config.prod.mjs:rollup.config.prod.coffee:rollup.config.prod.ts,
rmd,,rmd
rproj,,rproj
rspec,.rspec,
rubocop,.rubocop.yml:.rubocop_todo.yml,
ruby,,rb
rust,,rs
rust_toolchain,rust-toolchain,
sails,.sailsrc,
saltstack,,sls
san,,san
sas,,sas
sass,,sass
sbt,,sbt
scala,,scala
@ -522,9 +581,9 @@ scss,,scssm:scss
scilab,,sce
sdlang,,sdl
sentry,.sentryclirc,
serverless,serverless.yml,
serverless,serverless.yml:serverless.json:serverless.js:serverless.ts,
sequelize,.sequelizerc:.sequelizerc.js:.sequelizerc.json,
shaderlab,,shader
shaderlab,,unity:shader
shell,,fish:sh
sketch,,sketch
slang,,slang
@ -533,7 +592,7 @@ slim,,slim
sln,,sln
sln2,,sln
silverstripe,,ss
skipper,,eskip:eskip
skipper,,eskip
smarty,,tpl
snapcraft,snapcraft.yaml,
snort,,snort
@ -541,6 +600,8 @@ snyk,.snyk,
solidarity,.solidarity:.solidarity.json,
solidity,,sol
source,,
spacengine,,spe
sparql,,rq
sqf,,sqf
sql,,sql
sqlite,,sqlite:sqlite3:db3
@ -550,52 +611,61 @@ stan,,stan
stata,,dta:do
stencil,,stencil:html.stencil
style,,
stylelint,.stylelintrc:.stylelintignore:.stylelintcache:stylelint.config.js:stylelint.config.json:stylelint.config.yaml:stylelint.config.yml:stylelint.config.ts:.stylelintrc.js:.stylelintrc.json:.stylelintrc.yaml:.stylelintrc.yml:.stylelintrc.ts,
stylelint,.stylelintrc:.stylelintignore:.stylelintcache:stylelint.config.js:stylelint.config.json:stylelint.config.yaml:stylelint.config.yml:stylelint.config.ts:stylelint.config.cjs:.stylelintrc.js:.stylelintrc.json:.stylelintrc.yaml:.stylelintrc.yml:.stylelintrc.ts:.stylelintrc.cjs,
stylable,,st.css
styled,,styled
stylish_haskell,.stylish-haskell.yaml,
stylus,,styl
storyboard,,storyboard
storybook,,story.js:story.jsx:story.ts:story.tsx:stories.js:stories.jsx:stories.ts:stories.tsx
storybook,,story.js:story.jsx:story.ts:story.tsx:story.mdx:stories.js:stories.jsx:stories.ts:stories.tsx:stories.mdx
subversion,.svnignore,
svelte,,svelte
svg,,svg
swagger,,swagger:swagger
swagger,,swagger
swift,package.pins,swift
swig,,swig
symfony,symfony.lock,
systemd,,link
systemverilog,,sv
t4tt,,tt
tailwind,tailwind.js:tailwind.coffee:tailwind.ts:tailwind.config.js:tailwind.config.coffee:tailwind.config.ts,
tailwind,tailwind.js:tailwind.cjs:tailwind.coffee:tailwind.ts:tailwind.json:tailwind.config.js:tailwind.config.cjs:tailwind.config.coffee:tailwind.config.ts:tailwind.config.json,
teal,,teal
tt,,tt2:tt3
tcl,,tcl:exp
tera,,tera
terraform,,tfstate:tf
test,,tst
testcafe,.testcaferc.json,
testjs,,test.js:test.jsx:test.mjs:spec.js:spec.jsx:spec.mjs
testts,,test.ts:test.tsx:spec.ts:spec.tsx:e2e-test.ts:e2e-test.tsx:e2e-spec.ts:e2e-spec.tsx
tex,,texi:tikz:sty:tex:bib:dtx
text,,csv:txt
text,,csv:tsv:txt
textile,,textile
tiltfile,,tiltfile
tfs,.tfignore,
todo,,todo
toml,,toml
tox,.ini,
tox,tox.ini,
travis,.travis.yml,
tsconfig,tsconfig.json:tsconfig.app.json:tsconfig.spec.json:tsconfig.e2e.json:tsconfig.base.json:tsconfig.common.json:tsconfig.dev.json:tsconfig.development.json:tsconfig.staging.json:tsconfig.test.json:tsconfig.prod.json:tsconfig.production.json,
tsconfig,tsconfig.json:tsconfig.app.json:tsconfig.base.json:tsconfig.common.json:tsconfig.dev.json:tsconfig.development.json:tsconfig.e2e.json:tsconfig.prod.json:tsconfig.production.json:tsconfig.server.json:tsconfig.spec.json:tsconfig.staging.json:tsconfig.test.json:tsconfig.lib.json:tsconfig.lib.prod.json,
tsconfig_official,tsconfig.json:tsconfig.app.json:tsconfig.base.json:tsconfig.common.json:tsconfig.dev.json:tsconfig.development.json:tsconfig.e2e.json:tsconfig.prod.json:tsconfig.production.json:tsconfig.server.json:tsconfig.spec.json:tsconfig.staging.json:tsconfig.test.json:tsconfig.lib.json:tsconfig.lib.prod.json,
tslint,tslint.json:tslint.yaml:tslint.yml,
ttcn,,ttcn3
tuc,,tuc
twig,,twig
typedoc,typedoc.js:typedoc.json,
typescript,,ts
typescript_official,,ts
typescriptdef,,d.ts
typescriptdef_official,,d.ts
typo3,,typoscript
unibeautify,.unibeautifyrc:unibeautify.config.js:.unibeautifyrc.js:.unibeautifyrc.json:.unibeautifyrc.yaml:.unibeautifyrc.yml,
unlicense,unlicense:unlicence:unlicense.md:unlicense.txt:unlicence.md:unlicence.txt,
vagrant,vagrantfile,
vala,,vala
vapi,,vapi
vash,,vash
vapor,vapor.yml,
vb,,vb
vba,,cls
vbhtml,,vbhtml
@ -607,6 +677,7 @@ vhdl,,vhdl
video,,3g2:3gp:asf:amv:avi:divx:qt:f4a:f4b:f4p:f4v:flv:m2v:m4v:mkv:mk3d:mov:mp2:mp4:mpe:mpeg:mpeg2:mpg:mpv:nsv:ogv:rm:rmvb:svi:vob:webm:wmv
view,,
vim,.vimrc:.gvimrc,vim
vite,vite.config.js:vite.config.ts,
vlang,,v
volt,,volt
vscode,.vscodeignore:launch.json:tasks.json:vscodeignore.json,
@ -619,30 +690,34 @@ vue,,vue
vueconfig,.vuerc:vue.config.js,
wallaby,wallaby.json:wallaby.js:wallaby.ts:wallaby.coffee:wallaby.conf.json:wallaby.conf.js:wallaby.conf.ts:wallaby.conf.coffee:.wallaby.json:.wallaby.js:.wallaby.ts:.wallaby.coffee:.wallaby.conf.json:.wallaby.conf.js:.wallaby.conf.ts:.wallaby.conf.coffee,
watchmanconfig,.watchmanconfig,
wasm,,wasm:wasm:wasm
wasm,,wasm
webp,,webp
webpack,webpack.base.conf.js:webpack.base.conf.coffee:webpack.base.conf.ts:webpack.common.js:webpack.common.coffee:webpack.common.ts:webpack.config.js:webpack.config.coffee:webpack.config.ts:webpack.config.base.js:webpack.config.base.coffee:webpack.config.base.ts:webpack.config.common.js:webpack.config.common.coffee:webpack.config.common.ts:webpack.config.dev.js:webpack.config.dev.coffee:webpack.config.dev.ts:webpack.config.development.js:webpack.config.development.coffee:webpack.config.development.ts:webpack.config.staging.js:webpack.config.staging.coffee:webpack.config.staging.ts:webpack.config.test.js:webpack.config.test.coffee:webpack.config.test.ts:webpack.config.prod.js:webpack.config.prod.coffee:webpack.config.prod.ts:webpack.config.production.js:webpack.config.production.coffee:webpack.config.production.ts:webpack.config.babel.js:webpack.config.babel.coffee:webpack.config.babel.ts:webpack.config.base.babel.js:webpack.config.base.babel.coffee:webpack.config.base.babel.ts:webpack.config.common.babel.js:webpack.config.common.babel.coffee:webpack.config.common.babel.ts:webpack.config.dev.babel.js:webpack.config.dev.babel.coffee:webpack.config.dev.babel.ts:webpack.config.development.babel.js:webpack.config.development.babel.coffee:webpack.config.development.babel.ts:webpack.config.staging.babel.js:webpack.config.staging.babel.coffee:webpack.config.staging.babel.ts:webpack.config.test.babel.js:webpack.config.test.babel.coffee:webpack.config.test.babel.ts:webpack.config.prod.babel.js:webpack.config.prod.babel.coffee:webpack.config.prod.babel.ts:webpack.config.production.babel.js:webpack.config.production.babel.coffee:webpack.config.production.babel.ts:webpack.dev.js:webpack.dev.coffee:webpack.dev.ts:webpack.dev.conf.js:webpack.dev.conf.coffee:webpack.dev.conf.ts:webpack.prod.js:webpack.prod.coffee:webpack.prod.ts:webpack.prod.conf.js:webpack.prod.conf.coffee:webpack.prod.conf.ts:webpack.mix.js:webpack.mix.coffee:webpack.mix.ts:webpack.test.conf.js:webpack.test.conf.coffee:webpack.test.conf.ts,
webpack,webpack.base.conf.js:webpack.base.conf.coffee:webpack.base.conf.ts:webpack.common.js:webpack.common.coffee:webpack.common.ts:webpack.config.js:webpack.config.coffee:webpack.config.ts:webpack.config.base.js:webpack.config.base.coffee:webpack.config.base.ts:webpack.config.common.js:webpack.config.common.coffee:webpack.config.common.ts:webpack.config.dev.js:webpack.config.dev.coffee:webpack.config.dev.ts:webpack.config.development.js:webpack.config.development.coffee:webpack.config.development.ts:webpack.config.staging.js:webpack.config.staging.coffee:webpack.config.staging.ts:webpack.config.test.js:webpack.config.test.coffee:webpack.config.test.ts:webpack.config.prod.js:webpack.config.prod.coffee:webpack.config.prod.ts:webpack.config.production.js:webpack.config.production.coffee:webpack.config.production.ts:webpack.config.babel.js:webpack.config.babel.coffee:webpack.config.babel.ts:webpack.config.base.babel.js:webpack.config.base.babel.coffee:webpack.config.base.babel.ts:webpack.config.common.babel.js:webpack.config.common.babel.coffee:webpack.config.common.babel.ts:webpack.config.dev.babel.js:webpack.config.dev.babel.coffee:webpack.config.dev.babel.ts:webpack.config.development.babel.js:webpack.config.development.babel.coffee:webpack.config.development.babel.ts:webpack.config.staging.babel.js:webpack.config.staging.babel.coffee:webpack.config.staging.babel.ts:webpack.config.test.babel.js:webpack.config.test.babel.coffee:webpack.config.test.babel.ts:webpack.config.prod.babel.js:webpack.config.prod.babel.coffee:webpack.config.prod.babel.ts:webpack.config.production.babel.js:webpack.config.production.babel.coffee:webpack.config.production.babel.ts:webpack.dev.js:webpack.dev.coffee:webpack.dev.ts:webpack.dev.conf.js:webpack.dev.conf.coffee:webpack.dev.conf.ts:webpack.prod.js:webpack.prod.coffee:webpack.prod.ts:webpack.prod.conf.js:webpack.prod.conf.coffee:webpack.prod.conf.ts:webpack.main.config.js:webpack.main.config.coffee:webpack.main.config.ts:webpack.mix.js:webpack.mix.coffee:webpack.mix.ts:webpack.plugins.js:webpack.plugins.coffee:webpack.plugins.ts:webpack.renderer.config.js:webpack.renderer.config.coffee:webpack.renderer.config.ts:webpack.rules.js:webpack.rules.coffee:webpack.rules.ts:webpack.test.conf.js:webpack.test.conf.coffee:webpack.test.conf.ts,
wenyan,,wy
wercker,wercker.yml,
wolfram,,wl
word,,doc:docx:docm:dot:dotx:dotm:wll
word2,,doc:docx:docm:dot:dotx:dotm:wll
wpml,wpml-config.xml,
wurst,,wurst:wurst
wurst,,wurst
wxml,,wxml
wxss,,wxss
xcode,,xcodeproj
xfl,,xfl
xib,,xib
xliff,,xliff:xlf
xmake,,xmake.lua
xml,,pex:tmlanguage:xml
xquery,,xquery
xsl,,xsl
yaml,,yaml:YAML-tmLanguage
yacc,,bison
yaml,,yaml:yaml-tmlanguage
yamllint,.yamllint,
yandex,.yaspellerrc:.yaspeller.json,
yang,,yang
yarn,yarn.lock:.yarnrc:.yarnclean:.yarn-integrity:.yarn-metadata.json:.yarnignore,
yarn,yarn.lock:.yarnrc:.yarnrc.yml:.yarnclean:.yarn-integrity:.yarn-metadata.json:.yarnignore,
yeoman,.yo-rc.json,
zeit,now.json:.nowignore,
zip,,zip:rar:7z:tar:gz:bzip2:xz:bz2
zip2,,zip:rar:7z:tar:gz:bzip2:xz:bz2
zeit,now.json:.nowignore:vercel.json:.vercelignore,
zig,,zig
zip,,zip:rar:7z:tar:tgz:bz:gz:bzip2:xz:bz2:zipx
zip2,,zip:rar:7z:tar:tgz:bz:gz:bzip2:xz:bz2:zipx
1 file
60 ng_smart_component_js2 page.js:container.js
61 ng_service_ts2 service.ts
62 ng_service_js2 service.js
63 ng_tailwind ng-tailwind.js
64 affectscript affect
65 ansible ansible
66 antlr g4
68 apache htaccess
69 apex cls
70 apib apib
71 api_extractor api-extractor.json:api-extractor-base.json
72 apl apl
73 applescript applescript
74 appsemble .appsemblerc.yaml:app-definition.yaml
75 appveyor appveyor.yml:.appveyor.yml
76 arduino ino:pde
77 asciidoc adoc
78 asp asp:asp asp
79 aspx aspx:ascx
80 assembly asm:asm asm
81 astro astro
82 astroconfig astro.config.js:astro.config.cjs:astro.config.mjs
83 ats ats
84 audio aac:act:aiff:amr:ape:au:dct:dss:dvf:flac:gsm:iklax:ivs:m4a:m4b:m4p:mmf:mogg:mp3:mpc:msv:oga:ogg:opus:ra:raw:tta:vox:wav:wma
85 aurelia aurelia.json
86 autohotkey ahk
87 autoit au3
88 avif avif
89 avro avcs
90 awk awk
91 aws
92 azure azcli
93 azurepipelines azure-pipelines.yml:.vsts-ci.yml azure-pipelines.yml
94 babel .babelrc:babelrc.js:.babelrc.js:babelrc.json:babel.config.js:.babelignore .babelrc:.babelignore:.babelrc.js:.babelrc.cjs:.babelrc.mjs:.babelrc.json:babel.config.js:babel.config.cjs:babel.config.mjs:babel.config.json
95 babel2 .babelrc:babelrc.js:.babelrc.js:babelrc.json:babel.config.js:.babelignore .babelrc:.babelignore:.babelrc.js:.babelrc.cjs:.babelrc.mjs:.babelrc.json:babel.config.js:babel.config.cjs:babel.config.mjs:babel.config.json
96 ballerina bal
97 bat bat
98 bats bats
99 bazaar .bzrignore
100 bazel .bazelrc:bazel.rc:bazel.bazelrc BUILD.bazel:.bazelrc:bazel.rc:bazel.bazelrc bzl bzl:bazel
101 befunge bf:bf bf
102 bicep bicep
103 biml biml
104 binary a:app:bin:cmo:cmx:cma:cmxa:cmi:dll:exe:hl:ilk:lib:n:ndll:o:obj:pyc:pyd:pyo:pdb:scpt:scptd:so
105 bithound .bithoundrc
106 bitbucketpipeline bitbucket-pipelines.yml
107 blade blade.php:blade.php blade.php
108 blitzbasic bb:blitzbasic
109 bolt bolt
110 bosque bsq
111 bower .bowerrc:bower.json
112 browserslist .browserslistrc:browserslist
113 buckbuild .buckconfig
118 c3 c
119 c_al cal
120 cabal cabal
121 caddy Caddyfile caddyfile
122 cake cake
123 cakephp
124 capacitor capacitor.config.json
125 cargo cargo.toml:cargo.lock
126 casc casc
127 cddl cddl
128 cert csr:crt:cer:der:pfx:p12:p7b:p7r:src:crl:sst:stl
129 ceylon ceylon
130 cf lucee:cfml:cfml lucee:cfml
131 cf2 lucee:cfml:cfml lucee:cfml
132 cfc cfc
133 cfc2 cfc
134 cfm cfm
135 cfm2 cfm
136 cheader h
137 chef chefignore:berksfile:berksfile.lock:policyfile chefignore:berksfile:berksfile.lock:policyfile.rb:policyfile.lock.json
138 class class
139 circleci circle.yml
140 clojure cjm:cljc:clojure
141 clojurescript cljs:clojurescript
142 cloudfoundry .cfignore yml
143 cmake cmake:CMakeCache.txt cmake:cmakecache.txt
144 cobol cbl
145 codeql ql
146 codacy .codacy.yml:.codacy.yaml
147 codeclimate .codeclimate.yml
148 codecov codecov.yml:.codecov.yml
153 conan conanfile.txt:conanfile.py
154 conda .condarc
155 config plist:properties:env
156 commitlint commitlint.config.js:.commitlintrc.js:.commitlintrc.json:.commitlintrc.yml
157 compass
158 composer composer.json:composer.lock
159 chef_cookbook ckbk
162 cpp cpp
163 cpp2 cpp
164 cpp3 cpp
165 cppheader hpp hpp:hh:hxx:h++
166 crowdin crowdin.yml
167 crystal cr
168 csharp csx:cs
181 darcs .boringignore
182 dartlang dart
183 db db
184 dependabot dependabot.yml
185 dependencies dependencies.yml
186 delphi pas:pas pas
187 django devcontainer devcontainer.json djt:html:html
188 dlang django d:d:d:d djt:html
189 dlang d
190 diff diff
191 docker docker-compose.yml:docker-compose.ci-build.yml:docker-compose.override.yml:docker-compose.vs.debug.yml:docker-compose.vs.release.yml:docker-cloud.yml compose.yaml:compose.yml:docker-compose.yaml:docker-compose.yml:docker-compose.ci-build.yaml:docker-compose.ci-build.yml:docker-compose.override.yaml:docker-compose.override.yml:docker-compose.vs.debug.yaml:docker-compose.vs.debug.yml:docker-compose.vs.release.yaml:docker-compose.vs.release.yml:docker-cloud.yaml:docker-cloud.yml dockerfile:dockerignore
192 docker2 docker-compose.yml:docker-compose.ci-build.yml:docker-compose.override.yml:docker-compose.vs.debug.yml:docker-compose.vs.release.yml:docker-cloud.yml compose.yaml:compose.yml:docker-compose.yaml:docker-compose.yml:docker-compose.ci-build.yaml:docker-compose.ci-build.yml:docker-compose.override.yaml:docker-compose.override.yml:docker-compose.vs.debug.yaml:docker-compose.vs.debug.yml:docker-compose.vs.release.yaml:docker-compose.vs.release.yml:docker-cloud.yaml:docker-cloud.yml dockerfile:dockerignore
193 dockertest docker-compose.test.yml
194 dockertest2 docker-compose.test.yml
195 docpad eco
196 docz .doczrc:docz.js:docz.json:.docz.js:.docz.json:doczrc.js:doczrc.json:docz.config.js:docz.config.json
197 dojo .dojorc
198 doxygen dox
199 drawio drawio:dio .drawio.png:.drawio.svg
200 drone .drone.yml:.drone.yml.sig
201 drools drl
202 dotjs dot
203 dustjs dust
204 dylan dvc .dvc dylan:dylan
205 dylan dylan
206 editorconfig .editorconfig
207 edge edge
208 edge2 edge
209 eex eex:eex eex
210 ejs ejs
211 elastic es
212 elasticbeanstalk
220 erb erb
221 erlang emakefile:.emakerfile erl
222 erlang2 emakefile:.emakerfile erl
223 eslint .eslintrc:.eslintignore:.eslintcache:.eslintrc.js:.eslintrc.json:.eslintrc.yaml:.eslintrc.yml .eslintrc:.eslintignore:.eslintcache:.eslintrc.js:.eslintrc.mjs:.eslintrc.cjs:.eslintrc.json:.eslintrc.yaml:.eslintrc.yml
224 eslint2 .eslintrc:.eslintignore:.eslintcache:.eslintrc.js:.eslintrc.json:.eslintrc.yaml:.eslintrc.yml .eslintrc:.eslintignore:.eslintcache:.eslintrc.js:.eslintrc.mjs:.eslintrc.cjs:.eslintrc.json:.eslintrc.yaml:.eslintrc.yml
225 excel xls:xlsx:xlsm:ods:fods
226 excel2 xls:xlsx:xlsm:ods:fods
227 expo app.json:app.config.js:app.config.json:app.config.json5
228 falcon falcon
229 fauna .faunarc fql
230 favicon favicon.ico
231 fbx fbx
232 firebase .firebaserc
240 flutter .flutter-plugins:.metadata
241 flutter_package pubspec.lock:pubspec.yaml:.packages
242 font woff:woff2:ttf:otf:eot:pfa:pfb:sfd
243 fortran f:f:f:f f
244 fossa .fossaignore
245 fossil ignore-glob
246 fsharp fs
247 fsproj fsproj
248 freemarker ftl
249 fthtml fthtml
250 fusebox fuse.js
251 galen gspec
252 galen2 gspec
253 git .gitattributes:.gitconfig:.gitignore:.gitmodules:.gitkeep:.mailmap git:git git
254 gamemaker gmx:gml
255 gamemaker2 yy:yyp:gml
256 gamemaker81 gml
257 gatsby gatsby-config.js:gatsby-config.ts:gatsby-node.js:gatsby-node.ts:gatsby-browser.js:gatsby-browser.ts:gatsby-ssr.js:gatsby-ssr.ts
258 gcode gcode
259 genstat gen
260 gitlab .gitlab-ci.yml
261 gitpod .gitpod.yaml:.gitpod.yml:gitpod.yaml:gitpod.yml
262 glide glide.yml
263 glitter .glitterrc
264 glsl glsl
265 glyphs glyphs
266 gnuplot gp
267 go go
268 go_package go.sum:go.mod
269 godot gd
270 gradle gradle
271 gradle2 gradle
272 graphql .gqlconfig gql
273 graphql_config .graphqlconfig:.graphqlconfig.yml:.graphqlconfig.yaml
274 graphviz gv
275 greenkeeper greenkeeper.json
276 gridsome gridsome.config.js:gridsome.config.ts:gridsome.server.js:gridsome.server.ts:gridsome.client.js:gridsome.client.ts
277 groovy groovy
278 groovy2 groovy
279 grunt gruntfile.js:gruntfile.coffee:gruntfile.ts:gruntfile.babel.js:gruntfile.babel.coffee:gruntfile.babel.ts
280 gulp gulpfile.js:gulpfile.coffee:gulpfile.ts:gulpfile.babel.js:gulpfile.babel.coffee:gulpfile.babel.ts gulpfile.js:gulpfile.coffee:gulpfile.ts:gulpfile.mjs:gulpfile.esm.js:gulpfile.esm.coffee:gulpfile.esm.ts:gulpfile.esm.mjs:gulpfile.babel.js:gulpfile.babel.coffee:gulpfile.babel.ts:gulpfile.babel.mjs
281 haml haml
282 handlebars hbs
283 handlebars2 hbs
284 harbour prg
285 haskell hs:lhs
286 haskell2 hs:lhs
287 haxe haxelib.json haxe:haxe:haxe haxe
288 haxecheckstyle checkstyle.json
289 haxedevelop hxproj
290 helix .p4ignore
292 hjson hjson
293 hlsl hlsl
294 homeassistant yaml
295 horusec horusec-config.json
296 host hosts
297 html html
298 htmlhint .htmlhintrc
299 http http
300 hunspell aff:aff aff
301 husky .huskyrc:.huskyrc.js:.huskyrc.json:.huskyrc.yaml:.huskyrc.yml .huskyrc:husky.config.js:.huskyrc.js:.huskyrc.json:.huskyrc.yaml:.huskyrc.yml
302 hy hy
303 hygen ejs.t
304 hypr hypr
305 icl icl
306 idris idr:lidr
307 idrisbin ibc
308 idrispkg ipkg
309 image jpeg:jpg:gif:png:bmp:tiff:ico
310 imba imba imba:imba2
311 inc inc:include
312 infopath infopathxml:xsn:xsf:xtp2
313 informix 4gl
318 jake jakefile:jakefile.js
319 janet janet
320 jar jar
321 jasmine jasmine.json
322 java java
323 jbuilder jbuilder
324 jest jest.config.js:jest.json:jest.config.json:.jestrc:.jestrc.js:.jestrc.json jest.config.json:jest.config.base.json:jest.config.common.json:jest.config.ts:jest.config.base.ts:jest.config.common.ts:jest.json:.jestrc:.jestrc.js:.jestrc.json:jest.config.js:jest.config.cjs:jest.config.mjs:jest.config.base.js:jest.config.base.cjs:jest.config.base.mjs:jest.config.common.js:jest.config.common.cjs:jest.config.common.mjs:jest.config.babel.js:jest.config.babel.cjs:jest.config.babel.mjs
325 jest_snapshot js.snap:jsx.snap:ts.snap:tsx.snap
326 jekyll jekyll
327 jenkins jenkins:jenkins:jenkins jenkins
328 jinja jinja
329 jpm .jpmignore
330 js js
331 js_official js
332 jsbeautify .jsbeautifyrc:jsbeautifyrc:.jsbeautify:jsbeautify
333 jsconfig jsconfig.json
334 jscpd .jscpd.json:jscpd-report.xml:jscpd-report.json:jscpd-report.html
335 jshint .jshintrc:.jshintignore
336 jsmap js.map
337 json json:JSON-tmLanguage:jsonc json:json-tmlanguage:jsonc
338 json_official json:JSON-tmLanguage:jsonc json:json-tmlanguage:jsonc
339 json2 json:JSON-tmLanguage:jsonc json:json-tmlanguage:jsonc
340 jsonnet jsonnet
341 json5 json5:json5 json5
342 jsonld jsonld:json-ld
343 jsp jsp
344 jss jss
345 julia jl:jl jl
346 julia2 jl:jl jl
347 jupyter ipynb
348 io io
349 iodine id
350 karma karma.conf.js:karma.conf.coffee:karma.conf.ts
351 key key:pem
352 kite .kiteignore
353 kitchenci .kitchen.yml .kitchen.yml:kitchen.yml
354 kivy kv
355 kos ks
356 kotlin kt
357 kusto .kusto
358 latino lat
359 layout master:layout.html:layout.htm
360 layout layout.html:layout.htm
361 lerna lerna.json
362 less less
363 lex flex
364 license enc
365 license license:licence:license.md:license.txt:licence.md:licence.txt license:licence:copying:copying.lesser:license.md:license.txt:licence.md:licence.txt:copying.md:copying.txt:copying.lesser.md:copying.lesser.txt
366 licensebat .licrc
367 lighthouse .lighthouserc.js:.lighthouserc.json:.lighthouserc.yaml:.lighthouserc.yml
368 lisp lisp
369 lime hxp
370 lime include.xml
371 lintstagedrc .lintstagedrc:lint-staged.config.js:.lintstagedrc.js:.lintstagedrc.json:.lintstagedrc.yaml:.lintstagedrc.yml
372 liquid liquid
373 livescript ls
374 lnk lnk
375 locale
376 log log:tlg
377 log log:tlg
378 lolcode lol
379 lsl lsl
380 lua lua
398 meson meson.build
399 meteor
400 mjml mjml
401 mlang pq:pq pq
402 mocha mocha.opts:.mocharc.js:.mocharc.json:.mocharc.jsonc:.mocharc.yaml:.mocharc.yml
403 modernizr modernizr:modernizr.js:modernizrrc.js:.modernizr.js:.modernizrrc.js
404 mojolicious ep
405 moleculer moleculer.config.js:moleculer.config.json:moleculer.config.ts
406 mongo mongo
432 nest_service_js service.js
433 nest_service_ts service.ts
434 netlify netlify.toml
435 next next.config.js
436 nginx nginx.conf
437 nim nim:nim nim
438 nimble nimble
439 ninja build.ninja
440 nix nix
441 njsproj njsproj
442 node .node-version:.nvmrc
443 node2 .node-version:.nvmrc
444 nodemon nodemon.json
445 npm .npmignore:.npmrc:package.json:package-lock.json:npm-shrinkwrap.json
446 nsi nsi:nsi:nsi:nsi nsi
447 nsri .nsrirc:.nsriignore:.nsrirc.js:.nsrirc.json:.nsrirc.yaml:.nsrirc.yml:.nsrirc.config.js .nsrirc:.nsriignore:nsri.config.js:.nsrirc.js:.nsrirc.json:.nsrirc.yaml:.nsrirc.yml
448 nsri-integrity .integrity.json
449 nuget nupkg:nuspec:psmdcp nupkg:snupkg:nuspec:psmdcp
450 numpy npy:npz
451 nunjucks nunj:njs:nunjucks
452 nuxt nuxt.config.js:nuxt.config.ts
453 nyc .nycrc:.nycrc.json
454 objectivec m
455 objectivecpp mm
456 ocaml .merlin ml:ml:ml ml
457 ogone o3
458 onenote one:onepkg:onetoc:onetoc2:sig
459 openscad scad
460 opencl cl:opencl
461 openHAB things
462 org org
485 phraseapp .phraseapp.yml
486 pine pine
487 pip pipfile:pipfile.lock requirements.txt
488 platformio pipeline platformio.ini dbgasm:dbgasm:dbgasm pipeline
489 platformio platformio.ini dbgasm
490 plantuml pu:plantuml:iuml:puml
491 plsql ddl:ddl ddl
492 plsql_package pck
493 plsql_package_body pkb
494 plsql_package_header pkh
495 plsql_package_spec pks
496 pnpm pnpmfile.js:pnpm-lock.yaml:pnpm-workspace.yaml
497 poedit po:mo
498 polymer polymer
499 pony pony
500 postcss pcss
501 postcssconfig .postcssrc:.postcssrc.json:.postcssrc.yml:.postcssrc.js:postcss.config.js .postcssrc:.postcssrc.json:.postcssrc.yaml:.postcssrc.yml:.postcssrc.ts:.postcssrc.js:.postcssrc.cjs:postcss.config.ts:postcss.config.js:postcss.config.cjs
502 powerpoint pot:potx:potm:pps:ppsx:ppsm:ppt:pptx:pptm:pa:ppa:ppam:sldm:sldx
503 powerpoint2 pot:potx:potm:pps:ppsx:ppsm:ppt:pptx:pptm:pa:ppa:ppam:sldm:sldx
504 powershell ps1
511 powershell_psd2 psd1
512 precommit .pre-commit-config.yaml
513 prettier .prettierrc:.prettierignore
514 prettier prettier.config.js:prettier.config.ts:prettier.config.coffee prettier.config.js:prettier.config.cjs:prettier.config.ts:prettier.config.coffee
515 prettier .prettierrc.js:.prettierrc.json:.prettierrc.yml:.prettierrc.yaml .prettierrc.js:.prettierrc.cjs:.prettierrc.json:.prettierrc.json5:.prettierrc.yml:.prettierrc.yaml
516 prisma prisma
517 processinglang pde
518 procfile procfile
519 progress w
520 prolog pro:P:pro pro:P
521 prometheus rules
522 protobuf proto:proto proto
523 protractor protractor.conf.js:protractor.conf.coffee:protractor.conf.ts
524 publisher pub:puz
525 puppet pp
527 purescript purs
528 pyret arr
529 python py
530 pytyped py.typed
531 pyup .pyup:.pyup.yml
532 q q
533 qbs qbs
542 rake rake
543 rake rakefile
544 raml raml
545 razor cshtml:cshtml cshtml
546 razzle razzle.config.js
547 reactjs jsx
548 reacttemplate rt
550 reason re
551 red red
552 registry reg
553 rego rego
554 rehype .rehyperc:.rehypeignore:.rehyperc.js:.rehyperc.json:.rehyperc.yml:.rehyperc.yaml
555 remark .remarkrc:.remarkignore:.remarkrc.js:.remarkrc.json:.remarkrc.yml:.remarkrc.yaml
556 renovate .renovaterc:renovate.json:.renovaterc.json
557 rescript res
558 rest rst
559 retext .retextrc:.retextignore:.retextrc.js:.retextrc.json:.retextrc.yml:.retextrc.yaml
560 rexx rex
561 riot tag
562 robotframework robot
563 robots robots.txt
564 rollup rollup.config.js:rollup.config.mjs:rollup.config.coffee:rollup.config.ts:rollup.config.common.js:rollup.config.common.mjs:rollup.config.common.coffee:rollup.config.common.ts:rollup.config.dev.js:rollup.config.dev.mjs:rollup.config.dev.coffee:rollup.config.dev.ts:rollup.config.prod.js:rollup.config.prod.mjs:rollup.config.prod.coffee:rollup.config.prod.ts rollup.config.js:rollup.config.cjs:rollup.config.mjs:rollup.config.coffee:rollup.config.ts:rollup.config.common.js:rollup.config.common.cjs:rollup.config.common.mjs:rollup.config.common.coffee:rollup.config.common.ts:rollup.config.dev.js:rollup.config.dev.cjs:rollup.config.dev.mjs:rollup.config.dev.coffee:rollup.config.dev.ts:rollup.config.prod.js:rollup.config.prod.cjs:rollup.config.prod.mjs:rollup.config.prod.coffee:rollup.config.prod.ts
565 rmd rmd
566 rproj rproj
567 rspec .rspec
568 rubocop .rubocop.yml:.rubocop_todo.yml
569 ruby rb
570 rust rs
571 rust_toolchain rust-toolchain
572 sails .sailsrc
573 saltstack sls
574 san san
575 sas sas
576 sass sass
577 sbt sbt
578 scala scala
581 scilab sce
582 sdlang sdl
583 sentry .sentryclirc
584 serverless serverless.yml serverless.yml:serverless.json:serverless.js:serverless.ts
585 sequelize .sequelizerc:.sequelizerc.js:.sequelizerc.json
586 shaderlab shader unity:shader
587 shell fish:sh
588 sketch sketch
589 slang slang
592 sln sln
593 sln2 sln
594 silverstripe ss
595 skipper eskip:eskip eskip
596 smarty tpl
597 snapcraft snapcraft.yaml
598 snort snort
600 solidarity .solidarity:.solidarity.json
601 solidity sol
602 source
603 spacengine spe
604 sparql rq
605 sqf sqf
606 sql sql
607 sqlite sqlite:sqlite3:db3
611 stata dta:do
612 stencil stencil:html.stencil
613 style
614 stylelint .stylelintrc:.stylelintignore:.stylelintcache:stylelint.config.js:stylelint.config.json:stylelint.config.yaml:stylelint.config.yml:stylelint.config.ts:.stylelintrc.js:.stylelintrc.json:.stylelintrc.yaml:.stylelintrc.yml:.stylelintrc.ts .stylelintrc:.stylelintignore:.stylelintcache:stylelint.config.js:stylelint.config.json:stylelint.config.yaml:stylelint.config.yml:stylelint.config.ts:stylelint.config.cjs:.stylelintrc.js:.stylelintrc.json:.stylelintrc.yaml:.stylelintrc.yml:.stylelintrc.ts:.stylelintrc.cjs
615 stylable st.css
616 styled styled
617 stylish_haskell .stylish-haskell.yaml
618 stylus styl
619 storyboard storyboard
620 storybook story.js:story.jsx:story.ts:story.tsx:stories.js:stories.jsx:stories.ts:stories.tsx story.js:story.jsx:story.ts:story.tsx:story.mdx:stories.js:stories.jsx:stories.ts:stories.tsx:stories.mdx
621 subversion .svnignore
622 svelte svelte
623 svg svg
624 swagger swagger:swagger swagger
625 swift package.pins swift
626 swig swig
627 symfony symfony.lock
628 systemd link
629 systemverilog sv
630 t4tt tt
631 tailwind tailwind.js:tailwind.coffee:tailwind.ts:tailwind.config.js:tailwind.config.coffee:tailwind.config.ts tailwind.js:tailwind.cjs:tailwind.coffee:tailwind.ts:tailwind.json:tailwind.config.js:tailwind.config.cjs:tailwind.config.coffee:tailwind.config.ts:tailwind.config.json
632 teal teal
633 tt tt2:tt3
634 tcl tcl:exp
635 tera tera
636 terraform tfstate:tf
637 test tst
638 testcafe .testcaferc.json
639 testjs test.js:test.jsx:test.mjs:spec.js:spec.jsx:spec.mjs
640 testts test.ts:test.tsx:spec.ts:spec.tsx:e2e-test.ts:e2e-test.tsx:e2e-spec.ts:e2e-spec.tsx
641 tex texi:tikz:sty:tex:bib:dtx
642 text csv:txt csv:tsv:txt
643 textile textile
644 tiltfile tiltfile
645 tfs .tfignore
646 todo todo
647 toml toml
648 tox .ini tox.ini
649 travis .travis.yml
650 tsconfig tsconfig.json:tsconfig.app.json:tsconfig.spec.json:tsconfig.e2e.json:tsconfig.base.json:tsconfig.common.json:tsconfig.dev.json:tsconfig.development.json:tsconfig.staging.json:tsconfig.test.json:tsconfig.prod.json:tsconfig.production.json tsconfig.json:tsconfig.app.json:tsconfig.base.json:tsconfig.common.json:tsconfig.dev.json:tsconfig.development.json:tsconfig.e2e.json:tsconfig.prod.json:tsconfig.production.json:tsconfig.server.json:tsconfig.spec.json:tsconfig.staging.json:tsconfig.test.json:tsconfig.lib.json:tsconfig.lib.prod.json
651 tsconfig_official tsconfig.json:tsconfig.app.json:tsconfig.base.json:tsconfig.common.json:tsconfig.dev.json:tsconfig.development.json:tsconfig.e2e.json:tsconfig.prod.json:tsconfig.production.json:tsconfig.server.json:tsconfig.spec.json:tsconfig.staging.json:tsconfig.test.json:tsconfig.lib.json:tsconfig.lib.prod.json
652 tslint tslint.json:tslint.yaml:tslint.yml
653 ttcn ttcn3
654 tuc tuc
655 twig twig
656 typedoc typedoc.js:typedoc.json
657 typescript ts
658 typescript_official ts
659 typescriptdef d.ts
660 typescriptdef_official d.ts
661 typo3 typoscript
662 unibeautify .unibeautifyrc:unibeautify.config.js:.unibeautifyrc.js:.unibeautifyrc.json:.unibeautifyrc.yaml:.unibeautifyrc.yml
663 unlicense unlicense:unlicence:unlicense.md:unlicense.txt:unlicence.md:unlicence.txt
664 vagrant vagrantfile
665 vala vala
666 vapi vapi
667 vash vash
668 vapor vapor.yml
669 vb vb
670 vba cls
671 vbhtml vbhtml
677 video 3g2:3gp:asf:amv:avi:divx:qt:f4a:f4b:f4p:f4v:flv:m2v:m4v:mkv:mk3d:mov:mp2:mp4:mpe:mpeg:mpeg2:mpg:mpv:nsv:ogv:rm:rmvb:svi:vob:webm:wmv
678 view
679 vim .vimrc:.gvimrc vim
680 vite vite.config.js:vite.config.ts
681 vlang v
682 volt volt
683 vscode .vscodeignore:launch.json:tasks.json:vscodeignore.json
690 vueconfig .vuerc:vue.config.js
691 wallaby wallaby.json:wallaby.js:wallaby.ts:wallaby.coffee:wallaby.conf.json:wallaby.conf.js:wallaby.conf.ts:wallaby.conf.coffee:.wallaby.json:.wallaby.js:.wallaby.ts:.wallaby.coffee:.wallaby.conf.json:.wallaby.conf.js:.wallaby.conf.ts:.wallaby.conf.coffee
692 watchmanconfig .watchmanconfig
693 wasm wasm:wasm:wasm wasm
694 webp webp
695 webpack webpack.base.conf.js:webpack.base.conf.coffee:webpack.base.conf.ts:webpack.common.js:webpack.common.coffee:webpack.common.ts:webpack.config.js:webpack.config.coffee:webpack.config.ts:webpack.config.base.js:webpack.config.base.coffee:webpack.config.base.ts:webpack.config.common.js:webpack.config.common.coffee:webpack.config.common.ts:webpack.config.dev.js:webpack.config.dev.coffee:webpack.config.dev.ts:webpack.config.development.js:webpack.config.development.coffee:webpack.config.development.ts:webpack.config.staging.js:webpack.config.staging.coffee:webpack.config.staging.ts:webpack.config.test.js:webpack.config.test.coffee:webpack.config.test.ts:webpack.config.prod.js:webpack.config.prod.coffee:webpack.config.prod.ts:webpack.config.production.js:webpack.config.production.coffee:webpack.config.production.ts:webpack.config.babel.js:webpack.config.babel.coffee:webpack.config.babel.ts:webpack.config.base.babel.js:webpack.config.base.babel.coffee:webpack.config.base.babel.ts:webpack.config.common.babel.js:webpack.config.common.babel.coffee:webpack.config.common.babel.ts:webpack.config.dev.babel.js:webpack.config.dev.babel.coffee:webpack.config.dev.babel.ts:webpack.config.development.babel.js:webpack.config.development.babel.coffee:webpack.config.development.babel.ts:webpack.config.staging.babel.js:webpack.config.staging.babel.coffee:webpack.config.staging.babel.ts:webpack.config.test.babel.js:webpack.config.test.babel.coffee:webpack.config.test.babel.ts:webpack.config.prod.babel.js:webpack.config.prod.babel.coffee:webpack.config.prod.babel.ts:webpack.config.production.babel.js:webpack.config.production.babel.coffee:webpack.config.production.babel.ts:webpack.dev.js:webpack.dev.coffee:webpack.dev.ts:webpack.dev.conf.js:webpack.dev.conf.coffee:webpack.dev.conf.ts:webpack.prod.js:webpack.prod.coffee:webpack.prod.ts:webpack.prod.conf.js:webpack.prod.conf.coffee:webpack.prod.conf.ts:webpack.mix.js:webpack.mix.coffee:webpack.mix.ts:webpack.test.conf.js:webpack.test.conf.coffee:webpack.test.conf.ts webpack.base.conf.js:webpack.base.conf.coffee:webpack.base.conf.ts:webpack.common.js:webpack.common.coffee:webpack.common.ts:webpack.config.js:webpack.config.coffee:webpack.config.ts:webpack.config.base.js:webpack.config.base.coffee:webpack.config.base.ts:webpack.config.common.js:webpack.config.common.coffee:webpack.config.common.ts:webpack.config.dev.js:webpack.config.dev.coffee:webpack.config.dev.ts:webpack.config.development.js:webpack.config.development.coffee:webpack.config.development.ts:webpack.config.staging.js:webpack.config.staging.coffee:webpack.config.staging.ts:webpack.config.test.js:webpack.config.test.coffee:webpack.config.test.ts:webpack.config.prod.js:webpack.config.prod.coffee:webpack.config.prod.ts:webpack.config.production.js:webpack.config.production.coffee:webpack.config.production.ts:webpack.config.babel.js:webpack.config.babel.coffee:webpack.config.babel.ts:webpack.config.base.babel.js:webpack.config.base.babel.coffee:webpack.config.base.babel.ts:webpack.config.common.babel.js:webpack.config.common.babel.coffee:webpack.config.common.babel.ts:webpack.config.dev.babel.js:webpack.config.dev.babel.coffee:webpack.config.dev.babel.ts:webpack.config.development.babel.js:webpack.config.development.babel.coffee:webpack.config.development.babel.ts:webpack.config.staging.babel.js:webpack.config.staging.babel.coffee:webpack.config.staging.babel.ts:webpack.config.test.babel.js:webpack.config.test.babel.coffee:webpack.config.test.babel.ts:webpack.config.prod.babel.js:webpack.config.prod.babel.coffee:webpack.config.prod.babel.ts:webpack.config.production.babel.js:webpack.config.production.babel.coffee:webpack.config.production.babel.ts:webpack.dev.js:webpack.dev.coffee:webpack.dev.ts:webpack.dev.conf.js:webpack.dev.conf.coffee:webpack.dev.conf.ts:webpack.prod.js:webpack.prod.coffee:webpack.prod.ts:webpack.prod.conf.js:webpack.prod.conf.coffee:webpack.prod.conf.ts:webpack.main.config.js:webpack.main.config.coffee:webpack.main.config.ts:webpack.mix.js:webpack.mix.coffee:webpack.mix.ts:webpack.plugins.js:webpack.plugins.coffee:webpack.plugins.ts:webpack.renderer.config.js:webpack.renderer.config.coffee:webpack.renderer.config.ts:webpack.rules.js:webpack.rules.coffee:webpack.rules.ts:webpack.test.conf.js:webpack.test.conf.coffee:webpack.test.conf.ts
696 wenyan wy
697 wercker wercker.yml
698 wolfram wl
699 word doc:docx:docm:dot:dotx:dotm:wll
700 word2 doc:docx:docm:dot:dotx:dotm:wll
701 wpml wpml-config.xml
702 wurst wurst:wurst wurst
703 wxml wxml
704 wxss wxss
705 xcode xcodeproj
706 xfl xfl
707 xib xib
708 xliff xliff:xlf
709 xmake xmake.lua
710 xml pex:tmlanguage:xml
711 xquery xquery
712 xsl xsl
713 yaml yacc yaml:YAML-tmLanguage bison
714 yaml yaml:yaml-tmlanguage
715 yamllint .yamllint
716 yandex .yaspellerrc:.yaspeller.json
717 yang yang
718 yarn yarn.lock:.yarnrc:.yarnclean:.yarn-integrity:.yarn-metadata.json:.yarnignore yarn.lock:.yarnrc:.yarnrc.yml:.yarnclean:.yarn-integrity:.yarn-metadata.json:.yarnignore
719 yeoman .yo-rc.json
720 zeit now.json:.nowignore now.json:.nowignore:vercel.json:.vercelignore
721 zip zig zip:rar:7z:tar:gz:bzip2:xz:bz2 zig
722 zip2 zip zip:rar:7z:tar:gz:bzip2:xz:bz2 zip:rar:7z:tar:tgz:bz:gz:bzip2:xz:bz2:zipx
723 zip2 zip:rar:7z:tar:tgz:bz:gz:bzip2:xz:bz2:zipx

View file

@ -1,7 +1,7 @@
folder,
root_folder,
android,android
api,api:.api
api,api:.api:apis:.apis
app,app:.app
arangodb,arangodb:arango
asset,assets:.assets
@ -11,6 +11,7 @@ aws,aws:.aws
azure,azure:.azure
azurepipelines,azure-pipelines:.azure-pipelines
binary,bin:.bin
bloc,blocs:bloc
blueprint,blueprint:.blueprint:blueprints:.blueprints
bower,bower_components
buildkite,.buildkite
@ -18,24 +19,29 @@ cake,cake:.cake
certificate,certificates:.certificates:certs:certs.
chef,chef:.chef
circleci,.circleci
controller,controllers:.controllers:handlers:.handlers
component,components:.components:widgets
controller,controller:controllers:.controllers:handlers:.handlers
component,component:components:.components:widgets
composer,composer:.composer
cli,cli:cmd:command:commands:commandline:console
client,client
client,client:clients
cmake,.cmake:cmake
config,config:.config:configs:.configs:configuration:.configuration:configurations:.configurations:setting:.setting:settings:.settings:ini:.ini:initializers:.initializers
config,conf:.conf:config:.config:configs:.configs:configuration:.configuration:configurations:.configurations:setting:.setting:settings:.settings:ini:.ini:initializers:.initializers
coverage,coverage
css,css:_css
cubit,cubits:cubit
cypress,cypress
dapr,.dapr:dapr
db,db:database:sql:data:repo:repository:repositories
debian,debian
dist,dist:dists:out:outs:export:exports:build:builds:release:releases:target:targets
debian,debian:deb
dependabot,.dependabot
devcontainer,.devcontainer
dist,dist:.dist:dists:out:outs:export:exports:build:.build:builds:release:releases:target:targets
docker,docker:.docker
docs,docs:doc
e2e,e2e
elasticbeanstalk,.elasticbeanstalk:.ebextensions
electron,electron
expo,.expo:.expo-shared
favicon,favicon:favicons
flow,flow:flow-typed
fonts,fonts:font:fnt
@ -48,18 +54,20 @@ graphql,graphql
grunt,grunt
gulp,gulp:gulpfile.js:gulpfile.coffee:gulpfile.ts:gulpfile.babel.js:gulpfile.babel.coffee:gulpfile.babel.ts
haxelib,.haxelib:haxe_libraries
helper,helpers:.helpers
helper,helper:.helper:helpers:.helpers
hook,hook:.hook:hooks:.hooks
husky,.husky
idea,.idea
images,images:image:img:icons:icon:ico:screenshot:screenshots:svg
include,include:includes:incl:inc:.include:.includes:.incl:.inc:_include:_includes:_incl:_inc
interfaces,interfaces
interfaces,interface:interfaces
ios,ios
js,js
json,json
json_official,json
kubernetes,kubernetes:k8s:kube:kuber:.kubernetes:.k8s:.kube:.kuber
less,less:_less
library,lib:.lib:library
library,lib:libs:.lib:.libs:library:libraries
linux,linux
locale,lang:language:languages:locale:locales:_locale:_locales:internationalization:globalization:localization:i18n:g11n:l10n
log,log:logs
@ -67,14 +75,15 @@ macos,macos:darwin
mariadb,mariadb:maria
maven,.mvn
memcached,memcached:.memcached
middleware,middleware
middleware,middleware:middlewares
mjml,mjml:.mjml
minikube,minikube:minik8s:minikuber
mock,mocks:.mocks:__mocks__
model,models:.models:entities:.entities
model,model:.model:models:.models:entities:.entities
module,modules
mongodb,mongodb:mongo
mysql,mysqldb:mysql
next,.next
nginx,nginx:conf.d
node,node_modules
notification,notification:notifications:event:events
@ -92,20 +101,21 @@ ravendb,ravendb
route,route:routes:_route:_routes:routers
redux,redux
meteor,.meteor
nuxt,.nuxt
sass,sass:scss:_sass:_scss
script,script:scripts
server,server
services,services
services,service:services
src,src:source:sources
sso,sso
story,stories:__stories__
story,story:stories:__stories__:.storybook
style,style:styles
test,tests:.tests:test:.test:__tests__:__test__:spec:.spec:specs:.specs
temp,temp:.temp:tmp:.tmp
template,template:.template:templates:.templates
theme,theme:themes
travis,.travis
tools,tools:.tools:util:utils
tools,tool:tools:.tools:util:utils
typescript,typescript:ts
typings,typings:@types
typings2,typings:@types
@ -122,4 +132,4 @@ vscode_test2,.vscode-test
vscode_test3,.vscode-test
webpack,webpack
windows,windows:win32
www,www:wwwroot
www,www:wwwroot
1 folder
2 root_folder
3 android android
4 api api:.api api:.api:apis:.apis
5 app app:.app
6 arangodb arangodb:arango
7 asset assets:.assets
11 azure azure:.azure
12 azurepipelines azure-pipelines:.azure-pipelines
13 binary bin:.bin
14 bloc blocs:bloc
15 blueprint blueprint:.blueprint:blueprints:.blueprints
16 bower bower_components
17 buildkite .buildkite
19 certificate certificates:.certificates:certs:certs.
20 chef chef:.chef
21 circleci .circleci
22 controller controllers:.controllers:handlers:.handlers controller:controllers:.controllers:handlers:.handlers
23 component components:.components:widgets component:components:.components:widgets
24 composer composer:.composer
25 cli cli:cmd:command:commands:commandline:console
26 client client client:clients
27 cmake .cmake:cmake
28 config config:.config:configs:.configs:configuration:.configuration:configurations:.configurations:setting:.setting:settings:.settings:ini:.ini:initializers:.initializers conf:.conf:config:.config:configs:.configs:configuration:.configuration:configurations:.configurations:setting:.setting:settings:.settings:ini:.ini:initializers:.initializers
29 coverage coverage
30 css css:_css
31 cubit cubits:cubit
32 cypress cypress
33 dapr .dapr:dapr
34 db db:database:sql:data:repo:repository:repositories
35 debian debian debian:deb
36 dist dependabot dist:dists:out:outs:export:exports:build:builds:release:releases:target:targets .dependabot
37 devcontainer .devcontainer
38 dist dist:.dist:dists:out:outs:export:exports:build:.build:builds:release:releases:target:targets
39 docker docker:.docker
40 docs docs:doc
41 e2e e2e
42 elasticbeanstalk .elasticbeanstalk:.ebextensions
43 electron electron
44 expo .expo:.expo-shared
45 favicon favicon:favicons
46 flow flow:flow-typed
47 fonts fonts:font:fnt
54 grunt grunt
55 gulp gulp:gulpfile.js:gulpfile.coffee:gulpfile.ts:gulpfile.babel.js:gulpfile.babel.coffee:gulpfile.babel.ts
56 haxelib .haxelib:haxe_libraries
57 helper helpers:.helpers helper:.helper:helpers:.helpers
58 hook hook:.hook:hooks:.hooks
59 husky .husky
60 idea .idea
61 images images:image:img:icons:icon:ico:screenshot:screenshots:svg
62 include include:includes:incl:inc:.include:.includes:.incl:.inc:_include:_includes:_incl:_inc
63 interfaces interfaces interface:interfaces
64 ios ios
65 js js
66 json json
67 json_official json
68 kubernetes kubernetes:k8s:kube:kuber:.kubernetes:.k8s:.kube:.kuber
69 less less:_less
70 library lib:.lib:library lib:libs:.lib:.libs:library:libraries
71 linux linux
72 locale lang:language:languages:locale:locales:_locale:_locales:internationalization:globalization:localization:i18n:g11n:l10n
73 log log:logs
75 mariadb mariadb:maria
76 maven .mvn
77 memcached memcached:.memcached
78 middleware middleware middleware:middlewares
79 mjml mjml:.mjml
80 minikube minikube:minik8s:minikuber
81 mock mocks:.mocks:__mocks__
82 model models:.models:entities:.entities model:.model:models:.models:entities:.entities
83 module modules
84 mongodb mongodb:mongo
85 mysql mysqldb:mysql
86 next .next
87 nginx nginx:conf.d
88 node node_modules
89 notification notification:notifications:event:events
101 route route:routes:_route:_routes:routers
102 redux redux
103 meteor .meteor
104 nuxt .nuxt
105 sass sass:scss:_sass:_scss
106 script script:scripts
107 server server
108 services services service:services
109 src src:source:sources
110 sso sso
111 story stories:__stories__ story:stories:__stories__:.storybook
112 style style:styles
113 test tests:.tests:test:.test:__tests__:__test__:spec:.spec:specs:.specs
114 temp temp:.temp:tmp:.tmp
115 template template:.template:templates:.templates
116 theme theme:themes
117 travis .travis
118 tools tools:.tools:util:utils tool:tools:.tools:util:utils
119 typescript typescript:ts
120 typings typings:@types
121 typings2 typings:@types
132 vscode_test3 .vscode-test
133 webpack webpack
134 windows windows:win32
135 www www:wwwroot

View file

@ -0,0 +1,37 @@
import * as React from 'react'
import { resolveDiffGraphMeta } from 'utils/general'
import { Icon } from './Icon'
export function DiffStatGraph({
diff: { status, changes, additions, deletions },
}: {
diff: Required<TreeNode>['diff']
}) {
const { g, r, w } = resolveDiffGraphMeta(additions, deletions, changes)
const children: React.ReactNode[] = []
for (let i = 0; i < g; i++)
children.push(<span key={`g-${i}`} className="diff-stat-graph-addition" />)
for (let i = 0; i < r; i++)
children.push(<span key={`r-${i}`} className="diff-stat-graph-deletion" />)
for (let i = 0; i < w; i++)
children.push(<span key={`w-${i}`} className="diff-stat-graph-no-change" />)
return (
<span className={'diff-stat-graph'}>
<Icon
className={status}
type={
{
added: 'diffAdded',
ignored: 'diffIgnored',
modified: 'diffModified',
removed: 'diffRemoved',
renamed: 'diffRenamed',
}[status]
}
/>
{children}
</span>
)
}

View file

@ -0,0 +1,34 @@
import * as React from 'react'
import { Icon } from './Icon'
export function DiffStatText({
diff: { status, changes, additions, deletions },
}: {
diff: Required<TreeNode>['diff']
}) {
return (
<span className={'diff-stat-text'}>
{status !== 'modified' && (
<Icon
className={status}
type={
{
added: 'diffAdded',
ignored: 'diffIgnored',
// modified: 'diffModified', // hide modified icon
removed: 'diffRemoved',
renamed: 'diffRenamed',
}[status]
}
/>
)}
{additions > 0 && (
<span className={'additions'}>{status === 'modified' ? `+${additions}` : additions}</span>
)}
{additions > 0 && deletions > 0 && '/'}
{deletions > 0 && (
<span className={'deletions'}>{status === 'modified' ? `-${deletions}` : deletions}</span>
)}
</span>
)
}

View file

@ -17,6 +17,8 @@ import { useOnLocationChange } from 'utils/hooks/useOnLocationChange'
import { useOnPJAXDone } from 'utils/hooks/usePJAX'
import { VisibleNodes } from 'utils/VisibleNodesGenerator'
import { SideBarStateContext } from '../containers/SideBarState'
import { DiffStatGraph } from './DiffStatGraph'
import { DiffStatText } from './DiffStatText'
import { Icon } from './Icon'
import { SearchMode, searchModes } from './searchModes'
import { SizeObserver } from './SizeObserver'
@ -46,17 +48,27 @@ const RawFileExplorer: React.FC<Props & ConnectorState> = function RawFileExplor
searched,
} = props
const {
value: { accessToken, compressSingletonFolder, searchMode, commentToggle },
value: {
accessToken,
compressSingletonFolder,
searchMode,
commentToggle,
restoreExpandedFolders,
showDiffInText,
},
} = useConfigs()
const onSearch = React.useCallback(
(searchKey: string, searchMode: SearchMode) => {
updateSearchKey(searchKey)
if (visibleNodesGenerator) {
visibleNodesGenerator.search(searchModes[searchMode].getSearchParams(searchKey))
visibleNodesGenerator.search(
searchModes[searchMode].getSearchParams(searchKey),
restoreExpandedFolders,
)
}
},
[updateSearchKey, visibleNodesGenerator],
[updateSearchKey, visibleNodesGenerator, restoreExpandedFolders],
)
const stateContext = useLoadedContext(SideBarStateContext)
@ -74,8 +86,8 @@ const RawFileExplorer: React.FC<Props & ConnectorState> = function RawFileExplor
}, [setUpTree, metaData, compressSingletonFolder, accessToken])
React.useEffect(() => {
if (visibleNodes?.focusedNode) focusFileExplorer()
})
focusFileExplorer()
}, [])
const renderActions: ((node: TreeNode) => React.ReactNode) | undefined = React.useMemo(() => {
const renderGoToButton = (node: TreeNode): React.ReactNode => (
@ -106,14 +118,28 @@ const RawFileExplorer: React.FC<Props & ConnectorState> = function RawFileExplor
</button>
) : undefined
const renderFileCommentAmounts = (node: TreeNode): React.ReactNode =>
node.comments !== undefined &&
node.comments > 0 && (
<span className={'node-item-comment'}>
<Icon type={'comment'} /> {node.comments > 9 ? '9+' : node.comments}
node.comments?.active ? (
<span
className={'node-item-comment'}
title={`${node.comments.active + node.comments.resolved} comments, ${
node.comments.active
} active, ${node.comments.resolved} resolved`}
>
<Icon type={'comment'} /> {node.comments.active > 9 ? '9+' : node.comments.active}
</span>
) : null
const renderFileStatus = ({ diff }: TreeNode): React.ReactNode =>
diff && (
<span
className={'node-item-diff'}
title={`${diff.status}, ${diff.changes} changes: +${diff.additions} & -${diff.deletions}`}
>
{showDiffInText ? <DiffStatText diff={diff} /> : <DiffStatGraph diff={diff} />}
</span>
)
const renders: ((node: TreeNode) => React.ReactNode)[] = []
renders.push(renderFileStatus)
if (commentToggle) renders.push(renderFileCommentAmounts)
if (searchMode === 'fuzzy') renders.push(renderFindInFolderButton)
if (searched) renders.push(renderGoToButton)
@ -121,7 +147,7 @@ const RawFileExplorer: React.FC<Props & ConnectorState> = function RawFileExplor
return renders.length
? node => renders.map((render, i) => <React.Fragment key={i}>{render(node)}</React.Fragment>)
: undefined
}, [goTo, onSearch, searched, searchMode, commentToggle])
}, [goTo, onSearch, searched, searchMode, commentToggle, showDiffInText])
const renderLabelText = React.useCallback(
(node: TreeNode) => searchModes[searchMode].renderNodeLabelText(node, searchKey),
@ -167,13 +193,15 @@ const RawFileExplorer: React.FC<Props & ConnectorState> = function RawFileExplor
)}
<SizeObserver className={'files'}>
{({ width = 0, height = 0 }) => (
<ListView
height={height}
width={width}
renderNodeContext={renderNodeContext}
expandTo={expandTo}
metaData={metaData}
/>
<div className={'magic-size-container'}>
<ListView
height={height}
width={width}
renderNodeContext={renderNodeContext}
expandTo={expandTo}
metaData={metaData}
/>
</div>
)}
</SizeObserver>

View file

@ -3,6 +3,12 @@ import {
ChevronRightIcon as ChevronRight,
ClockIcon as Clock,
CommentIcon as Comment,
DiffAddedIcon as DiffAdded,
DiffIcon as Diff,
DiffIgnoredIcon as DiffIgnored,
DiffModifiedIcon as DiffModified,
DiffRemovedIcon as DiffRemoved,
DiffRenamedIcon as DiffRenamed,
FileCodeIcon as FileCode,
FileIcon as File,
FileMediaIcon as FileMedia,
@ -18,7 +24,7 @@ import {
ReplyIcon as Reply,
SearchIcon as Search,
TabIcon as Tab,
XIcon as X,
XIcon as X
} from '@primer/octicons-react'
import * as React from 'react'
import { cx } from 'utils/cx'
@ -27,6 +33,12 @@ const iconToComponentMap = {
Search,
Clock,
Comment,
Diff,
DiffAdded,
DiffIgnored,
DiffModified,
DiffRemoved,
DiffRenamed,
Hourglass,
Submodule,
Grabber,
@ -60,6 +72,12 @@ const typeToIconComponentMap: {
pin: 'Pin',
tab: 'Tab',
gear: 'Gear',
diff: 'Diff',
diffAdded: 'DiffAdded',
diffIgnored: 'DiffIgnored',
diffModified: 'DiffModified',
diffRemoved: 'DiffRemoved',
diffRenamed: 'DiffRenamed',
folder: 'ChevronRight',
'chevron-down': 'ChevronDown',
'go-to': 'Reply',

View file

@ -2,6 +2,8 @@ import { BranchName, Breadcrumb, Flex, Text } from '@primer/components'
import { GitBranchIcon } from '@primer/octicons-react'
import { platform } from 'platforms'
import * as React from 'react'
import { isOpenInNewWindowClick } from 'utils/general'
import { loadWithPJAX } from 'utils/hooks/usePJAX'
type Props = {
metaData: MetaData
@ -9,12 +11,14 @@ type Props = {
export function MetaBar({ metaData }: Props) {
const { userName, repoName, branchName } = metaData
const { repoUrl, userUrl } = platform.resolveUrlFromMetaData(metaData)
const { repoUrl, userUrl, branchUrl } = platform.resolveUrlFromMetaData(metaData)
return (
<>
<Breadcrumb className={'user-and-repo'}>
<Breadcrumb.Item href={userUrl}>{userName}</Breadcrumb.Item>
<Breadcrumb.Item href={repoUrl}>
<Breadcrumb.Item className={'user-name'} href={userUrl}>
{userName}
</Breadcrumb.Item>
<Breadcrumb.Item className={'repo-name'} href={repoUrl}>
<Text fontWeight="bolder">{repoName}</Text>
</Breadcrumb.Item>
</Breadcrumb>
@ -22,7 +26,18 @@ export function MetaBar({ metaData }: Props) {
<div className={'octicon-wrapper'}>
<GitBranchIcon size="small" />
</div>
<BranchName as="span" className={'branch-name'}>
<BranchName
href={branchUrl}
as="a"
className={'branch-name'}
onClick={e => {
if (isOpenInNewWindowClick(e)) return
e.preventDefault()
loadWithPJAX(branchUrl, e.currentTarget)
}}
{...platform.delegatePJAXProps?.()}
>
{branchName || '...'}
</BranchName>
</Flex>

View file

@ -1,8 +1,8 @@
import { useConfigs } from 'containers/ConfigsContext'
import { platform } from 'platforms'
import * as React from 'react'
import { cx } from 'utils/cx'
import { OperatingSystems, os } from 'utils/general'
import { getFileIconSrc, getFolderIconSrc } from 'utils/parseIconMapCSV'
import { getFileIconURL, getFolderIconURL } from 'utils/parseIconMapCSV'
import { Icon } from './Icon'
function getIconType(node: TreeNode) {
@ -42,21 +42,11 @@ export function Node({
return (
<a
href={node.url}
onClick={event => {
if (
(os === OperatingSystems.macOS && event.metaKey) ||
(os === OperatingSystems.Linux && event.ctrlKey) ||
(os === OperatingSystems.Windows && event.ctrlKey)
) {
// The default behavior, open in new tab
return
}
onClick(event, node)
}}
onClick={event => onClick(event, node)}
className={cx(`node-item`, { focused, disabled: node.accessDenied, expanded, compact })}
style={{ ...style, paddingLeft: `${10 + (compact ? 10 : 20) * depth}px` }}
title={node.path}
{...platform.delegatePJAXProps?.({ node })}
>
<div className={'node-item-label'}>
<NodeItemIcon node={node} open={expanded} loading={loading} />
@ -81,7 +71,7 @@ const NodeItemIcon = React.memo(function NodeItemIcon({
} = useConfigs()
const src = React.useMemo(
() => (node.type === 'tree' ? getFolderIconSrc(node, open) : getFileIconSrc(node)),
() => (node.type === 'tree' ? getFolderIconURL(node, open) : getFileIconURL(node)),
[open],
)

View file

@ -1,10 +1,10 @@
import { Icon } from 'components/Icon'
import * as React from 'react'
import { Size } from './SideBarBodyWrapper'
import { Size2D } from './SideBarBodyWrapper'
type Props = {
size: Size
onResize(size: Size): void
size: Size2D
onResize(size: Size2D): void
onResetSize?(): void
onResizeStateChange?(state: ResizeState): void
style?: React.CSSProperties
@ -12,55 +12,13 @@ type Props = {
type ResizeState = 'idle' | 'resizing'
export function HorizontalResizeHandler({
onResize,
onResetSize,
onResizeStateChange,
size,
style,
}: Props) {
const pointerDown = React.useRef(false)
const startX = React.useRef(0)
const baseSize = React.useRef(size)
const latestPropSize = React.useRef(size)
React.useEffect(() => {
latestPropSize.current = size
}, [size])
const onPointerDown = React.useCallback(({ clientX }: React.MouseEvent) => {
startX.current = clientX
pointerDown.current = true
baseSize.current = latestPropSize.current
onResizeStateChange?.('resizing')
}, [])
React.useEffect(() => {
const onPointerMove = ({ clientX }: MouseEvent) => {
if (!pointerDown.current) return
const shift = clientX - startX.current
onResize(baseSize.current + shift)
}
window.addEventListener('mousemove', onPointerMove)
return () => window.removeEventListener('mousemove', onPointerMove)
}, [onResize])
React.useEffect(() => {
const onPointerUp = () => {
if (pointerDown.current) {
pointerDown.current = false
baseSize.current = latestPropSize.current
onResizeStateChange?.('idle')
}
}
window.addEventListener('mouseup', onPointerUp)
return () => window.removeEventListener('mouseup', onPointerUp)
}, [])
export function ResizeHandler({ onResize, onResetSize, onResizeStateChange, size, style }: Props) {
const { onPointerDown } = useResizeHandler(size, onResize, { onResizeStateChange })
return (
<div
className={'gitako-resize-handler'}
onMouseDown={onPointerDown}
onPointerDown={onPointerDown}
onDoubleClick={onResetSize}
style={style}
>
@ -68,3 +26,61 @@ export function HorizontalResizeHandler({
</div>
)
}
export function useResizeHandler(
size: Size2D,
onResize: (size: Size2D) => void,
{
onResizeStateChange,
onClick,
}: Partial<{
onResizeStateChange: (state: ResizeState) => void
onClick: (e: PointerEvent) => void
}> = {},
) {
const pointerDown = React.useRef(false)
const pointerMoved = React.useRef(false)
const initialSizeRef = React.useRef([0, 0])
const baseSize = React.useRef(size)
const latestPropSize = React.useRef(size)
React.useEffect(() => {
latestPropSize.current = size
}, [size])
React.useEffect(() => {
const onPointerMove = ({ clientX, clientY }: PointerEvent) => {
if (!pointerDown.current) return
pointerMoved.current = true
const [x, y] = baseSize.current
onResize([x + clientX - initialSizeRef.current[0], y + clientY - initialSizeRef.current[1]])
}
window.addEventListener('pointermove', onPointerMove)
return () => window.removeEventListener('pointermove', onPointerMove)
}, [onResize])
React.useEffect(() => {
const onPointerUp = (e: PointerEvent) => {
if (pointerDown.current) {
pointerDown.current = false
if (!pointerMoved.current) onClick?.(e)
pointerMoved.current = false
baseSize.current = latestPropSize.current
onResizeStateChange?.('idle')
}
}
window.addEventListener('pointerup', onPointerUp)
return () => window.removeEventListener('pointerup', onPointerUp)
}, [])
const onPointerDown = React.useCallback(({ clientX, clientY }: React.PointerEvent) => {
pointerDown.current = true
initialSizeRef.current = [clientX, clientY]
baseSize.current = latestPropSize.current
onResizeStateChange?.('resizing')
}, [])
return { onPointerDown }
}

View file

@ -15,6 +15,12 @@ export function SearchBar({ onSearch, onFocus, value }: Props) {
const configs = useConfigs()
const { searchMode } = configs.value
const toggleButtonDescription = `${
searchMode === 'regex'
? 'Match file name with regular expression.'
: 'Match file path sequence with input.'
} Click to toggle.`
return (
<div className={'search-input-wrapper'}>
<TextInput
@ -36,7 +42,7 @@ export function SearchBar({ onSearch, onFocus, value }: Props) {
<div className={`actions`}>
<button
className={`toggle-search-mode`}
title="Toggle search mode"
title={toggleButtonDescription}
onClick={() => {
const newMode = searchMode === 'regex' ? 'fuzzy' : 'regex'
configs.onChange({
@ -44,7 +50,7 @@ export function SearchBar({ onSearch, onFocus, value }: Props) {
})
onSearch(value, newMode)
}}
aria-label="Toggle search mode"
aria-label={toggleButtonDescription}
>
{searchMode === 'regex' ? '.*' : 'path'}
</button>

View file

@ -13,8 +13,7 @@ import * as DOMHelper from 'utils/DOMHelper'
import { run } from 'utils/general'
import { useCatchNetworkError } from 'utils/hooks/useCatchNetworkError'
import { useLoadedContext } from 'utils/hooks/useLoadedContext'
import { loadWithPJAX, useOnPJAXDone, usePJAX } from 'utils/hooks/usePJAX'
import { useProgressBar } from 'utils/hooks/useProgressBar'
import { useOnPJAXDone, usePJAX } from 'utils/hooks/usePJAX'
import { useStateIO } from 'utils/hooks/useStateIO'
import { SideBarErrorContext } from '../containers/ErrorContext'
import { RepoContext } from '../containers/RepoContext'
@ -98,7 +97,6 @@ export function SideBar() {
platform.usePlatformHooks?.()
usePJAX()
useProgressBar()
// Hide sidebar when error due to auth but token is set #128
const hideSidebarOnInvalidToken: boolean =
@ -128,6 +126,7 @@ export function SideBar() {
})}
baseSize={baseSize}
onLeave={sidebarToggleMode === 'float' ? () => setShowSideBar(false) : undefined}
sizeVariableMountPoint={sidebarToggleMode === 'persistent' ? document.body : undefined}
>
<div className={'gitako-side-bar-body'}>
<div
@ -181,7 +180,6 @@ export function SideBar() {
metaData={metaData}
freeze={showSettings}
accessToken={accessToken}
loadWithPJAX={loadWithPJAX}
config={configContext.value}
catchNetworkErrors={useCatchNetworkError()}
/>

View file

@ -1,28 +1,36 @@
import { HorizontalResizeHandler } from 'components/ResizeHandler'
import { ResizeHandler } from 'components/ResizeHandler'
import { useConfigs } from 'containers/ConfigsContext'
import * as React from 'react'
import { useDebounce, useWindowSize } from 'react-use'
import { defaultConfigs } from 'utils/config/helper'
import { cx } from 'utils/cx'
import { setResizingState } from 'utils/DOMHelper'
import { setCSSVariable } from 'utils/DOMHelper'
import * as features from 'utils/features'
import { useCSSVariable } from 'utils/hooks/useCSSVariable'
export type Size = number
type Size = number
export type Size2D = [Size, Size]
type Props = {
baseSize: Size
className?: string
onLeave?: React.HTMLAttributes<HTMLElement>['onMouseLeave']
sizeVariableMountPoint?: HTMLElement
}
const MINIMAL_CONTENT_VIEWPORT_WIDTH = 100
const MINIMAL_WIDTH = 240
function getSafeSize(size: number, width: number) {
if (size > width - MINIMAL_CONTENT_VIEWPORT_WIDTH) return width - MINIMAL_CONTENT_VIEWPORT_WIDTH
if (size < MINIMAL_WIDTH) return MINIMAL_WIDTH
return size
}
export function SideBarBodyWrapper({
baseSize,
className,
children,
onLeave,
sizeVariableMountPoint,
}: React.PropsWithChildren<Props>) {
const [size, setSize] = React.useState(baseSize)
const configContext = useConfigs()
@ -34,27 +42,50 @@ export function SideBarBodyWrapper({
const { width } = useWindowSize()
React.useEffect(() => {
if (size > width - MINIMAL_CONTENT_VIEWPORT_WIDTH)
setSize(width - MINIMAL_CONTENT_VIEWPORT_WIDTH)
else if (size < MINIMAL_WIDTH) setSize(MINIMAL_WIDTH)
const safeSize = getSafeSize(size, width)
if (safeSize !== size) setSize(safeSize)
}, [width, size])
React.useEffect(() => {
setResizingState(true)
const timer = setTimeout(() => setResizingState(false), 100)
return () => clearTimeout(timer)
}, [width, size])
useCSSVariable('--gitako-width', `${size}px`)
const bodyWrapperRef = React.useRef<HTMLDivElement | null>(null)
useDebounce(() => configContext.onChange({ sideBarWidth: size }), 100, [size])
const onResize = React.useCallback((size: number) => {
// do NOT merge this with the above similar effect, side bar will jump otherwise
if (size > width - MINIMAL_CONTENT_VIEWPORT_WIDTH)
setSize(width - MINIMAL_CONTENT_VIEWPORT_WIDTH)
else if (size < MINIMAL_WIDTH) setSize(MINIMAL_WIDTH)
else setSize(size)
}, [])
function apply(sizeVariableMountPoint: HTMLElement | undefined, size: number) {
if (sizeVariableMountPoint)
setCSSVariable(
'--gitako-width',
sizeVariableMountPoint ? `${size}px` : undefined,
sizeVariableMountPoint,
)
if (bodyWrapperRef.current)
setCSSVariable(
'--gitako-width',
sizeVariableMountPoint ? undefined : `${size}px`,
bodyWrapperRef.current,
)
}
// Update size using useEffect would cause delay
const onResize = React.useMemo(() => {
let sizeToApply: number,
applied = true
return ([size]: number[]) => {
// do NOT merge this with the above similar effect, side bar will jump otherwise
sizeToApply = getSafeSize(size, width)
setSize(sizeToApply)
if (applied) {
applied = false
requestAnimationFrame(() => {
applied = true
apply(sizeVariableMountPoint, sizeToApply)
})
}
}
}, [width, sizeVariableMountPoint])
React.useEffect(() => {
apply(sizeVariableMountPoint, size)
}, [sizeVariableMountPoint])
const onMouseLeave = React.useCallback(
e => {
@ -64,17 +95,25 @@ export function SideBarBodyWrapper({
[onLeave],
)
const newLocal: [number, number] = React.useMemo(() => [size, size], [size])
return (
<div className={cx('gitako-side-bar-body-wrapper', className)} onMouseLeave={onMouseLeave}>
<div
ref={bodyWrapperRef}
className={cx('gitako-side-bar-body-wrapper', className)}
onMouseLeave={onMouseLeave}
>
<div className={'gitako-side-bar-body-wrapper-content'}>{children}</div>
{features.resize && (
<HorizontalResizeHandler
<ResizeHandler
onResize={onResize}
onResetSize={() => setSize(defaultConfigs.sideBarWidth)}
onResetSize={() => {
setSize(defaultConfigs.sideBarWidth)
apply(sizeVariableMountPoint, defaultConfigs.sideBarWidth)
}}
onResizeStateChange={state => {
blockLeaveRef.current = state === 'resizing'
}}
size={size}
size={newLocal}
/>
)}
</div>

View file

@ -19,16 +19,6 @@ export function SizeObserver({ type = 'div', children, ...rest }: Props) {
height: undefined,
})
const safeSetSize = React.useCallback(function safeSetSize(rect: DOMRectReadOnly) {
// requestAnimationFrame fixes "ResizeObserver loop limit exceeded" error
requestAnimationFrame(() =>
setSize({
width: rect.width,
height: rect.height,
}),
)
}, [])
React.useEffect(() => {
if (ref.current) {
if (features.resize) {
@ -36,7 +26,7 @@ export function SizeObserver({ type = 'div', children, ...rest }: Props) {
const entry = entries[0]
if (!entry) return
const rect = entry.contentRect
safeSetSize(rect)
setSize(rect)
})
observer.observe(ref.current)
return () => observer.disconnect()

View file

@ -1,33 +1,34 @@
import iconSrc from 'assets/icons/Gitako.png'
import iconURL from 'assets/icons/Gitako.png'
import { useConfigs } from 'containers/ConfigsContext'
import * as React from 'react'
import { useDebounce, useWindowSize } from 'react-use'
import { cx } from 'utils/cx'
import { Icon } from './Icon'
import { useResizeHandler } from './ResizeHandler'
type Props = {
error?: string | null
className?: React.HTMLAttributes<HTMLButtonElement>['className']
onHover?: React.HTMLAttributes<HTMLButtonElement>['onMouseEnter']
} & Pick<React.HTMLAttributes<HTMLButtonElement>, 'onClick'>
onClick?: (e: PointerEvent) => void
}
const buttonHeight = 42
function getSafeDistance(y: number, height: number) {
return Math.max(0, Math.min(y, height - buttonHeight))
}
export function ToggleShowButton({ error, className, onClick, onHover }: Props) {
const ref = React.useRef<HTMLDivElement>(null)
const config = useConfigs()
const [distance, setDistance] = React.useState(config.value.toggleButtonVerticalDistance)
const { height } = useWindowSize()
const buttonHeight = 42
React.useEffect(() => {
// make sure it is inside viewport
if (height - buttonHeight < distance) {
setDistance(Math.max(0, height - buttonHeight))
}
const safeDistance = getSafeDistance(distance, height)
if (safeDistance !== distance) setDistance(safeDistance)
}, [height, distance])
React.useLayoutEffect(() => {
if (ref.current) {
ref.current.style.top = distance + 'px'
}
}, [distance])
// updating context
useDebounce(
@ -36,42 +37,40 @@ export function ToggleShowButton({ error, className, onClick, onHover }: Props)
[distance],
)
const toggleIconMode = config.value.toggleButtonContent
React.useEffect(() => {
if (ref.current) {
ref.current.style.top = distance + 'px'
}
}, [])
const { onPointerDown } = useResizeHandler(
[distance, distance],
([, y]) => {
const distance = getSafeDistance(y, height)
setDistance(distance)
if (ref.current) {
ref.current.style.top = distance + 'px'
}
},
{ onClick },
)
return (
<div ref={ref} className={cx('gitako-toggle-show-button-wrapper', className)}>
<button
className={cx('gitako-toggle-show-button', {
error,
})}
onClick={onClick}
onMouseEnter={onHover}
draggable
onDragStart={event => {
hideDragPreview(event)
}}
onDrag={e => {
if (e.clientY !== 0) {
// It will be 0 when release pointer
setDistance(e.clientY - buttonHeight / 2)
}
}}
onPointerEnter={onHover}
onPointerDown={onPointerDown}
title={'Gitako (draggable)'}
>
{toggleIconMode === 'octoface' ? (
{config.value.toggleButtonContent === 'octoface' ? (
<Icon className={'octoface-icon'} type={'octoface'} />
) : (
<img className={'tentacle'} draggable={false} src={iconSrc} />
<img className={'tentacle'} draggable={false} src={iconURL} />
)}
</button>
{error && <span className={'error-message'}>{error}</span>}
</div>
)
}
function hideDragPreview(event: React.DragEvent<HTMLButtonElement>) {
const img = new Image()
const EMPTY_IMAGE_BASE64 =
'data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs='
img.src = EMPTY_IMAGE_BASE64
event.dataTransfer.setDragImage(img, 0, 0)
}

View file

@ -76,6 +76,13 @@ export function FileTreeSettings(props: React.PropsWithChildren<Props>) {
tooltip: 'Merge folders and their only child folder to make UI more compact.',
}}
/>
<SimpleToggleField
field={{
key: 'restoreExpandedFolders',
label: 'Restore expanded folders',
tooltip: 'Folders will be expanded again when clear search input',
}}
/>
<SimpleToggleField
field={{
key: 'commentToggle',
@ -83,6 +90,13 @@ export function FileTreeSettings(props: React.PropsWithChildren<Props>) {
tooltip: 'Show number of comments next to file names in Pull Requests.',
}}
/>
<SimpleToggleField
field={{
key: 'showDiffInText',
label: 'Show PR file diff in text',
tooltip: 'Glance diff in a more precise way.',
}}
/>
<SimpleToggleField
field={{
key: 'compactFileTree',

View file

@ -73,9 +73,13 @@ function SettingsBarContent() {
{reloadHint && <div className={'hint'}>{reloadHint}</div>}
</SettingsSection>
)}
<SettingsSection title={'Feedback'}>
<SettingsSection title={'Talk to the author'}>
<a href="https://github.com/EnixCoda/Gitako/issues" target="_blank">
Report bug / Request feature.
Report bug
</a>
{' / '}
<a href="https://github.com/EnixCoda/Gitako/discussions" target="_blank">
Discuss feature
</a>
</SettingsSection>
</div>

View file

@ -3,7 +3,8 @@ import { GetCreatedMethod, MethodCreator } from 'driver/connect'
import { platform } from 'platforms'
import { Config } from 'utils/config/helper'
import * as DOMHelper from 'utils/DOMHelper'
import { OperatingSystems, os } from 'utils/general'
import { isOpenInNewWindowClick, OperatingSystems, os } from 'utils/general'
import { loadWithPJAX } from 'utils/hooks/usePJAX'
import { VisibleNodes, VisibleNodesGenerator } from 'utils/VisibleNodesGenerator'
export type Props = {
@ -11,7 +12,6 @@ export type Props = {
freeze: boolean
accessToken: string | undefined
config: Config
loadWithPJAX(url: string): void
catchNetworkErrors: <T>(fn: () => T) => Promise<T | undefined>
}
@ -49,158 +49,146 @@ export const setUpTree: BoundMethodCreator<
config: Pick<Config, 'compressSingletonFolder' | 'accessToken'>
},
]
> = dispatch => ({ stateContext, metaData, config }) => {
const {
props: { catchNetworkErrors },
} = dispatch.get()
> =
dispatch =>
({ stateContext, metaData, config }) => {
const {
props: { catchNetworkErrors },
} = dispatch.get()
catchNetworkErrors(async () => {
const { userName, repoName, branchName } = metaData
catchNetworkErrors(async () => {
const { userName, repoName, branchName } = metaData
stateContext.onChange('tree-loading')
const { root: treeRoot, defer = false } = await platform.getTreeData(
{
branchName: branchName,
userName,
repoName,
},
'/',
true,
config.accessToken,
)
stateContext.onChange('tree-loading')
const { root: treeRoot, defer = false } = await platform.getTreeData(
{
branchName: branchName,
userName,
repoName,
},
'/',
true,
config.accessToken,
)
stateContext.onChange('tree-rendering')
dispatch.set({ defer })
stateContext.onChange('tree-rendering')
dispatch.set({ defer })
const visibleNodesGenerator = new VisibleNodesGenerator({
root: treeRoot,
compress: config.compressSingletonFolder,
async getTreeData(path) {
const { root } = await platform.getTreeData(metaData, path, false, config.accessToken)
return root
},
})
dispatch.set({ visibleNodesGenerator })
visibleNodesGenerator.onUpdate(visibleNodes => dispatch.set({ visibleNodes }))
if (platform.shouldExpandAll?.()) {
const unsubscribe = visibleNodesGenerator.onUpdate(visibleNodes => {
unsubscribe()
visibleNodes.nodes.forEach(node =>
dispatch.call(toggleNodeExpansion, node, { recursive: true }),
)
const visibleNodesGenerator = new VisibleNodesGenerator({
root: treeRoot,
compress: config.compressSingletonFolder,
async getTreeData(path) {
const { root } = await platform.getTreeData(metaData, path, false, config.accessToken)
return root
},
})
} else {
const targetPath = platform.getCurrentPath(metaData.branchName)
if (targetPath) dispatch.call(goTo, targetPath)
}
dispatch.set({ visibleNodesGenerator })
visibleNodesGenerator.onUpdate(visibleNodes => dispatch.set({ visibleNodes }))
stateContext.onChange('tree-rendered')
})
}
if (platform.shouldExpandAll?.()) {
const unsubscribe = visibleNodesGenerator.onUpdate(visibleNodes => {
unsubscribe()
visibleNodes.nodes.forEach(node =>
dispatch.call(toggleNodeExpansion, node, { recursive: true }),
)
})
} else {
const targetPath = platform.getCurrentPath(metaData.branchName)
if (targetPath) dispatch.call(goTo, targetPath)
}
export const handleKeyDown: BoundMethodCreator<[React.KeyboardEvent]> = dispatch => event => {
const {
state: { searched, visibleNodes },
props: { loadWithPJAX },
} = dispatch.get()
if (!visibleNodes) return
const { nodes, focusedNode, expandedNodes } = visibleNodes
function handleVerticalMove(index: number) {
if (0 <= index && index < nodes.length) {
DOMHelper.focusFileExplorer()
dispatch.call(focusNode, nodes[index])
} else {
DOMHelper.focusSearchInput()
dispatch.call(focusNode, null)
}
stateContext.onChange('tree-rendered')
})
}
const { key } = event
// prevent document body scrolling if the keypress results in Gitako action
let muteEvent = true
if (focusedNode) {
const focusedNodeIndex = nodes.findIndex(node => node.path === focusedNode.path)
switch (key) {
case 'ArrowUp':
// focus on previous node
handleVerticalMove(focusedNodeIndex - 1)
break
export const handleKeyDown: BoundMethodCreator<[React.KeyboardEvent<HTMLElement>]> =
dispatch => event => {
const {
state: { searched, visibleNodes },
} = dispatch.get()
if (!visibleNodes) return
const { nodes, focusedNode, expandedNodes } = visibleNodes
function handleVerticalMove(index: number) {
if (0 <= index && index < nodes.length) {
DOMHelper.focusFileExplorer()
dispatch.call(focusNode, nodes[index])
} else {
DOMHelper.focusSearchInput()
dispatch.call(focusNode, null)
}
}
case 'ArrowDown':
// focus on next node
handleVerticalMove(focusedNodeIndex + 1)
break
case 'ArrowLeft':
if (wouldBlockHistoryNavigation(event)) {
muteEvent = false
const { key } = event
// prevent document body scrolling if the keypress results in Gitako action
let muteEvent = true
if (focusedNode) {
const focusedNodeIndex = nodes.findIndex(node => node.path === focusedNode.path)
switch (key) {
case 'ArrowUp':
// focus on previous node
handleVerticalMove(focusedNodeIndex - 1)
break
}
if (expandedNodes.has(focusedNode.path)) {
dispatch.call(toggleNodeExpansion, focusedNode, { recursive: event.altKey })
} else {
// go forward to the start of the list, find the closest node with lower depth
const parentNode = getVisibleParentNode(nodes, focusedNode)
if (parentNode) {
dispatch.call(focusNode, parentNode)
case 'ArrowDown':
// focus on next node
handleVerticalMove(focusedNodeIndex + 1)
break
case 'ArrowLeft':
if (wouldBlockHistoryNavigation(event)) {
muteEvent = false
break
}
}
break
// consider the two keys as 'confirm' key
case 'ArrowRight':
if (wouldBlockHistoryNavigation(event)) {
muteEvent = false
break
}
// expand node or focus on first content node or redirect to file page
if (focusedNode.type === 'tree') {
if (expandedNodes.has(focusedNode.path)) {
const nextNode = nodes[focusedNodeIndex + 1]
if (focusedNode.contents?.includes(nextNode)) {
dispatch.call(focusNode, nextNode)
}
dispatch.call(toggleNodeExpansion, focusedNode, { recursive: event.altKey })
} else {
dispatch.call(toggleNodeExpansion, focusedNode, { recursive: event.altKey })
// go forward to the start of the list, find the closest node with lower depth
const parentNode = getVisibleParentNode(nodes, focusedNode)
if (parentNode) {
dispatch.call(focusNode, parentNode)
}
}
} else if (focusedNode.type === 'blob') {
if (focusedNode.url) loadWithPJAX(focusedNode.url)
} else if (focusedNode.type === 'commit') {
window.open(focusedNode.url)
}
break
case 'Enter':
// expand node or redirect to file page
if (searched) {
dispatch.call(goTo, focusedNode.path.split('/'))
} else {
break
// consider the two keys as 'confirm' key
case 'ArrowRight':
if (wouldBlockHistoryNavigation(event)) {
muteEvent = false
break
}
// expand node or focus on first content node or redirect to file page
if (focusedNode.type === 'tree') {
dispatch.call(toggleNodeExpansion, focusedNode, { recursive: event.altKey })
if (expandedNodes.has(focusedNode.path)) {
const nextNode = nodes[focusedNodeIndex + 1]
if (focusedNode.contents?.includes(nextNode)) {
dispatch.call(focusNode, nextNode)
}
} else {
dispatch.call(toggleNodeExpansion, focusedNode, { recursive: event.altKey })
}
} else if (focusedNode.type === 'blob') {
if (focusedNode.url) loadWithPJAX(focusedNode.url)
const focusedNodeElement = DOMHelper.findNodeElement(focusedNode, event.currentTarget)
if (focusedNodeElement && focusedNode.url)
loadWithPJAX(focusedNode.url, focusedNodeElement)
} else if (focusedNode.type === 'commit') {
window.open(focusedNode.url)
}
}
break
default:
muteEvent = false
}
if (muteEvent) {
event.preventDefault()
}
} else {
// now search input is focused
if (nodes.length) {
switch (key) {
case 'ArrowDown':
DOMHelper.focusFileExplorer()
dispatch.call(focusNode, nodes[0])
break
case 'ArrowUp':
DOMHelper.focusFileExplorer()
dispatch.call(focusNode, nodes[nodes.length - 1])
case 'Enter':
// expand node or redirect to file page
if (searched) {
dispatch.call(goTo, focusedNode.path.split('/'))
} else {
if (focusedNode.type === 'tree') {
dispatch.call(toggleNodeExpansion, focusedNode, { recursive: event.altKey })
} else if (focusedNode.type === 'blob') {
const focusedNodeElement = DOMHelper.findNodeElement(focusedNode, event.currentTarget)
if (focusedNodeElement && focusedNode.url)
loadWithPJAX(focusedNode.url, focusedNodeElement)
} else if (focusedNode.type === 'commit') {
window.open(focusedNode.url)
}
}
break
default:
muteEvent = false
@ -208,9 +196,27 @@ export const handleKeyDown: BoundMethodCreator<[React.KeyboardEvent]> = dispatch
if (muteEvent) {
event.preventDefault()
}
} else {
// now search input is focused
if (nodes.length) {
switch (key) {
case 'ArrowDown':
DOMHelper.focusFileExplorer()
dispatch.call(focusNode, nodes[0])
break
case 'ArrowUp':
DOMHelper.focusFileExplorer()
dispatch.call(focusNode, nodes[nodes.length - 1])
break
default:
muteEvent = false
}
if (muteEvent) {
event.preventDefault()
}
}
}
}
}
export const onFocusSearchBar: BoundMethodCreator = dispatch => () => dispatch.call(focusNode, null)
@ -231,18 +237,17 @@ export const goTo: BoundMethodCreator<[string[]]> = dispatch => path => {
})
}
export const setExpand: BoundMethodCreator<[TreeNode, boolean]> = dispatch => async (
node,
expand = false,
) => {
const {
state: { visibleNodesGenerator },
} = dispatch.get()
if (!visibleNodesGenerator) return
export const setExpand: BoundMethodCreator<[TreeNode, boolean]> =
dispatch =>
async (node, expand = false) => {
const {
state: { visibleNodesGenerator },
} = dispatch.get()
if (!visibleNodesGenerator) return
await visibleNodesGenerator.setExpand(node, expand)
dispatch.call(focusNode, node)
}
await visibleNodesGenerator.setExpand(node, expand)
dispatch.call(focusNode, node)
}
export const toggleNodeExpansion: BoundMethodCreator<
[
@ -251,30 +256,35 @@ export const toggleNodeExpansion: BoundMethodCreator<
recursive?: boolean
},
]
> = dispatch => async (node, { recursive = false }) => {
const {
state: { visibleNodesGenerator },
} = dispatch.get()
if (!visibleNodesGenerator) return
> =
dispatch =>
async (node, { recursive = false }) => {
const {
state: { visibleNodesGenerator },
} = dispatch.get()
if (!visibleNodesGenerator) return
visibleNodesGenerator.focusNode(node)
await visibleNodesGenerator.toggleExpand(node, recursive)
}
if (node.type === 'tree') {
visibleNodesGenerator.focusNode(node)
await visibleNodesGenerator.toggleExpand(node, recursive)
}
}
export const focusNode: BoundMethodCreator<[TreeNode | null]> = dispatch => (
node: TreeNode | null,
) => {
const {
state: { visibleNodesGenerator },
} = dispatch.get()
if (!visibleNodesGenerator) return
export const focusNode: BoundMethodCreator<[TreeNode | null]> =
dispatch => (node: TreeNode | null) => {
const {
state: { visibleNodesGenerator },
} = dispatch.get()
if (!visibleNodesGenerator) return
visibleNodesGenerator.focusNode(node)
}
visibleNodesGenerator.focusNode(node)
}
export const onNodeClick: BoundMethodCreator<
[React.MouseEvent<HTMLElement, MouseEvent>, TreeNode]
> = dispatch => (event, node) => {
if (isOpenInNewWindowClick(event)) return
const preventDefault = !(node.type === 'blob' && node.url?.includes('#'))
if (preventDefault) event.preventDefault()
@ -289,12 +299,9 @@ export const onNodeClick: BoundMethodCreator<
(recursiveToggleFolder === 'alt' && event.altKey)
dispatch.call(toggleNodeExpansion, node, { recursive })
} else if (node.type === 'blob') {
const {
props: { loadWithPJAX },
} = dispatch.get()
dispatch.call(focusNode, node)
if (node.url && !node.url.includes('#')) {
loadWithPJAX(node.url)
loadWithPJAX(node.url, event.currentTarget)
}
} else if (node.type === 'commit') {
if (node.url) {
@ -316,6 +323,10 @@ export const expandTo: BoundMethodCreator<[string[]]> = dispatch => async curren
}
function wouldBlockHistoryNavigation(event: React.KeyboardEvent) {
// Alt + left/right is usually history navigation shortcut on OS other than macOS
return os !== OperatingSystems.macOS && event.altKey
// Cmd + left/right on macOS
// Alt + left/right on other OSes
return (
(os === OperatingSystems.macOS && event.metaKey) ||
(os !== OperatingSystems.macOS && event.altKey)
)
}

11
src/global.d.ts vendored
View file

@ -16,7 +16,16 @@ type TreeNode = {
url?: string
sha?: string
accessDenied?: boolean
comments?: number
comments?: {
active: number,
resolved: number,
}
diff?: {
status: 'modified' | 'added' | 'removed' | 'renamed'
additions: number
deletions: number
changes: number
}
}
type IO<T, ChangeT = T> = {

View file

@ -116,11 +116,11 @@ export async function getPullComments(
return await request(url, { accessToken })
}
export async function getPullPageDocument(
export async function getPullPageDocuments(
userName: string,
repoName: string,
pullId: string, // not used
): Promise<Document> {
): Promise<Document[]> {
// Response of this API contains view of few files but is not complete.
const filesDOM = await getDOM(
`https://${window.location.host}/${userName}/${repoName}/pull/${pullId}/files?_pjax=%23js-repo-pjax-container`,
@ -137,11 +137,26 @@ export async function getPullPageDocument(
const search = new URLSearchParams(window.location.search)
search.set('sha1', baseSHA)
search.set('sha2', headSHA)
return await getDOM(`https://${window.location.host}/${userName}/${repoName}/diffs?${search}`)
let lines = 0
const diffsDOMs: Document[] = []
while (true) {
search.set('lines', lines.toString())
const diffsDOM = await getDOM(
`https://${window.location.host}/${userName}/${repoName}/diffs?${search}`,
)
diffsDOMs.push(diffsDOM)
async function getDOM(url: string) {
return new DOMParser().parseFromString(await (await fetch(url)).text(), 'text/html')
if (diffsDOM.querySelector('.js-diff-progressive-container')) {
lines += 3000
} else {
break
}
}
return diffsDOMs
}
async function getDOM(url: string) {
return new DOMParser().parseFromString(await (await fetch(url)).text(), 'text/html')
}
export async function getBlobData(

View file

@ -2,13 +2,13 @@ import { raiseError } from 'analytics'
import { Clippy, ClippyClassName } from 'components/Clippy'
import * as React from 'react'
import { $ } from 'utils/DOMHelper'
import { renderReact } from 'utils/general'
import { renderReact, run } from 'utils/general'
import { CopyFileButton, copyFileButtonClassName } from './CopyFileButton'
export function resolveMeta(): Partial<MetaData> {
const metaData = {
userName: $('[itemprop="author"]', e => e.textContent?.trim()),
repoName: $('[itemprop="name"]', e => e.textContent?.trim()),
userName: $('[itemprop="author"] > a[rel="author"]', e => e.textContent?.trim()),
repoName: $('[itemprop="name"] > a[href]', e => e.textContent?.trim()),
branchName: getCurrentBranch(true),
}
if (!metaData.userName || !metaData.repoName) {
@ -148,21 +148,28 @@ export function attachCopyFileBtn() {
}
if (getCurrentPageType() === PAGE_TYPES.RAW_TEXT) {
// the button group in file content header
const buttonGroupSelector = '.repository-content .Box-header .BtnGroup'
const buttonGroups = document.querySelectorAll(buttonGroupSelector)
let buttonGroup: HTMLElement | null = null
if (buttonGroups.length === 0) {
raiseError(new Error(`No button groups found`))
if (!buttonGroup) {
const rawUrlButtonSelector = '#raw-url'
const $buttonGroup = document.querySelector(rawUrlButtonSelector)?.parentElement
if ($buttonGroup) buttonGroup = $buttonGroup
}
removeButtons() // prevent duplicated buttons
if (!buttonGroup) {
const buttonGroupSelector = '.repository-content .Box-header .BtnGroup'
const buttonGroups = document.querySelectorAll(buttonGroupSelector)
const $buttonGroup = buttonGroups[buttonGroups.length - 1]
if ($buttonGroup) buttonGroup = $buttonGroup as HTMLElement
}
buttonGroups.forEach(async buttonGroup => {
if (!buttonGroup.lastElementChild) return
const button = await renderReact(React.createElement(CopyFileButton))
if (button instanceof HTMLElement) {
buttonGroup.appendChild(button)
run(async () => {
if (!buttonGroup) raiseError(new Error(`No button groups found`))
else if (!buttonGroup.lastElementChild) return
else {
removeButtons() // prevent duplicated buttons
const button = await renderReact(React.createElement(CopyFileButton))
if (button instanceof HTMLElement) buttonGroup.appendChild(button)
}
})
}

View file

@ -37,6 +37,7 @@ declare namespace GitHubAPI {
type PullComment = {
path: string
position: number | null
pull_request_review_id: number
id: number
node_id: string

View file

@ -11,7 +11,7 @@ const tableSelector = `.blob-wrapper table`
const selectorOfLineNumber = `.blob-num`
const selectorOfLineContent = `.blob-code`
const theCSSClassForToggleElementOnActive = 'active'
const theCSSClassForToggleElementOnActive = 'gitako-code-fold-active'
function init() {
type LineNumber = number // alias
const blocks: LineNumber[] = [] // startLine -> exclusiveEndLine
@ -87,6 +87,7 @@ function init() {
if (!end) return
const toggleElement = document.createElement('div')
toggleElement.setAttribute('title', 'Code Folding by Gitako')
toggleElement.setAttribute('role', 'button')
toggleElement.classList.add(theCSSClassForToggleElement)

View file

@ -1,6 +1,7 @@
import { useConfigs } from 'containers/ConfigsContext'
import { GITHUB_OAUTH } from 'env'
import { Base64 } from 'js-base64'
import { run } from 'utils/general'
import { resolveGitModules } from 'utils/gitSubmodule'
import { sortFoldersToFront } from 'utils/treeParser'
import * as API from './API'
@ -105,6 +106,11 @@ function resolvePageScope(defaultBranchName?: string) {
const pathSHAMap = new Map<string, string>()
// Try lookup PJAX containers, #js-repo-pjax-container could exist while #repo-content-pjax-container does not.
const pjaxContainerSelector = ['#repo-content-pjax-container', '#js-repo-pjax-container'].find(
selector => document.querySelector(selector),
)
export const GitHub: Platform = {
isEnterprise,
resolvePartialMetaData() {
@ -142,113 +148,24 @@ export const GitHub: Platform = {
async getDefaultBranchName({ userName, repoName }, accessToken) {
return (await API.getRepoMeta(userName, repoName, accessToken)).default_branch
},
resolveUrlFromMetaData({ userName, repoName }) {
resolveUrlFromMetaData({ userName, repoName, branchName }) {
const repoUrl = `https://${window.location.host}/${userName}/${repoName}`
const userUrl = `https://${window.location.host}/${userName}`
const pullId = URLHelper.isInPullPage()
const branchUrl = pullId ? `${repoUrl}/pull/${pullId}` : `${repoUrl}/tree/${branchName}`
return {
repoUrl: `https://${window.location.host}/${userName}/${repoName}`,
userUrl: `https://${window.location.host}/${userName}`,
repoUrl,
userUrl,
branchUrl,
}
},
async getTreeData(metaData, path = '/', recursive, accessToken) {
const { userName, repoName, branchName } = metaData
const pullId = URLHelper.isInPullPage()
if (pullId) {
// https://developer.github.com/v3/pulls/#list-pull-requests-files
const GITHUB_API_RESPONSE_LENGTH_LIMIT = 3000
const GITHUB_API_PAGED_RESPONSE_LENGTH_LIMIT = 30
const MAX_PAGE = Math.ceil(
GITHUB_API_RESPONSE_LENGTH_LIMIT / GITHUB_API_PAGED_RESPONSE_LENGTH_LIMIT,
)
let page = 1
const [pullData, treeData, commentData] = await Promise.all([
API.getPullData(userName, repoName, pullId, accessToken),
API.getPullTreeData(userName, repoName, pullId, page, accessToken),
API.getPullComments(userName, repoName, pullId, accessToken),
])
const count = pullData.changed_files
if (treeData.length < count) {
const restPages = []
while (page * GITHUB_API_PAGED_RESPONSE_LENGTH_LIMIT < count) {
restPages.push(++page)
}
if (page > MAX_PAGE) {
// TODO: hint
}
const moreFiles = await Promise.all(
restPages.map(page => API.getPullTreeData(userName, repoName, pullId, page, accessToken)),
)
treeData.push(...([] as GitHubAPI.PullTreeData).concat(...moreFiles))
}
const creator = await createPullFileResolver(userName, repoName, pullId)
const nodes: TreeNode[] = treeData.map(item => ({
path: item.filename || '',
type: 'blob',
name: item.filename?.replace(/^.*\//, '') || '',
url: `https://${window.location.host}/${userName}/${repoName}/pull/${pullId}/files${
window.location.search
}#${creator(item.filename) || ''}`,
sha: item.sha,
comments: commentData?.filter(comment => item.filename === comment.path).length,
}))
const root = processTree(nodes)
return { root }
return await getPullRequestTreeData(metaData, pullId, accessToken)
}
const sha = path === '/' ? branchName : pathSHAMap.get(path)
if (!sha) throw new Error(`No sha for path "${path}"`)
const treeData = await API.getTreeData(userName, repoName, sha, recursive, accessToken)
// remove deep items
if (treeData.truncated) {
if (treeData.tree.some(item => item.path.includes('/')))
treeData.tree = treeData.tree.filter(item => !item.path.includes('/'))
}
// update map
if (path !== '/' || treeData.truncated) {
if (path !== '/') {
function sanitizePath(path: string) {
return path.replace(/\/\/+/g, '/').replace(/^\/|\/$/g, '') || '/'
}
treeData.tree.forEach(item => {
item.path = sanitizePath(`${path}/${item.path}`)
})
}
treeData.tree.forEach(item => {
pathSHAMap.set(item.path, item.sha)
})
}
const root = processTree(
treeData.tree.map(item => ({
path: item.path || '',
type: item.type || 'blob',
name: item.path?.replace(/^.*\//, '') || '',
url:
item.url && item.type && item.path
? getUrlForRedirect(userName, repoName, branchName, item.type, item.path)
: undefined,
contents: item.type === 'tree' ? [] : undefined,
sha: item.sha,
})),
)
const gitModules = root.contents?.find(
item => item.type === 'blob' && item.name === '.gitmodules',
)
if (gitModules?.sha) {
const blobData = await API.getBlobData(userName, repoName, gitModules.sha, accessToken)
if (blobData && blobData.encoding === 'base64' && blobData.content) {
await resolveGitModules(root, Base64.decode(blobData.content))
}
}
return { root, defer: treeData.truncated }
return await getRepositoryTreeData(metaData, path, recursive, accessToken)
},
shouldShow() {
return Boolean(DOMHelper.isInCodePage() || URLHelper.isInPullPage())
@ -257,8 +174,14 @@ export const GitHub: Platform = {
return Boolean(URLHelper.isInPullPage())
},
getCurrentPath(branchName) {
if (URLHelper.parse().path.length) {
return DOMHelper.getPath()
const pathFromURL = URLHelper.parse().path.join('/')
if (pathFromURL.length) {
if (branchName && pathFromURL.startsWith(branchName + '/')) {
return pathFromURL.replace(branchName + '/', '').split('/')
} else {
// This would fail before PJAX replace, but works well when no branchName, e.g. first load
return DOMHelper.getPath()
}
} else {
return []
}
@ -280,13 +203,161 @@ export const GitHub: Platform = {
useGitHubAttachCopySnippetButton(copySnippetButton)
useGitHubCodeFold(codeFolding)
},
delegatePJAXProps(options) {
if (!options?.node || options.node.type === 'blob')
return {
'data-pjax': pjaxContainerSelector,
onClick() {
/* Overwriting default onClick */
},
}
},
loadWithPJAX(url, element) {
element.click()
},
}
async function createPullFileResolver(userName: string, repoName: string, pullId: string) {
const doc = await API.getPullPageDocument(userName, repoName, pullId)
function sanitizePath(path: string) {
return path.replace(/\/\/+/g, '/').replace(/^\/|\/$/g, '') || '/'
}
return (path: string) => {
const id = doc.querySelector(`*[data-path^="${path}"]`)?.parentElement?.id
return id
async function getRepositoryTreeData(
{ userName, repoName, branchName }: Pick<MetaData, 'userName' | 'repoName' | 'branchName'>,
path: string,
recursive: boolean | undefined,
accessToken: string | undefined,
) {
const sha = path === '/' ? branchName : pathSHAMap.get(path)
if (!sha) throw new Error(`No sha for path "${path}"`)
const treeData = await API.getTreeData(userName, repoName, sha, recursive, accessToken)
// remove deep items
if (treeData.truncated) {
if (treeData.tree.some(item => item.path.includes('/')))
treeData.tree = treeData.tree.filter(item => !item.path.includes('/'))
}
// update map
if (path !== '/' || treeData.truncated) {
if (path !== '/') {
treeData.tree.forEach(item => {
item.path = sanitizePath(`${path}/${item.path}`)
})
}
treeData.tree.forEach(item => {
pathSHAMap.set(item.path, item.sha)
})
}
const root = processTree(
treeData.tree.map(item => ({
path: item.path || '',
type: item.type || 'blob',
name: item.path?.replace(/^.*\//, '') || '',
url:
item.url && item.type && item.path
? getUrlForRedirect(userName, repoName, branchName, item.type, item.path)
: undefined,
contents: item.type === 'tree' ? [] : undefined,
sha: item.sha,
})),
)
const gitModules = root.contents?.find(
item => item.type === 'blob' && item.name === '.gitmodules',
)
if (gitModules?.sha) {
const blobData = await API.getBlobData(userName, repoName, gitModules.sha, accessToken)
if (blobData && blobData.encoding === 'base64' && blobData.content) {
await resolveGitModules(root, Base64.decode(blobData.content))
}
}
return { root, defer: treeData.truncated }
}
async function getPullRequestTreeData(
{ userName, repoName }: Pick<MetaData, 'userName' | 'repoName' | 'branchName'>,
pullId: string,
accessToken?: string,
) {
// https://developer.github.com/v3/pulls/#list-pull-requests-files
const GITHUB_API_RESPONSE_LENGTH_LIMIT = 3000
const GITHUB_API_PAGED_RESPONSE_LENGTH_LIMIT = 30
const MAX_PAGE = Math.ceil(
GITHUB_API_RESPONSE_LENGTH_LIMIT / GITHUB_API_PAGED_RESPONSE_LENGTH_LIMIT,
)
let page = 1
const [pullData, treeData, commentData] = await Promise.all([
API.getPullData(userName, repoName, pullId, accessToken),
API.getPullTreeData(userName, repoName, pullId, page, accessToken),
API.getPullComments(userName, repoName, pullId, accessToken),
])
const count = pullData.changed_files
if (treeData.length < count) {
const restPages = []
while (page * GITHUB_API_PAGED_RESPONSE_LENGTH_LIMIT < count) {
restPages.push(++page)
}
if (page > MAX_PAGE) {
// TODO: hint
}
const moreFiles = await Promise.all(
restPages.map(page => API.getPullTreeData(userName, repoName, pullId, page, accessToken)),
)
treeData.push(...([] as GitHubAPI.PullTreeData).concat(...moreFiles))
}
const docs = await API.getPullPageDocuments(userName, repoName, pullId)
// query all elements at once to make getFileElementHash run faster
const elementsHavePath = docs.map(doc => doc.querySelectorAll(`[data-path]`))
const getFileElementHash = (path: string) => {
let e
for (const group of elementsHavePath) {
for (let i = 0; i < group.length; i++) {
const element = group[i]
if (element.getAttribute('data-path')?.startsWith(path)) {
e = element
break
}
}
if (e) break
}
return e?.parentElement?.id
}
const urlMainPart = `https://${window.location.host}/${userName}/${repoName}/pull/${pullId}/files${window.location.search}`
const nodes: TreeNode[] = treeData.map(
({ filename, sha, additions, deletions, changes, status }) => ({
path: filename || '',
type: 'blob',
name: filename?.replace(/^.*\//, '') || '',
url: `${urlMainPart}${formatHash(getFileElementHash(filename))}`,
sha: sha,
comments: run(() => {
const comments = commentData?.filter(comment => filename === comment.path)
if (comments?.length)
return {
active: comments.filter(comment => comment.position !== null).length,
resolved: comments.filter(comment => comment.position === null).length,
}
}),
diff: {
status,
additions,
deletions,
changes,
},
}),
)
const root = processTree(nodes)
return { root }
}
function formatHash(hash?: string) {
if (hash) return '#' + hash
return ''
}

View file

@ -1,4 +1,5 @@
import { resolveGitModules } from 'utils/gitSubmodule'
import { useProgressBar } from 'utils/hooks/useProgressBar'
import { sortFoldersToFront } from 'utils/treeParser'
import * as API from './API'
import * as DOMHelper from './DOMHelper'
@ -105,10 +106,14 @@ export const Gitea: Platform = {
const data = await API.getRepoMeta(userName, repoName, accessToken)
return data.default_branch
},
resolveUrlFromMetaData({ userName, repoName }) {
resolveUrlFromMetaData({ userName, repoName, branchName }) {
const repoUrl = `${window.location.protocol}//${window.location.host}/${userName}/${repoName}`
const userUrl = `${window.location.protocol}//${window.location.host}/${userName}`
const branchUrl = `${repoUrl}/src/branch/${branchName}`
return {
repoUrl: `${window.location.protocol}//${window.location.host}/${userName}/${repoName}`,
userUrl: `${window.location.protocol}//${window.location.host}/${userName}`,
repoUrl,
userUrl,
branchUrl,
}
},
async getTreeData(metaData, path, recursive, accessToken) {
@ -165,4 +170,7 @@ export const Gitea: Platform = {
getOAuthLink() {
return `${window.location.protocol}//${window.location.host}/api/v1/user/applications/oauth2`
},
usePlatformHooks() {
useProgressBar()
},
}

View file

@ -3,6 +3,7 @@ import { platform } from 'platforms'
import * as React from 'react'
import { resolveGitModules } from 'utils/gitSubmodule'
import { useOnPJAXDone } from 'utils/hooks/usePJAX'
import { useProgressBar } from 'utils/hooks/useProgressBar'
import { sortFoldersToFront } from 'utils/treeParser'
import * as API from './API'
import * as DOMHelper from './DOMHelper'
@ -82,7 +83,7 @@ export const Gitee: Platform = {
if (DOMHelper.isInCodePage()) {
// not working well with non-branch blob
// cannot handle '/' split branch name, should not use when possibly on branch page
branchName = DOMHelper.getCurrentBranch() || URLHelper.parseSHA()
branchName = (DOMHelper.getCurrentBranch() || URLHelper.parseSHA())?.trim()
}
const { userName, repoName, type } = URLHelper.parse()
@ -102,10 +103,14 @@ export const Gitee: Platform = {
const data = await API.getRepoMeta(userName, repoName, accessToken)
return data.default_branch
},
resolveUrlFromMetaData({ userName, repoName }) {
resolveUrlFromMetaData({ userName, repoName, branchName }) {
const repoUrl = `https://${window.location.host}/${userName}/${repoName}`
const userUrl = `https://${window.location.host}/${userName}`
const branchUrl = `${repoUrl}/tree/${branchName}`
return {
repoUrl: `https://${window.location.host}/${userName}/${repoName}`,
userUrl: `https://${window.location.host}/${userName}`,
repoUrl,
userUrl,
branchUrl,
}
},
async getTreeData(metaData, path, recursive, accessToken) {
@ -170,6 +175,9 @@ export const Gitee: Platform = {
setOAuth(code) {
return API.OAuth(code)
},
usePlatformHooks() {
useProgressBar()
},
}
export function useGiteeAttachCopySnippetButton(copySnippetButton: boolean) {

View file

@ -7,9 +7,10 @@ type Platform = {
metaData: Pick<MetaData, 'userName' | 'repoName'>,
accessToken?: string,
): Promise<string>
resolveUrlFromMetaData(metaData: Pick<MetaData, 'userName' | 'repoName'>): {
resolveUrlFromMetaData(metaData: MetaData): {
userUrl: string
repoUrl: string
branchUrl: string
}
getTreeData(
metaData: Pick<MetaData, 'userName' | 'repoName' | 'branchName'>,
@ -22,5 +23,9 @@ type Platform = {
getCurrentPath(branchName: string): string[] | null
setOAuth(code: string): Promise<string | null>
getOAuthLink(): string
delegatePJAXProps?(options?: {
node?: TreeNode
}): void | (React.DOMAttributes<HTMLElement> & Record<string, any>) // support data-* attributes
loadWithPJAX?(url: string, element: HTMLElement): void
usePlatformHooks?(): void
}

View file

@ -1,566 +0,0 @@
$variables: (
'auto-black': '#f0f6fc',
'auto-white': '#010409',
'auto-gray-0': '#0d1117',
'auto-gray-1': '#161b22',
'auto-gray-2': '#21262d',
'auto-gray-3': '#30363d',
'auto-gray-4': '#484f58',
'auto-gray-5': '#6e7681',
'auto-gray-6': '#8b949e',
'auto-gray-7': '#b1bac4',
'auto-gray-8': '#c9d1d9',
'auto-gray-9': '#f0f6fc',
'auto-blue-0': '#051d4d',
'auto-blue-1': '#0c2d6b',
'auto-blue-2': '#0d419d',
'auto-blue-3': '#1158c7',
'auto-blue-4': '#1f6feb',
'auto-blue-5': '#388bfd',
'auto-blue-6': '#58a6ff',
'auto-blue-7': '#79c0ff',
'auto-blue-8': '#a5d6ff',
'auto-blue-9': '#cae8ff',
'auto-green-0': '#04260f',
'auto-green-1': '#033a16',
'auto-green-2': '#0f5323',
'auto-green-3': '#196c2e',
'auto-green-4': '#238636',
'auto-green-5': '#2ea043',
'auto-green-6': '#3fb950',
'auto-green-7': '#56d364',
'auto-green-8': '#7ee787',
'auto-green-9': '#aff5b4',
'auto-yellow-0': '#341a00',
'auto-yellow-1': '#4b2900',
'auto-yellow-2': '#693e00',
'auto-yellow-3': '#845306',
'auto-yellow-4': '#9e6a03',
'auto-yellow-5': '#bb8009',
'auto-yellow-6': '#d29922',
'auto-yellow-7': '#e3b341',
'auto-yellow-8': '#f2cc60',
'auto-yellow-9': '#f8e3a1',
'auto-orange-0': '#3d1300',
'auto-orange-1': '#5a1e02',
'auto-orange-2': '#762d0a',
'auto-orange-3': '#9b4215',
'auto-orange-4': '#bd561d',
'auto-orange-5': '#db6d28',
'auto-orange-6': '#f0883e',
'auto-orange-7': '#ffa657',
'auto-orange-8': '#ffc680',
'auto-orange-9': '#ffdfb6',
'auto-red-0': '#490202',
'auto-red-1': '#67060c',
'auto-red-2': '#8e1519',
'auto-red-3': '#b62324',
'auto-red-4': '#da3633',
'auto-red-5': '#f85149',
'auto-red-6': '#ff7b72',
'auto-red-7': '#ffa198',
'auto-red-8': '#ffc1ba',
'auto-red-9': '#ffdcd7',
'auto-purple-0': '#271052',
'auto-purple-1': '#3c1e70',
'auto-purple-2': '#553098',
'auto-purple-3': '#6e40c9',
'auto-purple-4': '#8957e5',
'auto-purple-5': '#a371f7',
'auto-purple-6': '#bc8cff',
'auto-purple-7': '#d2a8ff',
'auto-purple-8': '#e2c5ff',
'auto-purple-9': '#eddeff',
'auto-pink-0': '#42062a',
'auto-pink-1': '#5e103e',
'auto-pink-2': '#7d2457',
'auto-pink-3': '#9e3670',
'auto-pink-4': '#bf4b8a',
'auto-pink-5': '#db61a2',
'auto-pink-6': '#f778ba',
'auto-pink-7': '#ff9bce',
'auto-pink-8': '#ffbedd',
'auto-pink-9': '#ffdaec',
'text-primary': '#c9d1d9',
'text-secondary': '#8b949e',
'text-tertiary': '#8b949e',
'text-placeholder': '#484f58',
'text-disabled': '#484f58',
'text-inverse': '#0d1117',
'text-link': '#58a6ff',
'text-danger': '#f85149',
'text-success': '#56d364',
'text-warning': '#e3b341',
'text-white': '#f0f6fc',
'icon-primary': '#c9d1d9',
'icon-secondary': '#6e7681',
'icon-tertiary': '#484f58',
'icon-info': '#79c0ff',
'icon-danger': '#f85149',
'icon-success': '#56d364',
'icon-warning': '#e3b341',
'border-primary': '#30363d',
'border-secondary': '#21262d',
'border-tertiary': '#6e7681',
'border-overlay': '#30363d',
'border-inverse': '#f0f6fc',
'border-info': '#388bfd66',
'border-danger': '#f8514966',
'border-success': '#3fb95066',
'border-warning': '#bb800966',
'bg-canvas': '#0d1117',
'bg-canvas-mobile': '#010409',
'bg-canvas-inverse': '#f0f6fc',
'bg-canvas-inset': '#06090f',
'bg-primary': '#0d1117',
'bg-secondary': '#0d1117',
'bg-tertiary': '#161b22',
'bg-overlay': '#21262d',
'bg-backdrop': '#010409cc',
'bg-info': '#388bfd1a',
'bg-info-inverse': '#388bfd',
'bg-danger': '#f851491a',
'bg-danger-inverse': '#da3633',
'bg-success': '#2ea0431a',
'bg-success-inverse': '#2ea043',
'bg-warning': '#bb80091a',
'bg-warning-inverse': '#bb8009',
'shadow-small': '0 0 #0000',
'shadow-medium': '0 3px 6px #010409',
'shadow-large': '0 8px 24px #010409',
'shadow-extra-large': '0 12px 48px #010409',
'shadow-highlight': '0 0 #0000',
'shadow-inset': '0 0 #0000',
'state-hover-primary-bg': '#1f6feb',
'state-hover-primary-border': '#388bfd',
'state-hover-primary-text': '#f0f6fc',
'state-hover-primary-icon': '#f0f6fc',
'state-hover-secondary-bg': '#161b22',
'state-hover-secondary-border': '#161b22',
'state-selected-primary-bg': '#1f6feb',
'state-selected-primary-border': '#388bfd',
'state-selected-primary-text': '#f0f6fc',
'state-selected-primary-icon': '#f0f6fc',
'state-focus-border': '#388bfd',
'state-focus-shadow': '0 0 0 3px #0c2d6b',
'fade-fg-10': '#f0f6fc1a',
'fade-fg-15': '#f0f6fc26',
'fade-fg-30': '#f0f6fc4d',
'fade-fg-50': '#f0f6fc80',
'fade-fg-70': '#f0f6fcb3',
'fade-fg-85': '#f0f6fcd9',
'fade-black-10': '#0104091a',
'fade-black-15': '#01040926',
'fade-black-30': '#0104094d',
'fade-black-50': '#01040980',
'fade-black-70': '#010409b3',
'fade-black-85': '#010409d9',
'fade-white-10': '#f0f6fc1a',
'fade-white-15': '#f0f6fc26',
'fade-white-30': '#f0f6fc4d',
'fade-white-50': '#f0f6fc80',
'fade-white-70': '#f0f6fcb3',
'fade-white-85': '#f0f6fcd9',
'alert-info-text': '#79c0ff',
'alert-info-icon': '#79c0ff',
'alert-info-bg': '#388bfd1a',
'alert-info-border': '#388bfd66',
'alert-warn-text': '#e3b341',
'alert-warn-icon': '#e3b341',
'alert-warn-bg': '#bb80091a',
'alert-warn-border': '#bb800966',
'alert-error-text': '#ff7b72',
'alert-error-icon': '#ff7b72',
'alert-error-bg': '#f851491a',
'alert-error-border': '#f8514966',
'alert-success-text': '#56d364',
'alert-success-icon': '#56d364',
'alert-success-bg': '#2ea0431a',
'alert-success-border': '#2ea04366',
'autocomplete-shadow': '0 16px 32px #010409d9',
'autocomplete-row-border': '#30363d',
'blankslate-icon': '#535c66',
'btn-text': '#c9d1d9',
'btn-bg': '#21262d',
'btn-border': '#30363d',
'btn-shadow': '0 0 #0000',
'btn-inset-shadow': '0 0 #0000',
'btn-hover-bg': '#30363d',
'btn-hover-border': '#8b949e',
'btn-selected-bg': '#161b22',
'btn-focus-bg': '#21262d',
'btn-focus-border': '#8b949e',
'btn-focus-shadow': '0 0 0 3px #8b949e4d',
'btn-shadow-active': 'inset 0 0.15em 0.3em #01040926',
'btn-shadow-input-focus': '0 0 0 0.2em #1f6feb4d',
'btn-primary-text': '#fff',
'btn-primary-bg': '#238636',
'btn-primary-border': '#2ea043',
'btn-primary-shadow': '0 0 #0000',
'btn-primary-inset-shadow': '0 0 #0000',
'btn-primary-hover-bg': '#2ea043',
'btn-primary-hover-border': '#3fb950',
'btn-primary-selected-bg': '#238636',
'btn-primary-selected-shadow': '0 0 #0000',
'btn-primary-disabled-text': '#f0f6fc80',
'btn-primary-disabled-bg': '#23863699',
'btn-primary-disabled-border': '#0000',
'btn-primary-focus-bg': '#238636',
'btn-primary-focus-border': '#3fb950',
'btn-primary-focus-shadow': '0 0 0 3px #2ea44f66',
'btn-primary-icon': '#f0f6fc',
'btn-primary-counter-bg': '#f0f6fc33',
'btn-outline-text': '#58a6ff',
'btn-outline-hover-text': '#58a6ff',
'btn-outline-hover-bg': '#30363d',
'btn-outline-hover-border': '#58a6ff',
'btn-outline-hover-shadow': '0 1px 0 #0104091a',
'btn-outline-hover-inset-shadow': 'inset 0 1px 0 #f0f6fc08',
'btn-outline-hover-counter-bg': '#f0f6fc33',
'btn-outline-selected-text': '#f0f6fc',
'btn-outline-selected-bg': '#0d419d',
'btn-outline-selected-border': '#f0f6fc1a',
'btn-outline-selected-shadow': '0 0 #0000',
'btn-outline-disabled-text': '#58a6ff80',
'btn-outline-disabled-bg': '#0d1117',
'btn-outline-disabled-counter-bg': '#1f6feb0d',
'btn-outline-focus-border': '#58a6ff',
'btn-outline-focus-shadow': '0 0 0 3px #1158c766',
'btn-outline-counter-bg': '#1f6feb1a',
'btn-danger-text': '#f85149',
'btn-danger-hover-text': '#fff',
'btn-danger-hover-bg': '#da3633',
'btn-danger-hover-border': '#f85149',
'btn-danger-hover-shadow': '0 0 #0000',
'btn-danger-hover-inset-shadow': '0 0 #0000',
'btn-danger-hover-counter-bg': '#fff3',
'btn-danger-selected-text': '#fff',
'btn-danger-selected-bg': '#b62324',
'btn-danger-selected-border': '#f0f6fc1a',
'btn-danger-selected-shadow': '0 0 #0000',
'btn-danger-disabled-text': '#f85149',
'btn-danger-disabled-bg': '#0d1117',
'btn-danger-disabled-counter-bg': '#da36330d',
'btn-danger-focus-border': '#f85149',
'btn-danger-focus-shadow': '0 0 0 3px #b6232466',
'btn-danger-counter-bg': '#da36331a',
'btn-counter-bg': '#30363d',
'counter-text': '#c9d1d9',
'counter-bg': '#30363d',
'counter-primary-text': '#c9d1d9',
'counter-primary-bg': '#6e7681',
'counter-secondary-text': '#8b949e',
'dropdown-shadow': '0 16px 32px #010409d9',
'label-border': '#30363d',
'label-primary-text': '#b1bac4',
'label-primary-border': '#6e7681',
'label-secondary-text': '#8b949e',
'label-secondary-border': '#30363d',
'label-info-text': '#388bfd',
'label-info-border': '#388bfd66',
'label-success-text': '#3fb950',
'label-success-border': '#2ea04366',
'label-warning-text': '#e3b341',
'label-warning-border': '#f2d35b66',
'label-danger-text': '#f85149',
'label-danger-border': '#f8514966',
'label-orange-text': '#db6d28',
'label-orange-border': '#db6d2866',
'input-bg': '#0d1117',
'input-contrast-bg': '#0104094d',
'input-border': '#21262d',
'input-shadow': '0 0 #0000',
'input-disabled-bg': '#161b22',
'input-disabled-border': '#30363d',
'input-warning-border': '#d29922',
'input-error-border': '#f85149',
'input-tooltip-success-text': '#56d364',
'input-tooltip-success-bg': '#101f1b',
'input-tooltip-success-border': '#1c532b',
'input-tooltip-warning-text': '#e3b341',
'input-tooltip-warning-bg': '#1e1c16',
'input-tooltip-warning-border': '#5d4411',
'input-tooltip-error-text': '#ff7b72',
'input-tooltip-error-bg': '#25171c',
'input-tooltip-error-border': '#792e2e',
'avatar-bg': '#f0f6fc',
'avatar-border': '#f0f6fc1a',
'avatar-stack-fade': '#30363d',
'avatar-stack-fade-more': '#21262d',
'avatar-child-shadow': '-2px -2px 0 #0d1117',
'toast-text': '#79c0ff',
'toast-bg': '#010409',
'toast-border': '#214981',
'toast-shadow': '0 8px 24px #010409',
'toast-icon': '#79c0ff',
'toast-icon-bg': '#121d2e',
'toast-icon-border': '#214981',
'toast-success-text': '#56d364',
'toast-success-border': '#1c532c',
'toast-success-icon': '#56d364',
'toast-success-icon-bg': '#111f1c',
'toast-success-icon-border': '#1c532c',
'toast-warning-text': '#e3b341',
'toast-warning-border': '#5e4411',
'toast-warning-icon': '#e3b341',
'toast-warning-icon-bg': '#1f1c16',
'toast-warning-icon-border': '#5e4411',
'toast-danger-text': '#ff7b72',
'toast-danger-border': '#792e2e',
'toast-danger-icon': '#ff7b72',
'toast-danger-icon-bg': '#25171c',
'toast-danger-icon-border': '#792e2e',
'toast-loading-text': '#c9d1d9',
'toast-loading-border': '#30363d',
'toast-loading-icon': '#f0f6fc',
'toast-loading-icon-bg': '#30363d',
'toast-loading-icon-border': '#30363d',
'timeline-text': '#b1bac4',
'timeline-badge-bg': '#0d1117',
'timeline-target-badge-border': '#1f6feb',
'timeline-target-badge-shadow': '#0d419d',
'select-menu-border-secondary': '#30363d',
'select-menu-shadow': '0 0 18px #01040966',
'select-menu-backdrop-bg': '#01040980',
'select-menu-backdrop-border': '#484f58',
'select-menu-tap-highlight': '#30363d80',
'select-menu-tap-focus-bg': '#0c2d6b',
'box-blue-border': '#0d419d',
'box-row-yellow-bg': '#ebc4401a',
'box-row-blue-bg': '#79c0ff1a',
'box-header-blue-bg': '#0d1117',
'box-header-blue-border': '#30363d',
'box-border-info': '#388bfd66',
'box-bg-info': '#388bfd1a',
'box-border-warning': '#bb800966',
'box-bg-warning': '#bb80091a',
'branch-name-text': '#c9d1d9',
'branch-name-icon': '#b1bac4',
'branch-name-bg': '#58a6ff1a',
'branch-name-link-text': '#58a6ff',
'branch-name-link-icon': '#58a6ff',
'branch-name-link-bg': '#58a6ff1a',
'markdown-code-bg': '#f0f6fc26',
'markdown-frame-border': '#3b434b',
'markdown-blockquote-border': '#3b434b',
'markdown-table-border': '#3b434b',
'markdown-table-tr-border': '#272c32',
'menu-heading-text': '#8b949e',
'menu-border-active': '#f78166',
'menu-bg-active': '#161b22',
'sidenav-selected-bg': '#21262d',
'sidenav-border-active': '#f78166',
'header-text': '#f0f6fcb3',
'header-bg': '#161b22',
'header-logo': '#f0f6fc',
'filter-item-bar-bg': '#12161c',
'hidden-text-expander-bg': '#21262d',
'hidden-text-expander-bg-hover': '#30363d',
'drag-and-drop-border': '#25292f',
'upload-enabled-border': '#3b434b',
'upload-enabled-border-focused': '#4487ee',
'previewable-comment-form-border': '#25292f',
'underlinenav-border': '#30363d00',
'underlinenav-border-hover': '#30363d',
'underlinenav-border-active': '#f78166',
'underlinenav-text': '#8b949e',
'underlinenav-text-hover': '#c9d1d9',
'underlinenav-text-active': '#c9d1d9',
'underlinenav-icon': '#6e7681',
'underlinenav-icon-hover': '#c9d1d9',
'underlinenav-icon-active': '#c9d1d9',
'underlinenav-counter-text': '#8b949e',
'verified-badge-text': '#3fb950',
'verified-badge-bg': '#3fb9501a',
'verified-badge-border': '#3fb95066',
'social-count-bg': '#21262d',
'tooltip-text': '#f0f6fc',
'tooltip-bg': '#21262d',
'header-search-bg': '#0d1117',
'header-search-border': '#21262d',
'search-keyword-hl': '#bb800966',
'diffstat-neutral-bg': '#30363d',
'diffstat-neutral-border': '#f0f6fc1a',
'diffstat-deletion-bg': '#da3633',
'diffstat-deletion-border': '#f85149',
'diffstat-addition-bg': '#238636',
'diffstat-addition-border': '#2ea043',
'files-explorer-icon': '#6e7681',
'hl-author-bg': '#051d4d',
'hl-author-border': '#0d419d',
'logo-subdued': '#30363d',
'discussion-border': '#34513b',
'discussion-bg-success': '#2ea0431a',
'actions-workflow-table-sticky-bg': '#0d1117f2',
'repo-language-color-border': '#f0f6fc33',
'code-selection-bg': '#79c0ff4d',
'blob-line-highlight-bg': '#bb80091a',
'blob-line-highlight-border': '#bb8009',
'diff-addition-text': '#56d364',
'diff-addition-bg': '#23863626',
'diff-addition-border': '#196c2e',
'diff-deletion-text': '#f85149',
'diff-deletion-bg': '#da363326',
'diff-deletion-border': '#b62324',
'diff-change-text': '#e3b341',
'diff-change-bg': '#341a00',
'diff-change-border': '#9e6a03',
'diff-blob-num-text': '#f0f6fc4d',
'diff-blob-num-hover-text': '#f0f6fc99',
'diff-blob-addition-num-text': '#3fb950',
'diff-blob-addition-num-hover-text': '#7ee787',
'diff-blob-addition-num-bg': '#2386360d',
'diff-blob-addition-line-bg': '#23863626',
'diff-blob-addition-word-bg': '#2386364d',
'diff-blob-deletion-num-text': '#f85149',
'diff-blob-deletion-num-hover-text': '#ffa198',
'diff-blob-deletion-num-bg': '#da36330d',
'diff-blob-deletion-line-bg': '#da363326',
'diff-blob-deletion-word-bg': '#da36334d',
'diff-blob-hunk-text': '#8b949e',
'diff-blob-hunk-num-bg': '#58a6ff26',
'diff-blob-hunk-line-bg': '#58a6ff1a',
'diff-blob-empty-block-bg': '#161b22',
'diff-blob-selected-line-highlight-bg': '#bb80091a',
'diff-blob-selected-line-highlight-border': '#bb8009',
'diff-blob-selected-line-highlight-mix-blend-mode': 'normal',
'diff-blob-expander-icon': '#8b949e',
'diff-blob-expander-hover-icon': '#f0f6fc',
'diff-blob-expander-hover-bg': '#1f6feb',
'diff-blob-comment-button-icon': '#f0f6fc',
'diff-blob-comment-button-bg': '#1f6feb',
'diff-blob-comment-button-gradient-bg': '#367eed',
'global-nav-logo': '#f0f6fc',
'global-nav-bg': '#161b22',
'global-nav-text': '#c9d1d9',
'global-nav-icon': '#c9d1d9',
'global-nav-input-bg': '#0d1117',
'global-nav-input-border': '#21262d',
'global-nav-input-icon': '#21262d',
'global-nav-input-placeholder': '#484f58',
'calendar-graph-day-bg': '#161b22',
'calendar-graph-day-border': '#1b1f230f',
'calendar-graph-day-l1-bg': '#01311f',
'calendar-graph-day-l2-bg': '#034525',
'calendar-graph-day-l3-bg': '#0f6d31',
'calendar-graph-day-l4-bg': '#00c647',
'calendar-graph-day-l4-border': '#1b1f230f',
'calendar-graph-day-l3-border': '#1b1f230f',
'calendar-graph-day-l2-border': '#1b1f230f',
'calendar-graph-day-l1-border': '#1b1f230f',
'footer-invertocat-octicon': '#30363d',
'footer-invertocat-octicon-hover': '#6e7681',
'pr-state-draft-text': '#8b949e',
'pr-state-draft-bg': '#8b949e1a',
'pr-state-draft-border': '#8b949e66',
'pr-state-open-text': '#3fb950',
'pr-state-open-bg': '#3fb9501a',
'pr-state-open-border': '#3fb95066',
'pr-state-merged-text': '#a371f7',
'pr-state-merged-bg': '#bc8cff1a',
'pr-state-merged-border': '#bc8cff66',
'pr-state-closed-text': '#f85149',
'pr-state-closed-bg': '#da36331a',
'pr-state-closed-border': '#da363366',
'topic-tag-text': '#58a6ff',
'topic-tag-bg': '#388bfd1a',
'topic-tag-hover-bg': '#388bfd33',
'topic-tag-active-bg': '#388bfd26',
'merge-box-success-icon-bg': '#2ea0431a',
'merge-box-success-icon-text': '#3fb950',
'merge-box-success-icon-border': '#2ea04366',
'merge-box-success-indicator-bg': '#238636',
'merge-box-success-indicator-border': '#2ea043',
'merge-box-merged-icon-bg': '#bc8cff1a',
'merge-box-merged-icon-text': '#a371f7',
'merge-box-merged-icon-border': '#bc8cff66',
'merge-box-merged-box-border': '#bc8cff66',
'merge-box-neutral-icon-bg': '#c9d1d91a',
'merge-box-neutral-icon-text': '#8b949e',
'merge-box-neutral-icon-border': '#c9d1d966',
'merge-box-neutral-indicator-bg': '#484f58',
'merge-box-neutral-indicator-border': '#6e7681',
'merge-box-warning-icon-bg': '#bb80091a',
'merge-box-warning-icon-text': '#e3b341',
'merge-box-warning-icon-border': '#bb800966',
'merge-box-warning-box-border': '#bb800966',
'merge-box-warning-merge-highlight': '#bb80091a',
'merge-box-error-icon-bg': '#f851491a',
'merge-box-error-icon-text': '#f85149',
'merge-box-error-icon-border': '#f8514966',
'merge-box-error-indicator-bg': '#da3633',
'merge-box-error-indicator-border': '#f85149',
'project-card-bg': '#161b22',
'project-header-bg': '#0d1117',
'project-sidebar-bg': '#161b22',
'project-gradient-in': '#161b22',
'project-gradient-out': '#161b2200',
'marketing-icon-primary': '#79c0ff',
'marketing-icon-secondary': '#1f6feb',
'prettylights-syntax-comment': '#8b949e',
'prettylights-syntax-constant': '#79c0ff',
'prettylights-syntax-entity': '#d2a8ff',
'prettylights-syntax-storage-modifier-import': '#c9d1d9',
'prettylights-syntax-entity-tag': '#7ee787',
'prettylights-syntax-keyword': '#ff7b72',
'prettylights-syntax-string': '#a5d6ff',
'prettylights-syntax-variable': '#ffa657',
'prettylights-syntax-brackethighlighter-unmatched': '#f85149',
'prettylights-syntax-invalid-illegal-text': '#f0f6fc',
'prettylights-syntax-invalid-illegal-bg': '#8e1519',
'prettylights-syntax-carriage-return-text': '#f0f6fc',
'prettylights-syntax-carriage-return-bg': '#b62324',
'prettylights-syntax-string-regexp': '#7ee787',
'prettylights-syntax-markup-list': '#f2cc60',
'prettylights-syntax-markup-heading': '#1f6feb',
'prettylights-syntax-markup-italic': '#c9d1d9',
'prettylights-syntax-markup-bold': '#c9d1d9',
'prettylights-syntax-markup-deleted-text': '#ffdcd7',
'prettylights-syntax-markup-deleted-bg': '#67060c',
'prettylights-syntax-markup-inserted-text': '#aff5b4',
'prettylights-syntax-markup-inserted-bg': '#033a16',
'prettylights-syntax-markup-changed-text': '#ffdfb6',
'prettylights-syntax-markup-changed-bg': '#5a1e02',
'prettylights-syntax-markup-ignored-text': '#c9d1d9',
'prettylights-syntax-markup-ignored-bg': '#1158c7',
'prettylights-syntax-meta-diff-range': '#d2a8ff',
'prettylights-syntax-brackethighlighter-angle': '#8b949e',
'prettylights-syntax-sublimelinter-gutter-mark': '#484f58',
'prettylights-syntax-constant-other-reference-link': '#a5d6ff',
'codemirror-text': '#c9d1d9',
'codemirror-bg': '#0d1117',
'codemirror-gutters-bg': '#0d1117',
'codemirror-guttermarker-text': '#0d1117',
'codemirror-guttermarker-subtle-text': '#6e7681',
'codemirror-linenumber-text': '#8b949e',
'codemirror-cursor': '#f0f6fc',
'codemirror-selection-bg': '#79c0ff4d',
'codemirror-activeline-bg': '#161b22',
'codemirror-matchingbracket-text': '#c9d1d9',
'codemirror-lines-bg': '#0d1117',
'codemirror-syntax-comment': '#8b949e',
'codemirror-syntax-constant': '#79c0ff',
'codemirror-syntax-entity': '#d2a8ff',
'codemirror-syntax-keyword': '#ff7b72',
'codemirror-syntax-storage': '#ff7b72',
'codemirror-syntax-string': '#a5d6ff',
'codemirror-syntax-support': '#79c0ff',
'codemirror-syntax-variable': '#ffa657',
'ansi-black': '#0d1117',
'ansi-black-bright': '#161b22',
'ansi-white': '#b1bac4',
'ansi-white-bright': '#b1bac4',
'ansi-gray': '#6e7681',
'ansi-red': '#ff7b72',
'ansi-red-bright': '#ffa198',
'ansi-green': '#3fb950',
'ansi-green-bright': '#56d364',
'ansi-yellow': '#d29922',
'ansi-yellow-bright': '#e3b341',
'ansi-blue': '#58a6ff',
'ansi-blue-bright': '#79c0ff',
'ansi-magenta': '#bc8cff',
'ansi-magenta-bright': '#d2a8ff',
'ansi-cyan': '#76e3ea',
'ansi-cyan-bright': '#b3f0ff',
);

View file

@ -1,680 +0,0 @@
$variables: (
'auto-black': '#cdd9e5',
'auto-white': '#1c2128',
'auto-gray-0': '#22272e',
'auto-gray-1': '#2d333b',
'auto-gray-2': '#373e47',
'auto-gray-3': '#444c56',
'auto-gray-4': '#545d68',
'auto-gray-5': '#636e7b',
'auto-gray-6': '#768390',
'auto-gray-7': '#909dab',
'auto-gray-8': '#adbac7',
'auto-gray-9': '#cdd9e5',
'auto-blue-0': '#0f2d5c',
'auto-blue-1': '#143d79',
'auto-blue-2': '#1b4b91',
'auto-blue-3': '#255ab2',
'auto-blue-4': '#316dca',
'auto-blue-5': '#4184e4',
'auto-blue-6': '#539bf5',
'auto-blue-7': '#6cb6ff',
'auto-blue-8': '#96d0ff',
'auto-blue-9': '#c6e6ff',
'auto-green-0': '#113417',
'auto-green-1': '#1b4721',
'auto-green-2': '#245829',
'auto-green-3': '#2b6a30',
'auto-green-4': '#347d39',
'auto-green-5': '#46954a',
'auto-green-6': '#57ab5a',
'auto-green-7': '#6bc46d',
'auto-green-8': '#8ddb8c',
'auto-green-9': '#b4f1b4',
'auto-yellow-0': '#452700',
'auto-yellow-1': '#593600',
'auto-yellow-2': '#6c4400',
'auto-yellow-3': '#805400',
'auto-yellow-4': '#966600',
'auto-yellow-5': '#ae7c14',
'auto-yellow-6': '#c69026',
'auto-yellow-7': '#daaa3f',
'auto-yellow-8': '#eac55f',
'auto-yellow-9': '#fbe090',
'auto-orange-0': '#4d210c',
'auto-orange-1': '#682d0f',
'auto-orange-2': '#7f3913',
'auto-orange-3': '#94471b',
'auto-orange-4': '#ae5622',
'auto-orange-5': '#cc6b2c',
'auto-orange-6': '#e0823d',
'auto-orange-7': '#f69d50',
'auto-orange-8': '#ffbc6f',
'auto-orange-9': '#ffddb0',
'auto-red-0': '#78191b',
'auto-red-1': '#78191b',
'auto-red-2': '#922323',
'auto-red-3': '#ad2e2c',
'auto-red-4': '#c93c37',
'auto-red-5': '#e5534b',
'auto-red-6': '#f47067',
'auto-red-7': '#ff938a',
'auto-red-8': '#ffb8b0',
'auto-red-9': '#ffd8d3',
'auto-purple-0': '#352160',
'auto-purple-1': '#472c82',
'auto-purple-2': '#5936a2',
'auto-purple-3': '#6b44bc',
'auto-purple-4': '#8256d0',
'auto-purple-5': '#986ee2',
'auto-purple-6': '#b083f0',
'auto-purple-7': '#dcbdfb',
'auto-purple-8': '#dcbdfb',
'auto-purple-9': '#eedcff',
'auto-pink-0': '#551639',
'auto-pink-1': '#69264a',
'auto-pink-2': '#7e325a',
'auto-pink-3': '#983b6e',
'auto-pink-4': '#ae4c82',
'auto-pink-5': '#c96198',
'auto-pink-6': '#e275ad',
'auto-pink-7': '#fc8dc7',
'auto-pink-8': '#ffb3d8',
'auto-pink-9': '#ffd7eb',
'text-primary': '#adbac7',
'text-secondary': '#768390',
'text-tertiary': '#768390',
'text-placeholder': '#545d68',
'text-disabled': '#545d68',
'text-inverse': '#22272e',
'text-link': '#539bf5',
'text-danger': '#e5534b',
'text-success': '#6bc46d',
'text-warning': '#daaa3f',
'text-white': '#cdd9e5',
'icon-primary': '#adbac7',
'icon-secondary': '#636e7b',
'icon-tertiary': '#545d68',
'icon-info': '#6cb6ff',
'icon-danger': '#e5534b',
'icon-success': '#6bc46d',
'icon-warning': '#daaa3f',
'border-primary': '#444c56',
'border-secondary': '#373e47',
'border-tertiary': '#636e7b',
'border-overlay': '#444c56',
'border-inverse': '#cdd9e5',
'border-info': '#4184e466',
'border-danger': '#e5534b66',
'border-success': '#57ab5a66',
'border-warning': '#ae7c1466',
'bg-canvas': '#22272e',
'bg-canvas-mobile': '#1c2128',
'bg-canvas-inverse': '#cdd9e5',
'bg-canvas-inset': '#1e2228',
'bg-primary': '#22272e',
'bg-secondary': '#22272e',
'bg-tertiary': '#2d333b',
'bg-overlay': '#373e47',
'bg-backdrop': '#1c2128cc',
'bg-info': '#4184e41a',
'bg-info-inverse': '#4184e4',
'bg-danger': '#e5534b1a',
'bg-danger-inverse': '#c93c37',
'bg-success': '#46954a1a',
'bg-success-inverse': '#46954a',
'bg-warning': '#ae7c141a',
'bg-warning-inverse': '#ae7c14',
'shadow-small': '0 0 #0000',
'shadow-medium': '0 3px 6px #1c2128',
'shadow-large': '0 8px 24px #1c2128',
'shadow-extra-large': '0 12px 48px #1c2128',
'shadow-highlight': '0 0 #0000',
'shadow-inset': '0 0 #0000',
'state-hover-primary-bg': '#316dca',
'state-hover-primary-border': '#4184e4',
'state-hover-primary-text': '#cdd9e5',
'state-hover-primary-icon': '#cdd9e5',
'state-hover-secondary-bg': '#2d333b',
'state-hover-secondary-border': '#2d333b',
'state-selected-primary-bg': '#316dca',
'state-selected-primary-border': '#4184e4',
'state-selected-primary-text': '#cdd9e5',
'state-selected-primary-icon': '#cdd9e5',
'state-focus-border': '#4184e4',
'state-focus-shadow': '0 0 0 3px #143d79',
'fade-fg-10': '#cdd9e51a',
'fade-fg-15': '#cdd9e526',
'fade-fg-30': '#cdd9e54d',
'fade-fg-50': '#cdd9e580',
'fade-fg-70': '#cdd9e5b3',
'fade-fg-85': '#cdd9e5d9',
'fade-black-10': '#1c21281a',
'fade-black-15': '#1c212826',
'fade-black-30': '#1c21284d',
'fade-black-50': '#1c212880',
'fade-black-70': '#1c2128b3',
'fade-black-85': '#1c2128d9',
'fade-white-10': '#cdd9e51a',
'fade-white-15': '#cdd9e526',
'fade-white-30': '#cdd9e54d',
'fade-white-50': '#cdd9e580',
'fade-white-70': '#cdd9e5b3',
'fade-white-85': '#cdd9e5d9',
'alert-info-text': '#6cb6ff',
'alert-info-icon': '#6cb6ff',
'alert-info-bg': '#4184e41a',
'alert-info-border': '#4184e466',
'alert-warn-text': '#daaa3f',
'alert-warn-icon': '#daaa3f',
'alert-warn-bg': '#ae7c141a',
'alert-warn-border': '#ae7c1466',
'alert-error-text': '#f47067',
'alert-error-icon': '#f47067',
'alert-error-bg': '#e5534b1a',
'alert-error-border': '#e5534b66',
'alert-success-text': '#6bc46d',
'alert-success-icon': '#6bc46d',
'alert-success-bg': '#46954a1a',
'alert-success-border': '#46954a66',
'autocomplete-shadow': '0 16px 32px #1c2128d9',
'autocomplete-row-border': '#444c56',
'blankslate-icon': '#5f6a76',
'btn-text': '#adbac7',
'btn-bg': '#373e47',
'btn-border': '#444c56',
'btn-shadow': '0 0 #0000',
'btn-inset-shadow': '0 0 #0000',
'btn-hover-bg': '#444c56',
'btn-hover-border': '#768390',
'btn-selected-bg': '#2d333b',
'btn-focus-bg': '#373e47',
'btn-focus-border': '#768390',
'btn-focus-shadow': '0 0 0 3px #7683904d',
'btn-shadow-active': 'inset 0 0.15em 0.3em #1c212826',
'btn-shadow-input-focus': '0 0 0 0.2em #316dca4d',
'btn-primary-text': '#fff',
'btn-primary-bg': '#347d39',
'btn-primary-border': '#46954a',
'btn-primary-shadow': '0 0 #0000',
'btn-primary-inset-shadow': '0 0 #0000',
'btn-primary-hover-bg': '#46954a',
'btn-primary-hover-border': '#57ab5a',
'btn-primary-selected-bg': '#347d39',
'btn-primary-selected-shadow': '0 0 #0000',
'btn-primary-disabled-text': '#cdd9e580',
'btn-primary-disabled-bg': '#347d3999',
'btn-primary-disabled-border': '#0000',
'btn-primary-focus-bg': '#347d39',
'btn-primary-focus-border': '#57ab5a',
'btn-primary-focus-shadow': '0 0 0 3px #2ea44f66',
'btn-primary-icon': '#cdd9e5',
'btn-primary-counter-bg': '#cdd9e533',
'btn-outline-text': '#539bf5',
'btn-outline-hover-text': '#539bf5',
'btn-outline-hover-bg': '#444c56',
'btn-outline-hover-border': '#539bf5',
'btn-outline-hover-shadow': '0 1px 0 #1c21281a',
'btn-outline-hover-inset-shadow': 'inset 0 1px 0 #cdd9e508',
'btn-outline-hover-counter-bg': '#cdd9e533',
'btn-outline-selected-text': '#cdd9e5',
'btn-outline-selected-bg': '#1b4b91',
'btn-outline-selected-border': '#cdd9e51a',
'btn-outline-selected-shadow': '0 0 #0000',
'btn-outline-disabled-text': '#539bf580',
'btn-outline-disabled-bg': '#22272e',
'btn-outline-disabled-counter-bg': '#316dca0d',
'btn-outline-focus-border': '#539bf5',
'btn-outline-focus-shadow': '0 0 0 3px #255ab266',
'btn-outline-counter-bg': '#316dca1a',
'btn-danger-text': '#e5534b',
'btn-danger-hover-text': '#fff',
'btn-danger-hover-bg': '#c93c37',
'btn-danger-hover-border': '#e5534b',
'btn-danger-hover-shadow': '0 0 #0000',
'btn-danger-hover-inset-shadow': '0 0 #0000',
'btn-danger-hover-counter-bg': '#fff3',
'btn-danger-selected-text': '#fff',
'btn-danger-selected-bg': '#ad2e2c',
'btn-danger-selected-border': '#cdd9e51a',
'btn-danger-selected-shadow': '0 0 #0000',
'btn-danger-disabled-text': '#e5534b80',
'btn-danger-disabled-bg': '#22272e',
'btn-danger-disabled-counter-bg': '#c93c370d',
'btn-danger-focus-border': '#e5534b',
'btn-danger-focus-shadow': '0 0 0 3px #ad2e2c66',
'btn-danger-counter-bg': '#c93c371a',
'btn-danger-icon': '#e5534b',
'btn-danger-hover-icon': '#cdd9e5',
'btn-counter-bg': '#444c56',
'counter-text': '#adbac7',
'counter-bg': '#444c56',
'counter-primary-text': '#adbac7',
'counter-primary-bg': '#636e7b',
'counter-secondary-text': '#768390',
'counter-secondary-bg': '#76839033',
'dropdown-shadow': '0 16px 32px #1c2128d9',
'label-border': '#444c56',
'label-primary-text': '#909dab',
'label-primary-border': '#636e7b',
'label-secondary-text': '#768390',
'label-secondary-border': '#444c56',
'label-info-text': '#4184e4',
'label-info-border': '#4184e466',
'label-success-text': '#57ab5a',
'label-success-border': '#46954a66',
'label-warning-text': '#daaa3f',
'label-warning-border': '#f2d35b66',
'label-danger-text': '#e5534b',
'label-danger-border': '#e5534b66',
'label-orange-text': '#cc6b2c',
'label-orange-border': '#cc6b2c66',
'input-bg': '#22272e',
'input-contrast-bg': '#1c212880',
'input-border': '#373e47',
'input-shadow': '0 0 #0000',
'input-disabled-bg': '#2d333b',
'input-disabled-border': '#444c56',
'input-warning-border': '#c69026',
'input-error-border': '#e5534b',
'input-tooltip-success-text': '#6bc46d',
'input-tooltip-success-bg': '#263231',
'input-tooltip-success-border': '#335a3b',
'input-tooltip-warning-text': '#daaa3f',
'input-tooltip-warning-bg': '#30302b',
'input-tooltip-warning-border': '#624e22',
'input-tooltip-error-text': '#f47067',
'input-tooltip-error-bg': '#362b31',
'input-tooltip-error-border': '#7c3b3b',
'avatar-bg': '#cdd9e51a',
'avatar-border': '#cdd9e51a',
'avatar-stack-fade': '#444c56',
'avatar-stack-fade-more': '#373e47',
'avatar-child-shadow': '-2px -2px 0 #22272e',
'toast-text': '#adbac7',
'toast-bg': '#444c56',
'toast-border': '#636e7b',
'toast-shadow': '0 8px 24px #1c2128',
'toast-icon': '#cdd9e5',
'toast-icon-bg': '#316dca',
'toast-icon-border': '#4184e4',
'toast-success-text': '#adbac7',
'toast-success-border': '#636e7b',
'toast-success-icon': '#cdd9e5',
'toast-success-icon-bg': '#46954a',
'toast-success-icon-border': '#57ab5a',
'toast-warning-text': '#adbac7',
'toast-warning-border': '#636e7b',
'toast-warning-icon': '#cdd9e5',
'toast-warning-icon-bg': '#ae7c14',
'toast-warning-icon-border': '#c69026',
'toast-danger-text': '#adbac7',
'toast-danger-border': '#636e7b',
'toast-danger-icon': '#cdd9e5',
'toast-danger-icon-bg': '#c93c37',
'toast-danger-icon-border': '#e5534b',
'toast-loading-text': '#adbac7',
'toast-loading-border': '#636e7b',
'toast-loading-icon': '#cdd9e5',
'toast-loading-icon-bg': '#636e7b',
'toast-loading-icon-border': '#768390',
'timeline-text': '#909dab',
'timeline-badge-bg': '#22272e',
'timeline-badge-success-border': '#46954a',
'timeline-target-badge-border': '#316dca',
'timeline-target-badge-shadow': '#1b4b91',
'select-menu-border-secondary': '#444c56',
'select-menu-shadow': '0 0 18px #1c212866',
'select-menu-backdrop-bg': '#1c212880',
'select-menu-backdrop-border': '#545d68',
'select-menu-tap-highlight': '#444c5680',
'select-menu-tap-focus-bg': '#143d79',
'box-blue-border': '#1b4b91',
'box-row-yellow-bg': '#ebc4401a',
'box-row-blue-bg': '#6cb6ff1a',
'box-header-blue-bg': '#22272e',
'box-header-blue-border': '#444c56',
'box-border-info': '#4184e466',
'box-bg-info': '#4184e41a',
'box-border-warning': '#ae7c1466',
'box-bg-warning': '#ae7c141a',
'branch-name-text': '#adbac7',
'branch-name-icon': '#909dab',
'branch-name-bg': '#539bf51a',
'branch-name-link-text': '#539bf5',
'branch-name-link-icon': '#539bf5',
'branch-name-link-bg': '#539bf51a',
'markdown-code-bg': '#cdd9e526',
'markdown-frame-border': '#4f5964',
'markdown-blockquote-border': '#4f5964',
'markdown-table-border': '#4f5964',
'markdown-table-tr-border': '#3b424b',
'menu-heading-text': '#768390',
'menu-border-active': '#f78166',
'menu-bg-active': '#2d333b',
'sidenav-selected-bg': '#373e47',
'sidenav-border-active': '#f78166',
'header-text': '#cdd9e5b3',
'header-bg': '#2d333b',
'header-logo': '#cdd9e5',
'filter-item-bar-bg': '#292e35',
'hidden-text-expander-bg': '#373e47',
'hidden-text-expander-bg-hover': '#444c56',
'drag-and-drop-border': '#393f48',
'upload-enabled-border': '#4f5964',
'upload-enabled-border-focused': '#4f84d4',
'previewable-comment-form-border': '#393f48',
'underlinenav-border': '#444c5600',
'underlinenav-border-hover': '#444c56',
'underlinenav-border-active': '#f78166',
'underlinenav-text': '#768390',
'underlinenav-text-hover': '#adbac7',
'underlinenav-text-active': '#adbac7',
'underlinenav-icon': '#636e7b',
'underlinenav-icon-hover': '#adbac7',
'underlinenav-icon-active': '#adbac7',
'underlinenav-counter-text': '#768390',
'underlinenav-counter-bg': '#76839033',
'verified-badge-text': '#57ab5a',
'verified-badge-bg': '#57ab5a1a',
'verified-badge-border': '#57ab5a66',
'social-count-bg': '#373e47',
'tooltip-text': '#cdd9e5',
'tooltip-bg': '#636e7b',
'header-search-bg': '#22272e',
'header-search-border': '#373e47',
'search-keyword-hl': '#ae7c1466',
'diffstat-neutral-bg': '#444c56',
'diffstat-neutral-border': '#cdd9e51a',
'diffstat-deletion-bg': '#c93c37',
'diffstat-deletion-border': '#e5534b',
'diffstat-addition-bg': '#347d39',
'diffstat-addition-border': '#46954a',
'mktg-success': '#3d8942',
'mktg-info': '#3877d5',
'mktg-bg-shade-gradient-top': '#1c212811',
'mktg-bg-shade-gradient-bottom': '#1c212800',
'mktg-btn-bg': '#316dca',
'mktg-btn-border': '#316dca',
'mktg-btn-text': '#cdd9e5',
'mktg-btn-icon': '#cdd9e5',
'mktg-btn-focus-shadow': '0 0 0 3px #316dca4d',
'mktg-btn-hover-bg': '#4184e4',
'mktg-btn-hover-border': '#4184e4',
'mktg-btn-disabled-bg': '#4184e480',
'mktg-btn-disabled-border': '#0000',
'mktg-btn-disabled-text': '#cdd9e580',
'mktg-btn-disabled-icon': '#cdd9e580',
'mktg-btn-primary-bg': '#347d39',
'mktg-btn-primary-border': '#347d39',
'mktg-btn-primary-text': '#cdd9e5',
'mktg-btn-primary-icon': '#cdd9e5',
'mktg-btn-primary-focus-shadow': '0 0 0 3px #347d394d',
'mktg-btn-primary-hover-bg': '#46954a',
'mktg-btn-primary-hover-border': '#46954a',
'mktg-btn-primary-disabled-bg': '#46954a80',
'mktg-btn-primary-disabled-border': '#0000',
'mktg-btn-primary-disabled-text': '#cdd9e580',
'mktg-btn-primary-disabled-icon': '#cdd9e580',
'mktg-btn-outline-bg': '#0000',
'mktg-btn-outline-border': '#4184e480',
'mktg-btn-outline-text': '#4184e4',
'mktg-btn-outline-icon': '#4184e4',
'mktg-btn-outline-focus-shadow': '0 0 0 3px #4184e44d',
'mktg-btn-outline-hover-bg': '#0000',
'mktg-btn-outline-hover-border': '#4184e4',
'mktg-btn-outline-hover-text': '#539bf5',
'mktg-btn-outline-hover-icon': '#539bf5',
'mktg-btn-outline-disabled-bg': '#0000',
'mktg-btn-outline-disabled-border': '#4184e433',
'mktg-btn-outline-disabled-text': '#4184e480',
'mktg-btn-outline-disabled-icon': '#4184e480',
'mktg-btn-dark-bg': '#0000',
'mktg-btn-dark-border': '#adbac780',
'mktg-btn-dark-text': '#adbac7',
'mktg-btn-dark-icon': '#adbac7',
'mktg-btn-dark-focus-shadow': '0 0 0 3px #adbac74d',
'mktg-btn-dark-hover-bg': '#adbac780',
'mktg-btn-dark-hover-border': '#adbac780',
'mktg-btn-dark-hover-text': '#22272e',
'mktg-btn-dark-hover-icon': '#22272e',
'mktg-btn-dark-disabled-bg': '#0000',
'mktg-btn-dark-disabled-border': '#adbac733',
'mktg-btn-dark-disabled-text': '#adbac780',
'mktg-btn-dark-disabled-icon': '#adbac780',
'files-explorer-icon': '#636e7b',
'hl-author-bg': '#0f2d5c',
'hl-author-border': '#1b4b91',
'logo-subdued': '#444c56',
'discussion-border': '#494c49',
'discussion-bg-success': '#46954a1a',
'actions-workflow-table-sticky-bg': '#22272ef2',
'repo-language-color-border': '#cdd9e533',
'code-selection-bg': '#6cb6ff4d',
'highlight-text': '#ffd467',
'highlight-bg': '#cc8f2c61',
'blob-line-highlight-bg': '#c6902626',
'blob-line-highlight-border': '#daaa3f',
'diff-addition-text': '#6bc46d',
'diff-addition-bg': '#46954a33',
'diff-addition-border': '#2b6a30',
'diff-deletion-text': '#e5534b',
'diff-deletion-bg': '#c93c3733',
'diff-deletion-border': '#ad2e2c',
'diff-change-text': '#daaa3f',
'diff-change-bg': '#452700',
'diff-change-border': '#966600',
'diff-blob-num-text': '#cdd9e54d',
'diff-blob-num-hover-text': '#cdd9e599',
'diff-blob-addition-num-text': '#57ab5a',
'diff-blob-addition-num-hover-text': '#8ddb8c',
'diff-blob-addition-num-bg': '#46954a1a',
'diff-blob-addition-line-bg': '#46954a33',
'diff-blob-addition-word-bg': '#46954a8c',
'diff-blob-deletion-num-text': '#e5534b',
'diff-blob-deletion-num-hover-text': '#ff938a',
'diff-blob-deletion-num-bg': '#c93c371a',
'diff-blob-deletion-line-bg': '#c93c3733',
'diff-blob-deletion-word-bg': '#c93c3780',
'diff-blob-hunk-text': '#768390',
'diff-blob-hunk-num-bg': '#539bf526',
'diff-blob-hunk-line-bg': '#539bf51a',
'diff-blob-empty-block-bg': '#2d333b',
'diff-blob-selected-line-highlight-bg': '#ae7c141a',
'diff-blob-selected-line-highlight-border': '#ae7c14',
'diff-blob-selected-line-highlight-mix-blend-mode': 'normal',
'diff-blob-expander-icon': '#768390',
'diff-blob-expander-hover-icon': '#cdd9e5',
'diff-blob-expander-hover-bg': '#316dca',
'diff-blob-comment-button-icon': '#cdd9e5',
'diff-blob-comment-button-bg': '#316dca',
'diff-blob-comment-button-gradient-bg': '#437bd1',
'global-nav-logo': '#cdd9e5',
'global-nav-bg': '#2d333b',
'global-nav-text': '#adbac7',
'global-nav-icon': '#adbac7',
'global-nav-input-bg': '#22272e',
'global-nav-input-border': '#373e47',
'global-nav-input-icon': '#373e47',
'global-nav-input-placeholder': '#545d68',
'calendar-graph-day-bg': '#2d333b',
'calendar-graph-day-border': '#1b1f230f',
'calendar-graph-day-L1-bg': '#003820',
'calendar-graph-day-L2-bg': '#00602d',
'calendar-graph-day-L3-bg': '#10983d',
'calendar-graph-day-L4-bg': '#27d545',
'calendar-graph-day-L4-border': '#ffffff0d',
'calendar-graph-day-L3-border': '#ffffff0d',
'calendar-graph-day-L2-border': '#ffffff0d',
'calendar-graph-day-L1-border': '#ffffff0d',
'footer-invertocat-octicon': '#444c56',
'footer-invertocat-octicon-hover': '#636e7b',
'pr-state-draft-text': '#768390',
'pr-state-draft-bg': '#7683901a',
'pr-state-draft-border': '#76839066',
'pr-state-open-text': '#57ab5a',
'pr-state-open-bg': '#57ab5a1a',
'pr-state-open-border': '#57ab5a66',
'pr-state-merged-text': '#986ee2',
'pr-state-merged-bg': '#b083f01a',
'pr-state-merged-border': '#b083f066',
'pr-state-closed-text': '#e5534b',
'pr-state-closed-bg': '#c93c371a',
'pr-state-closed-border': '#c93c3766',
'topic-tag-text': '#539bf5',
'topic-tag-bg': '#4184e41a',
'topic-tag-hover-bg': '#4184e433',
'topic-tag-active-bg': '#4184e426',
'merge-box-success-icon-bg': '#46954a1a',
'merge-box-success-icon-text': '#57ab5a',
'merge-box-success-icon-border': '#46954a66',
'merge-box-success-indicator-bg': '#347d39',
'merge-box-success-indicator-border': '#46954a',
'merge-box-merged-icon-bg': '#b083f01a',
'merge-box-merged-icon-text': '#986ee2',
'merge-box-merged-icon-border': '#b083f066',
'merge-box-merged-box-border': '#b083f066',
'merge-box-neutral-icon-bg': '#adbac71a',
'merge-box-neutral-icon-text': '#768390',
'merge-box-neutral-icon-border': '#adbac766',
'merge-box-neutral-indicator-bg': '#545d68',
'merge-box-neutral-indicator-border': '#636e7b',
'merge-box-warning-icon-bg': '#ae7c141a',
'merge-box-warning-icon-text': '#daaa3f',
'merge-box-warning-icon-border': '#ae7c1466',
'merge-box-warning-box-border': '#ae7c1466',
'merge-box-warning-merge-highlight': '#ae7c141a',
'merge-box-error-icon-bg': '#e5534b1a',
'merge-box-error-icon-text': '#e5534b',
'merge-box-error-icon-border': '#e5534b66',
'merge-box-error-indicator-bg': '#c93c37',
'merge-box-error-indicator-border': '#e5534b',
'project-card-bg': '#2d333b',
'project-header-bg': '#22272e',
'project-sidebar-bg': '#2d333b',
'project-gradient-in': '#2d333b',
'project-gradient-out': '#2d333b00',
'checks-bg': '#1e2228',
'checks-run-border-width': '1px',
'checks-container-border-width': '1px',
'checks-text-primary': '#adbac7',
'checks-text-secondary': '#768390',
'checks-text-link': '#539bf5',
'checks-btn-icon': '#636e7b',
'checks-btn-hover-icon': '#adbac7',
'checks-btn-hover-bg': '#444c56',
'checks-input-text': '#768390',
'checks-input-placeholder-text': '#545d68',
'checks-input-focus-text': '#adbac7',
'checks-input-bg': '#22272e',
'checks-input-shadow': '0 0 0 1px #373e47',
'checks-dropdown-text': '#adbac7',
'checks-dropdown-bg': '#373e47',
'checks-dropdown-border': '#444c56',
'checks-dropdown-hover-text': '#cdd9e5',
'checks-dropdown-hover-bg': '#316dca',
'checks-dropdown-btn-hover-text': '#cdd9e5',
'checks-dropdown-btn-hover-bg': '#2d333b',
'checks-scrollbar-thumb-bg': '#444c56',
'checks-header-label-text': '#768390',
'checks-header-label-open-text': '#adbac7',
'checks-header-border': '#373e47',
'checks-header-icon': '#636e7b',
'checks-line-text': '#768390',
'checks-line-num-text': '#768390',
'checks-line-timestamp-text': '#768390',
'checks-line-hover-bg': '#2d333b',
'checks-line-selected-bg': '#4184e41a',
'checks-line-selected-num-text': '#539bf5',
'checks-line-dt-fm-text': '#22272e',
'checks-line-dt-fm-bg': '#c69026',
'checks-gate-bg': '#80540026',
'checks-gate-text': '#768390',
'checks-gate-waiting-text': '#daaa3f',
'checks-step-header-open-bg': '#2d333b',
'checks-step-error-text': '#e5534b',
'checks-step-warning-text': '#daaa3f',
'checks-logline-text': '#636e7b',
'checks-logline-num-text': '#768390',
'checks-logline-debug-text': '#b083f0',
'checks-logline-error-text': '#768390',
'checks-logline-error-num-text': '#768390',
'checks-logline-error-bg': '#e5534b1a',
'checks-logline-warning-text': '#768390',
'checks-logline-warning-num-text': '#daaa3f',
'checks-logline-warning-bg': '#ae7c141a',
'checks-logline-command-text': '#539bf5',
'checks-logline-section-text': '#6bc46d',
'intro-shelf-gradient-left': '#4184e41a',
'intro-shelf-gradient-right': '#46954a1a',
'intro-shelf-gradient-in': '#22272e',
'intro-shelf-gradient-out': '#22272e00',
'marketing-icon-primary': '#6cb6ff',
'marketing-icon-secondary': '#316dca',
'prettylights-syntax-comment': '#768390',
'prettylights-syntax-constant': '#6cb6ff',
'prettylights-syntax-entity': '#dcbdfb',
'prettylights-syntax-storage-modifier-import': '#adbac7',
'prettylights-syntax-entity-tag': '#8ddb8c',
'prettylights-syntax-keyword': '#f47067',
'prettylights-syntax-string': '#96d0ff',
'prettylights-syntax-variable': '#f69d50',
'prettylights-syntax-brackethighlighter-unmatched': '#e5534b',
'prettylights-syntax-invalid-illegal-text': '#cdd9e5',
'prettylights-syntax-invalid-illegal-bg': '#922323',
'prettylights-syntax-carriage-return-text': '#cdd9e5',
'prettylights-syntax-carriage-return-bg': '#ad2e2c',
'prettylights-syntax-string-regexp': '#8ddb8c',
'prettylights-syntax-markup-list': '#eac55f',
'prettylights-syntax-markup-heading': '#316dca',
'prettylights-syntax-markup-italic': '#adbac7',
'prettylights-syntax-markup-bold': '#adbac7',
'prettylights-syntax-markup-deleted-text': '#ffd8d3',
'prettylights-syntax-markup-deleted-bg': '#78191b',
'prettylights-syntax-markup-inserted-text': '#b4f1b4',
'prettylights-syntax-markup-inserted-bg': '#1b4721',
'prettylights-syntax-markup-changed-text': '#ffddb0',
'prettylights-syntax-markup-changed-bg': '#682d0f',
'prettylights-syntax-markup-ignored-text': '#adbac7',
'prettylights-syntax-markup-ignored-bg': '#255ab2',
'prettylights-syntax-meta-diff-range': '#dcbdfb',
'prettylights-syntax-brackethighlighter-angle': '#768390',
'prettylights-syntax-sublimelinter-gutter-mark': '#545d68',
'prettylights-syntax-constant-other-reference-link': '#96d0ff',
'codemirror-text': '#adbac7',
'codemirror-bg': '#22272e',
'codemirror-gutters-bg': '#22272e',
'codemirror-guttermarker-text': '#22272e',
'codemirror-guttermarker-subtle-text': '#636e7b',
'codemirror-linenumber-text': '#768390',
'codemirror-cursor': '#cdd9e5',
'codemirror-selection-bg': '#6cb6ff4d',
'codemirror-activeline-bg': '#2d333b',
'codemirror-matchingbracket-text': '#adbac7',
'codemirror-lines-bg': '#22272e',
'codemirror-syntax-comment': '#768390',
'codemirror-syntax-constant': '#6cb6ff',
'codemirror-syntax-entity': '#dcbdfb',
'codemirror-syntax-keyword': '#f47067',
'codemirror-syntax-storage': '#f47067',
'codemirror-syntax-string': '#96d0ff',
'codemirror-syntax-support': '#6cb6ff',
'codemirror-syntax-variable': '#f69d50',
'ansi-black': '#22272e',
'ansi-black-bright': '#2d333b',
'ansi-white': '#909dab',
'ansi-white-bright': '#909dab',
'ansi-gray': '#636e7b',
'ansi-red': '#f47067',
'ansi-red-bright': '#ff938a',
'ansi-green': '#57ab5a',
'ansi-green-bright': '#6bc46d',
'ansi-yellow': '#c69026',
'ansi-yellow-bright': '#daaa3f',
'ansi-blue': '#539bf5',
'ansi-blue-bright': '#6cb6ff',
'ansi-magenta': '#b083f0',
'ansi-magenta-bright': '#dcbdfb',
'ansi-cyan': '#76e3ea',
'ansi-cyan-bright': '#b3f0ff',
);

View file

@ -11,9 +11,42 @@ $min-width-with-gitako: $min-screen-width + $side-bar-base-width;
$github-header-z-index: 32;
$github-pull-request-float-header-z-index: 110;
$minimal-z-index: max($github-header-z-index, $github-pull-request-float-header-z-index) + 1;
$github-notifications-center-header-z-index: 999;
$minimal-z-index: max(
$github-header-z-index,
$github-pull-request-float-header-z-index,
$github-notifications-center-header-z-index
) + 1;
@mixin interactive-background($default, $hover, $active, $focus: $hover) {
@mixin interactive-frame() {
@include interactive-border;
@include interactive-background;
}
@mixin interactive-border(
$default: var(--gitako-btn-border),
$hover: var(--gitako-btn-hover-border),
$active: var(--gitako-btn-active-border),
$focus: $hover
) {
border: 1px solid $default;
&:hover {
border: 1px solid $hover;
}
&:focus {
border: 1px solid $focus;
}
&:active {
border: 1px solid $active;
}
}
@mixin interactive-background(
$default: var(--gitako-btn-bg),
$hover: var(--gitako-btn-hover-bg),
$active: var(--gitako-btn-active-bg),
$focus: $hover
) {
background-color: $default;
&:hover {
background-color: $hover;
@ -47,47 +80,14 @@ $minimal-z-index: max($github-header-z-index, $github-pull-request-float-header-
}
}
:root {
--gitako-width: #{$side-bar-base-width};
@mixin hide-for-print {
@media print {
display: none;
}
}
.#{$name}-ready {
// github
&.shrink-github-header {
.js-header-wrapper {
background: var(--gitako-bg-canvas-inverse);
}
.Header {
max-width: 1280px;
margin: 0 auto;
@media (max-width: 1020px) {
overflow: hidden; // prevent blank scroll area when Gitako is open and window is narrow
}
@media (min-width: 1280px) {
padding: 0 32px !important;
}
}
main {
// overflow: hidden;
// This prevents blank scroll area when Gitako is open and window is narrow.
// But it conflicts with the pr toolbar. Keep it here as a reminder.
& > *:first-child {
// repo info and nav bar
box-shadow: inset 0 -1px 0 var(--gitako-border-overlay); // from .UnderlineNav
& > * {
max-width: 1280px;
margin: 0 auto;
}
nav {
overflow: auto !important;
}
}
}
}
// code folding start
.blob-wrapper table .blob-num {
position: relative; // for positioning
@ -95,17 +95,16 @@ $minimal-z-index: max($github-header-z-index, $github-pull-request-float-header-
padding-right: 20px;
}
// cancel code fold if not wrapped with .gitako-code-fold-mark
// hide code fold handler if not enabled
.gitako-code-fold-handler {
display: none;
}
.gitako-code-fold-hidden {
display: table-cell;
}
.gitako-code-fold-attached {
.gitako-code-fold-attached:not(.gitako-code-fold-attached-disabled) {
tr {
.gitako-code-fold-handler {
@include hide-for-print();
display: initial;
position: absolute;
top: 0px;
@ -133,29 +132,32 @@ $minimal-z-index: max($github-header-z-index, $github-pull-request-float-header-
}
@include interactive-background-on-before(
var(--gitako-icon-tertiary),
var(--gitako-icon-primary),
var(--gitako-icon-secondary)
var(--gitako-fg-subtle),
var(--gitako-fg-default),
var(--gitako-fg-muted)
);
}
&.active {
&.gitako-code-fold-active {
.gitako-code-fold-handler {
&::before {
transform: rotate(-90deg);
}
@include interactive-background-on-before(
var(--gitako-icon-secondary),
var(--gitako-icon-tertiary),
var(--gitako-icon-primary)
var(--gitako-fg-muted),
var(--gitako-fg-default),
var(--gitako-fg-subtle)
);
}
}
}
.gitako-code-fold-hidden {
display: none;
// hide folded sections, except for print
&.gitako-code-fold-hidden {
@media screen {
display: none;
}
}
}
}
// code folding end
@ -173,14 +175,10 @@ $minimal-z-index: max($github-header-z-index, $github-pull-request-float-header-
.clippy {
width: 32px;
height: 32px;
border: 1px solid var(--gitako-border-tertiary);
border: 1px solid var(--gitako-border-default);
border-radius: 4px;
@include interactive-background(
var(--gitako-btn-bg),
var(--gitako-btn-hover-bg),
var(--gitako-btn-focus-bg)
);
@include interactive-background;
.icon {
width: 100%;
height: 100%;
@ -212,7 +210,9 @@ $minimal-z-index: max($github-header-z-index, $github-pull-request-float-header-
}
.with-gitako-spacing {
margin-left: var(--gitako-width);
@media screen {
margin-left: var(--gitako-width);
}
// gitee
&.git-project {
@ -272,13 +272,15 @@ $minimal-z-index: max($github-header-z-index, $github-pull-request-float-header-
// Why does not TextInput get theme properly?
@mixin input {
color: var(--gitako-text-primary);
background-color: var(--gitako-input-bg);
border-color: var(--gitako-border-primary);
box-shadow: var(--gitako-input-shadow);
color: var(--gitako-fg-default);
background-color: var(--gitako-canvas-default);
border-color: var(--gitako-border-default);
box-shadow: var(--gitako-primer-shadow-inset);
}
.#{$name}-toggle-show-button-wrapper {
@include hide-for-print();
z-index: $minimal-z-index;
position: fixed;
top: 124px; // align with GitHub's navbar items
@ -310,11 +312,10 @@ $minimal-z-index: max($github-header-z-index, $github-pull-request-float-header-
height: 32px;
padding: 4px;
border-radius: 6px;
border: 1px solid var(--gitako-border-tertiary);
background: var(--gitako-bg-tertiary);
color: var(--gitako-icon-primary);
@include interactive-frame;
color: var(--gitako-fg-default);
&:active {
color: var(--gitako-icon-tertiary);
color: var(--gitako-fg-subtle);
}
transition: all ease 0.3s;
font-size: 16px;
@ -330,13 +331,13 @@ $minimal-z-index: max($github-header-z-index, $github-pull-request-float-header-
object-fit: contain;
transition: all ease 0.4s;
transform: translateX(-8px);
filter: drop-shadow(0 0 1px var(--gitako-bg-backdrop));
filter: drop-shadow(0 0 1px var(--gitako-primer-canvas-backdrop));
}
&:active,
&:hover {
.tentacle {
transform: translateX(-4px);
filter: drop-shadow(0 0 2px var(--gitako-bg-backdrop));
filter: drop-shadow(0 0 2px var(--gitako-primer-canvas-backdrop));
}
}
}
@ -346,10 +347,10 @@ $minimal-z-index: max($github-header-z-index, $github-pull-request-float-header-
margin-left: 4px;
padding: 2px 4px;
font-size: 12px;
color: var(--gitako-text-red);
border: 1px solid var(--gitako-border-overlay);
color: var(--gitako-danger-fg);
border: 1px solid var(--gitako-border-default);
border-radius: 2px;
background-color: var(--gitako-bg-tertiary);
background-color: var(--gitako-bg-subtle);
}
&:hover {
@ -360,13 +361,15 @@ $minimal-z-index: max($github-header-z-index, $github-pull-request-float-header-
}
.#{$name}-side-bar {
@include hide-for-print();
@import '~@primer/css/base/index.scss';
button {
border-radius: 6px;
font-weight: 600;
}
a {
color: var(--gitako-text-link);
color: var(--gitako-accent-fg);
}
$resizeHandlerWidth: 1px;
@ -393,7 +396,6 @@ $minimal-z-index: max($github-header-z-index, $github-pull-request-float-header-
}
.gitako-side-bar-body-wrapper-content {
width: var(--gitako-width);
}
}
.#{$name}-resize-handler {
@ -402,15 +404,15 @@ $minimal-z-index: max($github-header-z-index, $github-pull-request-float-header-
cursor: ew-resize;
user-select: none;
width: 0;
background: var(--gitako-bg-tertiary);
border-right: $resizeHandlerWidth solid var(--gitako-border-tertiary);
background: var(--gitako-bg-subtle);
border-right: $resizeHandlerWidth solid var(--gitako-border-default);
overflow: hidden;
box-sizing: content-box;
&:hover,
&:active {
width: 16px;
background: var(--gitako-bg-secondary);
border-left: 1px solid var(--gitako-border-tertiary);
background: var(--gitako-bg-subtle);
border-left: 1px solid var(--gitako-border-default);
}
.octicon.Grabber {
@ -423,23 +425,23 @@ $minimal-z-index: max($github-header-z-index, $github-pull-request-float-header-
.#{$name}-side-bar-body {
$button-size: 32px;
position: relative;
width: 100%;
width: var(--gitako-width);
height: 100%;
display: flex;
flex-direction: column;
background: var(--gitako-bg-secondary);
border-left: 1px solid var(--gitako-border-overlay);
background: var(--gitako-bg-subtle);
border-left: 1px solid var(--gitako-border-default);
overflow: hidden;
.octicon {
transition: transform 0.3s ease;
color: var(--gitako-icon-tertiary);
color: var(--gitako-fg-subtle);
width: 100%;
height: 100%;
}
.octicon-color {
color: var(--gitako-icon-tertiary);
color: var(--gitako-fg-subtle);
}
.octicon-wrapper {
@ -458,26 +460,33 @@ $minimal-z-index: max($github-header-z-index, $github-pull-request-float-header-
.header {
position: relative;
min-height: 62px; // GitHub header height if login
background: var(--gitako-bg-tertiary);
background: var(--gitako-bg-subtle);
padding: 6px 10px;
flex-shrink: 0;
position: relative; // prevent overlap by outline of other elements
.user-and-repo {
display: inline; // would be override by CSS rule of section from @primer/css
line-height: 32px;
a {
color: var(--gitako-text-link);
white-space: normal;
li {
display: inline-flex;
align-items: center;
min-height: 32px;
padding: 4px 0;
a {
color: var(--gitako-accent-fg);
white-space: normal;
}
}
}
.branch-name {
margin-left: 4px;
padding: 4px 6px; // did not align well for some reason :/
color: var(--gitako-branch-name-text);
background-color: var(--gitako-branch-name-bg);
color: var(--gitako-fg-muted);
background-color: var(--gitako-accent-subtle);
word-break: break-word;
}
.close-side-bar-button-position {
@ -496,11 +505,11 @@ $minimal-z-index: max($github-header-z-index, $github-pull-request-float-header-
}
&.active .octicon {
color: var(--gitako-icon-primary);
color: var(--gitako-fg-default);
}
.action-icon {
color: var(--gitako-icon-tertiary);
color: var(--gitako-fg-subtle);
width: 20px;
height: 20px;
text-align: center;
@ -529,12 +538,12 @@ $minimal-z-index: max($github-header-z-index, $github-pull-request-float-header-
width: 100%;
height: 100%;
@include flex-center();
border-top: 1px solid var(--gitako-border-overlay);
border-top: 1px solid var(--gitako-border-default);
.loading-indicator {
display: flex;
align-items: center;
color: var(--gitako-text-placeholder);
color: var(--gitako-fg-subtle);
&-icon {
width: 20px;
@ -574,14 +583,15 @@ $minimal-z-index: max($github-header-z-index, $github-pull-request-float-header-
.search-input {
width: 100%;
box-shadow: none; // stay low
border-color: var(--gitako-border-overlay);
border-width: 1px 0 1px 0; // remove border on left&right to make UI clear
border-color: var(--gitako-border-default);
border-radius: 0; // its rounded corner not match with nearby elements
color: var(--gitako-text-primary);
background: var(--gitako-bg-canvas);
color: var(--gitako-fg-default);
background: var(--gitako-bg-default);
padding-right: 40px; // save space for actions
&.error {
border-color: var(--gitako-border-danger);
border-color: var(--gitako-danger-emphasis);
}
}
@ -599,27 +609,30 @@ $minimal-z-index: max($github-header-z-index, $github-pull-request-float-header-
margin: 0;
padding: 2px 4px;
min-width: 32px;
border: 1px solid var(--gitako-border-secondary);
border: 1px solid var(--gitako-border-muted);
border-radius: 8px;
color: var(--gitako-text-secondary);
color: var(--gitako-fg-muted);
font-size: 12px;
font-weight: 500;
line-height: 1;
outline: none;
@include interactive-background(
var(--gitako-bg-primary),
var(--gitako-bg-secondary),
var(--gitako-bg-tertiary)
);
@include interactive-frame;
}
}
}
.files {
position: relative;
flex: 1;
overflow: auto;
overflow-x: hidden; // prevent x-scroll bar show up while sizing
overflow: hidden;
// Put this inside files will help files to get proper size derived from parents, regardless of its content size
.magic-size-container {
position: absolute;
width: 100%;
height: 100%;
}
}
.node-item {
@ -632,21 +645,21 @@ $minimal-z-index: max($github-header-z-index, $github-pull-request-float-header-
&.focused {
@include interactive-background(
var(--gitako-bg-tertiary),
var(--gitako-bg-secondary),
var(--gitako-bg-overlay)
var(--gitako-canvas-subtle),
var(--gitako-canvas-subtle),
var(--gitako-canvas-inset)
);
}
@include interactive-background(
var(--gitako-auto-white),
var(--gitako-bg-secondary),
var(--gitako-bg-tertiary)
var(--gitako-canvas-default),
var(--gitako-canvas-subtle),
var(--gitako-canvas-inset)
);
&.disabled {
pointer-events: none;
color: var(--gitako-text-disabled);
color: var(--gitako-fg-muted);
}
display: flex;
justify-content: space-between;
@ -657,17 +670,17 @@ $minimal-z-index: max($github-header-z-index, $github-pull-request-float-header-
white-space: nowrap;
transition: padding 0.3s ease; // on toggle expansion in search results
border-bottom: 1px solid var(--gitako-border-secondary);
border-bottom: 1px solid var(--gitako-border-muted);
&.compact {
border-bottom: none;
&.focused {
border-top: 1px solid var(--gitako-border-secondary);
border-bottom: 1px solid var(--gitako-border-secondary);
border-top: 1px solid var(--gitako-border-muted);
border-bottom: 1px solid var(--gitako-border-muted);
}
}
&:not(:hover) {
color: var(--gitako-text-primary);
color: var(--gitako-fg-default);
}
@mixin icon-size() {
@ -714,7 +727,7 @@ $minimal-z-index: max($github-header-z-index, $github-pull-request-float-header-
&:not(:hover) {
.node-item-label .prefix {
color: var(--gitako-text-tertiary);
color: var(--gitako-fg-muted);
}
}
@ -723,13 +736,79 @@ $minimal-z-index: max($github-header-z-index, $github-pull-request-float-header-
padding-right: 8px;
.node-item-comment {
display: inline-block;
width: 48px;
display: inline-flex;
align-items: center;
min-width: 36px;
padding: 0 4px;
color: var(--gitako-text-tertiary);
color: var(--gitako-fg-muted);
.octicon-wrapper {
margin: 0; // make it closer to the comment amount label
margin: 2px; // make it closer to the comment amount label
}
}
.node-item-diff {
display: inline-flex;
align-items: center;
padding: 0 4px;
color: var(--gitako-fg-muted);
.octicon-wrapper {
margin: 0; // make it closer to the diff details
}
.added .octicon {
color: var(--gitako-success-emphasis);
}
.removed .octicon {
color: var(--gitako-danger-emphasis);
}
.renamed .octicon {
color: var(--gitako-done-emphasis);
}
.modified .octicon {
color: var(--gitako-accent-emphasis);
}
.ignored .octicon {
color: var(--gitako-neutral-emphasis);
}
.diff-stat-graph {
display: inline-block;
white-space: nowrap;
> span {
display: inline-block;
width: 2px;
height: 10px;
margin: 0 1px;
border-radius: 2px;
background: var(--gitako-neutral-emphasis);
}
.diff-stat-graph-addition {
background: var(--gitako-success-emphasis);
}
.diff-stat-graph-deletion {
background: var(--gitako-danger-emphasis);
}
}
.diff-stat-text {
display: inline-block;
white-space: nowrap;
// Use some commonly available monospace font, the leading ones are copied from GitHub
font-family: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono,
monospace, 'Cascadia Code', 'Courier New', Courier;
.additions {
color: var(--gitako-success-emphasis);
}
.delimiter {
color: var(--gitako-neutral-emphasis);
}
.deletions {
color: var(--gitako-danger-emphasis);
}
}
}
@ -767,12 +846,12 @@ $minimal-z-index: max($github-header-z-index, $github-pull-request-float-header-
.#{$name}-settings-bar {
z-index: 2;
background: var(--gitako-bg-tertiary);
background: var(--gitako-bg-subtle);
display: flex;
flex-direction: column;
max-height: calc(100vh - 120px);
&-title {
border-top: 1px solid var(--gitako-border-secondary);
border-top: 1px solid var(--gitako-border-muted);
padding: 10px;
box-shadow: 0 1px 8px 0 rgba(0, 0, 0, 0.2), 0 3px 4px 0 rgba(0, 0, 0, 0.14),
0 3px 3px -2px rgba(0, 0, 0, 0.12);
@ -790,7 +869,7 @@ $minimal-z-index: max($github-header-z-index, $github-pull-request-float-header-
height: 10px;
top: 0;
left: 0;
background: var(--gitako-bg-tertiary);
background: var(--gitako-bg-subtle);
z-index: 1;
}
.settings-section {
@ -821,10 +900,10 @@ $minimal-z-index: max($github-header-z-index, $github-pull-request-float-header-
// make it look like text inputs
height: 36px;
border-radius: 6px;
border: 1px solid var(--gitako-input-border);
background: var(--gitako-input-bg);
color: var(--gitako-text-primary);
box-shadow: var(--gitako-input-shadow);
border: 1px solid var(--gitako-border-default);
background: var(--gitako-canvas-default);
color: var(--gitako-fg-default);
box-shadow: var(--gitako-primer-shadow-inset);
}
&.field-checkbox {
padding-left: 20px;
@ -849,7 +928,7 @@ $minimal-z-index: max($github-header-z-index, $github-pull-request-float-header-
margin-bottom: 4px;
}
.hint {
color: var(--gitako-text-placeholder);
color: var(--gitako-fg-subtle);
}
.access-token-input-control {
display: flex;
@ -871,10 +950,10 @@ $minimal-z-index: max($github-header-z-index, $github-pull-request-float-header-
justify-content: space-between;
align-items: center;
padding: 2px 6px 2px 10px;
border-top: 1px solid var(--gitako-border-secondary);
border-top: 1px solid var(--gitako-border-muted);
.version {
color: var(--gitako-text-tertiary);
color: var(--gitako-fg-muted);
}
.header-right {

View file

@ -1,566 +0,0 @@
$variables: (
'auto-black': '#1b1f23',
'auto-white': '#fff',
'auto-gray-0': '#fafbfc',
'auto-gray-1': '#f6f8fa',
'auto-gray-2': '#e1e4e8',
'auto-gray-3': '#d1d5da',
'auto-gray-4': '#959da5',
'auto-gray-5': '#6a737d',
'auto-gray-6': '#586069',
'auto-gray-7': '#444d56',
'auto-gray-8': '#2f363d',
'auto-gray-9': '#24292e',
'auto-blue-0': '#f1f8ff',
'auto-blue-1': '#dbedff',
'auto-blue-2': '#c8e1ff',
'auto-blue-3': '#79b8ff',
'auto-blue-4': '#2188ff',
'auto-blue-5': '#0366d6',
'auto-blue-6': '#005cc5',
'auto-blue-7': '#044289',
'auto-blue-8': '#032f62',
'auto-blue-9': '#05264c',
'auto-green-0': '#f0fff4',
'auto-green-1': '#dcffe4',
'auto-green-2': '#bef5cb',
'auto-green-3': '#85e89d',
'auto-green-4': '#34d058',
'auto-green-5': '#28a745',
'auto-green-6': '#22863a',
'auto-green-7': '#176f2c',
'auto-green-8': '#165c26',
'auto-green-9': '#144620',
'auto-yellow-0': '#fffdef',
'auto-yellow-1': '#fffbdd',
'auto-yellow-2': '#fff5b1',
'auto-yellow-3': '#ffea7f',
'auto-yellow-4': '#ffdf5d',
'auto-yellow-5': '#ffd33d',
'auto-yellow-6': '#f9c513',
'auto-yellow-7': '#dbab09',
'auto-yellow-8': '#b08800',
'auto-yellow-9': '#735c0f',
'auto-orange-0': '#fff8f2',
'auto-orange-1': '#ffebda',
'auto-orange-2': '#ffd1ac',
'auto-orange-3': '#ffab70',
'auto-orange-4': '#fb8532',
'auto-orange-5': '#f66a0a',
'auto-orange-6': '#e36209',
'auto-orange-7': '#d15704',
'auto-orange-8': '#c24e00',
'auto-orange-9': '#a04100',
'auto-red-0': '#ffeef0',
'auto-red-1': '#ffdce0',
'auto-red-2': '#fdaeb7',
'auto-red-3': '#f97583',
'auto-red-4': '#ea4a5a',
'auto-red-5': '#d73a49',
'auto-red-6': '#cb2431',
'auto-red-7': '#b31d28',
'auto-red-8': '#9e1c23',
'auto-red-9': '#86181d',
'auto-purple-0': '#f5f0ff',
'auto-purple-1': '#e6dcfd',
'auto-purple-2': '#d1bcf9',
'auto-purple-3': '#b392f0',
'auto-purple-4': '#8a63d2',
'auto-purple-5': '#6f42c1',
'auto-purple-6': '#5a32a3',
'auto-purple-7': '#4c2889',
'auto-purple-8': '#3a1d6e',
'auto-purple-9': '#29134e',
'auto-pink-0': '#ffeef8',
'auto-pink-1': '#fedbf0',
'auto-pink-2': '#f9b3dd',
'auto-pink-3': '#f692ce',
'auto-pink-4': '#ec6cb9',
'auto-pink-5': '#ea4aaa',
'auto-pink-6': '#d03592',
'auto-pink-7': '#b93a86',
'auto-pink-8': '#99306f',
'auto-pink-9': '#6d224f',
'text-primary': '#24292e',
'text-secondary': '#586069',
'text-tertiary': '#6a737d',
'text-placeholder': '#6a737d',
'text-disabled': '#6a737d',
'text-inverse': '#fff',
'text-link': '#0366d6',
'text-danger': '#cb2431',
'text-success': '#22863a',
'text-warning': '#b08800',
'text-white': '#fff',
'icon-primary': '#24292e',
'icon-secondary': '#586069',
'icon-tertiary': '#959da5',
'icon-info': '#0366d6',
'icon-danger': '#d73a49',
'icon-success': '#22863a',
'icon-warning': '#b08800',
'border-primary': '#e1e4e8',
'border-secondary': '#eaecef',
'border-tertiary': '#d1d5da',
'border-overlay': '#e1e4e8',
'border-inverse': '#fff',
'border-info': '#0366d6',
'border-danger': '#d73a49',
'border-success': '#34d058',
'border-warning': '#f9c513',
'bg-canvas': '#fff',
'bg-canvas-mobile': '#fff',
'bg-canvas-inverse': '#24292e',
'bg-canvas-inset': '#f6f8fa',
'bg-primary': '#fff',
'bg-secondary': '#fafbfc',
'bg-tertiary': '#f6f8fa',
'bg-overlay': '#fff',
'bg-backdrop': '#1b1f2380',
'bg-info': '#f1f8ff',
'bg-info-inverse': '#0366d6',
'bg-danger': '#ffeef0',
'bg-danger-inverse': '#d73a49',
'bg-success': '#dcffe4',
'bg-success-inverse': '#28a745',
'bg-warning': '#fff5b1',
'bg-warning-inverse': '#ffd33d',
'shadow-small': '0 1px 0 #1b1f230a',
'shadow-medium': '0 3px 6px #959da526',
'shadow-large': '0 8px 24px #959da533',
'shadow-extra-large': '0 12px 48px #959da54d',
'shadow-highlight': 'inset 0 1px 0 #ffffff40',
'shadow-inset': 'inset 0 1px 0 #e1e4e833',
'state-hover-primary-bg': '#0366d6',
'state-hover-primary-border': '#0366d6',
'state-hover-primary-text': '#fff',
'state-hover-primary-icon': '#fff',
'state-hover-secondary-bg': '#f6f8fa',
'state-hover-secondary-border': '#f6f8fa',
'state-selected-primary-bg': '#0366d6',
'state-selected-primary-border': '#0366d6',
'state-selected-primary-text': '#fff',
'state-selected-primary-icon': '#fff',
'state-focus-border': '#0366d6',
'state-focus-shadow': '0 0 0 3px #0366d64d',
'fade-fg-10': '#1b1f231a',
'fade-fg-15': '#1b1f2326',
'fade-fg-30': '#1b1f234d',
'fade-fg-50': '#1b1f2380',
'fade-fg-70': '#1b1f23b3',
'fade-fg-85': '#1b1f23d9',
'fade-black-10': '#1b1f231a',
'fade-black-15': '#1b1f2326',
'fade-black-30': '#1b1f234d',
'fade-black-50': '#1b1f2380',
'fade-black-70': '#1b1f23b3',
'fade-black-85': '#1b1f23d9',
'fade-white-10': '#ffffff1a',
'fade-white-15': '#ffffff26',
'fade-white-30': '#ffffff4d',
'fade-white-50': '#ffffff80',
'fade-white-70': '#ffffffb3',
'fade-white-85': '#ffffffd9',
'alert-info-text': '#24292e',
'alert-info-icon': '#04428999',
'alert-info-bg': '#dbedff',
'alert-info-border': '#04428933',
'alert-warn-text': '#24292e',
'alert-warn-icon': '#b08800',
'alert-warn-bg': '#fffbdd',
'alert-warn-border': '#b0880033',
'alert-error-text': '#24292e',
'alert-error-icon': '#9e1c2399',
'alert-error-bg': '#ffe3e6',
'alert-error-border': '#9e1c2333',
'alert-success-text': '#24292e',
'alert-success-icon': '#176f2ccc',
'alert-success-bg': '#dcffe4',
'alert-success-border': '#176f2c33',
'autocomplete-shadow': '0 3px 6px #959da526',
'autocomplete-row-border': '#eaecef',
'blankslate-icon': '#a3aab1',
'btn-text': '#24292e',
'btn-bg': '#fafbfc',
'btn-border': '#1b1f2326',
'btn-shadow': '0 1px 0 #1b1f230a',
'btn-inset-shadow': 'inset 0 1px 0 #ffffff40',
'btn-hover-bg': '#f3f4f6',
'btn-hover-border': '#1b1f2326',
'btn-selected-bg': '#edeff2',
'btn-focus-bg': '#fafbfc',
'btn-focus-border': '#1b1f2326',
'btn-focus-shadow': '0 0 0 3px #0366d64d',
'btn-shadow-active': 'inset 0 0.15em 0.3em #1b1f2326',
'btn-shadow-input-focus': '0 0 0 0.2em #0366d64d',
'btn-primary-text': '#fff',
'btn-primary-bg': '#2ea44f',
'btn-primary-border': '#1b1f2326',
'btn-primary-shadow': '0 1px 0 #1b1f231a',
'btn-primary-inset-shadow': 'inset 0 1px 0 #ffffff08',
'btn-primary-hover-bg': '#2c974b',
'btn-primary-hover-border': '#1b1f2326',
'btn-primary-selected-bg': '#2a8f47',
'btn-primary-selected-shadow': 'inset 0 1px 0 #14462033',
'btn-primary-disabled-text': '#fffc',
'btn-primary-disabled-bg': '#94d3a2',
'btn-primary-disabled-border': '#1b1f231a',
'btn-primary-focus-bg': '#2ea44f',
'btn-primary-focus-border': '#1b1f2326',
'btn-primary-focus-shadow': '0 0 0 3px #2ea44f66',
'btn-primary-icon': '#fffc',
'btn-primary-counter-bg': '#fff3',
'btn-outline-text': '#0366d6',
'btn-outline-hover-text': '#fff',
'btn-outline-hover-bg': '#0366d6',
'btn-outline-hover-border': '#1b1f2326',
'btn-outline-hover-shadow': '0 1px 0 #1b1f231a',
'btn-outline-hover-inset-shadow': 'inset 0 1px 0 #ffffff08',
'btn-outline-hover-counter-bg': '#fff3',
'btn-outline-selected-text': '#fff',
'btn-outline-selected-bg': '#035fc7',
'btn-outline-selected-border': '#1b1f2326',
'btn-outline-selected-shadow': 'inset 0 1px 0 #05264c33',
'btn-outline-disabled-text': '#0366d680',
'btn-outline-disabled-bg': '#fafbfc',
'btn-outline-disabled-counter-bg': '#0366d60d',
'btn-outline-focus-border': '#1b1f2326',
'btn-outline-focus-shadow': '0 0 0 3px #005cc566',
'btn-outline-counter-bg': '#0366d61a',
'btn-danger-text': '#d73a49',
'btn-danger-hover-text': '#fff',
'btn-danger-hover-bg': '#cb2431',
'btn-danger-hover-border': '#1b1f2326',
'btn-danger-hover-shadow': '0 1px 0 #1b1f231a',
'btn-danger-hover-inset-shadow': 'inset 0 1px 0 #ffffff08',
'btn-danger-hover-counter-bg': '#fff3',
'btn-danger-selected-text': '#fff',
'btn-danger-selected-bg': '#d42d3d',
'btn-danger-selected-border': '#1b1f2326',
'btn-danger-selected-shadow': 'inset 0 1px 0 #86181d33',
'btn-danger-disabled-text': '#d73a4980',
'btn-danger-disabled-bg': '#fafbfc',
'btn-danger-disabled-counter-bg': '#d73a490d',
'btn-danger-focus-border': '#1b1f2326',
'btn-danger-focus-shadow': '0 0 0 3px #cb243166',
'btn-danger-counter-bg': '#d73a491a',
'btn-counter-bg': '#1b1f2314',
'counter-text': '#24292e',
'counter-bg': '#d1d5da80',
'counter-primary-text': '#fff',
'counter-primary-bg': '#6a737d',
'counter-secondary-text': '#6a737d',
'dropdown-shadow': '0 8px 24px #959da533',
'label-border': '#e1e4e8',
'label-primary-text': '#24292e',
'label-primary-border': '#6a737d',
'label-secondary-text': '#586069',
'label-secondary-border': '#e1e4e8',
'label-info-text': '#0366d6',
'label-info-border': '#0366d6',
'label-success-text': '#22863a',
'label-success-border': '#28a745',
'label-warning-text': '#735c0f',
'label-warning-border': '#b08800',
'label-danger-text': '#d73a49',
'label-danger-border': '#cb2431',
'label-orange-text': '#c24e00',
'label-orange-border': '#f66a0a',
'input-bg': '#fff',
'input-contrast-bg': '#fafbfc',
'input-border': '#e1e4e8',
'input-shadow': 'inset 0 1px 2px #1b1f2313',
'input-disabled-bg': '#fff',
'input-disabled-border': '#e1e4e8',
'input-warning-border': '#f9c513',
'input-error-border': '#cb2431',
'input-tooltip-success-text': '#144620',
'input-tooltip-success-bg': '#dcffe4',
'input-tooltip-success-border': '#34d058',
'input-tooltip-warning-text': '#735c0f',
'input-tooltip-warning-bg': '#fff5b1',
'input-tooltip-warning-border': '#f9c513',
'input-tooltip-error-text': '#86181d',
'input-tooltip-error-bg': '#ffeef0',
'input-tooltip-error-border': '#f97583',
'avatar-bg': '#fff',
'avatar-border': '#0000',
'avatar-stack-fade': '#d1d5da',
'avatar-stack-fade-more': '#e1e4e8',
'avatar-child-shadow': '-2px -2px 0 #fffc',
'toast-text': '#24292e',
'toast-bg': '#fff',
'toast-border': '#e1e4e8',
'toast-shadow': '0 8px 24px #959da533',
'toast-icon': '#fff',
'toast-icon-bg': '#0366d6',
'toast-icon-border': '#0000',
'toast-success-text': '#24292e',
'toast-success-border': '#e1e4e8',
'toast-success-icon': '#fff',
'toast-success-icon-bg': '#28a745',
'toast-success-icon-border': '#0000',
'toast-warning-text': '#24292e',
'toast-warning-border': '#e1e4e8',
'toast-warning-icon': '#24292e',
'toast-warning-icon-bg': '#ffd33d',
'toast-warning-icon-border': '#0000',
'toast-danger-text': '#24292e',
'toast-danger-border': '#e1e4e8',
'toast-danger-icon': '#fff',
'toast-danger-icon-bg': '#d73a49',
'toast-danger-icon-border': '#0000',
'toast-loading-text': '#24292e',
'toast-loading-border': '#e1e4e8',
'toast-loading-icon': '#fff',
'toast-loading-icon-bg': '#586069',
'toast-loading-icon-border': '#0000',
'timeline-text': '#444d56',
'timeline-badge-bg': '#e1e4e8',
'timeline-target-badge-border': '#2188ff',
'timeline-target-badge-shadow': '#c8e1ff',
'select-menu-border-secondary': '#eaecef',
'select-menu-shadow': '0 0 18px #1b1f2366',
'select-menu-backdrop-bg': '#1b1f2380',
'select-menu-backdrop-border': '#0000',
'select-menu-tap-highlight': '#d1d5da80',
'select-menu-tap-focus-bg': '#dbedff',
'box-blue-border': '#c8e1ff',
'box-row-yellow-bg': '#fffbdd',
'box-row-blue-bg': '#f1f8ff',
'box-header-blue-bg': '#f1f8ff',
'box-header-blue-border': '#c8e1ff',
'box-border-info': '#0366d633',
'box-bg-info': '#f1f8ff',
'box-border-warning': '#ffd33d66',
'box-bg-warning': '#fffdef',
'branch-name-text': '#1b1f2399',
'branch-name-icon': '#a8bbd0',
'branch-name-bg': '#eaf5ff',
'branch-name-link-text': '#0366d6',
'branch-name-link-icon': '#a8bbd0',
'branch-name-link-bg': '#eaf5ff',
'markdown-code-bg': '#1b1f230d',
'markdown-frame-border': '#dfe2e5',
'markdown-blockquote-border': '#dfe2e5',
'markdown-table-border': '#dfe2e5',
'markdown-table-tr-border': '#c6cbd1',
'menu-heading-text': '#24292e',
'menu-border-active': '#f9826c',
'menu-bg-active': '#0000',
'sidenav-selected-bg': '#fff',
'sidenav-border-active': '#f9826c',
'header-text': '#ffffffb3',
'header-bg': '#24292e',
'header-logo': '#fff',
'filter-item-bar-bg': '#eff3f6',
'hidden-text-expander-bg': '#dfe2e5',
'hidden-text-expander-bg-hover': '#c6cbd1',
'drag-and-drop-border': '#c3c8cf',
'upload-enabled-border': '#dfe2e5',
'upload-enabled-border-focused': '#4a9eff',
'previewable-comment-form-border': '#c3c8cf',
'underlinenav-border': '#d1d5da00',
'underlinenav-border-hover': '#d1d5da',
'underlinenav-border-active': '#f9826c',
'underlinenav-text': '#24292e',
'underlinenav-text-hover': '#24292e',
'underlinenav-text-active': '#24292e',
'underlinenav-icon': '#959da5',
'underlinenav-icon-hover': '#959da5',
'underlinenav-icon-active': '#24292e',
'underlinenav-counter-text': '#24292e',
'verified-badge-text': '#22863a',
'verified-badge-bg': '#fff',
'verified-badge-border': '#e1e4e8',
'social-count-bg': '#fff',
'tooltip-text': '#fff',
'tooltip-bg': '#24292e',
'header-search-bg': '#24292e',
'header-search-border': '#444d56',
'search-keyword-hl': '#fffbdd',
'diffstat-neutral-bg': '#d1d5da',
'diffstat-neutral-border': '#d1d5da',
'diffstat-deletion-bg': '#d73a49',
'diffstat-deletion-border': '#d73a49',
'diffstat-addition-bg': '#28a745',
'diffstat-addition-border': '#28a745',
'files-explorer-icon': '#79b8ff',
'hl-author-bg': '#f1f8ff',
'hl-author-border': '#c8e1ff',
'logo-subdued': '#d1d5da',
'discussion-border': '#a2cbac',
'discussion-bg-success': '#28a745',
'actions-workflow-table-sticky-bg': '#fffffff2',
'repo-language-color-border': '#1b1f231a',
'code-selection-bg': '#c8e1ff',
'blob-line-highlight-bg': '#fffbdd',
'blob-line-highlight-border': '#0000',
'diff-addition-text': '#22863a',
'diff-addition-bg': '#e6ffed',
'diff-addition-border': '#34d058',
'diff-deletion-text': '#cb2431',
'diff-deletion-bg': '#ffeef0',
'diff-deletion-border': '#d73a49',
'diff-change-text': '#b08800',
'diff-change-bg': '#fff5b1',
'diff-change-border': '#f9c513',
'diff-blob-num-text': '#1b1f234d',
'diff-blob-num-hover-text': '#1b1f2399',
'diff-blob-addition-num-text': '#1b1f234d',
'diff-blob-addition-num-hover-text': '#1b1f2399',
'diff-blob-addition-num-bg': '#cdffd8',
'diff-blob-addition-line-bg': '#e6ffed',
'diff-blob-addition-word-bg': '#acf2bd',
'diff-blob-deletion-num-text': '#1b1f234d',
'diff-blob-deletion-num-hover-text': '#1b1f2399',
'diff-blob-deletion-num-bg': '#ffdce0',
'diff-blob-deletion-line-bg': '#ffeef0',
'diff-blob-deletion-word-bg': '#fdb8c0',
'diff-blob-hunk-text': '#1b1f23b3',
'diff-blob-hunk-num-bg': '#dbedff',
'diff-blob-hunk-line-bg': '#f1f8ff',
'diff-blob-empty-block-bg': '#fafbfc',
'diff-blob-selected-line-highlight-bg': '#ffdf5d33',
'diff-blob-selected-line-highlight-border': '#ffd33d',
'diff-blob-selected-line-highlight-mix-blend-mode': 'multiply',
'diff-blob-expander-icon': '#586069',
'diff-blob-expander-hover-icon': '#fff',
'diff-blob-expander-hover-bg': '#0366d6',
'diff-blob-comment-button-icon': '#fff',
'diff-blob-comment-button-bg': '#0366d6',
'diff-blob-comment-button-gradient-bg': '#0372ef',
'global-nav-logo': '#fff',
'global-nav-bg': '#24292e',
'global-nav-text': '#fff',
'global-nav-icon': '#fff',
'global-nav-input-bg': '#fafbfc',
'global-nav-input-border': '#fafbfc',
'global-nav-input-icon': '#d1d5da',
'global-nav-input-placeholder': '#959da5',
'calendar-graph-day-bg': '#ebedf0',
'calendar-graph-day-border': '#1b1f230f',
'calendar-graph-day-l1-bg': '#9be9a8',
'calendar-graph-day-l2-bg': '#40c463',
'calendar-graph-day-l3-bg': '#30a14e',
'calendar-graph-day-l4-bg': '#216e39',
'calendar-graph-day-l4-border': '#1b1f230f',
'calendar-graph-day-l3-border': '#1b1f230f',
'calendar-graph-day-l2-border': '#1b1f230f',
'calendar-graph-day-l1-border': '#1b1f230f',
'footer-invertocat-octicon': '#d1d5da',
'footer-invertocat-octicon-hover': '#6a737d',
'pr-state-draft-text': '#fff',
'pr-state-draft-bg': '#6a737d',
'pr-state-draft-border': '#0000',
'pr-state-open-text': '#fff',
'pr-state-open-bg': '#28a745',
'pr-state-open-border': '#0000',
'pr-state-merged-text': '#fff',
'pr-state-merged-bg': '#6f42c1',
'pr-state-merged-border': '#0000',
'pr-state-closed-text': '#fff',
'pr-state-closed-bg': '#d73a49',
'pr-state-closed-border': '#0000',
'topic-tag-text': '#0366d6',
'topic-tag-bg': '#f1f8ff',
'topic-tag-hover-bg': '#def',
'topic-tag-active-bg': '#e7f3ff',
'merge-box-success-icon-bg': '#28a745',
'merge-box-success-icon-text': '#fff',
'merge-box-success-icon-border': '#0000',
'merge-box-success-indicator-bg': '#28a745',
'merge-box-success-indicator-border': '#0000',
'merge-box-merged-icon-bg': '#6f42c1',
'merge-box-merged-icon-text': '#fff',
'merge-box-merged-icon-border': '#0000',
'merge-box-merged-box-border': '#6f42c1',
'merge-box-neutral-icon-bg': '#6a737d',
'merge-box-neutral-icon-text': '#fff',
'merge-box-neutral-icon-border': '#0000',
'merge-box-neutral-indicator-bg': '#6a737d',
'merge-box-neutral-indicator-border': '#0000',
'merge-box-warning-icon-bg': '#dbab09',
'merge-box-warning-icon-text': '#fff',
'merge-box-warning-icon-border': '#0000',
'merge-box-warning-box-border': '#ffd33d',
'merge-box-warning-merge-highlight': '#0000',
'merge-box-error-icon-bg': '#d73a49',
'merge-box-error-icon-text': '#fff',
'merge-box-error-icon-border': '#0000',
'merge-box-error-indicator-bg': '#d73a49',
'merge-box-error-indicator-border': '#0000',
'project-card-bg': '#fff',
'project-header-bg': '#24292e',
'project-sidebar-bg': '#fff',
'project-gradient-in': '#fff',
'project-gradient-out': '#fff0',
'marketing-icon-primary': '#2188ff',
'marketing-icon-secondary': '#79b8ff',
'prettylights-syntax-comment': '#6a737d',
'prettylights-syntax-constant': '#005cc5',
'prettylights-syntax-entity': '#6f42c1',
'prettylights-syntax-storage-modifier-import': '#24292e',
'prettylights-syntax-entity-tag': '#22863a',
'prettylights-syntax-keyword': '#d73a49',
'prettylights-syntax-string': '#032f62',
'prettylights-syntax-variable': '#e36209',
'prettylights-syntax-brackethighlighter-unmatched': '#b31d28',
'prettylights-syntax-invalid-illegal-text': '#fafbfc',
'prettylights-syntax-invalid-illegal-bg': '#b31d28',
'prettylights-syntax-carriage-return-text': '#fafbfc',
'prettylights-syntax-carriage-return-bg': '#d73a49',
'prettylights-syntax-string-regexp': '#22863a',
'prettylights-syntax-markup-list': '#735c0f',
'prettylights-syntax-markup-heading': '#005cc5',
'prettylights-syntax-markup-italic': '#24292e',
'prettylights-syntax-markup-bold': '#24292e',
'prettylights-syntax-markup-deleted-text': '#b31d28',
'prettylights-syntax-markup-deleted-bg': '#ffeef0',
'prettylights-syntax-markup-inserted-text': '#22863a',
'prettylights-syntax-markup-inserted-bg': '#f0fff4',
'prettylights-syntax-markup-changed-text': '#e36209',
'prettylights-syntax-markup-changed-bg': '#ffebda',
'prettylights-syntax-markup-ignored-text': '#f6f8fa',
'prettylights-syntax-markup-ignored-bg': '#005cc5',
'prettylights-syntax-meta-diff-range': '#6f42c1',
'prettylights-syntax-brackethighlighter-angle': '#586069',
'prettylights-syntax-sublimelinter-gutter-mark': '#959da5',
'prettylights-syntax-constant-other-reference-link': '#032f62',
'codemirror-text': '#24292e',
'codemirror-bg': '#fff',
'codemirror-gutters-bg': '#fff',
'codemirror-guttermarker-text': '#fff',
'codemirror-guttermarker-subtle-text': '#d1d5da',
'codemirror-linenumber-text': '#959da5',
'codemirror-cursor': '#24292e',
'codemirror-selection-bg': '#c8e1ff',
'codemirror-activeline-bg': '#fafbfc',
'codemirror-matchingbracket-text': '#24292e',
'codemirror-lines-bg': '#fff',
'codemirror-syntax-comment': '#6a737d',
'codemirror-syntax-constant': '#005cc5',
'codemirror-syntax-entity': '#6f42c1',
'codemirror-syntax-keyword': '#d73a49',
'codemirror-syntax-storage': '#d73a49',
'codemirror-syntax-string': '#032f62',
'codemirror-syntax-support': '#005cc5',
'codemirror-syntax-variable': '#e36209',
'ansi-black': '#24292e',
'ansi-black-bright': '#2f363d',
'ansi-white': '#e1e4e8',
'ansi-white-bright': '#e1e4e8',
'ansi-gray': '#959da5',
'ansi-red': '#f97583',
'ansi-red-bright': '#fdaeb7',
'ansi-green': '#85e89d',
'ansi-green-bright': '#bef5cb',
'ansi-yellow': '#ffea7f',
'ansi-yellow-bright': '#fff5b1',
'ansi-blue': '#79b8ff',
'ansi-blue-bright': '#c8e1ff',
'ansi-magenta': '#b392f0',
'ansi-magenta-bright': '#d1bcf9',
'ansi-cyan': '#76e3ea',
'ansi-cyan-bright': '#b3f0ff',
);

View file

@ -1,6 +1,10 @@
@use './light/variables.scss' as light;
@use './dark/variables.scss' as dark;
@use './darkDimmed/variables.scss' as darkDimmed;
@use './themes/light.scss' as light;
@use './themes/dark.scss' as dark;
@use './themes/lightHighContrast.scss' as lightHighContrast;
@use './themes/darkHighContrast.scss' as darkHighContrast;
@use './themes/lightColorblind.scss' as lightColorblind;
@use './themes/darkColorblind.scss' as darkColorblind;
@use './themes/darkDimmed.scss' as darkDimmed;
@mixin setVariables($variables) {
@each $name, $value in $variables {
@ -8,57 +12,45 @@
}
}
// Following rules are organized according to common variables to reduce output CSS size
:root {
// default, e.g. when not login
@include setVariables(light.$variables);
// mapping 'canvas' to 'bg', this should be removed once GitHub exposes 'bg' colors
--gitako-bg-default-transparent: var(--gitako-canvas-default-transparent);
--gitako-bg-default: var(--gitako-canvas-default);
--gitako-bg-inset: var(--gitako-canvas-inset);
--gitako-bg-overlay: var(--gitako-canvas-overlay);
--gitako-bg-subtle: var(--gitako-canvas-subtle);
}
:root {
&[data-color-mode='light'][data-light-theme='light'],
&[data-color-mode='dark'][data-dark-theme='light'] {
@include setVariables(light.$variables);
}
&[data-color-mode='light'][data-light-theme='dark'],
&[data-color-mode='dark'][data-dark-theme='dark'] {
@include setVariables(dark.$variables);
}
&[data-color-mode='light'][data-light-theme='dark_dimmed'],
&[data-color-mode='dark'][data-dark-theme='dark_dimmed'] {
@include setVariables(darkDimmed.$variables);
}
}
@media (prefers-color-scheme: light) {
:root[data-color-mode='auto'] {
&[data-light-theme='light'] {
@include setVariables(light.$variables);
@mixin theme($themeName, $variables) {
:root {
&[data-color-mode='light'][data-light-theme='#{$themeName}'],
&[data-color-mode='dark'][data-dark-theme='#{$themeName}'] {
@include setVariables($variables);
}
&[data-light-theme='dark'] {
@include setVariables(dark.$variables);
}
&[data-color-mode='auto'] {
&[data-light-theme='#{$themeName}'] {
@media (prefers-color-scheme: light) {
@include setVariables($variables);
}
}
&[data-light-theme='dark_dimmed'] {
@include setVariables(darkDimmed.$variables);
&[data-dark-theme='#{$themeName}'] {
@media (prefers-color-scheme: dark) {
@include setVariables($variables);
}
}
}
}
}
@media (prefers-color-scheme: dark) {
:root[data-color-mode='auto'] {
&[data-dark-theme='light'] {
@include setVariables(light.$variables);
}
&[data-dark-theme='dark'] {
@include setVariables(dark.$variables);
}
&[data-dark-theme='dark_dimmed'] {
@include setVariables(darkDimmed.$variables);
}
}
}
@include theme('light', light.$variables);
@include theme('dark', dark.$variables);
@include theme('light_high_contrast', lightHighContrast.$variables);
@include theme('dark_high_contrast', darkHighContrast.$variables);
@include theme('light_colorblind', lightColorblind.$variables);
@include theme('dark_colorblind', darkColorblind.$variables);
@include theme('dark_dimmed', darkDimmed.$variables);

418
src/styles/themes/dark.scss Normal file
View file

@ -0,0 +1,418 @@
$variables: (
'accent-emphasis': '#1f6feb',
'accent-fg': '#58a6ff',
'accent-muted': 'rgba(56,139,253,0.4)',
'accent-subtle': 'rgba(56,139,253,0.15)',
'action-list-item-danger-active-bg': 'rgba(248,81,73,0.24)',
'action-list-item-danger-hover-bg': 'rgba(248,81,73,0.16)',
'action-list-item-danger-hover-text': '#ff7b72',
'action-list-item-default-active-bg': 'rgba(177,186,196,0.2)',
'action-list-item-default-hover-bg': 'rgba(177,186,196,0.12)',
'action-list-item-default-selected-bg': 'rgba(177,186,196,0.08)',
'action-list-item-inline-divider': 'rgba(48,54,61,0.48)',
'ansi-black-bright': '#6e7681',
'ansi-black': '#484f58',
'ansi-blue-bright': '#79c0ff',
'ansi-blue': '#58a6ff',
'ansi-cyan-bright': '#56d4dd',
'ansi-cyan': '#39c5cf',
'ansi-gray': '#6e7681',
'ansi-green-bright': '#56d364',
'ansi-green': '#3fb950',
'ansi-magenta-bright': '#d2a8ff',
'ansi-magenta': '#bc8cff',
'ansi-red-bright': '#ffa198',
'ansi-red': '#ff7b72',
'ansi-white-bright': '#f0f6fc',
'ansi-white': '#b1bac4',
'ansi-yellow-bright': '#e3b341',
'ansi-yellow': '#d29922',
'attention-emphasis': '#9e6a03',
'attention-fg': '#d29922',
'attention-muted': 'rgba(187,128,9,0.4)',
'attention-subtle': 'rgba(187,128,9,0.15)',
'avatar-bg': 'rgba(240,246,252,0.1)',
'avatar-border': 'rgba(240,246,252,0.1)',
'avatar-child-shadow': '-2px -2px 0 #0d1117',
'avatar-stack-fade-more': '#21262d',
'avatar-stack-fade': '#30363d',
'border-default': '#30363d',
'border-muted': '#21262d',
'border-subtle': 'rgba(240,246,252,0.1)',
'btn-active-bg': 'hsla(212,12%,18%,1)',
'btn-active-border': '#6e7681',
'btn-bg': '#21262d',
'btn-border': 'rgba(240,246,252,0.1)',
'btn-counter-bg': '#30363d',
'btn-danger-counter-bg': 'rgba(218,54,51,0.1)',
'btn-danger-disabled-bg': '#0d1117',
'btn-danger-disabled-counter-bg': 'rgba(218,54,51,0.05)',
'btn-danger-disabled-text': 'rgba(248,81,73,0.5)',
'btn-danger-focus-border': '#f85149',
'btn-danger-focus-shadow': '0 0 0 3px rgba(248,81,73,0.4)',
'btn-danger-hover-bg': '#da3633',
'btn-danger-hover-border': '#f85149',
'btn-danger-hover-counter-bg': 'rgba(255,255,255,0.2)',
'btn-danger-hover-icon': '#f0f6fc',
'btn-danger-hover-inset-shadow': '0 0 transparent',
'btn-danger-hover-shadow': '0 0 transparent',
'btn-danger-hover-text': '#f0f6fc',
'btn-danger-icon': '#f85149',
'btn-danger-selected-bg': '#b62324',
'btn-danger-selected-border': '#ff7b72',
'btn-danger-selected-shadow': '0 0 transparent',
'btn-danger-selected-text': '#ffffff',
'btn-danger-text': '#f85149',
'btn-focus-bg': '#21262d',
'btn-focus-border': '#8b949e',
'btn-focus-shadow': '0 0 0 3px rgba(139,148,158,0.3)',
'btn-hover-bg': '#30363d',
'btn-hover-border': '#8b949e',
'btn-inset-shadow': '0 0 transparent',
'btn-outline-counter-bg': 'rgba(31,111,235,0.1)',
'btn-outline-disabled-bg': '#0d1117',
'btn-outline-disabled-counter-bg': 'rgba(31,111,235,0.05)',
'btn-outline-disabled-text': 'rgba(88,166,255,0.5)',
'btn-outline-focus-border': 'rgba(240,246,252,0.1)',
'btn-outline-focus-shadow': '0 0 0 3px rgba(17,88,199,0.4)',
'btn-outline-hover-bg': '#30363d',
'btn-outline-hover-border': 'rgba(240,246,252,0.1)',
'btn-outline-hover-counter-bg': 'rgba(240,246,252,0.2)',
'btn-outline-hover-inset-shadow': 'inset 0 1px 0 rgba(240,246,252,0.03)',
'btn-outline-hover-shadow': '0 1px 0 rgba(1,4,9,0.1)',
'btn-outline-hover-text': '#58a6ff',
'btn-outline-selected-bg': '#0d419d',
'btn-outline-selected-border': 'rgba(240,246,252,0.1)',
'btn-outline-selected-shadow': '0 0 transparent',
'btn-outline-selected-text': '#f0f6fc',
'btn-outline-text': '#58a6ff',
'btn-primary-bg': '#238636',
'btn-primary-border': 'rgba(240,246,252,0.1)',
'btn-primary-counter-bg': 'rgba(240,246,252,0.2)',
'btn-primary-disabled-bg': 'rgba(35,134,54,0.6)',
'btn-primary-disabled-border': 'rgba(240,246,252,0.1)',
'btn-primary-disabled-text': 'rgba(240,246,252,0.5)',
'btn-primary-focus-bg': '#238636',
'btn-primary-focus-border': 'rgba(240,246,252,0.1)',
'btn-primary-focus-shadow': '0 0 0 3px rgba(46,164,79,0.4)',
'btn-primary-hover-bg': '#2ea043',
'btn-primary-hover-border': 'rgba(240,246,252,0.1)',
'btn-primary-icon': '#f0f6fc',
'btn-primary-inset-shadow': '0 0 transparent',
'btn-primary-selected-bg': '#238636',
'btn-primary-selected-shadow': '0 0 transparent',
'btn-primary-shadow': '0 0 transparent',
'btn-primary-text': '#ffffff',
'btn-selected-bg': '#161b22',
'btn-shadow-active': 'inset 0 0.15em 0.3em rgba(1,4,9,0.15)',
'btn-shadow-input-focus': '0 0 0 0.2em rgba(31,111,235,0.3)',
'btn-shadow': '0 0 transparent',
'btn-text': '#c9d1d9',
'canvas-default-transparent': 'rgba(13,17,23,0)',
'canvas-default': '#0d1117',
'canvas-inset': '#010409',
'canvas-overlay': '#161b22',
'canvas-subtle': '#161b22',
'checks-ansi-black-bright': '#161b22',
'checks-ansi-black': '#0d1117',
'checks-ansi-blue-bright': '#79c0ff',
'checks-ansi-blue': '#58a6ff',
'checks-ansi-cyan-bright': '#b3f0ff',
'checks-ansi-cyan': '#76e3ea',
'checks-ansi-gray': '#6e7681',
'checks-ansi-green-bright': '#56d364',
'checks-ansi-green': '#3fb950',
'checks-ansi-magenta-bright': '#d2a8ff',
'checks-ansi-magenta': '#bc8cff',
'checks-ansi-red-bright': '#ffa198',
'checks-ansi-red': '#ff7b72',
'checks-ansi-white-bright': '#b1bac4',
'checks-ansi-white': '#b1bac4',
'checks-ansi-yellow-bright': '#e3b341',
'checks-ansi-yellow': '#d29922',
'checks-bg': '#010409',
'checks-btn-hover-bg': 'rgba(110,118,129,0.1)',
'checks-btn-hover-icon': '#c9d1d9',
'checks-btn-icon': '#8b949e',
'checks-container-border-width': '1px',
'checks-donut-error': '#f85149',
'checks-donut-neutral': '#8b949e',
'checks-donut-pending': '#d29922',
'checks-donut-success': '#2ea043',
'checks-dropdown-bg': '#161b22',
'checks-dropdown-border': '#30363d',
'checks-dropdown-btn-hover-bg': 'rgba(110,118,129,0.1)',
'checks-dropdown-btn-hover-text': '#c9d1d9',
'checks-dropdown-hover-bg': 'rgba(110,118,129,0.1)',
'checks-dropdown-hover-text': '#c9d1d9',
'checks-dropdown-shadow': 'rgba(1,4,9,0.3)',
'checks-dropdown-text': '#c9d1d9',
'checks-gate-bg': 'rgba(187,128,9,0.15)',
'checks-gate-text': '#8b949e',
'checks-gate-waiting-text': '#d29922',
'checks-header-border': '#21262d',
'checks-header-icon': '#8b949e',
'checks-header-label-open-text': '#c9d1d9',
'checks-header-label-text': '#8b949e',
'checks-input-bg': '#161b22',
'checks-input-focus-text': '#c9d1d9',
'checks-input-placeholder-text': '#484f58',
'checks-input-shadow': '0 0 0 1px (obj) => get_1.default(obj, path)',
'checks-input-text': '#8b949e',
'checks-line-dt-fm-bg': '#9e6a03',
'checks-line-dt-fm-text': '#f0f6fc',
'checks-line-hover-bg': 'rgba(110,118,129,0.1)',
'checks-line-num-text': '#484f58',
'checks-line-selected-bg': 'rgba(56,139,253,0.15)',
'checks-line-selected-num-text': '#58a6ff',
'checks-line-text': '#8b949e',
'checks-line-timestamp-text': '#484f58',
'checks-logline-command-text': '#58a6ff',
'checks-logline-debug-text': '#a371f7',
'checks-logline-error-bg': 'rgba(248,81,73,0.15)',
'checks-logline-error-num-text': '#484f58',
'checks-logline-error-text': '#8b949e',
'checks-logline-num-text': '#484f58',
'checks-logline-section-text': '#3fb950',
'checks-logline-text': '#8b949e',
'checks-logline-warning-bg': 'rgba(187,128,9,0.15)',
'checks-logline-warning-num-text': '#d29922',
'checks-logline-warning-text': '#8b949e',
'checks-run-border-width': '1px',
'checks-scrollbar-thumb-bg': 'rgba(110,118,129,0.4)',
'checks-step-error-text': '#f85149',
'checks-step-header-open-bg': '#161b22',
'checks-step-warning-text': '#d29922',
'checks-text-link': '#58a6ff',
'checks-text-primary': '#c9d1d9',
'checks-text-secondary': '#8b949e',
'codemirror-activeline-bg': 'rgba(110,118,129,0.1)',
'codemirror-bg': '#0d1117',
'codemirror-cursor': '#c9d1d9',
'codemirror-guttermarker-subtle-text': '#484f58',
'codemirror-guttermarker-text': '#0d1117',
'codemirror-gutters-bg': '#0d1117',
'codemirror-linenumber-text': '#8b949e',
'codemirror-lines-bg': '#0d1117',
'codemirror-matchingbracket-text': '#c9d1d9',
'codemirror-selection-bg': 'rgba(56,139,253,0.4)',
'codemirror-syntax-comment': '#8b949e',
'codemirror-syntax-constant': '#79c0ff',
'codemirror-syntax-entity': '#d2a8ff',
'codemirror-syntax-keyword': '#ff7b72',
'codemirror-syntax-storage': '#ff7b72',
'codemirror-syntax-string': '#a5d6ff',
'codemirror-syntax-support': '#79c0ff',
'codemirror-syntax-variable': '#ffa657',
'codemirror-text': '#c9d1d9',
'counter-border': 'rgba(0,0,0,0)',
'danger-emphasis': '#da3633',
'danger-fg': '#f85149',
'danger-muted': 'rgba(248,81,73,0.4)',
'danger-subtle': 'rgba(248,81,73,0.15)',
'diff-blob-addition-fg': '#c9d1d9',
'diff-blob-addition-line-bg': 'rgba(46,160,67,0.15)',
'diff-blob-addition-num-bg': 'rgba(63,185,80,0.3)',
'diff-blob-addition-num-text': '#c9d1d9',
'diff-blob-addition-word-bg': 'rgba(46,160,67,0.4)',
'diff-blob-deletion-fg': '#c9d1d9',
'diff-blob-deletion-line-bg': 'rgba(248,81,73,0.15)',
'diff-blob-deletion-num-bg': 'rgba(248,81,73,0.3)',
'diff-blob-deletion-num-text': '#c9d1d9',
'diff-blob-deletion-word-bg': 'rgba(248,81,73,0.4)',
'diff-blob-expander-icon': '#8b949e',
'diff-blob-hunk-num-bg': 'rgba(56,139,253,0.4)',
'diff-blob-selected-line-highlight-mix-blend-mode': 'screen',
'diffstat-addition-bg': '#3fb950',
'diffstat-addition-border': 'rgba(240,246,252,0.1)',
'diffstat-deletion-border': 'rgba(240,246,252,0.1)',
'done-emphasis': '#8957e5',
'done-fg': '#a371f7',
'done-muted': 'rgba(163,113,247,0.4)',
'done-subtle': 'rgba(163,113,247,0.15)',
'fg-default': '#c9d1d9',
'fg-muted': '#8b949e',
'fg-on-emphasis': '#f0f6fc',
'fg-subtle': '#484f58',
'header-bg': '#161b22',
'header-divider': '#8b949e',
'header-logo': '#f0f6fc',
'header-search-bg': '#0d1117',
'header-search-border': '#30363d',
'header-text': 'rgba(240,246,252,0.7)',
'input-disabled-bg': 'rgba(110,118,129,0)',
'marketing-icon-primary': '#79c0ff',
'marketing-icon-secondary': '#1f6feb',
'menu-bg-active': '#161b22',
'mktg-btn-bg': '#f6f8fa',
'mktg-btn-shadow-focus': 'rgb(255 255 255 / 25%) 0 0 0 4px',
'mktg-btn-shadow-hover-muted': 'rgb(255 255 255) 0 0 0 2px inset',
'mktg-btn-shadow-hover':
'0 4px 7px rgba(0, 0, 0, 0.15), 0 100px 80px rgba(255, 255, 255, 0.02), 0 42px 33px rgba(255, 255, 255, 0.024), 0 22px 18px rgba(255, 255, 255, 0.028), 0 12px 10px rgba(255, 255, 255, 0.034), 0 7px 5px rgba(255, 255, 255, 0.04), 0 3px 2px rgba(255, 255, 255, 0.07)',
'mktg-btn-shadow-outline': 'rgb(255 255 255 / 25%) 0 0 0 1px inset',
'neutral-emphasis-plus': '#6e7681',
'neutral-emphasis': '#6e7681',
'neutral-muted': 'rgba(110,118,129,0.4)',
'neutral-subtle': 'rgba(110,118,129,0.1)',
'overlay-shadow': '0 0 0 1px #30363d, 0 16px 32px rgba(1,4,9,0.85)',
'page-header-bg': '#0d1117',
'prettylights-syntax-brackethighlighter-angle': '#8b949e',
'prettylights-syntax-brackethighlighter-unmatched': '#f85149',
'prettylights-syntax-carriage-return-bg': '#b62324',
'prettylights-syntax-carriage-return-text': '#f0f6fc',
'prettylights-syntax-comment': '#8b949e',
'prettylights-syntax-constant-other-reference-link': '#a5d6ff',
'prettylights-syntax-constant': '#79c0ff',
'prettylights-syntax-entity-tag': '#7ee787',
'prettylights-syntax-entity': '#d2a8ff',
'prettylights-syntax-invalid-illegal-bg': '#8e1519',
'prettylights-syntax-invalid-illegal-text': '#f0f6fc',
'prettylights-syntax-keyword': '#ff7b72',
'prettylights-syntax-markup-bold': '#c9d1d9',
'prettylights-syntax-markup-changed-bg': '#5a1e02',
'prettylights-syntax-markup-changed-text': '#ffdfb6',
'prettylights-syntax-markup-deleted-bg': '#67060c',
'prettylights-syntax-markup-deleted-text': '#ffdcd7',
'prettylights-syntax-markup-heading': '#1f6feb',
'prettylights-syntax-markup-ignored-bg': '#1158c7',
'prettylights-syntax-markup-ignored-text': '#c9d1d9',
'prettylights-syntax-markup-inserted-bg': '#033a16',
'prettylights-syntax-markup-inserted-text': '#aff5b4',
'prettylights-syntax-markup-italic': '#c9d1d9',
'prettylights-syntax-markup-list': '#f2cc60',
'prettylights-syntax-meta-diff-range': '#d2a8ff',
'prettylights-syntax-storage-modifier-import': '#c9d1d9',
'prettylights-syntax-string-regexp': '#7ee787',
'prettylights-syntax-string': '#a5d6ff',
'prettylights-syntax-sublimelinter-gutter-mark': '#484f58',
'prettylights-syntax-variable': '#ffa657',
'primer-border-active': '#F78166',
'primer-border-contrast': 'rgba(240,246,252,0.2)',
'primer-canvas-backdrop': 'rgba(1,4,9,0.8)',
'primer-canvas-sticky': 'rgba(13,17,23,0.95)',
'primer-fg-disabled': '#484f58',
'primer-shadow-focus': '0 0 0 3px #0c2d6b',
'primer-shadow-highlight': '0 0 transparent',
'primer-shadow-inset': '0 0 transparent',
'project-gradient-in': '#161b22',
'project-gradient-out': 'rgba(22,27,34,0)',
'project-header-bg': '#0d1117',
'project-sidebar-bg': '#161b22',
'scale-black': '#010409',
'scale-blue-0': '#cae8ff',
'scale-blue-1': '#a5d6ff',
'scale-blue-2': '#79c0ff',
'scale-blue-3': '#58a6ff',
'scale-blue-4': '#388bfd',
'scale-blue-5': '#1f6feb',
'scale-blue-6': '#1158c7',
'scale-blue-7': '#0d419d',
'scale-blue-8': '#0c2d6b',
'scale-blue-9': '#051d4d',
'scale-coral-0': '#FFDDD2',
'scale-coral-1': '#FFC2B2',
'scale-coral-2': '#FFA28B',
'scale-coral-3': '#F78166',
'scale-coral-4': '#EA6045',
'scale-coral-5': '#CF462D',
'scale-coral-6': '#AC3220',
'scale-coral-7': '#872012',
'scale-coral-8': '#640D04',
'scale-coral-9': '#460701',
'scale-gray-0': '#f0f6fc',
'scale-gray-1': '#c9d1d9',
'scale-gray-2': '#b1bac4',
'scale-gray-3': '#8b949e',
'scale-gray-4': '#6e7681',
'scale-gray-5': '#484f58',
'scale-gray-6': '#30363d',
'scale-gray-7': '#21262d',
'scale-gray-8': '#161b22',
'scale-gray-9': '#0d1117',
'scale-green-0': '#aff5b4',
'scale-green-1': '#7ee787',
'scale-green-2': '#56d364',
'scale-green-3': '#3fb950',
'scale-green-4': '#2ea043',
'scale-green-5': '#238636',
'scale-green-6': '#196c2e',
'scale-green-7': '#0f5323',
'scale-green-8': '#033a16',
'scale-green-9': '#04260f',
'scale-orange-0': '#ffdfb6',
'scale-orange-1': '#ffc680',
'scale-orange-2': '#ffa657',
'scale-orange-3': '#f0883e',
'scale-orange-4': '#db6d28',
'scale-orange-5': '#bd561d',
'scale-orange-6': '#9b4215',
'scale-orange-7': '#762d0a',
'scale-orange-8': '#5a1e02',
'scale-orange-9': '#3d1300',
'scale-pink-0': '#ffdaec',
'scale-pink-1': '#ffbedd',
'scale-pink-2': '#ff9bce',
'scale-pink-3': '#f778ba',
'scale-pink-4': '#db61a2',
'scale-pink-5': '#bf4b8a',
'scale-pink-6': '#9e3670',
'scale-pink-7': '#7d2457',
'scale-pink-8': '#5e103e',
'scale-pink-9': '#42062a',
'scale-purple-0': '#eddeff',
'scale-purple-1': '#e2c5ff',
'scale-purple-2': '#d2a8ff',
'scale-purple-3': '#bc8cff',
'scale-purple-4': '#a371f7',
'scale-purple-5': '#8957e5',
'scale-purple-6': '#6e40c9',
'scale-purple-7': '#553098',
'scale-purple-8': '#3c1e70',
'scale-purple-9': '#271052',
'scale-red-0': '#ffdcd7',
'scale-red-1': '#ffc1ba',
'scale-red-2': '#ffa198',
'scale-red-3': '#ff7b72',
'scale-red-4': '#f85149',
'scale-red-5': '#da3633',
'scale-red-6': '#b62324',
'scale-red-7': '#8e1519',
'scale-red-8': '#67060c',
'scale-red-9': '#490202',
'scale-white': '#f0f6fc',
'scale-yellow-0': '#f8e3a1',
'scale-yellow-1': '#f2cc60',
'scale-yellow-2': '#e3b341',
'scale-yellow-3': '#d29922',
'scale-yellow-4': '#bb8009',
'scale-yellow-5': '#9e6a03',
'scale-yellow-6': '#845306',
'scale-yellow-7': '#693e00',
'scale-yellow-8': '#4b2900',
'scale-yellow-9': '#341a00',
'search-keyword-hl': 'rgba(210,153,34,0.4)',
'select-menu-backdrop-border': '#484f58',
'select-menu-tap-focus-bg': '#0c2d6b',
'select-menu-tap-highlight': 'rgba(48,54,61,0.5)',
'severe-emphasis': '#bd561d',
'severe-fg': '#db6d28',
'severe-muted': 'rgba(219,109,40,0.4)',
'severe-subtle': 'rgba(219,109,40,0.15)',
'shadow-extra-large': '0 12px 48px #010409',
'shadow-large': '0 8px 24px #010409',
'shadow-medium': '0 3px 6px #010409',
'shadow-small': '0 0 transparent',
'sidenav-selected-bg': '#21262d',
'sponsors-emphasis': '#bf4b8a',
'sponsors-fg': '#db61a2',
'sponsors-muted': 'rgba(219,97,162,0.4)',
'sponsors-subtle': 'rgba(219,97,162,0.15)',
'success-emphasis': '#238636',
'success-fg': '#3fb950',
'success-muted': 'rgba(46,160,67,0.4)',
'success-subtle': 'rgba(46,160,67,0.15)',
'timeline-badge-bg': '#21262d',
'topic-tag-border': 'rgba(0,0,0,0)',
'underlinenav-border-hover': 'rgba(110,118,129,0.4)',
'underlinenav-icon': '#484f58',
);

View file

@ -0,0 +1,418 @@
$variables: (
'accent-emphasis': '#1f6feb',
'accent-fg': '#58a6ff',
'accent-muted': 'rgba(56,139,253,0.4)',
'accent-subtle': 'rgba(56,139,253,0.15)',
'action-list-item-danger-active-bg': 'rgba(195,128,0,0.24)',
'action-list-item-danger-hover-bg': 'rgba(195,128,0,0.16)',
'action-list-item-danger-hover-text': '#d69a00',
'action-list-item-default-active-bg': 'rgba(177,186,196,0.2)',
'action-list-item-default-hover-bg': 'rgba(177,186,196,0.12)',
'action-list-item-default-selected-bg': 'rgba(177,186,196,0.08)',
'action-list-item-inline-divider': 'rgba(48,54,61,0.48)',
'ansi-black-bright': '#6e7681',
'ansi-black': '#484f58',
'ansi-blue-bright': '#79c0ff',
'ansi-blue': '#58a6ff',
'ansi-cyan-bright': '#56d4dd',
'ansi-cyan': '#39c5cf',
'ansi-gray': '#6e7681',
'ansi-green-bright': '#66baff',
'ansi-green': '#42a0ff',
'ansi-magenta-bright': '#d2a8ff',
'ansi-magenta': '#bc8cff',
'ansi-red-bright': '#e6b716',
'ansi-red': '#d69a00',
'ansi-white-bright': '#f0f6fc',
'ansi-white': '#b1bac4',
'ansi-yellow-bright': '#e3b341',
'ansi-yellow': '#d29922',
'attention-emphasis': '#9e6a03',
'attention-fg': '#d29922',
'attention-muted': 'rgba(187,128,9,0.4)',
'attention-subtle': 'rgba(187,128,9,0.15)',
'avatar-bg': 'rgba(240,246,252,0.1)',
'avatar-border': 'rgba(240,246,252,0.1)',
'avatar-child-shadow': '-2px -2px 0 #0d1117',
'avatar-stack-fade-more': '#21262d',
'avatar-stack-fade': '#30363d',
'border-default': '#30363d',
'border-muted': '#21262d',
'border-subtle': 'rgba(240,246,252,0.1)',
'btn-active-bg': 'hsla(212,12%,18%,1)',
'btn-active-border': '#6e7681',
'btn-bg': '#21262d',
'btn-border': 'rgba(240,246,252,0.1)',
'btn-counter-bg': '#30363d',
'btn-danger-counter-bg': 'rgba(166,105,0,0.1)',
'btn-danger-disabled-bg': '#0d1117',
'btn-danger-disabled-counter-bg': 'rgba(166,105,0,0.05)',
'btn-danger-disabled-text': 'rgba(195,128,0,0.5)',
'btn-danger-focus-border': '#c38000',
'btn-danger-focus-shadow': '0 0 0 3px rgba(195,128,0,0.4)',
'btn-danger-hover-bg': '#a66900',
'btn-danger-hover-border': '#c38000',
'btn-danger-hover-counter-bg': 'rgba(255,255,255,0.2)',
'btn-danger-hover-icon': '#f0f6fc',
'btn-danger-hover-inset-shadow': '0 0 transparent',
'btn-danger-hover-shadow': '0 0 transparent',
'btn-danger-hover-text': '#f0f6fc',
'btn-danger-icon': '#c38000',
'btn-danger-selected-bg': '#865401',
'btn-danger-selected-border': '#d69a00',
'btn-danger-selected-shadow': '0 0 transparent',
'btn-danger-selected-text': '#ffffff',
'btn-danger-text': '#c38000',
'btn-focus-bg': '#21262d',
'btn-focus-border': '#8b949e',
'btn-focus-shadow': '0 0 0 3px rgba(139,148,158,0.3)',
'btn-hover-bg': '#30363d',
'btn-hover-border': '#8b949e',
'btn-inset-shadow': '0 0 transparent',
'btn-outline-counter-bg': 'rgba(31,111,235,0.1)',
'btn-outline-disabled-bg': '#0d1117',
'btn-outline-disabled-counter-bg': 'rgba(31,111,235,0.05)',
'btn-outline-disabled-text': 'rgba(88,166,255,0.5)',
'btn-outline-focus-border': 'rgba(240,246,252,0.1)',
'btn-outline-focus-shadow': '0 0 0 3px rgba(17,88,199,0.4)',
'btn-outline-hover-bg': '#30363d',
'btn-outline-hover-border': 'rgba(240,246,252,0.1)',
'btn-outline-hover-counter-bg': 'rgba(240,246,252,0.2)',
'btn-outline-hover-inset-shadow': 'inset 0 1px 0 rgba(240,246,252,0.03)',
'btn-outline-hover-shadow': '0 1px 0 rgba(1,4,9,0.1)',
'btn-outline-hover-text': '#58a6ff',
'btn-outline-selected-bg': '#0d419d',
'btn-outline-selected-border': 'rgba(240,246,252,0.1)',
'btn-outline-selected-shadow': '0 0 transparent',
'btn-outline-selected-text': '#f0f6fc',
'btn-outline-text': '#58a6ff',
'btn-primary-bg': '#1d69e0',
'btn-primary-border': 'rgba(240,246,252,0.1)',
'btn-primary-counter-bg': 'rgba(240,246,252,0.2)',
'btn-primary-disabled-bg': 'rgba(29,105,224,0.6)',
'btn-primary-disabled-border': 'rgba(240,246,252,0.1)',
'btn-primary-disabled-text': 'rgba(240,246,252,0.5)',
'btn-primary-focus-bg': '#1d69e0',
'btn-primary-focus-border': 'rgba(240,246,252,0.1)',
'btn-primary-focus-shadow': '0 0 0 3px rgba(46,164,79,0.4)',
'btn-primary-hover-bg': '#1585fd',
'btn-primary-hover-border': 'rgba(240,246,252,0.1)',
'btn-primary-icon': '#f0f6fc',
'btn-primary-inset-shadow': '0 0 transparent',
'btn-primary-selected-bg': '#1d69e0',
'btn-primary-selected-shadow': '0 0 transparent',
'btn-primary-shadow': '0 0 transparent',
'btn-primary-text': '#ffffff',
'btn-selected-bg': '#161b22',
'btn-shadow-active': 'inset 0 0.15em 0.3em rgba(1,4,9,0.15)',
'btn-shadow-input-focus': '0 0 0 0.2em rgba(31,111,235,0.3)',
'btn-shadow': '0 0 transparent',
'btn-text': '#c9d1d9',
'canvas-default-transparent': 'rgba(13,17,23,0)',
'canvas-default': '#0d1117',
'canvas-inset': '#010409',
'canvas-overlay': '#161b22',
'canvas-subtle': '#161b22',
'checks-ansi-black-bright': '#161b22',
'checks-ansi-black': '#0d1117',
'checks-ansi-blue-bright': '#79c0ff',
'checks-ansi-blue': '#58a6ff',
'checks-ansi-cyan-bright': '#b3f0ff',
'checks-ansi-cyan': '#76e3ea',
'checks-ansi-gray': '#6e7681',
'checks-ansi-green-bright': '#66baff',
'checks-ansi-green': '#42a0ff',
'checks-ansi-magenta-bright': '#d2a8ff',
'checks-ansi-magenta': '#bc8cff',
'checks-ansi-red-bright': '#e6b716',
'checks-ansi-red': '#d69a00',
'checks-ansi-white-bright': '#b1bac4',
'checks-ansi-white': '#b1bac4',
'checks-ansi-yellow-bright': '#e3b341',
'checks-ansi-yellow': '#d29922',
'checks-bg': '#010409',
'checks-btn-hover-bg': 'rgba(110,118,129,0.1)',
'checks-btn-hover-icon': '#c9d1d9',
'checks-btn-icon': '#8b949e',
'checks-container-border-width': '1px',
'checks-donut-error': '#c38000',
'checks-donut-neutral': '#8b949e',
'checks-donut-pending': '#d29922',
'checks-donut-success': '#1585fd',
'checks-dropdown-bg': '#161b22',
'checks-dropdown-border': '#30363d',
'checks-dropdown-btn-hover-bg': 'rgba(110,118,129,0.1)',
'checks-dropdown-btn-hover-text': '#c9d1d9',
'checks-dropdown-hover-bg': 'rgba(110,118,129,0.1)',
'checks-dropdown-hover-text': '#c9d1d9',
'checks-dropdown-shadow': 'rgba(1,4,9,0.3)',
'checks-dropdown-text': '#c9d1d9',
'checks-gate-bg': 'rgba(187,128,9,0.15)',
'checks-gate-text': '#8b949e',
'checks-gate-waiting-text': '#d29922',
'checks-header-border': '#21262d',
'checks-header-icon': '#8b949e',
'checks-header-label-open-text': '#c9d1d9',
'checks-header-label-text': '#8b949e',
'checks-input-bg': '#161b22',
'checks-input-focus-text': '#c9d1d9',
'checks-input-placeholder-text': '#484f58',
'checks-input-shadow': '0 0 0 1px (obj) => get_1.default(obj, path)',
'checks-input-text': '#8b949e',
'checks-line-dt-fm-bg': '#9e6a03',
'checks-line-dt-fm-text': '#f0f6fc',
'checks-line-hover-bg': 'rgba(110,118,129,0.1)',
'checks-line-num-text': '#484f58',
'checks-line-selected-bg': 'rgba(56,139,253,0.15)',
'checks-line-selected-num-text': '#58a6ff',
'checks-line-text': '#8b949e',
'checks-line-timestamp-text': '#484f58',
'checks-logline-command-text': '#58a6ff',
'checks-logline-debug-text': '#a371f7',
'checks-logline-error-bg': 'rgba(195,128,0,0.15)',
'checks-logline-error-num-text': '#484f58',
'checks-logline-error-text': '#8b949e',
'checks-logline-num-text': '#484f58',
'checks-logline-section-text': '#42a0ff',
'checks-logline-text': '#8b949e',
'checks-logline-warning-bg': 'rgba(187,128,9,0.15)',
'checks-logline-warning-num-text': '#d29922',
'checks-logline-warning-text': '#8b949e',
'checks-run-border-width': '1px',
'checks-scrollbar-thumb-bg': 'rgba(110,118,129,0.4)',
'checks-step-error-text': '#c38000',
'checks-step-header-open-bg': '#161b22',
'checks-step-warning-text': '#d29922',
'checks-text-link': '#58a6ff',
'checks-text-primary': '#c9d1d9',
'checks-text-secondary': '#8b949e',
'codemirror-activeline-bg': 'rgba(110,118,129,0.1)',
'codemirror-bg': '#0d1117',
'codemirror-cursor': '#c9d1d9',
'codemirror-guttermarker-subtle-text': '#484f58',
'codemirror-guttermarker-text': '#0d1117',
'codemirror-gutters-bg': '#0d1117',
'codemirror-linenumber-text': '#8b949e',
'codemirror-lines-bg': '#0d1117',
'codemirror-matchingbracket-text': '#c9d1d9',
'codemirror-selection-bg': 'rgba(56,139,253,0.4)',
'codemirror-syntax-comment': '#8b949e',
'codemirror-syntax-constant': '#79c0ff',
'codemirror-syntax-entity': '#d2a8ff',
'codemirror-syntax-keyword': '#d69a00',
'codemirror-syntax-storage': '#d69a00',
'codemirror-syntax-string': '#a5d6ff',
'codemirror-syntax-support': '#79c0ff',
'codemirror-syntax-variable': '#ffa657',
'codemirror-text': '#c9d1d9',
'counter-border': 'rgba(0,0,0,0)',
'danger-emphasis': '#a66900',
'danger-fg': '#c38000',
'danger-muted': 'rgba(195,128,0,0.4)',
'danger-subtle': 'rgba(195,128,0,0.15)',
'diff-blob-addition-fg': '#c9d1d9',
'diff-blob-addition-line-bg': 'rgba(21,133,253,0.15)',
'diff-blob-addition-num-bg': 'rgba(66,160,255,0.3)',
'diff-blob-addition-num-text': '#c9d1d9',
'diff-blob-addition-word-bg': 'rgba(21,133,253,0.4)',
'diff-blob-deletion-fg': '#c9d1d9',
'diff-blob-deletion-line-bg': 'rgba(195,128,0,0.15)',
'diff-blob-deletion-num-bg': 'rgba(195,128,0,0.3)',
'diff-blob-deletion-num-text': '#c9d1d9',
'diff-blob-deletion-word-bg': 'rgba(195,128,0,0.4)',
'diff-blob-expander-icon': '#8b949e',
'diff-blob-hunk-num-bg': 'rgba(56,139,253,0.4)',
'diff-blob-selected-line-highlight-mix-blend-mode': 'screen',
'diffstat-addition-bg': '#42a0ff',
'diffstat-addition-border': 'rgba(240,246,252,0.1)',
'diffstat-deletion-border': 'rgba(240,246,252,0.1)',
'done-emphasis': '#8957e5',
'done-fg': '#a371f7',
'done-muted': 'rgba(163,113,247,0.4)',
'done-subtle': 'rgba(163,113,247,0.15)',
'fg-default': '#c9d1d9',
'fg-muted': '#8b949e',
'fg-on-emphasis': '#f0f6fc',
'fg-subtle': '#484f58',
'header-bg': '#161b22',
'header-divider': '#8b949e',
'header-logo': '#f0f6fc',
'header-search-bg': '#0d1117',
'header-search-border': '#30363d',
'header-text': 'rgba(240,246,252,0.7)',
'input-disabled-bg': 'rgba(110,118,129,0)',
'marketing-icon-primary': '#79c0ff',
'marketing-icon-secondary': '#1f6feb',
'menu-bg-active': '#161b22',
'mktg-btn-bg': '#f6f8fa',
'mktg-btn-shadow-focus': 'rgb(255 255 255 / 25%) 0 0 0 4px',
'mktg-btn-shadow-hover-muted': 'rgb(255 255 255) 0 0 0 2px inset',
'mktg-btn-shadow-hover':
'0 4px 7px rgba(0, 0, 0, 0.15), 0 100px 80px rgba(255, 255, 255, 0.02), 0 42px 33px rgba(255, 255, 255, 0.024), 0 22px 18px rgba(255, 255, 255, 0.028), 0 12px 10px rgba(255, 255, 255, 0.034), 0 7px 5px rgba(255, 255, 255, 0.04), 0 3px 2px rgba(255, 255, 255, 0.07)',
'mktg-btn-shadow-outline': 'rgb(255 255 255 / 25%) 0 0 0 1px inset',
'neutral-emphasis-plus': '#6e7681',
'neutral-emphasis': '#6e7681',
'neutral-muted': 'rgba(110,118,129,0.4)',
'neutral-subtle': 'rgba(110,118,129,0.1)',
'overlay-shadow': '0 0 0 1px #30363d, 0 16px 32px rgba(1,4,9,0.85)',
'page-header-bg': '#0d1117',
'prettylights-syntax-brackethighlighter-angle': '#8b949e',
'prettylights-syntax-brackethighlighter-unmatched': '#c38000',
'prettylights-syntax-carriage-return-bg': '#865401',
'prettylights-syntax-carriage-return-text': '#f0f6fc',
'prettylights-syntax-comment': '#8b949e',
'prettylights-syntax-constant-other-reference-link': '#a5d6ff',
'prettylights-syntax-constant': '#79c0ff',
'prettylights-syntax-entity-tag': '#83d4ff',
'prettylights-syntax-entity': '#d2a8ff',
'prettylights-syntax-invalid-illegal-bg': '#633e00',
'prettylights-syntax-invalid-illegal-text': '#f0f6fc',
'prettylights-syntax-keyword': '#d69a00',
'prettylights-syntax-markup-bold': '#c9d1d9',
'prettylights-syntax-markup-changed-bg': '#5a1e02',
'prettylights-syntax-markup-changed-text': '#ffdfb6',
'prettylights-syntax-markup-deleted-bg': '#452f00',
'prettylights-syntax-markup-deleted-text': '#f0ec59',
'prettylights-syntax-markup-heading': '#1f6feb',
'prettylights-syntax-markup-ignored-bg': '#1158c7',
'prettylights-syntax-markup-ignored-text': '#c9d1d9',
'prettylights-syntax-markup-inserted-bg': '#0a2861',
'prettylights-syntax-markup-inserted-text': '#a0e8ff',
'prettylights-syntax-markup-italic': '#c9d1d9',
'prettylights-syntax-markup-list': '#f2cc60',
'prettylights-syntax-meta-diff-range': '#d2a8ff',
'prettylights-syntax-storage-modifier-import': '#c9d1d9',
'prettylights-syntax-string-regexp': '#83d4ff',
'prettylights-syntax-string': '#a5d6ff',
'prettylights-syntax-sublimelinter-gutter-mark': '#484f58',
'prettylights-syntax-variable': '#ffa657',
'primer-border-active': '#F78166',
'primer-border-contrast': 'rgba(240,246,252,0.2)',
'primer-canvas-backdrop': 'rgba(1,4,9,0.8)',
'primer-canvas-sticky': 'rgba(13,17,23,0.95)',
'primer-fg-disabled': '#484f58',
'primer-shadow-focus': '0 0 0 3px #0c2d6b',
'primer-shadow-highlight': '0 0 transparent',
'primer-shadow-inset': '0 0 transparent',
'project-gradient-in': '#161b22',
'project-gradient-out': 'rgba(22,27,34,0)',
'project-header-bg': '#0d1117',
'project-sidebar-bg': '#161b22',
'scale-black': '#010409',
'scale-blue-0': '#cae8ff',
'scale-blue-1': '#a5d6ff',
'scale-blue-2': '#79c0ff',
'scale-blue-3': '#58a6ff',
'scale-blue-4': '#388bfd',
'scale-blue-5': '#1f6feb',
'scale-blue-6': '#1158c7',
'scale-blue-7': '#0d419d',
'scale-blue-8': '#0c2d6b',
'scale-blue-9': '#051d4d',
'scale-coral-0': '#FFDDD2',
'scale-coral-1': '#FFC2B2',
'scale-coral-2': '#FFA28B',
'scale-coral-3': '#F78166',
'scale-coral-4': '#EA6045',
'scale-coral-5': '#CF462D',
'scale-coral-6': '#AC3220',
'scale-coral-7': '#872012',
'scale-coral-8': '#640D04',
'scale-coral-9': '#460701',
'scale-gray-0': '#f0f6fc',
'scale-gray-1': '#c9d1d9',
'scale-gray-2': '#b1bac4',
'scale-gray-3': '#8b949e',
'scale-gray-4': '#6e7681',
'scale-gray-5': '#484f58',
'scale-gray-6': '#30363d',
'scale-gray-7': '#21262d',
'scale-gray-8': '#161b22',
'scale-gray-9': '#0d1117',
'scale-green-0': '#a0e8ff',
'scale-green-1': '#83d4ff',
'scale-green-2': '#66baff',
'scale-green-3': '#42a0ff',
'scale-green-4': '#1585fd',
'scale-green-5': '#1d69e0',
'scale-green-6': '#0f53bc',
'scale-green-7': '#0b3c92',
'scale-green-8': '#0a2861',
'scale-green-9': '#041843',
'scale-orange-0': '#ffdfb6',
'scale-orange-1': '#ffc680',
'scale-orange-2': '#ffa657',
'scale-orange-3': '#f0883e',
'scale-orange-4': '#db6d28',
'scale-orange-5': '#bd561d',
'scale-orange-6': '#9b4215',
'scale-orange-7': '#762d0a',
'scale-orange-8': '#5a1e02',
'scale-orange-9': '#3d1300',
'scale-pink-0': '#ffdaec',
'scale-pink-1': '#ffbedd',
'scale-pink-2': '#ff9bce',
'scale-pink-3': '#f778ba',
'scale-pink-4': '#db61a2',
'scale-pink-5': '#bf4b8a',
'scale-pink-6': '#9e3670',
'scale-pink-7': '#7d2457',
'scale-pink-8': '#5e103e',
'scale-pink-9': '#42062a',
'scale-purple-0': '#eddeff',
'scale-purple-1': '#e2c5ff',
'scale-purple-2': '#d2a8ff',
'scale-purple-3': '#bc8cff',
'scale-purple-4': '#a371f7',
'scale-purple-5': '#8957e5',
'scale-purple-6': '#6e40c9',
'scale-purple-7': '#553098',
'scale-purple-8': '#3c1e70',
'scale-purple-9': '#271052',
'scale-red-0': '#f0ec59',
'scale-red-1': '#ecd334',
'scale-red-2': '#e6b716',
'scale-red-3': '#d69a00',
'scale-red-4': '#c38000',
'scale-red-5': '#a66900',
'scale-red-6': '#865401',
'scale-red-7': '#633e00',
'scale-red-8': '#452f00',
'scale-red-9': '#292100',
'scale-white': '#f0f6fc',
'scale-yellow-0': '#f8e3a1',
'scale-yellow-1': '#f2cc60',
'scale-yellow-2': '#e3b341',
'scale-yellow-3': '#d29922',
'scale-yellow-4': '#bb8009',
'scale-yellow-5': '#9e6a03',
'scale-yellow-6': '#845306',
'scale-yellow-7': '#693e00',
'scale-yellow-8': '#4b2900',
'scale-yellow-9': '#341a00',
'search-keyword-hl': 'rgba(210,153,34,0.4)',
'select-menu-backdrop-border': '#484f58',
'select-menu-tap-focus-bg': '#0c2d6b',
'select-menu-tap-highlight': 'rgba(48,54,61,0.5)',
'severe-emphasis': '#bd561d',
'severe-fg': '#db6d28',
'severe-muted': 'rgba(219,109,40,0.4)',
'severe-subtle': 'rgba(219,109,40,0.15)',
'shadow-extra-large': '0 12px 48px #010409',
'shadow-large': '0 8px 24px #010409',
'shadow-medium': '0 3px 6px #010409',
'shadow-small': '0 0 transparent',
'sidenav-selected-bg': '#21262d',
'sponsors-emphasis': '#bf4b8a',
'sponsors-fg': '#db61a2',
'sponsors-muted': 'rgba(219,97,162,0.4)',
'sponsors-subtle': 'rgba(219,97,162,0.15)',
'success-emphasis': '#1d69e0',
'success-fg': '#42a0ff',
'success-muted': 'rgba(21,133,253,0.4)',
'success-subtle': 'rgba(21,133,253,0.15)',
'timeline-badge-bg': '#21262d',
'topic-tag-border': 'rgba(0,0,0,0)',
'underlinenav-border-hover': 'rgba(110,118,129,0.4)',
'underlinenav-icon': '#484f58',
);

View file

@ -0,0 +1,418 @@
$variables: (
'accent-emphasis': '#316dca',
'accent-fg': '#539bf5',
'accent-muted': 'rgba(65,132,228,0.4)',
'accent-subtle': 'rgba(65,132,228,0.15)',
'action-list-item-danger-active-bg': 'rgba(229,83,75,0.24)',
'action-list-item-danger-hover-bg': 'rgba(229,83,75,0.16)',
'action-list-item-danger-hover-text': '#f47067',
'action-list-item-default-active-bg': 'rgba(144,157,171,0.2)',
'action-list-item-default-hover-bg': 'rgba(144,157,171,0.12)',
'action-list-item-default-selected-bg': 'rgba(144,157,171,0.08)',
'action-list-item-inline-divider': 'rgba(68,76,86,0.48)',
'ansi-black-bright': '#636e7b',
'ansi-black': '#545d68',
'ansi-blue-bright': '#6cb6ff',
'ansi-blue': '#539bf5',
'ansi-cyan-bright': '#56d4dd',
'ansi-cyan': '#39c5cf',
'ansi-gray': '#636e7b',
'ansi-green-bright': '#6bc46d',
'ansi-green': '#57ab5a',
'ansi-magenta-bright': '#dcbdfb',
'ansi-magenta': '#b083f0',
'ansi-red-bright': '#ff938a',
'ansi-red': '#f47067',
'ansi-white-bright': '#cdd9e5',
'ansi-white': '#909dab',
'ansi-yellow-bright': '#daaa3f',
'ansi-yellow': '#c69026',
'attention-emphasis': '#966600',
'attention-fg': '#c69026',
'attention-muted': 'rgba(174,124,20,0.4)',
'attention-subtle': 'rgba(174,124,20,0.15)',
'avatar-bg': 'rgba(205,217,229,0.1)',
'avatar-border': 'rgba(205,217,229,0.1)',
'avatar-child-shadow': '-2px -2px 0 #22272e',
'avatar-stack-fade-more': '#373e47',
'avatar-stack-fade': '#444c56',
'border-default': '#444c56',
'border-muted': '#373e47',
'border-subtle': 'rgba(205,217,229,0.1)',
'btn-active-bg': 'hsla(213,12%,27%,1)',
'btn-active-border': '#636e7b',
'btn-bg': '#373e47',
'btn-border': 'rgba(205,217,229,0.1)',
'btn-counter-bg': '#444c56',
'btn-danger-counter-bg': 'rgba(201,60,55,0.1)',
'btn-danger-disabled-bg': '#22272e',
'btn-danger-disabled-counter-bg': 'rgba(201,60,55,0.05)',
'btn-danger-disabled-text': 'rgba(229,83,75,0.5)',
'btn-danger-focus-border': '#e5534b',
'btn-danger-focus-shadow': '0 0 0 3px rgba(229,83,75,0.4)',
'btn-danger-hover-bg': '#c93c37',
'btn-danger-hover-border': '#e5534b',
'btn-danger-hover-counter-bg': 'rgba(255,255,255,0.2)',
'btn-danger-hover-icon': '#cdd9e5',
'btn-danger-hover-inset-shadow': '0 0 transparent',
'btn-danger-hover-shadow': '0 0 transparent',
'btn-danger-hover-text': '#cdd9e5',
'btn-danger-icon': '#e5534b',
'btn-danger-selected-bg': '#ad2e2c',
'btn-danger-selected-border': '#f47067',
'btn-danger-selected-shadow': '0 0 transparent',
'btn-danger-selected-text': '#ffffff',
'btn-danger-text': '#e5534b',
'btn-focus-bg': '#373e47',
'btn-focus-border': '#768390',
'btn-focus-shadow': '0 0 0 3px rgba(118,131,144,0.3)',
'btn-hover-bg': '#444c56',
'btn-hover-border': '#768390',
'btn-inset-shadow': '0 0 transparent',
'btn-outline-counter-bg': 'rgba(49,109,202,0.1)',
'btn-outline-disabled-bg': '#22272e',
'btn-outline-disabled-counter-bg': 'rgba(49,109,202,0.05)',
'btn-outline-disabled-text': 'rgba(83,155,245,0.5)',
'btn-outline-focus-border': 'rgba(205,217,229,0.1)',
'btn-outline-focus-shadow': '0 0 0 3px rgba(37,90,178,0.4)',
'btn-outline-hover-bg': '#444c56',
'btn-outline-hover-border': 'rgba(205,217,229,0.1)',
'btn-outline-hover-counter-bg': 'rgba(205,217,229,0.2)',
'btn-outline-hover-inset-shadow': 'inset 0 1px 0 rgba(205,217,229,0.03)',
'btn-outline-hover-shadow': '0 1px 0 rgba(28,33,40,0.1)',
'btn-outline-hover-text': '#539bf5',
'btn-outline-selected-bg': '#1b4b91',
'btn-outline-selected-border': 'rgba(205,217,229,0.1)',
'btn-outline-selected-shadow': '0 0 transparent',
'btn-outline-selected-text': '#cdd9e5',
'btn-outline-text': '#539bf5',
'btn-primary-bg': '#347d39',
'btn-primary-border': 'rgba(205,217,229,0.1)',
'btn-primary-counter-bg': 'rgba(205,217,229,0.2)',
'btn-primary-disabled-bg': 'rgba(52,125,57,0.6)',
'btn-primary-disabled-border': 'rgba(205,217,229,0.1)',
'btn-primary-disabled-text': 'rgba(205,217,229,0.5)',
'btn-primary-focus-bg': '#347d39',
'btn-primary-focus-border': 'rgba(205,217,229,0.1)',
'btn-primary-focus-shadow': '0 0 0 3px rgba(46,164,79,0.4)',
'btn-primary-hover-bg': '#46954a',
'btn-primary-hover-border': 'rgba(205,217,229,0.1)',
'btn-primary-icon': '#cdd9e5',
'btn-primary-inset-shadow': '0 0 transparent',
'btn-primary-selected-bg': '#347d39',
'btn-primary-selected-shadow': '0 0 transparent',
'btn-primary-shadow': '0 0 transparent',
'btn-primary-text': '#ffffff',
'btn-selected-bg': '#2d333b',
'btn-shadow-active': 'inset 0 0.15em 0.3em rgba(28,33,40,0.15)',
'btn-shadow-input-focus': '0 0 0 0.2em rgba(49,109,202,0.3)',
'btn-shadow': '0 0 transparent',
'btn-text': '#adbac7',
'canvas-default-transparent': 'rgba(34,39,46,0)',
'canvas-default': '#22272e',
'canvas-inset': '#1c2128',
'canvas-overlay': '#2d333b',
'canvas-subtle': '#2d333b',
'checks-ansi-black-bright': '#2d333b',
'checks-ansi-black': '#22272e',
'checks-ansi-blue-bright': '#6cb6ff',
'checks-ansi-blue': '#539bf5',
'checks-ansi-cyan-bright': '#b3f0ff',
'checks-ansi-cyan': '#76e3ea',
'checks-ansi-gray': '#636e7b',
'checks-ansi-green-bright': '#6bc46d',
'checks-ansi-green': '#57ab5a',
'checks-ansi-magenta-bright': '#dcbdfb',
'checks-ansi-magenta': '#b083f0',
'checks-ansi-red-bright': '#ff938a',
'checks-ansi-red': '#f47067',
'checks-ansi-white-bright': '#909dab',
'checks-ansi-white': '#909dab',
'checks-ansi-yellow-bright': '#daaa3f',
'checks-ansi-yellow': '#c69026',
'checks-bg': '#1c2128',
'checks-btn-hover-bg': 'rgba(99,110,123,0.1)',
'checks-btn-hover-icon': '#adbac7',
'checks-btn-icon': '#768390',
'checks-container-border-width': '1px',
'checks-donut-error': '#e5534b',
'checks-donut-neutral': '#768390',
'checks-donut-pending': '#c69026',
'checks-donut-success': '#46954a',
'checks-dropdown-bg': '#2d333b',
'checks-dropdown-border': '#444c56',
'checks-dropdown-btn-hover-bg': 'rgba(99,110,123,0.1)',
'checks-dropdown-btn-hover-text': '#adbac7',
'checks-dropdown-hover-bg': 'rgba(99,110,123,0.1)',
'checks-dropdown-hover-text': '#adbac7',
'checks-dropdown-shadow': 'rgba(28,33,40,0.3)',
'checks-dropdown-text': '#adbac7',
'checks-gate-bg': 'rgba(174,124,20,0.15)',
'checks-gate-text': '#768390',
'checks-gate-waiting-text': '#c69026',
'checks-header-border': '#373e47',
'checks-header-icon': '#768390',
'checks-header-label-open-text': '#adbac7',
'checks-header-label-text': '#768390',
'checks-input-bg': '#2d333b',
'checks-input-focus-text': '#adbac7',
'checks-input-placeholder-text': '#545d68',
'checks-input-shadow': '0 0 0 1px (obj) => get_1.default(obj, path)',
'checks-input-text': '#768390',
'checks-line-dt-fm-bg': '#966600',
'checks-line-dt-fm-text': '#cdd9e5',
'checks-line-hover-bg': 'rgba(99,110,123,0.1)',
'checks-line-num-text': '#545d68',
'checks-line-selected-bg': 'rgba(65,132,228,0.15)',
'checks-line-selected-num-text': '#539bf5',
'checks-line-text': '#768390',
'checks-line-timestamp-text': '#545d68',
'checks-logline-command-text': '#539bf5',
'checks-logline-debug-text': '#986ee2',
'checks-logline-error-bg': 'rgba(229,83,75,0.15)',
'checks-logline-error-num-text': '#545d68',
'checks-logline-error-text': '#768390',
'checks-logline-num-text': '#545d68',
'checks-logline-section-text': '#57ab5a',
'checks-logline-text': '#768390',
'checks-logline-warning-bg': 'rgba(174,124,20,0.15)',
'checks-logline-warning-num-text': '#c69026',
'checks-logline-warning-text': '#768390',
'checks-run-border-width': '1px',
'checks-scrollbar-thumb-bg': 'rgba(99,110,123,0.4)',
'checks-step-error-text': '#e5534b',
'checks-step-header-open-bg': '#2d333b',
'checks-step-warning-text': '#c69026',
'checks-text-link': '#539bf5',
'checks-text-primary': '#adbac7',
'checks-text-secondary': '#768390',
'codemirror-activeline-bg': 'rgba(99,110,123,0.1)',
'codemirror-bg': '#22272e',
'codemirror-cursor': '#adbac7',
'codemirror-guttermarker-subtle-text': '#545d68',
'codemirror-guttermarker-text': '#22272e',
'codemirror-gutters-bg': '#22272e',
'codemirror-linenumber-text': '#768390',
'codemirror-lines-bg': '#22272e',
'codemirror-matchingbracket-text': '#adbac7',
'codemirror-selection-bg': 'rgba(65,132,228,0.4)',
'codemirror-syntax-comment': '#768390',
'codemirror-syntax-constant': '#6cb6ff',
'codemirror-syntax-entity': '#dcbdfb',
'codemirror-syntax-keyword': '#f47067',
'codemirror-syntax-storage': '#f47067',
'codemirror-syntax-string': '#96d0ff',
'codemirror-syntax-support': '#6cb6ff',
'codemirror-syntax-variable': '#f69d50',
'codemirror-text': '#adbac7',
'counter-border': 'rgba(0,0,0,0)',
'danger-emphasis': '#c93c37',
'danger-fg': '#e5534b',
'danger-muted': 'rgba(229,83,75,0.4)',
'danger-subtle': 'rgba(229,83,75,0.15)',
'diff-blob-addition-fg': '#adbac7',
'diff-blob-addition-line-bg': 'rgba(70,149,74,0.15)',
'diff-blob-addition-num-bg': 'rgba(87,171,90,0.3)',
'diff-blob-addition-num-text': '#adbac7',
'diff-blob-addition-word-bg': 'rgba(70,149,74,0.4)',
'diff-blob-deletion-fg': '#adbac7',
'diff-blob-deletion-line-bg': 'rgba(229,83,75,0.15)',
'diff-blob-deletion-num-bg': 'rgba(229,83,75,0.3)',
'diff-blob-deletion-num-text': '#adbac7',
'diff-blob-deletion-word-bg': 'rgba(229,83,75,0.4)',
'diff-blob-expander-icon': '#768390',
'diff-blob-hunk-num-bg': 'rgba(65,132,228,0.4)',
'diff-blob-selected-line-highlight-mix-blend-mode': 'screen',
'diffstat-addition-bg': '#57ab5a',
'diffstat-addition-border': 'rgba(205,217,229,0.1)',
'diffstat-deletion-border': 'rgba(205,217,229,0.1)',
'done-emphasis': '#8256d0',
'done-fg': '#986ee2',
'done-muted': 'rgba(152,110,226,0.4)',
'done-subtle': 'rgba(152,110,226,0.15)',
'fg-default': '#adbac7',
'fg-muted': '#768390',
'fg-on-emphasis': '#cdd9e5',
'fg-subtle': '#545d68',
'header-bg': '#2d333b',
'header-divider': '#768390',
'header-logo': '#cdd9e5',
'header-search-bg': '#22272e',
'header-search-border': '#444c56',
'header-text': 'rgba(205,217,229,0.7)',
'input-disabled-bg': 'rgba(99,110,123,0)',
'marketing-icon-primary': '#6cb6ff',
'marketing-icon-secondary': '#316dca',
'menu-bg-active': '#2d333b',
'mktg-btn-bg': '#f6f8fa',
'mktg-btn-shadow-focus': 'rgb(255 255 255 / 25%) 0 0 0 4px',
'mktg-btn-shadow-hover-muted': 'rgb(255 255 255) 0 0 0 2px inset',
'mktg-btn-shadow-hover':
'0 4px 7px rgba(0, 0, 0, 0.15), 0 100px 80px rgba(255, 255, 255, 0.02), 0 42px 33px rgba(255, 255, 255, 0.024), 0 22px 18px rgba(255, 255, 255, 0.028), 0 12px 10px rgba(255, 255, 255, 0.034), 0 7px 5px rgba(255, 255, 255, 0.04), 0 3px 2px rgba(255, 255, 255, 0.07)',
'mktg-btn-shadow-outline': 'rgb(255 255 255 / 25%) 0 0 0 1px inset',
'neutral-emphasis-plus': '#636e7b',
'neutral-emphasis': '#636e7b',
'neutral-muted': 'rgba(99,110,123,0.4)',
'neutral-subtle': 'rgba(99,110,123,0.1)',
'overlay-shadow': '0 0 0 1px #444c56, 0 16px 32px rgba(28,33,40,0.85)',
'page-header-bg': '#22272e',
'prettylights-syntax-brackethighlighter-angle': '#768390',
'prettylights-syntax-brackethighlighter-unmatched': '#e5534b',
'prettylights-syntax-carriage-return-bg': '#ad2e2c',
'prettylights-syntax-carriage-return-text': '#cdd9e5',
'prettylights-syntax-comment': '#768390',
'prettylights-syntax-constant-other-reference-link': '#96d0ff',
'prettylights-syntax-constant': '#6cb6ff',
'prettylights-syntax-entity-tag': '#8ddb8c',
'prettylights-syntax-entity': '#dcbdfb',
'prettylights-syntax-invalid-illegal-bg': '#922323',
'prettylights-syntax-invalid-illegal-text': '#cdd9e5',
'prettylights-syntax-keyword': '#f47067',
'prettylights-syntax-markup-bold': '#adbac7',
'prettylights-syntax-markup-changed-bg': '#682d0f',
'prettylights-syntax-markup-changed-text': '#ffddb0',
'prettylights-syntax-markup-deleted-bg': '#78191b',
'prettylights-syntax-markup-deleted-text': '#ffd8d3',
'prettylights-syntax-markup-heading': '#316dca',
'prettylights-syntax-markup-ignored-bg': '#255ab2',
'prettylights-syntax-markup-ignored-text': '#adbac7',
'prettylights-syntax-markup-inserted-bg': '#1b4721',
'prettylights-syntax-markup-inserted-text': '#b4f1b4',
'prettylights-syntax-markup-italic': '#adbac7',
'prettylights-syntax-markup-list': '#eac55f',
'prettylights-syntax-meta-diff-range': '#dcbdfb',
'prettylights-syntax-storage-modifier-import': '#adbac7',
'prettylights-syntax-string-regexp': '#8ddb8c',
'prettylights-syntax-string': '#96d0ff',
'prettylights-syntax-sublimelinter-gutter-mark': '#545d68',
'prettylights-syntax-variable': '#f69d50',
'primer-border-active': '#EC775C',
'primer-border-contrast': 'rgba(205,217,229,0.2)',
'primer-canvas-backdrop': 'rgba(28,33,40,0.8)',
'primer-canvas-sticky': 'rgba(34,39,46,0.95)',
'primer-fg-disabled': '#545d68',
'primer-shadow-focus': '0 0 0 3px #143d79',
'primer-shadow-highlight': '0 0 transparent',
'primer-shadow-inset': '0 0 transparent',
'project-gradient-in': '#2d333b',
'project-gradient-out': 'rgba(45,51,59,0)',
'project-header-bg': '#22272e',
'project-sidebar-bg': '#2d333b',
'scale-black': '#1c2128',
'scale-blue-0': '#c6e6ff',
'scale-blue-1': '#96d0ff',
'scale-blue-2': '#6cb6ff',
'scale-blue-3': '#539bf5',
'scale-blue-4': '#4184e4',
'scale-blue-5': '#316dca',
'scale-blue-6': '#255ab2',
'scale-blue-7': '#1b4b91',
'scale-blue-8': '#143d79',
'scale-blue-9': '#0f2d5c',
'scale-coral-0': '#FFDACF',
'scale-coral-1': '#FFB9A5',
'scale-coral-2': '#F79981',
'scale-coral-3': '#EC775C',
'scale-coral-4': '#DE5B41',
'scale-coral-5': '#C2442D',
'scale-coral-6': '#A93524',
'scale-coral-7': '#8D291B',
'scale-coral-8': '#771D13',
'scale-coral-9': '#5D1008',
'scale-gray-0': '#cdd9e5',
'scale-gray-1': '#adbac7',
'scale-gray-2': '#909dab',
'scale-gray-3': '#768390',
'scale-gray-4': '#636e7b',
'scale-gray-5': '#545d68',
'scale-gray-6': '#444c56',
'scale-gray-7': '#373e47',
'scale-gray-8': '#2d333b',
'scale-gray-9': '#22272e',
'scale-green-0': '#b4f1b4',
'scale-green-1': '#8ddb8c',
'scale-green-2': '#6bc46d',
'scale-green-3': '#57ab5a',
'scale-green-4': '#46954a',
'scale-green-5': '#347d39',
'scale-green-6': '#2b6a30',
'scale-green-7': '#245829',
'scale-green-8': '#1b4721',
'scale-green-9': '#113417',
'scale-orange-0': '#ffddb0',
'scale-orange-1': '#ffbc6f',
'scale-orange-2': '#f69d50',
'scale-orange-3': '#e0823d',
'scale-orange-4': '#cc6b2c',
'scale-orange-5': '#ae5622',
'scale-orange-6': '#94471b',
'scale-orange-7': '#7f3913',
'scale-orange-8': '#682d0f',
'scale-orange-9': '#4d210c',
'scale-pink-0': '#ffd7eb',
'scale-pink-1': '#ffb3d8',
'scale-pink-2': '#fc8dc7',
'scale-pink-3': '#e275ad',
'scale-pink-4': '#c96198',
'scale-pink-5': '#ae4c82',
'scale-pink-6': '#983b6e',
'scale-pink-7': '#7e325a',
'scale-pink-8': '#69264a',
'scale-pink-9': '#551639',
'scale-purple-0': '#eedcff',
'scale-purple-1': '#dcbdfb',
'scale-purple-2': '#dcbdfb',
'scale-purple-3': '#b083f0',
'scale-purple-4': '#986ee2',
'scale-purple-5': '#8256d0',
'scale-purple-6': '#6b44bc',
'scale-purple-7': '#5936a2',
'scale-purple-8': '#472c82',
'scale-purple-9': '#352160',
'scale-red-0': '#ffd8d3',
'scale-red-1': '#ffb8b0',
'scale-red-2': '#ff938a',
'scale-red-3': '#f47067',
'scale-red-4': '#e5534b',
'scale-red-5': '#c93c37',
'scale-red-6': '#ad2e2c',
'scale-red-7': '#922323',
'scale-red-8': '#78191b',
'scale-red-9': '#5D0F12',
'scale-white': '#cdd9e5',
'scale-yellow-0': '#fbe090',
'scale-yellow-1': '#eac55f',
'scale-yellow-2': '#daaa3f',
'scale-yellow-3': '#c69026',
'scale-yellow-4': '#ae7c14',
'scale-yellow-5': '#966600',
'scale-yellow-6': '#805400',
'scale-yellow-7': '#6c4400',
'scale-yellow-8': '#593600',
'scale-yellow-9': '#452700',
'search-keyword-hl': 'rgba(198,144,38,0.4)',
'select-menu-backdrop-border': '#545d68',
'select-menu-tap-focus-bg': '#143d79',
'select-menu-tap-highlight': 'rgba(68,76,86,0.5)',
'severe-emphasis': '#ae5622',
'severe-fg': '#cc6b2c',
'severe-muted': 'rgba(204,107,44,0.4)',
'severe-subtle': 'rgba(204,107,44,0.15)',
'shadow-extra-large': '0 12px 48px #1c2128',
'shadow-large': '0 8px 24px #1c2128',
'shadow-medium': '0 3px 6px #1c2128',
'shadow-small': '0 0 transparent',
'sidenav-selected-bg': '#373e47',
'sponsors-emphasis': '#ae4c82',
'sponsors-fg': '#c96198',
'sponsors-muted': 'rgba(201,97,152,0.4)',
'sponsors-subtle': 'rgba(201,97,152,0.15)',
'success-emphasis': '#347d39',
'success-fg': '#57ab5a',
'success-muted': 'rgba(70,149,74,0.4)',
'success-subtle': 'rgba(70,149,74,0.15)',
'timeline-badge-bg': '#373e47',
'topic-tag-border': 'rgba(0,0,0,0)',
'underlinenav-border-hover': 'rgba(99,110,123,0.4)',
'underlinenav-icon': '#545d68',
);

View file

@ -0,0 +1,418 @@
$variables: (
'accent-emphasis': '#409eff',
'accent-fg': '#71b7ff',
'accent-muted': '#409eff',
'accent-subtle': 'rgba(64,158,255,0.15)',
'action-list-item-danger-active-bg': '#ff4445',
'action-list-item-danger-hover-bg': '#ff6a69',
'action-list-item-danger-hover-text': '#0a0c10',
'action-list-item-default-active-bg': 'rgba(217,222,227,0.24)',
'action-list-item-default-hover-bg': 'rgba(217,222,227,0.12)',
'action-list-item-default-selected-bg': 'rgba(217,222,227,0.08)',
'action-list-item-inline-divider': '#7a828e',
'ansi-black-bright': '#9ea7b3',
'ansi-black': '#7a828e',
'ansi-blue-bright': '#91cbff',
'ansi-blue': '#71b7ff',
'ansi-cyan-bright': '#56d4dd',
'ansi-cyan': '#39c5cf',
'ansi-gray': '#9ea7b3',
'ansi-green-bright': '#4ae168',
'ansi-green': '#26cd4d',
'ansi-magenta-bright': '#dbb7ff',
'ansi-magenta': '#cb9eff',
'ansi-red-bright': '#ffb1af',
'ansi-red': '#ff9492',
'ansi-white-bright': '#ffffff',
'ansi-white': '#d9dee3',
'ansi-yellow-bright': '#f7c843',
'ansi-yellow': '#f0b72f',
'attention-emphasis': '#e09b13',
'attention-fg': '#f0b72f',
'attention-muted': '#e09b13',
'attention-subtle': 'rgba(224,155,19,0.15)',
'avatar-bg': 'rgba(255,255,255,0.1)',
'avatar-border': 'rgba(255,255,255,0.9)',
'avatar-child-shadow': '-2px -2px 0 #0a0c10',
'avatar-stack-fade-more': '#272b33',
'avatar-stack-fade': '#525964',
'border-default': '#7a828e',
'border-muted': '#7a828e',
'border-subtle': '#7a828e',
'btn-active-bg': 'hsla(217,10%,33%,1)',
'btn-active-border': '#9ea7b3',
'btn-bg': '#272b33',
'btn-border': '#7a828e',
'btn-counter-bg': '#525964',
'btn-danger-counter-bg': 'rgba(1,4,9,0.15)',
'btn-danger-disabled-bg': '#0a0c10',
'btn-danger-disabled-counter-bg': 'rgba(255,106,105,0.05)',
'btn-danger-disabled-text': 'rgba(255,106,105,0.5)',
'btn-danger-focus-border': '#ff6a69',
'btn-danger-focus-shadow': '0 0 0 3px rgba(255,106,105,0.4)',
'btn-danger-hover-bg': '#ff6a69',
'btn-danger-hover-border': '#ff6a69',
'btn-danger-hover-counter-bg': 'rgba(1,4,9,0.15)',
'btn-danger-hover-icon': '#0a0c10',
'btn-danger-hover-inset-shadow': '0 0 transparent',
'btn-danger-hover-shadow': '0 0 transparent',
'btn-danger-hover-text': '#0a0c10',
'btn-danger-icon': '#ff6a69',
'btn-danger-selected-bg': '#ff4445',
'btn-danger-selected-border': '#ff9492',
'btn-danger-selected-shadow': '0 0 transparent',
'btn-danger-selected-text': '#ffffff',
'btn-danger-text': '#ff6a69',
'btn-focus-bg': '#272b33',
'btn-focus-border': '#bdc4cc',
'btn-focus-shadow': '0 0 0 3px rgba(189,196,204,0.3)',
'btn-hover-bg': '#525964',
'btn-hover-border': '#bdc4cc',
'btn-inset-shadow': '0 0 transparent',
'btn-outline-counter-bg': 'rgba(64,158,255,0.1)',
'btn-outline-disabled-bg': '#0a0c10',
'btn-outline-disabled-counter-bg': 'rgba(64,158,255,0.05)',
'btn-outline-disabled-text': 'rgba(113,183,255,0.5)',
'btn-outline-focus-border': '#7a828e',
'btn-outline-focus-shadow': '0 0 0 3px rgba(49,139,248,0.4)',
'btn-outline-hover-bg': '#525964',
'btn-outline-hover-border': '#7a828e',
'btn-outline-hover-counter-bg': 'rgba(255,255,255,0.2)',
'btn-outline-hover-inset-shadow': 'inset 0 1px 0 rgba(255,255,255,0.03)',
'btn-outline-hover-shadow': '0 1px 0 rgba(1,4,9,0.1)',
'btn-outline-hover-text': '#71b7ff',
'btn-outline-selected-bg': '#2672f3',
'btn-outline-selected-border': '#7a828e',
'btn-outline-selected-shadow': '0 0 transparent',
'btn-outline-selected-text': '#ffffff',
'btn-outline-text': '#71b7ff',
'btn-primary-bg': '#09b43a',
'btn-primary-border': '#4ae168',
'btn-primary-counter-bg': 'rgba(1,4,9,0.15)',
'btn-primary-disabled-bg': 'rgba(9,180,58,0.6)',
'btn-primary-disabled-border': 'rgba(74,225,104,0.4)',
'btn-primary-disabled-text': 'rgba(10,12,16,0.5)',
'btn-primary-focus-bg': '#09b43a',
'btn-primary-focus-border': '#7a828e',
'btn-primary-focus-shadow': '0 0 0 3px rgba(46,164,79,0.4)',
'btn-primary-hover-bg': '#26cd4d',
'btn-primary-hover-border': '#4ae168',
'btn-primary-icon': '#0a0c10',
'btn-primary-inset-shadow': '0 0 transparent',
'btn-primary-selected-bg': '#09b43a',
'btn-primary-selected-shadow': '0 0 transparent',
'btn-primary-shadow': '0 0 transparent',
'btn-primary-text': '#0a0c10',
'btn-selected-bg': 'rgba(82,89,100,0.9)',
'btn-shadow-active': 'inset 0 0.15em 0.3em rgba(1,4,9,0.15)',
'btn-shadow-input-focus': '0 0 0 0.2em rgba(64,158,255,0.3)',
'btn-shadow': '0 0 transparent',
'btn-text': '#f0f3f6',
'canvas-default-transparent': 'rgba(10,12,16,0)',
'canvas-default': '#0a0c10',
'canvas-inset': '#010409',
'canvas-overlay': '#272b33',
'canvas-subtle': '#272b33',
'checks-ansi-black-bright': '#272b33',
'checks-ansi-black': '#0a0c10',
'checks-ansi-blue-bright': '#91cbff',
'checks-ansi-blue': '#71b7ff',
'checks-ansi-cyan-bright': '#b3f0ff',
'checks-ansi-cyan': '#76e3ea',
'checks-ansi-gray': '#9ea7b3',
'checks-ansi-green-bright': '#4ae168',
'checks-ansi-green': '#26cd4d',
'checks-ansi-magenta-bright': '#dbb7ff',
'checks-ansi-magenta': '#cb9eff',
'checks-ansi-red-bright': '#ffb1af',
'checks-ansi-red': '#ff9492',
'checks-ansi-white-bright': '#d9dee3',
'checks-ansi-white': '#d9dee3',
'checks-ansi-yellow-bright': '#f7c843',
'checks-ansi-yellow': '#f0b72f',
'checks-bg': '#010409',
'checks-btn-hover-bg': 'rgba(158,167,179,0.1)',
'checks-btn-hover-icon': '#f0f3f6',
'checks-btn-icon': '#f0f3f6',
'checks-container-border-width': '1px',
'checks-donut-error': '#ff6a69',
'checks-donut-neutral': '#bdc4cc',
'checks-donut-pending': '#f0b72f',
'checks-donut-success': '#09b43a',
'checks-dropdown-bg': '#272b33',
'checks-dropdown-border': '#7a828e',
'checks-dropdown-btn-hover-bg': 'rgba(158,167,179,0.1)',
'checks-dropdown-btn-hover-text': '#f0f3f6',
'checks-dropdown-hover-bg': 'rgba(158,167,179,0.1)',
'checks-dropdown-hover-text': '#f0f3f6',
'checks-dropdown-shadow': 'rgba(1,4,9,0.3)',
'checks-dropdown-text': '#f0f3f6',
'checks-gate-bg': 'rgba(224,155,19,0.15)',
'checks-gate-text': '#f0f3f6',
'checks-gate-waiting-text': '#f0b72f',
'checks-header-border': '#7a828e',
'checks-header-icon': '#f0f3f6',
'checks-header-label-open-text': '#f0f3f6',
'checks-header-label-text': '#f0f3f6',
'checks-input-bg': '#272b33',
'checks-input-focus-text': '#f0f3f6',
'checks-input-placeholder-text': '#7a828e',
'checks-input-shadow': '0 0 0 1px (obj) => get_1.default(obj, path)',
'checks-input-text': '#f0f3f6',
'checks-line-dt-fm-bg': '#e09b13',
'checks-line-dt-fm-text': '#0a0c10',
'checks-line-hover-bg': 'rgba(158,167,179,0.1)',
'checks-line-num-text': '#7a828e',
'checks-line-selected-bg': 'rgba(64,158,255,0.15)',
'checks-line-selected-num-text': '#71b7ff',
'checks-line-text': '#f0f3f6',
'checks-line-timestamp-text': '#7a828e',
'checks-logline-command-text': '#71b7ff',
'checks-logline-debug-text': '#b780ff',
'checks-logline-error-bg': 'rgba(255,106,105,0.15)',
'checks-logline-error-num-text': '#7a828e',
'checks-logline-error-text': '#f0f3f6',
'checks-logline-num-text': '#7a828e',
'checks-logline-section-text': '#26cd4d',
'checks-logline-text': '#f0f3f6',
'checks-logline-warning-bg': 'rgba(224,155,19,0.15)',
'checks-logline-warning-num-text': '#f0b72f',
'checks-logline-warning-text': '#f0f3f6',
'checks-run-border-width': '1px',
'checks-scrollbar-thumb-bg': 'rgba(158,167,179,0.4)',
'checks-step-error-text': '#ff6a69',
'checks-step-header-open-bg': '#272b33',
'checks-step-warning-text': '#f0b72f',
'checks-text-link': '#71b7ff',
'checks-text-primary': '#f0f3f6',
'checks-text-secondary': '#f0f3f6',
'codemirror-activeline-bg': 'rgba(158,167,179,0.1)',
'codemirror-bg': '#0a0c10',
'codemirror-cursor': '#f0f3f6',
'codemirror-guttermarker-subtle-text': '#7a828e',
'codemirror-guttermarker-text': '#0a0c10',
'codemirror-gutters-bg': '#0a0c10',
'codemirror-linenumber-text': '#f0f3f6',
'codemirror-lines-bg': '#0a0c10',
'codemirror-matchingbracket-text': '#f0f3f6',
'codemirror-selection-bg': 'rgba(64,158,255,0.4)',
'codemirror-syntax-comment': '#bdc4cc',
'codemirror-syntax-constant': '#91cbff',
'codemirror-syntax-entity': '#dbb7ff',
'codemirror-syntax-keyword': '#ff9492',
'codemirror-syntax-storage': '#ff9492',
'codemirror-syntax-string': '#addcff',
'codemirror-syntax-support': '#91cbff',
'codemirror-syntax-variable': '#ffb757',
'codemirror-text': '#f0f3f6',
'counter-border': 'rgba(0,0,0,0)',
'danger-emphasis': '#ff6a69',
'danger-fg': '#ff6a69',
'danger-muted': '#ff6a69',
'danger-subtle': 'rgba(255,106,105,0.15)',
'diff-blob-addition-fg': '#0a0c10',
'diff-blob-addition-line-bg': 'rgba(9,180,58,0.15)',
'diff-blob-addition-num-bg': 'rgba(38,205,77,0.3)',
'diff-blob-addition-num-text': '#f0f3f6',
'diff-blob-addition-word-bg': '#09b43a',
'diff-blob-deletion-fg': '#0a0c10',
'diff-blob-deletion-line-bg': 'rgba(255,106,105,0.15)',
'diff-blob-deletion-num-bg': 'rgba(255,106,105,0.3)',
'diff-blob-deletion-num-text': '#f0f3f6',
'diff-blob-deletion-word-bg': '#ff6a69',
'diff-blob-expander-icon': '#f0f3f6',
'diff-blob-hunk-num-bg': 'rgba(64,158,255,0.4)',
'diff-blob-selected-line-highlight-mix-blend-mode': 'screen',
'diffstat-addition-bg': '#26cd4d',
'diffstat-addition-border': '#4ae168',
'diffstat-deletion-border': '#ffb1af',
'done-emphasis': '#b87fff',
'done-fg': '#b780ff',
'done-muted': '#b780ff',
'done-subtle': 'rgba(183,128,255,0.15)',
'fg-default': '#f0f3f6',
'fg-muted': '#f0f3f6',
'fg-on-emphasis': '#0a0c10',
'fg-subtle': '#7a828e',
'header-bg': '#272b33',
'header-divider': '#bdc4cc',
'header-logo': '#ffffff',
'header-search-bg': '#0a0c10',
'header-search-border': '#525964',
'header-text': 'rgba(255,255,255,0.7)',
'input-disabled-bg': 'rgba(158,167,179,0)',
'marketing-icon-primary': '#91cbff',
'marketing-icon-secondary': '#409eff',
'menu-bg-active': '#272b33',
'mktg-btn-bg': '#f6f8fa',
'mktg-btn-shadow-focus': 'rgb(255 255 255 / 25%) 0 0 0 4px',
'mktg-btn-shadow-hover-muted': 'rgb(255 255 255) 0 0 0 2px inset',
'mktg-btn-shadow-hover':
'0 4px 7px rgba(0, 0, 0, 0.15), 0 100px 80px rgba(255, 255, 255, 0.02), 0 42px 33px rgba(255, 255, 255, 0.024), 0 22px 18px rgba(255, 255, 255, 0.028), 0 12px 10px rgba(255, 255, 255, 0.034), 0 7px 5px rgba(255, 255, 255, 0.04), 0 3px 2px rgba(255, 255, 255, 0.07)',
'mktg-btn-shadow-outline': 'rgb(255 255 255 / 25%) 0 0 0 1px inset',
'neutral-emphasis-plus': '#ffffff',
'neutral-emphasis': '#9ea7b3',
'neutral-muted': 'rgba(158,167,179,0.4)',
'neutral-subtle': 'rgba(158,167,179,0.1)',
'overlay-shadow': '0 0 0 1px #525964, 0 16px 32px rgba(1,4,9,0.85)',
'page-header-bg': '#0a0c10',
'prettylights-syntax-brackethighlighter-angle': '#bdc4cc',
'prettylights-syntax-brackethighlighter-unmatched': '#ff6a69',
'prettylights-syntax-carriage-return-bg': '#ff4445',
'prettylights-syntax-carriage-return-text': '#ffffff',
'prettylights-syntax-comment': '#bdc4cc',
'prettylights-syntax-constant-other-reference-link': '#addcff',
'prettylights-syntax-constant': '#91cbff',
'prettylights-syntax-entity-tag': '#72f088',
'prettylights-syntax-entity': '#dbb7ff',
'prettylights-syntax-invalid-illegal-bg': '#e82a2f',
'prettylights-syntax-invalid-illegal-text': '#ffffff',
'prettylights-syntax-keyword': '#ff9492',
'prettylights-syntax-markup-bold': '#f0f3f6',
'prettylights-syntax-markup-changed-bg': '#a74c00',
'prettylights-syntax-markup-changed-text': '#ffe1b4',
'prettylights-syntax-markup-deleted-bg': '#cc1421',
'prettylights-syntax-markup-deleted-text': '#ffdedb',
'prettylights-syntax-markup-heading': '#409eff',
'prettylights-syntax-markup-ignored-bg': '#318bf8',
'prettylights-syntax-markup-ignored-text': '#f0f3f6',
'prettylights-syntax-markup-inserted-bg': '#007728',
'prettylights-syntax-markup-inserted-text': '#acf7b6',
'prettylights-syntax-markup-italic': '#f0f3f6',
'prettylights-syntax-markup-list': '#fbd669',
'prettylights-syntax-meta-diff-range': '#dbb7ff',
'prettylights-syntax-storage-modifier-import': '#f0f3f6',
'prettylights-syntax-string-regexp': '#72f088',
'prettylights-syntax-string': '#addcff',
'prettylights-syntax-sublimelinter-gutter-mark': '#7a828e',
'prettylights-syntax-variable': '#ffb757',
'primer-border-active': '#FF967D',
'primer-border-contrast': 'rgba(255,255,255,0.2)',
'primer-canvas-backdrop': 'rgba(1,4,9,0.8)',
'primer-canvas-sticky': 'rgba(10,12,16,0.95)',
'primer-fg-disabled': '#7a828e',
'primer-shadow-focus': '0 0 0 3px #1e60d5',
'primer-shadow-highlight': '0 0 transparent',
'primer-shadow-inset': '0 0 transparent',
'project-gradient-in': '#272b33',
'project-gradient-out': 'rgba(39,43,51,0)',
'project-header-bg': '#0a0c10',
'project-sidebar-bg': '#272b33',
'scale-black': '#010409',
'scale-blue-0': '#caeaff',
'scale-blue-1': '#addcff',
'scale-blue-2': '#91cbff',
'scale-blue-3': '#71b7ff',
'scale-blue-4': '#409eff',
'scale-blue-5': '#409eff',
'scale-blue-6': '#318bf8',
'scale-blue-7': '#2672f3',
'scale-blue-8': '#1e60d5',
'scale-blue-9': '#194fb1',
'scale-coral-0': '#FFDED4',
'scale-coral-1': '#FFCBB9',
'scale-coral-2': '#FFB39B',
'scale-coral-3': '#FF967D',
'scale-coral-4': '#FC704F',
'scale-coral-5': '#FC704F',
'scale-coral-6': '#F75133',
'scale-coral-7': '#E03B21',
'scale-coral-8': '#C62612',
'scale-coral-9': '#A91500',
'scale-gray-0': '#ffffff',
'scale-gray-1': '#f0f3f6',
'scale-gray-2': '#d9dee3',
'scale-gray-3': '#bdc4cc',
'scale-gray-4': '#9ea7b3',
'scale-gray-5': '#7a828e',
'scale-gray-6': '#525964',
'scale-gray-7': '#272b33',
'scale-gray-8': '#272b33',
'scale-gray-9': '#0a0c10',
'scale-green-0': '#acf7b6',
'scale-green-1': '#72f088',
'scale-green-2': '#4ae168',
'scale-green-3': '#26cd4d',
'scale-green-4': '#09b43a',
'scale-green-5': '#09b43a',
'scale-green-6': '#02a232',
'scale-green-7': '#008c2c',
'scale-green-8': '#007728',
'scale-green-9': '#006222',
'scale-orange-0': '#ffe1b4',
'scale-orange-1': '#ffcf86',
'scale-orange-2': '#ffb757',
'scale-orange-3': '#fe9a2d',
'scale-orange-4': '#e7811d',
'scale-orange-5': '#e7811d',
'scale-orange-6': '#d57014',
'scale-orange-7': '#bf5e0a',
'scale-orange-8': '#a74c00',
'scale-orange-9': '#8f3c00',
'scale-pink-0': '#ffdceb',
'scale-pink-1': '#ffc7e1',
'scale-pink-2': '#ffadd4',
'scale-pink-3': '#ff8dc7',
'scale-pink-4': '#ef6eb1',
'scale-pink-5': '#ef6eb1',
'scale-pink-6': '#e456a3',
'scale-pink-7': '#d23d91',
'scale-pink-8': '#b72c7d',
'scale-pink-9': '#9c1d6a',
'scale-purple-0': '#f0dfff',
'scale-purple-1': '#e6ccff',
'scale-purple-2': '#dbb7ff',
'scale-purple-3': '#cb9eff',
'scale-purple-4': '#b780ff',
'scale-purple-5': '#b87fff',
'scale-purple-6': '#a66bff',
'scale-purple-7': '#954ffd',
'scale-purple-8': '#8031f7',
'scale-purple-9': '#6921d7',
'scale-red-0': '#ffdedb',
'scale-red-1': '#ffc9c7',
'scale-red-2': '#ffb1af',
'scale-red-3': '#ff9492',
'scale-red-4': '#ff6a69',
'scale-red-5': '#ff6a69',
'scale-red-6': '#ff4445',
'scale-red-7': '#e82a2f',
'scale-red-8': '#cc1421',
'scale-red-9': '#ad0116',
'scale-white': '#ffffff',
'scale-yellow-0': '#fbe59e',
'scale-yellow-1': '#fbd669',
'scale-yellow-2': '#f7c843',
'scale-yellow-3': '#f0b72f',
'scale-yellow-4': '#e09b13',
'scale-yellow-5': '#e09b13',
'scale-yellow-6': '#c88508',
'scale-yellow-7': '#ae7104',
'scale-yellow-8': '#945d02',
'scale-yellow-9': '#7b4900',
'search-keyword-hl': 'rgba(240,183,47,0.4)',
'select-menu-backdrop-border': '#7a828e',
'select-menu-tap-focus-bg': '#1e60d5',
'select-menu-tap-highlight': 'rgba(82,89,100,0.5)',
'severe-emphasis': '#e7811d',
'severe-fg': '#e7811d',
'severe-muted': '#e7811d',
'severe-subtle': 'rgba(231,129,29,0.15)',
'shadow-extra-large': '0 12px 48px #010409',
'shadow-large': '0 8px 24px #010409',
'shadow-medium': '0 3px 6px #010409',
'shadow-small': '0 0 transparent',
'sidenav-selected-bg': '#272b33',
'sponsors-emphasis': '#ef6eb1',
'sponsors-fg': '#ef6eb1',
'sponsors-muted': '#ef6eb1',
'sponsors-subtle': 'rgba(239,110,177,0.15)',
'success-emphasis': '#09b43a',
'success-fg': '#26cd4d',
'success-muted': '#09b43a',
'success-subtle': 'rgba(9,180,58,0.15)',
'timeline-badge-bg': '#272b33',
'topic-tag-border': '#409eff',
'underlinenav-border-hover': '#bdc4cc',
'underlinenav-icon': '#f0f3f6',
);

View file

@ -0,0 +1,418 @@
$variables: (
'accent-emphasis': '#0969da',
'accent-fg': '#0969da',
'accent-muted': 'rgba(84,174,255,0.4)',
'accent-subtle': '#ddf4ff',
'action-list-item-danger-active-bg': '#FFEBE9',
'action-list-item-danger-hover-bg': 'rgba(255,235,233,0.64)',
'action-list-item-danger-hover-text': '#cf222e',
'action-list-item-default-active-bg': 'rgba(208,215,222,0.48)',
'action-list-item-default-hover-bg': 'rgba(208,215,222,0.32)',
'action-list-item-default-selected-bg': 'rgba(208,215,222,0.24)',
'action-list-item-inline-divider': 'rgba(208,215,222,0.48)',
'ansi-black-bright': '#57606a',
'ansi-black': '#24292f',
'ansi-blue-bright': '#218bff',
'ansi-blue': '#0969da',
'ansi-cyan-bright': '#3192aa',
'ansi-cyan': '#1b7c83',
'ansi-gray': '#6e7781',
'ansi-green-bright': '#1a7f37',
'ansi-green': '#116329',
'ansi-magenta-bright': '#a475f9',
'ansi-magenta': '#8250df',
'ansi-red-bright': '#a40e26',
'ansi-red': '#cf222e',
'ansi-white-bright': '#8c959f',
'ansi-white': '#6e7781',
'ansi-yellow-bright': '#633c01',
'ansi-yellow': '#4d2d00',
'attention-emphasis': '#bf8700',
'attention-fg': '#9a6700',
'attention-muted': 'rgba(212,167,44,0.4)',
'attention-subtle': '#fff8c5',
'avatar-bg': '#ffffff',
'avatar-border': 'rgba(27,31,36,0.15)',
'avatar-child-shadow': '-2px -2px 0 rgba(255,255,255,0.8)',
'avatar-stack-fade-more': '#d0d7de',
'avatar-stack-fade': '#afb8c1',
'border-default': '#d0d7de',
'border-muted': 'hsla(210,18%,87%,1)',
'border-subtle': 'rgba(27,31,36,0.15)',
'btn-active-bg': 'hsla(220,14%,93%,1)',
'btn-active-border': 'rgba(27,31,36,0.15)',
'btn-bg': '#f6f8fa',
'btn-border': 'rgba(27,31,36,0.15)',
'btn-counter-bg': 'rgba(27,31,36,0.08)',
'btn-danger-counter-bg': 'rgba(207,34,46,0.1)',
'btn-danger-disabled-bg': '#f6f8fa',
'btn-danger-disabled-counter-bg': 'rgba(207,34,46,0.05)',
'btn-danger-disabled-text': 'rgba(207,34,46,0.5)',
'btn-danger-focus-border': 'rgba(27,31,36,0.15)',
'btn-danger-focus-shadow': '0 0 0 3px rgba(164,14,38,0.4)',
'btn-danger-hover-bg': '#a40e26',
'btn-danger-hover-border': 'rgba(27,31,36,0.15)',
'btn-danger-hover-counter-bg': 'rgba(255,255,255,0.2)',
'btn-danger-hover-icon': '#ffffff',
'btn-danger-hover-inset-shadow': 'inset 0 1px 0 rgba(255,255,255,0.03)',
'btn-danger-hover-shadow': '0 1px 0 rgba(27,31,36,0.1)',
'btn-danger-hover-text': '#ffffff',
'btn-danger-icon': '#cf222e',
'btn-danger-selected-bg': 'hsla(356,72%,44%,1)',
'btn-danger-selected-border': 'rgba(27,31,36,0.15)',
'btn-danger-selected-shadow': 'inset 0 1px 0 rgba(76,0,20,0.2)',
'btn-danger-selected-text': '#ffffff',
'btn-danger-text': '#cf222e',
'btn-focus-bg': '#f6f8fa',
'btn-focus-border': 'rgba(27,31,36,0.15)',
'btn-focus-shadow': '0 0 0 3px rgba(9,105,218,0.3)',
'btn-hover-bg': '#f3f4f6',
'btn-hover-border': 'rgba(27,31,36,0.15)',
'btn-inset-shadow': 'inset 0 1px 0 rgba(255,255,255,0.25)',
'btn-outline-counter-bg': 'rgba(9,105,218,0.1)',
'btn-outline-disabled-bg': '#f6f8fa',
'btn-outline-disabled-counter-bg': 'rgba(9,105,218,0.05)',
'btn-outline-disabled-text': 'rgba(9,105,218,0.5)',
'btn-outline-focus-border': 'rgba(27,31,36,0.15)',
'btn-outline-focus-shadow': '0 0 0 3px rgba(5,80,174,0.4)',
'btn-outline-hover-bg': '#0969da',
'btn-outline-hover-border': 'rgba(27,31,36,0.15)',
'btn-outline-hover-counter-bg': 'rgba(255,255,255,0.2)',
'btn-outline-hover-inset-shadow': 'inset 0 1px 0 rgba(255,255,255,0.03)',
'btn-outline-hover-shadow': '0 1px 0 rgba(27,31,36,0.1)',
'btn-outline-hover-text': '#ffffff',
'btn-outline-selected-bg': 'hsla(212,92%,42%,1)',
'btn-outline-selected-border': 'rgba(27,31,36,0.15)',
'btn-outline-selected-shadow': 'inset 0 1px 0 rgba(0,33,85,0.2)',
'btn-outline-selected-text': '#ffffff',
'btn-outline-text': '#0969da',
'btn-primary-bg': '#2da44e',
'btn-primary-border': 'rgba(27,31,36,0.15)',
'btn-primary-counter-bg': 'rgba(255,255,255,0.2)',
'btn-primary-disabled-bg': '#94d3a2',
'btn-primary-disabled-border': 'rgba(27,31,36,0.15)',
'btn-primary-disabled-text': 'rgba(255,255,255,0.8)',
'btn-primary-focus-bg': '#2da44e',
'btn-primary-focus-border': 'rgba(27,31,36,0.15)',
'btn-primary-focus-shadow': '0 0 0 3px rgba(45,164,78,0.4)',
'btn-primary-hover-bg': '#2c974b',
'btn-primary-hover-border': 'rgba(27,31,36,0.15)',
'btn-primary-icon': 'rgba(255,255,255,0.8)',
'btn-primary-inset-shadow': 'inset 0 1px 0 rgba(255,255,255,0.03)',
'btn-primary-selected-bg': 'hsla(137,55%,36%,1)',
'btn-primary-selected-shadow': 'inset 0 1px 0 rgba(0,45,17,0.2)',
'btn-primary-shadow': '0 1px 0 rgba(27,31,36,0.1)',
'btn-primary-text': '#ffffff',
'btn-selected-bg': 'hsla(220,14%,94%,1)',
'btn-shadow-active': 'inset 0 0.15em 0.3em rgba(27,31,36,0.15)',
'btn-shadow-input-focus': '0 0 0 0.2em rgba(9,105,218,0.3)',
'btn-shadow': '0 1px 0 rgba(27,31,36,0.04)',
'btn-text': '#24292f',
'canvas-default-transparent': 'rgba(255,255,255,0)',
'canvas-default': '#ffffff',
'canvas-inset': '#f6f8fa',
'canvas-overlay': '#ffffff',
'canvas-subtle': '#f6f8fa',
'checks-ansi-black-bright': '#32383f',
'checks-ansi-black': '#24292f',
'checks-ansi-blue-bright': '#80ccff',
'checks-ansi-blue': '#54aeff',
'checks-ansi-cyan-bright': '#b3f0ff',
'checks-ansi-cyan': '#76e3ea',
'checks-ansi-gray': '#8c959f',
'checks-ansi-green-bright': '#6fdd8b',
'checks-ansi-green': '#4ac26b',
'checks-ansi-magenta-bright': '#d8b9ff',
'checks-ansi-magenta': '#c297ff',
'checks-ansi-red-bright': '#ffaba8',
'checks-ansi-red': '#ff8182',
'checks-ansi-white-bright': '#d0d7de',
'checks-ansi-white': '#d0d7de',
'checks-ansi-yellow-bright': '#eac54f',
'checks-ansi-yellow': '#d4a72c',
'checks-bg': '#24292f',
'checks-btn-hover-bg': 'rgba(255,255,255,0.125)',
'checks-btn-hover-icon': '#f6f8fa',
'checks-btn-icon': '#afb8c1',
'checks-container-border-width': '0px',
'checks-donut-error': '#fa4549',
'checks-donut-neutral': '#afb8c1',
'checks-donut-pending': '#bf8700',
'checks-donut-success': '#2da44e',
'checks-dropdown-bg': '#32383f',
'checks-dropdown-border': '#424a53',
'checks-dropdown-btn-hover-bg': '#32383f',
'checks-dropdown-btn-hover-text': '#f6f8fa',
'checks-dropdown-hover-bg': '#424a53',
'checks-dropdown-hover-text': '#f6f8fa',
'checks-dropdown-shadow': 'rgba(27,31,36,0.3)',
'checks-dropdown-text': '#afb8c1',
'checks-gate-bg': 'rgba(125,78,0,0.15)',
'checks-gate-text': '#d0d7de',
'checks-gate-waiting-text': '#afb8c1',
'checks-header-border': '#32383f',
'checks-header-icon': '#8c959f',
'checks-header-label-open-text': '#f6f8fa',
'checks-header-label-text': '#d0d7de',
'checks-input-bg': '#32383f',
'checks-input-focus-text': '#8c959f',
'checks-input-placeholder-text': '#8c959f',
'checks-input-shadow': 'none',
'checks-input-text': '#eaeef2',
'checks-line-dt-fm-bg': '#9a6700',
'checks-line-dt-fm-text': '#24292f',
'checks-line-hover-bg': '#32383f',
'checks-line-num-text': 'rgba(140,149,159,0.75)',
'checks-line-selected-bg': 'rgba(33,139,255,0.15)',
'checks-line-selected-num-text': '#54aeff',
'checks-line-text': '#d0d7de',
'checks-line-timestamp-text': '#8c959f',
'checks-logline-command-text': '#54aeff',
'checks-logline-debug-text': '#c297ff',
'checks-logline-error-bg': 'rgba(164,14,38,0.15)',
'checks-logline-error-num-text': '#ff8182',
'checks-logline-error-text': '#d0d7de',
'checks-logline-num-text': 'rgba(140,149,159,0.75)',
'checks-logline-section-text': '#4ac26b',
'checks-logline-text': '#8c959f',
'checks-logline-warning-bg': 'rgba(125,78,0,0.15)',
'checks-logline-warning-num-text': '#d4a72c',
'checks-logline-warning-text': '#d0d7de',
'checks-run-border-width': '0px',
'checks-scrollbar-thumb-bg': '#57606a',
'checks-step-error-text': '#ff8182',
'checks-step-header-open-bg': '#32383f',
'checks-step-warning-text': '#d4a72c',
'checks-text-link': '#54aeff',
'checks-text-primary': '#f6f8fa',
'checks-text-secondary': '#8c959f',
'codemirror-activeline-bg': 'rgba(234,238,242,0.5)',
'codemirror-bg': '#ffffff',
'codemirror-cursor': '#24292f',
'codemirror-guttermarker-subtle-text': '#6e7781',
'codemirror-guttermarker-text': '#ffffff',
'codemirror-gutters-bg': '#ffffff',
'codemirror-linenumber-text': '#57606a',
'codemirror-lines-bg': '#ffffff',
'codemirror-matchingbracket-text': '#24292f',
'codemirror-selection-bg': 'rgba(84,174,255,0.4)',
'codemirror-syntax-comment': '#24292f',
'codemirror-syntax-constant': '#0550ae',
'codemirror-syntax-entity': '#8250df',
'codemirror-syntax-keyword': '#cf222e',
'codemirror-syntax-storage': '#cf222e',
'codemirror-syntax-string': '#0a3069',
'codemirror-syntax-support': '#0550ae',
'codemirror-syntax-variable': '#953800',
'codemirror-text': '#24292f',
'counter-border': 'rgba(0,0,0,0)',
'danger-emphasis': '#cf222e',
'danger-fg': '#cf222e',
'danger-muted': 'rgba(255,129,130,0.4)',
'danger-subtle': '#FFEBE9',
'diff-blob-addition-fg': '#24292f',
'diff-blob-addition-line-bg': '#E6FFEC',
'diff-blob-addition-num-bg': '#CCFFD8',
'diff-blob-addition-num-text': '#24292f',
'diff-blob-addition-word-bg': '#ABF2BC',
'diff-blob-deletion-fg': '#24292f',
'diff-blob-deletion-line-bg': '#FFEBE9',
'diff-blob-deletion-num-bg': '#FFD7D5',
'diff-blob-deletion-num-text': '#24292f',
'diff-blob-deletion-word-bg': 'rgba(255,129,130,0.4)',
'diff-blob-expander-icon': '#57606a',
'diff-blob-hunk-num-bg': 'rgba(84,174,255,0.4)',
'diff-blob-selected-line-highlight-mix-blend-mode': 'multiply',
'diffstat-addition-bg': '#2da44e',
'diffstat-addition-border': 'rgba(27,31,36,0.15)',
'diffstat-deletion-border': 'rgba(27,31,36,0.15)',
'done-emphasis': '#8250df',
'done-fg': '#8250df',
'done-muted': 'rgba(194,151,255,0.4)',
'done-subtle': '#fbefff',
'fg-default': '#24292f',
'fg-muted': '#57606a',
'fg-on-emphasis': '#ffffff',
'fg-subtle': '#6e7781',
'header-bg': '#24292f',
'header-divider': '#57606a',
'header-logo': '#ffffff',
'header-search-bg': '#24292f',
'header-search-border': '#57606a',
'header-text': 'rgba(255,255,255,0.7)',
'input-disabled-bg': 'rgba(175,184,193,0.2)',
'marketing-icon-primary': '#218bff',
'marketing-icon-secondary': '#54aeff',
'menu-bg-active': 'rgba(0,0,0,0)',
'mktg-btn-bg': '#1b1f23',
'mktg-btn-shadow-focus': 'rgb(0 0 0 / 15%) 0 0 0 4px',
'mktg-btn-shadow-hover-muted': 'rgb(0 0 0 / 70%) 0 0 0 2px inset',
'mktg-btn-shadow-hover':
'0 3px 2px rgba(0, 0, 0, 0.07), 0 7px 5px rgba(0, 0, 0, 0.04), 0 12px 10px rgba(0, 0, 0, 0.03), 0 22px 18px rgba(0, 0, 0, 0.03), 0 42px 33px rgba(0, 0, 0, 0.02), 0 100px 80px rgba(0, 0, 0, 0.02)',
'mktg-btn-shadow-outline': 'rgb(0 0 0 / 15%) 0 0 0 1px inset',
'neutral-emphasis-plus': '#24292f',
'neutral-emphasis': '#6e7781',
'neutral-muted': 'rgba(175,184,193,0.2)',
'neutral-subtle': 'rgba(234,238,242,0.5)',
'overlay-shadow': '0 1px 3px rgba(27,31,36,0.12), 0 8px 24px rgba(66,74,83,0.12)',
'page-header-bg': '#f6f8fa',
'prettylights-syntax-brackethighlighter-angle': '#57606a',
'prettylights-syntax-brackethighlighter-unmatched': '#82071e',
'prettylights-syntax-carriage-return-bg': '#cf222e',
'prettylights-syntax-carriage-return-text': '#f6f8fa',
'prettylights-syntax-comment': '#6e7781',
'prettylights-syntax-constant-other-reference-link': '#0a3069',
'prettylights-syntax-constant': '#0550ae',
'prettylights-syntax-entity-tag': '#116329',
'prettylights-syntax-entity': '#8250df',
'prettylights-syntax-invalid-illegal-bg': '#82071e',
'prettylights-syntax-invalid-illegal-text': '#f6f8fa',
'prettylights-syntax-keyword': '#cf222e',
'prettylights-syntax-markup-bold': '#24292f',
'prettylights-syntax-markup-changed-bg': '#ffd8b5',
'prettylights-syntax-markup-changed-text': '#953800',
'prettylights-syntax-markup-deleted-bg': '#FFEBE9',
'prettylights-syntax-markup-deleted-text': '#82071e',
'prettylights-syntax-markup-heading': '#0550ae',
'prettylights-syntax-markup-ignored-bg': '#0550ae',
'prettylights-syntax-markup-ignored-text': '#eaeef2',
'prettylights-syntax-markup-inserted-bg': '#dafbe1',
'prettylights-syntax-markup-inserted-text': '#116329',
'prettylights-syntax-markup-italic': '#24292f',
'prettylights-syntax-markup-list': '#3b2300',
'prettylights-syntax-meta-diff-range': '#8250df',
'prettylights-syntax-storage-modifier-import': '#24292f',
'prettylights-syntax-string-regexp': '#116329',
'prettylights-syntax-string': '#0a3069',
'prettylights-syntax-sublimelinter-gutter-mark': '#8c959f',
'prettylights-syntax-variable': '#953800',
'primer-border-active': '#FD8C73',
'primer-border-contrast': 'rgba(27,31,36,0.1)',
'primer-canvas-backdrop': 'rgba(27,31,36,0.5)',
'primer-canvas-sticky': 'rgba(255,255,255,0.95)',
'primer-fg-disabled': '#8c959f',
'primer-shadow-focus': '0 0 0 3px rgba(9,105,218,0.3)',
'primer-shadow-highlight': 'inset 0 1px 0 rgba(255,255,255,0.25)',
'primer-shadow-inset': 'inset 0 1px 0 rgba(208,215,222,0.2)',
'project-gradient-in': '#ffffff',
'project-gradient-out': 'rgba(255,255,255,0)',
'project-header-bg': '#24292f',
'project-sidebar-bg': '#ffffff',
'scale-black': '#1b1f24',
'scale-blue-0': '#ddf4ff',
'scale-blue-1': '#b6e3ff',
'scale-blue-2': '#80ccff',
'scale-blue-3': '#54aeff',
'scale-blue-4': '#218bff',
'scale-blue-5': '#0969da',
'scale-blue-6': '#0550ae',
'scale-blue-7': '#033d8b',
'scale-blue-8': '#0a3069',
'scale-blue-9': '#002155',
'scale-coral-0': '#FFF0EB',
'scale-coral-1': '#FFD6CC',
'scale-coral-2': '#FFB4A1',
'scale-coral-3': '#FD8C73',
'scale-coral-4': '#EC6547',
'scale-coral-5': '#C4432B',
'scale-coral-6': '#9E2F1C',
'scale-coral-7': '#801F0F',
'scale-coral-8': '#691105',
'scale-coral-9': '#510901',
'scale-gray-0': '#f6f8fa',
'scale-gray-1': '#eaeef2',
'scale-gray-2': '#d0d7de',
'scale-gray-3': '#afb8c1',
'scale-gray-4': '#8c959f',
'scale-gray-5': '#6e7781',
'scale-gray-6': '#57606a',
'scale-gray-7': '#424a53',
'scale-gray-8': '#32383f',
'scale-gray-9': '#24292f',
'scale-green-0': '#dafbe1',
'scale-green-1': '#aceebb',
'scale-green-2': '#6fdd8b',
'scale-green-3': '#4ac26b',
'scale-green-4': '#2da44e',
'scale-green-5': '#1a7f37',
'scale-green-6': '#116329',
'scale-green-7': '#044f1e',
'scale-green-8': '#003d16',
'scale-green-9': '#002d11',
'scale-orange-0': '#fff1e5',
'scale-orange-1': '#ffd8b5',
'scale-orange-2': '#ffb77c',
'scale-orange-3': '#fb8f44',
'scale-orange-4': '#e16f24',
'scale-orange-5': '#bc4c00',
'scale-orange-6': '#953800',
'scale-orange-7': '#762c00',
'scale-orange-8': '#5c2200',
'scale-orange-9': '#471700',
'scale-pink-0': '#ffeff7',
'scale-pink-1': '#ffd3eb',
'scale-pink-2': '#ffadda',
'scale-pink-3': '#ff80c8',
'scale-pink-4': '#e85aad',
'scale-pink-5': '#bf3989',
'scale-pink-6': '#99286e',
'scale-pink-7': '#772057',
'scale-pink-8': '#611347',
'scale-pink-9': '#4d0336',
'scale-purple-0': '#fbefff',
'scale-purple-1': '#ecd8ff',
'scale-purple-2': '#d8b9ff',
'scale-purple-3': '#c297ff',
'scale-purple-4': '#a475f9',
'scale-purple-5': '#8250df',
'scale-purple-6': '#6639ba',
'scale-purple-7': '#512a97',
'scale-purple-8': '#3e1f79',
'scale-purple-9': '#2e1461',
'scale-red-0': '#FFEBE9',
'scale-red-1': '#ffcecb',
'scale-red-2': '#ffaba8',
'scale-red-3': '#ff8182',
'scale-red-4': '#fa4549',
'scale-red-5': '#cf222e',
'scale-red-6': '#a40e26',
'scale-red-7': '#82071e',
'scale-red-8': '#660018',
'scale-red-9': '#4c0014',
'scale-white': '#ffffff',
'scale-yellow-0': '#fff8c5',
'scale-yellow-1': '#fae17d',
'scale-yellow-2': '#eac54f',
'scale-yellow-3': '#d4a72c',
'scale-yellow-4': '#bf8700',
'scale-yellow-5': '#9a6700',
'scale-yellow-6': '#7d4e00',
'scale-yellow-7': '#633c01',
'scale-yellow-8': '#4d2d00',
'scale-yellow-9': '#3b2300',
'search-keyword-hl': '#fff8c5',
'select-menu-backdrop-border': 'rgba(0,0,0,0)',
'select-menu-tap-focus-bg': '#b6e3ff',
'select-menu-tap-highlight': 'rgba(175,184,193,0.5)',
'severe-emphasis': '#bc4c00',
'severe-fg': '#bc4c00',
'severe-muted': 'rgba(251,143,68,0.4)',
'severe-subtle': '#fff1e5',
'shadow-extra-large': '0 12px 28px rgba(140,149,159,0.3)',
'shadow-large': '0 8px 24px rgba(140,149,159,0.2)',
'shadow-medium': '0 3px 6px rgba(140,149,159,0.15)',
'shadow-small': '0 1px 0 rgba(27,31,36,0.04)',
'sidenav-selected-bg': '#ffffff',
'sponsors-emphasis': '#bf3989',
'sponsors-fg': '#bf3989',
'sponsors-muted': 'rgba(255,128,200,0.4)',
'sponsors-subtle': '#ffeff7',
'success-emphasis': '#2da44e',
'success-fg': '#1a7f37',
'success-muted': 'rgba(74,194,107,0.4)',
'success-subtle': '#dafbe1',
'timeline-badge-bg': '#eaeef2',
'topic-tag-border': 'rgba(0,0,0,0)',
'underlinenav-border-hover': 'rgba(175,184,193,0.2)',
'underlinenav-icon': '#6e7781',
);

View file

@ -0,0 +1,418 @@
$variables: (
'accent-emphasis': '#0969da',
'accent-fg': '#0969da',
'accent-muted': 'rgba(84,174,255,0.4)',
'accent-subtle': '#ddf4ff',
'action-list-item-danger-active-bg': '#fefe48',
'action-list-item-danger-hover-bg': 'rgba(254,254,72,0.64)',
'action-list-item-danger-hover-text': '#ac5e00',
'action-list-item-default-active-bg': 'rgba(208,215,222,0.48)',
'action-list-item-default-hover-bg': 'rgba(208,215,222,0.32)',
'action-list-item-default-selected-bg': 'rgba(208,215,222,0.24)',
'action-list-item-inline-divider': 'rgba(208,215,222,0.48)',
'ansi-black-bright': '#57606a',
'ansi-black': '#24292f',
'ansi-blue-bright': '#218bff',
'ansi-blue': '#0969da',
'ansi-cyan-bright': '#3192aa',
'ansi-cyan': '#1b7c83',
'ansi-gray': '#6e7781',
'ansi-green-bright': '#0566d5',
'ansi-green': '#054da9',
'ansi-magenta-bright': '#a475f9',
'ansi-magenta': '#8250df',
'ansi-red-bright': '#8b4600',
'ansi-red': '#ac5e00',
'ansi-white-bright': '#8c959f',
'ansi-white': '#6e7781',
'ansi-yellow-bright': '#633c01',
'ansi-yellow': '#4d2d00',
'attention-emphasis': '#bf8700',
'attention-fg': '#9a6700',
'attention-muted': 'rgba(212,167,44,0.4)',
'attention-subtle': '#fff8c5',
'avatar-bg': '#ffffff',
'avatar-border': 'rgba(27,31,36,0.15)',
'avatar-child-shadow': '-2px -2px 0 rgba(255,255,255,0.8)',
'avatar-stack-fade-more': '#d0d7de',
'avatar-stack-fade': '#afb8c1',
'border-default': '#d0d7de',
'border-muted': 'hsla(210,18%,87%,1)',
'border-subtle': 'rgba(27,31,36,0.15)',
'btn-active-bg': 'hsla(220,14%,93%,1)',
'btn-active-border': 'rgba(27,31,36,0.15)',
'btn-bg': '#f6f8fa',
'btn-border': 'rgba(27,31,36,0.15)',
'btn-counter-bg': 'rgba(27,31,36,0.08)',
'btn-danger-counter-bg': 'rgba(172,94,0,0.1)',
'btn-danger-disabled-bg': '#f6f8fa',
'btn-danger-disabled-counter-bg': 'rgba(172,94,0,0.05)',
'btn-danger-disabled-text': 'rgba(172,94,0,0.5)',
'btn-danger-focus-border': 'rgba(27,31,36,0.15)',
'btn-danger-focus-shadow': '0 0 0 3px rgba(139,70,0,0.4)',
'btn-danger-hover-bg': '#8b4600',
'btn-danger-hover-border': 'rgba(27,31,36,0.15)',
'btn-danger-hover-counter-bg': 'rgba(255,255,255,0.2)',
'btn-danger-hover-icon': '#ffffff',
'btn-danger-hover-inset-shadow': 'inset 0 1px 0 rgba(255,255,255,0.03)',
'btn-danger-hover-shadow': '0 1px 0 rgba(27,31,36,0.1)',
'btn-danger-hover-text': '#ffffff',
'btn-danger-icon': '#ac5e00',
'btn-danger-selected-bg': 'hsla(33,100%,31%,1)',
'btn-danger-selected-border': 'rgba(27,31,36,0.15)',
'btn-danger-selected-shadow': 'inset 0 1px 0 rgba(47,41,0,0.2)',
'btn-danger-selected-text': '#ffffff',
'btn-danger-text': '#ac5e00',
'btn-focus-bg': '#f6f8fa',
'btn-focus-border': 'rgba(27,31,36,0.15)',
'btn-focus-shadow': '0 0 0 3px rgba(9,105,218,0.3)',
'btn-hover-bg': '#f3f4f6',
'btn-hover-border': 'rgba(27,31,36,0.15)',
'btn-inset-shadow': 'inset 0 1px 0 rgba(255,255,255,0.25)',
'btn-outline-counter-bg': 'rgba(9,105,218,0.1)',
'btn-outline-disabled-bg': '#f6f8fa',
'btn-outline-disabled-counter-bg': 'rgba(9,105,218,0.05)',
'btn-outline-disabled-text': 'rgba(9,105,218,0.5)',
'btn-outline-focus-border': 'rgba(27,31,36,0.15)',
'btn-outline-focus-shadow': '0 0 0 3px rgba(5,80,174,0.4)',
'btn-outline-hover-bg': '#0969da',
'btn-outline-hover-border': 'rgba(27,31,36,0.15)',
'btn-outline-hover-counter-bg': 'rgba(255,255,255,0.2)',
'btn-outline-hover-inset-shadow': 'inset 0 1px 0 rgba(255,255,255,0.03)',
'btn-outline-hover-shadow': '0 1px 0 rgba(27,31,36,0.1)',
'btn-outline-hover-text': '#ffffff',
'btn-outline-selected-bg': 'hsla(212,92%,42%,1)',
'btn-outline-selected-border': 'rgba(27,31,36,0.15)',
'btn-outline-selected-shadow': 'inset 0 1px 0 rgba(0,33,85,0.2)',
'btn-outline-selected-text': '#ffffff',
'btn-outline-text': '#0969da',
'btn-primary-bg': '#0088ff',
'btn-primary-border': 'rgba(27,31,36,0.15)',
'btn-primary-counter-bg': 'rgba(255,255,255,0.2)',
'btn-primary-disabled-bg': '#65ccff',
'btn-primary-disabled-border': 'rgba(27,31,36,0.15)',
'btn-primary-disabled-text': 'rgba(255,255,255,0.8)',
'btn-primary-focus-bg': '#0088ff',
'btn-primary-focus-border': 'rgba(27,31,36,0.15)',
'btn-primary-focus-shadow': '0 0 0 3px rgba(0,136,255,0.4)',
'btn-primary-hover-bg': '#0566d5',
'btn-primary-hover-border': 'rgba(27,31,36,0.15)',
'btn-primary-icon': 'rgba(255,255,255,0.8)',
'btn-primary-inset-shadow': 'inset 0 1px 0 rgba(255,255,255,0.03)',
'btn-primary-selected-bg': 'hsla(212,95%,41%,1)',
'btn-primary-selected-shadow': 'inset 0 1px 0 rgba(0,31,80,0.2)',
'btn-primary-shadow': '0 1px 0 rgba(27,31,36,0.1)',
'btn-primary-text': '#ffffff',
'btn-selected-bg': 'hsla(220,14%,94%,1)',
'btn-shadow-active': 'inset 0 0.15em 0.3em rgba(27,31,36,0.15)',
'btn-shadow-input-focus': '0 0 0 0.2em rgba(9,105,218,0.3)',
'btn-shadow': '0 1px 0 rgba(27,31,36,0.04)',
'btn-text': '#24292f',
'canvas-default-transparent': 'rgba(255,255,255,0)',
'canvas-default': '#ffffff',
'canvas-inset': '#f6f8fa',
'canvas-overlay': '#ffffff',
'canvas-subtle': '#f6f8fa',
'checks-ansi-black-bright': '#32383f',
'checks-ansi-black': '#24292f',
'checks-ansi-blue-bright': '#80ccff',
'checks-ansi-blue': '#54aeff',
'checks-ansi-cyan-bright': '#b3f0ff',
'checks-ansi-cyan': '#76e3ea',
'checks-ansi-gray': '#8c959f',
'checks-ansi-green-bright': '#65ccff',
'checks-ansi-green': '#35adff',
'checks-ansi-magenta-bright': '#d8b9ff',
'checks-ansi-magenta': '#c297ff',
'checks-ansi-red-bright': '#f8c200',
'checks-ansi-red': '#e7a100',
'checks-ansi-white-bright': '#d0d7de',
'checks-ansi-white': '#d0d7de',
'checks-ansi-yellow-bright': '#eac54f',
'checks-ansi-yellow': '#d4a72c',
'checks-bg': '#24292f',
'checks-btn-hover-bg': 'rgba(255,255,255,0.125)',
'checks-btn-hover-icon': '#f6f8fa',
'checks-btn-icon': '#afb8c1',
'checks-container-border-width': '0px',
'checks-donut-error': '#d08002',
'checks-donut-neutral': '#afb8c1',
'checks-donut-pending': '#bf8700',
'checks-donut-success': '#0088ff',
'checks-dropdown-bg': '#32383f',
'checks-dropdown-border': '#424a53',
'checks-dropdown-btn-hover-bg': '#32383f',
'checks-dropdown-btn-hover-text': '#f6f8fa',
'checks-dropdown-hover-bg': '#424a53',
'checks-dropdown-hover-text': '#f6f8fa',
'checks-dropdown-shadow': 'rgba(27,31,36,0.3)',
'checks-dropdown-text': '#afb8c1',
'checks-gate-bg': 'rgba(125,78,0,0.15)',
'checks-gate-text': '#d0d7de',
'checks-gate-waiting-text': '#afb8c1',
'checks-header-border': '#32383f',
'checks-header-icon': '#8c959f',
'checks-header-label-open-text': '#f6f8fa',
'checks-header-label-text': '#d0d7de',
'checks-input-bg': '#32383f',
'checks-input-focus-text': '#8c959f',
'checks-input-placeholder-text': '#8c959f',
'checks-input-shadow': 'none',
'checks-input-text': '#eaeef2',
'checks-line-dt-fm-bg': '#9a6700',
'checks-line-dt-fm-text': '#24292f',
'checks-line-hover-bg': '#32383f',
'checks-line-num-text': 'rgba(140,149,159,0.75)',
'checks-line-selected-bg': 'rgba(33,139,255,0.15)',
'checks-line-selected-num-text': '#54aeff',
'checks-line-text': '#d0d7de',
'checks-line-timestamp-text': '#8c959f',
'checks-logline-command-text': '#54aeff',
'checks-logline-debug-text': '#c297ff',
'checks-logline-error-bg': 'rgba(139,70,0,0.15)',
'checks-logline-error-num-text': '#e7a100',
'checks-logline-error-text': '#d0d7de',
'checks-logline-num-text': 'rgba(140,149,159,0.75)',
'checks-logline-section-text': '#35adff',
'checks-logline-text': '#8c959f',
'checks-logline-warning-bg': 'rgba(125,78,0,0.15)',
'checks-logline-warning-num-text': '#d4a72c',
'checks-logline-warning-text': '#d0d7de',
'checks-run-border-width': '0px',
'checks-scrollbar-thumb-bg': '#57606a',
'checks-step-error-text': '#e7a100',
'checks-step-header-open-bg': '#32383f',
'checks-step-warning-text': '#d4a72c',
'checks-text-link': '#54aeff',
'checks-text-primary': '#f6f8fa',
'checks-text-secondary': '#8c959f',
'codemirror-activeline-bg': 'rgba(234,238,242,0.5)',
'codemirror-bg': '#ffffff',
'codemirror-cursor': '#24292f',
'codemirror-guttermarker-subtle-text': '#6e7781',
'codemirror-guttermarker-text': '#ffffff',
'codemirror-gutters-bg': '#ffffff',
'codemirror-linenumber-text': '#57606a',
'codemirror-lines-bg': '#ffffff',
'codemirror-matchingbracket-text': '#24292f',
'codemirror-selection-bg': 'rgba(84,174,255,0.4)',
'codemirror-syntax-comment': '#24292f',
'codemirror-syntax-constant': '#0550ae',
'codemirror-syntax-entity': '#8250df',
'codemirror-syntax-keyword': '#ac5e00',
'codemirror-syntax-storage': '#ac5e00',
'codemirror-syntax-string': '#0a3069',
'codemirror-syntax-support': '#0550ae',
'codemirror-syntax-variable': '#953800',
'codemirror-text': '#24292f',
'counter-border': 'rgba(0,0,0,0)',
'danger-emphasis': '#ac5e00',
'danger-fg': '#ac5e00',
'danger-muted': 'rgba(231,161,0,0.4)',
'danger-subtle': '#fefe48',
'diff-blob-addition-fg': '#24292f',
'diff-blob-addition-line-bg': 'rgba(192,246,255,0.5)',
'diff-blob-addition-num-bg': 'rgba(53,173,255,0.4)',
'diff-blob-addition-num-text': '#24292f',
'diff-blob-addition-word-bg': 'rgba(53,173,255,0.4)',
'diff-blob-deletion-fg': '#24292f',
'diff-blob-deletion-line-bg': 'rgba(254,254,72,0.5)',
'diff-blob-deletion-num-bg': 'rgba(231,161,0,0.4)',
'diff-blob-deletion-num-text': '#24292f',
'diff-blob-deletion-word-bg': 'rgba(248,194,0,0.5)',
'diff-blob-expander-icon': '#57606a',
'diff-blob-hunk-num-bg': 'rgba(84,174,255,0.4)',
'diff-blob-selected-line-highlight-mix-blend-mode': 'multiply',
'diffstat-addition-bg': '#0088ff',
'diffstat-addition-border': 'rgba(27,31,36,0.15)',
'diffstat-deletion-border': 'rgba(27,31,36,0.15)',
'done-emphasis': '#8250df',
'done-fg': '#8250df',
'done-muted': 'rgba(194,151,255,0.4)',
'done-subtle': '#fbefff',
'fg-default': '#24292f',
'fg-muted': '#57606a',
'fg-on-emphasis': '#ffffff',
'fg-subtle': '#6e7781',
'header-bg': '#24292f',
'header-divider': '#57606a',
'header-logo': '#ffffff',
'header-search-bg': '#24292f',
'header-search-border': '#57606a',
'header-text': 'rgba(255,255,255,0.7)',
'input-disabled-bg': 'rgba(175,184,193,0.2)',
'marketing-icon-primary': '#218bff',
'marketing-icon-secondary': '#54aeff',
'menu-bg-active': 'rgba(0,0,0,0)',
'mktg-btn-bg': '#1b1f23',
'mktg-btn-shadow-focus': 'rgb(0 0 0 / 15%) 0 0 0 4px',
'mktg-btn-shadow-hover-muted': 'rgb(0 0 0 / 70%) 0 0 0 2px inset',
'mktg-btn-shadow-hover':
'0 3px 2px rgba(0, 0, 0, 0.07), 0 7px 5px rgba(0, 0, 0, 0.04), 0 12px 10px rgba(0, 0, 0, 0.03), 0 22px 18px rgba(0, 0, 0, 0.03), 0 42px 33px rgba(0, 0, 0, 0.02), 0 100px 80px rgba(0, 0, 0, 0.02)',
'mktg-btn-shadow-outline': 'rgb(0 0 0 / 15%) 0 0 0 1px inset',
'neutral-emphasis-plus': '#24292f',
'neutral-emphasis': '#6e7781',
'neutral-muted': 'rgba(175,184,193,0.2)',
'neutral-subtle': 'rgba(234,238,242,0.5)',
'overlay-shadow': '0 1px 3px rgba(27,31,36,0.12), 0 8px 24px rgba(66,74,83,0.12)',
'page-header-bg': '#f6f8fa',
'prettylights-syntax-brackethighlighter-angle': '#57606a',
'prettylights-syntax-brackethighlighter-unmatched': '#6c3900',
'prettylights-syntax-carriage-return-bg': '#ac5e00',
'prettylights-syntax-carriage-return-text': '#f6f8fa',
'prettylights-syntax-comment': '#6e7781',
'prettylights-syntax-constant-other-reference-link': '#0a3069',
'prettylights-syntax-constant': '#0550ae',
'prettylights-syntax-entity-tag': '#054da9',
'prettylights-syntax-entity': '#8250df',
'prettylights-syntax-invalid-illegal-bg': '#6c3900',
'prettylights-syntax-invalid-illegal-text': '#f6f8fa',
'prettylights-syntax-keyword': '#ac5e00',
'prettylights-syntax-markup-bold': '#24292f',
'prettylights-syntax-markup-changed-bg': '#ffd8b5',
'prettylights-syntax-markup-changed-text': '#953800',
'prettylights-syntax-markup-deleted-bg': '#fefe48',
'prettylights-syntax-markup-deleted-text': '#6c3900',
'prettylights-syntax-markup-heading': '#0550ae',
'prettylights-syntax-markup-ignored-bg': '#0550ae',
'prettylights-syntax-markup-ignored-text': '#eaeef2',
'prettylights-syntax-markup-inserted-bg': '#c0f6ff',
'prettylights-syntax-markup-inserted-text': '#054da9',
'prettylights-syntax-markup-italic': '#24292f',
'prettylights-syntax-markup-list': '#3b2300',
'prettylights-syntax-meta-diff-range': '#8250df',
'prettylights-syntax-storage-modifier-import': '#24292f',
'prettylights-syntax-string-regexp': '#054da9',
'prettylights-syntax-string': '#0a3069',
'prettylights-syntax-sublimelinter-gutter-mark': '#8c959f',
'prettylights-syntax-variable': '#953800',
'primer-border-active': '#FD8C73',
'primer-border-contrast': 'rgba(27,31,36,0.1)',
'primer-canvas-backdrop': 'rgba(27,31,36,0.5)',
'primer-canvas-sticky': 'rgba(255,255,255,0.95)',
'primer-fg-disabled': '#8c959f',
'primer-shadow-focus': '0 0 0 3px rgba(9,105,218,0.3)',
'primer-shadow-highlight': 'inset 0 1px 0 rgba(255,255,255,0.25)',
'primer-shadow-inset': 'inset 0 1px 0 rgba(208,215,222,0.2)',
'project-gradient-in': '#ffffff',
'project-gradient-out': 'rgba(255,255,255,0)',
'project-header-bg': '#24292f',
'project-sidebar-bg': '#ffffff',
'scale-black': '#1b1f24',
'scale-blue-0': '#ddf4ff',
'scale-blue-1': '#b6e3ff',
'scale-blue-2': '#80ccff',
'scale-blue-3': '#54aeff',
'scale-blue-4': '#218bff',
'scale-blue-5': '#0969da',
'scale-blue-6': '#0550ae',
'scale-blue-7': '#033d8b',
'scale-blue-8': '#0a3069',
'scale-blue-9': '#002155',
'scale-coral-0': '#FFF0EB',
'scale-coral-1': '#FFD6CC',
'scale-coral-2': '#FFB4A1',
'scale-coral-3': '#FD8C73',
'scale-coral-4': '#EC6547',
'scale-coral-5': '#C4432B',
'scale-coral-6': '#9E2F1C',
'scale-coral-7': '#801F0F',
'scale-coral-8': '#691105',
'scale-coral-9': '#510901',
'scale-gray-0': '#f6f8fa',
'scale-gray-1': '#eaeef2',
'scale-gray-2': '#d0d7de',
'scale-gray-3': '#afb8c1',
'scale-gray-4': '#8c959f',
'scale-gray-5': '#6e7781',
'scale-gray-6': '#57606a',
'scale-gray-7': '#424a53',
'scale-gray-8': '#32383f',
'scale-gray-9': '#24292f',
'scale-green-0': '#c0f6ff',
'scale-green-1': '#96e5ff',
'scale-green-2': '#65ccff',
'scale-green-3': '#35adff',
'scale-green-4': '#0088ff',
'scale-green-5': '#0566d5',
'scale-green-6': '#054da9',
'scale-green-7': '#033a86',
'scale-green-8': '#002d68',
'scale-green-9': '#001f50',
'scale-orange-0': '#fff1e5',
'scale-orange-1': '#ffd8b5',
'scale-orange-2': '#ffb77c',
'scale-orange-3': '#fb8f44',
'scale-orange-4': '#e16f24',
'scale-orange-5': '#bc4c00',
'scale-orange-6': '#953800',
'scale-orange-7': '#762c00',
'scale-orange-8': '#5c2200',
'scale-orange-9': '#471700',
'scale-pink-0': '#ffeff7',
'scale-pink-1': '#ffd3eb',
'scale-pink-2': '#ffadda',
'scale-pink-3': '#ff80c8',
'scale-pink-4': '#e85aad',
'scale-pink-5': '#bf3989',
'scale-pink-6': '#99286e',
'scale-pink-7': '#772057',
'scale-pink-8': '#611347',
'scale-pink-9': '#4d0336',
'scale-purple-0': '#fbefff',
'scale-purple-1': '#ecd8ff',
'scale-purple-2': '#d8b9ff',
'scale-purple-3': '#c297ff',
'scale-purple-4': '#a475f9',
'scale-purple-5': '#8250df',
'scale-purple-6': '#6639ba',
'scale-purple-7': '#512a97',
'scale-purple-8': '#3e1f79',
'scale-purple-9': '#2e1461',
'scale-red-0': '#fefe48',
'scale-red-1': '#fee325',
'scale-red-2': '#f8c200',
'scale-red-3': '#e7a100',
'scale-red-4': '#d08002',
'scale-red-5': '#ac5e00',
'scale-red-6': '#8b4600',
'scale-red-7': '#6c3900',
'scale-red-8': '#4c3100',
'scale-red-9': '#2f2900',
'scale-white': '#ffffff',
'scale-yellow-0': '#fff8c5',
'scale-yellow-1': '#fae17d',
'scale-yellow-2': '#eac54f',
'scale-yellow-3': '#d4a72c',
'scale-yellow-4': '#bf8700',
'scale-yellow-5': '#9a6700',
'scale-yellow-6': '#7d4e00',
'scale-yellow-7': '#633c01',
'scale-yellow-8': '#4d2d00',
'scale-yellow-9': '#3b2300',
'search-keyword-hl': '#fff8c5',
'select-menu-backdrop-border': 'rgba(0,0,0,0)',
'select-menu-tap-focus-bg': '#b6e3ff',
'select-menu-tap-highlight': 'rgba(175,184,193,0.5)',
'severe-emphasis': '#bc4c00',
'severe-fg': '#bc4c00',
'severe-muted': 'rgba(251,143,68,0.4)',
'severe-subtle': '#fff1e5',
'shadow-extra-large': '0 12px 28px rgba(140,149,159,0.3)',
'shadow-large': '0 8px 24px rgba(140,149,159,0.2)',
'shadow-medium': '0 3px 6px rgba(140,149,159,0.15)',
'shadow-small': '0 1px 0 rgba(27,31,36,0.04)',
'sidenav-selected-bg': '#ffffff',
'sponsors-emphasis': '#bf3989',
'sponsors-fg': '#bf3989',
'sponsors-muted': 'rgba(255,128,200,0.4)',
'sponsors-subtle': '#ffeff7',
'success-emphasis': '#0088ff',
'success-fg': '#0566d5',
'success-muted': 'rgba(53,173,255,0.4)',
'success-subtle': '#c0f6ff',
'timeline-badge-bg': '#eaeef2',
'topic-tag-border': 'rgba(0,0,0,0)',
'underlinenav-border-hover': 'rgba(175,184,193,0.2)',
'underlinenav-icon': '#6e7781',
);

View file

@ -0,0 +1,418 @@
$variables: (
'accent-emphasis': '#0349b4',
'accent-fg': '#0349b4',
'accent-muted': '#368cf9',
'accent-subtle': '#dff7ff',
'action-list-item-danger-active-bg': '#fff0ee',
'action-list-item-danger-hover-bg': 'rgba(255,240,238,0.64)',
'action-list-item-danger-hover-text': '#a0111f',
'action-list-item-default-active-bg': 'rgba(206,213,220,0.48)',
'action-list-item-default-hover-bg': 'rgba(206,213,220,0.32)',
'action-list-item-default-selected-bg': 'rgba(206,213,220,0.24)',
'action-list-item-inline-divider': 'rgba(32,37,44,0.48)',
'ansi-black-bright': '#4B535D',
'ansi-black': '#0E1116',
'ansi-blue-bright': '#1168e3',
'ansi-blue': '#0349b4',
'ansi-cyan-bright': '#3192aa',
'ansi-cyan': '#1b7c83',
'ansi-gray': '#66707B',
'ansi-green-bright': '#055d20',
'ansi-green': '#024c1a',
'ansi-magenta-bright': '#844ae7',
'ansi-magenta': '#622cbc',
'ansi-red-bright': '#86061d',
'ansi-red': '#a0111f',
'ansi-white-bright': '#88929D',
'ansi-white': '#66707B',
'ansi-yellow-bright': '#4e2c00',
'ansi-yellow': '#3f2200',
'attention-emphasis': '#744500',
'attention-fg': '#744500',
'attention-muted': '#b58407',
'attention-subtle': '#fcf7be',
'avatar-bg': '#ffffff',
'avatar-border': 'rgba(1,4,9,0.8)',
'avatar-child-shadow': '-2px -2px 0 rgba(255,255,255,0.8)',
'avatar-stack-fade-more': '#CED5DC',
'avatar-stack-fade': '#ACB6C0',
'border-default': '#20252C',
'border-muted': '#88929D',
'border-subtle': 'rgba(1,4,9,0.8)',
'btn-active-bg': '#ACB6C0',
'btn-active-border': 'rgba(1,4,9,0.8)',
'btn-bg': '#E7ECF0',
'btn-border': 'rgba(1,4,9,0.8)',
'btn-counter-bg': 'rgba(1,4,9,0.08)',
'btn-danger-counter-bg': 'rgba(160,17,31,0.1)',
'btn-danger-disabled-bg': '#E7ECF0',
'btn-danger-disabled-counter-bg': 'rgba(160,17,31,0.05)',
'btn-danger-disabled-text': 'rgba(160,17,31,0.5)',
'btn-danger-focus-border': '#6e011a',
'btn-danger-focus-shadow': '0 0 0 3px rgba(134,6,29,0.4)',
'btn-danger-hover-bg': '#a0111f',
'btn-danger-hover-border': '#6e011a',
'btn-danger-hover-counter-bg': 'rgba(255,255,255,0.2)',
'btn-danger-hover-icon': '#ffffff',
'btn-danger-hover-inset-shadow': 'inset 0 1px 0 rgba(255,255,255,0.03)',
'btn-danger-hover-shadow': '0 1px 0 rgba(1,4,9,0.1)',
'btn-danger-hover-text': '#ffffff',
'btn-danger-icon': '#86061d',
'btn-danger-selected-bg': '#6e011a',
'btn-danger-selected-border': '#6e011a',
'btn-danger-selected-shadow': 'inset 0 1px 0 rgba(67,0,17,0.2)',
'btn-danger-selected-text': '#ffffff',
'btn-danger-text': '#86061d',
'btn-focus-bg': '#CED5DC',
'btn-focus-border': 'rgba(1,4,9,0.8)',
'btn-focus-shadow': '0 0 0 3px rgba(3,73,180,0.3)',
'btn-hover-bg': '#CED5DC',
'btn-hover-border': 'rgba(1,4,9,0.8)',
'btn-inset-shadow': 'inset 0 1px 0 rgba(255,255,255,0.25)',
'btn-outline-counter-bg': 'rgba(3,73,180,0.1)',
'btn-outline-disabled-bg': '#E7ECF0',
'btn-outline-disabled-counter-bg': 'rgba(3,73,180,0.05)',
'btn-outline-disabled-text': 'rgba(3,73,180,0.5)',
'btn-outline-focus-border': '#022f7a',
'btn-outline-focus-shadow': '0 0 0 3px rgba(2,59,149,0.4)',
'btn-outline-hover-bg': '#0349b4',
'btn-outline-hover-border': '#022f7a',
'btn-outline-hover-counter-bg': 'rgba(255,255,255,0.2)',
'btn-outline-hover-inset-shadow': 'inset 0 1px 0 rgba(255,255,255,0.03)',
'btn-outline-hover-shadow': '0 1px 0 rgba(1,4,9,0.1)',
'btn-outline-hover-text': '#ffffff',
'btn-outline-selected-bg': '#022f7a',
'btn-outline-selected-border': '#022f7a',
'btn-outline-selected-shadow': 'inset 0 1px 0 rgba(2,26,74,0.2)',
'btn-outline-selected-text': '#ffffff',
'btn-outline-text': '#023b95',
'btn-primary-bg': '#055d20',
'btn-primary-border': '#013d14',
'btn-primary-counter-bg': 'rgba(255,255,255,0.2)',
'btn-primary-disabled-bg': '#94d3a2',
'btn-primary-disabled-border': 'rgba(1,4,9,0.8)',
'btn-primary-disabled-text': 'rgba(255,255,255,0.8)',
'btn-primary-focus-bg': '#013d14',
'btn-primary-focus-border': '#013d14',
'btn-primary-focus-shadow': '0 0 0 3px rgba(1,61,20,0.4)',
'btn-primary-hover-bg': '#024c1a',
'btn-primary-hover-border': '#013d14',
'btn-primary-icon': 'rgba(255,255,255,0.8)',
'btn-primary-inset-shadow': 'inset 0 1px 0 rgba(255,255,255,0.03)',
'btn-primary-selected-bg': 'hsla(139,95%,13%,1)',
'btn-primary-selected-shadow': 'inset 0 1px 0 rgba(0,35,11,0.2)',
'btn-primary-shadow': '0 1px 0 rgba(1,4,9,0.1)',
'btn-primary-text': '#ffffff',
'btn-selected-bg': '#ACB6C0',
'btn-shadow-active': 'inset 0 0.15em 0.3em rgba(1,4,9,0.15)',
'btn-shadow-input-focus': '0 0 0 0.2em rgba(3,73,180,0.3)',
'btn-shadow': '0 1px 0 rgba(1,4,9,0.04)',
'btn-text': '#0E1116',
'canvas-default-transparent': 'rgba(255,255,255,0)',
'canvas-default': '#ffffff',
'canvas-inset': '#ffffff',
'canvas-overlay': '#ffffff',
'canvas-subtle': '#E7ECF0',
'checks-ansi-black-bright': '#20252C',
'checks-ansi-black': '#0E1116',
'checks-ansi-blue-bright': '#67b3fd',
'checks-ansi-blue': '#368cf9',
'checks-ansi-cyan-bright': '#b3f0ff',
'checks-ansi-cyan': '#76e3ea',
'checks-ansi-gray': '#88929D',
'checks-ansi-green-bright': '#43c663',
'checks-ansi-green': '#26a148',
'checks-ansi-magenta-bright': '#c49bff',
'checks-ansi-magenta': '#a371f7',
'checks-ansi-red-bright': '#ff8e8a',
'checks-ansi-red': '#ee5a5d',
'checks-ansi-white-bright': '#CED5DC',
'checks-ansi-white': '#CED5DC',
'checks-ansi-yellow-bright': '#d5a824',
'checks-ansi-yellow': '#b58407',
'checks-bg': '#0E1116',
'checks-btn-hover-bg': 'rgba(255,255,255,0.125)',
'checks-btn-hover-icon': '#FFFFFF',
'checks-btn-icon': '#ACB6C0',
'checks-container-border-width': '0px',
'checks-donut-error': '#d5232c',
'checks-donut-neutral': '#ACB6C0',
'checks-donut-pending': '#956400',
'checks-donut-success': '#117f32',
'checks-dropdown-bg': '#20252C',
'checks-dropdown-border': '#343B43',
'checks-dropdown-btn-hover-bg': '#20252C',
'checks-dropdown-btn-hover-text': '#FFFFFF',
'checks-dropdown-hover-bg': '#343B43',
'checks-dropdown-hover-text': '#FFFFFF',
'checks-dropdown-shadow': 'rgba(1,4,9,0.3)',
'checks-dropdown-text': '#ACB6C0',
'checks-gate-bg': 'rgba(96,55,0,0.15)',
'checks-gate-text': '#CED5DC',
'checks-gate-waiting-text': '#ACB6C0',
'checks-header-border': '#20252C',
'checks-header-icon': '#88929D',
'checks-header-label-open-text': '#FFFFFF',
'checks-header-label-text': '#CED5DC',
'checks-input-bg': '#20252C',
'checks-input-focus-text': '#88929D',
'checks-input-placeholder-text': '#88929D',
'checks-input-shadow': 'none',
'checks-input-text': '#E7ECF0',
'checks-line-dt-fm-bg': '#744500',
'checks-line-dt-fm-text': '#0E1116',
'checks-line-hover-bg': '#20252C',
'checks-line-num-text': 'rgba(136,146,157,0.75)',
'checks-line-selected-bg': 'rgba(17,104,227,0.15)',
'checks-line-selected-num-text': '#368cf9',
'checks-line-text': '#CED5DC',
'checks-line-timestamp-text': '#88929D',
'checks-logline-command-text': '#368cf9',
'checks-logline-debug-text': '#a371f7',
'checks-logline-error-bg': 'rgba(134,6,29,0.15)',
'checks-logline-error-num-text': '#ee5a5d',
'checks-logline-error-text': '#CED5DC',
'checks-logline-num-text': 'rgba(136,146,157,0.75)',
'checks-logline-section-text': '#26a148',
'checks-logline-text': '#88929D',
'checks-logline-warning-bg': 'rgba(96,55,0,0.15)',
'checks-logline-warning-num-text': '#b58407',
'checks-logline-warning-text': '#CED5DC',
'checks-run-border-width': '0px',
'checks-scrollbar-thumb-bg': '#4B535D',
'checks-step-error-text': '#ee5a5d',
'checks-step-header-open-bg': '#20252C',
'checks-step-warning-text': '#b58407',
'checks-text-link': '#368cf9',
'checks-text-primary': '#FFFFFF',
'checks-text-secondary': '#88929D',
'codemirror-activeline-bg': '#E7ECF0',
'codemirror-bg': '#ffffff',
'codemirror-cursor': '#0E1116',
'codemirror-guttermarker-subtle-text': '#66707B',
'codemirror-guttermarker-text': '#ffffff',
'codemirror-gutters-bg': '#ffffff',
'codemirror-linenumber-text': '#0E1116',
'codemirror-lines-bg': '#ffffff',
'codemirror-matchingbracket-text': '#0E1116',
'codemirror-selection-bg': '#368cf9',
'codemirror-syntax-comment': '#0E1116',
'codemirror-syntax-constant': '#023b95',
'codemirror-syntax-entity': '#622cbc',
'codemirror-syntax-keyword': '#a0111f',
'codemirror-syntax-storage': '#a0111f',
'codemirror-syntax-string': '#032563',
'codemirror-syntax-support': '#023b95',
'codemirror-syntax-variable': '#702c00',
'codemirror-text': '#0E1116',
'counter-border': '#20252C',
'danger-emphasis': '#a0111f',
'danger-fg': '#a0111f',
'danger-muted': '#ee5a5d',
'danger-subtle': '#fff0ee',
'diff-blob-addition-fg': '#ffffff',
'diff-blob-addition-line-bg': '#E6FFEC',
'diff-blob-addition-num-bg': '#CCFFD8',
'diff-blob-addition-num-text': '#0E1116',
'diff-blob-addition-word-bg': '#055d20',
'diff-blob-deletion-fg': '#ffffff',
'diff-blob-deletion-line-bg': '#fff0ee',
'diff-blob-deletion-num-bg': '#FFD7D5',
'diff-blob-deletion-num-text': '#0E1116',
'diff-blob-deletion-word-bg': '#a0111f',
'diff-blob-expander-icon': '#0E1116',
'diff-blob-hunk-num-bg': '#9cd7ff',
'diff-blob-selected-line-highlight-mix-blend-mode': 'multiply',
'diffstat-addition-bg': '#117f32',
'diffstat-addition-border': 'rgba(1,4,9,0.8)',
'diffstat-deletion-border': 'rgba(1,4,9,0.8)',
'done-emphasis': '#622cbc',
'done-fg': '#622cbc',
'done-muted': '#a371f7',
'done-subtle': '#faf0fe',
'fg-default': '#0E1116',
'fg-muted': '#0E1116',
'fg-on-emphasis': '#ffffff',
'fg-subtle': '#66707B',
'header-bg': '#0E1116',
'header-divider': '#ACB6C0',
'header-logo': '#ffffff',
'header-search-bg': '#0E1116',
'header-search-border': '#4B535D',
'header-text': 'rgba(255,255,255,0.7)',
'input-disabled-bg': 'rgba(172,182,192,0.2)',
'marketing-icon-primary': '#1168e3',
'marketing-icon-secondary': '#368cf9',
'menu-bg-active': 'rgba(0,0,0,0)',
'mktg-btn-bg': '#1b1f23',
'mktg-btn-shadow-focus': 'rgb(0 0 0 / 15%) 0 0 0 4px',
'mktg-btn-shadow-hover-muted': 'rgb(0 0 0 / 70%) 0 0 0 2px inset',
'mktg-btn-shadow-hover':
'0 3px 2px rgba(0, 0, 0, 0.07), 0 7px 5px rgba(0, 0, 0, 0.04), 0 12px 10px rgba(0, 0, 0, 0.03), 0 22px 18px rgba(0, 0, 0, 0.03), 0 42px 33px rgba(0, 0, 0, 0.02), 0 100px 80px rgba(0, 0, 0, 0.02)',
'mktg-btn-shadow-outline': 'rgb(0 0 0 / 15%) 0 0 0 1px inset',
'neutral-emphasis-plus': '#0E1116',
'neutral-emphasis': '#66707B',
'neutral-muted': 'rgba(172,182,192,0.2)',
'neutral-subtle': '#E7ECF0',
'overlay-shadow': '0 1px 3px rgba(1,4,9,0.12), 0 8px 24px rgba(52,59,67,0.12)',
'page-header-bg': '#ffffff',
'prettylights-syntax-brackethighlighter-angle': '#4B535D',
'prettylights-syntax-brackethighlighter-unmatched': '#6e011a',
'prettylights-syntax-carriage-return-bg': '#a0111f',
'prettylights-syntax-carriage-return-text': '#FFFFFF',
'prettylights-syntax-comment': '#66707B',
'prettylights-syntax-constant-other-reference-link': '#032563',
'prettylights-syntax-constant': '#023b95',
'prettylights-syntax-entity-tag': '#024c1a',
'prettylights-syntax-entity': '#622cbc',
'prettylights-syntax-invalid-illegal-bg': '#6e011a',
'prettylights-syntax-invalid-illegal-text': '#FFFFFF',
'prettylights-syntax-keyword': '#a0111f',
'prettylights-syntax-markup-bold': '#0E1116',
'prettylights-syntax-markup-changed-bg': '#ffc67b',
'prettylights-syntax-markup-changed-text': '#702c00',
'prettylights-syntax-markup-deleted-bg': '#fff0ee',
'prettylights-syntax-markup-deleted-text': '#6e011a',
'prettylights-syntax-markup-heading': '#023b95',
'prettylights-syntax-markup-ignored-bg': '#023b95',
'prettylights-syntax-markup-ignored-text': '#E7ECF0',
'prettylights-syntax-markup-inserted-bg': '#d2fedb',
'prettylights-syntax-markup-inserted-text': '#024c1a',
'prettylights-syntax-markup-italic': '#0E1116',
'prettylights-syntax-markup-list': '#2e1800',
'prettylights-syntax-meta-diff-range': '#622cbc',
'prettylights-syntax-storage-modifier-import': '#0E1116',
'prettylights-syntax-string-regexp': '#024c1a',
'prettylights-syntax-string': '#032563',
'prettylights-syntax-sublimelinter-gutter-mark': '#88929D',
'prettylights-syntax-variable': '#702c00',
'primer-border-active': '#ef5b48',
'primer-border-contrast': 'rgba(1,4,9,0.1)',
'primer-canvas-backdrop': 'rgba(1,4,9,0.5)',
'primer-canvas-sticky': 'rgba(255,255,255,0.95)',
'primer-fg-disabled': '#88929D',
'primer-shadow-focus': '0 0 0 3px rgba(3,73,180,0.3)',
'primer-shadow-highlight': 'inset 0 1px 0 rgba(255,255,255,0.25)',
'primer-shadow-inset': 'inset 0 1px 0 rgba(206,213,220,0.2)',
'project-gradient-in': '#ffffff',
'project-gradient-out': 'rgba(255,255,255,0)',
'project-header-bg': '#0E1116',
'project-sidebar-bg': '#ffffff',
'scale-black': '#010409',
'scale-blue-0': '#dff7ff',
'scale-blue-1': '#9cd7ff',
'scale-blue-2': '#67b3fd',
'scale-blue-3': '#368cf9',
'scale-blue-4': '#1168e3',
'scale-blue-5': '#0349b4',
'scale-blue-6': '#023b95',
'scale-blue-7': '#022f7a',
'scale-blue-8': '#032563',
'scale-blue-9': '#021a4a',
'scale-coral-0': '#fff0ed',
'scale-coral-1': '#ffc2b6',
'scale-coral-2': '#ff8f7e',
'scale-coral-3': '#ef5b48',
'scale-coral-4': '#cd3425',
'scale-coral-5': '#9f1710',
'scale-coral-6': '#870706',
'scale-coral-7': '#6f0107',
'scale-coral-8': '#5b0002',
'scale-coral-9': '#430200',
'scale-gray-0': '#FFFFFF',
'scale-gray-1': '#E7ECF0',
'scale-gray-2': '#CED5DC',
'scale-gray-3': '#ACB6C0',
'scale-gray-4': '#88929D',
'scale-gray-5': '#66707B',
'scale-gray-6': '#4B535D',
'scale-gray-7': '#343B43',
'scale-gray-8': '#20252C',
'scale-gray-9': '#0E1116',
'scale-green-0': '#d2fedb',
'scale-green-1': '#82e596',
'scale-green-2': '#43c663',
'scale-green-3': '#26a148',
'scale-green-4': '#117f32',
'scale-green-5': '#055d20',
'scale-green-6': '#024c1a',
'scale-green-7': '#013d14',
'scale-green-8': '#003110',
'scale-green-9': '#00230b',
'scale-orange-0': '#fff2d5',
'scale-orange-1': '#ffc67b',
'scale-orange-2': '#f99636',
'scale-orange-3': '#dc6d1a',
'scale-orange-4': '#b45105',
'scale-orange-5': '#873800',
'scale-orange-6': '#702c00',
'scale-orange-7': '#5b2300',
'scale-orange-8': '#491b00',
'scale-orange-9': '#361200',
'scale-pink-0': '#feeff7',
'scale-pink-1': '#ffbde0',
'scale-pink-2': '#fc87ca',
'scale-pink-3': '#ed4baf',
'scale-pink-4': '#c9248e',
'scale-pink-5': '#971368',
'scale-pink-6': '#7d0c57',
'scale-pink-7': '#660847',
'scale-pink-8': '#53043a',
'scale-pink-9': '#3e022b',
'scale-purple-0': '#faf0fe',
'scale-purple-1': '#e0c5ff',
'scale-purple-2': '#c49bff',
'scale-purple-3': '#a371f7',
'scale-purple-4': '#844ae7',
'scale-purple-5': '#622cbc',
'scale-purple-6': '#512598',
'scale-purple-7': '#411d7b',
'scale-purple-8': '#341763',
'scale-purple-9': '#260f49',
'scale-red-0': '#fff0ee',
'scale-red-1': '#ffc1bc',
'scale-red-2': '#ff8e8a',
'scale-red-3': '#ee5a5d',
'scale-red-4': '#d5232c',
'scale-red-5': '#a0111f',
'scale-red-6': '#86061d',
'scale-red-7': '#6e011a',
'scale-red-8': '#5a0016',
'scale-red-9': '#430011',
'scale-white': '#ffffff',
'scale-yellow-0': '#fcf7be',
'scale-yellow-1': '#f0ce53',
'scale-yellow-2': '#d5a824',
'scale-yellow-3': '#b58407',
'scale-yellow-4': '#956400',
'scale-yellow-5': '#744500',
'scale-yellow-6': '#603700',
'scale-yellow-7': '#4e2c00',
'scale-yellow-8': '#3f2200',
'scale-yellow-9': '#2e1800',
'search-keyword-hl': '#fcf7be',
'select-menu-backdrop-border': 'rgba(0,0,0,0)',
'select-menu-tap-focus-bg': '#9cd7ff',
'select-menu-tap-highlight': 'rgba(172,182,192,0.5)',
'severe-emphasis': '#873800',
'severe-fg': '#873800',
'severe-muted': '#dc6d1a',
'severe-subtle': '#fff2d5',
'shadow-extra-large': '0 12px 28px rgba(136,146,157,0.3)',
'shadow-large': '0 8px 24px rgba(136,146,157,0.2)',
'shadow-medium': '0 3px 6px rgba(136,146,157,0.15)',
'shadow-small': '0 1px 0 rgba(1,4,9,0.04)',
'sidenav-selected-bg': '#ffffff',
'sponsors-emphasis': '#971368',
'sponsors-fg': '#971368',
'sponsors-muted': '#ed4baf',
'sponsors-subtle': '#feeff7',
'success-emphasis': '#055d20',
'success-fg': '#055d20',
'success-muted': '#26a148',
'success-subtle': '#d2fedb',
'timeline-badge-bg': '#E7ECF0',
'topic-tag-border': '#0349b4',
'underlinenav-border-hover': 'rgba(172,182,192,0.2)',
'underlinenav-icon': '#66707B',
);

View file

@ -123,9 +123,13 @@ export function focusSearchInput() {
})
}
export function setResizingState(on: boolean) {
const target = document.querySelector('.gitako-toggle-show-button-wrapper')
if (!target) return
if (on) target.classList.add('resizing')
else target.classList.remove('resizing')
export function findNodeElement(node: TreeNode, rootElement: HTMLElement): HTMLElement | null {
const nodeElement = rootElement.querySelector(`a[href="${node.url}"]`)
if (nodeElement instanceof HTMLElement) return nodeElement
return null
}
export function setCSSVariable(name: string, value: string | undefined, element: HTMLElement) {
if (value === undefined) element.style.removeProperty(name)
else element.style.setProperty(name, value)
}

View file

@ -124,6 +124,10 @@ class ShakeLayer extends BaseLayer {
lastSearchParams: SearchParams | null = null
shakeHub = new EventHub<{ emit: TreeNode | null }>()
get isSearching() {
return this.lastSearchParams !== null
}
constructor(options: Options) {
super(options)
@ -193,6 +197,7 @@ class FlattenLayer extends CompressLayer {
focusedNode: TreeNode | null = null
nodes: TreeNode[] = []
expandedNodes: Set<TreeNode['path']> = new Set()
backupExpandedNodes: Set<TreeNode['path']> = new Set()
flattenHub = new EventHub<{ emit: null }>()
constructor(options: Options) {
@ -268,8 +273,8 @@ class FlattenLayer extends CompressLayer {
const expand = !this.expandedNodes.has(node.path)
await traverse(
[node],
async node => {
await this.$setExpand(node, expand)
node => {
this.$setExpand(node, expand)
return recursive
},
node => node.contents || [],
@ -300,18 +305,24 @@ class FlattenLayer extends CompressLayer {
}
}, this.generateVisibleNodes)
search = (searchParams: Pick<SearchParams, 'matchNode'> | null) => {
this.shake(
searchParams
? {
matchNode: searchParams.matchNode,
onChildMatch: node => this.$setExpand(node, true),
}
: null,
)
// collapse all nodes on clearing search key
if (!searchParams) {
search = (searchParams: Pick<SearchParams, 'matchNode'> | null, restoreExpandedFolders?: boolean) => {
// backup expansion before search
if (searchParams) {
if (!this.isSearching) {
this.backupExpandedNodes.clear()
this.expandedNodes.forEach(path => this.backupExpandedNodes.add(path))
}
this.shake({
matchNode: searchParams.matchNode,
onChildMatch: node => this.$setExpand(node, true),
})
} else {
this.shake(null)
// collapse all nodes on clearing search key
this.expandedNodes.clear()
if (restoreExpandedFolders) {
this.backupExpandedNodes.forEach(path => this.expandedNodes.add(path))
}
}
}
}

View file

@ -1,5 +1,4 @@
import { SearchMode } from 'components/searchModes'
import { platform, platformName } from 'platforms'
import { storageHelper } from 'utils/storageHelper'
import { migrateConfig } from './migrations'
@ -20,6 +19,8 @@ export type Config = {
commentToggle: boolean
codeFolding: boolean
compactFileTree: boolean
restoreExpandedFolders: boolean
showDiffInText: boolean
}
enum configKeys {
@ -39,15 +40,20 @@ enum configKeys {
commentToggle = 'commentToggle',
codeFolding = 'codeFolding',
compactFileTree = 'compactFileTree',
restoreExpandedFolders = 'restoreExpandedFolders',
showDiffInText = 'showDiffInText',
}
// do NOT use platform name
const platformStorageKey = `platform_` + window.location.host.toLowerCase()
export const defaultConfigs: Config = {
sideBarWidth: 260,
shortcut: undefined,
accessToken: '',
compressSingletonFolder: true,
copyFileButton: true,
copySnippetButton: !(platformName === 'GitHub' && !platform.isEnterprise()), // false when on github.com
copyFileButton: platformStorageKey !== 'platform_github.com', // false when on github.com,
copySnippetButton: platformStorageKey !== 'platform_github.com', // false when on github.com
intelligentToggle: null,
icons: 'rich',
toggleButtonVerticalDistance: 124, // align with GitHub's navbar items
@ -58,6 +64,8 @@ export const defaultConfigs: Config = {
commentToggle: true,
codeFolding: true,
compactFileTree: false,
restoreExpandedFolders: true,
showDiffInText: false,
}
const configKeyArray = Object.values(configKeys)
@ -71,8 +79,6 @@ function applyDefaultConfigs(configs: Partial<Config>) {
export type VersionedConfig<SiteConfig> = Record<string, SiteConfig> & { configVersion: string }
// do NOT use platform name
const platformStorageKey = `platform_` + window.location.host.toLowerCase()
const prepareConfig = new Promise<void>(async resolve => {
await migrateConfig()
resolve()

View file

@ -16,7 +16,12 @@ export const migration: Migration = {
'intelligentToggle',
'icons',
])
if (config && (!('configVersion' in config) || config.configVersion < version)) {
if (
config &&
(!('configVersion' in config) ||
config.configVersion === null ||
config.configVersion < version)
) {
await storageHelper.set({ platform_GitHub: config, configVersion: version })
}
},

View file

@ -0,0 +1,33 @@
import { storageHelper } from 'utils/storageHelper'
import { Migration, onConfigOutdated } from '.'
export const migration: Migration = {
version: '3.5.0',
async migrate(version) {
// disable copy snippet button for github.com
type ConfigBeforeMigrate = {
copyFileButton: boolean
}
type ConfigAfterMigrate = {
copyFileButton: boolean
}
await onConfigOutdated(version, async configs => {
const key = 'platform_github.com'
const config = configs[key]
if (typeof config === 'object' && config !== null && 'copyFileButton' in config) {
const configBeforeMigrate: ConfigBeforeMigrate = config
const { copyFileButton, ...rest } = configBeforeMigrate
if (copyFileButton) {
const configAfterMigrate: ConfigAfterMigrate = {
...rest,
copyFileButton: false,
}
await storageHelper.set({
[key]: configAfterMigrate,
})
}
}
})
},
}

View file

@ -4,6 +4,7 @@ import { migration as v1v0v1 } from './1.0.1'
import { migration as v1v3v4 } from './1.3.4'
import { migration as v2v6v0 } from './2.6.0'
import { migration as v3v0v0 } from './3.0.0'
import { migration as v3v5v0 } from './3.5.0'
export type Migration = {
version: string
@ -11,7 +12,7 @@ export type Migration = {
}
export async function migrateConfig() {
const migrations: Migration[] = [v1v0v1, v1v3v4, v2v6v0, v3v0v0]
const migrations: Migration[] = [v1v0v1, v1v3v4, v2v6v0, v3v0v0, v3v5v0]
for (const { version, migrate } of migrations) {
await migrate(version)

29
src/utils/general.test.ts Normal file
View file

@ -0,0 +1,29 @@
import { resolveDiffGraphMeta } from './general'
it(`should resolve diff stat graph meta properly`, () => {
const example = `
2 10 0 4
3 10 1 3
3 17 0 4
4 17 0 4
4 26 0 4
5 17 1 3
6 17 1 3
12 0 5 0
0 12 0 5
17 74 0 4
11 23 1 3
18 28 1 3
34 24 2 2
`
example
.split(/\n/)
.map(line => line.trim())
.filter(line => line.length)
.map(line => line.split(/\s+/).map(_ => parseInt(_)))
.forEach(([additions, deletions, g, r]) => {
const meta = resolveDiffGraphMeta(additions, deletions, additions + deletions)
expect([meta.g, meta.r]).toEqual([g, r])
})
})

View file

@ -21,12 +21,14 @@ export enum OperatingSystems {
}
function detectOS(): OperatingSystems {
const {
navigator: { userAgent },
} = window
if (userAgent.indexOf(OperatingSystems.Windows) !== -1) return OperatingSystems.Windows
else if (userAgent.indexOf(OperatingSystems.macOS) !== -1) return OperatingSystems.macOS
else if (userAgent.indexOf(OperatingSystems.Linux) !== -1) return OperatingSystems.Linux
if (typeof window !== 'undefined') {
const {
navigator: { userAgent },
} = window
if (userAgent.indexOf(OperatingSystems.Windows) !== -1) return OperatingSystems.Windows
else if (userAgent.indexOf(OperatingSystems.macOS) !== -1) return OperatingSystems.macOS
else if (userAgent.indexOf(OperatingSystems.Linux) !== -1) return OperatingSystems.Linux
}
return OperatingSystems.others
}
@ -189,3 +191,21 @@ export function createPromiseQueue() {
},
}
}
export function isOpenInNewWindowClick(event: React.MouseEvent<HTMLElement, MouseEvent>) {
return (
(os === OperatingSystems.macOS && (event.metaKey || event.shiftKey)) ||
(os === OperatingSystems.Linux && event.ctrlKey) ||
(os === OperatingSystems.Windows && event.ctrlKey)
)
}
export function resolveDiffGraphMeta(additions: number, deletions: number, changes: number) {
const both = additions > 0 && deletions > 0,
overflow = changes > 5,
preserved = both && overflow ? 1 : 0,
g = overflow ? Math.floor(((5 - preserved) * (additions + 1)) / (changes + 1)) : additions,
r = overflow ? 5 - preserved - g : deletions,
w = 5 - g - r
return { g, r, w }
}

View file

@ -1,4 +1,5 @@
import { Config, Pjax } from 'pjax-api'
import { platform } from 'platforms'
import * as React from 'react'
import { useEvent } from 'react-use'
@ -9,7 +10,7 @@ const config: Config = {
// gitee
'#git-project-content',
// gitea
'.repository > .ui.container'
'.repository > .ui.container',
],
update: {
css: false,
@ -42,8 +43,9 @@ export function usePJAX() {
useRedirectedEvents(document, 'pjax:ready', 'pjax:end')
}
export const loadWithPJAX = (url: string) => {
Pjax.assign(url, config)
export const loadWithPJAX = (url: string, element: HTMLElement) => {
if (platform.loadWithPJAX) platform.loadWithPJAX(url, element)
else Pjax.assign(url, config)
}
export function useOnPJAXDone(callback: () => void) {

View file

@ -1,6 +1,4 @@
import * as NProgress from 'nprogress'
import { platform } from 'platforms'
import { GitHub } from 'platforms/GitHub'
import * as React from 'react'
import { useEvent } from 'react-use'
@ -13,14 +11,11 @@ const progressBar = {
},
}
const isGitHub = platform === GitHub
// use native progress bar on GitHub
export const useProgressBar = isGitHub
? function () {}
: function useProgressBar() {
React.useEffect(() => {
NProgress.configure({ showSpinner: false })
}, [])
useEvent('pjax:fetch', progressBar.mount, window)
useEvent('pjax:unload', progressBar.unmount, window)
}
export function useProgressBar() {
React.useEffect(() => {
NProgress.configure({ showSpinner: false })
}, [])
useEvent('pjax:fetch', progressBar.mount, window)
useEvent('pjax:unload', progressBar.unmount, window)
}

View file

@ -1,25 +1,29 @@
import rawFileIconIndex from 'assets/icons/file-icons-index.csv'
import rawFolderIconIndex from 'assets/icons/folder-icons-index.csv'
const rowSeparator = '\n'
const colSeparator = ','
const arraySeparator = ':'
function parseFileIconMapCSV() {
const filenameIndex = new Map<string, string>()
const fileExtensionIndex = new Map<string, string>()
rawFileIconIndex.split('\n').forEach(line => {
if (!line) return
const [name, names, exts] = line.split(',')
for (const line of rawFileIconIndex.split(rowSeparator)) {
if (!line) continue
const [name, names, exts] = line.split(colSeparator)
if (names) {
names.split(':').forEach(filename => {
if (!filename) return
for (const filename of names.split(arraySeparator)) {
if (!filename) continue
filenameIndex.set(filename, name)
})
}
}
if (exts) {
exts.split(':').forEach(ext => {
if (!ext) return
for (const ext of exts.split(arraySeparator)) {
if (!ext) continue
fileExtensionIndex.set(ext, name)
})
}
}
})
}
return {
filenameIndex,
fileExtensionIndex,
@ -28,14 +32,14 @@ function parseFileIconMapCSV() {
function parseFolderIconMapCSV() {
const folderNameIndex = new Map<string, string>()
rawFolderIconIndex.split('\n').forEach(line => {
if (!line) return
const [name, names] = line.split(',')
names.split(':').forEach(folderName => {
if (!folderName) return
for (const line of rawFolderIconIndex.split(rowSeparator)) {
if (!line) continue
const [name, names] = line.split(colSeparator)
for (const folderName of names.split(arraySeparator)) {
if (!folderName) continue
folderNameIndex.set(folderName, name)
})
})
}
}
return {
folderNameIndex,
}
@ -43,32 +47,31 @@ function parseFolderIconMapCSV() {
const { folderNameIndex } = parseFolderIconMapCSV()
export function getFolderIconSrc(node: TreeNode, open: boolean) {
export function getFolderIconURL(node: TreeNode, open: boolean) {
const name = folderNameIndex.get(node.name.toLowerCase())
return getIconSrc('folder', name, open)
return getIconURL('folder', name, open)
}
const { filenameIndex, fileExtensionIndex } = parseFileIconMapCSV()
export function getFileIconSrc(node: TreeNode) {
export function getFileIconURL(node: TreeNode) {
const fileName = node.name.toLowerCase()
let iconName = filenameIndex.get(fileName)
if (!iconName) {
const tail = fileName.split('.')
tail.shift()
while (!iconName && tail.length > 0) {
iconName = fileExtensionIndex.get(tail.join('.'))
tail.shift()
}
}
return getIconSrc('file', iconName)
return getIconURL('file', iconName)
}
// memorize for
// 1. swap time with space
// 2. prevent app crash on when extension context invalidates
const extensionURL = browser.runtime.getURL('').replace(/\/$/, '')
export function getIconSrc(type: 'folder' | 'file', name: string = 'default', open?: boolean) {
export function getIconURL(type: 'folder' | 'file', name: string = 'default', open?: boolean) {
const filename =
(name === 'default' ? 'default_' + type : type + '_type_' + name) +
(open ? '_opened' : '') +

2886
yarn.lock

File diff suppressed because it is too large Load diff