@evinvest/uikit 0.19.0 → 0.20.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 (267) hide show
  1. package/README.md +17 -5
  2. package/dist/components/accordion.js +136 -0
  3. package/dist/components/accordion.js.map +1 -0
  4. package/dist/components/alert-dialog.js +175 -0
  5. package/dist/components/alert-dialog.js.map +1 -0
  6. package/dist/components/alert.js +49 -0
  7. package/dist/components/alert.js.map +1 -0
  8. package/dist/components/avatar.js +54 -0
  9. package/dist/components/avatar.js.map +1 -0
  10. package/dist/components/badge.js +25 -0
  11. package/dist/components/badge.js.map +1 -0
  12. package/dist/components/band.js +75 -0
  13. package/dist/components/band.js.map +1 -0
  14. package/dist/components/breadcrumb.js +132 -0
  15. package/dist/components/breadcrumb.js.map +1 -0
  16. package/dist/components/button-group.js +61 -0
  17. package/dist/components/button-group.js.map +1 -0
  18. package/dist/components/button.js +55 -0
  19. package/dist/components/button.js.map +1 -0
  20. package/dist/components/calendar.js +226 -0
  21. package/dist/components/calendar.js.map +1 -0
  22. package/dist/components/card.js +98 -0
  23. package/dist/components/card.js.map +1 -0
  24. package/dist/components/carousel.js +262 -0
  25. package/dist/components/carousel.js.map +1 -0
  26. package/dist/components/chart.js +151 -0
  27. package/dist/components/chart.js.map +1 -0
  28. package/dist/components/checkbox.js +68 -0
  29. package/dist/components/checkbox.js.map +1 -0
  30. package/dist/components/collapsible.js +60 -0
  31. package/dist/components/collapsible.js.map +1 -0
  32. package/dist/components/command.js +274 -0
  33. package/dist/components/command.js.map +1 -0
  34. package/dist/components/container.js +18 -0
  35. package/dist/components/container.js.map +1 -0
  36. package/dist/components/context-menu.js +337 -0
  37. package/dist/components/context-menu.js.map +1 -0
  38. package/dist/components/date-time-picker.js +301 -0
  39. package/dist/components/date-time-picker.js.map +1 -0
  40. package/dist/components/dialog.js +207 -0
  41. package/dist/components/dialog.js.map +1 -0
  42. package/dist/components/drawer.js +351 -0
  43. package/dist/components/drawer.js.map +1 -0
  44. package/dist/components/dropdown-menu.js +356 -0
  45. package/dist/components/dropdown-menu.js.map +1 -0
  46. package/dist/components/empty.js +91 -0
  47. package/dist/components/empty.js.map +1 -0
  48. package/dist/components/field-context.js +30 -0
  49. package/dist/components/field-context.js.map +1 -0
  50. package/dist/components/field.js +216 -0
  51. package/dist/components/field.js.map +1 -0
  52. package/dist/components/footer.js +89 -0
  53. package/dist/components/footer.js.map +1 -0
  54. package/dist/components/form.js +101 -0
  55. package/dist/components/form.js.map +1 -0
  56. package/dist/components/hover-card.js +90 -0
  57. package/dist/components/hover-card.js.map +1 -0
  58. package/dist/components/info-tip.js +161 -0
  59. package/dist/components/info-tip.js.map +1 -0
  60. package/dist/components/input-group.js +124 -0
  61. package/dist/components/input-group.js.map +1 -0
  62. package/dist/components/input-otp.js +120 -0
  63. package/dist/components/input-otp.js.map +1 -0
  64. package/dist/components/input.js +26 -0
  65. package/dist/components/input.js.map +1 -0
  66. package/dist/components/item.js +167 -0
  67. package/dist/components/item.js.map +1 -0
  68. package/dist/components/kbd.js +29 -0
  69. package/dist/components/kbd.js.map +1 -0
  70. package/dist/components/label.js +11 -0
  71. package/dist/components/label.js.map +1 -0
  72. package/dist/components/logo.js +41 -0
  73. package/dist/components/logo.js.map +1 -0
  74. package/dist/components/menubar.js +330 -0
  75. package/dist/components/menubar.js.map +1 -0
  76. package/dist/components/native-select.js +62 -0
  77. package/dist/components/native-select.js.map +1 -0
  78. package/dist/components/navigation-menu.js +204 -0
  79. package/dist/components/navigation-menu.js.map +1 -0
  80. package/dist/components/pagination.js +138 -0
  81. package/dist/components/pagination.js.map +1 -0
  82. package/dist/components/popover.js +104 -0
  83. package/dist/components/popover.js.map +1 -0
  84. package/dist/components/progress.js +30 -0
  85. package/dist/components/progress.js.map +1 -0
  86. package/dist/components/radio-group.js +113 -0
  87. package/dist/components/radio-group.js.map +1 -0
  88. package/dist/components/resizable.js +193 -0
  89. package/dist/components/resizable.js.map +1 -0
  90. package/dist/components/scroll-area.js +40 -0
  91. package/dist/components/scroll-area.js.map +1 -0
  92. package/dist/components/section-descriptor.js +88 -0
  93. package/dist/components/section-descriptor.js.map +1 -0
  94. package/dist/components/select-chevron.js +25 -0
  95. package/dist/components/select-chevron.js.map +1 -0
  96. package/dist/components/select.js +288 -0
  97. package/dist/components/select.js.map +1 -0
  98. package/dist/components/separator.js +31 -0
  99. package/dist/components/separator.js.map +1 -0
  100. package/dist/components/sheet.js +200 -0
  101. package/dist/components/sheet.js.map +1 -0
  102. package/dist/components/sidebar.js +326 -0
  103. package/dist/components/sidebar.js.map +1 -0
  104. package/dist/components/skeleton.js +18 -0
  105. package/dist/components/skeleton.js.map +1 -0
  106. package/dist/components/slider.js +138 -0
  107. package/dist/components/slider.js.map +1 -0
  108. package/dist/components/sonner.js +319 -0
  109. package/dist/components/sonner.js.map +1 -0
  110. package/dist/components/spinner.js +23 -0
  111. package/dist/components/spinner.js.map +1 -0
  112. package/dist/components/status-screen.js +145 -0
  113. package/dist/components/status-screen.js.map +1 -0
  114. package/dist/components/switch.js +54 -0
  115. package/dist/components/switch.js.map +1 -0
  116. package/dist/components/table.js +124 -0
  117. package/dist/components/table.js.map +1 -0
  118. package/dist/components/tabs.js +133 -0
  119. package/dist/components/tabs.js.map +1 -0
  120. package/dist/components/terminal.js +206 -0
  121. package/dist/components/terminal.js.map +1 -0
  122. package/dist/components/textarea.js +22 -0
  123. package/dist/components/textarea.js.map +1 -0
  124. package/dist/components/toggle-group.js +105 -0
  125. package/dist/components/toggle-group.js.map +1 -0
  126. package/dist/components/toggle.js +53 -0
  127. package/dist/components/toggle.js.map +1 -0
  128. package/dist/components/tooltip.js +102 -0
  129. package/dist/components/tooltip.js.map +1 -0
  130. package/dist/generated/accent.js +27 -0
  131. package/dist/generated/accent.js.map +1 -0
  132. package/dist/generated/accordion.js +13 -0
  133. package/dist/generated/accordion.js.map +1 -0
  134. package/dist/generated/alert-dialog.js +15 -0
  135. package/dist/generated/alert-dialog.js.map +1 -0
  136. package/dist/generated/alert.js +16 -0
  137. package/dist/generated/alert.js.map +1 -0
  138. package/dist/generated/avatar.js +9 -0
  139. package/dist/generated/avatar.js.map +1 -0
  140. package/dist/generated/badge.js +13 -0
  141. package/dist/generated/badge.js.map +1 -0
  142. package/dist/generated/band.js +39 -0
  143. package/dist/generated/band.js.map +1 -0
  144. package/dist/generated/breadcrumb.js +15 -0
  145. package/dist/generated/breadcrumb.js.map +1 -0
  146. package/dist/generated/button-group.js +14 -0
  147. package/dist/generated/button-group.js.map +1 -0
  148. package/dist/generated/button.js +30 -0
  149. package/dist/generated/button.js.map +1 -0
  150. package/dist/generated/calendar.js +29 -0
  151. package/dist/generated/calendar.js.map +1 -0
  152. package/dist/generated/card.js +17 -0
  153. package/dist/generated/card.js.map +1 -0
  154. package/dist/generated/carousel.js +31 -0
  155. package/dist/generated/carousel.js.map +1 -0
  156. package/dist/generated/chart.js +9 -0
  157. package/dist/generated/chart.js.map +1 -0
  158. package/dist/generated/checkbox.js +7 -0
  159. package/dist/generated/checkbox.js.map +1 -0
  160. package/dist/generated/command.js +27 -0
  161. package/dist/generated/command.js.map +1 -0
  162. package/dist/generated/container.js +5 -0
  163. package/dist/generated/container.js.map +1 -0
  164. package/dist/generated/context-menu.js +19 -0
  165. package/dist/generated/context-menu.js.map +1 -0
  166. package/dist/generated/date-time-picker.js +15 -0
  167. package/dist/generated/date-time-picker.js.map +1 -0
  168. package/dist/generated/dialog.js +17 -0
  169. package/dist/generated/dialog.js.map +1 -0
  170. package/dist/generated/drawer.js +26 -0
  171. package/dist/generated/drawer.js.map +1 -0
  172. package/dist/generated/dropdown-menu.js +21 -0
  173. package/dist/generated/dropdown-menu.js.map +1 -0
  174. package/dist/generated/empty.js +20 -0
  175. package/dist/generated/empty.js.map +1 -0
  176. package/dist/generated/field.js +33 -0
  177. package/dist/generated/field.js.map +1 -0
  178. package/dist/generated/focus.js +5 -0
  179. package/dist/generated/focus.js.map +1 -0
  180. package/dist/generated/form.js +11 -0
  181. package/dist/generated/form.js.map +1 -0
  182. package/dist/generated/hover-card.js +5 -0
  183. package/dist/generated/hover-card.js.map +1 -0
  184. package/dist/generated/input-group.js +29 -0
  185. package/dist/generated/input-group.js.map +1 -0
  186. package/dist/generated/input-otp.js +15 -0
  187. package/dist/generated/input-otp.js.map +1 -0
  188. package/dist/generated/input.js +11 -0
  189. package/dist/generated/input.js.map +1 -0
  190. package/dist/generated/item.js +40 -0
  191. package/dist/generated/item.js.map +1 -0
  192. package/dist/generated/kbd.js +7 -0
  193. package/dist/generated/kbd.js.map +1 -0
  194. package/dist/generated/label.js +5 -0
  195. package/dist/generated/label.js.map +1 -0
  196. package/dist/generated/menubar.js +27 -0
  197. package/dist/generated/menubar.js.map +1 -0
  198. package/dist/generated/navigation-menu.js +19 -0
  199. package/dist/generated/navigation-menu.js.map +1 -0
  200. package/dist/generated/popover.js +5 -0
  201. package/dist/generated/popover.js.map +1 -0
  202. package/dist/generated/progress.js +7 -0
  203. package/dist/generated/progress.js.map +1 -0
  204. package/dist/generated/radio-group.js +7 -0
  205. package/dist/generated/radio-group.js.map +1 -0
  206. package/dist/generated/resizable.js +11 -0
  207. package/dist/generated/resizable.js.map +1 -0
  208. package/dist/generated/scroll-area.js +14 -0
  209. package/dist/generated/scroll-area.js.map +1 -0
  210. package/dist/generated/select.js +15 -0
  211. package/dist/generated/select.js.map +1 -0
  212. package/dist/generated/separator.js +10 -0
  213. package/dist/generated/separator.js.map +1 -0
  214. package/dist/generated/sheet.js +25 -0
  215. package/dist/generated/sheet.js.map +1 -0
  216. package/dist/generated/sidebar.js +41 -0
  217. package/dist/generated/sidebar.js.map +1 -0
  218. package/dist/generated/skeleton.js +5 -0
  219. package/dist/generated/skeleton.js.map +1 -0
  220. package/dist/generated/slider.js +11 -0
  221. package/dist/generated/slider.js.map +1 -0
  222. package/dist/generated/sonner.js +30 -0
  223. package/dist/generated/sonner.js.map +1 -0
  224. package/dist/generated/switch.js +7 -0
  225. package/dist/generated/switch.js.map +1 -0
  226. package/dist/generated/table.js +21 -0
  227. package/dist/generated/table.js.map +1 -0
  228. package/dist/generated/tabs.js +11 -0
  229. package/dist/generated/tabs.js.map +1 -0
  230. package/dist/generated/terminal.js +70 -0
  231. package/dist/generated/terminal.js.map +1 -0
  232. package/dist/generated/textarea.js +11 -0
  233. package/dist/generated/textarea.js.map +1 -0
  234. package/dist/generated/toggle.js +18 -0
  235. package/dist/generated/toggle.js.map +1 -0
  236. package/dist/generated/tooltip.js +5 -0
  237. package/dist/generated/tooltip.js.map +1 -0
  238. package/dist/index.d.ts +43 -10
  239. package/dist/index.js +73 -8805
  240. package/dist/lib/cn.js +12 -0
  241. package/dist/lib/cn.js.map +1 -0
  242. package/dist/lib/focus.js +5 -0
  243. package/dist/lib/focus.js.map +1 -0
  244. package/dist/primitives/dismissable-layer.js +35 -0
  245. package/dist/primitives/dismissable-layer.js.map +1 -0
  246. package/dist/primitives/focus-scope.js +58 -0
  247. package/dist/primitives/focus-scope.js.map +1 -0
  248. package/dist/primitives/merge-refs.js +13 -0
  249. package/dist/primitives/merge-refs.js.map +1 -0
  250. package/dist/primitives/portal.js +19 -0
  251. package/dist/primitives/portal.js.map +1 -0
  252. package/dist/primitives/presence.js +45 -0
  253. package/dist/primitives/presence.js.map +1 -0
  254. package/dist/primitives/slot.js +39 -0
  255. package/dist/primitives/slot.js.map +1 -0
  256. package/dist/primitives/use-controllable-state.js +24 -0
  257. package/dist/primitives/use-controllable-state.js.map +1 -0
  258. package/dist/primitives/use-floating.js +128 -0
  259. package/dist/primitives/use-floating.js.map +1 -0
  260. package/dist/primitives/use-hover-intent.js +50 -0
  261. package/dist/primitives/use-hover-intent.js.map +1 -0
  262. package/dist/primitives/use-roving-focus.js +40 -0
  263. package/dist/primitives/use-roving-focus.js.map +1 -0
  264. package/dist/primitives/walk-elements.js +13 -0
  265. package/dist/primitives/walk-elements.js.map +1 -0
  266. package/package.json +5 -4
  267. package/dist/index.js.map +0 -1
@@ -0,0 +1,29 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cn } from "../lib/cn.js";
4
+ import { KBD_BASE, KBD_GROUP_BASE } from "../generated/kbd.js";
5
+ function Kbd({ className, ...props }) {
6
+ return /* @__PURE__ */ jsx(
7
+ "kbd",
8
+ {
9
+ "data-slot": "kbd",
10
+ className: cn(KBD_BASE, className),
11
+ ...props
12
+ }
13
+ );
14
+ }
15
+ function KbdGroup({ className, ...props }) {
16
+ return /* @__PURE__ */ jsx(
17
+ "kbd",
18
+ {
19
+ "data-slot": "kbd-group",
20
+ className: cn(KBD_GROUP_BASE, className),
21
+ ...props
22
+ }
23
+ );
24
+ }
25
+ export {
26
+ Kbd,
27
+ KbdGroup
28
+ };
29
+ //# sourceMappingURL=kbd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/kbd.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { KBD_BASE, KBD_GROUP_BASE } from \"../generated/kbd\";\n\nexport function Kbd({ className, ...props }: React.ComponentProps<\"kbd\">) {\n return (\n <kbd\n data-slot=\"kbd\"\n className={cn(KBD_BASE, className)}\n {...props}\n />\n );\n}\n\nexport function KbdGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <kbd\n data-slot=\"kbd-group\"\n className={cn(KBD_GROUP_BASE, className)}\n {...props}\n />\n );\n}\n"],"mappings":"AAMI;AANJ,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB,SAAS,UAAU,sBAAsB;AAElC,SAAS,IAAI,EAAE,WAAW,GAAG,MAAM,GAAgC;AACxE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,UAAU,SAAS;AAAA,MAChC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,SAAS,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC7E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,gBAAgB,SAAS;AAAA,MACtC,GAAG;AAAA;AAAA,EACN;AAEJ;","names":[]}
@@ -0,0 +1,11 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cn } from "../lib/cn.js";
4
+ import { LABEL_BASE } from "../generated/label.js";
5
+ function Label({ className, ...props }) {
6
+ return /* @__PURE__ */ jsx("label", { "data-slot": "label", className: cn(LABEL_BASE, className), ...props });
7
+ }
8
+ export {
9
+ Label
10
+ };
11
+ //# sourceMappingURL=label.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/label.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { LABEL_BASE } from \"../generated/label\";\n\nexport function Label({ className, ...props }: React.ComponentProps<\"label\">) {\n return <label data-slot=\"label\" className={cn(LABEL_BASE, className)} {...props} />;\n}\n"],"mappings":"AAKS;AALT,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB,SAAS,kBAAkB;AAEpB,SAAS,MAAM,EAAE,WAAW,GAAG,MAAM,GAAkC;AAC5E,SAAO,oBAAC,WAAM,aAAU,SAAQ,WAAW,GAAG,YAAY,SAAS,GAAI,GAAG,OAAO;AACnF;","names":[]}
@@ -0,0 +1,41 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cn } from "../lib/cn.js";
4
+ const maskStyle = {
5
+ backgroundColor: "currentColor",
6
+ maskImage: "var(--brand-mark)",
7
+ WebkitMaskImage: "var(--brand-mark)",
8
+ maskRepeat: "no-repeat",
9
+ WebkitMaskRepeat: "no-repeat",
10
+ maskPosition: "center",
11
+ WebkitMaskPosition: "center",
12
+ maskSize: "contain",
13
+ WebkitMaskSize: "contain",
14
+ // the ratio's fallback is what makes a missing mark *visible*: a masked span
15
+ // has no intrinsic size, so `h-N w-auto` without it is zero-width
16
+ aspectRatio: "var(--brand-aspect, 1)"
17
+ };
18
+ function Logo({ className, withBackground = false }) {
19
+ const mark = /* @__PURE__ */ jsx(
20
+ "span",
21
+ {
22
+ "data-slot": "logo",
23
+ "aria-hidden": true,
24
+ style: maskStyle,
25
+ className: cn("inline-block", withBackground ? "w-3/5 h-3/5" : className)
26
+ }
27
+ );
28
+ if (!withBackground) return mark;
29
+ return /* @__PURE__ */ jsx(
30
+ "span",
31
+ {
32
+ "data-slot": "logo-background",
33
+ className: cn("inline-flex items-center justify-center bg-brand", className),
34
+ children: mark
35
+ }
36
+ );
37
+ }
38
+ export {
39
+ Logo
40
+ };
41
+ //# sourceMappingURL=logo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/logo.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../lib/cn\";\n\n/**\n * The consumer's mark, painted as a CSS mask (`backgroundColor: currentColor` +\n * `maskImage`) so a monochrome lockup follows the surrounding text colour\n * instead of the artwork's baked-in fill. `withBackground` seats it on the brand\n * field, keeping a chip consistent with a favicon.\n *\n * The kit ships no artwork. The mark is a design token like every colour: the\n * consumer declares `--brand-mark` — a `url()` at its own asset — and\n * `--brand-aspect` in the same sheet it declares the palette in (see\n * `styles/tokens.css`). Undeclared, `maskImage` is invalid at computed-value time\n * and the span paints as a solid block: loud, and nobody else's logo.\n *\n * Decorative by design (`aria-hidden`): every real call site has the brand name\n * in adjacent text or on the wrapping link, and a mark announced twice is worse\n * than one announced once.\n */\nexport interface LogoProps {\n className?: string;\n withBackground?: boolean;\n}\n\nconst maskStyle: React.CSSProperties = {\n backgroundColor: \"currentColor\",\n maskImage: \"var(--brand-mark)\",\n WebkitMaskImage: \"var(--brand-mark)\",\n maskRepeat: \"no-repeat\",\n WebkitMaskRepeat: \"no-repeat\",\n maskPosition: \"center\",\n WebkitMaskPosition: \"center\",\n maskSize: \"contain\",\n WebkitMaskSize: \"contain\",\n // the ratio's fallback is what makes a missing mark *visible*: a masked span\n // has no intrinsic size, so `h-N w-auto` without it is zero-width\n aspectRatio: \"var(--brand-aspect, 1)\",\n};\n\nexport function Logo({ className, withBackground = false }: LogoProps) {\n const mark = (\n <span\n data-slot=\"logo\"\n aria-hidden\n style={maskStyle}\n className={cn(\"inline-block\", withBackground ? \"w-3/5 h-3/5\" : className)}\n />\n );\n\n if (!withBackground) return mark;\n\n return (\n <span\n data-slot=\"logo-background\"\n className={cn(\"inline-flex items-center justify-center bg-brand\", className)}\n >\n {mark}\n </span>\n );\n}\n"],"mappings":"AAyCI;AAzCJ,YAAY,WAAW;AACvB,SAAS,UAAU;AAuBnB,MAAM,YAAiC;AAAA,EACrC,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,UAAU;AAAA,EACV,gBAAgB;AAAA;AAAA;AAAA,EAGhB,aAAa;AACf;AAEO,SAAS,KAAK,EAAE,WAAW,iBAAiB,MAAM,GAAc;AACrE,QAAM,OACJ;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,eAAW;AAAA,MACX,OAAO;AAAA,MACP,WAAW,GAAG,gBAAgB,iBAAiB,gBAAgB,SAAS;AAAA;AAAA,EAC1E;AAGF,MAAI,CAAC,eAAgB,QAAO;AAE5B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,oDAAoD,SAAS;AAAA,MAE1E;AAAA;AAAA,EACH;AAEJ;","names":[]}
@@ -0,0 +1,330 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { cn } from "../lib/cn.js";
5
+ import { useControllableState } from "../primitives/use-controllable-state.js";
6
+ import { Portal } from "../primitives/portal.js";
7
+ import { useFloating } from "../primitives/use-floating.js";
8
+ import { useDismissableLayer } from "../primitives/dismissable-layer.js";
9
+ import { usePresence } from "../primitives/presence.js";
10
+ import { useRovingFocus } from "../primitives/use-roving-focus.js";
11
+ import { mergeRefs } from "../primitives/merge-refs.js";
12
+ import {
13
+ MENUBAR_CHECKBOX_ITEM,
14
+ MENUBAR_CONTENT,
15
+ MENUBAR_ITEM,
16
+ MENUBAR_ITEM_INDICATOR,
17
+ MENUBAR_LABEL,
18
+ MENUBAR_RADIO_ITEM,
19
+ MENUBAR_ROOT,
20
+ MENUBAR_SEPARATOR,
21
+ MENUBAR_SHORTCUT,
22
+ MENUBAR_SUB_CONTENT,
23
+ MENUBAR_SUB_TRIGGER,
24
+ MENUBAR_TRIGGER
25
+ } from "../generated/menubar.js";
26
+ const MenubarMenuContext = React.createContext(null);
27
+ function useMenu() {
28
+ const ctx = React.useContext(MenubarMenuContext);
29
+ if (!ctx) throw new Error("Menubar parts must be used within <MenubarMenu>");
30
+ return ctx;
31
+ }
32
+ const MenubarRadioGroupContext = React.createContext(null);
33
+ function Menubar({ className, ...props }) {
34
+ return /* @__PURE__ */ jsx(
35
+ "div",
36
+ {
37
+ "data-slot": "menubar",
38
+ role: "menubar",
39
+ className: cn(MENUBAR_ROOT, className),
40
+ ...props
41
+ }
42
+ );
43
+ }
44
+ function MenubarMenu({ open, defaultOpen = false, onOpenChange, children }) {
45
+ const [isOpen, setOpen] = useControllableState({
46
+ value: open,
47
+ defaultValue: defaultOpen,
48
+ onChange: onOpenChange
49
+ });
50
+ const triggerRef = React.useRef(null);
51
+ return /* @__PURE__ */ jsx(MenubarMenuContext.Provider, { value: { open: isOpen, setOpen, triggerRef }, children: /* @__PURE__ */ jsx("div", { "data-slot": "menubar-menu", className: "relative", children }) });
52
+ }
53
+ function MenubarTrigger({ className, onClick, ...props }) {
54
+ const { open, setOpen, triggerRef } = useMenu();
55
+ return /* @__PURE__ */ jsx(
56
+ "button",
57
+ {
58
+ ref: triggerRef,
59
+ type: "button",
60
+ "data-slot": "menubar-trigger",
61
+ "data-state": open ? "open" : "closed",
62
+ className: cn(MENUBAR_TRIGGER, className),
63
+ onClick: (e) => {
64
+ onClick?.(e);
65
+ setOpen(!open);
66
+ },
67
+ ...props
68
+ }
69
+ );
70
+ }
71
+ function MenubarContent({
72
+ className,
73
+ children,
74
+ align = "start",
75
+ ...props
76
+ }) {
77
+ const { open, setOpen, triggerRef } = useMenu();
78
+ const { isPresent, ref: presenceRef } = usePresence(open);
79
+ const { floatingRef, style, side } = useFloating({
80
+ anchorRef: triggerRef,
81
+ open,
82
+ side: "bottom",
83
+ align,
84
+ offset: 8
85
+ });
86
+ const dismissRef = useDismissableLayer({
87
+ enabled: open,
88
+ onDismiss: () => setOpen(false),
89
+ exclude: [triggerRef]
90
+ });
91
+ const items = React.Children.toArray(children);
92
+ const { onKeyDown } = useRovingFocus({ count: items.length, orientation: "vertical" });
93
+ if (!isPresent) return null;
94
+ return /* @__PURE__ */ jsx(Portal, { children: /* @__PURE__ */ jsx(
95
+ "div",
96
+ {
97
+ ref: mergeRefs(presenceRef, floatingRef, dismissRef),
98
+ "data-slot": "menubar-content",
99
+ "data-state": open ? "open" : "closed",
100
+ "data-side": side,
101
+ role: "menu",
102
+ style,
103
+ className: cn(MENUBAR_CONTENT, className),
104
+ onKeyDown,
105
+ ...props,
106
+ children
107
+ }
108
+ ) });
109
+ }
110
+ function MenubarGroup({ className, ...props }) {
111
+ return /* @__PURE__ */ jsx("div", { "data-slot": "menubar-group", role: "group", className, ...props });
112
+ }
113
+ function MenubarItem({
114
+ className,
115
+ inset,
116
+ variant = "neutral",
117
+ ...props
118
+ }) {
119
+ return /* @__PURE__ */ jsx(
120
+ "div",
121
+ {
122
+ "data-slot": "menubar-item",
123
+ "data-inset": inset,
124
+ "data-variant": variant,
125
+ role: "menuitem",
126
+ tabIndex: -1,
127
+ className: cn(MENUBAR_ITEM, className),
128
+ ...props
129
+ }
130
+ );
131
+ }
132
+ function MenubarCheckboxItem({
133
+ className,
134
+ children,
135
+ checked,
136
+ ...props
137
+ }) {
138
+ return /* @__PURE__ */ jsxs(
139
+ "div",
140
+ {
141
+ "data-slot": "menubar-checkbox-item",
142
+ role: "menuitemcheckbox",
143
+ "aria-checked": checked,
144
+ tabIndex: -1,
145
+ className: cn(MENUBAR_CHECKBOX_ITEM, className),
146
+ ...props,
147
+ children: [
148
+ /* @__PURE__ */ jsx("span", { className: MENUBAR_ITEM_INDICATOR, children: checked && /* @__PURE__ */ jsx(
149
+ "svg",
150
+ {
151
+ className: "size-4",
152
+ viewBox: "0 0 24 24",
153
+ fill: "none",
154
+ stroke: "currentColor",
155
+ strokeWidth: "2",
156
+ strokeLinecap: "round",
157
+ strokeLinejoin: "round",
158
+ children: /* @__PURE__ */ jsx("path", { d: "M20 6 9 17l-5-5" })
159
+ }
160
+ ) }),
161
+ children
162
+ ]
163
+ }
164
+ );
165
+ }
166
+ function MenubarRadioGroup({
167
+ value,
168
+ defaultValue = "",
169
+ onValueChange,
170
+ className,
171
+ children
172
+ }) {
173
+ const [current, setValue] = useControllableState({
174
+ value,
175
+ defaultValue,
176
+ onChange: onValueChange
177
+ });
178
+ return /* @__PURE__ */ jsx(MenubarRadioGroupContext.Provider, { value: { value: current, onValueChange: setValue }, children: /* @__PURE__ */ jsx("div", { "data-slot": "menubar-radio-group", role: "group", className, children }) });
179
+ }
180
+ function MenubarRadioItem({
181
+ className,
182
+ children,
183
+ value,
184
+ ...props
185
+ }) {
186
+ const ctx = React.useContext(MenubarRadioGroupContext);
187
+ const checked = ctx?.value === value;
188
+ return /* @__PURE__ */ jsxs(
189
+ "div",
190
+ {
191
+ "data-slot": "menubar-radio-item",
192
+ role: "menuitemradio",
193
+ "aria-checked": checked,
194
+ tabIndex: -1,
195
+ className: cn(MENUBAR_RADIO_ITEM, className),
196
+ onClick: () => ctx?.onValueChange(value),
197
+ ...props,
198
+ children: [
199
+ /* @__PURE__ */ jsx("span", { className: MENUBAR_ITEM_INDICATOR, children: checked && /* @__PURE__ */ jsx("svg", { className: "size-2 fill-current", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "10" }) }) }),
200
+ children
201
+ ]
202
+ }
203
+ );
204
+ }
205
+ function MenubarLabel({
206
+ className,
207
+ inset,
208
+ ...props
209
+ }) {
210
+ return /* @__PURE__ */ jsx(
211
+ "div",
212
+ {
213
+ "data-slot": "menubar-label",
214
+ "data-inset": inset,
215
+ className: cn(MENUBAR_LABEL, className),
216
+ ...props
217
+ }
218
+ );
219
+ }
220
+ function MenubarSeparator({ className, ...props }) {
221
+ return /* @__PURE__ */ jsx(
222
+ "div",
223
+ {
224
+ "data-slot": "menubar-separator",
225
+ role: "separator",
226
+ className: cn(MENUBAR_SEPARATOR, className),
227
+ ...props
228
+ }
229
+ );
230
+ }
231
+ function MenubarShortcut({ className, ...props }) {
232
+ return /* @__PURE__ */ jsx(
233
+ "span",
234
+ {
235
+ "data-slot": "menubar-shortcut",
236
+ className: cn(MENUBAR_SHORTCUT, className),
237
+ ...props
238
+ }
239
+ );
240
+ }
241
+ const MenubarSubContext = React.createContext(null);
242
+ function useSub() {
243
+ const ctx = React.useContext(MenubarSubContext);
244
+ if (!ctx) throw new Error("MenubarSub parts must be used within <MenubarSub>");
245
+ return ctx;
246
+ }
247
+ function MenubarSub({ open, defaultOpen = false, onOpenChange, children }) {
248
+ const [isOpen, setOpen] = useControllableState({
249
+ value: open,
250
+ defaultValue: defaultOpen,
251
+ onChange: onOpenChange
252
+ });
253
+ return /* @__PURE__ */ jsx(MenubarSubContext.Provider, { value: { open: isOpen, setOpen }, children: /* @__PURE__ */ jsx("div", { "data-slot": "menubar-sub", className: "relative", children }) });
254
+ }
255
+ function MenubarSubTrigger({
256
+ className,
257
+ inset,
258
+ children,
259
+ onClick,
260
+ ...props
261
+ }) {
262
+ const { open, setOpen } = useSub();
263
+ return /* @__PURE__ */ jsxs(
264
+ "div",
265
+ {
266
+ "data-slot": "menubar-sub-trigger",
267
+ "data-inset": inset,
268
+ "data-state": open ? "open" : "closed",
269
+ role: "menuitem",
270
+ tabIndex: -1,
271
+ className: cn(MENUBAR_SUB_TRIGGER, className),
272
+ onClick: (e) => {
273
+ onClick?.(e);
274
+ setOpen(!open);
275
+ },
276
+ ...props,
277
+ children: [
278
+ children,
279
+ /* @__PURE__ */ jsx(
280
+ "svg",
281
+ {
282
+ className: "ml-auto h-4 w-4",
283
+ viewBox: "0 0 24 24",
284
+ fill: "none",
285
+ stroke: "currentColor",
286
+ strokeWidth: "2",
287
+ strokeLinecap: "round",
288
+ strokeLinejoin: "round",
289
+ children: /* @__PURE__ */ jsx("path", { d: "m9 18 6-6-6-6" })
290
+ }
291
+ )
292
+ ]
293
+ }
294
+ );
295
+ }
296
+ function MenubarSubContent({ className, children, ...props }) {
297
+ const { open } = useSub();
298
+ const { isPresent, ref } = usePresence(open);
299
+ if (!isPresent) return null;
300
+ return /* @__PURE__ */ jsx(
301
+ "div",
302
+ {
303
+ ref,
304
+ "data-slot": "menubar-sub-content",
305
+ "data-state": open ? "open" : "closed",
306
+ role: "menu",
307
+ className: cn(MENUBAR_SUB_CONTENT, className),
308
+ ...props,
309
+ children
310
+ }
311
+ );
312
+ }
313
+ export {
314
+ Menubar,
315
+ MenubarCheckboxItem,
316
+ MenubarContent,
317
+ MenubarGroup,
318
+ MenubarItem,
319
+ MenubarLabel,
320
+ MenubarMenu,
321
+ MenubarRadioGroup,
322
+ MenubarRadioItem,
323
+ MenubarSeparator,
324
+ MenubarShortcut,
325
+ MenubarSub,
326
+ MenubarSubContent,
327
+ MenubarSubTrigger,
328
+ MenubarTrigger
329
+ };
330
+ //# sourceMappingURL=menubar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/menubar.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { useControllableState } from \"../primitives/use-controllable-state\";\nimport { Portal } from \"../primitives/portal\";\nimport { useFloating } from \"../primitives/use-floating\";\nimport { useDismissableLayer } from \"../primitives/dismissable-layer\";\nimport { usePresence } from \"../primitives/presence\";\nimport { useRovingFocus } from \"../primitives/use-roving-focus\";\nimport { mergeRefs } from \"../primitives/merge-refs\";\nimport {\n MENUBAR_CHECKBOX_ITEM,\n MENUBAR_CONTENT,\n MENUBAR_ITEM,\n MENUBAR_ITEM_INDICATOR,\n MENUBAR_LABEL,\n MENUBAR_RADIO_ITEM,\n MENUBAR_ROOT,\n MENUBAR_SEPARATOR,\n MENUBAR_SHORTCUT,\n MENUBAR_SUB_CONTENT,\n MENUBAR_SUB_TRIGGER,\n MENUBAR_TRIGGER,\n} from \"../generated/menubar\";\n\ninterface MenuCtx {\n open: boolean;\n setOpen: (open: boolean) => void;\n triggerRef: React.RefObject<HTMLButtonElement | null>;\n}\nconst MenubarMenuContext = React.createContext<MenuCtx | null>(null);\nfunction useMenu(): MenuCtx {\n const ctx = React.useContext(MenubarMenuContext);\n if (!ctx) throw new Error(\"Menubar parts must be used within <MenubarMenu>\");\n return ctx;\n}\n\nconst MenubarRadioGroupContext = React.createContext<{\n value: string;\n onValueChange: (value: string) => void;\n} | null>(null);\n\nexport function Menubar({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"menubar\"\n role=\"menubar\"\n className={cn(MENUBAR_ROOT, className)}\n {...props}\n />\n );\n}\n\nexport interface MenubarMenuProps {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n children?: React.ReactNode;\n}\n\nexport function MenubarMenu({ open, defaultOpen = false, onOpenChange, children }: MenubarMenuProps) {\n const [isOpen, setOpen] = useControllableState({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n const triggerRef = React.useRef<HTMLButtonElement | null>(null);\n return (\n <MenubarMenuContext.Provider value={{ open: isOpen, setOpen, triggerRef }}>\n <div data-slot=\"menubar-menu\" className=\"relative\">\n {children}\n </div>\n </MenubarMenuContext.Provider>\n );\n}\n\nexport function MenubarTrigger({ className, onClick, ...props }: React.ComponentProps<\"button\">) {\n const { open, setOpen, triggerRef } = useMenu();\n return (\n <button\n ref={triggerRef}\n type=\"button\"\n data-slot=\"menubar-trigger\"\n data-state={open ? \"open\" : \"closed\"}\n className={cn(MENUBAR_TRIGGER, className)}\n onClick={(e) => {\n onClick?.(e);\n setOpen(!open);\n }}\n {...props}\n />\n );\n}\n\nexport function MenubarContent({\n className,\n children,\n align = \"start\",\n ...props\n}: React.ComponentProps<\"div\"> & { align?: \"start\" | \"center\" | \"end\" }) {\n const { open, setOpen, triggerRef } = useMenu();\n const { isPresent, ref: presenceRef } = usePresence(open);\n const { floatingRef, style, side } = useFloating({\n anchorRef: triggerRef,\n open,\n side: \"bottom\",\n align,\n offset: 8,\n });\n const dismissRef = useDismissableLayer({\n enabled: open,\n onDismiss: () => setOpen(false),\n exclude: [triggerRef],\n });\n\n const items = React.Children.toArray(children);\n const { onKeyDown } = useRovingFocus({ count: items.length, orientation: \"vertical\" });\n\n if (!isPresent) return null;\n return (\n <Portal>\n <div\n ref={mergeRefs(presenceRef, floatingRef, dismissRef)}\n data-slot=\"menubar-content\"\n data-state={open ? \"open\" : \"closed\"}\n data-side={side}\n role=\"menu\"\n style={style}\n className={cn(MENUBAR_CONTENT, className)}\n onKeyDown={onKeyDown}\n {...props}\n >\n {children}\n </div>\n </Portal>\n );\n}\n\nexport function MenubarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div data-slot=\"menubar-group\" role=\"group\" className={className} {...props} />;\n}\n\nexport function MenubarItem({\n className,\n inset,\n variant = \"neutral\",\n ...props\n}: React.ComponentProps<\"div\"> & {\n inset?: boolean;\n variant?: \"neutral\" | \"destructive\";\n}) {\n return (\n <div\n data-slot=\"menubar-item\"\n data-inset={inset}\n data-variant={variant}\n role=\"menuitem\"\n tabIndex={-1}\n className={cn(MENUBAR_ITEM, className)}\n {...props}\n />\n );\n}\n\nexport function MenubarCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<\"div\"> & { checked?: boolean }) {\n return (\n <div\n data-slot=\"menubar-checkbox-item\"\n role=\"menuitemcheckbox\"\n aria-checked={checked}\n tabIndex={-1}\n className={cn(MENUBAR_CHECKBOX_ITEM, className)}\n {...props}\n >\n <span className={MENUBAR_ITEM_INDICATOR}>\n {checked && (\n <svg\n className=\"size-4\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n )}\n </span>\n {children}\n </div>\n );\n}\n\nexport interface MenubarRadioGroupProps {\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n className?: string;\n children?: React.ReactNode;\n}\n\nexport function MenubarRadioGroup({\n value,\n defaultValue = \"\",\n onValueChange,\n className,\n children,\n}: MenubarRadioGroupProps) {\n const [current, setValue] = useControllableState({\n value,\n defaultValue,\n onChange: onValueChange,\n });\n return (\n <MenubarRadioGroupContext.Provider value={{ value: current, onValueChange: setValue }}>\n <div data-slot=\"menubar-radio-group\" role=\"group\" className={className}>\n {children}\n </div>\n </MenubarRadioGroupContext.Provider>\n );\n}\n\nexport function MenubarRadioItem({\n className,\n children,\n value,\n ...props\n}: React.ComponentProps<\"div\"> & { value: string }) {\n const ctx = React.useContext(MenubarRadioGroupContext);\n const checked = ctx?.value === value;\n return (\n <div\n data-slot=\"menubar-radio-item\"\n role=\"menuitemradio\"\n aria-checked={checked}\n tabIndex={-1}\n className={cn(MENUBAR_RADIO_ITEM, className)}\n onClick={() => ctx?.onValueChange(value)}\n {...props}\n >\n <span className={MENUBAR_ITEM_INDICATOR}>\n {checked && (\n <svg className=\"size-2 fill-current\" viewBox=\"0 0 24 24\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n </svg>\n )}\n </span>\n {children}\n </div>\n );\n}\n\nexport function MenubarLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<\"div\"> & { inset?: boolean }) {\n return (\n <div\n data-slot=\"menubar-label\"\n data-inset={inset}\n className={cn(MENUBAR_LABEL, className)}\n {...props}\n />\n );\n}\n\nexport function MenubarSeparator({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"menubar-separator\"\n role=\"separator\"\n className={cn(MENUBAR_SEPARATOR, className)}\n {...props}\n />\n );\n}\n\nexport function MenubarShortcut({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"menubar-shortcut\"\n className={cn(MENUBAR_SHORTCUT, className)}\n {...props}\n />\n );\n}\n\ninterface SubCtx {\n open: boolean;\n setOpen: (open: boolean) => void;\n}\nconst MenubarSubContext = React.createContext<SubCtx | null>(null);\nfunction useSub(): SubCtx {\n const ctx = React.useContext(MenubarSubContext);\n if (!ctx) throw new Error(\"MenubarSub parts must be used within <MenubarSub>\");\n return ctx;\n}\n\nexport interface MenubarSubProps {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n children?: React.ReactNode;\n}\n\nexport function MenubarSub({ open, defaultOpen = false, onOpenChange, children }: MenubarSubProps) {\n const [isOpen, setOpen] = useControllableState({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n return (\n <MenubarSubContext.Provider value={{ open: isOpen, setOpen }}>\n <div data-slot=\"menubar-sub\" className=\"relative\">\n {children}\n </div>\n </MenubarSubContext.Provider>\n );\n}\n\nexport function MenubarSubTrigger({\n className,\n inset,\n children,\n onClick,\n ...props\n}: React.ComponentProps<\"div\"> & { inset?: boolean }) {\n const { open, setOpen } = useSub();\n return (\n <div\n data-slot=\"menubar-sub-trigger\"\n data-inset={inset}\n data-state={open ? \"open\" : \"closed\"}\n role=\"menuitem\"\n tabIndex={-1}\n className={cn(MENUBAR_SUB_TRIGGER, className)}\n onClick={(e) => {\n onClick?.(e);\n setOpen(!open);\n }}\n {...props}\n >\n {children}\n <svg\n className=\"ml-auto h-4 w-4\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n </div>\n );\n}\n\nexport function MenubarSubContent({ className, children, ...props }: React.ComponentProps<\"div\">) {\n const { open } = useSub();\n const { isPresent, ref } = usePresence(open);\n if (!isPresent) return null;\n return (\n <div\n ref={ref as React.RefObject<HTMLDivElement>}\n data-slot=\"menubar-sub-content\"\n data-state={open ? \"open\" : \"closed\"}\n role=\"menu\"\n className={cn(MENUBAR_SUB_CONTENT, className)}\n {...props}\n >\n {children}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,62 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { cn } from "../lib/cn.js";
5
+ import { nativeSelectSizeClasses } from "../generated/select.js";
6
+ import { useFieldControlId } from "./field-context.js";
7
+ import { SelectChevron } from "./select-chevron.js";
8
+ const NATIVE_SELECT = "border-input text-ink h-9 w-full min-w-0 appearance-none rounded-[var(--control-radius)] border bg-transparent py-1 pr-9 pl-3 text-base shadow-xs transition-[color,box-shadow] outline-none disabled:pointer-events-none disabled:cursor-not-allowed md:text-sm focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-accent-error/20 aria-invalid:border-accent-error has-[option[value='']:checked]:text-ink-soft [&_option]:bg-popover [&_option]:text-ink [&_optgroup]:bg-popover [&_optgroup]:text-ink-soft [color-scheme:var(--scheme,normal)]";
9
+ const NativeSelect = React.forwardRef(
10
+ function NativeSelect2({ className, wrapperClassName, size = "md", placeholder, id, children, value, defaultValue, ...props }, ref) {
11
+ const controlId = useFieldControlId(id);
12
+ const initial = value === void 0 && defaultValue === void 0 && placeholder !== void 0 ? "" : defaultValue;
13
+ return /* @__PURE__ */ jsxs(
14
+ "span",
15
+ {
16
+ "data-slot": "native-select-wrapper",
17
+ className: cn("relative inline-flex w-full has-[select:disabled]:opacity-50", wrapperClassName),
18
+ children: [
19
+ /* @__PURE__ */ jsxs(
20
+ "select",
21
+ {
22
+ ref,
23
+ id: controlId,
24
+ "data-slot": "native-select",
25
+ "data-size": size,
26
+ className: cn(NATIVE_SELECT, nativeSelectSizeClasses[size], className),
27
+ ...value !== void 0 ? { value } : {},
28
+ ...initial !== void 0 ? { defaultValue: initial } : {},
29
+ ...props,
30
+ children: [
31
+ placeholder !== void 0 && /* @__PURE__ */ jsx("option", { value: "", disabled: true, hidden: true, children: placeholder }),
32
+ children
33
+ ]
34
+ }
35
+ ),
36
+ /* @__PURE__ */ jsx(
37
+ SelectChevron,
38
+ {
39
+ className: cn(
40
+ "text-ink-soft pointer-events-none absolute top-1/2 right-3 size-4 -translate-y-1/2",
41
+ // keeps the arrow as far in from the edge as the large inset keeps the text
42
+ size === "lg" && "right-4"
43
+ )
44
+ }
45
+ )
46
+ ]
47
+ }
48
+ );
49
+ }
50
+ );
51
+ function NativeSelectOption(props) {
52
+ return /* @__PURE__ */ jsx("option", { "data-slot": "native-select-option", ...props });
53
+ }
54
+ function NativeSelectGroup(props) {
55
+ return /* @__PURE__ */ jsx("optgroup", { "data-slot": "native-select-group", ...props });
56
+ }
57
+ export {
58
+ NativeSelect,
59
+ NativeSelectGroup,
60
+ NativeSelectOption
61
+ };
62
+ //# sourceMappingURL=native-select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/native-select.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { nativeSelectSizeClasses, type NativeSelectSize } from \"../generated/select\";\nimport { useFieldControlId } from \"./field-context\";\nimport { SelectChevron } from \"./select-chevron\";\n\nexport type { NativeSelectSize };\n\n/**\n * A real `<select>` wearing the kit's control: the form posts its `name` with no\n * script at all, and the popup is the platform's own (keyboard, type-ahead, the\n * mobile picker). `Select` is the scripted combobox for everything a native\n * popup cannot draw; this is for a form that has to submit before hydration.\n *\n * A component of its own rather than a `native` switch on `Select`: none of\n * `SelectTrigger` / `SelectValue` / `SelectContent` has a native counterpart, so\n * a flag would leave most of the compound API meaning nothing in one mode.\n *\n * `className` styles the `<select>`; `wrapperClassName` the box that holds it\n * and the arrow — that box is what a layout sizes. It is `w-full` like `Input`,\n * so the two line up in a form column; narrow it with `wrapperClassName`.\n */\nexport interface NativeSelectProps\n extends Omit<React.ComponentPropsWithoutRef<\"select\">, \"size\" | \"multiple\"> {\n size?: NativeSelectSize;\n /** An empty, unpickable first option shown until a value is chosen. */\n placeholder?: string;\n wrapperClassName?: string;\n}\n\n// `appearance-none` drops the OS arrow. The popup is drawn by the platform:\n// the option colours reach it where the platform honours them, and `--scheme`\n// (a palette's polarity, `light` or `dark`) picks the platform's own dark\n// menu where it does not. The placeholder is the empty option being the\n// checked one — CSS can see that without script.\nconst NATIVE_SELECT =\n \"border-input text-ink h-9 w-full min-w-0 appearance-none rounded-[var(--control-radius)] border bg-transparent py-1 pr-9 pl-3 text-base shadow-xs transition-[color,box-shadow] outline-none disabled:pointer-events-none disabled:cursor-not-allowed md:text-sm focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-accent-error/20 aria-invalid:border-accent-error has-[option[value='']:checked]:text-ink-soft [&_option]:bg-popover [&_option]:text-ink [&_optgroup]:bg-popover [&_optgroup]:text-ink-soft [color-scheme:var(--scheme,normal)]\";\n\nexport const NativeSelect = React.forwardRef<HTMLSelectElement, NativeSelectProps>(\n function NativeSelect(\n { className, wrapperClassName, size = \"md\", placeholder, id, children, value, defaultValue, ...props },\n ref,\n ) {\n const controlId = useFieldControlId(id);\n // Without a checked option the browser picks the first enabled one, which\n // would skip a disabled placeholder; start on it unless told otherwise.\n const initial = value === undefined && defaultValue === undefined && placeholder !== undefined ? \"\" : defaultValue;\n return (\n <span\n data-slot=\"native-select-wrapper\"\n className={cn(\"relative inline-flex w-full has-[select:disabled]:opacity-50\", wrapperClassName)}\n >\n <select\n ref={ref}\n id={controlId}\n data-slot=\"native-select\"\n data-size={size}\n className={cn(NATIVE_SELECT, nativeSelectSizeClasses[size], className)}\n {...(value !== undefined ? { value } : {})}\n {...(initial !== undefined ? { defaultValue: initial } : {})}\n {...props}\n >\n {placeholder !== undefined && (\n <option value=\"\" disabled hidden>\n {placeholder}\n </option>\n )}\n {children}\n </select>\n <SelectChevron\n className={cn(\n \"text-ink-soft pointer-events-none absolute top-1/2 right-3 size-4 -translate-y-1/2\",\n // keeps the arrow as far in from the edge as the large inset keeps the text\n size === \"lg\" && \"right-4\",\n )}\n />\n </span>\n );\n },\n);\n\nexport function NativeSelectOption(props: React.ComponentProps<\"option\">) {\n return <option data-slot=\"native-select-option\" {...props} />;\n}\n\nexport function NativeSelectGroup(props: React.ComponentProps<\"optgroup\">) {\n return <optgroup data-slot=\"native-select-group\" {...props} />;\n}\n"],"mappings":";AAsDQ,SAWI,KAXJ;AApDR,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB,SAAS,+BAAsD;AAC/D,SAAS,yBAAyB;AAClC,SAAS,qBAAqB;AA+B9B,MAAM,gBACJ;AAEK,MAAM,eAAe,MAAM;AAAA,EAChC,SAASA,cACP,EAAE,WAAW,kBAAkB,OAAO,MAAM,aAAa,IAAI,UAAU,OAAO,cAAc,GAAG,MAAM,GACrG,KACA;AACA,UAAM,YAAY,kBAAkB,EAAE;AAGtC,UAAM,UAAU,UAAU,UAAa,iBAAiB,UAAa,gBAAgB,SAAY,KAAK;AACtG,WACE;AAAA,MAAC;AAAA;AAAA,QACC,aAAU;AAAA,QACV,WAAW,GAAG,gEAAgE,gBAAgB;AAAA,QAE9F;AAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,IAAI;AAAA,cACJ,aAAU;AAAA,cACV,aAAW;AAAA,cACX,WAAW,GAAG,eAAe,wBAAwB,IAAI,GAAG,SAAS;AAAA,cACpE,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC;AAAA,cACvC,GAAI,YAAY,SAAY,EAAE,cAAc,QAAQ,IAAI,CAAC;AAAA,cACzD,GAAG;AAAA,cAEH;AAAA,gCAAgB,UACf,oBAAC,YAAO,OAAM,IAAG,UAAQ,MAAC,QAAM,MAC7B,uBACH;AAAA,gBAED;AAAA;AAAA;AAAA,UACH;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA;AAAA,gBAEA,SAAS,QAAQ;AAAA,cACnB;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEO,SAAS,mBAAmB,OAAuC;AACxE,SAAO,oBAAC,YAAO,aAAU,wBAAwB,GAAG,OAAO;AAC7D;AAEO,SAAS,kBAAkB,OAAyC;AACzE,SAAO,oBAAC,cAAS,aAAU,uBAAuB,GAAG,OAAO;AAC9D;","names":["NativeSelect"]}