@nonoun/native-ai 1.0.71 → 1.0.72

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 (148) hide show
  1. package/dist/native-ai.js +43 -47
  2. package/dist/register.js +349 -353
  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/builder/pipeline.d.ts +0 -33
  21. package/dist/a2ui/builder/pipeline.d.ts.map +0 -1
  22. package/dist/a2ui/builder/step-prompts.d.ts +0 -5
  23. package/dist/a2ui/builder/step-prompts.d.ts.map +0 -1
  24. package/dist/a2ui/index.d.ts +0 -15
  25. package/dist/a2ui/index.d.ts.map +0 -1
  26. package/dist/a2ui/install.d.ts +0 -23
  27. package/dist/a2ui/install.d.ts.map +0 -1
  28. package/dist/a2ui/protocol/a2ui-adapter.d.ts +0 -52
  29. package/dist/a2ui/protocol/a2ui-adapter.d.ts.map +0 -1
  30. package/dist/a2ui/protocol/a2ui-component-map.d.ts +0 -98
  31. package/dist/a2ui/protocol/a2ui-component-map.d.ts.map +0 -1
  32. package/dist/a2ui/protocol/a2ui-composition-map.d.ts +0 -101
  33. package/dist/a2ui/protocol/a2ui-composition-map.d.ts.map +0 -1
  34. package/dist/a2ui/protocol/a2ui-converter.d.ts +0 -37
  35. package/dist/a2ui/protocol/a2ui-converter.d.ts.map +0 -1
  36. package/dist/a2ui/protocol/a2ui-surface.d.ts +0 -34
  37. package/dist/a2ui/protocol/a2ui-surface.d.ts.map +0 -1
  38. package/dist/a2ui/protocol/a2ui-transport.d.ts +0 -80
  39. package/dist/a2ui/protocol/a2ui-transport.d.ts.map +0 -1
  40. package/dist/a2ui/protocol/a2ui-types.d.ts +0 -104
  41. package/dist/a2ui/protocol/a2ui-types.d.ts.map +0 -1
  42. package/dist/a2ui/protocol/index.d.ts +0 -15
  43. package/dist/a2ui/protocol/index.d.ts.map +0 -1
  44. package/dist/a2ui/protocol/kernel-bridge.d.ts +0 -114
  45. package/dist/a2ui/protocol/kernel-bridge.d.ts.map +0 -1
  46. package/dist/a2ui/register.d.ts +0 -12
  47. package/dist/a2ui/register.d.ts.map +0 -1
  48. package/dist/a2ui/session/agent-session.d.ts +0 -44
  49. package/dist/a2ui/session/agent-session.d.ts.map +0 -1
  50. package/dist/a2ui/session/catalog.d.ts +0 -41
  51. package/dist/a2ui/session/catalog.d.ts.map +0 -1
  52. package/dist/a2ui/session/event-emitter.d.ts +0 -17
  53. package/dist/a2ui/session/event-emitter.d.ts.map +0 -1
  54. package/dist/a2ui/session/index.d.ts +0 -9
  55. package/dist/a2ui/session/index.d.ts.map +0 -1
  56. package/dist/a2ui/session/session-manager.d.ts +0 -33
  57. package/dist/a2ui/session/session-manager.d.ts.map +0 -1
  58. package/dist/a2ui/session/surface-registry.d.ts +0 -32
  59. package/dist/a2ui/session/surface-registry.d.ts.map +0 -1
  60. package/dist/a2ui/session/types.d.ts +0 -27
  61. package/dist/a2ui/session/types.d.ts.map +0 -1
  62. package/dist/chat/avatar/chat-avatar-element.d.ts +0 -18
  63. package/dist/chat/avatar/chat-avatar-element.d.ts.map +0 -1
  64. package/dist/chat/avatar/index.d.ts +0 -2
  65. package/dist/chat/avatar/index.d.ts.map +0 -1
  66. package/dist/chat/avatar/n-chat-avatar.d.ts +0 -2
  67. package/dist/chat/avatar/n-chat-avatar.d.ts.map +0 -1
  68. package/dist/chat/chat-input-element.d.ts +0 -35
  69. package/dist/chat/chat-input-element.d.ts.map +0 -1
  70. package/dist/chat/chat-panel-element.d.ts +0 -100
  71. package/dist/chat/chat-panel-element.d.ts.map +0 -1
  72. package/dist/chat/feed/chat-feed-element.d.ts +0 -48
  73. package/dist/chat/feed/chat-feed-element.d.ts.map +0 -1
  74. package/dist/chat/feed/index.d.ts +0 -2
  75. package/dist/chat/feed/index.d.ts.map +0 -1
  76. package/dist/chat/feed/n-chat-feed.d.ts +0 -2
  77. package/dist/chat/feed/n-chat-feed.d.ts.map +0 -1
  78. package/dist/chat/gateway/adapter-chatgpt.d.ts +0 -67
  79. package/dist/chat/gateway/adapter-chatgpt.d.ts.map +0 -1
  80. package/dist/chat/gateway/adapter-claude.d.ts +0 -68
  81. package/dist/chat/gateway/adapter-claude.d.ts.map +0 -1
  82. package/dist/chat/gateway/adapter-mock.d.ts +0 -3
  83. package/dist/chat/gateway/adapter-mock.d.ts.map +0 -1
  84. package/dist/chat/gateway/adapter.d.ts +0 -71
  85. package/dist/chat/gateway/adapter.d.ts.map +0 -1
  86. package/dist/chat/gateway/controller.d.ts +0 -46
  87. package/dist/chat/gateway/controller.d.ts.map +0 -1
  88. package/dist/chat/gateway/index.d.ts +0 -9
  89. package/dist/chat/gateway/index.d.ts.map +0 -1
  90. package/dist/chat/gateway/runtime.d.ts +0 -53
  91. package/dist/chat/gateway/runtime.d.ts.map +0 -1
  92. package/dist/chat/gateway/types.d.ts +0 -73
  93. package/dist/chat/gateway/types.d.ts.map +0 -1
  94. package/dist/chat/gateway.d.ts +0 -2
  95. package/dist/chat/gateway.d.ts.map +0 -1
  96. package/dist/chat/index.d.ts +0 -17
  97. package/dist/chat/index.d.ts.map +0 -1
  98. package/dist/chat/message/chat-input-structured-element.d.ts +0 -43
  99. package/dist/chat/message/chat-input-structured-element.d.ts.map +0 -1
  100. package/dist/chat/message/chat-message-activity-element.d.ts +0 -32
  101. package/dist/chat/message/chat-message-activity-element.d.ts.map +0 -1
  102. package/dist/chat/message/chat-message-element.d.ts +0 -44
  103. package/dist/chat/message/chat-message-element.d.ts.map +0 -1
  104. package/dist/chat/message/chat-message-genui-element.d.ts +0 -45
  105. package/dist/chat/message/chat-message-genui-element.d.ts.map +0 -1
  106. package/dist/chat/message/chat-message-seed-element.d.ts +0 -32
  107. package/dist/chat/message/chat-message-seed-element.d.ts.map +0 -1
  108. package/dist/chat/message/chat-message-text-element.d.ts +0 -37
  109. package/dist/chat/message/chat-message-text-element.d.ts.map +0 -1
  110. package/dist/chat/message/chat-messages-element.d.ts +0 -39
  111. package/dist/chat/message/chat-messages-element.d.ts.map +0 -1
  112. package/dist/chat/message/index.d.ts +0 -8
  113. package/dist/chat/message/index.d.ts.map +0 -1
  114. package/dist/chat/message/n-chat-message.d.ts +0 -2
  115. package/dist/chat/message/n-chat-message.d.ts.map +0 -1
  116. package/dist/chat/register.d.ts +0 -13
  117. package/dist/chat/register.d.ts.map +0 -1
  118. package/dist/chat/stream/classify.d.ts +0 -19
  119. package/dist/chat/stream/classify.d.ts.map +0 -1
  120. package/dist/chat/stream/create-transport.d.ts +0 -19
  121. package/dist/chat/stream/create-transport.d.ts.map +0 -1
  122. package/dist/chat/stream/index.d.ts +0 -9
  123. package/dist/chat/stream/index.d.ts.map +0 -1
  124. package/dist/chat/stream/parse-json.d.ts +0 -9
  125. package/dist/chat/stream/parse-json.d.ts.map +0 -1
  126. package/dist/chat/stream/parse-ndjson.d.ts +0 -9
  127. package/dist/chat/stream/parse-ndjson.d.ts.map +0 -1
  128. package/dist/chat/stream/parse-sse.d.ts +0 -9
  129. package/dist/chat/stream/parse-sse.d.ts.map +0 -1
  130. package/dist/chat/stream/types.d.ts +0 -42
  131. package/dist/chat/stream/types.d.ts.map +0 -1
  132. package/dist/chat/telemetry/emitter.d.ts +0 -20
  133. package/dist/chat/telemetry/emitter.d.ts.map +0 -1
  134. package/dist/chat/telemetry/events.d.ts +0 -11
  135. package/dist/chat/telemetry/events.d.ts.map +0 -1
  136. package/dist/chat/telemetry/index.d.ts +0 -5
  137. package/dist/chat/telemetry/index.d.ts.map +0 -1
  138. package/dist/chat/telemetry/redactor.d.ts +0 -17
  139. package/dist/chat/telemetry/redactor.d.ts.map +0 -1
  140. package/dist/chat/telemetry/types.d.ts +0 -27
  141. package/dist/chat/telemetry/types.d.ts.map +0 -1
  142. package/dist/gateway.d.ts +0 -2
  143. package/dist/gateway.d.ts.map +0 -1
  144. package/dist/index.d.ts +0 -5
  145. package/dist/index.d.ts.map +0 -1
  146. package/dist/native-ai.css +0 -1567
  147. package/dist/register.d.ts +0 -12
  148. package/dist/register.d.ts.map +0 -1
@@ -1,1567 +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(n-body),
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(n-pane):not([hidden]):not(:has(~ n-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(n-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(n-pane[style*="width"]) {
169
- flex: none;
170
- }
171
-
172
- :where(native-a2ui) :where(n-pane[hidden]) {
173
- display: none;
174
- }
175
-
176
- /* ── Pane Header (icon + label + close button) ── */
177
-
178
- :where(native-a2ui) :where(n-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(n-pane) > :where(n-header) > :where(nav),
199
- :where(native-a2ui) :where(n-pane) > :where(n-header) > :where(aside) {
200
- display: flex;
201
- align-items: center;
202
- gap: 0.25rem;
203
- }
204
-
205
- :where(native-a2ui) :where(n-pane) > :where(n-header) :where(n-icon) {
206
- font-size: 0.875rem;
207
- }
208
-
209
- :where(native-a2ui) :where(n-pane) > :where(n-header) :where(n-button):hover,
210
- :where(native-a2ui) :where(n-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(n-body) {
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(n-body),
228
- :where(native-a2ui) :where([data-panel="js"]) :where(n-body),
229
- :where(native-a2ui) :where([data-panel="html"]) :where(n-body),
230
- :where(native-a2ui) :where([data-panel="css"]) :where(n-body),
231
- :where(native-a2ui) :where([data-panel="schema"]) :where(n-body) {
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
- }