@nadicodeai/ui 0.2.0 → 0.3.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 (72) hide show
  1. package/AGENTS.md +2 -0
  2. package/README.md +29 -0
  3. package/dist/components/action-band.d.ts.map +1 -1
  4. package/dist/components/action-band.js +2 -1
  5. package/dist/components/agent-message.d.ts +2 -1
  6. package/dist/components/agent-message.d.ts.map +1 -1
  7. package/dist/components/agent-message.js +14 -21
  8. package/dist/components/agent-thread.d.ts.map +1 -1
  9. package/dist/components/agent-thread.js +3 -10
  10. package/dist/components/ai-elements/open-in-chat.d.ts.map +1 -1
  11. package/dist/components/ai-elements/open-in-chat.js +7 -18
  12. package/dist/components/alert-dialog.js +1 -1
  13. package/dist/components/alert.js +1 -1
  14. package/dist/components/automation-section.d.ts.map +1 -1
  15. package/dist/components/automation-section.js +38 -43
  16. package/dist/components/benefits-bento.js +1 -1
  17. package/dist/components/bento.d.ts +2 -2
  18. package/dist/components/bento.d.ts.map +1 -1
  19. package/dist/components/bento.js +4 -3
  20. package/dist/components/button.js +5 -5
  21. package/dist/components/card.js +1 -1
  22. package/dist/components/demo-surface.d.ts +10 -2
  23. package/dist/components/demo-surface.d.ts.map +1 -1
  24. package/dist/components/demo-surface.js +9 -2
  25. package/dist/components/dialog.js +1 -1
  26. package/dist/components/faq.d.ts +6 -5
  27. package/dist/components/faq.d.ts.map +1 -1
  28. package/dist/components/faq.js +8 -6
  29. package/dist/components/files-preview.d.ts.map +1 -1
  30. package/dist/components/files-preview.js +8 -17
  31. package/dist/components/hero-split.d.ts.map +1 -1
  32. package/dist/components/hero-split.js +3 -2
  33. package/dist/components/input.js +1 -1
  34. package/dist/components/installer-shell.d.ts.map +1 -1
  35. package/dist/components/installer-shell.js +9 -12
  36. package/dist/components/logo-band.d.ts.map +1 -1
  37. package/dist/components/logo-band.js +2 -3
  38. package/dist/components/pricing.d.ts.map +1 -1
  39. package/dist/components/pricing.js +5 -3
  40. package/dist/components/seam-grid.d.ts +30 -0
  41. package/dist/components/seam-grid.d.ts.map +1 -0
  42. package/dist/components/seam-grid.js +30 -0
  43. package/dist/components/section-intro.js +1 -1
  44. package/dist/components/select.js +1 -1
  45. package/dist/components/shift-band.d.ts.map +1 -1
  46. package/dist/components/shift-band.js +2 -1
  47. package/dist/components/state-notice.d.ts +13 -0
  48. package/dist/components/state-notice.d.ts.map +1 -0
  49. package/dist/components/state-notice.js +8 -0
  50. package/dist/components/stats-band.d.ts.map +1 -1
  51. package/dist/components/stats-band.js +4 -5
  52. package/dist/components/testimonials.d.ts.map +1 -1
  53. package/dist/components/testimonials.js +3 -4
  54. package/dist/components/textarea.js +1 -1
  55. package/dist/components/use-case-bento.d.ts +4 -2
  56. package/dist/components/use-case-bento.d.ts.map +1 -1
  57. package/dist/components/use-case-bento.js +3 -3
  58. package/dist/components/watch-it-work-band.d.ts +3 -2
  59. package/dist/components/watch-it-work-band.d.ts.map +1 -1
  60. package/dist/components/watch-it-work-band.js +4 -4
  61. package/dist/index.d.ts +2 -0
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +2 -0
  64. package/dist/lib/agent-work-state.d.ts +36 -0
  65. package/dist/lib/agent-work-state.d.ts.map +1 -0
  66. package/dist/lib/agent-work-state.js +36 -0
  67. package/dist/lib/seam.d.ts +29 -0
  68. package/dist/lib/seam.d.ts.map +1 -0
  69. package/dist/lib/seam.js +30 -0
  70. package/dist/styles/globals.css +46 -36
  71. package/docs/agents/nadicodeai-ui.md +22 -0
  72. package/package.json +3 -1
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { cn } from "../lib/utils.js";
2
+ import { SeamGrid } from "./seam-grid.js";
3
3
  import { Bento, BentoItem } from "./bento.js";
4
- import { DemoSurface } from "./demo-surface.js";
5
- function WatchItWorkBand({ kicker = "Product demonstration", title = "Watch it work", lead, primaryDemo, secondaryDemo, className, ...props }) {
6
- return (_jsx("div", { "data-slot": "watch-it-work-band", className: cn("grid gap-px bg-border", className), ...props, children: _jsxs(Bento, { children: [_jsxs(BentoItem, { span: 4, children: [_jsx("p", { className: "nc-type-caption-mono text-muted-foreground uppercase", children: kicker }), _jsx("h2", { className: "nc-type-title-md text-foreground", children: title }), lead ? (_jsx("p", { className: "nc-type-body-md text-muted-foreground", children: lead })) : null] }), primaryDemo ? (_jsx(BentoItem, { span: 4, surface: "soft", stretch: true, className: "p-[var(--nc-sm)]", children: _jsx(DemoSurface, { script: primaryDemo, title: "Conversation" }) })) : null, secondaryDemo ? (_jsx(BentoItem, { span: 4, surface: "soft", stretch: true, className: "p-[var(--nc-sm)]", children: _jsx(DemoSurface, { script: secondaryDemo, title: "Screen" }) })) : null] }) }));
4
+ import { DemoSurface, } from "./demo-surface.js";
5
+ function WatchItWorkBand({ kicker = "Product demonstration", title = "Watch it work", lead, primaryDemo, secondaryDemo, demoLabels, className, ...props }) {
6
+ return (_jsx(SeamGrid, { "data-slot": "watch-it-work-band", className: className, ...props, children: _jsxs(Bento, { children: [_jsxs(BentoItem, { span: 4, children: [_jsx("p", { className: "nc-type-caption-mono text-muted-foreground uppercase", children: kicker }), _jsx("h2", { className: "nc-type-title-md text-foreground", children: title }), lead ? (_jsx("p", { className: "nc-type-body-md text-muted-foreground", children: lead })) : null] }), primaryDemo ? (_jsx(BentoItem, { span: 4, surface: "soft", stretch: true, className: "p-[var(--nc-sm)]", children: _jsx(DemoSurface, { labels: demoLabels, script: primaryDemo, title: "Conversation" }) })) : null, secondaryDemo ? (_jsx(BentoItem, { span: 4, surface: "soft", stretch: true, className: "p-[var(--nc-sm)]", children: _jsx(DemoSurface, { labels: demoLabels, script: secondaryDemo, title: "Screen" }) })) : null] }) }));
7
7
  }
8
8
  export { WatchItWorkBand };
package/dist/index.d.ts CHANGED
@@ -75,6 +75,7 @@ export * from "./components/quote-card";
75
75
  export * from "./components/radio-group";
76
76
  export * from "./components/resizable";
77
77
  export * from "./components/scroll-area";
78
+ export * from "./components/seam-grid";
78
79
  export * from "./components/section-intro";
79
80
  export * from "./components/select";
80
81
  export * from "./components/separator";
@@ -87,6 +88,7 @@ export * from "./components/slider";
87
88
  export * from "./components/sonner";
88
89
  export * from "./components/spinner";
89
90
  export * from "./components/stat-block";
91
+ export * from "./components/state-notice";
90
92
  export * from "./components/stats-band";
91
93
  export * from "./components/switch";
92
94
  export * from "./components/table";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -75,6 +75,7 @@ export * from "./components/quote-card.js";
75
75
  export * from "./components/radio-group.js";
76
76
  export * from "./components/resizable.js";
77
77
  export * from "./components/scroll-area.js";
78
+ export * from "./components/seam-grid.js";
78
79
  export * from "./components/section-intro.js";
79
80
  export * from "./components/select.js";
80
81
  export * from "./components/separator.js";
@@ -87,6 +88,7 @@ export * from "./components/slider.js";
87
88
  export * from "./components/sonner.js";
88
89
  export * from "./components/spinner.js";
89
90
  export * from "./components/stat-block.js";
91
+ export * from "./components/state-notice.js";
90
92
  export * from "./components/stats-band.js";
91
93
  export * from "./components/switch.js";
92
94
  export * from "./components/table.js";
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Internal seam for the `AgentWorkState` presentation contract.
3
+ *
4
+ * This module is the ONE place a work state's icon, ARIA `role`, and
5
+ * busy/motion signal are decided. Every caller (`agent-message.tsx`,
6
+ * `agent-thread.tsx`, `state-notice.tsx`) reads `statePresentation` instead
7
+ * of keeping its own copy of the icon table or the role/busy rule, so a
8
+ * future state's presentation rule has exactly one place to be added or
9
+ * fixed.
10
+ *
11
+ * This is NOT part of the public package surface. It has no `exports`
12
+ * subpath, matching `agent-attachment.ts` and `seam.ts` in this directory.
13
+ *
14
+ * Dependency direction is one-way: components import this module; this
15
+ * module never imports a component (no cycle).
16
+ */
17
+ import type { ComponentType } from "react";
18
+ type AgentWorkState = "idle" | "empty" | "queued" | "streaming" | "interrupted" | "retryable" | "permission-denied" | "fatal";
19
+ type AgentWorkStatePresentation = {
20
+ icon: ComponentType<{
21
+ className?: string;
22
+ }>;
23
+ role: "alert" | "status";
24
+ busy: boolean;
25
+ };
26
+ /**
27
+ * statePresentation is the single source of truth for a presentable
28
+ * `AgentWorkState`'s icon, ARIA `role`, and busy/motion signal. Icon values
29
+ * reproduce `agent-message.tsx`'s `stateMeta` and `agent-thread.tsx`'s
30
+ * `threadStateDefaults` (confirmed byte-identical icon-for-icon); `role`
31
+ * and `busy` reproduce `state-notice.tsx`'s inline rules verbatim.
32
+ */
33
+ declare function statePresentation(state: Exclude<AgentWorkState, "idle" | "empty">): AgentWorkStatePresentation;
34
+ export { statePresentation };
35
+ export type { AgentWorkState };
36
+ //# sourceMappingURL=agent-work-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-work-state.d.ts","sourceRoot":"","sources":["../../src/lib/agent-work-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAU1C,KAAK,cAAc,GACf,MAAM,GACN,OAAO,GACP,QAAQ,GACR,WAAW,GACX,aAAa,GACb,WAAW,GACX,mBAAmB,GACnB,OAAO,CAAA;AAEX,KAAK,0BAA0B,GAAG;IAChC,IAAI,EAAE,aAAa,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC3C,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAA;IACxB,IAAI,EAAE,OAAO,CAAA;CACd,CAAA;AAcD;;;;;;GAMG;AACH,iBAAS,iBAAiB,CACxB,KAAK,EAAE,OAAO,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,GAC/C,0BAA0B,CAE5B;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAA;AAC5B,YAAY,EAAE,cAAc,EAAE,CAAA"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Internal seam for the `AgentWorkState` presentation contract.
3
+ *
4
+ * This module is the ONE place a work state's icon, ARIA `role`, and
5
+ * busy/motion signal are decided. Every caller (`agent-message.tsx`,
6
+ * `agent-thread.tsx`, `state-notice.tsx`) reads `statePresentation` instead
7
+ * of keeping its own copy of the icon table or the role/busy rule, so a
8
+ * future state's presentation rule has exactly one place to be added or
9
+ * fixed.
10
+ *
11
+ * This is NOT part of the public package surface. It has no `exports`
12
+ * subpath, matching `agent-attachment.ts` and `seam.ts` in this directory.
13
+ *
14
+ * Dependency direction is one-way: components import this module; this
15
+ * module never imports a component (no cycle).
16
+ */
17
+ import { AlertTriangleIcon, ClockIcon, FileWarningIcon, LoaderCircleIcon, RefreshCwIcon, ShieldXIcon, } from "lucide-react";
18
+ const presentationByState = {
19
+ fatal: { busy: false, icon: FileWarningIcon, role: "alert" },
20
+ interrupted: { busy: false, icon: AlertTriangleIcon, role: "status" },
21
+ "permission-denied": { busy: false, icon: ShieldXIcon, role: "alert" },
22
+ queued: { busy: false, icon: ClockIcon, role: "status" },
23
+ retryable: { busy: false, icon: RefreshCwIcon, role: "status" },
24
+ streaming: { busy: true, icon: LoaderCircleIcon, role: "status" },
25
+ };
26
+ /**
27
+ * statePresentation is the single source of truth for a presentable
28
+ * `AgentWorkState`'s icon, ARIA `role`, and busy/motion signal. Icon values
29
+ * reproduce `agent-message.tsx`'s `stateMeta` and `agent-thread.tsx`'s
30
+ * `threadStateDefaults` (confirmed byte-identical icon-for-icon); `role`
31
+ * and `busy` reproduce `state-notice.tsx`'s inline rules verbatim.
32
+ */
33
+ function statePresentation(state) {
34
+ return presentationByState[state];
35
+ }
36
+ export { statePresentation };
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Internal seam helper for the "gap-as-seam" grid mechanics.
3
+ *
4
+ * This module is the ONE place the ink seam `color-mix(...)` string lives, so a
5
+ * typo can no longer silently break one band's seam while the others stay
6
+ * correct. `SeamGrid` (the public primitive) and the `logo-band` grid owner both
7
+ * derive their seam colour from `seamSurfaceClass` here.
8
+ *
9
+ * SINGLE-OWNER SEAM: a `grid` with `gap-px` lets the panel paint one hairline at
10
+ * every cell boundary while borderless, square-cornered cells fill on top, so no
11
+ * coordinate ever carries two lines. The seam COLOUR is the only thing that flips
12
+ * with `surface`: canvas paints the brand `line` via `bg-border`; ink mixes the
13
+ * line toward the ink role so the seam stays a seam and never changes weight.
14
+ * Token-only; no `dark:` styling.
15
+ *
16
+ * This is NOT part of the public package surface. It has no `exports` subpath, so
17
+ * consumers couple to the `SeamGrid` component contract rather than to the exact
18
+ * arbitrary Tailwind class string. Keep it that way.
19
+ */
20
+ type SeamSurface = "canvas" | "ink";
21
+ /**
22
+ * seamSurfaceClass is the single source for the seam colour class. Internal code
23
+ * reaches for this (or `SeamGrid`, which wraps it) instead of hand-copying the ink
24
+ * `color-mix(...)` string into another grid owner.
25
+ */
26
+ declare function seamSurfaceClass(surface: SeamSurface): string;
27
+ export { seamSurfaceClass };
28
+ export type { SeamSurface };
29
+ //# sourceMappingURL=seam.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seam.d.ts","sourceRoot":"","sources":["../../src/lib/seam.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,KAAK,WAAW,GAAG,QAAQ,GAAG,KAAK,CAAA;AAEnC;;;;GAIG;AACH,iBAAS,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAItD;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAA;AAC3B,YAAY,EAAE,WAAW,EAAE,CAAA"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Internal seam helper for the "gap-as-seam" grid mechanics.
3
+ *
4
+ * This module is the ONE place the ink seam `color-mix(...)` string lives, so a
5
+ * typo can no longer silently break one band's seam while the others stay
6
+ * correct. `SeamGrid` (the public primitive) and the `logo-band` grid owner both
7
+ * derive their seam colour from `seamSurfaceClass` here.
8
+ *
9
+ * SINGLE-OWNER SEAM: a `grid` with `gap-px` lets the panel paint one hairline at
10
+ * every cell boundary while borderless, square-cornered cells fill on top, so no
11
+ * coordinate ever carries two lines. The seam COLOUR is the only thing that flips
12
+ * with `surface`: canvas paints the brand `line` via `bg-border`; ink mixes the
13
+ * line toward the ink role so the seam stays a seam and never changes weight.
14
+ * Token-only; no `dark:` styling.
15
+ *
16
+ * This is NOT part of the public package surface. It has no `exports` subpath, so
17
+ * consumers couple to the `SeamGrid` component contract rather than to the exact
18
+ * arbitrary Tailwind class string. Keep it that way.
19
+ */
20
+ /**
21
+ * seamSurfaceClass is the single source for the seam colour class. Internal code
22
+ * reaches for this (or `SeamGrid`, which wraps it) instead of hand-copying the ink
23
+ * `color-mix(...)` string into another grid owner.
24
+ */
25
+ function seamSurfaceClass(surface) {
26
+ return surface === "ink"
27
+ ? "bg-[color-mix(in_srgb,var(--nc-line)_40%,var(--nc-ink))]"
28
+ : "bg-border";
29
+ }
30
+ export { seamSurfaceClass };
@@ -102,7 +102,7 @@
102
102
  --nc-chat-artifact-surface: var(--popover);
103
103
  --nc-chat-inline-ref-surface: var(--nc-link-bg-soft);
104
104
  --nc-chat-directive-command: var(--nc-link);
105
- --nc-chat-directive-skill: var(--nc-cyan-deep);
105
+ --nc-chat-directive-skill: var(--nc-info);
106
106
  --nc-chat-directive-theme: var(--nc-flag-red);
107
107
  --nc-composer-surface: var(--popover);
108
108
  --nc-composer-foreground: var(--popover-foreground);
@@ -139,15 +139,18 @@
139
139
  --nc-diff-file-header: var(--muted-foreground);
140
140
  --nc-code-surface: var(--nc-ink);
141
141
  --nc-code-border: var(--nc-body);
142
- --nc-code-token-keyword: var(--nc-cyan);
142
+ /* cyan family retired per Italia color contract §6 (design-system). keyword
143
+ and terminal cyan roles repoint to info (blue-cobalto-700); function gets
144
+ a deeper blue-cobalto step so it stays visually distinct from keyword. */
145
+ --nc-code-token-keyword: var(--nc-info);
143
146
  --nc-code-token-string: var(--nc-success);
144
147
  --nc-code-token-comment: var(--nc-cross);
145
- --nc-code-token-function: var(--nc-cyan-deep);
148
+ --nc-code-token-function: var(--nc-blue-cobalto-900);
146
149
 
147
150
  --nc-terminal-bg: var(--nc-ink);
148
151
  --nc-terminal-fg: var(--nc-on-primary);
149
152
  --nc-terminal-muted: var(--nc-cross);
150
- --nc-terminal-cursor: var(--nc-cyan);
153
+ --nc-terminal-cursor: var(--nc-info);
151
154
  --nc-terminal-selection-bg: var(--nc-link-deep);
152
155
  --nc-terminal-ansi-black: var(--nc-ink);
153
156
  --nc-terminal-ansi-red: var(--nc-error);
@@ -155,15 +158,15 @@
155
158
  --nc-terminal-ansi-yellow: var(--nc-warning);
156
159
  --nc-terminal-ansi-blue: var(--nc-link);
157
160
  --nc-terminal-ansi-magenta: var(--nc-flag-red);
158
- --nc-terminal-ansi-cyan: var(--nc-cyan);
161
+ --nc-terminal-ansi-cyan: var(--nc-info);
159
162
  --nc-terminal-ansi-white: var(--nc-on-primary);
160
163
  --nc-terminal-ansi-bright-black: var(--nc-body);
161
164
  --nc-terminal-ansi-bright-red: var(--nc-error-soft);
162
- --nc-terminal-ansi-bright-green: var(--nc-cyan-soft);
165
+ --nc-terminal-ansi-bright-green: var(--nc-green-italia-400);
163
166
  --nc-terminal-ansi-bright-yellow: var(--nc-warning-soft);
164
- --nc-terminal-ansi-bright-blue: var(--nc-cyan);
167
+ --nc-terminal-ansi-bright-blue: var(--nc-info);
165
168
  --nc-terminal-ansi-bright-magenta: var(--nc-flag-red);
166
- --nc-terminal-ansi-bright-cyan: var(--nc-cyan-soft);
169
+ --nc-terminal-ansi-bright-cyan: var(--nc-blue-cobalto-200);
167
170
  --nc-terminal-ansi-bright-white: var(--nc-on-primary);
168
171
 
169
172
  --nc-model-provider-surface: var(--muted);
@@ -197,7 +200,7 @@
197
200
  --nc-app-text-secondary: var(--nc-cross);
198
201
  --nc-app-text-tertiary: var(--muted-foreground);
199
202
  --nc-app-text-inverse: var(--primary-foreground);
200
- --nc-app-text-link: var(--nc-cyan-soft);
203
+ --nc-app-text-link: var(--nc-dark-cyan-soft);
201
204
  --nc-app-text-code: var(--nc-on-primary);
202
205
  --nc-app-text-placeholder: var(--nc-cross);
203
206
  --nc-app-text-disabled: var(--nc-body);
@@ -210,8 +213,8 @@
210
213
  --nc-chat-reasoning-surface: var(--accent);
211
214
  --nc-chat-artifact-surface: var(--popover);
212
215
  --nc-chat-inline-ref-surface: var(--nc-link-deep);
213
- --nc-chat-directive-command: var(--nc-cyan);
214
- --nc-chat-directive-skill: var(--nc-cyan-soft);
216
+ --nc-chat-directive-command: var(--nc-dark-cyan);
217
+ --nc-chat-directive-skill: var(--nc-dark-cyan-soft);
215
218
  --nc-chat-directive-theme: var(--nc-warning);
216
219
  --nc-composer-surface: var(--popover);
217
220
  --nc-composer-foreground: var(--popover-foreground);
@@ -219,70 +222,77 @@
219
222
  --nc-composer-ring: var(--ring);
220
223
 
221
224
  --nc-tool-pending: var(--nc-warning);
222
- --nc-tool-running: var(--nc-cyan);
223
- --nc-tool-success: var(--nc-cyan-soft);
225
+ --nc-tool-running: var(--nc-dark-cyan);
226
+ --nc-tool-success: var(--nc-dark-cyan-soft);
224
227
  --nc-tool-warning: var(--nc-warning);
225
228
  --nc-tool-error: var(--nc-error-soft);
226
229
  --nc-tool-muted: var(--nc-cross);
227
- --nc-tool-approval-run: var(--nc-cyan-deep);
230
+ --nc-tool-approval-run: var(--nc-dark-cyan-deep);
228
231
  --nc-tool-approval-deny: var(--nc-error-soft);
229
- --nc-tool-approval-session: var(--nc-cyan);
230
- --nc-tool-approval-always: var(--nc-cyan-soft);
232
+ --nc-tool-approval-session: var(--nc-dark-cyan);
233
+ --nc-tool-approval-always: var(--nc-dark-cyan-soft);
231
234
 
232
- --nc-status-info: var(--nc-cyan);
233
- --nc-status-success: var(--nc-cyan-soft);
235
+ --nc-status-info: var(--nc-dark-cyan);
236
+ --nc-status-success: var(--nc-dark-cyan-soft);
234
237
  --nc-status-warning: var(--nc-warning);
235
238
  --nc-status-error: var(--nc-error-soft);
236
239
  --nc-status-paused: var(--nc-cross);
237
- --nc-status-running: var(--nc-cyan);
240
+ --nc-status-running: var(--nc-dark-cyan);
238
241
  --nc-status-blocked: var(--nc-error-soft);
239
- --nc-status-complete: var(--nc-cyan-soft);
242
+ --nc-status-complete: var(--nc-dark-cyan-soft);
240
243
  --nc-status-offline: var(--nc-cross);
241
- --nc-status-online: var(--nc-cyan-soft);
244
+ --nc-status-online: var(--nc-dark-cyan-soft);
242
245
 
243
246
  --nc-diff-added-line: var(--nc-link-deep);
244
- --nc-diff-added-word: var(--nc-cyan-soft);
247
+ --nc-diff-added-word: var(--nc-dark-cyan-soft);
245
248
  --nc-diff-removed-line: var(--nc-error-deep);
246
249
  --nc-diff-removed-word: var(--nc-error-soft);
247
250
  --nc-diff-hunk: var(--muted);
248
251
  --nc-diff-file-header: var(--muted-foreground);
249
- --nc-code-surface: var(--nc-primary);
252
+ /* --nc-primary is now green-700 (Italia contract §4); code/terminal chrome
253
+ must stay near-black in dark mode too, so repoint to --nc-ink instead of
254
+ letting the code surface render green. */
255
+ --nc-code-surface: var(--nc-ink);
250
256
  --nc-code-border: var(--nc-body);
251
- --nc-code-token-keyword: var(--nc-cyan);
252
- --nc-code-token-string: var(--nc-cyan-soft);
257
+ /* cyan family retired per Italia color contract §6. dark-cyan/-soft/-deep
258
+ were kept unchanged in DESIGN.md specifically for this dark-mode "electric"
259
+ accent role, so repoint here rather than to info (which is the light-mode
260
+ replacement) to preserve the existing dark-theme look. */
261
+ --nc-code-token-keyword: var(--nc-dark-cyan);
262
+ --nc-code-token-string: var(--nc-dark-cyan-soft);
253
263
  --nc-code-token-comment: var(--nc-cross);
254
- --nc-code-token-function: var(--nc-cyan-soft);
264
+ --nc-code-token-function: var(--nc-dark-cyan-soft);
255
265
 
256
- --nc-terminal-bg: var(--nc-primary);
266
+ --nc-terminal-bg: var(--nc-ink);
257
267
  --nc-terminal-fg: var(--nc-on-primary);
258
268
  --nc-terminal-muted: var(--nc-cross);
259
- --nc-terminal-cursor: var(--nc-cyan);
269
+ --nc-terminal-cursor: var(--nc-dark-cyan);
260
270
  --nc-terminal-selection-bg: var(--nc-link-deep);
261
271
  --nc-terminal-ansi-black: var(--nc-body);
262
272
  --nc-terminal-ansi-red: var(--nc-error-soft);
263
- --nc-terminal-ansi-green: var(--nc-cyan-soft);
273
+ --nc-terminal-ansi-green: var(--nc-dark-cyan-soft);
264
274
  --nc-terminal-ansi-yellow: var(--nc-warning);
265
- --nc-terminal-ansi-blue: var(--nc-cyan);
275
+ --nc-terminal-ansi-blue: var(--nc-dark-cyan);
266
276
  --nc-terminal-ansi-magenta: var(--nc-flag-red);
267
- --nc-terminal-ansi-cyan: var(--nc-cyan-soft);
277
+ --nc-terminal-ansi-cyan: var(--nc-dark-cyan-soft);
268
278
  --nc-terminal-ansi-white: var(--nc-on-primary);
269
279
  --nc-terminal-ansi-bright-black: var(--nc-cross);
270
280
  --nc-terminal-ansi-bright-red: var(--nc-error-soft);
271
- --nc-terminal-ansi-bright-green: var(--nc-cyan-soft);
281
+ --nc-terminal-ansi-bright-green: var(--nc-dark-cyan-soft);
272
282
  --nc-terminal-ansi-bright-yellow: var(--nc-warning-soft);
273
- --nc-terminal-ansi-bright-blue: var(--nc-cyan);
283
+ --nc-terminal-ansi-bright-blue: var(--nc-dark-cyan);
274
284
  --nc-terminal-ansi-bright-magenta: var(--nc-flag-red);
275
- --nc-terminal-ansi-bright-cyan: var(--nc-cyan-soft);
285
+ --nc-terminal-ansi-bright-cyan: var(--nc-dark-cyan-soft);
276
286
  --nc-terminal-ansi-bright-white: var(--nc-on-primary);
277
287
 
278
288
  --nc-model-provider-surface: var(--muted);
279
289
  --nc-model-capability-surface: var(--accent);
280
- --nc-model-capability-border: var(--nc-cyan);
290
+ --nc-model-capability-border: var(--nc-dark-cyan);
281
291
  --nc-model-context-meter: var(--nc-warning);
282
292
  --nc-model-cost-warning: var(--nc-warning);
283
293
  --nc-model-rate-limit: var(--nc-error-soft);
284
294
 
285
- --nc-plugin-permission-safe: var(--nc-cyan-soft);
295
+ --nc-plugin-permission-safe: var(--nc-dark-cyan-soft);
286
296
  --nc-plugin-permission-review: var(--nc-warning);
287
297
  --nc-plugin-permission-risk: var(--nc-flag-red);
288
298
  --nc-plugin-permission-denied: var(--nc-error-soft);
@@ -87,6 +87,11 @@ Current shipped product subpaths:
87
87
  - `@nadicodeai/ui/components/plugin-slot-boundary`
88
88
  - `@nadicodeai/ui/components/settings-section`
89
89
 
90
+ `StateNotice` (`@nadicodeai/ui/components/state-notice`) is the supported
91
+ low-level state-banner primitive behind `AgentMessageStateNotice` and
92
+ `AgentThreadStateBanner`; it requires a `title` and owns the shared
93
+ `role="status"`/`role="alert"` skeleton.
94
+
90
95
  ## Product Components And Migration
91
96
 
92
97
  Product components are presentational. Use them for shared settings, shell,
@@ -112,6 +117,23 @@ Read `docs/migration/nadia-consumer-readiness.md` before migrating a consumer.
112
117
  It lists the CSS imports, public subpaths, fixture redaction rules, and readiness
113
118
  gates.
114
119
 
120
+ ## Layout Primitives
121
+
122
+ `SeamGrid` (`@nadicodeai/ui/components/seam-grid`) is a supported low-level layout
123
+ primitive: the single owner of the "gap-as-seam" grid that backs the bordered
124
+ section grids (stats band, testimonials, logo band, and siblings). It renders a
125
+ `div` with the invariant `grid gap-px` base, so borderless, square-cornered cells
126
+ paint one shared hairline seam at every boundary instead of doubling lines.
127
+
128
+ Its only seam-specific prop is `surface`: `"canvas"` (default) paints the brand
129
+ `line` via `bg-border`, and `"ink"` mixes the line toward the ink role for darker
130
+ panels; the value is also mirrored on a `data-surface` attribute. Pass
131
+ `className`, `children`, and any `div` props to keep a bespoke column map,
132
+ heights, and `data-*` attributes. Reach for `SeamGrid` and its `surface` prop
133
+ when building a new bordered grid rather than hand-copying the seam colour: the
134
+ seam class helper is an internal `src/lib/seam` detail with no public subpath
135
+ export, so nothing should couple to the raw arbitrary Tailwind class string.
136
+
115
137
  ## Forms
116
138
 
117
139
  Use the package's shadcn form stack as one model:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nadicodeai/ui",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -41,7 +41,9 @@
41
41
  "skills"
42
42
  ],
43
43
  "scripts": {
44
+ "dev": "node scripts/dev-build.mjs --watch",
44
45
  "build": "rm -rf dist && tsc -p tsconfig.build.json && node scripts/fix-dist-imports.mjs && rm -rf dist/styles && cp -R src/styles dist/styles",
46
+ "build:fast": "node scripts/dev-build.mjs",
45
47
  "prepack": "npm run build",
46
48
  "test": "vitest run"
47
49
  },