@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
@@ -0,0 +1,220 @@
1
+ 'use client';
2
+ import { slicedToArray as _slicedToArray, objectSpread2 as _objectSpread2 } from '../_virtual/_rollupPluginBabelHelpers.js';
3
+ import { useState, useRef, useCallback, useEffect } from 'react';
4
+ import { useLatestRef } from './useLatestRef.js';
5
+
6
+ // Internal (not exported). The gesture core behind Sheet: a pointer drag along
7
+ // one axis, measured "toward dismiss" for the edge the sheet is attached to.
8
+ //
9
+ // - `dragProps` go on the grab zone (handle + header). Any drag there moves
10
+ // the sheet.
11
+ // - `bodyDragProps` go on the scrolling body. A drag there only moves the
12
+ // sheet when it heads toward dismiss and the body is already scrolled to
13
+ // that edge (Vaul-style), so it never fights the content's own scroll.
14
+ //
15
+ // The hook only reports `delta` (px toward dismiss; negative = away from the
16
+ // edge) while dragging and calls `onRelease({ delta, velocity })` when the
17
+ // pointer lifts. The caller decides what that means (rubber band, settle on a
18
+ // snap point, dismiss). The pointer is captured only once the drag passes a
19
+ // small slop, so taps and clicks on buttons inside the header still work.
20
+ var FLICK_VELOCITY = 0.5; // px per ms
21
+ var SLOP = 4; // px before a press becomes a drag
22
+ var VELOCITY_WINDOW = 100; // ms of recent samples used for release velocity
23
+ var EDGES = {
24
+ bottom: {
25
+ axis: "y",
26
+ sign: 1
27
+ },
28
+ top: {
29
+ axis: "y",
30
+ sign: -1
31
+ },
32
+ right: {
33
+ axis: "x",
34
+ sign: 1
35
+ },
36
+ left: {
37
+ axis: "x",
38
+ sign: -1
39
+ }
40
+ };
41
+ /**
42
+ * iOS-style rubber band: the further past a limit, the less the sheet follows.
43
+ * Returns a value in [0, dimension) for `distance` >= 0.
44
+ */
45
+ function rubberBand(distance, dimension) {
46
+ if (distance <= 0 || !dimension) return 0;
47
+ return (1 - 1 / (distance * 0.55 / dimension + 1)) * dimension;
48
+ }
49
+ // Is a scroll container already at the edge a dismiss drag moves away from?
50
+ function atScrollEdge(el, edge) {
51
+ if (!el) return true;
52
+ if (edge === "bottom") return el.scrollTop <= 0;
53
+ if (edge === "top") return Math.ceil(el.scrollTop + el.clientHeight) >= el.scrollHeight;
54
+ return true; // horizontal drags don't compete with vertical scroll
55
+ }
56
+ var now = function now() {
57
+ return Date.now();
58
+ };
59
+ /**
60
+ * @param {{
61
+ * edge?: 'bottom'|'top'|'left'|'right',
62
+ * enabled?: boolean,
63
+ * onRelease?: (r: { delta: number, velocity: number }) => void,
64
+ * bodyEl?: HTMLElement | null,
65
+ * }} options
66
+ * @returns {{ delta: number, dragging: boolean, dragProps: object, bodyDragProps: object }}
67
+ */
68
+ function useSheetDrag() {
69
+ var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
70
+ _ref$edge = _ref.edge,
71
+ edge = _ref$edge === void 0 ? "bottom" : _ref$edge,
72
+ _ref$enabled = _ref.enabled,
73
+ enabled = _ref$enabled === void 0 ? true : _ref$enabled,
74
+ onRelease = _ref.onRelease,
75
+ bodyEl = _ref.bodyEl;
76
+ var _ref2 = EDGES[edge] || EDGES.bottom,
77
+ axis = _ref2.axis,
78
+ sign = _ref2.sign;
79
+ var _useState = useState(0),
80
+ _useState2 = _slicedToArray(_useState, 2),
81
+ delta = _useState2[0],
82
+ setDelta = _useState2[1];
83
+ var _useState3 = useState(false),
84
+ _useState4 = _slicedToArray(_useState3, 2),
85
+ dragging = _useState4[0],
86
+ setDragging = _useState4[1];
87
+ var gesture = useRef(null);
88
+ var onReleaseRef = useLatestRef(onRelease);
89
+ var reset = useCallback(function () {
90
+ gesture.current = null;
91
+ setDragging(false);
92
+ setDelta(0);
93
+ }, []);
94
+ var start = useCallback(function (e, fromBody) {
95
+ if (e.button !== undefined && e.button !== 0) return;
96
+ var t = now();
97
+ gesture.current = {
98
+ x: e.clientX,
99
+ y: e.clientY,
100
+ fromBody: fromBody,
101
+ active: false,
102
+ el: e.currentTarget,
103
+ pointerId: e.pointerId,
104
+ samples: [{
105
+ d: 0,
106
+ t: t
107
+ }]
108
+ };
109
+ }, []);
110
+ var move = useCallback(function (e) {
111
+ var g = gesture.current;
112
+ if (!g) return;
113
+ var dx = e.clientX - g.x;
114
+ var dy = e.clientY - g.y;
115
+ var d = sign * (axis === "y" ? dy : dx);
116
+ if (!g.active) {
117
+ var cross = axis === "y" ? dx : dy;
118
+ if (Math.max(Math.abs(d), Math.abs(cross)) < SLOP) return;
119
+ if (g.fromBody && (d <= 0 || Math.abs(d) < Math.abs(cross) || !atScrollEdge(g.el, edge))) {
120
+ gesture.current = null; // let the body scroll
121
+ return;
122
+ }
123
+ g.active = true;
124
+ setDragging(true);
125
+ try {
126
+ var _g$el, _g$el$setPointerCaptu;
127
+ (_g$el = g.el) === null || _g$el === void 0 || (_g$el$setPointerCaptu = _g$el.setPointerCapture) === null || _g$el$setPointerCaptu === void 0 || _g$el$setPointerCaptu.call(_g$el, g.pointerId);
128
+ } catch (_unused) {
129
+ // The pointer may already be gone (synthetic events, fast lifts).
130
+ }
131
+ }
132
+ var t = now();
133
+ g.samples.push({
134
+ d: d,
135
+ t: t
136
+ });
137
+ while (g.samples.length > 2 && t - g.samples[0].t > VELOCITY_WINDOW) g.samples.shift();
138
+ setDelta(d);
139
+ }, [axis, sign, edge]);
140
+ var end = useCallback(function (e) {
141
+ var _onReleaseRef$current;
142
+ var g = gesture.current;
143
+ if (!g) return;
144
+ if (!g.active) {
145
+ gesture.current = null;
146
+ return;
147
+ }
148
+ var d = sign * (axis === "y" ? e.clientY - g.y : e.clientX - g.x);
149
+ var t = now();
150
+ var first = g.samples[0];
151
+ var velocity = (d - first.d) / Math.max(1, t - first.t);
152
+ reset();
153
+ (_onReleaseRef$current = onReleaseRef.current) === null || _onReleaseRef$current === void 0 || _onReleaseRef$current.call(onReleaseRef, {
154
+ delta: d,
155
+ velocity: velocity
156
+ });
157
+ }, [axis, sign, reset, onReleaseRef]);
158
+ // iOS/Android start a native pan on the body before pointer events can
159
+ // claim it. While the body sits at its scroll edge, cancel touchmoves that
160
+ // head toward dismiss so the pointer drag above keeps receiving events.
161
+ useEffect(function () {
162
+ var el = bodyEl;
163
+ if (!enabled || !el || typeof el.addEventListener !== "function") return undefined;
164
+ var startPos = null;
165
+ var onStart = function onStart(e) {
166
+ var _e$touches;
167
+ var p = (_e$touches = e.touches) === null || _e$touches === void 0 ? void 0 : _e$touches[0];
168
+ startPos = p ? {
169
+ x: p.clientX,
170
+ y: p.clientY
171
+ } : null;
172
+ };
173
+ var onMove = function onMove(e) {
174
+ var _e$touches2, _gesture$current;
175
+ var p = (_e$touches2 = e.touches) === null || _e$touches2 === void 0 ? void 0 : _e$touches2[0];
176
+ if (!startPos || !p) return;
177
+ var d = sign * (axis === "y" ? p.clientY - startPos.y : p.clientX - startPos.x);
178
+ if (d > 0 && atScrollEdge(el, edge) || (_gesture$current = gesture.current) !== null && _gesture$current !== void 0 && _gesture$current.active) {
179
+ if (e.cancelable) e.preventDefault();
180
+ }
181
+ };
182
+ el.addEventListener("touchstart", onStart, {
183
+ passive: true
184
+ });
185
+ el.addEventListener("touchmove", onMove, {
186
+ passive: false
187
+ });
188
+ return function () {
189
+ el.removeEventListener("touchstart", onStart);
190
+ el.removeEventListener("touchmove", onMove);
191
+ };
192
+ }, [enabled, bodyEl, axis, sign, edge]);
193
+ if (!enabled) return {
194
+ delta: 0,
195
+ dragging: false,
196
+ dragProps: {},
197
+ bodyDragProps: {}
198
+ };
199
+ var common = {
200
+ onPointerMove: move,
201
+ onPointerUp: end,
202
+ onPointerCancel: reset
203
+ };
204
+ return {
205
+ delta: delta,
206
+ dragging: dragging,
207
+ dragProps: _objectSpread2(_objectSpread2({}, common), {}, {
208
+ onPointerDown: function onPointerDown(e) {
209
+ return start(e, false);
210
+ }
211
+ }),
212
+ bodyDragProps: _objectSpread2(_objectSpread2({}, common), {}, {
213
+ onPointerDown: function onPointerDown(e) {
214
+ return start(e, true);
215
+ }
216
+ })
217
+ };
218
+ }
219
+
220
+ export { FLICK_VELOCITY, rubberBand, useSheetDrag };
package/dist/esm/index.js CHANGED
@@ -4,9 +4,13 @@ export { default as Select } from './components/core/Select.js';
4
4
  export { default as Table } from './components/core/Table/Table.js';
5
5
  import 'react/jsx-runtime';
6
6
  import 'react';
7
- import 'react-dom';
8
7
  export { cn } from './utils/cn.js';
8
+ import 'react-dom';
9
+ import '@floating-ui/react-dom';
10
+ import './components/core/menu/ActionSheetMenu.js';
9
11
  import 'lucide-react';
12
+ export { default as SwipeableListItem } from './components/core/SwipeableListItem.js';
13
+ export { default as Sheet } from './components/feedback/Sheet.js';
10
14
  import './components/core/Table/constants.js';
11
15
  export { default as Form } from './components/core/Form.js';
12
16
  export { default as Accordion } from './components/core/Accordion.js';
@@ -31,14 +35,17 @@ export { default as TextToSpeech } from './components/core/TextToSpeech.js';
31
35
  export { default as Textarea } from './components/core/Textarea.js';
32
36
  export { default as Slider } from './components/core/Slider.js';
33
37
  export { default as Popover } from './components/core/Popover.js';
38
+ export { default as SegmentedControl } from './components/core/SegmentedControl.js';
39
+ export { default as SearchField } from './components/core/SearchField.js';
34
40
  export { default as Sidebar } from './components/navigation/Sidebar.js';
35
41
  export { Navbar } from './components/navigation/Navbar.js';
36
42
  export { default as FootNav } from './components/navigation/FootNav.js';
37
43
  export { default as Breadcrumbs } from './components/navigation/Breadcrumbs.js';
38
44
  export { default as Dialog } from './components/feedback/Dialog.js';
39
- export { Toast, ToastContainer, ToastProvider, useToast } from './components/feedback/Toast.js';
45
+ export { ToastContainer, ToastProvider, useToast } from './components/feedback/Toast.js';
40
46
  export { default as Alert } from './components/feedback/Alert.js';
41
47
  export { default as Drawer } from './components/feedback/Drawer.js';
48
+ export { default as ActionSheet } from './components/feedback/ActionSheet.js';
42
49
  export { default as Tour } from './components/feedback/Tour.js';
43
50
  export { default as Badge } from './components/utility/Badge.js';
44
51
  export { default as Avatar } from './components/utility/Avatar.js';
@@ -50,6 +57,7 @@ export { default as FileUpload } from './components/utility/FileUpload.js';
50
57
  export { Condition } from './components/utility/Condition.js';
51
58
  export { Carousel } from './components/utility/Carousel.js';
52
59
  export { default as Sortable } from './components/utility/Sortable.js';
60
+ export { default as PullToRefresh } from './components/utility/PullToRefresh.js';
53
61
  export { default as AppShell } from './components/blocks/AppShell.js';
54
62
  export { default as PageHeader } from './components/blocks/PageHeader.js';
55
63
  export { default as StatCard } from './components/blocks/StatCard.js';
@@ -58,9 +66,12 @@ export { default as EmptyState } from './components/blocks/EmptyState.js';
58
66
  export { default as ErrorState } from './components/blocks/ErrorState.js';
59
67
  export { default as LoadingState } from './components/blocks/LoadingState.js';
60
68
  export { default as ConfirmDialog } from './components/blocks/ConfirmDialog.js';
69
+ export { default as BottomActionBar } from './components/blocks/BottomActionBar.js';
61
70
  export { ThemeProvider, useTheme } from './hooks/useTheme.js';
62
71
  export { useMixins } from './hooks/useMixins.js';
63
72
  export { useApi } from './hooks/useApi.js';
73
+ export { useHaptics } from './hooks/useHaptics.js';
64
74
  export { StoreProvider } from './store/index.js';
65
75
  export { Helpers } from './utils/helpers.js';
66
76
  export { EmitterClass as Emitter } from './utils/emitter.js';
77
+ export { default as Toast } from './components/feedback/ToastItem.js';
@@ -1,14 +1,16 @@
1
1
  import { slicedToArray as _slicedToArray } from '../_virtual/_rollupPluginBabelHelpers.js';
2
2
 
3
3
  /**
4
- * @deprecated Use `useFloatingPosition` (src/hooks/useFloatingPosition.js,
5
- * built on @floating-ui/react-dom) for new overlays. This module stays until
6
- * Popover and Tour migrate; `prefersReducedMotion` / `revealElement` remain
7
- * in use elsewhere.
4
+ * Internal (not exported from `src/index.js`). Small DOM helpers shared by
5
+ * overlays: `setRefs`, `revealElement`, `prefersReducedMotion` and
6
+ * `parsePlacement` stay in use.
7
+ *
8
+ * Positioning is no longer done here: every anchored overlay (Popover, Select,
9
+ * DatePicker, DateRangePicker, Tooltip, Tour, the menu primitives) uses
10
+ * `useFloatingPosition` (src/hooks/useFloatingPosition.js, built on
11
+ * @floating-ui/react-dom). The old `computePosition` helper was removed in
12
+ * 2.0.0 (DTUI-65).
8
13
  */
9
- // Internal (not exported). Viewport-space positioning shared by Popover and Tour.
10
- // All rects are getBoundingClientRect() values, so the result is for
11
- // `position: fixed`.
12
14
  var OPPOSITE = {
13
15
  top: "bottom",
14
16
  bottom: "top",
@@ -28,61 +30,6 @@ function parsePlacement() {
28
30
  align: align
29
31
  };
30
32
  }
31
- function roomOn(side, anchor, viewport) {
32
- if (side === "top") return anchor.top;
33
- if (side === "bottom") return viewport.height - anchor.bottom;
34
- if (side === "left") return anchor.left;
35
- return viewport.width - anchor.right;
36
- }
37
- function chooseSide(side, anchor, size, offset, viewport) {
38
- var needed = (side === "top" || side === "bottom" ? size.height : size.width) + offset;
39
- if (roomOn(side, anchor, viewport) >= needed) return side;
40
- var flipped = OPPOSITE[side];
41
- return roomOn(flipped, anchor, viewport) > roomOn(side, anchor, viewport) ? flipped : side;
42
- }
43
- function alignAxis(align, start, length, size) {
44
- if (align === "start") return start;
45
- if (align === "end") return start + length - size;
46
- return start + length / 2 - size / 2;
47
- }
48
- var clamp = function clamp(value, min, max) {
49
- return Math.max(min, Math.min(value, Math.max(min, max)));
50
- };
51
- /**
52
- * Places a floating box of `size` next to `anchor`. Flips to the opposite side
53
- * when the requested side lacks room, then clamps into the viewport.
54
- * Returns `{ top, left, side }`.
55
- */
56
- function computePosition(anchor, size, _ref) {
57
- var placement = _ref.placement,
58
- _ref$offset = _ref.offset,
59
- offset = _ref$offset === void 0 ? 8 : _ref$offset,
60
- _ref$padding = _ref.padding,
61
- padding = _ref$padding === void 0 ? 8 : _ref$padding,
62
- viewport = _ref.viewport;
63
- var vp = viewport || {
64
- width: window.innerWidth,
65
- height: window.innerHeight
66
- };
67
- var _parsePlacement = parsePlacement(placement),
68
- wanted = _parsePlacement.side,
69
- align = _parsePlacement.align;
70
- var side = chooseSide(wanted, anchor, size, offset, vp);
71
- var top;
72
- var left;
73
- if (side === "top" || side === "bottom") {
74
- top = side === "top" ? anchor.top - size.height - offset : anchor.bottom + offset;
75
- left = alignAxis(align, anchor.left, anchor.width, size.width);
76
- } else {
77
- left = side === "left" ? anchor.left - size.width - offset : anchor.right + offset;
78
- top = alignAxis(align, anchor.top, anchor.height, size.height);
79
- }
80
- return {
81
- top: Math.round(clamp(top, padding, vp.height - size.height - padding)),
82
- left: Math.round(clamp(left, padding, vp.width - size.width - padding)),
83
- side: side
84
- };
85
- }
86
33
  /** `true` when the user asked the OS for reduced motion. */
87
34
  function prefersReducedMotion() {
88
35
  if (typeof window === "undefined" || typeof window.matchMedia !== "function") return false;
@@ -137,4 +84,4 @@ function setRefs(node) {
137
84
  });
138
85
  }
139
86
 
140
- export { computePosition, parsePlacement, prefersReducedMotion, revealElement, setRefs };
87
+ export { parsePlacement, prefersReducedMotion, revealElement, setRefs };
@@ -6,19 +6,23 @@
6
6
  * @param {number} [options.offset=4] - gap in px between reference and floating.
7
7
  * @param {boolean} [options.flip=true] - flip to the opposite side when out of room.
8
8
  * @param {boolean} [options.shift=true] - slide along the axis to stay in view (8px padding).
9
- * @param {boolean} [options.matchWidth=false] - set the floating element's
10
- * min-width to the reference's width (listboxes, comboboxes).
9
+ * @param {boolean|'exact'} [options.matchWidth=false] - `true` sets the floating
10
+ * element's min-width to the reference's width (listboxes, comboboxes);
11
+ * `'exact'` sets its width too.
12
+ * @param {number} [options.maxHeight] - px cap on the floating element's
13
+ * height; it also shrinks to the space left on its side (min 80px).
11
14
  * @param {'fixed'|'absolute'} [options.strategy='fixed']
12
15
  * @param {boolean} [options.open] - while false, auto-updates are paused.
13
16
  * @returns {{ refs: { setReference: Function, setFloating: Function, reference: object, floating: object },
14
17
  * floatingStyles: object, placement: string, isPositioned: boolean, update: () => void }}
15
18
  */
16
- export function useFloatingPosition({ placement, offset, flip, shift, matchWidth, strategy, open, }?: {
19
+ export function useFloatingPosition({ placement, offset, flip, shift, matchWidth, maxHeight, strategy, open, }?: {
17
20
  placement?: import("@floating-ui/utils").Placement | undefined;
18
21
  offset?: number | undefined;
19
22
  flip?: boolean | undefined;
20
23
  shift?: boolean | undefined;
21
- matchWidth?: boolean | undefined;
24
+ matchWidth?: boolean | "exact" | undefined;
25
+ maxHeight?: number | undefined;
22
26
  strategy?: "fixed" | "absolute" | undefined;
23
27
  open?: boolean | undefined;
24
28
  }): {
@@ -1 +1 @@
1
- {"version":3,"file":"useFloatingPosition.d.ts","sourceRoot":"","sources":["../../src/hooks/useFloatingPosition.js"],"names":[],"mappings":"AAeA;;;;;;;;;;;;;;GAcG;AACH,sGAXG;IAA6D,SAAS;IAC7C,MAAM;IACL,IAAI;IACJ,KAAK;IACL,UAAU;IAEC,QAAQ;IACnB,IAAI;CAC9B,GAAU;IAAE,IAAI,EAAE;QAAE,YAAY,WAAW;QAAC,WAAW,WAAW;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACvG,cAAc,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,IAAI,CAAA;CAAE,CAuC1F"}
1
+ {"version":3,"file":"useFloatingPosition.d.ts","sourceRoot":"","sources":["../../src/hooks/useFloatingPosition.js"],"names":[],"mappings":"AAgBA;;;;;;;;;;;;;;;;;GAiBG;AACH,iHAdG;IAA6D,SAAS;IAC7C,MAAM;IACL,IAAI;IACJ,KAAK;IACG,UAAU;IAGnB,SAAS;IAEG,QAAQ;IACnB,IAAI;CAC9B,GAAU;IAAE,IAAI,EAAE;QAAE,YAAY,WAAW;QAAC,WAAW,WAAW;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACvG,cAAc,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,IAAI,CAAA;CAAE,CA+C1F"}
@@ -0,0 +1,19 @@
1
+ import type { HapticPatternName, UseHapticsOptions, UseHapticsReturn } from "../types";
2
+ /**
3
+ * Named vibration patterns (milliseconds; arrays alternate vibrate / pause).
4
+ * Kept short: haptics confirm an action, they never carry information alone.
5
+ */
6
+ export declare const HAPTIC_PATTERNS: Readonly<Record<HapticPatternName, number | number[]>>;
7
+ /**
8
+ * Thin, opt-in wrapper around `navigator.vibrate` with named patterns.
9
+ *
10
+ * `trigger` is a no-op (returns `false`) when the Vibration API is missing
11
+ * (iOS Safari, desktop Safari, the server), when the user asks for reduced
12
+ * motion, when `enabled` is `false`, or for an unknown pattern name.
13
+ *
14
+ * @param options - `enabled` (default `true`) gates every trigger.
15
+ * @returns `{ trigger, supported, reducedMotion }`.
16
+ */
17
+ export declare function useHaptics({ enabled }?: UseHapticsOptions): UseHapticsReturn;
18
+ export default useHaptics;
19
+ //# sourceMappingURL=useHaptics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useHaptics.d.ts","sourceRoot":"","sources":["../../src/hooks/useHaptics.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAiB,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEtG;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAKjF,CAAC;AAgBH;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,EAAE,OAAc,EAAE,GAAE,iBAAsB,GAAG,gBAAgB,CAoBvF;AAED,eAAe,UAAU,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * iOS-style rubber band: the further past a limit, the less the sheet follows.
3
+ * Returns a value in [0, dimension) for `distance` >= 0.
4
+ */
5
+ export function rubberBand(distance: any, dimension: any): number;
6
+ /**
7
+ * @param {{
8
+ * edge?: 'bottom'|'top'|'left'|'right',
9
+ * enabled?: boolean,
10
+ * onRelease?: (r: { delta: number, velocity: number }) => void,
11
+ * bodyEl?: HTMLElement | null,
12
+ * }} options
13
+ * @returns {{ delta: number, dragging: boolean, dragProps: object, bodyDragProps: object }}
14
+ */
15
+ export function useSheetDrag({ edge, enabled, onRelease, bodyEl }?: {
16
+ edge?: "bottom" | "top" | "left" | "right";
17
+ enabled?: boolean;
18
+ onRelease?: (r: {
19
+ delta: number;
20
+ velocity: number;
21
+ }) => void;
22
+ bodyEl?: HTMLElement | null;
23
+ }): {
24
+ delta: number;
25
+ dragging: boolean;
26
+ dragProps: object;
27
+ bodyDragProps: object;
28
+ };
29
+ export const FLICK_VELOCITY: 0.5;
30
+ export default useSheetDrag;
31
+ //# sourceMappingURL=useSheetDrag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSheetDrag.d.ts","sourceRoot":"","sources":["../../src/hooks/useSheetDrag.js"],"names":[],"mappings":"AA6BA;;;GAGG;AACH,kEAGC;AAYD;;;;;;;;GAQG;AACH,oEARW;IACN,IAAI,CAAC,EAAE,QAAQ,GAAC,KAAK,GAAC,MAAM,GAAC,OAAO,CAAC;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC7D,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CAC7B,GACS;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAoH1F;AAzJD,6BAA8B,GAAG,CAAC"}