├── .gitignore ├── .prettierignore ├── images ├── icon.png └── screenshot.png ├── .husky └── pre-commit ├── .gitattributes ├── .vscodeignore ├── demo ├── json.json ├── svg.svg ├── sql.sql ├── toml.toml ├── yaml.yml ├── cpp.cpp ├── bash.sh ├── html.html ├── css.css ├── react.jsx ├── react.js ├── python.py ├── markdown.md ├── react.tsx ├── graphql.graphql ├── sass.scss ├── javascript.js └── typescript.ts ├── .github └── workflows │ └── nodejs.yml ├── .vscode └── launch.json ├── LICENSE ├── package.json ├── CHANGELOG.md ├── README.md └── themes └── Atomize-color-theme.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.vsix 3 | *.log 4 | .DS_Store 5 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | /.vscode 2 | /node_modules 3 | package-lock.json 4 | -------------------------------------------------------------------------------- /images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/emroussel/atomize/HEAD/images/icon.png -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | npx lint-staged 5 | -------------------------------------------------------------------------------- /images/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/emroussel/atomize/HEAD/images/screenshot.png -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Set default behavior to automatically normalize line endings. 2 | * text=auto 3 | 4 | -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .github/** 2 | .vscode/** 3 | .vscode-test/** 4 | .gitignore 5 | vsc-extension-quickstart.md 6 | *.log 7 | .DS_Store 8 | demo 9 | -------------------------------------------------------------------------------- /demo/json.json: -------------------------------------------------------------------------------- 1 | { 2 | "string": "string", 3 | "number": 3, 4 | "float": 3.1415926535, 5 | "boolean": true, 6 | "null": null, 7 | "object": { 8 | "key": "value", 9 | "url": "https://github.com/emroussel/atomize" 10 | }, 11 | "array": ["1", "2", "3"] 12 | } 13 | -------------------------------------------------------------------------------- /demo/svg.svg: -------------------------------------------------------------------------------- 1 | 9 | 10 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /.github/workflows/nodejs.yml: -------------------------------------------------------------------------------- 1 | name: Node.js CI 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | pull_request: 8 | branches: 9 | - "**" 10 | 11 | jobs: 12 | lint: 13 | runs-on: ubuntu-latest 14 | 15 | strategy: 16 | matrix: 17 | node-version: [16.x] 18 | 19 | steps: 20 | - uses: actions/checkout@v2 21 | - name: Use Node.js ${{ matrix.node-version }} 22 | uses: actions/setup-node@v1 23 | with: 24 | node-version: ${{ matrix.node-version }} 25 | - run: npm install 26 | - run: npm run lint 27 | env: 28 | CI: true 29 | -------------------------------------------------------------------------------- /demo/sql.sql: -------------------------------------------------------------------------------- 1 | -- SQL comment 2 | /* Other SQL comment */ 3 | 4 | CREATE DATABASE db; 5 | 6 | create table `table`( 7 | some_int int not null, 8 | some_bigint bigint default 0, 9 | some_string varchar(100), 10 | some_date date default getdate(), 11 | some_boolean boolean, 12 | constraint some_pk primary key (some_int) 13 | ); 14 | 15 | select * from db.table_name as t where t.id = 1 or t.name = "name"; 16 | 17 | select a, b, c, d, e, f, g from table_name where (a + b - c) * d / e % f = g; 18 | 19 | select table_name.some_name 20 | from table_name 21 | left join other_table on other_table.table_id = table_name.id 22 | group by table_name.id; 23 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | // A launch configuration that launches the extension inside a new window 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | { 6 | "version": "0.2.0", 7 | "configurations": [ 8 | { 9 | "name": "Extension", 10 | "type": "extensionHost", 11 | "request": "launch", 12 | "runtimeExecutable": "${execPath}", 13 | "args": [ 14 | "--extensionDevelopmentPath=${workspaceFolder}" 15 | ] 16 | } 17 | ] 18 | } -------------------------------------------------------------------------------- /demo/toml.toml: -------------------------------------------------------------------------------- 1 | string = "string" 2 | stringSingleQuote = 'string' 3 | number = 1 4 | float = 3.1415926535 5 | boolean = true 6 | date = 1979-05-27T07:32:00-08:00 7 | scientificNotation = 1e+12 8 | multiLineString = ''' 9 | String with 10 | multiple lines 11 | ''' 12 | 13 | [table] 14 | key = "value" 15 | url = "https://github.com/emroussel/atomize" 16 | 17 | [table.with.dots] 18 | key = "value" 19 | 20 | array = ["1", "2", "3"] 21 | 22 | # This is a comment 23 | [[array-of-tables]] 24 | key = "value" 25 | 26 | [[other-array-of-tables]] 27 | key = "value" 28 | 29 | [other-array-of-tables.table] 30 | key = "value" 31 | 32 | [[other-array-of-tables.tables]] 33 | key = "value" 34 | -------------------------------------------------------------------------------- /demo/yaml.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # This is a comment 3 | string: "string" 4 | stringWithoutQuote: string 5 | number: 123 6 | float: 3.1415926535 7 | scientificNotation: 1e+12 8 | nan: .NAN 9 | boolean: true 10 | booleanAsOn: on 11 | empty: null 12 | list: 13 | - something 14 | - 1 15 | - something else 16 | singleLineList: [1, 2, 3, "string"] 17 | object: 18 | property: "" 19 | singleLineObject: { property: "" } 20 | "string/as/key": value 21 | key1: > 22 | long string 23 | on multiple 24 | lines 25 | key2: >- 26 | long string 27 | on multiple 28 | lines 29 | key3: >+ 30 | long string 31 | on multiple 32 | lines 33 | key4: | 34 | long string 35 | on multiple 36 | lines 37 | key5: |- 38 | long string 39 | on multiple 40 | lines 41 | key6: |+ 42 | long string 43 | on multiple 44 | lines 45 | -------------------------------------------------------------------------------- /demo/cpp.cpp: -------------------------------------------------------------------------------- 1 | // Comment 2 | /* Comment again */ 3 | 4 | #include "some_file" 5 | 6 | using namespace std; 7 | 8 | class Line { 9 | public: 10 | void setLength( double len ); 11 | double getLength( void ); 12 | Line(double len); 13 | 14 | private: 15 | double length; 16 | }; 17 | 18 | Line::Line( double len) { 19 | cout << "Object is being created, length = " << len << endl; 20 | length = len; 21 | } 22 | void Line::setLength( double len ) { 23 | length = len; 24 | } 25 | double Line::getLength( void ) { 26 | return length; 27 | } 28 | 29 | int main() 30 | { 31 | std::string s0 ("Initial string"); 32 | printf("log") 33 | return 0; 34 | } 35 | 36 | std::string do_something ( std::string inval ) 37 | { 38 | std::string return_val; 39 | return return_val; 40 | } 41 | -------------------------------------------------------------------------------- /demo/bash.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | someFunction () { 6 | echo "param: $1" 7 | } 8 | 9 | someFunction "a param" 10 | 11 | PS3='Select option: ' 12 | options=("1" "2") 13 | select opt in "${options[@]}" 14 | do 15 | case $opt in 16 | "1") 17 | OPTION="one" 18 | break 19 | ;; 20 | "2") 21 | OPTION="two" 22 | break 23 | ;; 24 | *) echo "invalid option $REPLY";; 25 | esac 26 | done 27 | 28 | while true; do 29 | read -p "Enter your name: " NAME 30 | 31 | if [[ -z "${NAME// }" ]] 32 | then 33 | echo "Error: please enter a non-empty name" 34 | elif [[ $NAME =~ ^[a-z] ]] 35 | then 36 | echo "Error: name should start with an uppercase letter" 37 | else 38 | break; 39 | fi 40 | done 41 | 42 | SOME_DIR=src/some_dir 43 | 44 | mkdir -p "$SOME_DIR" 45 | 46 | cat > "${SOME_DIR}/somefile.txt" << EOL 47 | I am a file 48 | EOL 49 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Emmanuel Roussel 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /demo/html.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | HTML 6 | 7 | 8 | 9 | 10 | 11 | 12 | 17 |
18 |

This is — a title

19 | 35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /demo/css.css: -------------------------------------------------------------------------------- 1 | @keyframes slidein { 2 | from { 3 | transform: translateX(0%); 4 | } 5 | 6 | to { 7 | transform: translateX(100%); 8 | } 9 | } 10 | 11 | strong { 12 | color: red; 13 | } 14 | 15 | .text { 16 | min-width: 23px; 17 | } 18 | 19 | *, 20 | *::before, 21 | *::after { 22 | box-sizing: inherit; 23 | } 24 | 25 | button:disabled { 26 | cursor: default; 27 | } 28 | 29 | @supports (display: grid) { 30 | div.menu-bar li:hover > ul { 31 | display: grid !important; 32 | } 33 | } 34 | 35 | #header { 36 | animation-duration: 3s; 37 | animation-name: slidein; 38 | padding-inline: 8px; 39 | --some-color: #282c34; 40 | } 41 | 42 | /* This is a comment */ 43 | div[role="group"][title] { 44 | flex: 1; 45 | } 46 | 47 | @media (min-width: 30em) and (orientation: landscape) { 48 | #header:not(:nth-child(2)) { 49 | margin-top: calc(2em + 4px * 2 - 100vh / 3 + 1.3rem - 8pc); 50 | } 51 | } 52 | 53 | .image ~ img { 54 | image-rendering: -webkit-optimize-contrast; 55 | } 56 | 57 | :focus { 58 | outline-color: var(--some-color); 59 | } 60 | 61 | @font-face { 62 | font-family: "Open Sans", Arial, sans-serif; 63 | src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2"), 64 | url(/fonts/OpenSans-Regular-webfont.woff) format("woff"); 65 | } 66 | -------------------------------------------------------------------------------- /demo/react.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component, useState } from "react"; 2 | import PropTypes from "prop-types"; 3 | 4 | export const FunctionalApp = React.memo((props) => { 5 | const { title } = props; 6 | const [count, setCount] = useState(0); 7 | 8 | const increment = () => { 9 | setCount((prevCount) => prevCount + 1); 10 | }; 11 | 12 | return ( 13 |
14 |

{title}

15 |

{count}

16 | 19 |
20 | ); 21 | }); 22 | 23 | FunctionalApp.propTypes = { 24 | title: PropTypes.string.isRequired, 25 | }; 26 | 27 | export class ComponentApp extends Component { 28 | static propTypes = { 29 | title: PropTypes.string.isRequired, 30 | }; 31 | 32 | constructor(props) { 33 | super(props); 34 | this.state = { 35 | count: 0, 36 | }; 37 | } 38 | 39 | increment() { 40 | this.setState((prevState) => ({ count: prevState.count + 1 })); 41 | } 42 | 43 | render() { 44 | const { title } = this.props; 45 | const { count } = this.state; 46 | 47 | return ( 48 |
49 |

{title}

50 |

{count}

51 | 54 |
55 | ); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /demo/react.js: -------------------------------------------------------------------------------- 1 | import React, { Component, useState } from "react"; 2 | import PropTypes from "prop-types"; 3 | 4 | export const FunctionalComponent = React.memo((props) => { 5 | const { title } = props; 6 | const [count, setCount] = useState(0); 7 | 8 | const increment = () => { 9 | setCount((prevCount) => prevCount + 1); 10 | }; 11 | 12 | return ( 13 |
14 |

{title}

15 |

{count}

16 | 19 |
20 | ); 21 | }); 22 | 23 | FunctionalComponent.propTypes = { 24 | title: PropTypes.string.isRequired, 25 | }; 26 | 27 | export class ClassComponent extends Component { 28 | static propTypes = { 29 | title: PropTypes.string.isRequired, 30 | }; 31 | 32 | constructor(props) { 33 | super(props); 34 | this.state = { 35 | count: 0, 36 | }; 37 | } 38 | 39 | increment() { 40 | this.setState((prevState) => ({ count: prevState.count + 1 })); 41 | } 42 | 43 | render() { 44 | const { title } = this.props; 45 | const { count } = this.state; 46 | 47 | return ( 48 |
49 |

{title}

50 |

{count}

51 | 54 |
55 | ); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /demo/python.py: -------------------------------------------------------------------------------- 1 | # This is a comment 2 | from module.first_module import module1, some_decorator 3 | from class_module import AClass as SomeClass 4 | 5 | """ 6 | Description 7 | """ 8 | def some_function(arg=None): 9 | if not arg: 10 | raise Exception('Arg is {}'.format(arg)) 11 | elif arg is 'some arbitrary value' or \ 12 | arg is 'some other value with escaping \'': 13 | return False 14 | else: 15 | return True 16 | 17 | async def calculate(a, b, c, d, e): 18 | return await module1.calculate(a + b - c * d / e) 19 | 20 | SOME_CONSTANT = 'SOME_CONSTANT' 21 | dictionary = { 22 | 'string': 'String', 23 | 'int': 123, 24 | 'float': 123.123, 25 | 'boolean': True, 26 | 'none': None, 27 | 'array': ['123', '456'], 28 | 'function': some_function 29 | } 30 | array_numbers = [int(value) if value >= 0 and value <= 1000 else 0 for value in dictionary.array] 31 | 32 | print('Constant: ' + SOME_CONSTANT) 33 | 34 | try: 35 | some_function(0) 36 | except Exception as excep: 37 | print(excep) 38 | pass 39 | 40 | class MyClass(SomeClass): 41 | property = 'some property' 42 | 43 | def __init__(self, new_property): 44 | self.property = new_property if new_property else module1.PROPERTY_CONSTANT 45 | 46 | @some_decorator(arg=10) 47 | def some_method(self): 48 | values1 = (1, 2) 49 | values2 = {'c': 1, 'd': 2, 'e': 3} 50 | return calculate(*values1, **values2) 51 | -------------------------------------------------------------------------------- /demo/markdown.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # H1 4 | 5 | ## H2 6 | 7 | ### H3 8 | 9 | #### H4 10 | 11 | ##### H5 12 | 13 | ###### H6 14 | 15 | _italics_ 16 | **bold** 17 | **bold combined with _italics_** 18 | _italics combined with **bold**_ 19 | ~~Strikethrough~~ 20 | 21 | 1. First 22 | 2. Second 23 | ⋅⋅\* Unordered sub-list 24 | 3. Third 25 | ⋅⋅1. Ordered sub-list 26 | 4. Fourth 27 | 28 | ⋅⋅⋅Properly indented with list 29 | 30 | ⋅⋅⋅Properly indented with list with linebreak⋅⋅ 31 | ⋅⋅⋅This line is separate, but within the same paragraph.⋅⋅ 32 | 33 | - Unordered 34 | 35 | * With asterisk 36 | 37 | [link](https://www.google.com) 38 | 39 | [link with title](https://www.google.com "Google's Homepage") 40 | 41 | [Relative link](../blob/main/LICENSE) 42 | 43 | Link as plain text: https://www.google.com 44 | 45 | Image: 46 | ![alt text](https://picsum.photos/200 "Title") 47 | 48 | Code with `backticks` 49 | Code + link with [`backticks`](https://www.google.com) 50 | 51 | ```javascript 52 | // Code block with syntax highlighting 53 | const text = "text"; 54 | ``` 55 | 56 | | Tables | Are | Cool | 57 | | ------------- | :-----------: | -----: | 58 | | col 3 is | right-aligned | \$1600 | 59 | | col 2 is | centered | \$12 | 60 | | zebra stripes | are neat | \$1 | 61 | 62 | > Blockquote 63 | 64 | --- 65 | -------------------------------------------------------------------------------- /demo/react.tsx: -------------------------------------------------------------------------------- 1 | import React, { Component, useState, FunctionComponent } from "react"; 2 | 3 | type FunctionComponentProp = { 4 | title: string; 5 | }; 6 | 7 | export const FunctionalApp: FunctionComponent = 8 | React.memo((props) => { 9 | const { title } = props; 10 | const [count, setCount] = useState(0); 11 | 12 | const increment = () => { 13 | setCount((prevCount) => prevCount + 1); 14 | }; 15 | 16 | return ( 17 |
18 |

{title}

19 |

{count}

20 | 23 |
24 | ); 25 | }); 26 | 27 | type ClassComponentProp = { 28 | title: string; 29 | }; 30 | 31 | export class ComponentApp extends Component< 32 | ClassComponentProp, 33 | { count: number } 34 | > { 35 | constructor(props) { 36 | super(props); 37 | this.state = { 38 | count: 0, 39 | }; 40 | } 41 | 42 | increment() { 43 | this.setState((prevState) => ({ count: prevState.count + 1 })); 44 | } 45 | 46 | render() { 47 | const { title } = this.props; 48 | const { count } = this.state; 49 | 50 | return ( 51 |
52 |

{title}

53 |

{count}

54 | 57 |
58 | ); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /demo/graphql.graphql: -------------------------------------------------------------------------------- 1 | # Client facing 2 | 3 | fragment UserInfo on User { 4 | id 5 | alias: name 6 | email 7 | } 8 | 9 | query GetUser($id: ID!, $teamId: ID!, $include: Boolean!) { 10 | user(id: $id, filters: { team: { id: { equals: $teamId } } }, sort: { isActive: true }) { 11 | ...UserInfo 12 | maybe @include(if: $include) { 13 | id 14 | } 15 | } 16 | } 17 | 18 | query { 19 | user { 20 | ...UserInfo 21 | } 22 | } 23 | 24 | mutation EditUser($email: String = "newEmail") { 25 | editUser(id: 123, name: "New name", email: $email) { 26 | union { 27 | ... on Union1 { 28 | title 29 | } 30 | ... on Union2 { 31 | name 32 | } 33 | } 34 | } 35 | } 36 | 37 | # Schema definition 38 | 39 | interface User { 40 | id: ID! 41 | name: String! 42 | email: String 43 | } 44 | 45 | enum Plan { 46 | FREE 47 | PRO 48 | ENTERPRISE 49 | } 50 | 51 | scalar DateTime 52 | 53 | directive @deprecated(reason: String = "No longer supported") on FIELD_DEFINITION | ENUM_VALUE 54 | 55 | type SuperUser implements User { 56 | createdAt: DateTime! 57 | id: ID! 58 | name: String! 59 | email: String @deprecated(reason: "Some deprecation reason") 60 | powers: [Power!] 61 | plan: Plan 62 | } 63 | 64 | input NewTodoInput { 65 | name: String! 66 | } 67 | 68 | union MyUnion = Union1 | Union2 69 | 70 | """ 71 | Documentation 72 | """ 73 | type Query { 74 | superUser(id: ID!): SuperUser 75 | } 76 | 77 | type Mutation { 78 | addSuperUser(userInput: UserInput!, plan: Plan = FREE): SuperUser! 79 | } 80 | 81 | schema { 82 | query: Query 83 | mutation: Mutation 84 | } 85 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "atomize-atom-one-dark-theme", 3 | "displayName": "Atomize (Atom One Dark theme)", 4 | "description": "A detailed and accurate Atom One Dark Theme", 5 | "version": "2.0.2", 6 | "publisher": "emroussel", 7 | "icon": "images/icon.png", 8 | "author": { 9 | "name": "emroussel" 10 | }, 11 | "engines": { 12 | "vscode": "^1.48.0" 13 | }, 14 | "categories": [ 15 | "Themes" 16 | ], 17 | "keywords": [ 18 | "color", 19 | "theme", 20 | "atom", 21 | "dark", 22 | "one dark" 23 | ], 24 | "contributes": { 25 | "themes": [ 26 | { 27 | "label": "Atomize", 28 | "uiTheme": "vs-dark", 29 | "path": "./themes/Atomize-color-theme.json" 30 | } 31 | ] 32 | }, 33 | "galleryBanner": { 34 | "color": "#282C34", 35 | "theme": "dark" 36 | }, 37 | "scripts": { 38 | "fix": "prettier '**/*.{js,jsx,ts,tsx,json,md,yml}' --write", 39 | "lint": "prettier '**/*.{js,jsx,ts,tsx,json,md,yml}' --check", 40 | "prepare": "husky install" 41 | }, 42 | "lint-staged": { 43 | "**/*.{js,jsx,ts,tsx,json,md,yml}": "npm run fix" 44 | }, 45 | "bugs": { 46 | "url": "https://github.com/emroussel/atomize/issues" 47 | }, 48 | "repository": { 49 | "type": "git", 50 | "url": "https://github.com/emroussel/atomize.git" 51 | }, 52 | "homepage": "https://github.com/emroussel/atomize/blob/main/README.md", 53 | "devDependencies": { 54 | "husky": "^8.0.1", 55 | "lint-staged": "^13.0.1", 56 | "prettier": "2.6.2" 57 | }, 58 | "__metadata": { 59 | "id": "b33f4b00-b7b4-4259-a263-eab2d86ac79b", 60 | "publisherDisplayName": "Emmanuel Roussel", 61 | "publisherId": "ef208bcb-6f04-4154-9969-7fdfdf7c525f" 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /demo/sass.scss: -------------------------------------------------------------------------------- 1 | @import "someFile"; 2 | 3 | $map: ( 4 | "property": ( 5 | string: "string", 6 | unit: 4px, 7 | ), 8 | 10: 10, 9 | ); 10 | 11 | @function functionName($param: "defaultValue") { 12 | @return map-get($map, $param); 13 | } 14 | 15 | @mixin mobile { 16 | @media (max-width: #{map-get($map, "property")}) { 17 | @content; 18 | } 19 | } 20 | 21 | $variable: rgba(#000000, 0.88); 22 | 23 | @debug true or false and false == true or (false and false); 24 | 25 | @keyframes slidein { 26 | from { 27 | transform: translateX(0%); 28 | } 29 | 30 | to { 31 | transform: translateX(100%); 32 | } 33 | } 34 | 35 | .text { 36 | min-width: 23px; 37 | 38 | strong { 39 | color: red; 40 | } 41 | } 42 | 43 | *, 44 | *::before, 45 | *::after { 46 | box-sizing: inherit; 47 | } 48 | 49 | button:disabled { 50 | cursor: default; 51 | } 52 | 53 | @supports (display: grid) { 54 | div.menu-bar { 55 | li:hover > ul { 56 | display: grid !important; 57 | } 58 | 59 | &:not(:last-of-type) { 60 | border: 1px solid $variable; 61 | } 62 | } 63 | } 64 | 65 | /* This is a comment */ 66 | // This is also a comment 67 | div[role="group"][title] { 68 | flex: 1; 69 | --some-color: #282c34; 70 | } 71 | 72 | @include mobile { 73 | #header { 74 | animation-duration: 3s; 75 | animation-name: slidein; 76 | } 77 | } 78 | 79 | @media (min-width: 30em) and (orientation: landscape) { 80 | #header:not(:nth-child(2)) { 81 | margin-top: calc(2em + 4px * 2 - 100vh / 3 + 1.3rem - 8pc); 82 | margin-bottom: 2px + 10px; 83 | } 84 | } 85 | 86 | .image ~ img { 87 | image-rendering: -webkit-optimize-contrast; 88 | } 89 | 90 | :focus { 91 | outline-color: var(--some-color); 92 | } 93 | 94 | @font-face { 95 | font-family: "Open Sans", Arial, sans-serif; 96 | src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2"), 97 | url(/fonts/OpenSans-Regular-webfont.woff) format("woff"); 98 | } 99 | -------------------------------------------------------------------------------- /demo/javascript.js: -------------------------------------------------------------------------------- 1 | // This is a comment 2 | import * as module1 from "module1"; 3 | import module2, { module3 } from "module2And3"; 4 | const fetch = require("fetch"); 5 | 6 | /* This is another comment */ 7 | 8 | const SOME_CONSTANT = "SOME_CONSTANT"; 9 | let object = { 10 | string: "String", 11 | number: 123, 12 | float: 123.321, 13 | boolean: true, 14 | null: null, 15 | undefined: undefined, 16 | array: ["123", "456"], 17 | date: new Date(), 18 | function: (array = null) => 19 | Array.isArray(array) ? array.reverse() : undefined, 20 | [module2.dynamicKey]: module2.value, 21 | }; 22 | 23 | object.function(object.array); 24 | 25 | console.log(`Constant: ${SOME_CONSTANT}`); 26 | 27 | let num; 28 | 29 | if (process.env.NODE_ENV === "production") { 30 | for (const i = 0; i < module1.some.nested.array.length; i++) { 31 | if ( 32 | module1.some.nested.array[i] < object.number || 33 | module1.some.nested.array[i] - num > object.number 34 | ) { 35 | num += i; 36 | break; 37 | } else if (module1.some.nested.array[i] === object.number && !num) { 38 | num -= 1; 39 | } else { 40 | for (const property in object) { 41 | num = 42 | typeof property === "number" ? Math.floor(num + property) : num + 3; 43 | } 44 | } 45 | } 46 | } else { 47 | num = Object.keys(object) 48 | .filter(Boolean) 49 | .reduce((acc, value) => [...acc, value], []).length; 50 | } 51 | 52 | let data = {}; 53 | 54 | try { 55 | async function fetchSomething({ url, options: optionsAlias }) { 56 | const res = await fetch(url, { options: optionsAlias }); 57 | 58 | res.json().then((resData) => { 59 | data = resData?.maybe?.some?.property ?? { default: "default" }; 60 | }); 61 | 62 | if (!data) { 63 | throw new Error("Oh no"); 64 | } 65 | } 66 | 67 | fetchSomething({ url: "https://123.com" }); 68 | } catch (error) { 69 | if (error instanceof Error) { 70 | return error; 71 | } 72 | } 73 | 74 | class MyClass extends module3 { 75 | property = "some property"; 76 | 77 | static somethingStatic(value) { 78 | if (typeof value == "string") { 79 | return value.test(/^(^https?:\/\/.*)|(^mailto:.*)|(^tel:.*)/i); 80 | } 81 | 82 | return !!value; 83 | } 84 | 85 | constructor() { 86 | super(); 87 | } 88 | 89 | someMethod(...params) { 90 | (params || []).forEach((param) => { 91 | this.property += param; 92 | }); 93 | } 94 | } 95 | 96 | MyClass.somethingStatic(); 97 | 98 | var instance = new MyClass(); 99 | 100 | instance.someMethod(data); 101 | 102 | export default num; 103 | 104 | module.exports = {}; 105 | -------------------------------------------------------------------------------- /demo/typescript.ts: -------------------------------------------------------------------------------- 1 | // This is a comment 2 | import * as module1 from "module1"; 3 | import module2, { module3 } from "module2And3"; 4 | const fetch = require("fetch"); 5 | 6 | /* This is another comment */ 7 | 8 | const SOME_CONSTANT = "SOME_CONSTANT"; 9 | let object = { 10 | string: "String", 11 | number: 123, 12 | float: 123.321, 13 | boolean: true, 14 | null: null, 15 | undefined: undefined, 16 | array: ["123", "456"], 17 | date: new Date(), 18 | function: (array: Array = null) => 19 | Array.isArray(array) ? array.reverse() : undefined, 20 | [module2.dynamicKey]: module2.value, 21 | }; 22 | 23 | object.function(object.array); 24 | 25 | console.log(`Constant: ${SOME_CONSTANT}`); 26 | 27 | let num; 28 | 29 | if (process.env.NODE_ENV === "production") { 30 | for (const i = 0; i < module1.some.nested.array.length; i++) { 31 | if ( 32 | module1.some.nested.array[i] < object.number || 33 | module1.some.nested.array[i] - num > object.number 34 | ) { 35 | num += i; 36 | break; 37 | } else if (module1.some.nested.array[i] === object.number && !num) { 38 | num -= 1; 39 | } else { 40 | for (const property in object) { 41 | num = typeof property === "number" ? num + property : num + 3; 42 | } 43 | } 44 | } 45 | } else { 46 | num = Object.keys(object) 47 | .filter(Boolean) 48 | .reduce((acc, value) => [...acc, value], []).length; 49 | } 50 | 51 | let data = {}; 52 | 53 | interface FetchOptions { 54 | anOption?: number | null | undefined; 55 | } 56 | 57 | type SomeType = keyof FetchOptions; 58 | 59 | type Partial = { 60 | [P in keyof T]?: T[P]; 61 | }; 62 | 63 | type PartialFetchOptions = Partial; 64 | 65 | try { 66 | async function fetchSomething({ 67 | url, 68 | options: optionsAlias, 69 | }: { 70 | url: string; 71 | options?: PartialFetchOptions & { option1: () => SomeType }; 72 | }) { 73 | const res = await fetch(url, { options: optionsAlias }); 74 | 75 | res.json().then((resData) => { 76 | data = resData?.maybe?.some?.property ?? { default: "default" }; 77 | }); 78 | 79 | if (!data) { 80 | throw new Error("Oh no"); 81 | } 82 | } 83 | 84 | fetchSomething({ url: "https://123.com" }); 85 | } catch (error) { 86 | if (error instanceof Error) { 87 | return error; 88 | } 89 | } 90 | 91 | enum MyEnum { 92 | option1 = 1, 93 | option2, 94 | option3, 95 | } 96 | 97 | class MyClass extends module3 implements module2 { 98 | private property = "some private property"; 99 | public publicProperty = "some public property"; 100 | 101 | static somethingStatic(value?: string | number): MyEnum { 102 | if (!!value.test(/^(^https?:\/\/.*)|(^mailto:.*)|(^tel:.*)/i)) { 103 | return MyEnum.option1; 104 | } 105 | } 106 | 107 | constructor() { 108 | super(); 109 | } 110 | 111 | someMethod(...params): void { 112 | (params || []).forEach((param) => { 113 | this.property += param; 114 | }); 115 | } 116 | } 117 | 118 | MyClass.somethingStatic(); 119 | 120 | var instance = new MyClass(); 121 | 122 | instance.someMethod(data); 123 | 124 | export default num; 125 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. 4 | 5 | ## 2.0.2 (June 10, 2022) 6 | 7 | - Add bracket match theme colors 8 | 9 | ## 2.0.1 (March 9, 2022) 10 | 11 | - Correct the scopes for CSS properties 12 | 13 | ## 2.0.0 (November 24, 2021) 14 | 15 | - Revamp syntax highlighting to be more generic and easier to maintain 16 | - Add demo folder with code examples to simplify manual testing 17 | - Drop support for VS Code versions below 1.48.0 18 | 19 | ## 1.5.5 (April 24, 2021) 20 | 21 | - Fix list drop color and remove other deprecated drop keys 22 | 23 | ## 1.5.4 (March 5, 2021) 24 | 25 | - Add new quickInput.list.focusBackground color 26 | 27 | ## 1.5.3 (November 18, 2020) 28 | 29 | - Mark enums as constants 30 | - Update wording in README 31 | 32 | ## 1.5.2 (August 24, 2020) 33 | 34 | - Add highlighting for C++ namespaces and properties 35 | 36 | ## 1.5.1 (August 3, 2020) 37 | 38 | - Fix color of C++ directives 39 | 40 | ## 1.5.0 (June 23, 2020) 41 | 42 | - Add selection highlight colors 43 | - Update recommended vscode settings in README 44 | - Update dev dependencies 45 | - Add activityBar.dropBorder and panel.dropBorder 46 | 47 | ## 1.4.5 (April 22, 2020) 48 | 49 | - Add much better support for .jsx and .tsx files 50 | - Fix color of commas in graphql arguments 51 | - Add git colors to overview ruler 52 | 53 | ## 1.4.4 (March 12, 2020) 54 | 55 | - Add shadow on widgets for better contrast 56 | - Make color of optional chaining operator same as dot 57 | - Fix nested curly braces color in graphql 58 | - Add note about turning off semantic highlighting 59 | 60 | ## 1.4.3 (February 2, 2020) 61 | 62 | - Change color of empty editor for better contrast 63 | - Fix some GraphQL query syntax 64 | - Make booleans in JSON same color as in JS 65 | - Add scripts to format json and md with prettier 66 | - Add Github action workflow to lint on push and PRs 67 | 68 | ## 1.4.2 (October 27, 2019) 69 | 70 | - Format package.json with prettier 71 | - Format CHANGELOG with prettier 72 | - Add new screenshot to match VS Code's new icons 73 | - Fix colors of constants on built in classes 74 | - Add breadcrumbs and indent guide settings to README 75 | 76 | ## 1.4.1 (July 12, 2019) 77 | 78 | - Make remote development icon consistent with other icons 79 | 80 | ## 1.4.0 (June 2, 2019) 81 | 82 | - Add listFilterWidget colors 83 | - Fix color of peek view for errors 84 | - Add right color on warning swiggles 85 | - Fix colors of input validations 86 | - Color numbered lists in markdown 87 | - Add support for TOML 88 | - Clean up colors in peek view 89 | - Add dropdown colors for Windows 90 | 91 | ## 1.3.1 (April 13, 2019) 92 | 93 | - Improve status bar colors for debugging and prominent items 94 | - Add link to atom icons in README 95 | - Compress screenshot in README 96 | - Make foreground color of notifications consistent with lists 97 | - Improve block quote colors in markdown 98 | 99 | ## 1.3.0 (March 20, 2019) 100 | 101 | - Improve git support and add more color contrast in diffs 102 | - Simplify and fix a few syntax colors 103 | - Make small wording improvement in README 104 | - Fix indentation in package.json 105 | 106 | ## 1.2.0 107 | 108 | - Improve Python syntax highlighting support 109 | - Fix and standardize some settings colors 110 | 111 | ## 1.1.1 112 | 113 | - Update description of theme 114 | - Fix some highlighting colors 115 | - Update screenshot 116 | 117 | ## 1.1.0 118 | 119 | - Add color for ignored files 120 | - Fix attribute color in derivative html 121 | - Fix a few small color discrepancies with Atom 122 | 123 | ## 1.0.7 124 | 125 | - Add VS Code Marketplace icon 126 | 127 | ## 1.0.6 128 | 129 | - Make sure all JS keywords are the right color 130 | 131 | ## 1.0.5 132 | 133 | - Update name of `modifiedItemIndicator` 134 | - Remove color on links in code 135 | - Fix color of JS delete 136 | 137 | ## 1.0.2 138 | 139 | - Added more representative screenshot 140 | - Added MIT license 141 | - Updated readme 142 | 143 | ## 1.0.1 144 | 145 | - Compressed image in readme 146 | 147 | ## 1.0.0 148 | 149 | - Initial release 150 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Atomize 2 | 3 | [![Version](https://vsmarketplacebadge.apphb.com/version/emroussel.atomize-atom-one-dark-theme.svg)](https://marketplace.visualstudio.com/items?itemName=emroussel.atomize-atom-one-dark-theme) 4 | 5 | A detailed and accurate Atom One Dark theme 6 | 7 | Screenshot of VS Code with Atomize 8 | 9 | To get the icons in the screenshot above and an experience closer to Atom, check out my [Atom Icons theme](https://github.com/emroussel/atom-icons). 10 | 11 | **Note that if you want the same syntax highlighting as Atom One Dark, you will need to turn off semantic highlighting in your VS Code settings:** 12 | 13 | ```json 14 | "editor.semanticHighlighting.enabled": false 15 | ``` 16 | 17 | ## Contribution 18 | 19 | I have mostly used this theme with JavaScript and other web technologies. 20 | 21 | If you'd like me to add support for other languages, or notice a bug/discrepancy with Atom's One Dark theme, feel free to open an issue or pull request on this repo. 22 | 23 | When contributing changes, make sure that there is an example of those changes in a file in `/demo`. Files in that folder are used for manually testing syntax highlighting changes. It's not meant to be functional code (although it should be syntaxically correct) but instead to showcase different code patterns of languages supported by this theme. To make sure changes don't break existing highlighting, open and glance at these files in VS Code. 24 | 25 | ## Motivation 26 | 27 | I've always loved the UI and UX of Atom, but prefer the speed and reliability of VS Code. After looking for a while, I couldn't find any VS Code theme that accurately replicated Atom One Dark's interface and syntax highlighting, so I made this one. 28 | 29 | ## Next steps 30 | 31 | Here are some settings I use to make VS Code more minimalistic, so that I can focus on what's important. It also makes the experience more similar to Atom. 32 | 33 | ```json 34 | { 35 | "breadcrumbs.enabled": false, 36 | "editor.cursorBlinking": "blink", 37 | "editor.folding": false, 38 | "editor.hideCursorInOverviewRuler": true, 39 | "editor.minimap.enabled": false, 40 | "editor.occurrencesHighlight": false, 41 | "editor.renderIndentGuides": false, 42 | "editor.roundedSelection": false, 43 | "editor.selectionHighlight": false, 44 | "editor.scrollBeyondLastLine": false, 45 | "explorer.decorations.colors": false, 46 | "explorer.openEditors.visible": 0, 47 | "window.zoomLevel": 0, 48 | "workbench.activityBar.visible": false, 49 | "workbench.editor.showIcons": false, 50 | "workbench.startupEditor": "none", 51 | "workbench.tree.renderIndentGuides": "none" 52 | } 53 | ``` 54 | 55 | **Note:** This will hide the activity bar, so you will need to memorize a few shortcuts (they will be different if you changed the defaults): 56 | 57 | - Show explorer: ⇧+ ⌘ + E 58 | - Show search: ⇧+ ⌘ + F 59 | - Show extensions: ⇧+ ⌘ + X 60 | 61 | I also use [Subtle Match Brackets](https://marketplace.visualstudio.com/items?itemName=rafamel.subtle-brackets) instead of the default bracket matcher to get a better experience: 62 | 63 | ```json 64 | { 65 | "editor.matchBrackets": "never", 66 | "subtleBrackets.style": { 67 | "borderWidth": "1px", 68 | "borderColor": "#528BFF" 69 | } 70 | } 71 | ``` 72 | 73 | And if you would like keyword highlighting in comments, I use [TODO Highlight](https://marketplace.visualstudio.com/items?itemName=wayou.vscode-todo-highlight) with these settings to get Atom's colors: 74 | 75 | ```json 76 | { 77 | "todohighlight.keywords": [ 78 | { 79 | "text": "TODO:", 80 | "color": "#C678DD", 81 | "backgroundColor": "transparent" 82 | }, 83 | { 84 | "text": "NOTE:", 85 | "color": "#C678DD", 86 | "backgroundColor": "transparent" 87 | }, 88 | { 89 | "text": "FIXME:", 90 | "color": "#C678DD", 91 | "backgroundColor": "transparent" 92 | } 93 | ] 94 | } 95 | ``` 96 | 97 | ## Credits 98 | 99 | This theme is heavily inspired from Atom's [One Dark Syntax theme](https://github.com/atom/one-dark-syntax). 100 | 101 | ## License 102 | 103 | MIT 104 | -------------------------------------------------------------------------------- /themes/Atomize-color-theme.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Atomize", 3 | "type": "dark", 4 | "colors": { 5 | // Activity bar 6 | "activityBar.background": "#21252B", 7 | "activityBar.border": "#181A1F", 8 | "activityBar.dropBorder": "#D6D9DF", 9 | "activityBar.foreground": "#D6D9DF", 10 | "activityBarBadge.background": "#4D78CC", 11 | "activityBarBadge.foreground": "#FFFFFF", 12 | 13 | // Badge 14 | "badge.background": "#4D78CC", 15 | "badge.foreground": "#FFFFFF", 16 | 17 | // Base colors 18 | "errorForeground": "#FF6347", 19 | "focusBorder": "#5387F5", 20 | "foreground": "#ABB2BF", 21 | "selection.background": "#9DA5B4", 22 | "widget.shadow": "#181A1FFF", 23 | 24 | // Button 25 | "button.background": "#4D78CC", 26 | "button.foreground": "#FFFFFF", 27 | "button.hoverBackground": "#6187D2", 28 | 29 | // Debug exception widget 30 | "debugExceptionWidget.background": "#252830", 31 | "debugExceptionWidget.border": "#181A1F", 32 | 33 | // Dropdown 34 | "dropdown.background": "#1E2127", 35 | "dropdown.listBackground": "#1E2127", 36 | "dropdown.border": "#181A1F", 37 | "dropdown.foreground": "#D7DAE0", 38 | 39 | // Editor 40 | "editor.background": "#282C34", 41 | "editor.findMatchBackground": "#314166", 42 | "editor.findMatchHighlightBackground": "#518FFF36", 43 | "editor.findMatchBorder": "#518FFF", 44 | "editor.findMatchHighlightBorder": "#FFFFFF00", 45 | "editor.findRangeHighlightBackground": "#518FFF36", 46 | "editor.findRangeHighlightBorder": "#FFFFFF00", 47 | "editor.foreground": "#ABB2BF", 48 | "editor.hoverHighlightBackground": "#3A3F4BA6", 49 | "editor.inactiveSelectionBackground": "#3E4452", 50 | "editor.lineHighlightBackground": "#99BBFF0A", 51 | "editor.lineHighlightBorder": "#FFFFFF00", 52 | "editor.rangeHighlightBackground": "#FFFFFF00", 53 | "editor.selectionBackground": "#4B5365A6", 54 | "editor.selectionHighlightBackground": "#4B5365A6", 55 | "editor.wordHighlightBackground": "#3E4452", 56 | "editor.wordHighlightStrongBackground": "#518FFF36", 57 | "editorBracketHighlight.foreground1": "#ABB2BF", 58 | "editorBracketHighlight.foreground2": "#B556BD", 59 | "editorBracketHighlight.foreground3": "#4082DD", 60 | "editorBracketHighlight.foreground4": "#739E61", 61 | "editorBracketHighlight.foreground5": "#BE5046", 62 | "editorBracketHighlight.foreground6": "#C6A753", 63 | "editorBracketHighlight.unexpectedBracket.foreground": "#FF6347", 64 | "editorBracketMatch.background": "#282C34", 65 | "editorBracketMatch.border": "#518FFF", 66 | "editorCodeLens.foreground": "#9DA5B4", 67 | "editorCursor.foreground": "#528BFF", 68 | "editorError.foreground": "#FF6347", 69 | "editorGroup.border": "#181A1F", 70 | "editorGroup.dropBackground": "#4B4B4B4D", 71 | "editorGroup.emptyBackground": "#282C34", 72 | "editorGroupHeader.noTabsBackground": "#21252B", 73 | "editorGroupHeader.tabsBackground": "#21252B", 74 | "editorGroupHeader.tabsBorder": "#181A1F", 75 | "editorGutter.modifiedBackground": "#E0C285", 76 | "editorGutter.addedBackground": "#43D08A", 77 | "editorGutter.deletedBackground": "#FF6347", 78 | "editorHoverWidget.background": "#252830", 79 | "editorHoverWidget.border": "#181A1F", 80 | "editorIndentGuide.background": "#333840", 81 | "editorIndentGuide.activeBackground": "#333840", 82 | "editorLineNumber.foreground": "#4B5365", 83 | "editorLineNumber.activeForeground": "#777D88", 84 | "editorMarkerNavigation.background": "#21252B", 85 | "editorMarkerNavigationError.background": "#FF6347", 86 | "editorOverviewRuler.addedForeground": "#43D08A88", 87 | "editorOverviewRuler.bracketMatchForeground": "#FFFFFF00", 88 | "editorOverviewRuler.border": "#FFFFFF00", 89 | "editorOverviewRuler.deletedForeground": "#FF634788", 90 | "editorOverviewRuler.errorForeground": "#FF6347", 91 | "editorOverviewRuler.findMatchForeground": "#6B727E", 92 | "editorOverviewRuler.infoForeground": "#FFFFFF00", 93 | "editorOverviewRuler.modifiedForeground": "#E0C28588", 94 | "editorOverviewRuler.rangeHighlightForeground": "#FFFFFF00", 95 | "editorOverviewRuler.selectionHighlightForeground": "#6B727E", 96 | "editorOverviewRuler.warningForeground": "#E0C285", 97 | "editorOverviewRuler.wordHighlightForeground": "#FFFFFF00", 98 | "editorOverviewRuler.wordHighlightStrongForeground": "#FFFFFF00", 99 | "editorRuler.foreground": "#383D45", 100 | "editorSuggestWidget.background": "#252830", 101 | "editorSuggestWidget.border": "#181A1F", 102 | "editorSuggestWidget.foreground": "#9DA5B4", 103 | "editorSuggestWidget.highlightForeground": "#D8D9DB", 104 | "editorSuggestWidget.selectedBackground": "#3A3F4B", 105 | "editorWarning.foreground": "#E0C285", 106 | "editorWhitespace.foreground": "#3C4047", 107 | "editorWidget.background": "#21252B", 108 | "editorWidget.border": "#373D48", 109 | 110 | // Extension button 111 | "extensionButton.prominentBackground": "#4D78CC", 112 | "extensionButton.prominentForeground": "#FFFFFF", 113 | "extensionButton.prominentHoverBackground": "#6187D2", 114 | 115 | // Diff editor 116 | "diffEditor.insertedTextBackground": "#43D08A22", 117 | "diffEditor.removedTextBackground": "#FF634722", 118 | 119 | // Git 120 | "gitDecoration.ignoredResourceForeground": "#9DA5B499", 121 | "gitDecoration.addedResourceForeground": "#43D08A", 122 | "gitDecoration.modifiedResourceForeground": "#E0C285", 123 | "gitDecoration.deletedResourceForeground": "#FF6347", 124 | "gitlens.trailingLineForegroundColor": "#5C6370", 125 | 126 | // Inputs 127 | "input.background": "#1B1D23BF", 128 | "input.border": "#181A1F", 129 | "input.foreground": "#D7DAE0", 130 | "input.placeholderForeground": "#6B727E", 131 | "inputOption.activeBorder": "#5387F5", 132 | "inputValidation.errorBackground": "#312426", 133 | "inputValidation.errorBorder": "#FF6347", 134 | "inputValidation.errorForeground": "#D7DAE0", 135 | "inputValidation.infoBackground": "#21252B", 136 | "inputValidation.infoBorder": "#5387F5", 137 | "inputValidation.infoForeground": "#D7DAE0", 138 | "inputValidation.warningBackground": "#21252B", 139 | "inputValidation.warningBorder": "#E0C285", 140 | "inputValidation.warningForeground": "#D7DAE0", 141 | 142 | // Lists 143 | "list.activeSelectionBackground": "#4D78CC", 144 | "list.activeSelectionForeground": "#FFFFFF", 145 | "list.dropBackground": "#2F333D", 146 | "list.errorForeground": "#FF6347", 147 | "list.focusBackground": "#3A3F4B", 148 | "quickInputList.focusBackground": "#3A3F4B", 149 | "list.focusForeground": "#D7DAE0", 150 | "list.highlightForeground": "#739CF5", 151 | "list.hoverBackground": "#2F333D", 152 | "list.hoverForeground": "#9DA5B4", 153 | "list.inactiveSelectionBackground": "#3A3F4B", 154 | "list.inactiveSelectionForeground": "#D7DAE0", 155 | "listFilterWidget.background": "#282C34", 156 | "listFilterWidget.outline": "#181A1F", 157 | "listFilterWidget.noMatchesOutline": "#FF6347", 158 | 159 | // Notifications 160 | "notificationCenter.border": "#181A1F", 161 | "notificationCenterHeader.background": "#21252B", 162 | "notificationCenterHeader.foreground": "#D7DAE0", 163 | "notificationToast.border": "#181A1F", 164 | "notifications.background": "#21252B", 165 | "notifications.border": "#181A1F", 166 | 167 | // Panel 168 | "panel.background": "#21252B", 169 | "panel.border": "#181A1F", 170 | "panel.dropBorder": "#4B4B4B4D", 171 | "panelTitle.activeBorder": "#5387F5", 172 | "panelTitle.activeForeground": "#D7DAE0", 173 | "panelTitle.inactiveForeground": "#6B727E", 174 | 175 | // Peek view 176 | "peekView.border": "#181A1F", 177 | "peekViewEditor.background": "#282C34", 178 | "peekViewEditor.matchHighlightBackground": "#518FFF36", 179 | "peekViewEditorGutter.background": "#282C34", 180 | "peekViewResult.background": "#21252B", 181 | "peekViewResult.fileForeground": "#BDC0C7", 182 | "peekViewResult.lineForeground": "#BDC0C7", 183 | "peekViewResult.matchHighlightBackground": "#41537C", 184 | "peekViewResult.selectionBackground": "#4D78CC", 185 | "peekViewResult.selectionForeground": "#FFFFFF", 186 | "peekViewTitle.background": "#21252B", 187 | "peekViewTitleDescription.foreground": "#A0A8B9", 188 | "peekViewTitleLabel.foreground": "#D7DAE0", 189 | 190 | // Quick picker (Quick Open) 191 | "pickerGroup.border": "#3B4048", 192 | "pickerGroup.foreground": "#9DA5B4", 193 | 194 | // Progress bar 195 | "progressBar.background": "#4D78CC", 196 | 197 | // Settings editor 198 | "settings.checkboxBackground": "#1E2127", 199 | "settings.checkboxBorder": "#181A1F", 200 | "settings.dropdownBackground": "#1E2127", 201 | "settings.dropdownBorder": "#181A1F", 202 | "settings.dropdownForeground": "#D7DAE0", 203 | "settings.headerForeground": "#D7DAE0", 204 | "settings.modifiedItemIndicator": "#E0C285", 205 | "settings.numberInputBackground": "#1E2127", 206 | "settings.numberInputBorder": "#181A1F", 207 | "settings.numberInputForeground": "#D7DAE0", 208 | "settings.textInputBackground": "#1E2127", 209 | "settings.textInputBorder": "#181A1F", 210 | "settings.textInputForeground": "#D7DAE0", 211 | 212 | // Scrollbar 213 | "scrollbar.shadow": "#FFFFFF00", 214 | "scrollbarSlider.activeBackground": "#4C5366", 215 | "scrollbarSlider.background": "#4C536688", 216 | "scrollbarSlider.hoverBackground": "#4C536688", 217 | 218 | // Side bar 219 | "sideBar.background": "#21252B", 220 | "sideBar.foreground": "#9DA5B4", 221 | "sideBar.border": "#181A1F", 222 | "sideBarTitle.foreground": "#D7DAE0", 223 | "sideBarSectionHeader.background": "#333842", 224 | "sideBarSectionHeader.foreground": "#D7DAE0", 225 | 226 | // Status bar 227 | "statusBar.background": "#21252B", 228 | "statusBar.foreground": "#9DA5B4", 229 | "statusBar.border": "#181A1F", 230 | "statusBar.debuggingBackground": "#FF634788", 231 | "statusBar.debuggingForeground": "#FFFFFF", 232 | "statusBar.debuggingBorder": "#181A1F", 233 | "statusBar.noFolderForeground": "#9DA5B4", 234 | "statusBar.noFolderBackground": "#21252B", 235 | "statusBar.noFolderBorder": "#181A1F", 236 | "statusBarItem.activeBackground": "#2F333D", 237 | "statusBarItem.hoverBackground": "#2F333D", 238 | "statusBarItem.prominentBackground": "#21252B", 239 | "statusBarItem.prominentHoverBackground": "#2F333D", 240 | "statusBarItem.remoteBackground": "#21252B", 241 | "statusBarItem.remoteForeground": "#9DA5B4", 242 | 243 | // Tabs 244 | "tab.activeBackground": "#282C34", 245 | "tab.activeBorder": "#282C34", 246 | "tab.activeForeground": "#D7DAE0", 247 | "tab.border": "#181A1F", 248 | "tab.inactiveBackground": "#21252B", 249 | "tab.inactiveForeground": "#6B727E", 250 | "tab.unfocusedActiveBorder": "#282C34", 251 | "tab.unfocusedActiveForeground": "#D7DAE0", 252 | "tab.unfocusedInactiveForeground": "#6B727E", 253 | 254 | // Text 255 | "textBlockQuote.background": "#3A3F4BA6", 256 | "textBlockQuote.border": "#6B727E", 257 | "textCodeBlock.background": "#32373F", 258 | "textLink.activeForeground": "#769FEF", 259 | "textLink.foreground": "#6494ED", 260 | "textPreformat.foreground": "#D7DAE0", 261 | 262 | // Title bar (macOS only) 263 | "titleBar.activeBackground": "#21252B", 264 | "titleBar.activeForeground": "#D7DAE0", 265 | "titleBar.inactiveBackground": "#21252B", 266 | "titleBar.inactiveForeground": "#696F7A", 267 | "titleBar.border": "#181A1F" 268 | }, 269 | "tokenColors": [ 270 | // General 271 | { 272 | "name": "Comment", 273 | "scope": ["comment", "punctuation.definition.comment"], 274 | "settings": { 275 | "fontStyle": "italic", 276 | "foreground": "#5C6370" 277 | } 278 | }, 279 | { 280 | "name": "Keyword", 281 | "scope": [ 282 | "keyword", 283 | "storage", 284 | "variable.language.super", 285 | "variable.language.this", 286 | "variable.language.special" 287 | ], 288 | "settings": { 289 | "foreground": "#C678DD" 290 | } 291 | }, 292 | { 293 | "name": "String", 294 | "scope": ["string", "punctuation.definition.string"], 295 | "settings": { 296 | "foreground": "#98C379" 297 | } 298 | }, 299 | { 300 | "name": "Constant", 301 | "scope": [ 302 | "constant", 303 | "keyword.other.unit", 304 | "variable.other.constant", 305 | "variable.other.enummember" 306 | ], 307 | "settings": { 308 | "foreground": "#D19A66" 309 | } 310 | }, 311 | { 312 | "name": "Function", 313 | "scope": [ 314 | "entity.name.function", 315 | "support.function", 316 | "punctuation.definition.decorator", 317 | "punctuation.decorator", 318 | "meta.function-call.generic" 319 | ], 320 | "settings": { 321 | "foreground": "#61AFEF" 322 | } 323 | }, 324 | { 325 | "name": "Class", 326 | "scope": [ 327 | "entity.name.type", 328 | "entity.other.inherited-class", 329 | "support.class" 330 | ], 331 | "settings": { 332 | "foreground": "#E5C07B" 333 | } 334 | }, 335 | { 336 | "name": "Type", 337 | "scope": [ 338 | "meta.type.annotation", 339 | "meta.type.parameters", 340 | "support.type.primitive", 341 | "support.type.builtin", 342 | "support.type.exception" 343 | ], 344 | "settings": { 345 | "foreground": "#E5C07B" 346 | } 347 | }, 348 | { 349 | "name": "Operator", 350 | "scope": [ 351 | "punctuation.accessor", 352 | "keyword.operator.logical", 353 | "keyword.operator.comparison", 354 | "keyword.operator.increment", 355 | "keyword.operator.decrement", 356 | "keyword.operator.assignment", 357 | "keyword.operator.relational", 358 | "keyword.operator.ternary", 359 | "keyword.operator.arithmetic", 360 | "keyword.operator.rest", 361 | "keyword.operator.spread", 362 | "keyword.operator.type", 363 | "keyword.operator.optional", 364 | "keyword.operator.combinator", 365 | "keyword.operator.pattern", 366 | "keyword.operator.or", 367 | "keyword.operator.quantifier", 368 | "keyword.operator.bitwise" 369 | ], 370 | "settings": { 371 | "foreground": "#56B6C2" 372 | } 373 | }, 374 | { 375 | "name": "Ponctuation", 376 | "scope": [ 377 | "punctuation", 378 | "keyword.operator.type.annotation", 379 | "meta.brace" 380 | ], 381 | "settings": { 382 | "foreground": "#ABB2BF" 383 | } 384 | }, 385 | { 386 | "name": "Variable", 387 | "scope": ["variable", "entity.name", "support.variable"], 388 | "settings": { 389 | "foreground": "#E06C75" 390 | } 391 | }, 392 | { 393 | "name": "Object key", 394 | "scope": ["meta.object-literal.key"], 395 | "settings": { 396 | "foreground": "#98C379" 397 | } 398 | }, 399 | 400 | // C++ 401 | { 402 | "name": "C++ Keywords", 403 | "scope": [ 404 | "punctuation.definition.directive.cpp", 405 | "keyword.other.using.directive.cpp" 406 | ], 407 | "settings": { 408 | "foreground": "#C678DD" 409 | } 410 | }, 411 | { 412 | "name": "C++ Scopes", 413 | "scope": [ 414 | "entity.name.scope-resolution.parameter.cpp", 415 | "entity.name.scope-resolution.cpp", 416 | "entity.name.scope-resolution.function.call.cpp", 417 | "entity.name.scope-resolution.template.call.cpp", 418 | "entity.name.scope-resolution.function.definition.cpp" 419 | ], 420 | "settings": { 421 | "foreground": "#E5C07B" 422 | } 423 | }, 424 | 425 | // CSS/SASS 426 | { 427 | "name": "CSS/SASS keyword", 428 | "scope": [ 429 | "punctuation.definition.keyword.css", 430 | "punctuation.definition.keyword.scss", 431 | "keyword.operator.logical.and.media.css", 432 | "keyword.operator.logical.and.media.scss", 433 | "keyword.operator.logical.scss" 434 | ], 435 | "settings": { 436 | "foreground": "#C678DD" 437 | } 438 | }, 439 | { 440 | "name": "CSS/SASS constant", 441 | "scope": [ 442 | "support.constant.property-value.css", 443 | "support.constant.vendored.property-value.css", 444 | "support.constant.color.w3c-standard-color-name.css", 445 | "support.constant.font-name.css", 446 | "punctuation.definition.constant.css", 447 | "entity.other.attribute-name.css", 448 | "entity.other.attribute-name.attribute.scss" 449 | ], 450 | "settings": { 451 | "foreground": "#D19A66" 452 | } 453 | }, 454 | { 455 | "name": "CSS/SASS operator", 456 | "scope": ["keyword.operator.css", "keyword.operator.scss"], 457 | "settings": { 458 | "foreground": "#56B6C2" 459 | } 460 | }, 461 | { 462 | "name": "CSS/SASS id + class", 463 | "scope": [ 464 | "entity.other.attribute-name.class.css", 465 | "entity.other.attribute-name.id.css" 466 | ], 467 | "settings": { 468 | "foreground": "#E06C75" 469 | } 470 | }, 471 | { 472 | "name": "CSS/SASS pseudo", 473 | "scope": [ 474 | "entity.other.attribute-name.pseudo-element.css", 475 | "entity.other.attribute-name.pseudo-class.css" 476 | ], 477 | "settings": { 478 | "foreground": "#E5C07B" 479 | } 480 | }, 481 | { 482 | "name": "CSS/SASS variable", 483 | "scope": ["meta.property-value.css"], 484 | "settings": { 485 | "foreground": "#E06C75" 486 | } 487 | }, 488 | { 489 | "name": "CSS/SASS key", 490 | "scope": [ 491 | "support.type.map.key.scss", 492 | "entity.other.keyframe-offset.css", 493 | "meta.property-name.css", 494 | "entity.other.attribute-name.scss", 495 | "support.type.property-name.media.css" 496 | ], 497 | "settings": { 498 | "foreground": "#98C379" 499 | } 500 | }, 501 | { 502 | "name": "CSS/SASS string", 503 | "scope": ["meta.attribute-selector.scss"], 504 | "settings": { 505 | "foreground": "#98C379" 506 | } 507 | }, 508 | { 509 | "name": "CSS/SASS punctuation", 510 | "scope": ["variable.parameter.url.css", "variable.parameter.url.scss"], 511 | "settings": { 512 | "foreground": "#ABB2BF" 513 | } 514 | }, 515 | 516 | // GraphQL 517 | { 518 | "name": "GraphQL comment", 519 | "scope": ["punctuation.whitespace.comment"], 520 | "settings": { 521 | "fontStyle": "italic", 522 | "foreground": "#5C6370" 523 | } 524 | }, 525 | { 526 | "name": "GraphQL type", 527 | "scope": [ 528 | "support.type.graphql", 529 | "support.type.location.graphql", 530 | "support.type.enum.graphql", 531 | "entity.scalar.graphql" 532 | ], 533 | "settings": { 534 | "foreground": "#E5C07B" 535 | } 536 | }, 537 | { 538 | "name": "GraphQL operator", 539 | "scope": [ 540 | "punctuation.or.graphql", 541 | "keyword.operator.nulltype.graphql", 542 | "punctuation.assignment.graphql" 543 | ], 544 | "settings": { 545 | "foreground": "#56B6C2" 546 | } 547 | }, 548 | 549 | // HTML/XML 550 | { 551 | "name": "HTML/XML attribute", 552 | "scope": [ 553 | "entity.other.attribute-name.html", 554 | "entity.other.attribute-name.localname.xml", 555 | "entity.other.attribute-name.namespace.xml" 556 | ], 557 | "settings": { 558 | "fontStyle": "italic", 559 | "foreground": "#D19A66" 560 | } 561 | }, 562 | 563 | // JS/TS 564 | { 565 | "name": "JSX attribute", 566 | "scope": [ 567 | "entity.other.attribute-name.js", 568 | "entity.other.attribute-name.tsx" 569 | ], 570 | "settings": { 571 | "fontStyle": "italic", 572 | "foreground": "#D19A66" 573 | } 574 | }, 575 | { 576 | "name": "JS built-ins", 577 | "scope": [ 578 | "support.constant.json.js", 579 | "support.constant.json.jsx", 580 | "support.constant.json.ts", 581 | "support.constant.json.tsx", 582 | "support.constant.math.js", 583 | "support.constant.math.jsx", 584 | "support.constant.math.ts", 585 | "support.constant.math.tsx" 586 | ], 587 | "settings": { 588 | "foreground": "#E5C07B" 589 | } 590 | }, 591 | { 592 | "name": "JS modules", 593 | "scope": [ 594 | "support.type.object.module.js", 595 | "support.type.object.module.jsx", 596 | "support.type.object.module.ts", 597 | "support.type.object.module.tsx" 598 | ], 599 | "settings": { 600 | "foreground": "#51B4C3" 601 | } 602 | }, 603 | { 604 | "name": "JSX bracket", 605 | "scope": [ 606 | "punctuation.section.embedded.begin.js", 607 | "punctuation.section.embedded.begin.tsx", 608 | "punctuation.section.embedded.end.js", 609 | "punctuation.section.embedded.end.tsx" 610 | ], 611 | "settings": { 612 | "foreground": "#BE5046" 613 | } 614 | }, 615 | { 616 | "name": "JS constants", 617 | "scope": [ 618 | "variable.other.constant.js", 619 | "variable.other.constant.jsx", 620 | "variable.other.constant.ts", 621 | "variable.other.constant.tsx" 622 | ], 623 | "settings": { 624 | "foreground": "#E06C75" 625 | } 626 | }, 627 | 628 | // JSON 629 | { 630 | "name": "JSON key", 631 | "scope": [ 632 | "string.json", 633 | "punctuation.support.type.property-name.begin.json", 634 | "punctuation.support.type.property-name.end.json" 635 | ], 636 | "settings": { 637 | "foreground": "#E06C75" 638 | } 639 | }, 640 | 641 | // Markdown 642 | { 643 | "name": "Markdown heading", 644 | "scope": ["punctuation.definition.heading.markdown"], 645 | "settings": { 646 | "foreground": "#E06C75" 647 | } 648 | }, 649 | { 650 | "name": "Markdown italic", 651 | "scope": [ 652 | "markup.italic.markdown", 653 | "punctuation.definition.italic.markdown" 654 | ], 655 | "settings": { 656 | "fontStyle": "italic", 657 | "foreground": "#C678DD" 658 | } 659 | }, 660 | { 661 | "name": "Markdown bold", 662 | "scope": ["markup.bold.markdown", "punctuation.definition.bold.markdown"], 663 | "settings": { 664 | "fontStyle": "bold", 665 | "foreground": "#D19A66" 666 | } 667 | }, 668 | { 669 | "name": "Markdown string", 670 | "scope": [ 671 | "punctuation.definition.raw.markdown", 672 | "markup.inline.raw.string.markdown", 673 | "punctuation.definition.markdown", 674 | "fenced_code.block.language.markdown" 675 | ], 676 | "settings": { 677 | "foreground": "#98C379" 678 | } 679 | }, 680 | { 681 | "name": "Markdown list", 682 | "scope": ["punctuation.definition.list.begin.markdown"], 683 | "settings": { 684 | "foreground": "#E06C75" 685 | } 686 | }, 687 | { 688 | "name": "Markdown blockquote", 689 | "scope": [ 690 | "markup.quote.markdown", 691 | "punctuation.definition.quote.begin.markdown" 692 | ], 693 | "settings": { 694 | "fontStyle": "italic" 695 | } 696 | }, 697 | { 698 | "name": "Markdown links", 699 | "scope": [ 700 | "markup.underline.link.markdown", 701 | "markup.underline.link.image.markdown" 702 | ], 703 | "settings": { 704 | "foreground": "#56B6C2" 705 | } 706 | }, 707 | { 708 | "name": "Markdown code block language", 709 | "scope": ["fenced_code.block.language.markdown"], 710 | "settings": { 711 | "fontStyle": "italic" 712 | } 713 | }, 714 | 715 | // Python 716 | { 717 | "name": "Python operator", 718 | "scope": [ 719 | "keyword.operator.python", 720 | "keyword.operator.unpacking.arguments.python", 721 | "punctuation.separator.period.python" 722 | ], 723 | "settings": { 724 | "foreground": "#56B6C2" 725 | } 726 | }, 727 | { 728 | "name": "Python keyword", 729 | "scope": ["keyword.operator.logical.python"], 730 | "settings": { 731 | "foreground": "#C678DD" 732 | } 733 | }, 734 | { 735 | "name": "Python type", 736 | "scope": ["support.type.python"], 737 | "settings": { 738 | "foreground": "#E5C07B" 739 | } 740 | }, 741 | { 742 | "name": "Python source", 743 | "scope": ["source.python"], 744 | "settings": { 745 | "foreground": "#E06C75" 746 | } 747 | }, 748 | 749 | // Regex 750 | 751 | // SQL 752 | { 753 | "name": "SQL names", 754 | "scope": [ 755 | "constant.other.table-name.sql", 756 | "constant.other.database-name.sql" 757 | ], 758 | "settings": { 759 | "foreground": "#ABB2BF" 760 | } 761 | }, 762 | { 763 | "name": "SQL math", 764 | "scope": ["keyword.operator.math.sql", "keyword.operator.star.sql"], 765 | "settings": { 766 | "foreground": "#56B6C2" 767 | } 768 | }, 769 | 770 | // Toml 771 | { 772 | "name": "Toml key", 773 | "scope": [ 774 | "keyword.key.toml", 775 | "entity.other.attribute-name.table.toml", 776 | "entity.other.attribute-name.table.array.toml" 777 | ], 778 | "settings": { 779 | "foreground": "#E06C75" 780 | } 781 | }, 782 | 783 | // Yaml 784 | { 785 | "name": "Yaml string multi line", 786 | "scope": [ 787 | "keyword.control.flow.block-scalar.folded.yaml", 788 | "keyword.control.flow.block-scalar.literal.yaml", 789 | "storage.modifier.chomping-indicator.yaml" 790 | ], 791 | "settings": { 792 | "foreground": "#56B6C2" 793 | } 794 | } 795 | ] 796 | } 797 | --------------------------------------------------------------------------------