@nadicodeai/ui 0.10.1 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/AGENTS.md +23 -135
  2. package/README.md +39 -110
  3. package/dist/components/action-band.d.ts +5 -3
  4. package/dist/components/action-band.d.ts.map +1 -1
  5. package/dist/components/action-band.js +35 -21
  6. package/dist/components/agent-chat.d.ts.map +1 -1
  7. package/dist/components/agent-chat.js +1 -1
  8. package/dist/components/agent-composer.d.ts.map +1 -1
  9. package/dist/components/agent-composer.js +1 -1
  10. package/dist/components/ai-elements/code-block.d.ts.map +1 -1
  11. package/dist/components/ai-elements/code-block.js +9 -23
  12. package/dist/components/ai-elements/commit.d.ts.map +1 -1
  13. package/dist/components/ai-elements/commit.js +9 -23
  14. package/dist/components/ai-elements/environment-variables.d.ts.map +1 -1
  15. package/dist/components/ai-elements/environment-variables.js +4 -29
  16. package/dist/components/ai-elements/snippet.d.ts.map +1 -1
  17. package/dist/components/ai-elements/snippet.js +9 -23
  18. package/dist/components/ai-elements/stack-trace.d.ts.map +1 -1
  19. package/dist/components/ai-elements/stack-trace.js +8 -21
  20. package/dist/components/ai-elements/terminal.d.ts.map +1 -1
  21. package/dist/components/ai-elements/terminal.js +16 -29
  22. package/dist/components/alert-dialog.d.ts.map +1 -1
  23. package/dist/components/alert-dialog.js +3 -2
  24. package/dist/components/artifact-panel.d.ts.map +1 -1
  25. package/dist/components/artifact-panel.js +5 -5
  26. package/dist/components/badge.js +1 -1
  27. package/dist/components/bento.d.ts +14 -3
  28. package/dist/components/bento.d.ts.map +1 -1
  29. package/dist/components/bento.js +26 -5
  30. package/dist/components/brand.d.ts.map +1 -1
  31. package/dist/components/brand.js +29 -3
  32. package/dist/components/button.js +1 -1
  33. package/dist/components/chart-time-series.d.ts.map +1 -1
  34. package/dist/components/chart-time-series.js +2 -2
  35. package/dist/components/chart.js +1 -1
  36. package/dist/components/contact.d.ts +22 -10
  37. package/dist/components/contact.d.ts.map +1 -1
  38. package/dist/components/contact.js +34 -12
  39. package/dist/components/dialog.d.ts.map +1 -1
  40. package/dist/components/dialog.js +3 -2
  41. package/dist/components/diff-count.js +1 -1
  42. package/dist/components/dropdown-menu.d.ts.map +1 -1
  43. package/dist/components/dropdown-menu.js +2 -1
  44. package/dist/components/faq-item.js +2 -2
  45. package/dist/components/faq.d.ts +4 -1
  46. package/dist/components/faq.d.ts.map +1 -1
  47. package/dist/components/faq.js +5 -2
  48. package/dist/components/feature-grid.d.ts +23 -0
  49. package/dist/components/feature-grid.d.ts.map +1 -0
  50. package/dist/components/feature-grid.js +33 -0
  51. package/dist/components/feature-rows.d.ts +23 -0
  52. package/dist/components/feature-rows.d.ts.map +1 -0
  53. package/dist/components/feature-rows.js +27 -0
  54. package/dist/components/footer.d.ts +18 -12
  55. package/dist/components/footer.d.ts.map +1 -1
  56. package/dist/components/footer.js +32 -20
  57. package/dist/components/hero.d.ts +28 -0
  58. package/dist/components/hero.d.ts.map +1 -0
  59. package/dist/components/hero.js +45 -0
  60. package/dist/components/input-otp.js +1 -1
  61. package/dist/components/integration-flow.d.ts +36 -0
  62. package/dist/components/integration-flow.d.ts.map +1 -0
  63. package/dist/components/integration-flow.js +36 -0
  64. package/dist/components/live-demo.d.ts +31 -0
  65. package/dist/components/live-demo.d.ts.map +1 -0
  66. package/dist/components/live-demo.js +30 -0
  67. package/dist/components/logo-band.d.ts +12 -2
  68. package/dist/components/logo-band.d.ts.map +1 -1
  69. package/dist/components/logo-band.js +16 -1
  70. package/dist/components/logo-tile.d.ts.map +1 -1
  71. package/dist/components/logo-tile.js +5 -2
  72. package/dist/components/nav-bar.d.ts +14 -8
  73. package/dist/components/nav-bar.d.ts.map +1 -1
  74. package/dist/components/nav-bar.js +19 -13
  75. package/dist/components/popover.d.ts.map +1 -1
  76. package/dist/components/popover.js +2 -1
  77. package/dist/components/pricing-card.d.ts +10 -15
  78. package/dist/components/pricing-card.d.ts.map +1 -1
  79. package/dist/components/pricing-card.js +18 -29
  80. package/dist/components/pricing.d.ts +11 -14
  81. package/dist/components/pricing.d.ts.map +1 -1
  82. package/dist/components/pricing.js +5 -15
  83. package/dist/components/quote-card.d.ts +10 -2
  84. package/dist/components/quote-card.d.ts.map +1 -1
  85. package/dist/components/quote-card.js +15 -3
  86. package/dist/components/security-grid.d.ts +25 -0
  87. package/dist/components/security-grid.d.ts.map +1 -0
  88. package/dist/components/security-grid.js +31 -0
  89. package/dist/components/select.d.ts.map +1 -1
  90. package/dist/components/select.js +2 -1
  91. package/dist/components/sheet.d.ts.map +1 -1
  92. package/dist/components/sheet.js +3 -2
  93. package/dist/components/sidebar.js +1 -1
  94. package/dist/components/stat-block.d.ts +9 -5
  95. package/dist/components/stat-block.d.ts.map +1 -1
  96. package/dist/components/stat-block.js +12 -6
  97. package/dist/components/statement.d.ts +32 -0
  98. package/dist/components/statement.d.ts.map +1 -0
  99. package/dist/components/statement.js +40 -0
  100. package/dist/components/stats-band.d.ts +6 -2
  101. package/dist/components/stats-band.d.ts.map +1 -1
  102. package/dist/components/stats-band.js +10 -3
  103. package/dist/components/status-dot.js +4 -4
  104. package/dist/components/steps.d.ts +34 -0
  105. package/dist/components/steps.d.ts.map +1 -0
  106. package/dist/components/steps.js +40 -0
  107. package/dist/components/team-grid.d.ts +27 -0
  108. package/dist/components/team-grid.d.ts.map +1 -0
  109. package/dist/components/team-grid.js +30 -0
  110. package/dist/components/testimonials.d.ts +39 -12
  111. package/dist/components/testimonials.d.ts.map +1 -1
  112. package/dist/components/testimonials.js +46 -13
  113. package/dist/components/texture-strip.d.ts +22 -0
  114. package/dist/components/texture-strip.d.ts.map +1 -0
  115. package/dist/components/texture-strip.js +29 -0
  116. package/dist/components/toggle.js +1 -1
  117. package/dist/components/tooltip.d.ts.map +1 -1
  118. package/dist/components/tooltip.js +2 -1
  119. package/dist/index.d.ts +10 -0
  120. package/dist/index.d.ts.map +1 -1
  121. package/dist/index.js +10 -0
  122. package/dist/lib/message-scroller-primitive/geometry.d.ts +1 -5
  123. package/dist/lib/message-scroller-primitive/geometry.d.ts.map +1 -1
  124. package/dist/lib/message-scroller-primitive/geometry.js +1 -1
  125. package/dist/lib/message-scroller-primitive/stores.d.ts +2 -3
  126. package/dist/lib/message-scroller-primitive/stores.d.ts.map +1 -1
  127. package/dist/lib/message-scroller-primitive/stores.js +1 -1
  128. package/dist/lib/message-scroller-primitive/types.d.ts +1 -2
  129. package/dist/lib/message-scroller-primitive/types.d.ts.map +1 -1
  130. package/dist/lib/message-scroller-primitive/types.js +1 -1
  131. package/dist/lib/motion.d.ts +12 -0
  132. package/dist/lib/motion.d.ts.map +1 -0
  133. package/dist/lib/motion.js +11 -0
  134. package/dist/lib/use-copy-to-clipboard.d.ts +11 -0
  135. package/dist/lib/use-copy-to-clipboard.d.ts.map +1 -0
  136. package/dist/lib/use-copy-to-clipboard.js +27 -0
  137. package/dist/styles/globals.css +175 -300
  138. package/docs/agent-work-surfaces.md +6 -5
  139. package/docs/agents/nadicodeai-ui.md +42 -273
  140. package/docs/consuming-cross-repo.md +26 -33
  141. package/docs/contract.md +43 -0
  142. package/docs/migration/nadia-consumer-readiness.md +5 -10
  143. package/docs/terminal-tui-semantics.md +142 -181
  144. package/llms.txt +49 -84
  145. package/package.json +2 -3
  146. package/skills/nadicodeai-ui/SKILL.md +6 -30
@@ -0,0 +1,27 @@
1
+ import { useCallback, useEffect, useRef, useState } from "react";
2
+ export function useCopyToClipboard({ text, onCopy, onError, timeout, skipWhileCopied = false, }) {
3
+ const [isCopied, setIsCopied] = useState(false);
4
+ const timeoutRef = useRef(0);
5
+ const copyToClipboard = useCallback(async () => {
6
+ if (typeof window === "undefined" || !navigator?.clipboard?.writeText) {
7
+ onError?.(new Error("Clipboard API not available"));
8
+ return;
9
+ }
10
+ if (skipWhileCopied && isCopied) {
11
+ return;
12
+ }
13
+ try {
14
+ await navigator.clipboard.writeText(text);
15
+ setIsCopied(true);
16
+ onCopy?.();
17
+ timeoutRef.current = window.setTimeout(() => setIsCopied(false), timeout);
18
+ }
19
+ catch (error) {
20
+ onError?.(error);
21
+ }
22
+ }, [isCopied, onCopy, onError, skipWhileCopied, text, timeout]);
23
+ useEffect(() => () => {
24
+ window.clearTimeout(timeoutRef.current);
25
+ }, []);
26
+ return { copyToClipboard, isCopied };
27
+ }
@@ -1,26 +1,22 @@
1
1
  /*
2
2
  * @nadicodeai/ui — Tailwind v4 + shadcn entry stylesheet.
3
3
  *
4
- * Import order is load-bearing: Tailwind first, then the design-system theme
5
- * bridge (the brand @theme + the :root/.dark shadcn role maps, generated from
6
- * DESIGN.md by Style Dictionary). The @theme inline block below
7
- * lifts semantic role vars into Tailwind's --color-* utility namespace so
8
- * shadcn utilities (bg-background, text-foreground, border-border, …) resolve
9
- * to brand tokens.
4
+ * Tailwind and the complete design-system CSS module are composed here, behind
5
+ * the package's one public stylesheet interface. The generated raw-token theme,
6
+ * :root/.dark semantic role maps, and Tailwind semantic bridge come from
7
+ * DESIGN.md, so shadcn utilities (bg-background, text-foreground,
8
+ * border-border, …) resolve to brand tokens through one generated owner.
10
9
  *
11
- * Standard shadcn roles are generated by @nadicodeai/design-system. This file
12
- * keeps package-local product aliases only; their --nc-* names are package-local
13
- * declarations, while source values remain generated tokens or semantic roles.
14
- * Components consume those roles/aliases and do not carry raw palette utilities
15
- * or dark: utility classes. DESIGN.md remains the only source of literal values.
10
+ * Standard shadcn roles are generated by @nadicodeai/design-system. Components
11
+ * consume those roles or canonical generated tokens without raw palette values
12
+ * or component-local dark: utilities.
16
13
  */
17
14
  @layer tokens, theme, reset, base, foundation, motion, layout, primitives, components, utilities;
18
15
 
19
16
  @import "tailwindcss";
20
17
  @import "tw-animate-css";
21
18
  @import "./shadcn.tailwind.css";
22
- @import "@nadicodeai/design-system/tailwind/theme.css" layer(theme);
23
- @import "@nadicodeai/design-system/css/tokens.generated.css" layer(tokens);
19
+ @import "@nadicodeai/design-system/css";
24
20
  @import "@xyflow/react/dist/style.css" layer(components);
25
21
 
26
22
  /*
@@ -46,301 +42,179 @@
46
42
  }
47
43
 
48
44
  /*
49
- * Raw --nc-* dark remaps (surface palette/state/selection/cross/chart) are
50
- * generated at :root.dark specificity inside the design-system theme import
51
- * above; the package-local copy that used to live here is gone so the
52
- * generated theme stays the single owner. tests/guards/dark-token-cascade.test.ts
53
- * guards the resolved cascade across this file's import order.
45
+ * The canonical design-system module owns raw --nc-* mode aliases, semantic
46
+ * roles, and their Tailwind utility bridge for both root and scoped `.dark`
47
+ * surfaces. This adapter owns only narrow technology integration such as ANSI
48
+ * class translation below.
54
49
  */
55
50
 
56
- @theme inline {
57
- --color-background: var(--background);
58
- --color-foreground: var(--foreground);
59
-
60
- --color-card: var(--card);
61
- --color-card-foreground: var(--card-foreground);
62
-
63
- --color-popover: var(--popover);
64
- --color-popover-foreground: var(--popover-foreground);
65
-
66
- --color-primary: var(--primary);
67
- --color-primary-foreground: var(--primary-foreground);
68
- --color-primary-hover: var(--primary-hover);
69
- --color-primary-active: var(--primary-active);
70
-
71
- --color-secondary: var(--secondary);
72
- --color-secondary-foreground: var(--secondary-foreground);
73
-
74
- --color-muted: var(--muted);
75
- --color-muted-foreground: var(--muted-foreground);
76
-
77
- --color-accent: var(--accent);
78
- --color-accent-foreground: var(--accent-foreground);
79
-
80
- --color-destructive: var(--destructive);
81
- --color-destructive-foreground: var(--destructive-foreground);
82
-
83
- --color-border: var(--border);
84
- --color-input: var(--input);
85
- --color-ring: var(--ring);
86
- --color-scrim: var(--scrim);
87
- --color-placeholder: var(--nc-muted);
88
-
89
- --color-chart-1: var(--chart-1);
90
- --color-chart-2: var(--chart-2);
91
- --color-chart-3: var(--chart-3);
92
- --color-chart-4: var(--chart-4);
93
- --color-chart-5: var(--chart-5);
94
-
95
- --color-sidebar: var(--sidebar);
96
- --color-sidebar-foreground: var(--sidebar-foreground);
97
- --color-sidebar-primary: var(--sidebar-primary);
98
- --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
99
- --color-sidebar-accent: var(--sidebar-accent);
100
- --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
101
- --color-sidebar-border: var(--sidebar-border);
102
- --color-sidebar-ring: var(--sidebar-ring);
103
- }
104
-
105
- :root {
106
- --nc-app-surface: var(--background);
107
- --nc-app-surface-chrome: var(--sidebar);
108
- --nc-app-surface-sidebar: var(--sidebar);
109
- --nc-app-surface-panel: var(--card);
110
- --nc-app-surface-panel-hover: var(--accent);
111
- --nc-app-surface-panel-active: var(--primary);
112
- --nc-app-surface-elevated: var(--popover);
113
- --nc-app-surface-overlay: var(--popover);
114
- --nc-app-border: var(--border);
115
- --nc-app-border-subtle: var(--nc-seam);
116
- --nc-app-ring: var(--ring);
117
- --nc-app-text-primary: var(--foreground);
118
- --nc-app-text-secondary: var(--nc-body);
119
- --nc-app-text-tertiary: var(--muted-foreground);
120
- --nc-app-text-inverse: var(--primary-foreground);
121
- --nc-app-text-link: var(--nc-link-deep);
122
- --nc-app-text-code: var(--nc-ink);
123
- --nc-app-text-placeholder: var(--nc-muted);
124
- --nc-app-text-disabled: var(--nc-cross);
125
-
126
- --nc-chat-surface: var(--background);
127
- --nc-chat-user-surface: var(--primary);
128
- --nc-chat-assistant-surface: var(--card);
129
- --nc-chat-system-surface: var(--muted);
130
- --nc-chat-tool-surface: var(--secondary);
131
- --nc-chat-reasoning-surface: var(--accent);
132
- --nc-chat-artifact-surface: var(--popover);
133
- --nc-chat-inline-ref-surface: var(--nc-link-bg-soft);
134
- --nc-chat-directive-command: var(--nc-link);
135
- --nc-chat-directive-skill: var(--nc-info);
136
- --nc-chat-directive-theme: var(--nc-flag-red);
137
- --nc-composer-surface: var(--popover);
138
- --nc-composer-foreground: var(--popover-foreground);
139
- --nc-composer-border: var(--input);
140
- --nc-composer-ring: var(--ring);
141
-
142
- --nc-tool-pending: var(--nc-warning-deep);
143
- --nc-tool-running: var(--nc-state-running);
144
- --nc-tool-success: var(--nc-success);
145
- --nc-tool-warning: var(--nc-warning-deep);
146
- --nc-tool-error: var(--nc-error);
147
- --nc-tool-muted: var(--nc-muted);
148
- --nc-tool-approval-run: var(--nc-state-running);
149
- --nc-tool-approval-deny: var(--nc-error);
150
- --nc-tool-approval-session: var(--nc-link);
151
- --nc-tool-approval-always: var(--nc-success);
152
-
153
- --nc-status-info: var(--nc-link);
154
- --nc-status-success: var(--nc-success);
155
- --nc-status-warning: var(--nc-warning-deep);
156
- --nc-status-error: var(--nc-error);
157
- --nc-status-paused: var(--nc-muted);
158
- --nc-status-running: var(--nc-state-running);
159
- --nc-status-blocked: var(--nc-state-blocked);
160
- --nc-status-complete: var(--nc-state-complete);
161
- --nc-status-offline: var(--nc-muted);
162
- --nc-status-online: var(--nc-success);
163
-
164
- --nc-diff-added-line: var(--nc-link-bg-soft);
165
- --nc-diff-added-word: var(--nc-link);
166
- --nc-diff-removed-line: var(--nc-error-soft);
167
- --nc-diff-removed-word: var(--nc-error);
168
- --nc-diff-hunk: var(--accent);
169
- --nc-diff-file-header: var(--muted-foreground);
170
- --nc-code-surface: var(--nc-ink);
171
- --nc-code-border: var(--nc-body);
172
- /* cyan family retired per Italia color contract §6 (design-system). keyword
173
- and terminal cyan roles repoint to info (blue-cobalto-700); function gets
174
- a deeper blue-cobalto step so it stays visually distinct from keyword. */
175
- --nc-code-token-keyword: var(--nc-info);
176
- --nc-code-token-string: var(--nc-success);
177
- --nc-code-token-comment: var(--nc-cross);
178
- --nc-code-token-function: var(--nc-blue-cobalto-900);
179
-
180
- --nc-terminal-bg: var(--nc-ink);
181
- --nc-terminal-fg: var(--nc-on-primary);
182
- --nc-terminal-muted: var(--nc-cross);
183
- --nc-terminal-cursor: var(--nc-info);
184
- --nc-terminal-selection-bg: var(--nc-link-deep);
185
- --nc-terminal-ansi-black: var(--nc-ink);
186
- --nc-terminal-ansi-red: var(--nc-error);
187
- --nc-terminal-ansi-green: var(--nc-success);
188
- --nc-terminal-ansi-yellow: var(--nc-warning);
189
- --nc-terminal-ansi-blue: var(--nc-link);
190
- --nc-terminal-ansi-magenta: var(--nc-flag-red);
191
- --nc-terminal-ansi-cyan: var(--nc-info);
192
- --nc-terminal-ansi-white: var(--nc-on-primary);
193
- --nc-terminal-ansi-bright-black: var(--nc-body);
194
- --nc-terminal-ansi-bright-red: var(--nc-error-soft);
195
- --nc-terminal-ansi-bright-green: var(--nc-green-italia-400);
196
- --nc-terminal-ansi-bright-yellow: var(--nc-warning-soft);
197
- --nc-terminal-ansi-bright-blue: var(--nc-info);
198
- --nc-terminal-ansi-bright-magenta: var(--nc-flag-red);
199
- --nc-terminal-ansi-bright-cyan: var(--nc-blue-cobalto-200);
200
- --nc-terminal-ansi-bright-white: var(--nc-on-primary);
201
-
202
- --nc-model-provider-surface: var(--muted);
203
- --nc-model-capability-surface: var(--accent);
204
- --nc-model-capability-border: var(--nc-link);
205
- --nc-model-context-meter: var(--nc-warning);
206
- --nc-model-cost-warning: var(--nc-warning-deep);
207
- --nc-model-rate-limit: var(--nc-error);
208
-
209
- --nc-plugin-permission-safe: var(--nc-success);
210
- --nc-plugin-permission-review: var(--nc-warning-deep);
211
- --nc-plugin-permission-risk: var(--nc-flag-red);
212
- --nc-plugin-permission-denied: var(--nc-error);
213
- --nc-plugin-permission-surface: var(--muted);
214
- --nc-plugin-permission-foreground: var(--foreground);
215
- }
216
-
217
- .dark {
218
- --nc-app-surface: var(--background);
219
- --nc-app-surface-chrome: var(--sidebar);
220
- --nc-app-surface-sidebar: var(--sidebar);
221
- --nc-app-surface-panel: var(--card);
222
- --nc-app-surface-panel-hover: var(--accent);
223
- --nc-app-surface-panel-active: var(--primary);
224
- --nc-app-surface-elevated: var(--popover);
225
- --nc-app-surface-overlay: var(--popover);
226
- --nc-app-border: var(--border);
227
- --nc-app-border-subtle: var(--nc-dark-line);
228
- --nc-app-ring: var(--ring);
229
- --nc-app-text-primary: var(--foreground);
230
- --nc-app-text-secondary: var(--nc-cross);
231
- --nc-app-text-tertiary: var(--muted-foreground);
232
- --nc-app-text-inverse: var(--primary-foreground);
233
- --nc-app-text-link: var(--nc-dark-cyan-soft);
234
- --nc-app-text-code: var(--nc-on-primary);
235
- --nc-app-text-placeholder: var(--nc-cross);
236
- --nc-app-text-disabled: var(--nc-dark-muted);
237
-
238
- --nc-chat-surface: var(--background);
239
- --nc-chat-user-surface: var(--primary);
240
- --nc-chat-assistant-surface: var(--card);
241
- --nc-chat-system-surface: var(--muted);
242
- --nc-chat-tool-surface: var(--secondary);
243
- --nc-chat-reasoning-surface: var(--accent);
244
- --nc-chat-artifact-surface: var(--popover);
245
- --nc-chat-inline-ref-surface: var(--nc-dark-link-bg-soft);
246
- --nc-chat-directive-command: var(--nc-dark-cyan);
247
- --nc-chat-directive-skill: var(--nc-dark-cyan-soft);
248
- --nc-chat-directive-theme: var(--nc-warning);
249
- --nc-composer-surface: var(--popover);
250
- --nc-composer-foreground: var(--popover-foreground);
251
- --nc-composer-border: var(--input);
252
- --nc-composer-ring: var(--ring);
253
-
254
- --nc-tool-pending: var(--nc-warning);
255
- --nc-tool-running: var(--nc-dark-cyan);
256
- --nc-tool-success: var(--nc-dark-cyan-soft);
257
- --nc-tool-warning: var(--nc-warning);
258
- --nc-tool-error: var(--nc-error-soft);
259
- --nc-tool-muted: var(--nc-cross);
260
- --nc-tool-approval-run: var(--nc-dark-cyan-deep);
261
- --nc-tool-approval-deny: var(--nc-error-soft);
262
- --nc-tool-approval-session: var(--nc-dark-cyan);
263
- --nc-tool-approval-always: var(--nc-dark-cyan-soft);
264
-
265
- --nc-status-info: var(--nc-dark-cyan);
266
- --nc-status-success: var(--nc-dark-cyan-soft);
267
- --nc-status-warning: var(--nc-warning);
268
- --nc-status-error: var(--nc-error-soft);
269
- --nc-status-paused: var(--nc-cross);
270
- --nc-status-running: var(--nc-dark-cyan);
271
- --nc-status-blocked: var(--nc-error-soft);
272
- --nc-status-complete: var(--nc-dark-cyan-soft);
273
- --nc-status-offline: var(--nc-cross);
274
- --nc-status-online: var(--nc-dark-cyan-soft);
275
-
276
- --nc-diff-added-line: var(--nc-dark-link-bg-soft);
277
- --nc-diff-added-word: var(--nc-dark-cyan-soft);
278
- --nc-diff-removed-line: var(--nc-error-deep);
279
- --nc-diff-removed-word: var(--nc-error-soft);
280
- --nc-diff-hunk: var(--muted);
281
- --nc-diff-file-header: var(--muted-foreground);
282
- /* Code/terminal chrome must stay near-black in dark mode. --nc-ink flips
283
- light at :root.dark (generated surface-palette remap), so these ink-as-
284
- surface aliases re-pin to the dark canvas tokens explicitly. */
285
- --nc-code-surface: var(--nc-dark-canvas-soft);
286
- --nc-code-border: var(--nc-body);
287
- /* cyan family retired per Italia color contract §6. dark-cyan/-soft/-deep
288
- were kept unchanged in DESIGN.md specifically for this dark-mode "electric"
289
- accent role, so repoint here rather than to info (which is the light-mode
290
- replacement) to preserve the existing dark-theme look. */
291
- --nc-code-token-keyword: var(--nc-dark-cyan);
292
- --nc-code-token-string: var(--nc-dark-cyan-soft);
293
- --nc-code-token-comment: var(--nc-cross);
294
- --nc-code-token-function: var(--nc-dark-cyan-soft);
295
-
296
- --nc-terminal-bg: var(--nc-dark-canvas-soft);
297
- --nc-terminal-fg: var(--nc-on-primary);
298
- --nc-terminal-muted: var(--nc-cross);
299
- --nc-terminal-cursor: var(--nc-dark-cyan);
300
- --nc-terminal-selection-bg: var(--nc-dark-link-bg-soft);
301
- --nc-terminal-ansi-black: var(--nc-dark-line);
302
- --nc-terminal-ansi-red: var(--nc-error-soft);
303
- --nc-terminal-ansi-green: var(--nc-dark-cyan-soft);
304
- --nc-terminal-ansi-yellow: var(--nc-warning);
305
- --nc-terminal-ansi-blue: var(--nc-dark-cyan);
306
- --nc-terminal-ansi-magenta: var(--nc-flag-red);
307
- --nc-terminal-ansi-cyan: var(--nc-dark-cyan-soft);
308
- --nc-terminal-ansi-white: var(--nc-on-primary);
309
- --nc-terminal-ansi-bright-black: var(--nc-cross);
310
- --nc-terminal-ansi-bright-red: var(--nc-error-soft);
311
- --nc-terminal-ansi-bright-green: var(--nc-dark-cyan-soft);
312
- --nc-terminal-ansi-bright-yellow: var(--nc-warning);
313
- --nc-terminal-ansi-bright-blue: var(--nc-dark-cyan);
314
- --nc-terminal-ansi-bright-magenta: var(--nc-flag-red);
315
- --nc-terminal-ansi-bright-cyan: var(--nc-dark-cyan-soft);
316
- --nc-terminal-ansi-bright-white: var(--nc-on-primary);
317
-
318
- --nc-model-provider-surface: var(--muted);
319
- --nc-model-capability-surface: var(--accent);
320
- --nc-model-capability-border: var(--nc-dark-cyan);
321
- --nc-model-context-meter: var(--nc-warning);
322
- --nc-model-cost-warning: var(--nc-warning);
323
- --nc-model-rate-limit: var(--nc-error-soft);
324
-
325
- --nc-plugin-permission-safe: var(--nc-dark-cyan-soft);
326
- --nc-plugin-permission-review: var(--nc-warning);
327
- --nc-plugin-permission-risk: var(--nc-flag-red);
328
- --nc-plugin-permission-denied: var(--nc-error-soft);
329
- --nc-plugin-permission-surface: var(--muted);
330
- --nc-plugin-permission-foreground: var(--foreground);
331
- }
332
-
333
51
  /*
334
52
  * The design-system CSS components (.nc-chat-thread, .nc-chat-bubble-*,
335
53
  * .nc-artifact-preview, .nc-approval-gate, .nc-tool-call-trace,
336
54
  * .nc-usage-meter, .nc-run-timeline, .nc-memory-item, .nc-handoff-banner, …)
337
55
  * paint from the raw --nc-canvas/ink/body/line/canvas-soft/muted/warning
338
- * palette. The generated theme remaps that surface palette (alongside the
339
- * state/selection/cross/chart families) at :root.dark, so every nc-* CSS
340
- * component is dark-correct with no per-component selector list here.
341
- * Ink-as-surface aliases (code/terminal chrome) re-pin to explicit dark
342
- * canvas tokens in the .dark block above, since --nc-ink flips light.
56
+ * palette. The generated mode layer remaps that surface palette alongside every
57
+ * other authored dark pair, so nc-* CSS components need no local mode selectors.
58
+ */
59
+
60
+ /*
61
+ * ansi-to-react emits stable classes when Terminal enables `useClasses`.
62
+ * Terminal is an intentionally fixed-dark technology surface, so this adapter
63
+ * maps those protocol classes directly to canonical dark design tokens. It does
64
+ * not declare a parallel product-token hierarchy.
343
65
  */
66
+ [data-slot="terminal"] .ansi-black-fg {
67
+ color: var(--nc-dark-muted);
68
+ }
69
+
70
+ [data-slot="terminal"] .ansi-red-fg {
71
+ color: var(--nc-dark-error);
72
+ }
73
+
74
+ [data-slot="terminal"] .ansi-green-fg {
75
+ color: var(--nc-dark-success);
76
+ }
77
+
78
+ [data-slot="terminal"] .ansi-yellow-fg {
79
+ color: var(--nc-dark-warning);
80
+ }
81
+
82
+ [data-slot="terminal"] .ansi-blue-fg {
83
+ color: var(--nc-dark-info);
84
+ }
85
+
86
+ [data-slot="terminal"] .ansi-magenta-fg {
87
+ color: var(--nc-dark-chart-6);
88
+ }
89
+
90
+ [data-slot="terminal"] .ansi-cyan-fg {
91
+ color: var(--nc-dark-cyan);
92
+ }
93
+
94
+ [data-slot="terminal"] .ansi-white-fg {
95
+ color: var(--nc-dark-body);
96
+ }
97
+
98
+ [data-slot="terminal"] .ansi-bright-black-fg {
99
+ color: var(--nc-dark-body);
100
+ }
101
+
102
+ [data-slot="terminal"] .ansi-bright-red-fg {
103
+ color: var(--nc-dark-error-deep);
104
+ }
105
+
106
+ [data-slot="terminal"] .ansi-bright-green-fg {
107
+ color: var(--nc-dark-link-deep);
108
+ }
109
+
110
+ [data-slot="terminal"] .ansi-bright-yellow-fg {
111
+ color: var(--nc-dark-warning-deep);
112
+ }
113
+
114
+ [data-slot="terminal"] .ansi-bright-blue-fg {
115
+ color: var(--nc-dark-info-deep);
116
+ }
117
+
118
+ [data-slot="terminal"] .ansi-bright-magenta-fg {
119
+ color: var(--nc-dark-chart-seq-3);
120
+ }
121
+
122
+ [data-slot="terminal"] .ansi-bright-cyan-fg {
123
+ color: var(--nc-dark-cyan-soft);
124
+ }
125
+
126
+ [data-slot="terminal"] .ansi-bright-white-fg {
127
+ color: var(--nc-dark-ink);
128
+ }
129
+
130
+ [data-slot="terminal"] .ansi-black-bg {
131
+ background-color: var(--nc-dark-canvas);
132
+ }
133
+
134
+ [data-slot="terminal"] .ansi-red-bg {
135
+ background-color: var(--nc-dark-error);
136
+ }
137
+
138
+ [data-slot="terminal"] .ansi-green-bg {
139
+ background-color: var(--nc-dark-success);
140
+ }
141
+
142
+ [data-slot="terminal"] .ansi-yellow-bg {
143
+ background-color: var(--nc-dark-warning);
144
+ }
145
+
146
+ [data-slot="terminal"] .ansi-blue-bg {
147
+ background-color: var(--nc-dark-info);
148
+ }
149
+
150
+ [data-slot="terminal"] .ansi-magenta-bg {
151
+ background-color: var(--nc-dark-chart-6);
152
+ }
153
+
154
+ [data-slot="terminal"] .ansi-cyan-bg {
155
+ background-color: var(--nc-dark-cyan);
156
+ }
157
+
158
+ [data-slot="terminal"] .ansi-white-bg {
159
+ background-color: var(--nc-dark-body);
160
+ }
161
+
162
+ [data-slot="terminal"] .ansi-bright-black-bg {
163
+ background-color: var(--nc-dark-body);
164
+ }
165
+
166
+ [data-slot="terminal"] .ansi-bright-red-bg {
167
+ background-color: var(--nc-dark-error-deep);
168
+ }
169
+
170
+ [data-slot="terminal"] .ansi-bright-green-bg {
171
+ background-color: var(--nc-dark-link-deep);
172
+ }
173
+
174
+ [data-slot="terminal"] .ansi-bright-yellow-bg {
175
+ background-color: var(--nc-dark-warning-deep);
176
+ }
177
+
178
+ [data-slot="terminal"] .ansi-bright-blue-bg {
179
+ background-color: var(--nc-dark-info-deep);
180
+ }
181
+
182
+ [data-slot="terminal"] .ansi-bright-magenta-bg {
183
+ background-color: var(--nc-dark-chart-seq-3);
184
+ }
185
+
186
+ [data-slot="terminal"] .ansi-bright-cyan-bg {
187
+ background-color: var(--nc-dark-cyan-soft);
188
+ }
189
+
190
+ [data-slot="terminal"] .ansi-bright-white-bg {
191
+ background-color: var(--nc-dark-ink);
192
+ }
193
+
194
+ [data-slot="terminal"] .ansi-black-bg:not([class*="-fg"]) {
195
+ color: var(--nc-dark-ink);
196
+ }
197
+
198
+ [data-slot="terminal"]
199
+ :is(
200
+ .ansi-red-bg,
201
+ .ansi-green-bg,
202
+ .ansi-yellow-bg,
203
+ .ansi-blue-bg,
204
+ .ansi-magenta-bg,
205
+ .ansi-cyan-bg,
206
+ .ansi-white-bg,
207
+ .ansi-bright-black-bg,
208
+ .ansi-bright-red-bg,
209
+ .ansi-bright-green-bg,
210
+ .ansi-bright-yellow-bg,
211
+ .ansi-bright-blue-bg,
212
+ .ansi-bright-magenta-bg,
213
+ .ansi-bright-cyan-bg,
214
+ .ansi-bright-white-bg
215
+ ):not([class*="-fg"]) {
216
+ color: var(--nc-dark-canvas);
217
+ }
344
218
 
345
219
  [data-nc-code-block-body] {
346
220
  background-color: var(--shiki-code-block-light-bg, var(--background));
@@ -407,3 +281,4 @@
407
281
  }
408
282
 
409
283
  @source "../components";
284
+ @source "../lib";
@@ -11,8 +11,9 @@ The React agent layer is the React face of the design-system Agentic Work
11
11
  Surface CSS families (`design-system/DESIGN.md`). Each component consumes its
12
12
  `nc-*` family class for identity — surface, border, chrome — and adds Tailwind
13
13
  only for layout and spacing; the CSS family owns any value it already sets. The
14
- families come from `@nadicodeai/design-system/css`, which the consuming app
15
- imports alongside `@nadicodeai/ui/globals.css`.
14
+ families arrive through the UI package's complete React stylesheet interface.
15
+ Consumer setup lives in [`consuming-cross-repo.md`](consuming-cross-repo.md);
16
+ the component styling invariant lives in [`contract.md`](contract.md).
16
17
 
17
18
  - `AgentThread` -> `nc-chat-thread`.
18
19
  - `AgentMessage` text bubbles -> `nc-chat-bubble-user` / `nc-chat-bubble-agent`;
@@ -34,7 +35,7 @@ imports alongside `@nadicodeai/ui/globals.css`.
34
35
  - `AgentComposer` renders a controlled or uncontrolled input surface with
35
36
  attachments, queue panel, submit or stop control, and slash or mention slots.
36
37
  - `AgentToolApproval` renders the approval choices `run`, `deny`, `session`,
37
- and `always` with stable semantic aliases.
38
+ and `always` with stable action meanings.
38
39
  - `ArtifactPanel` renders text, code, diff, terminal summary, preview,
39
40
  stack-trace, and test-result artifacts.
40
41
  - `FilesPreview` and `ProjectFileTree` render a serializable project tree and
@@ -113,9 +114,9 @@ const redactedTool = {
113
114
  } as const
114
115
  ```
115
116
 
116
- ## Approval Aliases
117
+ ## Approval Meanings
117
118
 
118
- `AgentToolApproval` emits both the user-facing choice and a semantic alias:
119
+ `AgentToolApproval` emits both the user-facing choice and a stable action value:
119
120
 
120
121
  - `run` -> `approve-once`
121
122
  - `deny` -> `reject`