@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
@@ -0,0 +1,671 @@
1
+ /* @farming-labs/theme — pixel-border theme CSS
2
+ * Inspired by better-auth.com — pixel-perfect borders, clean dark UI.
3
+ * Uses the "black" color preset as the base.
4
+ */
5
+ @import "./presets/black.css";
6
+
7
+ :root {
8
+ --color-fd-background: oklch(1 0 0);
9
+ --color-fd-foreground: oklch(0.147 0.004 49.25);
10
+ --color-fd-card: oklch(0.985 0.001 106.423);
11
+ --color-fd-card-foreground: oklch(0.147 0.004 49.25);
12
+ --color-fd-popover: oklch(1 0 0);
13
+ --color-fd-popover-foreground: oklch(0.147 0.004 49.25);
14
+ --color-fd-primary: oklch(0.216 0.006 56.043);
15
+ --color-fd-primary-foreground: oklch(0.985 0.001 106.423);
16
+ --color-fd-secondary: oklch(0.97 0.001 106.424);
17
+ --color-fd-secondary-foreground: oklch(0.216 0.006 56.043);
18
+ --color-fd-muted: oklch(0.97 0.001 106.424);
19
+ --color-fd-muted-foreground: oklch(0.553 0.013 58.071);
20
+ --color-fd-accent: oklch(0.97 0.001 106.424);
21
+ --color-fd-accent-foreground: oklch(0.216 0.006 56.043);
22
+ --color-fd-border: oklch(0.923 0.003 48.717);
23
+ --color-fd-ring: oklch(0.709 0.01 56.259);
24
+ --scrollbar-thumb: var(--color-fd-border);
25
+ --scrollbar-thumb-hover: var(--color-fd-ring);
26
+ --scrollbar-track: transparent;
27
+ /* Sharp corners — no rounding */
28
+ --radius: 0px;
29
+ --fd-nav-height: 56px;
30
+ --fd-banner-height: 0px;
31
+ --fd-tocnav-height: 0px;
32
+ }
33
+
34
+ .dark {
35
+ --color-fd-background: hsl(0 0% 2%);
36
+ --color-fd-foreground: oklch(0.985 0.001 106.423);
37
+ --color-fd-card: hsl(0 0% 4%);
38
+ --color-fd-card-foreground: oklch(0.985 0.001 106.423);
39
+ --color-fd-popover: hsl(0 0% 4%);
40
+ --color-fd-popover-foreground: oklch(0.985 0.001 106.423);
41
+ --color-fd-primary: oklch(0.985 0.001 106.423);
42
+ --color-fd-primary-foreground: oklch(0.216 0.006 56.043);
43
+ --color-fd-secondary: hsl(0 0% 8%);
44
+ --color-fd-secondary-foreground: oklch(0.985 0.001 106.423);
45
+ --color-fd-muted: hsl(0 0% 10%);
46
+ --color-fd-muted-foreground: hsl(0 0% 55%);
47
+ --color-fd-accent: hsl(0 0% 10%);
48
+ --color-fd-accent-foreground: oklch(0.985 0.001 106.423);
49
+ --color-fd-border: hsl(0 0% 15%);
50
+ --color-fd-ring: hsl(0 0% 30%);
51
+ --scrollbar-thumb: var(--color-fd-border);
52
+ --scrollbar-thumb-hover: var(--color-fd-ring);
53
+ --scrollbar-track: transparent;
54
+ }
55
+
56
+ /* ─── Scroll ──────────────────────────────────────────────────────── */
57
+
58
+ html {
59
+ scroll-behavior: auto;
60
+ scroll-padding-top: calc(
61
+ var(--fd-nav-height, 56px) +
62
+ var(--fd-banner-height, 0px) +
63
+ var(--fd-tocnav-height, 0px) +
64
+ 24px
65
+ );
66
+ }
67
+
68
+ html:not([data-anchor-scrolling]) {
69
+ scroll-behavior: smooth;
70
+ }
71
+
72
+ /* ─── Custom scrollbar ────────────────────────────────────────────── */
73
+
74
+ * {
75
+ scrollbar-width: thin;
76
+ scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track);
77
+ }
78
+
79
+ ::-webkit-scrollbar {
80
+ width: 12px;
81
+ height: 12px;
82
+ }
83
+ ::-webkit-scrollbar-track {
84
+ background: var(--scrollbar-track);
85
+ }
86
+ ::-webkit-scrollbar-thumb {
87
+ background-color: var(--scrollbar-thumb);
88
+ border-radius: 9999px;
89
+ border: 3px solid transparent;
90
+ background-clip: content-box;
91
+ }
92
+ ::-webkit-scrollbar-thumb:hover {
93
+ background-color: var(--scrollbar-thumb-hover);
94
+ }
95
+ ::-webkit-scrollbar-corner {
96
+ background: transparent;
97
+ }
98
+
99
+ /* ─── Selection ───────────────────────────────────────────────────── */
100
+
101
+ body {
102
+ overscroll-behavior: none;
103
+ }
104
+
105
+ ::selection {
106
+ background: var(--color-fd-foreground);
107
+ color: var(--color-fd-background);
108
+ }
109
+
110
+ /* ─── Inline code word break ──────────────────────────────────────── */
111
+
112
+ code:not(pre code) {
113
+ overflow-wrap: break-word;
114
+ word-break: break-word;
115
+ }
116
+
117
+ /* ═══════════════════════════════════════════════════════════════════
118
+ * Global rounded-none: force sharp corners on all UI elements
119
+ * ═══════════════════════════════════════════════════════════════════ */
120
+
121
+ /* Cards, popovers, dialogs, inputs, buttons, badges */
122
+ [class*="rounded-"],
123
+ [class*="border-radius"],
124
+ .rounded-lg,
125
+ .rounded-md,
126
+ .rounded-xl,
127
+ .rounded-2xl {
128
+ border-radius: 0 !important;
129
+ }
130
+
131
+ /* Inline code */
132
+ code:not(pre code) {
133
+ border-radius: 0 !important;
134
+ }
135
+
136
+ /* ═══════════════════════════════════════════════════════════════════
137
+ * Pixel-border theme — better-auth inspired sidebar, clean dark UI
138
+ * ═══════════════════════════════════════════════════════════════════ */
139
+
140
+ /* ─── Docs grid: pin sidebar left, TOC right, content fills middle ── */
141
+ @media (min-width: 768px) {
142
+ #nd-docs-layout {
143
+ grid-template-columns: var(--fd-sidebar-col, 0px) 1fr min-content !important;
144
+ }
145
+ }
146
+
147
+ /* ─── Sidebar (better-auth style) ─────────────────────────────────── */
148
+ /* Sidebar container: dark, subtle right border */
149
+ .dark aside#nd-sidebar {
150
+ background: hsl(0 0% 2%);
151
+ border-color: hsl(0 0% 12%);
152
+ }
153
+
154
+ /* ── Full-width border separators between top-level items ─────────── */
155
+ /* Negative margins extend the border line across the full sidebar. */
156
+ .dark aside .overscroll-contain > div {
157
+ margin-top: -22px;
158
+ }
159
+
160
+ .dark aside .overscroll-contain > div > a[data-active] {
161
+ border-top: 1px solid hsl(0 0% 12%);
162
+ margin-left: -1rem;
163
+ margin-right: -1rem;
164
+ padding-left: 1rem;
165
+ padding-right: 1rem;
166
+ /* padding-top: 0.75rem; */
167
+ padding-bottom: 0.75rem;
168
+ }
169
+
170
+ /* Folder wrappers: border + negative margin but NO padding
171
+ so the parent link inside aligns with other top-level items. */
172
+ .dark aside .overscroll-contain > div > div {
173
+ border-top: 1px solid hsl(0 0% 12%);
174
+ margin-left: -1rem;
175
+ margin-right: -1rem;
176
+ padding: 0 !important;
177
+ }
178
+
179
+ /* Parent link inside a folder (e.g. "Introduction") —
180
+ inherit the same padding as other top-level links from the
181
+ all-links rule so it aligns flush. No extra padding here. */
182
+
183
+ /* First item: no top border */
184
+ .dark aside .overscroll-contain > div > a[data-active]:first-child,
185
+ .dark aside .overscroll-contain > div > div:first-child {
186
+ border-top: none;
187
+ }
188
+
189
+ /* ── Sidebar links (all levels) ──────────────────────────────────── */
190
+
191
+ .dark aside a[data-active] {
192
+ font-size: 0.875rem;
193
+ line-height: 1.6;
194
+ border-radius: 0 !important;
195
+ padding: 0.5rem 0.625rem !important;
196
+ transition: color 0.15s ease;
197
+ color: hsl(0 0% 50%);
198
+ font-weight: 400;
199
+ overflow: hidden;
200
+ background-color: transparent !important;
201
+ }
202
+
203
+ /* Kill the Tailwind utility bg on active & hover */
204
+ .dark aside a[data-active="true"],
205
+ .dark aside a[data-active="true"]:hover {
206
+ background: transparent !important;
207
+ background-color: transparent !important;
208
+ color: var(--color-fd-primary) !important;
209
+ font-weight: 600;
210
+ }
211
+
212
+ /* Hover on inactive: text brightens only */
213
+ .dark aside a[data-active="false"]:hover {
214
+ background: transparent !important;
215
+ background-color: transparent !important;
216
+ color: hsl(0 0% 80%);
217
+ }
218
+
219
+ /* ── Child links inside collapsible folders ──────────────────────── */
220
+ /* Smaller text, indented, no border separators.
221
+ Target only links inside the inner overflow-hidden collapsible
222
+ content container (which has both data-state and overflow-hidden). */
223
+
224
+ .dark aside div.overflow-hidden[data-state] a[data-active] {
225
+ font-size: 0.785rem !important;
226
+ padding-left: 2rem !important;
227
+ padding-top: 0.25rem !important;
228
+ padding-bottom: 0.25rem !important;
229
+ color: hsl(0 0% 45%) !important;
230
+ overflow: hidden;
231
+ }
232
+
233
+ .dark aside div.overflow-hidden[data-state] a[data-active="true"],
234
+ .dark aside div.overflow-hidden[data-state] a[data-active="true"]:hover {
235
+ color: var(--color-fd-primary) !important;
236
+ font-weight: 500 !important;
237
+ }
238
+
239
+ .dark aside div.overflow-hidden[data-state] a[data-active="false"]:hover {
240
+ color: hsl(0 0% 75%) !important;
241
+ }
242
+
243
+ /* ── Folder toggle buttons (section headers) ─────────────────────── */
244
+
245
+ .dark aside button.text-fd-muted-foreground {
246
+ color: hsl(0 0% 90%);
247
+ font-size: 0.875rem;
248
+ font-weight: 500;
249
+ letter-spacing: normal;
250
+ text-transform: none;
251
+ }
252
+
253
+ .dark aside button.text-fd-muted-foreground:hover {
254
+ color: hsl(0 0% 100%);
255
+ }
256
+ .dark aside a[data-active="true"]::before {
257
+ background-color: var(--color-fd-primary) !important;
258
+ width: 2px !important;
259
+ margin-left: 0.6rem !important;
260
+ inset-inline-start: 0.5rem !important;
261
+ }
262
+
263
+ /* Change the static folder guide line */
264
+ .dark aside div.overflow-hidden[data-state]::before {
265
+ margin-left: 0.5rem !important;
266
+ height: calc(100% + 20px) !important;
267
+ /* margin-bottom: -10px !important; */
268
+ margin-top: -25px !important;
269
+ }
270
+
271
+ /* ── Folder parent link when children are EXPANDED ────── */
272
+ .dark aside div[data-state="open"] > :last-child {
273
+ overflow: hidden;
274
+ }
275
+
276
+ /* ── Folder parent link when children are COLLAPSED ───── */
277
+ /* .dark aside div[data-state="closed"] > a[data-active] {
278
+ color: hsl(0 0% 60%) !important;
279
+ font-weight: 400 !important;
280
+ } */
281
+
282
+
283
+ /* ── Search button: full-width, border-y only ────────────────────── */
284
+
285
+
286
+ .dark aside button[class*="bg-fd-secondary"] {
287
+ background: transparent !important;
288
+ border: none !important;
289
+ border-top: 1px solid hsl(0 0% 12%) !important;
290
+ border-bottom: 1px solid hsl(0 0% 12%) !important;
291
+ border-radius: 0 !important;
292
+ color: hsl(0 0% 45%);
293
+ font-size: 0.8125rem;
294
+ padding: 0.5rem 0 !important;
295
+ width: calc(100% + 2rem) !important;
296
+ margin-left: -1rem !important;
297
+ margin-right: -1rem !important;
298
+ padding-left: 1rem !important;
299
+ padding-right: 1rem !important;
300
+ }
301
+
302
+ .dark aside button[class*="bg-fd-secondary"]:hover {
303
+ background: hsl(0 0% 4%) !important;
304
+ color: hsl(0 0% 65%);
305
+ }
306
+
307
+ /* ── Theme toggle ────────────────────────────────────────────────── */
308
+
309
+ .dark aside button[class*="rounded-full"] {
310
+ border-color: hsl(0 0% 12%);
311
+ }
312
+
313
+ /* ─── Tables: visible borders, rounded wrapper ────────────────────── */
314
+
315
+ .dark table {
316
+ border: 1px solid hsl(0 0% 15%);
317
+ border-radius: 0 !important;
318
+ overflow: hidden;
319
+ }
320
+
321
+ .dark th {
322
+ background: hsl(0 0% 6%);
323
+ color: hsl(0 0% 80%);
324
+ font-weight: 500;
325
+ border-color: hsl(0 0% 15%);
326
+ }
327
+
328
+ .dark td {
329
+ border-color: hsl(0 0% 12%);
330
+ }
331
+
332
+ .dark tr:last-child td {
333
+ border-bottom: none;
334
+ }
335
+
336
+ /* ─── Code blocks: single border only ─────────────────────────────── */
337
+
338
+ /* Target the fumadocs CodeBlock figure (shiki class) */
339
+ figure.shiki {
340
+ border: 1px solid hsl(0 0% 15%) !important;
341
+ border-radius: 0 !important;
342
+ overflow: hidden;
343
+ box-shadow: none !important;
344
+ }
345
+
346
+ /* Copy button inside code blocks */
347
+ figure.shiki button {
348
+ border-radius: 0 !important;
349
+ }
350
+
351
+ /* Code block title bar */
352
+ figure.shiki > div:first-child {
353
+ border-radius: 0 !important;
354
+ }
355
+
356
+ /* ─── Tabs (package manager / code tabs) ──────────────────────────── */
357
+
358
+ .dark [role="tablist"] {
359
+ border-radius: 0 !important;
360
+ }
361
+
362
+ .dark [role="tablist"] button,
363
+ .dark [role="tab"] {
364
+ border-radius: 0 !important;
365
+ }
366
+
367
+ .dark [role="tabpanel"] {
368
+ border-radius: 0 !important;
369
+ }
370
+
371
+ /* Tabs container */
372
+ .dark div:has(> [role="tablist"]) {
373
+ border-radius: 0 !important;
374
+ }
375
+
376
+ /* ─── Inline code ─────────────────────────────────────────────────── */
377
+ /*
378
+ .dark code:not(pre code) {
379
+ background: hsl(0 0% 8%);
380
+ border: 1px solid hsl(0 0% 16%);
381
+ color: hsl(0 0% 85%);
382
+ border-radius: 0.375rem;
383
+ padding: 0.125rem 0.375rem;
384
+ } */
385
+
386
+ /* ─── Callouts: visible border ────────────────────────────────────── */
387
+
388
+ .dark [class*="bg-fd-card"] {
389
+ border-color: hsl(0 0% 15%);
390
+ }
391
+
392
+ /* ─── Nav cards (prev/next): visible border ───────────────────────── */
393
+
394
+ .dark article a[class*="border"] {
395
+ border-color: hsl(0 0% 15%);
396
+ border-radius: 0 !important;
397
+ }
398
+
399
+ .dark article a[class*="border"]:hover {
400
+ background: hsl(0 0% 6%);
401
+ border-color: hsl(0 0% 22%);
402
+ }
403
+
404
+ /* ─── Search dialog ───────────────────────────────────────────────── */
405
+
406
+ [role="dialog"] {
407
+ border-radius: 0 !important;
408
+ }
409
+
410
+ /* ─── TOC right panel ─────────────────────────────────────────────── */
411
+
412
+ .dark nav[class*="toc"],
413
+ .dark [class*="fd-toc"] {
414
+ border-color: hsl(0 0% 12%);
415
+ }
416
+
417
+ /* ─── Separator/Divider (hr) ──────────────────────────────────────── */
418
+
419
+ .dark hr {
420
+ border-color: hsl(0 0% 15%);
421
+ }
422
+
423
+ /* ─── Breadcrumb (pixel-border overrides) ─────────────────────────── */
424
+
425
+ .fd-breadcrumb {
426
+ font-size: 0.75rem;
427
+ letter-spacing: 0.01em;
428
+ }
429
+ .fd-breadcrumb-link {
430
+ color: inherit;
431
+ text-decoration: none;
432
+ text-transform: uppercase;
433
+ font-family: var(--fd-font-mono, var(--font-geist-mono, ui-monospace, monospace));
434
+ }
435
+ .fd-breadcrumb-current {
436
+ font-family: var(--fd-font-mono, var(--font-geist-mono, ui-monospace, monospace));
437
+ text-transform: uppercase;
438
+ }
439
+ /* ─── Page Actions (pixel-border overrides) ───────────────────────── */
440
+
441
+ .fd-page-action-btn {
442
+ border-radius: 0 !important;
443
+ font-size: 0.75rem;
444
+ letter-spacing: 0.03em;
445
+ }
446
+
447
+ .fd-page-action-menu {
448
+ border-radius: 0 !important;
449
+ box-shadow: 0 4px 24px hsl(0 0% 0% / 0.5);
450
+ }
451
+
452
+ .fd-page-action-menu-item {
453
+ border-radius: 0 !important;
454
+ font-size: 0.8rem;
455
+ }
456
+
457
+ /* ─── AI Chat (pixel-border — zero radius, pixel-art, monospace) ── */
458
+
459
+ .fd-ai-dialog {
460
+ border-radius: 0 !important;
461
+ border-width: 1px;
462
+ box-shadow: 4px 4px 0 0 var(--color-fd-border, hsl(0 0% 15%));
463
+ }
464
+
465
+ .fd-ai-tab-bar {
466
+ gap: 0;
467
+ }
468
+
469
+ .fd-ai-tab {
470
+ border-radius: 0 !important;
471
+ font-size: 12px;
472
+ letter-spacing: 0.04em;
473
+ }
474
+
475
+ .fd-ai-header-title {
476
+ font-size: 13px;
477
+ }
478
+
479
+ .fd-ai-bubble-user {
480
+ border-radius: 0 !important;
481
+ font-size: 12px;
482
+ }
483
+
484
+ .fd-ai-bubble-ai {
485
+ border-radius: 0 !important;
486
+ font-size: 12px;
487
+ }
488
+
489
+ .fd-ai-bubble-ai pre {
490
+ border-radius: 0 !important;
491
+ border: 1px solid var(--color-fd-border, hsl(0 0% 15%));
492
+ }
493
+
494
+ .fd-ai-bubble-ai code {
495
+ border-radius: 0 !important;
496
+ }
497
+
498
+ .fd-ai-input-wrap {
499
+ border-radius: 0 !important;
500
+ }
501
+
502
+ .fd-ai-input {
503
+ font-size: 13px;
504
+ }
505
+
506
+ .fd-ai-send-btn {
507
+ border-radius: 0 !important;
508
+ }
509
+
510
+ .fd-ai-close-btn {
511
+ border-radius: 0 !important;
512
+ }
513
+
514
+ .fd-ai-floating-btn {
515
+ border-radius: 0 !important;
516
+ box-shadow: 3px 3px 0 0 var(--color-fd-border, hsl(0 0% 15%));
517
+ }
518
+
519
+ .fd-ai-floating-btn:hover {
520
+ transform: translate(-1px, -1px);
521
+ box-shadow: 4px 4px 0 0 var(--color-fd-border, hsl(0 0% 15%));
522
+ }
523
+
524
+ .fd-ai-suggestion {
525
+ border-radius: 0 !important;
526
+ font-size: 12px;
527
+ }
528
+
529
+ .fd-ai-result {
530
+ border-radius: 0 !important;
531
+ }
532
+
533
+ .fd-ai-esc {
534
+ border-radius: 0 !important;
535
+ }
536
+
537
+ .fd-ai-clear-btn {
538
+ border-radius: 0 !important;
539
+ letter-spacing: 0.04em;
540
+ }
541
+
542
+ .fd-ai-msg-label {
543
+ letter-spacing: 0.06em;
544
+ }
545
+
546
+ .fd-ai-loading-text {
547
+ text-transform: uppercase;
548
+ letter-spacing: 0.04em;
549
+ font-size: 11px;
550
+ }
551
+
552
+ .fd-ai-loading-dot {
553
+ border-radius: 0;
554
+ width: 4px;
555
+ height: 4px;
556
+ }
557
+
558
+ /* ─── Full-Modal (pixel-border) ──────────────────────────────────── */
559
+
560
+ .fd-ai-fm-input-container {
561
+ border-radius: 0 !important;
562
+ box-shadow: 4px 4px 0 0 var(--color-fd-border, hsl(0 0% 15%));
563
+ }
564
+
565
+ .fd-ai-fm-send-btn {
566
+ border-radius: 0 !important;
567
+ }
568
+
569
+ .fd-ai-fm-close-btn {
570
+ border-radius: 0 !important;
571
+ }
572
+
573
+ .fd-ai-fm-input {
574
+ font-size: 13px;
575
+ }
576
+
577
+ .fd-ai-fm-suggestion {
578
+ border-radius: 0 !important;
579
+ font-family: var(--fd-font-mono, ui-monospace, monospace);
580
+ font-size: 11px;
581
+ text-transform: uppercase;
582
+ letter-spacing: 0.04em;
583
+ }
584
+
585
+ .fd-ai-fm-trigger-btn {
586
+ border-radius: 0 !important;
587
+ font-family: var(--fd-font-mono, ui-monospace, monospace);
588
+ text-transform: uppercase;
589
+ letter-spacing: 0.04em;
590
+ font-size: 12px;
591
+ box-shadow: 3px 3px 0 0 var(--color-fd-border, hsl(0 0% 15%));
592
+ }
593
+
594
+ .fd-ai-fm-trigger-btn:hover {
595
+ transform: translate(-1px, -1px);
596
+ box-shadow: 4px 4px 0 0 var(--color-fd-border, hsl(0 0% 15%));
597
+ }
598
+
599
+ .fd-ai-fm-msg-label {
600
+ font-family: var(--fd-font-mono, ui-monospace, monospace);
601
+ text-transform: uppercase;
602
+ letter-spacing: 0.06em;
603
+ font-size: 11px;
604
+ }
605
+
606
+ .fd-ai-fm-msg-content {
607
+ font-size: 13px;
608
+ }
609
+
610
+ .fd-ai-fm-msg-content code {
611
+ border-radius: 0 !important;
612
+ }
613
+
614
+ .fd-ai-fm-suggestions-label {
615
+ font-family: var(--fd-font-mono, ui-monospace, monospace);
616
+ text-transform: uppercase;
617
+ letter-spacing: 0.04em;
618
+ }
619
+
620
+ .fd-ai-fm-clear-btn {
621
+ font-family: var(--fd-font-mono, ui-monospace, monospace);
622
+ text-transform: uppercase;
623
+ letter-spacing: 0.04em;
624
+ }
625
+
626
+ .fd-ai-fm-footer-hint {
627
+ font-size: 11px;
628
+ }
629
+
630
+ .fd-ai-fm-thinking-dot {
631
+ border-radius: 0;
632
+ width: 5px;
633
+ height: 5px;
634
+ }
635
+
636
+ /* ─── Code blocks (pixel-border) ─────────────────────────────────── */
637
+
638
+ .fd-ai-code-block {
639
+ border-radius: 0 !important;
640
+ box-shadow: 3px 3px 0 0 var(--color-fd-border, hsl(0 0% 15%));
641
+ background: transparent;
642
+ --sh-class: #66d9ef;
643
+ --sh-identifier: #f8f8f2;
644
+ --sh-keyword: #f92672;
645
+ --sh-string: #e6db74;
646
+ --sh-property: #a6e22e;
647
+ --sh-entity: #66d9ef;
648
+ --sh-sign: #f8f8f2;
649
+ --sh-comment: #75715e;
650
+ --sh-jsxliterals: #ae81ff;
651
+ }
652
+
653
+ .fd-ai-code-header {
654
+ border-bottom-color: var(--color-fd-border, hsl(0 0% 15%));
655
+ background: transparent;
656
+ }
657
+
658
+ .fd-ai-code-lang {
659
+ font-family: var(--fd-font-mono, ui-monospace, monospace);
660
+ }
661
+
662
+ .fd-ai-code-copy {
663
+ border-radius: 0 !important;
664
+ font-family: var(--fd-font-mono, ui-monospace, monospace);
665
+ text-transform: uppercase;
666
+ letter-spacing: 0.04em;
667
+ }
668
+
669
+ .fd-ai-code-block code {
670
+ font-family: var(--fd-font-mono, ui-monospace, monospace);
671
+ }
@@ -0,0 +1,14 @@
1
+ /*
2
+ * @farming-labs/theme — Base-only preset (no color palette)
3
+ *
4
+ * Bundles only the fumadocs-ui core preset + shared base styles,
5
+ * without any color palette. Use this when you want to define all
6
+ * CSS variables (colors, radius, etc.) from scratch.
7
+ *
8
+ * Usage in your theme CSS:
9
+ * @import "@farming-labs/theme/presets/base";
10
+ *
11
+ * Then define ALL required CSS variables (:root / .dark) yourself.
12
+ */
13
+ @import "fumadocs-ui/css/preset.css";
14
+ @import "../base.css";
@@ -0,0 +1,14 @@
1
+ /*
2
+ * @farming-labs/theme — Black color preset
3
+ *
4
+ * Bundles the fumadocs-ui black palette + core preset + shared base styles.
5
+ * Theme authors import this instead of fumadocs-ui internals directly.
6
+ *
7
+ * Usage in your theme CSS:
8
+ * @import "@farming-labs/theme/presets/black";
9
+ *
10
+ * Then add your own :root / .dark overrides below.
11
+ */
12
+ @import "fumadocs-ui/css/black.css";
13
+ @import "fumadocs-ui/css/preset.css";
14
+ @import "../base.css";
@@ -0,0 +1,14 @@
1
+ /*
2
+ * @farming-labs/theme — Neutral color preset
3
+ *
4
+ * Bundles the fumadocs-ui neutral palette + core preset + shared base styles.
5
+ * Theme authors import this instead of fumadocs-ui internals directly.
6
+ *
7
+ * Usage in your theme CSS:
8
+ * @import "@farming-labs/theme/presets/neutral";
9
+ *
10
+ * Then add your own :root / .dark overrides below.
11
+ */
12
+ @import "fumadocs-ui/css/neutral.css";
13
+ @import "fumadocs-ui/css/preset.css";
14
+ @import "../base.css";