@nadicodeai/design-system 0.10.2 → 0.11.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.
Files changed (51) hide show
  1. package/AGENTS.md +30 -101
  2. package/CONTEXT.md +75 -0
  3. package/DESIGN.md +180 -345
  4. package/README.md +27 -54
  5. package/dist/assets/logo-mark.svg +6 -0
  6. package/dist/assets/logo-wordmark.svg +4 -0
  7. package/dist/assets/nadia-canonical-face.png +0 -0
  8. package/dist/css/chat-autoplay.js +18 -27
  9. package/dist/css/index.css +2540 -56
  10. package/dist/favicon/apple-touch-icon.png +0 -0
  11. package/dist/favicon/favicon.ico +0 -0
  12. package/dist/favicon/favicon.svg +6 -16
  13. package/dist/favicon/icon-192.png +0 -0
  14. package/dist/favicon/icon-512.png +0 -0
  15. package/dist/favicon/site.webmanifest +2 -2
  16. package/dist/tailwind/nadicode.tailwind.json +98 -143
  17. package/dist/tokens/nadicode.dtcg.json +413 -908
  18. package/package.json +19 -11
  19. package/src/assets/logo-geometry.d.ts +27 -0
  20. package/src/assets/logo-geometry.js +204 -0
  21. package/src/assets/nadia-canonical-face.d.ts +2 -0
  22. package/dist/css/components/.gitkeep +0 -0
  23. package/dist/css/components/agent-avatar.css +0 -52
  24. package/dist/css/components/approval-gate.css +0 -145
  25. package/dist/css/components/artifact-preview.css +0 -81
  26. package/dist/css/components/chat-bubble-agent.css +0 -63
  27. package/dist/css/components/chat-bubble-user.css +0 -28
  28. package/dist/css/components/chat-thread.css +0 -159
  29. package/dist/css/components/handoff-banner.css +0 -37
  30. package/dist/css/components/image.css +0 -87
  31. package/dist/css/components/memory-item.css +0 -36
  32. package/dist/css/components/run-timeline.css +0 -160
  33. package/dist/css/components/state-row.css +0 -64
  34. package/dist/css/components/state-tag.css +0 -67
  35. package/dist/css/components/status-tag.css +0 -101
  36. package/dist/css/components/tool-call-trace.css +0 -36
  37. package/dist/css/components/typing-dots.css +0 -54
  38. package/dist/css/components/usage-meter.css +0 -63
  39. package/dist/css/foundation.css +0 -177
  40. package/dist/css/layout.css +0 -657
  41. package/dist/css/motion.css +0 -225
  42. package/dist/css/primitives.css +0 -333
  43. package/dist/css/reset.css +0 -22
  44. package/dist/css/tokens.generated.css +0 -349
  45. package/dist/css/tokens.local.css +0 -11
  46. package/dist/tailwind/nadicode.theme.css +0 -596
  47. package/src/assets/favicon.svg +0 -17
  48. package/src/assets/logo-mark.svg +0 -15
  49. package/src/assets/logo-wordmark.svg +0 -26
  50. package/src/assets/nadia.d.ts +0 -9
  51. package/src/assets/nadia.png +0 -0
@@ -1,159 +0,0 @@
1
- /*
2
- * chat-thread — agent-conversation container (DESIGN.md `chat-thread`).
3
- * Graduated from the archived design-canvas `base.css` `.nc-chat-thread` shim
4
- * and the `chat-anim.jsx` ChatHeader/ChatFooter vision. A bordered card with a
5
- * dotted work-surface body and optional header + footer slots; the body is the
6
- * scrolling message column. The card owns exactly one outer seam (its border)
7
- * plus the single hairline between each slot and the body. Color comes from
8
- * `var(--nc-*)` only; the radius reads `var(--nc-rounded-*)`; spacing/font are
9
- * literals.
10
- */
11
- .nc-chat-thread {
12
- display: flex;
13
- flex-direction: column;
14
- overflow: hidden;
15
- border: var(--nc-guide) solid var(--nc-line);
16
- border-radius: var(--nc-rounded-md);
17
- background: var(--nc-canvas);
18
- color: var(--nc-ink);
19
- font-family: "Geist", "Inter", system-ui, -apple-system, "Segoe UI", sans-serif;
20
- }
21
-
22
- /* Header slot — agent identity + workflow kicker. Owns its bottom seam only. */
23
- .nc-chat-thread-header {
24
- display: flex;
25
- align-items: center;
26
- gap: 12px;
27
- padding: 14px 16px;
28
- border-bottom: var(--nc-guide) solid var(--nc-line);
29
- background: var(--nc-canvas);
30
- }
31
-
32
- .nc-chat-thread-domain {
33
- font-family: "Geist Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, monospace;
34
- font-size: 11px;
35
- font-weight: 500;
36
- line-height: 16px;
37
- color: var(--nc-muted);
38
- text-transform: uppercase;
39
- letter-spacing: 0.04em;
40
- white-space: nowrap;
41
- overflow: hidden;
42
- text-overflow: ellipsis;
43
- }
44
-
45
- .nc-chat-thread-identity {
46
- min-width: 0;
47
- flex: 1;
48
- }
49
-
50
- .nc-chat-thread-name {
51
- display: flex;
52
- align-items: baseline;
53
- gap: 6px;
54
- font-size: 14px;
55
- font-weight: 500;
56
- line-height: 20px;
57
- color: var(--nc-ink);
58
- white-space: nowrap;
59
- overflow: hidden;
60
- text-overflow: ellipsis;
61
- }
62
-
63
- .nc-chat-thread-name .nc-chat-thread-role {
64
- min-width: 0;
65
- overflow: hidden;
66
- font-weight: 400;
67
- color: var(--nc-muted);
68
- text-overflow: ellipsis;
69
- white-space: nowrap;
70
- }
71
-
72
- .nc-chat-thread-workflow {
73
- flex: 0 1 auto;
74
- min-width: 0;
75
- overflow: hidden;
76
- font-family: "Geist Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, monospace;
77
- font-size: 11px;
78
- line-height: 16px;
79
- color: var(--nc-body);
80
- text-transform: uppercase;
81
- letter-spacing: 0.04em;
82
- text-overflow: ellipsis;
83
- white-space: nowrap;
84
- }
85
-
86
- /* Body slot — the dotted work-surface scroll column. The radial-gradient dots
87
- are painted on `var(--nc-line)`; the 12px grid + 8px offset mirror the
88
- prototype's field. Messages are a stacked, end-anchored column. */
89
- .nc-chat-thread-body {
90
- flex: 1;
91
- min-height: 0;
92
- overflow: hidden auto;
93
- display: flex;
94
- flex-direction: column;
95
- gap: 10px;
96
- padding: 16px 18px;
97
- background:
98
- radial-gradient(var(--nc-line) 0.8px, transparent 0.8px) 8px 8px / 12px 12px,
99
- var(--nc-canvas);
100
- }
101
-
102
- /* Pause/resume control — enhancer-injected only; never authored in static markup.
103
- Positioned top-right inside the thread card, above the body slot.
104
- Quiet chrome: caption-mono scale, hairline border, no hover position shift. */
105
- .nc-chat-pause {
106
- display: block;
107
- align-self: flex-end;
108
- margin: var(--nc-xs) var(--nc-xs) 0;
109
- padding: var(--nc-xs) var(--nc-sm);
110
- background: var(--nc-canvas);
111
- color: var(--nc-muted);
112
- border: var(--nc-guide) solid var(--nc-line);
113
- border-radius: var(--nc-rounded-xs);
114
- font-family: var(--nc-type-caption-mono-font-family);
115
- font-size: var(--nc-type-caption-mono-font-size);
116
- font-weight: var(--nc-type-caption-mono-font-weight);
117
- line-height: var(--nc-type-caption-mono-line-height);
118
- letter-spacing: var(--nc-type-caption-mono-letter-spacing);
119
- cursor: pointer;
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);
125
- }
126
-
127
- @media (hover: hover) and (pointer: fine) {
128
- .nc-chat-pause:hover {
129
- color: var(--nc-ink);
130
- border-color: var(--nc-body);
131
- }
132
- }
133
-
134
- .nc-chat-pause[aria-pressed="true"] {
135
- color: var(--nc-ink);
136
- border-color: var(--nc-body);
137
- }
138
-
139
- /* Invite — press feedback. */
140
- .nc-chat-pause:active {
141
- transform: scale(0.97);
142
- transition: transform var(--nc-duration-stagger) var(--nc-ease-out-strong);
143
- }
144
-
145
- @media (prefers-reduced-motion: reduce) {
146
- .nc-chat-pause:active {
147
- transform: none;
148
- }
149
- }
150
-
151
- /* Footer slot — usage-meter + progress row. Owns its top seam only. */
152
- .nc-chat-thread-footer {
153
- display: flex;
154
- flex-direction: column;
155
- gap: 8px;
156
- padding: 10px 16px;
157
- border-top: var(--nc-guide) solid var(--nc-line);
158
- background: var(--nc-canvas);
159
- }
@@ -1,37 +0,0 @@
1
- /*
2
- * handoff-banner — agent-to-agent / human-to-agent handoff surface
3
- * (DESIGN.md `handoff-banner`). Graduated from the `base.css`
4
- * `.nc-handoff-banner` shim. Full-width soft-link banner that explains a
5
- * handoff reason and destination; a leading `→` glyph (link-colored) and a 3px
6
- * left accent stripe carry the direction. Message atom → carries the M5
7
- * rise-in. Color is `var(--nc-*)` only; the radius reads `var(--nc-rounded-*)`;
8
- * spacing/font are literals.
9
- */
10
- .nc-handoff-banner {
11
- align-self: stretch;
12
- display: flex;
13
- gap: 10px;
14
- align-items: center;
15
- padding: 8px 12px;
16
- border-left: 3px solid var(--nc-link);
17
- border-radius: var(--nc-rounded-md);
18
- background: var(--nc-link-bg-soft);
19
- color: var(--nc-link-deep);
20
- font-family: "Geist", "Inter", system-ui, -apple-system, "Segoe UI", sans-serif;
21
- font-size: 13px;
22
- font-weight: 500;
23
- line-height: 18px;
24
- animation-name: nc-msg-in;
25
- }
26
-
27
- /* Leading direction marker — Lucide arrow-right, painted via CSS mask so it
28
- tints with the link token. */
29
- .nc-handoff-banner::before {
30
- content: "";
31
- flex: none;
32
- width: 16px;
33
- height: 16px;
34
- background-color: var(--nc-link);
35
- -webkit-mask: url("../../icons/arrow-right.svg") center / contain no-repeat;
36
- mask: url("../../icons/arrow-right.svg") center / contain no-repeat;
37
- }
@@ -1,87 +0,0 @@
1
- /*
2
- * image — editorial media mount (DESIGN.md `image`).
3
- *
4
- * The single home for art-directed imagery inside the grammar: a bounded
5
- * media fill (img / picture / video / inline svg) with an optional mono tag
6
- * chip overlaid on the media and an optional caption bar below it. Like
7
- * card-marketing it is SELF-CONTAINED: with `data-frame="true"` it draws
8
- * exactly one hairline — its own `{colors.line}` border — so it sits inside a
9
- * borderless panel-cell, split visual slot, or card media slot without
10
- * repairing or stacking onto any grid seam. It is square-cornered
11
- * (`{rounded.none}`): a mounted print, not a floating card — the parent frame
12
- * supplies the visual system.
13
- *
14
- * The aspect ratio is a per-instance knob (`--nc-image-ratio`, default
15
- * 4 / 3) following the bento ratio-prop model: set the prop on the element,
16
- * never re-derive geometry inline. `data-strip="true"` is the full-width
17
- * divider form — the ratio unlocks and the height resolves from the
18
- * `{spacing.h-strip}` responsive tokens via the layout-layer collapsed alias.
19
- *
20
- * Color binds to var(--nc-*) only; the image ships zero out-of-contract
21
- * values. Spacing literals carry their `{spacing.*}` contract values inline.
22
- */
23
- .nc-image {
24
- --nc-image-ratio: 4 / 3;
25
- position: relative;
26
- /* The canonical mount is a <figure>; zero the UA figure margin (1em 40px)
27
- so the image stays bounded to its slot instead of overflowing it. */
28
- margin: 0;
29
- display: grid;
30
- grid-template-rows: auto;
31
- width: 100%;
32
- overflow: hidden;
33
- background: var(--nc-canvas-soft);
34
- }
35
-
36
- .nc-image[data-frame="true"] {
37
- border: var(--nc-guide) solid var(--nc-line);
38
- }
39
-
40
- .nc-image-media {
41
- display: block;
42
- width: 100%;
43
- height: auto;
44
- aspect-ratio: var(--nc-image-ratio);
45
- object-fit: cover;
46
- }
47
-
48
- /* Mono tag chip overlaid top-left on the media — the image's print label.
49
- Typography comes from the generated `.nc-type-caption-mono` utility applied
50
- in markup, so the contract stays the single type source. The chip owns its
51
- own bounded hairline; it overlays the media, never a grid seam. */
52
- .nc-image-tag {
53
- position: absolute;
54
- top: 8px; /* {spacing.xs} */
55
- left: 8px; /* {spacing.xs} */
56
- padding: 2px 6px;
57
- border: var(--nc-guide) solid var(--nc-line);
58
- background: var(--nc-canvas);
59
- color: var(--nc-ink);
60
- text-transform: uppercase;
61
- }
62
-
63
- /* Caption bar below the media, inside the image's bound. Type from the
64
- generated `.nc-type-caption` utility applied in markup; body tone (muted
65
- fails WCAG AA at caption size on the soft surface). */
66
- .nc-image-caption {
67
- margin: 0;
68
- padding: 8px 12px; /* {spacing.xs} {spacing.sm} */
69
- color: var(--nc-body);
70
- background: var(--nc-canvas);
71
- }
72
-
73
- /* ============================================================
74
- Variant: strip
75
- ============================================================
76
- `data-strip="true"` — the full-width divider form (a thin
77
- editorial band between page rows: thread, texture, panorama).
78
- The ratio unlocks and the media fills the strip height from the
79
- `{spacing.h-strip}` responsive tokens (72/80/88 px) through the
80
- layout-layer collapsed alias, so the strip stays a quiet band
81
- and never balloons. No frame by default: the hosting page-row
82
- owns the strip's top/bottom seams.
83
- ============================================================ */
84
- .nc-image[data-strip="true"] .nc-image-media {
85
- aspect-ratio: auto;
86
- height: var(--nc-h-strip);
87
- }
@@ -1,36 +0,0 @@
1
- /*
2
- * memory-item — remembered-fact row (DESIGN.md `memory-item`).
3
- * Graduated from `chat-anim.jsx` MemoryItem. Left-aligned soft-surface row for
4
- * company-brain / persistent-context facts: a mono "Memory" label slot plus the
5
- * remembered fact. Message atom → carries the M5 rise-in. Color is `var(--nc-*)`
6
- * only; the radius reads `var(--nc-rounded-*)`; spacing/font are literals.
7
- */
8
- .nc-memory-item {
9
- align-self: flex-start;
10
- display: flex;
11
- gap: 10px;
12
- align-items: flex-start;
13
- width: fit-content;
14
- max-width: 92%;
15
- padding: 8px 12px;
16
- border: var(--nc-guide) solid var(--nc-line);
17
- border-radius: var(--nc-rounded-sm);
18
- background: var(--nc-canvas-soft);
19
- color: var(--nc-body);
20
- font-family: "Geist", "Inter", system-ui, -apple-system, "Segoe UI", sans-serif;
21
- font-size: 13px;
22
- line-height: 18px;
23
- animation-name: nc-msg-in;
24
- }
25
-
26
- .nc-memory-item-label {
27
- flex: 0 0 auto;
28
- margin-top: 2px;
29
- font-family: "Geist Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, monospace;
30
- font-size: 10px;
31
- font-weight: 600;
32
- line-height: 16px;
33
- color: var(--nc-muted);
34
- text-transform: uppercase;
35
- letter-spacing: 0.06em;
36
- }
@@ -1,160 +0,0 @@
1
- /*
2
- * run-timeline — vertical step thread for an agent run, handoff, or workflow
3
- * execution (DESIGN.md `run-timeline`). The contract fixes the surface
4
- * (background `--nc-canvas`, text `--nc-ink`, `body-sm` typography, 0 padding):
5
- * the timeline is a transparent fill that drops into a seam-owning grid/lane
6
- * primitive and draws no outer structural border of its own.
7
- *
8
- * Structure: a stacked column of step rows threaded by a single continuous
9
- * vertical rail. Single-owner seam law — the rail is one 1px line owned by the
10
- * container (`::before`), bounded to the timeline; each step owns exactly one
11
- * node marker that sits ON the rail, and a per-step state is carried by the
12
- * shared state vocabulary: a 3px colored `border-left`/node tint consuming the
13
- * matching `--nc-state-*` token (shape carries the step; color carries state),
14
- * identical to the `state-tag-*` family. State is never a swatch, pulse, or
15
- * spinner — the optional running pulse reuses the M5 `.nc-anim-pulse` hook and
16
- * is neutralized under reduced motion. Color is `var(--nc-*)` only; the round
17
- * node markers keep an off-scale literal (no `rounded` token matches a circle);
18
- * spacing/font are literals.
19
- */
20
- .nc-run-timeline {
21
- display: flex;
22
- flex-direction: column;
23
- position: relative;
24
- padding: 0;
25
- background: var(--nc-canvas);
26
- color: var(--nc-ink);
27
- font-family: "Geist", "Inter", system-ui, -apple-system, "Segoe UI", sans-serif;
28
- font-size: 14px;
29
- line-height: 20px;
30
- /* Geometry knobs the rail + nodes share, so the thread stays single-source. */
31
- --nc-run-timeline-rail: 22px; /* rail center, from the left content edge */
32
- --nc-run-timeline-node: 11px; /* node diameter */
33
- }
34
-
35
- /* The single continuous rail — one 1px line owned by the container, bounded to
36
- the step span (top of the first node to the last node) so it never reaches a
37
- surrounding cell seam. The first/last steps trim it to their node centers. */
38
- .nc-run-timeline::before {
39
- content: "";
40
- position: absolute;
41
- top: 14px;
42
- bottom: 14px;
43
- left: var(--nc-run-timeline-rail);
44
- width: var(--nc-guide);
45
- transform: translateX(-50%);
46
- background: var(--nc-line);
47
- }
48
-
49
- /* Step row — node gutter + content. The row owns its own node marker only; it
50
- draws no rail and no row seam (the rail is the container's). */
51
- .nc-run-timeline-step {
52
- position: relative;
53
- display: flex;
54
- gap: 14px;
55
- align-items: flex-start;
56
- padding: 8px 0;
57
- animation-name: nc-msg-in;
58
- }
59
-
60
- /* Node marker — a small ringed dot sitting ON the rail. The ring is the canvas,
61
- so the node masks the rail behind it (single visible crossing). The dot color
62
- carries the step state from the shared `--nc-state-*` tokens; default is the
63
- ink/state-ready token, matching the state-tag family's neutral edge. */
64
- .nc-run-timeline-node {
65
- position: relative;
66
- z-index: 1;
67
- flex: 0 0 auto;
68
- width: var(--nc-run-timeline-node);
69
- height: var(--nc-run-timeline-node);
70
- margin-top: 4px;
71
- /* Center the node on the rail: rail center minus half the node width. */
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
- );
78
- border-radius: var(--nc-rounded-full);
79
- background: var(--nc-canvas);
80
- box-shadow: 0 0 0 var(--nc-guide) var(--nc-line);
81
- color: var(--nc-state-ready);
82
- }
83
-
84
- /* Filled core — the colored center that reads as the state. */
85
- .nc-run-timeline-node::before {
86
- content: "";
87
- position: absolute;
88
- inset: 2px;
89
- border-radius: var(--nc-rounded-full);
90
- background: currentColor;
91
- }
92
-
93
- /* Content — label kicker (mono, muted) + claim, mirroring memory-item's slot
94
- grammar. A 3px colored left edge echoes the state-tag border vocabulary so
95
- the step's state is legible at the text too, not only the node. */
96
- .nc-run-timeline-content {
97
- flex: 1;
98
- min-width: 0;
99
- padding-left: 12px;
100
- border-left: 3px solid var(--nc-line);
101
- }
102
-
103
- .nc-run-timeline-label {
104
- display: flex;
105
- align-items: baseline;
106
- gap: 8px;
107
- font-family: "Geist Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, monospace;
108
- font-size: 11px;
109
- font-weight: 500;
110
- line-height: 16px;
111
- color: var(--nc-muted);
112
- text-transform: uppercase;
113
- letter-spacing: 0.04em;
114
- }
115
-
116
- .nc-run-timeline-title {
117
- font-weight: 500;
118
- color: var(--nc-ink);
119
- }
120
-
121
- .nc-run-timeline-detail {
122
- margin-top: 2px;
123
- font-size: 13px;
124
- line-height: 18px;
125
- color: var(--nc-body);
126
- }
127
-
128
- /* State variants — color carries state, sourced from the shared `--nc-state-*`
129
- tokens (the same vocabulary as state-tag/state-row). The node core and the
130
- content left edge both take the state token; shape is unchanged. */
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
- }
@@ -1,64 +0,0 @@
1
- /*
2
- * state-row — CSS-internal atom (NO DESIGN.md contract entry; D8/D14).
3
- * Graduated from `chat-anim.jsx` StateRow. A full-width run-state divider: a
4
- * centered mono label with a small state dot, flanked by hairline rules that are
5
- * bounded to this row only (single-owner: they never reach a thread seam). The
6
- * dot color is selected by `[data-kind]` from the `--nc-state-*` tokens; the
7
- * `running` kind may opt into the M5 `.nc-anim-pulse` hook in markup (the pulse
8
- * uses `currentColor`, so the dot's color drives the ring). Color is
9
- * `var(--nc-*)` only; spacing/font are literals.
10
- */
11
- .nc-state-row {
12
- align-self: stretch;
13
- display: flex;
14
- align-items: center;
15
- gap: 10px;
16
- padding: 3px 0;
17
- font-family: "Geist Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, monospace;
18
- font-size: 11px;
19
- line-height: 16px;
20
- color: var(--nc-muted);
21
- text-transform: uppercase;
22
- letter-spacing: 0.04em;
23
- }
24
-
25
- /* Flanking hairlines — bounded to the row, owned here only. */
26
- .nc-state-row::before,
27
- .nc-state-row::after {
28
- content: "";
29
- flex: 1;
30
- height: var(--nc-guide);
31
- background: var(--nc-line);
32
- }
33
-
34
- .nc-state-row-label {
35
- display: inline-flex;
36
- align-items: center;
37
- gap: 6px;
38
- white-space: nowrap;
39
- }
40
-
41
- /* State dot — color carries the run state, sourced from --nc-state-* tokens.
42
- `currentColor` is the dot color so an applied .nc-anim-pulse ring matches. */
43
- .nc-state-row-dot {
44
- width: 6px;
45
- height: 6px;
46
- border-radius: var(--nc-rounded-full);
47
- color: var(--nc-state-running);
48
- background: currentColor;
49
- }
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
- }
@@ -1,67 +0,0 @@
1
- /*
2
- * state-tag — the single run-state system (DESIGN.md `state-tag-*` family).
3
- * Graduated from the archived design-canvas `base.css` `.nc-state-tag` shim.
4
- * Compact rectangular caption-mono pill: shape carries meaning, color carries
5
- * variant. Each variant differentiates only by a 3px colored `border-left`
6
- * consuming the matching `--nc-state-*` token. State is never conveyed through
7
- * swatches, dots, pulses, breathing animations, or loading spinners. Variants
8
- * use `[data-variant]` (e.g. `data-variant="running"`), not BEM modifiers.
9
- * Color comes from `var(--nc-*)` only.
10
- */
11
- .nc-state-tag {
12
- display: inline-flex;
13
- align-items: center;
14
- height: 26px;
15
- padding: 0 8px;
16
- border: var(--nc-guide) solid var(--nc-line);
17
- border-left-width: 3px;
18
- border-left-color: var(--nc-ink);
19
- border-radius: var(--nc-rounded-sm);
20
- background: var(--nc-canvas);
21
- color: var(--nc-ink);
22
- font-family: "Geist Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, monospace;
23
- font-size: 12px;
24
- font-weight: 500;
25
- line-height: 16px;
26
- letter-spacing: 0;
27
- white-space: nowrap;
28
- /* Confirm move: state transitions at the 150–200 ms feedback band. */
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);
33
- }
34
-
35
- /*
36
- * Dark console: the tag's neutral surface flips to the dark ramp so the chip is
37
- * dark-grounded, not a light chip on the dark canvas. Scoped to the component
38
- * because canvas/ink/line are global neutrals that must not be remapped in the
39
- * unscoped .dark block. The variant state colors flip separately via the
40
- * generated :root.dark --nc-state-* remap in the Tailwind theme map. Direct
41
- * counterparts: the tag stays a canvas-grounded chip in both themes.
42
- */
43
- .dark .nc-state-tag {
44
- --nc-canvas: var(--nc-dark-canvas);
45
- --nc-ink: var(--nc-dark-ink);
46
- --nc-line: var(--nc-dark-line);
47
- }
48
-
49
- .nc-state-tag[data-variant="ready"] {
50
- border-left-color: var(--nc-state-ready);
51
- }
52
-
53
- .nc-state-tag[data-variant="running"] {
54
- border-left-color: var(--nc-state-running);
55
- }
56
-
57
- .nc-state-tag[data-variant="review"] {
58
- border-left-color: var(--nc-state-review);
59
- }
60
-
61
- .nc-state-tag[data-variant="blocked"] {
62
- border-left-color: var(--nc-state-blocked);
63
- }
64
-
65
- .nc-state-tag[data-variant="complete"] {
66
- border-left-color: var(--nc-state-complete);
67
- }