Theme palette
Adds a Theme palette row to Settings → General in the DSH Web UI. A palette recolors the interface (surfaces, borders, text, sidebar, menus, code blocks, links, and focus ring) while the shipped Appearance row keeps deciding light / dark / system.
| Palette | Character |
|---|---|
| Default | The built-in untinted look |
| Ocean | Cool blue |
| Forest | Deep green |
| Ember | Warm orange |
| Violet | Purple |
| Rose | Pink-red |
| Sand | Warm neutral |
| Obsidian | Neutral near-black with a violet accent, after the Obsidian editor theme |
| Cyberpunk | Neon HUD: translucent panels over a glowing grid backdrop, cyan/magenta accents, and a custom gradient brand mark |
Cyberpunk
The Cyberpunk palette is the complex one. Besides its token set it owns two extra pieces that appear only while it is selected:
- Backdrop — a plugin-owned stylesheet paints two pointer-transparent
pseudo-elements (
body::before/body::after): a neon horizon of cyan, violet, and magenta glows, a 44px HUD grid with scanlines, and a soft vignette mask. Its surface tokens are translucent, so panels float over it. A pale daylight variant is used while Appearance is in light mode. Removing the palette removes the stylesheet. - Brand mark — an original SVG emblem (gradient hex, diamond core, HUD ticks,
cyan glow) replaces
sidebar.brand.markand fillsconversation.hero.brand.mark. The sidebar mark is a single slot whose shipped occupant sits at priority 0, so the mark registers at priority −1 to shadow it and disposes when another palette is selected, restoring the shipped mark.
How it works
client.jsregisters onesettings.general.itemrow (order 11.5, next to Appearance and font size) with a swatch preview per palette.- Choosing a palette stacks a
ctx.theme.overrideTokens()layer of--dsw-*alias tokens over the active light/dark theme. Each palette carries the same token set for both color schemes, so Appearance keeps working. - The choice is stored in this plugin's Host config (
palette, a volatile text field), read and written withctx.configForms.get('theme-palette'). It survives restarts, and a refused write reverts the row.
Install
In the DSH Web UI, open Plugins → Add plugin, paste the absolute path to this directory, install, then switch the bundle on. The row appears in Settings → General, directly under Appearance.
From the Desktop CLI:
dsh plugin --profile desktop add /absolute/path/to/dsh-theme-palette
Because a local directory installs as a link:, edits to the client half apply
after a page reload without reinstalling.
Vendored dependencies
vendor/schemastery.mjs and vendor/cosmokit.mjs are the Harness's own
@deepseek-ai/schemastery 3.19.0 and @deepseek-ai/cosmokit 1.9.0 builds.
Both are MIT: see vendor/LICENSE-schemastery (DeepSeek) and
vendor/LICENSE-cosmokit (Shigma, 2021-present). A profile-installed bundle
cannot resolve the Harness installation's packages, so the Host half needs a
local copy to declare its Config schema. Volatile config references are
identified with Symbol.for, so these copies interoperate with the Host's
settings service.
License
MIT — see LICENSE. The vendored files keep their upstream licenses.
No comments yet. Be the first to write one.