@dreamtree-org/twreact-ui 1.3.10 → 2.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.
- package/README.md +70 -6
- package/ai-skills/dreamtree-ui.md +58 -15
- package/codemods/v2.cjs +198 -0
- package/dist/ai-schema.json +745 -53
- package/dist/charts/index.js +195 -66
- package/dist/components/blocks/AppShell.d.ts.map +1 -1
- package/dist/components/blocks/BottomActionBar.d.ts +6 -0
- package/dist/components/blocks/BottomActionBar.d.ts.map +1 -0
- package/dist/components/blocks/ConfirmDialog.d.ts.map +1 -1
- package/dist/components/blocks/PageHeader.d.ts.map +1 -1
- package/dist/components/charts/CartesianChart.d.ts.map +1 -1
- package/dist/components/charts/ChartFrame.d.ts.map +1 -1
- package/dist/components/charts/useChartLayout.d.ts +25 -0
- package/dist/components/charts/useChartLayout.d.ts.map +1 -0
- package/dist/components/core/Button.d.ts.map +1 -1
- package/dist/components/core/Checkbox.d.ts.map +1 -1
- package/dist/components/core/ColorPicker.d.ts.map +1 -1
- package/dist/components/core/DatePicker.d.ts.map +1 -1
- package/dist/components/core/DateRangePicker.d.ts.map +1 -1
- package/dist/components/core/Form.d.ts.map +1 -1
- package/dist/components/core/Input.d.ts.map +1 -1
- package/dist/components/core/Loader.d.ts.map +1 -1
- package/dist/components/core/LocationPicker.d.ts.map +1 -1
- package/dist/components/core/Popover.d.ts.map +1 -1
- package/dist/components/core/ProgressBar.d.ts.map +1 -1
- package/dist/components/core/Radio.d.ts.map +1 -1
- package/dist/components/core/Rate.d.ts.map +1 -1
- package/dist/components/core/RoundedTag.d.ts.map +1 -1
- package/dist/components/core/SearchField.d.ts +9 -0
- package/dist/components/core/SearchField.d.ts.map +1 -0
- package/dist/components/core/SegmentedControl.d.ts +8 -0
- package/dist/components/core/SegmentedControl.d.ts.map +1 -0
- package/dist/components/core/Select.d.ts.map +1 -1
- package/dist/components/core/Skeleton.d.ts.map +1 -1
- package/dist/components/core/Slider.d.ts.map +1 -1
- package/dist/components/core/SpeechToText.d.ts.map +1 -1
- package/dist/components/core/SwipeableListItem.d.ts +4 -0
- package/dist/components/core/SwipeableListItem.d.ts.map +1 -0
- package/dist/components/core/SwipeableListItemGesture.d.ts +58 -0
- package/dist/components/core/SwipeableListItemGesture.d.ts.map +1 -0
- package/dist/components/core/Switch.d.ts.map +1 -1
- package/dist/components/core/Table/ActionMenu.d.ts +10 -3
- package/dist/components/core/Table/ActionMenu.d.ts.map +1 -1
- package/dist/components/core/Table/MobileCard.d.ts +10 -1
- package/dist/components/core/Table/MobileCard.d.ts.map +1 -1
- package/dist/components/core/Table/MobileFilters.d.ts +8 -2
- package/dist/components/core/Table/MobileFilters.d.ts.map +1 -1
- package/dist/components/core/Table/Table.d.ts.map +1 -1
- package/dist/components/core/Table/TableRow.d.ts +2 -1
- package/dist/components/core/Table/TableRow.d.ts.map +1 -1
- package/dist/components/core/Tabs.d.ts +5 -8
- package/dist/components/core/Tabs.d.ts.map +1 -1
- package/dist/components/core/Textarea.d.ts.map +1 -1
- package/dist/components/core/ThreeDotPopover.d.ts +10 -22
- package/dist/components/core/ThreeDotPopover.d.ts.map +1 -1
- package/dist/components/core/Tooltip.d.ts +2 -1
- package/dist/components/core/Tooltip.d.ts.map +1 -1
- package/dist/components/core/internal/Calendar.d.ts +77 -0
- package/dist/components/core/internal/Calendar.d.ts.map +1 -0
- package/dist/components/core/menu/ActionMenuSurface.d.ts +42 -0
- package/dist/components/core/menu/ActionMenuSurface.d.ts.map +1 -0
- package/dist/components/core/menu/ActionSheetMenu.d.ts +17 -0
- package/dist/components/core/menu/ActionSheetMenu.d.ts.map +1 -0
- package/dist/components/core/menu/MenuPopover.d.ts +21 -0
- package/dist/components/core/menu/MenuPopover.d.ts.map +1 -0
- package/dist/components/core/menu/menuItems.d.ts +21 -0
- package/dist/components/core/menu/menuItems.d.ts.map +1 -0
- package/dist/components/core/menu/menuKeyboard.d.ts +16 -0
- package/dist/components/core/menu/menuKeyboard.d.ts.map +1 -0
- package/dist/components/feedback/ActionSheet.d.ts +4 -0
- package/dist/components/feedback/ActionSheet.d.ts.map +1 -0
- package/dist/components/feedback/Alert.d.ts.map +1 -1
- package/dist/components/feedback/Dialog.d.ts.map +1 -1
- package/dist/components/feedback/Drawer.d.ts.map +1 -1
- package/dist/components/feedback/Sheet.d.ts +4 -0
- package/dist/components/feedback/Sheet.d.ts.map +1 -0
- package/dist/components/feedback/Toast.d.ts +4 -3
- package/dist/components/feedback/Toast.d.ts.map +1 -1
- package/dist/components/feedback/ToastItem.d.ts +47 -0
- package/dist/components/feedback/ToastItem.d.ts.map +1 -0
- package/dist/components/feedback/ToastStack.d.ts +20 -0
- package/dist/components/feedback/ToastStack.d.ts.map +1 -0
- package/dist/components/feedback/ToastSwipe.d.ts +22 -0
- package/dist/components/feedback/ToastSwipe.d.ts.map +1 -0
- package/dist/components/feedback/Tour.d.ts.map +1 -1
- package/dist/components/feedback/sheetCore.d.ts +30 -0
- package/dist/components/feedback/sheetCore.d.ts.map +1 -0
- package/dist/components/navigation/Breadcrumbs.d.ts.map +1 -1
- package/dist/components/navigation/FootNav.d.ts.map +1 -1
- package/dist/components/navigation/Navbar.d.ts.map +1 -1
- package/dist/components/navigation/Sidebar.d.ts +6 -0
- package/dist/components/navigation/Sidebar.d.ts.map +1 -1
- package/dist/components/rich-text/RichTextEditor.d.ts.map +1 -1
- package/dist/components/rich-text/RichTextToolbar.d.ts +6 -2
- package/dist/components/rich-text/RichTextToolbar.d.ts.map +1 -1
- package/dist/components/utility/Avatar.d.ts +8 -0
- package/dist/components/utility/Avatar.d.ts.map +1 -1
- package/dist/components/utility/AvatarGroup.d.ts +4 -0
- package/dist/components/utility/AvatarGroup.d.ts.map +1 -0
- package/dist/components/utility/Badge.d.ts.map +1 -1
- package/dist/components/utility/Card.d.ts.map +1 -1
- package/dist/components/utility/Carousel.d.ts.map +1 -1
- package/dist/components/utility/FileUpload.d.ts.map +1 -1
- package/dist/components/utility/Pagination.d.ts.map +1 -1
- package/dist/components/utility/PullToRefresh.d.ts +5 -0
- package/dist/components/utility/PullToRefresh.d.ts.map +1 -0
- package/dist/components/utility/Sortable.d.ts.map +1 -1
- package/dist/components/utility/Stepper.d.ts.map +1 -1
- package/dist/esm/components/blocks/AppShell.js +97 -90
- package/dist/esm/components/blocks/BottomActionBar.js +132 -0
- package/dist/esm/components/blocks/ConfirmDialog.js +40 -4
- package/dist/esm/components/blocks/EmptyState.js +1 -1
- package/dist/esm/components/blocks/ErrorState.js +1 -1
- package/dist/esm/components/blocks/LoadingState.js +4 -4
- package/dist/esm/components/blocks/PageHeader.js +16 -3
- package/dist/esm/components/blocks/StatCard.js +6 -6
- package/dist/esm/components/blocks/StatusPill.js +5 -8
- package/dist/esm/components/charts/CartesianChart.js +85 -62
- package/dist/esm/components/charts/ChartFrame.js +12 -5
- package/dist/esm/components/charts/useChartLayout.js +105 -0
- package/dist/esm/components/core/Button.js +49 -25
- package/dist/esm/components/core/Checkbox.js +72 -57
- package/dist/esm/components/core/ColorPicker.js +31 -42
- package/dist/esm/components/core/DatePicker.js +117 -304
- package/dist/esm/components/core/DateRangePicker.js +260 -308
- package/dist/esm/components/core/Form.js +11 -2
- package/dist/esm/components/core/Input.js +100 -38
- package/dist/esm/components/core/Loader.js +30 -44
- package/dist/esm/components/core/LocationPicker.js +82 -16
- package/dist/esm/components/core/Popover.js +59 -48
- package/dist/esm/components/core/ProgressBar.js +40 -72
- package/dist/esm/components/core/Radio.js +10 -12
- package/dist/esm/components/core/Rate.js +77 -14
- package/dist/esm/components/core/RoundedTag.js +5 -5
- package/dist/esm/components/core/SearchField.js +311 -0
- package/dist/esm/components/core/SegmentedControl.js +189 -0
- package/dist/esm/components/core/Select.js +185 -190
- package/dist/esm/components/core/Skeleton.js +13 -14
- package/dist/esm/components/core/Slider.js +24 -6
- package/dist/esm/components/core/SpeechToText.js +68 -16
- package/dist/esm/components/core/SwipeableListItem.js +286 -0
- package/dist/esm/components/core/SwipeableListItemGesture.js +219 -0
- package/dist/esm/components/core/Switch.js +98 -28
- package/dist/esm/components/core/Table/ActionMenu.js +45 -231
- package/dist/esm/components/core/Table/ColumnMenu.js +1 -1
- package/dist/esm/components/core/Table/MobileCard.js +66 -16
- package/dist/esm/components/core/Table/MobileFilters.js +181 -10
- package/dist/esm/components/core/Table/Table.js +149 -102
- package/dist/esm/components/core/Table/TableRow.js +10 -2
- package/dist/esm/components/core/Tabs.js +186 -39
- package/dist/esm/components/core/Textarea.js +10 -2
- package/dist/esm/components/core/ThreeDotPopover.js +93 -99
- package/dist/esm/components/core/Tooltip.js +138 -145
- package/dist/esm/components/core/internal/Calendar.js +381 -0
- package/dist/esm/components/core/menu/ActionMenuSurface.js +110 -0
- package/dist/esm/components/core/menu/ActionSheetMenu.js +140 -0
- package/dist/esm/components/core/menu/MenuPopover.js +177 -0
- package/dist/esm/components/core/menu/menuItems.js +61 -0
- package/dist/esm/components/core/menu/menuKeyboard.js +54 -0
- package/dist/esm/components/feedback/ActionSheet.js +55 -0
- package/dist/esm/components/feedback/Alert.js +63 -53
- package/dist/esm/components/feedback/Dialog.js +141 -53
- package/dist/esm/components/feedback/Drawer.js +130 -132
- package/dist/esm/components/feedback/Sheet.js +125 -0
- package/dist/esm/components/feedback/Toast.js +21 -291
- package/dist/esm/components/feedback/ToastItem.js +348 -0
- package/dist/esm/components/feedback/ToastStack.js +130 -0
- package/dist/esm/components/feedback/ToastSwipe.js +52 -0
- package/dist/esm/components/feedback/Tour.js +107 -30
- package/dist/esm/components/feedback/sheetCore.js +494 -0
- package/dist/esm/components/navigation/Breadcrumbs.js +97 -35
- package/dist/esm/components/navigation/Dropdown.js +1 -1
- package/dist/esm/components/navigation/FootNav.js +102 -13
- package/dist/esm/components/navigation/Navbar.js +172 -37
- package/dist/esm/components/navigation/Sidebar.js +263 -111
- package/dist/esm/components/rich-text/RichTextEditor.js +9 -3
- package/dist/esm/components/rich-text/RichTextToolbar.js +29 -9
- package/dist/esm/components/utility/Avatar.js +14 -12
- package/dist/esm/components/utility/AvatarGroup.js +56 -0
- package/dist/esm/components/utility/Badge.js +43 -23
- package/dist/esm/components/utility/Card.js +32 -8
- package/dist/esm/components/utility/Carousel.js +139 -29
- package/dist/esm/components/utility/FileUpload.js +106 -31
- package/dist/esm/components/utility/Pagination.js +31 -13
- package/dist/esm/components/utility/Portal.js +31 -0
- package/dist/esm/components/utility/PullToRefresh.js +229 -0
- package/dist/esm/components/utility/Sortable.js +6 -2
- package/dist/esm/components/utility/Stepper.js +110 -47
- package/dist/esm/hooks/useFloatingPosition.js +82 -0
- package/dist/esm/hooks/useHaptics.js +65 -0
- package/dist/esm/hooks/usePresence.js +58 -0
- package/dist/esm/hooks/usePresentation.js +21 -0
- package/dist/esm/hooks/useSheetDrag.js +220 -0
- package/dist/esm/hooks/useSliderValues.js +8 -2
- package/dist/esm/hooks/useSortable.js +107 -5
- package/dist/esm/index.js +14 -2
- package/dist/esm/utils/position.js +10 -63
- package/dist/esm/utils/touchTarget.js +4 -1
- package/dist/hooks/useFloatingPosition.d.ts +8 -4
- package/dist/hooks/useFloatingPosition.d.ts.map +1 -1
- package/dist/hooks/useHaptics.d.ts +19 -0
- package/dist/hooks/useHaptics.d.ts.map +1 -0
- package/dist/hooks/useSheetDrag.d.ts +31 -0
- package/dist/hooks/useSheetDrag.d.ts.map +1 -0
- package/dist/hooks/useSliderValues.d.ts +6 -2
- package/dist/hooks/useSliderValues.d.ts.map +1 -1
- package/dist/hooks/useSortable.d.ts +11 -1
- package/dist/hooks/useSortable.d.ts.map +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.ts +11 -2
- package/dist/index.esm.css +1 -1
- package/dist/index.esm.js +10645 -3842
- package/dist/index.js +10657 -3845
- package/dist/rich-text/index.js +41 -11
- package/dist/types/blocks.d.ts +32 -2
- package/dist/types/blocks.d.ts.map +1 -1
- package/dist/types/charts.d.ts +3 -1
- package/dist/types/charts.d.ts.map +1 -1
- package/dist/types/index.d.ts +409 -26
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/rich-text.d.ts +5 -0
- package/dist/types/rich-text.d.ts.map +1 -1
- package/dist/utils/position.d.ts +0 -15
- package/dist/utils/position.d.ts.map +1 -1
- package/doc/README.md +16 -0
- package/mcp/catalog.snapshot.json +1540 -407
- package/package.json +7 -2
- package/dist/esm/hooks/useSwipeToClose.js +0 -66
- package/dist/hooks/useSwipeToClose.d.ts +0 -24
- package/dist/hooks/useSwipeToClose.d.ts.map +0 -1
|
@@ -1,29 +1,27 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { objectWithoutProperties as _objectWithoutProperties, slicedToArray as _slicedToArray, objectSpread2 as _objectSpread2 } from '../../_virtual/_rollupPluginBabelHelpers.js';
|
|
3
|
-
import { jsxs,
|
|
4
|
-
import { forwardRef, useId, useMemo, useState, useRef,
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
3
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
4
|
+
import { forwardRef, useId, useMemo, useState, useRef, useCallback, useEffect } from 'react';
|
|
5
|
+
import { isSameDay, format, isBefore } from 'date-fns';
|
|
6
|
+
import { Calendar as Calendar$1, X } from 'lucide-react';
|
|
7
7
|
import { cn } from '../../utils/cn.js';
|
|
8
|
-
import {
|
|
8
|
+
import { usePresentation } from '../../hooks/usePresentation.js';
|
|
9
|
+
import { useFloatingPosition } from '../../hooks/useFloatingPosition.js';
|
|
10
|
+
import { normalizeDate, useActiveDayFocusRef, makeIsDisabled, Calendar, PickerSurface, isBetween } from './internal/Calendar.js';
|
|
9
11
|
|
|
10
|
-
var _excluded = ["value", "onChange", "placeholder", "label", "error", "helperText", "disabled", "required", "minDate", "maxDate", "className", "weekStartsOn", "portal", "displayFormat", "locale", "showClear", "closeOnSelect"];
|
|
12
|
+
var _excluded = ["value", "onChange", "placeholder", "label", "error", "helperText", "disabled", "required", "minDate", "maxDate", "className", "weekStartsOn", "portal", "displayFormat", "locale", "showClear", "closeOnSelect", "presentation", "presets"];
|
|
11
13
|
/*
|
|
12
|
-
Single-calendar DateRangePicker
|
|
13
|
-
-
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
Single-calendar DateRangePicker.
|
|
15
|
+
- Popover: tap/click start then end; the second pick commits (and closes
|
|
16
|
+
with closeOnSelect). The popup won't close on outside click / Escape while
|
|
17
|
+
only a start date is picked; the trigger always toggles it.
|
|
18
|
+
- Sheet: a bottom Sheet with 44px days and swipe-to-change-month. Picks are
|
|
19
|
+
a draft until the sticky "Apply"; dismissing the sheet discards the draft.
|
|
20
|
+
- The days between start and the hovered / focused day are previewed, and
|
|
21
|
+
once both ends are picked the whole range is shown.
|
|
16
22
|
*/
|
|
17
|
-
var
|
|
18
|
-
|
|
19
|
-
if (typeof d === "string") {
|
|
20
|
-
try {
|
|
21
|
-
return parseISO(d);
|
|
22
|
-
} catch (e) {
|
|
23
|
-
return null;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
return d instanceof Date ? d : null;
|
|
23
|
+
var sortRange = function sortRange(a, b) {
|
|
24
|
+
return isBefore(b, a) ? [b, a] : [a, b];
|
|
27
25
|
};
|
|
28
26
|
var DateRangePicker = /*#__PURE__*/forwardRef(function DateRangePicker(_ref, ref) {
|
|
29
27
|
var value = _ref.value,
|
|
@@ -50,6 +48,9 @@ var DateRangePicker = /*#__PURE__*/forwardRef(function DateRangePicker(_ref, ref
|
|
|
50
48
|
showClear = _ref$showClear === void 0 ? true : _ref$showClear,
|
|
51
49
|
_ref$closeOnSelect = _ref.closeOnSelect,
|
|
52
50
|
closeOnSelect = _ref$closeOnSelect === void 0 ? true : _ref$closeOnSelect,
|
|
51
|
+
_ref$presentation = _ref.presentation,
|
|
52
|
+
presentation = _ref$presentation === void 0 ? "auto" : _ref$presentation,
|
|
53
|
+
presets = _ref.presets,
|
|
53
54
|
props = _objectWithoutProperties(_ref, _excluded);
|
|
54
55
|
// Stable ids wiring label / helper / error to the trigger button.
|
|
55
56
|
// A consumer `id` (spread onto the trigger via ...props) wins.
|
|
@@ -59,6 +60,8 @@ var DateRangePicker = /*#__PURE__*/forwardRef(function DateRangePicker(_ref, ref
|
|
|
59
60
|
var valueId = "".concat(fieldId, "-value");
|
|
60
61
|
var errorId = "".concat(fieldId, "-error");
|
|
61
62
|
var helperId = "".concat(fieldId, "-helper");
|
|
63
|
+
var mode = usePresentation(presentation);
|
|
64
|
+
var isSheet = mode === "sheet";
|
|
62
65
|
var start = useMemo(function () {
|
|
63
66
|
return normalizeDate(value === null || value === void 0 ? void 0 : value.start);
|
|
64
67
|
}, [value]);
|
|
@@ -82,37 +85,67 @@ var DateRangePicker = /*#__PURE__*/forwardRef(function DateRangePicker(_ref, ref
|
|
|
82
85
|
_useState8 = _slicedToArray(_useState7, 2),
|
|
83
86
|
localEnd = _useState8[0],
|
|
84
87
|
setLocalEnd = _useState8[1];
|
|
85
|
-
//
|
|
88
|
+
// preview end (hovered or keyboard-focused day) while picking the second date
|
|
86
89
|
var _useState9 = useState(null),
|
|
87
90
|
_useState0 = _slicedToArray(_useState9, 2),
|
|
88
|
-
|
|
89
|
-
|
|
91
|
+
previewDate = _useState0[0],
|
|
92
|
+
setPreviewDate = _useState0[1];
|
|
93
|
+
// The last committed range: `value` when controlled, else the last pick.
|
|
94
|
+
// Closing mid-pick (or dismissing the sheet) restores the draft to it.
|
|
95
|
+
var _useState1 = useState({
|
|
96
|
+
start: start,
|
|
97
|
+
end: end
|
|
98
|
+
}),
|
|
99
|
+
_useState10 = _slicedToArray(_useState1, 2),
|
|
100
|
+
committed = _useState10[0],
|
|
101
|
+
setCommitted = _useState10[1];
|
|
90
102
|
// Re-sync local selection when the external value changes
|
|
91
103
|
// (adjust-during-render pattern).
|
|
92
|
-
var
|
|
93
|
-
|
|
94
|
-
prevValue =
|
|
95
|
-
setPrevValue =
|
|
104
|
+
var _useState11 = useState(value),
|
|
105
|
+
_useState12 = _slicedToArray(_useState11, 2),
|
|
106
|
+
prevValue = _useState12[0],
|
|
107
|
+
setPrevValue = _useState12[1];
|
|
96
108
|
if (value !== prevValue) {
|
|
97
109
|
setPrevValue(value);
|
|
98
110
|
setLocalStart(start);
|
|
99
111
|
setLocalEnd(end);
|
|
112
|
+
setCommitted({
|
|
113
|
+
start: start,
|
|
114
|
+
end: end
|
|
115
|
+
});
|
|
100
116
|
if (start) setCurrentMonth(start);
|
|
101
117
|
}
|
|
102
118
|
var datePickerRef = useRef(null);
|
|
103
119
|
var popupRef = useRef(null);
|
|
104
|
-
var
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
120
|
+
var triggerRef = useRef(null);
|
|
121
|
+
var gridRef = useRef(null);
|
|
122
|
+
var initialFocus = useActiveDayFocusRef(gridRef);
|
|
123
|
+
var _useFloatingPosition = useFloatingPosition({
|
|
124
|
+
placement: "bottom-start",
|
|
125
|
+
offset: 8,
|
|
126
|
+
open: isOpen && !isSheet
|
|
127
|
+
}),
|
|
128
|
+
refs = _useFloatingPosition.refs,
|
|
129
|
+
floatingStyles = _useFloatingPosition.floatingStyles,
|
|
130
|
+
isPositioned = _useFloatingPosition.isPositioned;
|
|
131
|
+
var setReference = refs.setReference,
|
|
132
|
+
setFloating = refs.setFloating;
|
|
133
|
+
var fieldRef = useCallback(function (node) {
|
|
134
|
+
datePickerRef.current = node;
|
|
135
|
+
setReference(node);
|
|
136
|
+
}, [setReference]);
|
|
137
|
+
var floatingRef = useCallback(function (node) {
|
|
138
|
+
popupRef.current = node;
|
|
139
|
+
setFloating(node);
|
|
140
|
+
}, [setFloating]);
|
|
141
|
+
var picking = Boolean(localStart && !localEnd);
|
|
142
|
+
// Popover only: outside click closes unless a start-only pick is in progress.
|
|
109
143
|
useEffect(function () {
|
|
144
|
+
if (isSheet) return undefined;
|
|
110
145
|
var handleClickOutside = function handleClickOutside(e) {
|
|
111
146
|
if (datePickerRef.current && !datePickerRef.current.contains(e.target) && (!popupRef.current || !popupRef.current.contains(e.target))) {
|
|
112
147
|
// If user has selected a start but no end, prevent closing to force range selection
|
|
113
|
-
if (
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
148
|
+
if (picking) return;
|
|
116
149
|
setIsOpen(false);
|
|
117
150
|
}
|
|
118
151
|
};
|
|
@@ -120,305 +153,187 @@ var DateRangePicker = /*#__PURE__*/forwardRef(function DateRangePicker(_ref, ref
|
|
|
120
153
|
return function () {
|
|
121
154
|
return document.removeEventListener("mousedown", handleClickOutside);
|
|
122
155
|
};
|
|
123
|
-
}, [
|
|
124
|
-
//
|
|
156
|
+
}, [picking, isSheet]);
|
|
157
|
+
// Popover only: Escape closes unless a start-only pick is in progress
|
|
158
|
+
// (the sheet's focus trap handles Escape itself).
|
|
125
159
|
useEffect(function () {
|
|
160
|
+
if (isSheet) return undefined;
|
|
126
161
|
var handleKey = function handleKey(e) {
|
|
127
162
|
if (!isOpen) return;
|
|
128
163
|
if (e.key === "Escape") {
|
|
129
|
-
|
|
164
|
+
var _triggerRef$current;
|
|
165
|
+
if (picking) return; // ignore escape while selecting range
|
|
166
|
+
var hadFocusInside = popupRef.current && popupRef.current.contains(document.activeElement);
|
|
130
167
|
setIsOpen(false);
|
|
168
|
+
if (hadFocusInside) (_triggerRef$current = triggerRef.current) === null || _triggerRef$current === void 0 || _triggerRef$current.focus();
|
|
131
169
|
}
|
|
132
170
|
};
|
|
133
171
|
document.addEventListener("keydown", handleKey);
|
|
134
172
|
return function () {
|
|
135
173
|
return document.removeEventListener("keydown", handleKey);
|
|
136
174
|
};
|
|
137
|
-
}, [isOpen,
|
|
138
|
-
var
|
|
139
|
-
|
|
140
|
-
var
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
175
|
+
}, [isOpen, picking, isSheet]);
|
|
176
|
+
var isDisabled = makeIsDisabled(minDate, maxDate);
|
|
177
|
+
// Close and drop any uncommitted draft (back to the controlled value).
|
|
178
|
+
var closeAndReset = function closeAndReset() {
|
|
179
|
+
setIsOpen(false);
|
|
180
|
+
setLocalStart(committed.start);
|
|
181
|
+
setLocalEnd(committed.end);
|
|
182
|
+
setPreviewDate(null);
|
|
145
183
|
};
|
|
146
|
-
var
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
var monthEnd = endOfMonth(currentMonth);
|
|
151
|
-
var monthGridEnd = endOfWeek(monthEnd, {
|
|
152
|
-
weekStartsOn: weekStartsOn
|
|
153
|
-
});
|
|
154
|
-
var days = useMemo(function () {
|
|
155
|
-
return eachDayOfInterval({
|
|
156
|
-
start: monthGridStart,
|
|
157
|
-
end: monthGridEnd
|
|
184
|
+
var commit = function commit(s, e) {
|
|
185
|
+
onChange === null || onChange === void 0 || onChange({
|
|
186
|
+
start: s,
|
|
187
|
+
end: e
|
|
158
188
|
});
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
}
|
|
169
|
-
if (s && !e && hover) {
|
|
170
|
-
var a = isBefore(hover, s) ? hover : s;
|
|
171
|
-
var b = isBefore(hover, s) ? s : hover;
|
|
172
|
-
return isSameDay(d, a) || isSameDay(d, b) || isAfter(startOfDay(d), a) && isBefore(startOfDay(d), b);
|
|
189
|
+
setCommitted({
|
|
190
|
+
start: s,
|
|
191
|
+
end: e
|
|
192
|
+
});
|
|
193
|
+
setPreviewDate(null);
|
|
194
|
+
if (closeOnSelect || isSheet) {
|
|
195
|
+
var _triggerRef$current2;
|
|
196
|
+
setIsOpen(false);
|
|
197
|
+
(_triggerRef$current2 = triggerRef.current) === null || _triggerRef$current2 === void 0 || _triggerRef$current2.focus();
|
|
173
198
|
}
|
|
174
|
-
return false;
|
|
175
199
|
};
|
|
176
200
|
var handleDayClick = function handleDayClick(d) {
|
|
177
201
|
if (isDisabled(d)) return;
|
|
178
|
-
// No start selected -> pick start
|
|
179
|
-
if (!localStart && !localEnd) {
|
|
180
|
-
setLocalStart(d);
|
|
181
|
-
setLocalEnd(null);
|
|
182
|
-
setHoverDate(null);
|
|
183
|
-
setCurrentMonth(d);
|
|
184
|
-
return;
|
|
185
|
-
}
|
|
186
202
|
// Have start but no end -> pick end (swap if before)
|
|
187
|
-
if (
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
});
|
|
198
|
-
} else {
|
|
199
|
-
setLocalEnd(d);
|
|
200
|
-
onChange === null || onChange === void 0 || onChange({
|
|
201
|
-
start: localStart,
|
|
202
|
-
end: d
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
setHoverDate(null);
|
|
206
|
-
// Close the popup only after the second date is selected
|
|
207
|
-
if (closeOnSelect) setIsOpen(false);
|
|
208
|
-
return;
|
|
209
|
-
}
|
|
210
|
-
// Both present -> start a new selection with clicked date as start
|
|
211
|
-
if (localStart && localEnd) {
|
|
212
|
-
setLocalStart(d);
|
|
213
|
-
setLocalEnd(null);
|
|
214
|
-
setHoverDate(null);
|
|
215
|
-
setCurrentMonth(d);
|
|
203
|
+
if (picking) {
|
|
204
|
+
var _sortRange = sortRange(localStart, d),
|
|
205
|
+
_sortRange2 = _slicedToArray(_sortRange, 2),
|
|
206
|
+
s = _sortRange2[0],
|
|
207
|
+
e = _sortRange2[1];
|
|
208
|
+
setLocalStart(s);
|
|
209
|
+
setLocalEnd(e);
|
|
210
|
+
setPreviewDate(null);
|
|
211
|
+
// The sheet waits for "Apply"; the popover commits now.
|
|
212
|
+
if (!isSheet) commit(s, e);
|
|
216
213
|
return;
|
|
217
214
|
}
|
|
215
|
+
// No selection, or a full one -> start a new selection
|
|
216
|
+
setLocalStart(d);
|
|
217
|
+
setLocalEnd(null);
|
|
218
|
+
setPreviewDate(null);
|
|
219
|
+
setCurrentMonth(d);
|
|
220
|
+
};
|
|
221
|
+
var handlePreview = function handlePreview(d) {
|
|
222
|
+
if (d && !picking) return;
|
|
223
|
+
setPreviewDate(d);
|
|
224
|
+
};
|
|
225
|
+
var getDayState = function getDayState(d) {
|
|
226
|
+
var isEdge = Boolean(localStart && isSameDay(d, localStart) || localEnd && isSameDay(d, localEnd));
|
|
227
|
+
var inRange = false;
|
|
228
|
+
if (localStart && localEnd) inRange = isBetween(d, localStart, localEnd);else if (localStart && previewDate) inRange = isBetween(d, localStart, previewDate);
|
|
229
|
+
return {
|
|
230
|
+
selected: isEdge || inRange,
|
|
231
|
+
edge: isEdge,
|
|
232
|
+
inRange: inRange && !isEdge
|
|
233
|
+
};
|
|
218
234
|
};
|
|
219
235
|
var clearSelection = function clearSelection() {
|
|
220
236
|
setLocalStart(null);
|
|
221
237
|
setLocalEnd(null);
|
|
222
|
-
|
|
238
|
+
setPreviewDate(null);
|
|
239
|
+
setCommitted({
|
|
240
|
+
start: null,
|
|
241
|
+
end: null
|
|
242
|
+
});
|
|
223
243
|
onChange === null || onChange === void 0 || onChange(null);
|
|
224
244
|
};
|
|
245
|
+
var selectToday = function selectToday() {
|
|
246
|
+
var t = new Date();
|
|
247
|
+
setLocalStart(t);
|
|
248
|
+
setLocalEnd(t);
|
|
249
|
+
setCurrentMonth(t);
|
|
250
|
+
if (isSheet) return; // applied with "Apply"
|
|
251
|
+
commit(t, t);
|
|
252
|
+
};
|
|
253
|
+
var applyPreset = function applyPreset(preset) {
|
|
254
|
+
var _ref2 = preset.range || [],
|
|
255
|
+
_ref3 = _slicedToArray(_ref2, 2),
|
|
256
|
+
a = _ref3[0],
|
|
257
|
+
b = _ref3[1];
|
|
258
|
+
var s = normalizeDate(a);
|
|
259
|
+
var e = normalizeDate(b);
|
|
260
|
+
if (!s || !e) return;
|
|
261
|
+
var _sortRange3 = sortRange(s, e),
|
|
262
|
+
_sortRange4 = _slicedToArray(_sortRange3, 2),
|
|
263
|
+
ps = _sortRange4[0],
|
|
264
|
+
pe = _sortRange4[1];
|
|
265
|
+
setLocalStart(ps);
|
|
266
|
+
setLocalEnd(pe);
|
|
267
|
+
setCurrentMonth(ps);
|
|
268
|
+
setPreviewDate(null);
|
|
269
|
+
if (!isSheet) commit(ps, pe);
|
|
270
|
+
};
|
|
225
271
|
// A disabled picker cannot be cleared (the old nested button could not be
|
|
226
272
|
// clicked inside a disabled trigger either).
|
|
227
|
-
var showClearButton = Boolean(showClear && !disabled && (localStart || localEnd));
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
if (!localStart || !localEnd) return placeholder;
|
|
231
|
-
return "".concat(format(localStart, displayFormat, {
|
|
273
|
+
var showClearButton = Boolean(showClear && !disabled && (committed.start || committed.end || localStart || localEnd));
|
|
274
|
+
var formatRange = function formatRange(s, e) {
|
|
275
|
+
return "".concat(format(s, displayFormat, {
|
|
232
276
|
locale: locale
|
|
233
|
-
}), " \u2014 ").concat(format(
|
|
277
|
+
}), " \u2014 ").concat(format(e, displayFormat, {
|
|
234
278
|
locale: locale
|
|
235
279
|
}));
|
|
236
280
|
};
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
281
|
+
// Display placeholder until both start and end are committed (mandatory range).
|
|
282
|
+
var triggerText = committed.start && committed.end ? formatRange(committed.start, committed.end) : placeholder;
|
|
283
|
+
var draftText = localStart && localEnd ? formatRange(localStart, localEnd) : placeholder;
|
|
284
|
+
var presetList = Array.isArray(presets) && presets.length > 0 ? presets : null;
|
|
285
|
+
var presetChips = presetList ? jsx("div", {
|
|
286
|
+
role: "group",
|
|
287
|
+
"aria-label": "Presets",
|
|
288
|
+
className: cn("flex gap-2", isSheet ? "-mx-1 mb-3 overflow-x-auto px-1 pb-1" : "mb-3 flex-wrap"),
|
|
289
|
+
children: presetList.map(function (preset) {
|
|
290
|
+
var _preset$range, _preset$range2;
|
|
291
|
+
var s = normalizeDate((_preset$range = preset.range) === null || _preset$range === void 0 ? void 0 : _preset$range[0]);
|
|
292
|
+
var e = normalizeDate((_preset$range2 = preset.range) === null || _preset$range2 === void 0 ? void 0 : _preset$range2[1]);
|
|
293
|
+
var active = Boolean(s && e && localStart && localEnd && isSameDay(s, localStart) && isSameDay(e, localEnd));
|
|
294
|
+
return jsx("button", {
|
|
295
|
+
type: "button",
|
|
296
|
+
"aria-pressed": active,
|
|
297
|
+
onClick: function onClick() {
|
|
298
|
+
return applyPreset(preset);
|
|
299
|
+
},
|
|
300
|
+
className: cn("shrink-0 rounded-full border px-3 text-xs font-medium transition-colors motion-reduce:transition-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500", isSheet ? "min-h-11 text-sm" : "py-1", active ? "border-primary-600 bg-primary-600 text-white" : "border-gray-300 hover:bg-gray-100"),
|
|
301
|
+
children: preset.label
|
|
302
|
+
}, preset.label);
|
|
303
|
+
})
|
|
304
|
+
}) : null;
|
|
305
|
+
var actionClass = isSheet ? "rounded-md px-3 py-2 text-sm hover:bg-gray-100" : "rounded-md px-2 py-1 text-xs hover:bg-gray-100";
|
|
306
|
+
var calendar = jsx(Calendar, {
|
|
307
|
+
month: currentMonth,
|
|
308
|
+
onMonthChange: setCurrentMonth,
|
|
309
|
+
weekStartsOn: weekStartsOn,
|
|
310
|
+
isDisabled: isDisabled,
|
|
311
|
+
getDayState: getDayState,
|
|
312
|
+
onSelect: handleDayClick,
|
|
313
|
+
onPreview: handlePreview,
|
|
314
|
+
preferredDate: localEnd || localStart,
|
|
315
|
+
size: mode,
|
|
316
|
+
swipe: isSheet,
|
|
317
|
+
autoFocus: !isSheet,
|
|
318
|
+
fullDateLabels: true,
|
|
319
|
+
multiSelectable: true,
|
|
320
|
+
locale: locale,
|
|
321
|
+
gridRef: gridRef
|
|
322
|
+
});
|
|
323
|
+
var sheetFooter = jsxs(Fragment, {
|
|
324
|
+
children: [showClear ? jsx("button", {
|
|
240
325
|
type: "button",
|
|
241
|
-
className:
|
|
242
|
-
onClick:
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
});
|
|
246
|
-
},
|
|
247
|
-
"aria-label": "Previous month",
|
|
248
|
-
children: jsx(ChevronLeft, {
|
|
249
|
-
className: "h-4 w-4"
|
|
250
|
-
})
|
|
251
|
-
}), jsx("h4", {
|
|
252
|
-
className: "text-sm font-medium",
|
|
253
|
-
children: format(currentMonth, "MMMM yyyy")
|
|
254
|
-
}), jsx("button", {
|
|
326
|
+
className: actionClass,
|
|
327
|
+
onClick: clearSelection,
|
|
328
|
+
children: "Clear"
|
|
329
|
+
}) : jsx("span", {}), jsx("button", {
|
|
255
330
|
type: "button",
|
|
256
|
-
|
|
331
|
+
disabled: !localStart || !localEnd,
|
|
257
332
|
onClick: function onClick() {
|
|
258
|
-
return
|
|
259
|
-
return addMonths(m, 1);
|
|
260
|
-
});
|
|
333
|
+
return commit(localStart, localEnd);
|
|
261
334
|
},
|
|
262
|
-
"
|
|
263
|
-
children:
|
|
264
|
-
className: "h-4 w-4"
|
|
265
|
-
})
|
|
266
|
-
})]
|
|
267
|
-
});
|
|
268
|
-
// compute popup position so it's aware of viewport edges (top/bottom/left/right)
|
|
269
|
-
var computePopupPosition = function computePopupPosition() {
|
|
270
|
-
var margin = 8;
|
|
271
|
-
var trigger = datePickerRef.current;
|
|
272
|
-
var popup = popupRef.current;
|
|
273
|
-
if (!trigger || !popup) return;
|
|
274
|
-
var triggerRect = trigger.getBoundingClientRect();
|
|
275
|
-
// measure popup by temporarily making it visible if hidden
|
|
276
|
-
var popupRect = popup.getBoundingClientRect();
|
|
277
|
-
// If the popup is not yet fully measured (width/height 0), try to read offsetWidth/Height
|
|
278
|
-
if (popupRect.width === 0 || popupRect.height === 0) {
|
|
279
|
-
popupRect = {
|
|
280
|
-
width: popup.offsetWidth || 320,
|
|
281
|
-
height: popup.offsetHeight || 300
|
|
282
|
-
};
|
|
283
|
-
}
|
|
284
|
-
// Decide vertical placement
|
|
285
|
-
var spaceBelow = window.innerHeight - triggerRect.bottom;
|
|
286
|
-
var spaceAbove = triggerRect.top;
|
|
287
|
-
var placeBelow = spaceBelow >= popupRect.height + margin;
|
|
288
|
-
if (!placeBelow && spaceAbove >= popupRect.height + margin) placeBelow = false;
|
|
289
|
-
// If neither side has full space, pick the side with more space
|
|
290
|
-
if (!placeBelow && spaceBelow < popupRect.height + margin && spaceAbove < popupRect.height + margin) {
|
|
291
|
-
placeBelow = spaceBelow >= spaceAbove;
|
|
292
|
-
}
|
|
293
|
-
// compute top coordinate (fixed positioning)
|
|
294
|
-
var top;
|
|
295
|
-
if (placeBelow) {
|
|
296
|
-
top = Math.min(window.innerHeight - margin - popupRect.height, triggerRect.bottom + margin);
|
|
297
|
-
} else {
|
|
298
|
-
top = Math.max(margin, triggerRect.top - popupRect.height - margin);
|
|
299
|
-
}
|
|
300
|
-
// Decide horizontal placement (try align left to trigger)
|
|
301
|
-
var left = triggerRect.left;
|
|
302
|
-
// If overflowing right, shift left
|
|
303
|
-
if (left + popupRect.width > window.innerWidth - margin) {
|
|
304
|
-
left = Math.max(margin, window.innerWidth - margin - popupRect.width);
|
|
305
|
-
}
|
|
306
|
-
// If overflowing left, clamp
|
|
307
|
-
if (left < margin) left = margin;
|
|
308
|
-
var transformOrigin = placeBelow ? "top left" : "bottom left";
|
|
309
|
-
setPopupStyle({
|
|
310
|
-
position: "fixed",
|
|
311
|
-
top: "".concat(Math.round(top), "px"),
|
|
312
|
-
left: "".concat(Math.round(left), "px"),
|
|
313
|
-
zIndex: 9999,
|
|
314
|
-
transformOrigin: transformOrigin
|
|
315
|
-
});
|
|
316
|
-
};
|
|
317
|
-
// recompute on open, on resize/scroll, and when popup content changes (currentMonth)
|
|
318
|
-
useLayoutEffect(function () {
|
|
319
|
-
if (!isOpen) return;
|
|
320
|
-
// compute on next frame to ensure popup ref exists in DOM (especially with portal)
|
|
321
|
-
// Measuring the DOM and positioning the popup before paint is the
|
|
322
|
-
// intended use of a layout effect, so the setState inside is deliberate.
|
|
323
|
-
// eslint-disable-next-line react-hooks/set-state-in-effect
|
|
324
|
-
computePopupPosition();
|
|
325
|
-
var handleResize = function handleResize() {
|
|
326
|
-
return computePopupPosition();
|
|
327
|
-
};
|
|
328
|
-
window.addEventListener("resize", handleResize);
|
|
329
|
-
window.addEventListener("scroll", handleResize, true); // capture scrolling in ancestors
|
|
330
|
-
return function () {
|
|
331
|
-
window.removeEventListener("resize", handleResize);
|
|
332
|
-
window.removeEventListener("scroll", handleResize, true);
|
|
333
|
-
};
|
|
334
|
-
}, [isOpen, currentMonth]);
|
|
335
|
-
var calendarPopup = jsxs("div", {
|
|
336
|
-
ref: popupRef,
|
|
337
|
-
className: "w-80 rounded-md border border-gray-300 bg-white p-4 shadow-lg",
|
|
338
|
-
role: "dialog",
|
|
339
|
-
"aria-modal": "false",
|
|
340
|
-
style: popupStyle,
|
|
341
|
-
children: [header, jsx("div", {
|
|
342
|
-
className: "mb-2 grid grid-cols-7 gap-1",
|
|
343
|
-
children: Array.from({
|
|
344
|
-
length: 7
|
|
345
|
-
}).map(function (_, i) {
|
|
346
|
-
var dayIndex = (i + weekStartsOn) % 7;
|
|
347
|
-
var label = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"][dayIndex];
|
|
348
|
-
return jsx("div", {
|
|
349
|
-
className: "p-2 text-center text-xs font-medium text-primary-500",
|
|
350
|
-
children: label
|
|
351
|
-
}, label);
|
|
352
|
-
})
|
|
353
|
-
}), jsx("div", {
|
|
354
|
-
className: "grid grid-cols-7 gap-1",
|
|
355
|
-
role: "grid",
|
|
356
|
-
children: days.map(function (d) {
|
|
357
|
-
var isSelStart = localStart && isSameDay(d, localStart);
|
|
358
|
-
var isSelEnd = localEnd && isSameDay(d, localEnd);
|
|
359
|
-
var inRange = dayInRange(d);
|
|
360
|
-
var isCurrentMonth = isSameMonth(d, currentMonth);
|
|
361
|
-
var today = isToday(d);
|
|
362
|
-
var disabled = isDisabled(d);
|
|
363
|
-
return jsx("button", {
|
|
364
|
-
type: "button",
|
|
365
|
-
onClick: function onClick() {
|
|
366
|
-
return handleDayClick(d);
|
|
367
|
-
},
|
|
368
|
-
onMouseEnter: function onMouseEnter() {
|
|
369
|
-
// only set hover when picking end (start selected, end not)
|
|
370
|
-
if (localStart && !localEnd) setHoverDate(d);
|
|
371
|
-
},
|
|
372
|
-
onMouseLeave: function onMouseLeave() {
|
|
373
|
-
if (localStart && !localEnd) setHoverDate(null);
|
|
374
|
-
},
|
|
375
|
-
disabled: disabled,
|
|
376
|
-
className: cn("h-8 w-8 rounded-md text-sm transition-colors focus:outline-2 focus:outline-offset-1", {
|
|
377
|
-
"text-primary-400": !isCurrentMonth,
|
|
378
|
-
"bg-primary-600 text-white": isSelStart || isSelEnd,
|
|
379
|
-
"bg-primary-100 text-primary-600": today && !(isSelStart || isSelEnd),
|
|
380
|
-
"bg-primary-200": inRange && !(isSelStart || isSelEnd),
|
|
381
|
-
"hover:bg-gray-100": isCurrentMonth && !(isSelStart || isSelEnd) && !disabled,
|
|
382
|
-
"cursor-not-allowed opacity-50": disabled
|
|
383
|
-
}),
|
|
384
|
-
children: format(d, "d")
|
|
385
|
-
}, d.toISOString());
|
|
386
|
-
})
|
|
387
|
-
}), jsxs("div", {
|
|
388
|
-
className: "mt-3 flex items-center justify-between",
|
|
389
|
-
children: [jsxs("div", {
|
|
390
|
-
className: "flex gap-2",
|
|
391
|
-
children: [showClear && jsx("button", {
|
|
392
|
-
type: "button",
|
|
393
|
-
className: "rounded-md px-2 py-1 text-xs hover:bg-gray-100",
|
|
394
|
-
onClick: clearSelection,
|
|
395
|
-
children: "Clear"
|
|
396
|
-
}), jsx("button", {
|
|
397
|
-
type: "button",
|
|
398
|
-
className: "rounded-md px-2 py-1 text-xs hover:bg-gray-100",
|
|
399
|
-
onClick: function onClick() {
|
|
400
|
-
var t = new Date();
|
|
401
|
-
setLocalStart(t);
|
|
402
|
-
setLocalEnd(t);
|
|
403
|
-
onChange === null || onChange === void 0 || onChange({
|
|
404
|
-
start: t,
|
|
405
|
-
end: t
|
|
406
|
-
});
|
|
407
|
-
if (closeOnSelect) setIsOpen(false);
|
|
408
|
-
},
|
|
409
|
-
children: "Today"
|
|
410
|
-
})]
|
|
411
|
-
}), jsx("div", {
|
|
412
|
-
className: "flex items-center gap-2",
|
|
413
|
-
children: jsx("div", {
|
|
414
|
-
className: "text-xs text-primary-500",
|
|
415
|
-
children: !localStart || !localEnd ? placeholder : "".concat(format(localStart, displayFormat, {
|
|
416
|
-
locale: locale
|
|
417
|
-
}), " \u2014 ").concat(format(localEnd, displayFormat, {
|
|
418
|
-
locale: locale
|
|
419
|
-
}))
|
|
420
|
-
})
|
|
421
|
-
})]
|
|
335
|
+
className: "min-h-11 rounded-md bg-primary-600 px-5 text-sm font-medium text-white hover:bg-primary-700 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
|
|
336
|
+
children: "Apply"
|
|
422
337
|
})]
|
|
423
338
|
});
|
|
424
339
|
return jsxs("div", {
|
|
@@ -433,9 +348,10 @@ var DateRangePicker = /*#__PURE__*/forwardRef(function DateRangePicker(_ref, ref
|
|
|
433
348
|
children: "*"
|
|
434
349
|
})]
|
|
435
350
|
}), jsxs("div", {
|
|
436
|
-
ref:
|
|
351
|
+
ref: fieldRef,
|
|
437
352
|
className: "relative",
|
|
438
353
|
children: [jsxs("button", _objectSpread2(_objectSpread2({
|
|
354
|
+
ref: triggerRef,
|
|
439
355
|
type: "button",
|
|
440
356
|
id: fieldId,
|
|
441
357
|
"aria-labelledby": label ? "".concat(labelId, " ").concat(valueId) : valueId,
|
|
@@ -443,15 +359,14 @@ var DateRangePicker = /*#__PURE__*/forwardRef(function DateRangePicker(_ref, ref
|
|
|
443
359
|
"aria-invalid": error ? true : undefined,
|
|
444
360
|
className: cn("flex w-full items-center justify-between rounded-md border border-gray-300 bg-white px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent disabled:cursor-not-allowed disabled:opacity-50", {
|
|
445
361
|
"border-error-500 focus:ring-error-500": error,
|
|
446
|
-
"text-primary-500": !
|
|
362
|
+
"text-primary-500": !committed.start || !committed.end,
|
|
447
363
|
"pr-16": showClearButton
|
|
448
364
|
}, className),
|
|
449
365
|
onClick: function onClick() {
|
|
450
|
-
//
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
});
|
|
366
|
+
// The trigger always toggles, even mid-pick (DTUI-35): closing
|
|
367
|
+
// drops the uncommitted start, reopening starts from the last
|
|
368
|
+
// committed range.
|
|
369
|
+
if (isOpen) closeAndReset();else setIsOpen(true);
|
|
455
370
|
},
|
|
456
371
|
disabled: disabled,
|
|
457
372
|
"aria-haspopup": "dialog",
|
|
@@ -460,16 +375,18 @@ var DateRangePicker = /*#__PURE__*/forwardRef(function DateRangePicker(_ref, ref
|
|
|
460
375
|
children: [jsx("span", {
|
|
461
376
|
className: "truncate",
|
|
462
377
|
id: valueId,
|
|
463
|
-
children:
|
|
464
|
-
}), jsx(Calendar, {
|
|
378
|
+
children: triggerText
|
|
379
|
+
}), jsx(Calendar$1, {
|
|
465
380
|
className: "h-4 w-4 shrink-0 text-primary-400",
|
|
466
381
|
"aria-hidden": "true"
|
|
467
382
|
})]
|
|
468
383
|
})), showClearButton && jsx("button", {
|
|
469
384
|
type: "button",
|
|
470
385
|
onClick: function onClick(e) {
|
|
386
|
+
var _triggerRef$current3;
|
|
471
387
|
e.stopPropagation();
|
|
472
388
|
clearSelection();
|
|
389
|
+
(_triggerRef$current3 = triggerRef.current) === null || _triggerRef$current3 === void 0 || _triggerRef$current3.focus();
|
|
473
390
|
},
|
|
474
391
|
"aria-label": "Clear range",
|
|
475
392
|
className: "absolute right-8 top-1/2 -translate-y-1/2 rounded p-1 focus:outline-none focus:ring-2 focus:ring-primary-500",
|
|
@@ -477,7 +394,42 @@ var DateRangePicker = /*#__PURE__*/forwardRef(function DateRangePicker(_ref, ref
|
|
|
477
394
|
className: "h-4 w-4 text-primary-400",
|
|
478
395
|
"aria-hidden": "true"
|
|
479
396
|
})
|
|
480
|
-
}),
|
|
397
|
+
}), jsxs(PickerSurface, {
|
|
398
|
+
mode: mode,
|
|
399
|
+
open: isOpen,
|
|
400
|
+
onClose: closeAndReset,
|
|
401
|
+
title: label || "Select date range",
|
|
402
|
+
portal: portal,
|
|
403
|
+
floatingRef: floatingRef,
|
|
404
|
+
floatingStyles: floatingStyles,
|
|
405
|
+
isPositioned: isPositioned,
|
|
406
|
+
initialFocus: initialFocus,
|
|
407
|
+
sheetFooter: sheetFooter,
|
|
408
|
+
children: [presetChips, calendar, isSheet ? jsx("p", {
|
|
409
|
+
className: "mt-3 text-center text-sm text-primary-500",
|
|
410
|
+
"aria-live": "polite",
|
|
411
|
+
children: draftText
|
|
412
|
+
}) : jsxs("div", {
|
|
413
|
+
className: "mt-3 flex items-center justify-between",
|
|
414
|
+
children: [jsxs("div", {
|
|
415
|
+
className: "flex gap-2",
|
|
416
|
+
children: [showClear && jsx("button", {
|
|
417
|
+
type: "button",
|
|
418
|
+
className: actionClass,
|
|
419
|
+
onClick: clearSelection,
|
|
420
|
+
children: "Clear"
|
|
421
|
+
}), jsx("button", {
|
|
422
|
+
type: "button",
|
|
423
|
+
className: actionClass,
|
|
424
|
+
onClick: selectToday,
|
|
425
|
+
children: "Today"
|
|
426
|
+
})]
|
|
427
|
+
}), jsx("div", {
|
|
428
|
+
className: "text-xs text-primary-500",
|
|
429
|
+
children: draftText
|
|
430
|
+
})]
|
|
431
|
+
})]
|
|
432
|
+
})]
|
|
481
433
|
}), error ? jsx("p", {
|
|
482
434
|
id: errorId,
|
|
483
435
|
className: "mt-1 text-sm text-error-500",
|