fauna-api 0.0.0-stage → 1.0.676

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 (171) hide show
  1. package/dist/brands.d.ts +2 -0
  2. package/dist/brands.js +2 -0
  3. package/dist/index.d.ts +64 -0
  4. package/dist/index.js +121 -0
  5. package/dist/src/ant/chat.d.ts +130 -0
  6. package/dist/src/ant/chat.js +467 -0
  7. package/dist/src/ant/format.d.ts +40 -0
  8. package/dist/src/ant/format.js +143 -0
  9. package/dist/src/ant/graph.d.ts +130 -0
  10. package/dist/src/ant/graph.js +449 -0
  11. package/dist/src/ant/index.d.ts +16 -0
  12. package/dist/src/ant/index.js +61 -0
  13. package/dist/src/ant/persona.d.ts +151 -0
  14. package/dist/src/ant/persona.js +136 -0
  15. package/dist/src/ant/timeline.d.ts +283 -0
  16. package/dist/src/ant/timeline.js +1025 -0
  17. package/dist/src/authentification.d.ts +45 -0
  18. package/dist/src/authentification.js +194 -0
  19. package/dist/src/billing.d.ts +135 -0
  20. package/dist/src/billing.js +128 -0
  21. package/dist/src/calendar.d.ts +83 -0
  22. package/dist/src/calendar.js +133 -0
  23. package/dist/src/chats.d.ts +113 -0
  24. package/dist/src/chats.js +100 -0
  25. package/dist/src/cicada/contacts.d.ts +31 -0
  26. package/dist/src/cicada/contacts.js +28 -0
  27. package/dist/src/cicada/conversations.d.ts +73 -0
  28. package/dist/src/cicada/conversations.js +236 -0
  29. package/dist/src/cicada/inboxes.d.ts +48 -0
  30. package/dist/src/cicada/inboxes.js +82 -0
  31. package/dist/src/cicada/index.d.ts +16 -0
  32. package/dist/src/cicada/index.js +61 -0
  33. package/dist/src/cicada/phone.d.ts +48 -0
  34. package/dist/src/cicada/phone.js +306 -0
  35. package/dist/src/drive.d.ts +80 -0
  36. package/dist/src/drive.js +472 -0
  37. package/dist/src/extensions/index.d.ts +4 -0
  38. package/dist/src/extensions/index.js +5 -0
  39. package/dist/src/extensions/web/index.d.ts +6 -0
  40. package/dist/src/extensions/web/index.js +7 -0
  41. package/dist/src/extensions/web/session.d.ts +106 -0
  42. package/dist/src/extensions/web/session.js +469 -0
  43. package/dist/src/extensions/web/tools.d.ts +13 -0
  44. package/dist/src/extensions/web/tools.js +72 -0
  45. package/dist/src/friends.d.ts +39 -0
  46. package/dist/src/friends.js +119 -0
  47. package/dist/src/groups.d.ts +82 -0
  48. package/dist/src/groups.js +269 -0
  49. package/dist/src/inbox.d.ts +11 -0
  50. package/dist/src/inbox.js +35 -0
  51. package/dist/src/integrations.d.ts +52 -0
  52. package/dist/src/integrations.js +205 -0
  53. package/dist/src/magpie/explorer.d.ts +14 -0
  54. package/dist/src/magpie/explorer.js +36 -0
  55. package/dist/src/magpie/index.d.ts +16 -0
  56. package/dist/src/magpie/index.js +61 -0
  57. package/dist/src/magpie/portfolio.d.ts +52 -0
  58. package/dist/src/magpie/portfolio.js +179 -0
  59. package/dist/src/magpie/quotes.d.ts +35 -0
  60. package/dist/src/magpie/quotes.js +47 -0
  61. package/dist/src/magpie/room.d.ts +61 -0
  62. package/dist/src/magpie/room.js +238 -0
  63. package/dist/src/maps.d.ts +159 -0
  64. package/dist/src/maps.js +171 -0
  65. package/dist/src/marmot/browser.d.ts +139 -0
  66. package/dist/src/marmot/browser.js +389 -0
  67. package/dist/src/marmot/index.d.ts +20 -0
  68. package/dist/src/marmot/index.js +65 -0
  69. package/dist/src/marmot/media.d.ts +56 -0
  70. package/dist/src/marmot/media.js +265 -0
  71. package/dist/src/marmot/research.d.ts +337 -0
  72. package/dist/src/marmot/research.js +1138 -0
  73. package/dist/src/marmot/scraper.d.ts +59 -0
  74. package/dist/src/marmot/scraper.js +94 -0
  75. package/dist/src/marmot/web.d.ts +402 -0
  76. package/dist/src/marmot/web.js +2586 -0
  77. package/dist/src/marmot/workspace.d.ts +81 -0
  78. package/dist/src/marmot/workspace.js +263 -0
  79. package/dist/src/parrot/agent.d.ts +53 -0
  80. package/dist/src/parrot/agent.js +93 -0
  81. package/dist/src/parrot/chat.d.ts +84 -0
  82. package/dist/src/parrot/chat.js +237 -0
  83. package/dist/src/parrot/format.d.ts +128 -0
  84. package/dist/src/parrot/format.js +639 -0
  85. package/dist/src/parrot/generative.d.ts +261 -0
  86. package/dist/src/parrot/generative.js +185 -0
  87. package/dist/src/parrot/index.d.ts +22 -0
  88. package/dist/src/parrot/index.js +67 -0
  89. package/dist/src/parrot/room.d.ts +225 -0
  90. package/dist/src/parrot/room.js +466 -0
  91. package/dist/src/parrot/routing.d.ts +90 -0
  92. package/dist/src/parrot/routing.js +78 -0
  93. package/dist/src/parrot/share.d.ts +126 -0
  94. package/dist/src/parrot/share.js +261 -0
  95. package/dist/src/parrot/socket.d.ts +41 -0
  96. package/dist/src/parrot/socket.js +478 -0
  97. package/dist/src/payments.d.ts +73 -0
  98. package/dist/src/payments.js +107 -0
  99. package/dist/src/private/cards.css +75 -0
  100. package/dist/src/rooms.d.ts +76 -0
  101. package/dist/src/rooms.js +168 -0
  102. package/dist/src/shared/schema.d.ts +24 -0
  103. package/dist/src/shared/schema.js +1 -0
  104. package/dist/src/shared/server.d.ts +65 -0
  105. package/dist/src/shared/server.js +302 -0
  106. package/dist/src/termite/environment.d.ts +110 -0
  107. package/dist/src/termite/environment.js +263 -0
  108. package/dist/src/termite/index.d.ts +14 -0
  109. package/dist/src/termite/index.js +59 -0
  110. package/dist/src/termite/os.d.ts +326 -0
  111. package/dist/src/termite/os.js +572 -0
  112. package/dist/src/termite/versioning.d.ts +94 -0
  113. package/dist/src/termite/versioning.js +217 -0
  114. package/dist/src/tickets.d.ts +43 -0
  115. package/dist/src/tickets.js +138 -0
  116. package/dist/src/travel.d.ts +85 -0
  117. package/dist/src/travel.js +44 -0
  118. package/dist/src/ui/authentification.d.ts +24 -0
  119. package/dist/src/ui/authentification.js +177 -0
  120. package/dist/src/ui/brands.css +11 -0
  121. package/dist/src/ui/brands.d.ts +7 -0
  122. package/dist/src/ui/brands.js +14 -0
  123. package/dist/src/ui/browser.d.ts +74 -0
  124. package/dist/src/ui/browser.js +470 -0
  125. package/dist/src/ui/chat.d.ts +183 -0
  126. package/dist/src/ui/chat.js +2379 -0
  127. package/dist/src/ui/chatPanel.d.ts +109 -0
  128. package/dist/src/ui/chatPanel.js +768 -0
  129. package/dist/src/ui/chatSequence.d.ts +36 -0
  130. package/dist/src/ui/chatSequence.js +42 -0
  131. package/dist/src/ui/crown.d.ts +19 -0
  132. package/dist/src/ui/crown.js +199 -0
  133. package/dist/src/ui/cursor.d.ts +73 -0
  134. package/dist/src/ui/cursor.js +175 -0
  135. package/dist/src/ui/device.d.ts +33 -0
  136. package/dist/src/ui/device.js +49 -0
  137. package/dist/src/ui/drive.d.ts +69 -0
  138. package/dist/src/ui/drive.js +1243 -0
  139. package/dist/src/ui/generative.d.ts +39 -0
  140. package/dist/src/ui/generative.js +313 -0
  141. package/dist/src/ui/hover.d.ts +6 -0
  142. package/dist/src/ui/hover.js +210 -0
  143. package/dist/src/ui/index.d.ts +42 -0
  144. package/dist/src/ui/index.js +87 -0
  145. package/dist/src/ui/integrations.d.ts +13 -0
  146. package/dist/src/ui/integrations.js +175 -0
  147. package/dist/src/ui/maps.d.ts +87 -0
  148. package/dist/src/ui/maps.js +547 -0
  149. package/dist/src/ui/roster.d.ts +32 -0
  150. package/dist/src/ui/roster.js +163 -0
  151. package/dist/src/ui/talk.d.ts +12 -0
  152. package/dist/src/ui/talk.js +560 -0
  153. package/dist/src/ui/tickets.d.ts +13 -0
  154. package/dist/src/ui/tickets.js +966 -0
  155. package/dist/src/ui/toast.d.ts +7 -0
  156. package/dist/src/ui/toast.js +258 -0
  157. package/dist/src/ui/tokenText.d.ts +18 -0
  158. package/dist/src/ui/tokenText.js +96 -0
  159. package/dist/src/ui/tokenized.d.ts +42 -0
  160. package/dist/src/ui/tokenized.js +622 -0
  161. package/dist/src/ui/ui.css +4763 -0
  162. package/dist/src/ui/view.d.ts +23 -0
  163. package/dist/src/ui/view.js +584 -0
  164. package/dist/src/view.d.ts +113 -0
  165. package/dist/src/view.js +386 -0
  166. package/dist/src/webhooks.d.ts +66 -0
  167. package/dist/src/webhooks.js +78 -0
  168. package/dist/ui.d.ts +1 -0
  169. package/dist/ui.js +1 -0
  170. package/package.json +89 -6
  171. package/README.md +0 -3
@@ -0,0 +1,4763 @@
1
+ /* File — list row (modern card) */
2
+ .file-list {
3
+ position: relative;
4
+
5
+ display: flex;
6
+ align-items: stretch;
7
+
8
+ border: 1px solid rgba(247, 239, 138, 0.10);
9
+ border-radius: 10px;
10
+
11
+ padding: 6px 12px;
12
+
13
+ background: rgba(24, 27, 30, 0.9);
14
+
15
+ box-sizing: border-box;
16
+
17
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
18
+
19
+ transition: background-color 0.18s ease, border-color 0.18s ease, box-shadow 0.18s ease, transform 0.18s ease;
20
+ }
21
+ .file-list:hover {
22
+ background: rgba(28, 31, 34, 0.96);
23
+ border-color: rgba(247, 239, 138, 0.42);
24
+ box-shadow: 0 8px 26px -14px rgba(247, 239, 138, 0.32);
25
+ }
26
+
27
+ /* File — cozy card */
28
+ .file-cozy {
29
+ position: relative;
30
+
31
+ display: flex;
32
+ flex-direction: column;
33
+ justify-content: flex-end;
34
+
35
+ aspect-ratio: 1/1;
36
+
37
+ border: 1px solid rgba(247, 239, 138, 0.12);
38
+ border-radius: 2px;
39
+
40
+ background: rgba(24, 27, 30, 0.9);
41
+
42
+ overflow: hidden;
43
+
44
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
45
+
46
+ transition: border-color 0.2s ease, transform 0.2s ease, box-shadow 0.2s ease;
47
+ }
48
+ .file-cozy:hover {
49
+ transform: translateY(-2px);
50
+ border-color: rgba(247, 239, 138, 0.42);
51
+ box-shadow: 0 12px 34px -14px rgba(247, 239, 138, 0.34);
52
+ }
53
+
54
+ .file-list.active, .file-cozy.active {
55
+ border-color: var(--accent, #888) !important;
56
+ box-shadow: 0 0 0 1px var(--accent, #888),
57
+ 0 8px 28px -10px color-mix(in srgb, var(--accent, #888) 45%, transparent) !important;
58
+ }
59
+
60
+ .file-list-preview {
61
+ display: none;
62
+ }
63
+
64
+ .file-cozy-preview {
65
+ position: absolute;
66
+
67
+ top: 0;
68
+ left: 0;
69
+
70
+ width: 100%;
71
+ height: 100%;
72
+
73
+ z-index: 0;
74
+ }
75
+
76
+ /* Fallback icon shown over the preview canvas when no thumbnail
77
+ has been painted yet. createFileElement adds the `drawn` class to
78
+ the file element as soon as a thumbnail is painted into the canvas. */
79
+ .file-preview-icon {
80
+ position: absolute;
81
+ inset: 0;
82
+ display: flex;
83
+ align-items: center;
84
+ justify-content: center;
85
+
86
+ color: var(--accent, #888);
87
+ opacity: 0.45;
88
+ pointer-events: none;
89
+ z-index: 0;
90
+
91
+ transition: opacity 0.25s ease, transform 0.25s ease;
92
+ }
93
+ /* Once a real thumbnail is painted, fade out the fallback glyph. Only the
94
+ cozy view shows the full-bleed canvas; the list view keeps its avatar icon
95
+ (its preview canvas is display:none) so it isn't faded. */
96
+ .file-cozy.drawn .file-preview-icon {
97
+ opacity: 0;
98
+ }
99
+ .file-list .file-preview-icon {
100
+ position: relative;
101
+ inset: auto;
102
+ width: 36px;
103
+ height: 36px;
104
+ margin-right: 12px;
105
+ align-self: center;
106
+ flex-shrink: 0;
107
+ background-color: color-mix(in srgb, var(--accent, #888) 10%, transparent);
108
+ border-radius: 8px;
109
+ }
110
+ .file-list .file-preview-icon span {
111
+ font-size: 20px !important;
112
+ }
113
+ .file-cozy .file-preview-icon span {
114
+ font-size: 48px !important;
115
+ }
116
+ .file-list:hover .file-preview-icon,
117
+ .file-cozy:not(.drawn):hover .file-preview-icon {
118
+ opacity: 0.7;
119
+ transform: scale(1.04);
120
+ }
121
+
122
+ .file-list-details, .file-cozy-details {
123
+ position: relative;
124
+
125
+ display: flex;
126
+ justify-content: space-between;
127
+ align-items: center;
128
+
129
+ width: 100%;
130
+
131
+ box-sizing: border-box;
132
+ }
133
+ .file-list-details {
134
+ height: 44px;
135
+ flex: 1;
136
+ min-width: 0;
137
+ }
138
+
139
+ .file-cozy-details {
140
+ align-self: stretch;
141
+ padding: 10px 12px;
142
+
143
+ /* A distinct, near-opaque footer so the label reads clearly against the
144
+ preview behind it. Own bottom radius keeps it inside the rounded card
145
+ even where backdrop-filter would otherwise defeat the parent's
146
+ overflow:hidden clip. */
147
+ background: rgba(14, 16, 18, 0.94);
148
+ border-top: 1px solid rgba(247, 239, 138, 0.14);
149
+ border-bottom-left-radius: 10px;
150
+ border-bottom-right-radius: 10px;
151
+ backdrop-filter: blur(6px);
152
+ -webkit-backdrop-filter: blur(6px);
153
+ }
154
+ .file-cozy:hover .file-cozy-details {
155
+ border-top-color: rgba(247, 239, 138, 0.3);
156
+ }
157
+
158
+ .file-list-label, .file-cozy-label {
159
+ display: flex;
160
+ align-items: center;
161
+
162
+ gap: 10px;
163
+
164
+ padding: 4px 6px;
165
+
166
+ min-width: 0;
167
+ flex: 1;
168
+ }
169
+ .file-list-label input, .file-cozy-label input {
170
+ background-color: transparent;
171
+ color: var(--text, #F3F6FF);
172
+ border: none;
173
+ outline: none;
174
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
175
+ font-size: 14px;
176
+ font-weight: 500;
177
+ letter-spacing: 0.01em;
178
+
179
+ width: 100%;
180
+ min-width: 0;
181
+ max-width: 100%;
182
+
183
+ padding: 2px 0;
184
+
185
+ overflow: hidden;
186
+ text-overflow: ellipsis;
187
+ white-space: nowrap;
188
+
189
+ transition: color 0.15s ease;
190
+ }
191
+ .file-list-label input:not([readonly]), .file-cozy-label input:not([readonly]) {
192
+ color: var(--accent, #888);
193
+ border-bottom: 1px solid color-mix(in srgb, var(--accent, #888) 50%, transparent);
194
+ }
195
+
196
+ .file-list-label span, .file-cozy-label span {
197
+ flex-shrink: 0;
198
+
199
+ background-color: color-mix(in srgb, var(--accent, #888) 14%, transparent);
200
+ color: var(--accent, #888);
201
+
202
+ border-radius: 3px;
203
+ padding: 2px 7px;
204
+
205
+ font-size: 10px;
206
+ font-weight: 600;
207
+ letter-spacing: 0.08em;
208
+ text-transform: uppercase;
209
+
210
+ user-select: none;
211
+ }
212
+ .file-cozy-label span {
213
+ background-color: color-mix(in srgb, var(--accent, #888) 22%, transparent);
214
+ }
215
+
216
+ .file-list-options, .file-cozy-options {
217
+ display: flex;
218
+ justify-content: center;
219
+ align-items: center;
220
+
221
+ gap: 12px;
222
+
223
+ padding: 4px 6px;
224
+ }
225
+ .file-list-options span, .file-cozy-options span {
226
+ font-size: 20px;
227
+ color: var(--text, #F3F6FF);
228
+ opacity: 0.55;
229
+ cursor: pointer;
230
+ user-select: none;
231
+
232
+ transition: opacity 0.15s ease, color 0.15s ease;
233
+ }
234
+ .file-list-options span:hover, .file-cozy-options span:hover {
235
+ opacity: 1;
236
+ color: var(--accent, #888);
237
+ }
238
+
239
+ .file-load {
240
+ position: absolute;
241
+ inset: 0;
242
+
243
+ background-color: color-mix(in srgb, var(--secondary, #0E1528) 92%, transparent);
244
+ border-radius: inherit;
245
+
246
+ z-index: 1;
247
+
248
+ overflow: hidden;
249
+ }
250
+ .file-load-progress {
251
+ position: absolute;
252
+
253
+ width: 0%;
254
+ height: 100%;
255
+
256
+ background: linear-gradient(120deg,
257
+ color-mix(in srgb, var(--accent, #888) 10%, transparent),
258
+ var(--accent, #888),
259
+ color-mix(in srgb, var(--accent, #888) 10%, transparent));
260
+ background-size: 300% 300%;
261
+ animation: progress-gradient 10s linear infinite;
262
+ }
263
+
264
+
265
+
266
+ /* Tooltip */
267
+ .tooltip {
268
+ position: fixed;
269
+ display: none;
270
+ opacity: 0;
271
+
272
+ transform: translateX(-50%);
273
+
274
+ padding: 6px 12px;
275
+
276
+ border-radius: 6px;
277
+
278
+ background-color: var(--secondary, #222);
279
+ color: var(--text, #fff);
280
+
281
+ font-family: inherit;
282
+ font-size: 12px;
283
+ white-space: nowrap;
284
+
285
+ pointer-events: none;
286
+ user-select: none;
287
+ z-index: 100;
288
+
289
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
290
+ }
291
+
292
+
293
+ /* Hovering ? popover menu (file options, etc.) */
294
+ .hover {
295
+ /* `fixed` matches the JS positioner which feeds it viewport
296
+ coordinates from getBoundingClientRect ? `absolute` would drift
297
+ when the surrounding scroll container moves.
298
+ z-index needs to clear any consumer-app stacking context (sidebar,
299
+ page bodies with z-index: 1, etc.) without going over toast (9999)
300
+ or critical modals. 500 is the safe middle. */
301
+ position: fixed;
302
+ z-index: 500;
303
+
304
+ display: flex;
305
+ flex-direction: column;
306
+
307
+ gap: 6px;
308
+
309
+ padding: 8px;
310
+
311
+ border-radius: 6px;
312
+ border: 1px solid color-mix(in srgb, var(--accent, #888) 25%, transparent);
313
+
314
+ background-color: var(--secondary, #1a1a1a);
315
+
316
+ transform: translateX(-50%);
317
+
318
+ overflow: hidden;
319
+
320
+ box-shadow:
321
+ 0 12px 32px -10px rgba(0, 0, 0, 0.55),
322
+ 0 0 0 1px rgba(0, 0, 0, 0.35),
323
+ inset 0 1px 0 color-mix(in srgb, var(--accent, #888) 15%, transparent);
324
+ }
325
+ .hover * {
326
+ cursor: pointer;
327
+ user-select: none;
328
+ }
329
+ .hover span {
330
+ display: flex;
331
+ align-items: center;
332
+ justify-content: center;
333
+
334
+ width: 32px;
335
+ height: 32px;
336
+
337
+ font-size: 20px !important;
338
+ color: var(--text, #F3F6FF);
339
+
340
+ border-radius: 4px;
341
+ opacity: 0.7;
342
+
343
+ transition: opacity 0.15s ease, color 0.15s ease, background-color 0.15s ease;
344
+ }
345
+ .hover span:hover {
346
+ opacity: 1;
347
+ color: var(--accent, #888);
348
+ background-color: color-mix(in srgb, var(--accent, #888) 12%, transparent);
349
+ }
350
+
351
+
352
+
353
+ /* Toast ? styles live inline in the self-mounting React component (toast.tsx),
354
+ which renders into its own body portal so it never depends on host-app CSS. */
355
+
356
+
357
+
358
+ /* Chat */
359
+ .chat-root {
360
+ position: relative;
361
+
362
+ display: flex;
363
+ flex-direction: column;
364
+
365
+ width: 100%;
366
+ height: 100%;
367
+ }
368
+
369
+ .chat-messages {
370
+ flex: 1;
371
+
372
+ display: flex;
373
+ flex-direction: column;
374
+
375
+ align-self: center;
376
+ box-sizing: border-box;
377
+ width: min(100%, 800px);
378
+ max-width: 800px;
379
+ min-width: 0;
380
+
381
+ gap: 20px;
382
+
383
+ /* Horizontal breathing room so the pinned sender avatar (bottom-right of
384
+ authored user bubbles) isn't clipped by this scroll container's overflow.
385
+ Top and bottom so a long log can be dragged as far down as up. */
386
+ padding: 36px 24px;
387
+
388
+ overflow-y: scroll;
389
+ scrollbar-width: none;
390
+ }
391
+
392
+ .chat-message-user {
393
+ display: flex;
394
+ flex-direction: column;
395
+ align-self: flex-end;
396
+ align-items: stretch;
397
+ gap: 15px;
398
+ box-sizing: border-box;
399
+
400
+ max-width: 70%;
401
+ padding: 12px 16px;
402
+ border-radius: 18px;
403
+ border-bottom-right-radius: 6px;
404
+ background: var(--chat-input-bg, #FFFEFB);
405
+ border: 1px solid var(--chat-border, #e0e0e0);
406
+ }
407
+ .chat-message-model {
408
+ align-self: flex-start;
409
+ box-sizing: border-box;
410
+
411
+ max-width: 80%;
412
+ padding: 12px 16px;
413
+ border-radius: 18px;
414
+ border-bottom-left-radius: 6px;
415
+ background: transparent;
416
+ border: 1px solid transparent;
417
+
418
+ font-size: 14px;
419
+ line-height: 1.45;
420
+ }
421
+
422
+ .chat-message-user .chat-message-text {
423
+ text-align: left;
424
+ background: transparent;
425
+ padding: 0;
426
+ border-radius: 0;
427
+ }
428
+
429
+ .chat-message-text {
430
+ margin: 0;
431
+ min-width: 0;
432
+ overflow: hidden;
433
+ font-size: 14px;
434
+ line-height: 1.45;
435
+ color: var(--chat-text, inherit);
436
+ }
437
+ .chat-message-text > :first-child { margin-top: 0; }
438
+ .chat-message-text > :last-child { margin-bottom: 0; }
439
+
440
+ .chat-message-text table {
441
+ display: block;
442
+ width: max-content;
443
+ max-width: 100%;
444
+ overflow-x: auto;
445
+ margin: 10px 0;
446
+ border-collapse: separate;
447
+ border-spacing: 0;
448
+ border: 1px solid var(--chat-border, #e0e0e0);
449
+ border-radius: 10px;
450
+ font-size: 13px;
451
+ line-height: 1.4;
452
+ font-variant-numeric: tabular-nums;
453
+ }
454
+ .chat-message-text th,
455
+ .chat-message-text td {
456
+ padding: 7px 12px;
457
+ vertical-align: top;
458
+ border-bottom: 1px solid var(--chat-border, #e0e0e0);
459
+ }
460
+ .chat-message-text th:not([align]),
461
+ .chat-message-text td:not([align]) {
462
+ text-align: left;
463
+ }
464
+ .chat-message-text th {
465
+ font-weight: 600;
466
+ white-space: nowrap;
467
+ background: var(--chat-secondary, #f5f5f5);
468
+ }
469
+ .chat-message-text tbody tr:last-child td {
470
+ border-bottom: none;
471
+ }
472
+
473
+ .chat-message-user .chat-message-avatar {
474
+ border-color: var(--chat-input-bg, #fff);
475
+ background-color: var(--chat-input-bg, #f0f0f0);
476
+ }
477
+
478
+ .chat-message-user:last-child, .chat-message-model:last-child {
479
+ margin-bottom: 200px;
480
+ }
481
+
482
+ .chat-message-file {
483
+ display: flex;
484
+ flex-direction: column;
485
+ align-items: center;
486
+ justify-content: center;
487
+ gap: 8px;
488
+ max-width: 100%;
489
+
490
+ border: 1px solid var(--chat-border, #e0e0e0);
491
+ border-radius: 10px;
492
+ padding: 15px;
493
+ box-sizing: border-box;
494
+
495
+ user-select: none;
496
+ }
497
+ .chat-message-file-preview {
498
+ font-size: 32px !important;
499
+ color: var(--chat-accent, #888);
500
+ }
501
+ /* A file's preview: its type icon until the server preview lands, then the preview over it */
502
+ .chat-file-thumb {
503
+ position: relative;
504
+ display: inline-flex;
505
+ align-items: center;
506
+ justify-content: center;
507
+ flex-shrink: 0;
508
+ overflow: hidden;
509
+ }
510
+ .chat-file-thumb > img {
511
+ display: block;
512
+ width: 100%;
513
+ height: 100%;
514
+ object-fit: contain;
515
+ }
516
+ .chat-file-thumb-on > .material-symbols-outlined { display: none; }
517
+ .chat-message-file-thumb.chat-file-thumb-on {
518
+ width: 200px;
519
+ max-width: 100%;
520
+ aspect-ratio: 10 / 7;
521
+ border-radius: 8px;
522
+ background: var(--chat-secondary, #f5f5f5);
523
+ }
524
+ .chat-file-thumb-video.chat-file-thumb-on::after {
525
+ content: "play_circle";
526
+ position: absolute;
527
+ font-family: 'Material Symbols Outlined';
528
+ font-size: 40px;
529
+ line-height: 1;
530
+ color: #fff;
531
+ text-shadow: 0 1px 6px rgba(0, 0, 0, 0.45);
532
+ pointer-events: none;
533
+ }
534
+ .chat-message-file-label {
535
+ font-size: 12px;
536
+ color: var(--chat-accent, #888);
537
+ text-align: center;
538
+ max-width: 220px;
539
+ overflow: hidden;
540
+ text-overflow: ellipsis;
541
+ white-space: nowrap;
542
+ }
543
+ button.chat-message-file {
544
+ font: inherit;
545
+ background: transparent;
546
+ align-self: flex-start;
547
+ }
548
+ .chat-message-file-open {
549
+ cursor: pointer;
550
+ transition: border-color 0.15s, background-color 0.15s;
551
+ }
552
+ .chat-message-file-open:hover {
553
+ border-color: var(--chat-accent, #888);
554
+ background-color: var(--chat-secondary, #f5f5f5);
555
+ }
556
+
557
+ /* Tool output (a command's printout) under its chip */
558
+ .chat-tool-output > pre {
559
+ margin: 6px 0 0;
560
+ max-height: 280px;
561
+ overflow: auto;
562
+ padding: 10px 12px;
563
+ border-radius: 10px;
564
+ background: var(--chat-secondary, #f0f0f0);
565
+ border: 1px solid var(--chat-border, #e0e0e0);
566
+ font-size: 12px;
567
+ line-height: 1.45;
568
+ white-space: pre-wrap;
569
+ word-break: break-word;
570
+ }
571
+
572
+ /* Side panel: the chat's attachments and a tab per open file */
573
+ .chat-root-panel {
574
+ position: relative;
575
+ flex-direction: row;
576
+ }
577
+ .chat-main {
578
+ position: relative;
579
+ flex: 1;
580
+ min-width: 0;
581
+ min-height: 0;
582
+ display: flex;
583
+ flex-direction: column;
584
+ }
585
+ /* The chat's top right buttons: the app's actions, then the side panel's */
586
+ .chat-actions {
587
+ position: absolute;
588
+ top: 12px;
589
+ right: 12px;
590
+ z-index: 5;
591
+ display: flex;
592
+ gap: 8px;
593
+ }
594
+ .chat-action {
595
+ padding: 8px;
596
+ border-radius: 10px;
597
+ border: 1px solid var(--chat-border, #e0e0e0);
598
+ background-color: var(--chat-secondary, #f0f0f0);
599
+ color: var(--chat-accent, #888);
600
+ font-size: 20px;
601
+ line-height: 1;
602
+ cursor: pointer;
603
+ opacity: 0.6;
604
+ transition: opacity 0.18s, color 0.18s;
605
+ }
606
+ .chat-action:hover {
607
+ opacity: 1;
608
+ color: var(--chat-text, #1a1a1a);
609
+ }
610
+ .chat-panel {
611
+ position: relative;
612
+ flex-shrink: 0;
613
+ min-height: 0;
614
+ overflow: hidden;
615
+ border-left: 1px solid var(--panel-border, var(--chat-border, #e0e0e0));
616
+ background: var(--panel-bg, var(--chat-input-bg, #fff));
617
+ color: var(--chat-text, #1a1a1a);
618
+ }
619
+ .chat-panel-cover {
620
+ position: absolute;
621
+ inset: 0;
622
+ z-index: 6;
623
+ border-left: none;
624
+ }
625
+ /* Pinned to the panel's right edge at full width, so it slides in as the panel opens */
626
+ .chat-panel-inner {
627
+ position: absolute;
628
+ top: 0;
629
+ right: 0;
630
+ bottom: 0;
631
+ display: flex;
632
+ flex-direction: column;
633
+ min-height: 0;
634
+ }
635
+ .chat-panel-cover .chat-panel-inner { left: 0; }
636
+ .chat-panel-handle {
637
+ position: absolute;
638
+ left: 0;
639
+ top: 0;
640
+ bottom: 0;
641
+ width: 8px;
642
+ cursor: col-resize;
643
+ z-index: 3;
644
+ }
645
+ .chat-panel-handle:hover { background: color-mix(in srgb, var(--chat-accent, #888) 25%, transparent); }
646
+ .chat-panel-tabs {
647
+ display: flex;
648
+ align-items: stretch;
649
+ gap: 2px;
650
+ padding: 6px 6px 0;
651
+ border-bottom: 1px solid var(--panel-border, var(--chat-border, #e0e0e0));
652
+ overflow-x: auto;
653
+ scrollbar-width: none;
654
+ }
655
+ .chat-panel-tab {
656
+ display: flex;
657
+ align-items: center;
658
+ gap: 6px;
659
+ max-width: 200px;
660
+ padding: 6px 8px;
661
+ border: none;
662
+ border-radius: 8px 8px 0 0;
663
+ background: transparent;
664
+ color: var(--chat-accent, #888);
665
+ font: inherit;
666
+ font-size: 12px;
667
+ cursor: pointer;
668
+ flex-shrink: 0;
669
+ }
670
+ .chat-panel-tab .material-symbols-outlined { font-size: 16px; }
671
+ .chat-panel-tab-on {
672
+ background: var(--panel-tab, var(--chat-secondary, #f0f0f0));
673
+ color: var(--chat-text, #1a1a1a);
674
+ }
675
+ .chat-panel-tab-name {
676
+ overflow: hidden;
677
+ text-overflow: ellipsis;
678
+ white-space: nowrap;
679
+ }
680
+ .chat-panel-tab-people {
681
+ font-size: 10px;
682
+ min-width: 16px;
683
+ padding: 0 4px;
684
+ border-radius: 8px;
685
+ background: var(--chat-accent, #888);
686
+ color: var(--chat-input-bg, #fff);
687
+ text-align: center;
688
+ }
689
+ .chat-panel-tab-close,
690
+ .chat-panel-hide {
691
+ border: none;
692
+ background: transparent;
693
+ color: inherit;
694
+ cursor: pointer;
695
+ font-size: 16px !important;
696
+ padding: 0;
697
+ }
698
+ .chat-panel-hide { font-size: 20px !important; padding: 4px 6px; color: var(--chat-accent, #888); }
699
+ .chat-panel-tabs-gap { flex: 1; }
700
+ .chat-panel-body {
701
+ position: relative;
702
+ flex: 1;
703
+ min-height: 0;
704
+ display: flex;
705
+ flex-direction: column;
706
+ }
707
+ .chat-panel-list {
708
+ flex: 1;
709
+ overflow-y: auto;
710
+ padding: 6px;
711
+ }
712
+ .chat-panel-view {
713
+ flex: 1;
714
+ min-height: 0;
715
+ display: flex;
716
+ flex-direction: column;
717
+ }
718
+ .chat-panel-empty {
719
+ padding: 24px 16px;
720
+ font-size: 13px;
721
+ color: var(--chat-accent, #888);
722
+ text-align: center;
723
+ }
724
+ .chat-panel-row {
725
+ display: flex;
726
+ align-items: center;
727
+ gap: 10px;
728
+ padding: 8px 10px;
729
+ border-radius: 10px;
730
+ cursor: default;
731
+ user-select: none;
732
+ outline: none;
733
+ }
734
+ .chat-panel-row:hover { background: var(--chat-secondary, #f5f5f5); }
735
+ .chat-panel-row-on { background: var(--panel-tab, var(--chat-secondary, #f0f0f0)); }
736
+ .chat-panel-row-icon { color: var(--chat-accent, #888); font-size: 22px; }
737
+ .chat-panel-row-thumb.chat-file-thumb-on {
738
+ width: 40px;
739
+ height: 40px;
740
+ border-radius: 6px;
741
+ background: var(--chat-secondary, #f5f5f5);
742
+ }
743
+ .chat-panel-row-thumb > img { object-fit: cover; }
744
+ .chat-panel-row-text { min-width: 0; }
745
+ .chat-panel-row-name {
746
+ font-size: 13px;
747
+ overflow: hidden;
748
+ text-overflow: ellipsis;
749
+ white-space: nowrap;
750
+ }
751
+ .chat-panel-row-meta { font-size: 11px; color: var(--chat-accent, #888); }
752
+
753
+ /* A file's view in a popup, for chats without a side panel */
754
+ .chat-view-modal {
755
+ position: fixed;
756
+ inset: 0;
757
+ z-index: 1000;
758
+ display: flex;
759
+ align-items: center;
760
+ justify-content: center;
761
+ background: rgba(0, 0, 0, 0.5);
762
+ }
763
+ .chat-view-modal-box {
764
+ position: relative;
765
+ width: min(1000px, 92vw);
766
+ height: min(760px, 88vh);
767
+ display: flex;
768
+ flex-direction: column;
769
+ border-radius: 14px;
770
+ overflow: hidden;
771
+ background: var(--panel-bg, var(--chat-input-bg, #fff));
772
+ }
773
+ .chat-view-modal-body { flex: 1; min-height: 0; display: flex; flex-direction: column; }
774
+ .chat-view-modal-close {
775
+ position: absolute;
776
+ top: 6px;
777
+ right: 8px;
778
+ z-index: 2;
779
+ border: none;
780
+ background: transparent;
781
+ color: var(--chat-accent, #888);
782
+ cursor: pointer;
783
+ font-size: 20px;
784
+ }
785
+
786
+ /* The chat's repository in the message box */
787
+ .chat-repository-holder { display: flex; align-items: center; min-width: 0; }
788
+ .chat-repository { position: relative; display: flex; align-items: center; min-width: 0; }
789
+ .chat-repository-chip {
790
+ display: flex;
791
+ align-items: center;
792
+ gap: 6px;
793
+ min-width: 0;
794
+ max-width: 200px;
795
+ padding: 4px 10px;
796
+ border: 1px solid var(--chat-border, #e0e0e0);
797
+ border-radius: 14px;
798
+ background: transparent;
799
+ color: var(--chat-accent, #888);
800
+ font: inherit;
801
+ font-size: 12px;
802
+ cursor: pointer;
803
+ }
804
+ .chat-input-options .chat-repository-chip .material-symbols-outlined { font-size: 16px; padding: 0; }
805
+ .chat-repository-chip:hover { background: var(--chat-secondary, #f5f5f5); }
806
+ /* The composer draws its spans as round icon buttons; inside the chip and the menu they are plain. */
807
+ .chat-repository .chat-repository-chip span,
808
+ .chat-repository .chat-repository-menu span { font-size: inherit; color: inherit; padding: 0; border-radius: 0; cursor: inherit; }
809
+ .chat-repository .chat-repository-chip span:not(.chat-repository-dot):hover,
810
+ .chat-repository .chat-repository-menu span:not(.chat-repository-dot):hover { background-color: transparent; }
811
+ .chat-repository-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
812
+ .chat-repository-dot { display: inline-block; width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0; }
813
+ .chat-repository .chat-repository-dot,
814
+ .chat-repository .chat-repository-dot:hover { background-color: #9ca3af; }
815
+ .chat-repository .chat-repository-dot.chat-repository-running { background-color: #22c55e; box-shadow: 0 0 0 3px rgba(34, 197, 94, 0.18); }
816
+ .chat-repository .chat-repository-dot.chat-repository-starting,
817
+ .chat-repository .chat-repository-dot.chat-repository-saving { background-color: #f59e0b; box-shadow: 0 0 0 3px rgba(245, 158, 11, 0.18); }
818
+ .chat-repository-menu {
819
+ position: absolute;
820
+ bottom: calc(100% + 10px);
821
+ right: 0;
822
+ z-index: 20;
823
+ box-sizing: border-box;
824
+ width: min(296px, calc(100vw - 32px));
825
+ padding: 8px;
826
+ border-radius: 14px;
827
+ border: 1px solid var(--chat-border, #e0e0e0);
828
+ background: var(--chat-input-bg, #fff);
829
+ color: var(--chat-text, #1a1a1a);
830
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05), 0 8px 20px rgba(0, 0, 0, 0.1), 0 24px 48px rgba(0, 0, 0, 0.08);
831
+ font-size: 13px;
832
+ line-height: 1.4;
833
+ }
834
+ .chat-repository-down .chat-repository-menu { bottom: auto; top: calc(100% + 10px); }
835
+ .chat-repository-current {
836
+ margin-bottom: 6px;
837
+ padding: 10px;
838
+ border-radius: 10px;
839
+ background: var(--chat-secondary, #f5f5f5);
840
+ }
841
+ .chat-repository-current-row { display: flex; align-items: center; gap: 10px; min-width: 0; }
842
+ .chat-repository .chat-repository-current-row > .material-symbols-outlined { font-size: 20px; color: var(--chat-accent, #888); }
843
+ .chat-repository-current-text { min-width: 0; }
844
+ .chat-repository-current-name { font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
845
+ .chat-repository-current-status { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--chat-accent, #888); }
846
+ .chat-repository-actions { display: flex; gap: 6px; margin-top: 10px; }
847
+ .chat-repository-actions button {
848
+ flex: 1;
849
+ padding: 6px 10px;
850
+ border: 1px solid var(--chat-border, #e0e0e0);
851
+ border-radius: 8px;
852
+ background: var(--chat-input-bg, #fff);
853
+ color: var(--chat-text, #1a1a1a);
854
+ font: inherit;
855
+ font-size: 12px;
856
+ cursor: pointer;
857
+ transition: border-color 0.15s ease, opacity 0.15s ease;
858
+ }
859
+ .chat-repository-actions button:hover:not(:disabled) { border-color: var(--chat-accent, #888); }
860
+ .chat-repository-heading {
861
+ padding: 6px 8px 4px;
862
+ font-size: 11px;
863
+ font-weight: 600;
864
+ letter-spacing: 0.04em;
865
+ text-transform: uppercase;
866
+ color: var(--chat-accent, #888);
867
+ }
868
+ .chat-repository-list { max-height: 208px; overflow-y: auto; display: flex; flex-direction: column; gap: 1px; padding: 0 0 2px; }
869
+ .chat-repository-list .chat-shimmer { margin: 9px 8px; }
870
+ .chat-repository-option {
871
+ display: flex;
872
+ align-items: center;
873
+ gap: 10px;
874
+ padding: 7px 8px;
875
+ border: none;
876
+ border-radius: 8px;
877
+ background: transparent;
878
+ color: inherit;
879
+ font: inherit;
880
+ font-size: 13px;
881
+ text-align: left;
882
+ cursor: pointer;
883
+ transition: background-color 0.15s ease;
884
+ }
885
+ .chat-repository-option:hover:not(:disabled) { background: var(--chat-secondary, #f5f5f5); }
886
+ .chat-repository .chat-repository-option > .material-symbols-outlined { font-size: 17px; color: var(--chat-accent, #888); }
887
+ .chat-repository-option-name { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
888
+ .chat-repository-empty { padding: 7px 8px; font-size: 12px; color: var(--chat-accent, #888); }
889
+ .chat-repository-new {
890
+ display: flex;
891
+ gap: 6px;
892
+ margin-top: 6px;
893
+ padding: 8px 0 0;
894
+ border-top: 1px solid var(--chat-border, #e0e0e0);
895
+ }
896
+ .chat-repository-new input {
897
+ flex: 1;
898
+ min-width: 0;
899
+ padding: 7px 10px;
900
+ border: 1px solid var(--chat-border, #e0e0e0);
901
+ border-radius: 8px;
902
+ background: transparent;
903
+ color: inherit;
904
+ font: inherit;
905
+ font-size: 12px;
906
+ outline: none;
907
+ transition: border-color 0.15s ease, box-shadow 0.15s ease;
908
+ }
909
+ .chat-repository-new input:focus { border-color: var(--chat-accent, #888); box-shadow: 0 0 0 3px rgba(136, 136, 136, 0.18); }
910
+ .chat-repository-new button {
911
+ padding: 7px 12px;
912
+ border: 1px solid transparent;
913
+ border-radius: 8px;
914
+ background: var(--chat-text, #1a1a1a);
915
+ color: var(--chat-input-bg, #fff);
916
+ font: inherit;
917
+ font-size: 12px;
918
+ font-weight: 500;
919
+ cursor: pointer;
920
+ transition: opacity 0.15s ease;
921
+ }
922
+ .chat-repository-new button:hover:not(:disabled) { opacity: 0.88; }
923
+ .chat-repository-menu button:disabled { opacity: 0.45; cursor: default; }
924
+ .chat-repository-error { margin: 8px 4px 2px; font-size: 12px; color: #b94b43; }
925
+
926
+ /* A loading row */
927
+ .chat-shimmer {
928
+ position: relative;
929
+ overflow: hidden;
930
+ height: 12px;
931
+ margin: 6px 0;
932
+ border-radius: 6px;
933
+ background: rgba(136, 136, 136, 0.1);
934
+ }
935
+ .chat-shimmer + .chat-shimmer { width: 70%; }
936
+ .chat-shimmer::after {
937
+ content: '';
938
+ position: absolute;
939
+ top: 0;
940
+ left: -100%;
941
+ width: 100%;
942
+ height: 100%;
943
+ background: linear-gradient(90deg, transparent 0%, rgba(136, 136, 136, 0.12) 50%, transparent 100%);
944
+ animation: chat-shimmer 1.6s ease-in-out infinite;
945
+ }
946
+
947
+ /* Asking to make a repository so Parrot can use a computer */
948
+ .chat-computer-veil {
949
+ position: fixed;
950
+ inset: 0;
951
+ z-index: 1000;
952
+ display: flex;
953
+ align-items: center;
954
+ justify-content: center;
955
+ padding: 20px;
956
+ background: rgba(0, 0, 0, 0.35);
957
+ backdrop-filter: blur(3px);
958
+ }
959
+ .chat-computer {
960
+ width: min(400px, 100%);
961
+ padding: 24px;
962
+ border-radius: 18px;
963
+ border: 1px solid var(--chat-border, #e0e0e0);
964
+ background: var(--chat-input-bg, #fff);
965
+ color: var(--chat-text, #1a1a1a);
966
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.06), 0 12px 32px rgba(0, 0, 0, 0.16), 0 32px 64px rgba(0, 0, 0, 0.1);
967
+ font-size: 14px;
968
+ line-height: 1.45;
969
+ }
970
+ .chat-computer-icon {
971
+ display: flex;
972
+ align-items: center;
973
+ justify-content: center;
974
+ width: 44px;
975
+ height: 44px;
976
+ margin-bottom: 14px;
977
+ border-radius: 12px;
978
+ background: var(--chat-secondary, #f5f5f5);
979
+ color: var(--chat-text, #1a1a1a);
980
+ }
981
+ .chat-computer-icon .material-symbols-outlined { font-size: 24px; }
982
+ .chat-computer-title { margin: 0 0 6px; font-size: 18px; font-weight: 600; letter-spacing: -0.01em; }
983
+ .chat-computer-text { margin: 0 0 16px; color: var(--chat-accent, #888); }
984
+ .chat-computer-prices {
985
+ display: flex;
986
+ flex-direction: column;
987
+ gap: 8px;
988
+ margin-bottom: 16px;
989
+ padding: 12px 14px;
990
+ border-radius: 12px;
991
+ background: var(--chat-secondary, #f5f5f5);
992
+ font-size: 13px;
993
+ }
994
+ .chat-computer-price { display: flex; align-items: flex-start; gap: 8px; }
995
+ .chat-computer-price .material-symbols-outlined { font-size: 18px; color: var(--chat-accent, #888); }
996
+ .chat-computer-price b { font-weight: 600; }
997
+ .chat-computer-payer { font-size: 12px; color: var(--chat-accent, #888); }
998
+ .chat-computer-label { display: block; margin-bottom: 6px; font-size: 12px; color: var(--chat-accent, #888); }
999
+ .chat-computer-name {
1000
+ box-sizing: border-box;
1001
+ width: 100%;
1002
+ padding: 9px 12px;
1003
+ border: 1px solid var(--chat-border, #e0e0e0);
1004
+ border-radius: 10px;
1005
+ background: transparent;
1006
+ color: inherit;
1007
+ font: inherit;
1008
+ outline: none;
1009
+ transition: border-color 0.15s ease, box-shadow 0.15s ease;
1010
+ }
1011
+ .chat-computer-name:focus { border-color: var(--chat-accent, #888); box-shadow: 0 0 0 3px rgba(136, 136, 136, 0.18); }
1012
+ .chat-computer-error { margin-top: 8px; font-size: 12px; color: #b94b43; }
1013
+ .chat-computer-buttons { display: flex; justify-content: flex-end; gap: 8px; margin-top: 20px; }
1014
+ .chat-computer-buttons button {
1015
+ padding: 9px 16px;
1016
+ border-radius: 10px;
1017
+ font: inherit;
1018
+ font-size: 13px;
1019
+ font-weight: 500;
1020
+ cursor: pointer;
1021
+ transition: opacity 0.15s ease, background-color 0.15s ease, transform 0.1s ease;
1022
+ }
1023
+ .chat-computer-buttons button:active:not(:disabled) { transform: scale(0.97); }
1024
+ .chat-computer-buttons button:disabled { opacity: 0.5; cursor: default; }
1025
+ .chat-computer-no { border: 1px solid var(--chat-border, #e0e0e0); background: transparent; color: var(--chat-text, #1a1a1a); }
1026
+ .chat-computer-no:hover:not(:disabled) { background: var(--chat-secondary, #f5f5f5); }
1027
+ .chat-computer-yes { border: 1px solid transparent; background: var(--chat-text, #1a1a1a); color: var(--chat-input-bg, #fff); }
1028
+ .chat-computer-yes:hover:not(:disabled) { opacity: 0.88; }
1029
+
1030
+
1031
+ /* Message actions row */
1032
+ .chat-message-actions {
1033
+ display: flex;
1034
+ flex-direction: row;
1035
+ align-items: center;
1036
+ gap: 4px;
1037
+
1038
+ opacity: 0;
1039
+ transition: opacity 0.2s;
1040
+ }
1041
+ .chat-message-user:hover .chat-message-actions,
1042
+ .chat-message-model:hover .chat-message-actions {
1043
+ opacity: 1;
1044
+ }
1045
+ .chat-message-actions span {
1046
+ font-size: 18px !important;
1047
+ color: var(--chat-accent, #888);
1048
+ cursor: pointer;
1049
+ user-select: none;
1050
+ padding: 4px;
1051
+ border-radius: 4px;
1052
+ transition: color 0.15s;
1053
+ }
1054
+ .chat-message-actions span:hover {
1055
+ color: var(--chat-text, #1a1a1a);
1056
+ }
1057
+
1058
+ /* Reactions: folded under the message they point at. */
1059
+ .chat-reactions {
1060
+ display: flex;
1061
+ flex-wrap: wrap;
1062
+ gap: 6px;
1063
+ margin-top: 6px;
1064
+ }
1065
+ .chat-reaction {
1066
+ display: inline-flex;
1067
+ align-items: center;
1068
+ gap: 4px;
1069
+ height: auto;
1070
+ padding: 2px 9px;
1071
+ border: 1px solid var(--chat-border, #e0e0e0);
1072
+ border-radius: 999px;
1073
+ background: var(--chat-secondary, #f0f0f0);
1074
+ color: var(--chat-text, #1a1a1a);
1075
+ font: inherit;
1076
+ font-size: 13px;
1077
+ line-height: 1.5;
1078
+ cursor: pointer;
1079
+ }
1080
+ .chat-reaction:hover {
1081
+ border-color: var(--chat-accent, #888);
1082
+ }
1083
+ .chat-reaction.mine {
1084
+ border-color: var(--chat-reaction-mine, var(--chat-accent, #888));
1085
+ background: var(--chat-reaction-mine-bg, var(--chat-input-bg, #FFFEFB));
1086
+ }
1087
+ .chat-reaction-count {
1088
+ font-size: 12px;
1089
+ font-weight: 600;
1090
+ font-variant-numeric: tabular-nums;
1091
+ color: var(--chat-accent, #888);
1092
+ }
1093
+ .chat-reaction-picker {
1094
+ display: flex;
1095
+ gap: 2px;
1096
+ align-self: flex-start;
1097
+ margin-top: 6px;
1098
+ padding: 4px;
1099
+ border: 1px solid var(--chat-border, #e0e0e0);
1100
+ border-radius: 999px;
1101
+ background: var(--chat-input-bg, #FFFEFB);
1102
+ transform-origin: left center;
1103
+ }
1104
+ .chat-reaction-picker button {
1105
+ height: auto;
1106
+ padding: 2px 6px;
1107
+ border: 0;
1108
+ border-radius: 999px;
1109
+ background: transparent;
1110
+ font: inherit;
1111
+ font-size: 18px;
1112
+ line-height: 1.3;
1113
+ cursor: pointer;
1114
+ }
1115
+ .chat-reaction-picker button:hover {
1116
+ background: var(--chat-secondary, #f0f0f0);
1117
+ }
1118
+ /* Queue strip ? queued messages pinned just above the composer. */
1119
+ .chat-queue {
1120
+ display: flex;
1121
+ flex-direction: column;
1122
+ gap: 6px;
1123
+ margin-bottom: 8px;
1124
+ }
1125
+ .chat-queue:empty {
1126
+ display: none;
1127
+ }
1128
+ .chat-queue-item {
1129
+ display: flex;
1130
+ align-items: center;
1131
+ gap: 8px;
1132
+
1133
+ padding: 7px 8px 7px 12px;
1134
+ border-radius: 10px;
1135
+
1136
+ background-color: var(--chat-secondary, #f0f0f0);
1137
+ border: 1px dashed var(--chat-accent, #c8c8c8);
1138
+
1139
+ overflow: hidden;
1140
+ box-sizing: border-box;
1141
+ }
1142
+ .chat-queue-item-icon {
1143
+ font-size: 18px !important;
1144
+ color: var(--chat-accent, #888);
1145
+ flex-shrink: 0;
1146
+ }
1147
+ .chat-queue-item-label {
1148
+ flex: 1;
1149
+ min-width: 0;
1150
+
1151
+ font-size: 13px;
1152
+ color: var(--chat-text, #1a1a1a);
1153
+ opacity: 0.85;
1154
+
1155
+ white-space: nowrap;
1156
+ overflow: hidden;
1157
+ text-overflow: ellipsis;
1158
+ }
1159
+ .chat-queue-item-actions {
1160
+ display: flex;
1161
+ align-items: center;
1162
+ gap: 2px;
1163
+ flex-shrink: 0;
1164
+ }
1165
+ .chat-queue-item-actions span {
1166
+ font-size: 18px !important;
1167
+ color: var(--chat-accent, #888);
1168
+ cursor: pointer;
1169
+ user-select: none;
1170
+ padding: 3px;
1171
+ border-radius: 4px;
1172
+ transition: color 0.15s;
1173
+ }
1174
+ .chat-queue-item-actions span:hover {
1175
+ color: var(--chat-text, #1a1a1a);
1176
+ }
1177
+ .chat-queue-item-actions .chat-queue-remove:hover {
1178
+ color: #f87171;
1179
+ }
1180
+
1181
+ /* Room mode: "Steer all" header, shown above the queued chips when >1 message
1182
+ is waiting on the current reply. Clicking stops the in-flight reply so the
1183
+ server re-answers the whole (larger) transcript after the debounce window. */
1184
+ .chat-queue-steer-all {
1185
+ display: flex;
1186
+ align-items: center;
1187
+ gap: 6px;
1188
+
1189
+ padding: 6px 10px;
1190
+ border-radius: 10px;
1191
+
1192
+ background-color: var(--chat-accent, #c8c8c8);
1193
+ color: var(--chat-input-bg, #fffefb);
1194
+
1195
+ font-size: 12px;
1196
+ font-weight: 600;
1197
+ letter-spacing: 0.02em;
1198
+
1199
+ cursor: pointer;
1200
+ user-select: none;
1201
+ transition: filter 0.15s, transform 0.1s;
1202
+ }
1203
+ .chat-queue-steer-all span.material-symbols-outlined {
1204
+ font-size: 16px !important;
1205
+ }
1206
+ .chat-queue-steer-all:hover {
1207
+ filter: brightness(1.08);
1208
+ }
1209
+ .chat-queue-steer-all:active {
1210
+ transform: translateY(1px);
1211
+ }
1212
+
1213
+
1214
+ .chat-thinking {
1215
+ display: inline-flex;
1216
+ align-items: center;
1217
+ gap: 8px;
1218
+ padding: 6px 14px;
1219
+ border-radius: 16px;
1220
+ background: var(--chat-secondary, #f0f0f0);
1221
+ border: 1px solid var(--chat-border, #e0e0e0);
1222
+ font-size: 12px;
1223
+ color: var(--chat-accent, #888);
1224
+ line-height: 1.4;
1225
+ overflow: hidden;
1226
+ position: relative;
1227
+ }
1228
+
1229
+ .chat-thinking::after {
1230
+ content: '';
1231
+ position: absolute;
1232
+ top: 0;
1233
+ left: -100%;
1234
+ width: 100%;
1235
+ height: 100%;
1236
+ background: linear-gradient(90deg, transparent 0%, rgba(136, 136, 136, 0.08) 40%, rgba(136, 136, 136, 0.15) 50%, rgba(136, 136, 136, 0.08) 60%, transparent 100%);
1237
+ animation: chat-shimmer 2s ease-in-out infinite;
1238
+ }
1239
+
1240
+ @keyframes chat-shimmer {
1241
+ 0% { left: -100%; }
1242
+ 100% { left: 100%; }
1243
+ }
1244
+
1245
+ .chat-thinking .material-symbols-outlined {
1246
+ font-size: 14px;
1247
+ animation: chat-pulse-opacity 2s ease-in-out infinite;
1248
+ }
1249
+
1250
+ @keyframes chat-pulse-opacity {
1251
+ 0%, 100% { opacity: 0.4; }
1252
+ 50% { opacity: 1; }
1253
+ }
1254
+
1255
+ .chat-tool-chip {
1256
+ /* Block-ish so it sits on its own line between text segments and gives
1257
+ a clean paragraph break around it. fit-content keeps it from
1258
+ stretching across the full message bubble. */
1259
+ display: flex;
1260
+ align-self: flex-start;
1261
+ align-items: center;
1262
+ width: fit-content;
1263
+ gap: 6px;
1264
+ padding: 5px 12px;
1265
+ margin: 8px 0;
1266
+ border-radius: 12px;
1267
+ background: var(--chat-secondary, #f0f0f0);
1268
+ border: 1px solid var(--chat-border, #e0e0e0);
1269
+ font-size: 12px;
1270
+ color: var(--chat-accent, #888);
1271
+ line-height: 1.4;
1272
+ position: relative;
1273
+ }
1274
+ .chat-tool-chip-running {
1275
+ overflow: hidden;
1276
+ }
1277
+ .chat-tool-chip-running::after {
1278
+ content: '';
1279
+ position: absolute;
1280
+ top: 0;
1281
+ left: -100%;
1282
+ width: 100%;
1283
+ height: 100%;
1284
+ background: linear-gradient(90deg, transparent 0%, rgba(136, 136, 136, 0.08) 40%, rgba(136, 136, 136, 0.15) 50%, rgba(136, 136, 136, 0.08) 60%, transparent 100%);
1285
+ animation: chat-shimmer 2s ease-in-out infinite;
1286
+ }
1287
+ .chat-tool-chip .material-symbols-outlined {
1288
+ font-size: 14px;
1289
+ flex-shrink: 0;
1290
+ }
1291
+ .chat-tool-chip-label {
1292
+ display: -webkit-box;
1293
+ -webkit-line-clamp: 3;
1294
+ -webkit-box-orient: vertical;
1295
+ overflow: hidden;
1296
+ }
1297
+ .chat-tool-chip-success {
1298
+ color: #2f7d50;
1299
+ border-color: #cfe3d5;
1300
+ background: #f4faf6;
1301
+ }
1302
+ .chat-tool-chip-error {
1303
+ color: #b94b43;
1304
+ border-color: #ead1ce;
1305
+ background: #fff7f6;
1306
+ }
1307
+
1308
+ .chat-tool-web {
1309
+ align-self: flex-start;
1310
+ max-width: 100%;
1311
+ margin: 8px 0;
1312
+ }
1313
+ .chat-tool-web > summary {
1314
+ width: fit-content;
1315
+ list-style: none;
1316
+ cursor: pointer;
1317
+ }
1318
+ .chat-tool-web > summary::-webkit-details-marker {
1319
+ display: none;
1320
+ }
1321
+ .chat-tool-web > summary .chat-tool-chip {
1322
+ margin: 0;
1323
+ }
1324
+ .chat-tool-web-sources {
1325
+ display: flex;
1326
+ flex-direction: column;
1327
+ gap: 2px;
1328
+ margin: 6px 0 0 12px;
1329
+ padding-left: 12px;
1330
+ border-left: 1px solid var(--chat-border, #e0e0e0);
1331
+ }
1332
+ .chat-tool-web-source {
1333
+ display: flex;
1334
+ align-items: baseline;
1335
+ gap: 8px;
1336
+ min-width: 0;
1337
+ padding: 3px 0;
1338
+ font-size: 12px;
1339
+ line-height: 1.4;
1340
+ color: var(--chat-accent, #888);
1341
+ text-decoration: none;
1342
+ }
1343
+ .chat-tool-web-source-title {
1344
+ overflow: hidden;
1345
+ text-overflow: ellipsis;
1346
+ white-space: nowrap;
1347
+ color: var(--chat-text, #1a1a1a);
1348
+ }
1349
+ .chat-tool-web-source:hover .chat-tool-web-source-title {
1350
+ text-decoration: underline;
1351
+ }
1352
+ .chat-tool-web-source-host {
1353
+ flex-shrink: 0;
1354
+ }
1355
+
1356
+ /* The whole composer is one rounded pill: text on top, a controls row
1357
+ (model selector left, attach/send right) beneath it. */
1358
+ .chat-input {
1359
+ display: flex;
1360
+ flex-direction: column;
1361
+ align-items: stretch;
1362
+
1363
+ align-self: center;
1364
+ width: 100%;
1365
+ max-width: 800px;
1366
+
1367
+ padding: 6px 8px 4px;
1368
+ box-sizing: border-box;
1369
+
1370
+ border: 1px solid var(--chat-border, #e0e0e0);
1371
+ border-radius: 16px;
1372
+ box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.06);
1373
+ background-color: var(--chat-input-bg, white);
1374
+ }
1375
+
1376
+ .chat-input-row {
1377
+ display: flex;
1378
+ flex-direction: row;
1379
+ align-items: center;
1380
+
1381
+ width: 100%;
1382
+
1383
+ box-sizing: border-box;
1384
+ }
1385
+
1386
+ .chat-input-controls {
1387
+ display: flex;
1388
+ flex-direction: row;
1389
+ align-items: center;
1390
+
1391
+ width: 100%;
1392
+
1393
+ padding: 0px 4px;
1394
+ box-sizing: border-box;
1395
+ }
1396
+
1397
+ .chat-input input,
1398
+ .chat-input .tokenized-root {
1399
+ flex: 1;
1400
+ height: 100%;
1401
+
1402
+ margin: 0px;
1403
+ padding: 12px;
1404
+
1405
+ box-sizing: border-box;
1406
+
1407
+ border: none;
1408
+ outline: none;
1409
+ background-color: transparent;
1410
+
1411
+ font-family: inherit;
1412
+ font-size: 14px;
1413
+ color: inherit;
1414
+ }
1415
+
1416
+ .chat-input .tokenized-root {
1417
+ padding: 0;
1418
+ /* Inherits flex-direction: column from .tokenized-root. Stretch (not
1419
+ center) so the editor fills the row's width ? otherwise the empty
1420
+ editor sizes to the placeholder text and appears centered. */
1421
+ align-items: stretch;
1422
+ }
1423
+ .chat-input .tokenized-editor {
1424
+ padding: 12px;
1425
+ }
1426
+ .chat-input .tokenized-suggestions {
1427
+ bottom: calc(100% + 8px);
1428
+ }
1429
+
1430
+ .chat-input-options {
1431
+ display: flex;
1432
+ flex-direction: row;
1433
+ align-items: center;
1434
+ gap: 4px;
1435
+
1436
+ /* Pin to the right of the controls row, regardless of whether a model
1437
+ selector is present on the left. */
1438
+ margin-left: auto;
1439
+ min-width: 0;
1440
+
1441
+ box-sizing: border-box;
1442
+ }
1443
+ .chat-input-options span {
1444
+ color: var(--chat-accent, #888);
1445
+ cursor: pointer;
1446
+ user-select: none;
1447
+ font-size: 22px;
1448
+
1449
+ padding: 8px;
1450
+ border-radius: 50%;
1451
+ }
1452
+ .chat-input-options span:hover {
1453
+ background-color: var(--chat-secondary, #f0f0f0);
1454
+ }
1455
+ /* Stop state ? the send button morphs into a stop control mid-stream. */
1456
+ .chat-input-options span.chat-stop {
1457
+ color: #f87171;
1458
+ }
1459
+ .chat-input-options span.chat-stop:hover {
1460
+ background-color: rgba(248, 113, 113, 0.15);
1461
+ }
1462
+ /* Generic catalog picker (provider icon + name + optional reasoning flyout).
1463
+ Menu opens UPWARD so composers at the bottom of the viewport stay usable. */
1464
+ .gen-select {
1465
+ position: relative;
1466
+ display: inline-flex;
1467
+ }
1468
+ .gen-select-trigger {
1469
+ display: flex;
1470
+ flex-direction: row;
1471
+ align-items: center;
1472
+ gap: 6px;
1473
+
1474
+ max-width: 200px;
1475
+ margin: 0;
1476
+ padding: 6px 8px 6px 10px;
1477
+
1478
+ color: var(--chat-accent, #888);
1479
+ background-color: transparent;
1480
+ border: 1px solid var(--chat-secondary, #f0f0f0);
1481
+ border-radius: 14px;
1482
+
1483
+ font-family: inherit;
1484
+ font-size: 12px;
1485
+ cursor: pointer;
1486
+
1487
+ transition: border-color 0.18s, color 0.18s, background-color 0.18s;
1488
+ }
1489
+ .gen-select-trigger:hover,
1490
+ .gen-select.open .gen-select-trigger {
1491
+ color: var(--chat-text, #1a1a1a);
1492
+ border-color: var(--chat-accent, #888);
1493
+ }
1494
+ .gen-select-trigger-icon {
1495
+ width: 16px;
1496
+ height: 16px;
1497
+ flex-shrink: 0;
1498
+ border-radius: 4px;
1499
+ object-fit: contain;
1500
+ }
1501
+ .gen-select-trigger-label {
1502
+ white-space: nowrap;
1503
+ overflow: hidden;
1504
+ text-overflow: ellipsis;
1505
+ }
1506
+ .gen-select-caret {
1507
+ margin-left: 2px;
1508
+ font-size: 16px !important;
1509
+ transition: transform 0.18s ease;
1510
+ }
1511
+ .gen-select.open .gen-select-caret {
1512
+ transform: rotate(180deg);
1513
+ }
1514
+
1515
+ .gen-select-menu {
1516
+ position: absolute;
1517
+ bottom: calc(100% + 6px);
1518
+ left: 0;
1519
+ z-index: 20;
1520
+
1521
+ display: flex;
1522
+ flex-direction: column;
1523
+ gap: 2px;
1524
+
1525
+ min-width: 200px;
1526
+ max-width: 260px;
1527
+ max-height: 280px;
1528
+ padding: 6px;
1529
+
1530
+ overflow-y: auto;
1531
+ scrollbar-width: none;
1532
+
1533
+ background-color: var(--chat-input-bg, #fff);
1534
+ border: 1px solid var(--chat-border, #e0e0e0);
1535
+ border-radius: 14px;
1536
+ box-shadow: 0 12px 32px -8px rgba(0, 0, 0, 0.25);
1537
+
1538
+ opacity: 0;
1539
+ transform: translateY(6px);
1540
+ pointer-events: none;
1541
+ transition: opacity 0.16s ease, transform 0.16s ease;
1542
+ }
1543
+
1544
+ .gen-select-menu::-webkit-scrollbar { display: none; }
1545
+ .gen-select.open .gen-select-menu {
1546
+ opacity: 1;
1547
+ transform: translateY(0);
1548
+ pointer-events: auto;
1549
+ }
1550
+ .gen-select-option {
1551
+ display: flex;
1552
+ flex-direction: row;
1553
+ align-items: center;
1554
+ gap: 8px;
1555
+
1556
+ width: 100%;
1557
+ margin: 0;
1558
+ padding: 7px 9px;
1559
+
1560
+ background-color: transparent;
1561
+ border: none;
1562
+ border-radius: 9px;
1563
+
1564
+ font-family: inherit;
1565
+ font-size: 13px;
1566
+ color: var(--chat-text, #1a1a1a);
1567
+ text-align: left;
1568
+ cursor: pointer;
1569
+
1570
+ transition: background-color 0.14s ease;
1571
+ }
1572
+ .gen-select-option:hover {
1573
+ background-color: var(--chat-secondary, #f0f0f0);
1574
+ }
1575
+ .gen-select-option[aria-selected="true"] {
1576
+ background-color: var(--chat-secondary, #f0f0f0);
1577
+ font-weight: 600;
1578
+ }
1579
+ .gen-select-option-icon {
1580
+ width: 18px;
1581
+ height: 18px;
1582
+ flex-shrink: 0;
1583
+ border-radius: 4px;
1584
+ object-fit: contain;
1585
+ }
1586
+ .gen-select-option-label {
1587
+ white-space: nowrap;
1588
+ overflow: hidden;
1589
+ text-overflow: ellipsis;
1590
+ }
1591
+
1592
+ .gen-select-option-chevron {
1593
+ margin-left: auto;
1594
+ font-size: 16px !important;
1595
+ color: var(--chat-accent, #888);
1596
+ }
1597
+ .gen-select-trigger-reasoning {
1598
+ color: var(--chat-accent, #888);
1599
+ white-space: nowrap;
1600
+ flex-shrink: 0;
1601
+ }
1602
+ .gen-select-reasoning {
1603
+ position: absolute;
1604
+ top: 0;
1605
+ left: 0;
1606
+ z-index: 21;
1607
+
1608
+ display: flex;
1609
+ flex-direction: column;
1610
+ gap: 2px;
1611
+
1612
+ min-width: 120px;
1613
+ padding: 6px;
1614
+
1615
+ max-height: calc(100vh - 24px);
1616
+ overflow-y: auto;
1617
+ scrollbar-width: none;
1618
+
1619
+ background-color: var(--chat-input-bg, #fff);
1620
+ border: 1px solid var(--chat-border, #e0e0e0);
1621
+ border-radius: 14px;
1622
+ box-shadow: 0 12px 32px -8px rgba(0, 0, 0, 0.25);
1623
+ }
1624
+ .gen-select-reasoning-option {
1625
+ width: 100%;
1626
+ margin: 0;
1627
+ padding: 7px 9px;
1628
+
1629
+ background-color: transparent;
1630
+ border: none;
1631
+ border-radius: 9px;
1632
+
1633
+ font-family: inherit;
1634
+ font-size: 13px;
1635
+ color: var(--chat-text, #1a1a1a);
1636
+ text-align: left;
1637
+ cursor: pointer;
1638
+
1639
+ transition: background-color 0.14s ease;
1640
+ }
1641
+ .gen-select-reasoning-option:hover {
1642
+ background-color: var(--chat-secondary, #f0f0f0);
1643
+ }
1644
+ .gen-select-reasoning-option[aria-selected="true"] {
1645
+ background-color: var(--chat-secondary, #f0f0f0);
1646
+ font-weight: 600;
1647
+ }
1648
+
1649
+ .gen-demographic {
1650
+ display: flex;
1651
+ flex-direction: column;
1652
+ gap: 14px;
1653
+ width: min(420px, 100%);
1654
+ }
1655
+ .gen-demographic-row {
1656
+ display: flex;
1657
+ flex-direction: column;
1658
+ gap: 6px;
1659
+ }
1660
+ .gen-demographic-head {
1661
+ display: flex;
1662
+ justify-content: space-between;
1663
+ font-size: 12px;
1664
+ color: var(--chat-accent, #888);
1665
+ }
1666
+ .gen-demographic-readout {
1667
+ color: var(--chat-text, #1a1a1a);
1668
+ }
1669
+ .gen-demographic-row input[type="range"] {
1670
+ width: 100%;
1671
+ accent-color: #3B5BB8;
1672
+ }
1673
+ .gen-demographic-chips {
1674
+ display: flex;
1675
+ flex-wrap: wrap;
1676
+ gap: 6px;
1677
+ }
1678
+ .gen-demographic-chips button {
1679
+ border: 1px solid var(--chat-border, #e0e0e0);
1680
+ background: var(--chat-input-bg, #fff);
1681
+ color: var(--chat-text, #1a1a1a);
1682
+ font: inherit;
1683
+ font-size: 12px;
1684
+ padding: 5px 10px;
1685
+ border-radius: 999px;
1686
+ cursor: pointer;
1687
+ }
1688
+ .gen-demographic-chips button.is-selected {
1689
+ border-color: rgba(59, 91, 184, 0.35);
1690
+ background: #E8EEFC;
1691
+ color: #3B5BB8;
1692
+ }
1693
+
1694
+ .chat-input-parts {
1695
+ position: relative;
1696
+
1697
+ display: flex;
1698
+ flex-direction: row;
1699
+ align-items: center;
1700
+
1701
+ gap: 10px;
1702
+ padding: 0px 4px;
1703
+
1704
+ width: 100%;
1705
+ height: 0px;
1706
+ opacity: 0;
1707
+
1708
+ /* Collapsed by default ? keep it from contributing any space (or stray
1709
+ border) above the text row when there are no attachments. It lives
1710
+ inside the single .chat-input pill now, so it needs no border of its
1711
+ own. attachPart() animates the height open. */
1712
+ overflow: hidden;
1713
+
1714
+ box-sizing: border-box;
1715
+ }
1716
+
1717
+ .chat-input-part {
1718
+ position: relative;
1719
+
1720
+ display: flex;
1721
+ flex-direction: column;
1722
+ align-items: center;
1723
+ justify-content: center;
1724
+
1725
+ gap: 8px;
1726
+
1727
+ border: 1px solid var(--chat-border, #e0e0e0);
1728
+
1729
+ overflow: hidden;
1730
+
1731
+ border-radius: 10px;
1732
+
1733
+ width: 100px;
1734
+ height: 100%;
1735
+
1736
+ box-sizing: border-box;
1737
+
1738
+ user-select: none;
1739
+ }
1740
+ .chat-input-part-delete {
1741
+ position: absolute;
1742
+ top: 2px;
1743
+ right: 2px;
1744
+ z-index: 1;
1745
+
1746
+ font-size: 14px !important;
1747
+ color: var(--chat-accent, #888);
1748
+ background: var(--chat-input-bg, #fff);
1749
+ border-radius: 50%;
1750
+
1751
+ cursor: pointer;
1752
+ }
1753
+ .chat-input-part-thumb.chat-file-thumb-on {
1754
+ width: 84px;
1755
+ height: 64px;
1756
+ border-radius: 6px;
1757
+ background: var(--chat-secondary, #f5f5f5);
1758
+ }
1759
+ .chat-input-part-thumb > img { object-fit: cover; }
1760
+ .chat-input-part-preview {
1761
+ font-size: 32px !important;
1762
+ color: var(--chat-accent, #888);
1763
+ }
1764
+ .chat-input-part-label {
1765
+ font-size: 11px;
1766
+ text-align: center;
1767
+ color: var(--chat-accent, #888);
1768
+ }
1769
+
1770
+
1771
+
1772
+ /* Tokenized Input */
1773
+ .tokenized-root {
1774
+ position: relative;
1775
+ display: flex;
1776
+ flex-direction: column;
1777
+ width: 100%;
1778
+ }
1779
+
1780
+ .tokenized-editor {
1781
+ flex: 1;
1782
+ min-height: 20px;
1783
+
1784
+ margin: 0;
1785
+ padding: 0;
1786
+
1787
+ box-sizing: border-box;
1788
+
1789
+ border: none;
1790
+ outline: none;
1791
+ background-color: transparent;
1792
+
1793
+ font-family: inherit;
1794
+ font-size: 14px;
1795
+ color: inherit;
1796
+
1797
+ white-space: pre-wrap;
1798
+ word-wrap: break-word;
1799
+ overflow-wrap: break-word;
1800
+
1801
+ line-height: 1.6;
1802
+ cursor: text;
1803
+ }
1804
+
1805
+ .tokenized-editor:empty::before {
1806
+ content: attr(data-placeholder);
1807
+ color: var(--chat-accent, #888);
1808
+ pointer-events: none;
1809
+ font-style: normal;
1810
+ }
1811
+
1812
+ /* Read-only token chip rendered inside sent/loaded messages. Mirrors the
1813
+ composer's .tokenized-token, minus the remove control. */
1814
+ .chat-message-token {
1815
+ display: inline-flex;
1816
+ align-items: center;
1817
+ gap: 4px;
1818
+ max-width: 100%;
1819
+ min-width: 0;
1820
+
1821
+ padding: 0px 8px;
1822
+ margin: 0 1px;
1823
+
1824
+ border-radius: 12px;
1825
+ background-color: var(--chat-secondary, #f0f0f0);
1826
+ border: 1px solid var(--chat-border, #e0e0e0);
1827
+
1828
+ font-size: 13px;
1829
+ line-height: 1.4;
1830
+
1831
+ vertical-align: middle;
1832
+ user-select: none;
1833
+ }
1834
+
1835
+ .chat-message-token-icon {
1836
+ font-size: 14px !important;
1837
+ color: var(--chat-accent, #888);
1838
+ }
1839
+
1840
+ .chat-message-token-label {
1841
+ min-width: 0;
1842
+ overflow: hidden;
1843
+ text-overflow: ellipsis;
1844
+ white-space: nowrap;
1845
+ }
1846
+
1847
+ .tokenized-token {
1848
+ display: inline-flex;
1849
+ align-items: center;
1850
+ gap: 4px;
1851
+ max-width: 100%;
1852
+ min-width: 0;
1853
+
1854
+ padding: 0px 6px 0px 8px;
1855
+ margin: 0 1px;
1856
+
1857
+ border-radius: 12px;
1858
+ background-color: var(--chat-secondary, #f0f0f0);
1859
+ border: 1px solid var(--chat-border, #e0e0e0);
1860
+
1861
+ font-size: 13px;
1862
+ line-height: inherit;
1863
+
1864
+ vertical-align: middle;
1865
+ user-select: none;
1866
+ cursor: default;
1867
+
1868
+ transition: background-color 0.15s, border-color 0.15s;
1869
+ }
1870
+ .tokenized-token:hover {
1871
+ border-color: var(--chat-accent, #888);
1872
+ }
1873
+
1874
+ .tokenized-token-icon {
1875
+ font-size: 14px !important;
1876
+ color: var(--chat-accent, #888);
1877
+ }
1878
+
1879
+ .tokenized-token-label {
1880
+ min-width: 0;
1881
+ overflow: hidden;
1882
+ text-overflow: ellipsis;
1883
+ white-space: nowrap;
1884
+ }
1885
+
1886
+ .tokenized-token-remove {
1887
+ font-size: 14px !important;
1888
+ color: var(--chat-accent, #888);
1889
+ cursor: pointer;
1890
+ border-radius: 50%;
1891
+ padding: 1px;
1892
+ transition: color 0.15s, background-color 0.15s;
1893
+ opacity: 0.5;
1894
+ }
1895
+ .tokenized-token-remove:hover {
1896
+ opacity: 1;
1897
+ color: #f87171;
1898
+ background-color: rgba(248, 113, 113, 0.1);
1899
+ }
1900
+
1901
+ .tokenized-suggestions {
1902
+ position: absolute;
1903
+ bottom: 100%;
1904
+ left: 0;
1905
+
1906
+ display: flex;
1907
+ flex-direction: column;
1908
+
1909
+ min-width: 220px;
1910
+ max-width: 360px;
1911
+ max-height: 240px;
1912
+ overflow-y: auto;
1913
+ scrollbar-width: none;
1914
+
1915
+ background-color: var(--chat-input-bg, white);
1916
+ border: 1px solid var(--chat-border, #e0e0e0);
1917
+ border-radius: 10px;
1918
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
1919
+
1920
+ padding: 4px;
1921
+
1922
+ z-index: 50;
1923
+ }
1924
+
1925
+ .tokenized-suggestion {
1926
+ display: flex;
1927
+ align-items: center;
1928
+ gap: 10px;
1929
+
1930
+ padding: 8px 12px;
1931
+ border-radius: 8px;
1932
+
1933
+ cursor: pointer;
1934
+ user-select: none;
1935
+
1936
+ transition: background-color 0.1s;
1937
+ }
1938
+ .tokenized-suggestion:hover,
1939
+ .tokenized-suggestion.active {
1940
+ background-color: var(--chat-secondary, #f0f0f0);
1941
+ }
1942
+
1943
+ .tokenized-suggestion-icon {
1944
+ font-size: 18px !important;
1945
+ color: var(--chat-accent, #888);
1946
+ flex-shrink: 0;
1947
+ }
1948
+
1949
+ .tokenized-suggestion-image {
1950
+ width: 24px;
1951
+ height: 24px;
1952
+ border-radius: 50%;
1953
+ flex-shrink: 0;
1954
+ object-fit: cover;
1955
+ }
1956
+
1957
+ .tokenized-suggestion-text {
1958
+ display: flex;
1959
+ flex-direction: column;
1960
+ min-width: 0;
1961
+ }
1962
+
1963
+ .tokenized-suggestion-label {
1964
+ font-size: 13px;
1965
+ font-weight: 500;
1966
+
1967
+ white-space: nowrap;
1968
+ overflow: hidden;
1969
+ text-overflow: ellipsis;
1970
+ }
1971
+
1972
+ .tokenized-suggestion-subtitle {
1973
+ font-size: 11px;
1974
+ color: var(--chat-accent, #888);
1975
+ opacity: 0.7;
1976
+
1977
+ white-space: nowrap;
1978
+ overflow: hidden;
1979
+ text-overflow: ellipsis;
1980
+ }
1981
+
1982
+
1983
+
1984
+ /* Explorer */
1985
+ .explorer-root {
1986
+ display: flex;
1987
+ flex-direction: column;
1988
+ width: 100%;
1989
+ height: 100%;
1990
+ min-height: 0;
1991
+
1992
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
1993
+ }
1994
+
1995
+ .explorer-toolbar {
1996
+ position: relative;
1997
+
1998
+ display: flex;
1999
+ justify-content: space-between;
2000
+ align-items: center;
2001
+
2002
+ padding: 14px 18px;
2003
+ gap: 14px;
2004
+
2005
+ flex-shrink: 0;
2006
+ }
2007
+ .explorer-toolbar::after {
2008
+ content: '';
2009
+ position: absolute;
2010
+ left: 18px;
2011
+ right: 18px;
2012
+ bottom: 0;
2013
+ height: 1px;
2014
+ background: linear-gradient(to right,
2015
+ transparent,
2016
+ color-mix(in srgb, var(--accent, #888) 35%, transparent) 12%,
2017
+ color-mix(in srgb, var(--accent, #888) 35%, transparent) 88%,
2018
+ transparent);
2019
+ pointer-events: none;
2020
+ }
2021
+
2022
+ .explorer-breadcrumbs {
2023
+ display: flex;
2024
+ align-items: center;
2025
+ gap: 6px;
2026
+
2027
+ flex: 1;
2028
+ min-width: 0;
2029
+
2030
+ overflow-x: auto;
2031
+ scrollbar-width: none;
2032
+
2033
+ font-size: 13px;
2034
+ letter-spacing: 0.01em;
2035
+ }
2036
+ .explorer-breadcrumbs::-webkit-scrollbar { display: none; }
2037
+ .explorer-breadcrumb-home {
2038
+ font-size: 18px !important;
2039
+ color: var(--accent, #888);
2040
+
2041
+ cursor: pointer;
2042
+ user-select: none;
2043
+
2044
+ opacity: 0.55;
2045
+ transition: opacity 0.18s ease, transform 0.18s ease, text-shadow 0.18s ease;
2046
+ }
2047
+ .explorer-breadcrumb-home:hover {
2048
+ opacity: 1;
2049
+ transform: scale(1.08);
2050
+ text-shadow: 0 0 8px color-mix(in srgb, var(--accent, #888) 50%, transparent);
2051
+ }
2052
+ .explorer-breadcrumb-sep {
2053
+ opacity: 0.35;
2054
+ user-select: none;
2055
+
2056
+ font-size: 12px;
2057
+ color: var(--accent, #888);
2058
+ }
2059
+ .explorer-breadcrumb {
2060
+ cursor: pointer;
2061
+ user-select: none;
2062
+
2063
+ white-space: nowrap;
2064
+
2065
+ padding: 4px 8px;
2066
+ border-radius: 7px;
2067
+
2068
+ opacity: 0.6;
2069
+
2070
+ transition: opacity 0.18s ease, background-color 0.18s ease, color 0.18s ease;
2071
+ }
2072
+ .explorer-breadcrumb:hover {
2073
+ opacity: 1;
2074
+ color: var(--accent, #888);
2075
+ background-color: color-mix(in srgb, var(--accent, #888) 10%, transparent);
2076
+ }
2077
+ .explorer-breadcrumb.current {
2078
+ opacity: 1;
2079
+ cursor: default;
2080
+ color: var(--accent, #888);
2081
+ font-weight: 500;
2082
+ }
2083
+ .explorer-breadcrumb.current:hover {
2084
+ background-color: transparent;
2085
+ }
2086
+
2087
+ /* Right-side toolbar column ? stacks view switches above file actions */
2088
+ .explorer-actions-col {
2089
+ display: flex;
2090
+ flex-direction: column;
2091
+ align-items: flex-end;
2092
+ gap: 6px;
2093
+ flex-shrink: 0;
2094
+ }
2095
+
2096
+ .explorer-actions,
2097
+ .explorer-view-switch {
2098
+ display: flex;
2099
+ align-items: center;
2100
+ gap: 6px;
2101
+ flex-shrink: 0;
2102
+ }
2103
+
2104
+ .explorer-actions span,
2105
+ .explorer-view-switch span {
2106
+ font-size: 20px;
2107
+
2108
+ color: var(--text, #F3F6FF);
2109
+
2110
+ cursor: pointer;
2111
+ user-select: none;
2112
+
2113
+ padding: 6px;
2114
+ border-radius: 8px;
2115
+
2116
+ opacity: 0.55;
2117
+ transition: opacity 0.18s ease, color 0.18s ease, background-color 0.18s ease;
2118
+ }
2119
+ .explorer-actions span:hover,
2120
+ .explorer-actions span.active,
2121
+ .explorer-view-switch span:hover,
2122
+ .explorer-view-switch span.active {
2123
+ opacity: 1;
2124
+ color: var(--accent, #888);
2125
+ background-color: color-mix(in srgb, var(--accent, #888) 10%, transparent);
2126
+ }
2127
+
2128
+ .explorer-body {
2129
+ position: relative;
2130
+ flex: 1;
2131
+ min-height: 0;
2132
+ overflow-y: auto;
2133
+ scrollbar-width: none;
2134
+ }
2135
+ .explorer-body::-webkit-scrollbar { display: none; }
2136
+
2137
+ .explorer-list {
2138
+ display: flex;
2139
+ flex-direction: column;
2140
+ gap: 8px;
2141
+ padding: 14px 18px;
2142
+ }
2143
+ .explorer-list.cozy {
2144
+ display: grid;
2145
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
2146
+ gap: 14px;
2147
+ padding: 18px;
2148
+ }
2149
+
2150
+ .explorer-empty {
2151
+ display: flex;
2152
+ flex-direction: column;
2153
+ align-items: center;
2154
+ justify-content: center;
2155
+
2156
+ padding: 80px 20px;
2157
+ gap: 14px;
2158
+
2159
+ user-select: none;
2160
+ }
2161
+ .explorer-empty span {
2162
+ font-size: 56px;
2163
+ color: var(--accent, #888);
2164
+ opacity: 0.35;
2165
+
2166
+ padding: 18px;
2167
+ border-radius: 50%;
2168
+ background: radial-gradient(circle, color-mix(in srgb, var(--accent, #888) 12%, transparent), transparent 65%);
2169
+ }
2170
+ .explorer-empty div {
2171
+ font-size: 13px;
2172
+ letter-spacing: 0.08em;
2173
+ text-transform: uppercase;
2174
+ opacity: 0.55;
2175
+ }
2176
+ .explorer-empty-hint {
2177
+ font-size: 12px !important;
2178
+ letter-spacing: 0.02em !important;
2179
+ text-transform: none !important;
2180
+ opacity: 0.4 !important;
2181
+ }
2182
+
2183
+ .explorer-retry {
2184
+ cursor: pointer;
2185
+
2186
+ padding: 7px 18px;
2187
+
2188
+ border-radius: 8px;
2189
+ border: 1px solid color-mix(in srgb, currentColor 55%, transparent);
2190
+
2191
+ font-size: 12px;
2192
+ letter-spacing: 0.06em;
2193
+ text-transform: uppercase;
2194
+
2195
+ opacity: 0.7 !important;
2196
+ transition: opacity 0.15s, border-color 0.15s, background-color 0.15s;
2197
+
2198
+ margin-top: 6px;
2199
+ }
2200
+ .explorer-retry:hover {
2201
+ opacity: 1 !important;
2202
+ border-color: currentColor;
2203
+ background-color: color-mix(in srgb, currentColor 8%, transparent);
2204
+ }
2205
+
2206
+ .explorer-loading {
2207
+ display: none;
2208
+ flex-direction: column;
2209
+ gap: 4px;
2210
+ padding: 10px 14px;
2211
+ }
2212
+ .explorer-loading-skeleton {
2213
+ height: 52px;
2214
+ border-radius: 10px;
2215
+ background: linear-gradient(120deg,
2216
+ color-mix(in srgb, var(--secondary, #f0f0f0) 60%, transparent),
2217
+ color-mix(in srgb, var(--accent, #e0e0e0) 30%, transparent),
2218
+ color-mix(in srgb, var(--secondary, #f0f0f0) 60%, transparent));
2219
+ background-size: 300% 300%;
2220
+ animation: progress-gradient 3s linear infinite;
2221
+ opacity: 0.4;
2222
+ }
2223
+
2224
+ .explorer-dropzone {
2225
+ position: absolute;
2226
+ inset: 8px;
2227
+
2228
+ display: none;
2229
+ flex-direction: column;
2230
+ align-items: center;
2231
+ justify-content: center;
2232
+ gap: 12px;
2233
+
2234
+ background: radial-gradient(circle at center,
2235
+ color-mix(in srgb, var(--accent, #888) 14%, transparent),
2236
+ color-mix(in srgb, var(--accent, #888) 4%, transparent) 60%);
2237
+
2238
+ border: 2px dashed color-mix(in srgb, var(--accent, #888) 65%, transparent);
2239
+ border-radius: 12px;
2240
+
2241
+ color: var(--accent, #888);
2242
+ font-size: 13px;
2243
+ letter-spacing: 0.06em;
2244
+ text-transform: uppercase;
2245
+
2246
+ z-index: 10;
2247
+ user-select: none;
2248
+
2249
+ box-shadow: inset 0 0 60px color-mix(in srgb, var(--accent, #888) 18%, transparent);
2250
+ }
2251
+ .explorer-dropzone span {
2252
+ font-size: 40px;
2253
+ text-shadow: 0 0 18px color-mix(in srgb, var(--accent, #888) 50%, transparent);
2254
+ }
2255
+
2256
+ /* Integrations ? connections panel (card grid) */
2257
+ .connections-root {
2258
+ width: 100%;
2259
+ }
2260
+
2261
+ .connections-grid {
2262
+ display: grid;
2263
+ grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
2264
+ gap: 14px;
2265
+ width: 100%;
2266
+ }
2267
+
2268
+ .connection-card {
2269
+ display: flex;
2270
+ flex-direction: column;
2271
+ gap: 12px;
2272
+
2273
+ padding: 16px;
2274
+
2275
+ border: 1px solid var(--border, color-mix(in srgb, var(--text, #1a1a18) 12%, transparent));
2276
+ border-radius: 14px;
2277
+
2278
+ background: color-mix(in srgb, var(--text, #1a1a18) 3%, var(--surface, #fff));
2279
+
2280
+ transition: border-color 0.18s ease, box-shadow 0.18s ease, transform 0.18s ease;
2281
+ }
2282
+ .connection-card:hover {
2283
+ border-color: color-mix(in srgb, var(--text, #1a1a18) 22%, transparent);
2284
+ box-shadow: 0 12px 30px -18px rgba(0, 0, 0, 0.4);
2285
+ transform: translateY(-1px);
2286
+ }
2287
+ .connection-card.connected {
2288
+ border-color: color-mix(in srgb, #22c55e 45%, transparent);
2289
+ }
2290
+
2291
+ .connection-card-head {
2292
+ display: flex;
2293
+ align-items: center;
2294
+ gap: 12px;
2295
+ }
2296
+ .connection-card-logo {
2297
+ display: inline-flex;
2298
+ align-items: center;
2299
+ justify-content: center;
2300
+
2301
+ width: 40px;
2302
+ height: 40px;
2303
+ flex: 0 0 40px;
2304
+
2305
+ border-radius: 10px;
2306
+ background: color-mix(in srgb, var(--text, #1a1a18) 5%, transparent);
2307
+ }
2308
+ .connection-card-logo svg {
2309
+ width: 24px;
2310
+ height: 24px;
2311
+ display: block;
2312
+ }
2313
+ .connection-card-titles {
2314
+ display: flex;
2315
+ flex-direction: column;
2316
+ gap: 1px;
2317
+ min-width: 0;
2318
+ flex: 1;
2319
+ }
2320
+ .connection-card-name {
2321
+ font-size: 15px;
2322
+ font-weight: 600;
2323
+ color: var(--text, #1a1a18);
2324
+ line-height: 1.2;
2325
+ }
2326
+ .connection-card-status {
2327
+ font-size: 12px;
2328
+ color: color-mix(in srgb, var(--text, #1a1a18) 55%, transparent);
2329
+ }
2330
+ .connection-card-check {
2331
+ font-size: 20px !important;
2332
+ color: #22c55e;
2333
+ }
2334
+
2335
+ .connection-card-accounts {
2336
+ display: flex;
2337
+ flex-direction: column;
2338
+ gap: 6px;
2339
+ }
2340
+ .connection-account {
2341
+ display: flex;
2342
+ align-items: center;
2343
+ gap: 8px;
2344
+
2345
+ padding: 7px 10px;
2346
+
2347
+ border-radius: 9px;
2348
+ background: color-mix(in srgb, var(--text, #1a1a18) 4%, transparent);
2349
+ }
2350
+ .connection-account-label {
2351
+ flex: 1;
2352
+ min-width: 0;
2353
+
2354
+ overflow: hidden;
2355
+ text-overflow: ellipsis;
2356
+ white-space: nowrap;
2357
+
2358
+ font-size: 13px;
2359
+ color: var(--text, #1a1a18);
2360
+ }
2361
+ .connection-account-unlink {
2362
+ display: inline-flex;
2363
+ align-items: center;
2364
+ justify-content: center;
2365
+
2366
+ width: 22px;
2367
+ height: 22px;
2368
+ padding: 0;
2369
+
2370
+ border: none;
2371
+ border-radius: 6px;
2372
+ background: transparent;
2373
+ color: color-mix(in srgb, var(--text, #1a1a18) 45%, transparent);
2374
+
2375
+ cursor: pointer;
2376
+ transition: color 0.15s ease, background-color 0.15s ease;
2377
+ }
2378
+ .connection-account-unlink span {
2379
+ font-size: 16px !important;
2380
+ }
2381
+ .connection-account-unlink:hover {
2382
+ color: #ef4444;
2383
+ background-color: rgba(239, 68, 68, 0.12);
2384
+ }
2385
+
2386
+ .connection-card-connect {
2387
+ display: inline-flex;
2388
+ align-items: center;
2389
+ justify-content: center;
2390
+ gap: 6px;
2391
+
2392
+ margin-top: auto;
2393
+ padding: 9px 14px;
2394
+
2395
+ border: 1px solid var(--border, color-mix(in srgb, var(--text, #1a1a18) 14%, transparent));
2396
+ border-radius: 10px;
2397
+ background: transparent;
2398
+ color: var(--text, #1a1a18);
2399
+
2400
+ cursor: pointer;
2401
+ user-select: none;
2402
+
2403
+ font-size: 13px;
2404
+ font-weight: 600;
2405
+
2406
+ transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
2407
+ }
2408
+ .connection-card-connect span:first-child {
2409
+ font-size: 18px !important;
2410
+ }
2411
+ .connection-card-connect:hover {
2412
+ background: color-mix(in srgb, var(--text, #1a1a18) 6%, transparent);
2413
+ border-color: color-mix(in srgb, var(--text, #1a1a18) 26%, transparent);
2414
+ }
2415
+ .connection-card.connected .connection-card-connect {
2416
+ font-weight: 500;
2417
+ color: color-mix(in srgb, var(--text, #1a1a18) 70%, transparent);
2418
+ }
2419
+
2420
+
2421
+ /* Social sign-in buttons (UI.Authentification.createOAuthButtons).
2422
+ Themed via --oauth-* custom properties so each app can recolor without
2423
+ touching this stylesheet. */
2424
+ .oauth-buttons {
2425
+ display: flex;
2426
+ flex-direction: column;
2427
+ gap: 10px;
2428
+
2429
+ width: 100%;
2430
+ }
2431
+
2432
+ .oauth-divider {
2433
+ display: flex;
2434
+ align-items: center;
2435
+ gap: 12px;
2436
+
2437
+ margin: 4px 0;
2438
+
2439
+ color: var(--oauth-muted, #9a9a9a);
2440
+ font-size: 12px;
2441
+ text-transform: uppercase;
2442
+ letter-spacing: 0.08em;
2443
+ }
2444
+ .oauth-divider::before,
2445
+ .oauth-divider::after {
2446
+ content: '';
2447
+ flex: 1;
2448
+ height: 1px;
2449
+ background: var(--oauth-border, #e0e0e0);
2450
+ }
2451
+
2452
+ .oauth-button {
2453
+ display: flex;
2454
+ align-items: center;
2455
+ justify-content: center;
2456
+ gap: 10px;
2457
+
2458
+ width: 100%;
2459
+ padding: 11px 16px;
2460
+
2461
+ border: 1px solid var(--oauth-border, #e0e0e0);
2462
+ border-radius: var(--oauth-radius, 10px);
2463
+ background: var(--oauth-bg, #ffffff);
2464
+ color: var(--oauth-text, #1a1a1a);
2465
+
2466
+ font-family: inherit;
2467
+ font-size: 14px;
2468
+ font-weight: 500;
2469
+
2470
+ cursor: pointer;
2471
+ user-select: none;
2472
+
2473
+ transition: background 0.18s ease, border-color 0.18s ease, box-shadow 0.18s ease, transform 0.08s ease;
2474
+ }
2475
+ .oauth-button:hover {
2476
+ background: var(--oauth-bg-hover, color-mix(in srgb, var(--oauth-bg, #ffffff) 92%, #000));
2477
+ border-color: var(--oauth-border-hover, color-mix(in srgb, var(--oauth-border, #e0e0e0) 70%, #000));
2478
+ box-shadow: 0 6px 18px -12px rgba(0, 0, 0, 0.45);
2479
+ }
2480
+ .oauth-button:active {
2481
+ transform: translateY(1px);
2482
+ }
2483
+
2484
+ .oauth-button-icon {
2485
+ display: inline-flex;
2486
+ align-items: center;
2487
+ justify-content: center;
2488
+
2489
+ width: 18px;
2490
+ height: 18px;
2491
+ }
2492
+ .oauth-button-icon svg {
2493
+ display: block;
2494
+ }
2495
+
2496
+ .oauth-button-label {
2497
+ white-space: nowrap;
2498
+ }
2499
+
2500
+
2501
+ /* Animations */
2502
+ @keyframes progress-gradient {
2503
+ 0% {
2504
+ background-position: 0% 50%;
2505
+ }
2506
+ 100% {
2507
+ background-position: 300% 50%;
2508
+ }
2509
+ }
2510
+
2511
+
2512
+ /* -- Shared hang avatars (chat + talk, built in generative.tsx) ------------ */
2513
+
2514
+ /* User badge bottom-right; model catalog icon bottom-left. */
2515
+ .chat-message-authored {
2516
+ position: relative;
2517
+ padding-right: 14px;
2518
+ }
2519
+ .chat-message-avatar {
2520
+ width: 22px;
2521
+ height: 22px;
2522
+ border-radius: 50%;
2523
+ object-fit: cover;
2524
+
2525
+ background-color: var(--chat-secondary, #f0f0f0);
2526
+ border: 2px solid var(--chat-input-bg, #fff);
2527
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.18);
2528
+ }
2529
+ .chat-message-authored .chat-message-avatar {
2530
+ position: absolute;
2531
+ right: -12px;
2532
+ bottom: -12px;
2533
+ z-index: 2;
2534
+ }
2535
+
2536
+ /* MODEL bubbles: producing model's icon pinned bottom-left. */
2537
+ .chat-message-model-authored {
2538
+ position: relative;
2539
+ padding-left: 14px;
2540
+ }
2541
+ .chat-message-model-authored .chat-message-model-avatar {
2542
+ position: absolute;
2543
+ left: -12px;
2544
+ bottom: -12px;
2545
+ z-index: 2;
2546
+ }
2547
+ .chat-message-model-avatar-fallback {
2548
+ display: inline-flex;
2549
+ align-items: center;
2550
+ justify-content: center;
2551
+ font-size: 14px !important;
2552
+ color: var(--chat-accent, #888);
2553
+ }
2554
+
2555
+ /* Roster: the row of member avatars pinned to the top of a live room. */
2556
+ .chat-room-roster {
2557
+ position: sticky;
2558
+ top: 0;
2559
+ z-index: 4;
2560
+
2561
+ display: flex;
2562
+ flex-direction: row;
2563
+ align-items: center;
2564
+ gap: 6px;
2565
+
2566
+ padding: 10px 12px;
2567
+ margin-bottom: 4px;
2568
+
2569
+ background: transparent;
2570
+ }
2571
+ .chat-room-member {
2572
+ display: flex;
2573
+ align-items: center;
2574
+ }
2575
+ .chat-room-member .chat-message-avatar {
2576
+ width: 28px;
2577
+ height: 28px;
2578
+ transition: transform 0.15s;
2579
+ }
2580
+ .chat-room-member .chat-message-avatar:hover {
2581
+ transform: translateY(-2px);
2582
+ }
2583
+
2584
+ /* Shown when the live Parrot room is destroyed (reap / host leave). */
2585
+ .chat-room-ended {
2586
+ margin: 12px 8px;
2587
+ padding: 10px 12px;
2588
+ border-radius: 8px;
2589
+ font-size: 13px;
2590
+ line-height: 1.4;
2591
+ color: var(--text-muted, #6b7280);
2592
+ background: var(--surface-2, rgba(0, 0, 0, 0.04));
2593
+ }
2594
+
2595
+ /* Typing indicator, styled like common messaging apps ? a subtle line that
2596
+ appears above the input when someone is typing. */
2597
+ .chat-room-typing {
2598
+ height: 0;
2599
+ overflow: hidden;
2600
+ opacity: 0;
2601
+
2602
+ font-size: 12px;
2603
+ font-style: italic;
2604
+ color: var(--chat-accent, #888);
2605
+
2606
+ padding: 0 4px;
2607
+ transition: opacity 0.2s, height 0.2s, margin 0.2s;
2608
+ }
2609
+ .chat-room-typing-active {
2610
+ height: 16px;
2611
+ opacity: 1;
2612
+ margin-bottom: 6px;
2613
+ }
2614
+
2615
+
2616
+ /* -- Per-message actions: floating hover-out pill ----------------------------
2617
+ Overrides the in-flow ".chat-message-actions" row defined earlier. The
2618
+ per-message options (copy, ...) now live in a rounded pill that hovers out on
2619
+ message hover, freeing the bubble's bottom-right corner for the pinned sender
2620
+ avatar. User + model share the same pill wrapper; it sits in the left gutter
2621
+ for user turns and just below the bubble for model turns. A transparent
2622
+ bridge fills the small gap to the bubble so moving the cursor onto the pill
2623
+ never drops the :hover. */
2624
+ .chat-message-user,
2625
+ .chat-message-model {
2626
+ position: relative;
2627
+ }
2628
+
2629
+ .chat-message-actions {
2630
+ position: absolute;
2631
+ z-index: 3;
2632
+
2633
+ display: flex;
2634
+ flex-direction: row;
2635
+ align-items: center;
2636
+ gap: 6px;
2637
+
2638
+ margin: 0;
2639
+ padding: 2px 6px;
2640
+ border-radius: 999px;
2641
+
2642
+ background-color: var(--chat-input-bg, #fff);
2643
+ border: 1px solid var(--chat-border, #e0e0e0);
2644
+ box-shadow: 0 6px 18px rgba(0, 0, 0, 0.12);
2645
+
2646
+ opacity: 0;
2647
+ pointer-events: none;
2648
+ transition: opacity 0.18s ease, transform 0.18s ease;
2649
+ }
2650
+
2651
+ /* Both user + model: the pill hovers out just ABOVE the bubble for consistent
2652
+ placement. Model aligns to the bubble's left edge, user to the right edge; the
2653
+ bottom-right corner stays clear for the pinned sender avatar. */
2654
+ .chat-message-model .chat-message-actions,
2655
+ .chat-message-user .chat-message-actions {
2656
+ bottom: calc(100% + 5px);
2657
+ top: auto;
2658
+ transform: translateY(6px);
2659
+ }
2660
+ .chat-message-model .chat-message-actions {
2661
+ left: 0;
2662
+ right: auto;
2663
+ }
2664
+ .chat-message-user .chat-message-actions {
2665
+ right: 0;
2666
+ left: auto;
2667
+ }
2668
+
2669
+ .chat-message-time {
2670
+ width: auto !important;
2671
+ height: auto !important;
2672
+ padding: 0 4px !important;
2673
+ font-size: 10px !important;
2674
+ line-height: 1.2;
2675
+ color: var(--chat-accent, #888);
2676
+ white-space: nowrap;
2677
+ user-select: none;
2678
+ cursor: default;
2679
+ }
2680
+
2681
+ /* Transparent bridge fills the gap BELOW the pill (down to the bubble top) so
2682
+ moving the cursor from the bubble onto the pill never drops the :hover. */
2683
+ .chat-message-actions::before {
2684
+ content: "";
2685
+ position: absolute;
2686
+ top: 100%;
2687
+ left: 0;
2688
+ right: 0;
2689
+ height: 8px;
2690
+ }
2691
+
2692
+ .chat-message-user:hover .chat-message-actions,
2693
+ .chat-message-model:hover .chat-message-actions {
2694
+ opacity: 1;
2695
+ pointer-events: auto;
2696
+ transform: translateY(0);
2697
+ }
2698
+
2699
+ .chat-message-actions span {
2700
+ display: flex;
2701
+ align-items: center;
2702
+ justify-content: center;
2703
+
2704
+ width: 20px;
2705
+ height: 20px;
2706
+ padding: 0;
2707
+
2708
+ font-size: 16px !important;
2709
+ color: var(--chat-accent, #888);
2710
+ cursor: pointer;
2711
+ user-select: none;
2712
+
2713
+ border-radius: 50%;
2714
+ line-height: 1;
2715
+ transition: color 0.15s, background-color 0.15s;
2716
+ }
2717
+ .chat-message-actions span:hover {
2718
+ color: var(--chat-text, #1a1a1a);
2719
+ background-color: var(--chat-secondary, #f0f0f0);
2720
+ }
2721
+
2722
+ .talk {
2723
+ --talk-text: var(--chat-text, #1a1a1a);
2724
+ --talk-accent: var(--chat-accent, #888);
2725
+ --talk-border: var(--chat-border, #e0e0e0);
2726
+ --talk-bg: var(--chat-input-bg, #fff);
2727
+ --talk-assistant: #E8EEFC;
2728
+ --talk-blue: #3B5BB8;
2729
+ --talk-rose: #B85C5C;
2730
+ --talk-rose-soft: #FBEFEF;
2731
+
2732
+ display: grid;
2733
+ grid-template-columns: 1fr minmax(0, 0fr);
2734
+ flex: 1;
2735
+ min-height: 0;
2736
+ height: 100%;
2737
+ overflow: hidden;
2738
+ box-sizing: border-box;
2739
+ }
2740
+
2741
+ .talk.is-split {
2742
+ grid-template-columns: minmax(240px, 38%) 1fr;
2743
+ }
2744
+
2745
+ .talk-stage {
2746
+ display: flex;
2747
+ flex-direction: column;
2748
+ align-items: center;
2749
+ justify-content: center;
2750
+ gap: 18px;
2751
+ padding: 36px 28px;
2752
+ min-width: 0;
2753
+ min-height: 0;
2754
+ overflow-x: hidden;
2755
+ overflow-y: auto;
2756
+ box-sizing: border-box;
2757
+ }
2758
+
2759
+ .talk-orb {
2760
+ position: relative;
2761
+ width: 168px;
2762
+ height: 168px;
2763
+ display: grid;
2764
+ place-items: center;
2765
+ flex-shrink: 0;
2766
+ }
2767
+
2768
+ .talk-orb-core {
2769
+ width: 86px;
2770
+ height: 86px;
2771
+ border-radius: 50%;
2772
+ background:
2773
+ radial-gradient(circle at 35% 30%, #fffefb, #d7e0f7 42%, var(--talk-blue) 100%);
2774
+ box-shadow:
2775
+ 0 10px 28px rgba(59, 91, 184, 0.22),
2776
+ inset 0 1px 0 rgba(255, 255, 255, 0.7);
2777
+ }
2778
+
2779
+ .talk-orb-ring {
2780
+ position: absolute;
2781
+ inset: 0;
2782
+ border-radius: 50%;
2783
+ border: 1px solid rgba(59, 91, 184, 0.18);
2784
+ opacity: 0.35;
2785
+ }
2786
+
2787
+ .talk-orb-ring:nth-child(2) {
2788
+ inset: 18px;
2789
+ }
2790
+
2791
+ .talk-orb-idle .talk-orb-core {
2792
+ animation: talkBreathe 3.6s ease-in-out infinite;
2793
+ }
2794
+
2795
+ .talk-orb-connecting .talk-orb-core,
2796
+ .talk-orb-listening .talk-orb-core {
2797
+ animation: talkListen 2.6s ease-in-out infinite;
2798
+ }
2799
+
2800
+ .talk-orb-talking .talk-orb-core {
2801
+ animation: talkSpeak 0.7s ease-in-out infinite;
2802
+ background:
2803
+ radial-gradient(circle at 35% 30%, #fffefb, #c9d6f6 36%, var(--talk-blue) 100%);
2804
+ }
2805
+
2806
+ .talk-orb-listening .talk-orb-ring,
2807
+ .talk-orb-connecting .talk-orb-ring {
2808
+ animation: talkRipple 3.2s ease-out infinite;
2809
+ }
2810
+
2811
+ .talk-orb-talking .talk-orb-ring {
2812
+ animation: talkRipple 2.2s ease-out infinite;
2813
+ }
2814
+
2815
+ .talk-orb-talking .talk-orb-ring:nth-child(2) {
2816
+ animation-delay: 0.4s;
2817
+ }
2818
+
2819
+ @keyframes talkBreathe {
2820
+ 0%, 100% { transform: scale(1); }
2821
+ 50% { transform: scale(1.04); }
2822
+ }
2823
+
2824
+ @keyframes talkListen {
2825
+ 0%, 100% { transform: scale(1); }
2826
+ 50% { transform: scale(1.08); }
2827
+ }
2828
+
2829
+ @keyframes talkSpeak {
2830
+ 0%, 100% { transform: scale(1); }
2831
+ 50% { transform: scale(1.14); }
2832
+ }
2833
+
2834
+ @keyframes talkRipple {
2835
+ 0% { transform: scale(0.86); opacity: 0.45; }
2836
+ 100% { transform: scale(1.12); opacity: 0; }
2837
+ }
2838
+
2839
+ .talk-status {
2840
+ margin: 0;
2841
+ width: min(280px, 100%);
2842
+ text-align: left;
2843
+ font-size: 15px;
2844
+ letter-spacing: 0.04em;
2845
+ color: var(--talk-accent);
2846
+ }
2847
+
2848
+ .talk-error {
2849
+ margin: 0;
2850
+ width: min(280px, 100%);
2851
+ text-align: left;
2852
+ color: var(--talk-rose);
2853
+ font-size: 13px;
2854
+ }
2855
+
2856
+ .talk-controls {
2857
+ display: flex;
2858
+ flex-direction: column;
2859
+ align-items: center;
2860
+ gap: 14px;
2861
+ width: min(280px, 100%);
2862
+ }
2863
+
2864
+ .talk-stage .gen-select {
2865
+ align-self: center;
2866
+ width: max-content;
2867
+ }
2868
+
2869
+ .talk-stage .gen-demographic {
2870
+ width: 100%;
2871
+ }
2872
+
2873
+ .talk-stage .gen-demographic-head {
2874
+ text-align: left;
2875
+ }
2876
+
2877
+ .talk-stage .gen-demographic-chips {
2878
+ justify-content: center;
2879
+ }
2880
+
2881
+ .talk-start,
2882
+ .talk-hang-up {
2883
+ border: none;
2884
+ font: inherit;
2885
+ font-size: 14px;
2886
+ padding: 10px 22px;
2887
+ border-radius: 999px;
2888
+ cursor: pointer;
2889
+ align-self: center;
2890
+ }
2891
+
2892
+ .talk-start {
2893
+ background: var(--talk-blue);
2894
+ color: #fff;
2895
+ }
2896
+
2897
+ .talk-hang-up {
2898
+ background: var(--talk-rose-soft);
2899
+ color: var(--talk-rose);
2900
+ }
2901
+
2902
+ .talk-log {
2903
+ display: flex;
2904
+ flex-direction: column;
2905
+ gap: 12px;
2906
+ min-width: 0;
2907
+ min-height: 0;
2908
+ height: 100%;
2909
+ overflow: hidden;
2910
+ padding: 20vh 28px 20vh;
2911
+ opacity: 0;
2912
+ pointer-events: none;
2913
+ box-sizing: border-box;
2914
+ }
2915
+
2916
+ .talk.is-split .talk-log {
2917
+ overflow-x: hidden;
2918
+ overflow-y: auto;
2919
+ opacity: 1;
2920
+ pointer-events: auto;
2921
+ mask-image: linear-gradient(to bottom, transparent, #000 28px, #000 calc(100% - 28px), transparent);
2922
+ -webkit-mask-image: linear-gradient(to bottom, transparent, #000 28px, #000 calc(100% - 28px), transparent);
2923
+ }
2924
+
2925
+ .talk-bubble {
2926
+ max-width: 86%;
2927
+ padding: 12px 16px;
2928
+ border-radius: 18px;
2929
+ background: var(--talk-bg);
2930
+ border: 1px solid var(--talk-border);
2931
+ }
2932
+
2933
+ .talk-bubble .chat-message-avatar {
2934
+ border-color: var(--talk-bg, #fff);
2935
+ background-color: var(--talk-bg, #f0f0f0);
2936
+ }
2937
+
2938
+ .talk-bubble-text {
2939
+ margin: 0;
2940
+ font-size: 14px;
2941
+ line-height: 1.45;
2942
+ color: var(--talk-text);
2943
+ }
2944
+
2945
+ .talk-bubble-user {
2946
+ align-self: flex-end;
2947
+ border-bottom-right-radius: 6px;
2948
+ }
2949
+
2950
+ .talk-bubble-assistant {
2951
+ align-self: flex-start;
2952
+ border-bottom-left-radius: 6px;
2953
+ background: var(--talk-assistant);
2954
+ border-color: rgba(59, 91, 184, 0.12);
2955
+ }
2956
+
2957
+ .talk-memory {
2958
+ display: flex;
2959
+ align-items: center;
2960
+ align-self: center;
2961
+ gap: 6px;
2962
+ max-width: 86%;
2963
+ padding: 8px 12px;
2964
+ border-radius: 999px;
2965
+ background: var(--talk-bg);
2966
+ border: 1px solid var(--talk-border);
2967
+ color: var(--talk-text);
2968
+ font-size: 12px;
2969
+ }
2970
+
2971
+ .talk-memory .material-symbols-outlined {
2972
+ font-size: 16px;
2973
+ color: var(--talk-blue);
2974
+ flex-shrink: 0;
2975
+ }
2976
+
2977
+ .talk-memory-text {
2978
+ line-height: 1.4;
2979
+ display: -webkit-box;
2980
+ -webkit-line-clamp: 3;
2981
+ -webkit-box-orient: vertical;
2982
+ overflow: hidden;
2983
+ }
2984
+
2985
+ .talk-type {
2986
+ display: inline;
2987
+ animation: talkTypeIn 0.38s ease-out both;
2988
+ }
2989
+
2990
+ @keyframes talkTypeIn {
2991
+ from { opacity: 0; }
2992
+ to { opacity: 1; }
2993
+ }
2994
+
2995
+ .tickets-overlay {
2996
+ position: fixed;
2997
+ inset: 0;
2998
+ z-index: 80;
2999
+ pointer-events: none;
3000
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
3001
+ }
3002
+
3003
+ .tickets-overlay.is-dragging,
3004
+ .tickets-overlay.is-dragging * {
3005
+ user-select: none;
3006
+ -webkit-user-select: none;
3007
+ }
3008
+
3009
+ .tickets-vignette {
3010
+ position: absolute;
3011
+ inset: 0;
3012
+ pointer-events: none;
3013
+ /* Quadratic falloff: opacity ≈ 0.22 + 0.56 r², centered. */
3014
+ background: radial-gradient(
3015
+ ellipse 90% 80% at 50% 50%,
3016
+ rgba(8, 8, 10, 0.22) 0%,
3017
+ rgba(8, 8, 10, 0.26) 25%,
3018
+ rgba(8, 8, 10, 0.36) 50%,
3019
+ rgba(8, 8, 10, 0.49) 70%,
3020
+ rgba(8, 8, 10, 0.64) 85%,
3021
+ rgba(8, 8, 10, 0.78) 100%
3022
+ );
3023
+ }
3024
+
3025
+ .tickets-pin-layer {
3026
+ position: absolute;
3027
+ inset: 0;
3028
+ pointer-events: auto;
3029
+ cursor: auto;
3030
+ }
3031
+
3032
+ .tickets-pin-layer.is-aiming {
3033
+ cursor: none;
3034
+ }
3035
+
3036
+ .tickets-pin-cursor {
3037
+ pointer-events: none;
3038
+ }
3039
+
3040
+ .tickets-pin-wrap {
3041
+ position: absolute;
3042
+ transform: translate(-50%, -100%);
3043
+ pointer-events: auto;
3044
+ z-index: 2;
3045
+ color: #f7ef8a;
3046
+ }
3047
+
3048
+ .tickets-pin-wrap::before {
3049
+ content: "";
3050
+ position: absolute;
3051
+ inset: -28px;
3052
+ }
3053
+
3054
+ .tickets-pin-wiggle {
3055
+ display: block;
3056
+ transform-origin: 50% 100%;
3057
+ }
3058
+
3059
+ .tickets-pin-wrap > .tickets-pin-wiggle > svg {
3060
+ position: relative;
3061
+ display: block;
3062
+ color: inherit;
3063
+ }
3064
+
3065
+ .tickets-pin-wrap.is-peeking {
3066
+ z-index: 3;
3067
+ }
3068
+
3069
+ .tickets-pin {
3070
+ position: absolute;
3071
+ transform: translate(-50%, -100%);
3072
+ pointer-events: none;
3073
+ }
3074
+
3075
+ .tickets-pin svg {
3076
+ color: #f7ef8a;
3077
+ }
3078
+
3079
+ .tickets-pin-draft {
3080
+ position: absolute;
3081
+ pointer-events: none;
3082
+ }
3083
+
3084
+ .tickets-pin-draft.is-nested {
3085
+ left: 50%;
3086
+ top: 100%;
3087
+ }
3088
+
3089
+ .tickets-pin-draft {
3090
+ cursor: auto;
3091
+ }
3092
+
3093
+ .tickets-pin-draft .tickets-cancel,
3094
+ .tickets-pin-draft .tickets-cancel *,
3095
+ .tickets-pin-draft .tickets-create,
3096
+ .tickets-pin-draft .tickets-create * {
3097
+ cursor: pointer;
3098
+ }
3099
+
3100
+ .tickets-pin-clone {
3101
+ position: absolute;
3102
+ transform: translate(-50%, -100%);
3103
+ pointer-events: none;
3104
+ color: inherit;
3105
+ }
3106
+
3107
+ .tickets-pin-draft-inner {
3108
+ position: absolute;
3109
+ left: 14px;
3110
+ top: 0;
3111
+ transform: translateY(-28px);
3112
+ pointer-events: auto;
3113
+ }
3114
+
3115
+ .tickets-pin-stack {
3116
+ display: flex;
3117
+ flex-direction: column;
3118
+ align-items: flex-start;
3119
+ gap: 8px;
3120
+ }
3121
+
3122
+ .tickets-pin-field {
3123
+ display: inline-grid;
3124
+ align-items: center;
3125
+ box-sizing: border-box;
3126
+ width: max-content;
3127
+ min-width: 88px;
3128
+ min-height: 42px;
3129
+ max-width: min(280px, 70vw);
3130
+ background: #151515;
3131
+ border: 1px solid rgba(247, 239, 138, 0.35);
3132
+ border-radius: 7px;
3133
+ padding: 11px 14px;
3134
+ }
3135
+
3136
+ .tickets-pin-field:focus-within {
3137
+ border-color: rgba(247, 239, 138, 0.85);
3138
+ box-shadow: 0 0 0 2px rgba(247, 239, 138, 0.16);
3139
+ }
3140
+
3141
+ .tickets-pin-field > textarea,
3142
+ .tickets-pin-field > span {
3143
+ grid-area: 1 / 1;
3144
+ font: inherit;
3145
+ font-size: 14px;
3146
+ line-height: 1.35;
3147
+ white-space: pre-wrap;
3148
+ word-break: break-word;
3149
+ }
3150
+
3151
+ .tickets-pin-field > span {
3152
+ visibility: hidden;
3153
+ min-width: 88px;
3154
+ }
3155
+
3156
+ .tickets-pin-field.is-readonly > span {
3157
+ visibility: visible;
3158
+ color: #fff;
3159
+ }
3160
+
3161
+ .tickets-pin-field > textarea {
3162
+ resize: none;
3163
+ overflow: hidden;
3164
+ width: 100%;
3165
+ height: 100%;
3166
+ background: transparent;
3167
+ border: 0;
3168
+ color: #fff;
3169
+ padding: 0;
3170
+ cursor: text;
3171
+ }
3172
+
3173
+ .tickets-pin-field > textarea:focus {
3174
+ outline: none;
3175
+ }
3176
+
3177
+ .tickets-pin-field > textarea::placeholder {
3178
+ color: #8a8a8a;
3179
+ }
3180
+
3181
+ .tickets-pin-actions {
3182
+ display: flex;
3183
+ align-items: center;
3184
+ gap: 8px;
3185
+ }
3186
+
3187
+ .tickets-cancel {
3188
+ display: inline-flex;
3189
+ align-items: center;
3190
+ justify-content: center;
3191
+ flex-shrink: 0;
3192
+ min-height: 42px;
3193
+ padding: 0 17px;
3194
+ border: 1px solid rgba(247, 239, 138, 0.45);
3195
+ border-radius: 7px;
3196
+ background: transparent;
3197
+ color: #f7ef8a;
3198
+ font-size: 10px;
3199
+ font-weight: 700;
3200
+ letter-spacing: 0.1em;
3201
+ text-transform: uppercase;
3202
+ cursor: pointer;
3203
+ transition: background 0.22s, border-color 0.22s;
3204
+ }
3205
+
3206
+ .tickets-cancel:hover {
3207
+ border-color: #fff8b8;
3208
+ background: rgba(247, 239, 138, 0.08);
3209
+ }
3210
+
3211
+ .tickets-cancel:disabled {
3212
+ opacity: 0.45;
3213
+ cursor: default;
3214
+ }
3215
+
3216
+ .tickets-panel {
3217
+ position: absolute;
3218
+ display: flex;
3219
+ flex-direction: column;
3220
+ font-family: inherit;
3221
+ background: #151515;
3222
+ border: 1px solid rgba(247, 239, 138, 0.28);
3223
+ border-radius: 16px;
3224
+ overflow: hidden;
3225
+ pointer-events: auto;
3226
+ z-index: 1;
3227
+ box-shadow:
3228
+ 0 0 0 0 rgba(247, 239, 138, 0),
3229
+ 0 18px 48px -24px rgba(0, 0, 0, 0.55);
3230
+ --chat-secondary: #1c1c1c;
3231
+ --chat-border: rgba(247, 239, 138, 0.22);
3232
+ --chat-accent: rgba(247, 239, 138, 0.72);
3233
+ --chat-input-bg: #1c1c1c;
3234
+ --chat-text: #ffffff;
3235
+ }
3236
+
3237
+ .tickets-panel-bar {
3238
+ display: flex;
3239
+ justify-content: space-between;
3240
+ align-items: center;
3241
+ padding: 12px 14px;
3242
+ color: #fff;
3243
+ font-size: 15px;
3244
+ cursor: grab;
3245
+ user-select: none;
3246
+ border-bottom: 1px solid rgba(247, 239, 138, 0);
3247
+ }
3248
+
3249
+ .tickets-panel-bar:active {
3250
+ cursor: grabbing;
3251
+ }
3252
+
3253
+ .tickets-panel-brand {
3254
+ display: inline-flex;
3255
+ align-items: center;
3256
+ gap: 10px;
3257
+ min-width: 0;
3258
+ }
3259
+
3260
+ .tickets-panel-brand canvas {
3261
+ width: 22px;
3262
+ height: 22px;
3263
+ display: block;
3264
+ flex-shrink: 0;
3265
+ }
3266
+
3267
+ .tickets-panel-brand > span {
3268
+ overflow: hidden;
3269
+ text-overflow: ellipsis;
3270
+ white-space: nowrap;
3271
+ }
3272
+
3273
+ .tickets-resize {
3274
+ position: absolute;
3275
+ z-index: 3;
3276
+ touch-action: none;
3277
+ user-select: none;
3278
+ -webkit-user-select: none;
3279
+ }
3280
+
3281
+ .tickets-resize-n,
3282
+ .tickets-resize-s {
3283
+ left: 10px;
3284
+ right: 10px;
3285
+ height: 8px;
3286
+ cursor: ns-resize;
3287
+ }
3288
+
3289
+ .tickets-resize-e,
3290
+ .tickets-resize-w {
3291
+ top: 10px;
3292
+ bottom: 10px;
3293
+ width: 8px;
3294
+ cursor: ew-resize;
3295
+ }
3296
+
3297
+ .tickets-resize-n { top: 0; }
3298
+ .tickets-resize-s { bottom: 0; }
3299
+ .tickets-resize-e { right: 0; }
3300
+ .tickets-resize-w { left: 0; }
3301
+
3302
+ .tickets-resize-ne,
3303
+ .tickets-resize-nw,
3304
+ .tickets-resize-se,
3305
+ .tickets-resize-sw {
3306
+ width: 14px;
3307
+ height: 14px;
3308
+ }
3309
+
3310
+ .tickets-resize-ne { top: 0; right: 0; cursor: nesw-resize; }
3311
+ .tickets-resize-nw { top: 0; left: 0; cursor: nwse-resize; }
3312
+ .tickets-resize-se { bottom: 0; right: 0; cursor: nwse-resize; }
3313
+ .tickets-resize-sw { bottom: 0; left: 0; cursor: nesw-resize; }
3314
+
3315
+ .tickets-panel-actions {
3316
+ display: flex;
3317
+ gap: 8px;
3318
+ }
3319
+
3320
+ .tickets-pin-draft button.tickets-create,
3321
+ .tickets-panel-actions .tickets-create {
3322
+ color: #111416;
3323
+ }
3324
+
3325
+ .tickets-board {
3326
+ flex: 1;
3327
+ min-height: 0;
3328
+ display: flex;
3329
+ flex-direction: column;
3330
+ }
3331
+
3332
+ .tickets-board-head {
3333
+ padding: 16px 18px 10px;
3334
+ color: #f7ef8a;
3335
+ font-size: 10px;
3336
+ font-weight: 650;
3337
+ letter-spacing: 0.16em;
3338
+ text-transform: uppercase;
3339
+ }
3340
+
3341
+ .tickets-board-rule {
3342
+ height: 1px;
3343
+ margin: 0 18px;
3344
+ border-radius: 999px;
3345
+ background: rgba(247, 239, 138, 0.16);
3346
+ }
3347
+
3348
+ .tickets-list {
3349
+ flex: 1;
3350
+ overflow: auto;
3351
+ padding: 4px 8px 8px;
3352
+ display: flex;
3353
+ flex-direction: column;
3354
+ }
3355
+
3356
+ .tickets-row {
3357
+ position: relative;
3358
+ display: flex;
3359
+ flex-direction: column;
3360
+ align-items: stretch;
3361
+ gap: 3px;
3362
+ width: 100%;
3363
+ background: transparent;
3364
+ border: none;
3365
+ border-bottom: 1px solid rgba(247, 239, 138, 0.1);
3366
+ color: #fff;
3367
+ padding: 12px 10px;
3368
+ cursor: pointer;
3369
+ text-align: left;
3370
+ }
3371
+
3372
+ .tickets-row-line {
3373
+ position: absolute;
3374
+ left: 10px;
3375
+ right: 10px;
3376
+ bottom: 2px;
3377
+ height: 2px;
3378
+ border-radius: 999px;
3379
+ background: #f7ef8a;
3380
+ transform: scaleX(0);
3381
+ transform-origin: left center;
3382
+ pointer-events: none;
3383
+ }
3384
+
3385
+ .tickets-row:last-child {
3386
+ border-bottom: none;
3387
+ }
3388
+
3389
+ .tickets-row-top {
3390
+ display: flex;
3391
+ align-items: baseline;
3392
+ justify-content: space-between;
3393
+ gap: 12px;
3394
+ }
3395
+
3396
+ .tickets-row-top strong {
3397
+ min-width: 0;
3398
+ overflow: hidden;
3399
+ text-overflow: ellipsis;
3400
+ white-space: nowrap;
3401
+ font-weight: 560;
3402
+ }
3403
+
3404
+ .tickets-row-top time {
3405
+ flex-shrink: 0;
3406
+ color: rgba(247, 239, 138, 0.62);
3407
+ font-size: 11px;
3408
+ }
3409
+
3410
+ .tickets-row-preview {
3411
+ color: rgba(255, 255, 255, 0.48);
3412
+ font-size: 12px;
3413
+ line-height: 1.4;
3414
+ overflow: hidden;
3415
+ text-overflow: ellipsis;
3416
+ white-space: nowrap;
3417
+ }
3418
+
3419
+ .tickets-row.is-unread .tickets-row-preview {
3420
+ color: rgba(255, 255, 255, 0.78);
3421
+ }
3422
+
3423
+ .tickets-compose {
3424
+ display: flex;
3425
+ align-items: center;
3426
+ gap: 8px;
3427
+ padding: 12px 14px 14px;
3428
+ }
3429
+
3430
+ .tickets-compose input {
3431
+ flex: 1;
3432
+ min-width: 0;
3433
+ height: 42px;
3434
+ background: #1c1c1c;
3435
+ border: 1px solid rgba(247, 239, 138, 0.22);
3436
+ border-radius: 7px;
3437
+ color: #fff;
3438
+ padding: 0 14px;
3439
+ }
3440
+
3441
+ .tickets-compose input:focus {
3442
+ outline: none;
3443
+ border-color: rgba(247, 239, 138, 0.55);
3444
+ }
3445
+
3446
+ .tickets-create {
3447
+ display: inline-flex;
3448
+ align-items: center;
3449
+ justify-content: center;
3450
+ gap: 8px;
3451
+ flex-shrink: 0;
3452
+ min-height: 42px;
3453
+ padding: 0 17px;
3454
+ border: 1px solid #f7ef8a;
3455
+ border-radius: 7px;
3456
+ background: #f7ef8a;
3457
+ color: #111416;
3458
+ font-size: 10px;
3459
+ font-weight: 700;
3460
+ letter-spacing: 0.1em;
3461
+ text-transform: uppercase;
3462
+ cursor: pointer;
3463
+ }
3464
+
3465
+ .tickets-create .material-symbols-outlined {
3466
+ font-size: 18px;
3467
+ font-weight: normal;
3468
+ }
3469
+
3470
+ .tickets-create:disabled {
3471
+ opacity: 0.45;
3472
+ cursor: default;
3473
+ }
3474
+
3475
+ .tickets-empty-hero {
3476
+ flex: 1;
3477
+ min-height: 0;
3478
+ display: flex;
3479
+ flex-direction: column;
3480
+ }
3481
+
3482
+ .tickets-empty-body {
3483
+ flex: 1;
3484
+ min-height: 0;
3485
+ overflow: auto;
3486
+ }
3487
+
3488
+ .tickets-empty-copy {
3489
+ display: flex;
3490
+ flex-direction: column;
3491
+ align-items: flex-start;
3492
+ padding: 28px 22px 8px;
3493
+ }
3494
+
3495
+ .tickets-empty-ornament {
3496
+ width: 46px;
3497
+ margin: 0 0 16px;
3498
+ }
3499
+
3500
+ .tickets-empty-rule {
3501
+ display: block;
3502
+ height: 3px;
3503
+ border-radius: 999px;
3504
+ background: rgba(247, 239, 138, 0.72);
3505
+ }
3506
+
3507
+ .tickets-empty-kicker {
3508
+ margin-bottom: 10px;
3509
+ color: #f7ef8a;
3510
+ font-size: 10px;
3511
+ font-weight: 650;
3512
+ letter-spacing: 0.15em;
3513
+ text-transform: uppercase;
3514
+ }
3515
+
3516
+ .tickets-empty-title {
3517
+ color: #fff;
3518
+ font-size: 34px;
3519
+ font-weight: 560;
3520
+ letter-spacing: -0.04em;
3521
+ line-height: 0.98;
3522
+ }
3523
+
3524
+ .tickets-empty-hint {
3525
+ max-width: 320px;
3526
+ margin-top: 12px;
3527
+ color: rgba(255, 255, 255, 0.55);
3528
+ font-size: 14px;
3529
+ line-height: 1.55;
3530
+ }
3531
+
3532
+ .tickets-empty-features {
3533
+ display: flex;
3534
+ flex-wrap: wrap;
3535
+ gap: 8px 16px;
3536
+ margin-top: 16px;
3537
+ }
3538
+
3539
+ .tickets-empty-features span {
3540
+ display: inline-flex;
3541
+ align-items: center;
3542
+ gap: 8px;
3543
+ color: rgba(255, 255, 255, 0.48);
3544
+ font-size: 11px;
3545
+ }
3546
+
3547
+ .tickets-empty-features span::before {
3548
+ content: "";
3549
+ width: 12px;
3550
+ height: 2px;
3551
+ border-radius: 999px;
3552
+ background: rgba(247, 239, 138, 0.7);
3553
+ }
3554
+
3555
+ .tickets-empty-visual {
3556
+ position: relative;
3557
+ flex: 0 0 auto;
3558
+ display: flex;
3559
+ align-items: center;
3560
+ justify-content: center;
3561
+ margin: 8px 18px 0;
3562
+ padding: 18px 16px;
3563
+ overflow: hidden;
3564
+ border: 1px solid rgba(247, 239, 138, 0.16);
3565
+ border-radius: 10px;
3566
+ background:
3567
+ radial-gradient(circle, rgba(247, 239, 138, 0.1) 0 1px, transparent 1.2px) 0 0 / 18px 18px,
3568
+ #1a1a1a;
3569
+ }
3570
+
3571
+ .tickets-empty-ghost {
3572
+ position: relative;
3573
+ display: flex;
3574
+ flex-direction: column;
3575
+ gap: 12px;
3576
+ width: 100%;
3577
+ max-width: 280px;
3578
+ padding: 16px 18px;
3579
+ border: 1px solid rgba(247, 239, 138, 0.28);
3580
+ border-radius: 12px;
3581
+ background: #22252a;
3582
+ box-shadow: 0 12px 28px rgba(0, 0, 0, 0.35);
3583
+ }
3584
+
3585
+ .tickets-empty-ghost::before {
3586
+ content: "";
3587
+ position: absolute;
3588
+ left: 0;
3589
+ top: 16px;
3590
+ bottom: 16px;
3591
+ width: 3px;
3592
+ border-radius: 999px;
3593
+ background: #f7ef8a;
3594
+ opacity: 0.85;
3595
+ }
3596
+
3597
+ .tickets-empty-ghost-head {
3598
+ display: flex;
3599
+ align-items: center;
3600
+ gap: 8px;
3601
+ }
3602
+
3603
+ .tickets-empty-ghost-dot {
3604
+ width: 7px;
3605
+ height: 7px;
3606
+ border-radius: 50%;
3607
+ background: #f7ef8a;
3608
+ flex-shrink: 0;
3609
+ }
3610
+
3611
+ .tickets-empty-ghost-id {
3612
+ width: 28px;
3613
+ height: 14px;
3614
+ border-radius: 6px;
3615
+ border: 1px solid rgba(247, 239, 138, 0.22);
3616
+ background: rgba(247, 239, 138, 0.08);
3617
+ flex-shrink: 0;
3618
+ }
3619
+
3620
+ .tickets-empty-ghost-title {
3621
+ height: 10px;
3622
+ flex: 1;
3623
+ min-width: 0;
3624
+ border-radius: 999px;
3625
+ background: rgba(255, 255, 255, 0.38);
3626
+ }
3627
+
3628
+ .tickets-empty-ghost-status {
3629
+ width: 42px;
3630
+ height: 14px;
3631
+ border-radius: 999px;
3632
+ border: 1px solid rgba(108, 142, 163, 0.4);
3633
+ background: rgba(108, 142, 163, 0.16);
3634
+ flex-shrink: 0;
3635
+ }
3636
+
3637
+ .tickets-empty-ghost-line {
3638
+ height: 8px;
3639
+ border-radius: 999px;
3640
+ background: rgba(255, 255, 255, 0.18);
3641
+ }
3642
+
3643
+ .tickets-empty-ghost-line.short {
3644
+ width: 62%;
3645
+ }
3646
+
3647
+ .tickets-empty-ghost-foot {
3648
+ display: flex;
3649
+ gap: 8px;
3650
+ padding-top: 6px;
3651
+ border-top: 1px solid rgba(247, 239, 138, 0.1);
3652
+ }
3653
+
3654
+ .tickets-empty-ghost-foot i {
3655
+ display: block;
3656
+ width: 20px;
3657
+ height: 20px;
3658
+ border-radius: 50%;
3659
+ border: 1px solid rgba(247, 239, 138, 0.28);
3660
+ background: rgba(247, 239, 138, 0.06);
3661
+ }
3662
+
3663
+ .tickets-empty-ghost-foot i:nth-child(2) {
3664
+ opacity: 0.5;
3665
+ }
3666
+
3667
+ .tickets-empty-hero .tickets-compose {
3668
+ flex-shrink: 0;
3669
+ padding-top: 14px;
3670
+ border-top: 1px solid rgba(247, 239, 138, 0.16);
3671
+ }
3672
+
3673
+ .tickets-stage {
3674
+ flex: 1;
3675
+ min-height: 0;
3676
+ position: relative;
3677
+ }
3678
+
3679
+ .tickets-stage-pane {
3680
+ position: absolute;
3681
+ inset: 0;
3682
+ display: flex;
3683
+ flex-direction: column;
3684
+ min-height: 0;
3685
+ }
3686
+
3687
+ .tickets-stage-pane[aria-hidden="true"] {
3688
+ pointer-events: none;
3689
+ }
3690
+
3691
+ .tickets-chat {
3692
+ padding: 4px 14px 14px;
3693
+ box-sizing: border-box;
3694
+ font-family: inherit;
3695
+ color: var(--chat-text);
3696
+ caret-color: var(--chat-text);
3697
+ }
3698
+
3699
+ .tickets-chat .chat-root {
3700
+ height: 100%;
3701
+ }
3702
+
3703
+ .tickets-chat .chat-messages {
3704
+ padding: 36px 20px;
3705
+ }
3706
+
3707
+ .tickets-chat .chat-message-user:last-child,
3708
+ .tickets-chat .chat-message-model:last-child {
3709
+ margin-bottom: 28px;
3710
+ }
3711
+
3712
+ .tickets-support {
3713
+ position: fixed;
3714
+ left: var(--support-left, 22px);
3715
+ right: var(--support-right, auto);
3716
+ bottom: var(--support-bottom, 22px);
3717
+ z-index: 4;
3718
+ display: inline-flex;
3719
+ align-items: center;
3720
+ gap: 10px;
3721
+ min-height: 48px;
3722
+ padding: 0 16px 0 10px;
3723
+ border: 1px solid rgba(247, 239, 138, 0.35);
3724
+ border-radius: 999px;
3725
+ background:
3726
+ radial-gradient(circle at 18% 28%, rgba(247, 239, 138, 0.22), transparent 42%),
3727
+ #151515;
3728
+ box-shadow:
3729
+ 0 10px 28px rgba(0, 0, 0, 0.28),
3730
+ 0 0 0 1px rgba(255, 255, 255, 0.04) inset;
3731
+ color: #f7ef8a;
3732
+ font-size: 14px;
3733
+ cursor: pointer;
3734
+ }
3735
+
3736
+ .tickets-support canvas {
3737
+ width: 28px;
3738
+ height: 28px;
3739
+ display: block;
3740
+ }
3741
+
3742
+ .tickets-support.is-unread {
3743
+ border-color: rgba(247, 239, 138, 0.7);
3744
+ animation: tickets-support-glow 1.8s ease-in-out infinite;
3745
+ }
3746
+
3747
+ .tickets-support-dot {
3748
+ position: absolute;
3749
+ top: -3px;
3750
+ left: -3px;
3751
+ width: 14px;
3752
+ height: 14px;
3753
+ border-radius: 50%;
3754
+ background: #f7ef8a;
3755
+ box-shadow:
3756
+ 0 0 0 2px #151515,
3757
+ 0 0 12px rgba(247, 239, 138, 0.85);
3758
+ pointer-events: none;
3759
+ }
3760
+
3761
+ .tickets-support-dot::after {
3762
+ content: "";
3763
+ position: absolute;
3764
+ inset: 0;
3765
+ border-radius: 50%;
3766
+ background: #f7ef8a;
3767
+ animation: tickets-support-ping 1.6s ease-out infinite;
3768
+ }
3769
+
3770
+ @keyframes tickets-support-glow {
3771
+ 0%, 100% {
3772
+ box-shadow:
3773
+ 0 10px 28px rgba(0, 0, 0, 0.28),
3774
+ 0 0 0 1px rgba(255, 255, 255, 0.04) inset,
3775
+ 0 0 10px rgba(247, 239, 138, 0.18);
3776
+ }
3777
+ 50% {
3778
+ box-shadow:
3779
+ 0 10px 28px rgba(0, 0, 0, 0.28),
3780
+ 0 0 0 1px rgba(255, 255, 255, 0.04) inset,
3781
+ 0 0 28px 6px rgba(247, 239, 138, 0.42);
3782
+ }
3783
+ }
3784
+
3785
+ @keyframes tickets-support-ping {
3786
+ 0% {
3787
+ transform: scale(1);
3788
+ opacity: 0.65;
3789
+ }
3790
+ 100% {
3791
+ transform: scale(2.6);
3792
+ opacity: 0;
3793
+ }
3794
+ }
3795
+
3796
+ .fauna-browser {
3797
+ position: relative;
3798
+ width: 100%;
3799
+ height: 100%;
3800
+ overflow: hidden;
3801
+ background: #fff;
3802
+ }
3803
+
3804
+ .fauna-browser-frame {
3805
+ width: 100%;
3806
+ height: 100%;
3807
+ }
3808
+
3809
+ .fauna-browser-frame iframe {
3810
+ display: block;
3811
+ width: 100%;
3812
+ height: 100%;
3813
+ border: 0;
3814
+ }
3815
+
3816
+ .fauna-browser-cursor {
3817
+ position: absolute;
3818
+ left: 0;
3819
+ top: 0;
3820
+ width: 0;
3821
+ height: 0;
3822
+ pointer-events: none;
3823
+ z-index: 3;
3824
+ }
3825
+
3826
+ .fauna-browser-ripple {
3827
+ position: absolute;
3828
+ width: 28px;
3829
+ height: 28px;
3830
+ margin: -14px 0 0 -14px;
3831
+ border-radius: 50%;
3832
+ background: rgba(255, 255, 255, 0.35);
3833
+ border: 1px solid rgba(17, 17, 17, 0.35);
3834
+ pointer-events: none;
3835
+ z-index: 2;
3836
+ }
3837
+
3838
+ .fauna-browser-ripple.is-firing {
3839
+ animation: fauna-browser-ripple 0.55s ease-out;
3840
+ }
3841
+
3842
+ @keyframes fauna-browser-ripple {
3843
+ from { transform: scale(0.2); opacity: 0.6; }
3844
+ to { transform: scale(1.6); opacity: 0; }
3845
+ }
3846
+
3847
+ .fauna-browser-badge {
3848
+ position: absolute;
3849
+ right: 10px;
3850
+ bottom: 10px;
3851
+ padding: 4px 8px;
3852
+ border-radius: 6px;
3853
+ background: rgba(17, 17, 17, 0.72);
3854
+ color: #fff;
3855
+ font-size: 11px;
3856
+ pointer-events: none;
3857
+ z-index: 4;
3858
+ }
3859
+
3860
+ .fauna-browser-badge[data-tone="good"] { background: rgba(32, 120, 72, 0.85); }
3861
+ .fauna-browser-badge[data-tone="bad"] { background: rgba(140, 36, 36, 0.85); }
3862
+
3863
+ /* ── Live rooms: presence cursors, roster, agent confirm ──
3864
+ Set the --roster-* variables on a parent to theme them. */
3865
+
3866
+ .fauna-cursors {
3867
+ position: absolute;
3868
+ inset: 0;
3869
+ z-index: 1;
3870
+ overflow: hidden;
3871
+ pointer-events: none;
3872
+ }
3873
+
3874
+ .fauna-roster {
3875
+ position: relative;
3876
+ }
3877
+
3878
+ .fauna-roster-pill {
3879
+ position: relative;
3880
+ display: flex;
3881
+ align-items: center;
3882
+ gap: 8px;
3883
+ padding: 6px;
3884
+ border: 1px solid var(--roster-rule, rgba(174, 27, 40, 0.22));
3885
+ border-radius: 999px;
3886
+ background: var(--roster-surface, rgba(22, 22, 23, 0.82));
3887
+ backdrop-filter: blur(12px);
3888
+ box-shadow: 0 14px 36px rgba(0, 0, 0, 0.45);
3889
+ overflow: visible;
3890
+ }
3891
+
3892
+ .fauna-roster-seat {
3893
+ position: relative;
3894
+ display: grid;
3895
+ place-items: center;
3896
+ box-sizing: border-box;
3897
+ width: 30px;
3898
+ height: 30px;
3899
+ padding: 0;
3900
+ border: 2px solid var(--roster-muted, #8A8580);
3901
+ border-radius: 50%;
3902
+ background: var(--roster-seat, #161617);
3903
+ color: var(--roster-text, #E8E2DC);
3904
+ cursor: pointer;
3905
+ }
3906
+
3907
+ .fauna-roster-seat.in-control {
3908
+ cursor: default;
3909
+ }
3910
+
3911
+ .fauna-roster-seat img {
3912
+ display: block;
3913
+ width: 100%;
3914
+ height: 100%;
3915
+ border-radius: 50%;
3916
+ object-fit: cover;
3917
+ }
3918
+
3919
+ .fauna-roster-agent {
3920
+ border-color: var(--roster-ring, #A31B28);
3921
+ }
3922
+
3923
+ .fauna-roster-agent .material-symbols-outlined {
3924
+ font-size: 17px !important;
3925
+ }
3926
+
3927
+ /* Sized to the holder's avatar by GSAP, and drawn just outside it. */
3928
+ .fauna-roster-ring {
3929
+ position: absolute;
3930
+ left: 0;
3931
+ top: 0;
3932
+ box-sizing: content-box;
3933
+ margin: -5px 0 0 -5px;
3934
+ padding: 3px;
3935
+ border: 2px solid var(--roster-ring, #A31B28);
3936
+ border-radius: 50%;
3937
+ box-shadow: 0 0 0 2px rgba(163, 27, 40, 0.18), 0 0 12px rgba(163, 27, 40, 0.4);
3938
+ pointer-events: none;
3939
+ visibility: hidden;
3940
+ }
3941
+
3942
+ .fauna-roster-badge {
3943
+ position: absolute;
3944
+ right: -5px;
3945
+ bottom: -5px;
3946
+ display: grid;
3947
+ place-items: center;
3948
+ width: 15px;
3949
+ height: 15px;
3950
+ border-radius: 50%;
3951
+ background: var(--roster-ring, #A31B28);
3952
+ color: var(--roster-text, #E8E2DC);
3953
+ box-shadow: 0 0 0 2px var(--roster-seat, #161617);
3954
+ }
3955
+
3956
+ .fauna-roster-badge .material-symbols-outlined {
3957
+ font-size: 10px !important;
3958
+ }
3959
+
3960
+ .fauna-roster-tip {
3961
+ position: absolute;
3962
+ top: calc(100% + 8px);
3963
+ transform: translateX(-50%);
3964
+ padding: 5px 10px;
3965
+ border: 1px solid var(--roster-rule, rgba(174, 27, 40, 0.22));
3966
+ border-radius: 8px;
3967
+ background: var(--roster-seat, #161617);
3968
+ color: var(--roster-text, #E8E2DC);
3969
+ font-family: var(--roster-font, 'IBM Plex Mono', ui-monospace, monospace);
3970
+ font-size: 11px;
3971
+ white-space: nowrap;
3972
+ pointer-events: none;
3973
+ animation: fauna-roster-tip-in 0.18s ease-out;
3974
+ }
3975
+
3976
+ @keyframes fauna-roster-tip-in {
3977
+ from { opacity: 0; transform: translate(-50%, -3px); }
3978
+ to { opacity: 1; transform: translate(-50%, 0); }
3979
+ }
3980
+
3981
+ .fauna-confirm-veil {
3982
+ position: fixed;
3983
+ inset: 0;
3984
+ z-index: 500;
3985
+ display: grid;
3986
+ place-items: center;
3987
+ padding: 24px;
3988
+ background: rgba(5, 5, 6, 0.72);
3989
+ backdrop-filter: blur(6px);
3990
+ }
3991
+
3992
+ .fauna-confirm {
3993
+ width: min(420px, 100%);
3994
+ padding: 24px 26px 20px;
3995
+ border: 1px solid var(--roster-rule, rgba(174, 27, 40, 0.22));
3996
+ border-radius: 16px;
3997
+ background: var(--roster-seat, #161617);
3998
+ color: var(--roster-text, #E8E2DC);
3999
+ box-shadow: 0 28px 80px rgba(0, 0, 0, 0.6);
4000
+ font-family: Inter, system-ui, sans-serif;
4001
+ }
4002
+
4003
+ .fauna-confirm-title {
4004
+ margin: 0;
4005
+ font-size: 20px;
4006
+ font-weight: 500;
4007
+ letter-spacing: -0.02em;
4008
+ }
4009
+
4010
+ .fauna-confirm-body {
4011
+ margin: 12px 0 22px;
4012
+ font-size: 14px;
4013
+ line-height: 1.5;
4014
+ color: var(--roster-muted, #8A8580);
4015
+ }
4016
+
4017
+ .fauna-confirm-actions {
4018
+ display: flex;
4019
+ justify-content: flex-end;
4020
+ gap: 8px;
4021
+ }
4022
+
4023
+ .fauna-confirm-actions button {
4024
+ height: 36px;
4025
+ padding: 0 16px;
4026
+ border: 1px solid transparent;
4027
+ border-radius: 10px;
4028
+ font: 13px Inter, system-ui, sans-serif;
4029
+ cursor: pointer;
4030
+ }
4031
+
4032
+ .fauna-confirm-cancel {
4033
+ background: transparent;
4034
+ color: var(--roster-muted, #8A8580);
4035
+ }
4036
+
4037
+ .fauna-confirm-cancel:hover {
4038
+ color: var(--roster-text, #E8E2DC);
4039
+ }
4040
+
4041
+ .fauna-confirm-go {
4042
+ background: var(--roster-ring, #A31B28);
4043
+ border-color: var(--roster-ring, #A31B28);
4044
+ color: var(--roster-text, #E8E2DC);
4045
+ }
4046
+
4047
+ .fauna-confirm-go:hover {
4048
+ box-shadow: 0 0 22px rgba(163, 27, 40, 0.45);
4049
+ }
4050
+
4051
+
4052
+ /* Maps. Every color and size reads a --maps-* variable; apps restyle by setting them. */
4053
+
4054
+ .maplibregl-map {
4055
+ position: relative;
4056
+ overflow: hidden;
4057
+ -webkit-tap-highlight-color: transparent;
4058
+ }
4059
+
4060
+ .maplibregl-canvas {
4061
+ position: absolute;
4062
+ top: 0;
4063
+ left: 0;
4064
+ }
4065
+
4066
+ .maplibregl-canvas-container.maplibregl-interactive {
4067
+ cursor: grab;
4068
+ }
4069
+
4070
+ .maplibregl-canvas-container.maplibregl-interactive:active {
4071
+ cursor: grabbing;
4072
+ }
4073
+
4074
+ .maplibregl-canvas-container.maplibregl-touch-drag-pan,
4075
+ .maplibregl-canvas-container.maplibregl-touch-drag-pan .maplibregl-canvas {
4076
+ touch-action: pan-x pan-y;
4077
+ }
4078
+
4079
+ .maplibregl-canvas-container.maplibregl-touch-zoom-rotate,
4080
+ .maplibregl-canvas-container.maplibregl-touch-zoom-rotate .maplibregl-canvas {
4081
+ touch-action: pinch-zoom;
4082
+ }
4083
+
4084
+ .maplibregl-marker {
4085
+ position: absolute;
4086
+ top: 0;
4087
+ left: 0;
4088
+ will-change: transform;
4089
+ }
4090
+
4091
+ .fauna-map {
4092
+ position: relative;
4093
+ min-height: 220px;
4094
+ overflow: hidden;
4095
+ border: 1px solid var(--maps-rule, rgba(174, 27, 40, 0.22));
4096
+ border-radius: var(--maps-radius, 14px);
4097
+ background: var(--maps-canvas, #1d1d1f);
4098
+ isolation: isolate;
4099
+ }
4100
+
4101
+ .fauna-map-canvas {
4102
+ position: absolute;
4103
+ inset: 0;
4104
+ }
4105
+
4106
+ .fauna-map-attribution {
4107
+ position: absolute;
4108
+ bottom: 6px;
4109
+ left: 6px;
4110
+ z-index: 2;
4111
+ display: flex;
4112
+ align-items: center;
4113
+ gap: 6px;
4114
+ max-width: calc(100% - 12px);
4115
+ padding: 2px 6px 2px 4px;
4116
+ border-radius: 6px;
4117
+ background: var(--maps-attribution-surface, rgba(255, 255, 255, 0.78));
4118
+ color: var(--maps-attribution-text, #3c3c3c);
4119
+ font: 500 10px/1.4 var(--maps-font, Inter, system-ui, sans-serif);
4120
+ pointer-events: none;
4121
+ }
4122
+
4123
+ .fauna-map-attribution img {
4124
+ height: 14px;
4125
+ }
4126
+
4127
+ .fauna-map-attribution span {
4128
+ overflow: hidden;
4129
+ text-overflow: ellipsis;
4130
+ white-space: nowrap;
4131
+ }
4132
+
4133
+ .fauna-map-notice {
4134
+ position: absolute;
4135
+ top: 10px;
4136
+ left: 50%;
4137
+ z-index: 3;
4138
+ padding: 6px 12px;
4139
+ border-radius: 999px;
4140
+ background: var(--maps-surface, #161617);
4141
+ color: var(--maps-text, #E8E2DC);
4142
+ font: 500 12px/1.4 var(--maps-font, Inter, system-ui, sans-serif);
4143
+ opacity: 0;
4144
+ transform: translate(-50%, -6px);
4145
+ transition: opacity 0.2s, transform 0.2s;
4146
+ pointer-events: none;
4147
+ }
4148
+
4149
+ .fauna-map-notice.is-shown {
4150
+ opacity: 1;
4151
+ transform: translate(-50%, 0);
4152
+ }
4153
+
4154
+ .fauna-map-marker {
4155
+ display: flex;
4156
+ flex-direction: column;
4157
+ align-items: center;
4158
+ gap: 4px;
4159
+ padding: 0;
4160
+ border: 0;
4161
+ background: none;
4162
+ cursor: pointer;
4163
+ }
4164
+
4165
+ .fauna-map-pin {
4166
+ width: 18px;
4167
+ height: 18px;
4168
+ border: 3px solid var(--maps-marker-ring, #ffffff);
4169
+ border-radius: 50% 50% 50% 0;
4170
+ background: var(--maps-marker, #AE1B28);
4171
+ box-shadow: 0 6px 14px rgba(0, 0, 0, 0.35);
4172
+ transform: rotate(-45deg);
4173
+ transition: transform 0.2s;
4174
+ }
4175
+
4176
+ .fauna-map-marker:hover .fauna-map-pin {
4177
+ transform: rotate(-45deg) scale(1.15);
4178
+ }
4179
+
4180
+ .fauna-map-marker.is-muted .fauna-map-pin {
4181
+ background: var(--maps-marker-muted, #8A8580);
4182
+ }
4183
+
4184
+ .fauna-map-label {
4185
+ order: -1;
4186
+ max-width: 160px;
4187
+ padding: 3px 8px;
4188
+ border-radius: 999px;
4189
+ background: var(--maps-surface, #161617);
4190
+ color: var(--maps-text, #E8E2DC);
4191
+ font: 600 11px/1.3 var(--maps-font, Inter, system-ui, sans-serif);
4192
+ overflow: hidden;
4193
+ text-overflow: ellipsis;
4194
+ white-space: nowrap;
4195
+ box-shadow: 0 6px 16px rgba(0, 0, 0, 0.3);
4196
+ }
4197
+
4198
+ .fauna-directions {
4199
+ display: flex;
4200
+ flex-direction: column;
4201
+ gap: 14px;
4202
+ container-type: inline-size;
4203
+ color: var(--maps-text, #E8E2DC);
4204
+ font-family: var(--maps-font, Inter, system-ui, sans-serif);
4205
+ }
4206
+
4207
+ .fauna-directions-tabs {
4208
+ position: relative;
4209
+ display: flex;
4210
+ gap: 4px;
4211
+ padding: 4px;
4212
+ border: 1px solid var(--maps-rule, rgba(174, 27, 40, 0.22));
4213
+ border-radius: 999px;
4214
+ background: var(--maps-surface, #161617);
4215
+ overflow-x: auto;
4216
+ scrollbar-width: none;
4217
+ }
4218
+
4219
+ .fauna-directions-mark {
4220
+ position: absolute;
4221
+ top: 4px;
4222
+ bottom: 4px;
4223
+ left: 0;
4224
+ border-radius: 999px;
4225
+ background: var(--maps-accent, #AE1B28);
4226
+ pointer-events: none;
4227
+ }
4228
+
4229
+ .fauna-directions-tabs button {
4230
+ position: relative;
4231
+ display: inline-flex;
4232
+ flex: 1 1 auto;
4233
+ align-items: center;
4234
+ justify-content: center;
4235
+ min-width: 0;
4236
+ white-space: nowrap;
4237
+ gap: 6px;
4238
+ height: 34px;
4239
+ padding: 0 14px;
4240
+ border: 0;
4241
+ border-radius: 999px;
4242
+ background: transparent;
4243
+ color: var(--maps-muted, #8A8580);
4244
+ font: 600 13px/1 var(--maps-font, Inter, system-ui, sans-serif);
4245
+ cursor: pointer;
4246
+ transition: color 0.2s;
4247
+ }
4248
+
4249
+ .fauna-directions-tabs button.is-current {
4250
+ color: var(--maps-accent-text, #ffffff);
4251
+ }
4252
+
4253
+ .fauna-directions-tabs .material-symbols-outlined {
4254
+ font-size: 18px;
4255
+ }
4256
+
4257
+ .fauna-directions-best {
4258
+ padding: 2px 6px;
4259
+ border-radius: 999px;
4260
+ background: var(--maps-best, rgba(255, 255, 255, 0.18));
4261
+ font-size: 10px;
4262
+ letter-spacing: 0.04em;
4263
+ text-transform: uppercase;
4264
+ }
4265
+
4266
+ /* Narrow: every way there still fits, without the icons. */
4267
+ @container (max-width: 440px) {
4268
+ .fauna-directions-tabs button {
4269
+ gap: 4px;
4270
+ padding: 0 8px;
4271
+ }
4272
+
4273
+ .fauna-directions-tabs .material-symbols-outlined {
4274
+ display: none;
4275
+ }
4276
+ }
4277
+
4278
+ .fauna-directions-body {
4279
+ display: flex;
4280
+ flex-direction: column;
4281
+ gap: 12px;
4282
+ }
4283
+
4284
+ .fauna-directions-summary {
4285
+ display: flex;
4286
+ flex-wrap: wrap;
4287
+ align-items: baseline;
4288
+ gap: 4px 10px;
4289
+ }
4290
+
4291
+ .fauna-directions-summary strong {
4292
+ font-size: 22px;
4293
+ font-weight: 600;
4294
+ letter-spacing: -0.02em;
4295
+ }
4296
+
4297
+ .fauna-directions-muted {
4298
+ margin: 0;
4299
+ color: var(--maps-muted, #8A8580);
4300
+ font-size: 13px;
4301
+ }
4302
+
4303
+ .fauna-directions-list {
4304
+ display: flex;
4305
+ flex-direction: column;
4306
+ gap: 2px;
4307
+ margin: 0;
4308
+ padding: 0;
4309
+ list-style: none;
4310
+ }
4311
+
4312
+ .fauna-directions-step,
4313
+ .fauna-directions-flight-main {
4314
+ display: flex;
4315
+ align-items: center;
4316
+ gap: 12px;
4317
+ padding: 10px 4px;
4318
+ border-top: 1px solid var(--maps-line, rgba(255, 255, 255, 0.06));
4319
+ }
4320
+
4321
+ .fauna-directions-step:first-child,
4322
+ .fauna-directions-flight:first-child .fauna-directions-flight-main {
4323
+ border-top: 0;
4324
+ }
4325
+
4326
+ .fauna-directions-step > .material-symbols-outlined,
4327
+ .fauna-directions-flight-main > .material-symbols-outlined {
4328
+ display: grid;
4329
+ flex: none;
4330
+ place-items: center;
4331
+ width: 32px;
4332
+ height: 32px;
4333
+ border-radius: 10px;
4334
+ background: var(--maps-chip, rgba(255, 255, 255, 0.06));
4335
+ color: var(--maps-text, #E8E2DC);
4336
+ font-size: 18px;
4337
+ }
4338
+
4339
+ .fauna-directions-step.is-transit > .material-symbols-outlined {
4340
+ background: var(--maps-route-transit, #2F6FDE);
4341
+ color: #ffffff;
4342
+ }
4343
+
4344
+ .fauna-directions-flight-main img {
4345
+ flex: none;
4346
+ width: 32px;
4347
+ height: 32px;
4348
+ border-radius: 10px;
4349
+ background: #ffffff;
4350
+ object-fit: contain;
4351
+ }
4352
+
4353
+ .fauna-directions-step-text {
4354
+ display: flex;
4355
+ flex: 1;
4356
+ flex-direction: column;
4357
+ gap: 2px;
4358
+ min-width: 0;
4359
+ font-size: 14px;
4360
+ }
4361
+
4362
+ .fauna-directions-price {
4363
+ font-size: 15px;
4364
+ font-weight: 650;
4365
+ }
4366
+
4367
+ .fauna-directions-book {
4368
+ height: 32px;
4369
+ padding: 0 14px;
4370
+ border: 1px solid var(--maps-accent, #AE1B28);
4371
+ border-radius: 999px;
4372
+ background: var(--maps-accent, #AE1B28);
4373
+ color: var(--maps-accent-text, #ffffff);
4374
+ font: 600 13px/1 var(--maps-font, Inter, system-ui, sans-serif);
4375
+ cursor: pointer;
4376
+ }
4377
+
4378
+ .fauna-directions-book:disabled {
4379
+ opacity: 0.6;
4380
+ cursor: default;
4381
+ }
4382
+
4383
+ .fauna-directions-offers {
4384
+ display: flex;
4385
+ flex-direction: column;
4386
+ gap: 6px;
4387
+ margin: 0 0 10px 44px;
4388
+ padding: 0;
4389
+ list-style: none;
4390
+ }
4391
+
4392
+ .fauna-directions-offers button {
4393
+ display: flex;
4394
+ align-items: center;
4395
+ gap: 10px;
4396
+ width: 100%;
4397
+ padding: 9px 12px;
4398
+ border: 1px solid var(--maps-line, rgba(255, 255, 255, 0.08));
4399
+ border-radius: 10px;
4400
+ background: var(--maps-chip, rgba(255, 255, 255, 0.04));
4401
+ color: var(--maps-text, #E8E2DC);
4402
+ font: 500 13px/1.3 var(--maps-font, Inter, system-ui, sans-serif);
4403
+ text-align: left;
4404
+ cursor: pointer;
4405
+ }
4406
+
4407
+ .fauna-directions-offers button span:first-child {
4408
+ flex: 1;
4409
+ }
4410
+
4411
+ .fauna-directions-offers .material-symbols-outlined {
4412
+ color: var(--maps-muted, #8A8580);
4413
+ font-size: 16px;
4414
+ }
4415
+
4416
+ .fauna-place-search {
4417
+ position: relative;
4418
+ display: flex;
4419
+ align-items: center;
4420
+ gap: 8px;
4421
+ padding: 0 12px;
4422
+ border: 1px solid var(--maps-rule, rgba(174, 27, 40, 0.22));
4423
+ border-radius: var(--maps-radius, 14px);
4424
+ background: var(--maps-surface, #161617);
4425
+ color: var(--maps-text, #E8E2DC);
4426
+ font-family: var(--maps-font, Inter, system-ui, sans-serif);
4427
+ transition: border-color 0.15s, box-shadow 0.15s;
4428
+ }
4429
+
4430
+ .fauna-place-search:focus-within {
4431
+ border-color: var(--maps-accent, #AE1B28);
4432
+ box-shadow: 0 0 0 4px var(--maps-focus, rgba(174, 27, 40, 0.18));
4433
+ }
4434
+
4435
+ .fauna-place-search > .material-symbols-outlined {
4436
+ color: var(--maps-muted, #8A8580);
4437
+ font-size: 20px;
4438
+ }
4439
+
4440
+ .fauna-place-search.is-busy > .material-symbols-outlined {
4441
+ animation: fauna-place-search-busy 0.9s ease-in-out infinite;
4442
+ }
4443
+
4444
+ @keyframes fauna-place-search-busy {
4445
+ 50% {
4446
+ opacity: 0.35;
4447
+ }
4448
+ }
4449
+
4450
+ .fauna-place-search input {
4451
+ flex: 1;
4452
+ min-width: 0;
4453
+ height: 44px;
4454
+ padding: 0;
4455
+ border: 0;
4456
+ outline: none;
4457
+ background: transparent;
4458
+ box-shadow: none;
4459
+ color: inherit;
4460
+ font: inherit;
4461
+ font-size: 15px;
4462
+ }
4463
+
4464
+ .fauna-place-search-list {
4465
+ position: absolute;
4466
+ top: calc(100% + 6px);
4467
+ right: 0;
4468
+ left: 0;
4469
+ z-index: 20;
4470
+ display: flex;
4471
+ flex-direction: column;
4472
+ gap: 2px;
4473
+ margin: 0;
4474
+ padding: 6px;
4475
+ border: 1px solid var(--maps-rule, rgba(174, 27, 40, 0.22));
4476
+ border-radius: var(--maps-radius, 14px);
4477
+ background: var(--maps-surface, #161617);
4478
+ box-shadow: 0 18px 44px rgba(0, 0, 0, 0.45);
4479
+ list-style: none;
4480
+ }
4481
+
4482
+ .fauna-place-search-list li {
4483
+ display: flex;
4484
+ align-items: center;
4485
+ gap: 10px;
4486
+ padding: 8px 10px;
4487
+ border-radius: 10px;
4488
+ cursor: pointer;
4489
+ }
4490
+
4491
+ .fauna-place-search-list li.is-active {
4492
+ background: var(--maps-chip, rgba(255, 255, 255, 0.06));
4493
+ }
4494
+
4495
+ .fauna-place-search-list .material-symbols-outlined {
4496
+ color: var(--maps-accent, #AE1B28);
4497
+ font-size: 20px;
4498
+ }
4499
+
4500
+ .fauna-place-search-text {
4501
+ display: flex;
4502
+ flex-direction: column;
4503
+ min-width: 0;
4504
+ }
4505
+
4506
+ .fauna-place-search-text strong {
4507
+ font-size: 14px;
4508
+ font-weight: 600;
4509
+ }
4510
+
4511
+ .fauna-place-search-text span {
4512
+ overflow: hidden;
4513
+ color: var(--maps-muted, #8A8580);
4514
+ font-size: 12px;
4515
+ text-overflow: ellipsis;
4516
+ white-space: nowrap;
4517
+ }
4518
+
4519
+ @media (prefers-reduced-motion: reduce) {
4520
+ .fauna-map-notice,
4521
+ .fauna-map-pin,
4522
+ .fauna-directions-tabs button {
4523
+ transition: none;
4524
+ }
4525
+
4526
+ .fauna-place-search.is-busy > .material-symbols-outlined {
4527
+ animation: none;
4528
+ }
4529
+ }
4530
+
4531
+
4532
+ /* View: a file's live room (UI.View). Themed through --view-*, falling back to the chat's colors. */
4533
+ .view-root {
4534
+ --v-bg: var(--view-bg, var(--chat-bg, transparent));
4535
+ --v-surface: var(--view-surface, var(--chat-secondary, #f5f5f5));
4536
+ --v-border: var(--view-border, var(--chat-border, #e0e0e0));
4537
+ --v-text: var(--view-text, var(--chat-text, #1a1a1a));
4538
+ --v-muted: var(--view-muted, var(--chat-accent, #888));
4539
+ --v-accent: var(--view-accent, var(--chat-accent, #3d7cf2));
4540
+
4541
+ display: flex;
4542
+ flex-direction: column;
4543
+ width: 100%;
4544
+ height: 100%;
4545
+ min-height: 0;
4546
+ background: var(--v-bg);
4547
+ color: var(--v-text);
4548
+ }
4549
+
4550
+ .view-bar {
4551
+ display: flex;
4552
+ align-items: center;
4553
+ gap: 10px;
4554
+ padding: 8px 12px;
4555
+ border-bottom: 1px solid var(--v-border);
4556
+ min-width: 0;
4557
+ }
4558
+ .view-bar-name {
4559
+ font-weight: 600;
4560
+ font-size: 13px;
4561
+ overflow: hidden;
4562
+ text-overflow: ellipsis;
4563
+ white-space: nowrap;
4564
+ min-width: 0;
4565
+ }
4566
+ .view-bar-meta {
4567
+ flex: 1;
4568
+ font-size: 12px;
4569
+ color: var(--v-muted);
4570
+ white-space: nowrap;
4571
+ overflow: hidden;
4572
+ text-overflow: ellipsis;
4573
+ }
4574
+ .view-bar-button,
4575
+ .view-tools button {
4576
+ border: 1px solid var(--v-border);
4577
+ background: var(--v-surface);
4578
+ color: var(--v-text);
4579
+ border-radius: 8px;
4580
+ padding: 4px 8px;
4581
+ font: inherit;
4582
+ font-size: 12px;
4583
+ cursor: pointer;
4584
+ }
4585
+ .view-bar-button.material-symbols-outlined,
4586
+ .view-tools button.material-symbols-outlined {
4587
+ font-family: 'Material Symbols Outlined';
4588
+ line-height: 1;
4589
+ font-size: 18px;
4590
+ padding: 3px 5px;
4591
+ }
4592
+ .view-tools button:disabled { opacity: 0.4; cursor: default; }
4593
+ .view-tools button.view-tool-on { border-color: var(--v-accent); color: var(--v-accent); }
4594
+
4595
+ .view-people { display: flex; align-items: center; }
4596
+ .view-person {
4597
+ width: 24px;
4598
+ height: 24px;
4599
+ border-radius: 50%;
4600
+ border: 2px solid;
4601
+ margin-left: -6px;
4602
+ background: var(--v-surface);
4603
+ }
4604
+ .view-person:first-child { margin-left: 0; }
4605
+ .view-people-more { font-size: 11px; color: var(--v-muted); margin-left: 4px; }
4606
+
4607
+ .view-body {
4608
+ flex: 1;
4609
+ min-height: 0;
4610
+ display: flex;
4611
+ flex-direction: column;
4612
+ overflow: hidden;
4613
+ }
4614
+ .view-state {
4615
+ margin: auto;
4616
+ font-size: 13px;
4617
+ color: var(--v-muted);
4618
+ }
4619
+
4620
+ .view-text { flex: 1; min-height: 0; overflow: hidden; }
4621
+ .view-text .cm-editor { height: 100%; font-size: 13px; }
4622
+
4623
+ .view-tools {
4624
+ display: flex;
4625
+ flex-wrap: wrap;
4626
+ align-items: center;
4627
+ gap: 6px;
4628
+ padding: 6px 10px;
4629
+ border-bottom: 1px solid var(--v-border);
4630
+ }
4631
+ .view-tools-gap { flex: 1; }
4632
+
4633
+ .view-table { flex: 1; min-height: 0; display: flex; flex-direction: column; }
4634
+ .view-table-scroll { flex: 1; overflow: auto; }
4635
+ .view-table table { border-collapse: collapse; font-size: 12px; }
4636
+ .view-table th {
4637
+ position: sticky;
4638
+ top: 0;
4639
+ background: var(--v-surface);
4640
+ color: var(--v-muted);
4641
+ font-weight: 500;
4642
+ padding: 3px 8px;
4643
+ border: 1px solid var(--v-border);
4644
+ z-index: 1;
4645
+ }
4646
+ .view-table tbody th { position: sticky; left: 0; top: auto; }
4647
+ .view-table td { border: 1px solid var(--v-border); padding: 0; min-width: 90px; }
4648
+ .view-table td input {
4649
+ width: 100%;
4650
+ box-sizing: border-box;
4651
+ border: none;
4652
+ background: transparent;
4653
+ color: inherit;
4654
+ font: inherit;
4655
+ padding: 4px 6px;
4656
+ outline: none;
4657
+ }
4658
+ .view-table td.view-cell-mine { outline: 2px solid var(--v-accent); outline-offset: -2px; }
4659
+ .view-more {
4660
+ margin: 10px;
4661
+ border: 1px solid var(--v-border);
4662
+ background: var(--v-surface);
4663
+ color: var(--v-text);
4664
+ border-radius: 8px;
4665
+ padding: 6px 10px;
4666
+ cursor: pointer;
4667
+ }
4668
+
4669
+ .view-image { flex: 1; min-height: 0; display: flex; flex-direction: column; }
4670
+ .view-image-stage {
4671
+ flex: 1;
4672
+ min-height: 0;
4673
+ overflow: auto;
4674
+ display: flex;
4675
+ background-color: var(--v-surface);
4676
+ background-image:
4677
+ linear-gradient(45deg, rgba(128, 128, 128, 0.12) 25%, transparent 25%),
4678
+ linear-gradient(-45deg, rgba(128, 128, 128, 0.12) 25%, transparent 25%),
4679
+ linear-gradient(45deg, transparent 75%, rgba(128, 128, 128, 0.12) 75%),
4680
+ linear-gradient(-45deg, transparent 75%, rgba(128, 128, 128, 0.12) 75%);
4681
+ background-size: 20px 20px;
4682
+ background-position: 0 0, 0 10px, 10px -10px, -10px 0;
4683
+ }
4684
+ .view-image-box { position: relative; margin: auto; touch-action: none; user-select: none; }
4685
+ .view-image-box img { display: block; width: 100%; height: auto; }
4686
+ .view-image-fit .view-image-box { max-width: 100%; max-height: 100%; }
4687
+ .view-image-fit .view-image-box img { max-height: calc(100vh - 200px); object-fit: contain; }
4688
+ .view-image-marks { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; }
4689
+ .view-mark-note,
4690
+ .view-mark-pin {
4691
+ position: absolute;
4692
+ transform: translate(0, -100%);
4693
+ font-size: 12px;
4694
+ line-height: 1.35;
4695
+ }
4696
+ .view-mark-note {
4697
+ max-width: 200px;
4698
+ padding: 6px 8px;
4699
+ border-radius: 8px;
4700
+ border: 2px solid;
4701
+ background: var(--v-bg, #fff);
4702
+ background: color-mix(in srgb, var(--v-surface) 92%, transparent);
4703
+ min-width: 40px;
4704
+ min-height: 18px;
4705
+ }
4706
+ .view-mark-pin { transform: translate(-50%, -100%); display: flex; flex-direction: column; align-items: center; border: none; }
4707
+ .view-mark-pin .material-symbols-outlined { font-size: 26px; }
4708
+ .view-mark-pin .view-mark-text {
4709
+ background: var(--v-surface);
4710
+ border: 1px solid var(--v-border);
4711
+ color: var(--v-text);
4712
+ border-radius: 6px;
4713
+ padding: 2px 6px;
4714
+ }
4715
+ .view-mark-picked { box-shadow: 0 0 0 2px var(--v-accent); }
4716
+ .view-mark-note textarea,
4717
+ .view-mark-pin textarea {
4718
+ width: 180px;
4719
+ min-height: 40px;
4720
+ border: none;
4721
+ background: transparent;
4722
+ color: var(--v-text);
4723
+ font: inherit;
4724
+ resize: vertical;
4725
+ outline: none;
4726
+ }
4727
+ .view-pointer { position: absolute; pointer-events: none; transform: translate(-3px, -3px); }
4728
+ .view-pointer-dot { display: block; width: 8px; height: 8px; border-radius: 50%; box-shadow: 0 0 0 2px #fff; }
4729
+ .view-pointer-name {
4730
+ position: absolute;
4731
+ left: 10px;
4732
+ top: 6px;
4733
+ color: #fff;
4734
+ font-size: 11px;
4735
+ padding: 1px 6px;
4736
+ border-radius: 6px;
4737
+ white-space: nowrap;
4738
+ }
4739
+
4740
+ .view-video { flex: 1; min-height: 0; width: 100%; background: #000; }
4741
+ .view-audio { margin: auto; }
4742
+ .view-pdf { flex: 1; width: 100%; border: none; }
4743
+ .view-card {
4744
+ margin: auto;
4745
+ display: flex;
4746
+ flex-direction: column;
4747
+ align-items: center;
4748
+ gap: 6px;
4749
+ padding: 24px;
4750
+ text-align: center;
4751
+ }
4752
+ .view-card .material-symbols-outlined { font-size: 40px; color: var(--v-muted); }
4753
+ .view-card-name { font-weight: 600; font-size: 14px; }
4754
+ .view-card-meta { font-size: 12px; color: var(--v-muted); }
4755
+ .view-card button {
4756
+ margin-top: 6px;
4757
+ border: 1px solid var(--v-border);
4758
+ background: var(--v-surface);
4759
+ color: var(--v-text);
4760
+ border-radius: 8px;
4761
+ padding: 6px 12px;
4762
+ cursor: pointer;
4763
+ }