@fabio.caffarello/react-design-system 3.13.0 → 4.1.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.
- package/dist/granular/ui/components/Autocomplete/Autocomplete.js +116 -88
- package/dist/granular/ui/components/Autocomplete/Autocomplete.js.map +1 -1
- package/dist/granular/ui/components/Autocomplete/AutocompleteList.js +57 -47
- package/dist/granular/ui/components/Autocomplete/AutocompleteList.js.map +1 -1
- package/dist/granular/ui/components/Autocomplete/AutocompleteOption.js +21 -20
- package/dist/granular/ui/components/Autocomplete/AutocompleteOption.js.map +1 -1
- package/dist/granular/ui/components/Breadcrumb/Breadcrumb.js.map +1 -1
- package/dist/granular/ui/components/ColorPicker/ColorPicker.js.map +1 -1
- package/dist/granular/ui/components/CommandPalette/CommandPalette.js +187 -149
- package/dist/granular/ui/components/CommandPalette/CommandPalette.js.map +1 -1
- package/dist/granular/ui/components/DataGrid/DataGrid.js +92 -92
- package/dist/granular/ui/components/DataGrid/DataGrid.js.map +1 -1
- package/dist/granular/ui/components/DatePicker/DatePickerCalendar.js +154 -139
- package/dist/granular/ui/components/DatePicker/DatePickerCalendar.js.map +1 -1
- package/dist/granular/ui/components/Dialog/AlertDialog.js +73 -40
- package/dist/granular/ui/components/Dialog/AlertDialog.js.map +1 -1
- package/dist/granular/ui/components/Dialog/DialogContent.js +54 -48
- package/dist/granular/ui/components/Dialog/DialogContent.js.map +1 -1
- package/dist/granular/ui/components/Dialog/DialogDescription.js +31 -31
- package/dist/granular/ui/components/Dialog/DialogDescription.js.map +1 -1
- package/dist/granular/ui/components/Dialog/DialogTitle.js +30 -30
- package/dist/granular/ui/components/Dialog/DialogTitle.js.map +1 -1
- package/dist/granular/ui/components/Drawer/Drawer.js.map +1 -1
- package/dist/granular/ui/components/Dropdown/Dropdown.js.map +1 -1
- package/dist/granular/ui/components/EmptyState/EmptyState.js.map +1 -1
- package/dist/granular/ui/components/FileUpload/FileUpload.js.map +1 -1
- package/dist/granular/ui/components/Form/Form.js +38 -37
- package/dist/granular/ui/components/Form/Form.js.map +1 -1
- package/dist/granular/ui/components/Form/FormField.js +28 -26
- package/dist/granular/ui/components/Form/FormField.js.map +1 -1
- package/dist/granular/ui/components/Header/Header.js.map +1 -1
- package/dist/granular/ui/components/Header/components/HeaderActions.js.map +1 -1
- package/dist/granular/ui/components/Header/components/HeaderHamburger.js.map +1 -1
- package/dist/granular/ui/components/Header/components/HeaderLogo.js.map +1 -1
- package/dist/granular/ui/components/Header/components/HeaderMobileMenu.js.map +1 -1
- package/dist/granular/ui/components/Header/components/HeaderNavigation.js.map +1 -1
- package/dist/granular/ui/components/Header/contexts/HeaderContext.js.map +1 -1
- package/dist/granular/ui/components/Menu/Menu.js.map +1 -1
- package/dist/granular/ui/components/Modal/Modal.js +98 -86
- package/dist/granular/ui/components/Modal/Modal.js.map +1 -1
- package/dist/granular/ui/components/MultiSelect/MultiSelect.js +122 -106
- package/dist/granular/ui/components/MultiSelect/MultiSelect.js.map +1 -1
- package/dist/granular/ui/components/Navigation/Navigation.js.map +1 -1
- package/dist/granular/ui/components/PageHeader/PageHeader.js.map +1 -1
- package/dist/granular/ui/components/Pagination/Pagination.js.map +1 -1
- package/dist/granular/ui/components/Popover/Popover.js.map +1 -1
- package/dist/granular/ui/components/Rating/Rating.js.map +1 -1
- package/dist/granular/ui/components/SearchInput/SearchInput.js.map +1 -1
- package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarGroup.js +82 -64
- package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarGroup.js.map +1 -1
- package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarItem.js +30 -29
- package/dist/granular/ui/components/SideNavbar/components/Navbar/NavbarItem.js.map +1 -1
- package/dist/granular/ui/components/SideNavbar/components/SideNavbarResizeHandle.js +37 -35
- package/dist/granular/ui/components/SideNavbar/components/SideNavbarResizeHandle.js.map +1 -1
- package/dist/granular/ui/components/SideNavbar/providers/SideNavbarStateProvider.js +57 -57
- package/dist/granular/ui/components/SideNavbar/providers/SideNavbarStateProvider.js.map +1 -1
- package/dist/granular/ui/components/Stepper/Stepper.js +102 -94
- package/dist/granular/ui/components/Stepper/Stepper.js.map +1 -1
- package/dist/granular/ui/components/Table/Table.js +41 -35
- package/dist/granular/ui/components/Table/Table.js.map +1 -1
- package/dist/granular/ui/components/Table/TableActions/TableActions.js.map +1 -1
- package/dist/granular/ui/components/Table/TableFilters/TableFilters.js +49 -46
- package/dist/granular/ui/components/Table/TableFilters/TableFilters.js.map +1 -1
- package/dist/granular/ui/components/Table/TablePagination/TablePagination.js.map +1 -1
- package/dist/granular/ui/components/Table/TableProvider.js +82 -80
- package/dist/granular/ui/components/Table/TableProvider.js.map +1 -1
- package/dist/granular/ui/components/Table/TableRow.js +57 -53
- package/dist/granular/ui/components/Table/TableRow.js.map +1 -1
- package/dist/granular/ui/components/Table/useColumnResizing.js +53 -53
- package/dist/granular/ui/components/Table/useColumnResizing.js.map +1 -1
- package/dist/granular/ui/components/TimePicker/TimePicker.js +149 -103
- package/dist/granular/ui/components/TimePicker/TimePicker.js.map +1 -1
- package/dist/granular/ui/components/Timeline/Timeline.js.map +1 -1
- package/dist/granular/ui/hooks/useFocusRestore.js +14 -15
- package/dist/granular/ui/hooks/useFocusRestore.js.map +1 -1
- package/dist/granular/ui/primitives/Badge/Badge.js.map +1 -1
- package/dist/granular/ui/primitives/Button/Button.js +86 -104
- package/dist/granular/ui/primitives/Button/Button.js.map +1 -1
- package/dist/granular/ui/primitives/Checkbox/Checkbox.js.map +1 -1
- package/dist/granular/ui/primitives/Chip/Chip.js +91 -71
- package/dist/granular/ui/primitives/Chip/Chip.js.map +1 -1
- package/dist/granular/ui/primitives/ErrorMessage/ErrorMessage.js.map +1 -1
- package/dist/granular/ui/primitives/Input/Input.js.map +1 -1
- package/dist/granular/ui/primitives/Label/Label.js.map +1 -1
- package/dist/granular/ui/primitives/NavLink/NavLink.js.map +1 -1
- package/dist/granular/ui/primitives/Radio/Radio.js.map +1 -1
- package/dist/granular/ui/primitives/Select/Select.js.map +1 -1
- package/dist/granular/ui/primitives/Separator/Separator.js.map +1 -1
- package/dist/granular/ui/primitives/Skeleton/Skeleton.js.map +1 -1
- package/dist/granular/ui/primitives/Slider/Slider.js.map +1 -1
- package/dist/granular/ui/primitives/Spinner/Spinner.js.map +1 -1
- package/dist/granular/ui/primitives/Switch/Switch.js.map +1 -1
- package/dist/granular/ui/primitives/Tooltip/Tooltip.js.map +1 -1
- package/dist/granular/ui/providers/DialogContext.js.map +1 -1
- package/dist/granular/ui/providers/DialogProvider.js +24 -20
- package/dist/granular/ui/providers/DialogProvider.js.map +1 -1
- package/dist/index.cjs +144 -144
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +5896 -5609
- package/dist/index.js.map +1 -1
- package/dist/react-design-system.css +1 -1
- package/dist/server/index.cjs +13 -13
- package/dist/server/index.cjs.map +1 -1
- package/dist/server/index.js +1050 -789
- package/dist/server/index.js.map +1 -1
- package/dist/ui/components/Autocomplete/Autocomplete.d.ts +21 -0
- package/dist/ui/components/Autocomplete/AutocompleteList.d.ts +4 -0
- package/dist/ui/components/Autocomplete/AutocompleteOption.d.ts +8 -0
- package/dist/ui/components/Breadcrumb/Breadcrumb.d.ts +0 -1
- package/dist/ui/components/ColorPicker/ColorPicker.d.ts +0 -1
- package/dist/ui/components/CommandPalette/CommandPalette.d.ts +0 -1
- package/dist/ui/components/DataGrid/DataGrid.d.ts +0 -1
- package/dist/ui/components/Dialog/DialogContent.d.ts +20 -1
- package/dist/ui/components/Drawer/Drawer.d.ts +0 -1
- package/dist/ui/components/Dropdown/Dropdown.d.ts +0 -1
- package/dist/ui/components/EmptyState/EmptyState.d.ts +0 -1
- package/dist/ui/components/FileUpload/FileUpload.d.ts +0 -1
- package/dist/ui/components/Form/FormField.d.ts +7 -0
- package/dist/ui/components/Header/Header.d.ts +1 -1
- package/dist/ui/components/Header/components/HeaderActions.d.ts +1 -1
- package/dist/ui/components/Header/components/HeaderHamburger.d.ts +1 -1
- package/dist/ui/components/Header/components/HeaderLogo.d.ts +1 -1
- package/dist/ui/components/Header/components/HeaderMobileMenu.d.ts +1 -1
- package/dist/ui/components/Header/components/HeaderNavigation.d.ts +1 -1
- package/dist/ui/components/Header/contexts/HeaderContext.d.ts +1 -1
- package/dist/ui/components/Menu/Menu.d.ts +0 -1
- package/dist/ui/components/Modal/Modal.d.ts +1 -2
- package/dist/ui/components/Navigation/Navigation.d.ts +1 -1
- package/dist/ui/components/PageHeader/PageHeader.d.ts +1 -1
- package/dist/ui/components/Pagination/Pagination.d.ts +0 -1
- package/dist/ui/components/Popover/Popover.d.ts +0 -1
- package/dist/ui/components/Rating/Rating.d.ts +0 -1
- package/dist/ui/components/SearchInput/SearchInput.d.ts +0 -1
- package/dist/ui/components/Stepper/Stepper.d.ts +0 -1
- package/dist/ui/components/Table/TableActions/TableActions.d.ts +0 -1
- package/dist/ui/components/Table/TableFilters/TableFilters.d.ts +0 -1
- package/dist/ui/components/Table/TablePagination/TablePagination.d.ts +0 -1
- package/dist/ui/components/TimePicker/TimePicker.d.ts +0 -1
- package/dist/ui/components/Timeline/Timeline.d.ts +0 -1
- package/dist/ui/primitives/Checkbox/Checkbox.d.ts +0 -1
- package/dist/ui/primitives/Chip/Chip.d.ts +21 -0
- package/dist/ui/primitives/ErrorMessage/ErrorMessage.d.ts +0 -1
- package/dist/ui/primitives/Input/Input.d.ts +0 -1
- package/dist/ui/primitives/Label/Label.d.ts +0 -1
- package/dist/ui/primitives/NavLink/NavLink.d.ts +1 -1
- package/dist/ui/primitives/Radio/Radio.d.ts +0 -1
- package/dist/ui/primitives/Select/Select.d.ts +0 -1
- package/dist/ui/primitives/Skeleton/Skeleton.d.ts +0 -1
- package/dist/ui/primitives/Slider/Slider.d.ts +0 -1
- package/dist/ui/primitives/Switch/Switch.d.ts +0 -1
- package/dist/ui/primitives/Tooltip/Tooltip.d.ts +0 -1
- package/dist/ui/providers/DialogContext.d.ts +8 -0
- package/dist/ui/server.d.ts +2 -0
- package/package.json +7 -7
|
@@ -1,71 +1,71 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
6
|
-
var
|
|
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
|
-
|
|
9
|
-
if (
|
|
10
|
-
for (var t of
|
|
11
|
-
|
|
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
|
-
},
|
|
14
|
-
import { useState as h, useRef as
|
|
15
|
-
function
|
|
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:
|
|
20
|
-
resizable:
|
|
21
|
-
} = n, [
|
|
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
|
-
),
|
|
24
|
-
(
|
|
25
|
-
const
|
|
23
|
+
), d = c(
|
|
24
|
+
(o, s) => {
|
|
25
|
+
const u = Math.max(
|
|
26
26
|
t,
|
|
27
|
-
|
|
27
|
+
m ? Math.min(s, m) : s
|
|
28
28
|
);
|
|
29
|
-
|
|
30
|
-
[
|
|
29
|
+
W((X) => E(g({}, X), {
|
|
30
|
+
[o]: u
|
|
31
31
|
}));
|
|
32
32
|
},
|
|
33
|
-
[t,
|
|
34
|
-
),
|
|
35
|
-
|
|
36
|
-
}, [e]),
|
|
37
|
-
(s, u
|
|
38
|
-
|
|
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
|
-
[
|
|
41
|
-
),
|
|
42
|
-
(
|
|
43
|
-
if (!
|
|
44
|
-
const
|
|
45
|
-
|
|
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
|
-
[
|
|
48
|
-
),
|
|
49
|
-
|
|
50
|
-
}, [])
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
},
|
|
58
|
-
columnWidths:
|
|
59
|
-
setColumnWidth:
|
|
60
|
-
resetColumnWidths:
|
|
61
|
-
isResizing:
|
|
62
|
-
resizingColumn:
|
|
63
|
-
startResize:
|
|
64
|
-
handleResize:
|
|
65
|
-
endResize:
|
|
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
|
-
|
|
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 //
|
|
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
|
|
3
|
-
import { useState as
|
|
4
|
-
import { Clock as
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import { Button as
|
|
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
|
|
10
|
-
value:
|
|
11
|
-
defaultValue:
|
|
12
|
-
format:
|
|
13
|
-
onChange:
|
|
14
|
-
disabled:
|
|
15
|
-
label:
|
|
16
|
-
error:
|
|
17
|
-
helperText:
|
|
18
|
-
className:
|
|
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 [
|
|
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 (
|
|
24
|
-
const [t,
|
|
25
|
-
return {
|
|
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
|
-
[
|
|
36
|
-
),
|
|
37
|
-
if (
|
|
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
|
|
41
|
-
return `${String(
|
|
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
|
-
|
|
48
|
+
F(() => {
|
|
45
49
|
if (h) {
|
|
46
|
-
const e =
|
|
47
|
-
|
|
50
|
+
const e = g(h);
|
|
51
|
+
y(e.hours), P(e.minutes), S(e.amPm);
|
|
48
52
|
}
|
|
49
|
-
}, [h,
|
|
50
|
-
const
|
|
51
|
-
const t =
|
|
52
|
-
|
|
53
|
-
const
|
|
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
|
-
|
|
56
|
-
|
|
59
|
+
l,
|
|
60
|
+
s === "12h" ? c : void 0
|
|
57
61
|
);
|
|
58
|
-
|
|
59
|
-
},
|
|
62
|
+
f || w(a), o == null || o(a);
|
|
63
|
+
}, N = (e) => {
|
|
60
64
|
const t = Math.max(0, Math.min(59, e));
|
|
61
|
-
|
|
62
|
-
const
|
|
65
|
+
P(t);
|
|
66
|
+
const a = v(
|
|
63
67
|
i,
|
|
64
68
|
t,
|
|
65
|
-
|
|
69
|
+
s === "12h" ? c : void 0
|
|
66
70
|
);
|
|
67
|
-
|
|
68
|
-
},
|
|
69
|
-
const e =
|
|
70
|
-
|
|
71
|
-
const t =
|
|
72
|
-
|
|
73
|
-
},
|
|
74
|
-
if (
|
|
75
|
-
|
|
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
|
-
|
|
82
|
+
d(e);
|
|
79
83
|
}
|
|
80
|
-
},
|
|
81
|
-
if (
|
|
82
|
-
|
|
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
|
-
|
|
89
|
+
d(e);
|
|
86
90
|
}
|
|
87
|
-
},
|
|
88
|
-
|
|
89
|
-
},
|
|
90
|
-
|
|
91
|
-
},
|
|
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__ */
|
|
102
|
+
/* @__PURE__ */ M(
|
|
97
103
|
"div",
|
|
98
104
|
{
|
|
99
105
|
className: `flex flex-col items-center ${u("sm", "gap")}`,
|
|
100
106
|
children: [
|
|
101
|
-
/* @__PURE__ */
|
|
102
|
-
|
|
107
|
+
/* @__PURE__ */ n(
|
|
108
|
+
m,
|
|
103
109
|
{
|
|
104
110
|
variant: "ghost",
|
|
105
111
|
size: "sm",
|
|
106
|
-
onClick:
|
|
107
|
-
disabled:
|
|
112
|
+
onClick: b,
|
|
113
|
+
disabled: r,
|
|
108
114
|
"aria-label": "Increment hours",
|
|
109
115
|
children: "↑"
|
|
110
116
|
}
|
|
111
117
|
),
|
|
112
|
-
/* @__PURE__ */
|
|
113
|
-
|
|
114
|
-
|
|
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:
|
|
119
|
-
disabled:
|
|
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__ */
|
|
128
|
-
/* @__PURE__ */
|
|
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__ */
|
|
134
|
-
|
|
155
|
+
/* @__PURE__ */ n(
|
|
156
|
+
m,
|
|
135
157
|
{
|
|
136
158
|
variant: "ghost",
|
|
137
159
|
size: "sm",
|
|
138
|
-
onClick:
|
|
139
|
-
disabled:
|
|
160
|
+
onClick: H,
|
|
161
|
+
disabled: r,
|
|
140
162
|
"aria-label": "Increment minutes",
|
|
141
163
|
children: "↑"
|
|
142
164
|
}
|
|
143
165
|
),
|
|
144
|
-
/* @__PURE__ */
|
|
145
|
-
|
|
146
|
-
|
|
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:
|
|
151
|
-
disabled:
|
|
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
|
-
|
|
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__ */
|
|
165
|
-
|
|
202
|
+
/* @__PURE__ */ n(
|
|
203
|
+
m,
|
|
166
204
|
{
|
|
167
|
-
variant:
|
|
205
|
+
variant: c === "AM" ? "primary" : "outline",
|
|
168
206
|
size: "sm",
|
|
169
|
-
onClick: () =>
|
|
170
|
-
disabled:
|
|
207
|
+
onClick: () => $(),
|
|
208
|
+
disabled: r,
|
|
171
209
|
children: "AM"
|
|
172
210
|
}
|
|
173
211
|
),
|
|
174
|
-
/* @__PURE__ */
|
|
175
|
-
|
|
212
|
+
/* @__PURE__ */ n(
|
|
213
|
+
m,
|
|
176
214
|
{
|
|
177
|
-
variant:
|
|
215
|
+
variant: c === "PM" ? "primary" : "outline",
|
|
178
216
|
size: "sm",
|
|
179
|
-
onClick: () =>
|
|
180
|
-
disabled:
|
|
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__ */
|
|
191
|
-
|
|
228
|
+
return /* @__PURE__ */ n("div", { className: j, children: /* @__PURE__ */ n(
|
|
229
|
+
J,
|
|
192
230
|
{
|
|
193
|
-
|
|
194
|
-
|
|
231
|
+
open: r ? !1 : D,
|
|
232
|
+
onOpenChange: (e) => {
|
|
233
|
+
r || A(e);
|
|
234
|
+
},
|
|
235
|
+
trigger: /* @__PURE__ */ n(
|
|
236
|
+
G,
|
|
195
237
|
{
|
|
196
|
-
label:
|
|
197
|
-
value: h ||
|
|
238
|
+
label: V,
|
|
239
|
+
value: h || v(i, l, s === "12h" ? c : void 0),
|
|
198
240
|
readOnly: !0,
|
|
199
|
-
disabled:
|
|
200
|
-
error:
|
|
201
|
-
helperText:
|
|
202
|
-
leftIcon: /* @__PURE__ */
|
|
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
|
-
|
|
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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"}
|