diff --git a/AGENTS.md b/AGENTS.md index b0c9461..def6d63 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -18,7 +18,7 @@ Outside the site, hexes are still duplicated by hand. When you add or change a c - `Digital Rust Syntax Highlighting Specification.md` — canonical syntax/palette spec - `Digital Rust UI Specification.md` — canonical UI spec - `DESIGN.md` — YAML front matter holds the design-token copy -- `static/ports/` — each port file hardcodes hexes in its own format +- `static/ports/` — each port file hardcodes hexes in its own format. `pnpm contrast` reads the text pairs out of every port file and measures them, so run it after touching one. Ghostty, Konsole and Ptyxis carry a Safe Mode variant; VS Code and the KDE Plasma scheme are dark-only. - `static/ports/agentskill.zip` — a binary archive, so grep cannot see the hexes inside: `assets/tokens.css`, `SKILL.md` and `references/` carry their own palette copies, and `SKILL.md` holds the licence field and the `based-on:` spec version. It mirrors the installed skill at `~/.agents/skills/digitalrust`; update that first, then rebuild the zip. - `.impeccable/design.json` — design-system metadata generated by the impeccable skill. Refresh it with the skill; do not hand-edit it. @@ -52,7 +52,9 @@ Repo-authored work is dual-licensed (CC-BY-4.0+ OR Apache-2.0+). Keep the root ` ## Gotchas -- Safe Mode is implemented on the site, and the dark theme meets the same floors: `pnpm contrast` reports no deviation on any control, state, focus ring, scrollbar thumb, text role, syntax role or terminal slot in either mode. The recorded deviations are container walls and the optional rainbow-bracket magenta. The ports and the agent skill still carry dark-only values and need their own pass. `palette.ts` holds one role table with a dark and a safe column, and `toTokensCss()` emits the dark block, the `[data-scheme='safe-mode']` block, and the `prefers-color-scheme: light` block from it. Add a role by adding a row, never by writing a second block by hand. +- Safe Mode is implemented on the site, and the dark theme meets the same floors: `pnpm contrast` reports no deviation on any control, state, focus ring, scrollbar thumb, text role, syntax role, terminal slot or port pair in either mode. The recorded deviations are container walls and the optional rainbow-bracket magenta. `palette.ts` holds one role table with a dark and a safe column, and `toTokensCss()` emits the dark block, the `[data-scheme='safe-mode']` block, and the `prefers-color-scheme: light` block from it. Add a role by adding a row, never by writing a second block by hand. +- The ANSI map is a role table too: `ansiSlots` maps each of the 16 slots to a palette name for display, and the `dr-term-*` rows give the slots their values. Both must agree with the spec's ANSI tables. A slot that carries the paper colour of its mode (slot 0 on dark, 7 and 15 in Safe Mode) is a fill and is excluded from the text floor by the check. Slot 8 is the dim ink, which is a desaturated tone rather than a darker one, because a dimmer colour cannot clear 4.5:1 in either mode. +- The agent skill at `~/.agents/skills/digitalrust` carries its own copy of the palette in `assets/tokens.css`; it is a copy of `src/lib/generated/tokens.css`. Its prose still describes a single wall, so treat it as stale where it does. - Components read role tokens, never raw palette names. A raw `var(--ghost-pixel)` in a component is a bug, because the named colours do not change between modes. `src/lib/theme/digital-rust-theme.ts` builds both Shiki themes from the same role table, so the two modes cannot drift. - Mode selection: `src/app.html` applies a saved mode before the first paint. The same two literals live in `src/lib/scheme.ts`. Change both together. - Kit 3 uses `#lib/*` (package.json imports), not `$lib`. Import TS modules with a `.js` suffix: `import { color } from '#lib/palette.js'`. diff --git a/Digital Rust Syntax Highlighting Specification.md b/Digital Rust Syntax Highlighting Specification.md index baac8ab..04e479a 100644 --- a/Digital Rust Syntax Highlighting Specification.md +++ b/Digital Rust Syntax Highlighting Specification.md @@ -709,7 +709,7 @@ Configuration files use a distinct key/value visual hierarchy: | Magenta | Fractured Shell | `#BA5A7D` | | Cyan | Dead Thread | `#6FA5A0` | | White | Phosphor Smoke | `#EFD5D1` | -| Bright Black | Bad Sector | `#46120A` | +| Bright Black | Thermal Throttle | `#AC6D4A` | | Bright Red | Fatal Error | `#CF8175` | | Bright Green | Bright Memory Leek | `#94A577` | | Bright Yellow | Bright Stack Overglow | `#D3AE6E` | @@ -747,6 +747,25 @@ fills a role changes. Safe Mode exists for accessibility. A reader who cannot use a dark interface can use Safe Mode and still read the system as Digital Rust. +### Safe Mode In The Ports + +Terminal ports carry both modes, because a terminal follows the system theme: + +| Port | Dark | Safe Mode | +| --- | --- | --- | +| Ghostty | `digital-rust-ghostty` | `digital-rust-ghostty-safe-mode` | +| Konsole | `DigitalRustKonsole.colorscheme` | `DigitalRustKonsole-SafeMode.colorscheme` | +| Ptyxis | the `[Dark]` section | the `[Light]` section | + +Konsole carries slots 0 to 7 with a Faint and an Intense variant, so the Intense +variant is the bright half and Faint is the dim ink, which is the muted grey in +both modes. Konsole's scheme format has no selection colour, so neither file +declares one. + +The editor ports and the KDE Plasma colour scheme are dark-only: a VS Code light +theme is a second extension, and KDE's groups each choose an ink for their own +fill, which the dark scheme sets now and the light one still needs. + ### What Changes and What Does Not Change | Item | Dark theme | Safe Mode | @@ -896,7 +915,7 @@ bevel stay. | Magenta | Safe 〃 | `#A84A6D` | | Cyan | Safe 〃 | `#1E5451` | | White | Phosphor Smoke | `#EFD5D1` | -| Bright Black | Phantom Current | `#E7C0BA` | +| Bright Black | Safe 〃 (the dim ink) | `#6D605E` | | Bright Red | Safe 〃 | `#63231D` | | Bright Green | Safe 〃 | `#3F4F27` | | Bright Yellow | Safe 〃 | `#4C3600` | @@ -905,6 +924,16 @@ bevel stay. | Bright Cyan | Safe 〃 | `#2C504D` | | Bright White | Ghost Pixel | `#F7EAE8` | +A slot that carries the paper colour of its mode is a fill rather than ink: slot 0 +is the page in the dark theme, and slots 7 and 15 are the page in Safe Mode. Those +slots are excluded from the text floor, in both the specification and the check. +Every other slot is text and clears 4.5:1 in both modes. + +Slot 8 is the dim ink in every terminal. A dimmer version of a colour cannot clear +4.5:1 against the surface it sits on, in either mode, so dim is carried by a +desaturated tone instead: Thermal Throttle `#AC6D4A` on dark, and the muted ink +`#6D605E` in Safe Mode. + The red slot clears the text floor in both modes: 4.60:1 in Safe Mode and 5.50:1 on the dark page. Digital Rust measures 3.10:1 on the dark page, and 3.32:1 is its ceiling against any colour, so the namesake colour can never carry terminal text on diff --git a/scripts/contrast-check.ts b/scripts/contrast-check.ts index 765c4c7..a26d478 100644 --- a/scripts/contrast-check.ts +++ b/scripts/contrast-check.ts @@ -116,7 +116,14 @@ const termRoles = [ 'dr-term-yellow', 'dr-term-blue', 'dr-term-magenta', - 'dr-term-cyan' + 'dr-term-cyan', + 'dr-term-bright-red', + 'dr-term-bright-green', + 'dr-term-bright-yellow', + 'dr-term-bright-blue', + 'dr-term-bright-magenta', + 'dr-term-bright-cyan', + 'dr-term-bright-black' ]; const onHotRoles = [ 'dr-on-hot-success', @@ -140,6 +147,9 @@ const pairs: Pair[] = [ { fg, bg: 'dr-surface-secondary', need: 4.5, note: 'and on a secondary panel' } ]), ...termRoles.map((fg) => ({ fg, bg: 'dr-term-bg', need: 4.5 })), + // The paper slot is the page colour itself, so it is measured like the + // background it sits on rather than as ink. + { fg: 'dr-term-bright-white', bg: 'dr-term-bg', need: 1, note: 'the paper slot' }, ...onHotRoles.map((fg) => ({ fg, bg: 'dr-surface-hot', need: 4.5 })), ...tints.map(([fg, bg]) => ({ fg, bg, need: 4.5, note: 'badge wash' })), { fg: 'dr-text-on-accent', bg: 'dr-accent', need: 4.5 }, @@ -278,7 +288,12 @@ function iniSections(text: string): Map> { return sections; } -/** Reads `ColorN` keys out of one section. Slot 0 is the background itself. */ +/** + * Reads `ColorN` keys out of one section. A slot that carries the paper colour + * of its mode — slot 0 on a dark page, slots 7 and 15 on a light one — is the + * background rather than ink, so it is skipped. Every other mode finds that slot + * readable, which is the point of the pairing. + */ function slotsFrom(section: Map | undefined, prefix = 'Color'): Slots { const slots: Slots = new Map(); for (const [key, value] of section ?? []) { @@ -288,11 +303,11 @@ function slotsFrom(section: Map | undefined, prefix = 'Color'): return slots; } -function againstSlots(where: string, slots: Slots, bg: string, skip = [0]): PortPair[] { +function againstSlots(where: string, slots: Slots, bg: string): PortPair[] { const pairs: PortPair[] = []; - const entries = [...slots.entries()].sort((a, b) => a[0] - b[0]); - for (const [slot, hex] of entries) { - if (skip.includes(slot)) continue; + const paper = hexToRgb(bg).reduce((sum, channel) => sum + channel, 0) / 3 > 127 ? [7, 15] : [0]; + for (const [slot, hex] of [...slots.entries()].sort((a, b) => a[0] - b[0])) { + if (paper.includes(slot)) continue; pairs.push({ where, label: `slot ${slot}`, fg: hex, bg, need: 4.5 }); } return pairs; @@ -303,39 +318,29 @@ function terminalPorts(): PortPair[] { // Konsole and Ptyxis share the INI shape. Konsole names the variants Faint // and Intense; both are text and both are measured. - const konsole = iniSections(readPort('DigitalRustKonsole.colorscheme')); - const konsoleBg = portColor(konsole.get('Background')?.get('Color') ?? ''); - if (konsoleBg) { + for (const [file, where] of [ + ['DigitalRustKonsole.colorscheme', 'konsole'], + ['DigitalRustKonsole-SafeMode.colorscheme', 'konsole safe mode'] + ]) { + const konsole = iniSections(readPort(file)); + const konsoleBg = portColor(konsole.get('Background')?.get('Color') ?? ''); + if (!konsoleBg) continue; const foreground = portColor(konsole.get('Foreground')?.get('Color') ?? ''); if (foreground) { - pairs.push({ - where: 'konsole', - label: 'foreground', - fg: foreground, - bg: konsoleBg, - need: 4.5 - }); + pairs.push({ where, label: 'foreground', fg: foreground, bg: konsoleBg, need: 4.5 }); } - // Every variant is text, so every variant is measured: the plain slot, - // then Faint and Intense. + // Konsole carries slots 0 to 7 plus Faint and Intense variants, so the + // Intense variant is the bright half. Every variant is text. for (const variant of ['', 'Faint', 'Intense']) { const merged: Slots = new Map(); for (const [name, section] of konsole) { const match = new RegExp(`^Color(\\d+)${variant}$`).exec(name); - if (!match || Number(match[1]) === 0) continue; + if (!match) continue; const hex = portColor(section.get('Color') ?? ''); if (hex) merged.set(Number(match[1]), hex); } const label = variant === '' ? 'slot' : `slot, ${variant.toLowerCase()}`; - for (const [slot, hex] of [...merged.entries()].sort((a, b) => a[0] - b[0])) { - pairs.push({ - where: 'konsole', - label: `${label} ${slot}`, - fg: hex, - bg: konsoleBg, - need: 4.5 - }); - } + pairs.push(...againstSlots(`${where} ${label}`, merged, konsoleBg)); } } @@ -349,33 +354,38 @@ function terminalPorts(): PortPair[] { pairs.push(...againstSlots(where, slotsFrom(values), bg)); } - const ghostty = new Map(); - const ghosttySlots: Slots = new Map(); - for (const line of readPort('digital-rust-ghostty').split('\n')) { - const slot = /^\s*palette\s*=\s*(\d+)\s*=\s*(#?[0-9a-f]{6})/i.exec(line); - if (slot) { - const hex = portColor(slot[2]); - if (hex && Number(slot[1]) !== 0) ghosttySlots.set(Number(slot[1]), hex); - continue; - } - const entry = /^\s*([a-z-]+)\s*=\s*(#?[0-9a-f]{6})/i.exec(line); - if (entry) { - const hex = portColor(entry[2]); - if (hex) ghostty.set(entry[1], hex); + for (const [file, where] of [ + ['digital-rust-ghostty', 'ghostty'], + ['digital-rust-ghostty-safe-mode', 'ghostty safe mode'] + ]) { + const ghostty = new Map(); + const ghosttySlots: Slots = new Map(); + for (const line of readPort(file).split('\n')) { + const slot = /^\s*palette\s*=\s*(\d+)\s*=\s*(#?[0-9a-f]{6})/i.exec(line); + if (slot) { + const hex = portColor(slot[2]); + if (hex && Number(slot[1]) !== 0) ghosttySlots.set(Number(slot[1]), hex); + continue; + } + const entry = /^\s*([a-z-]+)\s*=\s*(#?[0-9a-f]{6})/i.exec(line); + if (entry) { + const hex = portColor(entry[2]); + if (hex) ghostty.set(entry[1], hex); + } } - } - if (ghostty.has('background')) { - const bg = ghostty.get('background') as string; - if (ghostty.has('foreground')) { - pairs.push({ - where: 'ghostty', - label: 'foreground', - fg: ghostty.get('foreground') as string, - bg, - need: 4.5 - }); + if (ghostty.has('background')) { + const bg = ghostty.get('background') as string; + if (ghostty.has('foreground')) { + pairs.push({ + where, + label: 'foreground', + fg: ghostty.get('foreground') as string, + bg, + need: 4.5 + }); + } + pairs.push(...againstSlots(where, ghosttySlots, bg)); } - pairs.push(...againstSlots('ghostty', ghosttySlots, bg)); } // fish names its colours instead of numbering them. Every one of them is @@ -489,17 +499,34 @@ function vscodePort(): PortPair[] { }); } for (const entry of theme.tokenColors) { + const name = entry.name ?? 'token'; + // A rule, a guide or a whitespace marker is decoration, not text, so it is + // out of scope for the text floor. + if (/rule|whitespace|guide|bracket|separator|indent/i.test(name)) continue; const hex = portColor(entry.settings?.foreground ?? ''); if (!hex || seen.has(hex)) continue; seen.add(hex); pairs.push({ where: 'vscode', - label: entry.name ?? 'token', + label: name, fg: hex, bg: editorBg, need: 4.5 }); } + + // Status bar items paint ink on their own fill, so the fill is the background + // for the pair rather than the editor. + for (const [inkKey, fillKey] of [ + ['statusBarItem.errorForeground', 'statusBarItem.errorBackground'], + ['statusBarItem.warningForeground', 'statusBarItem.warningBackground'], + ['statusBarItem.prominentForeground', 'statusBarItem.prominentBackground'] + ]) { + const ink = portColor(theme.colors[inkKey] ?? ''); + const fill = portColor(theme.colors[fillKey] ?? ''); + if (ink && fill) + pairs.push({ where: 'vscode', label: inkKey, fg: ink, bg: fill, need: 4.5 }); + } return pairs; } @@ -539,14 +566,17 @@ const portPairs: PortPair[] = [ ]; console.log('\nports'); +const seenPorts = new Set(); const portFailures = portPairs.filter((pair) => contrast(pair.fg, pair.bg) < pair.need); -const byPort = new Map(); +let portFiles = 0; for (const pair of portPairs) { - const key = pair.where.split(' ')[0]; - byPort.set(key, (byPort.get(key) ?? 0) + 1); + if (!seenPorts.has(pair.where)) { + seenPorts.add(pair.where); + portFiles += 1; + } } console.log( - ` ${portPairs.length} pairs read from ${byPort.size} port files, ${portFailures.length} below the floor` + ` ${portPairs.length} pairs read from ${portFiles} port files and sections, ${portFailures.length} below the floor` ); for (const pair of portFailures) { const ratio = contrast(pair.fg, pair.bg); diff --git a/src/lib/palette.ts b/src/lib/palette.ts index 83366b7..a0b9bb3 100644 --- a/src/lib/palette.ts +++ b/src/lib/palette.ts @@ -108,6 +108,12 @@ export const internalHex = { termBlue: '#495370', termMagenta: '#A84A6D', termCyan: '#1E5451', + termBrightRed: '#63231D', + termBrightGreen: '#3F4F27', + termBrightYellow: '#4C3600', + termBrightBlue: '#434857', + termBrightMagenta: '#934865', + termBrightCyan: '#2C504D', /* The light Stack Overglow stop: 9.16:1 on the page, and Ghost Pixel on it passes AA. */ overglowLight: '#533900', /* The rim scorch that replaces the scanline band on a light page. */ @@ -185,14 +191,14 @@ export interface AnsiSlot { // Canonical 16-colour terminal mapping from the spec's ANSI Color Mapping table. export const ansiSlots: AnsiSlot[] = [ { slot: 'Black', colorId: 'event-horizon' }, - { slot: 'Red', colorId: 'digital-rust' }, + { slot: 'Red', colorId: 'rouge-signal' }, { slot: 'Green', colorId: 'memory-leek' }, { slot: 'Yellow', colorId: 'stack-overglow' }, { slot: 'Blue', colorId: 'blue-screen' }, { slot: 'Magenta', colorId: 'fractured-shell' }, { slot: 'Cyan', colorId: 'dead-thread' }, { slot: 'White', colorId: 'phosphor-smoke' }, - { slot: 'Bright Black', colorId: 'bad-sector' }, + { slot: 'Bright Black', colorId: 'thermal-throttle' }, { slot: 'Bright Red', colorId: 'fatal-error' }, { slot: 'Bright Green', colorId: 'bright-memory-leek' }, { slot: 'Bright Yellow', colorId: 'bright-stack-overglow' }, @@ -770,7 +776,49 @@ const roleGroups: RoleGroup[] = [ dark: 'var(--fractured-shell)', safe: internalHex.termMagenta }, - { token: 'dr-term-cyan', dark: 'var(--dead-thread)', safe: internalHex.termCyan } + { token: 'dr-term-cyan', dark: 'var(--dead-thread)', safe: internalHex.termCyan }, + { + token: 'dr-term-bright-black', + dark: 'var(--thermal-throttle)', + safe: tint('event-horizon', 0.6), + comment: + 'the dim ink. Bad Sector measures 1.30:1 on the dark page, and a dim variant cannot clear 4.5:1 there, so dim reads as desaturated instead' + }, + { + token: 'dr-term-bright-red', + dark: 'var(--fatal-error)', + safe: internalHex.termBrightRed + }, + { + token: 'dr-term-bright-green', + dark: 'var(--bright-memory-leek)', + safe: internalHex.termBrightGreen + }, + { + token: 'dr-term-bright-yellow', + dark: 'var(--bright-stack-overglow)', + safe: internalHex.termBrightYellow + }, + { + token: 'dr-term-bright-blue', + dark: 'var(--bright-blue-screen)', + safe: internalHex.termBrightBlue + }, + { + token: 'dr-term-bright-magenta', + dark: 'var(--bright-fractured-shell)', + safe: internalHex.termBrightMagenta + }, + { + token: 'dr-term-bright-cyan', + dark: 'var(--bright-dead-thread)', + safe: internalHex.termBrightCyan + }, + invariant( + 'dr-term-bright-white', + 'var(--ghost-pixel)', + 'the paper slot: the page colour in both modes' + ) ] }, { diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index c298939..a5ddfa3 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -58,7 +58,15 @@ }, { href: '/ports/DigitalRustfish.theme', label: 'fish' }, { href: '/ports/digital-rust-ghostty', label: 'Ghostty' }, + { + href: '/ports/digital-rust-ghostty-safe-mode', + label: 'Ghostty Safe Mode' + }, { href: '/ports/DigitalRustKonsole.colorscheme', label: 'Konsole' }, + { + href: '/ports/DigitalRustKonsole-SafeMode.colorscheme', + label: 'Konsole Safe Mode' + }, { href: '/ports/DigitalRustPtyxis.palette', label: 'Ptyxis' }, { href: '/ports/agentskill.zip', label: 'Agent Skill' }, { diff --git a/static/ports/DigitalRustKDE.colors b/static/ports/DigitalRustKDE.colors index 5f16ddc..89a7418 100644 --- a/static/ports/DigitalRustKDE.colors +++ b/static/ports/DigitalRustKDE.colors @@ -19,32 +19,32 @@ IntensityAmount=0 IntensityEffect=0 [Colors:Button] -BackgroundAlternate=52,13,7 -BackgroundNormal=122,32,18 -DecorationFocus=175,46,26 +BackgroundAlternate=122,32,18 +BackgroundNormal=52,13,7 +DecorationFocus=199,108,94 DecorationHover=212,167,89 ForegroundActive=212,167,89 ForegroundInactive=239,213,209 ForegroundLink=231,192,186 -ForegroundNegative=191,87,71 +ForegroundNegative=203,99,83 ForegroundNeutral=212,167,89 ForegroundNormal=247,234,232 -ForegroundPositive=143,166,103 -ForegroundVisited=111,165,160 +ForegroundPositive=148,165,119 +ForegroundVisited=127,165,161 [Colors:Complementary] BackgroundAlternate=105,27,15 BackgroundNormal=215,150,140 DecorationFocus=175,46,26 DecorationHover=212,167,89 -ForegroundActive=212,167,89 +ForegroundActive=105,27,15 ForegroundInactive=239,213,209 -ForegroundLink=231,192,186 -ForegroundNegative=191,87,71 -ForegroundNeutral=212,167,89 -ForegroundNormal=247,234,232 -ForegroundPositive=143,166,103 -ForegroundVisited=111,165,160 +ForegroundLink=105,27,15 +ForegroundNegative=105,27,15 +ForegroundNeutral=105,27,15 +ForegroundNormal=17,4,2 +ForegroundPositive=105,27,15 +ForegroundVisited=105,27,15 [Colors:Selection] BackgroundAlternate=70,18,10 @@ -54,11 +54,11 @@ DecorationHover=212,167,89 ForegroundActive=212,167,89 ForegroundInactive=239,213,209 ForegroundLink=231,192,186 -ForegroundNegative=191,87,71 +ForegroundNegative=215,150,140 ForegroundNeutral=212,167,89 ForegroundNormal=247,234,232 -ForegroundPositive=143,166,103 -ForegroundVisited=111,165,160 +ForegroundPositive=215,150,140 +ForegroundVisited=215,150,140 [Colors:Tooltip] BackgroundAlternate=70,18,10 @@ -68,11 +68,11 @@ DecorationHover=212,167,89 ForegroundActive=212,167,89 ForegroundInactive=239,213,209 ForegroundLink=231,192,186 -ForegroundNegative=191,87,71 +ForegroundNegative=203,99,83 ForegroundNeutral=212,167,89 ForegroundNormal=247,234,232 -ForegroundPositive=143,166,103 -ForegroundVisited=111,165,160 +ForegroundPositive=148,165,119 +ForegroundVisited=127,165,161 [Colors:View] BackgroundAlternate=52,13,7 @@ -82,11 +82,11 @@ DecorationHover=212,167,89 ForegroundActive=212,167,89 ForegroundInactive=239,213,209 ForegroundLink=231,192,186 -ForegroundNegative=191,87,71 +ForegroundNegative=203,99,83 ForegroundNeutral=212,167,89 ForegroundNormal=247,234,232 -ForegroundPositive=143,166,103 -ForegroundVisited=111,165,160 +ForegroundPositive=148,165,119 +ForegroundVisited=127,165,161 [Colors:Window] BackgroundAlternate=52,13,7 @@ -96,11 +96,11 @@ DecorationHover=212,167,89 ForegroundActive=212,167,89 ForegroundInactive=239,213,209 ForegroundLink=231,192,186 -ForegroundNegative=191,87,71 +ForegroundNegative=203,99,83 ForegroundNeutral=212,167,89 ForegroundNormal=247,234,232 -ForegroundPositive=143,166,103 -ForegroundVisited=111,165,160 +ForegroundPositive=148,165,119 +ForegroundVisited=127,165,161 [General] ColorScheme=DigitalRust diff --git a/static/ports/DigitalRustKate.theme b/static/ports/DigitalRustKate.theme index f5de7f2..581f556 100644 --- a/static/ports/DigitalRustKate.theme +++ b/static/ports/DigitalRustKate.theme @@ -2,7 +2,7 @@ "custom-styles": { "Alerts": { "Alert Level 1": { - "background-color": "#BF5747", + "background-color": "#CB6353", "selected-text-color": "#110402", "text-color": "#110402" }, @@ -633,7 +633,7 @@ }, "YAML": { "Alert": { - "background-color": "#BF5747", + "background-color": "#CB6353", "selected-text-color": "#110402", "text-color": "#110402" }, diff --git a/static/ports/DigitalRustKonsole-SafeMode.colorscheme b/static/ports/DigitalRustKonsole-SafeMode.colorscheme new file mode 100644 index 0000000..4814050 --- /dev/null +++ b/static/ports/DigitalRustKonsole-SafeMode.colorscheme @@ -0,0 +1,100 @@ +[Background] +Color=247,234,232 + +[BackgroundFaint] +Color=239,213,209 + +[BackgroundIntense] +Color=247,234,232 + +[Color0] +Color=17,4,2 + +[Color0Faint] +Color=109,96,94 + +[Color0Intense] +Color=109,96,94 + +[Color1] +Color=191,60,38 + +[Color1Faint] +Color=109,96,94 + +[Color1Intense] +Color=99,35,29 + +[Color2] +Color=59,82,24 + +[Color2Faint] +Color=109,96,94 + +[Color2Intense] +Color=63,79,39 + +[Color3] +Color=83,57,0 + +[Color3Faint] +Color=109,96,94 + +[Color3Intense] +Color=76,54,0 + +[Color4] +Color=73,83,112 + +[Color4Faint] +Color=109,96,94 + +[Color4Intense] +Color=67,72,87 + +[Color5] +Color=168,74,109 + +[Color5Faint] +Color=109,96,94 + +[Color5Intense] +Color=147,72,101 + +[Color6] +Color=30,84,81 + +[Color6Faint] +Color=109,96,94 + +[Color6Intense] +Color=44,80,77 + +[Color7] +Color=239,213,209 + +[Color7Faint] +Color=109,96,94 + +[Color7Intense] +Color=247,234,232 + +[Foreground] +Color=17,4,2 + +[ForegroundFaint] +Color=109,96,94 + +[ForegroundIntense] +Color=17,4,2 + +[General] +Anchor=0.5,0.5 +Blur=false +ColorRandomization=false +Description=Digital Rust Safe Mode +FillStyle=Tile +Opacity=1 +Wallpaper= +WallpaperFlipType=NoFlip +WallpaperOpacity=1 diff --git a/static/ports/DigitalRustKonsole.colorscheme b/static/ports/DigitalRustKonsole.colorscheme index 187d39b..8fdd68a 100644 --- a/static/ports/DigitalRustKonsole.colorscheme +++ b/static/ports/DigitalRustKonsole.colorscheme @@ -11,16 +11,16 @@ Color=35,9,5 Color=17,4,2 [Color0Faint] -Color=52,13,7 +Color=139,119,116 [Color0Intense] -Color=70,18,10 +Color=172,109,74 [Color1] Color=199,108,94 [Color1Faint] -Color=183,66,48 +Color=139,119,116 [Color1Intense] Color=207,129,117 @@ -29,7 +29,7 @@ Color=207,129,117 Color=143,166,103 [Color2Faint] -Color=98,114,71 +Color=139,119,116 [Color2Intense] Color=148,165,119 @@ -38,7 +38,7 @@ Color=148,165,119 Color=212,167,89 [Color3Faint] -Color=160,126,67 +Color=139,119,116 [Color3Intense] Color=211,174,110 @@ -47,7 +47,7 @@ Color=211,174,110 Color=135,145,176 [Color4Faint] -Color=96,103,124 +Color=139,119,116 [Color4Intense] Color=153,158,175 @@ -56,7 +56,7 @@ Color=153,158,175 Color=186,90,125 [Color5Faint] -Color=135,64,90 +Color=139,119,116 [Color5Intense] Color=186,107,136 @@ -65,7 +65,7 @@ Color=186,107,136 Color=111,165,160 [Color6Faint] -Color=76,114,110 +Color=139,119,116 [Color6Intense] Color=127,165,161 @@ -74,7 +74,7 @@ Color=127,165,161 Color=239,213,209 [Color7Faint] -Color=231,192,186 +Color=139,119,116 [Color7Intense] Color=247,234,232 diff --git a/static/ports/DigitalRustPtyxis.palette b/static/ports/DigitalRustPtyxis.palette index 5465dd8..2386403 100644 --- a/static/ports/DigitalRustPtyxis.palette +++ b/static/ports/DigitalRustPtyxis.palette @@ -3,23 +3,23 @@ Name=Digital Rust Primary=true [Light] -Background=#110402 -Foreground=#F7EAE8 +Background=#F7EAE8 +Foreground=#110402 Color0=#110402 -Color1=#C76C5E -Color2=#8FA667 -Color3=#D4A759 -Color4=#8791B0 -Color5=#BA5A7D -Color6=#6FA5A0 +Color1=#BF3C26 +Color2=#3B5218 +Color3=#533900 +Color4=#495370 +Color5=#A84A6D +Color6=#1E5451 Color7=#EFD5D1 -Color8=#46120A -Color9=#CF8175 -Color10=#94A577 -Color11=#D3AE6E -Color12=#999EAF -Color13=#BA6B88 -Color14=#7FA5A1 +Color8=#6D605E +Color9=#63231D +Color10=#3F4F27 +Color11=#4C3600 +Color12=#434857 +Color13=#934865 +Color14=#2C504D Color15=#F7EAE8 [Dark] @@ -33,7 +33,7 @@ Color4=#8791B0 Color5=#BA5A7D Color6=#6FA5A0 Color7=#EFD5D1 -Color8=#46120A +Color8=#AC6D4A Color9=#CF8175 Color10=#94A577 Color11=#D3AE6E diff --git a/static/ports/DigitalRustfish.theme b/static/ports/DigitalRustfish.theme index 4112f78..ca269bd 100644 --- a/static/ports/DigitalRustfish.theme +++ b/static/ports/DigitalRustfish.theme @@ -26,7 +26,7 @@ fish_color_cancel CB6353 # Amber Alert text variant (cancel / Ctrl-C) fish_color_status CB6353 # Amber Alert text variant (non-zero status) # Subtle / dim elements -fish_color_gray 46120A # Bad Sector (dim / gray) +fish_color_gray 8B7774 # Bad Sector (dim / gray) fish_color_autosuggestion EFD5D1 # Phosphor Smoke (placeholder text) fish_color_history_current D3AE6E # Bright Stack Overglow (current history entry) @@ -35,7 +35,7 @@ fish_color_cwd 6FA5A0 # Dead Thread (cwd) fish_color_cwd_root CB6353 # Amber Alert text variant (cwd as root, a warning cue) fish_color_user F7EAE8 # Ghost Pixel (user) fish_color_host E7C0BA # Phantom Current (local host) -fish_color_host_remote AF2E1A # Digital Rust (remote host, to make it obvious) +fish_color_host_remote C76C5E # Digital Rust (remote host, to make it obvious) # Selection & search fish_color_selection F7EAE8 --background=691B0F # Ghost Pixel on Dark Packet (active selection) diff --git a/static/ports/digital-rust-ghostty b/static/ports/digital-rust-ghostty index 2772f36..2ac333a 100644 --- a/static/ports/digital-rust-ghostty +++ b/static/ports/digital-rust-ghostty @@ -12,7 +12,7 @@ palette = 4=#8791B0 palette = 5=#BA5A7D palette = 6=#6FA5A0 palette = 7=#EFD5D1 -palette = 8=#46120A +palette = 8=#AC6D4A palette = 9=#CF8175 palette = 10=#94A577 palette = 11=#D3AE6E diff --git a/static/ports/digital-rust-ghostty-safe-mode b/static/ports/digital-rust-ghostty-safe-mode new file mode 100644 index 0000000..14287a8 --- /dev/null +++ b/static/ports/digital-rust-ghostty-safe-mode @@ -0,0 +1,22 @@ +background = #F7EAE8 +foreground = #110402 +selection-background = #DFABA3 +selection-foreground = #110402 +cursor-color = #533900 +cursor-text = #F7EAE8 +palette = 0=#110402 +palette = 1=#BF3C26 +palette = 2=#3B5218 +palette = 3=#533900 +palette = 4=#495370 +palette = 5=#A84A6D +palette = 6=#1E5451 +palette = 7=#EFD5D1 +palette = 8=#6D605E +palette = 9=#63231D +palette = 10=#3F4F27 +palette = 11=#4C3600 +palette = 12=#434857 +palette = 13=#934865 +palette = 14=#2C504D +palette = 15=#F7EAE8 diff --git a/static/ports/digitalrustpi/digital-rust.json b/static/ports/digitalrustpi/digital-rust.json index b8cb345..4ac6eba 100644 --- a/static/ports/digitalrustpi/digital-rust.json +++ b/static/ports/digitalrustpi/digital-rust.json @@ -29,7 +29,8 @@ "fracturedShell": "#BA5A7D", "deadThread": "#6FA5A0", "thermalThrottle": "#D78556", - "dimThermalThrottle": "#AC6D4A" + "dimThermalThrottle": "#AC6D4A", + "amberAlertText": "#CB6353" }, "colors": { "accent": "corruptedCache", @@ -37,7 +38,7 @@ "borderAccent": "digitalRust", "borderMuted": "badSector", "success": "memoryLeek", - "error": "amberAlert", + "error": "amberAlertText", "warning": "stackOverglow", "muted": "phosphorSmoke", "dim": "fatalError", diff --git a/static/ports/vscode/themes/Digital Rust-color-theme.json b/static/ports/vscode/themes/Digital Rust-color-theme.json index 2ada469..c1770d4 100644 --- a/static/ports/vscode/themes/Digital Rust-color-theme.json +++ b/static/ports/vscode/themes/Digital Rust-color-theme.json @@ -853,7 +853,7 @@ "name": "Inline Diff Removed Words", "scope": "markup.deleted.diff punctuation.definition.deleted", "settings": { - "foreground": "#BF5747" + "foreground": "#CB6353" } }, { @@ -1030,7 +1030,7 @@ "inputOption.hoverBackground": "#46120A", "inputValidation.errorBackground": "#340D07", "inputValidation.errorForeground": "#CB6353", - "inputValidation.errorBorder": "#BF5747", + "inputValidation.errorBorder": "#CB6353", "inputValidation.warningBackground": "#340D07", "inputValidation.warningForeground": "#D4A759", "inputValidation.warningBorder": "#D4A759", @@ -1092,7 +1092,7 @@ "tab.modifiedForeground": "#D4A759", "editor.background": "#110402", "editor.foreground": "#F7EAE8", - "editorLineNumber.foreground": "#46120A", + "editorLineNumber.foreground": "#8B7774", "editorLineNumber.activeForeground": "#E7C0BA", "editorCursor.foreground": "#D4A759", "editorCursor.background": "#110402", @@ -1117,7 +1117,7 @@ "editorGutter.background": "#230905", "editorGutter.addedBackground": "#8FA667", "editorGutter.modifiedBackground": "#6FA5A0", - "editorGutter.deletedBackground": "#BF5747", + "editorGutter.deletedBackground": "#CB6353", "diffEditor.insertedLineBackground": "#8FA66726", "diffEditor.insertedTextBackground": "#8FA66740", "diffEditor.removedLineBackground": "#BF574726", @@ -1132,7 +1132,7 @@ "editorBracketHighlight.foreground4": "#8791B0", "editorBracketHighlight.foreground5": "#D78556", "editorBracketHighlight.foreground6": "#8FA667", - "editorBracketHighlight.unexpectedBracket.foreground": "#BF5747", + "editorBracketHighlight.unexpectedBracket.foreground": "#CB6353", "editorBracketPairGuide.activeBackground1": "#6FA5A0", "editorBracketPairGuide.activeBackground2": "#D4A759", "editorBracketPairGuide.activeBackground3": "#BA5A7D", @@ -1158,11 +1158,11 @@ "editorInlayHint.parameterBackground": "#46120A40", "editorLightBulb.foreground": "#D4A759", "editorLightBulbAutoFix.foreground": "#6FA5A0", - "editorError.foreground": "#BF5747", + "editorError.foreground": "#CB6353", "editorWarning.foreground": "#D4A759", "editorInfo.foreground": "#6FA5A0", "editorHint.foreground": "#EFD5D180", - "editorError.border": "#BF5747", + "editorError.border": "#CB6353", "editorWarning.border": "#D4A759", "editorInfo.border": "#6FA5A0", "editorOverviewRuler.border": "#340D07", @@ -1204,8 +1204,8 @@ "statusBarItem.prominentBackground": "#B74230", "statusBarItem.prominentForeground": "#F7EAE8", "statusBarItem.prominentHoverBackground": "#AF2E1A", - "statusBarItem.warningBackground": "#BF5747", - "statusBarItem.warningForeground": "#F7EAE8", + "statusBarItem.warningBackground": "#CB6353", + "statusBarItem.warningForeground": "#110402", "statusBarItem.errorBackground": "#AF2E1A", "statusBarItem.errorForeground": "#F7EAE8", "statusBarItem.remoteBackground": "#AF2E1A", @@ -1229,12 +1229,12 @@ "notifications.foreground": "#F7EAE8", "notifications.border": "#691B0F", "notificationLink.foreground": "#E7C0BA", - "notificationsErrorIcon.foreground": "#BF5747", + "notificationsErrorIcon.foreground": "#CB6353", "notificationsWarningIcon.foreground": "#D4A759", "notificationsInfoIcon.foreground": "#6FA5A0", "gitDecoration.addedResourceForeground": "#8FA667", "gitDecoration.modifiedResourceForeground": "#6FA5A0", - "gitDecoration.deletedResourceForeground": "#BF5747", + "gitDecoration.deletedResourceForeground": "#CB6353", "gitDecoration.ignoredResourceForeground": "#46120ACC", "gitDecoration.conflictingResourceForeground": "#BA5A7D", "gitDecoration.untrackedResourceForeground": "#8FA667", @@ -1242,13 +1242,13 @@ "gitDecoration.stageDeletedResourceForeground": "#BF574799", "gitDecoration.stageModifiedResourceForeground": "#6FA5A099", "gitDecoration.submoduleResourceForeground": "#D4A759", - "problemsErrorIcon.foreground": "#BF5747", + "problemsErrorIcon.foreground": "#CB6353", "problemsWarningIcon.foreground": "#D4A759", "problemsInfoIcon.foreground": "#6FA5A0", "debugToolBar.background": "#340D07", "debugExceptionWidget.background": "#110402", - "debugExceptionWidget.border": "#BF5747", - "debugIcon.breakpointForeground": "#BF5747", + "debugExceptionWidget.border": "#CB6353", + "debugIcon.breakpointForeground": "#CB6353", "debugIcon.breakpointDisabledForeground": "#BF574766", "debugIcon.breakpointCurrentStackframeForeground": "#D4A759", "terminal.background": "#110402", @@ -1267,7 +1267,7 @@ "terminal.ansiMagenta": "#BA5A7D", "terminal.ansiCyan": "#6FA5A0", "terminal.ansiWhite": "#EFD5D1", - "terminal.ansiBrightBlack": "#46120A", + "terminal.ansiBrightBlack": "#AC6D4A", "terminal.ansiBrightRed": "#CF8175", "terminal.ansiBrightGreen": "#94A577", "terminal.ansiBrightYellow": "#D3AE6E", @@ -1277,7 +1277,7 @@ "terminal.ansiBrightWhite": "#F7EAE8", "terminalCommandDecoration.defaultBackground": "#46120A", "terminalCommandDecoration.successBackground": "#8FA667", - "terminalCommandDecoration.errorBackground": "#BF5747", + "terminalCommandDecoration.errorBackground": "#CB6353", "panelSection.border": "#46120A", "panelSectionHeader.background": "#46120A", "panelSectionHeader.foreground": "#EFD5D1", @@ -1289,7 +1289,7 @@ "minimap.warningHighlight": "#D4A75966", "minimapGutter.addedBackground": "#8FA667", "minimapGutter.modifiedBackground": "#6FA5A0", - "minimapGutter.deletedBackground": "#BF5747", + "minimapGutter.deletedBackground": "#CB6353", "minimapSlider.background": "#691B0F99", "minimapSlider.hoverBackground": "#57170DAA", "minimapSlider.activeBackground": "#5A1810CC", @@ -1338,7 +1338,7 @@ "commandCenter.activeBorder": "#AF2E1A", "searchEditor.textInputBorder": "#46120A", "testing.iconPassed": "#8FA667", - "testing.iconFailed": "#BF5747", + "testing.iconFailed": "#CB6353", "testing.iconErrored": "#CF8175", "testing.iconQueued": "#6FA5A0", "testing.iconSkipped": "#EFD5D180",