@nonoun/native-ai 1.0.21 → 1.0.23

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 (144) hide show
  1. package/dist/a2ui/a2ui-diagnostics.d.ts +31 -0
  2. package/dist/a2ui/a2ui-diagnostics.d.ts.map +1 -0
  3. package/dist/a2ui/a2ui-element.d.ts +30 -0
  4. package/dist/a2ui/a2ui-element.d.ts.map +1 -0
  5. package/dist/a2ui/a2ui-presets.d.ts +22 -0
  6. package/dist/a2ui/a2ui-presets.d.ts.map +1 -0
  7. package/dist/a2ui/adapters/a2a-adapter.d.ts +38 -0
  8. package/dist/a2ui/adapters/a2a-adapter.d.ts.map +1 -0
  9. package/dist/a2ui/adapters/adapter-types.d.ts +19 -0
  10. package/dist/a2ui/adapters/adapter-types.d.ts.map +1 -0
  11. package/dist/a2ui/adapters/ag-ui-adapter.d.ts +42 -0
  12. package/dist/a2ui/adapters/ag-ui-adapter.d.ts.map +1 -0
  13. package/dist/a2ui/adapters/direct-adapter.d.ts +30 -0
  14. package/dist/a2ui/adapters/direct-adapter.d.ts.map +1 -0
  15. package/dist/a2ui/adapters/index.d.ts +8 -0
  16. package/dist/a2ui/adapters/index.d.ts.map +1 -0
  17. package/dist/a2ui/index.d.ts +15 -0
  18. package/dist/a2ui/index.d.ts.map +1 -0
  19. package/dist/a2ui/install.d.ts +23 -0
  20. package/dist/a2ui/install.d.ts.map +1 -0
  21. package/dist/a2ui/protocol/a2ui-adapter.d.ts +52 -0
  22. package/dist/a2ui/protocol/a2ui-adapter.d.ts.map +1 -0
  23. package/dist/a2ui/protocol/a2ui-component-map.d.ts +98 -0
  24. package/dist/a2ui/protocol/a2ui-component-map.d.ts.map +1 -0
  25. package/dist/a2ui/protocol/a2ui-composition-map.d.ts +101 -0
  26. package/dist/a2ui/protocol/a2ui-composition-map.d.ts.map +1 -0
  27. package/dist/a2ui/protocol/a2ui-converter.d.ts +37 -0
  28. package/dist/a2ui/protocol/a2ui-converter.d.ts.map +1 -0
  29. package/dist/a2ui/protocol/a2ui-surface.d.ts +34 -0
  30. package/dist/a2ui/protocol/a2ui-surface.d.ts.map +1 -0
  31. package/dist/a2ui/protocol/a2ui-transport.d.ts +80 -0
  32. package/dist/a2ui/protocol/a2ui-transport.d.ts.map +1 -0
  33. package/dist/a2ui/protocol/a2ui-types.d.ts +104 -0
  34. package/dist/a2ui/protocol/a2ui-types.d.ts.map +1 -0
  35. package/dist/a2ui/protocol/index.d.ts +15 -0
  36. package/dist/a2ui/protocol/index.d.ts.map +1 -0
  37. package/dist/a2ui/protocol/kernel-bridge.d.ts +114 -0
  38. package/dist/a2ui/protocol/kernel-bridge.d.ts.map +1 -0
  39. package/dist/a2ui/register.d.ts +12 -0
  40. package/dist/a2ui/register.d.ts.map +1 -0
  41. package/dist/a2ui/session/agent-session.d.ts +44 -0
  42. package/dist/a2ui/session/agent-session.d.ts.map +1 -0
  43. package/dist/a2ui/session/catalog.d.ts +41 -0
  44. package/dist/a2ui/session/catalog.d.ts.map +1 -0
  45. package/dist/a2ui/session/event-emitter.d.ts +17 -0
  46. package/dist/a2ui/session/event-emitter.d.ts.map +1 -0
  47. package/dist/a2ui/session/index.d.ts +9 -0
  48. package/dist/a2ui/session/index.d.ts.map +1 -0
  49. package/dist/a2ui/session/session-manager.d.ts +33 -0
  50. package/dist/a2ui/session/session-manager.d.ts.map +1 -0
  51. package/dist/a2ui/session/surface-registry.d.ts +32 -0
  52. package/dist/a2ui/session/surface-registry.d.ts.map +1 -0
  53. package/dist/a2ui/session/types.d.ts +27 -0
  54. package/dist/a2ui/session/types.d.ts.map +1 -0
  55. package/dist/chat/avatar/chat-avatar-element.d.ts +18 -0
  56. package/dist/chat/avatar/chat-avatar-element.d.ts.map +1 -0
  57. package/dist/chat/avatar/index.d.ts +2 -0
  58. package/dist/chat/avatar/index.d.ts.map +1 -0
  59. package/dist/chat/avatar/n-chat-avatar.d.ts +2 -0
  60. package/dist/chat/avatar/n-chat-avatar.d.ts.map +1 -0
  61. package/dist/chat/chat-input-element.d.ts +35 -0
  62. package/dist/chat/chat-input-element.d.ts.map +1 -0
  63. package/dist/chat/chat-panel-element.d.ts +100 -0
  64. package/dist/chat/chat-panel-element.d.ts.map +1 -0
  65. package/dist/chat/feed/chat-feed-element.d.ts +48 -0
  66. package/dist/chat/feed/chat-feed-element.d.ts.map +1 -0
  67. package/dist/chat/feed/index.d.ts +2 -0
  68. package/dist/chat/feed/index.d.ts.map +1 -0
  69. package/dist/chat/feed/n-chat-feed.d.ts +2 -0
  70. package/dist/chat/feed/n-chat-feed.d.ts.map +1 -0
  71. package/dist/chat/gateway/adapter-chatgpt.d.ts +67 -0
  72. package/dist/chat/gateway/adapter-chatgpt.d.ts.map +1 -0
  73. package/dist/chat/gateway/adapter-claude.d.ts +68 -0
  74. package/dist/chat/gateway/adapter-claude.d.ts.map +1 -0
  75. package/dist/chat/gateway/adapter-mock.d.ts +3 -0
  76. package/dist/chat/gateway/adapter-mock.d.ts.map +1 -0
  77. package/dist/chat/gateway/adapter.d.ts +71 -0
  78. package/dist/chat/gateway/adapter.d.ts.map +1 -0
  79. package/dist/chat/gateway/controller.d.ts +46 -0
  80. package/dist/chat/gateway/controller.d.ts.map +1 -0
  81. package/dist/chat/gateway/index.d.ts +9 -0
  82. package/dist/chat/gateway/index.d.ts.map +1 -0
  83. package/dist/chat/gateway/runtime.d.ts +53 -0
  84. package/dist/chat/gateway/runtime.d.ts.map +1 -0
  85. package/dist/chat/gateway/types.d.ts +73 -0
  86. package/dist/chat/gateway/types.d.ts.map +1 -0
  87. package/dist/chat/gateway.d.ts +2 -0
  88. package/dist/chat/gateway.d.ts.map +1 -0
  89. package/dist/chat/index.d.ts +17 -0
  90. package/dist/chat/index.d.ts.map +1 -0
  91. package/dist/chat/message/chat-input-structured-element.d.ts +43 -0
  92. package/dist/chat/message/chat-input-structured-element.d.ts.map +1 -0
  93. package/dist/chat/message/chat-message-activity-element.d.ts +32 -0
  94. package/dist/chat/message/chat-message-activity-element.d.ts.map +1 -0
  95. package/dist/chat/message/chat-message-element.d.ts +44 -0
  96. package/dist/chat/message/chat-message-element.d.ts.map +1 -0
  97. package/dist/chat/message/chat-message-genui-element.d.ts +45 -0
  98. package/dist/chat/message/chat-message-genui-element.d.ts.map +1 -0
  99. package/dist/chat/message/chat-message-seed-element.d.ts +33 -0
  100. package/dist/chat/message/chat-message-seed-element.d.ts.map +1 -0
  101. package/dist/chat/message/chat-message-text-element.d.ts +37 -0
  102. package/dist/chat/message/chat-message-text-element.d.ts.map +1 -0
  103. package/dist/chat/message/chat-messages-element.d.ts +39 -0
  104. package/dist/chat/message/chat-messages-element.d.ts.map +1 -0
  105. package/dist/chat/message/index.d.ts +8 -0
  106. package/dist/chat/message/index.d.ts.map +1 -0
  107. package/dist/chat/message/n-chat-message.d.ts +2 -0
  108. package/dist/chat/message/n-chat-message.d.ts.map +1 -0
  109. package/dist/chat/register.d.ts +13 -0
  110. package/dist/chat/register.d.ts.map +1 -0
  111. package/dist/chat/stream/classify.d.ts +19 -0
  112. package/dist/chat/stream/classify.d.ts.map +1 -0
  113. package/dist/chat/stream/create-transport.d.ts +19 -0
  114. package/dist/chat/stream/create-transport.d.ts.map +1 -0
  115. package/dist/chat/stream/index.d.ts +9 -0
  116. package/dist/chat/stream/index.d.ts.map +1 -0
  117. package/dist/chat/stream/parse-json.d.ts +9 -0
  118. package/dist/chat/stream/parse-json.d.ts.map +1 -0
  119. package/dist/chat/stream/parse-ndjson.d.ts +9 -0
  120. package/dist/chat/stream/parse-ndjson.d.ts.map +1 -0
  121. package/dist/chat/stream/parse-sse.d.ts +9 -0
  122. package/dist/chat/stream/parse-sse.d.ts.map +1 -0
  123. package/dist/chat/stream/types.d.ts +42 -0
  124. package/dist/chat/stream/types.d.ts.map +1 -0
  125. package/dist/chat/telemetry/emitter.d.ts +20 -0
  126. package/dist/chat/telemetry/emitter.d.ts.map +1 -0
  127. package/dist/chat/telemetry/events.d.ts +11 -0
  128. package/dist/chat/telemetry/events.d.ts.map +1 -0
  129. package/dist/chat/telemetry/index.d.ts +5 -0
  130. package/dist/chat/telemetry/index.d.ts.map +1 -0
  131. package/dist/chat/telemetry/redactor.d.ts +17 -0
  132. package/dist/chat/telemetry/redactor.d.ts.map +1 -0
  133. package/dist/chat/telemetry/types.d.ts +27 -0
  134. package/dist/chat/telemetry/types.d.ts.map +1 -0
  135. package/dist/gateway.d.ts +2 -0
  136. package/dist/gateway.d.ts.map +1 -0
  137. package/dist/index.d.ts +5 -0
  138. package/dist/index.d.ts.map +1 -0
  139. package/dist/native-ai.css +1567 -0
  140. package/dist/native-ai.js +252 -202
  141. package/dist/register.d.ts +12 -0
  142. package/dist/register.d.ts.map +1 -0
  143. package/dist/register.js +246 -196
  144. package/package.json +1 -1
@@ -0,0 +1,1567 @@
1
+ /**
2
+ * native-a2ui — A2UI Protocol Workbench
3
+ *
4
+ * Layout: chip-toggled multi-panel — preview left, N resizable panes right.
5
+ * Chrome & token patterns mirror <native-playground> for a unified devtool look.
6
+ * Loaded by consumers via: @import '@nonoun/native-ai/css'
7
+ */
8
+
9
+ @layer ui {
10
+
11
+ /* ── Host ── */
12
+
13
+ :where(native-a2ui) {
14
+ /* Devtool chrome tokens — mirrors native-playground */
15
+ --n-pg-chrome: var(--n-panel-neutral, #21252b);
16
+ --n-pg-editor-bg: var(--n-control-neutral, #282c34);
17
+ --n-pg-border-color: var(--n-border-muted-neutral, #3e4451);
18
+ --n-pg-border: 1px solid var(--n-pg-border-color);
19
+ --n-pg-text: var(--n-ink-neutral, #abb2bf);
20
+ --n-pg-text-muted: var(--n-ink-muted-neutral, #7d8799);
21
+ --n-pg-text-strong: var(--n-ink-strong-neutral, #e5e7eb);
22
+ --n-pg-accent: var(--n-ink-accent, #61afef);
23
+ --n-pg-run: var(--n-ink-success, #98c379);
24
+ --n-pg-run-hover: var(--n-ink-hover-success, #b5e890);
25
+ --n-pg-run-hover-bg: var(--n-control-success, #333d37);
26
+ --n-pg-warn: var(--n-ink-warning, #e5c07b);
27
+ --n-pg-error: var(--n-ink-danger, #e06c75);
28
+ --n-pg-preview-bg: var(--n-body-neutral, #ffffff);
29
+
30
+ display: grid;
31
+ grid-template-rows: auto 1fr;
32
+ min-height: 400px;
33
+ max-height: 80dvh;
34
+ border: var(--n-pg-border);
35
+ border-radius: var(--n-radius-lg, 0.75rem);
36
+ overflow: hidden;
37
+ background: var(--n-pg-editor-bg);
38
+ color: var(--n-pg-text);
39
+ user-select: none;
40
+ }
41
+
42
+ /* Allow text selection in content areas */
43
+ :where(native-a2ui) :where(.a2ui-preview-content),
44
+ :where(native-a2ui) :where(.a2ui-pane-content),
45
+ :where(native-a2ui) :where(.cm-editor) {
46
+ user-select: text;
47
+ }
48
+
49
+ /* Full-viewport presented state (PresentController sets [presented]) */
50
+ :where(native-a2ui)[presented] {
51
+ width: 100%;
52
+ height: 100%;
53
+ max-height: none;
54
+ justify-self: stretch;
55
+ align-self: stretch;
56
+ border: none;
57
+ border-radius: 0;
58
+ }
59
+
60
+ /* ── Dark chrome header toolbar (chips + expand) ── */
61
+
62
+ :where(native-a2ui) > :where(n-header) {
63
+ display: flex;
64
+ align-items: center;
65
+ flex: none;
66
+ background: var(--n-pg-chrome);
67
+ --n-ink: var(--n-pg-text-muted);
68
+ --n-ink-hover: var(--n-pg-text);
69
+ --n-ink-strong: var(--n-pg-text-strong);
70
+ --n-border-muted: transparent;
71
+ }
72
+
73
+ /* Header button hover background */
74
+ :where(native-a2ui) > :where(n-header) :where(n-button):hover,
75
+ :where(native-a2ui) > :where(n-header) :where(n-button)[force-hover] {
76
+ background: var(--n-pg-editor-bg);
77
+ }
78
+
79
+ /* Chip active state — "panel is open" indicator */
80
+ :where(native-a2ui) > :where(n-header) :where(n-button)[data-active] {
81
+ background: var(--n-pg-editor-bg);
82
+ color: var(--n-pg-text-strong);
83
+ }
84
+
85
+ /* Play All button — green accent override (mirrors playground Run button) */
86
+ :where(native-a2ui) :where(n-button[data-role="run"]) {
87
+ --n-color: var(--n-pg-run);
88
+ --n-color-hover: var(--n-pg-run-hover);
89
+ }
90
+
91
+ :where(native-a2ui) :where(n-button[data-role="run"]):hover,
92
+ :where(native-a2ui) :where(n-button[data-role="run"])[force-hover] {
93
+ background: var(--n-pg-run-hover-bg);
94
+ }
95
+
96
+ /* ── Split: preview left, panes right ── */
97
+
98
+ :where(native-a2ui) :where(.a2ui-split) {
99
+ display: flex;
100
+ min-height: 0;
101
+ overflow: hidden;
102
+ }
103
+
104
+ /* ── Preview (left side) ── */
105
+
106
+ :where(native-a2ui) :where(.a2ui-preview) {
107
+ position: relative;
108
+ display: flex;
109
+ flex-direction: column;
110
+ flex: 1 1 50%;
111
+ min-width: 200px;
112
+ min-height: 0;
113
+ overflow: hidden;
114
+ }
115
+
116
+ /* When resized, respect the explicit width */
117
+ :where(native-a2ui) :where(.a2ui-preview[style*="width"]) {
118
+ flex: none;
119
+ }
120
+
121
+ :where(native-a2ui) :where(.a2ui-preview-content) {
122
+ flex: 1;
123
+ min-height: 0;
124
+ overflow: auto;
125
+ padding: 1rem;
126
+ background: var(--n-pg-preview-bg);
127
+ }
128
+
129
+ /* ── Resize Handle (shared by preview + panes) ── */
130
+
131
+ :where(native-a2ui) :where(.a2ui-resize-handle) {
132
+ position: absolute;
133
+ top: 0;
134
+ right: 0;
135
+ bottom: 0;
136
+ width: 6px;
137
+ cursor: col-resize;
138
+ background: transparent;
139
+ transition: background 150ms;
140
+ z-index: 1;
141
+ }
142
+
143
+ :where(native-a2ui) :where(.a2ui-resize-handle):hover,
144
+ :where(native-a2ui) :where([resizing]) :where(.a2ui-resize-handle) {
145
+ background: var(--n-pg-accent);
146
+ }
147
+
148
+ /* Hide handle on the last visible pane — nothing to resize against.
149
+ Hidden panes have display:none so :last-child among visible = no subsequent visible sibling. */
150
+ :where(native-a2ui) :where(.a2ui-pane):not([hidden]):not(:has(~ .a2ui-pane:not([hidden]))) > :where(.a2ui-resize-handle) {
151
+ display: none;
152
+ }
153
+
154
+ /* ── Pane (each toggled panel in the split) ── */
155
+
156
+ :where(native-a2ui) :where(.a2ui-pane) {
157
+ position: relative;
158
+ display: flex;
159
+ flex-direction: column;
160
+ flex: 1 1 0%;
161
+ min-width: 150px;
162
+ min-height: 0;
163
+ overflow: hidden;
164
+ border-left: var(--n-pg-border);
165
+ }
166
+
167
+ /* When resized (has explicit width from ResizeController), don't flex-grow */
168
+ :where(native-a2ui) :where(.a2ui-pane[style*="width"]) {
169
+ flex: none;
170
+ }
171
+
172
+ :where(native-a2ui) :where(.a2ui-pane[hidden]) {
173
+ display: none;
174
+ }
175
+
176
+ /* ── Pane Header (icon + label + close button) ── */
177
+
178
+ :where(native-a2ui) :where(.a2ui-pane) > :where(n-header) {
179
+ display: grid;
180
+ grid-template-columns: auto 1fr auto;
181
+ align-items: center;
182
+ gap: 0.375rem;
183
+ flex: none;
184
+ background: var(--n-pg-chrome);
185
+ border-bottom: var(--n-pg-border);
186
+ min-height: unset;
187
+ padding-block: 0;
188
+ padding-inline: 0.5rem;
189
+ --n-ink: var(--n-pg-text-muted);
190
+ --n-ink-hover: var(--n-pg-text);
191
+ --n-size: 1.75rem;
192
+ font-size: 0.75rem;
193
+ font-weight: 600;
194
+ text-transform: uppercase;
195
+ letter-spacing: 0.04em;
196
+ }
197
+
198
+ :where(native-a2ui) :where(.a2ui-pane) > :where(n-header) > :where(nav),
199
+ :where(native-a2ui) :where(.a2ui-pane) > :where(n-header) > :where(aside) {
200
+ display: flex;
201
+ align-items: center;
202
+ gap: 0.25rem;
203
+ }
204
+
205
+ :where(native-a2ui) :where(.a2ui-pane) > :where(n-header) :where(n-icon) {
206
+ font-size: 0.875rem;
207
+ }
208
+
209
+ :where(native-a2ui) :where(.a2ui-pane) > :where(n-header) :where(n-button):hover,
210
+ :where(native-a2ui) :where(.a2ui-pane) > :where(n-header) :where(n-button)[force-hover] {
211
+ background: var(--n-pg-editor-bg);
212
+ }
213
+
214
+ /* ── Pane Content (inner scrollable area) ── */
215
+
216
+ :where(native-a2ui) :where(.a2ui-pane-content) {
217
+ flex: 1;
218
+ min-height: 0;
219
+ overflow: auto;
220
+ padding: 0.5rem;
221
+ font-family: var(--n-font-family-mono, ui-monospace, 'SF Mono', 'Cascadia Code', monospace);
222
+ font-size: 0.8125rem;
223
+ line-height: 1.5;
224
+ }
225
+
226
+ /* CodeMirror panes: editor fills space, no padding */
227
+ :where(native-a2ui) :where([data-panel="json-in"]) :where(.a2ui-pane-content),
228
+ :where(native-a2ui) :where([data-panel="js"]) :where(.a2ui-pane-content),
229
+ :where(native-a2ui) :where([data-panel="html"]) :where(.a2ui-pane-content),
230
+ :where(native-a2ui) :where([data-panel="css"]) :where(.a2ui-pane-content),
231
+ :where(native-a2ui) :where([data-panel="schema"]) :where(.a2ui-pane-content) {
232
+ padding: 0;
233
+ overflow: hidden;
234
+ }
235
+
236
+ /* ── Component Map Table (UI pane) ── */
237
+
238
+ :where(native-a2ui) :where(.a2ui-map-summary) {
239
+ padding: 0.375rem 0.5rem;
240
+ font-size: 0.6875rem;
241
+ color: var(--n-pg-text-muted);
242
+ border-bottom: var(--n-pg-border);
243
+ }
244
+
245
+ :where(native-a2ui) :where(.a2ui-component-map) {
246
+ width: 100%;
247
+ border-collapse: collapse;
248
+ font-size: 0.75rem;
249
+ line-height: 1.4;
250
+ }
251
+
252
+ :where(native-a2ui) :where(.a2ui-component-map) :where(th) {
253
+ text-align: left;
254
+ padding: 0.25rem 0.5rem;
255
+ color: var(--n-pg-text-muted);
256
+ font-weight: 600;
257
+ font-size: 0.6875rem;
258
+ text-transform: uppercase;
259
+ letter-spacing: 0.04em;
260
+ border-bottom: var(--n-pg-border);
261
+ position: sticky;
262
+ top: 0;
263
+ background: var(--n-pg-chrome);
264
+ }
265
+
266
+ :where(native-a2ui) :where(.a2ui-component-map) :where(td) {
267
+ padding: 0.1875rem 0.5rem;
268
+ border-bottom: 1px solid color-mix(in oklch, var(--n-pg-text-muted), transparent 85%);
269
+ white-space: nowrap;
270
+ }
271
+
272
+ :where(native-a2ui) :where(.a2ui-component-map) :where(code) {
273
+ font-family: var(--n-font-family-mono, ui-monospace, 'SF Mono', 'Cascadia Code', monospace);
274
+ font-size: 0.6875rem;
275
+ background: color-mix(in oklch, var(--n-pg-text-muted), transparent 88%);
276
+ padding: 0.0625rem 0.25rem;
277
+ border-radius: 0.1875rem;
278
+ }
279
+
280
+ :where(native-a2ui) :where(.a2ui-map-type) {
281
+ font-weight: 600;
282
+ }
283
+
284
+ :where(native-a2ui) :where(.a2ui-map-active) {
285
+ background: color-mix(in oklch, var(--n-pg-text), transparent 92%);
286
+ }
287
+
288
+ :where(native-a2ui) :where(.a2ui-map-active) :where(.a2ui-map-type) {
289
+ color: var(--n-color-accent-500, oklch(0.65 0.2 260));
290
+ }
291
+
292
+ :where(native-a2ui) :where(.a2ui-map-row) {
293
+ cursor: pointer;
294
+ }
295
+
296
+ :where(native-a2ui) :where(.a2ui-map-row):hover {
297
+ background: color-mix(in oklch, var(--n-pg-text), transparent 92%);
298
+ }
299
+
300
+ :where(native-a2ui) :where(.a2ui-map-category) {
301
+ color: var(--n-pg-text-muted);
302
+ font-size: 0.6875rem;
303
+ }
304
+
305
+ /* ── Component Detail View ── */
306
+
307
+ :where(native-a2ui) :where(.a2ui-map-back) {
308
+ font-size: 0.6875rem;
309
+ --n-color: var(--n-pg-accent);
310
+ --n-color-hover: var(--n-pg-text-strong);
311
+ border-radius: 0;
312
+ }
313
+
314
+ :where(native-a2ui) :where(.a2ui-map-detail) {
315
+ padding: 0.5rem;
316
+ }
317
+
318
+ :where(native-a2ui) :where(.a2ui-map-detail-title) {
319
+ font-size: 0.875rem;
320
+ font-weight: 600;
321
+ color: var(--n-pg-text-strong);
322
+ }
323
+
324
+ :where(native-a2ui) :where(.a2ui-map-detail-row) {
325
+ display: flex;
326
+ align-items: baseline;
327
+ gap: 0.5rem;
328
+ padding: 0.1875rem 0;
329
+ font-size: 0.75rem;
330
+ }
331
+
332
+ :where(native-a2ui) :where(.a2ui-map-detail-label) {
333
+ color: var(--n-pg-text-muted);
334
+ min-width: 4.5rem;
335
+ font-size: 0.6875rem;
336
+ text-transform: uppercase;
337
+ letter-spacing: 0.04em;
338
+ font-weight: 600;
339
+ }
340
+
341
+ :where(native-a2ui) :where(.a2ui-map-detail) :where(code) {
342
+ font-family: var(--n-font-family-mono, ui-monospace, 'SF Mono', 'Cascadia Code', monospace);
343
+ font-size: 0.6875rem;
344
+ background: color-mix(in oklch, var(--n-pg-text-muted), transparent 88%);
345
+ padding: 0.0625rem 0.25rem;
346
+ border-radius: 0.1875rem;
347
+ }
348
+
349
+ /* ── Detail Header (n-header with leading back + trailing tabs) ── */
350
+
351
+ :where(native-a2ui) :where(.a2ui-map-detail-header) {
352
+ padding-inline: 0.5rem;
353
+ padding-block: 0.25rem;
354
+ border-bottom: var(--n-pg-border);
355
+ }
356
+
357
+ :where(native-a2ui) :where(.a2ui-map-tab-bar) {
358
+ --n-background: var(--n-pg-surface);
359
+ --n-border-color: var(--n-pg-border-color);
360
+ --n-ink: var(--n-pg-text-muted);
361
+ --n-ink-strong: var(--n-pg-text-strong);
362
+ --n-border-muted: var(--n-pg-border-color);
363
+ }
364
+
365
+ /* ── Component Instance Editor ── */
366
+
367
+ :where(native-a2ui) :where(.a2ui-map-editor-section) {
368
+ display: flex;
369
+ flex-direction: column;
370
+ flex: 1;
371
+ min-height: 0;
372
+ }
373
+
374
+ :where(native-a2ui) :where(.a2ui-map-editor-toolbar) {
375
+ justify-content: flex-end;
376
+ padding-inline: 0.5rem;
377
+ --n-ink: var(--n-pg-run);
378
+ --n-ink-hover: var(--n-pg-run-hover);
379
+ --n-ground: var(--n-pg-chrome);
380
+ background: var(--n-pg-chrome);
381
+ }
382
+
383
+ :where(native-a2ui) :where(.a2ui-map-editor-section) :where(native-codemirror) {
384
+ flex: 1;
385
+ min-height: 0;
386
+ border-radius: 0;
387
+ overflow: hidden;
388
+ }
389
+
390
+ /* ── Compatible Alternatives ── */
391
+
392
+ :where(native-a2ui) :where(.a2ui-map-alternatives) {
393
+ margin-top: 0.75rem;
394
+ border-top: var(--n-pg-border);
395
+ padding-top: 0.5rem;
396
+ }
397
+
398
+ :where(native-a2ui) :where(.a2ui-map-alt-title) {
399
+ padding: 0 0.5rem 0.375rem;
400
+ font-size: 0.6875rem;
401
+ color: var(--n-pg-text-muted);
402
+ font-weight: 600;
403
+ text-transform: uppercase;
404
+ letter-spacing: 0.04em;
405
+ }
406
+
407
+ :where(native-a2ui) :where(.a2ui-map-alt-row) {
408
+ display: flex;
409
+ align-items: center;
410
+ gap: 0.5rem;
411
+ padding: 0.25rem 0.5rem;
412
+ font-size: 0.75rem;
413
+ cursor: pointer;
414
+ border-radius: 0.25rem;
415
+ }
416
+
417
+ :where(native-a2ui) :where(.a2ui-map-alt-row):hover {
418
+ background: color-mix(in oklch, var(--n-pg-text), transparent 92%);
419
+ }
420
+
421
+ :where(native-a2ui) :where(.a2ui-map-swap-icon) {
422
+ font-size: 0.75rem;
423
+ color: var(--n-pg-accent);
424
+ opacity: 0.5;
425
+ }
426
+
427
+ :where(native-a2ui) :where(.a2ui-map-alt-row):hover :where(.a2ui-map-swap-icon) {
428
+ opacity: 1;
429
+ }
430
+
431
+ :where(native-a2ui) :where(.a2ui-map-alt-row) :where(code) {
432
+ font-family: var(--n-font-family-mono, ui-monospace, 'SF Mono', 'Cascadia Code', monospace);
433
+ font-size: 0.6875rem;
434
+ background: color-mix(in oklch, var(--n-pg-text-muted), transparent 88%);
435
+ padding: 0.0625rem 0.25rem;
436
+ border-radius: 0.1875rem;
437
+ color: var(--n-pg-text-muted);
438
+ }
439
+
440
+ /* ── Toolbar (playback controls inside JSON-IN pane) ── */
441
+
442
+ :where(native-a2ui) :where([data-panel="json-in"]) > :where(n-toolbar),
443
+ :where(native-a2ui) :where([data-panel="schema"]) > :where(n-toolbar) {
444
+ flex: none;
445
+ background: var(--n-pg-chrome);
446
+ border-bottom: var(--n-pg-border);
447
+ --n-ink: var(--n-pg-text-muted);
448
+ --n-ink-hover: var(--n-pg-text);
449
+ }
450
+
451
+ /* Override n-divider flex:1 inside toolbar — just be a thin line */
452
+ :where(native-a2ui) :where([data-panel="json-in"]) > :where(n-toolbar) :where(n-divider),
453
+ :where(native-a2ui) :where([data-panel="schema"]) > :where(n-toolbar) :where(n-divider) {
454
+ flex: none;
455
+ }
456
+
457
+ /* Toolbar button hover */
458
+ :where(native-a2ui) :where([data-panel="json-in"]) > :where(n-toolbar) :where(n-button):hover,
459
+ :where(native-a2ui) :where([data-panel="json-in"]) > :where(n-toolbar) :where(n-button)[force-hover],
460
+ :where(native-a2ui) :where([data-panel="schema"]) > :where(n-toolbar) :where(n-button):hover,
461
+ :where(native-a2ui) :where([data-panel="schema"]) > :where(n-toolbar) :where(n-button)[force-hover] {
462
+ background: var(--n-pg-editor-bg);
463
+ }
464
+
465
+ /* ── CodeMirror (mirrors playground overrides) ── */
466
+
467
+ :where(native-a2ui) :where(native-codemirror) {
468
+ flex: 1;
469
+ min-height: 0;
470
+ border-radius: 0;
471
+ }
472
+
473
+ :where(native-a2ui) :where(.cm-editor) {
474
+ font-size: 0.8125rem;
475
+ color-scheme: dark;
476
+ }
477
+
478
+ :where(native-a2ui) :where(.cm-scroller) {
479
+ overflow: auto;
480
+ }
481
+
482
+ :where(native-a2ui) :where(.cm-gutters) {
483
+ border-right: none;
484
+ }
485
+
486
+ /* ── Log Entries (shared by JSON-OUT and JS panes) ── */
487
+
488
+ :where(native-a2ui) :where(.a2ui-log-entry) {
489
+ padding: 0.25rem 0;
490
+ border-bottom: var(--n-pg-border);
491
+ }
492
+
493
+ :where(native-a2ui) :where(.a2ui-log-type) {
494
+ margin-right: 0.5rem;
495
+ font-size: 0.5625rem;
496
+ --n-surface: var(--n-pg-chrome);
497
+ --n-surface-ink: var(--n-pg-text-muted);
498
+ vertical-align: middle;
499
+ }
500
+
501
+ :where(native-a2ui) :where(.a2ui-log-type--sent) { --n-surface-ink: var(--n-pg-accent); }
502
+ :where(native-a2ui) :where(.a2ui-log-type--received) { --n-surface-ink: var(--n-pg-accent); }
503
+ :where(native-a2ui) :where(.a2ui-log-type--action) { --n-surface-ink: var(--n-pg-run); }
504
+ :where(native-a2ui) :where(.a2ui-log-type--error) { --n-surface-ink: var(--n-pg-error); }
505
+ :where(native-a2ui) :where(.a2ui-log-type--warning) { --n-surface-ink: var(--n-pg-warn); }
506
+ :where(native-a2ui) :where(.a2ui-log-type--info) { --n-surface-ink: var(--n-pg-text-muted); }
507
+
508
+ /* ── Tree View ── */
509
+
510
+ :where(native-a2ui) :where(.a2ui-tree-node) {
511
+ padding-left: 1rem;
512
+ }
513
+
514
+ :where(native-a2ui) :where(.a2ui-tree-label) {
515
+ cursor: default;
516
+ }
517
+
518
+ :where(native-a2ui) :where(.a2ui-tree-id) {
519
+ color: var(--n-pg-accent);
520
+ }
521
+
522
+ :where(native-a2ui) :where(.a2ui-tree-type) {
523
+ color: var(--n-pg-text-muted);
524
+ margin-left: 0.375rem;
525
+ }
526
+
527
+ :where(native-a2ui) :where(.a2ui-tree-tag) {
528
+ color: var(--n-pg-run);
529
+ margin-left: 0.375rem;
530
+ }
531
+
532
+ /* ── Cursor Highlight (sent/pending lines in editor) ── */
533
+
534
+ :where(native-a2ui) :where(.cm-a2ui-sent) {
535
+ opacity: 0.5;
536
+ }
537
+
538
+ :where(native-a2ui) :where(.cm-a2ui-next) {
539
+ background: var(--n-surface-accent, rgba(97, 175, 239, 0.1));
540
+ }
541
+
542
+ } /* @layer ui */
543
+ /* ════════════════════════════════════════════════════
544
+ native-chat — Chat component styles
545
+ ════════════════════════════════════════════════════
546
+
547
+ CSS Override Policy
548
+ ───────────────────
549
+ chat.css specializes core native-ui components for chat contexts.
550
+ All overrides use zero-specificity :where() selectors or properly
551
+ scoped attribute selectors per the CSS Single-Owner Principle.
552
+
553
+ 1. n-textarea (inside n-chat-input):
554
+ Transparent background/borders — composer field should not
555
+ show control chrome. Overrides textarea.css via source order
556
+ (both :where(), chat loads later).
557
+
558
+ 2. Sub-containers (n-header, n-body, n-footer):
559
+ Context-specific backgrounds and borders via --n-chat-panel-*
560
+ tokens. Overrides panel.css border pattern via source order.
561
+
562
+ 3. Aside overflow:
563
+ overflow: visible instead of panel.css's overflow-y: auto.
564
+ Chat panel delegates scrolling to its n-body sub-container.
565
+
566
+ 4. n-button gap (model picker):
567
+ Tighter gap via [justify="spread"] attribute selector (0,1,0)
568
+ beating button.css zero-specificity base rule.
569
+
570
+ ════════════════════════════════════════════════════ */
571
+
572
+ @layer ui {
573
+
574
+ /* ── :not(:defined) visibility guards ── */
575
+
576
+ :where(n-chat-input):not(:defined),
577
+ :where(n-chat-feed):not(:defined),
578
+ :where(n-chat-avatar):not(:defined),
579
+ :where(n-chat-message):not(:defined),
580
+ :where(n-chat-messages):not(:defined),
581
+ :where(n-chat-message-text):not(:defined),
582
+ :where(n-chat-message-activity):not(:defined),
583
+ :where(n-chat-message-seed):not(:defined),
584
+ :where(n-chat-message-genui):not(:defined),
585
+ :where(n-chat-input-structured):not(:defined) { visibility: hidden; }
586
+
587
+ /* ══════════════════════════════════════════════════
588
+ Chat Token Definitions
589
+ ══════════════════════════════════════════════════ */
590
+
591
+ :where(n-chat-feed),
592
+ :where(native-chat-panel) {
593
+ /* Feed */
594
+ --n-chat-gap: calc(var(--n-space) * 4);
595
+ --n-chat-message-gap: calc(var(--n-space) * 2);
596
+
597
+ /* Bubbles */
598
+ --n-chat-bubble-user: var(--n-surface-accent);
599
+ --n-chat-bubble-user-color: var(--n-surface-ink-accent);
600
+ --n-chat-bubble-user-border: transparent;
601
+ --n-chat-bubble-assistant: transparent;
602
+ --n-chat-bubble-assistant-color: var(--n-ink);
603
+ --n-chat-bubble-assistant-border: var(--n-border-muted);
604
+ --n-chat-bubble-radius: var(--n-radius);
605
+ --n-chat-bubble-radius-avatar-side: var(--n-chat-bubble-radius);
606
+ --n-chat-bubble-radius-far-side: var(--n-chat-bubble-radius);
607
+ --n-chat-bubble-padding-block: calc(var(--n-space) * 2);
608
+ --n-chat-bubble-padding-inline: calc(var(--n-space) * 3);
609
+ --n-chat-bubble-max-width: 85%;
610
+
611
+ /* Avatar */
612
+ --n-chat-avatar-size: var(--n-size);
613
+ --n-chat-avatar-background: var(--n-control);
614
+ --n-chat-avatar-color: var(--n-ink-muted);
615
+
616
+ /* Activity */
617
+ --n-chat-activity-color: var(--n-ink-muted);
618
+
619
+ /* Seed */
620
+ --n-chat-seed-gap: var(--n-space);
621
+ --n-chat-seed-padding-block: var(--n-space);
622
+ --n-chat-seed-padding-inline: var(--n-chat-bubble-padding-inline);
623
+
624
+ /* Structured input */
625
+ --n-chat-structured-gap: calc(var(--n-space) * 2);
626
+ --n-chat-structured-padding: calc(var(--n-space) * 3);
627
+
628
+ /* Prose */
629
+ --n-chat-prose-gap: calc(var(--n-space) * 2);
630
+
631
+ /* Component-local tokens (magic number extraction) */
632
+ --n-chat-model-picker-max-width: 12rem;
633
+ --n-chat-activity-max-height: 20rem;
634
+ --n-chat-streaming-opacity: 0.85;
635
+ --n-chat-dot-pulse-duration: 1.2s;
636
+ }
637
+
638
+ /* ╭──────────────────────────────────────────────────────────╮
639
+ │ n-chat │
640
+ │ Chat controller. display:contents — no visual │
641
+ │ presence. The inner n-panel provides structure. │
642
+ │ n-chat wires gateway / gen-UI framework behavior. │
643
+ ╰──────────────────────────────────────────────────────────╯ */
644
+
645
+ :where(n-chat) {
646
+ display: contents;
647
+ }
648
+
649
+ /* ══════════════════════════════════════════════════
650
+ native-chat-panel
651
+ ══════════════════════════════════════════════════ */
652
+
653
+ :where(native-chat-panel) {
654
+ --n-ground: var(--n-panel);
655
+
656
+ /* Section surface token hooks — override on native-chat-panel to theme sections */
657
+ --n-chat-panel-header-background: transparent;
658
+ --n-chat-panel-header-border: var(--n-border-muted);
659
+ --n-chat-panel-header-label-font-weight: inherit;
660
+ --n-chat-panel-header-label-letter-spacing: inherit;
661
+ --n-chat-panel-body-background: transparent;
662
+ --n-chat-panel-footer-background: transparent;
663
+ --n-chat-panel-footer-border: var(--n-border-muted);
664
+
665
+ container-type: inline-size;
666
+ display: flex;
667
+ flex: 1 1 0%;
668
+ min-width: 0;
669
+ flex-direction: column;
670
+ background: var(--n-ground);
671
+ border-radius: var(--n-radius);
672
+ overflow: hidden;
673
+
674
+ font-size: var(--n-font-size);
675
+ line-height: var(--n-line-height);
676
+ }
677
+
678
+ /* ── Aside mode (collapsible side panel) ──
679
+ Base [aside] rule (panel.css) handles: display, width, min-width,
680
+ max-width, overflow, padding, transition + @starting-style.
681
+ Only override what chat-panel needs differently. */
682
+
683
+ :where(native-chat-panel)[aside][open] {
684
+ overflow: visible;
685
+ }
686
+
687
+ /* ── Sub-container integration ── */
688
+
689
+ :where(native-chat-panel) > :where(n-header) {
690
+ background: var(--n-chat-panel-header-background);
691
+ border-block-end: 1px solid var(--n-chat-panel-header-border);
692
+ }
693
+
694
+ :where(native-chat-panel) > :where(n-header) :where([slot="label"]) {
695
+ font-weight: var(--n-chat-panel-header-label-font-weight);
696
+ letter-spacing: var(--n-chat-panel-header-label-letter-spacing);
697
+ }
698
+
699
+ :where(native-chat-panel) :where(.n-chat-panel-header-trailing) {
700
+ display: inline-flex;
701
+ align-items: center;
702
+ gap: calc(var(--n-space) * 2);
703
+ }
704
+
705
+ :where(native-chat-panel) > :where(n-body) {
706
+ background: var(--n-chat-panel-body-background);
707
+ }
708
+
709
+ :where(native-chat-panel) > :where(n-footer) {
710
+ background: var(--n-chat-panel-footer-background);
711
+ border-block-start: 1px solid var(--n-chat-panel-footer-border);
712
+ }
713
+
714
+ /* ── Model picker ── */
715
+
716
+ :where(native-chat-panel) :where(n-select[data-role="model-picker"]) {
717
+ max-width: var(--n-chat-model-picker-max-width);
718
+ }
719
+
720
+ :where(native-chat-panel) :where(n-select[data-role="model-picker"]) :where(n-button[justify="spread"]) {
721
+ gap: calc(var(--n-space) * 0.5);
722
+ }
723
+
724
+ :where(native-chat-panel) :where(n-select[data-role="model-picker"]) :where([slot="label"]) {
725
+ overflow: hidden;
726
+ text-overflow: ellipsis;
727
+ white-space: nowrap;
728
+ }
729
+
730
+
731
+ /* ── n-chat-content ── */
732
+
733
+ :where(n-chat-content) {
734
+ display: flex;
735
+ flex: 1 1 0%;
736
+ min-width: 0;
737
+ min-height: 0;
738
+ flex-direction: column;
739
+ gap: calc(var(--n-space) * 2);
740
+ }
741
+
742
+ /* ══════════════════════════════════════════════════
743
+ n-chat-feed — scrollable thread coordinator
744
+ ══════════════════════════════════════════════════ */
745
+
746
+ :where(n-chat-feed) {
747
+ display: flex;
748
+ flex-direction: column;
749
+ gap: var(--n-chat-gap);
750
+ flex: 1 1 0%;
751
+ min-height: 0;
752
+ min-width: 0;
753
+ padding-block: calc(var(--n-space) * 4);
754
+ }
755
+
756
+ /* WHY: Opt-in scroll container — prevents layout conflicts when scroll
757
+ ownership belongs to a parent container. */
758
+ [scrollable]:where(n-chat-feed) {
759
+ overflow-y: auto;
760
+ scrollbar-width: thin;
761
+ scroll-behavior: smooth;
762
+ }
763
+
764
+ /* ── Date separator ── */
765
+
766
+ :where(n-chat-feed) > :where(.n-chat-date-separator) {
767
+ display: flex;
768
+ align-items: center;
769
+ justify-content: center;
770
+ padding-block: var(--n-space);
771
+ font-size: var(--n-font-size-sm);
772
+ color: var(--n-ink-muted);
773
+ user-select: none;
774
+ }
775
+
776
+ /* ── Virtual scroll spacers ── */
777
+
778
+ :where(n-chat-feed) > :where(.n-chat-feed-virtual-container) {
779
+ display: flex;
780
+ flex-direction: column;
781
+ gap: var(--n-chat-gap);
782
+ }
783
+
784
+ :where(n-chat-feed) :where(.n-virtual-spacer-top),
785
+ :where(n-chat-feed) :where(.n-virtual-spacer-bottom) {
786
+ flex-shrink: 0;
787
+ }
788
+
789
+ :where(n-chat-feed[hidden]) { display: none; }
790
+
791
+ /* ══════════════════════════════════════════════════
792
+ n-chat-messages — message group (bubble cluster)
793
+ ══════════════════════════════════════════════════ */
794
+
795
+ /* 2×2 grid: avatar | context + bubbles.
796
+ Col 1: avatar (spans both rows, bottom-aligned)
797
+ Col 2 row 1: .n-chat-context — metadata, reasoning, timestamps
798
+ Col 2 row 2: .n-chat-bubbles — message bubbles (flex column) */
799
+ :where(n-chat-messages) {
800
+ display: grid;
801
+ grid-template-columns: auto 1fr;
802
+ grid-template-rows: auto 1fr;
803
+ column-gap: var(--n-chat-message-gap);
804
+ align-self: flex-start;
805
+ max-width: var(--n-chat-bubble-max-width);
806
+ min-width: 0;
807
+ }
808
+
809
+ /* Avatar: col 1, spans both rows, bottom-align */
810
+ :where(n-chat-messages) > :where(n-chat-avatar) {
811
+ grid-column: 1;
812
+ grid-row: 1 / -1;
813
+ align-self: end;
814
+ }
815
+
816
+ /* Assistant avatar: use default avatar tokens (bubble is transparent) */
817
+
818
+ /* Context area: col 2, row 1 — metadata above messages */
819
+ :where(n-chat-messages) > :where(.n-chat-context) {
820
+ grid-column: 2;
821
+ grid-row: 1;
822
+ display: flex;
823
+ flex-direction: column;
824
+ gap: var(--n-space);
825
+ min-width: 0;
826
+ }
827
+
828
+ /* Empty context collapses */
829
+ :where(n-chat-messages) > :where(.n-chat-context:empty) {
830
+ display: none;
831
+ }
832
+
833
+ /* Bubbles area: col 2, row 2 — flex column of messages */
834
+ :where(n-chat-messages) > :where(.n-chat-bubbles) {
835
+ grid-column: 2;
836
+ grid-row: 2;
837
+ display: flex;
838
+ flex-direction: column;
839
+ gap: var(--n-space);
840
+ min-width: 0;
841
+ }
842
+
843
+ /* Messages shrink-wrap to content width */
844
+ :where(.n-chat-bubbles) > :where(n-chat-message) {
845
+ width: fit-content;
846
+ max-width: 100%;
847
+ }
848
+
849
+ /* Avatar alignment overrides */
850
+ [avatar-align="top"]:where(n-chat-messages) > :where(n-chat-avatar) {
851
+ align-self: start;
852
+ }
853
+
854
+ [avatar-align="center"]:where(n-chat-messages) > :where(n-chat-avatar) {
855
+ align-self: center;
856
+ }
857
+
858
+ /* User messages: right-aligned, avatar on right */
859
+ [data-role="user"]:where(n-chat-messages) {
860
+ grid-template-columns: 1fr auto;
861
+ align-self: flex-end;
862
+ }
863
+
864
+ [data-role="user"]:where(n-chat-messages) > :where(n-chat-avatar) {
865
+ grid-column: 2;
866
+ background: var(--n-chat-bubble-user);
867
+ color: var(--n-chat-bubble-user-color);
868
+ }
869
+
870
+ [data-role="user"]:where(n-chat-messages) > :where(.n-chat-context),
871
+ [data-role="user"]:where(n-chat-messages) > :where(.n-chat-bubbles) {
872
+ grid-column: 1;
873
+ }
874
+
875
+ /* User bubbles align to the right edge */
876
+ [data-role="user"]:where(n-chat-messages) :where(.n-chat-bubbles) > :where(n-chat-message) {
877
+ align-self: flex-end;
878
+ }
879
+
880
+ :where(n-chat-messages[hidden]) { display: none; }
881
+
882
+ /* ══════════════════════════════════════════════════
883
+ n-chat-avatar — sender avatar
884
+ ══════════════════════════════════════════════════ */
885
+
886
+ :where(n-chat-avatar) {
887
+ display: inline-flex;
888
+ align-items: center;
889
+ justify-content: center;
890
+ flex-shrink: 0;
891
+
892
+ width: var(--n-chat-avatar-size);
893
+ height: var(--n-chat-avatar-size);
894
+ border-radius: 50%;
895
+ background: var(--n-chat-avatar-background);
896
+ color: var(--n-chat-avatar-color);
897
+
898
+ font-size: calc(var(--n-chat-avatar-size) * 0.4);
899
+ font-weight: var(--n-button-font-weight);
900
+ line-height: 1;
901
+ overflow: hidden;
902
+ user-select: none;
903
+ }
904
+
905
+ :where(n-chat-avatar) > :where(img) {
906
+ width: 100%;
907
+ height: 100%;
908
+ object-fit: cover;
909
+ border-radius: inherit;
910
+ }
911
+
912
+ :where(n-chat-avatar) > :where(n-icon) {
913
+ font-size: calc(var(--n-chat-avatar-size) * 0.5);
914
+ }
915
+
916
+ :where(n-chat-avatar[hidden]) { display: none; }
917
+
918
+ /* ══════════════════════════════════════════════════
919
+ n-chat-message — individual message bubble
920
+ ══════════════════════════════════════════════════ */
921
+
922
+ :where(n-chat-message) {
923
+ display: flex;
924
+ flex-direction: column;
925
+ gap: var(--n-space);
926
+ min-width: 0;
927
+ overflow: hidden;
928
+
929
+ /* Asymmetric radius: assistant = avatar on left */
930
+ border-radius:
931
+ var(--n-chat-bubble-radius-avatar-side)
932
+ var(--n-chat-bubble-radius-far-side)
933
+ var(--n-chat-bubble-radius-far-side)
934
+ var(--n-chat-bubble-radius-avatar-side);
935
+
936
+ background: var(--n-chat-bubble-assistant);
937
+ color: var(--n-chat-bubble-assistant-color);
938
+ border: 1px solid var(--n-chat-bubble-assistant-border);
939
+
940
+ word-wrap: break-word;
941
+ overflow-wrap: break-word;
942
+ }
943
+
944
+ /* User bubble: avatar on right — flip avatar-side / far-side corners */
945
+ [data-role="user"]:where(n-chat-message) {
946
+ border-radius:
947
+ var(--n-chat-bubble-radius-far-side)
948
+ var(--n-chat-bubble-radius-avatar-side)
949
+ var(--n-chat-bubble-radius-avatar-side)
950
+ var(--n-chat-bubble-radius-far-side);
951
+
952
+ background: var(--n-chat-bubble-user);
953
+ color: var(--n-chat-bubble-user-color);
954
+ border-color: var(--n-chat-bubble-user-border);
955
+ }
956
+
957
+ /* Streaming status */
958
+ [status="streaming"]:where(n-chat-message) {
959
+ opacity: var(--n-chat-streaming-opacity);
960
+ }
961
+
962
+ /* Error status */
963
+ [status="error"]:where(n-chat-message) {
964
+ border: 1px solid var(--n-border-danger);
965
+ }
966
+
967
+ /* Partial status — stream ended without explicit completion */
968
+ [status="partial"]:where(n-chat-message) {
969
+ border-block-end: 2px dashed var(--n-border-muted);
970
+ }
971
+
972
+ /* Typing status — waiting for first stream chunk */
973
+ [status="typing"]:where(n-chat-message) :where(n-chat-message-text) :where(.n-chat-prose):empty::before {
974
+ content: '\25CF\25CF\25CF';
975
+ letter-spacing: 0.25em;
976
+ color: var(--n-ink-muted);
977
+ animation: n-chat-typing-dots var(--n-chat-dot-pulse-duration, 1.4s) ease-in-out infinite;
978
+ }
979
+
980
+ @keyframes n-chat-typing-dots {
981
+ 0%, 100% { opacity: 0.3; }
982
+ 50% { opacity: 1; }
983
+ }
984
+
985
+ /* ── Message actions toolbar ── */
986
+
987
+ :where(n-chat-message) > :where(n-toolbar[data-role="actions"]) {
988
+ opacity: 0;
989
+ transition: opacity var(--n-duration) var(--n-easing);
990
+ padding-inline: var(--n-chat-bubble-padding-inline);
991
+ }
992
+
993
+ :where(n-chat-message):hover > :where(n-toolbar[data-role="actions"]),
994
+ :where(n-chat-message):focus-within > :where(n-toolbar[data-role="actions"]),
995
+ :where(n-chat-message[force-hover]) > :where(n-toolbar[data-role="actions"]) {
996
+ opacity: 1;
997
+ }
998
+
999
+ /* Partial status — always show actions (contains continue button) */
1000
+ [status="partial"]:where(n-chat-message) > :where(n-toolbar[data-role="actions"]) {
1001
+ opacity: 1;
1002
+ }
1003
+
1004
+ /* ── Below-bubble popover toolbar ── */
1005
+
1006
+ /* Popover toolbar: anchored below the message via CSS anchor positioning.
1007
+ Toolbar is a child of n-chat-message with popover="manual", rendered in the
1008
+ top layer. JS shows/hides via pointerenter/pointerleave + showPopover().
1009
+ Entry/exit transition mirrors n-listbox[popover] (perspective + scale). */
1010
+ :where(n-chat-message) > :where(n-toolbar[data-role="actions"][popover]) {
1011
+ position: fixed;
1012
+ inset: auto;
1013
+ top: anchor(bottom);
1014
+ left: anchor(center);
1015
+ translate: -50% 0;
1016
+ margin: 2px 0 0;
1017
+ width: max-content;
1018
+
1019
+ transform-origin: top center;
1020
+ opacity: 0;
1021
+ transform: perspective(800px) scale(0.96) rotateX(-20deg);
1022
+
1023
+ transition:
1024
+ opacity var(--n-duration) var(--n-easing),
1025
+ transform var(--n-duration) var(--n-easing),
1026
+ display var(--n-duration) var(--n-easing) allow-discrete,
1027
+ overlay var(--n-duration) var(--n-easing) allow-discrete;
1028
+ }
1029
+
1030
+ :where(n-chat-message) > :where(n-toolbar[data-role="actions"][popover]):popover-open {
1031
+ opacity: 1;
1032
+ transform: none;
1033
+ }
1034
+
1035
+ @starting-style {
1036
+ :where(n-chat-message) > :where(n-toolbar[data-role="actions"][popover]):popover-open {
1037
+ opacity: 0;
1038
+ transform: perspective(800px) scale(0.96) rotateX(-20deg);
1039
+ }
1040
+ }
1041
+
1042
+ /* Override n-toolbar display to respect popover hidden state */
1043
+ :where(n-toolbar[data-role="actions"][popover]):not(:popover-open) {
1044
+ display: none;
1045
+ }
1046
+
1047
+ :where(n-chat-message[hidden]) { display: none; }
1048
+
1049
+ /* ══════════════════════════════════════════════════
1050
+ n-chat-message-text — rich text / markdown
1051
+ ══════════════════════════════════════════════════ */
1052
+
1053
+ :where(n-chat-message-text) {
1054
+ display: block;
1055
+ padding-block: var(--n-chat-bubble-padding-block);
1056
+ padding-inline: var(--n-chat-bubble-padding-inline);
1057
+ }
1058
+
1059
+ /* ── Prose reset — typography inside rendered markdown ── */
1060
+
1061
+ :where(n-chat-message-text) :where(.n-chat-prose) {
1062
+ display: flex;
1063
+ flex-direction: column;
1064
+ gap: var(--n-chat-prose-gap);
1065
+ min-width: 0;
1066
+ }
1067
+
1068
+ /* Universal block margin reset — flexbox gap handles spacing,
1069
+ so all block-level children must have zero margin */
1070
+ :where(n-chat-message-text) :where(
1071
+ p, h1, h2, h3, h4, h5, h6,
1072
+ ul, ol, li,
1073
+ blockquote, pre, hr,
1074
+ div, figure, figcaption,
1075
+ dl, dt, dd, details, summary
1076
+ ) {
1077
+ margin: 0;
1078
+ }
1079
+
1080
+ :where(n-chat-message-text) :where(h1, h2, h3, h4, h5, h6) {
1081
+ font-weight: var(--n-button-font-weight);
1082
+ line-height: 1.3;
1083
+ }
1084
+
1085
+ :where(n-chat-message-text) :where(h1) { font-size: 1.4em; }
1086
+ :where(n-chat-message-text) :where(h2) { font-size: 1.25em; }
1087
+ :where(n-chat-message-text) :where(h3) { font-size: 1.1em; }
1088
+
1089
+ :where(n-chat-message-text) :where(ul, ol) {
1090
+ padding-inline-start: 1.5em;
1091
+ }
1092
+
1093
+ :where(n-chat-message-text) :where(li) {
1094
+ margin-block: calc(var(--n-space) * 0.5);
1095
+ }
1096
+
1097
+ :where(n-chat-message-text) :where(blockquote) {
1098
+ padding-inline-start: calc(var(--n-space) * 3);
1099
+ border-inline-start: 3px solid var(--n-border-muted);
1100
+ color: var(--n-ink-muted);
1101
+ }
1102
+
1103
+ :where(n-chat-message-text) :where(code) {
1104
+ font-family: var(--n-font-mono);
1105
+ font-size: 0.9em;
1106
+ padding-block: 0.1em;
1107
+ padding-inline: 0.3em;
1108
+ background: var(--n-control);
1109
+ border-radius: calc(var(--n-radius) * 0.5);
1110
+ }
1111
+
1112
+ :where(n-chat-message-text) :where(pre) {
1113
+ padding-block: calc(var(--n-space) * 2);
1114
+ padding-inline: calc(var(--n-space) * 2);
1115
+ background: var(--n-control);
1116
+ border-radius: calc(var(--n-radius) * 0.5);
1117
+ overflow-x: auto;
1118
+ scrollbar-width: thin;
1119
+ }
1120
+
1121
+ :where(n-chat-message-text) :where(pre) :where(code) {
1122
+ padding-block: 0;
1123
+ padding-inline: 0;
1124
+ background: transparent;
1125
+ border-radius: 0;
1126
+ }
1127
+
1128
+ :where(n-chat-message-text) :where(a) {
1129
+ color: var(--n-ink-accent);
1130
+ text-decoration: underline;
1131
+ text-underline-offset: 0.15em;
1132
+ }
1133
+
1134
+ :where(n-chat-message-text) :where(a):hover {
1135
+ color: var(--n-ink-hover);
1136
+ }
1137
+
1138
+ :where(n-chat-message-text) :where(hr) {
1139
+ border: none;
1140
+ border-block-start: 1px solid var(--n-border-muted);
1141
+ }
1142
+
1143
+ :where(n-chat-message-text[hidden]) { display: none; }
1144
+
1145
+ /* ══════════════════════════════════════════════════
1146
+ n-chat-message-activity — typing / thinking
1147
+ ══════════════════════════════════════════════════ */
1148
+
1149
+ :where(n-chat-message-activity) {
1150
+ display: flex;
1151
+ flex-direction: column;
1152
+ gap: var(--n-space);
1153
+ min-width: 0;
1154
+ color: var(--n-chat-activity-color);
1155
+ font-size: var(--n-font-size-sm);
1156
+ padding-block: var(--n-space);
1157
+ padding-inline: var(--n-chat-bubble-padding-inline);
1158
+ align-self: flex-start;
1159
+ }
1160
+
1161
+ :where(n-chat-message-activity) > :where(.n-chat-activity-row) {
1162
+ display: inline-flex;
1163
+ align-items: center;
1164
+ gap: calc(var(--n-space) * 1.5);
1165
+ }
1166
+
1167
+ :where(n-chat-message-activity) :where(.n-chat-activity-time) {
1168
+ font-variant-numeric: tabular-nums;
1169
+ min-width: 2.5em;
1170
+ }
1171
+
1172
+ :where(n-chat-message-activity) :where(.n-chat-activity-sep) {
1173
+ opacity: 0.4;
1174
+ }
1175
+
1176
+ /* Animated dots */
1177
+ :where(n-chat-message-activity) :where(.n-chat-activity-dots) {
1178
+ display: inline-flex;
1179
+ gap: 0.2em;
1180
+ margin-inline-start: 0.25em;
1181
+ }
1182
+
1183
+ :where(n-chat-message-activity) :where(.n-chat-activity-dots) > :where(i) {
1184
+ display: block;
1185
+ width: 0.25em;
1186
+ height: 0.25em;
1187
+ border-radius: 50%;
1188
+ background: currentColor;
1189
+ animation: n-chat-dot-pulse var(--n-chat-dot-pulse-duration) ease-in-out infinite;
1190
+ }
1191
+
1192
+ :where(n-chat-message-activity) :where(.n-chat-activity-dots) > :where(i:nth-child(2)) {
1193
+ animation-delay: 0.2s;
1194
+ }
1195
+
1196
+ :where(n-chat-message-activity) :where(.n-chat-activity-dots) > :where(i:nth-child(3)) {
1197
+ animation-delay: 0.4s;
1198
+ }
1199
+
1200
+ @keyframes n-chat-dot-pulse {
1201
+ 0%, 60%, 100% { opacity: 0.3; transform: scale(0.8); }
1202
+ 30% { opacity: 1; transform: scale(1); }
1203
+ }
1204
+
1205
+ /* Expandable state */
1206
+ :where(n-chat-message-activity) > :where(.n-chat-activity-row) {
1207
+ cursor: default;
1208
+ }
1209
+
1210
+ [expandable]:where(n-chat-message-activity) > :where(.n-chat-activity-row) {
1211
+ cursor: pointer;
1212
+ }
1213
+
1214
+ [expandable]:where(n-chat-message-activity) > :where(.n-chat-activity-row)::before {
1215
+ content: '▶';
1216
+ font-size: 0.65em;
1217
+ transition: transform var(--n-duration) var(--n-easing);
1218
+ }
1219
+
1220
+ [expanded][expandable]:where(n-chat-message-activity) > :where(.n-chat-activity-row)::before {
1221
+ transform: rotate(90deg);
1222
+ }
1223
+
1224
+ :where(n-chat-message-activity) > :where(.n-chat-activity-content) {
1225
+ padding-inline-start: calc(var(--n-space) * 3);
1226
+ font-family: var(--n-font-mono);
1227
+ font-size: var(--n-font-size-sm);
1228
+ max-height: var(--n-chat-activity-max-height);
1229
+ overflow-y: auto;
1230
+ scrollbar-width: thin;
1231
+ }
1232
+
1233
+ :where(n-chat-message-activity[hidden]) { display: none; }
1234
+
1235
+ @media (prefers-reduced-motion: reduce) {
1236
+ :where(n-chat-message-activity) :where(.n-chat-activity-dots) > :where(i) {
1237
+ animation: none;
1238
+ }
1239
+ }
1240
+
1241
+ /* ══════════════════════════════════════════════════
1242
+ n-chat-message-seed — suggestion chips
1243
+ ══════════════════════════════════════════════════ */
1244
+
1245
+ :where(n-chat-message-seed) {
1246
+ display: block;
1247
+ padding-block: var(--n-chat-seed-padding-block);
1248
+ padding-inline: var(--n-chat-seed-padding-inline);
1249
+ align-self: flex-start;
1250
+ }
1251
+
1252
+ :where(n-chat-message-seed) > :where(n-stack) {
1253
+ gap: var(--n-chat-seed-gap);
1254
+ }
1255
+
1256
+ :where(n-chat-message-seed)[aria-disabled="true"] {
1257
+ pointer-events: none;
1258
+ color: var(--n-color-disabled);
1259
+ cursor: not-allowed;
1260
+ }
1261
+
1262
+ :where(n-chat-message-seed[hidden]) { display: none; }
1263
+
1264
+ /* ══════════════════════════════════════════════════
1265
+ n-chat-message-genui — schema-rendered UI
1266
+ ══════════════════════════════════════════════════ */
1267
+
1268
+ :where(n-chat-message-genui) {
1269
+ display: block;
1270
+ min-width: 0;
1271
+ }
1272
+
1273
+ :where(n-chat-message-genui) > :where(.n-chat-genui-container) {
1274
+ display: flex;
1275
+ flex-direction: column;
1276
+ gap: var(--n-space);
1277
+ min-width: 0;
1278
+ }
1279
+
1280
+ :where(n-chat-message-genui) :where(.n-chat-genui-error) {
1281
+ padding-block: var(--n-space);
1282
+ padding-inline: var(--n-space);
1283
+ color: var(--n-ink-danger);
1284
+ font-size: var(--n-font-size-sm);
1285
+ }
1286
+
1287
+ :where(n-chat-message-genui) :where(n-container[data-role="preview"]) {
1288
+ display: flex;
1289
+ align-items: center;
1290
+ justify-content: space-between;
1291
+ gap: calc(var(--n-space) * 2);
1292
+ }
1293
+
1294
+ :where(n-chat-message-genui[hidden]) { display: none; }
1295
+
1296
+ /* ══════════════════════════════════════════════════
1297
+ n-chat-input-structured — multi-choice input
1298
+ ══════════════════════════════════════════════════ */
1299
+
1300
+ :where(n-chat-input-structured) {
1301
+ display: flex;
1302
+ flex-direction: column;
1303
+ gap: var(--n-chat-structured-gap);
1304
+ min-width: 0;
1305
+ padding-block: var(--n-chat-structured-padding);
1306
+ padding-inline: var(--n-chat-structured-padding);
1307
+ --n-background: var(--n-card);
1308
+ background: var(--n-background);
1309
+ border-radius: var(--n-chat-bubble-radius);
1310
+ align-self: stretch;
1311
+ }
1312
+
1313
+ :where(n-chat-input-structured) > :where(.n-chat-structured-question) {
1314
+ font-weight: var(--n-button-font-weight);
1315
+ }
1316
+
1317
+ :where(n-chat-input-structured) > :where(n-stack) {
1318
+ flex: 0 0 auto;
1319
+ gap: var(--n-chat-seed-gap);
1320
+ }
1321
+
1322
+ :where(n-chat-input-structured) > :where(.n-chat-structured-actions) {
1323
+ display: flex;
1324
+ align-items: center;
1325
+ justify-content: flex-end;
1326
+ gap: var(--n-space);
1327
+ }
1328
+
1329
+ :where(n-chat-input-structured)[aria-disabled="true"] {
1330
+ pointer-events: none;
1331
+ color: var(--n-color-disabled);
1332
+ cursor: not-allowed;
1333
+ }
1334
+
1335
+ :where(n-chat-input-structured[hidden]) { display: none; }
1336
+
1337
+ /* ══════════════════════════════════════════════════
1338
+ n-chat-input — composer
1339
+ ══════════════════════════════════════════════════ */
1340
+
1341
+ :where(n-chat-input) {
1342
+ display: flex;
1343
+ flex: 1 1 0%;
1344
+ flex-direction: column;
1345
+ min-width: 0;
1346
+ min-height: var(--n-size);
1347
+ }
1348
+
1349
+ /* Compact: single row */
1350
+ [compact]:where(n-chat-input) {
1351
+ flex-direction: row;
1352
+ align-items: center;
1353
+ }
1354
+
1355
+ /* Textarea fills available space in both column and compact row */
1356
+ :where(n-chat-input) > :where(n-textarea) {
1357
+ flex: 1 1 auto;
1358
+ min-height: 4.5em;
1359
+ }
1360
+
1361
+ /* Textarea inside input — fully transparent, no padding */
1362
+ :where(n-chat-input) > :where(n-textarea) {
1363
+ --n-background: transparent;
1364
+ --n-background-hover: transparent;
1365
+ --n-background-active: transparent;
1366
+ --n-border-color: transparent;
1367
+ --n-border-color-hover: transparent;
1368
+ --n-border-color-active: transparent;
1369
+
1370
+ padding-block: 0;
1371
+ padding-inline: 0;
1372
+ border: none;
1373
+ border-radius: 0;
1374
+ resize: none;
1375
+ }
1376
+
1377
+ :where(n-chat-input) > :where(n-textarea):focus {
1378
+ border-color: transparent;
1379
+ outline: none;
1380
+ }
1381
+
1382
+ /* ── n-chat-input-attachments ── */
1383
+
1384
+ :where(n-chat-input-attachments) {
1385
+ display: flex;
1386
+ flex-wrap: wrap;
1387
+ flex-shrink: 0;
1388
+ gap: calc(var(--n-space) * 2);
1389
+ }
1390
+
1391
+ /* ── n-chat-input-actions ── */
1392
+
1393
+ :where(n-chat-input-actions) {
1394
+ display: flex;
1395
+ flex-shrink: 0;
1396
+ align-items: center;
1397
+ justify-content: flex-end;
1398
+ gap: calc(var(--n-space) * 2);
1399
+ min-width: 0;
1400
+ }
1401
+
1402
+
1403
+ /* ── n-chat-input-header ──
1404
+ Header bar above the textarea: model/agent indicators left,
1405
+ settings/activity right. Used in advanced multi-row layout. */
1406
+
1407
+ :where(n-chat-input-header) {
1408
+ display: grid;
1409
+ grid-template-columns: 1fr auto;
1410
+ align-items: center;
1411
+ gap: calc(var(--n-space) * 2);
1412
+ flex-shrink: 0;
1413
+ min-width: 0;
1414
+ }
1415
+
1416
+ :where(n-chat-input-header) > :where(nav) {
1417
+ display: flex;
1418
+ align-items: center;
1419
+ gap: calc(var(--n-space) * 2);
1420
+ min-width: 0;
1421
+ overflow: hidden;
1422
+ }
1423
+
1424
+ :where(n-chat-input-header) > :where(aside) {
1425
+ display: flex;
1426
+ align-items: center;
1427
+ gap: calc(var(--n-space) * 2);
1428
+ }
1429
+
1430
+ /* ── n-chat-input-chips ──
1431
+ Suggestion chips below the actions row. Wraps on overflow. */
1432
+
1433
+ :where(n-chat-input-chips) {
1434
+ display: flex;
1435
+ flex-wrap: wrap;
1436
+ align-items: center;
1437
+ flex-shrink: 0;
1438
+ gap: calc(var(--n-space) * 1.5);
1439
+ padding-block-end: calc(var(--n-space) * 1.5);
1440
+ min-width: 0;
1441
+ }
1442
+
1443
+ /* Chip buttons: outlined pill style, intrinsic width */
1444
+ :where(n-chat-input-chips) > :where(n-button) {
1445
+ flex: none;
1446
+ width: auto;
1447
+ border: 1px solid var(--n-border-rest);
1448
+ }
1449
+
1450
+ /* ══════════════════════════════════════════════════
1451
+ n-chat-input-advanced — multi-zone rich composer
1452
+ ══════════════════════════════════════════════════
1453
+
1454
+ 3 zones: header-bar (above), prompt-container (bordered), suggestion-chips (below).
1455
+ The prompt container holds textarea + improve button + toolbar.
1456
+
1457
+ HTML shape:
1458
+ <n-chat-input-advanced>
1459
+ <n-chat-input-header> … </n-chat-input-header>
1460
+ <n-chat-input-prompt>
1461
+ <n-textarea …></n-textarea>
1462
+ <n-button data-role="improve">✦</n-button>
1463
+ <n-toolbar variant="plain"> … </n-toolbar>
1464
+ </n-chat-input-prompt>
1465
+ <n-chat-input-chips> … </n-chat-input-chips>
1466
+ </n-chat-input-advanced>
1467
+ */
1468
+
1469
+ :where(n-chat-input-advanced):not(:defined) { visibility: hidden; }
1470
+
1471
+ :where(n-chat-input-advanced) {
1472
+ display: flex;
1473
+ flex: 1 1 0%;
1474
+ flex-direction: column;
1475
+ gap: calc(var(--n-space) * 2);
1476
+ min-width: 0;
1477
+ min-height: var(--n-size);
1478
+ }
1479
+
1480
+ /* ── Prompt container ──
1481
+ Bordered area containing textarea, improve button, and actions.
1482
+ Provides the nested rounded rect visible in the reference design. */
1483
+
1484
+ :where(n-chat-input-prompt) {
1485
+ position: relative;
1486
+ display: flex;
1487
+ flex-direction: column;
1488
+ flex: 1 1 auto;
1489
+ min-height: 0;
1490
+ border: 1px solid var(--n-border-rest);
1491
+ border-radius: var(--n-radius);
1492
+ transition: border-color var(--n-duration) var(--n-easing);
1493
+ }
1494
+
1495
+ /* Textarea inside prompt container — transparent, no chrome */
1496
+ :where(n-chat-input-prompt) > :where(n-textarea) {
1497
+ flex: 1 1 auto;
1498
+ min-height: 4.5em;
1499
+
1500
+ --n-background: transparent;
1501
+ --n-background-hover: transparent;
1502
+ --n-border-color: transparent;
1503
+ --n-border-color-hover: transparent;
1504
+
1505
+ padding-block: calc(var(--n-space) * 2);
1506
+ padding-inline: calc(var(--n-space) * 3);
1507
+ border: none;
1508
+ border-radius: 0;
1509
+ resize: none;
1510
+ }
1511
+
1512
+ :where(n-chat-input-prompt) > :where(n-textarea):focus {
1513
+ border-color: transparent;
1514
+ outline: none;
1515
+ }
1516
+
1517
+ /* Focus ring on prompt container when textarea is focused */
1518
+ :where(n-chat-input-prompt):has(:where(n-textarea):focus) {
1519
+ border-color: var(--n-focus-ring);
1520
+ }
1521
+
1522
+ /* Prompt-improvement button: pinned top-right inside the bordered area */
1523
+ :where(n-chat-input-prompt) > :where(n-button[data-role="improve"]) {
1524
+ position: absolute;
1525
+ inset-block-start: calc(var(--n-space) * 1.5);
1526
+ inset-inline-end: calc(var(--n-space) * 1.5);
1527
+ }
1528
+
1529
+ /* Toolbar inside prompt container — sits below textarea */
1530
+ :where(n-chat-input-prompt) > :where(n-toolbar) {
1531
+ padding-inline: calc(var(--n-space) * 2);
1532
+ padding-block-end: calc(var(--n-space) * 1.5);
1533
+ }
1534
+
1535
+ }
1536
+
1537
+ /* ════════════════════════════════════════════════════
1538
+ .n-chat-starter — Starter surface preset
1539
+ ════════════════════════════════════════════════════
1540
+
1541
+ Harmonizes seed + structured input spacing when composed
1542
+ together as a starter surface (e.g. inside n-container, n-body).
1543
+
1544
+ Add `compact` attribute for tighter spacing (small cards,
1545
+ inline starters, sidebars).
1546
+
1547
+ Usage:
1548
+ <n-container class="n-chat-starter">
1549
+ <n-body>
1550
+ <n-chat-message-seed></n-chat-message-seed>
1551
+ <n-chat-input-structured question="..."></n-chat-input-structured>
1552
+ </n-body>
1553
+ </n-container>
1554
+ */
1555
+
1556
+ .n-chat-starter {
1557
+ --n-chat-seed-padding-inline: 0;
1558
+ --n-chat-seed-padding-block: 0;
1559
+ --n-chat-structured-padding: calc(var(--n-space) * 2);
1560
+ --n-chat-structured-gap: var(--n-space);
1561
+ }
1562
+
1563
+ .n-chat-starter[compact] {
1564
+ --n-chat-seed-gap: calc(var(--n-space) * 0.5);
1565
+ --n-chat-structured-padding: var(--n-space);
1566
+ --n-chat-structured-gap: calc(var(--n-space) * 0.5);
1567
+ }