@nadicodeai/design-system 0.6.0 → 0.7.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 +1 -1
- package/DESIGN.md +56 -20
- package/dist/css/components/agent-avatar.css +15 -5
- package/dist/css/components/approval-gate.css +8 -6
- package/dist/css/components/artifact-preview.css +17 -5
- package/dist/css/components/chat-bubble-agent.css +15 -5
- package/dist/css/components/chat-thread.css +5 -4
- package/dist/css/components/handoff-banner.css +1 -1
- package/dist/css/components/run-timeline.css +36 -11
- package/dist/css/components/state-row.css +15 -5
- package/dist/css/components/state-tag.css +4 -3
- package/dist/css/components/status-tag.css +101 -0
- package/dist/css/components/tool-call-trace.css +1 -1
- package/dist/css/components/typing-dots.css +15 -5
- package/dist/css/foundation.css +8 -0
- package/dist/css/index.css +6 -2
- package/dist/css/layout.css +7 -8
- package/dist/css/primitives.css +11 -28
- package/dist/css/tokens.generated.css +5 -0
- package/dist/tailwind/nadicode.tailwind.json +11 -0
- package/dist/tailwind/nadicode.theme.css +8 -0
- package/dist/tokens/nadicode.dtcg.json +16 -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 owns standard shadcn role maps for both `:root` and `.dark` using generated `--color-*`/`--radius-*` references, plus a small set of `--nc-*` remaps in the `.dark` block (the `state-*`, `selection-*`, and `cross` families → their `--nc-dark-*` counterparts) so design-system CSS components that read those raw brand tokens directly flip on the dark console; `@nadicodeai/ui/globals.css` keeps the Tailwind role bridge plus UI-local product aliases. Correctness is enforced by export-derived structural parity (`tests/guards/token-structural-parity.test.ts` for the `--nc-*` layer; the per-token `@theme` value loops and light/dark role-integrity checks in `tests/guards/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/guards/components-yaml-matches-css.test.ts`, ADR 0007 D4), plus consumer discipline (`tests/guards/consumer-css-discipline.test.ts`), not a byte snapshot (ADR 0006 supersedes ADR 0005 D1–D3/D5; ADR 0008 supersedes ADR 0005 D4).
|
|
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, the entity-status `status-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 generated `--color-*`/`--radius-*` references, plus a small set of `--nc-*` remaps in the `.dark` block (the `state-*`, `selection-*`, and `cross` families → their `--nc-dark-*` counterparts) so design-system CSS components that read those raw brand tokens directly flip on the dark console; `@nadicodeai/ui/globals.css` keeps the Tailwind role bridge plus UI-local product aliases. Correctness is enforced by export-derived structural parity (`tests/guards/token-structural-parity.test.ts` for the `--nc-*` layer; the per-token `@theme` value loops and light/dark role-integrity checks in `tests/guards/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/guards/components-yaml-matches-css.test.ts`, ADR 0007 D4), plus consumer discipline (`tests/guards/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.
|
package/DESIGN.md
CHANGED
|
@@ -251,6 +251,12 @@ typography:
|
|
|
251
251
|
fontWeight: 400
|
|
252
252
|
lineHeight: 16px
|
|
253
253
|
letterSpacing: 0px
|
|
254
|
+
caption-strong:
|
|
255
|
+
fontFamily: Geist, Inter, system-ui, -apple-system, sans-serif
|
|
256
|
+
fontSize: 12px
|
|
257
|
+
fontWeight: 500
|
|
258
|
+
lineHeight: 16px
|
|
259
|
+
letterSpacing: 0px
|
|
254
260
|
caption-mono:
|
|
255
261
|
fontFamily: Geist Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, monospace
|
|
256
262
|
fontSize: 12px
|
|
@@ -364,20 +370,41 @@ components:
|
|
|
364
370
|
backgroundColor: "{colors.canvas}"
|
|
365
371
|
textColor: "{colors.ink}"
|
|
366
372
|
padding: "{spacing.lg}"
|
|
367
|
-
status-tag:
|
|
368
|
-
backgroundColor: "{colors.
|
|
369
|
-
textColor: "{colors.
|
|
370
|
-
typography: "{typography.caption-
|
|
371
|
-
rounded: "{rounded.
|
|
372
|
-
padding: "
|
|
373
|
-
height:
|
|
374
|
-
status-tag-
|
|
375
|
-
backgroundColor: "{colors.
|
|
376
|
-
textColor: "{colors.
|
|
377
|
-
typography: "{typography.caption-
|
|
378
|
-
rounded: "{rounded.
|
|
379
|
-
padding: "
|
|
380
|
-
height:
|
|
373
|
+
status-tag-gray:
|
|
374
|
+
backgroundColor: "{colors.gray-200}"
|
|
375
|
+
textColor: "{colors.gray-900}"
|
|
376
|
+
typography: "{typography.caption-strong}"
|
|
377
|
+
rounded: "{rounded.md}"
|
|
378
|
+
padding: "0px 10px"
|
|
379
|
+
height: 24px
|
|
380
|
+
status-tag-green:
|
|
381
|
+
backgroundColor: "{colors.green-italia-200}"
|
|
382
|
+
textColor: "{colors.green-italia-900}"
|
|
383
|
+
typography: "{typography.caption-strong}"
|
|
384
|
+
rounded: "{rounded.md}"
|
|
385
|
+
padding: "0px 10px"
|
|
386
|
+
height: 24px
|
|
387
|
+
status-tag-red:
|
|
388
|
+
backgroundColor: "{colors.red-italia-200}"
|
|
389
|
+
textColor: "{colors.red-italia-900}"
|
|
390
|
+
typography: "{typography.caption-strong}"
|
|
391
|
+
rounded: "{rounded.md}"
|
|
392
|
+
padding: "0px 10px"
|
|
393
|
+
height: 24px
|
|
394
|
+
status-tag-amber:
|
|
395
|
+
backgroundColor: "{colors.amber-200}"
|
|
396
|
+
textColor: "{colors.amber-900}"
|
|
397
|
+
typography: "{typography.caption-strong}"
|
|
398
|
+
rounded: "{rounded.md}"
|
|
399
|
+
padding: "0px 10px"
|
|
400
|
+
height: 24px
|
|
401
|
+
status-tag-blue:
|
|
402
|
+
backgroundColor: "{colors.blue-cobalto-200}"
|
|
403
|
+
textColor: "{colors.blue-cobalto-900}"
|
|
404
|
+
typography: "{typography.caption-strong}"
|
|
405
|
+
rounded: "{rounded.md}"
|
|
406
|
+
padding: "0px 10px"
|
|
407
|
+
height: 24px
|
|
381
408
|
image:
|
|
382
409
|
backgroundColor: "{colors.canvas-soft}"
|
|
383
410
|
textColor: "{colors.body}"
|
|
@@ -531,7 +558,7 @@ Backgrounds are `{colors.background-100}` (page default, white) and `{colors.bac
|
|
|
531
558
|
- **Semantic feedback** (`{colors.success}`, `{colors.error}` + `{colors.error-soft}`/`{colors.error-deep}`, `{colors.warning}` + `{colors.warning-soft}`/`{colors.warning-deep}`, `{colors.info}`): validation, caution, approval, and operational feedback. `success` uses `green-italia-700`; `error` uses `red-italia-800` with soft/deep on `red-italia-200`/`red-italia-900`; `warning` uses `amber-600` with soft/deep on `amber-200`/`amber-900`; `info` (`blue-cobalto-700`) is the new informational role.
|
|
532
559
|
- **Accent** (`{colors.accent}` = `red-italia-700`): UI highlights, badges, and selected markers. Flag red is now an active accent — the former "decoration-only" restriction on flag red is retired. Do not conflate this functional Italia `accent` with the identically-named shadcn surface role `accent`: the latter is a neutral (mapped to `{colors.canvas-soft-2}` in light and `{colors.dark-canvas-soft-2}` in dark) and carries no flag-red hue despite the shared word.
|
|
533
560
|
- **Flag Red** (`{colors.flag-red}`): kept as a stable alias at the same value as `{colors.accent}` (`red-italia-700`, `#cd212a`). `accent` and `flag-red` are two roles at one hex: `accent` is the interface-highlight role, `flag-red` is the identity-mark alias. `error` (`red-italia-800`) stays a distinct, deeper red; never use it as an accent.
|
|
534
|
-
- **Workflow States** (`{colors.state-ready}`, `{colors.state-running}`, `{colors.state-review}`, `{colors.state-blocked}`, `{colors.state-complete}`): the left-border/state vocabulary for agentic work surfaces. `state-running` is `blue-cobalto-700` and `state-complete` is `green-italia-700` — blue means in motion, green means done; `state-ready` is `gray-900`. The dark counterparts (`{colors.dark-state-ready}`, `{colors.dark-state-running}`, `{colors.dark-state-review}`, `{colors.dark-state-blocked}`, `{colors.dark-state-complete}`) preserve the same functional identity instead of shifting to pastel labels: ready uses `gray-700`, running uses `blue-cobalto-600`, review reuses `amber-600`, blocked uses `red-italia-700`, and complete reuses `green-italia-700`. These state colors are carried only by the `state-tag` 3 px `border-left` rail and related non-text state accents; label text stays on the neutral foreground roles for contrast in both light and dark.
|
|
561
|
+
- **Workflow States** (`{colors.state-ready}`, `{colors.state-running}`, `{colors.state-review}`, `{colors.state-blocked}`, `{colors.state-complete}`): the left-border/state vocabulary for agentic work surfaces. `state-running` is `blue-cobalto-700` and `state-complete` is `green-italia-700` — blue means in motion, green means done; `state-ready` is `gray-900`. The dark counterparts (`{colors.dark-state-ready}`, `{colors.dark-state-running}`, `{colors.dark-state-review}`, `{colors.dark-state-blocked}`, `{colors.dark-state-complete}`) preserve the same functional identity instead of shifting to pastel labels: ready uses `gray-700`, running uses `blue-cobalto-600`, review reuses `amber-600`, blocked uses `red-italia-700`, and complete reuses `green-italia-700`. These state colors are carried only by the `state-tag` 3 px `border-left` rail and related non-text state accents; label text stays on the neutral foreground roles for contrast in both light and dark. The `{colors.state-*}` tokens stay rail-only for run-state surfaces; entity status is a separate vocabulary carried by the `status-tag` family's background+text ramp pairs (see `## Components`), and the two token sets never cross.
|
|
535
562
|
|
|
536
563
|
### Chart categoricals (functional tier)
|
|
537
564
|
|
|
@@ -594,7 +621,7 @@ Do not delete a color because the current website kernel does not consume it. Pr
|
|
|
594
621
|
|
|
595
622
|
## Typography
|
|
596
623
|
|
|
597
|
-
Geist Sans carries all narrative and interface copy. Geist Mono is reserved for eyebrows, labels,
|
|
624
|
+
Geist Sans carries all narrative and interface copy, including the entity-status `status-tag` family. Geist Mono is reserved for eyebrows, labels, run-state `state-tag` labels, code, traces, and small technical metadata.
|
|
598
625
|
|
|
599
626
|
All body, title, caption, and code typography uses `letterSpacing: 0px`. Do not use viewport-scaled type (no `vw`/`vh` font sizing): use fixed token sizes stepped by breakpoint-specific rules when a headline must grow. The two large display tiers carry a small negative tracking — `display-xl` at `-1.5px` and `display-lg` at `-1px` — so large type reads optically tight; this is a display-heading-only exception and every non-display tier stays at `0px`.
|
|
600
627
|
|
|
@@ -613,7 +640,8 @@ All body, title, caption, and code typography uses `letterSpacing: 0px`. Do not
|
|
|
613
640
|
| `{typography.body-sm}` | 14px | 400 | 20px | Secondary copy, nav, compact cell copy. |
|
|
614
641
|
| `{typography.body-sm-strong}` | 14px | 500 | 20px | Emphasised secondary copy and compact labels. |
|
|
615
642
|
| `{typography.caption}` | 12px | 400 | 16px | Footer secondary lines and badge labels. |
|
|
616
|
-
| `{typography.caption-
|
|
643
|
+
| `{typography.caption-strong}` | 12px | 500 | 16px | Entity-status `status-tag` labels. |
|
|
644
|
+
| `{typography.caption-mono}` | 12px | 500 | 16px | Eyebrows, labels, run-state `state-tag` labels. |
|
|
617
645
|
| `{typography.code}` | 13px | 400 | 20px | Tool calls, snippets, traces. |
|
|
618
646
|
| `{typography.button-lg}` | 16px | 500 | 24px | Marketing-scale button labels. |
|
|
619
647
|
| `{typography.button-md}` | 14px | 500 | 18px | Standard button and control labels. |
|
|
@@ -656,7 +684,7 @@ Kernel compositions arrange approved primitives for a content role. They must no
|
|
|
656
684
|
Each reusable concern has one home and one authoring surface, so a member is documented and shipped in exactly one place:
|
|
657
685
|
|
|
658
686
|
- **Tokens** — exact reusable values live in this contract's `colors`, `spacing`, `rounded`, and `typography`; they export to the generated token layer (with a hand-authored local token layer beside it). No component or section may re-encode a token value.
|
|
659
|
-
- **Framework-agnostic CSS components** — the brand/display CSS components that remain in this package (the agent-chat family, the run-state `state-tag` family, `image`, and the small label/badge/link metadata components). Contracted CSS components are paired between `components:` YAML entries and `## Components` Markdown entries, and are realised by design-system CSS. The named CSS-internal components (`artifact-preview`, `typing-dots`, `state-row`) are documented exceptions: they realise brand display structure but carry no exported component token.
|
|
687
|
+
- **Framework-agnostic CSS components** — the brand/display CSS components that remain in this package (the agent-chat family, the run-state `state-tag` family, the entity-status `status-tag` family, `image`, and the small label/badge/link metadata components). Contracted CSS components are paired between `components:` YAML entries and `## Components` Markdown entries, and are realised by design-system CSS. The named CSS-internal components (`artifact-preview`, `typing-dots`, `state-row`) are documented exceptions: they realise brand display structure but carry no exported component token.
|
|
660
688
|
- **Reusable compositions and sections** — patterns that arrange the page grammar and lower tiers for a content role. They ship as React shadcn compositions from `@nadicodeai/ui`, composed over the kept page grammar; they are not a pure-CSS section layer and carry no `components:` YAML entry or exported component token.
|
|
661
689
|
- **Layout grammar** — the page-frame, row, lane, seam, stage, and marker system documented across this `## Layout` section, carried by the layout CSS layer.
|
|
662
690
|
- **Specimens** — static demonstrations of already-defined primitives. They invent no geometry, seams, heights, or responsive behavior; they only assemble shipped tiers for inspection.
|
|
@@ -774,9 +802,17 @@ Agentic work surfaces are the NadicodeAI-specific layer. They show people and ag
|
|
|
774
802
|
|
|
775
803
|
**`artifact-surface`** — inspectable output area. Use for proposal previews, reports, plans, spreadsheets, schedules, approval states, source traces, run logs, workflow maps, and conversation artifacts.
|
|
776
804
|
|
|
777
|
-
|
|
805
|
+
Status-tag variants share the same compact sans rectangle at `{typography.caption-strong}`, `{rounded.md}` — a small subtle-tinted rectangle, never a capsule — and differentiate by tone: a paired background+text ramp step, not a border-left rail. Tone is `[data-tone]`, not BEM modifiers. Gray is the default tone; color is reserved for marking health and exceptions, so every terminal or no-action entity status (inactive, archived, rejected, canceled, expired, revoked, denied) renders gray. Subtle-only (no solid/filled variant), no icons inside the badge, no text-transform; labels render verbatim from the source's own i18n dictionary. `status-tag` is the entity-status vocabulary — agent, credential, activation, customer, invitation, subscription, and health values that live on a record — and stays a sibling of `state-tag`: the two families never blend, and `status-tag` never touches the `{colors.state-*}` tokens.
|
|
806
|
+
|
|
807
|
+
**`status-tag-gray`** — default and terminal entity status: no action pending, nothing to watch (inactive, archived, rejected, canceled, expired, revoked, denied).
|
|
808
|
+
|
|
809
|
+
**`status-tag-green`** — a healthy, active, or successfully completed entity status.
|
|
810
|
+
|
|
811
|
+
**`status-tag-red`** — a failed, blocked, or otherwise exceptional entity status that needs attention.
|
|
812
|
+
|
|
813
|
+
**`status-tag-amber`** — a degrading, retiring, or past-due entity status between healthy and failed.
|
|
778
814
|
|
|
779
|
-
**`status-tag-
|
|
815
|
+
**`status-tag-blue`** — an in-progress, pending, or trial entity status still moving toward a resolution.
|
|
780
816
|
|
|
781
817
|
**`chat-thread`** — conversation container showing how people instruct, correct, review, or approve agents. Autoplaying threads carry an enhancer-injected pause/resume control (WCAG 2.2.2); the control is never authored in static markup.
|
|
782
818
|
|
|
@@ -35,8 +35,18 @@
|
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
/* Optional identity accent — same AC-016 map as chat-bubble-agent. */
|
|
38
|
-
.nc-agent-avatar[data-accent="green"]
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
.nc-agent-avatar[data-accent="
|
|
42
|
-
|
|
38
|
+
.nc-agent-avatar[data-accent="green"] {
|
|
39
|
+
--nc-accent: var(--nc-link);
|
|
40
|
+
}
|
|
41
|
+
.nc-agent-avatar[data-accent="cyan"] {
|
|
42
|
+
--nc-accent: var(--nc-info);
|
|
43
|
+
}
|
|
44
|
+
.nc-agent-avatar[data-accent="amber"] {
|
|
45
|
+
--nc-accent: var(--nc-warning-deep);
|
|
46
|
+
}
|
|
47
|
+
.nc-agent-avatar[data-accent="ink"] {
|
|
48
|
+
--nc-accent: var(--nc-ink);
|
|
49
|
+
}
|
|
50
|
+
.nc-agent-avatar[data-accent="red"] {
|
|
51
|
+
--nc-accent: var(--nc-error);
|
|
52
|
+
}
|
|
@@ -12,16 +12,18 @@
|
|
|
12
12
|
display: grid;
|
|
13
13
|
gap: 6px;
|
|
14
14
|
padding: 12px;
|
|
15
|
-
border: var(--nc-guide) solid
|
|
15
|
+
border: var(--nc-guide) solid
|
|
16
|
+
color-mix(in srgb, var(--nc-warning-deep) 40%, var(--nc-warning-soft));
|
|
16
17
|
border-radius: var(--nc-rounded-md);
|
|
17
18
|
background: var(--nc-warning-soft);
|
|
18
19
|
color: var(--nc-ink);
|
|
19
20
|
font-family: "Geist", "Inter", system-ui, -apple-system, "Segoe UI", sans-serif;
|
|
20
21
|
animation-name: nc-msg-in;
|
|
21
22
|
/* Confirm move: state transitions at the 150–200 ms feedback band. */
|
|
22
|
-
transition:
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
transition:
|
|
24
|
+
background-color var(--nc-duration-confirm) var(--nc-ease-out-strong),
|
|
25
|
+
border-color var(--nc-duration-confirm) var(--nc-ease-out-strong),
|
|
26
|
+
color var(--nc-duration-confirm) var(--nc-ease-out-strong);
|
|
25
27
|
}
|
|
26
28
|
|
|
27
29
|
.nc-approval-gate-label {
|
|
@@ -87,12 +89,12 @@
|
|
|
87
89
|
vertical-align: -2px;
|
|
88
90
|
background-color: currentColor;
|
|
89
91
|
-webkit-mask: url("../../icons/check.svg") center / contain no-repeat;
|
|
90
|
-
|
|
92
|
+
mask: url("../../icons/check.svg") center / contain no-repeat;
|
|
91
93
|
}
|
|
92
94
|
|
|
93
95
|
.nc-approval-gate-actions button[data-variant="secondary"]::before {
|
|
94
96
|
-webkit-mask-image: url("../../icons/square-pen.svg");
|
|
95
|
-
|
|
97
|
+
mask-image: url("../../icons/square-pen.svg");
|
|
96
98
|
}
|
|
97
99
|
|
|
98
100
|
.nc-approval-gate-actions button:focus-visible {
|
|
@@ -35,12 +35,24 @@
|
|
|
35
35
|
height: 14px;
|
|
36
36
|
background-color: var(--nc-muted);
|
|
37
37
|
-webkit-mask: url("../../icons/file-text.svg") center / contain no-repeat;
|
|
38
|
-
|
|
38
|
+
mask: url("../../icons/file-text.svg") center / contain no-repeat;
|
|
39
|
+
}
|
|
40
|
+
.nc-artifact-preview[data-kind="sheet"] .nc-artifact-preview-header::before {
|
|
41
|
+
-webkit-mask-image: url("../../icons/table.svg");
|
|
42
|
+
mask-image: url("../../icons/table.svg");
|
|
43
|
+
}
|
|
44
|
+
.nc-artifact-preview[data-kind="code"] .nc-artifact-preview-header::before {
|
|
45
|
+
-webkit-mask-image: url("../../icons/code.svg");
|
|
46
|
+
mask-image: url("../../icons/code.svg");
|
|
47
|
+
}
|
|
48
|
+
.nc-artifact-preview[data-kind="pdf"] .nc-artifact-preview-header::before {
|
|
49
|
+
-webkit-mask-image: url("../../icons/file.svg");
|
|
50
|
+
mask-image: url("../../icons/file.svg");
|
|
51
|
+
}
|
|
52
|
+
.nc-artifact-preview[data-kind="report"] .nc-artifact-preview-header::before {
|
|
53
|
+
-webkit-mask-image: url("../../icons/chart-column.svg");
|
|
54
|
+
mask-image: url("../../icons/chart-column.svg");
|
|
39
55
|
}
|
|
40
|
-
.nc-artifact-preview[data-kind="sheet"] .nc-artifact-preview-header::before { -webkit-mask-image: url("../../icons/table.svg"); mask-image: url("../../icons/table.svg"); }
|
|
41
|
-
.nc-artifact-preview[data-kind="code"] .nc-artifact-preview-header::before { -webkit-mask-image: url("../../icons/code.svg"); mask-image: url("../../icons/code.svg"); }
|
|
42
|
-
.nc-artifact-preview[data-kind="pdf"] .nc-artifact-preview-header::before { -webkit-mask-image: url("../../icons/file.svg"); mask-image: url("../../icons/file.svg"); }
|
|
43
|
-
.nc-artifact-preview[data-kind="report"] .nc-artifact-preview-header::before { -webkit-mask-image: url("../../icons/chart-column.svg"); mask-image: url("../../icons/chart-column.svg"); }
|
|
44
56
|
|
|
45
57
|
.nc-artifact-preview-title {
|
|
46
58
|
font-size: 13px;
|
|
@@ -36,11 +36,21 @@
|
|
|
36
36
|
/* AC-016 accent map → existing --nc-* tokens. Each rule references a token, no
|
|
37
37
|
hard-coded hex. green→link, cyan→info (blue-cobalto; the killed cyan token
|
|
38
38
|
retired per Italia contract §6), amber→warning-deep, ink→ink, red→error. */
|
|
39
|
-
.nc-chat-bubble-agent[data-accent="green"]
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
.nc-chat-bubble-agent[data-accent="
|
|
43
|
-
|
|
39
|
+
.nc-chat-bubble-agent[data-accent="green"] {
|
|
40
|
+
--nc-accent: var(--nc-link);
|
|
41
|
+
}
|
|
42
|
+
.nc-chat-bubble-agent[data-accent="cyan"] {
|
|
43
|
+
--nc-accent: var(--nc-info);
|
|
44
|
+
}
|
|
45
|
+
.nc-chat-bubble-agent[data-accent="amber"] {
|
|
46
|
+
--nc-accent: var(--nc-warning-deep);
|
|
47
|
+
}
|
|
48
|
+
.nc-chat-bubble-agent[data-accent="ink"] {
|
|
49
|
+
--nc-accent: var(--nc-ink);
|
|
50
|
+
}
|
|
51
|
+
.nc-chat-bubble-agent[data-accent="red"] {
|
|
52
|
+
--nc-accent: var(--nc-error);
|
|
53
|
+
}
|
|
44
54
|
|
|
45
55
|
/* Inline mono token chip inside an agent bubble (prototype renderInline). */
|
|
46
56
|
.nc-chat-bubble-agent code {
|
|
@@ -117,10 +117,11 @@
|
|
|
117
117
|
line-height: var(--nc-type-caption-mono-line-height);
|
|
118
118
|
letter-spacing: var(--nc-type-caption-mono-letter-spacing);
|
|
119
119
|
cursor: pointer;
|
|
120
|
-
transition:
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
120
|
+
transition:
|
|
121
|
+
background-color var(--nc-duration-stagger) var(--nc-ease-out-strong),
|
|
122
|
+
border-color var(--nc-duration-stagger) var(--nc-ease-out-strong),
|
|
123
|
+
color var(--nc-duration-stagger) var(--nc-ease-out-strong),
|
|
124
|
+
opacity var(--nc-duration-stagger) var(--nc-ease-out-strong);
|
|
124
125
|
}
|
|
125
126
|
|
|
126
127
|
@media (hover: hover) and (pointer: fine) {
|
|
@@ -33,5 +33,5 @@
|
|
|
33
33
|
height: 16px;
|
|
34
34
|
background-color: var(--nc-link);
|
|
35
35
|
-webkit-mask: url("../../icons/arrow-right.svg") center / contain no-repeat;
|
|
36
|
-
|
|
36
|
+
mask: url("../../icons/arrow-right.svg") center / contain no-repeat;
|
|
37
37
|
}
|
|
@@ -69,7 +69,12 @@
|
|
|
69
69
|
height: var(--nc-run-timeline-node);
|
|
70
70
|
margin-top: 4px;
|
|
71
71
|
/* Center the node on the rail: rail center minus half the node width. */
|
|
72
|
-
margin-left: calc(
|
|
72
|
+
margin-left: calc(
|
|
73
|
+
var(--nc-run-timeline-rail) -
|
|
74
|
+
(var(--nc-run-timeline-node) / 2) -
|
|
75
|
+
14px -
|
|
76
|
+
var(--nc-run-timeline-node)
|
|
77
|
+
);
|
|
73
78
|
border-radius: var(--nc-rounded-full);
|
|
74
79
|
background: var(--nc-canvas);
|
|
75
80
|
box-shadow: 0 0 0 var(--nc-guide) var(--nc-line);
|
|
@@ -123,13 +128,33 @@
|
|
|
123
128
|
/* State variants — color carries state, sourced from the shared `--nc-state-*`
|
|
124
129
|
tokens (the same vocabulary as state-tag/state-row). The node core and the
|
|
125
130
|
content left edge both take the state token; shape is unchanged. */
|
|
126
|
-
.nc-run-timeline-step[data-state="ready"]
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
.nc-run-timeline-step[data-state="
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
.nc-run-timeline-step[data-state="
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
.nc-run-timeline-step[data-state="
|
|
131
|
+
.nc-run-timeline-step[data-state="ready"] .nc-run-timeline-node {
|
|
132
|
+
color: var(--nc-state-ready);
|
|
133
|
+
}
|
|
134
|
+
.nc-run-timeline-step[data-state="ready"] .nc-run-timeline-content {
|
|
135
|
+
border-left-color: var(--nc-state-ready);
|
|
136
|
+
}
|
|
137
|
+
.nc-run-timeline-step[data-state="running"] .nc-run-timeline-node {
|
|
138
|
+
color: var(--nc-state-running);
|
|
139
|
+
}
|
|
140
|
+
.nc-run-timeline-step[data-state="running"] .nc-run-timeline-content {
|
|
141
|
+
border-left-color: var(--nc-state-running);
|
|
142
|
+
}
|
|
143
|
+
.nc-run-timeline-step[data-state="review"] .nc-run-timeline-node {
|
|
144
|
+
color: var(--nc-state-review);
|
|
145
|
+
}
|
|
146
|
+
.nc-run-timeline-step[data-state="review"] .nc-run-timeline-content {
|
|
147
|
+
border-left-color: var(--nc-state-review);
|
|
148
|
+
}
|
|
149
|
+
.nc-run-timeline-step[data-state="blocked"] .nc-run-timeline-node {
|
|
150
|
+
color: var(--nc-state-blocked);
|
|
151
|
+
}
|
|
152
|
+
.nc-run-timeline-step[data-state="blocked"] .nc-run-timeline-content {
|
|
153
|
+
border-left-color: var(--nc-state-blocked);
|
|
154
|
+
}
|
|
155
|
+
.nc-run-timeline-step[data-state="complete"] .nc-run-timeline-node {
|
|
156
|
+
color: var(--nc-state-complete);
|
|
157
|
+
}
|
|
158
|
+
.nc-run-timeline-step[data-state="complete"] .nc-run-timeline-content {
|
|
159
|
+
border-left-color: var(--nc-state-complete);
|
|
160
|
+
}
|
|
@@ -47,8 +47,18 @@
|
|
|
47
47
|
color: var(--nc-state-running);
|
|
48
48
|
background: currentColor;
|
|
49
49
|
}
|
|
50
|
-
.nc-state-row[data-kind="ready"]
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
.nc-state-row[data-kind="
|
|
54
|
-
|
|
50
|
+
.nc-state-row[data-kind="ready"] .nc-state-row-dot {
|
|
51
|
+
color: var(--nc-state-ready);
|
|
52
|
+
}
|
|
53
|
+
.nc-state-row[data-kind="running"] .nc-state-row-dot {
|
|
54
|
+
color: var(--nc-state-running);
|
|
55
|
+
}
|
|
56
|
+
.nc-state-row[data-kind="review"] .nc-state-row-dot {
|
|
57
|
+
color: var(--nc-state-review);
|
|
58
|
+
}
|
|
59
|
+
.nc-state-row[data-kind="blocked"] .nc-state-row-dot {
|
|
60
|
+
color: var(--nc-state-blocked);
|
|
61
|
+
}
|
|
62
|
+
.nc-state-row[data-kind="complete"] .nc-state-row-dot {
|
|
63
|
+
color: var(--nc-state-complete);
|
|
64
|
+
}
|
|
@@ -26,9 +26,10 @@
|
|
|
26
26
|
letter-spacing: 0;
|
|
27
27
|
white-space: nowrap;
|
|
28
28
|
/* Confirm move: state transitions at the 150–200 ms feedback band. */
|
|
29
|
-
transition:
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
transition:
|
|
30
|
+
background-color var(--nc-duration-confirm) var(--nc-ease-out-strong),
|
|
31
|
+
border-color var(--nc-duration-confirm) var(--nc-ease-out-strong),
|
|
32
|
+
color var(--nc-duration-confirm) var(--nc-ease-out-strong);
|
|
32
33
|
}
|
|
33
34
|
|
|
34
35
|
/*
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* status-tag — the entity-status system (DESIGN.md `status-tag-*` family).
|
|
3
|
+
* Sibling of `state-tag`, not a replacement: `state-tag` stays the run-state
|
|
4
|
+
* rail (ready/running/review/blocked/complete), carried by a 3px border-left
|
|
5
|
+
* on a neutral canvas. `status-tag` is the entity-status vocabulary — agent,
|
|
6
|
+
* credential, activation, customer, invitation, subscription, and health
|
|
7
|
+
* values that live on records, not on a run. It carries state a different
|
|
8
|
+
* way: a subtle tinted rectangle where BOTH the background and the text
|
|
9
|
+
* shift together, never a border-left rail, and it never touches the
|
|
10
|
+
* `--nc-state-*` token family.
|
|
11
|
+
*
|
|
12
|
+
* Shape: a small sans rectangle (`{rounded.md}`, not a capsule), never
|
|
13
|
+
* Geist Mono. Tone comes from `[data-tone]` (gray/green/red/amber/blue), not
|
|
14
|
+
* BEM modifiers, and each tone is a full background+text ramp pair pulled
|
|
15
|
+
* directly from the color ramps (gray/green-italia/red-italia/amber/
|
|
16
|
+
* blue-cobalto) rather than through a semantic alias — status-tag consumes
|
|
17
|
+
* ramp steps directly, matching `state-tag`'s "shape carries meaning, color
|
|
18
|
+
* carries variant" discipline but expressed as a bg/text pair instead of a
|
|
19
|
+
* border.
|
|
20
|
+
*
|
|
21
|
+
* Doctrine: gray is the default tone. Color is reserved for marking health
|
|
22
|
+
* and exceptions — every terminal/no-action state renders gray. Subtle-only
|
|
23
|
+
* (no solid/filled variants), no icons inside the badge, no text-transform,
|
|
24
|
+
* labels render verbatim from the i18n dictionary that owns them.
|
|
25
|
+
*/
|
|
26
|
+
.nc-status-tag {
|
|
27
|
+
display: inline-flex;
|
|
28
|
+
align-items: center;
|
|
29
|
+
height: 24px;
|
|
30
|
+
padding: 0 10px;
|
|
31
|
+
border: 0;
|
|
32
|
+
border-radius: var(--nc-rounded-md);
|
|
33
|
+
font-family: Geist, Inter, system-ui, -apple-system, sans-serif;
|
|
34
|
+
font-size: 12px;
|
|
35
|
+
font-weight: 500;
|
|
36
|
+
line-height: 16px;
|
|
37
|
+
letter-spacing: 0;
|
|
38
|
+
white-space: nowrap;
|
|
39
|
+
/* Confirm move: state transitions at the 150–200 ms feedback band, same as
|
|
40
|
+
state-tag — color arrives WITH the meaning, never before it. */
|
|
41
|
+
transition:
|
|
42
|
+
background-color var(--nc-duration-confirm) var(--nc-ease-out-strong),
|
|
43
|
+
color var(--nc-duration-confirm) var(--nc-ease-out-strong);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.nc-status-tag[data-tone="gray"] {
|
|
47
|
+
background: var(--nc-gray-200);
|
|
48
|
+
color: var(--nc-gray-900);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.nc-status-tag[data-tone="green"] {
|
|
52
|
+
background: var(--nc-green-italia-200);
|
|
53
|
+
color: var(--nc-green-italia-900);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.nc-status-tag[data-tone="red"] {
|
|
57
|
+
background: var(--nc-red-italia-200);
|
|
58
|
+
color: var(--nc-red-italia-900);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.nc-status-tag[data-tone="amber"] {
|
|
62
|
+
background: var(--nc-amber-200);
|
|
63
|
+
color: var(--nc-amber-900);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.nc-status-tag[data-tone="blue"] {
|
|
67
|
+
background: var(--nc-blue-cobalto-200);
|
|
68
|
+
color: var(--nc-blue-cobalto-900);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/*
|
|
72
|
+
* Dark console: each tone flips to its own dark-ramp pair rather than a
|
|
73
|
+
* shared canvas/ink remap (unlike state-tag's neutral chip), because tone
|
|
74
|
+
* here is carried by a full bg+text pair, not a single border-left accent.
|
|
75
|
+
* Scoped per tone so gray's pair (dark-canvas-soft-2/gray-600) does not
|
|
76
|
+
* collide with the chromatic tones' 1000/400 pairs.
|
|
77
|
+
*/
|
|
78
|
+
.dark .nc-status-tag[data-tone="gray"] {
|
|
79
|
+
background: var(--nc-dark-canvas-soft-2);
|
|
80
|
+
color: var(--nc-gray-600);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.dark .nc-status-tag[data-tone="green"] {
|
|
84
|
+
background: var(--nc-green-italia-1000);
|
|
85
|
+
color: var(--nc-green-italia-400);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.dark .nc-status-tag[data-tone="red"] {
|
|
89
|
+
background: var(--nc-red-italia-1000);
|
|
90
|
+
color: var(--nc-red-italia-400);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.dark .nc-status-tag[data-tone="amber"] {
|
|
94
|
+
background: var(--nc-amber-1000);
|
|
95
|
+
color: var(--nc-amber-400);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.dark .nc-status-tag[data-tone="blue"] {
|
|
99
|
+
background: var(--nc-blue-cobalto-1000);
|
|
100
|
+
color: var(--nc-blue-cobalto-400);
|
|
101
|
+
}
|
|
@@ -32,5 +32,5 @@
|
|
|
32
32
|
vertical-align: -2px;
|
|
33
33
|
background-color: var(--nc-muted);
|
|
34
34
|
-webkit-mask: url("../../icons/chevron-right.svg") center / contain no-repeat;
|
|
35
|
-
|
|
35
|
+
mask: url("../../icons/chevron-right.svg") center / contain no-repeat;
|
|
36
36
|
}
|
|
@@ -30,11 +30,21 @@
|
|
|
30
30
|
/* AC-016 accent map → existing --nc-* tokens; identical to chat-bubble-agent and
|
|
31
31
|
agent-avatar. green→link, cyan→info (blue-cobalto; killed cyan token retired
|
|
32
32
|
per Italia contract §6), amber→warning-deep, ink→ink, red→error. No hard-coded hex. */
|
|
33
|
-
.nc-typing-dots[data-accent="green"]
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
.nc-typing-dots[data-accent="
|
|
37
|
-
|
|
33
|
+
.nc-typing-dots[data-accent="green"] {
|
|
34
|
+
--nc-accent: var(--nc-link);
|
|
35
|
+
}
|
|
36
|
+
.nc-typing-dots[data-accent="cyan"] {
|
|
37
|
+
--nc-accent: var(--nc-info);
|
|
38
|
+
}
|
|
39
|
+
.nc-typing-dots[data-accent="amber"] {
|
|
40
|
+
--nc-accent: var(--nc-warning-deep);
|
|
41
|
+
}
|
|
42
|
+
.nc-typing-dots[data-accent="ink"] {
|
|
43
|
+
--nc-accent: var(--nc-ink);
|
|
44
|
+
}
|
|
45
|
+
.nc-typing-dots[data-accent="red"] {
|
|
46
|
+
--nc-accent: var(--nc-error);
|
|
47
|
+
}
|
|
38
48
|
|
|
39
49
|
.nc-typing-dots-dot {
|
|
40
50
|
width: 5px;
|
package/dist/css/foundation.css
CHANGED
|
@@ -136,6 +136,14 @@ body {
|
|
|
136
136
|
letter-spacing: var(--nc-type-caption-letter-spacing);
|
|
137
137
|
}
|
|
138
138
|
|
|
139
|
+
.nc-type-caption-strong {
|
|
140
|
+
font-family: var(--nc-type-caption-strong-font-family);
|
|
141
|
+
font-size: var(--nc-type-caption-strong-font-size);
|
|
142
|
+
font-weight: var(--nc-type-caption-strong-font-weight);
|
|
143
|
+
line-height: var(--nc-type-caption-strong-line-height);
|
|
144
|
+
letter-spacing: var(--nc-type-caption-strong-letter-spacing);
|
|
145
|
+
}
|
|
146
|
+
|
|
139
147
|
.nc-type-caption-mono {
|
|
140
148
|
font-family: var(--nc-type-caption-mono-font-family);
|
|
141
149
|
font-size: var(--nc-type-caption-mono-font-size);
|
package/dist/css/index.css
CHANGED
|
@@ -11,8 +11,9 @@
|
|
|
11
11
|
* the structural-geometry foundation (`layout` + `primitives` — kernel grid,
|
|
12
12
|
* single-owner seams, `.nc-marker` corner crosshairs, cell/row grid math, the
|
|
13
13
|
* stage system), the brand display atoms shadcn/Radix has no equivalent for (the
|
|
14
|
-
* 13 agent-chat atoms + the run-state `state-tag` family +
|
|
15
|
-
* token/motion layers. The brand book
|
|
14
|
+
* 13 agent-chat atoms + the run-state `state-tag` family + the entity-status
|
|
15
|
+
* `status-tag` family + `image`), and the token/motion layers. The brand book
|
|
16
|
+
* and every static surface import this
|
|
16
17
|
* bundle raw — no Tailwind build step runs over `src/css/`, so the geometry is
|
|
17
18
|
* `@layer` CSS, not `@utility` directives a browser would receive un-compiled.
|
|
18
19
|
* The kept-geometry invariant guards stay live (kernel-css-architecture /
|
|
@@ -31,6 +32,9 @@
|
|
|
31
32
|
/* Run-state tags (ADR 0007 D3). Agentic run-state, kept as CSS. */
|
|
32
33
|
@import url("./components/state-tag.css") layer(components);
|
|
33
34
|
|
|
35
|
+
/* Entity-status tags. Record-level status vocabulary, sibling of state-tag. */
|
|
36
|
+
@import url("./components/status-tag.css") layer(components);
|
|
37
|
+
|
|
34
38
|
/* Agent-chat atoms (M6 / Part B). Conversation surface + role-grammar atoms. */
|
|
35
39
|
@import url("./components/chat-thread.css") layer(components);
|
|
36
40
|
@import url("./components/chat-bubble-user.css") layer(components);
|
package/dist/css/layout.css
CHANGED
|
@@ -210,14 +210,13 @@
|
|
|
210
210
|
display: none;
|
|
211
211
|
min-width: 0;
|
|
212
212
|
min-height: 0;
|
|
213
|
-
background:
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
);
|
|
213
|
+
background: repeating-linear-gradient(
|
|
214
|
+
125deg,
|
|
215
|
+
var(--nc-canvas) 0,
|
|
216
|
+
var(--nc-canvas) 6px,
|
|
217
|
+
var(--nc-line) 6px,
|
|
218
|
+
var(--nc-line) 7px
|
|
219
|
+
);
|
|
221
220
|
}
|
|
222
221
|
|
|
223
222
|
/* The fill owns its single inner boundary rail so the texture is bounded on
|
package/dist/css/primitives.css
CHANGED
|
@@ -127,7 +127,11 @@
|
|
|
127
127
|
--nc-blueprint-line: var(--nc-line);
|
|
128
128
|
background-image:
|
|
129
129
|
linear-gradient(to right, var(--nc-blueprint-line) var(--nc-guide), transparent var(--nc-guide)),
|
|
130
|
-
linear-gradient(
|
|
130
|
+
linear-gradient(
|
|
131
|
+
to bottom,
|
|
132
|
+
var(--nc-blueprint-line) var(--nc-guide),
|
|
133
|
+
transparent var(--nc-guide)
|
|
134
|
+
);
|
|
131
135
|
background-size:
|
|
132
136
|
calc(100% / var(--nc-blueprint-columns)) calc(100% / var(--nc-blueprint-rows)),
|
|
133
137
|
calc(100% / var(--nc-blueprint-columns)) calc(100% / var(--nc-blueprint-rows));
|
|
@@ -137,7 +141,7 @@
|
|
|
137
141
|
scaffolding (used by atmospheric surfaces like the brand hero). */
|
|
138
142
|
.nc-blueprint-field[data-feather="top"] {
|
|
139
143
|
-webkit-mask-image: linear-gradient(to bottom, transparent 0%, black 22%, black 100%);
|
|
140
|
-
|
|
144
|
+
mask-image: linear-gradient(to bottom, transparent 0%, black 22%, black 100%);
|
|
141
145
|
}
|
|
142
146
|
|
|
143
147
|
.nc-rule-svg {
|
|
@@ -195,28 +199,6 @@
|
|
|
195
199
|
width: 38%;
|
|
196
200
|
}
|
|
197
201
|
|
|
198
|
-
.nc-status-tag {
|
|
199
|
-
display: inline-flex;
|
|
200
|
-
width: fit-content;
|
|
201
|
-
min-height: 28px;
|
|
202
|
-
align-items: center;
|
|
203
|
-
justify-content: center;
|
|
204
|
-
border: var(--nc-guide) solid var(--nc-line);
|
|
205
|
-
/* status-tag = {rounded.sm} (DESIGN.md). */
|
|
206
|
-
border-radius: var(--nc-rounded-sm);
|
|
207
|
-
padding: 5px 9px;
|
|
208
|
-
background: var(--nc-canvas-soft);
|
|
209
|
-
color: var(--nc-body);
|
|
210
|
-
font-family: "Geist Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, monospace;
|
|
211
|
-
font-size: 12px;
|
|
212
|
-
line-height: 16px;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
.nc-status-tag[data-proof-state="approved"] {
|
|
216
|
-
border-color: color-mix(in srgb, var(--nc-link) 35%, var(--nc-line));
|
|
217
|
-
background: color-mix(in srgb, var(--nc-link-bg-soft) 48%, var(--nc-canvas));
|
|
218
|
-
}
|
|
219
|
-
|
|
220
202
|
/* nc-icon — the icon slot. Icons are derived from Lucide (ISC) by a build
|
|
221
203
|
transform that bakes the house render into the SVG (see scripts/generate-icons.ts).
|
|
222
204
|
This primitive renders an INLINE <svg> child and re-asserts that key — 1.5px
|
|
@@ -319,10 +301,11 @@
|
|
|
319
301
|
text-decoration: underline;
|
|
320
302
|
text-underline-offset: 2px;
|
|
321
303
|
text-decoration-thickness: var(--nc-guide);
|
|
322
|
-
transition:
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
304
|
+
transition:
|
|
305
|
+
background-color var(--nc-duration-stagger) var(--nc-ease-out-strong),
|
|
306
|
+
border-color var(--nc-duration-stagger) var(--nc-ease-out-strong),
|
|
307
|
+
color var(--nc-duration-stagger) var(--nc-ease-out-strong),
|
|
308
|
+
opacity var(--nc-duration-stagger) var(--nc-ease-out-strong);
|
|
326
309
|
}
|
|
327
310
|
|
|
328
311
|
@media (hover: hover) and (pointer: fine) {
|
|
@@ -314,6 +314,11 @@
|
|
|
314
314
|
--nc-type-caption-font-weight: 400;
|
|
315
315
|
--nc-type-caption-line-height: 16px;
|
|
316
316
|
--nc-type-caption-letter-spacing: 0px;
|
|
317
|
+
--nc-type-caption-strong-font-family: Geist, Inter, system-ui, -apple-system, sans-serif;
|
|
318
|
+
--nc-type-caption-strong-font-size: 12px;
|
|
319
|
+
--nc-type-caption-strong-font-weight: 500;
|
|
320
|
+
--nc-type-caption-strong-line-height: 16px;
|
|
321
|
+
--nc-type-caption-strong-letter-spacing: 0px;
|
|
317
322
|
--nc-type-caption-mono-font-family: Geist Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, monospace;
|
|
318
323
|
--nc-type-caption-mono-font-size: 12px;
|
|
319
324
|
--nc-type-caption-mono-font-weight: 500;
|
|
@@ -206,6 +206,9 @@
|
|
|
206
206
|
"caption": [
|
|
207
207
|
"Geist, Inter, system-ui, -apple-system, sans-serif"
|
|
208
208
|
],
|
|
209
|
+
"caption-strong": [
|
|
210
|
+
"Geist, Inter, system-ui, -apple-system, sans-serif"
|
|
211
|
+
],
|
|
209
212
|
"caption-mono": [
|
|
210
213
|
"Geist Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, monospace"
|
|
211
214
|
],
|
|
@@ -324,6 +327,14 @@
|
|
|
324
327
|
"fontWeight": "400"
|
|
325
328
|
}
|
|
326
329
|
],
|
|
330
|
+
"caption-strong": [
|
|
331
|
+
"12px",
|
|
332
|
+
{
|
|
333
|
+
"lineHeight": "16px",
|
|
334
|
+
"letterSpacing": "0px",
|
|
335
|
+
"fontWeight": "500"
|
|
336
|
+
}
|
|
337
|
+
],
|
|
327
338
|
"caption-mono": [
|
|
328
339
|
"12px",
|
|
329
340
|
{
|
|
@@ -366,6 +366,7 @@
|
|
|
366
366
|
--font-body-sm: Geist, Inter, system-ui, -apple-system, sans-serif;
|
|
367
367
|
--font-body-sm-strong: Geist, Inter, system-ui, -apple-system, sans-serif;
|
|
368
368
|
--font-caption: Geist, Inter, system-ui, -apple-system, sans-serif;
|
|
369
|
+
--font-caption-strong: Geist, Inter, system-ui, -apple-system, sans-serif;
|
|
369
370
|
--font-caption-mono: Geist Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, monospace;
|
|
370
371
|
--font-code: Geist Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, monospace;
|
|
371
372
|
--font-button-md: Geist, Inter, system-ui, -apple-system, sans-serif;
|
|
@@ -461,6 +462,13 @@
|
|
|
461
462
|
--tracking-caption: 0px;
|
|
462
463
|
--text-caption--font-weight: 400;
|
|
463
464
|
--font-weight-caption: 400;
|
|
465
|
+
--text-caption-strong: 12px;
|
|
466
|
+
--text-caption-strong--line-height: 16px;
|
|
467
|
+
--leading-caption-strong: 16px;
|
|
468
|
+
--text-caption-strong--letter-spacing: 0px;
|
|
469
|
+
--tracking-caption-strong: 0px;
|
|
470
|
+
--text-caption-strong--font-weight: 500;
|
|
471
|
+
--font-weight-caption-strong: 500;
|
|
464
472
|
--text-caption-mono: 12px;
|
|
465
473
|
--text-caption-mono--line-height: 16px;
|
|
466
474
|
--leading-caption-mono: 16px;
|
|
@@ -2463,6 +2463,22 @@
|
|
|
2463
2463
|
"lineHeight": 16
|
|
2464
2464
|
}
|
|
2465
2465
|
},
|
|
2466
|
+
"caption-strong": {
|
|
2467
|
+
"$type": "typography",
|
|
2468
|
+
"$value": {
|
|
2469
|
+
"fontFamily": "Geist, Inter, system-ui, -apple-system, sans-serif",
|
|
2470
|
+
"fontSize": {
|
|
2471
|
+
"value": 12,
|
|
2472
|
+
"unit": "px"
|
|
2473
|
+
},
|
|
2474
|
+
"fontWeight": 500,
|
|
2475
|
+
"letterSpacing": {
|
|
2476
|
+
"value": 0,
|
|
2477
|
+
"unit": "px"
|
|
2478
|
+
},
|
|
2479
|
+
"lineHeight": 16
|
|
2480
|
+
}
|
|
2481
|
+
},
|
|
2466
2482
|
"caption-mono": {
|
|
2467
2483
|
"$type": "typography",
|
|
2468
2484
|
"$value": {
|