commit 42a4252fc8e3c455f7c5bc944f2160ff50a1d505 Author: jshuntley Date: Sat Oct 18 18:19:39 2025 -0700 initial commit diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..c41b3c9 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,43 @@ +name: Publish VS Code Extension + +on: + push: + tags: + - "v*" + workflow_dispatch: + +jobs: + publish: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: "18" + + - name: Install dependencies + run: npm ci + + - name: Package extension + run: npm run package + + - name: Publish to Marketplace + run: npm run publish + env: + VSCE_PAT: ${{ secrets.VSCE_PAT }} + + - name: Create GitHub Release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ github.ref_name }} + release_name: Fjord Theme ${{ github.ref_name }} + draft: false + prerelease: false + files: | + *.vsix diff --git a/.vscodeignore b/.vscodeignore new file mode 100644 index 0000000..5e7e9ae --- /dev/null +++ b/.vscodeignore @@ -0,0 +1,12 @@ +.vscode/** +.vscode-test/** +src/** +.gitignore +.yarnrc +vsc-extension-quickstart.md +**/tsconfig.json +**/.eslintrc.json +**/*.map +**/*.ts +node_modules/** +.github \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..48b12b0 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,31 @@ +# Changelog + +All notable changes to the Fjord VS Code theme will be documented in this file. + +## [0.1.0] - 2025-10-18 + +### Added + +- Initial release of Fjord theme for VS Code +- Dusk-blue base with soft leaf-green accents +- Amber selections and crisp blue/cyan separation +- Complete syntax highlighting support +- Optimized for transparent terminal backgrounds + +### Theme Features + +- 16-color terminal palette +- Syntax highlighting for multiple languages +- UI elements (selections, cursors, line numbers) +- Git integration colors +- Search and match highlighting + +--- + +## Versioning + +This theme follows semantic versioning. For the versions available, see the [tags on this repository](https://github.com/jshuntley/fjord-helix/tags). + +## Auto-Generation + +This theme is automatically generated from the [main Fjord repository](https://github.com/jshuntley/fjord). Changes to the color palette are reflected automatically in all theme repositories. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ffeed71 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 jshuntley + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..333c1e8 --- /dev/null +++ b/README.md @@ -0,0 +1,98 @@ +# Fjord Theme for VS Code + +A dusk-blue base with soft leaf-green accents, amber selections, and crisp blue/cyan separation for Visual Studio Code. + +## 🎨 Color Palette + +### Core Colors + +| Color | Name | +| --------------------------------------------------------- | ----------------- | +| ![#1B2532](https://img.shields.io/badge/%231B2532-1B2532) | **background** | +| ![#222E3F](https://img.shields.io/badge/%23222E3F-222E3F) | **backgroundAlt** | +| ![#1F2A39](https://img.shields.io/badge/%231F2A39-1F2A39) | **surface** | +| ![#233141](https://img.shields.io/badge/%23233141-233141) | **line** | +| ![#E8F0F3](https://img.shields.io/badge/%23E8F0F3-E8F0F3) | **foreground** | +| ![#6C7A86](https://img.shields.io/badge/%236C7A86-6C7A86) | **muted** | +| ![#51606B](https://img.shields.io/badge/%2351606B-51606B) | **mutedDim** | + +### Accent Colors + +| Color | Name | +| --------------------------------------------------------- | ---------------------------- | +| ![#9DD99A](https://img.shields.io/badge/%239DD99A-9DD99A) | **green** _(primary accent)_ | +| ![#5DA6EA](https://img.shields.io/badge/%235DA6EA-5DA6EA) | **blue** | +| ![#FFD285](https://img.shields.io/badge/%23FFD285-FFD285) | **yellow** | +| ![#B9A0F8](https://img.shields.io/badge/%23B9A0F8-B9A0F8) | **purple** | +| ![#F37C7C](https://img.shields.io/badge/%23F37C7C-F37C7C) | **red** | +| ![#B8E7E9](https://img.shields.io/badge/%23B8E7E9-B8E7E9) | **cyan** | + +## 📦 Installation + +### From VS Code Marketplace + +1. Open VS Code +2. Go to Extensions (Ctrl+Shift+X) +3. Search for "Fjord" +4. Click Install + +### Manual Installation + +1. Download the latest `.vsix` file from [Releases](https://github.com/fjord-theme/fjord-vscode/releases) +2. Open VS Code +3. Go to Extensions (Ctrl+Shift+X) +4. Click the "..." menu and select "Install from VSIX..." +5. Select the downloaded `.vsix` file + +### From Source + +1. Clone this repository: + + ```bash + git clone https://github.com/fjord-theme/fjord-vscode.git + cd fjord-vscode + ``` + +2. Install dependencies: + + ```bash + npm install + ``` + +3. Package the extension: + + ```bash + npm run package + ``` + +4. Install the generated `.vsix` file + +## 🔧 Configuration + +After installation, you can activate the theme by: + +1. Opening the Command Palette (Ctrl+Shift+P) +2. Typing "Preferences: Color Theme" +3. Selecting "Fjord" + +## 📸 Preview + +![Fjord VS Code Theme](https://raw.githubusercontent.com/fjord-theme/fjord/main/docs/images/colortest.png) + +## 🔄 Updates + +This theme is automatically generated from the [main Fjord repository](https://github.com/fjord-theme/fjord). For the latest updates, check the main repository. + +## ☕ Support My Work + +If you enjoy the Fjord theme and find it useful, consider supporting my work: + +[![Buy Me A Coffee](https://img.shields.io/badge/Buy%20Me%20A%20Coffee-FFDD00?style=for-the-badge&logo=buy-me-a-coffee&logoColor=black)](https://buymeacoffee.com/jshuntley) + +## 📄 License + +MIT License - see [LICENSE](LICENSE) file for details. + +## 🤝 Contributing + +For theme suggestions or issues, please visit the [main Fjord repository](https://github.com/fjord-theme/fjord). diff --git a/fjord-theme-0.1.0.vsix b/fjord-theme-0.1.0.vsix new file mode 100644 index 0000000..ae691a7 Binary files /dev/null and b/fjord-theme-0.1.0.vsix differ diff --git a/fjordx128.png b/fjordx128.png new file mode 100644 index 0000000..b0e24c1 Binary files /dev/null and b/fjordx128.png differ diff --git a/package.json b/package.json new file mode 100644 index 0000000..3747889 --- /dev/null +++ b/package.json @@ -0,0 +1,42 @@ +{ + "name": "fjord-theme", + "displayName": "Fjord", + "description": "Fjord theme for VS Code. Dusk-blue base with soft leaf-green accents, amber selections, and crisp blue/cyan separation.", + "icon": "fjordx128.png", + "version": "0.1.0", + "publisher": "jshuntley", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/jshuntley/fjord-vscode" + }, + "engines": { + "vscode": "^1.70.0" + }, + "categories": [ + "Themes" + ], + "contributes": { + "themes": [ + { + "label": "Fjord", + "uiTheme": "vs-dark", + "path": "./themes/fjord-color-theme.json" + } + ] + }, + "scripts": { + "package": "vsce package", + "publish": "vsce publish", + "clean": "rm -f *.vsix" + }, + "devDependencies": { + "@vscode/vsce": "^2.21.0" + }, + "keywords": [ + "theme", + "color-theme", + "dark-theme", + "fjord" + ] +} diff --git a/themes/fjord-color-theme.json b/themes/fjord-color-theme.json new file mode 100644 index 0000000..a36bcda --- /dev/null +++ b/themes/fjord-color-theme.json @@ -0,0 +1,552 @@ +{ + "$schema": "vscode://schemas/color-theme", + "name": "Fjord", + "type": "dark", + "semanticHighlighting": true, + "colors": { + "focusBorder": "#233141", + "foreground": "#E8F0F3", + "descriptionForeground": "#6C7A86", + "editor.background": "#1B2532", + "editor.foreground": "#E8F0F3", + "editorCursor.foreground": "#9DD99A", + "editor.selectionBackground": "#2D3D52", + "editor.selectionForeground": "#1B2532", + "editor.inactiveSelectionBackground": "#2D3D5280", + "editor.selectionHighlightBackground": "#233141A6", + "editor.wordHighlightBackground": "#233141A6", + "editor.wordHighlightStrongBackground": "#233141CC", + "editor.lineHighlightBackground": "#1F2A39", + "editorLineNumber.foreground": "#6C7A86", + "editorLineNumber.activeForeground": "#E8F0F3", + "editorWhitespace.foreground": "#51606B", + "editorBracketMatch.border": "#7BB8FF", + "editorBracketMatch.background": "#233141", + "editor.foldBackground": "#1F2A39AC", + "editorGutter.background": "#1B2532", + "editorRuler.foreground": "#233141", + "editorHoverWidget.background": "#1F2A39", + "editorHoverWidget.border": "#233141", + "editorWidget.background": "#1F2A39", + "editorWidget.border": "#233141", + "editorIndentGuide.background1": "#51606B", + "editorIndentGuide.activeBackground1": "#6C7A86", + "sideBar.background": "#1F2A39", + "sideBar.foreground": "#E8F0F3", + "sideBar.border": "#233141", + "sideBarSectionHeader.background": "#1F2A39", + "sideBarSectionHeader.foreground": "#E8F0F3", + "statusBar.background": "#1F2A39", + "statusBar.foreground": "#E8F0F3", + "statusBar.debuggingBackground": "#5DA6EA", + "statusBar.debuggingForeground": "#1B2532", + "statusBar.noFolderBackground": "#1F2A39", + "statusBarItem.remoteBackground": "#9DD99A", + "statusBarItem.remoteForeground": "#1B2532", + "activityBar.background": "#1F2A39", + "activityBar.foreground": "#E8F0F3", + "activityBar.inactiveForeground": "#6C7A86", + "activityBarBadge.background": "#9DD99A", + "activityBarBadge.foreground": "#1B2532", + "titleBar.activeBackground": "#1F2A39", + "titleBar.activeForeground": "#E8F0F3", + "titleBar.inactiveBackground": "#1F2A39", + "titleBar.inactiveForeground": "#6C7A86", + "panel.background": "#1F2A39", + "panel.border": "#233141", + "panelTitle.activeForeground": "#E8F0F3", + "panelTitle.inactiveForeground": "#6C7A86", + "tab.activeBackground": "#1B2532", + "tab.activeForeground": "#E8F0F3", + "tab.inactiveBackground": "#1F2A39", + "tab.inactiveForeground": "#6C7A86", + "tab.border": "#233141", + "tab.activeBorderTop": "#5DA6EA", + "badge.background": "#5DA6EA", + "badge.foreground": "#1B2532", + "list.activeSelectionBackground": "#233141", + "list.activeSelectionForeground": "#E8F0F3", + "list.inactiveSelectionBackground": "#1F2A39", + "list.inactiveSelectionForeground": "#E8F0F3", + "list.hoverBackground": "#1F2A39", + "list.focusBackground": "#1F2A39", + "list.highlightForeground": "#7BB8FF", + "button.background": "#9DD99A", + "button.foreground": "#1B2532", + "button.hoverBackground": "#A3D5A0", + "checkbox.background": "#1F2A39", + "checkbox.foreground": "#E8F0F3", + "dropdown.background": "#1F2A39", + "dropdown.foreground": "#E8F0F3", + "input.background": "#1F2A39", + "input.foreground": "#E8F0F3", + "input.placeholderForeground": "#6C7A86", + "input.border": "#233141", + "scrollbarSlider.background": "#6C7A8680", + "scrollbarSlider.hoverBackground": "#6C7A86A6", + "scrollbarSlider.activeBackground": "#6C7A86CC", + "editorGroupHeader.tabsBackground": "#1F2A39", + "editorGroup.border": "#233141", + "gitDecoration.addedResourceForeground": "#A3D5A0", + "gitDecoration.modifiedResourceForeground": "#7BB8FF", + "gitDecoration.deletedResourceForeground": "#FF9B9B", + "gitDecoration.untrackedResourceForeground": "#9DD99A", + "gitDecoration.ignoredResourceForeground": "#6C7A86", + "gitDecoration.conflictingResourceForeground": "#D4C6F7", + "diffEditor.insertedTextBackground": "#9DD99A35", + "diffEditor.removedTextBackground": "#F37C7C35", + "diffEditor.diagonalFill": "#233141", + "peekView.border": "#233141", + "peekViewEditor.background": "#1B2532", + "peekViewEditor.matchHighlightBackground": "#FFE0A366", + "peekViewResult.background": "#1F2A39", + "peekViewTitle.background": "#1F2A39", + "debugToolBar.background": "#1F2A39", + "notificationCenterHeader.background": "#1F2A39", + "notifications.background": "#1F2A39", + "notifications.border": "#233141", + "editorBracketHighlight.foreground1": "#5DA6EA", + "editorBracketHighlight.foreground2": "#B8E7E9", + "editorBracketHighlight.foreground3": "#9DD99A", + "editorBracketHighlight.foreground4": "#FFD285", + "editorBracketHighlight.foreground5": "#B9A0F8", + "editorBracketHighlight.unexpectedBracket.foreground": "#FF9B9B", + "terminal.foreground": "#E8F0F3", + "terminal.background": "#1B2532", + "terminalCursor.foreground": "#9DD99A", + "terminal.selectionBackground": "#FFD285", + "terminal.ansiBlack": "#19191C", + "terminal.ansiRed": "#F37C7C", + "terminal.ansiGreen": "#9DD99A", + "terminal.ansiYellow": "#FFD285", + "terminal.ansiBlue": "#5DA6EA", + "terminal.ansiMagenta": "#B9A0F8", + "terminal.ansiCyan": "#B8E7E9", + "terminal.ansiWhite": "#E8F0F3", + "terminal.ansiBrightBlack": "#212128", + "terminal.ansiBrightRed": "#FF9B9B", + "terminal.ansiBrightGreen": "#A3D5A0", + "terminal.ansiBrightYellow": "#FFE0A3", + "terminal.ansiBrightBlue": "#7BB8FF", + "terminal.ansiBrightMagenta": "#D4C6F7", + "terminal.ansiBrightCyan": "#A1E9DE", + "terminal.ansiBrightWhite": "#EFFAFF" + }, + "tokenColors": [ + { + "name": "Comments", + "scope": [ + "comment", + "punctuation.definition.comment" + ], + "settings": { + "foreground": "#6C7A86" + } + }, + { + "name": "Strings", + "scope": [ + "string", + "string.quoted", + "meta.template.expression string" + ], + "settings": { + "foreground": "#9DD99A" + } + }, + { + "name": "String escapes → cyan", + "scope": [ + "constant.character.escape" + ], + "settings": { + "foreground": "#B8E7E9" + } + }, + { + "name": "Numbers", + "scope": [ + "constant.numeric" + ], + "settings": { + "foreground": "#7BB8FF" + } + }, + { + "name": "Constants (other)", + "scope": [ + "constant", + "variable.other.constant" + ], + "settings": { + "foreground": "#7BB8FF" + } + }, + { + "name": "Keywords (general) → green", + "scope": [ + "keyword", + "storage.modifier", + "storage.type", + "storage" + ], + "settings": { + "foreground": "#9DD99A" + } + }, + { + "name": "Directives / Preprocessor", + "scope": [ + "keyword.directive", + "keyword.control.directive", + "meta.preprocessor", + "keyword.preprocessor", + "keyword.preprocessor.c", + "meta.preprocessor.directive.include", + "meta.preprocessor.directive.pragma", + "punctuation.definition.preprocessor" + ], + "settings": { + "foreground": "#FFE0A3" + } + }, + { + "name": "Keyword control (if/else/for/return) → bright green bold", + "scope": [ + "keyword.control", + "keyword.control.conditional", + "keyword.control.loop", + "keyword.control.return", + "keyword.control.flow" + ], + "settings": { + "foreground": "#A3D5A0", + "fontStyle": "bold" + } + }, + { + "name": "Directive Keywords (override) → no bold", + "scope": [ + "keyword.control.directive", + "keyword.directive.c", + "keyword.control.directive.c" + ], + "settings": { + "foreground": "#FFE0A3", + "fontStyle": "" + } + }, + { + "name": "Keyword operator (==, =, &&, ||, etc.) → blue", + "scope": [ + "keyword.operator", + "keyword.operator.assignment", + "keyword.operator.arithmetic", + "keyword.operator.logical", + "punctuation.separator.key-value" + ], + "settings": { + "foreground": "#7BB8FF" + } + }, + { + "name": "Functions → amber", + "scope": [ + "entity.name.function", + "support.function", + "meta.function-call", + "meta.function", + "variable.function" + ], + "settings": { + "foreground": "#FFD285" + } + }, + { + "name": "Constructors", + "scope": [ + "entity.name.type.instance", + "entity.other.inherited-class" + ], + "settings": { + "foreground": "#5DA6EA" + } + }, + { + "name": "Types / Classes / Interfaces", + "scope": [ + "entity.name.type", + "support.type", + "support.class", + "entity.other.attribute-name.class" + ], + "settings": { + "foreground": "#5DA6EA" + } + }, + { + "name": "Built-in types", + "scope": [ + "support.type.builtin", + "storage.type.builtin" + ], + "settings": { + "foreground": "#7BB8FF" + } + }, + { + "name": "Variables", + "scope": [ + "variable", + "meta.definition.variable" + ], + "settings": { + "foreground": "#E8F0F3" + } + }, + { + "name": "Properties / Members", + "scope": [ + "variable.other.property", + "variable.other.member" + ], + "settings": { + "foreground": "#B8E7E9" + } + }, + { + "name": "Parameters", + "scope": [ + "variable.parameter" + ], + "settings": { + "foreground": "#E8F0F3" + } + }, + { + "name": "This / self", + "scope": [ + "variable.language.this", + "variable.language.this.js", + "variable.language.self" + ], + "settings": { + "foreground": "#B8E7E9" + } + }, + { + "name": "Operators", + "scope": [ + "keyword.operator.assignment", + "keyword.operator.logical", + "keyword.operator.arithmetic", + "punctuation.separator.key-value" + ], + "settings": { + "foreground": "#7BB8FF" + } + }, + { + "name": "Punctuation", + "scope": [ + "punctuation", + "punctuation.definition.parameters", + "punctuation.section", + "punctuation.separator", + "meta.brace", + "meta.bracket" + ], + "settings": { + "foreground": "#E8F0F3" + } + }, + { + "name": "Tags", + "scope": [ + "entity.name.tag", + "support.class.component" + ], + "settings": { + "foreground": "#5DA6EA" + } + }, + { + "name": "Attributes (HTML/JSX)", + "scope": [ + "entity.other.attribute-name", + "entity.other.attribute-name.id", + "meta.tag entity.other.attribute-name" + ], + "settings": { + "foreground": "#9DD99A" + } + }, + { + "name": "Decorators / Annotations", + "scope": [ + "meta.decorator", + "storage.type.annotation", + "punctuation.decorator" + ], + "settings": { + "foreground": "#D4C6F7" + } + }, + { + "name": "Punctuation Special", + "scope": [ + "punctuation.special" + ], + "settings": { + "foreground": "#B8E7E9" + } + }, + { + "name": "Variable Builtin", + "scope": [ + "variable.builtin", + "variable.language" + ], + "settings": { + "foreground": "#B8E7E9" + } + }, + { + "name": "Function Special", + "scope": [ + "function.special" + ], + "settings": { + "foreground": "#FFE0A3" + } + }, + { + "name": "Function Macro", + "scope": [ + "function.macro" + ], + "settings": { + "foreground": "#D4C6F7" + } + }, + { + "name": "Keyword Function", + "scope": [ + "keyword.function" + ], + "settings": { + "foreground": "#5DA6EA" + } + }, + { + "name": "String Special", + "scope": [ + "string.special", + "string.special.path", + "string.special.symbol" + ], + "settings": { + "foreground": "#5DA6EA" + } + }, + { + "name": "Namespace", + "scope": [ + "entity.name.namespace" + ], + "settings": { + "foreground": "#5DA6EA" + } + }, + { + "name": "Regexp", + "scope": [ + "string.regexp" + ], + "settings": { + "foreground": "#B8E7E9" + } + }, + { + "name": "Invalid", + "scope": [ + "invalid", + "invalid.illegal" + ], + "settings": { + "foreground": "#1B2532" + } + }, + { + "name": "Deprecated", + "scope": [ + "invalid.deprecated" + ], + "settings": { + "foreground": "#1B2532" + } + } + ], + "semanticTokenColors": { + "function": { + "foreground": "#FFD285" + }, + "method": { + "foreground": "#FFD285" + }, + "macro": { + "foreground": "#D4C6F7" + }, + "type": { + "foreground": "#5DA6EA" + }, + "class": { + "foreground": "#5DA6EA" + }, + "interface": { + "foreground": "#5DA6EA" + }, + "enumMember": { + "foreground": "#7BB8FF" + }, + "namespace": { + "foreground": "#5DA6EA" + }, + "builtinType": { + "foreground": "#7BB8FF" + }, + "variable": { + "foreground": "#E8F0F3" + }, + "parameter": { + "foreground": "#E8F0F3" + }, + "property": { + "foreground": "#B8E7E9" + }, + "property.readonly": { + "foreground": "#7BB8FF" + }, + "keyword": { + "foreground": "#9DD99A" + }, + "modifier": { + "foreground": "#9DD99A" + }, + "operator": { + "foreground": "#7BB8FF" + }, + "string": { + "foreground": "#9DD99A" + }, + "number": { + "foreground": "#7BB8FF" + }, + "regexp": { + "foreground": "#B8E7E9" + }, + "label": { + "foreground": "#D4C6F7" + } + } +} \ No newline at end of file