@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.
Files changed (230) hide show
  1. package/README.md +70 -6
  2. package/ai-skills/dreamtree-ui.md +58 -15
  3. package/codemods/v2.cjs +198 -0
  4. package/dist/ai-schema.json +745 -53
  5. package/dist/charts/index.js +195 -66
  6. package/dist/components/blocks/AppShell.d.ts.map +1 -1
  7. package/dist/components/blocks/BottomActionBar.d.ts +6 -0
  8. package/dist/components/blocks/BottomActionBar.d.ts.map +1 -0
  9. package/dist/components/blocks/ConfirmDialog.d.ts.map +1 -1
  10. package/dist/components/blocks/PageHeader.d.ts.map +1 -1
  11. package/dist/components/charts/CartesianChart.d.ts.map +1 -1
  12. package/dist/components/charts/ChartFrame.d.ts.map +1 -1
  13. package/dist/components/charts/useChartLayout.d.ts +25 -0
  14. package/dist/components/charts/useChartLayout.d.ts.map +1 -0
  15. package/dist/components/core/Button.d.ts.map +1 -1
  16. package/dist/components/core/Checkbox.d.ts.map +1 -1
  17. package/dist/components/core/ColorPicker.d.ts.map +1 -1
  18. package/dist/components/core/DatePicker.d.ts.map +1 -1
  19. package/dist/components/core/DateRangePicker.d.ts.map +1 -1
  20. package/dist/components/core/Form.d.ts.map +1 -1
  21. package/dist/components/core/Input.d.ts.map +1 -1
  22. package/dist/components/core/Loader.d.ts.map +1 -1
  23. package/dist/components/core/LocationPicker.d.ts.map +1 -1
  24. package/dist/components/core/Popover.d.ts.map +1 -1
  25. package/dist/components/core/ProgressBar.d.ts.map +1 -1
  26. package/dist/components/core/Radio.d.ts.map +1 -1
  27. package/dist/components/core/Rate.d.ts.map +1 -1
  28. package/dist/components/core/RoundedTag.d.ts.map +1 -1
  29. package/dist/components/core/SearchField.d.ts +9 -0
  30. package/dist/components/core/SearchField.d.ts.map +1 -0
  31. package/dist/components/core/SegmentedControl.d.ts +8 -0
  32. package/dist/components/core/SegmentedControl.d.ts.map +1 -0
  33. package/dist/components/core/Select.d.ts.map +1 -1
  34. package/dist/components/core/Skeleton.d.ts.map +1 -1
  35. package/dist/components/core/Slider.d.ts.map +1 -1
  36. package/dist/components/core/SpeechToText.d.ts.map +1 -1
  37. package/dist/components/core/SwipeableListItem.d.ts +4 -0
  38. package/dist/components/core/SwipeableListItem.d.ts.map +1 -0
  39. package/dist/components/core/SwipeableListItemGesture.d.ts +58 -0
  40. package/dist/components/core/SwipeableListItemGesture.d.ts.map +1 -0
  41. package/dist/components/core/Switch.d.ts.map +1 -1
  42. package/dist/components/core/Table/ActionMenu.d.ts +10 -3
  43. package/dist/components/core/Table/ActionMenu.d.ts.map +1 -1
  44. package/dist/components/core/Table/MobileCard.d.ts +10 -1
  45. package/dist/components/core/Table/MobileCard.d.ts.map +1 -1
  46. package/dist/components/core/Table/MobileFilters.d.ts +8 -2
  47. package/dist/components/core/Table/MobileFilters.d.ts.map +1 -1
  48. package/dist/components/core/Table/Table.d.ts.map +1 -1
  49. package/dist/components/core/Table/TableRow.d.ts +2 -1
  50. package/dist/components/core/Table/TableRow.d.ts.map +1 -1
  51. package/dist/components/core/Tabs.d.ts +5 -8
  52. package/dist/components/core/Tabs.d.ts.map +1 -1
  53. package/dist/components/core/Textarea.d.ts.map +1 -1
  54. package/dist/components/core/ThreeDotPopover.d.ts +10 -22
  55. package/dist/components/core/ThreeDotPopover.d.ts.map +1 -1
  56. package/dist/components/core/Tooltip.d.ts +2 -1
  57. package/dist/components/core/Tooltip.d.ts.map +1 -1
  58. package/dist/components/core/internal/Calendar.d.ts +77 -0
  59. package/dist/components/core/internal/Calendar.d.ts.map +1 -0
  60. package/dist/components/core/menu/ActionMenuSurface.d.ts +42 -0
  61. package/dist/components/core/menu/ActionMenuSurface.d.ts.map +1 -0
  62. package/dist/components/core/menu/ActionSheetMenu.d.ts +17 -0
  63. package/dist/components/core/menu/ActionSheetMenu.d.ts.map +1 -0
  64. package/dist/components/core/menu/MenuPopover.d.ts +21 -0
  65. package/dist/components/core/menu/MenuPopover.d.ts.map +1 -0
  66. package/dist/components/core/menu/menuItems.d.ts +21 -0
  67. package/dist/components/core/menu/menuItems.d.ts.map +1 -0
  68. package/dist/components/core/menu/menuKeyboard.d.ts +16 -0
  69. package/dist/components/core/menu/menuKeyboard.d.ts.map +1 -0
  70. package/dist/components/feedback/ActionSheet.d.ts +4 -0
  71. package/dist/components/feedback/ActionSheet.d.ts.map +1 -0
  72. package/dist/components/feedback/Alert.d.ts.map +1 -1
  73. package/dist/components/feedback/Dialog.d.ts.map +1 -1
  74. package/dist/components/feedback/Drawer.d.ts.map +1 -1
  75. package/dist/components/feedback/Sheet.d.ts +4 -0
  76. package/dist/components/feedback/Sheet.d.ts.map +1 -0
  77. package/dist/components/feedback/Toast.d.ts +4 -3
  78. package/dist/components/feedback/Toast.d.ts.map +1 -1
  79. package/dist/components/feedback/ToastItem.d.ts +47 -0
  80. package/dist/components/feedback/ToastItem.d.ts.map +1 -0
  81. package/dist/components/feedback/ToastStack.d.ts +20 -0
  82. package/dist/components/feedback/ToastStack.d.ts.map +1 -0
  83. package/dist/components/feedback/ToastSwipe.d.ts +22 -0
  84. package/dist/components/feedback/ToastSwipe.d.ts.map +1 -0
  85. package/dist/components/feedback/Tour.d.ts.map +1 -1
  86. package/dist/components/feedback/sheetCore.d.ts +30 -0
  87. package/dist/components/feedback/sheetCore.d.ts.map +1 -0
  88. package/dist/components/navigation/Breadcrumbs.d.ts.map +1 -1
  89. package/dist/components/navigation/FootNav.d.ts.map +1 -1
  90. package/dist/components/navigation/Navbar.d.ts.map +1 -1
  91. package/dist/components/navigation/Sidebar.d.ts +6 -0
  92. package/dist/components/navigation/Sidebar.d.ts.map +1 -1
  93. package/dist/components/rich-text/RichTextEditor.d.ts.map +1 -1
  94. package/dist/components/rich-text/RichTextToolbar.d.ts +6 -2
  95. package/dist/components/rich-text/RichTextToolbar.d.ts.map +1 -1
  96. package/dist/components/utility/Avatar.d.ts +8 -0
  97. package/dist/components/utility/Avatar.d.ts.map +1 -1
  98. package/dist/components/utility/AvatarGroup.d.ts +4 -0
  99. package/dist/components/utility/AvatarGroup.d.ts.map +1 -0
  100. package/dist/components/utility/Badge.d.ts.map +1 -1
  101. package/dist/components/utility/Card.d.ts.map +1 -1
  102. package/dist/components/utility/Carousel.d.ts.map +1 -1
  103. package/dist/components/utility/FileUpload.d.ts.map +1 -1
  104. package/dist/components/utility/Pagination.d.ts.map +1 -1
  105. package/dist/components/utility/PullToRefresh.d.ts +5 -0
  106. package/dist/components/utility/PullToRefresh.d.ts.map +1 -0
  107. package/dist/components/utility/Sortable.d.ts.map +1 -1
  108. package/dist/components/utility/Stepper.d.ts.map +1 -1
  109. package/dist/esm/components/blocks/AppShell.js +97 -90
  110. package/dist/esm/components/blocks/BottomActionBar.js +132 -0
  111. package/dist/esm/components/blocks/ConfirmDialog.js +40 -4
  112. package/dist/esm/components/blocks/EmptyState.js +1 -1
  113. package/dist/esm/components/blocks/ErrorState.js +1 -1
  114. package/dist/esm/components/blocks/LoadingState.js +4 -4
  115. package/dist/esm/components/blocks/PageHeader.js +16 -3
  116. package/dist/esm/components/blocks/StatCard.js +6 -6
  117. package/dist/esm/components/blocks/StatusPill.js +5 -8
  118. package/dist/esm/components/charts/CartesianChart.js +85 -62
  119. package/dist/esm/components/charts/ChartFrame.js +12 -5
  120. package/dist/esm/components/charts/useChartLayout.js +105 -0
  121. package/dist/esm/components/core/Button.js +49 -25
  122. package/dist/esm/components/core/Checkbox.js +72 -57
  123. package/dist/esm/components/core/ColorPicker.js +31 -42
  124. package/dist/esm/components/core/DatePicker.js +117 -304
  125. package/dist/esm/components/core/DateRangePicker.js +260 -308
  126. package/dist/esm/components/core/Form.js +11 -2
  127. package/dist/esm/components/core/Input.js +100 -38
  128. package/dist/esm/components/core/Loader.js +30 -44
  129. package/dist/esm/components/core/LocationPicker.js +82 -16
  130. package/dist/esm/components/core/Popover.js +59 -48
  131. package/dist/esm/components/core/ProgressBar.js +40 -72
  132. package/dist/esm/components/core/Radio.js +10 -12
  133. package/dist/esm/components/core/Rate.js +77 -14
  134. package/dist/esm/components/core/RoundedTag.js +5 -5
  135. package/dist/esm/components/core/SearchField.js +311 -0
  136. package/dist/esm/components/core/SegmentedControl.js +189 -0
  137. package/dist/esm/components/core/Select.js +185 -190
  138. package/dist/esm/components/core/Skeleton.js +13 -14
  139. package/dist/esm/components/core/Slider.js +24 -6
  140. package/dist/esm/components/core/SpeechToText.js +68 -16
  141. package/dist/esm/components/core/SwipeableListItem.js +286 -0
  142. package/dist/esm/components/core/SwipeableListItemGesture.js +219 -0
  143. package/dist/esm/components/core/Switch.js +98 -28
  144. package/dist/esm/components/core/Table/ActionMenu.js +45 -231
  145. package/dist/esm/components/core/Table/ColumnMenu.js +1 -1
  146. package/dist/esm/components/core/Table/MobileCard.js +66 -16
  147. package/dist/esm/components/core/Table/MobileFilters.js +181 -10
  148. package/dist/esm/components/core/Table/Table.js +149 -102
  149. package/dist/esm/components/core/Table/TableRow.js +10 -2
  150. package/dist/esm/components/core/Tabs.js +186 -39
  151. package/dist/esm/components/core/Textarea.js +10 -2
  152. package/dist/esm/components/core/ThreeDotPopover.js +93 -99
  153. package/dist/esm/components/core/Tooltip.js +138 -145
  154. package/dist/esm/components/core/internal/Calendar.js +381 -0
  155. package/dist/esm/components/core/menu/ActionMenuSurface.js +110 -0
  156. package/dist/esm/components/core/menu/ActionSheetMenu.js +140 -0
  157. package/dist/esm/components/core/menu/MenuPopover.js +177 -0
  158. package/dist/esm/components/core/menu/menuItems.js +61 -0
  159. package/dist/esm/components/core/menu/menuKeyboard.js +54 -0
  160. package/dist/esm/components/feedback/ActionSheet.js +55 -0
  161. package/dist/esm/components/feedback/Alert.js +63 -53
  162. package/dist/esm/components/feedback/Dialog.js +141 -53
  163. package/dist/esm/components/feedback/Drawer.js +130 -132
  164. package/dist/esm/components/feedback/Sheet.js +125 -0
  165. package/dist/esm/components/feedback/Toast.js +21 -291
  166. package/dist/esm/components/feedback/ToastItem.js +348 -0
  167. package/dist/esm/components/feedback/ToastStack.js +130 -0
  168. package/dist/esm/components/feedback/ToastSwipe.js +52 -0
  169. package/dist/esm/components/feedback/Tour.js +107 -30
  170. package/dist/esm/components/feedback/sheetCore.js +494 -0
  171. package/dist/esm/components/navigation/Breadcrumbs.js +97 -35
  172. package/dist/esm/components/navigation/Dropdown.js +1 -1
  173. package/dist/esm/components/navigation/FootNav.js +102 -13
  174. package/dist/esm/components/navigation/Navbar.js +172 -37
  175. package/dist/esm/components/navigation/Sidebar.js +263 -111
  176. package/dist/esm/components/rich-text/RichTextEditor.js +9 -3
  177. package/dist/esm/components/rich-text/RichTextToolbar.js +29 -9
  178. package/dist/esm/components/utility/Avatar.js +14 -12
  179. package/dist/esm/components/utility/AvatarGroup.js +56 -0
  180. package/dist/esm/components/utility/Badge.js +43 -23
  181. package/dist/esm/components/utility/Card.js +32 -8
  182. package/dist/esm/components/utility/Carousel.js +139 -29
  183. package/dist/esm/components/utility/FileUpload.js +106 -31
  184. package/dist/esm/components/utility/Pagination.js +31 -13
  185. package/dist/esm/components/utility/Portal.js +31 -0
  186. package/dist/esm/components/utility/PullToRefresh.js +229 -0
  187. package/dist/esm/components/utility/Sortable.js +6 -2
  188. package/dist/esm/components/utility/Stepper.js +110 -47
  189. package/dist/esm/hooks/useFloatingPosition.js +82 -0
  190. package/dist/esm/hooks/useHaptics.js +65 -0
  191. package/dist/esm/hooks/usePresence.js +58 -0
  192. package/dist/esm/hooks/usePresentation.js +21 -0
  193. package/dist/esm/hooks/useSheetDrag.js +220 -0
  194. package/dist/esm/hooks/useSliderValues.js +8 -2
  195. package/dist/esm/hooks/useSortable.js +107 -5
  196. package/dist/esm/index.js +14 -2
  197. package/dist/esm/utils/position.js +10 -63
  198. package/dist/esm/utils/touchTarget.js +4 -1
  199. package/dist/hooks/useFloatingPosition.d.ts +8 -4
  200. package/dist/hooks/useFloatingPosition.d.ts.map +1 -1
  201. package/dist/hooks/useHaptics.d.ts +19 -0
  202. package/dist/hooks/useHaptics.d.ts.map +1 -0
  203. package/dist/hooks/useSheetDrag.d.ts +31 -0
  204. package/dist/hooks/useSheetDrag.d.ts.map +1 -0
  205. package/dist/hooks/useSliderValues.d.ts +6 -2
  206. package/dist/hooks/useSliderValues.d.ts.map +1 -1
  207. package/dist/hooks/useSortable.d.ts +11 -1
  208. package/dist/hooks/useSortable.d.ts.map +1 -1
  209. package/dist/index.css +1 -1
  210. package/dist/index.d.ts +11 -2
  211. package/dist/index.esm.css +1 -1
  212. package/dist/index.esm.js +10645 -3842
  213. package/dist/index.js +10657 -3845
  214. package/dist/rich-text/index.js +41 -11
  215. package/dist/types/blocks.d.ts +32 -2
  216. package/dist/types/blocks.d.ts.map +1 -1
  217. package/dist/types/charts.d.ts +3 -1
  218. package/dist/types/charts.d.ts.map +1 -1
  219. package/dist/types/index.d.ts +409 -26
  220. package/dist/types/index.d.ts.map +1 -1
  221. package/dist/types/rich-text.d.ts +5 -0
  222. package/dist/types/rich-text.d.ts.map +1 -1
  223. package/dist/utils/position.d.ts +0 -15
  224. package/dist/utils/position.d.ts.map +1 -1
  225. package/doc/README.md +16 -0
  226. package/mcp/catalog.snapshot.json +1540 -407
  227. package/package.json +7 -2
  228. package/dist/esm/hooks/useSwipeToClose.js +0 -66
  229. package/dist/hooks/useSwipeToClose.d.ts +0 -24
  230. 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, jsx } from 'react/jsx-runtime';
4
- import { forwardRef, useId, useMemo, useState, useRef, useEffect, useLayoutEffect } from 'react';
5
- import ReactDOM from 'react-dom';
6
- import { startOfDay, startOfMonth, startOfWeek, endOfMonth, endOfWeek, eachDayOfInterval, subMonths, format, addMonths, isSameDay, isSameMonth, isToday, parseISO, isAfter, isBefore } from 'date-fns';
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 { ChevronLeft, ChevronRight, Calendar, X } from 'lucide-react';
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 with hover-preview and space-aware popup positioning
13
- - Enforces mandatory range selection until both start and end are chosen.
14
- - Popup flips above/below and clamps horizontally to avoid clipping.
15
- - Popup won't close while only a start date is selected (Clear cancels in-progress selection).
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 normalizeDate = function normalizeDate(d) {
18
- if (!d) return null;
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
- // hover preview while picking second date
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
- hoverDate = _useState0[0],
89
- setHoverDate = _useState0[1];
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 _useState1 = useState(value),
93
- _useState10 = _slicedToArray(_useState1, 2),
94
- prevValue = _useState10[0],
95
- setPrevValue = _useState10[1];
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 _useState11 = useState({}),
105
- _useState12 = _slicedToArray(_useState11, 2),
106
- popupStyle = _useState12[0],
107
- setPopupStyle = _useState12[1];
108
- // Outside click: only close if there is NOT an in-progress single-date selection
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 (localStart && !localEnd) {
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
- }, [localStart, localEnd]);
124
- // Keyboard handling: Escape should not close when only start selected
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
- if (localStart && !localEnd) return; // ignore escape while selecting range
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, localStart, localEnd]);
138
- var min = minDate ? startOfDay(normalizeDate(minDate)) : null;
139
- var max = maxDate ? startOfDay(normalizeDate(maxDate)) : null;
140
- var isDisabled = function isDisabled(d) {
141
- var dd = startOfDay(d);
142
- if (min && isBefore(dd, min)) return true;
143
- if (max && isAfter(dd, max)) return true;
144
- return false;
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 monthStart = startOfMonth(currentMonth);
147
- var monthGridStart = startOfWeek(monthStart, {
148
- weekStartsOn: weekStartsOn
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
- }, [monthGridStart, monthGridEnd]);
160
- // Compute whether a day is considered 'in range' for highlighting.
161
- // If user has selected start and is hovering (no end yet) we preview using hoverDate.
162
- var dayInRange = function dayInRange(d) {
163
- var s = localStart ? startOfDay(localStart) : null;
164
- var e = localEnd ? startOfDay(localEnd) : null;
165
- var hover = hoverDate ? startOfDay(hoverDate) : null;
166
- if (s && e) {
167
- return isSameDay(d, s) || isSameDay(d, e) || isAfter(startOfDay(d), s) && isBefore(startOfDay(d), e);
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 (localStart && !localEnd) {
188
- if (isBefore(d, localStart)) {
189
- var newStart = d;
190
- var newEnd = localStart;
191
- setLocalStart(newStart);
192
- setLocalEnd(newEnd);
193
- // commit only when both present
194
- onChange === null || onChange === void 0 || onChange({
195
- start: newStart,
196
- end: newEnd
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
- setHoverDate(null);
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
- // Display placeholder until both start and end are selected (mandatory range)
229
- var formatDisplay = function formatDisplay() {
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(localEnd, displayFormat, {
277
+ }), " \u2014 ").concat(format(e, displayFormat, {
234
278
  locale: locale
235
279
  }));
236
280
  };
237
- var header = jsxs("div", {
238
- className: "mb-2 flex items-center justify-between",
239
- children: [jsx("button", {
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: "rounded-md p-1 hover:bg-gray-100",
242
- onClick: function onClick() {
243
- return setCurrentMonth(function (m) {
244
- return subMonths(m, 1);
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
- className: "rounded-md p-1 hover:bg-gray-100",
331
+ disabled: !localStart || !localEnd,
257
332
  onClick: function onClick() {
258
- return setCurrentMonth(function (m) {
259
- return addMonths(m, 1);
260
- });
333
+ return commit(localStart, localEnd);
261
334
  },
262
- "aria-label": "Next month",
263
- children: jsx(ChevronRight, {
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: datePickerRef,
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": !localStart || !localEnd,
362
+ "text-primary-500": !committed.start || !committed.end,
447
363
  "pr-16": showClearButton
448
364
  }, className),
449
365
  onClick: function onClick() {
450
- // Prevent closing the popup when a start is selected but end isn't — force user to finish range
451
- if (isOpen && localStart && !localEnd) return;
452
- setIsOpen(function (v) {
453
- return !v;
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: formatDisplay()
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
- }), isOpen && (portal ? /*#__PURE__*/ReactDOM.createPortal(calendarPopup, document.body) : calendarPopup)]
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",