@dreamtree-org/twreact-ui 1.3.11 → 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 (164) hide show
  1. package/README.md +40 -6
  2. package/ai-skills/dreamtree-ui.md +47 -9
  3. package/codemods/v2.cjs +198 -0
  4. package/dist/ai-schema.json +609 -33
  5. package/dist/components/blocks/AppShell.d.ts.map +1 -1
  6. package/dist/components/blocks/BottomActionBar.d.ts +6 -0
  7. package/dist/components/blocks/BottomActionBar.d.ts.map +1 -0
  8. package/dist/components/blocks/ConfirmDialog.d.ts.map +1 -1
  9. package/dist/components/blocks/PageHeader.d.ts.map +1 -1
  10. package/dist/components/core/Checkbox.d.ts.map +1 -1
  11. package/dist/components/core/DatePicker.d.ts.map +1 -1
  12. package/dist/components/core/DateRangePicker.d.ts.map +1 -1
  13. package/dist/components/core/Form.d.ts.map +1 -1
  14. package/dist/components/core/Input.d.ts.map +1 -1
  15. package/dist/components/core/Popover.d.ts.map +1 -1
  16. package/dist/components/core/ProgressBar.d.ts.map +1 -1
  17. package/dist/components/core/Rate.d.ts.map +1 -1
  18. package/dist/components/core/SearchField.d.ts +9 -0
  19. package/dist/components/core/SearchField.d.ts.map +1 -0
  20. package/dist/components/core/SegmentedControl.d.ts +8 -0
  21. package/dist/components/core/SegmentedControl.d.ts.map +1 -0
  22. package/dist/components/core/Select.d.ts.map +1 -1
  23. package/dist/components/core/SwipeableListItem.d.ts +4 -0
  24. package/dist/components/core/SwipeableListItem.d.ts.map +1 -0
  25. package/dist/components/core/SwipeableListItemGesture.d.ts +58 -0
  26. package/dist/components/core/SwipeableListItemGesture.d.ts.map +1 -0
  27. package/dist/components/core/Switch.d.ts.map +1 -1
  28. package/dist/components/core/Table/ActionMenu.d.ts +10 -3
  29. package/dist/components/core/Table/ActionMenu.d.ts.map +1 -1
  30. package/dist/components/core/Table/MobileCard.d.ts +10 -1
  31. package/dist/components/core/Table/MobileCard.d.ts.map +1 -1
  32. package/dist/components/core/Table/MobileFilters.d.ts +8 -2
  33. package/dist/components/core/Table/MobileFilters.d.ts.map +1 -1
  34. package/dist/components/core/Table/Table.d.ts.map +1 -1
  35. package/dist/components/core/Table/TableRow.d.ts +2 -1
  36. package/dist/components/core/Table/TableRow.d.ts.map +1 -1
  37. package/dist/components/core/Tabs.d.ts +3 -3
  38. package/dist/components/core/Tabs.d.ts.map +1 -1
  39. package/dist/components/core/ThreeDotPopover.d.ts +10 -22
  40. package/dist/components/core/ThreeDotPopover.d.ts.map +1 -1
  41. package/dist/components/core/Tooltip.d.ts +2 -1
  42. package/dist/components/core/Tooltip.d.ts.map +1 -1
  43. package/dist/components/core/internal/Calendar.d.ts +77 -0
  44. package/dist/components/core/internal/Calendar.d.ts.map +1 -0
  45. package/dist/components/core/menu/ActionMenuSurface.d.ts +42 -0
  46. package/dist/components/core/menu/ActionMenuSurface.d.ts.map +1 -0
  47. package/dist/components/core/menu/ActionSheetMenu.d.ts +17 -0
  48. package/dist/components/core/menu/ActionSheetMenu.d.ts.map +1 -0
  49. package/dist/components/core/menu/MenuPopover.d.ts +21 -0
  50. package/dist/components/core/menu/MenuPopover.d.ts.map +1 -0
  51. package/dist/components/core/menu/menuItems.d.ts +21 -0
  52. package/dist/components/core/menu/menuItems.d.ts.map +1 -0
  53. package/dist/components/core/menu/menuKeyboard.d.ts +16 -0
  54. package/dist/components/core/menu/menuKeyboard.d.ts.map +1 -0
  55. package/dist/components/feedback/ActionSheet.d.ts +4 -0
  56. package/dist/components/feedback/ActionSheet.d.ts.map +1 -0
  57. package/dist/components/feedback/Alert.d.ts.map +1 -1
  58. package/dist/components/feedback/Dialog.d.ts.map +1 -1
  59. package/dist/components/feedback/Drawer.d.ts.map +1 -1
  60. package/dist/components/feedback/Sheet.d.ts +4 -0
  61. package/dist/components/feedback/Sheet.d.ts.map +1 -0
  62. package/dist/components/feedback/Toast.d.ts +4 -3
  63. package/dist/components/feedback/Toast.d.ts.map +1 -1
  64. package/dist/components/feedback/ToastItem.d.ts +47 -0
  65. package/dist/components/feedback/ToastItem.d.ts.map +1 -0
  66. package/dist/components/feedback/ToastStack.d.ts +20 -0
  67. package/dist/components/feedback/ToastStack.d.ts.map +1 -0
  68. package/dist/components/feedback/ToastSwipe.d.ts +22 -0
  69. package/dist/components/feedback/ToastSwipe.d.ts.map +1 -0
  70. package/dist/components/feedback/Tour.d.ts.map +1 -1
  71. package/dist/components/feedback/sheetCore.d.ts +30 -0
  72. package/dist/components/feedback/sheetCore.d.ts.map +1 -0
  73. package/dist/components/navigation/Navbar.d.ts.map +1 -1
  74. package/dist/components/navigation/Sidebar.d.ts +6 -0
  75. package/dist/components/navigation/Sidebar.d.ts.map +1 -1
  76. package/dist/components/rich-text/RichTextEditor.d.ts.map +1 -1
  77. package/dist/components/rich-text/RichTextToolbar.d.ts +6 -2
  78. package/dist/components/rich-text/RichTextToolbar.d.ts.map +1 -1
  79. package/dist/components/utility/PullToRefresh.d.ts +5 -0
  80. package/dist/components/utility/PullToRefresh.d.ts.map +1 -0
  81. package/dist/esm/components/blocks/AppShell.js +97 -90
  82. package/dist/esm/components/blocks/BottomActionBar.js +132 -0
  83. package/dist/esm/components/blocks/ConfirmDialog.js +40 -4
  84. package/dist/esm/components/blocks/PageHeader.js +16 -3
  85. package/dist/esm/components/core/Checkbox.js +13 -24
  86. package/dist/esm/components/core/DatePicker.js +117 -304
  87. package/dist/esm/components/core/DateRangePicker.js +260 -308
  88. package/dist/esm/components/core/Form.js +11 -2
  89. package/dist/esm/components/core/Input.js +13 -18
  90. package/dist/esm/components/core/Popover.js +59 -48
  91. package/dist/esm/components/core/ProgressBar.js +36 -64
  92. package/dist/esm/components/core/Rate.js +5 -10
  93. package/dist/esm/components/core/SearchField.js +311 -0
  94. package/dist/esm/components/core/SegmentedControl.js +189 -0
  95. package/dist/esm/components/core/Select.js +185 -190
  96. package/dist/esm/components/core/SwipeableListItem.js +286 -0
  97. package/dist/esm/components/core/SwipeableListItemGesture.js +219 -0
  98. package/dist/esm/components/core/Switch.js +11 -13
  99. package/dist/esm/components/core/Table/ActionMenu.js +45 -231
  100. package/dist/esm/components/core/Table/ColumnMenu.js +1 -1
  101. package/dist/esm/components/core/Table/MobileCard.js +66 -16
  102. package/dist/esm/components/core/Table/MobileFilters.js +181 -10
  103. package/dist/esm/components/core/Table/Table.js +149 -102
  104. package/dist/esm/components/core/Table/TableRow.js +10 -2
  105. package/dist/esm/components/core/Tabs.js +7 -7
  106. package/dist/esm/components/core/ThreeDotPopover.js +93 -99
  107. package/dist/esm/components/core/Tooltip.js +138 -145
  108. package/dist/esm/components/core/internal/Calendar.js +381 -0
  109. package/dist/esm/components/core/menu/ActionMenuSurface.js +110 -0
  110. package/dist/esm/components/core/menu/ActionSheetMenu.js +140 -0
  111. package/dist/esm/components/core/menu/MenuPopover.js +177 -0
  112. package/dist/esm/components/core/menu/menuItems.js +61 -0
  113. package/dist/esm/components/core/menu/menuKeyboard.js +54 -0
  114. package/dist/esm/components/feedback/ActionSheet.js +55 -0
  115. package/dist/esm/components/feedback/Alert.js +63 -53
  116. package/dist/esm/components/feedback/Dialog.js +141 -53
  117. package/dist/esm/components/feedback/Drawer.js +130 -132
  118. package/dist/esm/components/feedback/Sheet.js +125 -0
  119. package/dist/esm/components/feedback/Toast.js +21 -291
  120. package/dist/esm/components/feedback/ToastItem.js +348 -0
  121. package/dist/esm/components/feedback/ToastStack.js +130 -0
  122. package/dist/esm/components/feedback/ToastSwipe.js +52 -0
  123. package/dist/esm/components/feedback/Tour.js +107 -30
  124. package/dist/esm/components/feedback/sheetCore.js +494 -0
  125. package/dist/esm/components/navigation/Dropdown.js +1 -1
  126. package/dist/esm/components/navigation/Navbar.js +172 -37
  127. package/dist/esm/components/navigation/Sidebar.js +263 -111
  128. package/dist/esm/components/rich-text/RichTextEditor.js +9 -3
  129. package/dist/esm/components/rich-text/RichTextToolbar.js +29 -9
  130. package/dist/esm/components/utility/Portal.js +31 -0
  131. package/dist/esm/components/utility/PullToRefresh.js +229 -0
  132. package/dist/esm/hooks/useFloatingPosition.js +82 -0
  133. package/dist/esm/hooks/useHaptics.js +65 -0
  134. package/dist/esm/hooks/usePresence.js +58 -0
  135. package/dist/esm/hooks/usePresentation.js +21 -0
  136. package/dist/esm/hooks/useSheetDrag.js +220 -0
  137. package/dist/esm/index.js +13 -2
  138. package/dist/esm/utils/position.js +10 -63
  139. package/dist/hooks/useFloatingPosition.d.ts +8 -4
  140. package/dist/hooks/useFloatingPosition.d.ts.map +1 -1
  141. package/dist/hooks/useHaptics.d.ts +19 -0
  142. package/dist/hooks/useHaptics.d.ts.map +1 -0
  143. package/dist/hooks/useSheetDrag.d.ts +31 -0
  144. package/dist/hooks/useSheetDrag.d.ts.map +1 -0
  145. package/dist/index.css +1 -1
  146. package/dist/index.d.ts +9 -1
  147. package/dist/index.esm.css +1 -1
  148. package/dist/index.esm.js +8851 -3198
  149. package/dist/index.js +8856 -3195
  150. package/dist/rich-text/index.js +41 -11
  151. package/dist/types/blocks.d.ts +32 -2
  152. package/dist/types/blocks.d.ts.map +1 -1
  153. package/dist/types/index.d.ts +353 -19
  154. package/dist/types/index.d.ts.map +1 -1
  155. package/dist/types/rich-text.d.ts +5 -0
  156. package/dist/types/rich-text.d.ts.map +1 -1
  157. package/dist/utils/position.d.ts +0 -15
  158. package/dist/utils/position.d.ts.map +1 -1
  159. package/doc/README.md +15 -0
  160. package/mcp/catalog.snapshot.json +1398 -464
  161. package/package.json +7 -2
  162. package/dist/esm/hooks/useSwipeToClose.js +0 -66
  163. package/dist/hooks/useSwipeToClose.d.ts +0 -24
  164. package/dist/hooks/useSwipeToClose.d.ts.map +0 -1
@@ -6,14 +6,23 @@ import { createPortal } from 'react-dom';
6
6
  import { X } from 'lucide-react';
7
7
  import Button from '../core/Button.js';
8
8
  import { cn } from '../../utils/cn.js';
9
- import { computePosition, setRefs } from '../../utils/position.js';
9
+ import { setRefs, parsePlacement } from '../../utils/position.js';
10
+ import { TOUCH_TARGET } from '../../utils/touchTarget.js';
10
11
  import { useFocusTrap } from '../../hooks/useFocusTrap.js';
11
12
  import { useScrollLock } from '../../hooks/useScrollLock.js';
12
13
  import { useTourTarget } from '../../hooks/useTourTarget.js';
14
+ import { useFloatingPosition } from '../../hooks/useFloatingPosition.js';
15
+ import { usePresentation } from '../../hooks/usePresentation.js';
13
16
  import TourSpotlight from './TourSpotlight.js';
14
17
 
15
- var _excluded = ["open", "steps", "onClose", "onFinish", "step", "defaultStep", "onStepChange", "labels", "targetTimeout", "spotlightPadding", "className"];
18
+ var _excluded = ["open", "steps", "onClose", "onFinish", "step", "defaultStep", "onStepChange", "labels", "targetTimeout", "spotlightPadding", "presentation", "className", "style", "onPointerDown", "onPointerUp", "onPointerCancel", "onClickCapture"];
16
19
  var useIsomorphicLayoutEffect = typeof window !== "undefined" ? useLayoutEffect : useEffect;
20
+ // Docked (phone) card: a horizontal swipe at least this long (px), and clearly
21
+ // more horizontal than vertical, goes to the next / previous step.
22
+ var SWIPE_DISTANCE = 50;
23
+ var SWIPE_RATIO = 1.5;
24
+ // The click a swipe may produce arrives right after pointerup.
25
+ var SWIPE_CLICK_MS = 400;
17
26
  var DEFAULT_LABELS = {
18
27
  next: "Next",
19
28
  back: "Back",
@@ -24,6 +33,17 @@ var DEFAULT_LABELS = {
24
33
  return "Step ".concat(current, " of ").concat(total);
25
34
  }
26
35
  };
36
+ // Tour placements ("top", "bottom-start", …) as floating-ui placements.
37
+ var toFloatingPlacement = function toFloatingPlacement(placement) {
38
+ var _parsePlacement = parsePlacement(placement || "bottom"),
39
+ side = _parsePlacement.side,
40
+ align = _parsePlacement.align;
41
+ return align === "start" || align === "end" ? "".concat(side, "-").concat(align) : side;
42
+ };
43
+ var isTextEntry = function isTextEntry(el) {
44
+ var _el$closest;
45
+ return !!(el !== null && el !== void 0 && (_el$closest = el.closest) !== null && _el$closest !== void 0 && _el$closest.call(el, "input, textarea, select, [contenteditable='true']"));
46
+ };
27
47
  var Tour = /*#__PURE__*/forwardRef(function (_ref, _ref2) {
28
48
  var _ref$open = _ref.open,
29
49
  open = _ref$open === void 0 ? false : _ref$open,
@@ -40,11 +60,25 @@ var Tour = /*#__PURE__*/forwardRef(function (_ref, _ref2) {
40
60
  targetTimeout = _ref$targetTimeout === void 0 ? 3000 : _ref$targetTimeout,
41
61
  _ref$spotlightPadding = _ref.spotlightPadding,
42
62
  spotlightPadding = _ref$spotlightPadding === void 0 ? 6 : _ref$spotlightPadding,
63
+ _ref$presentation = _ref.presentation,
64
+ presentation = _ref$presentation === void 0 ? "auto" : _ref$presentation,
43
65
  className = _ref.className,
66
+ style = _ref.style,
67
+ _onPointerDown = _ref.onPointerDown,
68
+ _onPointerUp = _ref.onPointerUp,
69
+ _onPointerCancel = _ref.onPointerCancel,
70
+ _onClickCapture = _ref.onClickCapture,
44
71
  rest = _objectWithoutProperties(_ref, _excluded);
45
72
  var cardRef = useRef(null);
73
+ var swipeRef = useRef({
74
+ x: 0,
75
+ y: 0,
76
+ tracking: false,
77
+ swipedAt: -Infinity
78
+ });
46
79
  var baseId = useId();
47
80
  var text = _objectSpread2(_objectSpread2({}, DEFAULT_LABELS), labels);
81
+ var docked = usePresentation(presentation) === "sheet";
48
82
  // Each opening is a new session: the uncontrolled step restarts and stale
49
83
  // target measurements from the previous run are ignored.
50
84
  var _useState = useState({
@@ -74,6 +108,25 @@ var Tour = /*#__PURE__*/forwardRef(function (_ref, _ref2) {
74
108
  }),
75
109
  rect = _useTourTarget.rect,
76
110
  ready = _useTourTarget.ready;
111
+ var anchored = Boolean(rect) && !docked;
112
+ var _useFloatingPosition = useFloatingPosition({
113
+ placement: toFloatingPlacement(current === null || current === void 0 ? void 0 : current.placement),
114
+ offset: spotlightPadding + 10,
115
+ open: active && anchored
116
+ }),
117
+ refs = _useFloatingPosition.refs,
118
+ floatingStyles = _useFloatingPosition.floatingStyles;
119
+ var setReference = refs.setReference,
120
+ setFloating = refs.setFloating;
121
+ // The target's measured box is the (virtual) reference; useTourTarget
122
+ // re-measures it on scroll/resize.
123
+ useIsomorphicLayoutEffect(function () {
124
+ setReference(anchored ? {
125
+ getBoundingClientRect: function getBoundingClientRect() {
126
+ return rect;
127
+ }
128
+ } : null);
129
+ }, [anchored, rect, setReference]);
77
130
  var goTo = function goTo(next) {
78
131
  if (next < 0 || next >= total || next === index) return;
79
132
  if (stepProp === undefined) setSession(function (s) {
@@ -99,44 +152,66 @@ var Tour = /*#__PURE__*/forwardRef(function (_ref, _ref2) {
99
152
  return close("escape");
100
153
  }
101
154
  });
102
- useIsomorphicLayoutEffect(function () {
103
- var card = cardRef.current;
104
- if (!card) return;
105
- if (!rect) {
106
- card.style.top = "";
107
- card.style.left = "";
108
- return;
109
- }
110
- var size = {
111
- width: card.offsetWidth,
112
- height: card.offsetHeight
113
- };
114
- var pos = computePosition(rect, size, {
115
- placement: (current === null || current === void 0 ? void 0 : current.placement) || "bottom",
116
- offset: spotlightPadding + 10
117
- });
118
- card.style.top = "".concat(pos.top, "px");
119
- card.style.left = "".concat(pos.left, "px");
120
- }, [rect, ready, index, current === null || current === void 0 ? void 0 : current.placement, spotlightPadding]);
121
155
  if (!active || typeof document === "undefined") return null;
122
156
  var isFirst = index === 0;
123
157
  var isLast = index === total - 1;
124
158
  var titleId = "tour-title-".concat(baseId);
125
159
  var bodyId = "tour-body-".concat(baseId);
126
160
  var handleKeyDown = function handleKeyDown(e) {
127
- var _e$target$closest, _e$target;
128
- if ((_e$target$closest = (_e$target = e.target).closest) !== null && _e$target$closest !== void 0 && _e$target$closest.call(_e$target, "input, textarea, select, [contenteditable='true']")) return;
161
+ if (isTextEntry(e.target)) return;
129
162
  if (e.key === "ArrowRight") goTo(index + 1);else if (e.key === "ArrowLeft") goTo(index - 1);
130
163
  };
164
+ // Swipe on the docked card: left = next, right = back.
165
+ var swipeHandlers = docked ? {
166
+ onPointerDown: function onPointerDown(e) {
167
+ _onPointerDown === null || _onPointerDown === void 0 || _onPointerDown(e);
168
+ var swipe = swipeRef.current;
169
+ swipe.swipedAt = -Infinity;
170
+ swipe.tracking = e.isPrimary !== false && !isTextEntry(e.target);
171
+ swipe.x = e.clientX;
172
+ swipe.y = e.clientY;
173
+ },
174
+ onPointerUp: function onPointerUp(e) {
175
+ _onPointerUp === null || _onPointerUp === void 0 || _onPointerUp(e);
176
+ var swipe = swipeRef.current;
177
+ if (!swipe.tracking) return;
178
+ swipe.tracking = false;
179
+ var dx = e.clientX - swipe.x;
180
+ var dy = e.clientY - swipe.y;
181
+ if (Math.abs(dx) < SWIPE_DISTANCE || Math.abs(dx) < Math.abs(dy) * SWIPE_RATIO) return;
182
+ swipe.swipedAt = Date.now();
183
+ goTo(dx < 0 ? index + 1 : index - 1);
184
+ },
185
+ onPointerCancel: function onPointerCancel(e) {
186
+ _onPointerCancel === null || _onPointerCancel === void 0 || _onPointerCancel(e);
187
+ swipeRef.current.tracking = false;
188
+ },
189
+ // A swipe that ends on a button must not also press it.
190
+ onClickCapture: function onClickCapture(e) {
191
+ _onClickCapture === null || _onClickCapture === void 0 || _onClickCapture(e);
192
+ var swipe = swipeRef.current;
193
+ if (Date.now() - swipe.swipedAt > SWIPE_CLICK_MS) return;
194
+ swipe.swipedAt = -Infinity;
195
+ e.preventDefault();
196
+ e.stopPropagation();
197
+ }
198
+ } : {
199
+ onPointerDown: _onPointerDown,
200
+ onPointerUp: _onPointerUp,
201
+ onPointerCancel: _onPointerCancel,
202
+ onClickCapture: _onClickCapture
203
+ };
204
+ var placementAttr = "center";
205
+ if (docked) placementAttr = "docked";else if (rect) placementAttr = current.placement || "bottom";
131
206
  return /*#__PURE__*/createPortal(jsxs("div", {
132
- className: "fixed inset-0 z-50",
207
+ className: "fixed inset-0 z-modal",
133
208
  "data-testid": "tour-overlay",
134
209
  children: [jsx(TourSpotlight, {
135
210
  rect: ready ? rect : null,
136
211
  padding: spotlightPadding
137
- }), jsxs("div", _objectSpread2(_objectSpread2({
212
+ }), jsxs("div", _objectSpread2(_objectSpread2(_objectSpread2({
138
213
  ref: function ref(node) {
139
- return setRefs(node, cardRef, _ref2);
214
+ return setRefs(node, cardRef, _ref2, setFloating);
140
215
  },
141
216
  role: "dialog",
142
217
  "aria-modal": "true",
@@ -144,9 +219,11 @@ var Tour = /*#__PURE__*/forwardRef(function (_ref, _ref2) {
144
219
  "aria-describedby": current.content ? bodyId : undefined,
145
220
  tabIndex: -1,
146
221
  onKeyDown: handleKeyDown,
147
- "data-placement": rect ? current.placement || "bottom" : "center",
148
- className: cn("fixed w-[min(22rem,calc(100vw-2rem))] max-h-[calc(100vh-2rem)] overflow-y-auto rounded-lg border border-gray-200 bg-white text-gray-900 shadow-xl focus:outline-none", "dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100", "transition-opacity duration-200 motion-reduce:transition-none", !rect && "left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2", ready ? "opacity-100" : "pointer-events-none opacity-0", className)
149
- }, rest), {}, {
222
+ "data-placement": placementAttr,
223
+ "data-presentation": docked ? "sheet" : "popover",
224
+ className: cn("fixed overflow-y-auto overscroll-contain rounded-lg border border-gray-200 bg-white text-gray-900 shadow-xl focus:outline-none", "dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100", "transition-opacity duration-200 motion-reduce:transition-none", docked ? "inset-x-4 bottom-4 max-h-[60dvh] pb-safe touch-pan-y" : "w-[min(22rem,calc(100vw-2rem))] max-h-[calc(100dvh-2rem)]", !docked && !rect && "left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2", ready ? "opacity-100" : "pointer-events-none opacity-0", className),
225
+ style: anchored ? _objectSpread2(_objectSpread2({}, floatingStyles), style) : style
226
+ }, swipeHandlers), rest), {}, {
150
227
  children: [jsxs("div", {
151
228
  className: "flex items-start justify-between gap-3 px-4 pt-4",
152
229
  children: [jsxs("div", {
@@ -165,7 +242,7 @@ var Tour = /*#__PURE__*/forwardRef(function (_ref, _ref2) {
165
242
  return close("close");
166
243
  },
167
244
  "aria-label": text.close,
168
- className: "rounded-md p-1 text-gray-500 hover:bg-gray-100 hover:text-gray-700 focus:outline-none focus:ring-2 focus:ring-primary-500 dark:text-gray-400 dark:hover:bg-gray-800",
245
+ className: cn("-mr-1 -mt-1 inline-flex shrink-0 items-center justify-center rounded-md p-1 text-gray-500 hover:bg-gray-100 hover:text-gray-700 focus:outline-none focus:ring-2 focus:ring-primary-500 dark:text-gray-400 dark:hover:bg-gray-800", TOUCH_TARGET),
169
246
  children: jsx(X, {
170
247
  className: "h-4 w-4",
171
248
  "aria-hidden": "true"