@franco_roura/module-01 0.0.0-stage → 1.0.1

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 (222) hide show
  1. package/LICENSE-APACHE +202 -0
  2. package/LICENSE-MIT +21 -0
  3. package/README.md +64 -2
  4. package/dist/charts.d.ts +3 -0
  5. package/dist/charts.js +3 -0
  6. package/dist/components/alert-dialog.d.ts +19 -0
  7. package/dist/components/alert-dialog.js +101 -0
  8. package/dist/components/alert-dialog.js.map +1 -0
  9. package/dist/components/amount.d.ts +24 -0
  10. package/dist/components/amount.js +27 -0
  11. package/dist/components/amount.js.map +1 -0
  12. package/dist/components/appearance-pickers.d.ts +9 -0
  13. package/dist/components/appearance-pickers.js +65 -0
  14. package/dist/components/appearance-pickers.js.map +1 -0
  15. package/dist/components/badge.d.ts +10 -0
  16. package/dist/components/badge.js +28 -0
  17. package/dist/components/badge.js.map +1 -0
  18. package/dist/components/budget-meter.d.ts +18 -0
  19. package/dist/components/budget-meter.js +38 -0
  20. package/dist/components/budget-meter.js.map +1 -0
  21. package/dist/components/button.d.ts +13 -0
  22. package/dist/components/button.js +54 -0
  23. package/dist/components/button.js.map +1 -0
  24. package/dist/components/calendar.d.ts +7 -0
  25. package/dist/components/calendar.js +52 -0
  26. package/dist/components/calendar.js.map +1 -0
  27. package/dist/components/category-icon.d.ts +33 -0
  28. package/dist/components/category-icon.js +49 -0
  29. package/dist/components/category-icon.js.map +1 -0
  30. package/dist/components/chart.d.ts +44 -0
  31. package/dist/components/chart.js +147 -0
  32. package/dist/components/chart.js.map +1 -0
  33. package/dist/components/charts.d.ts +52 -0
  34. package/dist/components/charts.js +482 -0
  35. package/dist/components/charts.js.map +1 -0
  36. package/dist/components/checkbox.d.ts +5 -0
  37. package/dist/components/checkbox.js +21 -0
  38. package/dist/components/checkbox.js.map +1 -0
  39. package/dist/components/combobox.d.ts +32 -0
  40. package/dist/components/combobox.js +100 -0
  41. package/dist/components/combobox.js.map +1 -0
  42. package/dist/components/command.d.ts +19 -0
  43. package/dist/components/command.js +86 -0
  44. package/dist/components/command.js.map +1 -0
  45. package/dist/components/cta-banner.d.ts +14 -0
  46. package/dist/components/cta-banner.js +39 -0
  47. package/dist/components/cta-banner.js.map +1 -0
  48. package/dist/components/date-picker.d.ts +19 -0
  49. package/dist/components/date-picker.js +107 -0
  50. package/dist/components/date-picker.js.map +1 -0
  51. package/dist/components/dialog.d.ts +18 -0
  52. package/dist/components/dialog.js +99 -0
  53. package/dist/components/dialog.js.map +1 -0
  54. package/dist/components/dropdown-menu.d.ts +26 -0
  55. package/dist/components/dropdown-menu.js +123 -0
  56. package/dist/components/dropdown-menu.js.map +1 -0
  57. package/dist/components/field.d.ts +30 -0
  58. package/dist/components/field.js +53 -0
  59. package/dist/components/field.js.map +1 -0
  60. package/dist/components/footer.d.ts +18 -0
  61. package/dist/components/footer.js +40 -0
  62. package/dist/components/footer.js.map +1 -0
  63. package/dist/components/fx-converter.d.ts +22 -0
  64. package/dist/components/fx-converter.js +91 -0
  65. package/dist/components/fx-converter.js.map +1 -0
  66. package/dist/components/hero.d.ts +28 -0
  67. package/dist/components/hero.js +83 -0
  68. package/dist/components/hero.js.map +1 -0
  69. package/dist/components/hud.d.ts +41 -0
  70. package/dist/components/hud.js +108 -0
  71. package/dist/components/hud.js.map +1 -0
  72. package/dist/components/input.d.ts +4 -0
  73. package/dist/components/input.js +14 -0
  74. package/dist/components/input.js.map +1 -0
  75. package/dist/components/label.d.ts +5 -0
  76. package/dist/components/label.js +15 -0
  77. package/dist/components/label.js.map +1 -0
  78. package/dist/components/media-card.d.ts +29 -0
  79. package/dist/components/media-card.js +80 -0
  80. package/dist/components/media-card.js.map +1 -0
  81. package/dist/components/money-input.d.ts +10 -0
  82. package/dist/components/money-input.js +30 -0
  83. package/dist/components/money-input.js.map +1 -0
  84. package/dist/components/multi-combobox.d.ts +27 -0
  85. package/dist/components/multi-combobox.js +101 -0
  86. package/dist/components/multi-combobox.js.map +1 -0
  87. package/dist/components/nav-bar.d.ts +21 -0
  88. package/dist/components/nav-bar.js +44 -0
  89. package/dist/components/nav-bar.js.map +1 -0
  90. package/dist/components/panel.d.ts +27 -0
  91. package/dist/components/panel.js +49 -0
  92. package/dist/components/panel.js.map +1 -0
  93. package/dist/components/popover.d.ts +11 -0
  94. package/dist/components/popover.js +56 -0
  95. package/dist/components/popover.js.map +1 -0
  96. package/dist/components/select.d.ts +16 -0
  97. package/dist/components/select.js +128 -0
  98. package/dist/components/select.js.map +1 -0
  99. package/dist/components/separator.d.ts +5 -0
  100. package/dist/components/separator.js +17 -0
  101. package/dist/components/separator.js.map +1 -0
  102. package/dist/components/sheet.d.ts +15 -0
  103. package/dist/components/sheet.js +87 -0
  104. package/dist/components/sheet.js.map +1 -0
  105. package/dist/components/skeleton.d.ts +3 -0
  106. package/dist/components/skeleton.js +13 -0
  107. package/dist/components/skeleton.js.map +1 -0
  108. package/dist/components/sonner.d.ts +5 -0
  109. package/dist/components/sonner.js +44 -0
  110. package/dist/components/sonner.js.map +1 -0
  111. package/dist/components/spec-readout.d.ts +11 -0
  112. package/dist/components/spec-readout.js +25 -0
  113. package/dist/components/spec-readout.js.map +1 -0
  114. package/dist/components/split-flap.d.ts +12 -0
  115. package/dist/components/split-flap.js +77 -0
  116. package/dist/components/split-flap.js.map +1 -0
  117. package/dist/components/tabs.d.ts +12 -0
  118. package/dist/components/tabs.js +47 -0
  119. package/dist/components/tabs.js.map +1 -0
  120. package/dist/components/tag.d.ts +16 -0
  121. package/dist/components/tag.js +26 -0
  122. package/dist/components/tag.js.map +1 -0
  123. package/dist/components/terminal.d.ts +10 -0
  124. package/dist/components/terminal.js +20 -0
  125. package/dist/components/terminal.js.map +1 -0
  126. package/dist/components/textarea.d.ts +4 -0
  127. package/dist/components/textarea.js +13 -0
  128. package/dist/components/textarea.js.map +1 -0
  129. package/dist/components/timeline-entry.d.ts +26 -0
  130. package/dist/components/timeline-entry.js +63 -0
  131. package/dist/components/timeline-entry.js.map +1 -0
  132. package/dist/components/toggle-group.d.ts +10 -0
  133. package/dist/components/toggle-group.js +49 -0
  134. package/dist/components/toggle-group.js.map +1 -0
  135. package/dist/components/toggle.d.ts +10 -0
  136. package/dist/components/toggle.js +37 -0
  137. package/dist/components/toggle.js.map +1 -0
  138. package/dist/components/tooltip.d.ts +8 -0
  139. package/dist/components/tooltip.js +36 -0
  140. package/dist/components/tooltip.js.map +1 -0
  141. package/dist/finance.d.ts +10 -0
  142. package/dist/finance.js +10 -0
  143. package/dist/index.d.ts +33 -0
  144. package/dist/index.js +33 -0
  145. package/dist/lib/category-icons.d.ts +80 -0
  146. package/dist/lib/category-icons.js +102 -0
  147. package/dist/lib/category-icons.js.map +1 -0
  148. package/dist/lib/fault.d.ts +7 -0
  149. package/dist/lib/fault.js +28 -0
  150. package/dist/lib/fault.js.map +1 -0
  151. package/dist/lib/form-flow.d.ts +15 -0
  152. package/dist/lib/form-flow.js +50 -0
  153. package/dist/lib/form-flow.js.map +1 -0
  154. package/dist/lib/fx.d.ts +39 -0
  155. package/dist/lib/fx.js +98 -0
  156. package/dist/lib/fx.js.map +1 -0
  157. package/dist/lib/money.d.ts +19 -0
  158. package/dist/lib/money.js +55 -0
  159. package/dist/lib/money.js.map +1 -0
  160. package/dist/lib/use-media-query.d.ts +3 -0
  161. package/dist/lib/use-media-query.js +15 -0
  162. package/dist/lib/use-media-query.js.map +1 -0
  163. package/dist/lib/utils.d.ts +3 -0
  164. package/dist/lib/utils.js +26 -0
  165. package/dist/lib/utils.js.map +1 -0
  166. package/dist/site.d.ts +10 -0
  167. package/dist/site.js +10 -0
  168. package/dist/styles.css +2 -0
  169. package/dist/theme.css +391 -0
  170. package/dist/tokens.css +181 -0
  171. package/guidelines/AlertDialog.md +9 -0
  172. package/guidelines/Amount.md +10 -0
  173. package/guidelines/AppearancePickers.md +8 -0
  174. package/guidelines/Badge.md +11 -0
  175. package/guidelines/BudgetMeter.md +11 -0
  176. package/guidelines/Button.md +16 -0
  177. package/guidelines/Calendar.md +8 -0
  178. package/guidelines/CategoryIcon.md +10 -0
  179. package/guidelines/Charts.md +12 -0
  180. package/guidelines/Checkbox.md +8 -0
  181. package/guidelines/Combobox.md +18 -0
  182. package/guidelines/Command.md +8 -0
  183. package/guidelines/Crosshair.md +7 -0
  184. package/guidelines/CtaBanner.md +8 -0
  185. package/guidelines/DatePicker.md +11 -0
  186. package/guidelines/Dialog.md +9 -0
  187. package/guidelines/DropdownMenu.md +9 -0
  188. package/guidelines/Field.md +22 -0
  189. package/guidelines/Footer.md +7 -0
  190. package/guidelines/FxConverter.md +12 -0
  191. package/guidelines/GlassPanel.md +8 -0
  192. package/guidelines/Grill.md +7 -0
  193. package/guidelines/Hero.md +9 -0
  194. package/guidelines/HudLabel.md +8 -0
  195. package/guidelines/Input.md +9 -0
  196. package/guidelines/Label.md +7 -0
  197. package/guidelines/MediaCard.md +8 -0
  198. package/guidelines/MoneyInput.md +10 -0
  199. package/guidelines/MultiCombobox.md +11 -0
  200. package/guidelines/NavBar.md +10 -0
  201. package/guidelines/Panel.md +10 -0
  202. package/guidelines/Popover.md +8 -0
  203. package/guidelines/README.md +100 -0
  204. package/guidelines/SectionHeader.md +9 -0
  205. package/guidelines/Select.md +9 -0
  206. package/guidelines/Separator.md +8 -0
  207. package/guidelines/Sheet.md +9 -0
  208. package/guidelines/Skeleton.md +8 -0
  209. package/guidelines/SpecReadout.md +7 -0
  210. package/guidelines/SplitFlap.md +9 -0
  211. package/guidelines/StatusLed.md +8 -0
  212. package/guidelines/Tabs.md +9 -0
  213. package/guidelines/Tag.md +9 -0
  214. package/guidelines/Terminal.md +7 -0
  215. package/guidelines/Textarea.md +8 -0
  216. package/guidelines/TickRuler.md +8 -0
  217. package/guidelines/TimelineEntry.md +8 -0
  218. package/guidelines/Toaster.md +9 -0
  219. package/guidelines/Toggle.md +9 -0
  220. package/guidelines/Tooltip.md +8 -0
  221. package/package.json +103 -4
  222. package/tokens/tokens.json +739 -0
@@ -0,0 +1,49 @@
1
+ import { cn } from "../lib/utils.js";
2
+ import { Crosshair } from "./hud.js";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ // src/components/panel.tsx
5
+ const notchClass = {
6
+ sm: "notch-sm",
7
+ md: "notch-md",
8
+ lg: "notch-lg"
9
+ };
10
+ /**
11
+ * The molded white part: rounded shell, one notched corner, optional serial, crosshair and hinge.
12
+ * The float shadow is a drop-shadow filter on the wrapper so the notch keeps it.
13
+ */
14
+ function Panel({ serial, notch = "md", recess, cross = false, hinge, className, bodyClassName, children, ...props }) {
15
+ return /* @__PURE__ */ jsxs("div", {
16
+ "data-slot": "panel",
17
+ className: cn("relative drop-float", className),
18
+ ...props,
19
+ children: [hinge !== void 0 && /* @__PURE__ */ jsx(HingeTab, { style: { left: hinge } }), /* @__PURE__ */ jsxs("div", {
20
+ className: cn("relative h-full rounded-lg p-6 sm:p-8", recess ? "bg-shell-recess" : "bg-shell", notch && notchClass[notch], serial !== void 0 && "pt-11", bodyClassName),
21
+ children: [
22
+ serial !== void 0 && /* @__PURE__ */ jsx("span", {
23
+ className: "hud-sm absolute top-3.5 left-6 text-hud-mark",
24
+ children: serial
25
+ }),
26
+ children,
27
+ cross && /* @__PURE__ */ jsx(Crosshair, { className: "absolute right-3.5 bottom-3.5" })
28
+ ]
29
+ })]
30
+ });
31
+ }
32
+ /** Small signal stadium sitting on a part's top edge, like a hinge. One per part. */
33
+ function HingeTab({ className, ...props }) {
34
+ return /* @__PURE__ */ jsx("span", {
35
+ "aria-hidden": true,
36
+ className: cn("absolute -top-[5px] z-10 h-2.5 w-14 rounded-full bg-signal", className),
37
+ ...props
38
+ });
39
+ }
40
+ /** Frosted clear plastic over color: nav bars and floating toolbars. */
41
+ function GlassPanel({ className, ...props }) {
42
+ return /* @__PURE__ */ jsx("div", {
43
+ className: cn("glass rounded-lg p-6", className),
44
+ ...props
45
+ });
46
+ }
47
+ export { GlassPanel, HingeTab, Panel };
48
+
49
+ //# sourceMappingURL=panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel.js","names":[],"sources":["../../src/components/panel.tsx"],"sourcesContent":["import { cn } from \"../lib/utils\";\nimport type * as React from \"react\";\nimport { Crosshair } from \"./hud\";\n\ntype Notch = \"sm\" | \"md\" | \"lg\" | false;\n\nconst notchClass: Record<Exclude<Notch, false>, string> = {\n sm: \"notch-sm\",\n md: \"notch-md\",\n lg: \"notch-lg\",\n};\n\nexport type PanelProps = React.ComponentProps<\"div\"> & {\n /** Microprint in the top-left corner, e.g. \"W-01 · USD\". */\n serial?: React.ReactNode;\n /** The one chamfered corner (top-right). */\n notch?: Notch;\n /** Sunken shell-recess fill instead of shell. */\n recess?: boolean;\n /** Registration crosshair in the bottom-right corner. */\n cross?: boolean;\n /** Left offset of a signal hinge tab on the top edge, e.g. \"24px\" or \"60%\". */\n hinge?: string;\n /** Classes for the inner body (padding, layout). */\n bodyClassName?: string;\n};\n\n/**\n * The molded white part: rounded shell, one notched corner, optional serial, crosshair and hinge.\n * The float shadow is a drop-shadow filter on the wrapper so the notch keeps it.\n */\nexport function Panel({\n serial,\n notch = \"md\",\n recess,\n cross = false,\n hinge,\n className,\n bodyClassName,\n children,\n ...props\n}: PanelProps) {\n return (\n <div data-slot=\"panel\" className={cn(\"relative drop-float\", className)} {...props}>\n {hinge !== undefined && <HingeTab style={{ left: hinge }} />}\n <div\n className={cn(\n \"relative h-full rounded-lg p-6 sm:p-8\",\n recess ? \"bg-shell-recess\" : \"bg-shell\",\n notch && notchClass[notch],\n serial !== undefined && \"pt-11\",\n bodyClassName,\n )}\n >\n {serial !== undefined && (\n <span className=\"hud-sm absolute top-3.5 left-6 text-hud-mark\">{serial}</span>\n )}\n {children}\n {cross && <Crosshair className=\"absolute right-3.5 bottom-3.5\" />}\n </div>\n </div>\n );\n}\n\n/** Small signal stadium sitting on a part's top edge, like a hinge. One per part. */\nexport function HingeTab({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n aria-hidden\n className={cn(\"absolute -top-[5px] z-10 h-2.5 w-14 rounded-full bg-signal\", className)}\n {...props}\n />\n );\n}\n\n/** Frosted clear plastic over color: nav bars and floating toolbars. */\nexport function GlassPanel({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div className={cn(\"glass rounded-lg p-6\", className)} {...props} />;\n}\n"],"mappings":";;;;AAMA,MAAM,aAAoD;CACxD,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;AAqBA,SAAgB,MAAM,EACpB,QACA,QAAQ,MACR,QACA,QAAQ,OACR,OACA,WACA,eACA,UACA,GAAG,SACU;CACb,OACE,qBAAC,OAAD;EAAK,aAAU;EAAQ,WAAW,GAAG,uBAAuB,SAAS;EAAG,GAAI;EAA5E,UAAA,CACG,UAAU,KAAA,KAAa,oBAAC,UAAD,EAAU,OAAO,EAAE,MAAM,MAAM,EAAI,CAAA,GAC3D,qBAAC,OAAD;GACE,WAAW,GACT,yCACA,SAAS,oBAAoB,YAC7B,SAAS,WAAW,QACpB,WAAW,KAAA,KAAa,SACxB,aACF;GAPF,UAAA;IASG,WAAW,KAAA,KACV,oBAAC,QAAD;KAAM,WAAU;KAAgD,UAAA;IAAa,CAAA;IAE9E;IACA,SAAS,oBAAC,WAAD,EAAW,WAAU,gCAAiC,CAAA;GAC7D;EACF,CAAA,CAAA;;AAET;;AAGA,SAAgB,SAAS,EAAE,WAAW,GAAG,SAAuC;CAC9E,OACE,oBAAC,QAAD;EACE,eAAA;EACA,WAAW,GAAG,8DAA8D,SAAS;EACrF,GAAI;CACL,CAAA;AAEL;;AAGA,SAAgB,WAAW,EAAE,WAAW,GAAG,SAAsC;CAC/E,OAAO,oBAAC,OAAD;EAAK,WAAW,GAAG,wBAAwB,SAAS;EAAG,GAAI;CAAQ,CAAA;AAC5E"}
@@ -0,0 +1,11 @@
1
+ import { Popover } from "radix-ui";
2
+ import * as React from "react";
3
+ declare function Popover$1({ ...props }: React.ComponentProps<typeof Popover.Root>): React.JSX.Element;
4
+ declare function PopoverTrigger({ ...props }: React.ComponentProps<typeof Popover.Trigger>): React.JSX.Element;
5
+ declare function PopoverContent({ className, align, sideOffset, ...props }: React.ComponentProps<typeof Popover.Content>): React.JSX.Element;
6
+ declare function PopoverAnchor({ ...props }: React.ComponentProps<typeof Popover.Anchor>): React.JSX.Element;
7
+ declare function PopoverHeader({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
8
+ declare function PopoverTitle({ className, ...props }: React.ComponentProps<"h2">): React.JSX.Element;
9
+ declare function PopoverDescription({ className, ...props }: React.ComponentProps<"p">): React.JSX.Element;
10
+ export { Popover$1 as Popover, PopoverAnchor, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger };
11
+ //# sourceMappingURL=popover.d.ts.map
@@ -0,0 +1,56 @@
1
+ "use client";
2
+ import { cn } from "../lib/utils.js";
3
+ import { Popover } from "radix-ui";
4
+ import { jsx } from "react/jsx-runtime";
5
+ // src/components/popover.tsx
6
+ function Popover$1({ ...props }) {
7
+ return /* @__PURE__ */ jsx(Popover.Root, {
8
+ "data-slot": "popover",
9
+ ...props
10
+ });
11
+ }
12
+ function PopoverTrigger({ ...props }) {
13
+ return /* @__PURE__ */ jsx(Popover.Trigger, {
14
+ "data-slot": "popover-trigger",
15
+ ...props
16
+ });
17
+ }
18
+ function PopoverContent({ className, align = "center", sideOffset = 4, ...props }) {
19
+ return /* @__PURE__ */ jsx(Popover.Portal, { children: /* @__PURE__ */ jsx(Popover.Content, {
20
+ "data-slot": "popover-content",
21
+ align,
22
+ sideOffset,
23
+ className: cn("z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border bg-popover p-4 text-popover-foreground shadow-float outline-hidden 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-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95", className),
24
+ ...props
25
+ }) });
26
+ }
27
+ function PopoverAnchor({ ...props }) {
28
+ return /* @__PURE__ */ jsx(Popover.Anchor, {
29
+ "data-slot": "popover-anchor",
30
+ ...props
31
+ });
32
+ }
33
+ function PopoverHeader({ className, ...props }) {
34
+ return /* @__PURE__ */ jsx("div", {
35
+ "data-slot": "popover-header",
36
+ className: cn("flex flex-col gap-1 text-sm", className),
37
+ ...props
38
+ });
39
+ }
40
+ function PopoverTitle({ className, ...props }) {
41
+ return /* @__PURE__ */ jsx("div", {
42
+ "data-slot": "popover-title",
43
+ className: cn("font-medium", className),
44
+ ...props
45
+ });
46
+ }
47
+ function PopoverDescription({ className, ...props }) {
48
+ return /* @__PURE__ */ jsx("p", {
49
+ "data-slot": "popover-description",
50
+ className: cn("text-muted-foreground", className),
51
+ ...props
52
+ });
53
+ }
54
+ export { Popover$1 as Popover, PopoverAnchor, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger };
55
+
56
+ //# sourceMappingURL=popover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popover.js","names":["Popover","PopoverPrimitive"],"sources":["../../src/components/popover.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn } from \"../lib/utils\";\nimport { Popover as PopoverPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\n\nfunction Popover({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />;\n}\n\nfunction PopoverTrigger({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />;\n}\n\nfunction PopoverContent({\n className,\n align = \"center\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border bg-popover p-4 text-popover-foreground shadow-float outline-hidden 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-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n );\n}\n\nfunction PopoverAnchor({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {\n return <PopoverPrimitive.Anchor data-slot=\"popover-anchor\" {...props} />;\n}\n\nfunction PopoverHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"popover-header\"\n className={cn(\"flex flex-col gap-1 text-sm\", className)}\n {...props}\n />\n );\n}\n\nfunction PopoverTitle({ className, ...props }: React.ComponentProps<\"h2\">) {\n return <div data-slot=\"popover-title\" className={cn(\"font-medium\", className)} {...props} />;\n}\n\nfunction PopoverDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"popover-description\"\n className={cn(\"text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n\nexport {\n Popover,\n PopoverAnchor,\n PopoverContent,\n PopoverDescription,\n PopoverHeader,\n PopoverTitle,\n PopoverTrigger,\n};\n"],"mappings":";;;;;AAMA,SAASA,UAAQ,EAAE,GAAG,SAA6D;CACjF,OAAO,oBAACC,QAAiB,MAAlB;EAAuB,aAAU;EAAU,GAAI;CAAQ,CAAA;AAChE;AAEA,SAAS,eAAe,EAAE,GAAG,SAAgE;CAC3F,OAAO,oBAACA,QAAiB,SAAlB;EAA0B,aAAU;EAAkB,GAAI;CAAQ,CAAA;AAC3E;AAEA,SAAS,eAAe,EACtB,WACA,QAAQ,UACR,aAAa,GACb,GAAG,SACqD;CACxD,OACE,oBAACA,QAAiB,QAAlB,EAAA,UACE,oBAACA,QAAiB,SAAlB;EACE,aAAU;EACH;EACK;EACZ,WAAW,GACT,qeACA,SACF;EACA,GAAI;CACL,CAAA,EACsB,CAAA;AAE7B;AAEA,SAAS,cAAc,EAAE,GAAG,SAA+D;CACzF,OAAO,oBAACA,QAAiB,QAAlB;EAAyB,aAAU;EAAiB,GAAI;CAAQ,CAAA;AACzE;AAEA,SAAS,cAAc,EAAE,WAAW,GAAG,SAAsC;CAC3E,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,+BAA+B,SAAS;EACtD,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,aAAa,EAAE,WAAW,GAAG,SAAqC;CACzE,OAAO,oBAAC,OAAD;EAAK,aAAU;EAAgB,WAAW,GAAG,eAAe,SAAS;EAAG,GAAI;CAAQ,CAAA;AAC7F;AAEA,SAAS,mBAAmB,EAAE,WAAW,GAAG,SAAoC;CAC9E,OACE,oBAAC,KAAD;EACE,aAAU;EACV,WAAW,GAAG,yBAAyB,SAAS;EAChD,GAAI;CACL,CAAA;AAEL"}
@@ -0,0 +1,16 @@
1
+ import { Select } from "radix-ui";
2
+ import * as React from "react";
3
+ declare function Select$1({ onValueChange, ...props }: React.ComponentProps<typeof Select.Root>): React.JSX.Element;
4
+ declare function SelectGroup({ ...props }: React.ComponentProps<typeof Select.Group>): React.JSX.Element;
5
+ declare function SelectValue({ ...props }: React.ComponentProps<typeof Select.Value>): React.JSX.Element;
6
+ declare function SelectTrigger({ className, size, children, ref, ...props }: React.ComponentProps<typeof Select.Trigger> & {
7
+ size?: "sm" | "default";
8
+ }): React.JSX.Element;
9
+ declare function SelectContent({ className, children, position, align, onCloseAutoFocus, ...props }: React.ComponentProps<typeof Select.Content>): React.JSX.Element;
10
+ declare function SelectLabel({ className, ...props }: React.ComponentProps<typeof Select.Label>): React.JSX.Element;
11
+ declare function SelectItem({ className, children, ...props }: React.ComponentProps<typeof Select.Item>): React.JSX.Element;
12
+ declare function SelectSeparator({ className, ...props }: React.ComponentProps<typeof Select.Separator>): React.JSX.Element;
13
+ declare function SelectScrollUpButton({ className, ...props }: React.ComponentProps<typeof Select.ScrollUpButton>): React.JSX.Element;
14
+ declare function SelectScrollDownButton({ className, ...props }: React.ComponentProps<typeof Select.ScrollDownButton>): React.JSX.Element;
15
+ export { Select$1 as Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue };
16
+ //# sourceMappingURL=select.d.ts.map
@@ -0,0 +1,128 @@
1
+ "use client";
2
+ import { focusNextField } from "../lib/form-flow.js";
3
+ import { cn } from "../lib/utils.js";
4
+ import { Select } from "radix-ui";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from "lucide-react";
7
+ import * as React from "react";
8
+ // src/components/select.tsx
9
+ const FlowContext = React.createContext(null);
10
+ function Select$1({ onValueChange, ...props }) {
11
+ const committed = React.useRef(false);
12
+ const trigger = React.useRef(null);
13
+ const flow = React.useMemo(() => ({
14
+ committed,
15
+ trigger
16
+ }), []);
17
+ return /* @__PURE__ */ jsx(FlowContext.Provider, {
18
+ value: flow,
19
+ children: /* @__PURE__ */ jsx(Select.Root, {
20
+ "data-slot": "select",
21
+ onValueChange: (v) => {
22
+ committed.current = true;
23
+ onValueChange?.(v);
24
+ },
25
+ ...props
26
+ })
27
+ });
28
+ }
29
+ function SelectGroup({ ...props }) {
30
+ return /* @__PURE__ */ jsx(Select.Group, {
31
+ "data-slot": "select-group",
32
+ ...props
33
+ });
34
+ }
35
+ function SelectValue({ ...props }) {
36
+ return /* @__PURE__ */ jsx(Select.Value, {
37
+ "data-slot": "select-value",
38
+ ...props
39
+ });
40
+ }
41
+ function SelectTrigger({ className, size = "default", children, ref, ...props }) {
42
+ const flow = React.useContext(FlowContext);
43
+ return /* @__PURE__ */ jsxs(Select.Trigger, {
44
+ ref: (el) => {
45
+ if (flow) flow.trigger.current = el;
46
+ if (typeof ref === "function") ref(el);
47
+ else if (ref) ref.current = el;
48
+ },
49
+ "data-slot": "select-trigger",
50
+ "data-size": size,
51
+ className: cn("flex w-fit items-center justify-between gap-2 rounded-md border border-input bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-mold transition-[color,box-shadow] outline-none 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 data-[placeholder]:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground", className),
52
+ ...props,
53
+ children: [children, /* @__PURE__ */ jsx(Select.Icon, {
54
+ asChild: true,
55
+ children: /* @__PURE__ */ jsx(ChevronDownIcon, { className: "size-4 opacity-50" })
56
+ })]
57
+ });
58
+ }
59
+ function SelectContent({ className, children, position = "item-aligned", align = "center", onCloseAutoFocus, ...props }) {
60
+ const flow = React.useContext(FlowContext);
61
+ return /* @__PURE__ */ jsx(Select.Portal, { children: /* @__PURE__ */ jsxs(Select.Content, {
62
+ "data-slot": "select-content",
63
+ className: cn("relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border bg-popover text-popover-foreground shadow-float 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-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95", position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1", className),
64
+ position,
65
+ align,
66
+ onCloseAutoFocus: (e) => {
67
+ onCloseAutoFocus?.(e);
68
+ if (e.defaultPrevented || !flow?.committed.current) return;
69
+ flow.committed.current = false;
70
+ e.preventDefault();
71
+ focusNextField(flow.trigger.current);
72
+ },
73
+ ...props,
74
+ children: [
75
+ /* @__PURE__ */ jsx(SelectScrollUpButton, {}),
76
+ /* @__PURE__ */ jsx(Select.Viewport, {
77
+ className: cn("p-1", position === "popper" && "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1"),
78
+ children
79
+ }),
80
+ /* @__PURE__ */ jsx(SelectScrollDownButton, {})
81
+ ]
82
+ }) });
83
+ }
84
+ function SelectLabel({ className, ...props }) {
85
+ return /* @__PURE__ */ jsx(Select.Label, {
86
+ "data-slot": "select-label",
87
+ className: cn("px-2 py-1.5 text-xs text-muted-foreground", className),
88
+ ...props
89
+ });
90
+ }
91
+ function SelectItem({ className, children, ...props }) {
92
+ return /* @__PURE__ */ jsxs(Select.Item, {
93
+ "data-slot": "select-item",
94
+ className: cn("relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2", className),
95
+ ...props,
96
+ children: [/* @__PURE__ */ jsx("span", {
97
+ "data-slot": "select-item-indicator",
98
+ className: "absolute right-2 flex size-3.5 items-center justify-center",
99
+ children: /* @__PURE__ */ jsx(Select.ItemIndicator, { children: /* @__PURE__ */ jsx(CheckIcon, { className: "size-4" }) })
100
+ }), /* @__PURE__ */ jsx(Select.ItemText, { children })]
101
+ });
102
+ }
103
+ function SelectSeparator({ className, ...props }) {
104
+ return /* @__PURE__ */ jsx(Select.Separator, {
105
+ "data-slot": "select-separator",
106
+ className: cn("pointer-events-none -mx-1 my-1 h-px bg-border", className),
107
+ ...props
108
+ });
109
+ }
110
+ function SelectScrollUpButton({ className, ...props }) {
111
+ return /* @__PURE__ */ jsx(Select.ScrollUpButton, {
112
+ "data-slot": "select-scroll-up-button",
113
+ className: cn("flex cursor-default items-center justify-center py-1", className),
114
+ ...props,
115
+ children: /* @__PURE__ */ jsx(ChevronUpIcon, { className: "size-4" })
116
+ });
117
+ }
118
+ function SelectScrollDownButton({ className, ...props }) {
119
+ return /* @__PURE__ */ jsx(Select.ScrollDownButton, {
120
+ "data-slot": "select-scroll-down-button",
121
+ className: cn("flex cursor-default items-center justify-center py-1", className),
122
+ ...props,
123
+ children: /* @__PURE__ */ jsx(ChevronDownIcon, { className: "size-4" })
124
+ });
125
+ }
126
+ export { Select$1 as Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue };
127
+
128
+ //# sourceMappingURL=select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.js","names":["Select","SelectPrimitive"],"sources":["../../src/components/select.tsx"],"sourcesContent":["\"use client\";\n\nimport { focusNextField } from \"../lib/form-flow\";\nimport { cn } from \"../lib/utils\";\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from \"lucide-react\";\nimport { Select as SelectPrimitive } from \"radix-ui\";\nimport * as React from \"react\";\n\n// Form flow: after a value is committed, closing moves focus to the next field (Escape still\n// returns it to the trigger).\ntype FlowState = {\n committed: React.RefObject<boolean>;\n trigger: React.RefObject<HTMLElement | null>;\n};\nconst FlowContext = React.createContext<FlowState | null>(null);\n\nfunction Select({ onValueChange, ...props }: React.ComponentProps<typeof SelectPrimitive.Root>) {\n const committed = React.useRef(false);\n const trigger = React.useRef<HTMLElement | null>(null);\n const flow = React.useMemo(() => ({ committed, trigger }), []);\n return (\n <FlowContext.Provider value={flow}>\n <SelectPrimitive.Root\n data-slot=\"select\"\n onValueChange={(v) => {\n committed.current = true;\n onValueChange?.(v);\n }}\n {...props}\n />\n </FlowContext.Provider>\n );\n}\n\nfunction SelectGroup({ ...props }: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />;\n}\n\nfunction SelectValue({ ...props }: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />;\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ref,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: \"sm\" | \"default\";\n}) {\n const flow = React.useContext(FlowContext);\n return (\n <SelectPrimitive.Trigger\n ref={(el) => {\n if (flow) flow.trigger.current = el;\n if (typeof ref === \"function\") ref(el);\n else if (ref) ref.current = el;\n }}\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"flex w-fit items-center justify-between gap-2 rounded-md border border-input bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-mold transition-[color,box-shadow] outline-none 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 data-[placeholder]:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground\",\n className,\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDownIcon className=\"size-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n );\n}\n\nfunction SelectContent({\n className,\n children,\n position = \"item-aligned\",\n align = \"center\",\n onCloseAutoFocus,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n const flow = React.useContext(FlowContext);\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n \"relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border bg-popover text-popover-foreground shadow-float 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-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className,\n )}\n position={position}\n align={align}\n onCloseAutoFocus={(e) => {\n onCloseAutoFocus?.(e);\n if (e.defaultPrevented || !flow?.committed.current) return;\n flow.committed.current = false;\n e.preventDefault();\n focusNextField(flow.trigger.current);\n }}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1\",\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n );\n}\n\nfunction SelectLabel({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn(\"px-2 py-1.5 text-xs text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n className,\n )}\n {...props}\n >\n <span\n data-slot=\"select-item-indicator\"\n className=\"absolute right-2 flex size-3.5 items-center justify-center\"\n >\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n );\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"pointer-events-none -mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n );\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\"flex cursor-default items-center justify-center py-1\", className)}\n {...props}\n >\n <ChevronUpIcon className=\"size-4\" />\n </SelectPrimitive.ScrollUpButton>\n );\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\"flex cursor-default items-center justify-center py-1\", className)}\n {...props}\n >\n <ChevronDownIcon className=\"size-4\" />\n </SelectPrimitive.ScrollDownButton>\n );\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n};\n"],"mappings":";;;;;;;;AAcA,MAAM,cAAc,MAAM,cAAgC,IAAI;AAE9D,SAASA,SAAO,EAAE,eAAe,GAAG,SAA4D;CAC9F,MAAM,YAAY,MAAM,OAAO,KAAK;CACpC,MAAM,UAAU,MAAM,OAA2B,IAAI;CACrD,MAAM,OAAO,MAAM,eAAe;EAAE;EAAW;CAAQ,IAAI,CAAC,CAAC;CAC7D,OACE,oBAAC,YAAY,UAAb;EAAsB,OAAO;EAC3B,UAAA,oBAACC,OAAgB,MAAjB;GACE,aAAU;GACV,gBAAgB,MAAM;IACpB,UAAU,UAAU;IACpB,gBAAgB,CAAC;GACnB;GACA,GAAI;EACL,CAAA;CACmB,CAAA;AAE1B;AAEA,SAAS,YAAY,EAAE,GAAG,SAA6D;CACrF,OAAO,oBAACA,OAAgB,OAAjB;EAAuB,aAAU;EAAe,GAAI;CAAQ,CAAA;AACrE;AAEA,SAAS,YAAY,EAAE,GAAG,SAA6D;CACrF,OAAO,oBAACA,OAAgB,OAAjB;EAAuB,aAAU;EAAe,GAAI;CAAQ,CAAA;AACrE;AAEA,SAAS,cAAc,EACrB,WACA,OAAO,WACP,UACA,KACA,GAAG,SAGF;CACD,MAAM,OAAO,MAAM,WAAW,WAAW;CACzC,OACE,qBAACA,OAAgB,SAAjB;EACE,MAAM,OAAO;GACX,IAAI,MAAM,KAAK,QAAQ,UAAU;GACjC,IAAI,OAAO,QAAQ,YAAY,IAAI,EAAE;QAChC,IAAI,KAAK,IAAI,UAAU;EAC9B;EACA,aAAU;EACV,aAAW;EACX,WAAW,GACT,ouBACA,SACF;EACA,GAAI;EAZN,UAAA,CAcG,UACD,oBAACA,OAAgB,MAAjB;GAAsB,SAAA;GACpB,UAAA,oBAAC,iBAAD,EAAiB,WAAU,oBAAqB,CAAA;EAC5B,CAAA,CACC;;AAE7B;AAEA,SAAS,cAAc,EACrB,WACA,UACA,WAAW,gBACX,QAAQ,UACR,kBACA,GAAG,SACoD;CACvD,MAAM,OAAO,MAAM,WAAW,WAAW;CACzC,OACE,oBAACA,OAAgB,QAAjB,EAAA,UACE,qBAACA,OAAgB,SAAjB;EACE,aAAU;EACV,WAAW,GACT,ojBACA,aAAa,YACX,mIACF,SACF;EACU;EACH;EACP,mBAAmB,MAAM;GACvB,mBAAmB,CAAC;GACpB,IAAI,EAAE,oBAAoB,CAAC,MAAM,UAAU,SAAS;GACpD,KAAK,UAAU,UAAU;GACzB,EAAE,eAAe;GACjB,eAAe,KAAK,QAAQ,OAAO;EACrC;EACA,GAAI;EAjBN,UAAA;GAmBE,oBAAC,sBAAD,CAAuB,CAAA;GACvB,oBAACA,OAAgB,UAAjB;IACE,WAAW,GACT,OACA,aAAa,YACX,qGACJ;IAEC;GACuB,CAAA;GAC1B,oBAAC,wBAAD,CAAyB,CAAA;EACF;CACH,CAAA,EAAA,CAAA;AAE5B;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,SAA6D;CAChG,OACE,oBAACA,OAAgB,OAAjB;EACE,aAAU;EACV,WAAW,GAAG,6CAA6C,SAAS;EACpE,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,WAAW,EAClB,WACA,UACA,GAAG,SACiD;CACpD,OACE,qBAACA,OAAgB,MAAjB;EACE,aAAU;EACV,WAAW,GACT,6aACA,SACF;EACA,GAAI;EANN,UAAA,CAQE,oBAAC,QAAD;GACE,aAAU;GACV,WAAU;GAEV,UAAA,oBAACA,OAAgB,eAAjB,EAAA,UACE,oBAAC,WAAD,EAAW,WAAU,SAAU,CAAA,EACF,CAAA;EAC3B,CAAA,GACN,oBAACA,OAAgB,UAAjB,EAA2B,SAAmC,CAAA,CAC1C;;AAE1B;AAEA,SAAS,gBAAgB,EACvB,WACA,GAAG,SACsD;CACzD,OACE,oBAACA,OAAgB,WAAjB;EACE,aAAU;EACV,WAAW,GAAG,iDAAiD,SAAS;EACxE,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,qBAAqB,EAC5B,WACA,GAAG,SAC2D;CAC9D,OACE,oBAACA,OAAgB,gBAAjB;EACE,aAAU;EACV,WAAW,GAAG,wDAAwD,SAAS;EAC/E,GAAI;EAEJ,UAAA,oBAAC,eAAD,EAAe,WAAU,SAAU,CAAA;CACL,CAAA;AAEpC;AAEA,SAAS,uBAAuB,EAC9B,WACA,GAAG,SAC6D;CAChE,OACE,oBAACA,OAAgB,kBAAjB;EACE,aAAU;EACV,WAAW,GAAG,wDAAwD,SAAS;EAC/E,GAAI;EAEJ,UAAA,oBAAC,iBAAD,EAAiB,WAAU,SAAU,CAAA;CACL,CAAA;AAEtC"}
@@ -0,0 +1,5 @@
1
+ import { Separator } from "radix-ui";
2
+ import * as React from "react";
3
+ declare function Separator$1({ className, orientation, decorative, ...props }: React.ComponentProps<typeof Separator.Root>): React.JSX.Element;
4
+ export { Separator$1 as Separator };
5
+ //# sourceMappingURL=separator.d.ts.map
@@ -0,0 +1,17 @@
1
+ "use client";
2
+ import { cn } from "../lib/utils.js";
3
+ import { Separator } from "radix-ui";
4
+ import { jsx } from "react/jsx-runtime";
5
+ // src/components/separator.tsx
6
+ function Separator$1({ className, orientation = "horizontal", decorative = true, ...props }) {
7
+ return /* @__PURE__ */ jsx(Separator.Root, {
8
+ "data-slot": "separator",
9
+ decorative,
10
+ orientation,
11
+ className: cn("shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px", className),
12
+ ...props
13
+ });
14
+ }
15
+ export { Separator$1 as Separator };
16
+
17
+ //# sourceMappingURL=separator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"separator.js","names":["Separator","SeparatorPrimitive"],"sources":["../../src/components/separator.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn } from \"../lib/utils\";\nimport { Separator as SeparatorPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Separator };\n"],"mappings":";;;;;AAMA,SAASA,YAAU,EACjB,WACA,cAAc,cACd,aAAa,MACb,GAAG,SACoD;CACvD,OACE,oBAACC,UAAmB,MAApB;EACE,aAAU;EACE;EACC;EACb,WAAW,GACT,kKACA,SACF;EACA,GAAI;CACL,CAAA;AAEL"}
@@ -0,0 +1,15 @@
1
+ import { Dialog } from "radix-ui";
2
+ import * as React from "react";
3
+ declare function Sheet({ ...props }: React.ComponentProps<typeof Dialog.Root>): React.JSX.Element;
4
+ declare function SheetTrigger({ ...props }: React.ComponentProps<typeof Dialog.Trigger>): React.JSX.Element;
5
+ declare function SheetClose({ ...props }: React.ComponentProps<typeof Dialog.Close>): React.JSX.Element;
6
+ declare function SheetContent({ className, children, side, showCloseButton, onOpenAutoFocus, ...props }: React.ComponentProps<typeof Dialog.Content> & {
7
+ side?: "top" | "right" | "bottom" | "left";
8
+ showCloseButton?: boolean;
9
+ }): React.JSX.Element;
10
+ declare function SheetHeader({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
11
+ declare function SheetFooter({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
12
+ declare function SheetTitle({ className, ...props }: React.ComponentProps<typeof Dialog.Title>): React.JSX.Element;
13
+ declare function SheetDescription({ className, ...props }: React.ComponentProps<typeof Dialog.Description>): React.JSX.Element;
14
+ export { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger };
15
+ //# sourceMappingURL=sheet.d.ts.map
@@ -0,0 +1,87 @@
1
+ "use client";
2
+ import { focusFirstField } from "../lib/form-flow.js";
3
+ import { cn } from "../lib/utils.js";
4
+ import { Dialog } from "radix-ui";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { XIcon } from "lucide-react";
7
+ // src/components/sheet.tsx
8
+ function Sheet({ ...props }) {
9
+ return /* @__PURE__ */ jsx(Dialog.Root, {
10
+ "data-slot": "sheet",
11
+ ...props
12
+ });
13
+ }
14
+ function SheetTrigger({ ...props }) {
15
+ return /* @__PURE__ */ jsx(Dialog.Trigger, {
16
+ "data-slot": "sheet-trigger",
17
+ ...props
18
+ });
19
+ }
20
+ function SheetClose({ ...props }) {
21
+ return /* @__PURE__ */ jsx(Dialog.Close, {
22
+ "data-slot": "sheet-close",
23
+ ...props
24
+ });
25
+ }
26
+ function SheetPortal({ ...props }) {
27
+ return /* @__PURE__ */ jsx(Dialog.Portal, {
28
+ "data-slot": "sheet-portal",
29
+ ...props
30
+ });
31
+ }
32
+ function SheetOverlay({ className, ...props }) {
33
+ return /* @__PURE__ */ jsx(Dialog.Overlay, {
34
+ "data-slot": "sheet-overlay",
35
+ className: cn("fixed inset-0 z-50 bg-overlay data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0", className),
36
+ ...props
37
+ });
38
+ }
39
+ function SheetContent({ className, children, side = "right", showCloseButton = true, onOpenAutoFocus, ...props }) {
40
+ return /* @__PURE__ */ jsxs(SheetPortal, { children: [/* @__PURE__ */ jsx(SheetOverlay, {}), /* @__PURE__ */ jsxs(Dialog.Content, {
41
+ "data-slot": "sheet-content",
42
+ className: cn("fixed z-50 flex flex-col gap-4 bg-background shadow-float transition ease-in-out data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:animate-in data-[state=open]:duration-500", side === "right" && "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sheet-max", side === "left" && "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sheet-max", side === "top" && "inset-x-0 top-0 h-auto border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top", side === "bottom" && "inset-x-0 bottom-0 h-auto border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom", className),
43
+ ...props,
44
+ onOpenAutoFocus: (e) => {
45
+ onOpenAutoFocus?.(e);
46
+ if (!e.defaultPrevented && focusFirstField(e.currentTarget)) e.preventDefault();
47
+ },
48
+ children: [children, showCloseButton && /* @__PURE__ */ jsxs(Dialog.Close, {
49
+ className: "absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-secondary",
50
+ children: [/* @__PURE__ */ jsx(XIcon, { className: "size-4" }), /* @__PURE__ */ jsx("span", {
51
+ className: "sr-only",
52
+ children: "Close"
53
+ })]
54
+ })]
55
+ })] });
56
+ }
57
+ function SheetHeader({ className, ...props }) {
58
+ return /* @__PURE__ */ jsx("div", {
59
+ "data-slot": "sheet-header",
60
+ className: cn("flex flex-col gap-1.5 p-4", className),
61
+ ...props
62
+ });
63
+ }
64
+ function SheetFooter({ className, ...props }) {
65
+ return /* @__PURE__ */ jsx("div", {
66
+ "data-slot": "sheet-footer",
67
+ className: cn("mt-auto flex flex-col gap-2 p-4", className),
68
+ ...props
69
+ });
70
+ }
71
+ function SheetTitle({ className, ...props }) {
72
+ return /* @__PURE__ */ jsx(Dialog.Title, {
73
+ "data-slot": "sheet-title",
74
+ className: cn("font-semibold text-foreground", className),
75
+ ...props
76
+ });
77
+ }
78
+ function SheetDescription({ className, ...props }) {
79
+ return /* @__PURE__ */ jsx(Dialog.Description, {
80
+ "data-slot": "sheet-description",
81
+ className: cn("text-sm text-muted-foreground", className),
82
+ ...props
83
+ });
84
+ }
85
+ export { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger };
86
+
87
+ //# sourceMappingURL=sheet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sheet.js","names":["SheetPrimitive"],"sources":["../../src/components/sheet.tsx"],"sourcesContent":["\"use client\";\n\nimport { focusFirstField } from \"../lib/form-flow\";\nimport { cn } from \"../lib/utils\";\nimport { XIcon } from \"lucide-react\";\nimport { Dialog as SheetPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />;\n}\n\nfunction SheetTrigger({ ...props }: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />;\n}\n\nfunction SheetClose({ ...props }: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />;\n}\n\nfunction SheetPortal({ ...props }: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />;\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-overlay data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n showCloseButton = true,\n onOpenAutoFocus,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n showCloseButton?: boolean;\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(\n \"fixed z-50 flex flex-col gap-4 bg-background shadow-float transition ease-in-out data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:animate-in data-[state=open]:duration-500\",\n side === \"right\" &&\n \"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sheet-max\",\n side === \"left\" &&\n \"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sheet-max\",\n side === \"top\" &&\n \"inset-x-0 top-0 h-auto border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\n side === \"bottom\" &&\n \"inset-x-0 bottom-0 h-auto border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\n className,\n )}\n {...props}\n onOpenAutoFocus={(e) => {\n // Form flow: open on the first field rather than the close button or tabs.\n onOpenAutoFocus?.(e);\n if (!e.defaultPrevented && focusFirstField(e.currentTarget as HTMLElement)) {\n e.preventDefault();\n }\n }}\n >\n {children}\n {showCloseButton && (\n <SheetPrimitive.Close className=\"absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-secondary\">\n <XIcon className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n )}\n </SheetPrimitive.Content>\n </SheetPortal>\n );\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-1.5 p-4\", className)}\n {...props}\n />\n );\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n );\n}\n\nfunction SheetTitle({ className, ...props }: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\"font-semibold text-foreground\", className)}\n {...props}\n />\n );\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n\nexport {\n Sheet,\n SheetClose,\n SheetContent,\n SheetDescription,\n SheetFooter,\n SheetHeader,\n SheetTitle,\n SheetTrigger,\n};\n"],"mappings":";;;;;;;AAQA,SAAS,MAAM,EAAE,GAAG,SAA2D;CAC7E,OAAO,oBAACA,OAAe,MAAhB;EAAqB,aAAU;EAAQ,GAAI;CAAQ,CAAA;AAC5D;AAEA,SAAS,aAAa,EAAE,GAAG,SAA8D;CACvF,OAAO,oBAACA,OAAe,SAAhB;EAAwB,aAAU;EAAgB,GAAI;CAAQ,CAAA;AACvE;AAEA,SAAS,WAAW,EAAE,GAAG,SAA4D;CACnF,OAAO,oBAACA,OAAe,OAAhB;EAAsB,aAAU;EAAc,GAAI;CAAQ,CAAA;AACnE;AAEA,SAAS,YAAY,EAAE,GAAG,SAA6D;CACrF,OAAO,oBAACA,OAAe,QAAhB;EAAuB,aAAU;EAAe,GAAI;CAAQ,CAAA;AACrE;AAEA,SAAS,aAAa,EACpB,WACA,GAAG,SACmD;CACtD,OACE,oBAACA,OAAe,SAAhB;EACE,aAAU;EACV,WAAW,GACT,yJACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,aAAa,EACpB,WACA,UACA,OAAO,SACP,kBAAkB,MAClB,iBACA,GAAG,SAIF;CACD,OACE,qBAAC,aAAD,EAAA,UAAA,CACE,oBAAC,cAAD,CAAe,CAAA,GACf,qBAACA,OAAe,SAAhB;EACE,aAAU;EACV,WAAW,GACT,iNACA,SAAS,WACP,2IACF,SAAS,UACP,wIACF,SAAS,SACP,4GACF,SAAS,YACP,qHACF,SACF;EACA,GAAI;EACJ,kBAAkB,MAAM;GAEtB,kBAAkB,CAAC;GACnB,IAAI,CAAC,EAAE,oBAAoB,gBAAgB,EAAE,aAA4B,GACvE,EAAE,eAAe;EAErB;EArBF,UAAA,CAuBG,UACA,mBACC,qBAACA,OAAe,OAAhB;GAAsB,WAAU;GAAhC,UAAA,CACE,oBAAC,OAAD,EAAO,WAAU,SAAU,CAAA,GAC3B,oBAAC,QAAD;IAAM,WAAU;IAAU,UAAA;GAAW,CAAA,CACjB;EAEF,CAAA,CAAA;CACb,CAAA,CAAA,EAAA,CAAA;AAEjB;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,SAAsC;CACzE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,6BAA6B,SAAS;EACpD,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,SAAsC;CACzE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,mCAAmC,SAAS;EAC1D,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,WAAW,EAAE,WAAW,GAAG,SAA4D;CAC9F,OACE,oBAACA,OAAe,OAAhB;EACE,aAAU;EACV,WAAW,GAAG,iCAAiC,SAAS;EACxD,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,iBAAiB,EACxB,WACA,GAAG,SACuD;CAC1D,OACE,oBAACA,OAAe,aAAhB;EACE,aAAU;EACV,WAAW,GAAG,iCAAiC,SAAS;EACxD,GAAI;CACL,CAAA;AAEL"}
@@ -0,0 +1,3 @@
1
+ declare function Skeleton({ className, ...props }: React.ComponentProps<"div">): import("react").JSX.Element;
2
+ export { Skeleton };
3
+ //# sourceMappingURL=skeleton.d.ts.map
@@ -0,0 +1,13 @@
1
+ import { cn } from "../lib/utils.js";
2
+ import { jsx } from "react/jsx-runtime";
3
+ // src/components/skeleton.tsx
4
+ function Skeleton({ className, ...props }) {
5
+ return /* @__PURE__ */ jsx("div", {
6
+ "data-slot": "skeleton",
7
+ className: cn("animate-pulse rounded-md bg-accent", className),
8
+ ...props
9
+ });
10
+ }
11
+ export { Skeleton };
12
+
13
+ //# sourceMappingURL=skeleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton.js","names":[],"sources":["../../src/components/skeleton.tsx"],"sourcesContent":["import { cn } from \"../lib/utils\";\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn(\"animate-pulse rounded-md bg-accent\", className)}\n {...props}\n />\n );\n}\n\nexport { Skeleton };\n"],"mappings":";;;AAEA,SAAS,SAAS,EAAE,WAAW,GAAG,SAAsC;CACtE,OACE,oBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,sCAAsC,SAAS;EAC7D,GAAI;CACL,CAAA;AAEL"}
@@ -0,0 +1,5 @@
1
+ import * as React from "react";
2
+ import { ToasterProps } from "sonner";
3
+ declare const Toaster$1: ({ ...props }: ToasterProps) => React.JSX.Element;
4
+ export { Toaster$1 as Toaster };
5
+ //# sourceMappingURL=sonner.d.ts.map
@@ -0,0 +1,44 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { CircleCheckIcon, InfoIcon, Loader2Icon, OctagonXIcon, TriangleAlertIcon } from "lucide-react";
4
+ import { Toaster } from "sonner";
5
+ // src/components/sonner.tsx
6
+ const Toaster$1 = ({ ...props }) => {
7
+ return /* @__PURE__ */ jsx(Toaster, {
8
+ theme: "light",
9
+ className: "toaster group",
10
+ icons: {
11
+ success: /* @__PURE__ */ jsx(CircleCheckIcon, {
12
+ className: "size-4 text-income-ink",
13
+ strokeWidth: 1.25
14
+ }),
15
+ info: /* @__PURE__ */ jsx(InfoIcon, {
16
+ className: "size-4",
17
+ strokeWidth: 1.25
18
+ }),
19
+ warning: /* @__PURE__ */ jsx(TriangleAlertIcon, {
20
+ className: "size-4 text-signal-ink",
21
+ strokeWidth: 1.25
22
+ }),
23
+ error: /* @__PURE__ */ jsx(OctagonXIcon, {
24
+ className: "size-4 text-danger",
25
+ strokeWidth: 1.25
26
+ }),
27
+ loading: /* @__PURE__ */ jsx(Loader2Icon, {
28
+ className: "size-4 animate-spin",
29
+ strokeWidth: 1.25
30
+ })
31
+ },
32
+ toastOptions: { classNames: { toast: "font-sans text-body-sm shadow-float" } },
33
+ style: {
34
+ "--normal-bg": "var(--color-shell)",
35
+ "--normal-text": "var(--color-ink)",
36
+ "--normal-border": "var(--color-seam)",
37
+ "--border-radius": "var(--radius-lg)"
38
+ },
39
+ ...props
40
+ });
41
+ };
42
+ export { Toaster$1 as Toaster };
43
+
44
+ //# sourceMappingURL=sonner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sonner.js","names":["Toaster","Sonner"],"sources":["../../src/components/sonner.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n CircleCheckIcon,\n InfoIcon,\n Loader2Icon,\n OctagonXIcon,\n TriangleAlertIcon,\n} from \"lucide-react\";\nimport type * as React from \"react\";\nimport { Toaster as Sonner, type ToasterProps } from \"sonner\";\n\n// Light theme only (Module/01 is lit like a white studio).\nconst Toaster = ({ ...props }: ToasterProps) => {\n return (\n <Sonner\n theme=\"light\"\n className=\"toaster group\"\n icons={{\n success: <CircleCheckIcon className=\"size-4 text-income-ink\" strokeWidth={1.25} />,\n info: <InfoIcon className=\"size-4\" strokeWidth={1.25} />,\n warning: <TriangleAlertIcon className=\"size-4 text-signal-ink\" strokeWidth={1.25} />,\n error: <OctagonXIcon className=\"size-4 text-danger\" strokeWidth={1.25} />,\n loading: <Loader2Icon className=\"size-4 animate-spin\" strokeWidth={1.25} />,\n }}\n toastOptions={{ classNames: { toast: \"font-sans text-body-sm shadow-float\" } }}\n style={\n {\n \"--normal-bg\": \"var(--color-shell)\",\n \"--normal-text\": \"var(--color-ink)\",\n \"--normal-border\": \"var(--color-seam)\",\n \"--border-radius\": \"var(--radius-lg)\",\n } as React.CSSProperties\n }\n {...props}\n />\n );\n};\n\nexport { Toaster };\n"],"mappings":";;;;;AAaA,MAAMA,aAAW,EAAE,GAAG,YAA0B;CAC9C,OACE,oBAACC,SAAD;EACE,OAAM;EACN,WAAU;EACV,OAAO;GACL,SAAS,oBAAC,iBAAD;IAAiB,WAAU;IAAyB,aAAa;GAAO,CAAA;GACjF,MAAM,oBAAC,UAAD;IAAU,WAAU;IAAS,aAAa;GAAO,CAAA;GACvD,SAAS,oBAAC,mBAAD;IAAmB,WAAU;IAAyB,aAAa;GAAO,CAAA;GACnF,OAAO,oBAAC,cAAD;IAAc,WAAU;IAAqB,aAAa;GAAO,CAAA;GACxE,SAAS,oBAAC,aAAD;IAAa,WAAU;IAAsB,aAAa;GAAO,CAAA;EAC5E;EACA,cAAc,EAAE,YAAY,EAAE,OAAO,sCAAsC,EAAE;EAC7E,OACE;GACE,eAAe;GACf,iBAAiB;GACjB,mBAAmB;GACnB,mBAAmB;EACrB;EAEF,GAAI;CACL,CAAA;AAEL"}
@@ -0,0 +1,11 @@
1
+ import * as React from "react";
2
+ export type SpecItem = {
3
+ label: string;
4
+ value: React.ReactNode;
5
+ };
6
+ /** A row of spec cells: HUD label over a bold value, split by seams. Stacks on phones. */
7
+ export declare function SpecReadout({ items, className }: {
8
+ items: SpecItem[];
9
+ className?: string;
10
+ }): React.JSX.Element;
11
+ //# sourceMappingURL=spec-readout.d.ts.map
@@ -0,0 +1,25 @@
1
+ import { cn } from "../lib/utils.js";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ // src/components/spec-readout.tsx
4
+ /** A row of spec cells: HUD label over a bold value, split by seams. Stacks on phones. */
5
+ function SpecReadout({ items, className }) {
6
+ return /* @__PURE__ */ jsx("div", {
7
+ className: cn("overflow-hidden", className),
8
+ children: /* @__PURE__ */ jsx("dl", {
9
+ className: "grid gap-y-4 sm:-ml-[17px] sm:grid-cols-[repeat(auto-fit,minmax(140px,1fr))]",
10
+ children: items.map((item) => /* @__PURE__ */ jsxs("div", {
11
+ className: "border-seam max-sm:border-t max-sm:pt-4 max-sm:first:border-t-0 max-sm:first:pt-0 sm:border-l sm:pl-4",
12
+ children: [/* @__PURE__ */ jsx("dt", {
13
+ className: "hud mb-1.5 text-ink-soft",
14
+ children: item.label
15
+ }), /* @__PURE__ */ jsx("dd", {
16
+ className: "text-label text-ink",
17
+ children: item.value
18
+ })]
19
+ }, item.label))
20
+ })
21
+ });
22
+ }
23
+ export { SpecReadout };
24
+
25
+ //# sourceMappingURL=spec-readout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-readout.js","names":[],"sources":["../../src/components/spec-readout.tsx"],"sourcesContent":["import type * as React from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport type SpecItem = {\n label: string;\n value: React.ReactNode;\n};\n\n/** A row of spec cells: HUD label over a bold value, split by seams. Stacks on phones. */\nexport function SpecReadout({ items, className }: { items: SpecItem[]; className?: string }) {\n return (\n // Every cell has a seam on its left; the negative margin tucks each row's first seam under\n // the clipped edge, however the cells wrap.\n <div className={cn(\"overflow-hidden\", className)}>\n <dl className=\"grid gap-y-4 sm:-ml-[17px] sm:grid-cols-[repeat(auto-fit,minmax(140px,1fr))]\">\n {items.map((item) => (\n <div\n key={item.label}\n className=\"border-seam max-sm:border-t max-sm:pt-4 max-sm:first:border-t-0 max-sm:first:pt-0 sm:border-l sm:pl-4\"\n >\n <dt className=\"hud mb-1.5 text-ink-soft\">{item.label}</dt>\n <dd className=\"text-label text-ink\">{item.value}</dd>\n </div>\n ))}\n </dl>\n </div>\n );\n}\n"],"mappings":";;;;AASA,SAAgB,YAAY,EAAE,OAAO,aAAwD;CAC3F,OAGE,oBAAC,OAAD;EAAK,WAAW,GAAG,mBAAmB,SAAS;EAC7C,UAAA,oBAAC,MAAD;GAAI,WAAU;GACX,UAAA,MAAM,KAAK,SACV,qBAAC,OAAD;IAEE,WAAU;IAFZ,UAAA,CAIE,oBAAC,MAAD;KAAI,WAAU;KAA4B,UAAA,KAAK;IAAU,CAAA,GACzD,oBAAC,MAAD;KAAI,WAAU;KAAuB,UAAA,KAAK;IAAU,CAAA,CACjD;GALE,GAAA,KAAK,KAKP,CACN;EACC,CAAA;CACD,CAAA;AAET"}
@@ -0,0 +1,12 @@
1
+ export type SplitFlapProps = {
2
+ text: string;
3
+ /** Flaps whenever `text` changes; with `start` it also waits for the first true (in view). */
4
+ start?: boolean;
5
+ className?: string;
6
+ };
7
+ /**
8
+ * Characters flip through random glyphs before landing, like a station departure board.
9
+ * Screen readers get the final text only, and reduced motion skips the flipping.
10
+ */
11
+ export declare function SplitFlap({ text, start, className }: SplitFlapProps): import("react").JSX.Element;
12
+ //# sourceMappingURL=split-flap.d.ts.map