@farming-labs/theme 0.0.2-beta.4

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 (41) hide show
  1. package/dist/_virtual/_rolldown/runtime.mjs +7 -0
  2. package/dist/ai-search-dialog.d.mts +37 -0
  3. package/dist/ai-search-dialog.mjs +937 -0
  4. package/dist/darksharp/index.d.mts +97 -0
  5. package/dist/darksharp/index.mjs +111 -0
  6. package/dist/default/index.d.mts +97 -0
  7. package/dist/default/index.mjs +110 -0
  8. package/dist/docs-ai-features.d.mts +23 -0
  9. package/dist/docs-ai-features.mjs +81 -0
  10. package/dist/docs-api.d.mts +68 -0
  11. package/dist/docs-api.mjs +204 -0
  12. package/dist/docs-layout.d.mts +33 -0
  13. package/dist/docs-layout.mjs +331 -0
  14. package/dist/docs-page-client.d.mts +46 -0
  15. package/dist/docs-page-client.mjs +128 -0
  16. package/dist/index.d.mts +11 -0
  17. package/dist/index.mjs +12 -0
  18. package/dist/mdx.d.mts +38 -0
  19. package/dist/mdx.mjs +27 -0
  20. package/dist/page-actions.d.mts +21 -0
  21. package/dist/page-actions.mjs +155 -0
  22. package/dist/pixel-border/index.d.mts +87 -0
  23. package/dist/pixel-border/index.mjs +95 -0
  24. package/dist/provider.d.mts +14 -0
  25. package/dist/provider.mjs +29 -0
  26. package/dist/search.d.mts +34 -0
  27. package/dist/search.mjs +36 -0
  28. package/dist/serialize-icon.d.mts +4 -0
  29. package/dist/serialize-icon.mjs +16 -0
  30. package/dist/theme.d.mts +2 -0
  31. package/dist/theme.mjs +3 -0
  32. package/package.json +90 -0
  33. package/styles/ai.css +894 -0
  34. package/styles/base.css +298 -0
  35. package/styles/darksharp.css +433 -0
  36. package/styles/default.css +88 -0
  37. package/styles/fumadocs.css +2 -0
  38. package/styles/pixel-border.css +671 -0
  39. package/styles/presets/base.css +14 -0
  40. package/styles/presets/black.css +14 -0
  41. package/styles/presets/neutral.css +14 -0
package/styles/ai.css ADDED
@@ -0,0 +1,894 @@
1
+ /* ═══════════════════════════════════════════════════════════════════
2
+ * AI Chat & Search Dialog — base styles
3
+ *
4
+ * All AI UI components use `fd-ai-*` class names.
5
+ * Themes override these classes to create distinct visual variants.
6
+ * ═══════════════════════════════════════════════════════════════════ */
7
+
8
+ /* ─── Animations ─────────────────────────────────────────────────── */
9
+
10
+ @keyframes fd-ai-dot {
11
+ 0%, 80%, 100% { transform: scale(0); opacity: 0.5; }
12
+ 40% { transform: scale(1); opacity: 1; }
13
+ }
14
+
15
+ @keyframes fd-ai-fade-in {
16
+ from { opacity: 0; }
17
+ to { opacity: 1; }
18
+ }
19
+
20
+ @keyframes fd-ai-slide-up {
21
+ from { opacity: 0; transform: translate(-50%, -48%) scale(0.96); }
22
+ to { opacity: 1; transform: translate(-50%, -50%) scale(1); }
23
+ }
24
+
25
+ @keyframes fd-ai-float-in {
26
+ from { opacity: 0; transform: translateY(12px) scale(0.95); }
27
+ to { opacity: 1; transform: translateY(0) scale(1); }
28
+ }
29
+
30
+ @keyframes fd-ai-float-center-in {
31
+ from { opacity: 0; transform: translate(-50%, -48%) scale(0.96); }
32
+ to { opacity: 1; transform: translate(-50%, -50%) scale(1); }
33
+ }
34
+
35
+ /* ─── Overlay ────────────────────────────────────────────────────── */
36
+
37
+ .fd-ai-overlay {
38
+ position: fixed;
39
+ inset: 0;
40
+ z-index: 9998;
41
+ background: color-mix(in srgb, var(--color-fd-background, #000) 70%, transparent);
42
+ backdrop-filter: blur(6px);
43
+ animation: fd-ai-fade-in 150ms ease-out;
44
+ }
45
+
46
+ /* ─── Dialog container ───────────────────────────────────────────── */
47
+
48
+ .fd-ai-dialog {
49
+ position: fixed;
50
+ z-index: 9999;
51
+ display: flex;
52
+ flex-direction: column;
53
+ background: var(--color-fd-popover, var(--color-fd-background, #0c0c0c));
54
+ border: 1px solid var(--color-fd-border, #1f1f2e);
55
+ border-radius: var(--radius, 12px);
56
+ box-shadow: 0 20px 60px color-mix(in srgb, var(--color-fd-background, #000) 60%, transparent);
57
+ overflow: hidden;
58
+ color: var(--color-fd-foreground, #e4e4e7);
59
+ font-family: var(--fd-font-sans, system-ui, -apple-system, sans-serif);
60
+ }
61
+
62
+ /* ─── Header ─────────────────────────────────────────────────────── */
63
+
64
+ .fd-ai-header {
65
+ display: flex;
66
+ align-items: center;
67
+ gap: 8px;
68
+ padding: 12px 16px;
69
+ border-bottom: 1px solid var(--color-fd-border, rgba(255, 255, 255, 0.06));
70
+ }
71
+
72
+ .fd-ai-header-title {
73
+ font-size: 14px;
74
+ font-weight: 600;
75
+ flex: 1;
76
+ }
77
+
78
+ .fd-ai-esc {
79
+ padding: 2px 6px;
80
+ border-radius: var(--radius, 4px);
81
+ border: 1px solid var(--color-fd-border, rgba(255, 255, 255, 0.1));
82
+ font-size: 10px;
83
+ font-family: inherit;
84
+ margin-right: 4px;
85
+ color: var(--color-fd-muted-foreground, #71717a);
86
+ }
87
+
88
+ .fd-ai-close-btn {
89
+ display: flex;
90
+ align-items: center;
91
+ justify-content: center;
92
+ width: 28px;
93
+ height: 28px;
94
+ border-radius: var(--radius, 6px);
95
+ border: none;
96
+ cursor: pointer;
97
+ background: transparent;
98
+ color: var(--color-fd-muted-foreground, #71717a);
99
+ transition: all 150ms;
100
+ }
101
+
102
+ .fd-ai-close-btn:hover {
103
+ color: var(--color-fd-foreground, #e4e4e7);
104
+ background: var(--color-fd-accent, rgba(255, 255, 255, 0.06));
105
+ }
106
+
107
+ /* ─── Tab bar ────────────────────────────────────────────────────── */
108
+
109
+ .fd-ai-tab-bar {
110
+ display: flex;
111
+ align-items: center;
112
+ gap: 2px;
113
+ padding: 10px 12px 0;
114
+ border-bottom: 1px solid var(--color-fd-border, #1f1f2e);
115
+ }
116
+
117
+ .fd-ai-tab {
118
+ display: flex;
119
+ align-items: center;
120
+ gap: 6px;
121
+ padding: 8px 14px;
122
+ font-size: 13px;
123
+ font-weight: 500;
124
+ border: none;
125
+ border-radius: var(--radius, 8px) var(--radius, 8px) 0 0;
126
+ cursor: pointer;
127
+ transition: all 150ms;
128
+ background: transparent;
129
+ color: var(--color-fd-muted-foreground, #71717a);
130
+ border-bottom: 2px solid transparent;
131
+ font-family: inherit;
132
+ }
133
+
134
+ .fd-ai-tab[data-active="true"] {
135
+ background: var(--color-fd-accent, rgba(255, 255, 255, 0.06));
136
+ color: var(--color-fd-foreground, #e4e4e7);
137
+ border-bottom-color: var(--color-fd-primary, #6366f1);
138
+ }
139
+
140
+ .fd-ai-tab:hover:not([data-active="true"]) {
141
+ color: var(--color-fd-foreground, #e4e4e7);
142
+ }
143
+
144
+ /* ─── Search input area ──────────────────────────────────────────── */
145
+
146
+ .fd-ai-search-wrap {
147
+ display: flex;
148
+ align-items: center;
149
+ gap: 10px;
150
+ padding: 12px 16px;
151
+ border-bottom: 1px solid var(--color-fd-border, rgba(255, 255, 255, 0.06));
152
+ }
153
+
154
+ .fd-ai-input {
155
+ flex: 1;
156
+ background: transparent;
157
+ border: none;
158
+ outline: none;
159
+ color: var(--color-fd-foreground, #e4e4e7);
160
+ font-size: 14px;
161
+ font-family: inherit;
162
+ }
163
+
164
+ /* ─── Search results ─────────────────────────────────────────────── */
165
+
166
+ .fd-ai-results {
167
+ flex: 1;
168
+ overflow-y: auto;
169
+ padding: 4px 8px;
170
+ }
171
+
172
+ .fd-ai-result {
173
+ display: flex;
174
+ align-items: center;
175
+ gap: 10px;
176
+ width: 100%;
177
+ padding: 10px 12px;
178
+ border: none;
179
+ border-radius: var(--radius, 8px);
180
+ cursor: pointer;
181
+ text-align: left;
182
+ font-size: 13px;
183
+ font-family: inherit;
184
+ transition: background 100ms;
185
+ background: transparent;
186
+ color: var(--color-fd-foreground, #e4e4e7);
187
+ }
188
+
189
+ .fd-ai-result[data-active="true"] {
190
+ background: var(--color-fd-accent, rgba(255, 255, 255, 0.06));
191
+ color: var(--color-fd-accent-foreground, #fff);
192
+ }
193
+
194
+ .fd-ai-result-empty {
195
+ padding: 32px 16px;
196
+ text-align: center;
197
+ color: var(--color-fd-muted-foreground, #71717a);
198
+ font-size: 13px;
199
+ }
200
+
201
+ /* ─── Messages area ──────────────────────────────────────────────── */
202
+
203
+ .fd-ai-messages {
204
+ flex: 1;
205
+ overflow-y: auto;
206
+ padding: 12px 16px;
207
+ display: flex;
208
+ flex-direction: column;
209
+ gap: 16px;
210
+ }
211
+
212
+ /* ─── Empty state ────────────────────────────────────────────────── */
213
+
214
+ .fd-ai-empty {
215
+ display: flex;
216
+ flex-direction: column;
217
+ align-items: center;
218
+ justify-content: center;
219
+ flex: 1;
220
+ gap: 12px;
221
+ padding: 24px 0;
222
+ color: var(--color-fd-muted-foreground, #71717a);
223
+ }
224
+
225
+ .fd-ai-empty-title {
226
+ font-size: 14px;
227
+ font-weight: 500;
228
+ }
229
+
230
+ .fd-ai-empty-desc {
231
+ font-size: 12px;
232
+ opacity: 0.7;
233
+ text-align: center;
234
+ max-width: 300px;
235
+ line-height: 1.5;
236
+ }
237
+
238
+ /* ─── Suggested questions ────────────────────────────────────────── */
239
+
240
+ .fd-ai-suggestions {
241
+ display: flex;
242
+ flex-direction: column;
243
+ gap: 6px;
244
+ width: 100%;
245
+ max-width: 360px;
246
+ margin-top: 8px;
247
+ }
248
+
249
+ .fd-ai-suggestion {
250
+ display: flex;
251
+ align-items: center;
252
+ gap: 8px;
253
+ padding: 8px 12px;
254
+ border-radius: var(--radius, 8px);
255
+ border: 1px solid var(--color-fd-border, rgba(255, 255, 255, 0.08));
256
+ background: var(--color-fd-background, rgba(255, 255, 255, 0.01));
257
+ opacity: 0.6;
258
+ color: var(--color-fd-foreground, #e4e4e7);
259
+ font-size: 13px;
260
+ font-family: inherit;
261
+ cursor: pointer;
262
+ text-align: left;
263
+ line-height: 1.4;
264
+ transition: all 150ms;
265
+ }
266
+
267
+ .fd-ai-suggestion:hover {
268
+ background: var(--color-fd-accent, rgba(255, 255, 255, 0.06));
269
+ border-color: var(--color-fd-ring, rgba(255, 255, 255, 0.15));
270
+ }
271
+
272
+ /* ─── Message bubbles ────────────────────────────────────────────── */
273
+
274
+ .fd-ai-msg {
275
+ display: flex;
276
+ flex-direction: column;
277
+ gap: 4px;
278
+ }
279
+
280
+ .fd-ai-msg[data-role="user"] {
281
+ align-items: flex-end;
282
+ }
283
+
284
+ .fd-ai-msg[data-role="assistant"] {
285
+ align-items: flex-start;
286
+ }
287
+
288
+ .fd-ai-msg-label {
289
+ font-size: 10px;
290
+ font-weight: 500;
291
+ text-transform: uppercase;
292
+ letter-spacing: 0.05em;
293
+ color: var(--color-fd-muted-foreground, #71717a);
294
+ padding: 0 2px;
295
+ }
296
+
297
+ .fd-ai-bubble-user {
298
+ background: var(--color-fd-primary, #6366f1);
299
+ color: var(--color-fd-primary-foreground, #fff);
300
+ padding: 8px 14px;
301
+ border-radius: var(--radius, 14px);
302
+ font-size: 13px;
303
+ line-height: 1.5;
304
+ max-width: 85%;
305
+ word-break: break-word;
306
+ }
307
+
308
+ .fd-ai-bubble-ai {
309
+ background: var(--color-fd-muted, rgba(255, 255, 255, 0.04));
310
+ padding: 10px 14px;
311
+ border-radius: var(--radius, 14px);
312
+ font-size: 13px;
313
+ line-height: 1.6;
314
+ max-width: 95%;
315
+ word-break: break-word;
316
+ }
317
+
318
+ /* ─── Chat input ─────────────────────────────────────────────────── */
319
+
320
+ .fd-ai-chat-footer {
321
+ padding: 8px 12px 12px;
322
+ border-top: 1px solid var(--color-fd-border, rgba(255, 255, 255, 0.06));
323
+ }
324
+
325
+ .fd-ai-clear-btn {
326
+ font-size: 11px;
327
+ color: var(--color-fd-muted-foreground, #71717a);
328
+ background: transparent;
329
+ border: none;
330
+ cursor: pointer;
331
+ padding: 2px 8px;
332
+ border-radius: var(--radius, 4px);
333
+ font-family: inherit;
334
+ }
335
+
336
+ .fd-ai-clear-btn:hover {
337
+ color: var(--color-fd-foreground, #e4e4e7);
338
+ }
339
+
340
+ .fd-ai-input-wrap {
341
+ display: flex;
342
+ align-items: center;
343
+ gap: 8px;
344
+ background: var(--color-fd-muted, rgba(255, 255, 255, 0.04));
345
+ border-radius: var(--radius, 10px);
346
+ padding: 4px 4px 4px 14px;
347
+ border: 1px solid var(--color-fd-border, rgba(255, 255, 255, 0.08));
348
+ }
349
+
350
+ .fd-ai-send-btn {
351
+ display: flex;
352
+ align-items: center;
353
+ justify-content: center;
354
+ width: 32px;
355
+ height: 32px;
356
+ border-radius: var(--radius, 8px);
357
+ border: none;
358
+ transition: all 150ms;
359
+ cursor: default;
360
+ background: var(--color-fd-muted, rgba(255, 255, 255, 0.06));
361
+ color: var(--color-fd-muted-foreground, #71717a);
362
+ }
363
+
364
+ .fd-ai-send-btn[data-active="true"] {
365
+ cursor: pointer;
366
+ background: var(--color-fd-primary, #6366f1);
367
+ color: var(--color-fd-primary-foreground, #fff);
368
+ }
369
+
370
+ /* ─── Loading indicator ──────────────────────────────────────────── */
371
+
372
+ .fd-ai-loading {
373
+ display: inline-flex;
374
+ gap: 6px;
375
+ align-items: center;
376
+ }
377
+
378
+ .fd-ai-loading-text {
379
+ font-size: 12px;
380
+ color: var(--color-fd-muted-foreground, #888);
381
+ }
382
+
383
+ .fd-ai-loading-dots {
384
+ display: inline-flex;
385
+ gap: 3px;
386
+ align-items: center;
387
+ }
388
+
389
+ .fd-ai-loading-dot {
390
+ width: 5px;
391
+ height: 5px;
392
+ border-radius: 50%;
393
+ background: var(--color-fd-muted-foreground, #888);
394
+ animation: fd-ai-dot 1.4s infinite ease-in-out both;
395
+ }
396
+
397
+ .fd-ai-loading-dot:nth-child(2) { animation-delay: 0.16s; }
398
+ .fd-ai-loading-dot:nth-child(3) { animation-delay: 0.32s; }
399
+
400
+ /* ─── Floating trigger button ────────────────────────────────────── */
401
+
402
+ .fd-ai-floating-btn {
403
+ position: fixed;
404
+ z-index: 9997;
405
+ width: 52px;
406
+ height: 52px;
407
+ border-radius: var(--radius, 26px);
408
+ border: 1px solid var(--color-fd-border, rgba(255, 255, 255, 0.1));
409
+ background: var(--color-fd-primary, #6366f1);
410
+ color: var(--color-fd-primary-foreground, #fff);
411
+ cursor: pointer;
412
+ display: flex;
413
+ align-items: center;
414
+ justify-content: center;
415
+ box-shadow: 0 8px 32px color-mix(in srgb, var(--color-fd-primary, #6366f1) 30%, transparent);
416
+ transition: all 200ms;
417
+ animation: fd-ai-fade-in 300ms ease-out;
418
+ }
419
+
420
+ .fd-ai-floating-btn:hover {
421
+ transform: scale(1.05);
422
+ box-shadow: 0 10px 40px color-mix(in srgb, var(--color-fd-primary, #6366f1) 40%, transparent);
423
+ }
424
+
425
+ .fd-ai-floating-trigger {
426
+ position: fixed;
427
+ z-index: 9997;
428
+ cursor: pointer;
429
+ animation: fd-ai-fade-in 300ms ease-out;
430
+ }
431
+
432
+ /* ─── Markdown in AI responses ───────────────────────────────────── */
433
+
434
+ .fd-ai-bubble-ai code {
435
+ background: var(--color-fd-muted, #1a1a2e);
436
+ padding: 2px 6px;
437
+ border-radius: var(--radius, 4px);
438
+ font-size: 0.875em;
439
+ font-family: var(--fd-font-mono, ui-monospace, monospace);
440
+ }
441
+
442
+ .fd-ai-bubble-ai a {
443
+ color: var(--color-fd-primary, #6366f1);
444
+ text-decoration: underline;
445
+ }
446
+
447
+ /* Code blocks inside .fd-ai-bubble-ai should not double-style inline code */
448
+ .fd-ai-bubble-ai .fd-ai-code-block code {
449
+ background: transparent;
450
+ padding: 0;
451
+ border-radius: 0;
452
+ font-size: inherit;
453
+ }
454
+
455
+ .fd-ai-bubble-ai table {
456
+ width: 100%;
457
+ border-collapse: collapse;
458
+ margin: 8px 0;
459
+ font-size: 13px;
460
+ }
461
+
462
+ .fd-ai-bubble-ai th,
463
+ .fd-ai-bubble-ai td {
464
+ border: 1px solid var(--color-fd-border, rgba(255, 255, 255, 0.1));
465
+ padding: 6px 12px;
466
+ text-align: left;
467
+ }
468
+
469
+ .fd-ai-bubble-ai th {
470
+ background: var(--color-fd-muted, #1a1a2e);
471
+ font-weight: 600;
472
+ font-size: 12px;
473
+ }
474
+
475
+ /* ═══════════════════════════════════════════════════════════════════
476
+ * Code blocks in AI chat — fd-ai-code-*
477
+ * ═══════════════════════════════════════════════════════════════════ */
478
+
479
+ /* sugar-high syntax highlight token colors (dark) */
480
+ .fd-ai-code-block {
481
+ --sh-class: #8be9fd;
482
+ --sh-identifier: #c9d1d9;
483
+ --sh-keyword: #ff7b72;
484
+ --sh-string: #a5d6ff;
485
+ --sh-property: #79c0ff;
486
+ --sh-entity: #7ee787;
487
+ --sh-sign: #8b949e;
488
+ --sh-comment: #6e7681;
489
+ --sh-jsxliterals: #d2a8ff;
490
+ --sh-space: inherit;
491
+
492
+ margin: 10px 0;
493
+ border-radius: var(--radius, 8px);
494
+ border: 1px solid var(--color-fd-border, rgba(255, 255, 255, 0.1));
495
+ /* background: var(--color-fd-muted, #1a1a2e); */
496
+ overflow: hidden;
497
+ }
498
+
499
+ .fd-ai-code-header {
500
+ display: flex;
501
+ align-items: center;
502
+ justify-content: space-between;
503
+ padding: 6px 12px;
504
+ border-bottom: 1px solid var(--color-fd-border, rgba(255, 255, 255, 0.08));
505
+ background: color-mix(in srgb, var(--color-fd-muted, #1a1a2e) 80%, black);
506
+ min-height: 32px;
507
+ }
508
+
509
+ .fd-ai-code-lang {
510
+ font-size: 11px;
511
+ font-family: var(--fd-font-mono, ui-monospace, monospace);
512
+ color: var(--color-fd-muted-foreground, #71717a);
513
+ text-transform: uppercase;
514
+ letter-spacing: 0.04em;
515
+ }
516
+
517
+ .fd-ai-code-copy {
518
+ font-size: 11px;
519
+ font-family: var(--fd-font-mono, ui-monospace, monospace);
520
+ color: var(--color-fd-muted-foreground, #71717a);
521
+ background: transparent;
522
+ border: 1px solid var(--color-fd-border, rgba(255, 255, 255, 0.1));
523
+ border-radius: var(--radius, 4px);
524
+ padding: 2px 8px;
525
+ cursor: pointer;
526
+ transition: all 150ms;
527
+ }
528
+
529
+ .fd-ai-code-copy:hover {
530
+ color: var(--color-fd-foreground, #e4e4e7);
531
+ background: color-mix(in srgb, var(--color-fd-accent, rgba(255,255,255,0.05)) 60%, transparent);
532
+ }
533
+
534
+ .fd-ai-code-block pre {
535
+ margin: 0;
536
+ padding: 12px 16px;
537
+ overflow-x: auto;
538
+ background: transparent;
539
+ border: none;
540
+ border-radius: 0;
541
+ }
542
+
543
+ .fd-ai-code-block code {
544
+ font-size: 13px;
545
+ line-height: 1.45;
546
+ font-family: var(--fd-font-mono, ui-monospace, monospace);
547
+ background: transparent;
548
+ padding: 0;
549
+ border-radius: 0;
550
+ }
551
+
552
+ /* sugar-high: each line is a block span, min-height keeps empty lines visible */
553
+ .fd-ai-code-block .sh__line { display: block; min-height: 1.2em; }
554
+
555
+ /* ═══════════════════════════════════════════════════════════════════
556
+ * Full-Modal (better-auth inspired) — fd-ai-fm-*
557
+ * ═══════════════════════════════════════════════════════════════════ */
558
+
559
+ .fd-ai-fm-overlay {
560
+ position: fixed;
561
+ inset: 0;
562
+ display: flex;
563
+ flex-direction: column;
564
+ align-items: center;
565
+ background: color-mix(in srgb, var(--color-fd-background, #000) 80%, transparent);
566
+ backdrop-filter: blur(8px);
567
+ z-index: 9998;
568
+ animation: fd-ai-fade-in 200ms ease-out;
569
+ padding: 0 8px;
570
+ }
571
+
572
+ /* ─── Top bar (close button) ─────────────────────────────────────── */
573
+
574
+ .fd-ai-fm-topbar {
575
+ display: flex;
576
+ justify-content: flex-end;
577
+ align-items: center;
578
+ width: min(800px, 100%);
579
+ padding: 12px 0;
580
+ position: sticky;
581
+ top: 0;
582
+ z-index: 2;
583
+ }
584
+
585
+ .fd-ai-fm-close-btn {
586
+ display: flex;
587
+ align-items: center;
588
+ justify-content: center;
589
+ width: 32px;
590
+ height: 32px;
591
+ border-radius: var(--radius, 9999px);
592
+ border: 1px solid var(--color-fd-border, rgba(255, 255, 255, 0.1));
593
+ background: var(--color-fd-secondary, rgba(255, 255, 255, 0.06));
594
+ color: var(--color-fd-foreground, #e4e4e7);
595
+ cursor: pointer;
596
+ transition: all 150ms;
597
+ }
598
+
599
+ .fd-ai-fm-close-btn:hover {
600
+ background: var(--color-fd-accent, rgba(255, 255, 255, 0.1));
601
+ }
602
+
603
+ /* ─── Message list ───────────────────────────────────────────────── */
604
+
605
+ .fd-ai-fm-messages {
606
+ flex: 1;
607
+ overflow-y: auto;
608
+ width: min(800px, 100%);
609
+ padding: 24px 0 120px;
610
+ mask-image: linear-gradient(to bottom, transparent, white 3rem, white calc(100% - 8rem), transparent 100%);
611
+ -webkit-mask-image: linear-gradient(to bottom, transparent, white 3rem, white calc(100% - 8rem), transparent 100%);
612
+ }
613
+
614
+ .fd-ai-fm-messages-inner {
615
+ display: flex;
616
+ flex-direction: column;
617
+ gap: 20px;
618
+ }
619
+
620
+ /* ─── Message ────────────────────────────────────────────────────── */
621
+
622
+ .fd-ai-fm-msg {
623
+ display: flex;
624
+ flex-direction: column;
625
+ }
626
+
627
+ .fd-ai-fm-msg-label {
628
+ font-size: 13px;
629
+ font-weight: 500;
630
+ margin-bottom: 4px;
631
+ color: var(--color-fd-muted-foreground, #71717a);
632
+ }
633
+
634
+ .fd-ai-fm-msg-label[data-role="assistant"] {
635
+ color: var(--color-fd-primary, #6366f1);
636
+ }
637
+
638
+ .fd-ai-fm-msg-content {
639
+ font-size: 14px;
640
+ line-height: 1.7;
641
+ color: var(--color-fd-foreground, #e4e4e7);
642
+ }
643
+
644
+ .fd-ai-fm-msg-content code {
645
+ background: var(--color-fd-muted, #1a1a2e);
646
+ padding: 2px 6px;
647
+ border-radius: var(--radius, 4px);
648
+ font-size: 0.875em;
649
+ font-family: var(--fd-font-mono, ui-monospace, monospace);
650
+ }
651
+
652
+ .fd-ai-fm-msg-content .fd-ai-code-block code {
653
+ background: transparent;
654
+ padding: 0;
655
+ border-radius: 0;
656
+ font-size: inherit;
657
+ }
658
+
659
+ .fd-ai-fm-msg-content a {
660
+ color: var(--color-fd-primary, #6366f1);
661
+ text-decoration: underline;
662
+ }
663
+
664
+ .fd-ai-fm-msg-content table {
665
+ width: 100%;
666
+ border-collapse: collapse;
667
+ margin: 8px 0;
668
+ font-size: 13px;
669
+ }
670
+
671
+ .fd-ai-fm-msg-content th,
672
+ .fd-ai-fm-msg-content td {
673
+ border: 1px solid var(--color-fd-border, rgba(255, 255, 255, 0.1));
674
+ padding: 6px 12px;
675
+ text-align: left;
676
+ }
677
+
678
+ .fd-ai-fm-msg-content th {
679
+ background: var(--color-fd-muted, #1a1a2e);
680
+ font-weight: 600;
681
+ font-size: 12px;
682
+ }
683
+
684
+ /* ─── Thinking dots ──────────────────────────────────────────────── */
685
+
686
+ .fd-ai-fm-thinking {
687
+ display: flex;
688
+ gap: 4px;
689
+ align-items: center;
690
+ }
691
+
692
+ .fd-ai-fm-thinking-dot {
693
+ width: 6px;
694
+ height: 6px;
695
+ border-radius: 9999px;
696
+ background: var(--color-fd-primary, #6366f1);
697
+ animation: fd-ai-fm-bounce 1s infinite ease-in-out;
698
+ }
699
+
700
+ .fd-ai-fm-thinking-dot:nth-child(2) { animation-delay: 150ms; }
701
+ .fd-ai-fm-thinking-dot:nth-child(3) { animation-delay: 300ms; }
702
+
703
+ @keyframes fd-ai-fm-bounce {
704
+ 0%, 80%, 100% { transform: scale(0.6); opacity: 0.4; }
705
+ 40% { transform: scale(1); opacity: 1; }
706
+ }
707
+
708
+ /* ─── Bottom input bar ───────────────────────────────────────────── */
709
+
710
+ .fd-ai-fm-input-bar {
711
+ position: fixed;
712
+ z-index: 9999;
713
+ transition: width 300ms cubic-bezier(0.34, 1.56, 0.64, 1),
714
+ height 300ms cubic-bezier(0.34, 1.56, 0.64, 1),
715
+ transform 200ms ease-out;
716
+ }
717
+
718
+ .fd-ai-fm-input-bar--closed {
719
+ /* inherits position from inline btnPosition styles */
720
+ }
721
+
722
+ .fd-ai-fm-input-bar--open {
723
+ bottom: 16px;
724
+ left: 50%;
725
+ transform: translateX(-50%);
726
+ width: min(800px, calc(100vw - 32px));
727
+ }
728
+
729
+ .fd-ai-fm-input-container {
730
+ display: flex;
731
+ flex-direction: column;
732
+ border-radius: var(--radius, 12px);
733
+ border: 1px solid var(--color-fd-border, rgba(255, 255, 255, 0.1));
734
+ background: var(--color-fd-background, #0c0c0c);
735
+ box-shadow: 0 20px 60px color-mix(in srgb, var(--color-fd-background, #000) 70%, transparent);
736
+ overflow: hidden;
737
+ }
738
+
739
+ .fd-ai-fm-input-wrap {
740
+ display: flex;
741
+ align-items: flex-start;
742
+ padding-right: 8px;
743
+ }
744
+
745
+ .fd-ai-fm-input {
746
+ flex: 1;
747
+ padding: 16px;
748
+ background: transparent;
749
+ border: none;
750
+ outline: none;
751
+ resize: none;
752
+ color: var(--color-fd-foreground, #e4e4e7);
753
+ font-size: 14px;
754
+ font-family: var(--fd-font-sans, system-ui, -apple-system, sans-serif);
755
+ line-height: 1.5;
756
+ min-height: 0;
757
+ max-height: 120px;
758
+ }
759
+
760
+ .fd-ai-fm-input::placeholder {
761
+ color: var(--color-fd-muted-foreground, #71717a);
762
+ }
763
+
764
+ .fd-ai-fm-send-btn {
765
+ display: flex;
766
+ align-items: center;
767
+ justify-content: center;
768
+ margin-top: 12px;
769
+ width: 32px;
770
+ height: 32px;
771
+ border-radius: 9999px;
772
+ border: none;
773
+ cursor: default;
774
+ transition: all 150ms;
775
+ background: var(--color-fd-secondary, rgba(255, 255, 255, 0.06));
776
+ color: var(--color-fd-muted-foreground, #71717a);
777
+ }
778
+
779
+ .fd-ai-fm-send-btn[data-active="true"] {
780
+ cursor: pointer;
781
+ background: var(--color-fd-primary, #6366f1);
782
+ color: var(--color-fd-primary-foreground, #fff);
783
+ }
784
+
785
+ /* ─── Suggestions (horizontal pills) ────────────────────────────── */
786
+
787
+ .fd-ai-fm-suggestions-area {
788
+ padding: 12px 16px 4px;
789
+ }
790
+
791
+ .fd-ai-fm-suggestions-label {
792
+ font-size: 12px;
793
+ font-weight: 500;
794
+ color: var(--color-fd-muted-foreground, #71717a);
795
+ margin-bottom: 8px;
796
+ }
797
+
798
+ .fd-ai-fm-suggestions {
799
+ display: flex;
800
+ gap: 8px;
801
+ overflow-x: auto;
802
+ padding-bottom: 4px;
803
+ mask-image: linear-gradient(to right, transparent 0%, black 1rem, black calc(100% - 1rem), transparent 100%);
804
+ -webkit-mask-image: linear-gradient(to right, transparent 0%, black 1rem, black calc(100% - 1rem), transparent 100%);
805
+ }
806
+
807
+ .fd-ai-fm-suggestion {
808
+ flex-shrink: 0;
809
+ white-space: nowrap;
810
+ padding: 6px 14px;
811
+ font-size: 12px;
812
+ font-family: inherit;
813
+ border-radius: 9999px;
814
+ border: 1px solid color-mix(in srgb, var(--color-fd-border, rgba(255,255,255,0.1)) 50%, transparent);
815
+ background: color-mix(in srgb, var(--color-fd-muted, rgba(255,255,255,0.04)) 30%, transparent);
816
+ color: var(--color-fd-muted-foreground, #71717a);
817
+ cursor: pointer;
818
+ transition: all 200ms;
819
+ }
820
+
821
+ .fd-ai-fm-suggestion:hover {
822
+ background: color-mix(in srgb, var(--color-fd-muted, rgba(255,255,255,0.04)) 50%, transparent);
823
+ color: var(--color-fd-foreground, #e4e4e7);
824
+ border-color: var(--color-fd-border, rgba(255, 255, 255, 0.1));
825
+ }
826
+
827
+ /* ─── Footer bar ─────────────────────────────────────────────────── */
828
+
829
+ .fd-ai-fm-footer-bar {
830
+ display: flex;
831
+ align-items: center;
832
+ gap: 4px;
833
+ padding: 8px 16px;
834
+ border-top: 1px solid var(--color-fd-border, rgba(255, 255, 255, 0.06));
835
+ background: color-mix(in srgb, var(--color-fd-accent, rgba(255,255,255,0.03)) 40%, transparent);
836
+ font-size: 12px;
837
+ color: var(--color-fd-muted-foreground, #71717a);
838
+ }
839
+
840
+ .fd-ai-fm-clear-btn {
841
+ display: flex;
842
+ align-items: center;
843
+ gap: 4px;
844
+ background: transparent;
845
+ border: none;
846
+ cursor: pointer;
847
+ font-family: inherit;
848
+ font-size: 12px;
849
+ color: var(--color-fd-muted-foreground, #71717a);
850
+ transition: color 200ms;
851
+ padding: 0;
852
+ }
853
+
854
+ .fd-ai-fm-clear-btn:hover {
855
+ color: var(--color-fd-foreground, #e4e4e7);
856
+ }
857
+
858
+ .fd-ai-fm-clear-btn[aria-disabled="true"] {
859
+ opacity: 0.5;
860
+ cursor: not-allowed;
861
+ }
862
+
863
+ .fd-ai-fm-footer-hint {
864
+ flex: 1;
865
+ }
866
+
867
+ /* ─── Closed trigger button ──────────────────────────────────────── */
868
+
869
+ .fd-ai-fm-trigger-btn {
870
+ display: flex;
871
+ align-items: center;
872
+ justify-content: center;
873
+ gap: 8px;
874
+ padding: 8px 16px;
875
+ height: 40px;
876
+ border-radius: var(--radius, 16px);
877
+ border: 1px solid var(--color-fd-border, rgba(255, 255, 255, 0.1));
878
+ background: var(--color-fd-secondary, rgba(255, 255, 255, 0.06));
879
+ color: var(--color-fd-muted-foreground, #71717a);
880
+ font-family: inherit;
881
+ font-size: 14px;
882
+ cursor: pointer;
883
+ backdrop-filter: blur(8px);
884
+ box-shadow: 0 8px 32px color-mix(in srgb, var(--color-fd-background, #000) 40%, transparent);
885
+ transition: all 200ms;
886
+ animation: fd-ai-fade-in 300ms ease-out;
887
+ white-space: nowrap;
888
+ }
889
+
890
+ .fd-ai-fm-trigger-btn:hover {
891
+ background: var(--color-fd-accent, rgba(255, 255, 255, 0.1));
892
+ color: var(--color-fd-accent-foreground, #fff);
893
+ transform: scale(1.03);
894
+ }