decklight 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +257 -0
- package/SPEC.md +372 -0
- package/cli/bundle.mjs +388 -0
- package/cli/decklight.mjs +95 -0
- package/cli/edit.mjs +142 -0
- package/cli/init.mjs +215 -0
- package/cli/rec.mjs +538 -0
- package/dist/decklight.css +1068 -0
- package/dist/decklight.js +239 -0
- package/dist/decklight.js.map +7 -0
- package/docs/architecture.svg +94 -0
- package/docs/demo.svg +124 -0
- package/package.json +54 -0
- package/themes/README.md +61 -0
- package/themes/aliens.css +84 -0
- package/themes/apple2.css +126 -0
- package/themes/aurora.css +84 -0
- package/themes/berry.css +80 -0
- package/themes/blade-runner.css +83 -0
- package/themes/c64.css +85 -0
- package/themes/carbon.css +82 -0
- package/themes/citrus.css +80 -0
- package/themes/coastal.css +80 -0
- package/themes/cosmos.css +86 -0
- package/themes/dune.css +80 -0
- package/themes/eclipse.css +82 -0
- package/themes/ember.css +80 -0
- package/themes/fjord.css +80 -0
- package/themes/friends.css +82 -0
- package/themes/gallery.html +203 -0
- package/themes/gameboy.css +118 -0
- package/themes/genesis.css +84 -0
- package/themes/glacier.css +82 -0
- package/themes/godfather.css +82 -0
- package/themes/graphite.css +80 -0
- package/themes/harvest.css +80 -0
- package/themes/ibm-modern.css +83 -0
- package/themes/ibm-oldschool.css +84 -0
- package/themes/ink.css +82 -0
- package/themes/latte.css +80 -0
- package/themes/linen.css +80 -0
- package/themes/meadow.css +80 -0
- package/themes/metropolis.css +85 -0
- package/themes/miami-vice.css +84 -0
- package/themes/midnight.css +80 -0
- package/themes/mint.css +82 -0
- package/themes/moss.css +82 -0
- package/themes/obsidian.css +82 -0
- package/themes/orchid.css +82 -0
- package/themes/packs.json +89 -0
- package/themes/paper.css +83 -0
- package/themes/peony.css +84 -0
- package/themes/porcelain.css +82 -0
- package/themes/pulp-fiction.css +84 -0
- package/themes/reveal-beige.css +87 -0
- package/themes/reveal-black.css +83 -0
- package/themes/reveal-blood.css +84 -0
- package/themes/reveal-dracula.css +83 -0
- package/themes/reveal-league.css +88 -0
- package/themes/reveal-moon.css +83 -0
- package/themes/reveal-night.css +86 -0
- package/themes/reveal-serif.css +82 -0
- package/themes/reveal-simple.css +84 -0
- package/themes/reveal-sky.css +85 -0
- package/themes/reveal-solarized.css +83 -0
- package/themes/reveal-white.css +82 -0
- package/themes/sepia.css +81 -0
- package/themes/seriph.css +82 -0
- package/themes/severance.css +82 -0
- package/themes/slate.css +80 -0
- package/themes/snes.css +82 -0
- package/themes/star-wars.css +85 -0
- package/themes/storm.css +80 -0
- package/themes/stranger-things.css +84 -0
- package/themes/synthwave.css +90 -0
- package/themes/terminator.css +84 -0
- package/themes/velvet.css +80 -0
- package/tools/gemini-tts.mjs +140 -0
- package/tools/publish-site-voices.mjs +71 -0
- package/tools/voiceover-server.mjs +0 -0
- package/tools/voiceover.mjs +155 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/* ═══════════════════════════════════════════════════════════════
|
|
2
|
+
Decklight theme · eclipse
|
|
3
|
+
dark · Total black, one corona of gold — maximum drama, minimum palette
|
|
4
|
+
Token contract: SPEC.md §5 — all values validated by test/contrast.mjs
|
|
5
|
+
═══════════════════════════════════════════════════════════════ */
|
|
6
|
+
|
|
7
|
+
.decklight {
|
|
8
|
+
/* ── canvas ─────────────────────────────── */
|
|
9
|
+
--bg: #0b0b0d;
|
|
10
|
+
--bg-accent: radial-gradient(circle at 50% 0%, #262008 0%, #0b0b0d 60%);
|
|
11
|
+
--fg: #ecebe6;
|
|
12
|
+
--muted: #a5a49c;
|
|
13
|
+
|
|
14
|
+
/* ── type ───────────────────────────────── */
|
|
15
|
+
--font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
16
|
+
--font-heading: "Avenir Next", Avenir, Futura, "Century Gothic", "Segoe UI", sans-serif;
|
|
17
|
+
--font-mono: "SF Mono", SFMono-Regular, ui-monospace, "Cascadia Code", Menlo, Consolas, monospace;
|
|
18
|
+
--heading-color: #f5c542;
|
|
19
|
+
--heading-weight: 900;
|
|
20
|
+
--link: #e0c268;
|
|
21
|
+
|
|
22
|
+
/* ── accent ─────────────────────────────── */
|
|
23
|
+
--accent: #e3bd54;
|
|
24
|
+
--accent-contrast: #241a00;
|
|
25
|
+
|
|
26
|
+
/* ── blocks ─────────────────────────────── */
|
|
27
|
+
--block-bg: #141416;
|
|
28
|
+
--block-border: 1px solid #26262a;
|
|
29
|
+
--block-radius: 6px;
|
|
30
|
+
--shadow: 0 10px 32px rgba(0, 0, 0, 0.7);
|
|
31
|
+
|
|
32
|
+
/* ── code ───────────────────────────────── */
|
|
33
|
+
--code-bg: #101012;
|
|
34
|
+
--code-fg: #e6e5e0;
|
|
35
|
+
--hl-keyword: #ecc14b;
|
|
36
|
+
--hl-string: #b9cc8c;
|
|
37
|
+
--hl-number: #e8a86b;
|
|
38
|
+
--hl-comment: #84837c;
|
|
39
|
+
--hl-function: #b3b3dd;
|
|
40
|
+
--hl-type: #d8cfa0;
|
|
41
|
+
--hl-punct: #a8a7a0;
|
|
42
|
+
|
|
43
|
+
/* ── diagram ────────────────────────────── */
|
|
44
|
+
--d-stroke: #8f8455;
|
|
45
|
+
--d-text: #ecebe6;
|
|
46
|
+
--d-muted: #98978f;
|
|
47
|
+
--d-accent: #f5c542;
|
|
48
|
+
--d-fill-1: #1a1812;
|
|
49
|
+
--d-fill-2: #211d10;
|
|
50
|
+
--d-fill-3: #191919;
|
|
51
|
+
--d-fill-4: #262014;
|
|
52
|
+
--d-fill-5: #1e1c15;
|
|
53
|
+
--d-fill-6: #232118;
|
|
54
|
+
|
|
55
|
+
/* ── terminal ───────────────────────────── */
|
|
56
|
+
--term-bg: #0d0d0f;
|
|
57
|
+
--term-fg: #e2e1dc;
|
|
58
|
+
--term-prompt: #f5c542;
|
|
59
|
+
--term-cursor: #f5c542;
|
|
60
|
+
--term-selection: rgba(245, 197, 66, 0.25);
|
|
61
|
+
--ansi-black: #8a8981;
|
|
62
|
+
--ansi-red: #e5897d;
|
|
63
|
+
--ansi-green: #a5c987;
|
|
64
|
+
--ansi-yellow: #f5c542;
|
|
65
|
+
--ansi-blue: #96abd0;
|
|
66
|
+
--ansi-magenta: #c2a0c8;
|
|
67
|
+
--ansi-cyan: #93ccc0;
|
|
68
|
+
--ansi-white: #e8e7e2;
|
|
69
|
+
--ansi-bright-black: #a2a199;
|
|
70
|
+
--ansi-bright-red: #f0aba1;
|
|
71
|
+
--ansi-bright-green: #c0dca6;
|
|
72
|
+
--ansi-bright-yellow: #fad76e;
|
|
73
|
+
--ansi-bright-blue: #b3c4e2;
|
|
74
|
+
--ansi-bright-magenta: #d8bcdd;
|
|
75
|
+
--ansi-bright-cyan: #b0e0d5;
|
|
76
|
+
--ansi-bright-white: #fdfcf7;
|
|
77
|
+
|
|
78
|
+
/* ── builds ─────────────────────────────── */
|
|
79
|
+
--dim-opacity: 0.25;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.decklight h1, .decklight h2 { letter-spacing: -0.03em; text-transform: uppercase; }
|
package/themes/ember.css
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/* ═══════════════════════════════════════════════════════════════
|
|
2
|
+
Decklight theme · ember
|
|
3
|
+
dark · Fireside warmth — smoked umber, glowing coals
|
|
4
|
+
Token contract: SPEC.md §5 — all values validated by test/contrast.mjs
|
|
5
|
+
═══════════════════════════════════════════════════════════════ */
|
|
6
|
+
|
|
7
|
+
.decklight {
|
|
8
|
+
/* ── canvas ─────────────────────────────── */
|
|
9
|
+
--bg: #1a1210;
|
|
10
|
+
--bg-accent: linear-gradient(160deg, #2a160e 0%, #1a1210 70%);
|
|
11
|
+
--fg: #f3e8e0;
|
|
12
|
+
--muted: #c2ab9d;
|
|
13
|
+
|
|
14
|
+
/* ── type ───────────────────────────────── */
|
|
15
|
+
--font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
16
|
+
--font-heading: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
17
|
+
--font-mono: "SF Mono", SFMono-Regular, ui-monospace, "Cascadia Code", Menlo, Consolas, monospace;
|
|
18
|
+
--heading-color: #ffc9a3;
|
|
19
|
+
--heading-weight: 800;
|
|
20
|
+
--link: #ffab7a;
|
|
21
|
+
|
|
22
|
+
/* ── accent ─────────────────────────────── */
|
|
23
|
+
--accent: #e5855f;
|
|
24
|
+
--accent-contrast: #2d0f00;
|
|
25
|
+
|
|
26
|
+
/* ── blocks ─────────────────────────────── */
|
|
27
|
+
--block-bg: #241813;
|
|
28
|
+
--block-border: 1px solid #3d2a20;
|
|
29
|
+
--block-radius: 12px;
|
|
30
|
+
--shadow: 0 10px 30px rgba(8, 3, 1, 0.6);
|
|
31
|
+
|
|
32
|
+
/* ── code ───────────────────────────────── */
|
|
33
|
+
--code-bg: #150e0b;
|
|
34
|
+
--code-fg: #eee0d6;
|
|
35
|
+
--hl-keyword: #f99c68;
|
|
36
|
+
--hl-string: #d0c973;
|
|
37
|
+
--hl-number: #fab98f;
|
|
38
|
+
--hl-comment: #98857a;
|
|
39
|
+
--hl-function: #e8a3a3;
|
|
40
|
+
--hl-type: #d9b380;
|
|
41
|
+
--hl-punct: #bfab9e;
|
|
42
|
+
|
|
43
|
+
/* ── diagram ────────────────────────────── */
|
|
44
|
+
--d-stroke: #a86a48;
|
|
45
|
+
--d-text: #f3e8e0;
|
|
46
|
+
--d-muted: #ab9689;
|
|
47
|
+
--d-accent: #ff7a45;
|
|
48
|
+
--d-fill-1: #2b1c14;
|
|
49
|
+
--d-fill-2: #332014;
|
|
50
|
+
--d-fill-3: #2a2015;
|
|
51
|
+
--d-fill-4: #3a2417;
|
|
52
|
+
--d-fill-5: #302019;
|
|
53
|
+
--d-fill-6: #28211a;
|
|
54
|
+
|
|
55
|
+
/* ── terminal ───────────────────────────── */
|
|
56
|
+
--term-bg: #120c09;
|
|
57
|
+
--term-fg: #ecdfd4;
|
|
58
|
+
--term-prompt: #ff7a45;
|
|
59
|
+
--term-cursor: #ff7a45;
|
|
60
|
+
--term-selection: rgba(255, 122, 69, 0.28);
|
|
61
|
+
--ansi-black: #9a8a7e;
|
|
62
|
+
--ansi-red: #ff7d68;
|
|
63
|
+
--ansi-green: #b5cc7a;
|
|
64
|
+
--ansi-yellow: #ffc36b;
|
|
65
|
+
--ansi-blue: #d9a878;
|
|
66
|
+
--ansi-magenta: #e09a9a;
|
|
67
|
+
--ansi-cyan: #a8ccb8;
|
|
68
|
+
--ansi-white: #efe4da;
|
|
69
|
+
--ansi-bright-black: #b0a094;
|
|
70
|
+
--ansi-bright-red: #ffa392;
|
|
71
|
+
--ansi-bright-green: #ccdf9c;
|
|
72
|
+
--ansi-bright-yellow: #ffd695;
|
|
73
|
+
--ansi-bright-blue: #e8c19a;
|
|
74
|
+
--ansi-bright-magenta: #f0bcbc;
|
|
75
|
+
--ansi-bright-cyan: #c5e0d0;
|
|
76
|
+
--ansi-bright-white: #fff8f2;
|
|
77
|
+
|
|
78
|
+
/* ── builds ─────────────────────────────── */
|
|
79
|
+
--dim-opacity: 0.3;
|
|
80
|
+
}
|
package/themes/fjord.css
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/* ═══════════════════════════════════════════════════════════════
|
|
2
|
+
Decklight theme · fjord
|
|
3
|
+
dark · Nordic blue-gray dusk, glacial pastels, quiet and steady
|
|
4
|
+
Token contract: SPEC.md §5 — all values validated by test/contrast.mjs
|
|
5
|
+
═══════════════════════════════════════════════════════════════ */
|
|
6
|
+
|
|
7
|
+
.decklight {
|
|
8
|
+
/* ── canvas ─────────────────────────────── */
|
|
9
|
+
--bg: #232a35;
|
|
10
|
+
--bg-accent: #2b3442;
|
|
11
|
+
--fg: #e3e9f2;
|
|
12
|
+
--muted: #a8b4c4;
|
|
13
|
+
|
|
14
|
+
/* ── type ───────────────────────────────── */
|
|
15
|
+
--font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
16
|
+
--font-heading: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
17
|
+
--font-mono: "SF Mono", SFMono-Regular, ui-monospace, "Cascadia Code", Menlo, Consolas, monospace;
|
|
18
|
+
--heading-color: #c9dcf0;
|
|
19
|
+
--heading-weight: 600;
|
|
20
|
+
--link: #8fc3e8;
|
|
21
|
+
|
|
22
|
+
/* ── accent ─────────────────────────────── */
|
|
23
|
+
--accent: #8cc0ec;
|
|
24
|
+
--accent-contrast: #0b2338;
|
|
25
|
+
|
|
26
|
+
/* ── blocks ─────────────────────────────── */
|
|
27
|
+
--block-bg: #2b3340;
|
|
28
|
+
--block-border: 1px solid #3a4554;
|
|
29
|
+
--block-radius: 12px;
|
|
30
|
+
--shadow: 0 8px 26px rgba(10, 14, 20, 0.5);
|
|
31
|
+
|
|
32
|
+
/* ── code ───────────────────────────────── */
|
|
33
|
+
--code-bg: #1b212a;
|
|
34
|
+
--code-fg: #dde4ee;
|
|
35
|
+
--hl-keyword: #8fc3e8;
|
|
36
|
+
--hl-string: #a8d5a2;
|
|
37
|
+
--hl-number: #e8b98a;
|
|
38
|
+
--hl-comment: #8b98aa;
|
|
39
|
+
--hl-function: #98b8e8;
|
|
40
|
+
--hl-type: #b8a8e0;
|
|
41
|
+
--hl-punct: #a8b4c4;
|
|
42
|
+
|
|
43
|
+
/* ── diagram ────────────────────────────── */
|
|
44
|
+
--d-stroke: #7591ab;
|
|
45
|
+
--d-text: #e3e9f2;
|
|
46
|
+
--d-muted: #94a3b5;
|
|
47
|
+
--d-accent: #88c0f0;
|
|
48
|
+
--d-fill-1: #2e3946;
|
|
49
|
+
--d-fill-2: #31424f;
|
|
50
|
+
--d-fill-3: #3a3f50;
|
|
51
|
+
--d-fill-4: #2c4452;
|
|
52
|
+
--d-fill-5: #38414e;
|
|
53
|
+
--d-fill-6: #324457;
|
|
54
|
+
|
|
55
|
+
/* ── terminal ───────────────────────────── */
|
|
56
|
+
--term-bg: #171c24;
|
|
57
|
+
--term-fg: #dbe2ec;
|
|
58
|
+
--term-prompt: #88c0f0;
|
|
59
|
+
--term-cursor: #88c0f0;
|
|
60
|
+
--term-selection: rgba(136, 192, 240, 0.26);
|
|
61
|
+
--ansi-black: #8a97a8;
|
|
62
|
+
--ansi-red: #e88797;
|
|
63
|
+
--ansi-green: #9fd0a0;
|
|
64
|
+
--ansi-yellow: #ecc788;
|
|
65
|
+
--ansi-blue: #8ab4dd;
|
|
66
|
+
--ansi-magenta: #c2a3d8;
|
|
67
|
+
--ansi-cyan: #8fd4cf;
|
|
68
|
+
--ansi-white: #e5ecf4;
|
|
69
|
+
--ansi-bright-black: #a2afc0;
|
|
70
|
+
--ansi-bright-red: #f2a8b5;
|
|
71
|
+
--ansi-bright-green: #bce3bd;
|
|
72
|
+
--ansi-bright-yellow: #f5d9a8;
|
|
73
|
+
--ansi-bright-blue: #aacbe8;
|
|
74
|
+
--ansi-bright-magenta: #d6bfe8;
|
|
75
|
+
--ansi-bright-cyan: #aee5e0;
|
|
76
|
+
--ansi-bright-white: #fafafa;
|
|
77
|
+
|
|
78
|
+
/* ── builds ─────────────────────────────── */
|
|
79
|
+
--dim-opacity: 0.32;
|
|
80
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/* ═══════════════════════════════════════════════════════════════
|
|
2
|
+
Decklight theme · friends
|
|
3
|
+
light · warm cream, door purple, frame yellow, couch orange
|
|
4
|
+
Inspired by Friends — the purple door, the yellow frame, the orange couch — palette kept canonical where possible,
|
|
5
|
+
every gated pair fitted to the WCAG contract.
|
|
6
|
+
Token contract: SPEC.md §5 — validated by test/contrast.mjs
|
|
7
|
+
═══════════════════════════════════════════════════════════════ */
|
|
8
|
+
|
|
9
|
+
.decklight {
|
|
10
|
+
/* ── canvas ─────────────────────────────── */
|
|
11
|
+
--bg: #f7f1e2;
|
|
12
|
+
--bg-accent: none;
|
|
13
|
+
--fg: #3a3129;
|
|
14
|
+
--muted: #7d7261;
|
|
15
|
+
|
|
16
|
+
/* ── type ───────────────────────────────── */
|
|
17
|
+
--font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
18
|
+
--font-heading: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
19
|
+
--font-mono: "SF Mono", SFMono-Regular, ui-monospace, "Cascadia Code", Menlo, Consolas, monospace;
|
|
20
|
+
--heading-color: #6b4d9e;
|
|
21
|
+
--heading-weight: 700;
|
|
22
|
+
--link: #8a5f3f;
|
|
23
|
+
|
|
24
|
+
/* ── accent ─────────────────────────────── */
|
|
25
|
+
--accent: #7b5aa6;
|
|
26
|
+
--accent-contrast: #fbfbfa;
|
|
27
|
+
|
|
28
|
+
/* ── blocks ─────────────────────────────── */
|
|
29
|
+
--block-bg: #e9e5db;
|
|
30
|
+
--block-border: 1px solid #d0ccc1;
|
|
31
|
+
--block-radius: 12px;
|
|
32
|
+
--shadow: 0 5px 18px rgba(30, 30, 40, 0.12);
|
|
33
|
+
|
|
34
|
+
/* ── code ───────────────────────────────── */
|
|
35
|
+
--code-bg: #3a3129;
|
|
36
|
+
--code-fg: #f2ead8;
|
|
37
|
+
--hl-keyword: #c8a8f0;
|
|
38
|
+
--hl-string: #b9cd89;
|
|
39
|
+
--hl-number: #eeb062;
|
|
40
|
+
--hl-comment: #94897a;
|
|
41
|
+
--hl-function: #8fc0e8;
|
|
42
|
+
--hl-type: #e8c078;
|
|
43
|
+
--hl-punct: #d8cfc0;
|
|
44
|
+
|
|
45
|
+
/* ── diagram ────────────────────────────── */
|
|
46
|
+
--d-stroke: #7d7261;
|
|
47
|
+
--d-text: #3a3129;
|
|
48
|
+
--d-muted: #7d7261;
|
|
49
|
+
--d-accent: #7b5aa6;
|
|
50
|
+
--d-fill-1: #ddd6e5;
|
|
51
|
+
--d-fill-2: #e3decd;
|
|
52
|
+
--d-fill-3: #e2cec4;
|
|
53
|
+
--d-fill-4: #dde5d6;
|
|
54
|
+
--d-fill-5: #cddae3;
|
|
55
|
+
--d-fill-6: #e2c4d3;
|
|
56
|
+
|
|
57
|
+
/* ── terminal ───────────────────────────── */
|
|
58
|
+
--term-bg: #332b24;
|
|
59
|
+
--term-fg: #eceae6;
|
|
60
|
+
--term-prompt: #8b6eb1;
|
|
61
|
+
--term-cursor: #8b6eb1;
|
|
62
|
+
--term-selection: rgba(123, 90, 166, 0.28);
|
|
63
|
+
--ansi-black: #92899f;
|
|
64
|
+
--ansi-red: #c38b79;
|
|
65
|
+
--ansi-green: #79c388;
|
|
66
|
+
--ansi-yellow: #c3bc79;
|
|
67
|
+
--ansi-blue: #7990c3;
|
|
68
|
+
--ansi-magenta: #bf79c3;
|
|
69
|
+
--ansi-cyan: #79c1c3;
|
|
70
|
+
--ansi-white: #e0dee3;
|
|
71
|
+
--ansi-bright-black: #ada7b4;
|
|
72
|
+
--ansi-bright-red: #dbad9e;
|
|
73
|
+
--ansi-bright-green: #9edbaa;
|
|
74
|
+
--ansi-bright-yellow: #dbd69e;
|
|
75
|
+
--ansi-bright-blue: #9eb1db;
|
|
76
|
+
--ansi-bright-magenta: #d89edb;
|
|
77
|
+
--ansi-bright-cyan: #9edadb;
|
|
78
|
+
--ansi-bright-white: #f2f2f3;
|
|
79
|
+
|
|
80
|
+
/* ── builds ─────────────────────────────── */
|
|
81
|
+
--dim-opacity: 0.3;
|
|
82
|
+
}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Decklight — Theme Gallery</title>
|
|
7
|
+
<style>
|
|
8
|
+
/* Gallery chrome (independent of the Decklight runtime) */
|
|
9
|
+
:root { color-scheme: light; }
|
|
10
|
+
* { box-sizing: border-box; }
|
|
11
|
+
body {
|
|
12
|
+
margin: 0; padding: 32px 40px 80px;
|
|
13
|
+
background: #eceef2; color: #1c2430;
|
|
14
|
+
font: 15px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
|
15
|
+
}
|
|
16
|
+
header { max-width: 1400px; margin: 0 auto 20px; }
|
|
17
|
+
header h1 { margin: 0 0 4px; font-size: 26px; letter-spacing: -0.01em; }
|
|
18
|
+
header p { margin: 0; color: #5b6675; }
|
|
19
|
+
#filters { max-width: 1400px; margin: 14px auto 26px; display: flex; gap: 8px; }
|
|
20
|
+
#filters button {
|
|
21
|
+
border: 1px solid #c6cdd8; background: #fff; color: #38445a;
|
|
22
|
+
padding: 5px 14px; border-radius: 999px; font-size: 13px; cursor: pointer;
|
|
23
|
+
}
|
|
24
|
+
#filters button.on { background: #1c2430; color: #fff; border-color: #1c2430; }
|
|
25
|
+
#warn {
|
|
26
|
+
display: none; max-width: 1400px; margin: 0 auto 24px; padding: 14px 18px;
|
|
27
|
+
background: #fff3cd; border: 1px solid #e0c76a; border-radius: 10px; color: #5c4a00;
|
|
28
|
+
}
|
|
29
|
+
#warn code { background: #f5e7ad; padding: 1px 6px; border-radius: 4px; }
|
|
30
|
+
#grid {
|
|
31
|
+
max-width: 1400px; margin: 0 auto; display: grid; gap: 22px;
|
|
32
|
+
grid-template-columns: repeat(auto-fill, minmax(330px, 1fr));
|
|
33
|
+
}
|
|
34
|
+
.card { border-radius: 14px; overflow: hidden; background: #fff; box-shadow: 0 3px 14px rgba(20, 30, 50, 0.1); }
|
|
35
|
+
.card footer {
|
|
36
|
+
display: flex; justify-content: space-between; align-items: baseline;
|
|
37
|
+
padding: 10px 14px; font-size: 13px; color: #38445a; background: #fff;
|
|
38
|
+
}
|
|
39
|
+
.card footer .mode { color: #7a8494; font-size: 12px; }
|
|
40
|
+
|
|
41
|
+
/* Mini slide — consumes ONLY theme tokens */
|
|
42
|
+
.mini {
|
|
43
|
+
background: var(--bg); color: var(--fg);
|
|
44
|
+
font-family: var(--font-body);
|
|
45
|
+
padding: 18px 20px 16px; min-height: 300px;
|
|
46
|
+
display: flex; flex-direction: column; gap: 10px;
|
|
47
|
+
}
|
|
48
|
+
.mini h3 {
|
|
49
|
+
margin: 0; font-family: var(--font-heading); color: var(--heading-color);
|
|
50
|
+
font-weight: var(--heading-weight); font-size: 21px; line-height: 1.15;
|
|
51
|
+
}
|
|
52
|
+
.mini .body { margin: 0; font-size: 12.5px; line-height: 1.45; }
|
|
53
|
+
.mini .body .mut { color: var(--muted); }
|
|
54
|
+
.mini .body a { color: var(--link); }
|
|
55
|
+
.mini .chips { display: flex; gap: 8px; align-items: center; }
|
|
56
|
+
.mini .chip {
|
|
57
|
+
background: var(--accent); color: var(--accent-contrast);
|
|
58
|
+
font-size: 11px; font-weight: 700; padding: 3px 10px; border-radius: 999px;
|
|
59
|
+
}
|
|
60
|
+
.mini .block-demo {
|
|
61
|
+
background: var(--block-bg); border: var(--block-border);
|
|
62
|
+
border-radius: var(--block-radius); box-shadow: var(--shadow);
|
|
63
|
+
color: var(--fg); font-size: 11px; padding: 4px 10px;
|
|
64
|
+
}
|
|
65
|
+
.mini pre {
|
|
66
|
+
margin: 0; background: var(--code-bg); color: var(--code-fg);
|
|
67
|
+
font-family: var(--font-mono); font-size: 11px; line-height: 1.55;
|
|
68
|
+
padding: 9px 12px; border-radius: 8px; overflow: hidden;
|
|
69
|
+
}
|
|
70
|
+
.mini pre .k { color: var(--hl-keyword); font-weight: 600; }
|
|
71
|
+
.mini pre .s { color: var(--hl-string); }
|
|
72
|
+
.mini pre .n { color: var(--hl-number); }
|
|
73
|
+
.mini pre .c { color: var(--hl-comment); font-style: italic; }
|
|
74
|
+
.mini pre .f { color: var(--hl-function); }
|
|
75
|
+
.mini pre .t { color: var(--hl-type); }
|
|
76
|
+
.mini pre .p { color: var(--hl-punct); }
|
|
77
|
+
.mini .term {
|
|
78
|
+
background: var(--term-bg); color: var(--term-fg);
|
|
79
|
+
font-family: var(--font-mono); font-size: 11px; line-height: 1.6;
|
|
80
|
+
padding: 8px 12px; border-radius: 8px;
|
|
81
|
+
}
|
|
82
|
+
.mini .term .pr { color: var(--term-prompt); font-weight: 700; }
|
|
83
|
+
.mini .term .a-r { color: var(--ansi-red); } .mini .term .a-g { color: var(--ansi-green); }
|
|
84
|
+
.mini .term .a-y { color: var(--ansi-yellow); } .mini .term .a-b { color: var(--ansi-blue); }
|
|
85
|
+
.mini .term .a-m { color: var(--ansi-magenta); } .mini .term .a-c { color: var(--ansi-cyan); }
|
|
86
|
+
.mini svg { display: block; width: 100%; height: auto; }
|
|
87
|
+
</style>
|
|
88
|
+
</head>
|
|
89
|
+
<body>
|
|
90
|
+
<header>
|
|
91
|
+
<h1>Decklight themes</h1>
|
|
92
|
+
<p>75 themes on one token contract — canvas · type · accent · blocks · code · diagram · terminal. All WCAG-validated by <code style="font-size:13px">test/contrast.mjs</code>.</p>
|
|
93
|
+
</header>
|
|
94
|
+
<div id="filters">
|
|
95
|
+
<button data-f="all" class="on">All 30</button>
|
|
96
|
+
<button data-f="light">Light</button>
|
|
97
|
+
<button data-f="dark">Dark</button>
|
|
98
|
+
</div>
|
|
99
|
+
<div id="warn">
|
|
100
|
+
Theme files couldn’t be fetched — you’re probably viewing this over <code>file://</code>.
|
|
101
|
+
Serve the directory instead: <code>python3 -m http.server</code> (or <code>npx serve</code>) in <code>themes/</code>, then open <code>http://localhost:8000/gallery.html</code>.
|
|
102
|
+
</div>
|
|
103
|
+
<div id="grid"></div>
|
|
104
|
+
|
|
105
|
+
<script>
|
|
106
|
+
const THEMES = [
|
|
107
|
+
['aurora','dark','northern-lights gradient'], ['graphite','dark','machined charcoal + orange'],
|
|
108
|
+
['obsidian','dark','volcanic, ember red, hard edges'],['midnight','dark','indigo + lamplight amber'],
|
|
109
|
+
['fjord','dark','nordic dusk, glacial pastels'], ['cosmos','dark','nebula purples, stargazer pink'],
|
|
110
|
+
['ember','dark','fireside umber + coals'], ['moss','dark','old-forest greens, serif'],
|
|
111
|
+
['apple2','dark','green phosphor, mono display'], ['c64','dark','blue on blue, PETSCII spirit'],
|
|
112
|
+
['gameboy','light','four shades of pea-soup green'], ['snes','light','console gray, ABXY pops'],
|
|
113
|
+
['genesis','dark','Sega black, blue + red stripe'], ['miami-vice','dark','flamingo pink, seafoam teal'],
|
|
114
|
+
['friends','light','cream, door purple, frame yellow'], ['severance','dark','lumon midnight, cold teal'],
|
|
115
|
+
['stranger-things','dark','upside-down black, title red'],['aliens','dark','motion-tracker phosphor + amber'],
|
|
116
|
+
['blade-runner','dark','neon noir, cyan + magenta'], ['star-wars','dark','space black, crawl yellow'],
|
|
117
|
+
['terminator','dark','gunmetal chrome, HUD red'], ['godfather','dark','undertaker black, serif ivory'],
|
|
118
|
+
['pulp-fiction','dark','dime-novel black, poster yellow'],
|
|
119
|
+
['reveal-black','dark','the Reveal.js default, classic blue'], ['reveal-white','light','plain white, Reveal blue, monokai code'],
|
|
120
|
+
['reveal-league','dark','gunmetal wash, condensed caps, cyan'], ['reveal-beige','light','parchment wash, warm browns'],
|
|
121
|
+
['reveal-sky','light','pale sky wash, rounded type'], ['reveal-night','dark','true dark, Montserrat, amber'],
|
|
122
|
+
['reveal-serif','light','ivory, Palatino, quiet inks'], ['reveal-simple','light','bare white, black Lato, one blue'],
|
|
123
|
+
['reveal-solarized','light','canonical Solarized base3 cream'],['reveal-moon','dark','Solarized base03 deep teal'],
|
|
124
|
+
['reveal-blood','dark','coal black, dried-blood red'], ['reveal-dracula','dark','the vampire palette, neon syntax'],
|
|
125
|
+
['metropolis','light','Beamer metropolis: spruce + one orange'],['seriph','light','warm white, serif display, one gold'],
|
|
126
|
+
['velvet','dark','plum + rose gold, serif'], ['carbon','dark','IDE graphite, duotone syntax'],
|
|
127
|
+
['synthwave','dark','neon horizon, retro-future'], ['ink','dark','sumi-e minimal, vermillion'],
|
|
128
|
+
['eclipse','dark','black + one corona of gold'], ['storm','dark','squall slate + lightning'],
|
|
129
|
+
['porcelain','light','gallery white, serif ink-blue'],['paper','light','typewriter manuscript'],
|
|
130
|
+
['meadow','light','spring grass + clover'], ['glacier','light','arctic daylight, crisp'],
|
|
131
|
+
['citrus','light','lime + tangerine, rounded'], ['dune','light','sandstone + terracotta serif'],
|
|
132
|
+
['orchid','light','lilac tint, feather headings'], ['harvest','light','october ivory, slab'],
|
|
133
|
+
['coastal','light','sea-sky gradient + coral'], ['linen','light','unbleached fiber + olive'],
|
|
134
|
+
['berry','light','raspberry energy'], ['slate','light','boardroom neutral (on purpose)'],
|
|
135
|
+
['latte','light','steamed milk + espresso'], ['peony','light','editorial blush, italic serif'],
|
|
136
|
+
['mint','light','spearmint SaaS-fresh, pills'], ['sepia','light','antique folio, oxblood'],
|
|
137
|
+
['ibm-modern','dark','Carbon g100: Plex + IBM Blue'], ['ibm-oldschool','dark','3270 green-phosphor mainframe'],
|
|
138
|
+
];
|
|
139
|
+
|
|
140
|
+
const MINI = (id) => `
|
|
141
|
+
<div class="mini" id="${id}">
|
|
142
|
+
<h3>Real-Time AI, Slide by Slide</h3>
|
|
143
|
+
<p class="body">Body text with <span class="mut">muted detail</span>, a <a href="#">link</a>, and
|
|
144
|
+
<span class="chip">accent</span></p>
|
|
145
|
+
<div class="chips"><span class="block-demo">block surface</span></div>
|
|
146
|
+
<pre><span class="c">-- create a streaming agent</span>
|
|
147
|
+
<span class="k">CREATE AGENT</span> <span class="f">triage</span> <span class="k">USING MODEL</span> <span class="t">claude</span>
|
|
148
|
+
<span class="k">WITH</span> <span class="p">(</span><span class="s">'max_iterations'</span> <span class="p">=</span> <span class="n">5</span><span class="p">);</span></pre>
|
|
149
|
+
<div class="term"><span class="pr">$</span> decklight-rec demo.term.yaml<br>
|
|
150
|
+
<span class="a-g">✓ recorded</span> <span class="a-c">3 steps</span> · <span class="a-y">1.8s</span> · <span class="a-m">redacted 1</span> <span class="a-r">0 failed</span></div>
|
|
151
|
+
<svg viewBox="0 0 300 54">
|
|
152
|
+
<rect x="4" y="10" width="84" height="34" rx="7" fill="var(--d-fill-1)" stroke="var(--d-stroke)"/>
|
|
153
|
+
<text x="46" y="31" text-anchor="middle" font-size="11" fill="var(--d-text)">Kafka</text>
|
|
154
|
+
<line x1="92" y1="27" x2="124" y2="27" stroke="var(--d-accent)" stroke-width="2"/>
|
|
155
|
+
<rect x="128" y="10" width="84" height="34" rx="7" fill="var(--d-fill-2)" stroke="var(--d-stroke)"/>
|
|
156
|
+
<text x="170" y="31" text-anchor="middle" font-size="11" fill="var(--d-text)">Agent</text>
|
|
157
|
+
<line x1="216" y1="27" x2="248" y2="27" stroke="var(--d-muted)" stroke-width="2" stroke-dasharray="4 3"/>
|
|
158
|
+
<rect x="252" y="10" width="44" height="34" rx="7" fill="var(--d-fill-3)" stroke="var(--d-stroke)"/>
|
|
159
|
+
<text x="274" y="31" text-anchor="middle" font-size="11" fill="var(--d-text)">Act</text>
|
|
160
|
+
</svg>
|
|
161
|
+
</div>`;
|
|
162
|
+
|
|
163
|
+
async function load() {
|
|
164
|
+
const grid = document.getElementById('grid');
|
|
165
|
+
const importSet = new Set();
|
|
166
|
+
let failed = false;
|
|
167
|
+
|
|
168
|
+
for (const [name, mode, tag] of THEMES) {
|
|
169
|
+
const card = document.createElement('div');
|
|
170
|
+
card.className = 'card';
|
|
171
|
+
card.dataset.mode = mode;
|
|
172
|
+
card.innerHTML = MINI('g-' + name) + `<footer><strong>${name}</strong><span>${tag} <span class="mode">· ${mode}</span></span></footer>`;
|
|
173
|
+
grid.appendChild(card);
|
|
174
|
+
try {
|
|
175
|
+
const res = await fetch(`./${name}.css`);
|
|
176
|
+
if (!res.ok) throw new Error(res.status);
|
|
177
|
+
let css = await res.text();
|
|
178
|
+
for (const imp of css.match(/@import\s+url\([^)]*\)[^;]*;/g) ?? []) importSet.add(imp);
|
|
179
|
+
css = css.replace(/@import\s+url\([^)]*\)[^;]*;/g, '');
|
|
180
|
+
css = css.replace(/\.decklight\b/g, `#g-${name}`); // scope tokens + theme extras to this card
|
|
181
|
+
const style = document.createElement('style');
|
|
182
|
+
style.textContent = css;
|
|
183
|
+
document.head.appendChild(style);
|
|
184
|
+
} catch (e) { failed = true; }
|
|
185
|
+
}
|
|
186
|
+
if (importSet.size) {
|
|
187
|
+
const s = document.createElement('style');
|
|
188
|
+
s.textContent = [...importSet].join('\n');
|
|
189
|
+
document.head.prepend(s);
|
|
190
|
+
}
|
|
191
|
+
if (failed) document.getElementById('warn').style.display = 'block';
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
document.getElementById('filters').addEventListener('click', (e) => {
|
|
195
|
+
const f = e.target.dataset.f; if (!f) return;
|
|
196
|
+
document.querySelectorAll('#filters button').forEach(b => b.classList.toggle('on', b === e.target));
|
|
197
|
+
document.querySelectorAll('.card').forEach(c => c.style.display = (f === 'all' || c.dataset.mode === f) ? '' : 'none');
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
load();
|
|
201
|
+
</script>
|
|
202
|
+
</body>
|
|
203
|
+
</html>
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/* ═══════════════════════════════════════════════════════════════
|
|
2
|
+
Decklight theme · gameboy
|
|
3
|
+
light · four shades of pea-soup green, chunky pixels at heart
|
|
4
|
+
Inspired by the original Game Boy DMG-01 LCD — palette kept canonical where possible,
|
|
5
|
+
every gated pair fitted to the WCAG contract.
|
|
6
|
+
rule-exception: R1 a four-shade monochrome LCD is the identity
|
|
7
|
+
rule-exception: R2 the canonical DMG pea-green screen
|
|
8
|
+
rule-exception: R8 everything is pea-soup green on this hardware
|
|
9
|
+
Token contract: SPEC.md §5 — validated by test/contrast.mjs
|
|
10
|
+
═══════════════════════════════════════════════════════════════ */
|
|
11
|
+
|
|
12
|
+
.decklight {
|
|
13
|
+
/* ── canvas ─────────────────────────────── */
|
|
14
|
+
--bg: #9bbc0f;
|
|
15
|
+
--bg-accent: none;
|
|
16
|
+
--fg: #0f380f;
|
|
17
|
+
--muted: #2f5a1f;
|
|
18
|
+
|
|
19
|
+
/* ── type ───────────────────────────────── */
|
|
20
|
+
--font-body: "SF Mono", SFMono-Regular, ui-monospace, "Cascadia Code", Menlo, Consolas, monospace;
|
|
21
|
+
--font-heading: "SF Mono", SFMono-Regular, ui-monospace, "Cascadia Code", Menlo, Consolas, monospace;
|
|
22
|
+
--font-mono: "SF Mono", SFMono-Regular, ui-monospace, "Cascadia Code", Menlo, Consolas, monospace;
|
|
23
|
+
--heading-color: #0f380f;
|
|
24
|
+
--heading-weight: 800;
|
|
25
|
+
--link: #1f4a14;
|
|
26
|
+
|
|
27
|
+
/* ── accent ─────────────────────────────── */
|
|
28
|
+
--accent: #306230;
|
|
29
|
+
--accent-contrast: #fbfbfa;
|
|
30
|
+
|
|
31
|
+
/* ── blocks ─────────────────────────────── */
|
|
32
|
+
--block-bg: #828d53;
|
|
33
|
+
--block-border: 1px solid #8d9375;
|
|
34
|
+
--block-radius: 4px;
|
|
35
|
+
--shadow: 0 8px 26px rgba(0, 0, 0, 0.5);
|
|
36
|
+
|
|
37
|
+
/* ── code ───────────────────────────────── */
|
|
38
|
+
--code-bg: #0f380f;
|
|
39
|
+
--code-fg: #9bbc0f;
|
|
40
|
+
--hl-keyword: #aed81f;
|
|
41
|
+
--hl-string: #8bac0f;
|
|
42
|
+
--hl-number: #c8e858;
|
|
43
|
+
--hl-comment: #648841;
|
|
44
|
+
--hl-function: #9bd83f;
|
|
45
|
+
--hl-type: #bcd85f;
|
|
46
|
+
--hl-punct: #8fb04f;
|
|
47
|
+
|
|
48
|
+
/* ── diagram ────────────────────────────── */
|
|
49
|
+
--d-stroke: #2f5a1f;
|
|
50
|
+
--d-text: #0f380f;
|
|
51
|
+
--d-muted: #2f5a1f;
|
|
52
|
+
--d-accent: #306230;
|
|
53
|
+
--d-fill-1: #c3d654;
|
|
54
|
+
--d-fill-2: #b8cf48;
|
|
55
|
+
--d-fill-3: #cbdd66;
|
|
56
|
+
--d-fill-4: #b2c93e;
|
|
57
|
+
--d-fill-5: #c8da5e;
|
|
58
|
+
--d-fill-6: #bdd24e;
|
|
59
|
+
|
|
60
|
+
/* ── terminal ───────────────────────────── */
|
|
61
|
+
--term-bg: #9bbc0f;
|
|
62
|
+
--term-fg: #0f380f;
|
|
63
|
+
--term-prompt: #1d4a12;
|
|
64
|
+
--term-cursor: #0f380f;
|
|
65
|
+
--term-selection: rgba(15, 56, 15, 0.22);
|
|
66
|
+
--ansi-black: #0f380f;
|
|
67
|
+
--ansi-red: #2b4f14;
|
|
68
|
+
--ansi-green: #1a4a10;
|
|
69
|
+
--ansi-yellow: #2f5716;
|
|
70
|
+
--ansi-blue: #14421c;
|
|
71
|
+
--ansi-magenta: #254c1e;
|
|
72
|
+
--ansi-cyan: #175018;
|
|
73
|
+
--ansi-white: #306230;
|
|
74
|
+
--ansi-bright-black: #204a18;
|
|
75
|
+
--ansi-bright-red: #33581a;
|
|
76
|
+
--ansi-bright-green: #245414;
|
|
77
|
+
--ansi-bright-yellow: #365c1c;
|
|
78
|
+
--ansi-bright-blue: #1c4a22;
|
|
79
|
+
--ansi-bright-magenta: #2c5424;
|
|
80
|
+
--ansi-bright-cyan: #1f561e;
|
|
81
|
+
--ansi-bright-white: #0f380f;
|
|
82
|
+
|
|
83
|
+
/* ── builds ─────────────────────────────── */
|
|
84
|
+
--dim-opacity: 0.35;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.decklight h1, .decklight h2 { text-transform: uppercase; letter-spacing: 0.03em; }
|
|
88
|
+
|
|
89
|
+
/* ── DMG-01 LCD character ────────────────────────────────────────────────────
|
|
90
|
+
Not a CRT: no scanlines, no tear. The Game Boy look is a visible pixel
|
|
91
|
+
matrix (both axes), the famous LCD ghosting smear, a reflective
|
|
92
|
+
no-backlight vignette — and no window chrome at all. Static by nature,
|
|
93
|
+
so nothing to disable under reduced motion. */
|
|
94
|
+
.decklight { --term-chrome: none; }
|
|
95
|
+
.decklight .terminal-screen {
|
|
96
|
+
position: relative;
|
|
97
|
+
overflow: hidden;
|
|
98
|
+
border: 10px solid #6f7a72; /* the bezel */
|
|
99
|
+
border-radius: 8px;
|
|
100
|
+
box-shadow: inset 0 0 26px rgba(15, 56, 15, 0.30);
|
|
101
|
+
text-shadow: 1.5px 0 0 rgba(15, 56, 15, 0.20); /* LCD ghosting smear */
|
|
102
|
+
}
|
|
103
|
+
.decklight .terminal-screen::after {
|
|
104
|
+
content: '';
|
|
105
|
+
position: absolute;
|
|
106
|
+
inset: 0;
|
|
107
|
+
pointer-events: none;
|
|
108
|
+
background:
|
|
109
|
+
repeating-linear-gradient(0deg, rgba(15, 56, 15, 0.12) 0 1px, transparent 1px 3px),
|
|
110
|
+
repeating-linear-gradient(90deg, rgba(15, 56, 15, 0.12) 0 1px, transparent 1px 3px);
|
|
111
|
+
}
|
|
112
|
+
.decklight .terminal-screen::before {
|
|
113
|
+
content: '';
|
|
114
|
+
position: absolute;
|
|
115
|
+
inset: 0;
|
|
116
|
+
pointer-events: none;
|
|
117
|
+
background: radial-gradient(ellipse at 28% 18%, rgba(255, 255, 255, 0.12), transparent 46%);
|
|
118
|
+
}
|