@siyahi/ui 0.1.9-next.34 → 0.1.9-next.35

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 (77) hide show
  1. package/DESIGN.md +6 -5
  2. package/README.md +5 -5
  3. package/agents/examples/app-sidebar.tsx +0 -2
  4. package/agents/manifest.json +0 -2
  5. package/dist/components/registry/niko-table/core/data-table-error-boundary.js +1 -1
  6. package/dist/components/registry/niko-table/filters/table-faceted-filter.js +2 -2
  7. package/dist/components/siyahi/scatter-chart.js +1 -1
  8. package/dist/components/siyahi/status-badge.js +1 -0
  9. package/dist/components/ui/alert-dialog.d.ts +20 -0
  10. package/dist/components/ui/alert-dialog.js +94 -0
  11. package/dist/components/ui/aspect-ratio.d.ts +6 -0
  12. package/dist/components/ui/aspect-ratio.js +13 -0
  13. package/dist/components/ui/attachment.d.ts +25 -0
  14. package/dist/components/ui/attachment.js +104 -0
  15. package/dist/components/ui/bubble.d.ts +18 -0
  16. package/dist/components/ui/bubble.js +73 -0
  17. package/dist/components/ui/button-group.d.ts +12 -0
  18. package/dist/components/ui/button-group.js +41 -0
  19. package/dist/components/ui/button.d.ts +1 -1
  20. package/dist/components/ui/button.js +1 -1
  21. package/dist/components/ui/carousel.d.ts +30 -0
  22. package/dist/components/ui/carousel.js +131 -0
  23. package/dist/components/ui/checkbox.d.ts +5 -0
  24. package/dist/components/ui/checkbox.js +20 -0
  25. package/dist/components/ui/combobox.d.ts +26 -0
  26. package/dist/components/ui/combobox.js +162 -0
  27. package/dist/components/ui/command.js +1 -1
  28. package/dist/components/ui/direction.d.ts +2 -0
  29. package/dist/components/ui/direction.js +1 -0
  30. package/dist/components/ui/drawer.d.ts +18 -0
  31. package/dist/components/ui/drawer.js +123 -0
  32. package/dist/components/ui/empty.d.ts +13 -0
  33. package/dist/components/ui/empty.js +59 -0
  34. package/dist/components/ui/field.js +1 -1
  35. package/dist/components/ui/hover-card.d.ts +7 -0
  36. package/dist/components/ui/hover-card.js +36 -0
  37. package/dist/components/ui/input-otp.d.ts +13 -0
  38. package/dist/components/ui/input-otp.js +46 -0
  39. package/dist/components/ui/item.d.ts +24 -0
  40. package/dist/components/ui/item.js +121 -0
  41. package/dist/components/ui/kbd.d.ts +5 -0
  42. package/dist/components/ui/kbd.js +19 -0
  43. package/dist/components/ui/marker.d.ts +12 -0
  44. package/dist/components/ui/marker.js +43 -0
  45. package/dist/components/ui/menubar.d.ts +31 -0
  46. package/dist/components/ui/menubar.js +136 -0
  47. package/dist/components/ui/message-scroller.d.ts +12 -0
  48. package/dist/components/ui/message-scroller.js +60 -0
  49. package/dist/components/ui/message.d.ts +12 -0
  50. package/dist/components/ui/message.js +49 -0
  51. package/dist/components/ui/native-select.d.ts +10 -0
  52. package/dist/components/ui/native-select.js +38 -0
  53. package/dist/components/ui/navigation-menu.d.ts +13 -0
  54. package/dist/components/ui/navigation-menu.js +82 -0
  55. package/dist/components/ui/pagination.d.ts +19 -0
  56. package/dist/components/ui/pagination.js +80 -0
  57. package/dist/components/ui/questionnaire.d.ts +21 -0
  58. package/dist/components/ui/questionnaire.js +170 -0
  59. package/dist/components/ui/radio-group.d.ts +7 -0
  60. package/dist/components/ui/radio-group.js +26 -0
  61. package/dist/components/ui/resizable.d.ts +9 -0
  62. package/dist/components/ui/resizable.js +28 -0
  63. package/dist/components/ui/sidebar.js +1 -1
  64. package/dist/components/ui/spinner.d.ts +4 -0
  65. package/dist/components/ui/spinner.js +15 -0
  66. package/dist/components/ui/switch.d.ts +7 -0
  67. package/dist/components/ui/switch.js +19 -0
  68. package/dist/components/ui/toast.d.ts +18 -0
  69. package/dist/components/ui/toast.js +123 -0
  70. package/dist/components/ui/trace.d.ts +20 -0
  71. package/dist/components/ui/trace.js +75 -0
  72. package/dist/index.d.ts +31 -1
  73. package/dist/index.js +34 -4
  74. package/package.json +5 -3
  75. package/styles/siyahi.css +198 -47
  76. package/agents/report-rules.json +0 -7
  77. package/report.css +0 -146
package/styles/siyahi.css CHANGED
@@ -24,6 +24,21 @@
24
24
  */
25
25
  @custom-variant dark (@media (prefers-color-scheme: dark));
26
26
 
27
+ /*
28
+ * Nothing casts a drop shadow (DESIGN.md, "Floating surfaces lie flat"): every shadow size is transparent, so
29
+ * shadow-md and the rest draw nothing, on a component added later as on the ones here. The sizes stay defined, so
30
+ * a stock shadow class is still a known utility to Tailwind and the lint.
31
+ */
32
+ @theme {
33
+ --shadow-2xs: 0 0 #0000;
34
+ --shadow-xs: 0 0 #0000;
35
+ --shadow-sm: 0 0 #0000;
36
+ --shadow-md: 0 0 #0000;
37
+ --shadow-lg: 0 0 #0000;
38
+ --shadow-xl: 0 0 #0000;
39
+ --shadow-2xl: 0 0 #0000;
40
+ }
41
+
27
42
  @theme inline {
28
43
  --font-sans: "Geist Variable", "Geist Fallback", ui-sans-serif, system-ui, sans-serif;
29
44
  --font-mono: "Geist Mono Variable", "Geist Mono Fallback", ui-monospace, monospace;
@@ -325,7 +340,13 @@
325
340
  [data-slot="calendar"],
326
341
  [data-slot="toggle-group"],
327
342
  [data-slot="code-block"],
328
- [data-slot="price-chart"]
343
+ [data-slot="price-chart"],
344
+ [data-slot="button-group"],
345
+ [data-slot="input-otp-group"],
346
+ [data-slot="resizable-panel-group"],
347
+ [data-slot="attachment"],
348
+ [data-slot="bubble"],
349
+ [data-slot="questionnaire"]
329
350
  ) {
330
351
  isolation: isolate;
331
352
  }
@@ -409,11 +430,20 @@
409
430
  [role="alertdialog"],
410
431
  [role="menu"],
411
432
  [role="listbox"],
412
- [data-slot="input"],
413
- [data-slot="textarea"],
414
- [data-slot="select-trigger"],
415
- [data-slot="input-group-control"],
416
- [data-slot="command-input"]
433
+ input:not(
434
+ [type="checkbox"],
435
+ [type="radio"],
436
+ [type="range"],
437
+ [type="hidden"],
438
+ [type="file"],
439
+ [type="button"],
440
+ [type="submit"],
441
+ [type="reset"],
442
+ [type="color"]
443
+ ),
444
+ textarea,
445
+ select,
446
+ [data-slot="select-trigger"]
417
447
  ),
418
448
  [data-slot="slider-thumb"]:has(input:focus-visible) {
419
449
  outline: none;
@@ -421,14 +451,74 @@
421
451
  inset 0 0 0 2px var(--ring),
422
452
  inset 0 0 0 4px var(--background);
423
453
  }
424
- :is([data-slot="input"], [data-slot="textarea"], [data-slot="select-trigger"]):focus-visible,
425
- [data-slot="input-group"]:has(:is([data-slot="input-group-control"], [data-slot="command-input"]):focus-visible) {
454
+ /*
455
+ * A field is what HTML makes one, a text input, a textarea or a select, plus Base UI's select trigger, so a field in
456
+ * a component added later is covered without naming it. A field inside a box that holds it (an input group, a
457
+ * combobox's chips) shows its state on that box.
458
+ */
459
+ :is(
460
+ input:not(
461
+ [type="checkbox"],
462
+ [type="radio"],
463
+ [type="range"],
464
+ [type="hidden"],
465
+ [type="file"],
466
+ [type="button"],
467
+ [type="submit"],
468
+ [type="reset"],
469
+ [type="color"]
470
+ ),
471
+ textarea,
472
+ select,
473
+ [data-slot="select-trigger"]
474
+ ):not(:is([data-slot="input-group"], [data-slot="combobox-chips"]) *):focus-visible,
475
+ :is([data-slot="input-group"], [data-slot="combobox-chips"]):has(
476
+ :is(
477
+ input:not(
478
+ [type="checkbox"],
479
+ [type="radio"],
480
+ [type="range"],
481
+ [type="hidden"],
482
+ [type="file"],
483
+ [type="button"],
484
+ [type="submit"],
485
+ [type="reset"],
486
+ [type="color"]
487
+ ),
488
+ textarea,
489
+ select,
490
+ [data-slot="select-trigger"]
491
+ ):focus-visible
492
+ ) {
426
493
  outline: none;
427
494
  border-color: var(--ring);
428
495
  box-shadow: inset 0 0 0 1px var(--ring);
429
496
  }
430
- :is([data-slot="input"], [data-slot="textarea"], [data-slot="select-trigger"])[aria-invalid="true"]:focus-visible,
431
- [data-slot="input-group"]:has([data-slot="input-group-control"][aria-invalid="true"]:focus-visible) {
497
+ :is(
498
+ input:not(
499
+ [type="checkbox"],
500
+ [type="radio"],
501
+ [type="range"],
502
+ [type="hidden"],
503
+ [type="file"],
504
+ [type="button"],
505
+ [type="submit"],
506
+ [type="reset"],
507
+ [type="color"]
508
+ ),
509
+ textarea,
510
+ select,
511
+ [data-slot="select-trigger"]
512
+ ):not(:is([data-slot="input-group"], [data-slot="combobox-chips"]) *)[aria-invalid="true"]:focus-visible,
513
+ /* Names the field as the focus rule above does, so this rule outranks it rather than losing on specificity. */
514
+ :is([data-slot="input-group"], [data-slot="combobox-chips"]):has(
515
+ :is(
516
+ input:not([type="checkbox"], [type="radio"], [type="range"], [type="hidden"], [type="file"], [type="button"], [type="submit"], [type="reset"], [type="color"]),
517
+ textarea,
518
+ select,
519
+ [data-slot="select-trigger"]
520
+ )[aria-invalid="true"]:focus-visible
521
+ ) {
432
522
  border-color: var(--destructive);
433
523
  box-shadow: inset 0 0 0 1px var(--destructive);
434
524
  }
@@ -460,17 +550,43 @@ svg :is(rect, circle, path)[tabindex]:focus-visible,
460
550
  [class~="group/button"][class~="text-destructive"]:focus-visible,
461
551
  [data-slot="code-block"][data-variant="destructive"]:has(> [data-slot="code-block-content"]:focus-visible),
462
552
  :is(
463
- [data-slot="input"],
464
- [data-slot="textarea"],
465
- [data-slot="select-trigger"],
466
- [class~="group/button"]
467
- )[aria-invalid="true"],
468
- [data-slot="input-group"]:has([data-slot][aria-invalid="true"]) {
553
+ input:not(
554
+ [type="checkbox"],
555
+ [type="radio"],
556
+ [type="range"],
557
+ [type="hidden"],
558
+ [type="file"],
559
+ [type="button"],
560
+ [type="submit"],
561
+ [type="reset"],
562
+ [type="color"]
563
+ ),
564
+ textarea,
565
+ select,
566
+ [data-slot="select-trigger"]
567
+ ):not(:is([data-slot="input-group"], [data-slot="combobox-chips"]) *)[aria-invalid="true"],
568
+ [class~="group/button"][aria-invalid="true"],
569
+ :is([data-slot="input-group"], [data-slot="combobox-chips"]):has([aria-invalid="true"]) {
469
570
  border-color: var(--destructive);
470
571
  }
471
572
  /* An invalid field also takes a faint wash of the red, so it reads as the one to fix before its message is read. */
472
- :is([data-slot="input"], [data-slot="textarea"], [data-slot="select-trigger"])[aria-invalid="true"],
473
- [data-slot="input-group"]:has([data-slot][aria-invalid="true"]) {
573
+ :is(
574
+ input:not(
575
+ [type="checkbox"],
576
+ [type="radio"],
577
+ [type="range"],
578
+ [type="hidden"],
579
+ [type="file"],
580
+ [type="button"],
581
+ [type="submit"],
582
+ [type="reset"],
583
+ [type="color"]
584
+ ),
585
+ textarea,
586
+ select,
587
+ [data-slot="select-trigger"]
588
+ ):not(:is([data-slot="input-group"], [data-slot="combobox-chips"]) *)[aria-invalid="true"],
589
+ :is([data-slot="input-group"], [data-slot="combobox-chips"]):has([aria-invalid="true"]) {
474
590
  background-color: color-mix(in oklab, var(--destructive) var(--field-wash), var(--card));
475
591
  }
476
592
 
@@ -485,48 +601,86 @@ svg :is(rect, circle, path)[tabindex]:focus-visible,
485
601
  @apply font-mono text-2xs tracking-wider text-muted-foreground uppercase;
486
602
  }
487
603
 
488
- /* A group's label in a menu, a select's list or the command palette is a label over its items, set as one. */
604
+ /*
605
+ * A group's label in a menu (dropdown, context, menubar), a select's or a combobox's list or the
606
+ * command palette is a label over its items, set as one.
607
+ */
489
608
  :is(
490
- [data-slot="dropdown-menu-label"],
491
- [data-slot="context-menu-label"],
609
+ [data-slot$="menu-label"],
610
+ [data-slot="menubar-label"],
492
611
  [data-slot="select-label"],
612
+ [data-slot="combobox-label"],
493
613
  [data-slot="command-group"] [cmdk-group-heading]
494
614
  ) {
495
615
  @apply font-mono text-2xs tracking-wider text-muted-foreground uppercase;
496
616
  }
497
617
 
498
618
  /*
499
- * A menu, a select's list, a popover, a dialog, a sheet and a chart's tooltip read as a sheet of the page, not a
500
- * bubble floating over it: no drop shadow, and the card's hairline for an edge (stock rings them fainter).
619
+ * A floating surface reads as a sheet of the page, not a bubble over it: no shadow (the theme has none) and the
620
+ * card's hairline for an edge. Stock shadcn edges a menu, a list, a popover, a dialog or a card with a fainter ring
621
+ * (ring-foreground/10, also behind a variant such as data-open:); it takes the hairline wherever it appears, on
622
+ * a component added later too. The
623
+ * chart's tooltip, which Recharts draws, is named.
501
624
  */
502
- :is(
503
- [data-slot="dropdown-menu-content"],
504
- [data-slot="dropdown-menu-sub-content"],
505
- [data-slot="context-menu-content"],
506
- [data-slot="context-menu-sub-content"],
507
- [data-slot="select-content"],
508
- [data-slot="popover-content"],
509
- [data-slot="dialog-content"],
510
- [data-slot="sheet-content"],
511
- [data-slot="chart"] .recharts-tooltip-wrapper > div
512
- ) {
513
- --tw-shadow: 0 0 #0000;
625
+ [class*="ring-foreground/10"] {
514
626
  --tw-ring-color: var(--border);
627
+ }
628
+ [data-slot="chart"] .recharts-tooltip-wrapper > div {
515
629
  border-color: var(--border);
516
630
  }
517
631
 
518
632
  /*
519
- * Square as every box is: progress, a slider's track and thumb, a scrollbar's thumb, and the colour chips core's
520
- * chart tooltip and legend draw at a fixed 2px, which no radius token reaches.
633
+ * Square corners everywhere (DESIGN.md): every element and its ::before and ::after are square, whatever rounding
634
+ * a component asks for (rounded-full, rounded-[4px], hover:rounded-full, after:rounded-full), on a component added
635
+ * later too. Only what is round by nature stays round, by what it is rather than its classes: an avatar, a radio
636
+ * and a radio's dot (a questionnaire's radio choice too), a status dot and a spinner. A chart draws its round marks
637
+ * in SVG, which this does not touch.
638
+ */
639
+ :not(
640
+ [data-slot^="avatar"],
641
+ [data-slot="message-avatar"],
642
+ [role="radio"],
643
+ [role="radio"] *,
644
+ [data-type="radio"] [data-slot$="indicator"],
645
+ [data-type="radio"] [data-slot$="indicator-dot"],
646
+ [data-slot="status-dot"],
647
+ .animate-spin
648
+ ),
649
+ :not(
650
+ [data-slot^="avatar"],
651
+ [data-slot="message-avatar"],
652
+ [role="radio"],
653
+ [role="radio"] *,
654
+ [data-type="radio"] [data-slot$="indicator"],
655
+ [data-type="radio"] [data-slot$="indicator-dot"],
656
+ [data-slot="status-dot"],
657
+ .animate-spin
658
+ )::before,
659
+ :not(
660
+ [data-slot^="avatar"],
661
+ [data-slot="message-avatar"],
662
+ [role="radio"],
663
+ [role="radio"] *,
664
+ [data-type="radio"] [data-slot$="indicator"],
665
+ [data-type="radio"] [data-slot$="indicator-dot"],
666
+ [data-slot="status-dot"],
667
+ .animate-spin
668
+ )::after {
669
+ border-radius: 0;
670
+ }
671
+
672
+ /*
673
+ * Muted text is already the faintest that reads at 4.5:1 (contrast.mjs). Stock shadcn fades it further on some
674
+ * parts (text-muted-foreground/70 on a trace's description), under that bar, so a faded muted class reads as the
675
+ * muted colour itself.
521
676
  */
522
677
  :is(
523
- [data-slot="progress-track"],
524
- [data-slot="slider-track"],
525
- [data-slot="slider-thumb"],
526
- [data-slot="scroll-area-thumb"],
527
- [data-slot="chart"] :is(.recharts-tooltip-wrapper, .recharts-legend-wrapper) [class~="rounded-[2px]"]
678
+ [class~="text-muted-foreground/50"],
679
+ [class~="text-muted-foreground/60"],
680
+ [class~="text-muted-foreground/70"],
681
+ [class~="text-muted-foreground/80"]
528
682
  ) {
529
- border-radius: 0;
683
+ color: var(--muted-foreground);
530
684
  }
531
685
 
532
686
  /*
@@ -808,6 +962,7 @@ div[data-slot="sidebar"]:not([data-side], [data-mobile]) {
808
962
  [data-slot="toggle"],
809
963
  [data-slot="toggle-group-item"],
810
964
  [data-slot="select-trigger"],
965
+ [data-slot="native-select"],
811
966
  [data-slot="tabs-trigger"],
812
967
  [data-slot="input-group-button"]
813
968
  ) {
@@ -861,10 +1016,6 @@ div[data-slot="sidebar"]:not([data-side], [data-mobile]) {
861
1016
  * SectionCards tile keeps its ring, which is important, and an exception
862
1017
  * keeps its outline, which is more specific.
863
1018
  */
864
- [data-slot="card"] {
865
- --tw-ring-color: var(--border);
866
- }
867
-
868
1019
  @scope (:root, [data-surface="ruled"]) to ([data-surface="card"], [data-surface="open"]) {
869
1020
  [data-slot="card"] {
870
1021
  --tw-ring-color: transparent;
@@ -1,7 +0,0 @@
1
- [
2
- "Never paint html or body beyond the base styles report.css sets.",
3
- "Fluid width. No outer card and no banner title.",
4
- "A panel with its own background gets 16px padding and var(--radius).",
5
- "Charts get fixed pixel heights.",
6
- "Never use 100vh."
7
- ]
package/report.css DELETED
@@ -1,146 +0,0 @@
1
- /*
2
- * Siyahi report stylesheet, generated from @siyahi/ui styles/siyahi.css.
3
- * Inline it into a report's <style>. It makes no network requests: Geist is
4
- * used when the viewer has it installed, and the system font otherwise.
5
- */
6
- :root {
7
- color-scheme: light dark;
8
- --radius: 0rem;
9
- --background: oklch(0.985 0 0);
10
- --foreground: oklch(0.145 0 0);
11
- --card: oklch(1 0 0);
12
- --card-foreground: oklch(0.145 0 0);
13
- --popover: oklch(1 0 0);
14
- --popover-foreground: oklch(0.145 0 0);
15
- --primary: oklch(0.205 0 0);
16
- --primary-foreground: oklch(0.985 0 0);
17
- --secondary: oklch(0.97 0 0);
18
- --secondary-foreground: oklch(0.205 0 0);
19
- --muted: oklch(0.97 0 0);
20
- --muted-foreground: oklch(0.51 0 0);
21
- --accent: oklch(0.97 0 0);
22
- --accent-foreground: oklch(0.205 0 0);
23
- --destructive: oklch(0.49 0.19 27.325);
24
- --border: oklch(0.145 0 0 / 18%);
25
- --input: oklch(0.64 0 0);
26
- --ring: oklch(0.145 0 0);
27
- --positive: oklch(0.527 0.145 150.069);
28
- --positive-foreground: oklch(0.985 0 0);
29
- --negative: oklch(0.577 0.235 27.325);
30
- --negative-foreground: oklch(0.985 0 0);
31
- --warning: oklch(0.555 0.149 48.998);
32
- --warning-foreground: oklch(0.985 0 0);
33
- --heat-1: 12%;
34
- --heat-2: 24%;
35
- --heat-3: 36%;
36
- --heat-4: 48%;
37
- --heat-5: 60%;
38
- --wash: 7%;
39
- --wash-edge: 45%;
40
- --field-wash: 8%;
41
- --bar-tint: 50%;
42
- --link: oklch(0.51 0.2 275);
43
- --chart-1: oklch(0.4 0.17 275);
44
- --chart-2: oklch(0.66 0.13 70);
45
- --chart-3: oklch(0.38 0.13 335);
46
- --chart-4: oklch(0.65 0.11 235);
47
- --chart-5: oklch(0.36 0.06 205);
48
- --sidebar: oklch(0.985 0 0);
49
- --sidebar-foreground: oklch(0.145 0 0);
50
- --sidebar-primary: oklch(0.205 0 0);
51
- --sidebar-primary-foreground: oklch(0.985 0 0);
52
- --sidebar-accent: oklch(0.97 0 0);
53
- --sidebar-accent-foreground: oklch(0.45 0.2 275);
54
- --sidebar-border: oklch(0.145 0 0 / 18%);
55
- --sidebar-ring: oklch(0.145 0 0);
56
- }
57
-
58
- @media (prefers-color-scheme: dark) {
59
- :root {
60
- --background: oklch(0.14 0 0);
61
- --foreground: oklch(0.922 0 0);
62
- --card: oklch(0.215 0 0);
63
- --card-foreground: oklch(0.922 0 0);
64
- --popover: oklch(0.215 0 0);
65
- --popover-foreground: oklch(0.922 0 0);
66
- --primary: oklch(0.922 0 0);
67
- --primary-foreground: oklch(0.205 0 0);
68
- --secondary: oklch(0.269 0 0);
69
- --secondary-foreground: oklch(0.922 0 0);
70
- --muted: oklch(0.269 0 0);
71
- --muted-foreground: oklch(0.74 0 0);
72
- --accent: oklch(0.269 0 0);
73
- --accent-foreground: oklch(0.922 0 0);
74
- --destructive: oklch(0.8 0.1 22.216);
75
- --border: oklch(1 0 0 / 20%);
76
- --input: oklch(0.62 0 0);
77
- --ring: oklch(0.922 0 0);
78
- --positive: oklch(0.69 0.16 151.711);
79
- --positive-foreground: oklch(0.145 0 0);
80
- --negative: oklch(0.704 0.187 22.216);
81
- --negative-foreground: oklch(0.145 0 0);
82
- --warning: oklch(0.828 0.169 84.429);
83
- --warning-foreground: oklch(0.145 0 0);
84
- --heat-1: 25%;
85
- --heat-2: 33.75%;
86
- --heat-3: 42.5%;
87
- --heat-4: 51.25%;
88
- --wash: 12%;
89
- --wash-edge: 55%;
90
- --field-wash: 12%;
91
- --link: oklch(0.75 0.128 275);
92
- --chart-1: oklch(0.58 0.2 275);
93
- --chart-2: oklch(0.88 0.08 75);
94
- --chart-3: oklch(0.58 0.16 335);
95
- --chart-4: oklch(0.88 0.05 235);
96
- --chart-5: oklch(0.56 0.08 205);
97
- --sidebar: oklch(0.145 0 0);
98
- --sidebar-foreground: oklch(0.922 0 0);
99
- --sidebar-primary: oklch(0.922 0 0);
100
- --sidebar-primary-foreground: oklch(0.205 0 0);
101
- --sidebar-accent: oklch(0.269 0 0);
102
- --sidebar-accent-foreground: oklch(0.8 0.1 275);
103
- --sidebar-border: oklch(1 0 0 / 20%);
104
- --sidebar-ring: oklch(0.922 0 0);
105
- }
106
- }
107
-
108
- *,
109
- ::before,
110
- ::after {
111
- box-sizing: border-box;
112
- }
113
-
114
- body {
115
- margin: 0;
116
- padding: 16px;
117
- background: var(--background);
118
- color: var(--foreground);
119
- font-family: "Geist", "Geist Variable", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
120
- font-size: 14px;
121
- line-height: 1.5;
122
- font-variant-numeric: tabular-nums;
123
- -webkit-font-smoothing: antialiased;
124
- }
125
-
126
- code,
127
- kbd,
128
- pre,
129
- samp {
130
- font-family: "Geist Mono", "Geist Mono Variable", ui-monospace, SFMono-Regular, Menlo, monospace;
131
- }
132
-
133
- a {
134
- color: var(--link);
135
- }
136
-
137
- @media (prefers-reduced-motion: reduce) {
138
- *,
139
- ::before,
140
- ::after {
141
- animation-duration: 0.01ms !important;
142
- animation-iteration-count: 1 !important;
143
- transition-duration: 0.01ms !important;
144
- scroll-behavior: auto !important;
145
- }
146
- }