@fabio.caffarello/react-design-system 3.12.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/dist/granular/index.js +393 -389
  2. package/dist/granular/index.js.map +1 -1
  3. package/dist/granular/ui/components/Autocomplete/Autocomplete.js +103 -86
  4. package/dist/granular/ui/components/Autocomplete/Autocomplete.js.map +1 -1
  5. package/dist/granular/ui/components/Autocomplete/AutocompleteList.js +57 -47
  6. package/dist/granular/ui/components/Autocomplete/AutocompleteList.js.map +1 -1
  7. package/dist/granular/ui/components/Autocomplete/AutocompleteOption.js +21 -20
  8. package/dist/granular/ui/components/Autocomplete/AutocompleteOption.js.map +1 -1
  9. package/dist/granular/ui/components/Breadcrumb/Breadcrumb.js.map +1 -1
  10. package/dist/granular/ui/components/ButtonGroup/ButtonGroup.js +68 -0
  11. package/dist/granular/ui/components/ButtonGroup/ButtonGroup.js.map +1 -0
  12. package/dist/granular/ui/components/ColorPicker/ColorPicker.js.map +1 -1
  13. package/dist/granular/ui/components/CommandPalette/CommandPalette.js +187 -149
  14. package/dist/granular/ui/components/CommandPalette/CommandPalette.js.map +1 -1
  15. package/dist/granular/ui/components/DataGrid/DataGrid.js +92 -92
  16. package/dist/granular/ui/components/DataGrid/DataGrid.js.map +1 -1
  17. package/dist/granular/ui/components/DatePicker/DatePickerCalendar.js +154 -139
  18. package/dist/granular/ui/components/DatePicker/DatePickerCalendar.js.map +1 -1
  19. package/dist/granular/ui/components/Dialog/AlertDialog.js +73 -40
  20. package/dist/granular/ui/components/Dialog/AlertDialog.js.map +1 -1
  21. package/dist/granular/ui/components/Dialog/DialogContent.js +54 -48
  22. package/dist/granular/ui/components/Dialog/DialogContent.js.map +1 -1
  23. package/dist/granular/ui/components/Dialog/DialogDescription.js +31 -31
  24. package/dist/granular/ui/components/Dialog/DialogDescription.js.map +1 -1
  25. package/dist/granular/ui/components/Dialog/DialogTitle.js +30 -30
  26. package/dist/granular/ui/components/Dialog/DialogTitle.js.map +1 -1
  27. package/dist/granular/ui/components/Drawer/Drawer.js.map +1 -1
  28. package/dist/granular/ui/components/Dropdown/Dropdown.js.map +1 -1
  29. package/dist/granular/ui/components/EmptyState/EmptyState.js.map +1 -1
  30. package/dist/granular/ui/components/FileUpload/FileUpload.js.map +1 -1
  31. package/dist/granular/ui/components/Form/Form.js +38 -37
  32. package/dist/granular/ui/components/Form/Form.js.map +1 -1
  33. package/dist/granular/ui/components/Form/FormField.js +28 -26
  34. package/dist/granular/ui/components/Form/FormField.js.map +1 -1
  35. package/dist/granular/ui/components/Header/Header.js.map +1 -1
  36. package/dist/granular/ui/components/Header/components/HeaderActions.js.map +1 -1
  37. package/dist/granular/ui/components/Header/components/HeaderHamburger.js.map +1 -1
  38. package/dist/granular/ui/components/Header/components/HeaderLogo.js.map +1 -1
  39. package/dist/granular/ui/components/Header/components/HeaderMobileMenu.js.map +1 -1
  40. package/dist/granular/ui/components/Header/components/HeaderNavigation.js.map +1 -1
  41. package/dist/granular/ui/components/Header/contexts/HeaderContext.js.map +1 -1
  42. package/dist/granular/ui/components/Menu/Menu.js.map +1 -1
  43. package/dist/granular/ui/components/Modal/Modal.js +98 -86
  44. package/dist/granular/ui/components/Modal/Modal.js.map +1 -1
  45. package/dist/granular/ui/components/MultiSelect/MultiSelect.js +122 -106
  46. package/dist/granular/ui/components/MultiSelect/MultiSelect.js.map +1 -1
  47. package/dist/granular/ui/components/Navigation/Navigation.js.map +1 -1
  48. package/dist/granular/ui/components/PageHeader/PageHeader.js.map +1 -1
  49. package/dist/granular/ui/components/Pagination/Pagination.js.map +1 -1
  50. package/dist/granular/ui/components/Popover/Popover.js.map +1 -1
  51. package/dist/granular/ui/components/Rating/Rating.js.map +1 -1
  52. package/dist/granular/ui/components/SearchInput/SearchInput.js.map +1 -1
  53. package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarGroup.js +82 -64
  54. package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarGroup.js.map +1 -1
  55. package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarItem.js +30 -29
  56. package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarItem.js.map +1 -1
  57. package/dist/granular/ui/components/SideNavbar/components/SideNavbarResizeHandle.js +37 -35
  58. package/dist/granular/ui/components/SideNavbar/components/SideNavbarResizeHandle.js.map +1 -1
  59. package/dist/granular/ui/components/SideNavbar/providers/SideNavbarStateProvider.js +57 -57
  60. package/dist/granular/ui/components/SideNavbar/providers/SideNavbarStateProvider.js.map +1 -1
  61. package/dist/granular/ui/components/Stepper/Stepper.js +102 -94
  62. package/dist/granular/ui/components/Stepper/Stepper.js.map +1 -1
  63. package/dist/granular/ui/components/Table/Table.js +41 -35
  64. package/dist/granular/ui/components/Table/Table.js.map +1 -1
  65. package/dist/granular/ui/components/Table/TableActions/TableActions.js.map +1 -1
  66. package/dist/granular/ui/components/Table/TableFilters/TableFilters.js +49 -46
  67. package/dist/granular/ui/components/Table/TableFilters/TableFilters.js.map +1 -1
  68. package/dist/granular/ui/components/Table/TablePagination/TablePagination.js.map +1 -1
  69. package/dist/granular/ui/components/Table/TableProvider.js +82 -80
  70. package/dist/granular/ui/components/Table/TableProvider.js.map +1 -1
  71. package/dist/granular/ui/components/Table/TableRow.js +57 -53
  72. package/dist/granular/ui/components/Table/TableRow.js.map +1 -1
  73. package/dist/granular/ui/components/Table/useColumnResizing.js +53 -53
  74. package/dist/granular/ui/components/Table/useColumnResizing.js.map +1 -1
  75. package/dist/granular/ui/components/TimePicker/TimePicker.js +149 -103
  76. package/dist/granular/ui/components/TimePicker/TimePicker.js.map +1 -1
  77. package/dist/granular/ui/components/Timeline/Timeline.js.map +1 -1
  78. package/dist/granular/ui/hooks/useFocusRestore.js +14 -15
  79. package/dist/granular/ui/hooks/useFocusRestore.js.map +1 -1
  80. package/dist/granular/ui/primitives/Badge/Badge.js.map +1 -1
  81. package/dist/granular/ui/primitives/Checkbox/Checkbox.js.map +1 -1
  82. package/dist/granular/ui/primitives/Chip/Chip.js +91 -71
  83. package/dist/granular/ui/primitives/Chip/Chip.js.map +1 -1
  84. package/dist/granular/ui/primitives/Dot/Dot.js +99 -0
  85. package/dist/granular/ui/primitives/Dot/Dot.js.map +1 -0
  86. package/dist/granular/ui/primitives/ErrorMessage/ErrorMessage.js.map +1 -1
  87. package/dist/granular/ui/primitives/Input/Input.js.map +1 -1
  88. package/dist/granular/ui/primitives/Label/Label.js.map +1 -1
  89. package/dist/granular/ui/primitives/NavLink/NavLink.js.map +1 -1
  90. package/dist/granular/ui/primitives/Radio/Radio.js.map +1 -1
  91. package/dist/granular/ui/primitives/Select/Select.js.map +1 -1
  92. package/dist/granular/ui/primitives/Separator/Separator.js.map +1 -1
  93. package/dist/granular/ui/primitives/Skeleton/Skeleton.js.map +1 -1
  94. package/dist/granular/ui/primitives/Slider/Slider.js.map +1 -1
  95. package/dist/granular/ui/primitives/Spinner/Spinner.js.map +1 -1
  96. package/dist/granular/ui/primitives/Switch/Switch.js.map +1 -1
  97. package/dist/granular/ui/primitives/Tooltip/Tooltip.js.map +1 -1
  98. package/dist/granular/ui/providers/DialogContext.js.map +1 -1
  99. package/dist/granular/ui/providers/DialogProvider.js +24 -20
  100. package/dist/granular/ui/providers/DialogProvider.js.map +1 -1
  101. package/dist/index.cjs +134 -134
  102. package/dist/index.cjs.map +1 -1
  103. package/dist/index.js +5945 -5542
  104. package/dist/index.js.map +1 -1
  105. package/dist/react-design-system.css +1 -1
  106. package/dist/server/index.cjs +7 -7
  107. package/dist/server/index.cjs.map +1 -1
  108. package/dist/server/index.js +404 -384
  109. package/dist/server/index.js.map +1 -1
  110. package/dist/ui/components/Autocomplete/AutocompleteList.d.ts +4 -0
  111. package/dist/ui/components/Autocomplete/AutocompleteOption.d.ts +8 -0
  112. package/dist/ui/components/Breadcrumb/Breadcrumb.d.ts +0 -1
  113. package/dist/ui/components/ButtonGroup/ButtonGroup.d.ts +2 -2
  114. package/dist/ui/components/ColorPicker/ColorPicker.d.ts +0 -1
  115. package/dist/ui/components/CommandPalette/CommandPalette.d.ts +0 -1
  116. package/dist/ui/components/DataGrid/DataGrid.d.ts +0 -1
  117. package/dist/ui/components/Dialog/DialogContent.d.ts +20 -1
  118. package/dist/ui/components/Drawer/Drawer.d.ts +0 -1
  119. package/dist/ui/components/Dropdown/Dropdown.d.ts +0 -1
  120. package/dist/ui/components/EmptyState/EmptyState.d.ts +0 -1
  121. package/dist/ui/components/FileUpload/FileUpload.d.ts +0 -1
  122. package/dist/ui/components/Form/FormField.d.ts +7 -0
  123. package/dist/ui/components/Header/Header.d.ts +1 -1
  124. package/dist/ui/components/Header/components/HeaderActions.d.ts +1 -1
  125. package/dist/ui/components/Header/components/HeaderHamburger.d.ts +1 -1
  126. package/dist/ui/components/Header/components/HeaderLogo.d.ts +1 -1
  127. package/dist/ui/components/Header/components/HeaderMobileMenu.d.ts +1 -1
  128. package/dist/ui/components/Header/components/HeaderNavigation.d.ts +1 -1
  129. package/dist/ui/components/Header/contexts/HeaderContext.d.ts +1 -1
  130. package/dist/ui/components/Menu/Menu.d.ts +0 -1
  131. package/dist/ui/components/Modal/Modal.d.ts +1 -2
  132. package/dist/ui/components/Navigation/Navigation.d.ts +1 -1
  133. package/dist/ui/components/PageHeader/PageHeader.d.ts +1 -1
  134. package/dist/ui/components/Pagination/Pagination.d.ts +0 -1
  135. package/dist/ui/components/Popover/Popover.d.ts +0 -1
  136. package/dist/ui/components/Rating/Rating.d.ts +0 -1
  137. package/dist/ui/components/SearchInput/SearchInput.d.ts +0 -1
  138. package/dist/ui/components/Stepper/Stepper.d.ts +0 -1
  139. package/dist/ui/components/Table/TableActions/TableActions.d.ts +0 -1
  140. package/dist/ui/components/Table/TableFilters/TableFilters.d.ts +0 -1
  141. package/dist/ui/components/Table/TablePagination/TablePagination.d.ts +0 -1
  142. package/dist/ui/components/TimePicker/TimePicker.d.ts +0 -1
  143. package/dist/ui/components/Timeline/Timeline.d.ts +0 -1
  144. package/dist/ui/components/index.d.ts +2 -0
  145. package/dist/ui/primitives/Checkbox/Checkbox.d.ts +0 -1
  146. package/dist/ui/primitives/Chip/Chip.d.ts +21 -0
  147. package/dist/ui/primitives/ErrorMessage/ErrorMessage.d.ts +0 -1
  148. package/dist/ui/primitives/Input/Input.d.ts +0 -1
  149. package/dist/ui/primitives/Label/Label.d.ts +0 -1
  150. package/dist/ui/primitives/NavLink/NavLink.d.ts +1 -1
  151. package/dist/ui/primitives/Radio/Radio.d.ts +0 -1
  152. package/dist/ui/primitives/Select/Select.d.ts +0 -1
  153. package/dist/ui/primitives/Skeleton/Skeleton.d.ts +0 -1
  154. package/dist/ui/primitives/Slider/Slider.d.ts +0 -1
  155. package/dist/ui/primitives/Switch/Switch.d.ts +0 -1
  156. package/dist/ui/primitives/Tooltip/Tooltip.d.ts +0 -1
  157. package/dist/ui/primitives/index.d.ts +2 -0
  158. package/dist/ui/providers/DialogContext.d.ts +8 -0
  159. package/package.json +7 -7
@@ -1,71 +1,71 @@
1
1
  "use client";
2
- var k = Object.defineProperty, y = Object.defineProperties;
3
- var I = Object.getOwnPropertyDescriptors;
4
- var M = Object.getOwnPropertySymbols;
5
- var U = Object.prototype.hasOwnProperty, j = Object.prototype.propertyIsEnumerable;
6
- var E = (n, e, t) => e in n ? k(n, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : n[e] = t, L = (n, e) => {
2
+ var b = Object.defineProperty, w = Object.defineProperties;
3
+ var S = Object.getOwnPropertyDescriptors;
4
+ var p = Object.getOwnPropertySymbols;
5
+ var k = Object.prototype.hasOwnProperty, y = Object.prototype.propertyIsEnumerable;
6
+ var C = (n, e, t) => e in n ? b(n, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : n[e] = t, g = (n, e) => {
7
7
  for (var t in e || (e = {}))
8
- U.call(e, t) && E(n, t, e[t]);
9
- if (M)
10
- for (var t of M(e))
11
- j.call(e, t) && E(n, t, e[t]);
8
+ k.call(e, t) && C(n, t, e[t]);
9
+ if (p)
10
+ for (var t of p(e))
11
+ y.call(e, t) && C(n, t, e[t]);
12
12
  return n;
13
- }, x = (n, e) => y(n, I(e));
14
- import { useState as h, useRef as v, useCallback as c } from "react";
15
- function B(n = {}) {
13
+ }, E = (n, e) => w(n, S(e));
14
+ import { useState as h, useRef as I, useCallback as c, useEffect as U } from "react";
15
+ function A(n = {}) {
16
16
  const {
17
17
  defaultWidths: e = {},
18
18
  minWidth: t = 50,
19
- maxWidth: a,
20
- resizable: R = !0
21
- } = n, [X, z] = h(e), [r, W] = h(!1), [d, p] = h(null), i = v(
19
+ maxWidth: m,
20
+ resizable: z = !0
21
+ } = n, [L, W] = h(e), [i, v] = h(!1), [l, R] = h(null), r = I(
22
22
  null
23
- ), f = c(
24
- (s, u) => {
25
- const o = Math.max(
23
+ ), d = c(
24
+ (o, s) => {
25
+ const u = Math.max(
26
26
  t,
27
- a ? Math.min(u, a) : u
27
+ m ? Math.min(s, m) : s
28
28
  );
29
- z((S) => x(L({}, S), {
30
- [s]: o
29
+ W((X) => E(g({}, X), {
30
+ [o]: u
31
31
  }));
32
32
  },
33
- [t, a]
34
- ), b = c(() => {
35
- z(e);
36
- }, [e]), w = c(
37
- (s, u, o) => {
38
- R && (W(!0), p(s), i.current = { startX: u, startWidth: o });
33
+ [t, m]
34
+ ), x = c(() => {
35
+ W(e);
36
+ }, [e]), M = c(
37
+ (o, s, u) => {
38
+ z && (v(!0), R(o), r.current = { startX: s, startWidth: u });
39
39
  },
40
- [R]
41
- ), C = c(
42
- (s) => {
43
- if (!r || !d || !i.current) return;
44
- const u = s - i.current.startX, o = i.current.startWidth + u;
45
- f(d, o);
40
+ [z]
41
+ ), a = c(
42
+ (o) => {
43
+ if (!i || !l || !r.current) return;
44
+ const s = o - r.current.startX, u = r.current.startWidth + s;
45
+ d(l, u);
46
46
  },
47
- [r, d, f]
48
- ), g = c(() => {
49
- W(!1), p(null), i.current = null;
50
- }, []), l = v(
51
- void 0
52
- ), m = v(void 0);
53
- return typeof window != "undefined" && (l.current = (s) => {
54
- r && C(s.clientX);
55
- }, m.current = () => {
56
- r && g();
57
- }, r ? (document.addEventListener("mousemove", l.current), document.addEventListener("mouseup", m.current)) : (l.current && document.removeEventListener("mousemove", l.current), m.current && document.removeEventListener("mouseup", m.current))), {
58
- columnWidths: X,
59
- setColumnWidth: f,
60
- resetColumnWidths: b,
61
- isResizing: r,
62
- resizingColumn: d,
63
- startResize: w,
64
- handleResize: C,
65
- endResize: g
47
+ [i, l, d]
48
+ ), f = c(() => {
49
+ v(!1), R(null), r.current = null;
50
+ }, []);
51
+ return U(() => {
52
+ if (!i || typeof window == "undefined") return;
53
+ const o = (u) => a(u.clientX), s = () => f();
54
+ return document.addEventListener("mousemove", o), document.addEventListener("mouseup", s), () => {
55
+ document.removeEventListener("mousemove", o), document.removeEventListener("mouseup", s);
56
+ };
57
+ }, [i, a, f]), {
58
+ columnWidths: L,
59
+ setColumnWidth: d,
60
+ resetColumnWidths: x,
61
+ isResizing: i,
62
+ resizingColumn: l,
63
+ startResize: M,
64
+ handleResize: a,
65
+ endResize: f
66
66
  };
67
67
  }
68
68
  export {
69
- B as useColumnResizing
69
+ A as useColumnResizing
70
70
  };
71
71
  //# sourceMappingURL=useColumnResizing.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useColumnResizing.js","sources":["../../../../../src/ui/components/Table/useColumnResizing.ts"],"sourcesContent":["\"use client\";\n\nimport { useState, useCallback, useRef } from \"react\";\n\nexport interface ColumnWidth {\n [key: string]: number;\n}\n\nexport interface UseColumnResizingOptions {\n defaultWidths?: ColumnWidth;\n minWidth?: number;\n maxWidth?: number;\n resizable?: boolean;\n}\n\nexport interface UseColumnResizingResult {\n columnWidths: ColumnWidth;\n setColumnWidth: (columnKey: string, width: number) => void;\n resetColumnWidths: () => void;\n isResizing: boolean;\n resizingColumn: string | null;\n startResize: (columnKey: string, startX: number, startWidth: number) => void;\n handleResize: (currentX: number) => void;\n endResize: () => void;\n}\n\n/**\n * useColumnResizing Hook\n *\n * Hook for managing column resizing in tables.\n *\n * @example\n * ```tsx\n * const {\n * columnWidths,\n * setColumnWidth,\n * startResize,\n * handleResize,\n * endResize,\n * } = useColumnResizing({\n * defaultWidths: { name: 200, email: 250 },\n * minWidth: 100,\n * });\n * ```\n */\nexport function useColumnResizing(\n options: UseColumnResizingOptions = {},\n): UseColumnResizingResult {\n const {\n defaultWidths = {},\n minWidth = 50,\n maxWidth,\n resizable = true,\n } = options;\n\n const [columnWidths, setColumnWidths] = useState<ColumnWidth>(defaultWidths);\n const [isResizing, setIsResizing] = useState(false);\n const [resizingColumn, setResizingColumn] = useState<string | null>(null);\n const resizeStateRef = useRef<{ startX: number; startWidth: number } | null>(\n null,\n );\n\n const setColumnWidth = useCallback(\n (columnKey: string, width: number) => {\n const clampedWidth = Math.max(\n minWidth,\n maxWidth ? Math.min(width, maxWidth) : width,\n );\n setColumnWidths((prev) => ({\n ...prev,\n [columnKey]: clampedWidth,\n }));\n },\n [minWidth, maxWidth],\n );\n\n const resetColumnWidths = useCallback(() => {\n setColumnWidths(defaultWidths);\n }, [defaultWidths]);\n\n const startResize = useCallback(\n (columnKey: string, startX: number, startWidth: number) => {\n if (!resizable) return;\n setIsResizing(true);\n setResizingColumn(columnKey);\n resizeStateRef.current = { startX, startWidth };\n },\n [resizable],\n );\n\n const handleResize = useCallback(\n (currentX: number) => {\n if (!isResizing || !resizingColumn || !resizeStateRef.current) return;\n\n const deltaX = currentX - resizeStateRef.current.startX;\n const newWidth = resizeStateRef.current.startWidth + deltaX;\n setColumnWidth(resizingColumn, newWidth);\n },\n [isResizing, resizingColumn, setColumnWidth],\n );\n\n const endResize = useCallback(() => {\n setIsResizing(false);\n setResizingColumn(null);\n resizeStateRef.current = null;\n }, []);\n\n // Handle mouse move and mouse up globally during resize\n const handleMouseMoveRef = useRef<((e: MouseEvent) => void) | undefined>(\n undefined,\n );\n const handleMouseUpRef = useRef<(() => void) | undefined>(undefined);\n\n if (typeof window !== \"undefined\") {\n handleMouseMoveRef.current = (e: MouseEvent) => {\n if (isResizing) {\n handleResize(e.clientX);\n }\n };\n\n handleMouseUpRef.current = () => {\n if (isResizing) {\n endResize();\n }\n };\n\n if (isResizing) {\n document.addEventListener(\"mousemove\", handleMouseMoveRef.current);\n document.addEventListener(\"mouseup\", handleMouseUpRef.current);\n } else {\n if (handleMouseMoveRef.current) {\n document.removeEventListener(\"mousemove\", handleMouseMoveRef.current);\n }\n if (handleMouseUpRef.current) {\n document.removeEventListener(\"mouseup\", handleMouseUpRef.current);\n }\n }\n }\n\n return {\n columnWidths,\n setColumnWidth,\n resetColumnWidths,\n isResizing,\n resizingColumn,\n startResize,\n handleResize,\n endResize,\n };\n}\n"],"names":["useColumnResizing","options","defaultWidths","minWidth","maxWidth","resizable","columnWidths","setColumnWidths","useState","isResizing","setIsResizing","resizingColumn","setResizingColumn","resizeStateRef","useRef","setColumnWidth","useCallback","columnKey","width","clampedWidth","prev","__spreadProps","__spreadValues","resetColumnWidths","startResize","startX","startWidth","handleResize","currentX","deltaX","newWidth","endResize","handleMouseMoveRef","handleMouseUpRef","e"],"mappings":";;;;;;;;;;;;;;AA6CO,SAASA,EACdC,IAAoC,IACX;AACzB,QAAM;AAAA,IACJ,eAAAC,IAAgB,CAAA;AAAA,IAChB,UAAAC,IAAW;AAAA,IACX,UAAAC;AAAA,IACA,WAAAC,IAAY;AAAA,EAAA,IACVJ,GAEE,CAACK,GAAcC,CAAe,IAAIC,EAAsBN,CAAa,GACrE,CAACO,GAAYC,CAAa,IAAIF,EAAS,EAAK,GAC5C,CAACG,GAAgBC,CAAiB,IAAIJ,EAAwB,IAAI,GAClEK,IAAiBC;AAAA,IACrB;AAAA,EAAA,GAGIC,IAAiBC;AAAA,IACrB,CAACC,GAAmBC,MAAkB;AACpC,YAAMC,IAAe,KAAK;AAAA,QACxBhB;AAAA,QACAC,IAAW,KAAK,IAAIc,GAAOd,CAAQ,IAAIc;AAAA,MAAA;AAEzC,MAAAX,EAAgB,CAACa,MAAUC,EAAAC,EAAA,IACtBF,IADsB;AAAA,QAEzB,CAACH,CAAS,GAAGE;AAAA,MAAA,EACb;AAAA,IACJ;AAAA,IACA,CAAChB,GAAUC,CAAQ;AAAA,EAAA,GAGfmB,IAAoBP,EAAY,MAAM;AAC1C,IAAAT,EAAgBL,CAAa;AAAA,EAC/B,GAAG,CAACA,CAAa,CAAC,GAEZsB,IAAcR;AAAA,IAClB,CAACC,GAAmBQ,GAAgBC,MAAuB;AACzD,MAAKrB,MACLK,EAAc,EAAI,GAClBE,EAAkBK,CAAS,GAC3BJ,EAAe,UAAU,EAAE,QAAAY,GAAQ,YAAAC,EAAA;AAAA,IACrC;AAAA,IACA,CAACrB,CAAS;AAAA,EAAA,GAGNsB,IAAeX;AAAA,IACnB,CAACY,MAAqB;AACpB,UAAI,CAACnB,KAAc,CAACE,KAAkB,CAACE,EAAe,QAAS;AAE/D,YAAMgB,IAASD,IAAWf,EAAe,QAAQ,QAC3CiB,IAAWjB,EAAe,QAAQ,aAAagB;AACrD,MAAAd,EAAeJ,GAAgBmB,CAAQ;AAAA,IACzC;AAAA,IACA,CAACrB,GAAYE,GAAgBI,CAAc;AAAA,EAAA,GAGvCgB,IAAYf,EAAY,MAAM;AAClC,IAAAN,EAAc,EAAK,GACnBE,EAAkB,IAAI,GACtBC,EAAe,UAAU;AAAA,EAC3B,GAAG,CAAA,CAAE,GAGCmB,IAAqBlB;AAAA,IACzB;AAAA,EAAA,GAEImB,IAAmBnB,EAAiC,MAAS;AAEnE,SAAI,OAAO,UAAW,gBACpBkB,EAAmB,UAAU,CAACE,MAAkB;AAC9C,IAAIzB,KACFkB,EAAaO,EAAE,OAAO;AAAA,EAE1B,GAEAD,EAAiB,UAAU,MAAM;AAC/B,IAAIxB,KACFsB,EAAA;AAAA,EAEJ,GAEItB,KACF,SAAS,iBAAiB,aAAauB,EAAmB,OAAO,GACjE,SAAS,iBAAiB,WAAWC,EAAiB,OAAO,MAEzDD,EAAmB,WACrB,SAAS,oBAAoB,aAAaA,EAAmB,OAAO,GAElEC,EAAiB,WACnB,SAAS,oBAAoB,WAAWA,EAAiB,OAAO,KAK/D;AAAA,IACL,cAAA3B;AAAA,IACA,gBAAAS;AAAA,IACA,mBAAAQ;AAAA,IACA,YAAAd;AAAA,IACA,gBAAAE;AAAA,IACA,aAAAa;AAAA,IACA,cAAAG;AAAA,IACA,WAAAI;AAAA,EAAA;AAEJ;"}
1
+ {"version":3,"file":"useColumnResizing.js","sources":["../../../../../src/ui/components/Table/useColumnResizing.ts"],"sourcesContent":["\"use client\";\n\nimport { useState, useCallback, useRef, useEffect } from \"react\";\n\nexport interface ColumnWidth {\n [key: string]: number;\n}\n\nexport interface UseColumnResizingOptions {\n defaultWidths?: ColumnWidth;\n minWidth?: number;\n maxWidth?: number;\n resizable?: boolean;\n}\n\nexport interface UseColumnResizingResult {\n columnWidths: ColumnWidth;\n setColumnWidth: (columnKey: string, width: number) => void;\n resetColumnWidths: () => void;\n isResizing: boolean;\n resizingColumn: string | null;\n startResize: (columnKey: string, startX: number, startWidth: number) => void;\n handleResize: (currentX: number) => void;\n endResize: () => void;\n}\n\n/**\n * useColumnResizing Hook\n *\n * Hook for managing column resizing in tables.\n *\n * @example\n * ```tsx\n * const {\n * columnWidths,\n * setColumnWidth,\n * startResize,\n * handleResize,\n * endResize,\n * } = useColumnResizing({\n * defaultWidths: { name: 200, email: 250 },\n * minWidth: 100,\n * });\n * ```\n */\nexport function useColumnResizing(\n options: UseColumnResizingOptions = {},\n): UseColumnResizingResult {\n const {\n defaultWidths = {},\n minWidth = 50,\n maxWidth,\n resizable = true,\n } = options;\n\n const [columnWidths, setColumnWidths] = useState<ColumnWidth>(defaultWidths);\n const [isResizing, setIsResizing] = useState(false);\n const [resizingColumn, setResizingColumn] = useState<string | null>(null);\n const resizeStateRef = useRef<{ startX: number; startWidth: number } | null>(\n null,\n );\n\n const setColumnWidth = useCallback(\n (columnKey: string, width: number) => {\n const clampedWidth = Math.max(\n minWidth,\n maxWidth ? Math.min(width, maxWidth) : width,\n );\n setColumnWidths((prev) => ({\n ...prev,\n [columnKey]: clampedWidth,\n }));\n },\n [minWidth, maxWidth],\n );\n\n const resetColumnWidths = useCallback(() => {\n setColumnWidths(defaultWidths);\n }, [defaultWidths]);\n\n const startResize = useCallback(\n (columnKey: string, startX: number, startWidth: number) => {\n if (!resizable) return;\n setIsResizing(true);\n setResizingColumn(columnKey);\n resizeStateRef.current = { startX, startWidth };\n },\n [resizable],\n );\n\n const handleResize = useCallback(\n (currentX: number) => {\n if (!isResizing || !resizingColumn || !resizeStateRef.current) return;\n\n const deltaX = currentX - resizeStateRef.current.startX;\n const newWidth = resizeStateRef.current.startWidth + deltaX;\n setColumnWidth(resizingColumn, newWidth);\n },\n [isResizing, resizingColumn, setColumnWidth],\n );\n\n const endResize = useCallback(() => {\n setIsResizing(false);\n setResizingColumn(null);\n resizeStateRef.current = null;\n }, []);\n\n // Bind the global mouse listeners only while resizing, and ONLY from an\n // effect — never the render body. The old render-body version added a\n // fresh closure on every re-render during a drag (each handleResize →\n // setColumnWidth → re-render) without removing the previous one, leaking\n // one mousemove + one mouseup listener per render and firing handleResize\n // N times per move. The effect captures the exact handlers it attaches\n // and tears them down on cleanup, so at most one of each exists at a time.\n useEffect(() => {\n if (!isResizing || typeof window === \"undefined\") return;\n const onMove = (e: MouseEvent) => handleResize(e.clientX);\n const onUp = () => endResize();\n document.addEventListener(\"mousemove\", onMove);\n document.addEventListener(\"mouseup\", onUp);\n return () => {\n document.removeEventListener(\"mousemove\", onMove);\n document.removeEventListener(\"mouseup\", onUp);\n };\n }, [isResizing, handleResize, endResize]);\n\n return {\n columnWidths,\n setColumnWidth,\n resetColumnWidths,\n isResizing,\n resizingColumn,\n startResize,\n handleResize,\n endResize,\n };\n}\n"],"names":["useColumnResizing","options","defaultWidths","minWidth","maxWidth","resizable","columnWidths","setColumnWidths","useState","isResizing","setIsResizing","resizingColumn","setResizingColumn","resizeStateRef","useRef","setColumnWidth","useCallback","columnKey","width","clampedWidth","prev","__spreadProps","__spreadValues","resetColumnWidths","startResize","startX","startWidth","handleResize","currentX","deltaX","newWidth","endResize","useEffect","onMove","e","onUp"],"mappings":";;;;;;;;;;;;;;AA6CO,SAASA,EACdC,IAAoC,IACX;AACzB,QAAM;AAAA,IACJ,eAAAC,IAAgB,CAAA;AAAA,IAChB,UAAAC,IAAW;AAAA,IACX,UAAAC;AAAA,IACA,WAAAC,IAAY;AAAA,EAAA,IACVJ,GAEE,CAACK,GAAcC,CAAe,IAAIC,EAAsBN,CAAa,GACrE,CAACO,GAAYC,CAAa,IAAIF,EAAS,EAAK,GAC5C,CAACG,GAAgBC,CAAiB,IAAIJ,EAAwB,IAAI,GAClEK,IAAiBC;AAAA,IACrB;AAAA,EAAA,GAGIC,IAAiBC;AAAA,IACrB,CAACC,GAAmBC,MAAkB;AACpC,YAAMC,IAAe,KAAK;AAAA,QACxBhB;AAAA,QACAC,IAAW,KAAK,IAAIc,GAAOd,CAAQ,IAAIc;AAAA,MAAA;AAEzC,MAAAX,EAAgB,CAACa,MAAUC,EAAAC,EAAA,IACtBF,IADsB;AAAA,QAEzB,CAACH,CAAS,GAAGE;AAAA,MAAA,EACb;AAAA,IACJ;AAAA,IACA,CAAChB,GAAUC,CAAQ;AAAA,EAAA,GAGfmB,IAAoBP,EAAY,MAAM;AAC1C,IAAAT,EAAgBL,CAAa;AAAA,EAC/B,GAAG,CAACA,CAAa,CAAC,GAEZsB,IAAcR;AAAA,IAClB,CAACC,GAAmBQ,GAAgBC,MAAuB;AACzD,MAAKrB,MACLK,EAAc,EAAI,GAClBE,EAAkBK,CAAS,GAC3BJ,EAAe,UAAU,EAAE,QAAAY,GAAQ,YAAAC,EAAA;AAAA,IACrC;AAAA,IACA,CAACrB,CAAS;AAAA,EAAA,GAGNsB,IAAeX;AAAA,IACnB,CAACY,MAAqB;AACpB,UAAI,CAACnB,KAAc,CAACE,KAAkB,CAACE,EAAe,QAAS;AAE/D,YAAMgB,IAASD,IAAWf,EAAe,QAAQ,QAC3CiB,IAAWjB,EAAe,QAAQ,aAAagB;AACrD,MAAAd,EAAeJ,GAAgBmB,CAAQ;AAAA,IACzC;AAAA,IACA,CAACrB,GAAYE,GAAgBI,CAAc;AAAA,EAAA,GAGvCgB,IAAYf,EAAY,MAAM;AAClC,IAAAN,EAAc,EAAK,GACnBE,EAAkB,IAAI,GACtBC,EAAe,UAAU;AAAA,EAC3B,GAAG,CAAA,CAAE;AASL,SAAAmB,EAAU,MAAM;AACd,QAAI,CAACvB,KAAc,OAAO,UAAW,YAAa;AAClD,UAAMwB,IAAS,CAACC,MAAkBP,EAAaO,EAAE,OAAO,GAClDC,IAAO,MAAMJ,EAAA;AACnB,oBAAS,iBAAiB,aAAaE,CAAM,GAC7C,SAAS,iBAAiB,WAAWE,CAAI,GAClC,MAAM;AACX,eAAS,oBAAoB,aAAaF,CAAM,GAChD,SAAS,oBAAoB,WAAWE,CAAI;AAAA,IAC9C;AAAA,EACF,GAAG,CAAC1B,GAAYkB,GAAcI,CAAS,CAAC,GAEjC;AAAA,IACL,cAAAzB;AAAA,IACA,gBAAAS;AAAA,IACA,mBAAAQ;AAAA,IACA,YAAAd;AAAA,IACA,gBAAAE;AAAA,IACA,aAAAa;AAAA,IACA,cAAAG;AAAA,IACA,WAAAI;AAAA,EAAA;AAEJ;"}
@@ -1,28 +1,32 @@
1
1
  "use client";
2
- import { jsx as s, jsxs as v } from "react/jsx-runtime";
3
- import { useState as x, useCallback as E, useEffect as O } from "react";
4
- import { Clock as U } from "lucide-react";
5
- import q from "../../primitives/Input/Input.js";
6
- import F from "../Popover/Popover.js";
7
- import { Button as o } from "../../primitives/Button/Button.js";
2
+ import { jsx as n, jsxs as M } from "react/jsx-runtime";
3
+ import { useState as p, useCallback as E, useEffect as F } from "react";
4
+ import { Clock as q } from "lucide-react";
5
+ import G from "../../primitives/Input/Input.js";
6
+ import J from "../Popover/Popover.js";
7
+ import { Button as m } from "../../primitives/Button/Button.js";
8
8
  import { getSpacingClass as u } from "../../tokens/spacing.js";
9
- function X({
10
- value: A,
11
- defaultValue: H,
12
- format: r = "24h",
13
- onChange: c,
14
- disabled: l = !1,
15
- label: I,
16
- error: b = !1,
17
- helperText: z,
18
- className: y = ""
9
+ function _({
10
+ value: k,
11
+ defaultValue: T,
12
+ format: s = "24h",
13
+ onChange: o,
14
+ disabled: r = !1,
15
+ label: V,
16
+ error: K = !1,
17
+ helperText: U,
18
+ className: j = ""
19
19
  }) {
20
- const [T, P] = x(H || ""), [i, S] = x(12), [m, N] = x(0), [a, $] = x("AM"), d = A !== void 0, h = d ? A : T, k = E(
20
+ const [O, w] = p(T || ""), [i, y] = p(12), [l, P] = p(0), [c, S] = p("AM"), [D, A] = p(!1), f = k !== void 0, h = f ? k : O, g = E(
21
21
  (e) => {
22
22
  if (!e) return { hours: 12, minutes: 0, amPm: "AM" };
23
- if (r === "24h") {
24
- const [t, n] = e.split(":").map(Number);
25
- return { hours: t || 12, minutes: n || 0, amPm: "AM" };
23
+ if (s === "24h") {
24
+ const [t, a] = e.split(":").map(Number);
25
+ return {
26
+ hours: Number.isFinite(t) ? t : 12,
27
+ minutes: Number.isFinite(a) ? a : 0,
28
+ amPm: "AM"
29
+ };
26
30
  } else {
27
31
  const t = e.match(/(\d+):(\d+)\s*(AM|PM)/i);
28
32
  return t ? {
@@ -32,91 +36,109 @@ function X({
32
36
  } : { hours: 12, minutes: 0, amPm: "AM" };
33
37
  }
34
38
  },
35
- [r]
36
- ), p = (e, t, n) => {
37
- if (r === "24h")
39
+ [s]
40
+ ), v = (e, t, a) => {
41
+ if (s === "24h")
38
42
  return `${String(e).padStart(2, "0")}:${String(t).padStart(2, "0")}`;
39
43
  {
40
- const M = n === "PM" && e !== 12 ? e + 12 : n === "AM" && e === 12 ? 0 : e;
41
- return `${String(M === 0 ? 12 : M > 12 ? M - 12 : M).padStart(2, "0")}:${String(t).padStart(2, "0")} ${n || "AM"}`;
44
+ const x = a === "PM" && e !== 12 ? e + 12 : a === "AM" && e === 12 ? 0 : e;
45
+ return `${String(x === 0 ? 12 : x > 12 ? x - 12 : x).padStart(2, "0")}:${String(t).padStart(2, "0")} ${a || "AM"}`;
42
46
  }
43
47
  };
44
- O(() => {
48
+ F(() => {
45
49
  if (h) {
46
- const e = k(h);
47
- S(e.hours), N(e.minutes), $(e.amPm);
50
+ const e = g(h);
51
+ y(e.hours), P(e.minutes), S(e.amPm);
48
52
  }
49
- }, [h, k]);
50
- const f = (e) => {
51
- const t = r === "24h" ? Math.max(0, Math.min(23, e)) : Math.max(1, Math.min(12, e));
52
- S(t);
53
- const n = p(
53
+ }, [h, g]);
54
+ const d = (e) => {
55
+ const t = s === "24h" ? Math.max(0, Math.min(23, e)) : Math.max(1, Math.min(12, e));
56
+ y(t);
57
+ const a = v(
54
58
  t,
55
- m,
56
- r === "12h" ? a : void 0
59
+ l,
60
+ s === "12h" ? c : void 0
57
61
  );
58
- d || P(n), c == null || c(n);
59
- }, w = (e) => {
62
+ f || w(a), o == null || o(a);
63
+ }, N = (e) => {
60
64
  const t = Math.max(0, Math.min(59, e));
61
- N(t);
62
- const n = p(
65
+ P(t);
66
+ const a = v(
63
67
  i,
64
68
  t,
65
- r === "12h" ? a : void 0
69
+ s === "12h" ? c : void 0
66
70
  );
67
- d || P(n), c == null || c(n);
68
- }, g = () => {
69
- const e = a === "AM" ? "PM" : "AM";
70
- $(e);
71
- const t = p(i, m, e);
72
- d || P(t), c == null || c(t);
73
- }, V = () => {
74
- if (r === "24h")
75
- f((i + 1) % 24);
71
+ f || w(a), o == null || o(a);
72
+ }, $ = () => {
73
+ const e = c === "AM" ? "PM" : "AM";
74
+ S(e);
75
+ const t = v(i, l, e);
76
+ f || w(t), o == null || o(t);
77
+ }, b = () => {
78
+ if (s === "24h")
79
+ d((i + 1) % 24);
76
80
  else {
77
81
  const e = i === 12 ? 1 : i + 1;
78
- f(e);
82
+ d(e);
79
83
  }
80
- }, j = () => {
81
- if (r === "24h")
82
- f(i === 0 ? 23 : i - 1);
84
+ }, I = () => {
85
+ if (s === "24h")
86
+ d(i === 0 ? 23 : i - 1);
83
87
  else {
84
88
  const e = i === 1 ? 12 : i - 1;
85
- f(e);
89
+ d(e);
86
90
  }
87
- }, B = () => {
88
- w((m + 1) % 60);
89
- }, D = () => {
90
- w(m === 0 ? 59 : m - 1);
91
- }, C = /* @__PURE__ */ s("div", { className: `${u("base", "p")} min-w-48`, children: /* @__PURE__ */ v(
91
+ }, H = () => {
92
+ N((l + 1) % 60);
93
+ }, z = () => {
94
+ N(l === 0 ? 59 : l - 1);
95
+ }, B = (e) => {
96
+ r || (e.key === "Enter" || e.key === " " ? (e.preventDefault(), A((t) => !t)) : (e.key === "ArrowDown" || e.key === "ArrowUp") && (e.preventDefault(), A(!0)));
97
+ }, C = /* @__PURE__ */ n("div", { className: `${u("base", "p")} min-w-48`, children: /* @__PURE__ */ M(
92
98
  "div",
93
99
  {
94
100
  className: `flex items-center justify-center ${u("base", "gap")}`,
95
101
  children: [
96
- /* @__PURE__ */ v(
102
+ /* @__PURE__ */ M(
97
103
  "div",
98
104
  {
99
105
  className: `flex flex-col items-center ${u("sm", "gap")}`,
100
106
  children: [
101
- /* @__PURE__ */ s(
102
- o,
107
+ /* @__PURE__ */ n(
108
+ m,
103
109
  {
104
110
  variant: "ghost",
105
111
  size: "sm",
106
- onClick: V,
107
- disabled: l,
112
+ onClick: b,
113
+ disabled: r,
108
114
  "aria-label": "Increment hours",
109
115
  children: "↑"
110
116
  }
111
117
  ),
112
- /* @__PURE__ */ s("div", { className: "text-2xl font-mono font-semibold w-12 text-center", children: String(i).padStart(2, "0") }),
113
- /* @__PURE__ */ s(
114
- o,
118
+ /* @__PURE__ */ n(
119
+ "div",
120
+ {
121
+ role: "spinbutton",
122
+ tabIndex: r ? -1 : 0,
123
+ "aria-label": "Hours",
124
+ "aria-valuenow": i,
125
+ "aria-valuemin": s === "24h" ? 0 : 1,
126
+ "aria-valuemax": s === "24h" ? 23 : 12,
127
+ "aria-valuetext": String(i).padStart(2, "0"),
128
+ onKeyDown: (e) => {
129
+ e.key === "ArrowUp" ? (e.preventDefault(), b()) : e.key === "ArrowDown" && (e.preventDefault(), I());
130
+ },
131
+ className: "text-2xl font-mono font-semibold w-12 text-center",
132
+ children: String(i).padStart(2, "0")
133
+ }
134
+ ),
135
+ /* @__PURE__ */ n(
136
+ m,
115
137
  {
116
138
  variant: "ghost",
117
139
  size: "sm",
118
- onClick: j,
119
- disabled: l,
140
+ onClick: I,
141
+ disabled: r,
120
142
  "aria-label": "Decrement hours",
121
143
  children: "↓"
122
144
  }
@@ -124,31 +146,47 @@ function X({
124
146
  ]
125
147
  }
126
148
  ),
127
- /* @__PURE__ */ s("div", { className: "text-2xl font-semibold", children: ":" }),
128
- /* @__PURE__ */ v(
149
+ /* @__PURE__ */ n("div", { className: "text-2xl font-semibold", children: ":" }),
150
+ /* @__PURE__ */ M(
129
151
  "div",
130
152
  {
131
153
  className: `flex flex-col items-center ${u("sm", "gap")}`,
132
154
  children: [
133
- /* @__PURE__ */ s(
134
- o,
155
+ /* @__PURE__ */ n(
156
+ m,
135
157
  {
136
158
  variant: "ghost",
137
159
  size: "sm",
138
- onClick: B,
139
- disabled: l,
160
+ onClick: H,
161
+ disabled: r,
140
162
  "aria-label": "Increment minutes",
141
163
  children: "↑"
142
164
  }
143
165
  ),
144
- /* @__PURE__ */ s("div", { className: "text-2xl font-mono font-semibold w-12 text-center", children: String(m).padStart(2, "0") }),
145
- /* @__PURE__ */ s(
146
- o,
166
+ /* @__PURE__ */ n(
167
+ "div",
168
+ {
169
+ role: "spinbutton",
170
+ tabIndex: r ? -1 : 0,
171
+ "aria-label": "Minutes",
172
+ "aria-valuenow": l,
173
+ "aria-valuemin": 0,
174
+ "aria-valuemax": 59,
175
+ "aria-valuetext": String(l).padStart(2, "0"),
176
+ onKeyDown: (e) => {
177
+ e.key === "ArrowUp" ? (e.preventDefault(), H()) : e.key === "ArrowDown" && (e.preventDefault(), z());
178
+ },
179
+ className: "text-2xl font-mono font-semibold w-12 text-center",
180
+ children: String(l).padStart(2, "0")
181
+ }
182
+ ),
183
+ /* @__PURE__ */ n(
184
+ m,
147
185
  {
148
186
  variant: "ghost",
149
187
  size: "sm",
150
- onClick: D,
151
- disabled: l,
188
+ onClick: z,
189
+ disabled: r,
152
190
  "aria-label": "Decrement minutes",
153
191
  children: "↓"
154
192
  }
@@ -156,28 +194,28 @@ function X({
156
194
  ]
157
195
  }
158
196
  ),
159
- r === "12h" && /* @__PURE__ */ v(
197
+ s === "12h" && /* @__PURE__ */ M(
160
198
  "div",
161
199
  {
162
200
  className: `flex flex-col ${u("sm", "gap")} ${u("sm", "ml")}`,
163
201
  children: [
164
- /* @__PURE__ */ s(
165
- o,
202
+ /* @__PURE__ */ n(
203
+ m,
166
204
  {
167
- variant: a === "AM" ? "primary" : "outline",
205
+ variant: c === "AM" ? "primary" : "outline",
168
206
  size: "sm",
169
- onClick: () => g(),
170
- disabled: l,
207
+ onClick: () => $(),
208
+ disabled: r,
171
209
  children: "AM"
172
210
  }
173
211
  ),
174
- /* @__PURE__ */ s(
175
- o,
212
+ /* @__PURE__ */ n(
213
+ m,
176
214
  {
177
- variant: a === "PM" ? "primary" : "outline",
215
+ variant: c === "PM" ? "primary" : "outline",
178
216
  size: "sm",
179
- onClick: () => g(),
180
- disabled: l,
217
+ onClick: () => $(),
218
+ disabled: r,
181
219
  children: "PM"
182
220
  }
183
221
  )
@@ -187,20 +225,28 @@ function X({
187
225
  ]
188
226
  }
189
227
  ) });
190
- return /* @__PURE__ */ s("div", { className: y, children: /* @__PURE__ */ s(
191
- F,
228
+ return /* @__PURE__ */ n("div", { className: j, children: /* @__PURE__ */ n(
229
+ J,
192
230
  {
193
- trigger: /* @__PURE__ */ s(
194
- q,
231
+ open: r ? !1 : D,
232
+ onOpenChange: (e) => {
233
+ r || A(e);
234
+ },
235
+ trigger: /* @__PURE__ */ n(
236
+ G,
195
237
  {
196
- label: I,
197
- value: h || p(i, m, r === "12h" ? a : void 0),
238
+ label: V,
239
+ value: h || v(i, l, s === "12h" ? c : void 0),
198
240
  readOnly: !0,
199
- disabled: l,
200
- error: b,
201
- helperText: z,
202
- leftIcon: /* @__PURE__ */ s(U, { className: "h-4 w-4" }),
203
- className: "cursor-pointer"
241
+ disabled: r,
242
+ error: K,
243
+ helperText: U,
244
+ leftIcon: /* @__PURE__ */ n(q, { className: "h-4 w-4" }),
245
+ className: "cursor-pointer",
246
+ role: "combobox",
247
+ "aria-haspopup": "dialog",
248
+ "aria-expanded": !r && D,
249
+ onKeyDown: B
204
250
  }
205
251
  ),
206
252
  placement: "bottom-start",
@@ -211,6 +257,6 @@ function X({
211
257
  ) });
212
258
  }
213
259
  export {
214
- X as default
260
+ _ as default
215
261
  };
216
262
  //# sourceMappingURL=TimePicker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TimePicker.js","sources":["../../../../../src/ui/components/TimePicker/TimePicker.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { Clock } from \"lucide-react\";\nimport Input from \"../../primitives/Input/Input\";\nimport Popover from \"../Popover/Popover\";\nimport Button from \"../../primitives/Button/Button\";\nimport { getSpacingClass } from \"../../tokens/spacing\";\n\nexport type TimeFormat = \"12h\" | \"24h\";\n\nexport interface TimePickerProps {\n value?: string; // Format: \"HH:mm\" for 24h or \"hh:mm AM/PM\" for 12h\n defaultValue?: string;\n format?: TimeFormat;\n onChange?: (value: string) => void;\n disabled?: boolean;\n label?: string;\n error?: boolean;\n helperText?: string;\n className?: string;\n}\n\n/**\n * TimePicker Component\n *\n * A time picker component for selecting time values.\n * Supports 12h and 24h formats.\n * Follows Atomic Design principles as a Molecule component.\n *\n * @example\n * ```tsx\n * <TimePicker\n * value=\"14:30\"\n * format=\"24h\"\n * onChange={(value) => console.log(value)}\n * />\n * ```\n */\nexport default function TimePicker({\n value: controlledValue,\n defaultValue,\n format = \"24h\",\n onChange,\n disabled = false,\n label,\n error = false,\n helperText,\n className = \"\",\n}: TimePickerProps) {\n const [internalValue, setInternalValue] = useState(defaultValue || \"\");\n const [hours, setHours] = useState(12);\n const [minutes, setMinutes] = useState(0);\n const [amPm, setAmPm] = useState<\"AM\" | \"PM\">(\"AM\");\n\n const isControlled = controlledValue !== undefined;\n const currentValue = isControlled ? controlledValue : internalValue;\n\n // Parse time value\n const parseTime = useCallback(\n (timeStr: string) => {\n if (!timeStr) return { hours: 12, minutes: 0, amPm: \"AM\" as const };\n\n if (format === \"24h\") {\n const [h, m] = timeStr.split(\":\").map(Number);\n return { hours: h || 12, minutes: m || 0, amPm: \"AM\" as const };\n } else {\n const match = timeStr.match(/(\\d+):(\\d+)\\s*(AM|PM)/i);\n if (match) {\n return {\n hours: parseInt(match[1]),\n minutes: parseInt(match[2]),\n amPm: match[3].toUpperCase() as \"AM\" | \"PM\",\n };\n }\n return { hours: 12, minutes: 0, amPm: \"AM\" as const };\n }\n },\n [format],\n );\n\n // Format time value\n const formatTime = (h: number, m: number, ap?: \"AM\" | \"PM\"): string => {\n if (format === \"24h\") {\n return `${String(h).padStart(2, \"0\")}:${String(m).padStart(2, \"0\")}`;\n } else {\n const displayHours =\n ap === \"PM\" && h !== 12 ? h + 12 : ap === \"AM\" && h === 12 ? 0 : h;\n return `${String(displayHours === 0 ? 12 : displayHours > 12 ? displayHours - 12 : displayHours).padStart(2, \"0\")}:${String(m).padStart(2, \"0\")} ${ap || \"AM\"}`;\n }\n };\n\n // Initialize from value\n useEffect(() => {\n if (currentValue) {\n const parsed = parseTime(currentValue);\n setHours(parsed.hours);\n setMinutes(parsed.minutes);\n setAmPm(parsed.amPm);\n }\n }, [currentValue, parseTime]);\n\n const handleHoursChange = (newHours: number) => {\n const validHours =\n format === \"24h\"\n ? Math.max(0, Math.min(23, newHours))\n : Math.max(1, Math.min(12, newHours));\n\n setHours(validHours);\n const newValue = formatTime(\n validHours,\n minutes,\n format === \"12h\" ? amPm : undefined,\n );\n\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onChange?.(newValue);\n };\n\n const handleMinutesChange = (newMinutes: number) => {\n const validMinutes = Math.max(0, Math.min(59, newMinutes));\n setMinutes(validMinutes);\n const newValue = formatTime(\n hours,\n validMinutes,\n format === \"12h\" ? amPm : undefined,\n );\n\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onChange?.(newValue);\n };\n\n const handleAmPmToggle = () => {\n const newAmPm = amPm === \"AM\" ? \"PM\" : \"AM\";\n setAmPm(newAmPm);\n const newValue = formatTime(hours, minutes, newAmPm);\n\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onChange?.(newValue);\n };\n\n const incrementHours = () => {\n if (format === \"24h\") {\n handleHoursChange((hours + 1) % 24);\n } else {\n const newHours = hours === 12 ? 1 : hours + 1;\n handleHoursChange(newHours);\n }\n };\n\n const decrementHours = () => {\n if (format === \"24h\") {\n handleHoursChange(hours === 0 ? 23 : hours - 1);\n } else {\n const newHours = hours === 1 ? 12 : hours - 1;\n handleHoursChange(newHours);\n }\n };\n\n const incrementMinutes = () => {\n handleMinutesChange((minutes + 1) % 60);\n };\n\n const decrementMinutes = () => {\n handleMinutesChange(minutes === 0 ? 59 : minutes - 1);\n };\n\n const timePickerContent = (\n <div className={`${getSpacingClass(\"base\", \"p\")} min-w-48`}>\n <div\n className={`flex items-center justify-center ${getSpacingClass(\"base\", \"gap\")}`}\n >\n {/* Hours */}\n <div\n className={`flex flex-col items-center ${getSpacingClass(\"sm\", \"gap\")}`}\n >\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={incrementHours}\n disabled={disabled}\n aria-label=\"Increment hours\"\n >\n ↑\n </Button>\n <div className=\"text-2xl font-mono font-semibold w-12 text-center\">\n {String(hours).padStart(2, \"0\")}\n </div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={decrementHours}\n disabled={disabled}\n aria-label=\"Decrement hours\"\n >\n ↓\n </Button>\n </div>\n\n <div className=\"text-2xl font-semibold\">:</div>\n\n {/* Minutes */}\n <div\n className={`flex flex-col items-center ${getSpacingClass(\"sm\", \"gap\")}`}\n >\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={incrementMinutes}\n disabled={disabled}\n aria-label=\"Increment minutes\"\n >\n ↑\n </Button>\n <div className=\"text-2xl font-mono font-semibold w-12 text-center\">\n {String(minutes).padStart(2, \"0\")}\n </div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={decrementMinutes}\n disabled={disabled}\n aria-label=\"Decrement minutes\"\n >\n ↓\n </Button>\n </div>\n\n {/* AM/PM for 12h format */}\n {format === \"12h\" && (\n <div\n className={`flex flex-col ${getSpacingClass(\"sm\", \"gap\")} ${getSpacingClass(\"sm\", \"ml\")}`}\n >\n <Button\n variant={amPm === \"AM\" ? \"primary\" : \"outline\"}\n size=\"sm\"\n onClick={() => handleAmPmToggle()}\n disabled={disabled}\n >\n AM\n </Button>\n <Button\n variant={amPm === \"PM\" ? \"primary\" : \"outline\"}\n size=\"sm\"\n onClick={() => handleAmPmToggle()}\n disabled={disabled}\n >\n PM\n </Button>\n </div>\n )}\n </div>\n </div>\n );\n\n return (\n <div className={className}>\n <Popover\n trigger={\n <Input\n label={label}\n value={\n currentValue ||\n formatTime(hours, minutes, format === \"12h\" ? amPm : undefined)\n }\n readOnly\n disabled={disabled}\n error={error}\n helperText={helperText}\n leftIcon={<Clock className=\"h-4 w-4\" />}\n className=\"cursor-pointer\"\n />\n }\n placement=\"bottom-start\"\n showCloseButton\n title=\"Select Time\"\n >\n {timePickerContent}\n </Popover>\n </div>\n );\n}\n"],"names":["TimePicker","controlledValue","defaultValue","format","onChange","disabled","label","error","helperText","className","internalValue","setInternalValue","useState","hours","setHours","minutes","setMinutes","amPm","setAmPm","isControlled","currentValue","parseTime","useCallback","timeStr","h","m","match","formatTime","ap","displayHours","useEffect","parsed","handleHoursChange","newHours","validHours","newValue","handleMinutesChange","newMinutes","validMinutes","handleAmPmToggle","newAmPm","incrementHours","decrementHours","incrementMinutes","decrementMinutes","timePickerContent","getSpacingClass","jsxs","jsx","Button","Popover","Input","Clock"],"mappings":"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"}
1
+ {"version":3,"file":"TimePicker.js","sources":["../../../../../src/ui/components/TimePicker/TimePicker.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useEffect, useCallback, type KeyboardEvent } from \"react\";\nimport { Clock } from \"lucide-react\";\nimport Input from \"../../primitives/Input/Input\";\nimport Popover from \"../Popover/Popover\";\nimport Button from \"../../primitives/Button/Button\";\nimport { getSpacingClass } from \"../../tokens/spacing\";\n\nexport type TimeFormat = \"12h\" | \"24h\";\n\nexport interface TimePickerProps {\n value?: string; // Format: \"HH:mm\" for 24h or \"hh:mm AM/PM\" for 12h\n defaultValue?: string;\n format?: TimeFormat;\n onChange?: (value: string) => void;\n disabled?: boolean;\n label?: string;\n error?: boolean;\n helperText?: string;\n className?: string;\n}\n\n/**\n * TimePicker Component\n *\n * A time picker component for selecting time values.\n * Supports 12h and 24h formats.\n *\n * @example\n * ```tsx\n * <TimePicker\n * value=\"14:30\"\n * format=\"24h\"\n * onChange={(value) => console.log(value)}\n * />\n * ```\n */\nexport default function TimePicker({\n value: controlledValue,\n defaultValue,\n format = \"24h\",\n onChange,\n disabled = false,\n label,\n error = false,\n helperText,\n className = \"\",\n}: TimePickerProps) {\n const [internalValue, setInternalValue] = useState(defaultValue || \"\");\n const [hours, setHours] = useState(12);\n const [minutes, setMinutes] = useState(0);\n const [amPm, setAmPm] = useState<\"AM\" | \"PM\">(\"AM\");\n const [open, setOpen] = useState(false);\n\n const isControlled = controlledValue !== undefined;\n const currentValue = isControlled ? controlledValue : internalValue;\n\n // Parse time value\n const parseTime = useCallback(\n (timeStr: string) => {\n if (!timeStr) return { hours: 12, minutes: 0, amPm: \"AM\" as const };\n\n if (format === \"24h\") {\n const [h, m] = timeStr.split(\":\").map(Number);\n return {\n hours: Number.isFinite(h) ? h : 12,\n minutes: Number.isFinite(m) ? m : 0,\n amPm: \"AM\" as const,\n };\n } else {\n const match = timeStr.match(/(\\d+):(\\d+)\\s*(AM|PM)/i);\n if (match) {\n return {\n hours: parseInt(match[1]),\n minutes: parseInt(match[2]),\n amPm: match[3].toUpperCase() as \"AM\" | \"PM\",\n };\n }\n return { hours: 12, minutes: 0, amPm: \"AM\" as const };\n }\n },\n [format],\n );\n\n // Format time value\n const formatTime = (h: number, m: number, ap?: \"AM\" | \"PM\"): string => {\n if (format === \"24h\") {\n return `${String(h).padStart(2, \"0\")}:${String(m).padStart(2, \"0\")}`;\n } else {\n const displayHours =\n ap === \"PM\" && h !== 12 ? h + 12 : ap === \"AM\" && h === 12 ? 0 : h;\n return `${String(displayHours === 0 ? 12 : displayHours > 12 ? displayHours - 12 : displayHours).padStart(2, \"0\")}:${String(m).padStart(2, \"0\")} ${ap || \"AM\"}`;\n }\n };\n\n // Initialize from value\n useEffect(() => {\n if (currentValue) {\n const parsed = parseTime(currentValue);\n setHours(parsed.hours);\n setMinutes(parsed.minutes);\n setAmPm(parsed.amPm);\n }\n }, [currentValue, parseTime]);\n\n const handleHoursChange = (newHours: number) => {\n const validHours =\n format === \"24h\"\n ? Math.max(0, Math.min(23, newHours))\n : Math.max(1, Math.min(12, newHours));\n\n setHours(validHours);\n const newValue = formatTime(\n validHours,\n minutes,\n format === \"12h\" ? amPm : undefined,\n );\n\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onChange?.(newValue);\n };\n\n const handleMinutesChange = (newMinutes: number) => {\n const validMinutes = Math.max(0, Math.min(59, newMinutes));\n setMinutes(validMinutes);\n const newValue = formatTime(\n hours,\n validMinutes,\n format === \"12h\" ? amPm : undefined,\n );\n\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onChange?.(newValue);\n };\n\n const handleAmPmToggle = () => {\n const newAmPm = amPm === \"AM\" ? \"PM\" : \"AM\";\n setAmPm(newAmPm);\n const newValue = formatTime(hours, minutes, newAmPm);\n\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onChange?.(newValue);\n };\n\n const incrementHours = () => {\n if (format === \"24h\") {\n handleHoursChange((hours + 1) % 24);\n } else {\n const newHours = hours === 12 ? 1 : hours + 1;\n handleHoursChange(newHours);\n }\n };\n\n const decrementHours = () => {\n if (format === \"24h\") {\n handleHoursChange(hours === 0 ? 23 : hours - 1);\n } else {\n const newHours = hours === 1 ? 12 : hours - 1;\n handleHoursChange(newHours);\n }\n };\n\n const incrementMinutes = () => {\n handleMinutesChange((minutes + 1) % 60);\n };\n\n const decrementMinutes = () => {\n handleMinutesChange(minutes === 0 ? 59 : minutes - 1);\n };\n\n // Keyboard affordance for the readOnly trigger Input: a focused\n // readOnly <input> never synthesizes a click, so the Popover's\n // wrapper onClick (mouse-only) leaves keyboard users unable to open\n // the dialog at all. Enter/Space toggle; ArrowUp/ArrowDown open.\n // Gated on `disabled` so a disabled control never surfaces its popup.\n const handleTriggerKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return;\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setOpen((prev) => !prev);\n } else if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n setOpen(true);\n }\n };\n\n const timePickerContent = (\n <div className={`${getSpacingClass(\"base\", \"p\")} min-w-48`}>\n <div\n className={`flex items-center justify-center ${getSpacingClass(\"base\", \"gap\")}`}\n >\n {/* Hours */}\n <div\n className={`flex flex-col items-center ${getSpacingClass(\"sm\", \"gap\")}`}\n >\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={incrementHours}\n disabled={disabled}\n aria-label=\"Increment hours\"\n >\n ↑\n </Button>\n <div\n role=\"spinbutton\"\n tabIndex={disabled ? -1 : 0}\n aria-label=\"Hours\"\n aria-valuenow={hours}\n aria-valuemin={format === \"24h\" ? 0 : 1}\n aria-valuemax={format === \"24h\" ? 23 : 12}\n aria-valuetext={String(hours).padStart(2, \"0\")}\n onKeyDown={(e) => {\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n incrementHours();\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n decrementHours();\n }\n }}\n className=\"text-2xl font-mono font-semibold w-12 text-center\"\n >\n {String(hours).padStart(2, \"0\")}\n </div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={decrementHours}\n disabled={disabled}\n aria-label=\"Decrement hours\"\n >\n ↓\n </Button>\n </div>\n\n <div className=\"text-2xl font-semibold\">:</div>\n\n {/* Minutes */}\n <div\n className={`flex flex-col items-center ${getSpacingClass(\"sm\", \"gap\")}`}\n >\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={incrementMinutes}\n disabled={disabled}\n aria-label=\"Increment minutes\"\n >\n ↑\n </Button>\n <div\n role=\"spinbutton\"\n tabIndex={disabled ? -1 : 0}\n aria-label=\"Minutes\"\n aria-valuenow={minutes}\n aria-valuemin={0}\n aria-valuemax={59}\n aria-valuetext={String(minutes).padStart(2, \"0\")}\n onKeyDown={(e) => {\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n incrementMinutes();\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n decrementMinutes();\n }\n }}\n className=\"text-2xl font-mono font-semibold w-12 text-center\"\n >\n {String(minutes).padStart(2, \"0\")}\n </div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={decrementMinutes}\n disabled={disabled}\n aria-label=\"Decrement minutes\"\n >\n ↓\n </Button>\n </div>\n\n {/* AM/PM for 12h format */}\n {format === \"12h\" && (\n <div\n className={`flex flex-col ${getSpacingClass(\"sm\", \"gap\")} ${getSpacingClass(\"sm\", \"ml\")}`}\n >\n <Button\n variant={amPm === \"AM\" ? \"primary\" : \"outline\"}\n size=\"sm\"\n onClick={() => handleAmPmToggle()}\n disabled={disabled}\n >\n AM\n </Button>\n <Button\n variant={amPm === \"PM\" ? \"primary\" : \"outline\"}\n size=\"sm\"\n onClick={() => handleAmPmToggle()}\n disabled={disabled}\n >\n PM\n </Button>\n </div>\n )}\n </div>\n </div>\n );\n\n return (\n <div className={className}>\n <Popover\n open={disabled ? false : open}\n onOpenChange={(next) => {\n if (!disabled) setOpen(next);\n }}\n trigger={\n <Input\n label={label}\n value={\n currentValue ||\n formatTime(hours, minutes, format === \"12h\" ? amPm : undefined)\n }\n readOnly\n disabled={disabled}\n error={error}\n helperText={helperText}\n leftIcon={<Clock className=\"h-4 w-4\" />}\n className=\"cursor-pointer\"\n role=\"combobox\"\n aria-haspopup=\"dialog\"\n aria-expanded={!disabled && open}\n onKeyDown={handleTriggerKeyDown}\n />\n }\n placement=\"bottom-start\"\n showCloseButton\n title=\"Select Time\"\n >\n {timePickerContent}\n </Popover>\n </div>\n );\n}\n"],"names":["TimePicker","controlledValue","defaultValue","format","onChange","disabled","label","error","helperText","className","internalValue","setInternalValue","useState","hours","setHours","minutes","setMinutes","amPm","setAmPm","open","setOpen","isControlled","currentValue","parseTime","useCallback","timeStr","h","m","match","formatTime","ap","displayHours","useEffect","parsed","handleHoursChange","newHours","validHours","newValue","handleMinutesChange","newMinutes","validMinutes","handleAmPmToggle","newAmPm","incrementHours","decrementHours","incrementMinutes","decrementMinutes","handleTriggerKeyDown","prev","timePickerContent","getSpacingClass","jsxs","jsx","Button","Popover","next","Input","Clock"],"mappings":"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"}