@rokkit/themes 1.3.1 → 1.3.3

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 (87) hide show
  1. package/dist/base/chat.css +264 -0
  2. package/dist/base/message.css +28 -0
  3. package/dist/base.css +293 -0
  4. package/dist/frosted/button.css +10 -4
  5. package/dist/frosted/message.css +4 -4
  6. package/dist/frosted/status-list.css +1 -1
  7. package/dist/frosted/table.css +3 -1
  8. package/dist/frosted/tabs.css +7 -2
  9. package/dist/frosted/toggle.css +7 -2
  10. package/dist/frosted.css +32 -14
  11. package/dist/index.css +431 -75
  12. package/dist/material/button.css +3 -1
  13. package/dist/material/message.css +4 -4
  14. package/dist/material/select.css +3 -1
  15. package/dist/material/status-list.css +1 -1
  16. package/dist/material/table.css +3 -1
  17. package/dist/material/tabs.css +5 -2
  18. package/dist/material/toggle.css +5 -2
  19. package/dist/material.css +24 -12
  20. package/dist/minimal/button.css +3 -1
  21. package/dist/minimal/message.css +4 -4
  22. package/dist/minimal/status-list.css +1 -1
  23. package/dist/minimal/table.css +3 -1
  24. package/dist/minimal/tabs.css +1 -1
  25. package/dist/minimal.css +12 -8
  26. package/dist/rokkit/button.css +3 -1
  27. package/dist/rokkit/message.css +4 -4
  28. package/dist/rokkit/status-list.css +1 -1
  29. package/dist/rokkit/table.css +3 -1
  30. package/dist/rokkit.css +11 -7
  31. package/dist/zen-sumi/button.css +26 -3
  32. package/dist/zen-sumi/chart.css +1 -1
  33. package/dist/zen-sumi/command-palette.css +4 -4
  34. package/dist/zen-sumi/floating-action.css +1 -1
  35. package/dist/zen-sumi/floating-navigation.css +3 -3
  36. package/dist/zen-sumi/input.css +2 -2
  37. package/dist/zen-sumi/message.css +4 -4
  38. package/dist/zen-sumi/range.css +2 -2
  39. package/dist/zen-sumi/search-filter.css +2 -2
  40. package/dist/zen-sumi/status-list.css +3 -3
  41. package/dist/zen-sumi/step-indicator.css +2 -2
  42. package/dist/zen-sumi/tabs.css +1 -1
  43. package/dist/zen-sumi/timeline.css +2 -2
  44. package/dist/zen-sumi/toc.css +5 -3
  45. package/dist/zen-sumi/toolbar.css +1 -1
  46. package/dist/zen-sumi.css +59 -34
  47. package/package.json +3 -3
  48. package/src/base/chat.css +264 -0
  49. package/src/base/index.css +1 -0
  50. package/src/base/message.css +28 -0
  51. package/src/frosted/button.css +10 -4
  52. package/src/frosted/message.css +4 -4
  53. package/src/frosted/status-list.css +1 -1
  54. package/src/frosted/table.css +3 -1
  55. package/src/frosted/tabs.css +7 -2
  56. package/src/frosted/toggle.css +7 -2
  57. package/src/material/button.css +3 -1
  58. package/src/material/message.css +4 -4
  59. package/src/material/select.css +3 -1
  60. package/src/material/status-list.css +1 -1
  61. package/src/material/table.css +3 -1
  62. package/src/material/tabs.css +5 -2
  63. package/src/material/toggle.css +5 -2
  64. package/src/minimal/button.css +3 -1
  65. package/src/minimal/message.css +4 -4
  66. package/src/minimal/status-list.css +1 -1
  67. package/src/minimal/table.css +3 -1
  68. package/src/minimal/tabs.css +1 -1
  69. package/src/rokkit/button.css +3 -1
  70. package/src/rokkit/message.css +4 -4
  71. package/src/rokkit/status-list.css +1 -1
  72. package/src/rokkit/table.css +3 -1
  73. package/src/zen-sumi/button.css +26 -3
  74. package/src/zen-sumi/chart.css +1 -1
  75. package/src/zen-sumi/command-palette.css +4 -4
  76. package/src/zen-sumi/floating-action.css +1 -1
  77. package/src/zen-sumi/floating-navigation.css +3 -3
  78. package/src/zen-sumi/input.css +2 -2
  79. package/src/zen-sumi/message.css +4 -4
  80. package/src/zen-sumi/range.css +2 -2
  81. package/src/zen-sumi/search-filter.css +2 -2
  82. package/src/zen-sumi/status-list.css +3 -3
  83. package/src/zen-sumi/step-indicator.css +2 -2
  84. package/src/zen-sumi/tabs.css +1 -1
  85. package/src/zen-sumi/timeline.css +2 -2
  86. package/src/zen-sumi/toc.css +5 -3
  87. package/src/zen-sumi/toolbar.css +1 -1
@@ -0,0 +1,264 @@
1
+ /* Chat — structural + neutral styling for the @rokkit/ui chat components
2
+ (ChatShell / ChatHistory / ChatTimeline / ChatMessage / ChatComposer).
3
+
4
+ The components are headless and emit data-* hooks only; this file owns
5
+ their visual treatment using the Rokkit named-token vocabulary
6
+ (--paper, --ink, --accent, …) so it adapts to every theme + mode
7
+ automatically. Component-intrinsic rules work standalone; shell-context
8
+ rules (the history rail width, composer inset, scroll) are scoped under
9
+ [data-chat-shell]. Per-style files may override for flavor. */
10
+
11
+ /* ─── ChatMessage: avatar + bubble row ──────────────────────────────── */
12
+ [data-chat-message] {
13
+ display: flex;
14
+ align-items: flex-start;
15
+ gap: 12px;
16
+ }
17
+
18
+ [data-chat-bubble] {
19
+ flex: 1;
20
+ min-width: 0;
21
+ display: flex;
22
+ flex-direction: column;
23
+ }
24
+
25
+ [data-chat-body] {
26
+ font: 400 14px/1.55 var(--font-ui);
27
+ color: var(--ink);
28
+ }
29
+
30
+ [data-chat-message][data-role='user'] [data-chat-body] {
31
+ font-family: var(--font-display, var(--font-ui));
32
+ font-size: 16px;
33
+ line-height: 1.4;
34
+ letter-spacing: -0.005em;
35
+ }
36
+
37
+ /* Inline-code chips in prose — but NOT inside a CodeBlock's <pre><code>. */
38
+ [data-chat-body] code:not([data-code-block] code) {
39
+ font: 500 12px var(--font-mono);
40
+ padding: 1px 6px;
41
+ border: 1px solid var(--paper-edge);
42
+ border-radius: 4px;
43
+ background: var(--paper-soft);
44
+ color: var(--ink-mute);
45
+ }
46
+
47
+ [data-chat-time] {
48
+ margin-top: 6px;
49
+ font: 500 10.5px var(--font-mono);
50
+ color: var(--ink-soft);
51
+ letter-spacing: 0.04em;
52
+ }
53
+
54
+ /* Streaming caret (data-status='streaming' on the message). */
55
+ [data-chat-caret] {
56
+ display: inline-block;
57
+ width: 7px;
58
+ height: 1.05em;
59
+ margin-left: 3px;
60
+ vertical-align: text-bottom;
61
+ background: var(--accent);
62
+ border-radius: 1px;
63
+ animation: rokkit-chat-caret 1s steps(2, start) infinite;
64
+ }
65
+
66
+ @keyframes rokkit-chat-caret {
67
+ to {
68
+ opacity: 0;
69
+ }
70
+ }
71
+
72
+ /* ─── ChatTimeline: message list ────────────────────────────────────── */
73
+ [data-chat-timeline] {
74
+ flex: 1;
75
+ min-height: 0;
76
+ overflow-y: auto;
77
+ display: flex;
78
+ flex-direction: column;
79
+ gap: 22px;
80
+ padding: 24px 20px;
81
+ }
82
+
83
+ /* ─── ChatComposer: input card ──────────────────────────────────────── */
84
+ [data-chat-composer] {
85
+ flex-shrink: 0;
86
+ display: flex;
87
+ flex-direction: column;
88
+ gap: 8px;
89
+ padding: 10px 12px;
90
+ background: var(--paper-soft);
91
+ /* Match the standard input chrome: a subtle paper-mute hairline at rest,
92
+ darkening to ink-soft on focus — NOT paper-edge (the near-black etched
93
+ edge in dark mode, which reads as a heavy border). */
94
+ border: 1px solid var(--paper-mute);
95
+ border-radius: 10px;
96
+ transition: border-color 120ms ease;
97
+ }
98
+
99
+ /* Single, calm focus affordance — just darken the border (no ring), exactly
100
+ like [data-input-root]:focus-within. */
101
+ [data-chat-composer]:focus-within {
102
+ border-color: var(--ink-soft);
103
+ }
104
+
105
+ /* Disabled — mirror the input disabled treatment (dim + not-allowed). */
106
+ [data-chat-composer]:has([data-chat-input]:disabled) {
107
+ opacity: 0.55;
108
+ }
109
+
110
+ [data-chat-input]:disabled {
111
+ cursor: not-allowed;
112
+ }
113
+
114
+ [data-chat-input] {
115
+ width: 100%;
116
+ min-height: 22px;
117
+ max-height: 160px;
118
+ padding: 0;
119
+ border: 0;
120
+ outline: none;
121
+ background: transparent;
122
+ resize: none;
123
+ font: 400 14px/1.45 var(--font-ui);
124
+ color: var(--ink);
125
+ }
126
+
127
+ [data-chat-input]::placeholder {
128
+ color: var(--ink-soft);
129
+ }
130
+
131
+ [data-chat-composer][data-busy] [data-chat-input] {
132
+ opacity: 0.7;
133
+ }
134
+
135
+ /* ─── ChatHistory: conversation rail ────────────────────────────────── */
136
+ [data-chat-history] {
137
+ display: flex;
138
+ flex-direction: column;
139
+ min-height: 0;
140
+ overflow-y: auto;
141
+ padding: 8px;
142
+ background: var(--paper);
143
+ color: var(--ink);
144
+ }
145
+
146
+ [data-chat-history-new] {
147
+ display: inline-flex;
148
+ align-items: center;
149
+ gap: 8px;
150
+ height: 32px;
151
+ padding: 0 10px;
152
+ margin-bottom: 6px;
153
+ border: 1px solid var(--paper-edge);
154
+ border-radius: 6px;
155
+ background: var(--paper-soft);
156
+ color: var(--ink);
157
+ font: 500 12.5px var(--font-ui);
158
+ cursor: pointer;
159
+ }
160
+
161
+ [data-chat-history-new]:hover {
162
+ border-color: var(--ink-soft);
163
+ background: var(--paper);
164
+ }
165
+
166
+ [data-chat-history-row] {
167
+ display: flex;
168
+ align-items: center;
169
+ border-radius: 6px;
170
+ }
171
+
172
+ [data-chat-history-row]:hover {
173
+ background: var(--paper-soft);
174
+ }
175
+
176
+ [data-chat-history-row][data-active] {
177
+ background: var(--paper-mute);
178
+ }
179
+
180
+ [data-chat-history-item] {
181
+ flex: 1;
182
+ min-width: 0;
183
+ display: flex;
184
+ align-items: center;
185
+ gap: 8px;
186
+ padding: 7px 8px;
187
+ border: 0;
188
+ background: transparent;
189
+ color: var(--ink-mute);
190
+ cursor: pointer;
191
+ text-align: left;
192
+ font-family: var(--font-ui);
193
+ }
194
+
195
+ [data-chat-history-row][data-active] [data-chat-history-item] {
196
+ color: var(--ink);
197
+ }
198
+
199
+ [data-chat-history-title] {
200
+ flex: 1;
201
+ min-width: 0;
202
+ font: 450 12.5px var(--font-ui);
203
+ overflow: hidden;
204
+ text-overflow: ellipsis;
205
+ white-space: nowrap;
206
+ }
207
+
208
+ [data-chat-history-time] {
209
+ flex-shrink: 0;
210
+ font: 500 10px var(--font-mono);
211
+ color: var(--ink-soft);
212
+ }
213
+
214
+ [data-chat-history-delete] {
215
+ flex-shrink: 0;
216
+ width: 24px;
217
+ height: 24px;
218
+ display: grid;
219
+ place-items: center;
220
+ border: 0;
221
+ background: transparent;
222
+ color: var(--ink-soft);
223
+ border-radius: 4px;
224
+ cursor: pointer;
225
+ opacity: 0;
226
+ }
227
+
228
+ [data-chat-history-row]:hover [data-chat-history-delete] {
229
+ opacity: 1;
230
+ }
231
+
232
+ [data-chat-history-delete]:hover {
233
+ background: var(--paper-mute);
234
+ color: var(--ink);
235
+ }
236
+
237
+ /* ─── ChatShell: history rail + main column ─────────────────────────── */
238
+ [data-chat-shell] {
239
+ display: flex;
240
+ min-height: 0;
241
+ background: var(--paper);
242
+ color: var(--ink);
243
+ }
244
+
245
+ [data-chat-main] {
246
+ flex: 1;
247
+ min-width: 0;
248
+ min-height: 0;
249
+ display: flex;
250
+ flex-direction: column;
251
+ }
252
+
253
+ /* Rail chrome only applies inside the shell — a standalone ChatHistory
254
+ fills its own container instead of imposing a fixed rail width. */
255
+ [data-chat-shell] [data-chat-history] {
256
+ width: 280px;
257
+ flex-shrink: 0;
258
+ border-right: 1px solid var(--paper-edge);
259
+ }
260
+
261
+ /* Inset the composer from the column edges inside the shell. */
262
+ [data-chat-main] [data-chat-composer] {
263
+ margin: 0 20px 20px;
264
+ }
@@ -31,6 +31,34 @@
31
31
  min-width: 0;
32
32
  }
33
33
 
34
+ /* Contrast-critical (applies to every style): the status soft-bg is a fixed
35
+ light tint that does NOT flip in dark mode, so the body text must be a fixed
36
+ DARK tone to stay readable. Darken the status hue toward black — keeps the
37
+ colour identity and reaches WCAG AA on the light tint in both modes. The
38
+ icon / border keep the vibrant status-500.
39
+
40
+ The same darkened tone is also set on the ROOT (not just [data-message-text]):
41
+ the root's `color` is the inherited default for any banner text, and the
42
+ styles set the vibrant `text-{status}` on the root — which fails AA on the
43
+ light soft-bg. The vibrant icon/dismiss keep their own higher-specificity
44
+ `text-{status}` rules, so this only re-tones the readable copy. */
45
+ [data-message-root][data-type='error'],
46
+ [data-message-root][data-type='error'] [data-message-text] {
47
+ color: color-mix(in oklch, var(--error) 55%, black);
48
+ }
49
+ [data-message-root][data-type='warning'],
50
+ [data-message-root][data-type='warning'] [data-message-text] {
51
+ color: color-mix(in oklch, var(--warning) 55%, black);
52
+ }
53
+ [data-message-root][data-type='info'],
54
+ [data-message-root][data-type='info'] [data-message-text] {
55
+ color: color-mix(in oklch, var(--info) 55%, black);
56
+ }
57
+ [data-message-root][data-type='success'],
58
+ [data-message-root][data-type='success'] [data-message-text] {
59
+ color: color-mix(in oklch, var(--success) 55%, black);
60
+ }
61
+
34
62
  [data-message-actions] {
35
63
  display: flex;
36
64
  align-items: center;
package/dist/base.css CHANGED
@@ -6013,6 +6013,34 @@ button[data-step-number] {
6013
6013
  min-width: 0;
6014
6014
  }
6015
6015
 
6016
+ /* Contrast-critical (applies to every style): the status soft-bg is a fixed
6017
+ light tint that does NOT flip in dark mode, so the body text must be a fixed
6018
+ DARK tone to stay readable. Darken the status hue toward black — keeps the
6019
+ colour identity and reaches WCAG AA on the light tint in both modes. The
6020
+ icon / border keep the vibrant status-500.
6021
+
6022
+ The same darkened tone is also set on the ROOT (not just [data-message-text]):
6023
+ the root's `color` is the inherited default for any banner text, and the
6024
+ styles set the vibrant `text-{status}` on the root — which fails AA on the
6025
+ light soft-bg. The vibrant icon/dismiss keep their own higher-specificity
6026
+ `text-{status}` rules, so this only re-tones the readable copy. */
6027
+ [data-message-root][data-type='error'],
6028
+ [data-message-root][data-type='error'] [data-message-text] {
6029
+ color: color-mix(in oklch, var(--error) 55%, black);
6030
+ }
6031
+ [data-message-root][data-type='warning'],
6032
+ [data-message-root][data-type='warning'] [data-message-text] {
6033
+ color: color-mix(in oklch, var(--warning) 55%, black);
6034
+ }
6035
+ [data-message-root][data-type='info'],
6036
+ [data-message-root][data-type='info'] [data-message-text] {
6037
+ color: color-mix(in oklch, var(--info) 55%, black);
6038
+ }
6039
+ [data-message-root][data-type='success'],
6040
+ [data-message-root][data-type='success'] [data-message-text] {
6041
+ color: color-mix(in oklch, var(--success) 55%, black);
6042
+ }
6043
+
6016
6044
  [data-message-actions] {
6017
6045
  display: flex;
6018
6046
  align-items: center;
@@ -6043,6 +6071,271 @@ button[data-step-number] {
6043
6071
  opacity: 1;
6044
6072
  }
6045
6073
 
6074
+ /* Chat — structural + neutral styling for the @rokkit/ui chat components
6075
+ (ChatShell / ChatHistory / ChatTimeline / ChatMessage / ChatComposer).
6076
+
6077
+ The components are headless and emit data-* hooks only; this file owns
6078
+ their visual treatment using the Rokkit named-token vocabulary
6079
+ (--paper, --ink, --accent, …) so it adapts to every theme + mode
6080
+ automatically. Component-intrinsic rules work standalone; shell-context
6081
+ rules (the history rail width, composer inset, scroll) are scoped under
6082
+ [data-chat-shell]. Per-style files may override for flavor. */
6083
+
6084
+ /* ─── ChatMessage: avatar + bubble row ──────────────────────────────── */
6085
+ [data-chat-message] {
6086
+ display: flex;
6087
+ align-items: flex-start;
6088
+ gap: 12px;
6089
+ }
6090
+
6091
+ [data-chat-bubble] {
6092
+ flex: 1;
6093
+ min-width: 0;
6094
+ display: flex;
6095
+ flex-direction: column;
6096
+ }
6097
+
6098
+ [data-chat-body] {
6099
+ font: 400 14px/1.55 var(--font-ui);
6100
+ color: var(--ink);
6101
+ }
6102
+
6103
+ [data-chat-message][data-role='user'] [data-chat-body] {
6104
+ font-family: var(--font-display, var(--font-ui));
6105
+ font-size: 16px;
6106
+ line-height: 1.4;
6107
+ letter-spacing: -0.005em;
6108
+ }
6109
+
6110
+ /* Inline-code chips in prose — but NOT inside a CodeBlock's <pre><code>. */
6111
+ [data-chat-body] code:not([data-code-block] code) {
6112
+ font: 500 12px var(--font-mono);
6113
+ padding: 1px 6px;
6114
+ border: 1px solid var(--paper-edge);
6115
+ border-radius: 4px;
6116
+ background: var(--paper-soft);
6117
+ color: var(--ink-mute);
6118
+ }
6119
+
6120
+ [data-chat-time] {
6121
+ margin-top: 6px;
6122
+ font: 500 10.5px var(--font-mono);
6123
+ color: var(--ink-soft);
6124
+ letter-spacing: 0.04em;
6125
+ }
6126
+
6127
+ /* Streaming caret (data-status='streaming' on the message). */
6128
+ [data-chat-caret] {
6129
+ display: inline-block;
6130
+ width: 7px;
6131
+ height: 1.05em;
6132
+ margin-left: 3px;
6133
+ vertical-align: text-bottom;
6134
+ background: var(--accent);
6135
+ border-radius: 1px;
6136
+ animation: rokkit-chat-caret 1s steps(2, start) infinite;
6137
+ }
6138
+
6139
+ @keyframes rokkit-chat-caret {
6140
+ to {
6141
+ opacity: 0;
6142
+ }
6143
+ }
6144
+
6145
+ /* ─── ChatTimeline: message list ────────────────────────────────────── */
6146
+ [data-chat-timeline] {
6147
+ flex: 1;
6148
+ min-height: 0;
6149
+ overflow-y: auto;
6150
+ display: flex;
6151
+ flex-direction: column;
6152
+ gap: 22px;
6153
+ padding: 24px 20px;
6154
+ }
6155
+
6156
+ /* ─── ChatComposer: input card ──────────────────────────────────────── */
6157
+ [data-chat-composer] {
6158
+ flex-shrink: 0;
6159
+ display: flex;
6160
+ flex-direction: column;
6161
+ gap: 8px;
6162
+ padding: 10px 12px;
6163
+ background: var(--paper-soft);
6164
+ /* Match the standard input chrome: a subtle paper-mute hairline at rest,
6165
+ darkening to ink-soft on focus — NOT paper-edge (the near-black etched
6166
+ edge in dark mode, which reads as a heavy border). */
6167
+ border: 1px solid var(--paper-mute);
6168
+ border-radius: 10px;
6169
+ transition: border-color 120ms ease;
6170
+ }
6171
+
6172
+ /* Single, calm focus affordance — just darken the border (no ring), exactly
6173
+ like [data-input-root]:focus-within. */
6174
+ [data-chat-composer]:focus-within {
6175
+ border-color: var(--ink-soft);
6176
+ }
6177
+
6178
+ /* Disabled — mirror the input disabled treatment (dim + not-allowed). */
6179
+ [data-chat-composer]:has([data-chat-input]:disabled) {
6180
+ opacity: 0.55;
6181
+ }
6182
+
6183
+ [data-chat-input]:disabled {
6184
+ cursor: not-allowed;
6185
+ }
6186
+
6187
+ [data-chat-input] {
6188
+ width: 100%;
6189
+ min-height: 22px;
6190
+ max-height: 160px;
6191
+ padding: 0;
6192
+ border: 0;
6193
+ outline: none;
6194
+ background: transparent;
6195
+ resize: none;
6196
+ font: 400 14px/1.45 var(--font-ui);
6197
+ color: var(--ink);
6198
+ }
6199
+
6200
+ [data-chat-input]::placeholder {
6201
+ color: var(--ink-soft);
6202
+ }
6203
+
6204
+ [data-chat-composer][data-busy] [data-chat-input] {
6205
+ opacity: 0.7;
6206
+ }
6207
+
6208
+ /* ─── ChatHistory: conversation rail ────────────────────────────────── */
6209
+ [data-chat-history] {
6210
+ display: flex;
6211
+ flex-direction: column;
6212
+ min-height: 0;
6213
+ overflow-y: auto;
6214
+ padding: 8px;
6215
+ background: var(--paper);
6216
+ color: var(--ink);
6217
+ }
6218
+
6219
+ [data-chat-history-new] {
6220
+ display: inline-flex;
6221
+ align-items: center;
6222
+ gap: 8px;
6223
+ height: 32px;
6224
+ padding: 0 10px;
6225
+ margin-bottom: 6px;
6226
+ border: 1px solid var(--paper-edge);
6227
+ border-radius: 6px;
6228
+ background: var(--paper-soft);
6229
+ color: var(--ink);
6230
+ font: 500 12.5px var(--font-ui);
6231
+ cursor: pointer;
6232
+ }
6233
+
6234
+ [data-chat-history-new]:hover {
6235
+ border-color: var(--ink-soft);
6236
+ background: var(--paper);
6237
+ }
6238
+
6239
+ [data-chat-history-row] {
6240
+ display: flex;
6241
+ align-items: center;
6242
+ border-radius: 6px;
6243
+ }
6244
+
6245
+ [data-chat-history-row]:hover {
6246
+ background: var(--paper-soft);
6247
+ }
6248
+
6249
+ [data-chat-history-row][data-active] {
6250
+ background: var(--paper-mute);
6251
+ }
6252
+
6253
+ [data-chat-history-item] {
6254
+ flex: 1;
6255
+ min-width: 0;
6256
+ display: flex;
6257
+ align-items: center;
6258
+ gap: 8px;
6259
+ padding: 7px 8px;
6260
+ border: 0;
6261
+ background: transparent;
6262
+ color: var(--ink-mute);
6263
+ cursor: pointer;
6264
+ text-align: left;
6265
+ font-family: var(--font-ui);
6266
+ }
6267
+
6268
+ [data-chat-history-row][data-active] [data-chat-history-item] {
6269
+ color: var(--ink);
6270
+ }
6271
+
6272
+ [data-chat-history-title] {
6273
+ flex: 1;
6274
+ min-width: 0;
6275
+ font: 450 12.5px var(--font-ui);
6276
+ overflow: hidden;
6277
+ text-overflow: ellipsis;
6278
+ white-space: nowrap;
6279
+ }
6280
+
6281
+ [data-chat-history-time] {
6282
+ flex-shrink: 0;
6283
+ font: 500 10px var(--font-mono);
6284
+ color: var(--ink-soft);
6285
+ }
6286
+
6287
+ [data-chat-history-delete] {
6288
+ flex-shrink: 0;
6289
+ width: 24px;
6290
+ height: 24px;
6291
+ display: grid;
6292
+ place-items: center;
6293
+ border: 0;
6294
+ background: transparent;
6295
+ color: var(--ink-soft);
6296
+ border-radius: 4px;
6297
+ cursor: pointer;
6298
+ opacity: 0;
6299
+ }
6300
+
6301
+ [data-chat-history-row]:hover [data-chat-history-delete] {
6302
+ opacity: 1;
6303
+ }
6304
+
6305
+ [data-chat-history-delete]:hover {
6306
+ background: var(--paper-mute);
6307
+ color: var(--ink);
6308
+ }
6309
+
6310
+ /* ─── ChatShell: history rail + main column ─────────────────────────── */
6311
+ [data-chat-shell] {
6312
+ display: flex;
6313
+ min-height: 0;
6314
+ background: var(--paper);
6315
+ color: var(--ink);
6316
+ }
6317
+
6318
+ [data-chat-main] {
6319
+ flex: 1;
6320
+ min-width: 0;
6321
+ min-height: 0;
6322
+ display: flex;
6323
+ flex-direction: column;
6324
+ }
6325
+
6326
+ /* Rail chrome only applies inside the shell — a standalone ChatHistory
6327
+ fills its own container instead of imposing a fixed rail width. */
6328
+ [data-chat-shell] [data-chat-history] {
6329
+ width: 280px;
6330
+ flex-shrink: 0;
6331
+ border-right: 1px solid var(--paper-edge);
6332
+ }
6333
+
6334
+ /* Inset the composer from the column edges inside the shell. */
6335
+ [data-chat-main] [data-chat-composer] {
6336
+ margin: 0 20px 20px;
6337
+ }
6338
+
6046
6339
  /* AlertList — base structural styles for the fixed toast container */
6047
6340
 
6048
6341
  [data-alert-list] {
@@ -21,9 +21,15 @@
21
21
  0 2px 8px rgba(0, 0, 0, 0.08);
22
22
  }
23
23
 
24
+ /* Filled frosted variants use a translucent fill (bg-X/60) that composites
25
+ over the page, so the effective fill is a diluted tint that flips light/dark
26
+ with the mode. The auto on-color (computed against the full-opacity status
27
+ 500) is wrong for the diluted fill — near-black on the dark dilution only
28
+ reaches ~2.4:1. ink flips with the mode and clears AA on both poles
29
+ (~6.2:1 dark, ~7.8:1 light). */
24
30
  [data-style='frosted'] [data-button][data-style='default'][data-variant='primary'],
25
31
  [data-style='frosted'] [data-button]:not([data-style])[data-variant='primary'] {
26
- border-width:1px;background-color:color-mix(in srgb, var(--color-primary) calc(0.6 * 100%), transparent);--un-backdrop-blur:blur(24px);-webkit-backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);color:var(--on-primary);
32
+ border-width:1px;background-color:color-mix(in srgb, var(--color-primary) calc(0.6 * 100%), transparent);--un-backdrop-blur:blur(24px);-webkit-backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);color:var(--ink);
27
33
  border-color: rgba(255, 255, 255, 0.25);
28
34
  box-shadow:
29
35
  inset 0 1px 0 rgba(255, 255, 255, 0.25),
@@ -32,7 +38,7 @@
32
38
 
33
39
  [data-style='frosted'] [data-button][data-style='default'][data-variant='secondary'],
34
40
  [data-style='frosted'] [data-button]:not([data-style])[data-variant='secondary'] {
35
- border-width:1px;background-color:color-mix(in srgb, var(--color-accent) calc(0.6 * 100%), transparent);--un-backdrop-blur:blur(24px);-webkit-backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);color:var(--on-primary);
41
+ border-width:1px;background-color:color-mix(in srgb, var(--color-accent) calc(0.6 * 100%), transparent);--un-backdrop-blur:blur(24px);-webkit-backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);color:var(--ink);
36
42
  border-color: rgba(255, 255, 255, 0.25);
37
43
  box-shadow:
38
44
  inset 0 1px 0 rgba(255, 255, 255, 0.25),
@@ -41,7 +47,7 @@
41
47
 
42
48
  [data-style='frosted'] [data-button][data-style='default'][data-variant='accent'],
43
49
  [data-style='frosted'] [data-button]:not([data-style])[data-variant='accent'] {
44
- border-width:1px;background-color:color-mix(in srgb, var(--color-accent) calc(0.6 * 100%), transparent);--un-text-opacity:1;color:rgb(22 22 22 / var(--un-text-opacity));--un-backdrop-blur:blur(24px);-webkit-backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);
50
+ border-width:1px;background-color:color-mix(in srgb, var(--color-accent) calc(0.6 * 100%), transparent);--un-backdrop-blur:blur(24px);-webkit-backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);color:var(--ink);
45
51
  border-color: rgba(255, 255, 255, 0.25);
46
52
  box-shadow:
47
53
  inset 0 1px 0 rgba(255, 255, 255, 0.25),
@@ -50,7 +56,7 @@
50
56
 
51
57
  [data-style='frosted'] [data-button][data-style='default'][data-variant='danger'],
52
58
  [data-style='frosted'] [data-button]:not([data-style])[data-variant='danger'] {
53
- border-width:1px;background-color:color-mix(in srgb, var(--color-danger) calc(0.6 * 100%), transparent);--un-text-opacity:1;color:rgb(22 22 22 / var(--un-text-opacity));--un-backdrop-blur:blur(24px);-webkit-backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);
59
+ border-width:1px;background-color:color-mix(in srgb, var(--color-danger) calc(0.6 * 100%), transparent);--un-backdrop-blur:blur(24px);-webkit-backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);color:var(--ink);
54
60
  border-color: rgba(255, 255, 255, 0.25);
55
61
  box-shadow:
56
62
  inset 0 1px 0 rgba(255, 255, 255, 0.25),
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  [data-style='frosted'] [data-message-root][data-type='error'] {
6
- border-color:color-mix(in srgb, var(--color-error) calc(0.4 * 100%), transparent);--un-backdrop-blur:blur(4px);-webkit-backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);color:var(--error);
6
+ border-color:color-mix(in srgb, var(--color-error) calc(0.4 * 100%), transparent);--un-backdrop-blur:blur(4px);-webkit-backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);
7
7
  background-color: var(--error-soft);
8
8
  }
9
9
  [data-style='frosted'] [data-message-root][data-type='error'] [data-message-icon],
@@ -12,7 +12,7 @@
12
12
  }
13
13
 
14
14
  [data-style='frosted'] [data-message-root][data-type='warning'] {
15
- border-color:color-mix(in srgb, var(--color-warning) calc(0.4 * 100%), transparent);--un-backdrop-blur:blur(4px);-webkit-backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);color:var(--warning);
15
+ border-color:color-mix(in srgb, var(--color-warning) calc(0.4 * 100%), transparent);--un-backdrop-blur:blur(4px);-webkit-backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);
16
16
  background-color: var(--warning-soft);
17
17
  }
18
18
  [data-style='frosted'] [data-message-root][data-type='warning'] [data-message-icon],
@@ -21,7 +21,7 @@
21
21
  }
22
22
 
23
23
  [data-style='frosted'] [data-message-root][data-type='info'] {
24
- border-color:color-mix(in srgb, var(--color-info) calc(0.4 * 100%), transparent);--un-backdrop-blur:blur(4px);-webkit-backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);color:var(--info);
24
+ border-color:color-mix(in srgb, var(--color-info) calc(0.4 * 100%), transparent);--un-backdrop-blur:blur(4px);-webkit-backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);
25
25
  background-color: var(--info-soft);
26
26
  }
27
27
  [data-style='frosted'] [data-message-root][data-type='info'] [data-message-icon],
@@ -30,7 +30,7 @@
30
30
  }
31
31
 
32
32
  [data-style='frosted'] [data-message-root][data-type='success'] {
33
- border-color:color-mix(in srgb, var(--color-success) calc(0.4 * 100%), transparent);--un-backdrop-blur:blur(4px);-webkit-backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);color:var(--success);
33
+ border-color:color-mix(in srgb, var(--color-success) calc(0.4 * 100%), transparent);--un-backdrop-blur:blur(4px);-webkit-backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);backdrop-filter:var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia);
34
34
  background-color: var(--success-soft);
35
35
  }
36
36
  [data-style='frosted'] [data-message-root][data-type='success'] [data-message-icon],