@getgreenline/blaze-ui 1.0.2 → 1.0.3-3.0-beta

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 (240) hide show
  1. package/dist/components/accordion.d.ts +8 -0
  2. package/dist/components/accordion.d.ts.map +1 -0
  3. package/dist/components/accordion.js +19 -0
  4. package/dist/components/alert-dialog.d.ts +18 -0
  5. package/dist/components/alert-dialog.d.ts.map +1 -0
  6. package/dist/components/alert-dialog.js +41 -0
  7. package/dist/components/alert.d.ts +10 -0
  8. package/dist/components/alert.d.ts.map +1 -0
  9. package/dist/components/alert.js +26 -0
  10. package/dist/components/aspect-ratio.d.ts +4 -0
  11. package/dist/components/aspect-ratio.d.ts.map +1 -0
  12. package/dist/components/aspect-ratio.js +8 -0
  13. package/dist/components/avatar.d.ts +7 -0
  14. package/dist/components/avatar.d.ts.map +1 -0
  15. package/dist/components/avatar.js +15 -0
  16. package/dist/components/badge.d.ts +10 -0
  17. package/dist/components/badge.d.ts.map +1 -0
  18. package/dist/components/badge.js +24 -0
  19. package/dist/components/breadcrumb.d.ts +12 -0
  20. package/dist/components/breadcrumb.d.ts.map +1 -0
  21. package/dist/components/breadcrumb.js +29 -0
  22. package/dist/components/button-group.d.ts +12 -0
  23. package/dist/components/button-group.d.ts.map +1 -0
  24. package/dist/components/button-group.js +29 -0
  25. package/dist/components/button.d.ts +16 -0
  26. package/dist/components/button.d.ts.map +1 -0
  27. package/dist/components/button.js +37 -0
  28. package/dist/components/card.d.ts +10 -0
  29. package/dist/components/card.d.ts.map +1 -0
  30. package/dist/components/card.js +26 -0
  31. package/dist/components/carousel.d.ts +20 -0
  32. package/dist/components/carousel.d.ts.map +1 -0
  33. package/dist/components/carousel.js +92 -0
  34. package/dist/components/chart.d.ts +41 -0
  35. package/dist/components/chart.d.ts.map +1 -0
  36. package/dist/components/chart.js +133 -0
  37. package/dist/components/checkbox.d.ts +5 -0
  38. package/dist/components/checkbox.d.ts.map +1 -0
  39. package/dist/components/checkbox.js +10 -0
  40. package/dist/components/collapsible.d.ts +6 -0
  41. package/dist/components/collapsible.d.ts.map +1 -0
  42. package/dist/components/collapsible.js +14 -0
  43. package/dist/components/command.d.ts +19 -0
  44. package/dist/components/command.d.ts.map +1 -0
  45. package/dist/components/command.js +35 -0
  46. package/dist/components/context-menu.d.ts +26 -0
  47. package/dist/components/context-menu.d.ts.map +1 -0
  48. package/dist/components/context-menu.js +52 -0
  49. package/dist/components/data-table.d.ts +83 -0
  50. package/dist/components/data-table.d.ts.map +1 -0
  51. package/dist/components/data-table.js +357 -0
  52. package/dist/components/dialog.d.ts +16 -0
  53. package/dist/components/dialog.d.ts.map +1 -0
  54. package/dist/components/dialog.js +37 -0
  55. package/dist/components/drawer.d.ts +14 -0
  56. package/dist/components/drawer.d.ts.map +1 -0
  57. package/dist/components/drawer.js +36 -0
  58. package/dist/components/dropdown-menu.d.ts +26 -0
  59. package/dist/components/dropdown-menu.d.ts.map +1 -0
  60. package/dist/components/dropdown-menu.js +52 -0
  61. package/dist/components/empty.d.ts +12 -0
  62. package/dist/components/empty.d.ts.map +1 -0
  63. package/dist/components/empty.js +35 -0
  64. package/dist/components/field.d.ts +25 -0
  65. package/dist/components/field.d.ts.map +1 -0
  66. package/dist/components/field.js +74 -0
  67. package/dist/components/form.d.ts +25 -0
  68. package/dist/components/form.d.ts.map +1 -0
  69. package/dist/components/form.js +60 -0
  70. package/dist/components/header-app-switcher.d.ts +50 -0
  71. package/dist/components/header-app-switcher.d.ts.map +1 -0
  72. package/dist/components/header-app-switcher.js +154 -0
  73. package/dist/components/hierarchical-select.d.ts +21 -0
  74. package/dist/components/hierarchical-select.d.ts.map +1 -0
  75. package/dist/components/hierarchical-select.js +96 -0
  76. package/dist/components/hover-card.d.ts +7 -0
  77. package/dist/components/hover-card.d.ts.map +1 -0
  78. package/dist/components/hover-card.js +15 -0
  79. package/dist/components/input-group.d.ts +17 -0
  80. package/dist/components/input-group.d.ts.map +1 -0
  81. package/dist/components/input-group.js +64 -0
  82. package/dist/components/input-otp.d.ts +12 -0
  83. package/dist/components/input-otp.d.ts.map +1 -0
  84. package/dist/components/input-otp.js +22 -0
  85. package/dist/components/input.d.ts +4 -0
  86. package/dist/components/input.d.ts.map +1 -0
  87. package/dist/components/input.js +8 -0
  88. package/dist/components/item.d.ts +24 -0
  89. package/dist/components/item.d.ts.map +1 -0
  90. package/dist/components/item.js +68 -0
  91. package/dist/components/kbd.d.ts +4 -0
  92. package/dist/components/kbd.d.ts.map +1 -0
  93. package/dist/components/kbd.js +11 -0
  94. package/dist/components/label.d.ts +8 -0
  95. package/dist/components/label.d.ts.map +1 -0
  96. package/dist/components/label.js +9 -0
  97. package/dist/components/login-screen.d.ts +4 -0
  98. package/dist/components/login-screen.d.ts.map +1 -0
  99. package/dist/components/login-screen.js +300 -0
  100. package/dist/components/login-screen.types.d.ts +82 -0
  101. package/dist/components/login-screen.types.d.ts.map +1 -0
  102. package/dist/components/login-screen.views.d.ts +114 -0
  103. package/dist/components/login-screen.views.d.ts.map +1 -0
  104. package/dist/components/login-screen.views.js +53 -0
  105. package/dist/components/menubar.d.ts +27 -0
  106. package/dist/components/menubar.d.ts.map +1 -0
  107. package/dist/components/menubar.js +55 -0
  108. package/dist/components/navigation-menu.d.ts +15 -0
  109. package/dist/components/navigation-menu.d.ts.map +1 -0
  110. package/dist/components/navigation-menu.js +33 -0
  111. package/dist/components/pagination.d.ts +14 -0
  112. package/dist/components/pagination.d.ts.map +1 -0
  113. package/dist/components/pagination.js +31 -0
  114. package/dist/components/popover.d.ts +8 -0
  115. package/dist/components/popover.d.ts.map +1 -0
  116. package/dist/components/popover.js +18 -0
  117. package/dist/components/progress.d.ts +5 -0
  118. package/dist/components/progress.d.ts.map +1 -0
  119. package/dist/components/progress.js +9 -0
  120. package/dist/components/radio-group.d.ts +6 -0
  121. package/dist/components/radio-group.d.ts.map +1 -0
  122. package/dist/components/radio-group.js +13 -0
  123. package/dist/components/resizable.d.ts +9 -0
  124. package/dist/components/resizable.d.ts.map +1 -0
  125. package/dist/components/resizable.js +16 -0
  126. package/dist/components/scroll-area.d.ts +6 -0
  127. package/dist/components/scroll-area.d.ts.map +1 -0
  128. package/dist/components/scroll-area.js +14 -0
  129. package/dist/components/search-bar.d.ts +15 -0
  130. package/dist/components/search-bar.d.ts.map +1 -0
  131. package/dist/components/search-bar.js +25 -0
  132. package/dist/components/segmented-control.d.ts +24 -0
  133. package/dist/components/segmented-control.d.ts.map +1 -0
  134. package/dist/components/segmented-control.js +88 -0
  135. package/dist/components/select.d.ts +16 -0
  136. package/dist/components/select.d.ts.map +1 -0
  137. package/dist/components/select.js +39 -0
  138. package/dist/components/selection-panel.d.ts +29 -0
  139. package/dist/components/selection-panel.d.ts.map +1 -0
  140. package/dist/components/selection-panel.js +255 -0
  141. package/dist/components/separator.d.ts +5 -0
  142. package/dist/components/separator.d.ts.map +1 -0
  143. package/dist/components/separator.js +9 -0
  144. package/dist/components/sheet.d.ts +17 -0
  145. package/dist/components/sheet.d.ts.map +1 -0
  146. package/dist/components/sheet.js +42 -0
  147. package/dist/components/sidebar.d.ts +70 -0
  148. package/dist/components/sidebar.d.ts.map +1 -0
  149. package/dist/components/sidebar.js +213 -0
  150. package/dist/components/skeleton.d.ts +3 -0
  151. package/dist/components/skeleton.d.ts.map +1 -0
  152. package/dist/components/skeleton.js +8 -0
  153. package/dist/components/slider.d.ts +5 -0
  154. package/dist/components/slider.d.ts.map +1 -0
  155. package/dist/components/slider.js +15 -0
  156. package/dist/components/sonner.d.ts +4 -0
  157. package/dist/components/sonner.d.ts.map +1 -0
  158. package/dist/components/sonner.js +22 -0
  159. package/dist/components/spinner.d.ts +3 -0
  160. package/dist/components/spinner.d.ts.map +1 -0
  161. package/dist/components/spinner.js +9 -0
  162. package/dist/components/switch.d.ts +5 -0
  163. package/dist/components/switch.d.ts.map +1 -0
  164. package/dist/components/switch.js +9 -0
  165. package/dist/components/table.d.ts +11 -0
  166. package/dist/components/table.d.ts.map +1 -0
  167. package/dist/components/table.js +29 -0
  168. package/dist/components/tabs.d.ts +8 -0
  169. package/dist/components/tabs.d.ts.map +1 -0
  170. package/dist/components/tabs.js +18 -0
  171. package/dist/components/textarea.d.ts +4 -0
  172. package/dist/components/textarea.d.ts.map +1 -0
  173. package/dist/components/textarea.js +8 -0
  174. package/dist/components/toggle-group.d.ts +8 -0
  175. package/dist/components/toggle-group.d.ts.map +1 -0
  176. package/dist/components/toggle-group.js +22 -0
  177. package/dist/components/toggle.d.ts +10 -0
  178. package/dist/components/toggle.d.ts.map +1 -0
  179. package/dist/components/toggle.js +27 -0
  180. package/dist/components/tooltip.d.ts +8 -0
  181. package/dist/components/tooltip.d.ts.map +1 -0
  182. package/dist/components/tooltip.js +18 -0
  183. package/dist/components/visually-hidden.d.ts +16 -0
  184. package/dist/components/visually-hidden.d.ts.map +1 -0
  185. package/dist/components/visually-hidden.js +22 -0
  186. package/dist/globals.css +646 -0
  187. package/dist/hooks/use-mobile.d.ts +2 -0
  188. package/dist/hooks/use-mobile.d.ts.map +1 -0
  189. package/dist/hooks/use-mobile.js +18 -0
  190. package/dist/index.d.ts +64 -0
  191. package/dist/index.d.ts.map +1 -0
  192. package/dist/index.js +64 -0
  193. package/dist/lib/portal-wrapper.d.ts +32 -0
  194. package/dist/lib/portal-wrapper.d.ts.map +1 -0
  195. package/dist/lib/portal-wrapper.js +34 -0
  196. package/dist/lib/utils.js +8 -0
  197. package/dist/svgs/blaze-dispatch-logo.d.ts +5 -0
  198. package/dist/svgs/blaze-dispatch-logo.d.ts.map +1 -0
  199. package/dist/svgs/blaze-dispatch-logo.js +7 -0
  200. package/dist/svgs/blaze-ecom-logo.d.ts +7 -0
  201. package/dist/svgs/blaze-ecom-logo.d.ts.map +1 -0
  202. package/dist/svgs/blaze-ecom-logo.js +7 -0
  203. package/dist/svgs/blaze-insights-logo.d.ts +5 -0
  204. package/dist/svgs/blaze-insights-logo.d.ts.map +1 -0
  205. package/dist/svgs/blaze-insights-logo.js +7 -0
  206. package/dist/svgs/blaze-lighthouse-logo.d.ts +6 -0
  207. package/dist/svgs/blaze-lighthouse-logo.d.ts.map +1 -0
  208. package/dist/svgs/blaze-lighthouse-logo.js +7 -0
  209. package/dist/svgs/blaze-pay-logo.d.ts +5 -0
  210. package/dist/svgs/blaze-pay-logo.d.ts.map +1 -0
  211. package/dist/svgs/blaze-pay-logo.js +7 -0
  212. package/dist/svgs/blaze-pos-logo.d.ts +5 -0
  213. package/dist/svgs/blaze-pos-logo.d.ts.map +1 -0
  214. package/dist/svgs/blaze-pos-logo.js +7 -0
  215. package/dist/svgs/blaze-retail-logo.d.ts +7 -0
  216. package/dist/svgs/blaze-retail-logo.d.ts.map +1 -0
  217. package/dist/svgs/blaze-retail-logo.js +7 -0
  218. package/dist/svgs/blaze-sites-logo.d.ts +5 -0
  219. package/dist/svgs/blaze-sites-logo.d.ts.map +1 -0
  220. package/dist/svgs/blaze-sites-logo.js +7 -0
  221. package/package.json +86 -21
  222. package/build/components/button.d.ts +0 -12
  223. package/build/components/button.d.ts.map +0 -1
  224. package/build/components/button.js +0 -106
  225. package/build/components/button.js.map +0 -1
  226. package/build/index.d.ts +0 -4
  227. package/build/index.d.ts.map +0 -1
  228. package/build/index.js +0 -11
  229. package/build/index.js.map +0 -1
  230. package/build/lib/utils.js +0 -9
  231. package/build/lib/utils.js.map +0 -1
  232. package/build/styles/blaze-ui.css +0 -157
  233. package/build/styles/styles.d.ts +0 -3
  234. package/build/styles/styles.d.ts.map +0 -1
  235. package/build/styles/styles.js +0 -8
  236. package/build/styles/styles.js.map +0 -1
  237. package/src/styles/blaze-ui.css +0 -157
  238. package/src/styles/styles.ts +0 -5
  239. /package/{build → dist}/lib/utils.d.ts +0 -0
  240. /package/{build → dist}/lib/utils.d.ts.map +0 -0
@@ -0,0 +1,35 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { cva } from 'class-variance-authority';
3
+ import { cn } from '../lib/utils.js';
4
+
5
+ function Empty({ className, ...props }) {
6
+ return (jsx("div", { "data-slot": "empty", className: cn("tw:flex tw:min-w-0 tw:flex-1 tw:flex-col tw:items-center tw:justify-center tw:gap-6 tw:rounded-lg tw:border-dashed tw:p-6 tw:text-center tw:text-balance tw:md:p-12", className), ...props }));
7
+ }
8
+ function EmptyHeader({ className, ...props }) {
9
+ return (jsx("div", { "data-slot": "empty-header", className: cn("tw:flex tw:max-w-sm tw:flex-col tw:items-center tw:gap-2 tw:text-center", className), ...props }));
10
+ }
11
+ const emptyMediaVariants = cva("tw:flex tw:shrink-0 tw:items-center tw:justify-center tw:mb-2 tw:[&_svg]:pointer-events-none tw:[&_svg]:shrink-0", {
12
+ variants: {
13
+ variant: {
14
+ default: "tw:bg-transparent",
15
+ icon: "tw:bg-muted tw:text-foreground tw:flex tw:size-10 tw:shrink-0 tw:items-center tw:justify-center tw:rounded-lg tw:[&_svg:not([class*='size-'])]:size-6",
16
+ },
17
+ },
18
+ defaultVariants: {
19
+ variant: "default",
20
+ },
21
+ });
22
+ function EmptyMedia({ className, variant = "default", ...props }) {
23
+ return (jsx("div", { "data-slot": "empty-icon", "data-variant": variant, className: cn(emptyMediaVariants({ variant, className })), ...props }));
24
+ }
25
+ function EmptyTitle({ className, ...props }) {
26
+ return (jsx("div", { "data-slot": "empty-title", className: cn("tw:text-lg tw:font-medium tw:tracking-tight", className), ...props }));
27
+ }
28
+ function EmptyDescription({ className, ...props }) {
29
+ return (jsx("div", { "data-slot": "empty-description", className: cn("tw:text-muted-foreground tw:[&>a:hover]:text-primary tw:text-sm/relaxed tw:[&>a]:underline tw:[&>a]:underline-offset-4", className), ...props }));
30
+ }
31
+ function EmptyContent({ className, ...props }) {
32
+ return (jsx("div", { "data-slot": "empty-content", className: cn("tw:flex tw:w-full tw:max-w-sm tw:min-w-0 tw:flex-col tw:items-center tw:gap-4 tw:text-sm tw:text-balance", className), ...props }));
33
+ }
34
+
35
+ export { Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle };
@@ -0,0 +1,25 @@
1
+ import { type VariantProps } from "class-variance-authority";
2
+ import { Label } from "../components/label";
3
+ declare function FieldSet({ className, ...props }: React.ComponentProps<"fieldset">): import("react/jsx-runtime").JSX.Element;
4
+ declare function FieldLegend({ className, variant, ...props }: React.ComponentProps<"legend"> & {
5
+ variant?: "legend" | "label";
6
+ }): import("react/jsx-runtime").JSX.Element;
7
+ declare function FieldGroup({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
8
+ declare const fieldVariants: (props?: ({
9
+ orientation?: "horizontal" | "vertical" | "responsive" | null | undefined;
10
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
11
+ declare function Field({ className, orientation, ...props }: React.ComponentProps<"div"> & VariantProps<typeof fieldVariants>): import("react/jsx-runtime").JSX.Element;
12
+ declare function FieldContent({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
13
+ declare function FieldLabel({ className, ...props }: React.ComponentProps<typeof Label>): import("react/jsx-runtime").JSX.Element;
14
+ declare function FieldTitle({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
15
+ declare function FieldDescription({ className, ...props }: React.ComponentProps<"p">): import("react/jsx-runtime").JSX.Element;
16
+ declare function FieldSeparator({ children, className, ...props }: React.ComponentProps<"div"> & {
17
+ children?: React.ReactNode;
18
+ }): import("react/jsx-runtime").JSX.Element;
19
+ declare function FieldError({ className, children, errors, ...props }: React.ComponentProps<"div"> & {
20
+ errors?: Array<{
21
+ message?: string;
22
+ } | undefined>;
23
+ }): import("react/jsx-runtime").JSX.Element | null;
24
+ export { Field, FieldLabel, FieldDescription, FieldError, FieldGroup, FieldLegend, FieldSeparator, FieldSet, FieldContent, FieldTitle, };
25
+ //# sourceMappingURL=field.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../../src/components/field.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAGjE,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAG3C,iBAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,2CAY1E;AAED,iBAAS,WAAW,CAAC,EACnB,SAAS,EACT,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAA;CAAE,2CAcnE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAWvE;AAED,QAAA,MAAM,aAAa;;8EAsBlB,CAAA;AAED,iBAAS,KAAK,CAAC,EACb,SAAS,EACT,WAAwB,EACxB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,OAAO,aAAa,CAAC,2CAUlE;AAED,iBAAS,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAWzE;AAED,iBAAS,UAAU,CAAC,EAClB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,KAAK,CAAC,2CAapC;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAWvE;AAED,iBAAS,gBAAgB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,2CAa3E;AAED,iBAAS,cAAc,CAAC,EACtB,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC3B,2CAsBA;AAED,iBAAS,UAAU,CAAC,EAClB,SAAS,EACT,QAAQ,EACR,MAAM,EACN,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC,CAAA;CACjD,kDAsCA;AAED,OAAO,EACL,KAAK,EACL,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,WAAW,EACX,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,UAAU,GACX,CAAA"}
@@ -0,0 +1,74 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { useMemo } from 'react';
3
+ import { cva } from 'class-variance-authority';
4
+ import { cn } from '../lib/utils.js';
5
+ import { Label } from './label.js';
6
+ import { Separator } from './separator.js';
7
+
8
+ function FieldSet({ className, ...props }) {
9
+ return (jsx("fieldset", { "data-slot": "field-set", className: cn("tw:flex tw:flex-col tw:gap-6", "has-[>[data-slot=checkbox-group]]:tw:gap-3 has-[>[data-slot=radio-group]]:tw:gap-3", className), ...props }));
10
+ }
11
+ function FieldLegend({ className, variant = "legend", ...props }) {
12
+ return (jsx("legend", { "data-slot": "field-legend", "data-variant": variant, className: cn("tw:mb-3 tw:font-medium", "data-[variant=legend]:tw:text-base", "data-[variant=label]:tw:text-sm", className), ...props }));
13
+ }
14
+ function FieldGroup({ className, ...props }) {
15
+ return (jsx("div", { "data-slot": "field-group", className: cn("group/field-group @container/field-group tw:flex tw:w-full tw:flex-col tw:gap-7 data-[slot=checkbox-group]:tw:gap-3 [&>[data-slot=field-group]]:tw:gap-4", className), ...props }));
16
+ }
17
+ const fieldVariants = cva("group/field tw:flex tw:w-full tw:gap-3 data-[invalid=true]:tw:text-destructive", {
18
+ variants: {
19
+ orientation: {
20
+ vertical: ["tw:flex-col [&>*]:tw:w-full [&>.tw:sr-only]:tw:w-auto"],
21
+ horizontal: [
22
+ "tw:flex-row tw:items-center",
23
+ "[&>[data-slot=field-label]]:tw:flex-auto",
24
+ "has-[>[data-slot=field-content]]:tw:items-start has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:tw:mt-px",
25
+ ],
26
+ responsive: [
27
+ "tw:flex-col [&>*]:tw:w-full [&>.tw:sr-only]:tw:w-auto @md/field-group:tw:flex-row @md/field-group:tw:items-center @md/field-group:[&>*]:tw:w-auto",
28
+ "@md/field-group:[&>[data-slot=field-label]]:tw:flex-auto",
29
+ "@md/field-group:has-[>[data-slot=field-content]]:tw:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:tw:mt-px",
30
+ ],
31
+ },
32
+ },
33
+ defaultVariants: {
34
+ orientation: "vertical",
35
+ },
36
+ });
37
+ function Field({ className, orientation = "vertical", ...props }) {
38
+ return (jsx("div", { role: "group", "data-slot": "field", "data-orientation": orientation, className: cn(fieldVariants({ orientation }), className), ...props }));
39
+ }
40
+ function FieldContent({ className, ...props }) {
41
+ return (jsx("div", { "data-slot": "field-content", className: cn("group/field-content tw:flex tw:flex-1 tw:flex-col tw:gap-1.5 tw:leading-snug", className), ...props }));
42
+ }
43
+ function FieldLabel({ className, ...props }) {
44
+ return (jsx(Label, { "data-slot": "field-label", className: cn("group/field-label peer/field-label tw:flex tw:w-fit tw:gap-2 tw:leading-snug group-data-[disabled=true]/field:tw:opacity-50", "has-[>[data-slot=field]]:tw:w-full has-[>[data-slot=field]]:tw:flex-col has-[>[data-slot=field]]:tw:rounded-md has-[>[data-slot=field]]:tw:border [&>*]:data-[slot=field]:tw:p-4", "has-data-[state=checked]:tw:bg-primary/5 has-data-[state=checked]:tw:border-primary dark:has-data-[state=checked]:tw:bg-primary/10", className), ...props }));
45
+ }
46
+ function FieldTitle({ className, ...props }) {
47
+ return (jsx("div", { "data-slot": "field-label", className: cn("tw:flex tw:w-fit tw:items-center tw:gap-2 tw:text-sm tw:leading-snug tw:font-medium group-data-[disabled=true]/field:tw:opacity-50", className), ...props }));
48
+ }
49
+ function FieldDescription({ className, ...props }) {
50
+ return (jsx("p", { "data-slot": "field-description", className: cn("tw:text-muted-foreground tw:text-sm tw:leading-normal tw:font-normal group-has-[[data-orientation=horizontal]]/field:tw:text-balance", "last:tw:mt-0 nth-last-2:tw:-mt-1 [[data-variant=legend]+&]:tw:-mt-1.5", "[&>a:hover]:tw:text-primary [&>a]:tw:underline [&>a]:tw:underline-offset-4", className), ...props }));
51
+ }
52
+ function FieldSeparator({ children, className, ...props }) {
53
+ return (jsxs("div", { "data-slot": "field-separator", "data-content": !!children, className: cn("tw:relative tw:-my-2 tw:h-5 tw:text-sm group-data-[variant=outline]/field-group:tw:-mb-2", className), ...props, children: [jsx(Separator, { className: "tw:absolute tw:inset-0 tw:top-1/2" }), children && (jsx("span", { className: "tw:bg-background tw:text-muted-foreground tw:relative tw:mx-auto tw:block tw:w-fit tw:px-2", "data-slot": "field-separator-content", children: children }))] }));
54
+ }
55
+ function FieldError({ className, children, errors, ...props }) {
56
+ const content = useMemo(() => {
57
+ if (children) {
58
+ return children;
59
+ }
60
+ if (!errors?.length) {
61
+ return null;
62
+ }
63
+ if (errors?.length == 1) {
64
+ return errors[0]?.message;
65
+ }
66
+ return (jsx("ul", { className: "tw:ml-4 tw:flex tw:list-disc tw:flex-col tw:gap-1", children: errors.map((error, index) => error?.message && jsx("li", { children: error.message }, index)) }));
67
+ }, [children, errors]);
68
+ if (!content) {
69
+ return null;
70
+ }
71
+ return (jsx("div", { role: "alert", "data-slot": "field-error", className: cn("tw:text-destructive tw:text-sm tw:font-normal", className), ...props, children: content }));
72
+ }
73
+
74
+ export { Field, FieldContent, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTitle };
@@ -0,0 +1,25 @@
1
+ import * as React from "react";
2
+ import * as LabelPrimitive from "@radix-ui/react-label";
3
+ import { Slot } from "@radix-ui/react-slot";
4
+ import { FormProvider, type ControllerProps, type FieldPath, type FieldValues } from "react-hook-form";
5
+ declare const Form: typeof FormProvider;
6
+ declare const FormField: <TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>({ ...props }: ControllerProps<TFieldValues, TName>) => import("react/jsx-runtime").JSX.Element;
7
+ declare const useFormField: () => {
8
+ invalid: boolean;
9
+ isDirty: boolean;
10
+ isTouched: boolean;
11
+ isValidating: boolean;
12
+ error?: import("react-hook-form").FieldError;
13
+ id: string;
14
+ name: string;
15
+ formItemId: string;
16
+ formDescriptionId: string;
17
+ formMessageId: string;
18
+ };
19
+ declare function FormItem({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
20
+ declare function FormLabel({ className, ...props }: React.ComponentProps<typeof LabelPrimitive.Root>): import("react/jsx-runtime").JSX.Element;
21
+ declare function FormControl({ ...props }: React.ComponentProps<typeof Slot>): import("react/jsx-runtime").JSX.Element;
22
+ declare function FormDescription({ className, ...props }: React.ComponentProps<"p">): import("react/jsx-runtime").JSX.Element;
23
+ declare function FormMessage({ className, ...props }: React.ComponentProps<"p">): import("react/jsx-runtime").JSX.Element | null;
24
+ export { useFormField, Form, FormItem, FormLabel, FormControl, FormDescription, FormMessage, FormField, };
25
+ //# sourceMappingURL=form.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../../src/components/form.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,cAAc,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAC3C,OAAO,EAEL,YAAY,EAGZ,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAA;AAKxB,QAAA,MAAM,IAAI,EAAE,OAAO,YAA2B,CAAA;AAa9C,QAAA,MAAM,SAAS,GACb,YAAY,SAAS,WAAW,GAAG,WAAW,EAC9C,KAAK,SAAS,SAAS,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC,YAAY,CAAC,EAC/D,cAEC,eAAe,CAAC,YAAY,EAAE,KAAK,CAAC,4CAMtC,CAAA;AAED,QAAA,MAAM,YAAY;;;;;;;;;;;CAqBjB,CAAA;AAUD,iBAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAYrE;AAED,iBAAS,SAAS,CAAC,EACjB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,cAAc,CAAC,IAAI,CAAC,2CAYlD;AAED,iBAAS,WAAW,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,IAAI,CAAC,2CAgBnE;AAED,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,2CAW1E;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,kDAkBtE;AAED,OAAO,EACL,YAAY,EACZ,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,WAAW,EACX,eAAe,EACf,WAAW,EACX,SAAS,GACV,CAAA"}
@@ -0,0 +1,60 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import { Slot } from '@radix-ui/react-slot';
4
+ import { FormProvider, useFormContext, useFormState, Controller } from 'react-hook-form';
5
+ import { cn } from '../lib/utils.js';
6
+ import { Label } from './label.js';
7
+
8
+ const Form = FormProvider;
9
+ const FormFieldContext = React.createContext({});
10
+ const FormField = ({ ...props }) => {
11
+ return (jsx(FormFieldContext.Provider, { value: { name: props.name }, children: jsx(Controller, { ...props }) }));
12
+ };
13
+ const useFormField = () => {
14
+ const fieldContext = React.useContext(FormFieldContext);
15
+ const itemContext = React.useContext(FormItemContext);
16
+ const { getFieldState } = useFormContext();
17
+ const formState = useFormState({ name: fieldContext.name });
18
+ const fieldState = getFieldState(fieldContext.name, formState);
19
+ if (!fieldContext) {
20
+ throw new Error("useFormField should be used within <FormField>");
21
+ }
22
+ const { id } = itemContext;
23
+ return {
24
+ id,
25
+ name: fieldContext.name,
26
+ formItemId: `${id}-form-item`,
27
+ formDescriptionId: `${id}-form-item-description`,
28
+ formMessageId: `${id}-form-item-message`,
29
+ ...fieldState,
30
+ };
31
+ };
32
+ const FormItemContext = React.createContext({});
33
+ function FormItem({ className, ...props }) {
34
+ const id = React.useId();
35
+ return (jsx(FormItemContext.Provider, { value: { id }, children: jsx("div", { "data-slot": "form-item", className: cn("tw:grid tw:gap-2", className), ...props }) }));
36
+ }
37
+ function FormLabel({ className, ...props }) {
38
+ const { error, formItemId } = useFormField();
39
+ return (jsx(Label, { "data-slot": "form-label", "data-error": !!error, className: cn("data-[error=true]:tw:text-destructive", className), htmlFor: formItemId, ...props }));
40
+ }
41
+ function FormControl({ ...props }) {
42
+ const { error, formItemId, formDescriptionId, formMessageId } = useFormField();
43
+ return (jsx(Slot, { "data-slot": "form-control", id: formItemId, "aria-describedby": !error
44
+ ? `${formDescriptionId}`
45
+ : `${formDescriptionId} ${formMessageId}`, "aria-invalid": !!error, ...props }));
46
+ }
47
+ function FormDescription({ className, ...props }) {
48
+ const { formDescriptionId } = useFormField();
49
+ return (jsx("p", { "data-slot": "form-description", id: formDescriptionId, className: cn("tw:text-muted-foreground tw:text-sm", className), ...props }));
50
+ }
51
+ function FormMessage({ className, ...props }) {
52
+ const { error, formMessageId } = useFormField();
53
+ const body = error ? String(error?.message ?? "") : props.children;
54
+ if (!body) {
55
+ return null;
56
+ }
57
+ return (jsx("p", { "data-slot": "form-message", id: formMessageId, className: cn("tw:text-destructive tw:text-sm", className), ...props, children: body }));
58
+ }
59
+
60
+ export { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, useFormField };
@@ -0,0 +1,50 @@
1
+ declare const AppsConfig: readonly [{
2
+ readonly name: "Retail";
3
+ readonly logo: import("react/jsx-runtime").JSX.Element;
4
+ readonly subdomain: "retail-beta";
5
+ }, {
6
+ readonly name: "POS";
7
+ readonly logo: import("react/jsx-runtime").JSX.Element;
8
+ readonly subdomain: "pos";
9
+ }, {
10
+ readonly name: "Ecom";
11
+ readonly logo: import("react/jsx-runtime").JSX.Element;
12
+ readonly subdomain: "ecom-beta";
13
+ }, {
14
+ readonly name: "Lighthouse";
15
+ readonly logo: import("react/jsx-runtime").JSX.Element;
16
+ readonly subdomain: "lighthouse";
17
+ }, {
18
+ readonly name: "Sites";
19
+ readonly logo: import("react/jsx-runtime").JSX.Element;
20
+ readonly subdomain: "cms";
21
+ }, {
22
+ readonly name: "Pay";
23
+ readonly logo: import("react/jsx-runtime").JSX.Element;
24
+ readonly badge: "Soon";
25
+ readonly disabled: true;
26
+ readonly subdomain: null;
27
+ }, {
28
+ readonly name: "Insight";
29
+ readonly logo: import("react/jsx-runtime").JSX.Element;
30
+ readonly disabled: true;
31
+ readonly subdomain: null;
32
+ }, {
33
+ readonly name: "Dispatch";
34
+ readonly logo: import("react/jsx-runtime").JSX.Element;
35
+ readonly disabled: true;
36
+ readonly subdomain: null;
37
+ }];
38
+ type AppName = (typeof AppsConfig)[number]["name"];
39
+ type HeaderAppSwitcherProps = {
40
+ /**
41
+ * Optional base host string (e.g. "https://blaze.me" or "staging.blaze.me").
42
+ * When omitted, the host is inferred from `window.location`.
43
+ */
44
+ commonHost?: string;
45
+ /** Which app is currently active. Defaults to "Retail". */
46
+ currentApp?: AppName;
47
+ };
48
+ declare function HeaderAppSwitcher({ commonHost, currentApp, }: HeaderAppSwitcherProps): import("react/jsx-runtime").JSX.Element;
49
+ export { HeaderAppSwitcher, type HeaderAppSwitcherProps, type AppName };
50
+ //# sourceMappingURL=header-app-switcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header-app-switcher.d.ts","sourceRoot":"","sources":["../../src/components/header-app-switcher.tsx"],"names":[],"mappings":"AAqBA,QAAA,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6BN,CAAA;AAEV,KAAK,OAAO,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAA;AAgHlD,KAAK,sBAAsB,GAAG;IAC5B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,CAAA;AAYD,iBAAS,iBAAiB,CAAC,EACzB,UAAU,EACV,UAAqB,GACtB,EAAE,sBAAsB,2CA4ExB;AAED,OAAO,EAAE,iBAAiB,EAAE,KAAK,sBAAsB,EAAE,KAAK,OAAO,EAAE,CAAA"}
@@ -0,0 +1,154 @@
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import { Button } from './button.js';
4
+ import { Popover, PopoverTrigger, PopoverContent } from './popover.js';
5
+ import { BlazeDispatchLogo } from '../svgs/blaze-dispatch-logo.js';
6
+ import { BlazeRetailLogo } from '../svgs/blaze-retail-logo.js';
7
+ import { BlazePosLogo } from '../svgs/blaze-pos-logo.js';
8
+ import { BlazeEcomLogo } from '../svgs/blaze-ecom-logo.js';
9
+ import { BlazeLighthouseLogo } from '../svgs/blaze-lighthouse-logo.js';
10
+ import { BlazeSitesLogo } from '../svgs/blaze-sites-logo.js';
11
+ import { BlazePayLogo } from '../svgs/blaze-pay-logo.js';
12
+ import { BlazeInsightsLogo } from '../svgs/blaze-insights-logo.js';
13
+ import { cn } from '../lib/utils.js';
14
+
15
+ const AppsConfig = [
16
+ { name: "Retail", logo: jsx(BlazeRetailLogo, {}), subdomain: "retail-beta" },
17
+ { name: "POS", logo: jsx(BlazePosLogo, {}), subdomain: "pos" },
18
+ { name: "Ecom", logo: jsx(BlazeEcomLogo, {}), subdomain: "ecom-beta" },
19
+ {
20
+ name: "Lighthouse",
21
+ logo: jsx(BlazeLighthouseLogo, {}),
22
+ subdomain: "lighthouse",
23
+ },
24
+ { name: "Sites", logo: jsx(BlazeSitesLogo, {}), subdomain: "cms" },
25
+ {
26
+ name: "Pay",
27
+ logo: jsx(BlazePayLogo, {}),
28
+ badge: "Soon",
29
+ disabled: true,
30
+ subdomain: null,
31
+ },
32
+ {
33
+ name: "Insight",
34
+ logo: jsx(BlazeInsightsLogo, {}),
35
+ disabled: true,
36
+ subdomain: null,
37
+ },
38
+ {
39
+ name: "Dispatch",
40
+ logo: jsx(BlazeDispatchLogo, {}),
41
+ disabled: true,
42
+ subdomain: null,
43
+ },
44
+ ];
45
+ const trimSlashes = (value) => value.trim().replace(/\/+$/, "");
46
+ const toHostInfo = (value) => {
47
+ const normalized = trimSlashes(value);
48
+ if (!normalized)
49
+ return null;
50
+ try {
51
+ const withProtocol = normalized.includes("://")
52
+ ? normalized
53
+ : `https://${normalized}`;
54
+ const parsed = new URL(withProtocol);
55
+ return {
56
+ protocol: parsed.protocol,
57
+ host: parsed.host,
58
+ };
59
+ }
60
+ catch {
61
+ return null;
62
+ }
63
+ };
64
+ const BASE_HOST_PREFIXES = ["app.", "auth.", "auth-beta."];
65
+ const normalizeBaseHost = (host) => {
66
+ const normalized = host.toLowerCase();
67
+ const matchedPrefix = BASE_HOST_PREFIXES.find((prefix) => normalized.startsWith(prefix));
68
+ if (!matchedPrefix) {
69
+ return host;
70
+ }
71
+ return host.slice(matchedPrefix.length);
72
+ };
73
+ const resolveHostInfo = (commonHost) => {
74
+ if (commonHost) {
75
+ const fromProp = toHostInfo(commonHost);
76
+ if (fromProp) {
77
+ return {
78
+ ...fromProp,
79
+ host: normalizeBaseHost(fromProp.host),
80
+ };
81
+ }
82
+ }
83
+ if (typeof window !== "undefined") {
84
+ const { protocol, hostname, host } = window.location;
85
+ if (hostname === "localhost" || hostname === "127.0.0.1") {
86
+ return {
87
+ protocol: "https:",
88
+ host: "staging.blaze.me",
89
+ };
90
+ }
91
+ const parts = hostname.split(".");
92
+ if (parts.length > 2) {
93
+ return {
94
+ protocol,
95
+ host: parts.slice(1).join("."),
96
+ };
97
+ }
98
+ return {
99
+ protocol,
100
+ host,
101
+ };
102
+ }
103
+ return {
104
+ protocol: "https:",
105
+ host: "blaze.me",
106
+ };
107
+ };
108
+ const buildAppUrl = (subdomain, base) => {
109
+ if (!subdomain)
110
+ return "#";
111
+ return `${base.protocol}//${subdomain}.${base.host}`;
112
+ };
113
+ function AppsGridIcon() {
114
+ return (jsxs("svg", { "aria-hidden": true, viewBox: "0 0 24 24", fill: "currentColor", className: "tw:h-5 tw:w-5", children: [jsx("circle", { cx: "5", cy: "5", r: "1.5" }), jsx("circle", { cx: "12", cy: "5", r: "1.5" }), jsx("circle", { cx: "19", cy: "5", r: "1.5" }), jsx("circle", { cx: "5", cy: "12", r: "1.5" }), jsx("circle", { cx: "12", cy: "12", r: "1.5" }), jsx("circle", { cx: "19", cy: "12", r: "1.5" }), jsx("circle", { cx: "5", cy: "19", r: "1.5" }), jsx("circle", { cx: "12", cy: "19", r: "1.5" }), jsx("circle", { cx: "19", cy: "19", r: "1.5" })] }));
115
+ }
116
+ const getTileClassName = (isCurrent, isDisabled) => {
117
+ if (isCurrent) {
118
+ return "tw:bg-primary/10 tw:ring-2 tw:ring-primary/20";
119
+ }
120
+ if (isDisabled) {
121
+ return "tw:cursor-not-allowed tw:opacity-60";
122
+ }
123
+ return "hover:tw:bg-accent tw:cursor-pointer";
124
+ };
125
+ function HeaderAppSwitcher({ commonHost, currentApp = "Retail", }) {
126
+ const apps = React.useMemo(() => {
127
+ const base = resolveHostInfo(commonHost);
128
+ return AppsConfig.map((app) => ({
129
+ ...app,
130
+ isCurrent: currentApp === app.name,
131
+ href: buildAppUrl(app.subdomain, base),
132
+ }));
133
+ }, [commonHost, currentApp]);
134
+ return (jsxs(Popover, { children: [jsx(PopoverTrigger, { asChild: true, children: jsxs(Button, { variant: "ghost", size: "icon", children: [jsx(AppsGridIcon, {}), jsx("span", { className: "tw:sr-only", children: "Switch apps" })] }) }), jsxs(PopoverContent, { align: "end", sideOffset: 8, className: "tw:w-72 tw:p-4", children: [jsx("p", { className: "tw:mb-3 tw:text-sm tw:font-medium tw:text-muted-foreground", children: "Blaze Apps" }), jsx("div", { className: "tw:grid tw:grid-cols-3 tw:gap-1", children: apps.map((app) => {
135
+ const isDisabled = Boolean(app.disabled);
136
+ const isCurrent = Boolean(app.isCurrent);
137
+ const tileClassName = getTileClassName(isCurrent, isDisabled);
138
+ const tileContent = (jsxs(Fragment, { children: [app.badge ? (jsx("span", { className: "tw:absolute tw:right-1 tw:top-1 tw:rounded-full tw:bg-primary tw:px-1.5 tw:py-0.5 tw:text-[10px] tw:font-semibold tw:leading-none tw:text-primary-foreground", children: app.badge })) : null, app.logo, jsx("span", { className: cn("tw:text-center tw:text-[11px] tw:font-medium tw:leading-tight", isCurrent
139
+ ? "tw:font-semibold tw:text-primary"
140
+ : "tw:text-foreground"), children: app.name })] }));
141
+ const baseClassName = `tw:relative tw:flex tw:flex-col tw:items-center tw:gap-2 tw:rounded-lg tw:p-3 tw:transition-colors ${tileClassName}`;
142
+ const Wrapper = isDisabled || isCurrent ? "div" : "a";
143
+ const wrapperProps = isDisabled || isCurrent
144
+ ? {}
145
+ : {
146
+ href: app.href,
147
+ target: "_blank",
148
+ rel: "noopener noreferrer",
149
+ };
150
+ return (jsx(Wrapper, { className: baseClassName, ...wrapperProps, children: tileContent }, app.name));
151
+ }) })] })] }));
152
+ }
153
+
154
+ export { HeaderAppSwitcher };
@@ -0,0 +1,21 @@
1
+ import * as React from "react";
2
+ interface HierarchicalSelectItem {
3
+ id: string;
4
+ label: string;
5
+ parentId?: string | null;
6
+ }
7
+ interface HierarchicalSelectProps {
8
+ items: HierarchicalSelectItem[];
9
+ value?: string;
10
+ onValueChange?: (value: string) => void;
11
+ placeholder?: string;
12
+ searchPlaceholder?: string;
13
+ emptyMessage?: string;
14
+ className?: string;
15
+ triggerStyle?: React.CSSProperties;
16
+ disabled?: boolean;
17
+ }
18
+ declare function HierarchicalSelect({ items, value, onValueChange, placeholder, searchPlaceholder, emptyMessage, className, triggerStyle, disabled, }: HierarchicalSelectProps): import("react/jsx-runtime").JSX.Element;
19
+ export { HierarchicalSelect };
20
+ export type { HierarchicalSelectItem, HierarchicalSelectProps };
21
+ //# sourceMappingURL=hierarchical-select.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hierarchical-select.d.ts","sourceRoot":"","sources":["../../src/components/hierarchical-select.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAW9B,UAAU,sBAAsB;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAED,UAAU,uBAAuB;IAC/B,KAAK,EAAE,sBAAsB,EAAE,CAAA;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAuED,iBAAS,kBAAkB,CAAC,EAC1B,KAAK,EACL,KAAK,EACL,aAAa,EACb,WAAmC,EACnC,iBAA+B,EAC/B,YAAiC,EACjC,SAAS,EACT,YAAY,EACZ,QAAgB,GACjB,EAAE,uBAAuB,2CAqOzB;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAA;AAC7B,YAAY,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,CAAA"}
@@ -0,0 +1,96 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import * as PopoverPrimitive from '@radix-ui/react-popover';
4
+ import { ChevronDownIcon, SearchIcon, FolderTreeIcon, CheckIcon } from 'lucide-react';
5
+ import { cn } from '../lib/utils.js';
6
+
7
+ function buildHierarchy(items) {
8
+ const parents = items.filter((item) => !item.parentId);
9
+ const childrenMap = new Map();
10
+ for (const item of items) {
11
+ if (item.parentId) {
12
+ const existing = childrenMap.get(item.parentId) ?? [];
13
+ existing.push(item);
14
+ childrenMap.set(item.parentId, existing);
15
+ }
16
+ }
17
+ return parents.map((parent) => ({
18
+ parent,
19
+ children: childrenMap.get(parent.id) ?? [],
20
+ }));
21
+ }
22
+ function filterHierarchy(groups, search) {
23
+ if (!search)
24
+ return groups;
25
+ const query = search.toLowerCase();
26
+ return groups.reduce((acc, group) => {
27
+ const parentMatches = group.parent.label.toLowerCase().includes(query);
28
+ if (parentMatches) {
29
+ acc.push(group);
30
+ return acc;
31
+ }
32
+ const matchingChildren = group.children.filter((child) => child.label.toLowerCase().includes(query));
33
+ if (matchingChildren.length > 0) {
34
+ acc.push({ parent: group.parent, children: matchingChildren });
35
+ }
36
+ return acc;
37
+ }, []);
38
+ }
39
+ function getDisplayValue(items, value) {
40
+ if (!value)
41
+ return undefined;
42
+ const selected = items.find((item) => item.id === value);
43
+ if (!selected)
44
+ return undefined;
45
+ if (selected.parentId) {
46
+ const parent = items.find((item) => item.id === selected.parentId);
47
+ return parent ? `${parent.label} > ${selected.label}` : selected.label;
48
+ }
49
+ return selected.label;
50
+ }
51
+ function countVisibleCategories(groups) {
52
+ return groups.reduce((count, group) => count + 1 + group.children.length, 0);
53
+ }
54
+ function HierarchicalSelect({ items, value, onValueChange, placeholder = "Select an option...", searchPlaceholder = "Search...", emptyMessage = "No results found", className, triggerStyle, disabled = false, }) {
55
+ const [open, setOpen] = React.useState(false);
56
+ const [search, setSearch] = React.useState("");
57
+ const searchInputRef = React.useRef(null);
58
+ const [portalContainer, setPortalContainer] = React.useState(null);
59
+ React.useEffect(() => {
60
+ const el = document.createElement("div");
61
+ el.className = "blaze-ui-root";
62
+ document.body.appendChild(el);
63
+ setPortalContainer(el);
64
+ return () => {
65
+ document.body.removeChild(el);
66
+ };
67
+ }, []);
68
+ const hierarchy = React.useMemo(() => buildHierarchy(items), [items]);
69
+ const filtered = React.useMemo(() => filterHierarchy(hierarchy, search), [hierarchy, search]);
70
+ const displayValue = React.useMemo(() => getDisplayValue(items, value), [items, value]);
71
+ const visibleCount = React.useMemo(() => countVisibleCategories(filtered), [filtered]);
72
+ const handleOpenChange = React.useCallback((nextOpen) => {
73
+ setOpen(nextOpen);
74
+ if (!nextOpen) {
75
+ setSearch("");
76
+ }
77
+ }, []);
78
+ const handleSelect = React.useCallback((id) => {
79
+ onValueChange?.(id);
80
+ setOpen(false);
81
+ setSearch("");
82
+ }, [onValueChange]);
83
+ React.useEffect(() => {
84
+ if (open) {
85
+ const frame = requestAnimationFrame(() => {
86
+ searchInputRef.current?.focus();
87
+ });
88
+ return () => cancelAnimationFrame(frame);
89
+ }
90
+ }, [open]);
91
+ return (jsxs(PopoverPrimitive.Root, { open: open, onOpenChange: handleOpenChange, children: [jsxs(PopoverPrimitive.Trigger, { "data-slot": "hierarchical-select-trigger", disabled: disabled, className: cn("tw:!flex tw:!w-full tw:!items-center tw:!justify-between tw:!gap-2 tw:!rounded-md tw:!border tw:!border-input tw:!bg-transparent tw:px-3 tw:py-2 tw:!text-[14px] tw:!whitespace-nowrap tw:!shadow-xs tw:!transition-[color,box-shadow] tw:!outline-none tw:h-9", "focus-visible:tw:!border-ring focus-visible:tw:!ring-ring/50 focus-visible:tw:!ring-[3px]", "disabled:tw:!cursor-not-allowed disabled:tw:!opacity-50", "dark:tw:!bg-input/30 dark:hover:tw:!bg-input/50", !displayValue && "tw:!text-muted-foreground", className), style: triggerStyle, children: [jsx("span", { "data-slot": "hierarchical-select-value", className: "tw:!truncate tw:!flex-1 tw:!text-left", children: displayValue ?? placeholder }), jsx(ChevronDownIcon, { "data-slot": "hierarchical-select-chevron", className: cn("tw:!size-4 tw:!shrink-0 tw:!opacity-50 tw:!transition-transform tw:!duration-200", open && "tw:!rotate-180") })] }), jsx(PopoverPrimitive.Portal, { container: portalContainer, children: jsxs(PopoverPrimitive.Content, { "data-slot": "hierarchical-select-content", align: "start", sideOffset: 4, className: cn("tw:!bg-popover tw:!text-popover-foreground tw:!z-[9999] tw:!w-[var(--radix-popover-trigger-width)] tw:!origin-(--radix-popover-content-transform-origin) tw:!rounded-md tw:!border tw:!shadow-md tw:!outline-hidden", "data-[state=open]:tw:!animate-in data-[state=closed]:tw:!animate-out data-[state=closed]:tw:!fade-out-0 data-[state=open]:tw:!fade-in-0 data-[state=closed]:tw:!zoom-out-95 data-[state=open]:tw:!zoom-in-95", "data-[side=bottom]:tw:!slide-in-from-top-2 data-[side=left]:tw:!slide-in-from-right-2 data-[side=right]:tw:!slide-in-from-left-2 data-[side=top]:tw:!slide-in-from-bottom-2"), children: [jsxs("div", { "data-slot": "hierarchical-select-search", className: "tw:!flex tw:!items-center tw:!gap-2 tw:!border-b tw:!px-3 tw:!sticky tw:!top-0 tw:!bg-popover tw:!z-10", children: [jsx(SearchIcon, { className: "tw:!size-4 tw:!shrink-0 tw:!text-muted-foreground" }), jsx("input", { ref: searchInputRef, "data-slot": "hierarchical-select-search-input", type: "text", value: search, onChange: (e) => setSearch(e.target.value), placeholder: searchPlaceholder, className: "tw:!flex tw:!h-9 tw:!w-full tw:!bg-transparent tw:!py-2 tw:!text-[14px] tw:!outline-none placeholder:tw:!text-muted-foreground" })] }), jsx("div", { "data-slot": "hierarchical-select-list", className: "tw:!max-h-[320px] tw:!overflow-y-auto tw:!overflow-x-hidden tw:!p-1", children: filtered.length === 0 ? (jsxs("div", { "data-slot": "hierarchical-select-empty", className: "tw:!flex tw:!flex-col tw:!items-center tw:!justify-center tw:!gap-2 tw:!py-8 tw:!text-center", children: [jsx("div", { className: "tw:!flex tw:!size-10 tw:!items-center tw:!justify-center tw:!rounded-full tw:!bg-muted", children: jsx(SearchIcon, { className: "tw:!size-4 tw:!text-muted-foreground" }) }), jsx("div", { className: "tw:!text-[14px] tw:!font-medium", children: emptyMessage }), jsx("p", { className: "tw:!text-[12px] tw:!text-muted-foreground", children: "Try adjusting your search query" })] })) : (filtered.map((group) => (jsxs("div", { "data-slot": "hierarchical-select-group", className: "tw:!mb-1", children: [jsxs("button", { type: "button", "data-slot": "hierarchical-select-parent", onClick: () => handleSelect(group.parent.id), className: cn("tw:!relative tw:!flex tw:!w-full tw:!cursor-default tw:!items-center tw:!gap-2 tw:!rounded-sm tw:!px-2 tw:!py-1.5 tw:!text-[14px] tw:!font-semibold tw:!outline-hidden tw:!select-none tw:!transition-colors", "hover:tw:!bg-accent hover:tw:!text-accent-foreground", value === group.parent.id &&
92
+ "tw:!bg-accent tw:!text-accent-foreground"), children: [jsx(FolderTreeIcon, { className: "tw:!size-4 tw:!shrink-0 tw:!text-muted-foreground" }), jsx("span", { className: "tw:!flex-1 tw:!text-left tw:!truncate", children: group.parent.label }), group.children.length > 0 && (jsx("span", { "data-slot": "hierarchical-select-badge", className: "tw:!inline-flex tw:!items-center tw:!justify-center tw:!rounded-full tw:!bg-muted tw:!px-1.5 tw:!py-0.5 tw:!text-[10px] tw:!font-medium tw:!text-muted-foreground tw:!leading-none", children: group.children.length })), value === group.parent.id && (jsx(CheckIcon, { className: "tw:!size-4 tw:!shrink-0" }))] }), group.children.length > 0 && (jsx("div", { "data-slot": "hierarchical-select-children", className: "tw:!ml-4 tw:!border-l tw:!border-border tw:!pl-2", children: group.children.map((child) => (jsxs("button", { type: "button", "data-slot": "hierarchical-select-child", onClick: () => handleSelect(child.id), className: cn("tw:!relative tw:!flex tw:!w-full tw:!cursor-default tw:!items-center tw:!gap-2 tw:!rounded-sm tw:!px-2 tw:!py-1.5 tw:!text-[14px] tw:!outline-hidden tw:!select-none tw:!transition-colors", "hover:tw:!bg-accent hover:tw:!text-accent-foreground", "tw:!text-muted-foreground", value === child.id &&
93
+ "tw:!bg-accent tw:!text-accent-foreground"), children: [jsx("span", { className: "tw:!size-1.5 tw:!rounded-full tw:!bg-muted-foreground/50 tw:!shrink-0" }), jsx("span", { className: "tw:!flex-1 tw:!text-left tw:!truncate", children: child.label }), value === child.id && (jsx(CheckIcon, { className: "tw:!size-4 tw:!shrink-0" }))] }, child.id))) }))] }, group.parent.id)))) }), jsx("div", { "data-slot": "hierarchical-select-footer", className: "tw:!border-t tw:!px-3 tw:!py-2 tw:!text-[12px] tw:!text-muted-foreground", children: search ? (jsxs("span", { children: [visibleCount, " result", visibleCount !== 1 ? "s" : "", " for \u201C", search, "\u201D"] })) : (jsxs("span", { children: [visibleCount, " categor", visibleCount !== 1 ? "ies" : "y"] })) })] }) })] }));
94
+ }
95
+
96
+ export { HierarchicalSelect };
@@ -0,0 +1,7 @@
1
+ import * as React from "react";
2
+ import * as HoverCardPrimitive from "@radix-ui/react-hover-card";
3
+ declare function HoverCard({ ...props }: React.ComponentProps<typeof HoverCardPrimitive.Root>): import("react/jsx-runtime").JSX.Element;
4
+ declare function HoverCardTrigger({ ...props }: React.ComponentProps<typeof HoverCardPrimitive.Trigger>): import("react/jsx-runtime").JSX.Element;
5
+ declare function HoverCardContent({ className, align, sideOffset, ...props }: React.ComponentProps<typeof HoverCardPrimitive.Content>): import("react/jsx-runtime").JSX.Element;
6
+ export { HoverCard, HoverCardTrigger, HoverCardContent };
7
+ //# sourceMappingURL=hover-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hover-card.d.ts","sourceRoot":"","sources":["../../src/components/hover-card.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,kBAAkB,MAAM,4BAA4B,CAAA;AAIhE,iBAAS,SAAS,CAAC,EACjB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,kBAAkB,CAAC,IAAI,CAAC,2CAEtD;AAED,iBAAS,gBAAgB,CAAC,EACxB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,kBAAkB,CAAC,OAAO,CAAC,2CAIzD;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,KAAgB,EAChB,UAAc,EACd,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,kBAAkB,CAAC,OAAO,CAAC,2CAezD;AAED,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAA"}
@@ -0,0 +1,15 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import * as HoverCardPrimitive from '@radix-ui/react-hover-card';
3
+ import { cn } from '../lib/utils.js';
4
+
5
+ function HoverCard({ ...props }) {
6
+ return jsx(HoverCardPrimitive.Root, { "data-slot": "hover-card", ...props });
7
+ }
8
+ function HoverCardTrigger({ ...props }) {
9
+ return (jsx(HoverCardPrimitive.Trigger, { "data-slot": "hover-card-trigger", ...props }));
10
+ }
11
+ function HoverCardContent({ className, align = "center", sideOffset = 4, ...props }) {
12
+ return (jsx(HoverCardPrimitive.Portal, { "data-slot": "hover-card-portal", children: jsx(HoverCardPrimitive.Content, { "data-slot": "hover-card-content", align: align, sideOffset: sideOffset, className: cn("tw:bg-popover tw:text-popover-foreground tw:data-[state=open]:animate-in tw:data-[state=closed]:animate-out tw:data-[state=closed]:fade-out-0 tw:data-[state=open]:fade-in-0 tw:data-[state=closed]:zoom-out-95 tw:data-[state=open]:zoom-in-95 tw:data-[side=bottom]:slide-in-from-top-2 tw:data-[side=left]:slide-in-from-right-2 tw:data-[side=right]:slide-in-from-left-2 tw:data-[side=top]:slide-in-from-bottom-2 tw:z-50 tw:w-64 tw:origin-(--radix-hover-card-content-transform-origin) tw:rounded-md tw:border tw:p-4 tw:shadow-md tw:outline-hidden", className), ...props }) }));
13
+ }
14
+
15
+ export { HoverCard, HoverCardContent, HoverCardTrigger };
@@ -0,0 +1,17 @@
1
+ import * as React from "react";
2
+ import { type VariantProps } from "class-variance-authority";
3
+ import { Button } from "../components/button";
4
+ declare function InputGroup({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
5
+ declare const inputGroupAddonVariants: (props?: ({
6
+ align?: "block-end" | "block-start" | "inline-end" | "inline-start" | null | undefined;
7
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
8
+ declare function InputGroupAddon({ className, align, ...props }: React.ComponentProps<"div"> & VariantProps<typeof inputGroupAddonVariants>): import("react/jsx-runtime").JSX.Element;
9
+ declare const inputGroupButtonVariants: (props?: ({
10
+ size?: "sm" | "xs" | "icon-xs" | "icon-sm" | null | undefined;
11
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
12
+ declare function InputGroupButton({ className, type, variant, size, ...props }: Omit<React.ComponentProps<typeof Button>, "size"> & VariantProps<typeof inputGroupButtonVariants>): import("react/jsx-runtime").JSX.Element;
13
+ declare function InputGroupText({ className, ...props }: React.ComponentProps<"span">): import("react/jsx-runtime").JSX.Element;
14
+ declare function InputGroupInput({ className, ...props }: React.ComponentProps<"input">): import("react/jsx-runtime").JSX.Element;
15
+ declare function InputGroupTextarea({ className, ...props }: React.ComponentProps<"textarea">): import("react/jsx-runtime").JSX.Element;
16
+ export { InputGroup, InputGroupAddon, InputGroupButton, InputGroupText, InputGroupInput, InputGroupTextarea, };
17
+ //# sourceMappingURL=input-group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-group.d.ts","sourceRoot":"","sources":["../../src/components/input-group.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAGjE,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAI7C,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CA0BvE;AAED,QAAA,MAAM,uBAAuB;;8EAmB5B,CAAA;AAED,iBAAS,eAAe,CAAC,EACvB,SAAS,EACT,KAAsB,EACtB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,OAAO,uBAAuB,CAAC,2CAgB5E;AAED,QAAA,MAAM,wBAAwB;;8EAgB7B,CAAA;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,IAAe,EACf,OAAiB,EACjB,IAAW,EACX,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,MAAM,CAAC,EAAE,MAAM,CAAC,GAClD,YAAY,CAAC,OAAO,wBAAwB,CAAC,2CAU9C;AAED,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,2CAU5E;AAED,iBAAS,eAAe,CAAC,EACvB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,2CAW/B;AAED,iBAAS,kBAAkB,CAAC,EAC1B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,2CAWlC;AAED,OAAO,EACL,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,kBAAkB,GACnB,CAAA"}