sheleg-design-skill 0.4.0 → 0.6.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/README.md CHANGED
@@ -84,7 +84,7 @@ curl -fsSL https://raw.githubusercontent.com/ssheleg/sheleg-design-skill/main/in
84
84
  |---|---|
85
85
  | `SKILL.md` | Agent-facing skill: discovery trigger, the principles, how to apply them, quick-reference rules, common mistakes |
86
86
  | `SHELEG_DESIGN.md` | The full reference: architecture, layer-by-layer mechanics with code, the exact morph math, the DOM↔WebGL projection bridge, a build-from-scratch recipe, and the "why it works" |
87
- | `styles/*.md` | Style packs — the visual identity layer: `instrument-console` (near-black console, electric-blue signal) and `editorial-luxury` (warm cream/espresso/sage, dossier motifs). Each locks palette, type, texture, motion tokens, motifs, and bans; the pack contract lets you author new styles |
87
+ | `styles/*.md` | Style packs — the visual identity layer: `instrument-console` (near-black console, electric-blue signal), `editorial-luxury` (warm cream/espresso/sage, dossier motifs), and `workbench` (quiet light/dark product UI for dashboards & tools, standalone). Each locks palette, type, texture, motion tokens, motifs, and bans; the pack contract lets you author new styles |
88
88
 
89
89
  After installing, a Cursor or Claude agent in that project can discover the
90
90
  skill and use it when you ask it to build or upgrade a cinematic,
package/bin/cli.js CHANGED
@@ -23,12 +23,22 @@ const SKILL_DIR = path.join(
23
23
  "sheleg-design",
24
24
  );
25
25
  const SKILL_SLUG = "sheleg-design";
26
- const FILES = [
27
- "SKILL.md",
28
- "SHELEG_DESIGN.md",
29
- "styles/instrument-console.md",
30
- "styles/editorial-luxury.md",
31
- ];
26
+ const CORE_FILES = ["SKILL.md", "SHELEG_DESIGN.md"];
27
+
28
+ // The bundle is everything under skill/ — walked at runtime so adding a
29
+ // style pack or token file never requires touching the installer.
30
+ function listBundleFiles() {
31
+ const out = [];
32
+ const walk = (dir, prefix) => {
33
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
34
+ const rel = prefix ? `${prefix}/${entry.name}` : entry.name;
35
+ if (entry.isDirectory()) walk(path.join(dir, entry.name), rel);
36
+ else out.push(rel);
37
+ }
38
+ };
39
+ walk(SKILL_DIR, "");
40
+ return out.sort();
41
+ }
32
42
 
33
43
  const pkg = require(path.join(__dirname, "..", "package.json"));
34
44
 
@@ -125,7 +135,7 @@ function main() {
125
135
  const targetDir = resolveTargetDir(opts, cwd);
126
136
 
127
137
  // Verify the bundle is intact before touching the filesystem.
128
- for (const f of FILES) {
138
+ for (const f of CORE_FILES) {
129
139
  if (!fs.existsSync(path.join(SKILL_DIR, f))) {
130
140
  console.error(
131
141
  c("yellow", `Bundle is missing ${f}. This is a packaging bug.`),
@@ -134,7 +144,8 @@ function main() {
134
144
  }
135
145
  }
136
146
 
137
- const existing = FILES.filter((f) =>
147
+ const files = listBundleFiles();
148
+ const existing = files.filter((f) =>
138
149
  fs.existsSync(path.join(targetDir, f)),
139
150
  );
140
151
  if (existing.length && !opts.force) {
@@ -147,7 +158,7 @@ function main() {
147
158
  }
148
159
 
149
160
  fs.mkdirSync(targetDir, { recursive: true });
150
- for (const f of FILES) {
161
+ for (const f of files) {
151
162
  const dest = path.join(targetDir, f);
152
163
  fs.mkdirSync(path.dirname(dest), { recursive: true });
153
164
  fs.copyFileSync(path.join(SKILL_DIR, f), dest);
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: Apply SHELEG Design when building or upgrading a cinematic scroll-driven landing page, hero, or particle/WebGL scroll experience — or when scroll motion feels busy, janky, or out of sync
2
+ description: Apply SHELEG Design when building a cinematic scroll-driven landing page, hero, or particle/WebGL scroll experience — or when styling product UI (dashboards, admin, internal tools) with its style packs
3
3
  alwaysApply: false
4
4
  ---
5
5
 
@@ -9,9 +9,11 @@ A page feels cinematic from a **single source of truth** (measured scroll
9
9
  position) driving **many cheap, layered, independently-degradable responses** —
10
10
  not from many animations. If the project has the full skill installed
11
11
  (`.cursor/skills/sheleg-design/`), read its `SKILL.md`, `SHELEG_DESIGN.md`,
12
- and the chosen style pack in `styles/` (instrument-console — dark console;
13
- editorial-luxury — warm editorial) first; otherwise follow the contract
14
- below (self-contained on purpose).
12
+ and the chosen style pack in `styles/` first (instrument-console — dark
13
+ console; editorial-luxury — warm editorial; workbench quiet light/dark
14
+ product UI for dashboards and tools, used standalone without the cinematic
15
+ motion layer); otherwise follow the contract below (self-contained on
16
+ purpose).
15
17
 
16
18
  ## Five principles, in order
17
19
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "sheleg-design-skill",
3
- "version": "0.4.0",
4
- "description": "SHELEG Design — an agent skill for building cinematic, scroll-driven, particle-backed landing pages. Installs a SKILL.md + reference doc into your project so Cursor/Claude agents can build sites with a single-clock motion system, a scene-formation particle engine, and degrade-to-calm fallbacks.",
3
+ "version": "0.6.0",
4
+ "description": "SHELEG Design — an agent skill for cinematic scroll-driven landing pages AND product UI. Installs a SKILL.md + architecture reference + style packs (instrument-console dark, editorial-luxury warm, workbench light/dark for dashboards & tools) so Cursor/Claude agents build with a single-clock motion system and locked design tokens.",
5
5
  "bin": {
6
6
  "sheleg-design-skill": "bin/cli.js"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "sheleg-design",
3
- "description": "SHELEG Design methodology for cinematic scroll-driven landing pages: a single scroll clock driving layered, degrade-to-calm motion (WebGL particle formations, 2D fallback, parallax, scrubbed instruments, progress rail). Ships the sheleg-design skill, the full architecture reference, and the /sheleg-design command.",
4
- "version": "0.4.0",
3
+ "description": "SHELEG Design methodology: cinematic scroll-driven landing pages (single scroll clock, layered degrade-to-calm motion, WebGL particle formations) plus pluggable visual style packs — instrument-console (dark console), editorial-luxury (warm editorial), workbench (light/dark product UI for dashboards and tools). Ships the sheleg-design skill, the architecture reference, style packs with ready-made token CSS, and the /sheleg-design command.",
4
+ "version": "0.6.0",
5
5
  "author": {
6
6
  "name": "ssheleg"
7
7
  },
@@ -8,6 +8,8 @@ Invoke the `sheleg-design` skill and apply it to the current request.
8
8
  - Read the skill's SKILL.md, then its full reference `SHELEG_DESIGN.md`
9
9
  (same directory) before designing anything.
10
10
  - Task: $ARGUMENTS — if empty, ask what page or section to build/upgrade,
11
- then proceed per the skill's "How to Apply" order.
11
+ then proceed per the skill's "How to Apply" order. If the arguments name
12
+ a style pack (instrument-console | editorial-luxury | workbench), use
13
+ that pack without re-asking; otherwise pick per the SKILL.md table.
12
14
  - Follow the skill's non-negotiables (Quick Reference table) and ship every
13
15
  layer's reduced-motion/fallback branch in the same commit.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: sheleg-design
3
- description: Use when building or upgrading a cinematic scroll-driven landing page, marketing site, or hero experience — a particle/WebGL background, scroll-linked animation, parallax, pinned or scrubbed sections, formation-morphing scenes or when such a page feels busy or janky, or its motion layers drift out of sync. RU triggers - кинематографичный лендинг, скролл-анимация, лендинг с частицами. Pairs with an existing visual system, does not replace one.
3
+ description: Use when building or upgrading a cinematic scroll-driven landing page, marketing site, or hero experience (particle/WebGL background, scroll-linked animation, parallax, scrubbed sections) — when such a page feels busy or janky or its motion layers drift out of sync — or when styling product UI with its style packs - dashboards, admin panels, internal/dev tools, design tokens, light/dark themes. RU triggers - кинематографичный лендинг, скролл-анимация, лендинг с частицами, стиль дашборда, дизайн-токены, светлая/тёмная тема.
4
4
  ---
5
5
 
6
6
  # SHELEG Design
@@ -24,8 +24,11 @@ the DOM↔WebGL bridge, the build recipe (§11), and the file map.
24
24
  - Scroll-linked charts, step flows, progress rails, parallax
25
25
  - Existing scroll site that feels nervous, janky, or out of phase
26
26
 
27
- **Not for:** docs, dashboards, static content sites — or any page whose visual
28
- system or copy isn't finished yet. Fix those first; motion amplifies weakness.
27
+ **Not for (the motion layer):** docs, dashboards, static content sites — or
28
+ any page whose visual system or copy isn't finished yet. For dashboards,
29
+ tools, and product UI, use the [`workbench`](./styles/workbench.md) style
30
+ pack standalone: its tokens and atoms apply without the cinematic motion
31
+ layer.
29
32
 
30
33
  ## Core Pattern — five principles, in order
31
34
 
@@ -50,12 +53,16 @@ style pack in [`styles/`](./styles/):
50
53
  |---|---|---|
51
54
  | [`instrument-console`](./styles/instrument-console.md) | near-black aerospace console, one electric-blue signal, mono telemetry | technical / systems / infra products |
52
55
  | [`editorial-luxury`](./styles/editorial-luxury.md) | warm cream + espresso ink, sage accent, Fraunces/Newsreader, dossier motifs | editorial / research / premium B2B |
56
+ | [`workbench`](./styles/workbench.md) | quiet light/dark product UI: neutral grays, borders as elevation, one blue accent, mono data | dashboards / admin / internal & dev tools (standalone — no cinematic motion) |
53
57
 
54
58
  Read the chosen pack in full before styling anything — it supplies the
55
59
  palette, type, texture, motion-token values, signature motifs, and bans.
56
- For a new style, author a new pack file with the same headings (Register /
57
- Palette / Type / Texture & surface / Motion tokens / Signature motifs /
58
- Micro-interactions / Bans); never invent token values ad hoc.
60
+ Each pack ships a ready-made token layer in `styles/tokens/<pack>.css`
61
+ copy that file verbatim instead of transcribing tables. For a new style,
62
+ author a new pack file with the same headings (Register / Palette / Type /
63
+ Texture & surface / Motion tokens / Signature motifs / Micro-interactions /
64
+ Bans; skeleton: `templates/style-pack-template.md` in the repo) plus its
65
+ `tokens/<pack>.css`; never invent token values ad hoc.
59
66
 
60
67
  ## How to Apply
61
68
 
@@ -17,6 +17,9 @@ cinematic noise).
17
17
 
18
18
  ## Palette
19
19
 
20
+ Ready-made token layer: [`tokens/editorial-luxury.css`](./tokens/editorial-luxury.css)
21
+ — copy it verbatim instead of transcribing this table.
22
+
20
23
  | Token | Value | Role |
21
24
  |---|---|---|
22
25
  | `--paper` | `#fbf6ec` | primary cream field |
@@ -73,6 +76,20 @@ sage accent brightens to `#9fd9bc`.
73
76
  correct static final state under reduced-motion, **fail-open** if JS/CDN
74
77
  dies (content always visible).
75
78
 
79
+ ## Motion flavor
80
+
81
+ How this pack rides the SHELEG motion layer (brand register only):
82
+
83
+ - Reveals: 0.7s base with the pack ease; word-by-word title lighting and
84
+ `.reveal` sections; every reveal is fail-open (final state visible
85
+ without JS).
86
+ - The sage "signal" motif is the scroll narrative: it travels raw inputs →
87
+ pipeline → deliverable; scrubbed instruments draw with it.
88
+ - Particle field is optional here — if used, tint sage, low density, low
89
+ energy (≤0.6); artifact mock previews assembling on scroll are the
90
+ preferred spectacle.
91
+ - Product register: SHELEG fast/base durations only, no cinematic motion.
92
+
76
93
  ## Micro-interactions
77
94
 
78
95
  - Buttons: tactile `translateY(-2px)` + spring; no glow.
@@ -14,6 +14,9 @@ does not.
14
14
 
15
15
  ## Palette
16
16
 
17
+ Ready-made token layer: [`tokens/instrument-console.css`](./tokens/instrument-console.css)
18
+ — copy it verbatim instead of transcribing this table.
19
+
17
20
  | Token | Value | Role |
18
21
  |---|---|---|
19
22
  | `--base` | `#05070a` | page field (near-black) |
@@ -65,6 +68,18 @@ The particle field, progress rail, and all instruments are tinted with
65
68
  - Scrubbed SVG instruments (charts, step flows) drawn hairline-thin with
66
69
  mono annotations.
67
70
 
71
+ ## Motion flavor
72
+
73
+ How this pack rides the SHELEG motion layer:
74
+
75
+ - Particle field: single-hue `--accent` tint; SCENES `energy` 0.45–0.7,
76
+ climax only reaching 1.0; formations lean geometric (frame, lattice,
77
+ orbit, constellation, glyph).
78
+ - Reveal set: full act-themed range — Scatter (problem acts), Lock
79
+ (control/system acts), Clip (headlines/panels), Pulse (climax).
80
+ - Instruments: hairline-thin scrubbed SVG with mono annotations; progress
81
+ rail and act badge are first-class chrome.
82
+
68
83
  ## Micro-interactions
69
84
 
70
85
  - Buttons: surface-step + accent fill on primary; press = 1 shade dimmer
@@ -0,0 +1,53 @@
1
+ /* SHELEG Design — Editorial Luxury token layer (origin: prowl.chat).
2
+ Copy verbatim; consume only var(--…) in components.
3
+ After any theme migration, sweep hardcoded hex/rgba literals. */
4
+ :root {
5
+ --paper: #fbf6ec;
6
+ --paper-2: #f3ead9;
7
+ --paper-3: #ece0cb;
8
+ --espresso: #1b150e;
9
+ --espresso-2: #241c12;
10
+ --cream: #f4ecdc;
11
+ --ink: #241c14;
12
+ --ink-soft: #5b4f3d;
13
+ --ink-faint: #8a7c64;
14
+ --accent: #3f7d5f;
15
+ --accent-deep: #2f5e47;
16
+ --accent-dim: rgba(63, 125, 95, 0.12);
17
+ --accent-med: rgba(63, 125, 95, 0.34);
18
+ --accent-on-dark: #9fd9bc;
19
+ --terra: #b5623f;
20
+ --red: #a83a2b;
21
+ --hair: rgba(36, 28, 20, 0.13);
22
+ --hair-strong: rgba(36, 28, 20, 0.22);
23
+
24
+ --r: 14px;
25
+ --r-lg: 22px;
26
+ --r-xl: 30px;
27
+
28
+ --shadow-sm: 0 2px 10px -4px rgba(36, 28, 20, 0.16);
29
+ --shadow: 0 18px 50px -28px rgba(36, 28, 20, 0.3),
30
+ 0 4px 14px -10px rgba(36, 28, 20, 0.18);
31
+ --shadow-lg: 0 36px 90px -44px rgba(36, 28, 20, 0.42),
32
+ 0 8px 24px -16px rgba(36, 28, 20, 0.2);
33
+ --inset-hi: inset 0 1px 0 rgba(255, 251, 242, 0.7);
34
+
35
+ --motion-ease: cubic-bezier(0.22, 1, 0.36, 1);
36
+ --spring: cubic-bezier(0.32, 0.72, 0, 1);
37
+ --dur-brand: 0.7s;
38
+ --dur-fast: 0.18s;
39
+ --dur-base: 0.32s;
40
+ --dur-slow: 0.55s;
41
+ --dur-epic: 0.8s;
42
+ --stagger: 0.07s;
43
+
44
+ --font-display: "Fraunces", Georgia, serif;
45
+ --font-body: "Newsreader", Georgia, serif;
46
+ --font-data: "JetBrains Mono", ui-monospace, monospace;
47
+
48
+ --grain-url: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='220' height='220'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.82' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
49
+
50
+ background-color: var(--paper);
51
+ color: var(--ink);
52
+ color-scheme: light;
53
+ }
@@ -0,0 +1,43 @@
1
+ /* SHELEG Design — Instrument Console token layer.
2
+ Copy verbatim; consume only var(--…) in components. */
3
+ :root {
4
+ --base: #05070a;
5
+ --surface-1: #0a0e14;
6
+ --surface-2: #10151d;
7
+ --surface-3: #161c26;
8
+ --hairline: #1e2630;
9
+ --hairline-strong: #2b3542;
10
+ --ink: #eef2f7;
11
+ --ink-muted: #9aa7b6;
12
+ --ink-faint: #5f6b7a;
13
+ --accent: #3392ff;
14
+ --accent-dim: #1f5fb0;
15
+ --accent-bright: #6bb3ff;
16
+ --accent-glow: rgba(51, 146, 255, 0.18);
17
+ --ok: #46d39a;
18
+ --warn: #e0a030;
19
+
20
+ --r-sm: 4px;
21
+ --r-md: 8px;
22
+ --r-lg: 14px;
23
+ --r-pill: 999px;
24
+
25
+ --signal-glow: 0 0 0 1px rgba(51, 146, 255, 0.4),
26
+ 0 8px 30px rgba(51, 146, 255, 0.18);
27
+
28
+ --motion-ease: cubic-bezier(0.16, 1, 0.3, 1);
29
+ --dur-fast: 0.18s;
30
+ --dur-base: 0.32s;
31
+ --dur-slow: 0.55s;
32
+ --dur-epic: 0.8s;
33
+ --stagger: 0.07s;
34
+
35
+ --section: clamp(9rem, 24vh, 20rem);
36
+
37
+ --font-ui: var(--font-geist-sans, "Geist"), system-ui, sans-serif;
38
+ --font-data: var(--font-geist-mono, "Geist Mono"), ui-monospace, monospace;
39
+
40
+ background-color: var(--base);
41
+ color: var(--ink);
42
+ color-scheme: dark;
43
+ }
@@ -0,0 +1,58 @@
1
+ /* SHELEG Design — Workbench token layer (light default + dark twin).
2
+ Copy verbatim; consume only var(--…) in components.
3
+ Theme switch: set data-theme="dark" on :root. */
4
+ :root {
5
+ --bg: #f7f8fa;
6
+ --panel: #ffffff;
7
+ --panel-2: #f7f8fa;
8
+ --ink: #1a1f2b;
9
+ --muted: #5b6472;
10
+ --border: #e6e9ef;
11
+ --border-strong: #d7dce4;
12
+ --accent: #2f6feb;
13
+ --accent-weak: #eaf0fe;
14
+ --ok: #1a7f37;
15
+ --ok-weak: #e6f4ea;
16
+ --warn: #9a6700;
17
+ --warn-weak: #fff3d6;
18
+ --danger: #d1242f;
19
+ --danger-weak: #fde8e9;
20
+ --info: #2f6feb;
21
+ --info-weak: #eaf0fe;
22
+
23
+ --r-control: 6px;
24
+ --r-card: 10px;
25
+ --r-pill: 999px;
26
+
27
+ --shadow-1: 0 4px 16px -8px rgba(26, 31, 43, 0.18); /* overlays only */
28
+
29
+ --dur-state: 0.18s; /* meaningful state transitions, ease-out */
30
+ --dur-hover: 0.12s; /* background/border/color only */
31
+
32
+ --font-ui: -apple-system, "SF Pro", "Segoe UI", sans-serif;
33
+ --font-data: ui-monospace, "SF Mono", Menlo, monospace;
34
+
35
+ background-color: var(--bg);
36
+ color: var(--ink);
37
+ color-scheme: light dark;
38
+ }
39
+
40
+ :root[data-theme="dark"] {
41
+ --bg: #0f1218;
42
+ --panel: #161b24;
43
+ --panel-2: #1b212c;
44
+ --ink: #e8ecf3;
45
+ --muted: #8a93a6;
46
+ --border: #232a36;
47
+ --border-strong: #2c3441;
48
+ --accent: #4b8bff;
49
+ --accent-weak: #1b2740;
50
+ --ok: #3fb960;
51
+ --ok-weak: #12281a;
52
+ --warn: #d9a93f;
53
+ --warn-weak: #2b2210;
54
+ --danger: #e5534b;
55
+ --danger-weak: #2d1517;
56
+ --info: #4b8bff;
57
+ --info-weak: #1b2740;
58
+ }
@@ -0,0 +1,122 @@
1
+ # Style pack — Workbench
2
+
3
+ Origin: the Builder Pro AI production design system (light+dark token
4
+ layer) blended with GitHub-style border discipline and quiet stat-tile
5
+ surfaces. A calm, dense, utilitarian product UI: neutral grays, borders as
6
+ elevation, one functional blue accent, mono for data. Design serves the
7
+ product — never performs.
8
+
9
+ ## Register
10
+
11
+ Choose this pack for **product surfaces**: dashboards, admin panels,
12
+ internal tools, dev tools, analytics, settings. This is the one pack meant
13
+ to be used **standalone** — the SHELEG cinematic motion layer is out of
14
+ scope here; motion is limited to meaningful 150–200ms state transitions.
15
+ Light is the default register; dark is a first-class twin, both from the
16
+ same tokens.
17
+
18
+ ## Palette
19
+
20
+ Ready-made token layer: [`tokens/workbench.css`](./tokens/workbench.css)
21
+ (light `:root` + `data-theme="dark"` twin) — copy it verbatim instead of
22
+ transcribing this table.
23
+
24
+ | Token | Light | Dark | Role |
25
+ |---|---|---|---|
26
+ | `--bg` | `#f7f8fa` | `#0f1218` | app ground |
27
+ | `--panel` | `#ffffff` | `#161b24` | cards, bars, dialogs, inputs |
28
+ | `--panel-2` | `#f7f8fa` | `#1b212c` | inset / table headers / quiet stat tiles |
29
+ | `--ink` | `#1a1f2b` | `#e8ecf3` | primary text |
30
+ | `--muted` | `#5b6472` | `#8a93a6` | secondary text, labels, metadata |
31
+ | `--border` / `-strong` | `#e6e9ef` / `#d7dce4` | `#232a36` / `#2c3441` | 1px lines / stronger edges |
32
+ | `--accent` (`-weak`) | `#2f6feb` (`#eaf0fe`) | `#4b8bff` (`#1b2740`) | THE one accent + its tint |
33
+ | `--ok` | `#1a7f37`-family green | brightened | done / healthy / success |
34
+ | `--warn` | amber | brightened | needs a human / waiting (reserved) |
35
+ | `--danger` | red | brightened | failed / error / incident |
36
+ | `--info` | blue | brightened | running / working |
37
+
38
+ Semantic colors are STATE ONLY, never decoration; each has a `-weak` tint
39
+ for badge/banner fills. Amber is reserved for "a human is needed". A second
40
+ accent hue is a design defect. Sequential data scales (heatmaps, charts)
41
+ are tints of `--accent`, not a new hue.
42
+
43
+ ## Type
44
+
45
+ - UI face: system stack (`-apple-system, "SF Pro", "Segoe UI", sans-serif`)
46
+ — zero load cost. Weights 400 body / 600 emphasis / 700 headings only.
47
+ - Data face: `ui-monospace / SF Mono` for ALL data — ids, metrics,
48
+ timestamps, counters, chips, logs; `font-variant-numeric: tabular-nums`
49
+ wherever digits align.
50
+ - Compact scale: 11px chips/meta · 12px labels (uppercase, tracked .1em) ·
51
+ 13px body/dense UI · 15px card titles · 20px sections · 28px page title.
52
+ - Running text ≤65ch; headings `text-wrap: balance`.
53
+
54
+ ## Texture & surface
55
+
56
+ - **Elevation = border, not shadow**: layers separate via 1px `--border` +
57
+ `--panel`/`--panel-2` steps. One soft shadow token exists, for true
58
+ overlays (dialogs, popovers, menus) only.
59
+ - Radii: 6px controls · 8–10px cards · 999px chips/pills. Nothing else.
60
+ - 4px base grid; spacing steps 4/8/12/16/24/32; chips 2×8, dense rows
61
+ 8×12, cards 12–16. Compact by default.
62
+ - Stat tiles: label 12px `--muted` + value 20–28px semibold tabular-nums
63
+ on a quiet `--panel-2` fill or 1px-border card — no gradients, no fills
64
+ with meaning-free color.
65
+ - No decorative containers, no icon noise: if an element doesn't inform
66
+ or act, it doesn't exist.
67
+
68
+ ## Motion tokens
69
+
70
+ - 150–200ms, ease-out, and only where it carries meaning (state
71
+ transition, attention pull); nothing looping, nothing scroll-driven.
72
+ - Hover/press transitions 120ms on background/border/color only — no
73
+ translate/bounce on controls.
74
+ - `prefers-reduced-motion` → transitions off; the UI is fully static-safe.
75
+
76
+ ## Signature motifs
77
+
78
+ - **Glanceability**: every surface answers its question in one glance —
79
+ state → status dot/chip, trend → axis-less sparkline, change → one
80
+ delta line («+4 done · fix deployed»). Detail is one drill-down away.
81
+ - **Honest state**: no fake "connected", no optimistic spinners; degraded
82
+ renders visibly degraded (dimmed pane, banner, chip).
83
+ - Canonical atoms, built once: status dot (7–8px), mono chip (11px, 1px
84
+ border, radius 999), card (panel + border + title row + right chip),
85
+ progress bar (4–5px, border track, accent fill), segmented pill
86
+ controls, empty state = one dim sentence + one action (no
87
+ illustrations).
88
+ - Data tables: 32–36px rows, `--panel-2` sticky header, hairline row
89
+ dividers, right-aligned numeric columns.
90
+
91
+ ## Micro-interactions
92
+
93
+ - Hover on rows/nav: `--panel-2` fill; selected/active: `--accent-weak`
94
+ fill + 2px accent inset indicator.
95
+ - Buttons: primary = accent fill (max one per view); secondary =
96
+ 1px-border ghost; destructive = red-border ghost + confirm. Toggles,
97
+ not checkboxes, for enable/disable.
98
+ - Focus-visible on everything: 2px accent outline, offset 2px; contrast
99
+ ≥ WCAG AA on both themes.
100
+ - Keyboard-first: every primary action reachable via keyboard; ⌘K
101
+ palette as the front door where the product has one.
102
+
103
+ ## Bans
104
+
105
+ - No gradients, no shadows-as-decoration, no glassmorphism, no
106
+ illustrations/mascots, no icon noise, no emojis in product UI.
107
+ - No second accent hue; no semantic color used decoratively; no amber
108
+ outside "needs a human".
109
+ - No display/serif fonts — this is a workbench, not a brand page.
110
+ - No spinners where live state exists; no badge without an action.
111
+ - No cinematic/scroll-driven motion — that belongs to the other packs'
112
+ register.
113
+
114
+ ## Gotchas
115
+
116
+ - Ship light AND dark from day one via the token layer — retrofitting a
117
+ theme later leaves inverted hardcodes (sweep raw hex; consume only
118
+ `var(--…)`).
119
+ - Guard contrast with a test: muted-on-panel-2 combinations silently
120
+ fail AA when tokens drift.
121
+ - One shared Chip/Badge/Button primitive — three inline copies of an
122
+ atom is how a token layer rots.