@farming-labs/theme 0.0.3-beta.2 → 0.0.3-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.
@@ -150,20 +150,20 @@ code:not(pre code) {
150
150
  }
151
151
  }
152
152
 
153
- /* ─── Sidebar (better-auth style) ─────────────────────────────────── */
154
- /* Sidebar container: dark, subtle right border */
155
- .dark aside#nd-sidebar {
156
- background: hsl(0 0% 2%);
157
- border-color: hsl(0 0% 12%);
153
+ /* ─── Sidebar (better-auth style) light + dark ───────────────────── */
154
+ /* Sidebar container: use theme variables for both modes */
155
+ aside#nd-sidebar {
156
+ background: var(--color-fd-background);
157
+ border-color: var(--color-fd-border);
158
158
  }
159
159
 
160
160
  /* ── Full-width border separators between top-level items ─────────── */
161
- .dark aside .overscroll-contain > div {
161
+ aside .overscroll-contain > div {
162
162
  margin-top: -22px;
163
163
  }
164
164
 
165
- .dark aside .overscroll-contain > div > a[data-active] {
166
- border-top: 1px solid hsl(0 0% 12%);
165
+ aside .overscroll-contain > div > a[data-active] {
166
+ border-top: 1px solid var(--color-fd-border);
167
167
  margin-left: -1rem;
168
168
  margin-right: -1rem;
169
169
  padding-left: 1rem;
@@ -171,112 +171,112 @@ code:not(pre code) {
171
171
  padding-bottom: 0.75rem;
172
172
  }
173
173
 
174
- .dark aside .overscroll-contain > div > div {
175
- border-top: 1px solid hsl(0 0% 12%);
174
+ aside .overscroll-contain > div > div {
175
+ border-top: 1px solid var(--color-fd-border);
176
176
  margin-left: -1rem;
177
177
  margin-right: -1rem;
178
178
  padding: 0 !important;
179
179
  }
180
180
 
181
- .dark aside .overscroll-contain > div > a[data-active]:first-child,
182
- .dark aside .overscroll-contain > div > div:first-child {
181
+ aside .overscroll-contain > div > a[data-active]:first-child,
182
+ aside .overscroll-contain > div > div:first-child {
183
183
  border-top: none;
184
184
  }
185
185
 
186
- .dark aside .overscroll-contain > div > a[data-active]:last-child,
187
- .dark aside .overscroll-contain > div > div:last-child {
188
- border-bottom: 1px solid hsl(0 0% 12%);
186
+ aside .overscroll-contain > div > a[data-active]:last-child,
187
+ aside .overscroll-contain > div > div:last-child {
188
+ border-bottom: 1px solid var(--color-fd-border);
189
189
  }
190
190
 
191
191
  /* ── Sidebar links (all levels) ──────────────────────────────────── */
192
192
 
193
- .dark aside a[data-active] {
193
+ aside a[data-active] {
194
194
  font-size: 0.875rem;
195
195
  line-height: 1.6;
196
196
  border-radius: 0 !important;
197
197
  padding: 0.5rem 0.625rem !important;
198
198
  transition: color 0.15s ease;
199
- color: hsl(0 0% 50%);
199
+ color: var(--color-fd-muted-foreground);
200
200
  font-weight: 400;
201
201
  overflow: hidden;
202
202
  background-color: transparent !important;
203
203
  }
204
204
 
205
- .dark aside a[data-active="true"],
206
- .dark aside a[data-active="true"]:hover {
205
+ aside a[data-active="true"],
206
+ aside a[data-active="true"]:hover {
207
207
  background: transparent !important;
208
208
  background-color: transparent !important;
209
209
  color: var(--color-fd-primary) !important;
210
210
  font-weight: 600;
211
211
  }
212
212
 
213
- .dark aside a[data-active="false"]:hover {
213
+ aside a[data-active="false"]:hover {
214
214
  background: transparent !important;
215
215
  background-color: transparent !important;
216
- color: hsl(0 0% 80%);
216
+ color: var(--color-fd-foreground);
217
217
  }
218
218
 
219
219
  /* ── Child links inside collapsible folders ──────────────────────── */
220
220
 
221
- .dark aside div.overflow-hidden[data-state] a[data-active] {
221
+ aside div.overflow-hidden[data-state] a[data-active] {
222
222
  font-size: 0.785rem !important;
223
223
  padding-left: 2rem !important;
224
224
  padding-top: 0.25rem !important;
225
225
  padding-bottom: 0.25rem !important;
226
- color: hsl(0 0% 45%) !important;
226
+ color: var(--color-fd-muted-foreground) !important;
227
227
  overflow: hidden;
228
228
  }
229
229
 
230
- .dark aside div.overflow-hidden[data-state] a[data-active="true"],
231
- .dark aside div.overflow-hidden[data-state] a[data-active="true"]:hover {
230
+ aside div.overflow-hidden[data-state] a[data-active="true"],
231
+ aside div.overflow-hidden[data-state] a[data-active="true"]:hover {
232
232
  color: var(--color-fd-primary) !important;
233
233
  font-weight: 500 !important;
234
234
  }
235
235
 
236
- .dark aside div.overflow-hidden[data-state] a[data-active="false"]:hover {
237
- color: hsl(0 0% 75%) !important;
236
+ aside div.overflow-hidden[data-state] a[data-active="false"]:hover {
237
+ color: var(--color-fd-foreground) !important;
238
238
  }
239
239
 
240
240
  /* ── Folder toggle buttons (section headers) ─────────────────────── */
241
241
 
242
- .dark aside button.text-fd-muted-foreground {
243
- color: hsl(0 0% 90%);
242
+ aside button.text-fd-muted-foreground {
243
+ color: var(--color-fd-foreground);
244
244
  font-size: 0.875rem;
245
245
  font-weight: 500;
246
246
  letter-spacing: normal;
247
247
  text-transform: none;
248
248
  }
249
249
 
250
- .dark aside button.text-fd-muted-foreground:hover {
251
- color: hsl(0 0% 100%);
250
+ aside button.text-fd-muted-foreground:hover {
251
+ color: var(--color-fd-foreground);
252
252
  }
253
253
 
254
- .dark aside a[data-active="true"]::before {
254
+ aside a[data-active="true"]::before {
255
255
  background-color: var(--color-fd-primary) !important;
256
256
  width: 2px !important;
257
257
  margin-left: 0.6rem !important;
258
258
  inset-inline-start: 0.5rem !important;
259
259
  }
260
260
 
261
- .dark aside div.overflow-hidden[data-state]::before {
261
+ aside div.overflow-hidden[data-state]::before {
262
262
  margin-left: 0.5rem !important;
263
263
  height: calc(100% + 20px) !important;
264
264
  margin-top: -25px !important;
265
265
  }
266
266
 
267
- .dark aside div[data-state="open"] > :last-child {
267
+ aside div[data-state="open"] > :last-child {
268
268
  overflow: hidden;
269
269
  }
270
270
 
271
- /* ── Search button: full-width, border-y only ────────────────────── */
271
+ /* ── Search button: full-width, border-y only (light + dark) ───────── */
272
272
 
273
- .dark aside button[class*="bg-fd-secondary"] {
273
+ aside button[class*="bg-fd-secondary"] {
274
274
  background: transparent !important;
275
275
  border: none !important;
276
- border-top: 1px solid hsl(0 0% 12%) !important;
277
- border-bottom: 1px solid hsl(0 0% 12%) !important;
276
+ border-top: 1px solid var(--color-fd-border) !important;
277
+ border-bottom: 1px solid var(--color-fd-border) !important;
278
278
  border-radius: 0 !important;
279
- color: hsl(0 0% 45%);
279
+ color: var(--color-fd-muted-foreground);
280
280
  font-size: 0.8125rem;
281
281
  padding: 0.5rem 0 !important;
282
282
  width: calc(100% + 2rem) !important;
@@ -286,45 +286,45 @@ code:not(pre code) {
286
286
  padding-right: 1rem !important;
287
287
  }
288
288
 
289
- .dark aside button[class*="bg-fd-secondary"]:hover {
290
- background: hsl(0 0% 4%) !important;
291
- color: hsl(0 0% 65%);
289
+ aside button[class*="bg-fd-secondary"]:hover {
290
+ background: var(--color-fd-accent) !important;
291
+ color: var(--color-fd-foreground);
292
292
  }
293
293
 
294
- /* ── Theme toggle ────────────────────────────────────────────────── */
294
+ /* ── Theme toggle in sidebar (light + dark) ───────────────────────── */
295
295
 
296
- .dark aside button[class*="rounded-full"] {
297
- border-color: hsl(0 0% 12%);
296
+ aside button[class*="rounded-full"] {
297
+ border-color: var(--color-fd-border);
298
298
  }
299
299
 
300
- /* ─── Tables: visible borders, rounded wrapper ────────────────────── */
300
+ /* ─── Tables: visible borders, rounded-none (light + dark) ─────────── */
301
301
 
302
- .dark table {
303
- border: 1px solid hsl(0 0% 15%);
302
+ table {
303
+ border: 1px solid var(--color-fd-border);
304
304
  border-radius: 0 !important;
305
305
  overflow: hidden;
306
306
  }
307
307
 
308
- .dark th {
309
- background: hsl(0 0% 6%);
310
- color: hsl(0 0% 80%);
308
+ th {
309
+ background: var(--color-fd-muted);
310
+ color: var(--color-fd-foreground);
311
311
  font-weight: 500;
312
- border-color: hsl(0 0% 15%);
312
+ border-color: var(--color-fd-border);
313
313
  }
314
314
 
315
- .dark td {
316
- border-color: hsl(0 0% 12%);
315
+ td {
316
+ border-color: var(--color-fd-border);
317
317
  }
318
318
 
319
- .dark tr:last-child td {
319
+ tr:last-child td {
320
320
  border-bottom: none;
321
321
  }
322
322
 
323
- /* ─── Code blocks: single border only ─────────────────────────────── */
323
+ /* ─── Code blocks: single border, rounded-none (light + dark) ───────── */
324
324
 
325
325
  /* Target the fumadocs CodeBlock figure (shiki class) */
326
326
  figure.shiki {
327
- border: 1px solid hsl(0 0% 15%) !important;
327
+ border: 1px solid var(--color-fd-border) !important;
328
328
  border-radius: 0 !important;
329
329
  overflow: hidden;
330
330
  box-shadow: none !important;
@@ -340,23 +340,23 @@ figure.shiki > div:first-child {
340
340
  border-radius: 0 !important;
341
341
  }
342
342
 
343
- /* ─── Tabs (package manager / code tabs) ──────────────────────────── */
343
+ /* ─── Tabs (package manager / code tabs) light + dark ────────────── */
344
344
 
345
- .dark [role="tablist"] {
345
+ [role="tablist"] {
346
346
  border-radius: 0 !important;
347
347
  }
348
348
 
349
- .dark [role="tablist"] button,
350
- .dark [role="tab"] {
349
+ [role="tablist"] button,
350
+ [role="tab"] {
351
351
  border-radius: 0 !important;
352
352
  }
353
353
 
354
- .dark [role="tabpanel"] {
354
+ [role="tabpanel"] {
355
355
  border-radius: 0 !important;
356
356
  }
357
357
 
358
358
  /* Tabs container */
359
- .dark div:has(> [role="tablist"]) {
359
+ div:has(> [role="tablist"]) {
360
360
  border-radius: 0 !important;
361
361
  }
362
362
 
@@ -370,22 +370,22 @@ figure.shiki > div:first-child {
370
370
  padding: 0.125rem 0.375rem;
371
371
  } */
372
372
 
373
- /* ─── Callouts: visible border ────────────────────────────────────── */
373
+ /* ─── Callouts: visible border (light + dark) ──────────────────────── */
374
374
 
375
- .dark [class*="bg-fd-card"] {
376
- border-color: hsl(0 0% 15%);
375
+ [class*="bg-fd-card"] {
376
+ border-color: var(--color-fd-border);
377
377
  }
378
378
 
379
- /* ─── Nav cards (prev/next): visible border ───────────────────────── */
379
+ /* ─── Nav cards (prev/next): visible border, rounded-none ──────────── */
380
380
 
381
- .dark article a[class*="border"] {
382
- border-color: hsl(0 0% 15%);
381
+ article a[class*="border"] {
382
+ border-color: var(--color-fd-border);
383
383
  border-radius: 0 !important;
384
384
  }
385
385
 
386
- .dark article a[class*="border"]:hover {
387
- background: hsl(0 0% 6%);
388
- border-color: hsl(0 0% 22%);
386
+ article a[class*="border"]:hover {
387
+ background: var(--color-fd-muted);
388
+ border-color: var(--color-fd-ring);
389
389
  }
390
390
 
391
391
  /* ─── Search dialog ───────────────────────────────────────────────── */
@@ -394,17 +394,17 @@ figure.shiki > div:first-child {
394
394
  border-radius: 0 !important;
395
395
  }
396
396
 
397
- /* ─── TOC right panel ─────────────────────────────────────────────── */
397
+ /* ─── TOC right panel (light + dark) ───────────────────────────────── */
398
398
 
399
- .dark nav[class*="toc"],
400
- .dark [class*="fd-toc"] {
401
- border-color: hsl(0 0% 12%);
399
+ nav[class*="toc"],
400
+ [class*="fd-toc"] {
401
+ border-color: var(--color-fd-border);
402
402
  }
403
403
 
404
- /* ─── Separator/Divider (hr) ──────────────────────────────────────── */
404
+ /* ─── Separator/Divider (hr) light + dark ─────────────────────────── */
405
405
 
406
- .dark hr {
407
- border-color: hsl(0 0% 15%);
406
+ hr {
407
+ border-color: var(--color-fd-border);
408
408
  }
409
409
 
410
410
  /* ─── Breadcrumb (pixel-border overrides) ─────────────────────────── */
@@ -475,6 +475,95 @@ figure.shiki > div:first-child {
475
475
  font-family: var(--fd-font-mono, var(--font-geist-mono, ui-monospace, monospace)) !important;
476
476
  }
477
477
 
478
+ /* model selector */
479
+ .fd-ai-model-select-row {
480
+ display: flex;
481
+ align-items: center;
482
+ justify-content: flex-end;
483
+ position: relative;
484
+ overflow: visible;
485
+ margin-bottom: 6px;
486
+ }
487
+
488
+ .fd-ai-model-select-row--fm {
489
+ padding: 8px 12px 0;
490
+ }
491
+
492
+ .fd-ai-model-dropdown {
493
+ position: relative;
494
+ margin-left: auto;
495
+ }
496
+
497
+ .fd-ai-model-dropdown-btn {
498
+ display: inline-flex;
499
+ align-items: center;
500
+ gap: 6px;
501
+ padding: 4px 10px;
502
+ font-size: 12px;
503
+ text-transform: uppercase;
504
+ font-family: var(--fd-font-mono, ui-monospace, monospace);
505
+ color: var(--color-fd-muted-foreground, #71717a);
506
+ background: transparent;
507
+ border: 1px solid var(--color-fd-border, rgba(255, 255, 255, 0.12));
508
+ border-radius: var(--radius, 6px);
509
+ cursor: pointer;
510
+ transition: all 150ms;
511
+ }
512
+
513
+ .fd-ai-model-dropdown-btn:hover {
514
+ color: var(--color-fd-foreground, #e4e4e7);
515
+ border-color: var(--color-fd-border, rgba(255, 255, 255, 0.25));
516
+ }
517
+
518
+ .fd-ai-model-dropdown-btn:disabled {
519
+ opacity: 0.5;
520
+ cursor: not-allowed;
521
+ }
522
+
523
+ .fd-ai-model-dropdown-menu {
524
+ position: absolute;
525
+ bottom: calc(100% + 6px);
526
+ right: 0;
527
+ z-index: 99999;
528
+ min-width: 220px;
529
+ padding: 4px;
530
+ background: var(--color-fd-popover, var(--color-fd-background, #0c0c0c));
531
+ border: 1px solid var(--color-fd-border, rgba(255, 255, 255, 0.1));
532
+ border-radius: var(--radius, 8px);
533
+ box-shadow: 2px 2px 0 0 var(--color-fd-border, #262626);
534
+ animation: fd-ai-fade-in 100ms ease-out;
535
+ }
536
+
537
+
538
+ .fd-ai-model-dropdown-item {
539
+ display: flex;
540
+ align-items: center;
541
+ gap: 8px;
542
+ width: 100%;
543
+ color: var(--color-fd-muted-foreground, #71717a);
544
+ padding: 6px 10px;
545
+ font-family: var(--fd-font-mono, ui-monospace, monospace);
546
+ text-transform: uppercase;
547
+ border-bottom: 1px solid var(--color-fd-border, rgba(255, 255, 255, 0.1));
548
+ font-size: 11px;
549
+ background: transparent;
550
+ cursor: pointer;
551
+ transition: background 100ms;
552
+ }
553
+
554
+ .fd-ai-model-dropdown-item:hover {
555
+ background: var(--color-fd-accent, rgba(255, 255, 255, 0.06));
556
+ }
557
+
558
+ .fd-ai-model-dropdown-item[data-active="true"] {
559
+ color: var(--color-fd-primary, #6366f1);
560
+ }
561
+
562
+ .fd-ai-model-dropdown-label {
563
+ flex: 1;
564
+ text-align: left;
565
+ }
566
+
478
567
  /* ─── AI Chat (pixel-border — zero radius, pixel-art, monospace) ── */
479
568
 
480
569
  .fd-ai-dialog {
@@ -611,7 +700,6 @@ figure.shiki > div:first-child {
611
700
  font-size: 12px;
612
701
  box-shadow: 3px 3px 0 0 var(--color-fd-border, hsl(0 0% 15%));
613
702
  }
614
-
615
703
  .fd-ai-fm-trigger-btn:hover {
616
704
  transform: translate(-1px, -1px);
617
705
  box-shadow: 4px 4px 0 0 var(--color-fd-border, hsl(0 0% 15%));
@@ -687,6 +775,49 @@ figure.shiki > div:first-child {
687
775
  font-family: var(--fd-font-mono, ui-monospace, monospace);
688
776
  }
689
777
 
778
+ :root:not(.dark) .fd-ai-code-block {
779
+ background: #f4f4f5 !important;
780
+ padding: 0 !important;
781
+ box-shadow: 3px 3px 0 0 hsl(0 0% 75%);
782
+ --sh-class: #b45309;
783
+ --sh-identifier: #1f2937;
784
+ --sh-keyword: #7c3aed;
785
+ --sh-string: #0d9488;
786
+ --sh-property: #dc2626;
787
+ --sh-entity: #059669;
788
+ --sh-sign: #374151;
789
+ --sh-comment: #6b7280;
790
+ --sh-jsxliterals: #7c3aed;
791
+ }
792
+ .fd-ai-code-block pre {
793
+ padding-left: -10px !important;
794
+ padding-right: -10px !important;
795
+ padding-bottom: 2px !important;
796
+ }
797
+
798
+ :root:not(.dark) .fd-ai-code-header {
799
+ border-bottom-color: hsl(0 0% 80%);
800
+ background: color-mix(in srgb, #e4e4e7 90%, transparent);
801
+ }
802
+
803
+ :root:not(.dark) .fd-ai-code-lang {
804
+ color: #52525b;
805
+ }
806
+
807
+ :root:not(.dark) .fd-ai-code-copy {
808
+ color: #52525b;
809
+ border-color: hsl(0 0% 75%);
810
+ }
811
+
812
+ :root:not(.dark) .fd-ai-code-copy:hover {
813
+ color: #18181b;
814
+ background: color-mix(in srgb, #d4d4d8 70%, transparent);
815
+ }
816
+
817
+ :root:not(.dark) .fd-ai-code-block code {
818
+ color: #1f2937;
819
+ }
820
+
690
821
  /* ─── Omni Command Palette (pixel-border theme) ─────────────────── */
691
822
 
692
823
  .omni-content {