@spawn-llc/design-system 1.1.0 → 1.2.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 (195) hide show
  1. package/DESIGN-SYSTEM.md +4 -0
  2. package/README.md +8 -6
  3. package/SPEC.md +3 -1
  4. package/dist/DESIGN-SYSTEM.md +4 -0
  5. package/dist/chunk-227VGN2D.js +617 -0
  6. package/dist/chunk-2UK4FHS3.js +31 -0
  7. package/dist/chunk-36NOAJFW.js +53 -0
  8. package/dist/chunk-3EZ5FFYG.js +154 -0
  9. package/dist/chunk-3PN2XMRA.js +80 -0
  10. package/dist/chunk-3SLZRFKQ.js +107 -0
  11. package/dist/chunk-4ABNKOPC.js +18 -0
  12. package/dist/chunk-4IKPZU4X.js +34 -0
  13. package/dist/chunk-5YRMB7KW.js +31 -0
  14. package/dist/chunk-66R4755B.js +37 -0
  15. package/dist/chunk-ATBQXQM7.js +165 -0
  16. package/dist/chunk-AUWFUYJI.js +79 -0
  17. package/dist/chunk-BTGJV2P6.js +237 -0
  18. package/dist/chunk-BYJWYU66.js +95 -0
  19. package/dist/chunk-D6UXXTC6.js +18 -0
  20. package/dist/chunk-DFVSGTAN.js +24 -0
  21. package/dist/chunk-DQ52UWO2.js +28 -0
  22. package/dist/chunk-DXXFNPYR.js +20 -0
  23. package/dist/chunk-GBPD3QPO.js +60 -0
  24. package/dist/chunk-GHSVAEXO.js +227 -0
  25. package/dist/chunk-GQIUVLXP.js +42 -0
  26. package/dist/chunk-HG4AEMA5.js +74 -0
  27. package/dist/chunk-HK6P54FZ.js +139 -0
  28. package/dist/chunk-HSP43BHH.js +97 -0
  29. package/dist/chunk-HYBBZTLY.js +1 -0
  30. package/dist/chunk-IS2ZVRUW.js +186 -0
  31. package/dist/chunk-JSULEEYQ.js +9 -0
  32. package/dist/chunk-K46NYJUT.js +15 -0
  33. package/dist/chunk-L5SMHZJL.js +162 -0
  34. package/dist/chunk-LPPLLYOR.js +185 -0
  35. package/dist/chunk-LYDG55X2.js +194 -0
  36. package/dist/chunk-MLC45YHE.js +122 -0
  37. package/dist/chunk-MZEY2L46.js +186 -0
  38. package/dist/chunk-N34HFTEJ.js +22 -0
  39. package/dist/chunk-PPW4C342.js +232 -0
  40. package/dist/chunk-PZCXY6QZ.js +208 -0
  41. package/dist/chunk-Q3HD7YQZ.js +261 -0
  42. package/dist/chunk-QF7LZKLC.js +98 -0
  43. package/dist/chunk-QNUAUOJW.js +15 -0
  44. package/dist/chunk-QZSQXEOU.js +28 -0
  45. package/dist/chunk-RBTFEYGV.js +77 -0
  46. package/dist/chunk-SJMEO63M.js +116 -0
  47. package/dist/chunk-T6DWCVR3.js +73 -0
  48. package/dist/chunk-T7GS4AXQ.js +245 -0
  49. package/dist/chunk-TP35WWVP.js +46 -0
  50. package/dist/chunk-TQ6CJZMT.js +42 -0
  51. package/dist/chunk-U7N2A7A3.js +9 -0
  52. package/dist/chunk-V3NRC7QE.js +142 -0
  53. package/dist/chunk-VOHNOSMH.js +22 -0
  54. package/dist/chunk-W3PHWPYP.js +43 -0
  55. package/dist/chunk-WJ6DNG2Z.js +75 -0
  56. package/dist/chunk-WMXCMDSQ.js +126 -0
  57. package/dist/chunk-WSNSTJAR.js +58 -0
  58. package/dist/chunk-XG3HHC3U.js +79 -0
  59. package/dist/chunk-XOLQ37I2.js +118 -0
  60. package/dist/chunk-YFPY5SLS.js +19 -0
  61. package/dist/chunk-YFVERFQA.js +76 -0
  62. package/dist/chunk-YL4VCJKF.js +75 -0
  63. package/dist/chunk-ZMHTPZVQ.js +61 -0
  64. package/dist/chunk-ZO74KVH3.js +38 -0
  65. package/dist/components/ui/accordion.d.ts +9 -0
  66. package/dist/components/ui/accordion.js +3 -0
  67. package/dist/components/ui/alert-dialog.d.ts +24 -0
  68. package/dist/components/ui/alert-dialog.js +5 -0
  69. package/dist/components/ui/alert.d.ts +13 -0
  70. package/dist/components/ui/alert.js +3 -0
  71. package/dist/components/ui/aspect-ratio.d.ts +7 -0
  72. package/dist/components/ui/aspect-ratio.js +3 -0
  73. package/dist/components/ui/avatar.d.ts +13 -0
  74. package/dist/components/ui/avatar.js +3 -0
  75. package/dist/components/ui/badge.d.ts +11 -0
  76. package/dist/components/ui/badge.js +3 -0
  77. package/dist/components/ui/breadcrumb.d.ts +12 -0
  78. package/dist/components/ui/breadcrumb.js +3 -0
  79. package/dist/components/ui/button-group.d.ts +15 -0
  80. package/dist/components/ui/button-group.js +4 -0
  81. package/dist/components/ui/button.d.ts +9 -0
  82. package/dist/components/ui/button.js +4 -0
  83. package/dist/components/ui/calendar.d.ts +16 -0
  84. package/dist/components/ui/calendar.js +5 -0
  85. package/dist/components/ui/card.d.ts +13 -0
  86. package/dist/components/ui/card.js +3 -0
  87. package/dist/components/ui/carousel.d.ts +34 -0
  88. package/dist/components/ui/carousel.js +5 -0
  89. package/dist/components/ui/chart.d.ts +46 -0
  90. package/dist/components/ui/chart.js +3 -0
  91. package/dist/components/ui/checkbox.d.ts +6 -0
  92. package/dist/components/ui/checkbox.js +3 -0
  93. package/dist/components/ui/collapsible.d.ts +8 -0
  94. package/dist/components/ui/collapsible.js +2 -0
  95. package/dist/components/ui/combobox.d.ts +26 -0
  96. package/dist/components/ui/combobox.js +8 -0
  97. package/dist/components/ui/command.d.ts +22 -0
  98. package/dist/components/ui/command.js +9 -0
  99. package/dist/components/ui/context-menu.d.ts +31 -0
  100. package/dist/components/ui/context-menu.js +3 -0
  101. package/dist/components/ui/dialog.d.ts +19 -0
  102. package/dist/components/ui/dialog.js +5 -0
  103. package/dist/components/ui/direction.d.ts +1 -0
  104. package/dist/components/ui/direction.js +2 -0
  105. package/dist/components/ui/drawer.d.ts +15 -0
  106. package/dist/components/ui/drawer.js +3 -0
  107. package/dist/components/ui/dropdown-menu.d.ts +31 -0
  108. package/dist/components/ui/dropdown-menu.js +3 -0
  109. package/dist/components/ui/empty.d.ts +15 -0
  110. package/dist/components/ui/empty.js +3 -0
  111. package/dist/components/ui/field.d.ts +28 -0
  112. package/dist/components/ui/field.js +5 -0
  113. package/dist/components/ui/hover-card.d.ts +8 -0
  114. package/dist/components/ui/hover-card.js +3 -0
  115. package/dist/components/ui/input-group.d.ts +23 -0
  116. package/dist/components/ui/input-group.js +7 -0
  117. package/dist/components/ui/input-otp.d.ts +13 -0
  118. package/dist/components/ui/input-otp.js +3 -0
  119. package/dist/components/ui/input.d.ts +5 -0
  120. package/dist/components/ui/input.js +3 -0
  121. package/dist/components/ui/item.d.ts +26 -0
  122. package/dist/components/ui/item.js +4 -0
  123. package/dist/components/ui/kbd.d.ts +6 -0
  124. package/dist/components/ui/kbd.js +3 -0
  125. package/dist/components/ui/label.d.ts +5 -0
  126. package/dist/components/ui/label.js +3 -0
  127. package/dist/components/ui/logo.d.ts +17 -0
  128. package/dist/components/ui/logo.js +3 -0
  129. package/dist/components/ui/menubar.d.ts +31 -0
  130. package/dist/components/ui/menubar.js +4 -0
  131. package/dist/components/ui/native-select.d.ts +10 -0
  132. package/dist/components/ui/native-select.js +3 -0
  133. package/dist/components/ui/navigation-menu.d.ts +15 -0
  134. package/dist/components/ui/navigation-menu.js +3 -0
  135. package/dist/components/ui/pagination.d.ts +23 -0
  136. package/dist/components/ui/pagination.js +5 -0
  137. package/dist/components/ui/popover.d.ts +11 -0
  138. package/dist/components/ui/popover.js +3 -0
  139. package/dist/components/ui/progress.d.ts +10 -0
  140. package/dist/components/ui/progress.js +3 -0
  141. package/dist/components/ui/radio-group.d.ts +8 -0
  142. package/dist/components/ui/radio-group.js +3 -0
  143. package/dist/components/ui/resizable.d.ts +10 -0
  144. package/dist/components/ui/resizable.js +3 -0
  145. package/dist/components/ui/scroll-area.d.ts +7 -0
  146. package/dist/components/ui/scroll-area.js +3 -0
  147. package/dist/components/ui/select.d.ts +17 -0
  148. package/dist/components/ui/select.js +3 -0
  149. package/dist/components/ui/separator.d.ts +6 -0
  150. package/dist/components/ui/separator.js +3 -0
  151. package/dist/components/ui/sheet.d.ts +16 -0
  152. package/dist/components/ui/sheet.js +5 -0
  153. package/dist/components/ui/sidebar.d.ts +70 -0
  154. package/dist/components/ui/sidebar.js +11 -0
  155. package/dist/components/ui/skeleton.d.ts +5 -0
  156. package/dist/components/ui/skeleton.js +3 -0
  157. package/dist/components/ui/slider.d.ts +6 -0
  158. package/dist/components/ui/slider.js +3 -0
  159. package/dist/components/ui/sonner.d.ts +6 -0
  160. package/dist/components/ui/sonner.js +2 -0
  161. package/dist/components/ui/spinner.d.ts +5 -0
  162. package/dist/components/ui/spinner.js +3 -0
  163. package/dist/components/ui/switch.d.ts +8 -0
  164. package/dist/components/ui/switch.js +3 -0
  165. package/dist/components/ui/table.d.ts +12 -0
  166. package/dist/components/ui/table.js +3 -0
  167. package/dist/components/ui/tabs.d.ts +14 -0
  168. package/dist/components/ui/tabs.js +3 -0
  169. package/dist/components/ui/textarea.d.ts +5 -0
  170. package/dist/components/ui/textarea.js +3 -0
  171. package/dist/components/ui/toggle-group.d.ts +14 -0
  172. package/dist/components/ui/toggle-group.js +4 -0
  173. package/dist/components/ui/toggle.d.ts +12 -0
  174. package/dist/components/ui/toggle.js +3 -0
  175. package/dist/components/ui/tooltip.d.ts +9 -0
  176. package/dist/components/ui/tooltip.js +3 -0
  177. package/dist/hooks/use-mobile.d.ts +3 -0
  178. package/dist/hooks/use-mobile.js +2 -0
  179. package/dist/index.d.ts +98 -640
  180. package/dist/index.js +60 -5573
  181. package/dist/lib/button-variants.d.ts +17 -0
  182. package/dist/lib/button-variants.js +1 -0
  183. package/dist/lib/contrast.d.ts +9 -0
  184. package/dist/lib/contrast.js +1 -0
  185. package/dist/lib/utils.d.ts +5 -0
  186. package/dist/lib/utils.js +1 -0
  187. package/dist/styles.css +1 -1
  188. package/dist/theme.css +4 -0
  189. package/dist/{tokens.d.ts → tokens.generated.d.ts} +8 -0
  190. package/dist/{tokens.js → tokens.generated.js} +4 -0
  191. package/dist/variants.d.ts +3 -0
  192. package/dist/variants.js +1 -0
  193. package/package.json +17 -5
  194. package/tokens/tokens.css +2 -0
  195. package/tokens/tokens.json +5 -1
@@ -0,0 +1,165 @@
1
+ import { Dialog, DialogHeader, DialogTitle, DialogDescription, DialogContent } from './chunk-V3NRC7QE.js';
2
+ import { InputGroup, InputGroupAddon } from './chunk-HK6P54FZ.js';
3
+ import { cn } from './chunk-U7N2A7A3.js';
4
+ import { Command as Command$1 } from 'cmdk';
5
+ import { SearchIcon, CheckIcon } from 'lucide-react';
6
+ import { jsx, jsxs } from 'react/jsx-runtime';
7
+
8
+ function Command({
9
+ className,
10
+ ...props
11
+ }) {
12
+ return /* @__PURE__ */ jsx(
13
+ Command$1,
14
+ {
15
+ "data-slot": "command",
16
+ className: cn(
17
+ "flex size-full flex-col overflow-hidden rounded-xl! bg-popover p-1 text-popover-foreground",
18
+ className
19
+ ),
20
+ ...props
21
+ }
22
+ );
23
+ }
24
+ function CommandDialog({
25
+ title = "Command Palette",
26
+ description = "Search for a command to run...",
27
+ children,
28
+ className,
29
+ showCloseButton = false,
30
+ ...props
31
+ }) {
32
+ return /* @__PURE__ */ jsxs(Dialog, { ...props, children: [
33
+ /* @__PURE__ */ jsxs(DialogHeader, { className: "sr-only", children: [
34
+ /* @__PURE__ */ jsx(DialogTitle, { children: title }),
35
+ /* @__PURE__ */ jsx(DialogDescription, { children: description })
36
+ ] }),
37
+ /* @__PURE__ */ jsx(
38
+ DialogContent,
39
+ {
40
+ className: cn(
41
+ "top-1/3 translate-y-0 overflow-hidden rounded-xl! p-0",
42
+ className
43
+ ),
44
+ showCloseButton,
45
+ children
46
+ }
47
+ )
48
+ ] });
49
+ }
50
+ function CommandInput({
51
+ className,
52
+ ...props
53
+ }) {
54
+ return /* @__PURE__ */ jsx("div", { "data-slot": "command-input-wrapper", className: "p-1 pb-0", children: /* @__PURE__ */ jsxs(InputGroup, { className: "h-8! rounded-lg! border-input/30 bg-input/30 shadow-none! *:data-[slot=input-group-addon]:pl-2!", children: [
55
+ /* @__PURE__ */ jsx(
56
+ Command$1.Input,
57
+ {
58
+ "data-slot": "command-input",
59
+ className: cn(
60
+ "w-full text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50",
61
+ className
62
+ ),
63
+ ...props
64
+ }
65
+ ),
66
+ /* @__PURE__ */ jsx(InputGroupAddon, { children: /* @__PURE__ */ jsx(SearchIcon, { className: "size-4 shrink-0 opacity-50" }) })
67
+ ] }) });
68
+ }
69
+ function CommandList({
70
+ className,
71
+ ...props
72
+ }) {
73
+ return /* @__PURE__ */ jsx(
74
+ Command$1.List,
75
+ {
76
+ "data-slot": "command-list",
77
+ className: cn(
78
+ "no-scrollbar max-h-72 scroll-py-1 overflow-x-hidden overflow-y-auto outline-none",
79
+ className
80
+ ),
81
+ ...props
82
+ }
83
+ );
84
+ }
85
+ function CommandEmpty({
86
+ className,
87
+ ...props
88
+ }) {
89
+ return /* @__PURE__ */ jsx(
90
+ Command$1.Empty,
91
+ {
92
+ "data-slot": "command-empty",
93
+ className: cn("py-6 text-center text-sm", className),
94
+ ...props
95
+ }
96
+ );
97
+ }
98
+ function CommandGroup({
99
+ className,
100
+ ...props
101
+ }) {
102
+ return /* @__PURE__ */ jsx(
103
+ Command$1.Group,
104
+ {
105
+ "data-slot": "command-group",
106
+ className: cn(
107
+ "overflow-hidden p-1 text-foreground **:[[cmdk-group-heading]]:px-2 **:[[cmdk-group-heading]]:py-1.5 **:[[cmdk-group-heading]]:text-xs **:[[cmdk-group-heading]]:font-medium **:[[cmdk-group-heading]]:text-muted-foreground",
108
+ className
109
+ ),
110
+ ...props
111
+ }
112
+ );
113
+ }
114
+ function CommandSeparator({
115
+ className,
116
+ ...props
117
+ }) {
118
+ return /* @__PURE__ */ jsx(
119
+ Command$1.Separator,
120
+ {
121
+ "data-slot": "command-separator",
122
+ className: cn("-mx-1 h-px bg-border", className),
123
+ ...props
124
+ }
125
+ );
126
+ }
127
+ function CommandItem({
128
+ className,
129
+ children,
130
+ ...props
131
+ }) {
132
+ return /* @__PURE__ */ jsxs(
133
+ Command$1.Item,
134
+ {
135
+ "data-slot": "command-item",
136
+ className: cn(
137
+ "group/command-item relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none in-data-[slot=dialog-content]:rounded-lg! data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-selected:bg-muted data-selected:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-selected:*:[svg]:text-foreground",
138
+ className
139
+ ),
140
+ ...props,
141
+ children: [
142
+ children,
143
+ /* @__PURE__ */ jsx(CheckIcon, { className: "ml-auto opacity-0 group-has-data-[slot=command-shortcut]/command-item:hidden group-data-[checked=true]/command-item:opacity-100" })
144
+ ]
145
+ }
146
+ );
147
+ }
148
+ function CommandShortcut({
149
+ className,
150
+ ...props
151
+ }) {
152
+ return /* @__PURE__ */ jsx(
153
+ "span",
154
+ {
155
+ "data-slot": "command-shortcut",
156
+ className: cn(
157
+ "ml-auto text-xs tracking-widest text-muted-foreground group-data-selected/command-item:text-foreground",
158
+ className
159
+ ),
160
+ ...props
161
+ }
162
+ );
163
+ }
164
+
165
+ export { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut };
@@ -0,0 +1,79 @@
1
+ import { cn } from './chunk-U7N2A7A3.js';
2
+ import * as React from 'react';
3
+ import { OTPInput, OTPInputContext } from 'input-otp';
4
+ import { MinusIcon } from 'lucide-react';
5
+ import { jsx, jsxs } from 'react/jsx-runtime';
6
+
7
+ function InputOTP({
8
+ className,
9
+ containerClassName,
10
+ ...props
11
+ }) {
12
+ return /* @__PURE__ */ jsx(
13
+ OTPInput,
14
+ {
15
+ "data-slot": "input-otp",
16
+ containerClassName: cn(
17
+ "cn-input-otp flex items-center has-disabled:opacity-50",
18
+ containerClassName
19
+ ),
20
+ spellCheck: false,
21
+ className: cn("disabled:cursor-not-allowed", className),
22
+ ...props
23
+ }
24
+ );
25
+ }
26
+ function InputOTPGroup({ className, ...props }) {
27
+ return /* @__PURE__ */ jsx(
28
+ "div",
29
+ {
30
+ "data-slot": "input-otp-group",
31
+ className: cn(
32
+ "flex items-center rounded-lg has-aria-invalid:border-destructive has-aria-invalid:ring-3 has-aria-invalid:ring-destructive/20 dark:has-aria-invalid:ring-destructive/40",
33
+ className
34
+ ),
35
+ ...props
36
+ }
37
+ );
38
+ }
39
+ function InputOTPSlot({
40
+ index,
41
+ className,
42
+ ...props
43
+ }) {
44
+ const inputOTPContext = React.useContext(OTPInputContext);
45
+ const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {};
46
+ return /* @__PURE__ */ jsxs(
47
+ "div",
48
+ {
49
+ "data-slot": "input-otp-slot",
50
+ "data-active": isActive,
51
+ className: cn(
52
+ "relative flex size-8 items-center justify-center border-y border-r border-input text-sm transition-all outline-none first:rounded-l-lg first:border-l last:rounded-r-lg aria-invalid:border-destructive data-[active=true]:z-10 data-[active=true]:border-ring data-[active=true]:ring-3 data-[active=true]:ring-ring/50 data-[active=true]:aria-invalid:border-destructive data-[active=true]:aria-invalid:ring-destructive/20 dark:bg-input/30 dark:data-[active=true]:aria-invalid:ring-destructive/40",
53
+ className
54
+ ),
55
+ ...props,
56
+ children: [
57
+ char,
58
+ hasFakeCaret && /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ jsx("div", { className: "h-4 w-px animate-caret-blink bg-foreground duration-1000" }) })
59
+ ]
60
+ }
61
+ );
62
+ }
63
+ function InputOTPSeparator({ ...props }) {
64
+ return /* @__PURE__ */ jsx(
65
+ "div",
66
+ {
67
+ "data-slot": "input-otp-separator",
68
+ className: "flex items-center [&_svg:not([class*='size-'])]:size-4",
69
+ role: "separator",
70
+ ...props,
71
+ children: /* @__PURE__ */ jsx(
72
+ MinusIcon,
73
+ {}
74
+ )
75
+ }
76
+ );
77
+ }
78
+
79
+ export { InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot };
@@ -0,0 +1,237 @@
1
+ import { cn } from './chunk-U7N2A7A3.js';
2
+ import { Menu } from '@base-ui/react/menu';
3
+ import { ChevronRightIcon, CheckIcon } from 'lucide-react';
4
+ import { jsx, jsxs } from 'react/jsx-runtime';
5
+
6
+ function DropdownMenu({ ...props }) {
7
+ return /* @__PURE__ */ jsx(Menu.Root, { "data-slot": "dropdown-menu", ...props });
8
+ }
9
+ function DropdownMenuPortal({ ...props }) {
10
+ return /* @__PURE__ */ jsx(Menu.Portal, { "data-slot": "dropdown-menu-portal", ...props });
11
+ }
12
+ function DropdownMenuTrigger({ ...props }) {
13
+ return /* @__PURE__ */ jsx(Menu.Trigger, { "data-slot": "dropdown-menu-trigger", ...props });
14
+ }
15
+ function DropdownMenuContent({
16
+ align = "start",
17
+ alignOffset = 0,
18
+ side = "bottom",
19
+ sideOffset = 4,
20
+ className,
21
+ ...props
22
+ }) {
23
+ return /* @__PURE__ */ jsx(Menu.Portal, { children: /* @__PURE__ */ jsx(
24
+ Menu.Positioner,
25
+ {
26
+ className: "isolate z-50 outline-none",
27
+ align,
28
+ alignOffset,
29
+ side,
30
+ sideOffset,
31
+ children: /* @__PURE__ */ jsx(
32
+ Menu.Popup,
33
+ {
34
+ "data-slot": "dropdown-menu-content",
35
+ className: cn("z-50 max-h-(--available-height) w-(--anchor-width) min-w-32 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:overflow-hidden data-closed:fade-out-0 data-closed:zoom-out-95", className),
36
+ ...props
37
+ }
38
+ )
39
+ }
40
+ ) });
41
+ }
42
+ function DropdownMenuGroup({ ...props }) {
43
+ return /* @__PURE__ */ jsx(Menu.Group, { "data-slot": "dropdown-menu-group", ...props });
44
+ }
45
+ function DropdownMenuLabel({
46
+ className,
47
+ inset,
48
+ ...props
49
+ }) {
50
+ return /* @__PURE__ */ jsx(
51
+ Menu.GroupLabel,
52
+ {
53
+ "data-slot": "dropdown-menu-label",
54
+ "data-inset": inset,
55
+ className: cn(
56
+ "px-1.5 py-1 text-xs font-medium text-muted-foreground data-inset:pl-7",
57
+ className
58
+ ),
59
+ ...props
60
+ }
61
+ );
62
+ }
63
+ function DropdownMenuItem({
64
+ className,
65
+ inset,
66
+ variant = "default",
67
+ ...props
68
+ }) {
69
+ return /* @__PURE__ */ jsx(
70
+ Menu.Item,
71
+ {
72
+ "data-slot": "dropdown-menu-item",
73
+ "data-inset": inset,
74
+ "data-variant": variant,
75
+ className: cn(
76
+ "group/dropdown-menu-item relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive",
77
+ className
78
+ ),
79
+ ...props
80
+ }
81
+ );
82
+ }
83
+ function DropdownMenuSub({ ...props }) {
84
+ return /* @__PURE__ */ jsx(Menu.SubmenuRoot, { "data-slot": "dropdown-menu-sub", ...props });
85
+ }
86
+ function DropdownMenuSubTrigger({
87
+ className,
88
+ inset,
89
+ children,
90
+ ...props
91
+ }) {
92
+ return /* @__PURE__ */ jsxs(
93
+ Menu.SubmenuTrigger,
94
+ {
95
+ "data-slot": "dropdown-menu-sub-trigger",
96
+ "data-inset": inset,
97
+ className: cn(
98
+ "flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-popup-open:bg-accent data-popup-open:text-accent-foreground data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
99
+ className
100
+ ),
101
+ ...props,
102
+ children: [
103
+ children,
104
+ /* @__PURE__ */ jsx(ChevronRightIcon, { className: "ml-auto" })
105
+ ]
106
+ }
107
+ );
108
+ }
109
+ function DropdownMenuSubContent({
110
+ align = "start",
111
+ alignOffset = -3,
112
+ side = "right",
113
+ sideOffset = 0,
114
+ className,
115
+ ...props
116
+ }) {
117
+ return /* @__PURE__ */ jsx(
118
+ DropdownMenuContent,
119
+ {
120
+ "data-slot": "dropdown-menu-sub-content",
121
+ className: cn("w-auto min-w-[96px] rounded-lg bg-popover p-1 text-popover-foreground shadow-lg ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className),
122
+ align,
123
+ alignOffset,
124
+ side,
125
+ sideOffset,
126
+ ...props
127
+ }
128
+ );
129
+ }
130
+ function DropdownMenuCheckboxItem({
131
+ className,
132
+ children,
133
+ checked,
134
+ inset,
135
+ ...props
136
+ }) {
137
+ return /* @__PURE__ */ jsxs(
138
+ Menu.CheckboxItem,
139
+ {
140
+ "data-slot": "dropdown-menu-checkbox-item",
141
+ "data-inset": inset,
142
+ className: cn(
143
+ "relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
144
+ className
145
+ ),
146
+ checked,
147
+ ...props,
148
+ children: [
149
+ /* @__PURE__ */ jsx(
150
+ "span",
151
+ {
152
+ className: "pointer-events-none absolute right-2 flex items-center justify-center",
153
+ "data-slot": "dropdown-menu-checkbox-item-indicator",
154
+ children: /* @__PURE__ */ jsx(Menu.CheckboxItemIndicator, { children: /* @__PURE__ */ jsx(
155
+ CheckIcon,
156
+ {}
157
+ ) })
158
+ }
159
+ ),
160
+ children
161
+ ]
162
+ }
163
+ );
164
+ }
165
+ function DropdownMenuRadioGroup({ ...props }) {
166
+ return /* @__PURE__ */ jsx(
167
+ Menu.RadioGroup,
168
+ {
169
+ "data-slot": "dropdown-menu-radio-group",
170
+ ...props
171
+ }
172
+ );
173
+ }
174
+ function DropdownMenuRadioItem({
175
+ className,
176
+ children,
177
+ inset,
178
+ ...props
179
+ }) {
180
+ return /* @__PURE__ */ jsxs(
181
+ Menu.RadioItem,
182
+ {
183
+ "data-slot": "dropdown-menu-radio-item",
184
+ "data-inset": inset,
185
+ className: cn(
186
+ "relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
187
+ className
188
+ ),
189
+ ...props,
190
+ children: [
191
+ /* @__PURE__ */ jsx(
192
+ "span",
193
+ {
194
+ className: "pointer-events-none absolute right-2 flex items-center justify-center",
195
+ "data-slot": "dropdown-menu-radio-item-indicator",
196
+ children: /* @__PURE__ */ jsx(Menu.RadioItemIndicator, { children: /* @__PURE__ */ jsx(
197
+ CheckIcon,
198
+ {}
199
+ ) })
200
+ }
201
+ ),
202
+ children
203
+ ]
204
+ }
205
+ );
206
+ }
207
+ function DropdownMenuSeparator({
208
+ className,
209
+ ...props
210
+ }) {
211
+ return /* @__PURE__ */ jsx(
212
+ Menu.Separator,
213
+ {
214
+ "data-slot": "dropdown-menu-separator",
215
+ className: cn("-mx-1 my-1 h-px bg-border", className),
216
+ ...props
217
+ }
218
+ );
219
+ }
220
+ function DropdownMenuShortcut({
221
+ className,
222
+ ...props
223
+ }) {
224
+ return /* @__PURE__ */ jsx(
225
+ "span",
226
+ {
227
+ "data-slot": "dropdown-menu-shortcut",
228
+ className: cn(
229
+ "ml-auto text-xs tracking-widest text-muted-foreground group-focus/dropdown-menu-item:text-accent-foreground",
230
+ className
231
+ ),
232
+ ...props
233
+ }
234
+ );
235
+ }
236
+
237
+ export { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger };
@@ -0,0 +1,95 @@
1
+ import { cn } from './chunk-U7N2A7A3.js';
2
+ import { jsx } from 'react/jsx-runtime';
3
+
4
+ function Card({
5
+ className,
6
+ size = "default",
7
+ ...props
8
+ }) {
9
+ return /* @__PURE__ */ jsx(
10
+ "div",
11
+ {
12
+ "data-slot": "card",
13
+ "data-size": size,
14
+ className: cn(
15
+ "group/card flex flex-col gap-(--card-spacing) overflow-hidden rounded-xl bg-card py-(--card-spacing) text-sm text-card-foreground ring-1 ring-foreground/10 [--card-spacing:--spacing(4)] has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(3)] data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl",
16
+ className
17
+ ),
18
+ ...props
19
+ }
20
+ );
21
+ }
22
+ function CardHeader({ className, ...props }) {
23
+ return /* @__PURE__ */ jsx(
24
+ "div",
25
+ {
26
+ "data-slot": "card-header",
27
+ className: cn(
28
+ "group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-(--card-spacing) has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-(--card-spacing)",
29
+ className
30
+ ),
31
+ ...props
32
+ }
33
+ );
34
+ }
35
+ function CardTitle({ className, ...props }) {
36
+ return /* @__PURE__ */ jsx(
37
+ "div",
38
+ {
39
+ "data-slot": "card-title",
40
+ className: cn(
41
+ "text-base leading-snug font-medium group-data-[size=sm]/card:text-sm",
42
+ className
43
+ ),
44
+ ...props
45
+ }
46
+ );
47
+ }
48
+ function CardDescription({ className, ...props }) {
49
+ return /* @__PURE__ */ jsx(
50
+ "div",
51
+ {
52
+ "data-slot": "card-description",
53
+ className: cn("text-sm text-muted-foreground", className),
54
+ ...props
55
+ }
56
+ );
57
+ }
58
+ function CardAction({ className, ...props }) {
59
+ return /* @__PURE__ */ jsx(
60
+ "div",
61
+ {
62
+ "data-slot": "card-action",
63
+ className: cn(
64
+ "col-start-2 row-span-2 row-start-1 self-start justify-self-end",
65
+ className
66
+ ),
67
+ ...props
68
+ }
69
+ );
70
+ }
71
+ function CardContent({ className, ...props }) {
72
+ return /* @__PURE__ */ jsx(
73
+ "div",
74
+ {
75
+ "data-slot": "card-content",
76
+ className: cn("px-(--card-spacing)", className),
77
+ ...props
78
+ }
79
+ );
80
+ }
81
+ function CardFooter({ className, ...props }) {
82
+ return /* @__PURE__ */ jsx(
83
+ "div",
84
+ {
85
+ "data-slot": "card-footer",
86
+ className: cn(
87
+ "flex items-center rounded-b-xl border-t bg-muted/50 p-(--card-spacing)",
88
+ className
89
+ ),
90
+ ...props
91
+ }
92
+ );
93
+ }
94
+
95
+ export { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle };
@@ -0,0 +1,18 @@
1
+ import { cn } from './chunk-U7N2A7A3.js';
2
+ import { jsx } from 'react/jsx-runtime';
3
+
4
+ function Textarea({ className, ...props }) {
5
+ return /* @__PURE__ */ jsx(
6
+ "textarea",
7
+ {
8
+ "data-slot": "textarea",
9
+ className: cn(
10
+ "flex field-sizing-content min-h-16 w-full rounded-lg border border-input bg-transparent px-2.5 py-2 text-base transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
11
+ className
12
+ ),
13
+ ...props
14
+ }
15
+ );
16
+ }
17
+
18
+ export { Textarea };
@@ -0,0 +1,24 @@
1
+ import { cn } from './chunk-U7N2A7A3.js';
2
+ import { Separator as Separator$1 } from '@base-ui/react/separator';
3
+ import { jsx } from 'react/jsx-runtime';
4
+
5
+ function Separator({
6
+ className,
7
+ orientation = "horizontal",
8
+ ...props
9
+ }) {
10
+ return /* @__PURE__ */ jsx(
11
+ Separator$1,
12
+ {
13
+ "data-slot": "separator",
14
+ orientation,
15
+ className: cn(
16
+ "shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch",
17
+ className
18
+ ),
19
+ ...props
20
+ }
21
+ );
22
+ }
23
+
24
+ export { Separator };
@@ -0,0 +1,28 @@
1
+ // src/lib/contrast.ts
2
+ function parseHex(hex) {
3
+ let h = hex.trim().replace(/^#/, "");
4
+ if (h.length === 3) h = h[0] + h[0] + h[1] + h[1] + h[2] + h[2];
5
+ if (!/^[0-9a-fA-F]{6}$/.test(h)) {
6
+ throw new Error(`Invalid hex color: ${hex}`);
7
+ }
8
+ return [
9
+ parseInt(h.slice(0, 2), 16),
10
+ parseInt(h.slice(2, 4), 16),
11
+ parseInt(h.slice(4, 6), 16)
12
+ ];
13
+ }
14
+ function relativeLuminance(hex) {
15
+ const [r, g, b] = parseHex(hex).map((channel) => {
16
+ const c = channel / 255;
17
+ return c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
18
+ });
19
+ return 0.2126 * r + 0.7152 * g + 0.0722 * b;
20
+ }
21
+ function contrastRatio(a, b) {
22
+ const l1 = relativeLuminance(a);
23
+ const l2 = relativeLuminance(b);
24
+ const [hi, lo] = l1 >= l2 ? [l1, l2] : [l2, l1];
25
+ return (hi + 0.05) / (lo + 0.05);
26
+ }
27
+
28
+ export { contrastRatio, relativeLuminance };
@@ -0,0 +1,20 @@
1
+ import { cn } from './chunk-U7N2A7A3.js';
2
+ import { Input as Input$1 } from '@base-ui/react/input';
3
+ import { jsx } from 'react/jsx-runtime';
4
+
5
+ function Input({ className, type, ...props }) {
6
+ return /* @__PURE__ */ jsx(
7
+ Input$1,
8
+ {
9
+ type,
10
+ "data-slot": "input",
11
+ className: cn(
12
+ "h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
13
+ className
14
+ ),
15
+ ...props
16
+ }
17
+ );
18
+ }
19
+
20
+ export { Input };