@nonoun/native-chat 0.1.3 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/dist/avatar/chat-avatar-element.d.ts +18 -0
  2. package/dist/avatar/chat-avatar-element.d.ts.map +1 -0
  3. package/dist/avatar/index.d.ts +2 -0
  4. package/dist/avatar/index.d.ts.map +1 -0
  5. package/dist/avatar/n-chat-avatar.d.ts +2 -0
  6. package/dist/avatar/n-chat-avatar.d.ts.map +1 -0
  7. package/dist/chat-input-element.d.ts +10 -0
  8. package/dist/chat-input-element.d.ts.map +1 -1
  9. package/dist/chat-input-structured-element-Cpar3CeA.js +1069 -0
  10. package/dist/chat-panel-element.d.ts +28 -7
  11. package/dist/chat-panel-element.d.ts.map +1 -1
  12. package/dist/feed/chat-feed-element.d.ts +29 -0
  13. package/dist/feed/chat-feed-element.d.ts.map +1 -0
  14. package/dist/feed/index.d.ts +2 -0
  15. package/dist/feed/index.d.ts.map +1 -0
  16. package/dist/feed/n-chat-feed.d.ts +2 -0
  17. package/dist/feed/n-chat-feed.d.ts.map +1 -0
  18. package/dist/index.d.ts +11 -0
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/message/chat-input-structured-element.d.ts +43 -0
  21. package/dist/message/chat-input-structured-element.d.ts.map +1 -0
  22. package/dist/message/chat-message-activity-element.d.ts +32 -0
  23. package/dist/message/chat-message-activity-element.d.ts.map +1 -0
  24. package/dist/message/chat-message-element.d.ts +28 -0
  25. package/dist/message/chat-message-element.d.ts.map +1 -0
  26. package/dist/message/chat-message-genui-element.d.ts +45 -0
  27. package/dist/message/chat-message-genui-element.d.ts.map +1 -0
  28. package/dist/message/chat-message-seed-element.d.ts +33 -0
  29. package/dist/message/chat-message-seed-element.d.ts.map +1 -0
  30. package/dist/message/chat-message-text-element.d.ts +37 -0
  31. package/dist/message/chat-message-text-element.d.ts.map +1 -0
  32. package/dist/message/chat-messages-element.d.ts +28 -0
  33. package/dist/message/chat-messages-element.d.ts.map +1 -0
  34. package/dist/message/index.d.ts +8 -0
  35. package/dist/message/index.d.ts.map +1 -0
  36. package/dist/message/n-chat-message.d.ts +2 -0
  37. package/dist/message/n-chat-message.d.ts.map +1 -0
  38. package/dist/native-chat.css +477 -28
  39. package/dist/native-chat.js +323 -2
  40. package/dist/register.d.ts +10 -1
  41. package/dist/register.d.ts.map +1 -1
  42. package/dist/register.js +4 -4
  43. package/dist/stream/create-transport.d.ts +19 -0
  44. package/dist/stream/create-transport.d.ts.map +1 -0
  45. package/dist/stream/index.d.ts +7 -0
  46. package/dist/stream/index.d.ts.map +1 -0
  47. package/dist/stream/parse-json.d.ts +9 -0
  48. package/dist/stream/parse-json.d.ts.map +1 -0
  49. package/dist/stream/parse-ndjson.d.ts +9 -0
  50. package/dist/stream/parse-ndjson.d.ts.map +1 -0
  51. package/dist/stream/parse-sse.d.ts +9 -0
  52. package/dist/stream/parse-sse.d.ts.map +1 -0
  53. package/dist/stream/types.d.ts +23 -0
  54. package/dist/stream/types.d.ts.map +1 -0
  55. package/dist/telemetry/emitter.d.ts +20 -0
  56. package/dist/telemetry/emitter.d.ts.map +1 -0
  57. package/dist/telemetry/events.d.ts +11 -0
  58. package/dist/telemetry/events.d.ts.map +1 -0
  59. package/dist/telemetry/index.d.ts +5 -0
  60. package/dist/telemetry/index.d.ts.map +1 -0
  61. package/dist/telemetry/redactor.d.ts +17 -0
  62. package/dist/telemetry/redactor.d.ts.map +1 -0
  63. package/dist/telemetry/types.d.ts +27 -0
  64. package/dist/telemetry/types.d.ts.map +1 -0
  65. package/package.json +1 -1
  66. package/dist/chat-panel-element-CXPbtkyi.js +0 -113
@@ -1,6 +1,53 @@
1
+ /* ════════════════════════════════════════════════════
2
+ native-chat — Chat component styles
3
+ ════════════════════════════════════════════════════ */
4
+
1
5
  @layer ui {
2
6
 
3
- :where(n-chat-input):not(:defined) { visibility: hidden; }
7
+ /* ── :not(:defined) visibility guards ── */
8
+
9
+ :where(n-chat-input):not(:defined),
10
+ :where(n-chat-feed):not(:defined),
11
+ :where(n-chat-avatar):not(:defined),
12
+ :where(n-chat-message):not(:defined),
13
+ :where(n-chat-messages):not(:defined),
14
+ :where(n-chat-message-text):not(:defined),
15
+ :where(n-chat-message-activity):not(:defined),
16
+ :where(n-chat-message-seed):not(:defined),
17
+ :where(n-chat-message-genui):not(:defined),
18
+ :where(n-chat-input-structured):not(:defined) { visibility: hidden; }
19
+
20
+ /* ══════════════════════════════════════════════════
21
+ Chat Token Definitions
22
+ ══════════════════════════════════════════════════ */
23
+
24
+ :where(n-chat-feed),
25
+ :where(native-chat-panel) {
26
+ /* Feed */
27
+ --n-chat-gap: calc(var(--n-space) * 4);
28
+ --n-chat-message-gap: calc(var(--n-space) * 2);
29
+
30
+ /* Bubbles */
31
+ --n-chat-bubble-user: var(--n-button);
32
+ --n-chat-bubble-user-color: white;
33
+ --n-chat-bubble-assistant: var(--n-card);
34
+ --n-chat-bubble-assistant-color: var(--n-ink);
35
+ --n-chat-bubble-radius: var(--n-radius);
36
+ --n-chat-bubble-padding-block: calc(var(--n-space) * 2);
37
+ --n-chat-bubble-padding-inline: calc(var(--n-space) * 3);
38
+ --n-chat-bubble-max-width: 85%;
39
+
40
+ /* Avatar */
41
+ --n-chat-avatar-size: var(--n-size);
42
+ --n-chat-avatar-background: var(--n-control);
43
+ --n-chat-avatar-color: var(--n-ink-muted);
44
+
45
+ /* Activity */
46
+ --n-chat-activity-color: var(--n-ink-muted);
47
+
48
+ /* Prose */
49
+ --n-chat-prose-gap: calc(var(--n-space) * 2);
50
+ }
4
51
 
5
52
  /* ╭──────────────────────────────────────────────────────────╮
6
53
  │ n-chat │
@@ -13,6 +60,10 @@
13
60
  display: contents;
14
61
  }
15
62
 
63
+ /* ══════════════════════════════════════════════════
64
+ native-chat-panel
65
+ ══════════════════════════════════════════════════ */
66
+
16
67
  :where(native-chat-panel) {
17
68
  --n-ground: var(--n-panel);
18
69
 
@@ -55,8 +106,6 @@
55
106
  }
56
107
 
57
108
  /* ── n-chat-content ── */
58
- /* Message stream layout. Lives inside n-body which handles
59
- scrolling, padding, and flex: 1. Content just manages message gap. */
60
109
 
61
110
  :where(n-chat-content) {
62
111
  display: flex;
@@ -67,35 +116,443 @@
67
116
  gap: calc(var(--n-space) * 2);
68
117
  }
69
118
 
70
- /* ── n-chat-input ── */
71
- /* Rounded surface containing textarea + actions row.
72
- WHY: Single surface wraps everything — textarea fills the top,
73
- actions row sits bottom-right. Compact mode lays out as a
74
- single horizontal row. */
75
-
76
- :where(n-chat-input) {
77
- --n-background: var(--n-control);
78
- --n-border-color: var(--n-border-muted);
119
+ /* ══════════════════════════════════════════════════
120
+ n-chat-feed scrollable thread coordinator
121
+ ══════════════════════════════════════════════════ */
79
122
 
123
+ :where(n-chat-feed) {
80
124
  display: flex;
125
+ flex-direction: column;
126
+ gap: var(--n-chat-gap);
81
127
  flex: 1 1 0%;
128
+ min-height: 0;
129
+ min-width: 0;
130
+ padding-block: calc(var(--n-space) * 4);
131
+ }
132
+
133
+ /* WHY: Opt-in scroll container — prevents layout conflicts when scroll
134
+ ownership belongs to a parent container. */
135
+ [scrollable]:where(n-chat-feed) {
136
+ overflow-y: auto;
137
+ scrollbar-width: thin;
138
+ scroll-behavior: smooth;
139
+ }
140
+
141
+ /* ── Date separator ── */
142
+
143
+ :where(n-chat-feed) > :where(.n-chat-date-separator) {
144
+ display: flex;
145
+ align-items: center;
146
+ justify-content: center;
147
+ padding-block: var(--n-space);
148
+ font-size: var(--n-font-size-sm);
149
+ color: var(--n-ink-muted);
150
+ user-select: none;
151
+ }
152
+
153
+ :where(n-chat-feed[hidden]) { display: none; }
154
+
155
+ /* ══════════════════════════════════════════════════
156
+ n-chat-messages — message group (bubble cluster)
157
+ ══════════════════════════════════════════════════ */
158
+
159
+ :where(n-chat-messages) {
160
+ display: flex;
161
+ flex-direction: row;
162
+ align-items: flex-start;
163
+ gap: var(--n-chat-message-gap);
164
+ align-self: flex-start;
165
+ min-width: 0;
166
+ }
167
+
168
+ /* User messages: right-aligned, avatar on right */
169
+ [role="user"]:where(n-chat-messages) {
170
+ align-self: flex-end;
171
+ flex-direction: row-reverse;
172
+ }
173
+
174
+ /* Message column (everything except avatar) */
175
+ :where(n-chat-messages) > :where(:not(n-chat-avatar)) {
176
+ display: flex;
82
177
  flex-direction: column;
178
+ gap: calc(var(--n-space));
179
+ max-width: var(--n-chat-bubble-max-width);
83
180
  min-width: 0;
84
- background: var(--n-background);
85
- border: 1px solid var(--n-border-color);
86
- border-radius: var(--n-radius);
87
181
  }
88
182
 
183
+ :where(n-chat-messages[hidden]) { display: none; }
184
+
185
+ /* ══════════════════════════════════════════════════
186
+ n-chat-avatar — sender avatar
187
+ ══════════════════════════════════════════════════ */
188
+
189
+ :where(n-chat-avatar) {
190
+ display: inline-flex;
191
+ align-items: center;
192
+ justify-content: center;
193
+ flex-shrink: 0;
194
+
195
+ width: var(--n-chat-avatar-size);
196
+ height: var(--n-chat-avatar-size);
197
+ border-radius: 50%;
198
+ background: var(--n-chat-avatar-background);
199
+ color: var(--n-chat-avatar-color);
200
+
201
+ font-size: calc(var(--n-chat-avatar-size) * 0.4);
202
+ font-weight: 600;
203
+ line-height: 1;
204
+ overflow: hidden;
205
+ user-select: none;
206
+ }
207
+
208
+ :where(n-chat-avatar) > :where(img) {
209
+ width: 100%;
210
+ height: 100%;
211
+ object-fit: cover;
212
+ border-radius: inherit;
213
+ }
214
+
215
+ :where(n-chat-avatar) > :where(n-icon) {
216
+ font-size: calc(var(--n-chat-avatar-size) * 0.5);
217
+ }
218
+
219
+ :where(n-chat-avatar[hidden]) { display: none; }
220
+
221
+ /* ══════════════════════════════════════════════════
222
+ n-chat-message — individual message bubble
223
+ ══════════════════════════════════════════════════ */
224
+
225
+ :where(n-chat-message) {
226
+ display: flex;
227
+ flex-direction: column;
228
+ gap: var(--n-space);
229
+
230
+ padding-block: var(--n-chat-bubble-padding-block);
231
+ padding-inline: var(--n-chat-bubble-padding-inline);
232
+ border-radius: var(--n-chat-bubble-radius);
233
+
234
+ background: var(--n-chat-bubble-assistant);
235
+ color: var(--n-chat-bubble-assistant-color);
236
+
237
+ word-wrap: break-word;
238
+ overflow-wrap: break-word;
239
+ }
240
+
241
+ /* User bubble */
242
+ [role="user"]:where(n-chat-message) {
243
+ background: var(--n-chat-bubble-user);
244
+ color: var(--n-chat-bubble-user-color);
245
+ }
246
+
247
+ /* Streaming status */
248
+ [status="streaming"]:where(n-chat-message) {
249
+ opacity: 0.85;
250
+ }
251
+
252
+ /* Error status */
253
+ [status="error"]:where(n-chat-message) {
254
+ border: 1px solid var(--n-border-danger);
255
+ }
256
+
257
+ /* ── Message actions toolbar ── */
258
+
259
+ :where(n-chat-message) > :where(.n-chat-message-actions) {
260
+ opacity: 0;
261
+ transition: opacity var(--n-duration) var(--n-easing);
262
+ }
263
+
264
+ :where(n-chat-message):hover > :where(.n-chat-message-actions),
265
+ :where(n-chat-message):focus-within > :where(.n-chat-message-actions),
266
+ :where(n-chat-message[force-hover]) > :where(.n-chat-message-actions) {
267
+ opacity: 1;
268
+ }
269
+
270
+ :where(n-chat-message[hidden]) { display: none; }
271
+
272
+ /* ══════════════════════════════════════════════════
273
+ n-chat-message-text — rich text / markdown
274
+ ══════════════════════════════════════════════════ */
275
+
276
+ :where(n-chat-message-text) {
277
+ display: block;
278
+ }
279
+
280
+ /* ── Prose reset — typography inside rendered markdown ── */
281
+
282
+ :where(n-chat-message-text) :where(.n-chat-prose) {
283
+ display: flex;
284
+ flex-direction: column;
285
+ gap: var(--n-chat-prose-gap);
286
+ }
287
+
288
+ /* Universal block margin reset — flexbox gap handles spacing,
289
+ so all block-level children must have zero margin */
290
+ :where(n-chat-message-text) :where(
291
+ p, h1, h2, h3, h4, h5, h6,
292
+ ul, ol, li,
293
+ blockquote, pre, hr,
294
+ div, figure, figcaption,
295
+ dl, dt, dd, details, summary
296
+ ) {
297
+ margin: 0;
298
+ }
299
+
300
+ :where(n-chat-message-text) :where(h1, h2, h3, h4, h5, h6) {
301
+ font-weight: 600;
302
+ line-height: 1.3;
303
+ }
304
+
305
+ :where(n-chat-message-text) :where(h1) { font-size: 1.4em; }
306
+ :where(n-chat-message-text) :where(h2) { font-size: 1.25em; }
307
+ :where(n-chat-message-text) :where(h3) { font-size: 1.1em; }
308
+
309
+ :where(n-chat-message-text) :where(ul, ol) {
310
+ padding-inline-start: 1.5em;
311
+ }
312
+
313
+ :where(n-chat-message-text) :where(li) {
314
+ margin-block: calc(var(--n-space) * 0.5);
315
+ }
316
+
317
+ :where(n-chat-message-text) :where(blockquote) {
318
+ padding-inline-start: calc(var(--n-space) * 3);
319
+ border-inline-start: 3px solid var(--n-border-muted);
320
+ color: var(--n-ink-muted);
321
+ }
322
+
323
+ :where(n-chat-message-text) :where(code) {
324
+ font-family: var(--n-font-mono);
325
+ font-size: 0.9em;
326
+ padding-block: 0.1em;
327
+ padding-inline: 0.3em;
328
+ background: var(--n-control);
329
+ border-radius: calc(var(--n-radius) * 0.5);
330
+ }
331
+
332
+ :where(n-chat-message-text) :where(pre) {
333
+ padding: calc(var(--n-space) * 2);
334
+ background: var(--n-control);
335
+ border-radius: calc(var(--n-radius) * 0.5);
336
+ overflow-x: auto;
337
+ scrollbar-width: thin;
338
+ }
339
+
340
+ :where(n-chat-message-text) :where(pre) :where(code) {
341
+ padding: 0;
342
+ background: transparent;
343
+ border-radius: 0;
344
+ }
345
+
346
+ :where(n-chat-message-text) :where(a) {
347
+ color: var(--n-ink-accent);
348
+ text-decoration: underline;
349
+ text-underline-offset: 0.15em;
350
+ }
89
351
 
90
- /* Compact: single row — textarea and actions side by side */
352
+ :where(n-chat-message-text) :where(hr) {
353
+ border: none;
354
+ border-top: 1px solid var(--n-border-muted);
355
+ }
356
+
357
+ :where(n-chat-message-text[hidden]) { display: none; }
358
+
359
+ /* ══════════════════════════════════════════════════
360
+ n-chat-message-activity — typing / thinking
361
+ ══════════════════════════════════════════════════ */
362
+
363
+ :where(n-chat-message-activity) {
364
+ display: flex;
365
+ flex-direction: column;
366
+ gap: var(--n-space);
367
+ color: var(--n-chat-activity-color);
368
+ font-size: var(--n-font-size-sm);
369
+ padding-block: var(--n-space);
370
+ align-self: flex-start;
371
+ }
372
+
373
+ :where(n-chat-message-activity) > :where(.n-chat-activity-row) {
374
+ display: inline-flex;
375
+ align-items: center;
376
+ gap: calc(var(--n-space) * 1.5);
377
+ }
378
+
379
+ :where(n-chat-message-activity) :where(.n-chat-activity-time) {
380
+ font-variant-numeric: tabular-nums;
381
+ min-width: 2.5em;
382
+ }
383
+
384
+ :where(n-chat-message-activity) :where(.n-chat-activity-sep) {
385
+ opacity: 0.4;
386
+ }
387
+
388
+ /* Animated dots */
389
+ :where(n-chat-message-activity) :where(.n-chat-activity-dots) {
390
+ display: inline-flex;
391
+ gap: 0.2em;
392
+ margin-inline-start: 0.25em;
393
+ }
394
+
395
+ :where(n-chat-message-activity) :where(.n-chat-activity-dots) > :where(i) {
396
+ display: block;
397
+ width: 0.25em;
398
+ height: 0.25em;
399
+ border-radius: 50%;
400
+ background: currentColor;
401
+ animation: n-chat-dot-pulse 1.2s ease-in-out infinite;
402
+ }
403
+
404
+ :where(n-chat-message-activity) :where(.n-chat-activity-dots) > :where(i:nth-child(2)) {
405
+ animation-delay: 0.2s;
406
+ }
407
+
408
+ :where(n-chat-message-activity) :where(.n-chat-activity-dots) > :where(i:nth-child(3)) {
409
+ animation-delay: 0.4s;
410
+ }
411
+
412
+ @keyframes n-chat-dot-pulse {
413
+ 0%, 60%, 100% { opacity: 0.3; transform: scale(0.8); }
414
+ 30% { opacity: 1; transform: scale(1); }
415
+ }
416
+
417
+ /* Expandable state */
418
+ :where(n-chat-message-activity) > :where(.n-chat-activity-row) {
419
+ cursor: default;
420
+ }
421
+
422
+ [expandable]:where(n-chat-message-activity) > :where(.n-chat-activity-row) {
423
+ cursor: pointer;
424
+ }
425
+
426
+ [expandable]:where(n-chat-message-activity) > :where(.n-chat-activity-row)::before {
427
+ content: '▶';
428
+ font-size: 0.65em;
429
+ transition: transform var(--n-duration) var(--n-easing);
430
+ }
431
+
432
+ [expanded][expandable]:where(n-chat-message-activity) > :where(.n-chat-activity-row)::before {
433
+ transform: rotate(90deg);
434
+ }
435
+
436
+ :where(n-chat-message-activity) > :where(.n-chat-activity-content) {
437
+ padding-inline-start: calc(var(--n-space) * 3);
438
+ font-family: var(--n-font-mono);
439
+ font-size: var(--n-font-size-sm);
440
+ max-height: 20rem;
441
+ overflow-y: auto;
442
+ scrollbar-width: thin;
443
+ }
444
+
445
+ :where(n-chat-message-activity[hidden]) { display: none; }
446
+
447
+ @media (prefers-reduced-motion: reduce) {
448
+ :where(n-chat-message-activity) :where(.n-chat-activity-dots) > :where(i) {
449
+ animation: none;
450
+ }
451
+ }
452
+
453
+ /* ══════════════════════════════════════════════════
454
+ n-chat-message-seed — suggestion chips
455
+ ══════════════════════════════════════════════════ */
456
+
457
+ :where(n-chat-message-seed) {
458
+ display: flex;
459
+ flex-wrap: wrap;
460
+ gap: var(--n-space);
461
+ padding-block: var(--n-space);
462
+ align-self: flex-start;
463
+ }
464
+
465
+ :where(n-chat-message-seed)[aria-disabled="true"] {
466
+ pointer-events: none;
467
+ }
468
+
469
+ :where(n-chat-message-seed[hidden]) { display: none; }
470
+
471
+ /* ══════════════════════════════════════════════════
472
+ n-chat-message-genui — schema-rendered UI
473
+ ══════════════════════════════════════════════════ */
474
+
475
+ :where(n-chat-message-genui) {
476
+ display: block;
477
+ min-width: 0;
478
+ }
479
+
480
+ :where(n-chat-message-genui) > :where(.n-chat-genui-container) {
481
+ display: flex;
482
+ flex-direction: column;
483
+ gap: var(--n-space);
484
+ }
485
+
486
+ :where(n-chat-message-genui) :where(.n-chat-genui-error) {
487
+ padding: var(--n-space);
488
+ color: var(--n-ink-danger);
489
+ font-size: var(--n-font-size-sm);
490
+ }
491
+
492
+ :where(n-chat-message-genui) :where(.n-chat-genui-preview) {
493
+ display: flex;
494
+ align-items: center;
495
+ justify-content: space-between;
496
+ gap: calc(var(--n-space) * 2);
497
+ }
498
+
499
+ :where(n-chat-message-genui[hidden]) { display: none; }
500
+
501
+ /* ══════════════════════════════════════════════════
502
+ n-chat-input-structured — multi-choice input
503
+ ══════════════════════════════════════════════════ */
504
+
505
+ :where(n-chat-input-structured) {
506
+ display: flex;
507
+ flex-direction: column;
508
+ gap: calc(var(--n-space) * 2);
509
+ padding: calc(var(--n-space) * 3);
510
+ background: var(--n-card);
511
+ border-radius: var(--n-chat-bubble-radius);
512
+ align-self: stretch;
513
+ }
514
+
515
+ :where(n-chat-input-structured) > :where(.n-chat-structured-question) {
516
+ font-weight: 600;
517
+ }
518
+
519
+ :where(n-chat-input-structured) > :where(.n-chat-structured-options) {
520
+ display: flex;
521
+ flex-wrap: wrap;
522
+ gap: var(--n-space);
523
+ }
524
+
525
+ :where(n-chat-input-structured) > :where(.n-chat-structured-actions) {
526
+ display: flex;
527
+ align-items: center;
528
+ justify-content: flex-end;
529
+ gap: var(--n-space);
530
+ }
531
+
532
+ :where(n-chat-input-structured)[aria-disabled="true"] {
533
+ pointer-events: none;
534
+ }
535
+
536
+ :where(n-chat-input-structured[hidden]) { display: none; }
537
+
538
+ /* ══════════════════════════════════════════════════
539
+ n-chat-input — composer
540
+ ══════════════════════════════════════════════════ */
541
+
542
+ :where(n-chat-input) {
543
+ display: flex;
544
+ flex: 1 1 0%;
545
+ flex-direction: column;
546
+ min-width: 0;
547
+ }
548
+
549
+ /* Compact: single row */
91
550
  :where(n-chat-input[compact]) {
92
551
  flex-direction: row;
93
552
  align-items: center;
94
553
  }
95
554
 
96
- /* Textarea inside input — transparent, borderless, fills space.
97
- WHY: Override custom properties so all states (hover, filled, focus)
98
- resolve to transparent. The wrapper provides the visual surface. */
555
+ /* Textarea inside input — fully transparent, no padding */
99
556
  :where(n-chat-input) > :where(n-textarea) {
100
557
  --n-background: transparent;
101
558
  --n-background-hover: transparent;
@@ -104,6 +561,7 @@
104
561
  --n-border-color-hover: transparent;
105
562
  --n-border-color-active: transparent;
106
563
 
564
+ padding: 0;
107
565
  border: none;
108
566
  border-radius: 0;
109
567
  resize: none;
@@ -121,34 +579,25 @@
121
579
  }
122
580
 
123
581
  /* ── n-chat-input-attachments ── */
124
- /* Optional attachment zone above the textarea. */
125
582
 
126
583
  :where(n-chat-input-attachments) {
127
584
  display: flex;
128
585
  flex-wrap: wrap;
129
586
  gap: calc(var(--n-space) * 2);
130
- padding-block: var(--n-space);
131
- padding-inline: calc(var(--n-space-k) * var(--n-space));
132
587
  }
133
588
 
134
589
  /* ── n-chat-input-actions ── */
135
- /* Bottom action row: [+][model][mic][submit] — right-aligned. */
136
590
 
137
591
  :where(n-chat-input-actions) {
138
592
  display: flex;
139
593
  align-items: center;
140
594
  justify-content: flex-end;
141
595
  gap: calc(var(--n-space) * 2);
142
- padding-block: var(--n-space);
143
- padding-inline: calc(var(--n-space-k) * var(--n-space));
144
596
  min-width: 0;
145
597
  }
146
598
 
147
- /* In compact mode, actions shrink-wrap with no extra padding */
148
599
  :where(n-chat-input[compact]) > :where(n-chat-input-actions) {
149
600
  flex: none;
150
- padding-block: 0;
151
- padding-inline-start: 0;
152
601
  }
153
602
 
154
603
  }