@nadicodeai/design-system 0.1.0 → 0.2.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/AGENTS.md +3 -2
- package/DESIGN.md +23 -0
- package/README.md +2 -2
- package/dist/css/tokens.generated.css +22 -0
- package/dist/tailwind/nadicode.tailwind.json +23 -1
- package/dist/tailwind/nadicode.theme.css +63 -5
- package/dist/tokens/nadicode.dtcg.json +242 -0
- package/package.json +1 -1
package/AGENTS.md
CHANGED
|
@@ -14,7 +14,7 @@ Plain imperatives are the default. The few hard prohibitions below use `never`/`
|
|
|
14
14
|
- Preserve approved `DESIGN.md` token and component families unless the user explicitly approves a palette/component migration. Website/kernel CSS is implementation evidence, not the complete palette authority; never delete tokens because current prototypes do not use them or because `@google/design.md lint` reports them as unused.
|
|
15
15
|
- Name implemented grids, components, modules, and page elements as NadicodeAI-owned primitives; source brands such as Vercel or Attio may appear only in reference notes, never in component names, CSS comments, `data-module` values, or public-facing contracts.
|
|
16
16
|
- Calculate page grids, module spans, seams, borders, and element placement from explicit grid math; never hand-place visual structure by eye.
|
|
17
|
-
- Author CSS-bundle work as a reusable design-system component architecture first, not as showcase/page-specific code. The design-system CSS lives in `src/css/` (`tokens.generated` [built from `DESIGN.md`] + `tokens.local` [hand-authored] / `reset`/`foundation`/`motion`/`layout`/`primitives` + `components/*`, mirrored to `dist/css/` and exported as `@nadicodeai/design-system/css`). Since the Tailwind+shadcn migration (ADR 0007) the bundle ships only framework-agnostic brand/display CSS components: the cascade is `@layer tokens, reset, foundation, motion, layout, primitives, components;` (no `sections` layer), and `components/*` holds the agent-chat CSS component family, the run-state `state-tag` family, and `image` — the generic marketing/SaaS component CSS and the whole `sections/*` layer retired to React shadcn components in `@nadicodeai/ui`. The delivery tiers map to real authoring homes: tokens → `tokens.generated`/`tokens.local`; page grammar → `layout.css`; CSS primitives/components → `primitives.css` + `components/*`; specimens → `examples/`. Contracted CSS components are paired with `DESIGN.md components:` entries; the three named CSS-internal components are deliberate no-token exceptions. Pages, site-specific page assemblies, and the standard/interactive/section UI belong to consuming surfaces (`../website/`, `../portal/`, sibling Nadia apps) and to the React package (`@nadicodeai/ui`), not this package. Study current source HTML/CSS for approved external references before implementing similar NadicodeAI primitives, then adapt the structure into NadicodeAI-owned tokens, primitives, and components. Specimen HTML demonstrates only already-defined primitives/components; it never invents component geometry, seams, borders, fillers, heights, or responsive behavior inline. The generated token layer (`tokens.generated.css`) and the Tailwind adapter (`nadicode.theme.css`) are emitted by Style Dictionary (`scripts/sd/`, driven from `scripts/build.ts`) as a complete projection of the `@google/design.md` export — never an allowlist or subset; responsive `@media` switching and composed/`calc` vars live in `layout.css`/`tokens.local.css` and reference emitted `--nc-*` tokens only, while the `.nc-type-*` utility classes live in `foundation.css`. Emitted-but-unreferenced tokens are intentional (the contract drives emission, not consumption), and the generated Tailwind adapter
|
|
17
|
+
- Author CSS-bundle work as a reusable design-system component architecture first, not as showcase/page-specific code. The design-system CSS lives in `src/css/` (`tokens.generated` [built from `DESIGN.md`] + `tokens.local` [hand-authored] / `reset`/`foundation`/`motion`/`layout`/`primitives` + `components/*`, mirrored to `dist/css/` and exported as `@nadicodeai/design-system/css`). Since the Tailwind+shadcn migration (ADR 0007) the bundle ships only framework-agnostic brand/display CSS components: the cascade is `@layer tokens, reset, foundation, motion, layout, primitives, components;` (no `sections` layer), and `components/*` holds the agent-chat CSS component family, the run-state `state-tag` family, and `image` — the generic marketing/SaaS component CSS and the whole `sections/*` layer retired to React shadcn components in `@nadicodeai/ui`. The delivery tiers map to real authoring homes: tokens → `tokens.generated`/`tokens.local`; page grammar → `layout.css`; CSS primitives/components → `primitives.css` + `components/*`; specimens → `examples/`. Contracted CSS components are paired with `DESIGN.md components:` entries; the three named CSS-internal components are deliberate no-token exceptions. Pages, site-specific page assemblies, and the standard/interactive/section UI belong to consuming surfaces (`../website/`, `../portal/`, sibling Nadia apps) and to the React package (`@nadicodeai/ui`), not this package. Study current source HTML/CSS for approved external references before implementing similar NadicodeAI primitives, then adapt the structure into NadicodeAI-owned tokens, primitives, and components. Specimen HTML demonstrates only already-defined primitives/components; it never invents component geometry, seams, borders, fillers, heights, or responsive behavior inline. The generated token layer (`tokens.generated.css`) and the Tailwind adapter (`nadicode.theme.css`) are emitted by Style Dictionary (`scripts/sd/`, driven from `scripts/build.ts`) as a complete projection of the `@google/design.md` export — never an allowlist or subset; responsive `@media` switching and composed/`calc` vars live in `layout.css`/`tokens.local.css` and reference emitted `--nc-*` tokens only, while the `.nc-type-*` utility classes live in `foundation.css`. Emitted-but-unreferenced tokens are intentional (the contract drives emission, not consumption), and the generated Tailwind adapter owns standard shadcn role maps for both `:root` and `.dark` using only generated `--color-*`/`--radius-*` references; `@nadicodeai/ui/globals.css` keeps the Tailwind role bridge plus UI-local product aliases. Correctness is enforced by export-derived structural parity (`tests/token-structural-parity.test.ts` for the `--nc-*` layer; the per-token `@theme` value loops and light/dark role-integrity checks in `tests/tailwind-v4-theme.test.ts` for the adapter), the narrowed two-way parity between `DESIGN.md` component YAML/prose and the retained CSS component surface (`tests/components-yaml-matches-css.test.ts`, ADR 0007 D4), plus consumer discipline (`tests/consumer-css-discipline.test.ts`), not a byte snapshot (ADR 0006 supersedes ADR 0005 D1–D3/D5; ADR 0008 supersedes ADR 0005 D4).
|
|
18
18
|
- Follow a source-first reference workflow for external visual references: inspect live/source DOM, stylesheet/CSSOM rules, inline styles, custom properties, computed styles, grid tracks, spans, seam ownership, colors, heights, and breakpoints before writing NadicodeAI code. Screenshots are verification evidence only after implementation; never use them as the source for authoring structure, geometry, or CSS.
|
|
19
19
|
- Never derive reusable kernel geometry from screenshots, eyeballing, one-off browser coordinates, or local patch experiments. Browser measurements may verify an implementation after the source CSS/DOM model is understood, but they do not replace reading the source rules that create the behavior.
|
|
20
20
|
- Map every imported visual behavior to either `DESIGN.md`, an existing kernel token/primitive, or an explicit user-approved change before implementation. If the reference leaves a required decision open, or if `DESIGN.md` does not decide it, ask before coding the missing decision, including height/row span, surface color, visual payload, content slots, crosshair placement, and responsive behavior.
|
|
@@ -33,6 +33,7 @@ Generated-artifact and runtime-JS prohibitions live in the Forbidden Patterns ta
|
|
|
33
33
|
- Treat `src/assets/` as the source for exported brand SVG assets.
|
|
34
34
|
- Treat `dist/icons/` as a generated icon set baked from the pinned `lucide-static` dependency by `npm run generate:icons` (also run inside `npm run build`) and exported via `./icons/*`; regenerate by bumping `lucide-static`, never hand-edit.
|
|
35
35
|
- Treat `../docs/experiments/**` as the archived `design-canvas/` prototype source-of-record (the chat-motion/component prototypes that `src/css/motion.css`, `src/js/chat-autoplay.js`, and `tests/chat-showcase.test.ts` re-express); never treat it as the package build, runtime component surface, or normative brand contract.
|
|
36
|
+
- Any change to package-consumed output (`DESIGN.md`, generated tokens, CSS bundle, Tailwind theme output, package exports, assets, package docs, or agent instructions) must end with an explicit npm release decision before handoff. If the change should reach external consumers, bump `@nadicodeai/design-system`, run `npm pack --dry-run -w @nadicodeai/design-system`, and follow `../docs/agents/npm-publishing.md`. When `@nadicodeai/ui` consumes the changed output, publish `@nadicodeai/design-system` first, then bump/update/publish `@nadicodeai/ui`. Never claim the package is shipped to npm until `npm view @nadicodeai/design-system version` reports the intended version.
|
|
36
37
|
|
|
37
38
|
## Task Routing
|
|
38
39
|
|
|
@@ -64,7 +65,7 @@ Generated-artifact and runtime-JS prohibitions live in the Forbidden Patterns ta
|
|
|
64
65
|
| --- | --- | --- |
|
|
65
66
|
| Editing `dist/**` or `src/css/tokens.generated.css` directly | Edit `DESIGN.md`, then run `npm run build`; hand-authored token CSS goes in `src/css/tokens.local.css` | Both are generated from `DESIGN.md`; hand edits are overwritten on the next build |
|
|
66
67
|
| Hand-listing which tokens reach the CSS layer (an allowlist, "runtime subset", rename, or any `@media`/`calc` in `tokens.generated.css`) | Style Dictionary (`scripts/sd/`) emits a complete projection of the `@google/design.md` export: every token `--nc-<exact-name>: <exact-value>`, each name once. Responsive switching and composed/`calc` vars are hand-authored in `layout.css`/`tokens.local.css` and reference emitted `--nc-*` only | The export is the contract; a differing subset is drift. `token-structural-parity.test.ts` (export-derived) fails on any dropped/renamed/added/modified/duplicated var, a name collision, a non-px line-height, or any `@media`/`calc` in the generated layer (ADR 0006) |
|
|
67
|
-
| Hardcoding a color/radius/dimension in `src/css`, `examples/`, or the Tailwind adapter that duplicates or extends a token — including a `var(--token, <hex==its value>)` fallback | Reference the emitted token: `var(--nc-<name>)` / `var(--color-<name>)`. A new value goes to `DESIGN.md` first. There is no exception island: the system ships zero out-of-contract values, and the generated Tailwind adapter
|
|
68
|
+
| Hardcoding a color/radius/dimension in `src/css`, `examples/`, or the Tailwind adapter that duplicates or extends a token — including a `var(--token, <hex==its value>)` fallback | Reference the emitted token: `var(--nc-<name>)` / `var(--color-<name>)`. A new value goes to `DESIGN.md` first. There is no exception island: the system ships zero out-of-contract values, and the generated Tailwind adapter may ship light/dark role remaps only when every role value references generated `--color-*`/`--radius-*` tokens. Export-anchored generated aliases such as `--color-nadicode-muted` may duplicate the exported value only when a `var()` reference would collide with a downstream semantic bridge; these aliases must be generated from `DESIGN.md` through `scripts/sd/` and covered by tests. UI package `.dark` aliases must reference generated tokens or semantic roles | No second hand-authored value source may exist; the no-raw-literal and no-second-value-source guards in `consumer-css-discipline.test.ts` forbid duplicate values, fallback-encoded or not, outside the generated export-anchored aliases described here (ADR 0006; light/dark role maps per ADR 0008) |
|
|
68
69
|
| "Cleaning up" emitted-but-unreferenced tokens or the responsive alias block | Leave them. Emitted-unreferenced tokens (orphans) are the intended steady state — the contract drives emission, not consumption. Never add an orphan-detection test or delete a token/alias because no prototype uses it | The contract is the palette authority; consumption is not. Deleting unused tokens is the exact silent-removal the boundary rules forbid (ADR 0006) |
|
|
69
70
|
| Adding `render:showcase`, e2e, examples, registry, AI-Elements, or a second runtime JS file | Keep the package to `DESIGN.md`, assets, token/CSS exports, and the single vanilla `src/js/chat-autoplay.js` enhancer (exported via `./css/*`) | Those surfaces were intentionally removed; only the one dependency-free chat auto-play enhancer is carved out |
|
|
70
71
|
| Inventing token or component behavior | Read `DESIGN.md` | The brand contract is single-source |
|
package/DESIGN.md
CHANGED
|
@@ -44,6 +44,28 @@ colors:
|
|
|
44
44
|
state-review: "#f5a623"
|
|
45
45
|
state-blocked: "#b80022"
|
|
46
46
|
state-complete: "#008c45"
|
|
47
|
+
dark-canvas: "#101414"
|
|
48
|
+
dark-canvas-soft: "#151b19"
|
|
49
|
+
dark-canvas-soft-2: "#1d2522"
|
|
50
|
+
dark-ink: "#f5f7f4"
|
|
51
|
+
dark-body: "#c8d0cb"
|
|
52
|
+
dark-muted: "#8d9892"
|
|
53
|
+
dark-line: "#2c3632"
|
|
54
|
+
dark-seam: "#24302b"
|
|
55
|
+
dark-primary: "#ecf4ee"
|
|
56
|
+
dark-on-primary: "#101414"
|
|
57
|
+
dark-link: "#7ee7c6"
|
|
58
|
+
dark-link-deep: "#b8ffe5"
|
|
59
|
+
dark-link-bg-soft: "#163f34"
|
|
60
|
+
dark-error: "#ff7a8b"
|
|
61
|
+
dark-error-soft: "#4b1821"
|
|
62
|
+
dark-error-deep: "#ffb3bd"
|
|
63
|
+
dark-warning: "#ffd28a"
|
|
64
|
+
dark-warning-soft: "#4a3219"
|
|
65
|
+
dark-warning-deep: "#ffe6b8"
|
|
66
|
+
dark-cyan: "#83f7dc"
|
|
67
|
+
dark-cyan-soft: "#b8ffe5"
|
|
68
|
+
dark-cyan-deep: "#49c6a8"
|
|
47
69
|
|
|
48
70
|
typography:
|
|
49
71
|
display-xl:
|
|
@@ -377,6 +399,7 @@ The palette keeps the broad neutral, accent, state, and gradient families that N
|
|
|
377
399
|
- **Flag Red** (`{colors.flag-red}`): a decorative Italian-flag red reserved for brand-asset decoration only (identity marks such as Nadia's flag-red bar). It is distinct from `{colors.error}`; never use `flag-red` for destructive, blocked, or validation states.
|
|
378
400
|
- **Gradient Pairs** (`{colors.gradient-develop-*}`, `{colors.gradient-ship-*}`): reserved gradient vocabulary for artifact- and asset-level energy; do not use them to repair page structure or seams.
|
|
379
401
|
- **Workflow States** (`{colors.state-ready}`, `{colors.state-running}`, `{colors.state-review}`, `{colors.state-blocked}`, `{colors.state-complete}`): left-border/state vocabulary for agentic work surfaces.
|
|
402
|
+
- **Dark Primitives** (`{colors.dark-canvas}`, `{colors.dark-ink}`, `{colors.dark-line}`, and siblings): the source tokens for the generated shadcn `.dark` role map. They are mode-bearing primitives, not a separate component palette; consuming apps opt into them by applying a `.dark` ancestor through their runtime theme provider.
|
|
380
403
|
|
|
381
404
|
Do not delete a color because the current website kernel does not consume it. Prototype usage is not palette authority; removals require an explicit palette migration decision.
|
|
382
405
|
|
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@ For Tailwind CSS v4 CSS-first projects, `npm run build` also emits `dist/tailwin
|
|
|
11
11
|
@import "@nadicodeai/design-system/tailwind/theme.css";
|
|
12
12
|
```
|
|
13
13
|
|
|
14
|
-
The CSS adapter provides shadcn-compatible semantic utilities such as `bg-background`, `text-foreground`, `bg-primary`, `text-primary-foreground`, `border-border`, and `ring-ring`. NadicodeAI-specific spacing utilities are namespaced, for example `p-nadicode-lg` and `h-nadicode-h-cell-sm`, so standard Tailwind/shadcn classes such as `max-w-3xl` keep their normal Tailwind behavior. React consumers normally get this through `@nadicodeai/ui/globals.css`.
|
|
14
|
+
The CSS adapter provides shadcn-compatible semantic utilities such as `bg-background`, `text-foreground`, `bg-primary`, `text-primary-foreground`, `border-border`, and `ring-ring`. It publishes both `:root` light roles and `.dark` dark roles; consuming apps opt into dark mode by applying a `.dark` ancestor, normally through their own theme provider. NadicodeAI-specific spacing utilities are namespaced, for example `p-nadicode-lg` and `h-nadicode-h-cell-sm`, so standard Tailwind/shadcn classes such as `max-w-3xl` keep their normal Tailwind behavior. React consumers normally get this through `@nadicodeai/ui/globals.css`.
|
|
15
15
|
|
|
16
16
|
Geist and Geist Mono (SIL Open Font License 1.1) ship inside the package under `src/assets/fonts/`. Consumers can pull the `@font-face` shim directly:
|
|
17
17
|
|
|
@@ -61,7 +61,7 @@ Because the order is declared data, consumer overrides are predictable: layer yo
|
|
|
61
61
|
|
|
62
62
|
The `/css` bundle and the Tailwind `theme.css` adapter are complementary:
|
|
63
63
|
|
|
64
|
-
- `@nadicodeai/design-system/tailwind/theme.css` publishes the shadcn `:root` token variables (the semantic `bg-background` / `text-foreground` / `border-border` family), so interactive shadcn app islands land on-brand when they need JS-driven accessibility behavior such as dialogs or comboboxes.
|
|
64
|
+
- `@nadicodeai/design-system/tailwind/theme.css` publishes the shadcn `:root` and `.dark` token variables (the semantic `bg-background` / `text-foreground` / `border-border` family), so interactive shadcn app islands land on-brand when they need JS-driven accessibility behavior such as dialogs or comboboxes.
|
|
65
65
|
- The `/css` bundle ships NadicodeAI's framework-agnostic page grammar, CSS components, brand motion contract, and agent-chat surfaces.
|
|
66
66
|
- `@nadicodeai/ui` ships the React shadcn-style components and reusable section/app compositions on top of those tokens and CSS components.
|
|
67
67
|
|
|
@@ -41,6 +41,28 @@
|
|
|
41
41
|
--nc-state-review: #f5a623;
|
|
42
42
|
--nc-state-blocked: #b80022;
|
|
43
43
|
--nc-state-complete: #008c45;
|
|
44
|
+
--nc-dark-canvas: #101414;
|
|
45
|
+
--nc-dark-canvas-soft: #151b19;
|
|
46
|
+
--nc-dark-canvas-soft-2: #1d2522;
|
|
47
|
+
--nc-dark-ink: #f5f7f4;
|
|
48
|
+
--nc-dark-body: #c8d0cb;
|
|
49
|
+
--nc-dark-muted: #8d9892;
|
|
50
|
+
--nc-dark-line: #2c3632;
|
|
51
|
+
--nc-dark-seam: #24302b;
|
|
52
|
+
--nc-dark-primary: #ecf4ee;
|
|
53
|
+
--nc-dark-on-primary: #101414;
|
|
54
|
+
--nc-dark-link: #7ee7c6;
|
|
55
|
+
--nc-dark-link-deep: #b8ffe5;
|
|
56
|
+
--nc-dark-link-bg-soft: #163f34;
|
|
57
|
+
--nc-dark-error: #ff7a8b;
|
|
58
|
+
--nc-dark-error-soft: #4b1821;
|
|
59
|
+
--nc-dark-error-deep: #ffb3bd;
|
|
60
|
+
--nc-dark-warning: #ffd28a;
|
|
61
|
+
--nc-dark-warning-soft: #4a3219;
|
|
62
|
+
--nc-dark-warning-deep: #ffe6b8;
|
|
63
|
+
--nc-dark-cyan: #83f7dc;
|
|
64
|
+
--nc-dark-cyan-soft: #b8ffe5;
|
|
65
|
+
--nc-dark-cyan-deep: #49c6a8;
|
|
44
66
|
|
|
45
67
|
/* Spacing */
|
|
46
68
|
--nc-xxs: 4px;
|
|
@@ -37,7 +37,29 @@
|
|
|
37
37
|
"state-running": "#007a5e",
|
|
38
38
|
"state-review": "#f5a623",
|
|
39
39
|
"state-blocked": "#b80022",
|
|
40
|
-
"state-complete": "#008c45"
|
|
40
|
+
"state-complete": "#008c45",
|
|
41
|
+
"dark-canvas": "#101414",
|
|
42
|
+
"dark-canvas-soft": "#151b19",
|
|
43
|
+
"dark-canvas-soft-2": "#1d2522",
|
|
44
|
+
"dark-ink": "#f5f7f4",
|
|
45
|
+
"dark-body": "#c8d0cb",
|
|
46
|
+
"dark-muted": "#8d9892",
|
|
47
|
+
"dark-line": "#2c3632",
|
|
48
|
+
"dark-seam": "#24302b",
|
|
49
|
+
"dark-primary": "#ecf4ee",
|
|
50
|
+
"dark-on-primary": "#101414",
|
|
51
|
+
"dark-link": "#7ee7c6",
|
|
52
|
+
"dark-link-deep": "#b8ffe5",
|
|
53
|
+
"dark-link-bg-soft": "#163f34",
|
|
54
|
+
"dark-error": "#ff7a8b",
|
|
55
|
+
"dark-error-soft": "#4b1821",
|
|
56
|
+
"dark-error-deep": "#ffb3bd",
|
|
57
|
+
"dark-warning": "#ffd28a",
|
|
58
|
+
"dark-warning-soft": "#4a3219",
|
|
59
|
+
"dark-warning-deep": "#ffe6b8",
|
|
60
|
+
"dark-cyan": "#83f7dc",
|
|
61
|
+
"dark-cyan-soft": "#b8ffe5",
|
|
62
|
+
"dark-cyan-deep": "#49c6a8"
|
|
41
63
|
},
|
|
42
64
|
"fontFamily": {
|
|
43
65
|
"display-xl": [
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* Generated by Style Dictionary (scripts/sd) from the @google/design.md Tailwind export. */
|
|
2
2
|
/* Do not edit directly. Run npm run build. */
|
|
3
3
|
|
|
4
|
-
/* === SHADCN ADAPTER: light roles → references to faithful brand tokens
|
|
4
|
+
/* === SHADCN ADAPTER: light/dark roles → references to faithful brand tokens. === */
|
|
5
5
|
:root {
|
|
6
6
|
--radius: var(--radius-md);
|
|
7
7
|
--background: var(--color-canvas);
|
|
@@ -10,12 +10,12 @@
|
|
|
10
10
|
--card-foreground: var(--color-ink);
|
|
11
11
|
--popover: var(--color-canvas);
|
|
12
12
|
--popover-foreground: var(--color-ink);
|
|
13
|
-
--primary: var(--color-
|
|
13
|
+
--primary: var(--color-ink);
|
|
14
14
|
--primary-foreground: var(--color-on-primary);
|
|
15
15
|
--secondary: var(--color-canvas-soft);
|
|
16
16
|
--secondary-foreground: var(--color-ink);
|
|
17
17
|
--muted: var(--color-canvas-soft);
|
|
18
|
-
--muted-foreground: var(--color-muted);
|
|
18
|
+
--muted-foreground: var(--color-nadicode-muted);
|
|
19
19
|
--accent: var(--color-canvas-soft-2);
|
|
20
20
|
--accent-foreground: var(--color-ink);
|
|
21
21
|
--destructive: var(--color-error);
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
--chart-5: var(--color-error);
|
|
31
31
|
--sidebar: var(--color-canvas-soft);
|
|
32
32
|
--sidebar-foreground: var(--color-ink);
|
|
33
|
-
--sidebar-primary: var(--color-
|
|
33
|
+
--sidebar-primary: var(--color-ink);
|
|
34
34
|
--sidebar-primary-foreground: var(--color-on-primary);
|
|
35
35
|
--sidebar-accent: var(--color-canvas-soft-2);
|
|
36
36
|
--sidebar-accent-foreground: var(--color-ink);
|
|
@@ -38,6 +38,42 @@
|
|
|
38
38
|
--sidebar-ring: var(--color-link);
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
+
.dark {
|
|
42
|
+
--radius: var(--radius-md);
|
|
43
|
+
--background: var(--color-dark-canvas);
|
|
44
|
+
--foreground: var(--color-dark-ink);
|
|
45
|
+
--card: var(--color-dark-canvas-soft);
|
|
46
|
+
--card-foreground: var(--color-dark-ink);
|
|
47
|
+
--popover: var(--color-dark-canvas-soft);
|
|
48
|
+
--popover-foreground: var(--color-dark-ink);
|
|
49
|
+
--primary: var(--color-dark-primary);
|
|
50
|
+
--primary-foreground: var(--color-dark-on-primary);
|
|
51
|
+
--secondary: var(--color-dark-canvas-soft);
|
|
52
|
+
--secondary-foreground: var(--color-dark-ink);
|
|
53
|
+
--muted: var(--color-dark-canvas-soft);
|
|
54
|
+
--muted-foreground: var(--color-dark-muted);
|
|
55
|
+
--accent: var(--color-dark-canvas-soft-2);
|
|
56
|
+
--accent-foreground: var(--color-dark-ink);
|
|
57
|
+
--destructive: var(--color-dark-error);
|
|
58
|
+
--destructive-foreground: var(--color-dark-on-primary);
|
|
59
|
+
--border: var(--color-dark-line);
|
|
60
|
+
--input: var(--color-dark-line);
|
|
61
|
+
--ring: var(--color-dark-link);
|
|
62
|
+
--chart-1: var(--color-dark-link);
|
|
63
|
+
--chart-2: var(--color-dark-cyan);
|
|
64
|
+
--chart-3: var(--color-dark-warning);
|
|
65
|
+
--chart-4: var(--color-dark-link-deep);
|
|
66
|
+
--chart-5: var(--color-dark-error);
|
|
67
|
+
--sidebar: var(--color-dark-canvas-soft);
|
|
68
|
+
--sidebar-foreground: var(--color-dark-ink);
|
|
69
|
+
--sidebar-primary: var(--color-dark-primary);
|
|
70
|
+
--sidebar-primary-foreground: var(--color-dark-on-primary);
|
|
71
|
+
--sidebar-accent: var(--color-dark-canvas-soft-2);
|
|
72
|
+
--sidebar-accent-foreground: var(--color-dark-ink);
|
|
73
|
+
--sidebar-border: var(--color-dark-line);
|
|
74
|
+
--sidebar-ring: var(--color-dark-link);
|
|
75
|
+
}
|
|
76
|
+
|
|
41
77
|
:root {
|
|
42
78
|
--nadicode-spacing-xxs: var(--spacing-nadicode-xxs);
|
|
43
79
|
--nadicode-spacing-xs: var(--spacing-nadicode-xs);
|
|
@@ -136,7 +172,29 @@
|
|
|
136
172
|
--color-state-review: #f5a623;
|
|
137
173
|
--color-state-blocked: #b80022;
|
|
138
174
|
--color-state-complete: #008c45;
|
|
139
|
-
--color-
|
|
175
|
+
--color-dark-canvas: #101414;
|
|
176
|
+
--color-dark-canvas-soft: #151b19;
|
|
177
|
+
--color-dark-canvas-soft-2: #1d2522;
|
|
178
|
+
--color-dark-ink: #f5f7f4;
|
|
179
|
+
--color-dark-body: #c8d0cb;
|
|
180
|
+
--color-dark-muted: #8d9892;
|
|
181
|
+
--color-dark-line: #2c3632;
|
|
182
|
+
--color-dark-seam: #24302b;
|
|
183
|
+
--color-dark-primary: #ecf4ee;
|
|
184
|
+
--color-dark-on-primary: #101414;
|
|
185
|
+
--color-dark-link: #7ee7c6;
|
|
186
|
+
--color-dark-link-deep: #b8ffe5;
|
|
187
|
+
--color-dark-link-bg-soft: #163f34;
|
|
188
|
+
--color-dark-error: #ff7a8b;
|
|
189
|
+
--color-dark-error-soft: #4b1821;
|
|
190
|
+
--color-dark-error-deep: #ffb3bd;
|
|
191
|
+
--color-dark-warning: #ffd28a;
|
|
192
|
+
--color-dark-warning-soft: #4a3219;
|
|
193
|
+
--color-dark-warning-deep: #ffe6b8;
|
|
194
|
+
--color-dark-cyan: #83f7dc;
|
|
195
|
+
--color-dark-cyan-soft: #b8ffe5;
|
|
196
|
+
--color-dark-cyan-deep: #49c6a8;
|
|
197
|
+
--color-nadicode-muted: #888888;
|
|
140
198
|
--font-display-xl: Geist, Inter, system-ui, -apple-system, sans-serif;
|
|
141
199
|
--font-display-lg: Geist, Inter, system-ui, -apple-system, sans-serif;
|
|
142
200
|
--font-display-md: Geist, Inter, system-ui, -apple-system, sans-serif;
|
|
@@ -399,6 +399,248 @@
|
|
|
399
399
|
],
|
|
400
400
|
"hex": "#008c45"
|
|
401
401
|
}
|
|
402
|
+
},
|
|
403
|
+
"dark-canvas": {
|
|
404
|
+
"$value": {
|
|
405
|
+
"colorSpace": "srgb",
|
|
406
|
+
"components": [
|
|
407
|
+
0.063,
|
|
408
|
+
0.078,
|
|
409
|
+
0.078
|
|
410
|
+
],
|
|
411
|
+
"hex": "#101414"
|
|
412
|
+
}
|
|
413
|
+
},
|
|
414
|
+
"dark-canvas-soft": {
|
|
415
|
+
"$value": {
|
|
416
|
+
"colorSpace": "srgb",
|
|
417
|
+
"components": [
|
|
418
|
+
0.082,
|
|
419
|
+
0.106,
|
|
420
|
+
0.098
|
|
421
|
+
],
|
|
422
|
+
"hex": "#151b19"
|
|
423
|
+
}
|
|
424
|
+
},
|
|
425
|
+
"dark-canvas-soft-2": {
|
|
426
|
+
"$value": {
|
|
427
|
+
"colorSpace": "srgb",
|
|
428
|
+
"components": [
|
|
429
|
+
0.114,
|
|
430
|
+
0.145,
|
|
431
|
+
0.133
|
|
432
|
+
],
|
|
433
|
+
"hex": "#1d2522"
|
|
434
|
+
}
|
|
435
|
+
},
|
|
436
|
+
"dark-ink": {
|
|
437
|
+
"$value": {
|
|
438
|
+
"colorSpace": "srgb",
|
|
439
|
+
"components": [
|
|
440
|
+
0.961,
|
|
441
|
+
0.969,
|
|
442
|
+
0.957
|
|
443
|
+
],
|
|
444
|
+
"hex": "#f5f7f4"
|
|
445
|
+
}
|
|
446
|
+
},
|
|
447
|
+
"dark-body": {
|
|
448
|
+
"$value": {
|
|
449
|
+
"colorSpace": "srgb",
|
|
450
|
+
"components": [
|
|
451
|
+
0.784,
|
|
452
|
+
0.816,
|
|
453
|
+
0.796
|
|
454
|
+
],
|
|
455
|
+
"hex": "#c8d0cb"
|
|
456
|
+
}
|
|
457
|
+
},
|
|
458
|
+
"dark-muted": {
|
|
459
|
+
"$value": {
|
|
460
|
+
"colorSpace": "srgb",
|
|
461
|
+
"components": [
|
|
462
|
+
0.553,
|
|
463
|
+
0.596,
|
|
464
|
+
0.573
|
|
465
|
+
],
|
|
466
|
+
"hex": "#8d9892"
|
|
467
|
+
}
|
|
468
|
+
},
|
|
469
|
+
"dark-line": {
|
|
470
|
+
"$value": {
|
|
471
|
+
"colorSpace": "srgb",
|
|
472
|
+
"components": [
|
|
473
|
+
0.173,
|
|
474
|
+
0.212,
|
|
475
|
+
0.196
|
|
476
|
+
],
|
|
477
|
+
"hex": "#2c3632"
|
|
478
|
+
}
|
|
479
|
+
},
|
|
480
|
+
"dark-seam": {
|
|
481
|
+
"$value": {
|
|
482
|
+
"colorSpace": "srgb",
|
|
483
|
+
"components": [
|
|
484
|
+
0.141,
|
|
485
|
+
0.188,
|
|
486
|
+
0.169
|
|
487
|
+
],
|
|
488
|
+
"hex": "#24302b"
|
|
489
|
+
}
|
|
490
|
+
},
|
|
491
|
+
"dark-primary": {
|
|
492
|
+
"$value": {
|
|
493
|
+
"colorSpace": "srgb",
|
|
494
|
+
"components": [
|
|
495
|
+
0.925,
|
|
496
|
+
0.957,
|
|
497
|
+
0.933
|
|
498
|
+
],
|
|
499
|
+
"hex": "#ecf4ee"
|
|
500
|
+
}
|
|
501
|
+
},
|
|
502
|
+
"dark-on-primary": {
|
|
503
|
+
"$value": {
|
|
504
|
+
"colorSpace": "srgb",
|
|
505
|
+
"components": [
|
|
506
|
+
0.063,
|
|
507
|
+
0.078,
|
|
508
|
+
0.078
|
|
509
|
+
],
|
|
510
|
+
"hex": "#101414"
|
|
511
|
+
}
|
|
512
|
+
},
|
|
513
|
+
"dark-link": {
|
|
514
|
+
"$value": {
|
|
515
|
+
"colorSpace": "srgb",
|
|
516
|
+
"components": [
|
|
517
|
+
0.494,
|
|
518
|
+
0.906,
|
|
519
|
+
0.776
|
|
520
|
+
],
|
|
521
|
+
"hex": "#7ee7c6"
|
|
522
|
+
}
|
|
523
|
+
},
|
|
524
|
+
"dark-link-deep": {
|
|
525
|
+
"$value": {
|
|
526
|
+
"colorSpace": "srgb",
|
|
527
|
+
"components": [
|
|
528
|
+
0.722,
|
|
529
|
+
1,
|
|
530
|
+
0.898
|
|
531
|
+
],
|
|
532
|
+
"hex": "#b8ffe5"
|
|
533
|
+
}
|
|
534
|
+
},
|
|
535
|
+
"dark-link-bg-soft": {
|
|
536
|
+
"$value": {
|
|
537
|
+
"colorSpace": "srgb",
|
|
538
|
+
"components": [
|
|
539
|
+
0.086,
|
|
540
|
+
0.247,
|
|
541
|
+
0.204
|
|
542
|
+
],
|
|
543
|
+
"hex": "#163f34"
|
|
544
|
+
}
|
|
545
|
+
},
|
|
546
|
+
"dark-error": {
|
|
547
|
+
"$value": {
|
|
548
|
+
"colorSpace": "srgb",
|
|
549
|
+
"components": [
|
|
550
|
+
1,
|
|
551
|
+
0.478,
|
|
552
|
+
0.545
|
|
553
|
+
],
|
|
554
|
+
"hex": "#ff7a8b"
|
|
555
|
+
}
|
|
556
|
+
},
|
|
557
|
+
"dark-error-soft": {
|
|
558
|
+
"$value": {
|
|
559
|
+
"colorSpace": "srgb",
|
|
560
|
+
"components": [
|
|
561
|
+
0.294,
|
|
562
|
+
0.094,
|
|
563
|
+
0.129
|
|
564
|
+
],
|
|
565
|
+
"hex": "#4b1821"
|
|
566
|
+
}
|
|
567
|
+
},
|
|
568
|
+
"dark-error-deep": {
|
|
569
|
+
"$value": {
|
|
570
|
+
"colorSpace": "srgb",
|
|
571
|
+
"components": [
|
|
572
|
+
1,
|
|
573
|
+
0.702,
|
|
574
|
+
0.741
|
|
575
|
+
],
|
|
576
|
+
"hex": "#ffb3bd"
|
|
577
|
+
}
|
|
578
|
+
},
|
|
579
|
+
"dark-warning": {
|
|
580
|
+
"$value": {
|
|
581
|
+
"colorSpace": "srgb",
|
|
582
|
+
"components": [
|
|
583
|
+
1,
|
|
584
|
+
0.824,
|
|
585
|
+
0.541
|
|
586
|
+
],
|
|
587
|
+
"hex": "#ffd28a"
|
|
588
|
+
}
|
|
589
|
+
},
|
|
590
|
+
"dark-warning-soft": {
|
|
591
|
+
"$value": {
|
|
592
|
+
"colorSpace": "srgb",
|
|
593
|
+
"components": [
|
|
594
|
+
0.29,
|
|
595
|
+
0.196,
|
|
596
|
+
0.098
|
|
597
|
+
],
|
|
598
|
+
"hex": "#4a3219"
|
|
599
|
+
}
|
|
600
|
+
},
|
|
601
|
+
"dark-warning-deep": {
|
|
602
|
+
"$value": {
|
|
603
|
+
"colorSpace": "srgb",
|
|
604
|
+
"components": [
|
|
605
|
+
1,
|
|
606
|
+
0.902,
|
|
607
|
+
0.722
|
|
608
|
+
],
|
|
609
|
+
"hex": "#ffe6b8"
|
|
610
|
+
}
|
|
611
|
+
},
|
|
612
|
+
"dark-cyan": {
|
|
613
|
+
"$value": {
|
|
614
|
+
"colorSpace": "srgb",
|
|
615
|
+
"components": [
|
|
616
|
+
0.514,
|
|
617
|
+
0.969,
|
|
618
|
+
0.863
|
|
619
|
+
],
|
|
620
|
+
"hex": "#83f7dc"
|
|
621
|
+
}
|
|
622
|
+
},
|
|
623
|
+
"dark-cyan-soft": {
|
|
624
|
+
"$value": {
|
|
625
|
+
"colorSpace": "srgb",
|
|
626
|
+
"components": [
|
|
627
|
+
0.722,
|
|
628
|
+
1,
|
|
629
|
+
0.898
|
|
630
|
+
],
|
|
631
|
+
"hex": "#b8ffe5"
|
|
632
|
+
}
|
|
633
|
+
},
|
|
634
|
+
"dark-cyan-deep": {
|
|
635
|
+
"$value": {
|
|
636
|
+
"colorSpace": "srgb",
|
|
637
|
+
"components": [
|
|
638
|
+
0.286,
|
|
639
|
+
0.776,
|
|
640
|
+
0.659
|
|
641
|
+
],
|
|
642
|
+
"hex": "#49c6a8"
|
|
643
|
+
}
|
|
402
644
|
}
|
|
403
645
|
},
|
|
404
646
|
"spacing": {
|