@lfrprazeres/ui 0.1.0

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 (114) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +160 -0
  3. package/dist/components/chip.d.ts +16 -0
  4. package/dist/components/chip.d.ts.map +1 -0
  5. package/dist/components/chip.js +49 -0
  6. package/dist/components/chip.js.map +1 -0
  7. package/dist/components/index.d.ts +8 -0
  8. package/dist/components/index.js +8 -0
  9. package/dist/components/language-switcher.d.ts +22 -0
  10. package/dist/components/language-switcher.d.ts.map +1 -0
  11. package/dist/components/language-switcher.js +42 -0
  12. package/dist/components/language-switcher.js.map +1 -0
  13. package/dist/components/marquee.d.ts +23 -0
  14. package/dist/components/marquee.d.ts.map +1 -0
  15. package/dist/components/marquee.js +49 -0
  16. package/dist/components/marquee.js.map +1 -0
  17. package/dist/components/message-bubble.d.ts +28 -0
  18. package/dist/components/message-bubble.d.ts.map +1 -0
  19. package/dist/components/message-bubble.js +81 -0
  20. package/dist/components/message-bubble.js.map +1 -0
  21. package/dist/components/stat-tile.d.ts +18 -0
  22. package/dist/components/stat-tile.d.ts.map +1 -0
  23. package/dist/components/stat-tile.js +54 -0
  24. package/dist/components/stat-tile.js.map +1 -0
  25. package/dist/components/streaming-dots.d.ts +19 -0
  26. package/dist/components/streaming-dots.d.ts.map +1 -0
  27. package/dist/components/streaming-dots.js +29 -0
  28. package/dist/components/streaming-dots.js.map +1 -0
  29. package/dist/components/theme-toggle.d.ts +13 -0
  30. package/dist/components/theme-toggle.d.ts.map +1 -0
  31. package/dist/components/theme-toggle.js +54 -0
  32. package/dist/components/theme-toggle.js.map +1 -0
  33. package/dist/elements/avatar.d.ts +14 -0
  34. package/dist/elements/avatar.d.ts.map +1 -0
  35. package/dist/elements/avatar.js +52 -0
  36. package/dist/elements/avatar.js.map +1 -0
  37. package/dist/elements/badge.d.ts +12 -0
  38. package/dist/elements/badge.d.ts.map +1 -0
  39. package/dist/elements/badge.js +29 -0
  40. package/dist/elements/badge.js.map +1 -0
  41. package/dist/elements/button.d.ts +13 -0
  42. package/dist/elements/button.d.ts.map +1 -0
  43. package/dist/elements/button.js +49 -0
  44. package/dist/elements/button.js.map +1 -0
  45. package/dist/elements/card.d.ts +12 -0
  46. package/dist/elements/card.d.ts.map +1 -0
  47. package/dist/elements/card.js +56 -0
  48. package/dist/elements/card.js.map +1 -0
  49. package/dist/elements/checkbox.d.ts +7 -0
  50. package/dist/elements/checkbox.d.ts.map +1 -0
  51. package/dist/elements/checkbox.js +22 -0
  52. package/dist/elements/checkbox.js.map +1 -0
  53. package/dist/elements/dialog.d.ts +20 -0
  54. package/dist/elements/dialog.d.ts.map +1 -0
  55. package/dist/elements/dialog.js +95 -0
  56. package/dist/elements/dialog.js.map +1 -0
  57. package/dist/elements/dropdown-menu.d.ts +28 -0
  58. package/dist/elements/dropdown-menu.d.ts.map +1 -0
  59. package/dist/elements/dropdown-menu.js +124 -0
  60. package/dist/elements/dropdown-menu.js.map +1 -0
  61. package/dist/elements/index.d.ts +17 -0
  62. package/dist/elements/index.js +17 -0
  63. package/dist/elements/input.d.ts +6 -0
  64. package/dist/elements/input.d.ts.map +1 -0
  65. package/dist/elements/input.js +15 -0
  66. package/dist/elements/input.js.map +1 -0
  67. package/dist/elements/label.d.ts +7 -0
  68. package/dist/elements/label.d.ts.map +1 -0
  69. package/dist/elements/label.js +16 -0
  70. package/dist/elements/label.js.map +1 -0
  71. package/dist/elements/popover.d.ts +13 -0
  72. package/dist/elements/popover.d.ts.map +1 -0
  73. package/dist/elements/popover.js +57 -0
  74. package/dist/elements/popover.js.map +1 -0
  75. package/dist/elements/select.d.ts +18 -0
  76. package/dist/elements/select.d.ts.map +1 -0
  77. package/dist/elements/select.js +99 -0
  78. package/dist/elements/select.js.map +1 -0
  79. package/dist/elements/separator.d.ts +7 -0
  80. package/dist/elements/separator.d.ts.map +1 -0
  81. package/dist/elements/separator.js +18 -0
  82. package/dist/elements/separator.js.map +1 -0
  83. package/dist/elements/skeleton.d.ts +5 -0
  84. package/dist/elements/skeleton.d.ts.map +1 -0
  85. package/dist/elements/skeleton.js +14 -0
  86. package/dist/elements/skeleton.js.map +1 -0
  87. package/dist/elements/sonner.d.ts +17 -0
  88. package/dist/elements/sonner.d.ts.map +1 -0
  89. package/dist/elements/sonner.js +40 -0
  90. package/dist/elements/sonner.js.map +1 -0
  91. package/dist/elements/switch.d.ts +9 -0
  92. package/dist/elements/switch.d.ts.map +1 -0
  93. package/dist/elements/switch.js +21 -0
  94. package/dist/elements/switch.js.map +1 -0
  95. package/dist/elements/textarea.d.ts +6 -0
  96. package/dist/elements/textarea.d.ts.map +1 -0
  97. package/dist/elements/textarea.js +14 -0
  98. package/dist/elements/textarea.js.map +1 -0
  99. package/dist/index.d.ts +27 -0
  100. package/dist/index.js +25 -0
  101. package/dist/lib/cn.d.ts +6 -0
  102. package/dist/lib/cn.d.ts.map +1 -0
  103. package/dist/lib/cn.js +10 -0
  104. package/dist/lib/cn.js.map +1 -0
  105. package/dist/styles.css +18 -0
  106. package/dist/tokens/01-ramps.css +142 -0
  107. package/dist/tokens/02-scales.css +28 -0
  108. package/dist/tokens/03-bridge.css +75 -0
  109. package/dist/tokens/index.css +7 -0
  110. package/dist/tokens/palettes/base.css +96 -0
  111. package/dist/tokens/palettes/cyberpunk.css +83 -0
  112. package/dist/tokens/palettes/gold.css +77 -0
  113. package/dist/tokens/palettes/minimal.css +82 -0
  114. package/package.json +100 -0
@@ -0,0 +1,14 @@
1
+ import { cn } from "../lib/cn.js";
2
+ import { jsx } from "react/jsx-runtime";
3
+ //#region src/elements/skeleton.tsx
4
+ function Skeleton({ className, ...props }) {
5
+ return /* @__PURE__ */ jsx("div", {
6
+ className: cn("animate-pulse rounded-md bg-accent", className),
7
+ "data-slot": "skeleton",
8
+ ...props
9
+ });
10
+ }
11
+ //#endregion
12
+ export { Skeleton };
13
+
14
+ //# sourceMappingURL=skeleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton.js","names":[],"sources":["../../src/elements/skeleton.tsx"],"sourcesContent":["import { cn } from \"@/lib/cn\";\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n className={cn(\"animate-pulse rounded-md bg-accent\", className)}\n data-slot=\"skeleton\"\n {...props}\n />\n );\n}\n\nexport { Skeleton };\n"],"mappings":";;;AAEA,SAAS,SAAS,EAAE,WAAW,GAAG,SAAsC;CACtE,OACE,oBAAC,OAAD;EACE,WAAW,GAAG,sCAAsC,SAAS;EAC7D,aAAU;EACV,GAAI;CACL,CAAA;AAEL"}
@@ -0,0 +1,17 @@
1
+ import { ToasterProps, toast } from "sonner";
2
+ //#region src/elements/sonner.d.ts
3
+ /**
4
+ * The one sanctioned deviation from upstream shadcn.
5
+ *
6
+ * Upstream reads the active theme with `useTheme()` from next-themes, which
7
+ * would put a Next-only dependency inside a framework-agnostic package. Here
8
+ * `theme` is an ordinary prop, so the consumer supplies it from whatever it
9
+ * already uses: next-themes, a media query, its own store.
10
+ *
11
+ * If this file is ever re-scaffolded with `shadcn add sonner`, the next-themes
12
+ * import comes back. Re-apply this inversion.
13
+ */
14
+ declare function Toaster$1({ theme, ...props }: ToasterProps): import("react").JSX.Element;
15
+ //#endregion
16
+ export { Toaster$1 as Toaster, toast };
17
+ //# sourceMappingURL=sonner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sonner.d.ts","names":[],"sources":["../../src/elements/sonner.tsx"],"mappings":";;;;;;;;;;;;;iBAuBS,YAAU,UAAqB,SAAS,+BAAY,IAAA"}
@@ -0,0 +1,40 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { CircleCheckIcon, InfoIcon, Loader2Icon, OctagonXIcon, TriangleAlertIcon } from "lucide-react";
4
+ import { Toaster, toast } from "sonner";
5
+ //#region src/elements/sonner.tsx
6
+ /**
7
+ * The one sanctioned deviation from upstream shadcn.
8
+ *
9
+ * Upstream reads the active theme with `useTheme()` from next-themes, which
10
+ * would put a Next-only dependency inside a framework-agnostic package. Here
11
+ * `theme` is an ordinary prop, so the consumer supplies it from whatever it
12
+ * already uses: next-themes, a media query, its own store.
13
+ *
14
+ * If this file is ever re-scaffolded with `shadcn add sonner`, the next-themes
15
+ * import comes back. Re-apply this inversion.
16
+ */
17
+ function Toaster$1({ theme = "system", ...props }) {
18
+ return /* @__PURE__ */ jsx(Toaster, {
19
+ className: "toaster group",
20
+ icons: {
21
+ error: /* @__PURE__ */ jsx(OctagonXIcon, { className: "size-4" }),
22
+ info: /* @__PURE__ */ jsx(InfoIcon, { className: "size-4" }),
23
+ loading: /* @__PURE__ */ jsx(Loader2Icon, { className: "size-4 animate-spin" }),
24
+ success: /* @__PURE__ */ jsx(CircleCheckIcon, { className: "size-4" }),
25
+ warning: /* @__PURE__ */ jsx(TriangleAlertIcon, { className: "size-4" })
26
+ },
27
+ style: {
28
+ "--border-radius": "var(--radius)",
29
+ "--normal-bg": "var(--popover)",
30
+ "--normal-border": "var(--border)",
31
+ "--normal-text": "var(--popover-foreground)"
32
+ },
33
+ theme,
34
+ ...props
35
+ });
36
+ }
37
+ //#endregion
38
+ export { Toaster$1 as Toaster, toast };
39
+
40
+ //# sourceMappingURL=sonner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sonner.js","names":["Toaster","Sonner"],"sources":["../../src/elements/sonner.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n CircleCheckIcon,\n InfoIcon,\n Loader2Icon,\n OctagonXIcon,\n TriangleAlertIcon,\n} from \"lucide-react\";\nimport type { CSSProperties } from \"react\";\nimport { Toaster as Sonner, type ToasterProps } from \"sonner\";\n\n/**\n * The one sanctioned deviation from upstream shadcn.\n *\n * Upstream reads the active theme with `useTheme()` from next-themes, which\n * would put a Next-only dependency inside a framework-agnostic package. Here\n * `theme` is an ordinary prop, so the consumer supplies it from whatever it\n * already uses: next-themes, a media query, its own store.\n *\n * If this file is ever re-scaffolded with `shadcn add sonner`, the next-themes\n * import comes back. Re-apply this inversion.\n */\nfunction Toaster({ theme = \"system\", ...props }: ToasterProps) {\n return (\n <Sonner\n className=\"toaster group\"\n icons={{\n error: <OctagonXIcon className=\"size-4\" />,\n info: <InfoIcon className=\"size-4\" />,\n loading: <Loader2Icon className=\"size-4 animate-spin\" />,\n success: <CircleCheckIcon className=\"size-4\" />,\n warning: <TriangleAlertIcon className=\"size-4\" />,\n }}\n style={\n {\n \"--border-radius\": \"var(--radius)\",\n \"--normal-bg\": \"var(--popover)\",\n \"--normal-border\": \"var(--border)\",\n \"--normal-text\": \"var(--popover-foreground)\",\n } as CSSProperties\n }\n theme={theme}\n {...props}\n />\n );\n}\n\n// Re-exported so consumers do not have to install sonner themselves. Under\n// pnpm's strict node_modules a transitive dependency is not importable.\nexport { toast } from \"sonner\";\nexport { Toaster };\n"],"mappings":";;;;;;;;;;;;;;;;AAuBA,SAASA,UAAQ,EAAE,QAAQ,UAAU,GAAG,SAAuB;CAC7D,OACE,oBAACC,SAAD;EACE,WAAU;EACV,OAAO;GACL,OAAO,oBAAC,cAAD,EAAc,WAAU,SAAU,CAAA;GACzC,MAAM,oBAAC,UAAD,EAAU,WAAU,SAAU,CAAA;GACpC,SAAS,oBAAC,aAAD,EAAa,WAAU,sBAAuB,CAAA;GACvD,SAAS,oBAAC,iBAAD,EAAiB,WAAU,SAAU,CAAA;GAC9C,SAAS,oBAAC,mBAAD,EAAmB,WAAU,SAAU,CAAA;EAClD;EACA,OACE;GACE,mBAAmB;GACnB,eAAe;GACf,mBAAmB;GACnB,iBAAiB;EACnB;EAEK;EACP,GAAI;CACL,CAAA;AAEL"}
@@ -0,0 +1,9 @@
1
+ import { Switch } from "radix-ui";
2
+ import * as React from "react";
3
+ //#region src/elements/switch.d.ts
4
+ declare function Switch$1({ className, size, ...props }: React.ComponentProps<typeof Switch.Root> & {
5
+ size?: "sm" | "default";
6
+ }): React.JSX.Element;
7
+ //#endregion
8
+ export { Switch$1 as Switch };
9
+ //# sourceMappingURL=switch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switch.d.ts","names":[],"sources":["../../src/elements/switch.tsx"],"mappings":";;;iBAOS,WACP,WACA,SACG,SACF,MAAM,sBAAsB,OAAgB;EAC7C;IACD,MAAA,IAAA"}
@@ -0,0 +1,21 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { jsx } from "react/jsx-runtime";
4
+ import { Switch } from "radix-ui";
5
+ //#region src/elements/switch.tsx
6
+ function Switch$1({ className, size = "default", ...props }) {
7
+ return /* @__PURE__ */ jsx(Switch.Root, {
8
+ className: cn("peer group/switch inline-flex shrink-0 items-center rounded-full border border-transparent shadow-xs outline-none transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-[1.15rem] data-[size=sm]:h-3.5 data-[size=default]:w-8 data-[size=sm]:w-6 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input dark:data-[state=unchecked]:bg-input/80", className),
9
+ "data-size": size,
10
+ "data-slot": "switch",
11
+ ...props,
12
+ children: /* @__PURE__ */ jsx(Switch.Thumb, {
13
+ className: cn("pointer-events-none block rounded-full bg-background ring-0 transition-transform data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0 group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 dark:data-[state=checked]:bg-primary-foreground dark:data-[state=unchecked]:bg-foreground"),
14
+ "data-slot": "switch-thumb"
15
+ })
16
+ });
17
+ }
18
+ //#endregion
19
+ export { Switch$1 as Switch };
20
+
21
+ //# sourceMappingURL=switch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switch.js","names":["Switch","SwitchPrimitive"],"sources":["../../src/elements/switch.tsx"],"sourcesContent":["\"use client\";\n\nimport { Switch as SwitchPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/lib/cn\";\n\nfunction Switch({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof SwitchPrimitive.Root> & {\n size?: \"sm\" | \"default\";\n}) {\n return (\n <SwitchPrimitive.Root\n className={cn(\n \"peer group/switch inline-flex shrink-0 items-center rounded-full border border-transparent shadow-xs outline-none transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-[1.15rem] data-[size=sm]:h-3.5 data-[size=default]:w-8 data-[size=sm]:w-6 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input dark:data-[state=unchecked]:bg-input/80\",\n className\n )}\n data-size={size}\n data-slot=\"switch\"\n {...props}\n >\n <SwitchPrimitive.Thumb\n className={cn(\n \"pointer-events-none block rounded-full bg-background ring-0 transition-transform data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0 group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 dark:data-[state=checked]:bg-primary-foreground dark:data-[state=unchecked]:bg-foreground\"\n )}\n data-slot=\"switch-thumb\"\n />\n </SwitchPrimitive.Root>\n );\n}\n\nexport { Switch };\n"],"mappings":";;;;;AAOA,SAASA,SAAO,EACd,WACA,OAAO,WACP,GAAG,SAGF;CACD,OACE,oBAACC,OAAgB,MAAjB;EACE,WAAW,GACT,0cACA,SACF;EACA,aAAW;EACX,aAAU;EACV,GAAI;EAEJ,UAAA,oBAACA,OAAgB,OAAjB;GACE,WAAW,GACT,8UACF;GACA,aAAU;EACX,CAAA;CACmB,CAAA;AAE1B"}
@@ -0,0 +1,6 @@
1
+ import * as React from "react";
2
+ //#region src/elements/textarea.d.ts
3
+ declare function Textarea({ className, ...props }: React.ComponentProps<"textarea">): React.JSX.Element;
4
+ //#endregion
5
+ export { Textarea };
6
+ //# sourceMappingURL=textarea.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea.d.ts","names":[],"sources":["../../src/elements/textarea.tsx"],"mappings":";;iBAIS,WAAW,cAAc,SAAS,MAAM,6BAA0B,MAAA,IAAA"}
@@ -0,0 +1,14 @@
1
+ import { cn } from "../lib/cn.js";
2
+ import { jsx } from "react/jsx-runtime";
3
+ //#region src/elements/textarea.tsx
4
+ function Textarea({ className, ...props }) {
5
+ return /* @__PURE__ */ jsx("textarea", {
6
+ className: cn("field-sizing-content flex min-h-16 w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-xs outline-none transition-[color,box-shadow] placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:aria-invalid:ring-destructive/40", className),
7
+ "data-slot": "textarea",
8
+ ...props
9
+ });
10
+ }
11
+ //#endregion
12
+ export { Textarea };
13
+
14
+ //# sourceMappingURL=textarea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea.js","names":[],"sources":["../../src/elements/textarea.tsx"],"sourcesContent":["import type * as React from \"react\";\n\nimport { cn } from \"@/lib/cn\";\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n className={cn(\n \"field-sizing-content flex min-h-16 w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-xs outline-none transition-[color,box-shadow] placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n data-slot=\"textarea\"\n {...props}\n />\n );\n}\n\nexport { Textarea };\n"],"mappings":";;;AAIA,SAAS,SAAS,EAAE,WAAW,GAAG,SAA2C;CAC3E,OACE,oBAAC,YAAD;EACE,WAAW,GACT,ucACA,SACF;EACA,aAAU;EACV,GAAI;CACL,CAAA;AAEL"}
@@ -0,0 +1,27 @@
1
+ import { Chip, ChipProps, chipVariants } from "./components/chip.js";
2
+ import { LanguageOption, LanguageSwitcher, LanguageSwitcherProps } from "./components/language-switcher.js";
3
+ import { Marquee, MarqueeProps } from "./components/marquee.js";
4
+ import { MessageBubble, MessageBubbleProps, MessageRole } from "./components/message-bubble.js";
5
+ import { StatDirection, StatTile, StatTileProps } from "./components/stat-tile.js";
6
+ import { StreamingDots, StreamingDotsProps } from "./components/streaming-dots.js";
7
+ import { ThemeMode, ThemeToggle, ThemeToggleProps } from "./components/theme-toggle.js";
8
+ import "./components/index.js";
9
+ import { Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage } from "./elements/avatar.js";
10
+ import { Badge, badgeVariants } from "./elements/badge.js";
11
+ import { Button, buttonVariants } from "./elements/button.js";
12
+ import { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "./elements/card.js";
13
+ import { Checkbox } from "./elements/checkbox.js";
14
+ import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger } from "./elements/dialog.js";
15
+ import { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger } from "./elements/dropdown-menu.js";
16
+ import { Input } from "./elements/input.js";
17
+ import { Label } from "./elements/label.js";
18
+ import { Popover, PopoverAnchor, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger } from "./elements/popover.js";
19
+ import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue } from "./elements/select.js";
20
+ import { Separator } from "./elements/separator.js";
21
+ import { Skeleton } from "./elements/skeleton.js";
22
+ import { Toaster, toast } from "./elements/sonner.js";
23
+ import { Switch } from "./elements/switch.js";
24
+ import { Textarea } from "./elements/textarea.js";
25
+ import "./elements/index.js";
26
+ import { cn } from "./lib/cn.js";
27
+ export { Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage, Badge, Button, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, Chip, ChipProps, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Input, Label, LanguageOption, LanguageSwitcher, LanguageSwitcherProps, Marquee, MarqueeProps, MessageBubble, MessageBubbleProps, MessageRole, Popover, PopoverAnchor, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Skeleton, StatDirection, StatTile, StatTileProps, StreamingDots, StreamingDotsProps, Switch, Textarea, ThemeMode, ThemeToggle, ThemeToggleProps, Toaster, badgeVariants, buttonVariants, chipVariants, cn, toast };
package/dist/index.js ADDED
@@ -0,0 +1,25 @@
1
+ import { cn } from "./lib/cn.js";
2
+ import { Chip, chipVariants } from "./components/chip.js";
3
+ import { Button, buttonVariants } from "./elements/button.js";
4
+ import { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger } from "./elements/dropdown-menu.js";
5
+ import { LanguageSwitcher } from "./components/language-switcher.js";
6
+ import { Marquee } from "./components/marquee.js";
7
+ import { MessageBubble } from "./components/message-bubble.js";
8
+ import { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "./elements/card.js";
9
+ import { StatTile } from "./components/stat-tile.js";
10
+ import { StreamingDots } from "./components/streaming-dots.js";
11
+ import { ThemeToggle } from "./components/theme-toggle.js";
12
+ import { Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage } from "./elements/avatar.js";
13
+ import { Badge, badgeVariants } from "./elements/badge.js";
14
+ import { Checkbox } from "./elements/checkbox.js";
15
+ import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger } from "./elements/dialog.js";
16
+ import { Input } from "./elements/input.js";
17
+ import { Label } from "./elements/label.js";
18
+ import { Popover, PopoverAnchor, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger } from "./elements/popover.js";
19
+ import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue } from "./elements/select.js";
20
+ import { Separator } from "./elements/separator.js";
21
+ import { Skeleton } from "./elements/skeleton.js";
22
+ import { Toaster, toast } from "./elements/sonner.js";
23
+ import { Switch } from "./elements/switch.js";
24
+ import { Textarea } from "./elements/textarea.js";
25
+ export { Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage, Badge, Button, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, Chip, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Input, Label, LanguageSwitcher, Marquee, MessageBubble, Popover, PopoverAnchor, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Skeleton, StatTile, StreamingDots, Switch, Textarea, ThemeToggle, Toaster, badgeVariants, buttonVariants, chipVariants, cn, toast };
@@ -0,0 +1,6 @@
1
+ import { ClassValue } from "clsx";
2
+ //#region src/lib/cn.d.ts
3
+ declare function cn(...inputs: ClassValue[]): string;
4
+ //#endregion
5
+ export { cn };
6
+ //# sourceMappingURL=cn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cn.d.ts","names":[],"sources":["../../src/lib/cn.ts"],"mappings":";;iBAGgB,MAAM,QAAQ"}
package/dist/lib/cn.js ADDED
@@ -0,0 +1,10 @@
1
+ import { clsx } from "clsx";
2
+ import { twMerge } from "tailwind-merge";
3
+ //#region src/lib/cn.ts
4
+ function cn(...inputs) {
5
+ return twMerge(clsx(inputs));
6
+ }
7
+ //#endregion
8
+ export { cn };
9
+
10
+ //# sourceMappingURL=cn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cn.js","names":[],"sources":["../../src/lib/cn.ts"],"sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n"],"mappings":";;;AAGA,SAAgB,GAAG,GAAG,QAAsB;CAC1C,OAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B"}
@@ -0,0 +1,18 @@
1
+ @import "tailwindcss";
2
+ @import "./tokens/index.css";
3
+
4
+ @source "./**/*.{ts,tsx,js}";
5
+
6
+ @layer base {
7
+ * {
8
+ outline-color: color-mix(in oklab, var(--color-ring) 50%, transparent);
9
+ border-color: var(--color-border);
10
+ }
11
+
12
+ body {
13
+ font-family: var(--font-sans);
14
+ -webkit-font-smoothing: antialiased;
15
+ color: var(--color-foreground);
16
+ background-color: var(--color-background);
17
+ }
18
+ }
@@ -0,0 +1,142 @@
1
+ /* Colour ramps. Raw scales, no roles.
2
+
3
+ Values follow Tailwind v4 OKLCH but are kept local deliberately: Tailwind only
4
+ emits theme vars that a utility references, so var(--color-cyan-500) from a
5
+ palette would resolve to nothing. */
6
+
7
+ :root {
8
+ /* Neutral, achromatic. */
9
+ --neutral-0: oklch(1 0 0);
10
+ --neutral-50: oklch(0.985 0 0);
11
+ --neutral-100: oklch(0.97 0 0);
12
+ --neutral-200: oklch(0.922 0 0);
13
+ --neutral-300: oklch(0.87 0 0);
14
+ --neutral-400: oklch(0.708 0 0);
15
+ --neutral-500: oklch(0.556 0 0);
16
+ --neutral-600: oklch(0.439 0 0);
17
+ --neutral-700: oklch(0.371 0 0);
18
+ --neutral-800: oklch(0.269 0 0);
19
+ --neutral-900: oklch(0.205 0 0);
20
+ --neutral-950: oklch(0.145 0 0);
21
+
22
+ /* Slate, cool neutral. */
23
+ --slate-50: oklch(0.984 0.003 247);
24
+ --slate-100: oklch(0.968 0.007 247);
25
+ --slate-200: oklch(0.929 0.013 255);
26
+ --slate-300: oklch(0.869 0.022 252);
27
+ --slate-400: oklch(0.704 0.04 256);
28
+ --slate-500: oklch(0.554 0.046 257);
29
+ --slate-600: oklch(0.446 0.043 257);
30
+ --slate-700: oklch(0.372 0.044 257);
31
+ --slate-800: oklch(0.279 0.041 260);
32
+ --slate-900: oklch(0.208 0.042 265);
33
+ --slate-950: oklch(0.129 0.042 264);
34
+
35
+ /* Sand, warm neutral. */
36
+ --sand-50: oklch(0.985 0.005 80);
37
+ --sand-100: oklch(0.965 0.008 78);
38
+ --sand-200: oklch(0.93 0.012 76);
39
+ --sand-300: oklch(0.86 0.018 74);
40
+ --sand-400: oklch(0.74 0.02 72);
41
+ --sand-500: oklch(0.6 0.022 70);
42
+ --sand-600: oklch(0.46 0.02 68);
43
+ --sand-700: oklch(0.34 0.018 66);
44
+ --sand-800: oklch(0.24 0.015 64);
45
+ --sand-900: oklch(0.16 0.012 62);
46
+ --sand-950: oklch(0.11 0.01 62);
47
+
48
+ /* Gold, warm antique accent. Deliberately not Tailwind amber. */
49
+ --gold-50: oklch(0.97 0.025 85);
50
+ --gold-100: oklch(0.93 0.04 85);
51
+ --gold-200: oklch(0.85 0.07 82);
52
+ --gold-300: oklch(0.75 0.1 80);
53
+ --gold-400: oklch(0.68 0.115 78);
54
+ --gold-500: oklch(0.62 0.115 78);
55
+ --gold-600: oklch(0.54 0.105 76);
56
+ --gold-700: oklch(0.46 0.09 74);
57
+ --gold-800: oklch(0.38 0.075 72);
58
+ --gold-900: oklch(0.3 0.06 72);
59
+ --gold-950: oklch(0.22 0.045 72);
60
+
61
+ /* Cyan. */
62
+ --cyan-50: oklch(0.984 0.019 200);
63
+ --cyan-100: oklch(0.956 0.045 203);
64
+ --cyan-200: oklch(0.917 0.08 205);
65
+ --cyan-300: oklch(0.865 0.127 207);
66
+ --cyan-400: oklch(0.789 0.154 211);
67
+ --cyan-500: oklch(0.715 0.143 215);
68
+ --cyan-600: oklch(0.609 0.126 221);
69
+ --cyan-700: oklch(0.52 0.105 223);
70
+ --cyan-800: oklch(0.45 0.085 224);
71
+ --cyan-900: oklch(0.398 0.07 227);
72
+ --cyan-950: oklch(0.302 0.056 229);
73
+
74
+ /* Blue. */
75
+ --blue-50: oklch(0.97 0.014 254);
76
+ --blue-100: oklch(0.932 0.032 255);
77
+ --blue-200: oklch(0.882 0.059 254);
78
+ --blue-300: oklch(0.809 0.105 251);
79
+ --blue-400: oklch(0.707 0.165 254);
80
+ --blue-500: oklch(0.623 0.214 259);
81
+ --blue-600: oklch(0.546 0.245 262);
82
+ --blue-700: oklch(0.488 0.243 264);
83
+ --blue-800: oklch(0.424 0.199 265);
84
+ --blue-900: oklch(0.379 0.146 265);
85
+ --blue-950: oklch(0.282 0.091 267);
86
+
87
+ /* Violet. */
88
+ --violet-50: oklch(0.969 0.016 293);
89
+ --violet-100: oklch(0.943 0.029 294);
90
+ --violet-200: oklch(0.894 0.057 293);
91
+ --violet-300: oklch(0.811 0.111 293);
92
+ --violet-400: oklch(0.702 0.183 294);
93
+ --violet-500: oklch(0.606 0.25 292);
94
+ --violet-600: oklch(0.541 0.281 293);
95
+ --violet-700: oklch(0.491 0.27 292);
96
+ --violet-800: oklch(0.432 0.232 292);
97
+ --violet-900: oklch(0.38 0.189 293);
98
+ --violet-950: oklch(0.283 0.141 291);
99
+
100
+ /* Fuchsia. */
101
+ --fuchsia-50: oklch(0.977 0.017 320);
102
+ --fuchsia-100: oklch(0.952 0.037 318);
103
+ --fuchsia-200: oklch(0.903 0.076 319);
104
+ --fuchsia-300: oklch(0.833 0.145 321);
105
+ --fuchsia-400: oklch(0.74 0.238 322);
106
+ --fuchsia-500: oklch(0.667 0.295 322);
107
+ --fuchsia-600: oklch(0.591 0.293 322);
108
+ --fuchsia-700: oklch(0.518 0.253 323);
109
+ --fuchsia-800: oklch(0.452 0.211 324);
110
+ --fuchsia-900: oklch(0.401 0.17 325);
111
+ --fuchsia-950: oklch(0.293 0.136 325);
112
+
113
+ /* Emerald. */
114
+ --emerald-50: oklch(0.979 0.021 166);
115
+ --emerald-100: oklch(0.95 0.052 163);
116
+ --emerald-200: oklch(0.905 0.093 164);
117
+ --emerald-300: oklch(0.845 0.143 164);
118
+ --emerald-400: oklch(0.765 0.177 163);
119
+ --emerald-500: oklch(0.696 0.17 162);
120
+ --emerald-600: oklch(0.596 0.145 163);
121
+ --emerald-700: oklch(0.508 0.118 166);
122
+ --emerald-800: oklch(0.432 0.095 166);
123
+ --emerald-900: oklch(0.378 0.077 169);
124
+ --emerald-950: oklch(0.262 0.051 172);
125
+
126
+ /* Rose. */
127
+ --rose-50: oklch(0.969 0.015 12);
128
+ --rose-100: oklch(0.941 0.03 12);
129
+ --rose-200: oklch(0.892 0.058 10);
130
+ --rose-300: oklch(0.81 0.117 11);
131
+ --rose-400: oklch(0.712 0.194 13);
132
+ --rose-500: oklch(0.645 0.246 16);
133
+ --rose-600: oklch(0.586 0.253 17);
134
+ --rose-700: oklch(0.514 0.222 16);
135
+ --rose-800: oklch(0.455 0.188 13);
136
+ --rose-900: oklch(0.41 0.159 10);
137
+ --rose-950: oklch(0.271 0.105 12);
138
+
139
+ /* Alpha overlays, for dark borders that are not ramp steps. */
140
+ --overlay-white-10: oklch(1 0 0 / 10%);
141
+ --overlay-white-15: oklch(1 0 0 / 15%);
142
+ }
@@ -0,0 +1,28 @@
1
+ /* Non-colour scales. All palette-overridable: redefining --spacing or --radius
2
+ on a palette class rescales the system at runtime, with no rebuild. */
3
+
4
+ :root {
5
+ --spacing: 0.25rem;
6
+
7
+ /* All four derived radius steps compute from this. */
8
+ --radius: 0.625rem;
9
+
10
+ /* Motion. */
11
+ --duration-instant: 0ms;
12
+ --duration-fast: 150ms;
13
+ --duration-base: 250ms;
14
+ --duration-slow: 400ms;
15
+
16
+ --ease-standard: cubic-bezier(0.2, 0, 0, 1);
17
+ --ease-emphasized: cubic-bezier(0.16, 1, 0.3, 1);
18
+
19
+ /* Indirection lets a consumer inject a framework-loaded font via the -app var. */
20
+ --font-sans-stack:
21
+ var(--font-sans-app, "Inter"), ui-sans-serif, system-ui, -apple-system,
22
+ "Segoe UI", sans-serif;
23
+ --font-serif-stack:
24
+ var(--font-serif-app, "Source Serif 4"), "Iowan Old Style", Georgia, serif;
25
+ --font-mono-stack:
26
+ var(--font-mono-app, "JetBrains Mono"), ui-monospace, SFMono-Regular,
27
+ "Cascadia Code", monospace;
28
+ }
@@ -0,0 +1,75 @@
1
+ /*
2
+ * The Tailwind bridge.
3
+ *
4
+ * `@theme inline` maps Tailwind's utility namespace onto the semantic tier, so
5
+ * `bg-primary` resolves to `var(--primary)`. `inline` matters: it makes Tailwind
6
+ * emit the reference rather than a second layer of indirection, which is what
7
+ * lets `.dark` overrides take effect at runtime.
8
+ *
9
+ * This block is the contract's public surface. Adding a name here without a
10
+ * corresponding semantic token produces a utility that resolves to nothing.
11
+ */
12
+
13
+ @custom-variant dark (&:is(.dark *));
14
+
15
+ @theme inline {
16
+ --color-background: var(--background);
17
+ --color-foreground: var(--foreground);
18
+
19
+ --color-card: var(--card);
20
+ --color-card-foreground: var(--card-foreground);
21
+
22
+ --color-popover: var(--popover);
23
+ --color-popover-foreground: var(--popover-foreground);
24
+
25
+ --color-primary: var(--primary);
26
+ --color-primary-foreground: var(--primary-foreground);
27
+
28
+ --color-secondary: var(--secondary);
29
+ --color-secondary-foreground: var(--secondary-foreground);
30
+
31
+ /* Extension: a third brand role. shadcn's contract stops at secondary. */
32
+ --color-tertiary: var(--tertiary);
33
+ --color-tertiary-foreground: var(--tertiary-foreground);
34
+
35
+ --color-muted: var(--muted);
36
+ --color-muted-foreground: var(--muted-foreground);
37
+
38
+ --color-accent: var(--accent);
39
+ --color-accent-foreground: var(--accent-foreground);
40
+
41
+ --color-destructive: var(--destructive);
42
+
43
+ --color-border: var(--border);
44
+ --color-input: var(--input);
45
+ --color-ring: var(--ring);
46
+
47
+ --color-chart-1: var(--chart-1);
48
+ --color-chart-2: var(--chart-2);
49
+ --color-chart-3: var(--chart-3);
50
+ --color-chart-4: var(--chart-4);
51
+ --color-chart-5: var(--chart-5);
52
+
53
+ --color-sidebar: var(--sidebar);
54
+ --color-sidebar-foreground: var(--sidebar-foreground);
55
+ --color-sidebar-primary: var(--sidebar-primary);
56
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
57
+ --color-sidebar-accent: var(--sidebar-accent);
58
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
59
+ --color-sidebar-border: var(--sidebar-border);
60
+ --color-sidebar-ring: var(--sidebar-ring);
61
+
62
+ /* Extensions, outside shadcn's contract. */
63
+ --color-positive: var(--positive);
64
+ --color-negative: var(--negative);
65
+
66
+ /* Radii, all derived from the single --radius primitive. */
67
+ --radius-sm: calc(var(--radius) - 4px);
68
+ --radius-md: calc(var(--radius) - 2px);
69
+ --radius-lg: var(--radius);
70
+ --radius-xl: calc(var(--radius) + 4px);
71
+
72
+ --font-sans: var(--font-sans-stack);
73
+ --font-serif: var(--font-serif-stack);
74
+ --font-mono: var(--font-mono-stack);
75
+ }
@@ -0,0 +1,7 @@
1
+ @import "./01-ramps.css";
2
+ @import "./02-scales.css";
3
+ @import "./palettes/base.css";
4
+ @import "./palettes/gold.css";
5
+ @import "./palettes/cyberpunk.css";
6
+ @import "./palettes/minimal.css";
7
+ @import "./03-bridge.css";
@@ -0,0 +1,96 @@
1
+ /* Base palette. shadcn contract verbatim, every value a reference into a ramp. */
2
+
3
+ :root {
4
+ --background: var(--neutral-0);
5
+ --foreground: var(--neutral-950);
6
+ --card: var(--neutral-0);
7
+ --card-foreground: var(--neutral-950);
8
+ --popover: var(--neutral-0);
9
+ --popover-foreground: var(--neutral-950);
10
+ --primary: var(--neutral-900);
11
+ --primary-foreground: var(--neutral-50);
12
+ --secondary: var(--neutral-100);
13
+ --secondary-foreground: var(--neutral-900);
14
+ --tertiary: var(--neutral-200);
15
+ --tertiary-foreground: var(--neutral-900);
16
+ --muted: var(--neutral-100);
17
+ --muted-foreground: var(--neutral-500);
18
+ --accent: var(--neutral-100);
19
+ --accent-foreground: var(--neutral-900);
20
+ --destructive: var(--rose-600);
21
+ --border: var(--neutral-200);
22
+ --input: var(--neutral-200);
23
+ --ring: var(--neutral-400);
24
+ --chart-1: var(--neutral-300);
25
+ --chart-2: var(--neutral-500);
26
+ --chart-3: var(--neutral-600);
27
+ --chart-4: var(--neutral-700);
28
+ --chart-5: var(--neutral-800);
29
+ --sidebar: var(--neutral-50);
30
+ --sidebar-foreground: var(--neutral-950);
31
+ --sidebar-primary: var(--neutral-900);
32
+ --sidebar-primary-foreground: var(--neutral-50);
33
+ --sidebar-accent: var(--neutral-100);
34
+ --sidebar-accent-foreground: var(--neutral-900);
35
+ --sidebar-border: var(--neutral-200);
36
+ --sidebar-ring: var(--neutral-400);
37
+ --positive: var(--emerald-600);
38
+ --negative: var(--rose-600);
39
+
40
+ --motion-duration-fast: var(--duration-fast);
41
+ --motion-duration-base: var(--duration-base);
42
+ --motion-duration-slow: var(--duration-slow);
43
+ --motion-ease: var(--ease-standard);
44
+ --motion-ease-emphasized: var(--ease-emphasized);
45
+ }
46
+
47
+ .dark {
48
+ --background: var(--neutral-950);
49
+ --foreground: var(--neutral-50);
50
+ --card: var(--neutral-900);
51
+ --card-foreground: var(--neutral-50);
52
+ --popover: var(--neutral-900);
53
+ --popover-foreground: var(--neutral-50);
54
+ --primary: var(--neutral-200);
55
+ --primary-foreground: var(--neutral-900);
56
+ --secondary: var(--neutral-800);
57
+ --secondary-foreground: var(--neutral-50);
58
+ --tertiary: var(--neutral-700);
59
+ --tertiary-foreground: var(--neutral-50);
60
+ --muted: var(--neutral-800);
61
+ --muted-foreground: var(--neutral-400);
62
+ --accent: var(--neutral-800);
63
+ --accent-foreground: var(--neutral-50);
64
+ --destructive: var(--rose-400);
65
+ --border: var(--overlay-white-10);
66
+ --input: var(--overlay-white-15);
67
+ --ring: var(--neutral-500);
68
+ --chart-1: var(--neutral-300);
69
+ --chart-2: var(--neutral-500);
70
+ --chart-3: var(--neutral-600);
71
+ --chart-4: var(--neutral-700);
72
+ --chart-5: var(--neutral-800);
73
+ --sidebar: var(--neutral-900);
74
+ --sidebar-foreground: var(--neutral-50);
75
+ --sidebar-primary: var(--neutral-200);
76
+ --sidebar-primary-foreground: var(--neutral-900);
77
+ --sidebar-accent: var(--neutral-800);
78
+ --sidebar-accent-foreground: var(--neutral-50);
79
+ --sidebar-border: var(--overlay-white-10);
80
+ --sidebar-ring: var(--neutral-500);
81
+ --positive: var(--emerald-400);
82
+ --negative: var(--rose-400);
83
+ }
84
+
85
+ /*
86
+ * Reduced motion is a token-layer concern, not a per-component one. Durations
87
+ * collapse to zero so the user lands on the final state instantly. The
88
+ * animation is not disabled, because disabling it hides the outcome.
89
+ */
90
+ @media (prefers-reduced-motion: reduce) {
91
+ :root {
92
+ --motion-duration-fast: var(--duration-instant);
93
+ --motion-duration-base: var(--duration-instant);
94
+ --motion-duration-slow: var(--duration-instant);
95
+ }
96
+ }