Finishing Touches
Let’s round out the theme with status colours and the remaining UI surfaces.
Status Colours
Section titled “Status Colours”Add a status group to your variables:
vars: status: error: $$red warning: $$yellow success: $$green info: $$cyanThese are semantic aliases — if you later decide errors should be orange instead of red, you change it in one place.
More UI Properties
Section titled “More UI Properties”Add these to your theme.colors:
theme: colors: errorForeground: $(status.error) list.errorForeground: $(status.error) list.warningForeground: $(status.warning) statusBar.background: $(std.bg.accent) statusBar.foreground: $(std.fg) activityBar.background: $(std.bg) activityBar.foreground: $(accent) sideBar.background: $(std.bg.panel) sideBar.foreground: $(std.fg) input.background: $(std.bg) input.foreground: $(std.fg) input.border: $(std.outline) button.background: $(std.bg.accent) button.foreground: $(std.fg)The Complete Theme
Section titled “The Complete Theme”Here’s the full ocean.yaml at this point:
config: name: "Ocean" type: dark
palette: blue: "#2d5a87" cyan: "#4a9eff" gray: "#3c3c3c" white: "#e6e6e6" red: "#ff6b6b" green: "#51cf66" yellow: "#ffd93d"
vars: accent: $$cyan
std: fg: $$white fg.inactive: fade($(std.fg), 60) bg: "#1a1a2e" bg.panel: lighten($(std.bg), 15) bg.accent: darken($(accent), 70) outline: fade($(accent), 30) shadow: fade($(std.bg), 80)
status: error: $$red warning: $$yellow success: $$green info: $$cyan
theme: colors: editor.background: $(std.bg) editor.foreground: $(std.fg) editorGroupHeader.tabsBackground: $(std.bg.panel) tab.activeBackground: $(std.bg) tab.activeForeground: $(std.fg) tab.inactiveBackground: $(std.bg.panel) tab.inactiveForeground: $(std.fg.inactive) focusBorder: $(std.outline) panel.border: $(std.outline) editorOverviewRuler.border: $(std.outline) widget.shadow: $(std.shadow) titleBar.activeBackground: $(std.bg.accent) titleBar.activeForeground: $(std.fg) titleBar.inactiveBackground: $(std.bg.accent) titleBar.inactiveForeground: $(std.fg.inactive) errorForeground: $(status.error) list.errorForeground: $(status.error) list.warningForeground: $(status.warning) statusBar.background: $(std.bg.accent) statusBar.foreground: $(std.fg) activityBar.background: $(std.bg) activityBar.foreground: $(accent) sideBar.background: $(std.bg.panel) sideBar.foreground: $(std.fg) input.background: $(std.bg) input.foreground: $(std.fg) input.border: $(std.outline) button.background: $(std.bg.accent) button.foreground: $(std.fg)
tokenColors: - name: Comments scope: comment settings: foreground: $(std.fg.inactive) fontStyle: italic
- name: Keywords scope: keyword, storage.type settings: foreground: $(accent)
- name: Strings scope: string settings: foreground: $$green
- name: Numbers scope: constant.numeric settings: foreground: $$yellow
- name: Functions scope: entity.name.function settings: foreground: $$cyan
- name: Classes scope: entity.name.class, entity.name.type settings: foreground: $$blue fontStyle: bold
semanticTokenColors: variable.declaration: foreground: $(std.fg) fontStyle: italic function.declaration: foreground: $(accent) fontStyle: bold "string:escape": $$yellowInstalling in VS Code
Section titled “Installing in VS Code”To try your theme:
- Create a folder in your VS Code extensions directory:
- Linux/macOS:
~/.vscode/extensions/ocean-theme/ - Windows:
%USERPROFILE%\.vscode\extensions\ocean-theme\
- Linux/macOS:
- Copy
ocean.color-theme.jsoninto that folder - Create a
package.jsonalongside it:
{ "name": "ocean-theme", "displayName": "Ocean", "version": "0.0.1", "engines": { "vscode": "^1.80.0" }, "categories": ["Themes"], "contributes": { "themes": [{ "label": "Ocean", "uiTheme": "vs-dark", "path": "./ocean.color-theme.json" }] }}- Reload VS Code and select Ocean from the theme picker
Alternatively, use the Yeoman VS Code Extension Generator (yo code) to scaffold a proper extension.
Build It
Section titled “Build It”npx @gesslar/sassy build ocean.yamlYou’ve got a complete, maintainable dark theme built from a single source of truth. One last thing to learn — watch mode for live development.

