@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.
- package/README.md +40 -6
- package/ai-skills/dreamtree-ui.md +47 -9
- package/codemods/v2.cjs +198 -0
- package/dist/ai-schema.json +609 -33
- package/dist/components/blocks/AppShell.d.ts.map +1 -1
- package/dist/components/blocks/BottomActionBar.d.ts +6 -0
- package/dist/components/blocks/BottomActionBar.d.ts.map +1 -0
- package/dist/components/blocks/ConfirmDialog.d.ts.map +1 -1
- package/dist/components/blocks/PageHeader.d.ts.map +1 -1
- package/dist/components/core/Checkbox.d.ts.map +1 -1
- package/dist/components/core/DatePicker.d.ts.map +1 -1
- package/dist/components/core/DateRangePicker.d.ts.map +1 -1
- package/dist/components/core/Form.d.ts.map +1 -1
- package/dist/components/core/Input.d.ts.map +1 -1
- package/dist/components/core/Popover.d.ts.map +1 -1
- package/dist/components/core/ProgressBar.d.ts.map +1 -1
- package/dist/components/core/Rate.d.ts.map +1 -1
- package/dist/components/core/SearchField.d.ts +9 -0
- package/dist/components/core/SearchField.d.ts.map +1 -0
- package/dist/components/core/SegmentedControl.d.ts +8 -0
- package/dist/components/core/SegmentedControl.d.ts.map +1 -0
- package/dist/components/core/Select.d.ts.map +1 -1
- package/dist/components/core/SwipeableListItem.d.ts +4 -0
- package/dist/components/core/SwipeableListItem.d.ts.map +1 -0
- package/dist/components/core/SwipeableListItemGesture.d.ts +58 -0
- package/dist/components/core/SwipeableListItemGesture.d.ts.map +1 -0
- package/dist/components/core/Switch.d.ts.map +1 -1
- package/dist/components/core/Table/ActionMenu.d.ts +10 -3
- package/dist/components/core/Table/ActionMenu.d.ts.map +1 -1
- package/dist/components/core/Table/MobileCard.d.ts +10 -1
- package/dist/components/core/Table/MobileCard.d.ts.map +1 -1
- package/dist/components/core/Table/MobileFilters.d.ts +8 -2
- package/dist/components/core/Table/MobileFilters.d.ts.map +1 -1
- package/dist/components/core/Table/Table.d.ts.map +1 -1
- package/dist/components/core/Table/TableRow.d.ts +2 -1
- package/dist/components/core/Table/TableRow.d.ts.map +1 -1
- package/dist/components/core/Tabs.d.ts +3 -3
- package/dist/components/core/Tabs.d.ts.map +1 -1
- package/dist/components/core/ThreeDotPopover.d.ts +10 -22
- package/dist/components/core/ThreeDotPopover.d.ts.map +1 -1
- package/dist/components/core/Tooltip.d.ts +2 -1
- package/dist/components/core/Tooltip.d.ts.map +1 -1
- package/dist/components/core/internal/Calendar.d.ts +77 -0
- package/dist/components/core/internal/Calendar.d.ts.map +1 -0
- package/dist/components/core/menu/ActionMenuSurface.d.ts +42 -0
- package/dist/components/core/menu/ActionMenuSurface.d.ts.map +1 -0
- package/dist/components/core/menu/ActionSheetMenu.d.ts +17 -0
- package/dist/components/core/menu/ActionSheetMenu.d.ts.map +1 -0
- package/dist/components/core/menu/MenuPopover.d.ts +21 -0
- package/dist/components/core/menu/MenuPopover.d.ts.map +1 -0
- package/dist/components/core/menu/menuItems.d.ts +21 -0
- package/dist/components/core/menu/menuItems.d.ts.map +1 -0
- package/dist/components/core/menu/menuKeyboard.d.ts +16 -0
- package/dist/components/core/menu/menuKeyboard.d.ts.map +1 -0
- package/dist/components/feedback/ActionSheet.d.ts +4 -0
- package/dist/components/feedback/ActionSheet.d.ts.map +1 -0
- package/dist/components/feedback/Alert.d.ts.map +1 -1
- package/dist/components/feedback/Dialog.d.ts.map +1 -1
- package/dist/components/feedback/Drawer.d.ts.map +1 -1
- package/dist/components/feedback/Sheet.d.ts +4 -0
- package/dist/components/feedback/Sheet.d.ts.map +1 -0
- package/dist/components/feedback/Toast.d.ts +4 -3
- package/dist/components/feedback/Toast.d.ts.map +1 -1
- package/dist/components/feedback/ToastItem.d.ts +47 -0
- package/dist/components/feedback/ToastItem.d.ts.map +1 -0
- package/dist/components/feedback/ToastStack.d.ts +20 -0
- package/dist/components/feedback/ToastStack.d.ts.map +1 -0
- package/dist/components/feedback/ToastSwipe.d.ts +22 -0
- package/dist/components/feedback/ToastSwipe.d.ts.map +1 -0
- package/dist/components/feedback/Tour.d.ts.map +1 -1
- package/dist/components/feedback/sheetCore.d.ts +30 -0
- package/dist/components/feedback/sheetCore.d.ts.map +1 -0
- package/dist/components/navigation/Navbar.d.ts.map +1 -1
- package/dist/components/navigation/Sidebar.d.ts +6 -0
- package/dist/components/navigation/Sidebar.d.ts.map +1 -1
- package/dist/components/rich-text/RichTextEditor.d.ts.map +1 -1
- package/dist/components/rich-text/RichTextToolbar.d.ts +6 -2
- package/dist/components/rich-text/RichTextToolbar.d.ts.map +1 -1
- package/dist/components/utility/PullToRefresh.d.ts +5 -0
- package/dist/components/utility/PullToRefresh.d.ts.map +1 -0
- package/dist/esm/components/blocks/AppShell.js +97 -90
- package/dist/esm/components/blocks/BottomActionBar.js +132 -0
- package/dist/esm/components/blocks/ConfirmDialog.js +40 -4
- package/dist/esm/components/blocks/PageHeader.js +16 -3
- package/dist/esm/components/core/Checkbox.js +13 -24
- package/dist/esm/components/core/DatePicker.js +117 -304
- package/dist/esm/components/core/DateRangePicker.js +260 -308
- package/dist/esm/components/core/Form.js +11 -2
- package/dist/esm/components/core/Input.js +13 -18
- package/dist/esm/components/core/Popover.js +59 -48
- package/dist/esm/components/core/ProgressBar.js +36 -64
- package/dist/esm/components/core/Rate.js +5 -10
- package/dist/esm/components/core/SearchField.js +311 -0
- package/dist/esm/components/core/SegmentedControl.js +189 -0
- package/dist/esm/components/core/Select.js +185 -190
- package/dist/esm/components/core/SwipeableListItem.js +286 -0
- package/dist/esm/components/core/SwipeableListItemGesture.js +219 -0
- package/dist/esm/components/core/Switch.js +11 -13
- package/dist/esm/components/core/Table/ActionMenu.js +45 -231
- package/dist/esm/components/core/Table/ColumnMenu.js +1 -1
- package/dist/esm/components/core/Table/MobileCard.js +66 -16
- package/dist/esm/components/core/Table/MobileFilters.js +181 -10
- package/dist/esm/components/core/Table/Table.js +149 -102
- package/dist/esm/components/core/Table/TableRow.js +10 -2
- package/dist/esm/components/core/Tabs.js +7 -7
- package/dist/esm/components/core/ThreeDotPopover.js +93 -99
- package/dist/esm/components/core/Tooltip.js +138 -145
- package/dist/esm/components/core/internal/Calendar.js +381 -0
- package/dist/esm/components/core/menu/ActionMenuSurface.js +110 -0
- package/dist/esm/components/core/menu/ActionSheetMenu.js +140 -0
- package/dist/esm/components/core/menu/MenuPopover.js +177 -0
- package/dist/esm/components/core/menu/menuItems.js +61 -0
- package/dist/esm/components/core/menu/menuKeyboard.js +54 -0
- package/dist/esm/components/feedback/ActionSheet.js +55 -0
- package/dist/esm/components/feedback/Alert.js +63 -53
- package/dist/esm/components/feedback/Dialog.js +141 -53
- package/dist/esm/components/feedback/Drawer.js +130 -132
- package/dist/esm/components/feedback/Sheet.js +125 -0
- package/dist/esm/components/feedback/Toast.js +21 -291
- package/dist/esm/components/feedback/ToastItem.js +348 -0
- package/dist/esm/components/feedback/ToastStack.js +130 -0
- package/dist/esm/components/feedback/ToastSwipe.js +52 -0
- package/dist/esm/components/feedback/Tour.js +107 -30
- package/dist/esm/components/feedback/sheetCore.js +494 -0
- package/dist/esm/components/navigation/Dropdown.js +1 -1
- package/dist/esm/components/navigation/Navbar.js +172 -37
- package/dist/esm/components/navigation/Sidebar.js +263 -111
- package/dist/esm/components/rich-text/RichTextEditor.js +9 -3
- package/dist/esm/components/rich-text/RichTextToolbar.js +29 -9
- package/dist/esm/components/utility/Portal.js +31 -0
- package/dist/esm/components/utility/PullToRefresh.js +229 -0
- package/dist/esm/hooks/useFloatingPosition.js +82 -0
- package/dist/esm/hooks/useHaptics.js +65 -0
- package/dist/esm/hooks/usePresence.js +58 -0
- package/dist/esm/hooks/usePresentation.js +21 -0
- package/dist/esm/hooks/useSheetDrag.js +220 -0
- package/dist/esm/index.js +13 -2
- package/dist/esm/utils/position.js +10 -63
- package/dist/hooks/useFloatingPosition.d.ts +8 -4
- package/dist/hooks/useFloatingPosition.d.ts.map +1 -1
- package/dist/hooks/useHaptics.d.ts +19 -0
- package/dist/hooks/useHaptics.d.ts.map +1 -0
- package/dist/hooks/useSheetDrag.d.ts +31 -0
- package/dist/hooks/useSheetDrag.d.ts.map +1 -0
- package/dist/index.css +1 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.esm.css +1 -1
- package/dist/index.esm.js +8851 -3198
- package/dist/index.js +8856 -3195
- package/dist/rich-text/index.js +41 -11
- package/dist/types/blocks.d.ts +32 -2
- package/dist/types/blocks.d.ts.map +1 -1
- package/dist/types/index.d.ts +353 -19
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/rich-text.d.ts +5 -0
- package/dist/types/rich-text.d.ts.map +1 -1
- package/dist/utils/position.d.ts +0 -15
- package/dist/utils/position.d.ts.map +1 -1
- package/doc/README.md +15 -0
- package/mcp/catalog.snapshot.json +1398 -464
- package/package.json +7 -2
- package/dist/esm/hooks/useSwipeToClose.js +0 -66
- package/dist/hooks/useSwipeToClose.d.ts +0 -24
- package/dist/hooks/useSwipeToClose.d.ts.map +0 -1
|
@@ -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 {
|
|
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
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
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 {
|
|
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] -
|
|
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":"
|
|
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"}
|