@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.
- package/AGENTS.md +30 -101
- package/CONTEXT.md +75 -0
- package/DESIGN.md +180 -345
- package/README.md +27 -54
- package/dist/assets/logo-mark.svg +6 -0
- package/dist/assets/logo-wordmark.svg +4 -0
- package/dist/assets/nadia-canonical-face.png +0 -0
- package/dist/css/chat-autoplay.js +18 -27
- package/dist/css/index.css +2540 -56
- package/dist/favicon/apple-touch-icon.png +0 -0
- package/dist/favicon/favicon.ico +0 -0
- package/dist/favicon/favicon.svg +6 -16
- package/dist/favicon/icon-192.png +0 -0
- package/dist/favicon/icon-512.png +0 -0
- package/dist/favicon/site.webmanifest +2 -2
- package/dist/tailwind/nadicode.tailwind.json +98 -143
- package/dist/tokens/nadicode.dtcg.json +413 -908
- package/package.json +19 -11
- package/src/assets/logo-geometry.d.ts +27 -0
- package/src/assets/logo-geometry.js +204 -0
- package/src/assets/nadia-canonical-face.d.ts +2 -0
- package/dist/css/components/.gitkeep +0 -0
- package/dist/css/components/agent-avatar.css +0 -52
- package/dist/css/components/approval-gate.css +0 -145
- package/dist/css/components/artifact-preview.css +0 -81
- package/dist/css/components/chat-bubble-agent.css +0 -63
- package/dist/css/components/chat-bubble-user.css +0 -28
- package/dist/css/components/chat-thread.css +0 -159
- package/dist/css/components/handoff-banner.css +0 -37
- package/dist/css/components/image.css +0 -87
- package/dist/css/components/memory-item.css +0 -36
- package/dist/css/components/run-timeline.css +0 -160
- package/dist/css/components/state-row.css +0 -64
- package/dist/css/components/state-tag.css +0 -67
- package/dist/css/components/status-tag.css +0 -101
- package/dist/css/components/tool-call-trace.css +0 -36
- package/dist/css/components/typing-dots.css +0 -54
- package/dist/css/components/usage-meter.css +0 -63
- package/dist/css/foundation.css +0 -177
- package/dist/css/layout.css +0 -657
- package/dist/css/motion.css +0 -225
- package/dist/css/primitives.css +0 -333
- package/dist/css/reset.css +0 -22
- package/dist/css/tokens.generated.css +0 -349
- package/dist/css/tokens.local.css +0 -11
- package/dist/tailwind/nadicode.theme.css +0 -596
- package/src/assets/favicon.svg +0 -17
- package/src/assets/logo-mark.svg +0 -15
- package/src/assets/logo-wordmark.svg +0 -26
- package/src/assets/nadia.d.ts +0 -9
- 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
|
-
}
|