@nonoun/native-ai 1.0.19 → 1.0.21

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 (142) hide show
  1. package/dist/native-ai.js +1673 -225
  2. package/dist/register.js +813 -112
  3. package/package.json +1 -1
  4. package/dist/a2ui/a2ui-diagnostics.d.ts +0 -31
  5. package/dist/a2ui/a2ui-diagnostics.d.ts.map +0 -1
  6. package/dist/a2ui/a2ui-element.d.ts +0 -30
  7. package/dist/a2ui/a2ui-element.d.ts.map +0 -1
  8. package/dist/a2ui/a2ui-presets.d.ts +0 -22
  9. package/dist/a2ui/a2ui-presets.d.ts.map +0 -1
  10. package/dist/a2ui/adapters/a2a-adapter.d.ts +0 -38
  11. package/dist/a2ui/adapters/a2a-adapter.d.ts.map +0 -1
  12. package/dist/a2ui/adapters/adapter-types.d.ts +0 -19
  13. package/dist/a2ui/adapters/adapter-types.d.ts.map +0 -1
  14. package/dist/a2ui/adapters/ag-ui-adapter.d.ts +0 -42
  15. package/dist/a2ui/adapters/ag-ui-adapter.d.ts.map +0 -1
  16. package/dist/a2ui/adapters/direct-adapter.d.ts +0 -30
  17. package/dist/a2ui/adapters/direct-adapter.d.ts.map +0 -1
  18. package/dist/a2ui/adapters/index.d.ts +0 -8
  19. package/dist/a2ui/adapters/index.d.ts.map +0 -1
  20. package/dist/a2ui/index.d.ts +0 -15
  21. package/dist/a2ui/index.d.ts.map +0 -1
  22. package/dist/a2ui/install.d.ts +0 -23
  23. package/dist/a2ui/install.d.ts.map +0 -1
  24. package/dist/a2ui/protocol/a2ui-adapter.d.ts +0 -52
  25. package/dist/a2ui/protocol/a2ui-adapter.d.ts.map +0 -1
  26. package/dist/a2ui/protocol/a2ui-component-map.d.ts +0 -75
  27. package/dist/a2ui/protocol/a2ui-component-map.d.ts.map +0 -1
  28. package/dist/a2ui/protocol/a2ui-converter.d.ts +0 -37
  29. package/dist/a2ui/protocol/a2ui-converter.d.ts.map +0 -1
  30. package/dist/a2ui/protocol/a2ui-surface.d.ts +0 -34
  31. package/dist/a2ui/protocol/a2ui-surface.d.ts.map +0 -1
  32. package/dist/a2ui/protocol/a2ui-transport.d.ts +0 -80
  33. package/dist/a2ui/protocol/a2ui-transport.d.ts.map +0 -1
  34. package/dist/a2ui/protocol/a2ui-types.d.ts +0 -104
  35. package/dist/a2ui/protocol/a2ui-types.d.ts.map +0 -1
  36. package/dist/a2ui/protocol/index.d.ts +0 -13
  37. package/dist/a2ui/protocol/index.d.ts.map +0 -1
  38. package/dist/a2ui/protocol/kernel-bridge.d.ts +0 -114
  39. package/dist/a2ui/protocol/kernel-bridge.d.ts.map +0 -1
  40. package/dist/a2ui/register.d.ts +0 -12
  41. package/dist/a2ui/register.d.ts.map +0 -1
  42. package/dist/a2ui/session/agent-session.d.ts +0 -44
  43. package/dist/a2ui/session/agent-session.d.ts.map +0 -1
  44. package/dist/a2ui/session/catalog.d.ts +0 -41
  45. package/dist/a2ui/session/catalog.d.ts.map +0 -1
  46. package/dist/a2ui/session/event-emitter.d.ts +0 -17
  47. package/dist/a2ui/session/event-emitter.d.ts.map +0 -1
  48. package/dist/a2ui/session/index.d.ts +0 -9
  49. package/dist/a2ui/session/index.d.ts.map +0 -1
  50. package/dist/a2ui/session/session-manager.d.ts +0 -33
  51. package/dist/a2ui/session/session-manager.d.ts.map +0 -1
  52. package/dist/a2ui/session/surface-registry.d.ts +0 -32
  53. package/dist/a2ui/session/surface-registry.d.ts.map +0 -1
  54. package/dist/a2ui/session/types.d.ts +0 -27
  55. package/dist/a2ui/session/types.d.ts.map +0 -1
  56. package/dist/chat/avatar/chat-avatar-element.d.ts +0 -18
  57. package/dist/chat/avatar/chat-avatar-element.d.ts.map +0 -1
  58. package/dist/chat/avatar/index.d.ts +0 -2
  59. package/dist/chat/avatar/index.d.ts.map +0 -1
  60. package/dist/chat/avatar/n-chat-avatar.d.ts +0 -2
  61. package/dist/chat/avatar/n-chat-avatar.d.ts.map +0 -1
  62. package/dist/chat/chat-input-element.d.ts +0 -32
  63. package/dist/chat/chat-input-element.d.ts.map +0 -1
  64. package/dist/chat/chat-panel-element.d.ts +0 -100
  65. package/dist/chat/chat-panel-element.d.ts.map +0 -1
  66. package/dist/chat/feed/chat-feed-element.d.ts +0 -48
  67. package/dist/chat/feed/chat-feed-element.d.ts.map +0 -1
  68. package/dist/chat/feed/index.d.ts +0 -2
  69. package/dist/chat/feed/index.d.ts.map +0 -1
  70. package/dist/chat/feed/n-chat-feed.d.ts +0 -2
  71. package/dist/chat/feed/n-chat-feed.d.ts.map +0 -1
  72. package/dist/chat/gateway/adapter-chatgpt.d.ts +0 -67
  73. package/dist/chat/gateway/adapter-chatgpt.d.ts.map +0 -1
  74. package/dist/chat/gateway/adapter-claude.d.ts +0 -68
  75. package/dist/chat/gateway/adapter-claude.d.ts.map +0 -1
  76. package/dist/chat/gateway/adapter-mock.d.ts +0 -3
  77. package/dist/chat/gateway/adapter-mock.d.ts.map +0 -1
  78. package/dist/chat/gateway/adapter.d.ts +0 -71
  79. package/dist/chat/gateway/adapter.d.ts.map +0 -1
  80. package/dist/chat/gateway/controller.d.ts +0 -46
  81. package/dist/chat/gateway/controller.d.ts.map +0 -1
  82. package/dist/chat/gateway/index.d.ts +0 -9
  83. package/dist/chat/gateway/index.d.ts.map +0 -1
  84. package/dist/chat/gateway/runtime.d.ts +0 -53
  85. package/dist/chat/gateway/runtime.d.ts.map +0 -1
  86. package/dist/chat/gateway/types.d.ts +0 -73
  87. package/dist/chat/gateway/types.d.ts.map +0 -1
  88. package/dist/chat/gateway.d.ts +0 -2
  89. package/dist/chat/gateway.d.ts.map +0 -1
  90. package/dist/chat/index.d.ts +0 -17
  91. package/dist/chat/index.d.ts.map +0 -1
  92. package/dist/chat/message/chat-input-structured-element.d.ts +0 -43
  93. package/dist/chat/message/chat-input-structured-element.d.ts.map +0 -1
  94. package/dist/chat/message/chat-message-activity-element.d.ts +0 -32
  95. package/dist/chat/message/chat-message-activity-element.d.ts.map +0 -1
  96. package/dist/chat/message/chat-message-element.d.ts +0 -44
  97. package/dist/chat/message/chat-message-element.d.ts.map +0 -1
  98. package/dist/chat/message/chat-message-genui-element.d.ts +0 -45
  99. package/dist/chat/message/chat-message-genui-element.d.ts.map +0 -1
  100. package/dist/chat/message/chat-message-seed-element.d.ts +0 -33
  101. package/dist/chat/message/chat-message-seed-element.d.ts.map +0 -1
  102. package/dist/chat/message/chat-message-text-element.d.ts +0 -37
  103. package/dist/chat/message/chat-message-text-element.d.ts.map +0 -1
  104. package/dist/chat/message/chat-messages-element.d.ts +0 -39
  105. package/dist/chat/message/chat-messages-element.d.ts.map +0 -1
  106. package/dist/chat/message/index.d.ts +0 -8
  107. package/dist/chat/message/index.d.ts.map +0 -1
  108. package/dist/chat/message/n-chat-message.d.ts +0 -2
  109. package/dist/chat/message/n-chat-message.d.ts.map +0 -1
  110. package/dist/chat/register.d.ts +0 -13
  111. package/dist/chat/register.d.ts.map +0 -1
  112. package/dist/chat/stream/classify.d.ts +0 -19
  113. package/dist/chat/stream/classify.d.ts.map +0 -1
  114. package/dist/chat/stream/create-transport.d.ts +0 -19
  115. package/dist/chat/stream/create-transport.d.ts.map +0 -1
  116. package/dist/chat/stream/index.d.ts +0 -9
  117. package/dist/chat/stream/index.d.ts.map +0 -1
  118. package/dist/chat/stream/parse-json.d.ts +0 -9
  119. package/dist/chat/stream/parse-json.d.ts.map +0 -1
  120. package/dist/chat/stream/parse-ndjson.d.ts +0 -9
  121. package/dist/chat/stream/parse-ndjson.d.ts.map +0 -1
  122. package/dist/chat/stream/parse-sse.d.ts +0 -9
  123. package/dist/chat/stream/parse-sse.d.ts.map +0 -1
  124. package/dist/chat/stream/types.d.ts +0 -42
  125. package/dist/chat/stream/types.d.ts.map +0 -1
  126. package/dist/chat/telemetry/emitter.d.ts +0 -20
  127. package/dist/chat/telemetry/emitter.d.ts.map +0 -1
  128. package/dist/chat/telemetry/events.d.ts +0 -11
  129. package/dist/chat/telemetry/events.d.ts.map +0 -1
  130. package/dist/chat/telemetry/index.d.ts +0 -5
  131. package/dist/chat/telemetry/index.d.ts.map +0 -1
  132. package/dist/chat/telemetry/redactor.d.ts +0 -17
  133. package/dist/chat/telemetry/redactor.d.ts.map +0 -1
  134. package/dist/chat/telemetry/types.d.ts +0 -27
  135. package/dist/chat/telemetry/types.d.ts.map +0 -1
  136. package/dist/gateway.d.ts +0 -2
  137. package/dist/gateway.d.ts.map +0 -1
  138. package/dist/index.d.ts +0 -5
  139. package/dist/index.d.ts.map +0 -1
  140. package/dist/native-ai.css +0 -1422
  141. package/dist/register.d.ts +0 -12
  142. package/dist/register.d.ts.map +0 -1
@@ -1,1422 +0,0 @@
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-button);
599
- --n-chat-bubble-user-color: white;
600
- --n-chat-bubble-assistant: var(--n-card);
601
- --n-chat-bubble-assistant-color: var(--n-ink);
602
- --n-chat-bubble-radius: var(--n-radius);
603
- --n-chat-bubble-radius-avatar-side: var(--n-chat-bubble-radius);
604
- --n-chat-bubble-radius-far-side: var(--n-chat-bubble-radius);
605
- --n-chat-bubble-padding-block: calc(var(--n-space) * 2);
606
- --n-chat-bubble-padding-inline: calc(var(--n-space) * 3);
607
- --n-chat-bubble-max-width: 85%;
608
-
609
- /* Avatar */
610
- --n-chat-avatar-size: var(--n-size);
611
- --n-chat-avatar-background: var(--n-control);
612
- --n-chat-avatar-color: var(--n-ink-muted);
613
-
614
- /* Activity */
615
- --n-chat-activity-color: var(--n-ink-muted);
616
-
617
- /* Seed */
618
- --n-chat-seed-gap: var(--n-space);
619
- --n-chat-seed-padding-block: var(--n-space);
620
- --n-chat-seed-padding-inline: var(--n-chat-bubble-padding-inline);
621
-
622
- /* Structured input */
623
- --n-chat-structured-gap: calc(var(--n-space) * 2);
624
- --n-chat-structured-padding: calc(var(--n-space) * 3);
625
-
626
- /* Prose */
627
- --n-chat-prose-gap: calc(var(--n-space) * 2);
628
-
629
- /* Component-local tokens (magic number extraction) */
630
- --n-chat-model-picker-max-width: 12rem;
631
- --n-chat-activity-max-height: 20rem;
632
- --n-chat-streaming-opacity: 0.85;
633
- --n-chat-dot-pulse-duration: 1.2s;
634
- }
635
-
636
- /* ╭──────────────────────────────────────────────────────────╮
637
- │ n-chat │
638
- │ Chat controller. display:contents — no visual │
639
- │ presence. The inner n-panel provides structure. │
640
- │ n-chat wires gateway / gen-UI framework behavior. │
641
- ╰──────────────────────────────────────────────────────────╯ */
642
-
643
- :where(n-chat) {
644
- display: contents;
645
- }
646
-
647
- /* ══════════════════════════════════════════════════
648
- native-chat-panel
649
- ══════════════════════════════════════════════════ */
650
-
651
- :where(native-chat-panel) {
652
- --n-ground: var(--n-panel);
653
-
654
- /* Section surface token hooks — override on native-chat-panel to theme sections */
655
- --n-chat-panel-header-background: transparent;
656
- --n-chat-panel-header-border: var(--n-border-muted);
657
- --n-chat-panel-header-label-font-weight: inherit;
658
- --n-chat-panel-header-label-letter-spacing: inherit;
659
- --n-chat-panel-body-background: transparent;
660
- --n-chat-panel-footer-background: transparent;
661
- --n-chat-panel-footer-border: var(--n-border-muted);
662
-
663
- container-type: inline-size;
664
- display: flex;
665
- flex: 1 1 0%;
666
- min-width: 0;
667
- flex-direction: column;
668
- background: var(--n-ground);
669
- border-radius: var(--n-radius);
670
- overflow: hidden;
671
-
672
- font-size: var(--n-font-size);
673
- line-height: var(--n-line-height);
674
- }
675
-
676
- /* ── Aside mode (collapsible side panel) ──
677
- Base [aside] rule (panel.css) handles: display, width, min-width,
678
- max-width, overflow, padding, transition + @starting-style.
679
- Only override what chat-panel needs differently. */
680
-
681
- :where(native-chat-panel)[aside][open] {
682
- overflow: visible;
683
- }
684
-
685
- /* ── Sub-container integration ── */
686
-
687
- :where(native-chat-panel) > :where(n-header) {
688
- background: var(--n-chat-panel-header-background);
689
- border-bottom: 1px solid var(--n-chat-panel-header-border);
690
- }
691
-
692
- :where(native-chat-panel) > :where(n-header) :where([slot="label"]) {
693
- font-weight: var(--n-chat-panel-header-label-font-weight);
694
- letter-spacing: var(--n-chat-panel-header-label-letter-spacing);
695
- }
696
-
697
- :where(native-chat-panel) :where(.n-chat-panel-header-trailing) {
698
- display: inline-flex;
699
- align-items: center;
700
- gap: calc(var(--n-space) * 2);
701
- }
702
-
703
- :where(native-chat-panel) > :where(n-body) {
704
- background: var(--n-chat-panel-body-background);
705
- }
706
-
707
- :where(native-chat-panel) > :where(n-footer) {
708
- background: var(--n-chat-panel-footer-background);
709
- border-top: 1px solid var(--n-chat-panel-footer-border);
710
- }
711
-
712
- /* ── Model picker ── */
713
-
714
- :where(native-chat-panel) :where(n-select[data-role="model-picker"]) {
715
- max-width: var(--n-chat-model-picker-max-width);
716
- }
717
-
718
- :where(native-chat-panel) :where(n-select[data-role="model-picker"]) :where(n-button[justify="spread"]) {
719
- gap: calc(var(--n-space) * 0.5);
720
- }
721
-
722
- :where(native-chat-panel) :where(n-select[data-role="model-picker"]) :where([slot="label"]) {
723
- overflow: hidden;
724
- text-overflow: ellipsis;
725
- white-space: nowrap;
726
- }
727
-
728
-
729
- /* ── n-chat-content ── */
730
-
731
- :where(n-chat-content) {
732
- display: flex;
733
- flex: 1 1 0%;
734
- min-width: 0;
735
- min-height: 0;
736
- flex-direction: column;
737
- gap: calc(var(--n-space) * 2);
738
- }
739
-
740
- /* ══════════════════════════════════════════════════
741
- n-chat-feed — scrollable thread coordinator
742
- ══════════════════════════════════════════════════ */
743
-
744
- :where(n-chat-feed) {
745
- display: flex;
746
- flex-direction: column;
747
- gap: var(--n-chat-gap);
748
- flex: 1 1 0%;
749
- min-height: 0;
750
- min-width: 0;
751
- padding-block: calc(var(--n-space) * 4);
752
- }
753
-
754
- /* WHY: Opt-in scroll container — prevents layout conflicts when scroll
755
- ownership belongs to a parent container. */
756
- [scrollable]:where(n-chat-feed) {
757
- overflow-y: auto;
758
- scrollbar-width: thin;
759
- scroll-behavior: smooth;
760
- }
761
-
762
- /* ── Date separator ── */
763
-
764
- :where(n-chat-feed) > :where(.n-chat-date-separator) {
765
- display: flex;
766
- align-items: center;
767
- justify-content: center;
768
- padding-block: var(--n-space);
769
- font-size: var(--n-font-size-sm);
770
- color: var(--n-ink-muted);
771
- user-select: none;
772
- }
773
-
774
- /* ── Virtual scroll spacers ── */
775
-
776
- :where(n-chat-feed) > :where(.n-chat-feed-virtual-container) {
777
- display: flex;
778
- flex-direction: column;
779
- gap: var(--n-chat-gap);
780
- }
781
-
782
- :where(n-chat-feed) :where(.n-virtual-spacer-top),
783
- :where(n-chat-feed) :where(.n-virtual-spacer-bottom) {
784
- flex-shrink: 0;
785
- }
786
-
787
- :where(n-chat-feed[hidden]) { display: none; }
788
-
789
- /* ══════════════════════════════════════════════════
790
- n-chat-messages — message group (bubble cluster)
791
- ══════════════════════════════════════════════════ */
792
-
793
- /* 2×2 grid: avatar | context + bubbles.
794
- Col 1: avatar (spans both rows, bottom-aligned)
795
- Col 2 row 1: .n-chat-context — metadata, reasoning, timestamps
796
- Col 2 row 2: .n-chat-bubbles — message bubbles (flex column) */
797
- :where(n-chat-messages) {
798
- display: grid;
799
- grid-template-columns: auto 1fr;
800
- grid-template-rows: auto 1fr;
801
- column-gap: var(--n-chat-message-gap);
802
- align-self: flex-start;
803
- max-width: var(--n-chat-bubble-max-width);
804
- min-width: 0;
805
- }
806
-
807
- /* Avatar: col 1, spans both rows, bottom-align */
808
- :where(n-chat-messages) > :where(n-chat-avatar) {
809
- grid-column: 1;
810
- grid-row: 1 / -1;
811
- align-self: end;
812
- }
813
-
814
- /* Context area: col 2, row 1 — metadata above messages */
815
- :where(n-chat-messages) > :where(.n-chat-context) {
816
- grid-column: 2;
817
- grid-row: 1;
818
- display: flex;
819
- flex-direction: column;
820
- gap: var(--n-space);
821
- min-width: 0;
822
- }
823
-
824
- /* Empty context collapses */
825
- :where(n-chat-messages) > :where(.n-chat-context:empty) {
826
- display: none;
827
- }
828
-
829
- /* Bubbles area: col 2, row 2 — flex column of messages */
830
- :where(n-chat-messages) > :where(.n-chat-bubbles) {
831
- grid-column: 2;
832
- grid-row: 2;
833
- display: flex;
834
- flex-direction: column;
835
- gap: var(--n-space);
836
- min-width: 0;
837
- }
838
-
839
- /* Messages shrink-wrap to content width */
840
- :where(.n-chat-bubbles) > :where(n-chat-message) {
841
- width: fit-content;
842
- max-width: 100%;
843
- }
844
-
845
- /* Avatar alignment overrides */
846
- [avatar-align="top"]:where(n-chat-messages) > :where(n-chat-avatar) {
847
- align-self: start;
848
- }
849
-
850
- [avatar-align="center"]:where(n-chat-messages) > :where(n-chat-avatar) {
851
- align-self: center;
852
- }
853
-
854
- /* User messages: right-aligned, avatar on right */
855
- [data-role="user"]:where(n-chat-messages) {
856
- grid-template-columns: 1fr auto;
857
- align-self: flex-end;
858
- }
859
-
860
- [data-role="user"]:where(n-chat-messages) > :where(n-chat-avatar) {
861
- grid-column: 2;
862
- }
863
-
864
- [data-role="user"]:where(n-chat-messages) > :where(.n-chat-context),
865
- [data-role="user"]:where(n-chat-messages) > :where(.n-chat-bubbles) {
866
- grid-column: 1;
867
- }
868
-
869
- /* User bubbles align to the right edge */
870
- [data-role="user"]:where(n-chat-messages) :where(.n-chat-bubbles) > :where(n-chat-message) {
871
- align-self: flex-end;
872
- }
873
-
874
- :where(n-chat-messages[hidden]) { display: none; }
875
-
876
- /* ══════════════════════════════════════════════════
877
- n-chat-avatar — sender avatar
878
- ══════════════════════════════════════════════════ */
879
-
880
- :where(n-chat-avatar) {
881
- display: inline-flex;
882
- align-items: center;
883
- justify-content: center;
884
- flex-shrink: 0;
885
-
886
- width: var(--n-chat-avatar-size);
887
- height: var(--n-chat-avatar-size);
888
- border-radius: 50%;
889
- background: var(--n-chat-avatar-background);
890
- color: var(--n-chat-avatar-color);
891
-
892
- font-size: calc(var(--n-chat-avatar-size) * 0.4);
893
- font-weight: var(--n-button-font-weight);
894
- line-height: 1;
895
- overflow: hidden;
896
- user-select: none;
897
- }
898
-
899
- :where(n-chat-avatar) > :where(img) {
900
- width: 100%;
901
- height: 100%;
902
- object-fit: cover;
903
- border-radius: inherit;
904
- }
905
-
906
- :where(n-chat-avatar) > :where(n-icon) {
907
- font-size: calc(var(--n-chat-avatar-size) * 0.5);
908
- }
909
-
910
- :where(n-chat-avatar[hidden]) { display: none; }
911
-
912
- /* ══════════════════════════════════════════════════
913
- n-chat-message — individual message bubble
914
- ══════════════════════════════════════════════════ */
915
-
916
- :where(n-chat-message) {
917
- display: flex;
918
- flex-direction: column;
919
- gap: var(--n-space);
920
- overflow: hidden;
921
-
922
- /* Asymmetric radius: assistant = avatar on left */
923
- border-radius:
924
- var(--n-chat-bubble-radius-avatar-side)
925
- var(--n-chat-bubble-radius-far-side)
926
- var(--n-chat-bubble-radius-far-side)
927
- var(--n-chat-bubble-radius-avatar-side);
928
-
929
- background: var(--n-chat-bubble-assistant);
930
- color: var(--n-chat-bubble-assistant-color);
931
-
932
- word-wrap: break-word;
933
- overflow-wrap: break-word;
934
- }
935
-
936
- /* User bubble: avatar on right — flip avatar-side / far-side corners */
937
- [data-role="user"]:where(n-chat-message) {
938
- border-radius:
939
- var(--n-chat-bubble-radius-far-side)
940
- var(--n-chat-bubble-radius-avatar-side)
941
- var(--n-chat-bubble-radius-avatar-side)
942
- var(--n-chat-bubble-radius-far-side);
943
-
944
- background: var(--n-chat-bubble-user);
945
- color: var(--n-chat-bubble-user-color);
946
- }
947
-
948
- /* Streaming status */
949
- [status="streaming"]:where(n-chat-message) {
950
- opacity: var(--n-chat-streaming-opacity);
951
- }
952
-
953
- /* Error status */
954
- [status="error"]:where(n-chat-message) {
955
- border: 1px solid var(--n-border-danger);
956
- }
957
-
958
- /* Partial status — stream ended without explicit completion */
959
- [status="partial"]:where(n-chat-message) {
960
- border-bottom: 2px dashed var(--n-border-muted);
961
- }
962
-
963
- /* Typing status — waiting for first stream chunk */
964
- [status="typing"]:where(n-chat-message) :where(n-chat-message-text) :where(.n-chat-prose):empty::before {
965
- content: '\25CF\25CF\25CF';
966
- letter-spacing: 0.25em;
967
- color: var(--n-ink-muted);
968
- animation: n-chat-typing-dots var(--n-chat-dot-pulse-duration, 1.4s) ease-in-out infinite;
969
- }
970
-
971
- @keyframes n-chat-typing-dots {
972
- 0%, 100% { opacity: 0.3; }
973
- 50% { opacity: 1; }
974
- }
975
-
976
- /* ── Message actions toolbar ── */
977
-
978
- :where(n-chat-message) > :where(n-toolbar[data-role="actions"]) {
979
- opacity: 0;
980
- transition: opacity var(--n-duration) var(--n-easing);
981
- padding-inline: var(--n-chat-bubble-padding-inline);
982
- }
983
-
984
- :where(n-chat-message):hover > :where(n-toolbar[data-role="actions"]),
985
- :where(n-chat-message):focus-within > :where(n-toolbar[data-role="actions"]),
986
- :where(n-chat-message[force-hover]) > :where(n-toolbar[data-role="actions"]) {
987
- opacity: 1;
988
- }
989
-
990
- /* Partial status — always show actions (contains continue button) */
991
- [status="partial"]:where(n-chat-message) > :where(n-toolbar[data-role="actions"]) {
992
- opacity: 1;
993
- }
994
-
995
- /* ── Below-bubble popover toolbar ── */
996
-
997
- /* Popover toolbar: anchored below the message via CSS anchor positioning.
998
- Toolbar is a child of n-chat-message with popover="manual", rendered in the
999
- top layer. JS shows/hides via pointerenter/pointerleave + showPopover().
1000
- Entry/exit transition mirrors n-listbox[popover] (perspective + scale). */
1001
- :where(n-chat-message) > :where(n-toolbar[data-role="actions"][popover]) {
1002
- position: fixed;
1003
- inset: auto;
1004
- top: anchor(bottom);
1005
- left: anchor(center);
1006
- translate: -50% 0;
1007
- margin: 2px 0 0;
1008
- width: max-content;
1009
-
1010
- transform-origin: top center;
1011
- opacity: 0;
1012
- transform: perspective(800px) scale(0.96) rotateX(-20deg);
1013
-
1014
- transition:
1015
- opacity var(--n-duration) var(--n-easing),
1016
- transform var(--n-duration) var(--n-easing),
1017
- display var(--n-duration) var(--n-easing) allow-discrete,
1018
- overlay var(--n-duration) var(--n-easing) allow-discrete;
1019
- }
1020
-
1021
- :where(n-chat-message) > :where(n-toolbar[data-role="actions"][popover]):popover-open {
1022
- opacity: 1;
1023
- transform: none;
1024
- }
1025
-
1026
- @starting-style {
1027
- :where(n-chat-message) > :where(n-toolbar[data-role="actions"][popover]):popover-open {
1028
- opacity: 0;
1029
- transform: perspective(800px) scale(0.96) rotateX(-20deg);
1030
- }
1031
- }
1032
-
1033
- /* Override n-toolbar display to respect popover hidden state */
1034
- :where(n-toolbar[data-role="actions"][popover]):not(:popover-open) {
1035
- display: none;
1036
- }
1037
-
1038
- :where(n-chat-message[hidden]) { display: none; }
1039
-
1040
- /* ══════════════════════════════════════════════════
1041
- n-chat-message-text — rich text / markdown
1042
- ══════════════════════════════════════════════════ */
1043
-
1044
- :where(n-chat-message-text) {
1045
- display: block;
1046
- padding-block: var(--n-chat-bubble-padding-block);
1047
- padding-inline: var(--n-chat-bubble-padding-inline);
1048
- }
1049
-
1050
- /* ── Prose reset — typography inside rendered markdown ── */
1051
-
1052
- :where(n-chat-message-text) :where(.n-chat-prose) {
1053
- display: flex;
1054
- flex-direction: column;
1055
- gap: var(--n-chat-prose-gap);
1056
- }
1057
-
1058
- /* Universal block margin reset — flexbox gap handles spacing,
1059
- so all block-level children must have zero margin */
1060
- :where(n-chat-message-text) :where(
1061
- p, h1, h2, h3, h4, h5, h6,
1062
- ul, ol, li,
1063
- blockquote, pre, hr,
1064
- div, figure, figcaption,
1065
- dl, dt, dd, details, summary
1066
- ) {
1067
- margin: 0;
1068
- }
1069
-
1070
- :where(n-chat-message-text) :where(h1, h2, h3, h4, h5, h6) {
1071
- font-weight: var(--n-button-font-weight);
1072
- line-height: 1.3;
1073
- }
1074
-
1075
- :where(n-chat-message-text) :where(h1) { font-size: 1.4em; }
1076
- :where(n-chat-message-text) :where(h2) { font-size: 1.25em; }
1077
- :where(n-chat-message-text) :where(h3) { font-size: 1.1em; }
1078
-
1079
- :where(n-chat-message-text) :where(ul, ol) {
1080
- padding-inline-start: 1.5em;
1081
- }
1082
-
1083
- :where(n-chat-message-text) :where(li) {
1084
- margin-block: calc(var(--n-space) * 0.5);
1085
- }
1086
-
1087
- :where(n-chat-message-text) :where(blockquote) {
1088
- padding-inline-start: calc(var(--n-space) * 3);
1089
- border-inline-start: 3px solid var(--n-border-muted);
1090
- color: var(--n-ink-muted);
1091
- }
1092
-
1093
- :where(n-chat-message-text) :where(code) {
1094
- font-family: var(--n-font-mono);
1095
- font-size: 0.9em;
1096
- padding-block: 0.1em;
1097
- padding-inline: 0.3em;
1098
- background: var(--n-control);
1099
- border-radius: calc(var(--n-radius) * 0.5);
1100
- }
1101
-
1102
- :where(n-chat-message-text) :where(pre) {
1103
- padding-block: calc(var(--n-space) * 2);
1104
- padding-inline: calc(var(--n-space) * 2);
1105
- background: var(--n-control);
1106
- border-radius: calc(var(--n-radius) * 0.5);
1107
- overflow-x: auto;
1108
- scrollbar-width: thin;
1109
- }
1110
-
1111
- :where(n-chat-message-text) :where(pre) :where(code) {
1112
- padding-block: 0;
1113
- padding-inline: 0;
1114
- background: transparent;
1115
- border-radius: 0;
1116
- }
1117
-
1118
- :where(n-chat-message-text) :where(a) {
1119
- color: var(--n-ink-accent);
1120
- text-decoration: underline;
1121
- text-underline-offset: 0.15em;
1122
- }
1123
-
1124
- :where(n-chat-message-text) :where(a):hover {
1125
- color: var(--n-ink-hover);
1126
- }
1127
-
1128
- :where(n-chat-message-text) :where(hr) {
1129
- border: none;
1130
- border-top: 1px solid var(--n-border-muted);
1131
- }
1132
-
1133
- :where(n-chat-message-text[hidden]) { display: none; }
1134
-
1135
- /* ══════════════════════════════════════════════════
1136
- n-chat-message-activity — typing / thinking
1137
- ══════════════════════════════════════════════════ */
1138
-
1139
- :where(n-chat-message-activity) {
1140
- display: flex;
1141
- flex-direction: column;
1142
- gap: var(--n-space);
1143
- color: var(--n-chat-activity-color);
1144
- font-size: var(--n-font-size-sm);
1145
- padding-block: var(--n-space);
1146
- padding-inline: var(--n-chat-bubble-padding-inline);
1147
- align-self: flex-start;
1148
- }
1149
-
1150
- :where(n-chat-message-activity) > :where(.n-chat-activity-row) {
1151
- display: inline-flex;
1152
- align-items: center;
1153
- gap: calc(var(--n-space) * 1.5);
1154
- }
1155
-
1156
- :where(n-chat-message-activity) :where(.n-chat-activity-time) {
1157
- font-variant-numeric: tabular-nums;
1158
- min-width: 2.5em;
1159
- }
1160
-
1161
- :where(n-chat-message-activity) :where(.n-chat-activity-sep) {
1162
- opacity: 0.4;
1163
- }
1164
-
1165
- /* Animated dots */
1166
- :where(n-chat-message-activity) :where(.n-chat-activity-dots) {
1167
- display: inline-flex;
1168
- gap: 0.2em;
1169
- margin-inline-start: 0.25em;
1170
- }
1171
-
1172
- :where(n-chat-message-activity) :where(.n-chat-activity-dots) > :where(i) {
1173
- display: block;
1174
- width: 0.25em;
1175
- height: 0.25em;
1176
- border-radius: 50%;
1177
- background: currentColor;
1178
- animation: n-chat-dot-pulse var(--n-chat-dot-pulse-duration) ease-in-out infinite;
1179
- }
1180
-
1181
- :where(n-chat-message-activity) :where(.n-chat-activity-dots) > :where(i:nth-child(2)) {
1182
- animation-delay: 0.2s;
1183
- }
1184
-
1185
- :where(n-chat-message-activity) :where(.n-chat-activity-dots) > :where(i:nth-child(3)) {
1186
- animation-delay: 0.4s;
1187
- }
1188
-
1189
- @keyframes n-chat-dot-pulse {
1190
- 0%, 60%, 100% { opacity: 0.3; transform: scale(0.8); }
1191
- 30% { opacity: 1; transform: scale(1); }
1192
- }
1193
-
1194
- /* Expandable state */
1195
- :where(n-chat-message-activity) > :where(.n-chat-activity-row) {
1196
- cursor: default;
1197
- }
1198
-
1199
- [expandable]:where(n-chat-message-activity) > :where(.n-chat-activity-row) {
1200
- cursor: pointer;
1201
- }
1202
-
1203
- [expandable]:where(n-chat-message-activity) > :where(.n-chat-activity-row)::before {
1204
- content: '▶';
1205
- font-size: 0.65em;
1206
- transition: transform var(--n-duration) var(--n-easing);
1207
- }
1208
-
1209
- [expanded][expandable]:where(n-chat-message-activity) > :where(.n-chat-activity-row)::before {
1210
- transform: rotate(90deg);
1211
- }
1212
-
1213
- :where(n-chat-message-activity) > :where(.n-chat-activity-content) {
1214
- padding-inline-start: calc(var(--n-space) * 3);
1215
- font-family: var(--n-font-mono);
1216
- font-size: var(--n-font-size-sm);
1217
- max-height: var(--n-chat-activity-max-height);
1218
- overflow-y: auto;
1219
- scrollbar-width: thin;
1220
- }
1221
-
1222
- :where(n-chat-message-activity[hidden]) { display: none; }
1223
-
1224
- @media (prefers-reduced-motion: reduce) {
1225
- :where(n-chat-message-activity) :where(.n-chat-activity-dots) > :where(i) {
1226
- animation: none;
1227
- }
1228
- }
1229
-
1230
- /* ══════════════════════════════════════════════════
1231
- n-chat-message-seed — suggestion chips
1232
- ══════════════════════════════════════════════════ */
1233
-
1234
- :where(n-chat-message-seed) {
1235
- display: block;
1236
- padding-block: var(--n-chat-seed-padding-block);
1237
- padding-inline: var(--n-chat-seed-padding-inline);
1238
- align-self: flex-start;
1239
- }
1240
-
1241
- :where(n-chat-message-seed) > :where(n-stack) {
1242
- gap: var(--n-chat-seed-gap);
1243
- }
1244
-
1245
- :where(n-chat-message-seed)[aria-disabled="true"] {
1246
- pointer-events: none;
1247
- color: var(--n-color-disabled);
1248
- cursor: not-allowed;
1249
- }
1250
-
1251
- :where(n-chat-message-seed[hidden]) { display: none; }
1252
-
1253
- /* ══════════════════════════════════════════════════
1254
- n-chat-message-genui — schema-rendered UI
1255
- ══════════════════════════════════════════════════ */
1256
-
1257
- :where(n-chat-message-genui) {
1258
- display: block;
1259
- min-width: 0;
1260
- }
1261
-
1262
- :where(n-chat-message-genui) > :where(.n-chat-genui-container) {
1263
- display: flex;
1264
- flex-direction: column;
1265
- gap: var(--n-space);
1266
- }
1267
-
1268
- :where(n-chat-message-genui) :where(.n-chat-genui-error) {
1269
- padding-block: var(--n-space);
1270
- padding-inline: var(--n-space);
1271
- color: var(--n-ink-danger);
1272
- font-size: var(--n-font-size-sm);
1273
- }
1274
-
1275
- :where(n-chat-message-genui) :where(n-container[data-role="preview"]) {
1276
- display: flex;
1277
- align-items: center;
1278
- justify-content: space-between;
1279
- gap: calc(var(--n-space) * 2);
1280
- }
1281
-
1282
- :where(n-chat-message-genui[hidden]) { display: none; }
1283
-
1284
- /* ══════════════════════════════════════════════════
1285
- n-chat-input-structured — multi-choice input
1286
- ══════════════════════════════════════════════════ */
1287
-
1288
- :where(n-chat-input-structured) {
1289
- display: flex;
1290
- flex-direction: column;
1291
- gap: var(--n-chat-structured-gap);
1292
- padding-block: var(--n-chat-structured-padding);
1293
- padding-inline: var(--n-chat-structured-padding);
1294
- --n-background: var(--n-card);
1295
- background: var(--n-background);
1296
- border-radius: var(--n-chat-bubble-radius);
1297
- align-self: stretch;
1298
- }
1299
-
1300
- :where(n-chat-input-structured) > :where(.n-chat-structured-question) {
1301
- font-weight: var(--n-button-font-weight);
1302
- }
1303
-
1304
- :where(n-chat-input-structured) > :where(n-stack) {
1305
- flex: 0 0 auto;
1306
- gap: var(--n-chat-seed-gap);
1307
- }
1308
-
1309
- :where(n-chat-input-structured) > :where(.n-chat-structured-actions) {
1310
- display: flex;
1311
- align-items: center;
1312
- justify-content: flex-end;
1313
- gap: var(--n-space);
1314
- }
1315
-
1316
- :where(n-chat-input-structured)[aria-disabled="true"] {
1317
- pointer-events: none;
1318
- color: var(--n-color-disabled);
1319
- cursor: not-allowed;
1320
- }
1321
-
1322
- :where(n-chat-input-structured[hidden]) { display: none; }
1323
-
1324
- /* ══════════════════════════════════════════════════
1325
- n-chat-input — composer
1326
- ══════════════════════════════════════════════════ */
1327
-
1328
- :where(n-chat-input) {
1329
- display: flex;
1330
- flex: 1 1 0%;
1331
- flex-direction: column;
1332
- min-width: 0;
1333
- }
1334
-
1335
- /* Compact: single row */
1336
- [compact]:where(n-chat-input) {
1337
- flex-direction: row;
1338
- align-items: center;
1339
- }
1340
-
1341
- /* Textarea inside input — fully transparent, no padding */
1342
- :where(n-chat-input) > :where(n-textarea) {
1343
- --n-background: transparent;
1344
- --n-background-hover: transparent;
1345
- --n-background-active: transparent;
1346
- --n-border-color: transparent;
1347
- --n-border-color-hover: transparent;
1348
- --n-border-color-active: transparent;
1349
-
1350
- padding-block: 0;
1351
- padding-inline: 0;
1352
- border: none;
1353
- border-radius: 0;
1354
- resize: none;
1355
- }
1356
-
1357
- :where(n-chat-input) > :where(n-textarea):not(:state(empty)),
1358
- :where(n-chat-input) > :where(n-textarea):not(:state(empty)):hover {
1359
- background: transparent;
1360
- border-color: transparent;
1361
- }
1362
-
1363
- :where(n-chat-input) > :where(n-textarea):focus {
1364
- border-color: transparent;
1365
- outline: none;
1366
- }
1367
-
1368
- /* ── n-chat-input-attachments ── */
1369
-
1370
- :where(n-chat-input-attachments) {
1371
- display: flex;
1372
- flex-wrap: wrap;
1373
- gap: calc(var(--n-space) * 2);
1374
- }
1375
-
1376
- /* ── n-chat-input-actions ── */
1377
-
1378
- :where(n-chat-input-actions) {
1379
- display: flex;
1380
- align-items: center;
1381
- justify-content: flex-end;
1382
- gap: calc(var(--n-space) * 2);
1383
- min-width: 0;
1384
- }
1385
-
1386
- [compact]:where(n-chat-input) > :where(n-chat-input-actions) {
1387
- flex: none;
1388
- }
1389
-
1390
- }
1391
-
1392
- /* ════════════════════════════════════════════════════
1393
- .n-chat-starter — Starter surface preset
1394
- ════════════════════════════════════════════════════
1395
-
1396
- Harmonizes seed + structured input spacing when composed
1397
- together as a starter surface (e.g. inside n-container, n-body).
1398
-
1399
- Add `compact` attribute for tighter spacing (small cards,
1400
- inline starters, sidebars).
1401
-
1402
- Usage:
1403
- <n-container class="n-chat-starter">
1404
- <n-body>
1405
- <n-chat-message-seed></n-chat-message-seed>
1406
- <n-chat-input-structured question="..."></n-chat-input-structured>
1407
- </n-body>
1408
- </n-container>
1409
- */
1410
-
1411
- .n-chat-starter {
1412
- --n-chat-seed-padding-inline: 0;
1413
- --n-chat-seed-padding-block: 0;
1414
- --n-chat-structured-padding: calc(var(--n-space) * 2);
1415
- --n-chat-structured-gap: var(--n-space);
1416
- }
1417
-
1418
- .n-chat-starter[compact] {
1419
- --n-chat-seed-gap: calc(var(--n-space) * 0.5);
1420
- --n-chat-structured-padding: var(--n-space);
1421
- --n-chat-structured-gap: calc(var(--n-space) * 0.5);
1422
- }