@dreamtree-org/twreact-ui 1.3.10 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +70 -6
- package/ai-skills/dreamtree-ui.md +58 -15
- package/codemods/v2.cjs +198 -0
- package/dist/ai-schema.json +745 -53
- package/dist/charts/index.js +195 -66
- package/dist/components/blocks/AppShell.d.ts.map +1 -1
- package/dist/components/blocks/BottomActionBar.d.ts +6 -0
- package/dist/components/blocks/BottomActionBar.d.ts.map +1 -0
- package/dist/components/blocks/ConfirmDialog.d.ts.map +1 -1
- package/dist/components/blocks/PageHeader.d.ts.map +1 -1
- package/dist/components/charts/CartesianChart.d.ts.map +1 -1
- package/dist/components/charts/ChartFrame.d.ts.map +1 -1
- package/dist/components/charts/useChartLayout.d.ts +25 -0
- package/dist/components/charts/useChartLayout.d.ts.map +1 -0
- package/dist/components/core/Button.d.ts.map +1 -1
- package/dist/components/core/Checkbox.d.ts.map +1 -1
- package/dist/components/core/ColorPicker.d.ts.map +1 -1
- package/dist/components/core/DatePicker.d.ts.map +1 -1
- package/dist/components/core/DateRangePicker.d.ts.map +1 -1
- package/dist/components/core/Form.d.ts.map +1 -1
- package/dist/components/core/Input.d.ts.map +1 -1
- package/dist/components/core/Loader.d.ts.map +1 -1
- package/dist/components/core/LocationPicker.d.ts.map +1 -1
- package/dist/components/core/Popover.d.ts.map +1 -1
- package/dist/components/core/ProgressBar.d.ts.map +1 -1
- package/dist/components/core/Radio.d.ts.map +1 -1
- package/dist/components/core/Rate.d.ts.map +1 -1
- package/dist/components/core/RoundedTag.d.ts.map +1 -1
- package/dist/components/core/SearchField.d.ts +9 -0
- package/dist/components/core/SearchField.d.ts.map +1 -0
- package/dist/components/core/SegmentedControl.d.ts +8 -0
- package/dist/components/core/SegmentedControl.d.ts.map +1 -0
- package/dist/components/core/Select.d.ts.map +1 -1
- package/dist/components/core/Skeleton.d.ts.map +1 -1
- package/dist/components/core/Slider.d.ts.map +1 -1
- package/dist/components/core/SpeechToText.d.ts.map +1 -1
- package/dist/components/core/SwipeableListItem.d.ts +4 -0
- package/dist/components/core/SwipeableListItem.d.ts.map +1 -0
- package/dist/components/core/SwipeableListItemGesture.d.ts +58 -0
- package/dist/components/core/SwipeableListItemGesture.d.ts.map +1 -0
- package/dist/components/core/Switch.d.ts.map +1 -1
- package/dist/components/core/Table/ActionMenu.d.ts +10 -3
- package/dist/components/core/Table/ActionMenu.d.ts.map +1 -1
- package/dist/components/core/Table/MobileCard.d.ts +10 -1
- package/dist/components/core/Table/MobileCard.d.ts.map +1 -1
- package/dist/components/core/Table/MobileFilters.d.ts +8 -2
- package/dist/components/core/Table/MobileFilters.d.ts.map +1 -1
- package/dist/components/core/Table/Table.d.ts.map +1 -1
- package/dist/components/core/Table/TableRow.d.ts +2 -1
- package/dist/components/core/Table/TableRow.d.ts.map +1 -1
- package/dist/components/core/Tabs.d.ts +5 -8
- package/dist/components/core/Tabs.d.ts.map +1 -1
- package/dist/components/core/Textarea.d.ts.map +1 -1
- package/dist/components/core/ThreeDotPopover.d.ts +10 -22
- package/dist/components/core/ThreeDotPopover.d.ts.map +1 -1
- package/dist/components/core/Tooltip.d.ts +2 -1
- package/dist/components/core/Tooltip.d.ts.map +1 -1
- package/dist/components/core/internal/Calendar.d.ts +77 -0
- package/dist/components/core/internal/Calendar.d.ts.map +1 -0
- package/dist/components/core/menu/ActionMenuSurface.d.ts +42 -0
- package/dist/components/core/menu/ActionMenuSurface.d.ts.map +1 -0
- package/dist/components/core/menu/ActionSheetMenu.d.ts +17 -0
- package/dist/components/core/menu/ActionSheetMenu.d.ts.map +1 -0
- package/dist/components/core/menu/MenuPopover.d.ts +21 -0
- package/dist/components/core/menu/MenuPopover.d.ts.map +1 -0
- package/dist/components/core/menu/menuItems.d.ts +21 -0
- package/dist/components/core/menu/menuItems.d.ts.map +1 -0
- package/dist/components/core/menu/menuKeyboard.d.ts +16 -0
- package/dist/components/core/menu/menuKeyboard.d.ts.map +1 -0
- package/dist/components/feedback/ActionSheet.d.ts +4 -0
- package/dist/components/feedback/ActionSheet.d.ts.map +1 -0
- package/dist/components/feedback/Alert.d.ts.map +1 -1
- package/dist/components/feedback/Dialog.d.ts.map +1 -1
- package/dist/components/feedback/Drawer.d.ts.map +1 -1
- package/dist/components/feedback/Sheet.d.ts +4 -0
- package/dist/components/feedback/Sheet.d.ts.map +1 -0
- package/dist/components/feedback/Toast.d.ts +4 -3
- package/dist/components/feedback/Toast.d.ts.map +1 -1
- package/dist/components/feedback/ToastItem.d.ts +47 -0
- package/dist/components/feedback/ToastItem.d.ts.map +1 -0
- package/dist/components/feedback/ToastStack.d.ts +20 -0
- package/dist/components/feedback/ToastStack.d.ts.map +1 -0
- package/dist/components/feedback/ToastSwipe.d.ts +22 -0
- package/dist/components/feedback/ToastSwipe.d.ts.map +1 -0
- package/dist/components/feedback/Tour.d.ts.map +1 -1
- package/dist/components/feedback/sheetCore.d.ts +30 -0
- package/dist/components/feedback/sheetCore.d.ts.map +1 -0
- package/dist/components/navigation/Breadcrumbs.d.ts.map +1 -1
- package/dist/components/navigation/FootNav.d.ts.map +1 -1
- package/dist/components/navigation/Navbar.d.ts.map +1 -1
- package/dist/components/navigation/Sidebar.d.ts +6 -0
- package/dist/components/navigation/Sidebar.d.ts.map +1 -1
- package/dist/components/rich-text/RichTextEditor.d.ts.map +1 -1
- package/dist/components/rich-text/RichTextToolbar.d.ts +6 -2
- package/dist/components/rich-text/RichTextToolbar.d.ts.map +1 -1
- package/dist/components/utility/Avatar.d.ts +8 -0
- package/dist/components/utility/Avatar.d.ts.map +1 -1
- package/dist/components/utility/AvatarGroup.d.ts +4 -0
- package/dist/components/utility/AvatarGroup.d.ts.map +1 -0
- package/dist/components/utility/Badge.d.ts.map +1 -1
- package/dist/components/utility/Card.d.ts.map +1 -1
- package/dist/components/utility/Carousel.d.ts.map +1 -1
- package/dist/components/utility/FileUpload.d.ts.map +1 -1
- package/dist/components/utility/Pagination.d.ts.map +1 -1
- package/dist/components/utility/PullToRefresh.d.ts +5 -0
- package/dist/components/utility/PullToRefresh.d.ts.map +1 -0
- package/dist/components/utility/Sortable.d.ts.map +1 -1
- package/dist/components/utility/Stepper.d.ts.map +1 -1
- package/dist/esm/components/blocks/AppShell.js +97 -90
- package/dist/esm/components/blocks/BottomActionBar.js +132 -0
- package/dist/esm/components/blocks/ConfirmDialog.js +40 -4
- package/dist/esm/components/blocks/EmptyState.js +1 -1
- package/dist/esm/components/blocks/ErrorState.js +1 -1
- package/dist/esm/components/blocks/LoadingState.js +4 -4
- package/dist/esm/components/blocks/PageHeader.js +16 -3
- package/dist/esm/components/blocks/StatCard.js +6 -6
- package/dist/esm/components/blocks/StatusPill.js +5 -8
- package/dist/esm/components/charts/CartesianChart.js +85 -62
- package/dist/esm/components/charts/ChartFrame.js +12 -5
- package/dist/esm/components/charts/useChartLayout.js +105 -0
- package/dist/esm/components/core/Button.js +49 -25
- package/dist/esm/components/core/Checkbox.js +72 -57
- package/dist/esm/components/core/ColorPicker.js +31 -42
- package/dist/esm/components/core/DatePicker.js +117 -304
- package/dist/esm/components/core/DateRangePicker.js +260 -308
- package/dist/esm/components/core/Form.js +11 -2
- package/dist/esm/components/core/Input.js +100 -38
- package/dist/esm/components/core/Loader.js +30 -44
- package/dist/esm/components/core/LocationPicker.js +82 -16
- package/dist/esm/components/core/Popover.js +59 -48
- package/dist/esm/components/core/ProgressBar.js +40 -72
- package/dist/esm/components/core/Radio.js +10 -12
- package/dist/esm/components/core/Rate.js +77 -14
- package/dist/esm/components/core/RoundedTag.js +5 -5
- package/dist/esm/components/core/SearchField.js +311 -0
- package/dist/esm/components/core/SegmentedControl.js +189 -0
- package/dist/esm/components/core/Select.js +185 -190
- package/dist/esm/components/core/Skeleton.js +13 -14
- package/dist/esm/components/core/Slider.js +24 -6
- package/dist/esm/components/core/SpeechToText.js +68 -16
- package/dist/esm/components/core/SwipeableListItem.js +286 -0
- package/dist/esm/components/core/SwipeableListItemGesture.js +219 -0
- package/dist/esm/components/core/Switch.js +98 -28
- package/dist/esm/components/core/Table/ActionMenu.js +45 -231
- package/dist/esm/components/core/Table/ColumnMenu.js +1 -1
- package/dist/esm/components/core/Table/MobileCard.js +66 -16
- package/dist/esm/components/core/Table/MobileFilters.js +181 -10
- package/dist/esm/components/core/Table/Table.js +149 -102
- package/dist/esm/components/core/Table/TableRow.js +10 -2
- package/dist/esm/components/core/Tabs.js +186 -39
- package/dist/esm/components/core/Textarea.js +10 -2
- package/dist/esm/components/core/ThreeDotPopover.js +93 -99
- package/dist/esm/components/core/Tooltip.js +138 -145
- package/dist/esm/components/core/internal/Calendar.js +381 -0
- package/dist/esm/components/core/menu/ActionMenuSurface.js +110 -0
- package/dist/esm/components/core/menu/ActionSheetMenu.js +140 -0
- package/dist/esm/components/core/menu/MenuPopover.js +177 -0
- package/dist/esm/components/core/menu/menuItems.js +61 -0
- package/dist/esm/components/core/menu/menuKeyboard.js +54 -0
- package/dist/esm/components/feedback/ActionSheet.js +55 -0
- package/dist/esm/components/feedback/Alert.js +63 -53
- package/dist/esm/components/feedback/Dialog.js +141 -53
- package/dist/esm/components/feedback/Drawer.js +130 -132
- package/dist/esm/components/feedback/Sheet.js +125 -0
- package/dist/esm/components/feedback/Toast.js +21 -291
- package/dist/esm/components/feedback/ToastItem.js +348 -0
- package/dist/esm/components/feedback/ToastStack.js +130 -0
- package/dist/esm/components/feedback/ToastSwipe.js +52 -0
- package/dist/esm/components/feedback/Tour.js +107 -30
- package/dist/esm/components/feedback/sheetCore.js +494 -0
- package/dist/esm/components/navigation/Breadcrumbs.js +97 -35
- package/dist/esm/components/navigation/Dropdown.js +1 -1
- package/dist/esm/components/navigation/FootNav.js +102 -13
- package/dist/esm/components/navigation/Navbar.js +172 -37
- package/dist/esm/components/navigation/Sidebar.js +263 -111
- package/dist/esm/components/rich-text/RichTextEditor.js +9 -3
- package/dist/esm/components/rich-text/RichTextToolbar.js +29 -9
- package/dist/esm/components/utility/Avatar.js +14 -12
- package/dist/esm/components/utility/AvatarGroup.js +56 -0
- package/dist/esm/components/utility/Badge.js +43 -23
- package/dist/esm/components/utility/Card.js +32 -8
- package/dist/esm/components/utility/Carousel.js +139 -29
- package/dist/esm/components/utility/FileUpload.js +106 -31
- package/dist/esm/components/utility/Pagination.js +31 -13
- package/dist/esm/components/utility/Portal.js +31 -0
- package/dist/esm/components/utility/PullToRefresh.js +229 -0
- package/dist/esm/components/utility/Sortable.js +6 -2
- package/dist/esm/components/utility/Stepper.js +110 -47
- package/dist/esm/hooks/useFloatingPosition.js +82 -0
- package/dist/esm/hooks/useHaptics.js +65 -0
- package/dist/esm/hooks/usePresence.js +58 -0
- package/dist/esm/hooks/usePresentation.js +21 -0
- package/dist/esm/hooks/useSheetDrag.js +220 -0
- package/dist/esm/hooks/useSliderValues.js +8 -2
- package/dist/esm/hooks/useSortable.js +107 -5
- package/dist/esm/index.js +14 -2
- package/dist/esm/utils/position.js +10 -63
- package/dist/esm/utils/touchTarget.js +4 -1
- package/dist/hooks/useFloatingPosition.d.ts +8 -4
- package/dist/hooks/useFloatingPosition.d.ts.map +1 -1
- package/dist/hooks/useHaptics.d.ts +19 -0
- package/dist/hooks/useHaptics.d.ts.map +1 -0
- package/dist/hooks/useSheetDrag.d.ts +31 -0
- package/dist/hooks/useSheetDrag.d.ts.map +1 -0
- package/dist/hooks/useSliderValues.d.ts +6 -2
- package/dist/hooks/useSliderValues.d.ts.map +1 -1
- package/dist/hooks/useSortable.d.ts +11 -1
- package/dist/hooks/useSortable.d.ts.map +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.ts +11 -2
- package/dist/index.esm.css +1 -1
- package/dist/index.esm.js +10645 -3842
- package/dist/index.js +10657 -3845
- package/dist/rich-text/index.js +41 -11
- package/dist/types/blocks.d.ts +32 -2
- package/dist/types/blocks.d.ts.map +1 -1
- package/dist/types/charts.d.ts +3 -1
- package/dist/types/charts.d.ts.map +1 -1
- package/dist/types/index.d.ts +409 -26
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/rich-text.d.ts +5 -0
- package/dist/types/rich-text.d.ts.map +1 -1
- package/dist/utils/position.d.ts +0 -15
- package/dist/utils/position.d.ts.map +1 -1
- package/doc/README.md +16 -0
- package/mcp/catalog.snapshot.json +1540 -407
- package/package.json +7 -2
- package/dist/esm/hooks/useSwipeToClose.js +0 -66
- package/dist/hooks/useSwipeToClose.d.ts +0 -24
- package/dist/hooks/useSwipeToClose.d.ts.map +0 -1
|
@@ -1,11 +1,17 @@
|
|
|
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';
|
|
3
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
4
4
|
import React, { useState, useRef, useCallback } from 'react';
|
|
5
5
|
import { cn } from '../../utils/cn.js';
|
|
6
|
-
import { Upload, X, Image, FileText, File } from 'lucide-react';
|
|
6
|
+
import { Upload, Camera, X, Image, FileText, File } from 'lucide-react';
|
|
7
|
+
import { useMediaQuery } from '../../hooks/useMediaQuery.js';
|
|
8
|
+
import { PRESS_FEEDBACK, TOUCH_TARGET } from '../../utils/touchTarget.js';
|
|
7
9
|
|
|
8
|
-
var _excluded = ["accept", "multiple", "maxSize", "onFileSelect", "onFileRemove", "files", "disabled", "className"];
|
|
10
|
+
var _excluded = ["accept", "multiple", "maxSize", "onFileSelect", "onFileRemove", "files", "disabled", "capture", "className"];
|
|
11
|
+
var COARSE_POINTER_QUERY = '(pointer: coarse)';
|
|
12
|
+
// PRESS_FEEDBACK sets transition-transform; this keeps the colour transition as well.
|
|
13
|
+
var TRANSITION_WITH_PRESS = 'transition-[color,background-color,border-color,transform]';
|
|
14
|
+
var PICK_BUTTON_CLASSES = 'inline-flex min-h-11 items-center justify-center gap-2 rounded-control border border-line bg-surface px-4 text-sm font-medium text-foreground shadow-xs transition-colors duration-fast hover:bg-background disabled:cursor-not-allowed disabled:opacity-50 focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-gray-900';
|
|
9
15
|
function formatFileSize(bytes) {
|
|
10
16
|
if (bytes === 0) return '0 Bytes';
|
|
11
17
|
var k = 1024;
|
|
@@ -24,6 +30,7 @@ var FileUpload = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
|
24
30
|
files = _ref$files === void 0 ? [] : _ref$files,
|
|
25
31
|
_ref$disabled = _ref.disabled,
|
|
26
32
|
disabled = _ref$disabled === void 0 ? false : _ref$disabled,
|
|
33
|
+
capture = _ref.capture,
|
|
27
34
|
className = _ref.className,
|
|
28
35
|
props = _objectWithoutProperties(_ref, _excluded);
|
|
29
36
|
var _useState = useState(false),
|
|
@@ -35,6 +42,9 @@ var FileUpload = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
|
35
42
|
error = _useState4[0],
|
|
36
43
|
setError = _useState4[1];
|
|
37
44
|
var fileInputRef = useRef(null);
|
|
45
|
+
var cameraInputRef = useRef(null);
|
|
46
|
+
// Touch screens have no drag and drop; show explicit pick buttons instead.
|
|
47
|
+
var isCoarse = useMediaQuery(COARSE_POINTER_QUERY);
|
|
38
48
|
var validateFile = useCallback(function (file) {
|
|
39
49
|
if (maxSize && file.size > maxSize) {
|
|
40
50
|
setError("File size must be less than ".concat(formatFileSize(maxSize)));
|
|
@@ -97,20 +107,42 @@ var FileUpload = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
|
97
107
|
(_fileInputRef$current = fileInputRef.current) === null || _fileInputRef$current === void 0 || _fileInputRef$current.click();
|
|
98
108
|
}
|
|
99
109
|
};
|
|
110
|
+
var openCamera = function openCamera() {
|
|
111
|
+
if (!disabled) {
|
|
112
|
+
var _cameraInputRef$curre;
|
|
113
|
+
(_cameraInputRef$curre = cameraInputRef.current) === null || _cameraInputRef$curre === void 0 || _cameraInputRef$curre.click();
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
var handleZoneKeyDown = function handleZoneKeyDown(e) {
|
|
117
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
118
|
+
e.preventDefault();
|
|
119
|
+
openFileDialog();
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
var hint = jsxs("p", {
|
|
123
|
+
className: "text-xs text-primary-500 dark:text-primary-300 mt-1",
|
|
124
|
+
children: [accept && "Accepted formats: ".concat(accept), maxSize && " \u2022 Max size: ".concat(formatFileSize(maxSize))]
|
|
125
|
+
});
|
|
100
126
|
return jsxs("div", _objectSpread2(_objectSpread2({
|
|
101
127
|
ref: ref,
|
|
102
128
|
className: cn('w-full', className)
|
|
103
129
|
}, props), {}, {
|
|
104
130
|
children: [jsxs("div", {
|
|
105
|
-
className: cn('relative border-2 border-dashed rounded-lg p-6 text-center transition-colors
|
|
106
|
-
'
|
|
107
|
-
'border-
|
|
108
|
-
'border-gray-
|
|
131
|
+
className: cn('relative border-2 border-dashed rounded-lg p-6 text-center transition-colors duration-base motion-reduce:transition-none', {
|
|
132
|
+
'cursor-pointer focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-gray-900': !isCoarse && !disabled,
|
|
133
|
+
'border-primary-500 bg-primary-50 dark:bg-primary-900/20': isDragOver && !disabled,
|
|
134
|
+
'border-gray-300 hover:border-gray-400 dark:border-gray-600 dark:hover:border-gray-500': !isDragOver && !disabled,
|
|
135
|
+
'border-gray-200 bg-gray-50 cursor-not-allowed dark:border-gray-700 dark:bg-gray-800/50': disabled
|
|
109
136
|
}),
|
|
110
137
|
onDrop: handleDrop,
|
|
111
138
|
onDragOver: handleDragOver,
|
|
112
139
|
onDragLeave: handleDragLeave,
|
|
113
|
-
onClick: openFileDialog,
|
|
140
|
+
onClick: isCoarse ? undefined : openFileDialog,
|
|
141
|
+
onKeyDown: isCoarse ? undefined : handleZoneKeyDown,
|
|
142
|
+
role: isCoarse ? undefined : 'button',
|
|
143
|
+
tabIndex: isCoarse || disabled ? undefined : 0,
|
|
144
|
+
"aria-disabled": !isCoarse && disabled ? true : undefined,
|
|
145
|
+
"data-coarse": isCoarse || undefined,
|
|
114
146
|
children: [jsx("input", {
|
|
115
147
|
ref: fileInputRef,
|
|
116
148
|
type: "file",
|
|
@@ -118,53 +150,96 @@ var FileUpload = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
|
118
150
|
multiple: multiple,
|
|
119
151
|
onChange: handleFileInputChange,
|
|
120
152
|
className: "hidden",
|
|
121
|
-
disabled: disabled
|
|
153
|
+
disabled: disabled,
|
|
154
|
+
tabIndex: -1
|
|
155
|
+
}), capture && jsx("input", {
|
|
156
|
+
ref: cameraInputRef,
|
|
157
|
+
type: "file",
|
|
158
|
+
accept: accept || 'image/*',
|
|
159
|
+
capture: capture,
|
|
160
|
+
onChange: handleFileInputChange,
|
|
161
|
+
className: "hidden",
|
|
162
|
+
disabled: disabled,
|
|
163
|
+
tabIndex: -1,
|
|
164
|
+
"data-capture-input": ""
|
|
122
165
|
}), jsx(Upload, {
|
|
123
166
|
className: cn('mx-auto h-12 w-12', {
|
|
124
167
|
'text-primary-500': !disabled,
|
|
125
168
|
'text-primary-400': disabled
|
|
126
|
-
})
|
|
127
|
-
|
|
169
|
+
}),
|
|
170
|
+
"aria-hidden": "true"
|
|
171
|
+
}), jsx("div", {
|
|
128
172
|
className: "mt-4",
|
|
129
|
-
children:
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
173
|
+
children: isCoarse ? jsxs(Fragment, {
|
|
174
|
+
children: [jsxs("div", {
|
|
175
|
+
className: "flex flex-col items-stretch gap-2 sm:flex-row sm:justify-center",
|
|
176
|
+
children: [jsxs("button", {
|
|
177
|
+
type: "button",
|
|
178
|
+
className: cn(PICK_BUTTON_CLASSES, PRESS_FEEDBACK, TRANSITION_WITH_PRESS),
|
|
179
|
+
onClick: openFileDialog,
|
|
180
|
+
disabled: disabled,
|
|
181
|
+
children: [jsx(Upload, {
|
|
182
|
+
className: "h-4 w-4",
|
|
183
|
+
"aria-hidden": "true"
|
|
184
|
+
}), multiple ? 'Choose files' : 'Choose file']
|
|
185
|
+
}), capture && jsxs("button", {
|
|
186
|
+
type: "button",
|
|
187
|
+
className: cn(PICK_BUTTON_CLASSES, PRESS_FEEDBACK, TRANSITION_WITH_PRESS),
|
|
188
|
+
onClick: openCamera,
|
|
189
|
+
disabled: disabled,
|
|
190
|
+
children: [jsx(Camera, {
|
|
191
|
+
className: "h-4 w-4",
|
|
192
|
+
"aria-hidden": "true"
|
|
193
|
+
}), "Take photo"]
|
|
194
|
+
})]
|
|
195
|
+
}), hint]
|
|
196
|
+
}) : jsxs(Fragment, {
|
|
197
|
+
children: [jsx("p", {
|
|
198
|
+
className: cn('text-sm font-medium', {
|
|
199
|
+
'text-primary-900 dark:text-primary-100': !disabled,
|
|
200
|
+
'text-primary-500': disabled
|
|
201
|
+
}),
|
|
202
|
+
children: isDragOver ? 'Drop files here' : 'Click to upload or drag and drop'
|
|
203
|
+
}), hint]
|
|
204
|
+
})
|
|
139
205
|
})]
|
|
140
206
|
}), error && jsx("p", {
|
|
141
|
-
|
|
207
|
+
role: "alert",
|
|
208
|
+
className: "mt-2 text-sm text-error-600 dark:text-error-400",
|
|
142
209
|
children: error
|
|
143
|
-
}), files.length > 0 && jsx("
|
|
210
|
+
}), files.length > 0 && jsx("ul", {
|
|
144
211
|
className: "mt-4 space-y-2",
|
|
212
|
+
"aria-label": "Selected files",
|
|
145
213
|
children: files.map(function (file, index) {
|
|
146
|
-
return jsxs("
|
|
147
|
-
className: "flex items-center justify-between rounded-md border border-
|
|
214
|
+
return jsxs("li", {
|
|
215
|
+
className: "flex items-center justify-between gap-3 rounded-md border border-line bg-surface p-3",
|
|
148
216
|
children: [jsxs("div", {
|
|
149
|
-
className: "flex items-center space-x-3",
|
|
150
|
-
children: [
|
|
217
|
+
className: "flex min-w-0 items-center space-x-3",
|
|
218
|
+
children: [jsx("span", {
|
|
219
|
+
className: "shrink-0",
|
|
220
|
+
"aria-hidden": "true",
|
|
221
|
+
children: getFileIcon(file)
|
|
222
|
+
}), jsxs("div", {
|
|
223
|
+
className: "min-w-0",
|
|
151
224
|
children: [jsx("p", {
|
|
152
|
-
className: "text-sm font-medium text-
|
|
225
|
+
className: "truncate text-sm font-medium text-foreground",
|
|
153
226
|
children: file.name
|
|
154
227
|
}), jsx("p", {
|
|
155
|
-
className: "text-xs text-
|
|
228
|
+
className: "text-xs text-muted",
|
|
156
229
|
children: formatFileSize(file.size)
|
|
157
230
|
})]
|
|
158
231
|
})]
|
|
159
232
|
}), jsx("button", {
|
|
160
233
|
type: "button",
|
|
161
|
-
|
|
234
|
+
"aria-label": "Remove ".concat(file.name),
|
|
235
|
+
className: cn('inline-flex shrink-0 items-center justify-center rounded-md p-1 text-muted transition-colors duration-fast hover:text-foreground hover:bg-background disabled:cursor-not-allowed disabled:opacity-50 focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-500', TOUCH_TARGET, PRESS_FEEDBACK, TRANSITION_WITH_PRESS),
|
|
162
236
|
onClick: function onClick() {
|
|
163
237
|
return handleRemoveFile(index);
|
|
164
238
|
},
|
|
165
239
|
disabled: disabled,
|
|
166
240
|
children: jsx(X, {
|
|
167
|
-
className: "h-4 w-4"
|
|
241
|
+
className: "h-4 w-4",
|
|
242
|
+
"aria-hidden": "true"
|
|
168
243
|
})
|
|
169
244
|
})]
|
|
170
245
|
}, index);
|
|
@@ -3,9 +3,15 @@ import { objectWithoutProperties as _objectWithoutProperties, objectSpread2 as _
|
|
|
3
3
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
4
4
|
import React from 'react';
|
|
5
5
|
import { cn } from '../../utils/cn.js';
|
|
6
|
+
import { TOUCH_TARGET } from '../../utils/touchTarget.js';
|
|
6
7
|
import { ChevronLeft, ChevronRight } from 'lucide-react';
|
|
7
8
|
|
|
8
9
|
var _excluded = ["currentPage", "totalPages", "onPageChange", "showFirstLast", "showPrevNext", "maxVisiblePages", "className"];
|
|
10
|
+
// Shared button chrome: dark-safe surface, focus-visible ring, 44px target on coarse pointers.
|
|
11
|
+
var BUTTON_BASE = cn('inline-flex items-center justify-center rounded-md border px-3 py-2 text-sm font-medium', 'transition-colors duration-fast motion-reduce:transition-none', 'outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-gray-900', TOUCH_TARGET);
|
|
12
|
+
var BUTTON_IDLE = 'border-gray-300 bg-white hover:bg-gray-50 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100 dark:hover:bg-gray-800';
|
|
13
|
+
var BUTTON_ACTIVE = 'border-primary-500 bg-primary-50 text-primary-600 dark:bg-primary-950 dark:text-primary-300';
|
|
14
|
+
var DISABLED = 'disabled:opacity-50 disabled:cursor-not-allowed';
|
|
9
15
|
var Pagination = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
10
16
|
var _ref$currentPage = _ref.currentPage,
|
|
11
17
|
currentPage = _ref$currentPage === void 0 ? 1 : _ref$currentPage,
|
|
@@ -45,37 +51,46 @@ var Pagination = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
|
45
51
|
}
|
|
46
52
|
};
|
|
47
53
|
if (totalPages <= 1) return null;
|
|
54
|
+
// Below `sm` the trail collapses to "‹ Page 3 of 10 ›" — only when there are
|
|
55
|
+
// prev/next buttons to drive it; otherwise the full layout shows everywhere.
|
|
56
|
+
var compact = showPrevNext;
|
|
57
|
+
var fullOnly = compact ? 'hidden sm:inline-flex' : '';
|
|
48
58
|
return jsxs("nav", _objectSpread2(_objectSpread2({
|
|
49
59
|
ref: ref,
|
|
50
|
-
className: cn('flex items-center justify-center
|
|
60
|
+
className: cn('flex flex-wrap items-center justify-center gap-1', className),
|
|
51
61
|
"aria-label": "Pagination"
|
|
52
62
|
}, props), {}, {
|
|
53
63
|
children: [showFirstLast && visiblePages[0] > 1 && jsx("button", {
|
|
54
|
-
|
|
64
|
+
type: "button",
|
|
65
|
+
className: cn(BUTTON_BASE, BUTTON_IDLE, fullOnly),
|
|
55
66
|
onClick: function onClick() {
|
|
56
67
|
return handlePageClick(1);
|
|
57
68
|
},
|
|
58
69
|
"aria-label": "Go to first page",
|
|
59
70
|
children: "1"
|
|
60
71
|
}), showPrevNext && jsx("button", {
|
|
61
|
-
|
|
72
|
+
type: "button",
|
|
73
|
+
className: cn(BUTTON_BASE, BUTTON_IDLE, DISABLED),
|
|
62
74
|
onClick: function onClick() {
|
|
63
75
|
return handlePageClick(currentPage - 1);
|
|
64
76
|
},
|
|
65
77
|
disabled: currentPage === 1,
|
|
66
78
|
"aria-label": "Go to previous page",
|
|
67
79
|
children: jsx(ChevronLeft, {
|
|
68
|
-
className: "h-4 w-4"
|
|
80
|
+
className: "h-4 w-4",
|
|
81
|
+
"aria-hidden": "true"
|
|
69
82
|
})
|
|
83
|
+
}), compact && jsxs("span", {
|
|
84
|
+
className: "px-2 text-sm font-medium tabular-nums text-foreground sm:hidden",
|
|
85
|
+
"data-pagination-compact": "",
|
|
86
|
+
children: ["Page ", currentPage, " of ", totalPages]
|
|
70
87
|
}), showFirstLast && visiblePages[0] > 2 && jsx("span", {
|
|
71
|
-
className:
|
|
88
|
+
className: cn('px-3 py-2 text-sm text-primary-500 dark:text-primary-400', fullOnly),
|
|
72
89
|
children: "..."
|
|
73
90
|
}), visiblePages.map(function (page) {
|
|
74
91
|
return jsx("button", {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
'border-gray-300 bg-white hover:bg-gray-50': page !== currentPage
|
|
78
|
-
}),
|
|
92
|
+
type: "button",
|
|
93
|
+
className: cn(BUTTON_BASE, page === currentPage ? BUTTON_ACTIVE : BUTTON_IDLE, fullOnly),
|
|
79
94
|
onClick: function onClick() {
|
|
80
95
|
return handlePageClick(page);
|
|
81
96
|
},
|
|
@@ -84,20 +99,23 @@ var Pagination = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
|
84
99
|
children: page
|
|
85
100
|
}, page);
|
|
86
101
|
}), showFirstLast && visiblePages[visiblePages.length - 1] < totalPages - 1 && jsx("span", {
|
|
87
|
-
className:
|
|
102
|
+
className: cn('px-3 py-2 text-sm text-primary-500 dark:text-primary-400', fullOnly),
|
|
88
103
|
children: "..."
|
|
89
104
|
}), showPrevNext && jsx("button", {
|
|
90
|
-
|
|
105
|
+
type: "button",
|
|
106
|
+
className: cn(BUTTON_BASE, BUTTON_IDLE, DISABLED),
|
|
91
107
|
onClick: function onClick() {
|
|
92
108
|
return handlePageClick(currentPage + 1);
|
|
93
109
|
},
|
|
94
110
|
disabled: currentPage === totalPages,
|
|
95
111
|
"aria-label": "Go to next page",
|
|
96
112
|
children: jsx(ChevronRight, {
|
|
97
|
-
className: "h-4 w-4"
|
|
113
|
+
className: "h-4 w-4",
|
|
114
|
+
"aria-hidden": "true"
|
|
98
115
|
})
|
|
99
116
|
}), showFirstLast && visiblePages[visiblePages.length - 1] < totalPages && jsx("button", {
|
|
100
|
-
|
|
117
|
+
type: "button",
|
|
118
|
+
className: cn(BUTTON_BASE, BUTTON_IDLE, fullOnly),
|
|
101
119
|
onClick: function onClick() {
|
|
102
120
|
return handlePageClick(totalPages);
|
|
103
121
|
},
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useSyncExternalStore } from 'react';
|
|
3
|
+
import { createPortal } from 'react-dom';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Internal (not exported). Renders `children` into `container` (default
|
|
7
|
+
* `document.body`). Renders nothing on the server and on the first client
|
|
8
|
+
* render, so hydration matches; the portal appears right after mount.
|
|
9
|
+
*
|
|
10
|
+
* @param {{ container?: Element | null, children?: React.ReactNode }} props
|
|
11
|
+
*/
|
|
12
|
+
var subscribe = function subscribe() {
|
|
13
|
+
return function () {};
|
|
14
|
+
};
|
|
15
|
+
var getClientSnapshot = function getClientSnapshot() {
|
|
16
|
+
return true;
|
|
17
|
+
};
|
|
18
|
+
var getServerSnapshot = function getServerSnapshot() {
|
|
19
|
+
return false;
|
|
20
|
+
};
|
|
21
|
+
function Portal(_ref) {
|
|
22
|
+
var container = _ref.container,
|
|
23
|
+
children = _ref.children;
|
|
24
|
+
// false on the server and during hydration, true on the client after it.
|
|
25
|
+
var mounted = useSyncExternalStore(subscribe, getClientSnapshot, getServerSnapshot);
|
|
26
|
+
if (!mounted || typeof document === "undefined") return null;
|
|
27
|
+
var target = container || document.body;
|
|
28
|
+
return target ? /*#__PURE__*/createPortal(children, target) : null;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export { Portal as default };
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
'use client';
|
|
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, useState, useRef, useEffect } from 'react';
|
|
5
|
+
import { RefreshCw } from 'lucide-react';
|
|
6
|
+
import { cn } from '../../utils/cn.js';
|
|
7
|
+
import { useLatestRef } from '../../hooks/useLatestRef.js';
|
|
8
|
+
import { useReducedMotion } from '../../hooks/useReducedMotion.js';
|
|
9
|
+
|
|
10
|
+
var _excluded = ["onRefresh", "threshold", "maxPull", "disabled", "refreshingLabel", "scrollRef", "className", "contentClassName", "children"];
|
|
11
|
+
// Touch pull-to-refresh around a scroll container (DTUI-56). The gesture only
|
|
12
|
+
// starts while the scroller sits at scrollTop 0 and the finger moves down, so
|
|
13
|
+
// normal scrolling is never intercepted. The page itself keeps the global
|
|
14
|
+
// `overscroll-behavior-y: none` baseline, so the browser's own pull-to-refresh
|
|
15
|
+
// does not fight this one.
|
|
16
|
+
var INDICATOR_SIZE = 40;
|
|
17
|
+
// Rubber-band resistance: 1:1 at first, asymptotic to `max`.
|
|
18
|
+
function resist(distance, max) {
|
|
19
|
+
if (distance <= 0 || max <= 0) return 0;
|
|
20
|
+
return max * (1 - 1 / (distance / max + 1));
|
|
21
|
+
}
|
|
22
|
+
var PullToRefresh = /*#__PURE__*/forwardRef(function PullToRefresh(_ref, ref) {
|
|
23
|
+
var onRefresh = _ref.onRefresh,
|
|
24
|
+
_ref$threshold = _ref.threshold,
|
|
25
|
+
threshold = _ref$threshold === void 0 ? 64 : _ref$threshold,
|
|
26
|
+
maxPull = _ref.maxPull,
|
|
27
|
+
_ref$disabled = _ref.disabled,
|
|
28
|
+
disabled = _ref$disabled === void 0 ? false : _ref$disabled,
|
|
29
|
+
_ref$refreshingLabel = _ref.refreshingLabel,
|
|
30
|
+
refreshingLabel = _ref$refreshingLabel === void 0 ? "Refreshing…" : _ref$refreshingLabel,
|
|
31
|
+
scrollRef = _ref.scrollRef,
|
|
32
|
+
className = _ref.className,
|
|
33
|
+
contentClassName = _ref.contentClassName,
|
|
34
|
+
children = _ref.children,
|
|
35
|
+
rest = _objectWithoutProperties(_ref, _excluded);
|
|
36
|
+
var limit = Math.max(threshold, maxPull !== null && maxPull !== void 0 ? maxPull : threshold * 2);
|
|
37
|
+
var reducedMotion = useReducedMotion();
|
|
38
|
+
var _useState = useState(null),
|
|
39
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
40
|
+
scrollEl = _useState2[0],
|
|
41
|
+
setScrollEl = _useState2[1];
|
|
42
|
+
var _useState3 = useState(0),
|
|
43
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
44
|
+
pull = _useState4[0],
|
|
45
|
+
setPull = _useState4[1];
|
|
46
|
+
var _useState5 = useState(false),
|
|
47
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
48
|
+
dragging = _useState6[0],
|
|
49
|
+
setDragging = _useState6[1];
|
|
50
|
+
var _useState7 = useState(false),
|
|
51
|
+
_useState8 = _slicedToArray(_useState7, 2),
|
|
52
|
+
refreshing = _useState8[0],
|
|
53
|
+
setRefreshing = _useState8[1];
|
|
54
|
+
var gesture = useRef(null);
|
|
55
|
+
var pullRef = useRef(0);
|
|
56
|
+
var busy = useRef(false);
|
|
57
|
+
var mounted = useRef(true);
|
|
58
|
+
var config = useLatestRef({
|
|
59
|
+
onRefresh: onRefresh,
|
|
60
|
+
threshold: threshold,
|
|
61
|
+
limit: limit,
|
|
62
|
+
disabled: disabled
|
|
63
|
+
});
|
|
64
|
+
useEffect(function () {
|
|
65
|
+
mounted.current = true;
|
|
66
|
+
return function () {
|
|
67
|
+
mounted.current = false;
|
|
68
|
+
};
|
|
69
|
+
}, []);
|
|
70
|
+
useEffect(function () {
|
|
71
|
+
var el = scrollRef ? scrollRef.current : scrollEl;
|
|
72
|
+
if (!el || disabled) return undefined;
|
|
73
|
+
var setDistance = function setDistance(value) {
|
|
74
|
+
pullRef.current = value;
|
|
75
|
+
setPull(value);
|
|
76
|
+
};
|
|
77
|
+
var settle = function settle() {
|
|
78
|
+
busy.current = false;
|
|
79
|
+
if (!mounted.current) return;
|
|
80
|
+
setRefreshing(false);
|
|
81
|
+
setDistance(0);
|
|
82
|
+
};
|
|
83
|
+
var startRefresh = function startRefresh() {
|
|
84
|
+
busy.current = true;
|
|
85
|
+
setRefreshing(true);
|
|
86
|
+
setDistance(config.current.threshold);
|
|
87
|
+
// A sync throw or a rejection retracts the indicator too; onRefresh owns its errors.
|
|
88
|
+
new Promise(function (resolve) {
|
|
89
|
+
var _config$current$onRef, _config$current;
|
|
90
|
+
return resolve((_config$current$onRef = (_config$current = config.current).onRefresh) === null || _config$current$onRef === void 0 ? void 0 : _config$current$onRef.call(_config$current));
|
|
91
|
+
}).then(settle, settle);
|
|
92
|
+
};
|
|
93
|
+
var begin = function begin(touch) {
|
|
94
|
+
gesture.current = {
|
|
95
|
+
x: touch.clientX,
|
|
96
|
+
y: touch.clientY,
|
|
97
|
+
axis: null
|
|
98
|
+
};
|
|
99
|
+
};
|
|
100
|
+
var onTouchStart = function onTouchStart(e) {
|
|
101
|
+
gesture.current = null;
|
|
102
|
+
if (busy.current || e.touches.length !== 1 || el.scrollTop > 0) return;
|
|
103
|
+
begin(e.touches[0]);
|
|
104
|
+
};
|
|
105
|
+
var onTouchMove = function onTouchMove(e) {
|
|
106
|
+
if (busy.current || e.touches.length !== 1) return;
|
|
107
|
+
var touch = e.touches[0];
|
|
108
|
+
// A scroll that returns to the top mid-gesture can still pull from there.
|
|
109
|
+
if (!gesture.current) {
|
|
110
|
+
if (el.scrollTop > 0) return;
|
|
111
|
+
begin(touch);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
var g = gesture.current;
|
|
115
|
+
var dy = touch.clientY - g.y;
|
|
116
|
+
if (!g.axis) {
|
|
117
|
+
var dx = touch.clientX - g.x;
|
|
118
|
+
if (Math.abs(dx) < 4 && Math.abs(dy) < 4) return;
|
|
119
|
+
g.axis = Math.abs(dx) > Math.abs(dy) || dy < 0 || el.scrollTop > 0 ? "none" : "pull";
|
|
120
|
+
if (g.axis === "pull") setDragging(true);
|
|
121
|
+
}
|
|
122
|
+
if (g.axis !== "pull") return;
|
|
123
|
+
if (el.scrollTop > 0) {
|
|
124
|
+
// The user pushed back up and scrolled the content: hand the gesture back.
|
|
125
|
+
g.axis = "none";
|
|
126
|
+
setDragging(false);
|
|
127
|
+
setDistance(0);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
if (dy <= 0) {
|
|
131
|
+
setDistance(0);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
// Only now, mid-pull at the top, keep the browser from also panning.
|
|
135
|
+
if (e.cancelable) e.preventDefault();
|
|
136
|
+
setDistance(resist(dy, config.current.limit));
|
|
137
|
+
};
|
|
138
|
+
var finish = function finish(commit) {
|
|
139
|
+
var g = gesture.current;
|
|
140
|
+
gesture.current = null;
|
|
141
|
+
if (!g || g.axis !== "pull") return;
|
|
142
|
+
setDragging(false);
|
|
143
|
+
if (commit && pullRef.current >= config.current.threshold) startRefresh();else setDistance(0);
|
|
144
|
+
};
|
|
145
|
+
var onTouchEnd = function onTouchEnd() {
|
|
146
|
+
return finish(true);
|
|
147
|
+
};
|
|
148
|
+
var onTouchCancel = function onTouchCancel() {
|
|
149
|
+
return finish(false);
|
|
150
|
+
};
|
|
151
|
+
// touchmove must be non-passive to stop the pan while pulling; the rest stay passive.
|
|
152
|
+
el.addEventListener("touchstart", onTouchStart, {
|
|
153
|
+
passive: true
|
|
154
|
+
});
|
|
155
|
+
el.addEventListener("touchmove", onTouchMove, {
|
|
156
|
+
passive: false
|
|
157
|
+
});
|
|
158
|
+
el.addEventListener("touchend", onTouchEnd, {
|
|
159
|
+
passive: true
|
|
160
|
+
});
|
|
161
|
+
el.addEventListener("touchcancel", onTouchCancel, {
|
|
162
|
+
passive: true
|
|
163
|
+
});
|
|
164
|
+
return function () {
|
|
165
|
+
gesture.current = null;
|
|
166
|
+
el.removeEventListener("touchstart", onTouchStart);
|
|
167
|
+
el.removeEventListener("touchmove", onTouchMove);
|
|
168
|
+
el.removeEventListener("touchend", onTouchEnd);
|
|
169
|
+
el.removeEventListener("touchcancel", onTouchCancel);
|
|
170
|
+
};
|
|
171
|
+
}, [scrollRef, scrollEl, disabled, config]);
|
|
172
|
+
// A pull left half-way when `disabled` flips on is dropped (a refresh in flight still shows).
|
|
173
|
+
var distance = disabled && !refreshing ? 0 : pull;
|
|
174
|
+
var progress = Math.min(1, distance / threshold);
|
|
175
|
+
var armed = refreshing || distance >= threshold;
|
|
176
|
+
var animate = !dragging && !reducedMotion;
|
|
177
|
+
var transition = animate ? "transition-transform duration-base ease-standard motion-reduce:transition-none" : "";
|
|
178
|
+
var contentStyle = distance > 0 ? {
|
|
179
|
+
transform: "translateY(".concat(distance, "px)")
|
|
180
|
+
} : undefined;
|
|
181
|
+
var indicatorStyle = {
|
|
182
|
+
transform: "translateY(".concat(distance - INDICATOR_SIZE, "px)"),
|
|
183
|
+
opacity: refreshing ? 1 : progress
|
|
184
|
+
};
|
|
185
|
+
var iconStyle = reducedMotion || refreshing ? undefined : {
|
|
186
|
+
transform: "rotate(".concat(Math.round(progress * 270), "deg)")
|
|
187
|
+
};
|
|
188
|
+
var contentProps = {
|
|
189
|
+
className: cn(scrollRef ? "h-full" : "h-full overflow-y-auto overscroll-y-contain", transition, contentClassName),
|
|
190
|
+
style: contentStyle,
|
|
191
|
+
"aria-busy": refreshing || undefined,
|
|
192
|
+
"data-ptr-content": ""
|
|
193
|
+
};
|
|
194
|
+
return jsxs("div", _objectSpread2(_objectSpread2({
|
|
195
|
+
ref: ref,
|
|
196
|
+
className: cn("relative overflow-hidden", className),
|
|
197
|
+
"data-state": refreshing ? "refreshing" : distance > 0 ? "pulling" : "idle"
|
|
198
|
+
}, rest), {}, {
|
|
199
|
+
children: [jsx("div", {
|
|
200
|
+
"aria-hidden": "true",
|
|
201
|
+
"data-ptr-indicator": "",
|
|
202
|
+
className: cn("pointer-events-none absolute inset-x-0 top-0 z-10 flex justify-center", transition),
|
|
203
|
+
style: indicatorStyle,
|
|
204
|
+
children: jsx("span", {
|
|
205
|
+
className: cn("flex h-10 w-10 items-center justify-center rounded-full border border-line bg-surface shadow-sm", armed ? "text-primary-600 dark:text-primary-400" : "text-muted"),
|
|
206
|
+
children: jsx(RefreshCw, {
|
|
207
|
+
className: cn("h-5 w-5", refreshing && !reducedMotion && "animate-spin motion-reduce:animate-none"),
|
|
208
|
+
style: iconStyle,
|
|
209
|
+
"aria-hidden": "true",
|
|
210
|
+
"data-ptr-spinner": ""
|
|
211
|
+
})
|
|
212
|
+
})
|
|
213
|
+
}), jsx("div", {
|
|
214
|
+
role: "status",
|
|
215
|
+
"aria-live": "polite",
|
|
216
|
+
className: "sr-only",
|
|
217
|
+
children: refreshing ? refreshingLabel : ""
|
|
218
|
+
}), scrollRef ? jsx("div", _objectSpread2(_objectSpread2({}, contentProps), {}, {
|
|
219
|
+
children: children
|
|
220
|
+
})) : jsx("div", _objectSpread2(_objectSpread2({
|
|
221
|
+
ref: setScrollEl
|
|
222
|
+
}, contentProps), {}, {
|
|
223
|
+
children: children
|
|
224
|
+
}))]
|
|
225
|
+
}));
|
|
226
|
+
});
|
|
227
|
+
PullToRefresh.displayName = "PullToRefresh";
|
|
228
|
+
|
|
229
|
+
export { PullToRefresh as default, resist };
|
|
@@ -137,6 +137,10 @@ var Sortable = /*#__PURE__*/forwardRef(function (_ref4, ref) {
|
|
|
137
137
|
var isGrabbed = keyboard.grabbed === key;
|
|
138
138
|
var isDragging = pointer.dragging === key;
|
|
139
139
|
var startDrag = disabled ? undefined : pointer.startFor(key);
|
|
140
|
+
// Whole-item drags wait for a long-press on touch so the page still scrolls.
|
|
141
|
+
var startItemDrag = disabled || handle ? undefined : pointer.startFor(key, {
|
|
142
|
+
longPress: true
|
|
143
|
+
});
|
|
140
144
|
return jsx(ItemTag, {
|
|
141
145
|
ref: function ref(node) {
|
|
142
146
|
if (node) nodes.current.set(key, node);else nodes.current["delete"](key);
|
|
@@ -151,8 +155,8 @@ var Sortable = /*#__PURE__*/forwardRef(function (_ref4, ref) {
|
|
|
151
155
|
onBlur: function onBlur(e) {
|
|
152
156
|
if (isGrabbed && e.relatedTarget && !e.currentTarget.contains(e.relatedTarget)) keyboard.cancel();
|
|
153
157
|
},
|
|
154
|
-
onPointerDown:
|
|
155
|
-
className: cn("rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500 dark:focus:ring-offset-gray-900", !disabled && !handle && "cursor-grab
|
|
158
|
+
onPointerDown: startItemDrag,
|
|
159
|
+
className: cn("rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500 dark:focus:ring-offset-gray-900", !disabled && !handle && "cursor-grab select-none [-webkit-touch-callout:none]", (isGrabbed || isDragging) && "relative z-10 shadow-lg ring-2 ring-primary-500 opacity-90", itemClassName),
|
|
156
160
|
children: renderItem ? renderItem(item, {
|
|
157
161
|
index: index,
|
|
158
162
|
originalIndex: originalIndex,
|