@nadicodeai/design-system 0.21.0 → 1.0.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 +8 -9
- package/CONTEXT.md +6 -0
- package/DESIGN.md +69 -72
- package/README.md +1 -22
- package/dist/css/index.css +15 -738
- package/dist/tailwind/nadicode.tailwind.json +4 -0
- package/dist/tokens/nadicode.dtcg.json +44 -0
- package/package.json +3 -2
- package/dist/css/chat-autoplay.js +0 -537
package/AGENTS.md
CHANGED
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
# @nadicodeai/design-system
|
|
2
2
|
|
|
3
|
-
The `@nadicodeai/design-system` npm workspace. `DESIGN.md` is the normative contract for reusable design tokens and package output; the package ships tokens, the CSS kit (structural geometry plus framework-agnostic brand display components), and assets. Repo-only `examples/` specimens prove that public surface. Standard, interactive, and section UI ships as React components from `@nadicodeai/ui`, not from here. Paths here are relative to `design-system/`; run commands from this directory, or with `-w design-system` from the repo root.
|
|
3
|
+
The `@nadicodeai/design-system` npm workspace. `DESIGN.md` is the normative contract for reusable design tokens and package output; the package ships tokens, the CSS kit (structural geometry plus framework-agnostic brand display components), and assets. Repo-only `examples/` specimens prove that public surface. Standard, interactive, and section UI ships as React components from `@nadicodeai/ui`, not from here. Paths here are relative to `design-system/`; run commands from this directory, or with `-w @nadicodeai/design-system` from the repo root.
|
|
4
4
|
|
|
5
5
|
## Commands
|
|
6
6
|
|
|
7
|
+
Proof escalates by the ladder in the root `AGENTS.md` "Commands": `npm run check -w @nadicodeai/design-system` and `npm run test -w @nadicodeai/design-system` before pushing. `check` carries the `DESIGN.md` contract lint, so a contract edit needs no separate command. This workspace has no app to boot: it ships a package, and `examples/` renders through the website's verification routes.
|
|
8
|
+
|
|
7
9
|
| Command | When |
|
|
8
10
|
| --- | --- |
|
|
9
|
-
| `npm run
|
|
10
|
-
| `npm run
|
|
11
|
-
| `npm run generate:
|
|
12
|
-
| `npm run
|
|
13
|
-
| `npm run test:visual` | Rendered CSS checks (`playwright.visual.config.ts`, `tests/visual/`) |
|
|
14
|
-
|
|
15
|
-
Handoff gate: `npm run lint:design && npm run lint && npm run build && npm run test`.
|
|
11
|
+
| `npm run build -w @nadicodeai/design-system` | After any `DESIGN.md` edit; regenerates every `dist/` artifact (tokens, Tailwind data, icons, complete CSS bundle) |
|
|
12
|
+
| `npm run generate:icons -w @nadicodeai/design-system` | After bumping `lucide-static`; rebakes `dist/icons/` (also runs inside `build`) |
|
|
13
|
+
| `npm run generate:favicons -w @nadicodeai/design-system` | After a favicon source change; the output is git-tracked and the build does not regenerate it |
|
|
14
|
+
| `npm run test:visual -w @nadicodeai/design-system` | Rendered CSS checks (`playwright.visual.config.ts`, `tests/visual/`), outside the browser-free default suite |
|
|
16
15
|
|
|
17
16
|
## Routing
|
|
18
17
|
|
|
@@ -41,4 +40,4 @@ Handoff gate: `npm run lint:design && npm run lint && npm run build && npm run t
|
|
|
41
40
|
- Authoring is contract-first: a visual behavior comes from `DESIGN.md`, from our own shipped surfaces, or from an explicit user approval — never from another product's rendered output (ADR 0047). Screenshots verify, they never author. Ask when the contract leaves a decision open, and stop and re-read `DESIGN.md` before a second visual patch to the same component.
|
|
42
41
|
- Name everything as NadicodeAI-owned primitives. A source brand appears only in a `../docs/adr/` decision record, as the history of what once inspired a choice; never in a name, a comment, a contract, or any living design document (ADR 0047).
|
|
43
42
|
- Any change to package-consumed output ends with an explicit release decision, a version bump or a `[no-publish]` commit marker (enforced by the pre-push release gate; procedure: `../docs/internal/npm-publishing.md`).
|
|
44
|
-
- The deleted `design-canvas/` prototypes live only in git history. `src/css/motion.css` owns shared runtime motion primitives
|
|
43
|
+
- The deleted `design-canvas/` prototypes and static chat/autoplay surface live only in git history. `src/css/motion.css` owns shared runtime motion primitives; never reconstruct the prototypes or add a runtime JS surface.
|
package/CONTEXT.md
CHANGED
|
@@ -60,6 +60,12 @@ A visual family for presenting a concrete content type, such as an image or arti
|
|
|
60
60
|
**Agentic work surface**:
|
|
61
61
|
A NadicodeAI visual family for showing people and agents working together through conversations, artifacts, approvals, tools, handoffs, traces, and inspectable state.
|
|
62
62
|
|
|
63
|
+
**Agent visual**:
|
|
64
|
+
The decorative metaball identity assigned explicitly to a persistent Agent by
|
|
65
|
+
type. It identifies the Agent across products without carrying status, runtime
|
|
66
|
+
activity, capability, or work output.
|
|
67
|
+
_Avoid_: Agent glyph, Agent avatar
|
|
68
|
+
|
|
63
69
|
**App-owned product feature**:
|
|
64
70
|
A product-specific route, screen, use case, or behavior owned by the consuming app rather than by the reusable design or UI packages.
|
|
65
71
|
|
package/DESIGN.md
CHANGED
|
@@ -20,6 +20,8 @@ colors:
|
|
|
20
20
|
canvas: "#ffffff"
|
|
21
21
|
canvas-soft: "#fafafa"
|
|
22
22
|
canvas-soft-2: "#f5f5f5"
|
|
23
|
+
material-workspace: "#f7f7f7"
|
|
24
|
+
material-solid: "#ffffff"
|
|
23
25
|
line: "#e5e5e5"
|
|
24
26
|
input: "#757575"
|
|
25
27
|
seam: "#d4d4d4"
|
|
@@ -79,6 +81,8 @@ colors:
|
|
|
79
81
|
dark-canvas: "#000000"
|
|
80
82
|
dark-canvas-soft: "#111111"
|
|
81
83
|
dark-canvas-soft-2: "#1a1a1a"
|
|
84
|
+
dark-material-workspace: "#000000"
|
|
85
|
+
dark-material-solid: "#000000"
|
|
82
86
|
dark-ink: "#ededed"
|
|
83
87
|
dark-body: "#c7c7c7"
|
|
84
88
|
dark-muted: "#8f8f8f"
|
|
@@ -356,7 +360,7 @@ Every value a role needs is carried by the role token itself; there are no ten-s
|
|
|
356
360
|
- **Semantic feedback** (`{colors.success}` = verde with `{colors.success-soft}`/`{colors.success-deep}`; `{colors.error}` = rosso funzionale `#d3302f` with `{colors.error-soft}`/`{colors.error-deep}`; `{colors.warning}` = giallo `#ffc220` with `{colors.warning-soft}`/`{colors.warning-deep}`; `{colors.info}` = cobalto `#1e3cff` with `{colors.info-soft}`/`{colors.info-deep}`): validation, caution, approval, and operational feedback. In each pair the `-soft` value is the tinted tag/banner ground and the `-deep` value is the AA-clearing text on it. On a solid `error` fill (the shadcn `destructive` role) text is white; on a solid `warning` or `success` fill text is ink. The success pair intentionally reuses the link pair's AA-safe verde values; its feedback meaning remains distinct from inline navigation and entity-status semantics.
|
|
357
361
|
- **Accent** (`{colors.accent}` = arancio `#ff5a1f`): the attention accent for highlights, exception flags, and emphasis marks. It is an accent only — never a fill, background, or body-text colour, and it never carries text. Do not conflate this functional `accent` with the identically-named shadcn surface role: that role is a neutral (`{colors.canvas-soft-2}` in light, `{colors.dark-canvas-soft-2}` in dark) and carries no hue despite the shared word.
|
|
358
362
|
- **Flag Red** (`{colors.flag-red}` = `#d3302f`): the identity-mark red alias. It shares its hex with `{colors.error}` but stays a distinct role name — `flag-red` is identity, `error` is validation feedback. The attention accent is arancio, not flag red.
|
|
359
|
-
- **Workflow States** (`{colors.state-ready}` neutral, `{colors.state-running}` cobalto, `{colors.state-review}` giallo, `{colors.state-blocked}` rosso, `{colors.state-complete}` verde): the left-border/state vocabulary for agentic work surfaces — cobalto means in motion, verde means done. The dark counterparts (`{colors.dark-state-ready}`, `{colors.dark-state-running}`, `{colors.dark-state-review}`, `{colors.dark-state-blocked}`, `{colors.dark-state-complete}`) keep the same functional identity. These colours are carried
|
|
363
|
+
- **Workflow States** (`{colors.state-ready}` neutral, `{colors.state-running}` cobalto, `{colors.state-review}` giallo, `{colors.state-blocked}` rosso, `{colors.state-complete}` verde): the left-border/state vocabulary for agentic work surfaces — cobalto means in motion, verde means done. The dark counterparts (`{colors.dark-state-ready}`, `{colors.dark-state-running}`, `{colors.dark-state-review}`, `{colors.dark-state-blocked}`, `{colors.dark-state-complete}`) keep the same functional identity. These colours are carried by non-text state accents only — meter and bullet segments, delta marks, and the brand book's own rails; label text stays on the neutral foreground roles for contrast in both themes. Status is not one of their jobs: every status the product renders is the Badge status vocabulary (see `## Status Vocabulary`), which reads from the semantic feedback and link pairs, and the two token sets never cross.
|
|
360
364
|
|
|
361
365
|
### Chart categoricals (functional tier)
|
|
362
366
|
|
|
@@ -438,8 +442,8 @@ All body, title, caption, and code typography uses `letterSpacing: 0px`. Do not
|
|
|
438
442
|
| `{typography.body-sm}` | 14px | 400 | 20px | Secondary copy, nav, compact cell copy. |
|
|
439
443
|
| `{typography.body-sm-strong}` | 14px | 500 | 20px | Emphasised secondary copy and compact labels. |
|
|
440
444
|
| `{typography.caption}` | 12px | 400 | 16px | Footer secondary lines and badge labels. |
|
|
441
|
-
| `{typography.caption-strong}` | 12px | 500 | 16px |
|
|
442
|
-
| `{typography.caption-mono}` | 12px | 500 | 16px | Eyebrows, identifiers and code
|
|
445
|
+
| `{typography.caption-strong}` | 12px | 500 | 16px | Compact emphasised labels on chrome and chips. |
|
|
446
|
+
| `{typography.caption-mono}` | 12px | 500 | 16px | Eyebrows, identifiers and code. |
|
|
443
447
|
| `{typography.code}` | 13px | 400 | 20px | Tool calls, snippets, traces. |
|
|
444
448
|
| `{typography.button-lg}` | 16px | 500 | 24px | Marketing-scale button labels. |
|
|
445
449
|
| `{typography.button-md}` | 14px | 500 | 18px | Standard button and control labels. |
|
|
@@ -482,7 +486,7 @@ Kernel compositions arrange approved primitives for a content role. They must no
|
|
|
482
486
|
Each reusable concern has one home and one authoring surface, so a member is documented and shipped in exactly one place:
|
|
483
487
|
|
|
484
488
|
- **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.
|
|
485
|
-
- **Framework-agnostic CSS components** — the brand/display CSS components that remain in this package (
|
|
489
|
+
- **Framework-agnostic CSS components** — the brand/display CSS components that remain in this package (agent-work artifacts, `image`, and the small label/badge/link metadata components). Their names and semantics live once in `## Components`; design-system CSS realises that catalog without a second recipe or component-token hierarchy.
|
|
486
490
|
- **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 do not add a second component catalog here.
|
|
487
491
|
- **Layout grammar** — the page-frame, row, lane, seam, stage, and marker system documented across this `## Layout` section, carried by the layout CSS layer.
|
|
488
492
|
- **Specimens** — static demonstrations of already-defined primitives. They invent no geometry, seams, heights, or responsive behavior; they only assemble shipped tiers for inspection.
|
|
@@ -531,28 +535,33 @@ These live helpers are part of the kept page-grammar layout layer. They support
|
|
|
531
535
|
|
|
532
536
|
NadicodeAI website depth is flat and architectural. Hairlines, contrast, dotted fields, diagonal fills, and dark action bands create hierarchy. The public website does not use floating card stacks as its main structure; the page frame and row grid remain dominant.
|
|
533
537
|
|
|
534
|
-
Product UI uses
|
|
538
|
+
Product UI uses one shared material ladder. The workspace is one continuous ground (`{colors.material-workspace}` / `{colors.dark-material-workspace}`); every solid object uses the same fill (`{colors.material-solid}` / `{colors.dark-material-solid}`). In dark mode, both are true black. The workspace remains legible because it carries the existing `dotted-field` texture and solid objects occlude it. Elevation never means progressively greyer cards. Physical distance changes only the `shadow-plugin` falloff: `smooth-shadow-ring-md` for resting content, then `lg`, `xl`, and `2xl` when an object is physically raised, floating, or modal. Each utility already integrates the plugin's adaptive optical ring, including the plugin's 18% white dark-mode ring, so an elevated root never adds a border, second ring, local ring tint, or opacity override. Product code chooses only the semantic role.
|
|
535
539
|
|
|
536
|
-
|
|
540
|
+
Glass is a material variant, not an elevation step. It is reserved for compact control chrome floating over legible content. Cards, KPIs, tables, inspectors, and ordinary modal bodies remain solid. Reduced-transparency mode replaces glass with the same solid material at the same elevation.
|
|
541
|
+
|
|
542
|
+
The Google design schema does not define opacity groups. These declarations are therefore the authored material-token source inside this contract. The build reads this block strictly and emits generated `--nc-*` hooks. The UI package owns the exact `shadow-plugin` dependency and maps semantic component roles to its utilities without copying the vendor shadow values into this contract.
|
|
537
543
|
|
|
538
544
|
```css material-tokens
|
|
539
545
|
--nc-material-scrim-opacity: 10%;
|
|
540
|
-
--nc-material-
|
|
541
|
-
--nc-material-
|
|
542
|
-
--nc-material-
|
|
543
|
-
--nc-material-shadow-sheet: 0 2px 2px rgb(0 0 0 / 4%), 0 8px 16px -4px rgb(0 0 0 / 4%);
|
|
546
|
+
--nc-material-glass-opacity: 76%;
|
|
547
|
+
--nc-material-glass-blur: 28px;
|
|
548
|
+
--nc-material-glass-saturation: 116%;
|
|
544
549
|
```
|
|
545
550
|
|
|
546
|
-
| Material role |
|
|
547
|
-
|
|
|
548
|
-
|
|
|
549
|
-
| Resting
|
|
550
|
-
|
|
|
551
|
-
|
|
|
552
|
-
|
|
|
553
|
-
|
|
|
554
|
-
|
|
555
|
-
|
|
551
|
+
| Material role | Construction | Use |
|
|
552
|
+
| ------------- | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
553
|
+
| Workspace | `dotted-field` on `{colors.material-workspace}` / `{colors.dark-material-workspace}`; no edge or shadow | The continuous work area behind product objects |
|
|
554
|
+
| Resting | Solid fill; plugin-default integrated ring; `smooth-shadow-ring-md`; `{rounded.3xl}` (16 px) | KPI, card, table, setting, and persistent content surfaces |
|
|
555
|
+
| Raised | Same solid fill and ring; `smooth-shadow-ring-lg`; `{rounded.3xl}` (16 px) | Active work, a selected object, or an attached inspector above resting siblings |
|
|
556
|
+
| Floating | Same solid fill and ring; `smooth-shadow-ring-xl`; role-specific corner radius | Compact menus, popovers, dropdowns, and anchored surfaces use `{rounded.2xl}` (12 px); small artifacts such as tooltips and toasts keep `{rounded.md}` (6 px); detached product surfaces may use `{rounded.3xl}` (16 px) |
|
|
557
|
+
| Modal | Same solid fill and ring; `smooth-shadow-ring-2xl`; `{rounded.3xl}` (16 px) | Dialog, sheet, drawer, and takeover |
|
|
558
|
+
| Glass control | Translucent solid fill at 76%, 28 px backdrop blur, integrated plugin ring, and the falloff for its physical level | Compact control chrome floating above content; never a content container |
|
|
559
|
+
|
|
560
|
+
`Card` is the fundamental product container. Its content does not create a second material family: KPIs, Agent cards, settings, and ordinary grouped content use the resting role unless the object is physically raised. Interaction variants may change state or emphasis without changing the material role.
|
|
561
|
+
|
|
562
|
+
Absence follows the container that owns it. A page-level or region-level empty state is an opaque solid region with a dashed boundary. An empty state inside a Card is transparent and unframed so it does not draw a second container inside the first.
|
|
563
|
+
|
|
564
|
+
Resting form controls are not elevated material planes. They keep the 1 px `{colors.input}` / `{colors.dark-input}` boundary, `{rounded.md}` (6 px), and no shadow. Their inline padding is `{spacing.control-padding-inline}`, textareas use `{spacing.xs}` block padding, and every default control is at least `{spacing.control-height}` high.
|
|
556
565
|
|
|
557
566
|
Modal overlays use `{colors.scrim}` / `{colors.dark-scrim}` at the generated `scrim` opacity with no blur. Focus is not elevation: controls use a full-opacity `{spacing.focus-ring-width}` `{colors.focus-ring}` / `{colors.dark-focus-ring}` ring with no offset. Avoid nested decorative borders: one container owns containment, while child groups use spacing, headings, or dividers only when those dividers clarify structure.
|
|
558
567
|
|
|
@@ -563,12 +572,12 @@ On coarse or non-hover input capability, every interactive target is at least 44
|
|
|
563
572
|
Corners are restrained and assigned by material role.
|
|
564
573
|
|
|
565
574
|
- Use `{rounded.none}` for page rows, frame edges, grid cells, and structural modules.
|
|
566
|
-
- Use `{rounded.md}` (6 px) for
|
|
567
|
-
- Use `{rounded.2xl}` (12 px) for menus, popovers, and
|
|
568
|
-
- Use `{rounded.3xl}` (16 px) for inset sheets and takeovers.
|
|
575
|
+
- Use `{rounded.md}` (6 px) for controls, buttons, chips, status tags, and small artifacts.
|
|
576
|
+
- Use `{rounded.2xl}` (12 px) for compact menus, popovers, dropdowns, and anchored floating surfaces.
|
|
577
|
+
- Use `{rounded.3xl}` (16 px) for resting and raised product content surfaces, detached inspectors, modal dialogs, inset sheets, and takeovers.
|
|
569
578
|
- Use `{rounded.full}` only for intrinsically circular identity/avatar chrome and compact control marks whose geometry is inherently round or pill-shaped. It never turns a content surface, button, badge, or navigation item into a pill by default.
|
|
570
579
|
|
|
571
|
-
Public page-grammar cells are not cards and remain square because their parent frame supplies the visual system. Product cards
|
|
580
|
+
Public page-grammar cells are not cards and remain square because their parent frame supplies the visual system. Product cards use the resting material role; they do not gain a second border, nested ring, or stronger elevation merely because they contain grouped settings.
|
|
572
581
|
|
|
573
582
|
## Motion
|
|
574
583
|
|
|
@@ -596,55 +605,15 @@ Interactive CSS components must expose a visible `:focus-visible` state using th
|
|
|
596
605
|
|
|
597
606
|
Content surfaces display specific content types inside the grammar. They are valid when the content exists; they do not replace the page frame, row model, or seam rules.
|
|
598
607
|
|
|
599
|
-
**`image`** — editorial media mount, the single home for art-directed imagery inside the grammar. A bounded media fill (img, picture, video, or inline SVG) with an optional mono tag chip overlaid on the media and an optional body-tone caption bar below it, both typed by the generated caption utilities applied in markup. Square-cornered (`{rounded.none}`): a mounted print, not a floating card — the parent frame supplies the visual system. With `data-frame="true"` it draws exactly one hairline (its own `{colors.line}` border), so it sits inside a borderless `panel-cell` or a visual slot without repairing or stacking onto any grid seam. The aspect ratio is the per-instance `--nc-image-ratio` knob (default 4 / 3) — set the prop on the element, never re-derive geometry inline. Variant: `data-strip="true"` is the full-width divider form for thin editorial bands between page rows (thread, texture, panorama) — the ratio unlocks and the height resolves from the responsive `{spacing.h-strip-*}` tokens through the layout-layer collapsed alias. Use `image` for every illustrated image, photographic surface, or image divider
|
|
608
|
+
**`image`** — editorial media mount, the single home for art-directed imagery inside the grammar. A bounded media fill (img, picture, video, or inline SVG) with an optional mono tag chip overlaid on the media and an optional body-tone caption bar below it, both typed by the generated caption utilities applied in markup. Square-cornered (`{rounded.none}`): a mounted print, not a floating card — the parent frame supplies the visual system. With `data-frame="true"` it draws exactly one hairline (its own `{colors.line}` border), so it sits inside a borderless `panel-cell` or a visual slot without repairing or stacking onto any grid seam. The aspect ratio is the per-instance `--nc-image-ratio` knob (default 4 / 3) — set the prop on the element, never re-derive geometry inline. Variant: `data-strip="true"` is the full-width divider form for thin editorial bands between page rows (thread, texture, panorama) — the ratio unlocks and the height resolves from the responsive `{spacing.h-strip-*}` tokens through the layout-layer collapsed alias. Use `image` for every illustrated image, photographic surface, or image divider. Conversation artifacts render through assistant-ui rather than a design-system CSS family.
|
|
600
609
|
|
|
601
610
|
### Agentic Work Surfaces
|
|
602
611
|
|
|
603
|
-
Agentic work surfaces are the NadicodeAI-specific layer. They show
|
|
604
|
-
|
|
605
|
-
**`artifact-surface`** — inspectable output area. Use for proposal previews, reports, plans, spreadsheets, schedules, approval states, source traces, run logs, workflow maps, and conversation artifacts.
|
|
606
|
-
|
|
607
|
-
**`artifact-preview`** — compact inspectable artifact card for an agent-produced document, sheet, report, or code excerpt. The header identifies the artifact kind and the body carries the preview; use `artifact-surface` for a larger work area.
|
|
608
|
-
|
|
609
|
-
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.
|
|
610
|
-
|
|
611
|
-
**`status-tag-gray`** — default and terminal entity status: no action pending, nothing to watch (inactive, archived, rejected, canceled, expired, revoked, denied).
|
|
612
|
-
|
|
613
|
-
**`status-tag-green`** — a healthy, active, or successfully completed entity status.
|
|
614
|
-
|
|
615
|
-
**`status-tag-red`** — a failed, blocked, or otherwise exceptional entity status that needs attention.
|
|
616
|
-
|
|
617
|
-
**`status-tag-amber`** — a degrading, retiring, or past-due entity status between healthy and failed.
|
|
618
|
-
|
|
619
|
-
**`status-tag-blue`** — an in-progress, pending, or trial entity status still moving toward a resolution.
|
|
620
|
-
|
|
621
|
-
**`chat-thread`** — conversation container showing how people instruct, correct, review, or approve agents. Static markup always renders the complete conversation. The package's optional `chat-autoplay.js` progressive enhancer activates only on `data-nc-autoplay`, reveals messages in order while keeping the newest turn visible, loops while the thread is in view, and injects its own pause/resume control. It shows the complete thread immediately when reduced motion is requested. Consumers never author the enhancer control in static markup.
|
|
612
|
+
Agentic work surfaces are the NadicodeAI-specific display layer outside the conversation renderer. They show concrete work output or workflow state such as memory, state, run progress, identity, and handoffs. Conversation messages, tools, artifacts, approvals, and pending indicators belong to assistant-ui.
|
|
622
613
|
|
|
623
|
-
|
|
614
|
+
Agent identity is decorative product identity, not a work artifact or a status signal. Its approved metaball form, closed Agent-type recipes, four surface treatments, palette, still frames, and motion rules live in [`brand/visual-design/AGENT-VISUAL-SYSTEM.md`](../brand/visual-design/AGENT-VISUAL-SYSTEM.md). `@nadicodeai/ui` owns the typed React implementation. Consuming apps assign a recipe explicitly and own placement, data, actions, and accessible meaning.
|
|
624
615
|
|
|
625
|
-
**`
|
|
626
|
-
|
|
627
|
-
**`tool-call-trace`** — compact code/trace row. Use only when tool use is relevant to the explanation.
|
|
628
|
-
|
|
629
|
-
State-tag variants share the same compact rectangular shape at `{typography.caption-mono}` and differentiate by a 3 px colored `border-left` consuming the matching `{colors.state-*}` token. Shape carries meaning; color carries variant.
|
|
630
|
-
|
|
631
|
-
**`state-tag-ready`** — workflow state tag for work that is ready or waiting to start. Uses `{colors.state-ready}` for the left edge.
|
|
632
|
-
|
|
633
|
-
**`state-tag-running`** — workflow state tag for work currently being executed by an agent or system. Uses `{colors.state-running}` for the left edge.
|
|
634
|
-
|
|
635
|
-
**`state-tag-review`** — workflow state tag for human review or approval. Uses `{colors.state-review}` for the left edge.
|
|
636
|
-
|
|
637
|
-
**`state-tag-blocked`** — workflow state tag for blocked work or failed preconditions. Uses `{colors.state-blocked}` for the left edge.
|
|
638
|
-
|
|
639
|
-
**`state-tag-complete`** — workflow state tag for completed work. Uses `{colors.state-complete}` for the left edge.
|
|
640
|
-
|
|
641
|
-
**`state-row`** — full-width workflow-state divider inside an agentic work surface. Its bounded hairlines belong to the row and its dot consumes the same state token as the matching `state-tag` variant.
|
|
642
|
-
|
|
643
|
-
**`typing-dots`** — compact agent typing indicator. It uses the agent accent rail and the shared motion hooks; reduced-motion behavior comes from the package motion layer.
|
|
644
|
-
|
|
645
|
-
**`approval-gate`** — human-in-the-loop pause surface. Use when an agent action requires explicit review, correction, approval, or rejection.
|
|
646
|
-
|
|
647
|
-
**`agent-avatar`** — identity slot for an agent personality or role. The chrome is reusable; the visual asset is project-specific.
|
|
616
|
+
**`artifact-surface`** — inspectable output area outside a conversation. Use for proposal previews, reports, plans, spreadsheets, schedules, run logs, and workflow maps.
|
|
648
617
|
|
|
649
618
|
**`usage-meter`** — token, cost, latency, or run-count display.
|
|
650
619
|
|
|
@@ -654,6 +623,34 @@ State-tag variants share the same compact rectangular shape at `{typography.capt
|
|
|
654
623
|
|
|
655
624
|
**`handoff-banner`** — agent-to-agent or human-to-agent handoff surface. It explains the handoff reason and destination. It carries a 3 px colored `border-left` consuming the matching `{colors.link}` token and a leading direction marker tinted with the same token; the accent edge and arrow carry the handoff direction.
|
|
656
625
|
|
|
626
|
+
## Status Vocabulary
|
|
627
|
+
|
|
628
|
+
Status is the one thing every surface in the product says: an agent is active, a
|
|
629
|
+
key is revoked, an invitation is waiting, a run is blocked. It is said one way.
|
|
630
|
+
|
|
631
|
+
**What it is.** The single status carrier is the React `Badge` from
|
|
632
|
+
`@nadicodeai/ui`, rendered in one of five semantic tones with a small mark in
|
|
633
|
+
its icon slot. It is not a CSS component in this package: there is no
|
|
634
|
+
framework-neutral status class, and a static surface that needs to show a status
|
|
635
|
+
shows it as ordinary text. Its React API — the tone variants, the icon slot, and
|
|
636
|
+
what a consuming app must supply — is contracted in
|
|
637
|
+
[`@nadicodeai/ui/docs/contract.md`](../@nadicodeai/ui/docs/contract.md).
|
|
638
|
+
|
|
639
|
+
**Why.** A status read by colour alone is not read by everyone, and a product
|
|
640
|
+
that speaks status in three grammars teaches its next surface to invent a
|
|
641
|
+
fourth. One badge, carrying an icon and a word with the tone only reinforcing
|
|
642
|
+
both, is legible without colour and leaves nothing to invent.
|
|
643
|
+
|
|
644
|
+
**What it does.** Five tones, each a soft ground with its deep label from an
|
|
645
|
+
existing semantic pair: gray on the neutral spine for the default and every
|
|
646
|
+
terminal, no-action state; green on the link pair for healthy and complete; red
|
|
647
|
+
on the error pair for unusable and failed; amber on the warning pair for waiting
|
|
648
|
+
on a decision; blue on the info pair for a step in motion. One mark per tone, so
|
|
649
|
+
the shape repeats the tone rather than adding a second axis. The families —
|
|
650
|
+
which statuses exist and which tone each value takes — belong to the consuming
|
|
651
|
+
app, because they are its domain, not this contract's; the Portal keeps its
|
|
652
|
+
whole map in one module and no surface picks a status colour anywhere else.
|
|
653
|
+
|
|
657
654
|
## Do's and Don'ts
|
|
658
655
|
|
|
659
656
|
### Do
|
|
@@ -663,13 +660,13 @@ State-tag variants share the same compact rectangular shape at `{typography.capt
|
|
|
663
660
|
- Do use `side-fill`, guide strips, or component-owned fillers whenever content does not occupy the outer columns.
|
|
664
661
|
- Do use `{spacing.guide}` and `{colors.line}` for ordinary seams.
|
|
665
662
|
- Do use `{colors.input}` / `{colors.dark-input}` for resting control boundaries and the dedicated focus-ring roles for keyboard focus.
|
|
666
|
-
- Do use exactly one material role per container
|
|
663
|
+
- Do use exactly one material role per product container; structural page-grammar cells remain border-only, while product cards, menus, popovers, dialogs, sheets, and takeovers use their specified material treatment.
|
|
667
664
|
- Do tune line visibility by changing `{colors.line}` at the token contract, then rebuilding generated exports.
|
|
668
665
|
- Do use `{colors.cross}` for crosshair color while keeping crosshair weight equal to `{spacing.guide}`.
|
|
669
666
|
- Do use fixed height tokens for default component/specimen height and let content grow only when required.
|
|
670
667
|
- Do separate different story beats into separate rows.
|
|
671
668
|
- Do use the full-lane `stage` geometry for one major use-case/artifact story, not as a container for every page concept.
|
|
672
|
-
- Do
|
|
669
|
+
- Do use Agent identity visuals only to identify an Agent or its explicit type; use assistant-ui and the agentic work surfaces above for conversations, artifacts, review states, and work output.
|
|
673
670
|
- Do keep ordinary CSS components compact and subordinate to the page grammar.
|
|
674
671
|
- Do use pricing, logo, banner, and showcase compositions only when the page truly contains that content type.
|
|
675
672
|
|
|
@@ -679,7 +676,7 @@ State-tag variants share the same compact rectangular shape at `{typography.capt
|
|
|
679
676
|
- Don't draw the same seam from two adjacent elements.
|
|
680
677
|
- Don't add borders inside cells to fix visual seams; fix the owner layer.
|
|
681
678
|
- Don't use a 1 px decorative line as an input boundary, or locally increase card border weight to manufacture hierarchy.
|
|
682
|
-
- Don't stack borders around
|
|
679
|
+
- Don't stack borders or rings around an elevated surface, promote a resting card because its content is important, or blur modal scrims.
|
|
683
680
|
- Don't tune seam contrast with local opacity, raw colors, or component-specific border colors.
|
|
684
681
|
- Don't use viewport-scaled typography.
|
|
685
682
|
- Don't use negative letter spacing in the website kernel.
|
|
@@ -747,7 +744,7 @@ The NadicodeAI logo has three approved forms:
|
|
|
747
744
|
|
|
748
745
|
Other companies' marks are not NadicodeAI company logos and are not governed by anything in this section. They are generated identity images owned by `@nadicodeai/ui/components/brand-icons`, decided in [`docs/adr/0042-third-party-brand-marks-are-generated-identity-images.md`](../docs/adr/0042-third-party-brand-marks-are-generated-identity-images.md). A third-party mark never enters a NadicodeAI logo form, composition, or clear-space measurement.
|
|
749
746
|
|
|
750
|
-
Nadia's portrait and generated imagery are not NadicodeAI company logos.
|
|
747
|
+
Nadia's portrait, Agent identity visuals, and generated imagery are not NadicodeAI company logos. Nadia's identity and selection rules live in [`brand/visual-design/NADIA-VISUAL-IDENTITY.md`](../brand/visual-design/NADIA-VISUAL-IDENTITY.md); the Agent identity system lives in [`brand/visual-design/AGENT-VISUAL-SYSTEM.md`](../brand/visual-design/AGENT-VISUAL-SYSTEM.md); editorial imagery routes through [`brand/visual-design/EDITORIAL-ILLUSTRATION.md`](../brand/visual-design/EDITORIAL-ILLUSTRATION.md). This contract owns only the package delivery interface.
|
|
751
748
|
|
|
752
749
|
The approved transparent Nadia master ships at `assets/nadia-solid-surface`.
|
|
753
750
|
|
package/README.md
CHANGED
|
@@ -84,14 +84,6 @@ Consumer overrides belong in an explicit later layer:
|
|
|
84
84
|
|
|
85
85
|
The exact layer order and ownership rules are defined in `DESIGN.md`.
|
|
86
86
|
|
|
87
|
-
### Optional chat auto-play
|
|
88
|
-
|
|
89
|
-
Static chat markup needs no JavaScript. To opt a `data-nc-autoplay` thread into
|
|
90
|
-
progressive playback, include the public
|
|
91
|
-
`@nadicodeai/design-system/css/chat-autoplay.js` export. The `chat-thread`
|
|
92
|
-
entry in [`DESIGN.md`](./DESIGN.md#agentic-work-surfaces) owns the behavior and
|
|
93
|
-
accessibility contract.
|
|
94
|
-
|
|
95
87
|
### Worked example (static HTML)
|
|
96
88
|
|
|
97
89
|
```html
|
|
@@ -109,26 +101,13 @@ accessibility contract.
|
|
|
109
101
|
<div class="nc-page-frame">
|
|
110
102
|
<section class="nc-page-row">
|
|
111
103
|
<div class="nc-row-lane nc-row-lane-active">
|
|
112
|
-
|
|
113
|
-
<div class="nc-chat-thread" data-nc-autoplay>
|
|
114
|
-
<div class="nc-chat-thread-body">
|
|
115
|
-
<div class="nc-chat-bubble-user">Which contract template should I use?</div>
|
|
116
|
-
<div class="nc-chat-bubble-agent" data-accent="green">
|
|
117
|
-
Use the approved 2026 revision in Drive · Legal · Templates. It already has the updated privacy clauses.
|
|
118
|
-
</div>
|
|
119
|
-
</div>
|
|
120
|
-
</div>
|
|
104
|
+
<div class="nc-artifact-surface">Inspectable agent output</div>
|
|
121
105
|
</div>
|
|
122
106
|
</section>
|
|
123
107
|
</div>
|
|
124
108
|
</main>
|
|
125
|
-
|
|
126
|
-
<!-- Optional: omit this script and the thread above stays a full static conversation. -->
|
|
127
|
-
<script src="https://unpkg.com/@nadicodeai/design-system/css/chat-autoplay.js"></script>
|
|
128
109
|
</body>
|
|
129
110
|
</html>
|
|
130
111
|
```
|
|
131
112
|
|
|
132
|
-
`examples/chat-showcase.html` is the live proof page for the chat CSS components and auto-play enhancer.
|
|
133
|
-
|
|
134
113
|
Use the monorepo's `brand/brand-book/` for NadicodeAI story, positioning, buyer, promise, method, use cases, technology story, trust doctrine, identity, voice, visual direction, sales behavior, language, and boundaries.
|