@windrun-huaiin/third-ui 29.2.0 → 30.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/dist/fuma/mdx/cheet-table.d.ts +13 -0
- package/dist/fuma/mdx/cheet-table.js +295 -0
- package/dist/fuma/mdx/cheet-table.mjs +293 -0
- package/dist/fuma/mdx/index.d.ts +1 -0
- package/dist/fuma/mdx/index.js +2 -0
- package/dist/fuma/mdx/index.mjs +1 -0
- package/dist/fuma/server/features/widgets.js +2 -0
- package/dist/fuma/server/features/widgets.mjs +2 -0
- package/dist/lib/fuma-schema-check-util.d.ts +1 -1
- package/dist/main/alert-dialog/confirm-dialog.d.ts +2 -1
- package/dist/main/alert-dialog/confirm-dialog.js +3 -3
- package/dist/main/alert-dialog/confirm-dialog.mjs +4 -4
- package/dist/main/alert-dialog/dialog-loading-action.d.ts +2 -1
- package/dist/main/alert-dialog/dialog-loading-action.js +6 -3
- package/dist/main/alert-dialog/dialog-loading-action.mjs +6 -3
- package/dist/main/alert-dialog/dialog-styles.d.ts +4 -2
- package/dist/main/alert-dialog/dialog-styles.js +8 -4
- package/dist/main/alert-dialog/dialog-styles.mjs +7 -5
- package/dist/main/alert-dialog/high-priority-confirm-dialog.d.ts +2 -1
- package/dist/main/alert-dialog/high-priority-confirm-dialog.js +7 -7
- package/dist/main/alert-dialog/high-priority-confirm-dialog.mjs +8 -8
- package/dist/main/alert-dialog/info-dialog.d.ts +2 -1
- package/dist/main/alert-dialog/info-dialog.js +3 -3
- package/dist/main/alert-dialog/info-dialog.mjs +4 -4
- package/dist/main/alert-dialog/undoable-confirm-dialog.d.ts +2 -1
- package/dist/main/alert-dialog/undoable-confirm-dialog.js +4 -4
- package/dist/main/alert-dialog/undoable-confirm-dialog.mjs +5 -5
- package/dist/main/anime/anime-beam-frame.d.ts +3 -0
- package/dist/main/anime/anime-beam-frame.js +63 -0
- package/dist/main/anime/anime-beam-frame.mjs +61 -0
- package/dist/main/anime/anime-spiral-loading.d.ts +10 -0
- package/dist/main/anime/anime-spiral-loading.js +77 -0
- package/dist/main/anime/anime-spiral-loading.mjs +75 -0
- package/dist/main/anime/index.d.ts +2 -0
- package/dist/main/anime/index.js +10 -0
- package/dist/main/anime/index.mjs +3 -0
- package/dist/main/beam-frame/animate.d.ts +3 -0
- package/dist/main/beam-frame/animate.js +63 -0
- package/dist/main/beam-frame/animate.mjs +61 -0
- package/dist/main/beam-frame/beam-frame.d.ts +4 -0
- package/dist/main/beam-frame/beam-frame.js +262 -0
- package/dist/main/beam-frame/beam-frame.mjs +258 -0
- package/dist/main/beam-frame/index.d.ts +4 -0
- package/dist/main/beam-frame/index.js +11 -0
- package/dist/main/beam-frame/index.mjs +3 -0
- package/dist/main/beam-frame/motion.d.ts +3 -0
- package/dist/main/beam-frame/motion.js +61 -0
- package/dist/main/beam-frame/motion.mjs +59 -0
- package/dist/main/beam-frame/share-config.d.ts +54 -0
- package/dist/main/beam-frame/share-config.js +161 -0
- package/dist/main/beam-frame/share-config.mjs +152 -0
- package/dist/main/beam-frame-config.d.ts +54 -0
- package/dist/main/beam-frame-config.js +161 -0
- package/dist/main/beam-frame-config.mjs +152 -0
- package/dist/main/calendar/random-date-range-dialog.d.ts +5 -2
- package/dist/main/calendar/random-date-range-dialog.js +239 -109
- package/dist/main/calendar/random-date-range-dialog.mjs +242 -112
- package/dist/main/cta.js +17 -1
- package/dist/main/cta.mjs +18 -2
- package/dist/main/delayed-img.d.ts +1 -1
- package/dist/main/delayed-img.js +8 -5
- package/dist/main/delayed-img.mjs +8 -5
- package/dist/main/info-tooltip.js +70 -9
- package/dist/main/info-tooltip.mjs +70 -9
- package/dist/main/loading-frame/index.d.ts +1 -0
- package/dist/main/loading.d.ts +2 -1
- package/dist/main/loading.js +64 -26
- package/dist/main/loading.mjs +64 -26
- package/dist/main/motion/index.d.ts +1 -0
- package/dist/main/motion/index.js +9 -0
- package/dist/main/motion/index.mjs +2 -0
- package/dist/main/motion/motion-beam-frame.d.ts +3 -0
- package/dist/main/motion/motion-beam-frame.js +61 -0
- package/dist/main/motion/motion-beam-frame.mjs +59 -0
- package/dist/main/snake-loading-frame.d.ts +7 -3
- package/dist/main/snake-loading-frame.js +44 -252
- package/dist/main/snake-loading-frame.mjs +46 -254
- package/package.json +16 -5
- package/src/fuma/mdx/cheet-table.tsx +650 -0
- package/src/fuma/mdx/index.ts +1 -0
- package/src/fuma/server/features/widgets.tsx +2 -0
- package/src/main/alert-dialog/confirm-dialog.tsx +5 -2
- package/src/main/alert-dialog/dialog-loading-action.tsx +22 -5
- package/src/main/alert-dialog/dialog-styles.ts +13 -3
- package/src/main/alert-dialog/high-priority-confirm-dialog.tsx +29 -24
- package/src/main/alert-dialog/info-dialog.tsx +5 -2
- package/src/main/alert-dialog/undoable-confirm-dialog.tsx +21 -18
- package/src/main/anime/anime-beam-frame.tsx +128 -0
- package/src/main/anime/anime-spiral-loading.tsx +123 -0
- package/src/main/anime/index.ts +9 -0
- package/src/main/beam-frame-config.tsx +341 -0
- package/src/main/calendar/random-date-range-dialog.tsx +242 -74
- package/src/main/cta.tsx +50 -21
- package/src/main/delayed-img.tsx +9 -4
- package/src/main/info-tooltip.tsx +116 -20
- package/src/main/loading-frame/index.ts +4 -0
- package/src/main/loading.tsx +75 -24
- package/src/main/motion/index.ts +8 -0
- package/src/main/motion/motion-beam-frame.tsx +137 -0
- package/src/main/snake-loading-frame.tsx +95 -496
- package/src/styles/cta.css +21 -4
- package/src/styles/third-ui.css +0 -20
|
@@ -5,14 +5,17 @@ var jsxRuntime = require('react/jsx-runtime');
|
|
|
5
5
|
var React = require('react');
|
|
6
6
|
var reactDom = require('react-dom');
|
|
7
7
|
var icons = require('@windrun-huaiin/base-ui/icons');
|
|
8
|
+
var lib = require('@windrun-huaiin/base-ui/lib');
|
|
8
9
|
var utils = require('@windrun-huaiin/lib/utils');
|
|
10
|
+
var dialogLoadingAction = require('../alert-dialog/dialog-loading-action.js');
|
|
11
|
+
var xButton = require('../buttons/x-button.js');
|
|
9
12
|
var usePressFeedback = require('../buttons/use-press-feedback.js');
|
|
10
13
|
|
|
11
14
|
const DEFAULT_RANGE_DAYS = 7;
|
|
12
|
-
const MAX_RANGE_DAYS =
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
const DIALOG_ICON_BUTTON_CLASS_NAME = 'inline-flex h-8 w-8 items-center justify-center rounded-full
|
|
15
|
+
const MAX_RANGE_DAYS = 31;
|
|
16
|
+
const VISIBLE_TRACK_DAYS = 36;
|
|
17
|
+
const EDGE_OVERFLOW_PIXELS_PER_DAY = 24;
|
|
18
|
+
const DIALOG_ICON_BUTTON_CLASS_NAME = 'inline-flex h-8 w-8 items-center justify-center rounded-full bg-white text-slate-500 transition duration-150 hover:bg-black/5 hover:text-slate-900 dark:bg-slate-950 dark:text-slate-300 dark:hover:bg-white/5 dark:hover:text-white';
|
|
16
19
|
const DIALOG_NAV_BUTTON_CLASS_NAME = 'inline-flex h-8 w-8 items-center justify-center rounded-full transition-[transform,background-color,color,box-shadow,border-color] duration-150 ease-out';
|
|
17
20
|
const DIALOG_NAV_BUTTON_REST_CLASS_NAME = 'border border-black/10 bg-white text-slate-500 shadow-[0_1px_2px_rgba(15,23,42,0.08)] hover:border-black/15 dark:border-white/10 dark:bg-slate-950 dark:text-slate-400 dark:hover:border-white/15';
|
|
18
21
|
const DIALOG_NAV_BUTTON_PRESSED_CLASS_NAME = 'translate-y-[2px] scale-[0.9] border border-black/30 bg-slate-300 text-slate-950 shadow-[inset_0_2px_4px_rgba(15,23,42,0.22)] dark:border-white/25 dark:bg-white/20 dark:text-white dark:shadow-[inset_0_2px_4px_rgba(255,255,255,0.16)]';
|
|
@@ -54,12 +57,31 @@ function clampWindowDays(days) {
|
|
|
54
57
|
}
|
|
55
58
|
function buildTrackRange(referenceDate, windowDays = DEFAULT_RANGE_DAYS) {
|
|
56
59
|
const resolvedWindowDays = clampWindowDays(windowDays);
|
|
57
|
-
const
|
|
58
|
-
const daysBefore = Math.floor((resolvedTotalDays - resolvedWindowDays) / 3);
|
|
60
|
+
const daysBefore = Math.floor((VISIBLE_TRACK_DAYS - resolvedWindowDays) / 3);
|
|
59
61
|
const startDate = addDays(referenceDate, -daysBefore);
|
|
60
|
-
const endDate = addDays(startDate,
|
|
62
|
+
const endDate = addDays(startDate, VISIBLE_TRACK_DAYS - 1);
|
|
61
63
|
return { startDate, endDate };
|
|
62
64
|
}
|
|
65
|
+
function ensureRangeVisibleOnTrack(range, bounds) {
|
|
66
|
+
if (!range.startDate || !range.endDate || !bounds.startDate || !bounds.endDate) {
|
|
67
|
+
return bounds;
|
|
68
|
+
}
|
|
69
|
+
let nextStartDate = bounds.startDate;
|
|
70
|
+
if (compareDateStrings(range.startDate, nextStartDate) < 0) {
|
|
71
|
+
nextStartDate = range.startDate;
|
|
72
|
+
}
|
|
73
|
+
const nextEndDate = addDays(nextStartDate, VISIBLE_TRACK_DAYS - 1);
|
|
74
|
+
if (compareDateStrings(range.endDate, nextEndDate) > 0) {
|
|
75
|
+
nextStartDate = addDays(range.endDate, -35);
|
|
76
|
+
}
|
|
77
|
+
if (nextStartDate === bounds.startDate && addDays(nextStartDate, VISIBLE_TRACK_DAYS - 1) === bounds.endDate) {
|
|
78
|
+
return bounds;
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
startDate: nextStartDate,
|
|
82
|
+
endDate: addDays(nextStartDate, VISIBLE_TRACK_DAYS - 1),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
63
85
|
function clampDateToRange(date, bounds) {
|
|
64
86
|
if (!bounds.startDate || !bounds.endDate) {
|
|
65
87
|
return date;
|
|
@@ -82,6 +104,19 @@ function getDateByRatio(bounds, ratio) {
|
|
|
82
104
|
return getTodayString();
|
|
83
105
|
}
|
|
84
106
|
const totalDays = Math.max(1, getDaysBetween(bounds.startDate, bounds.endDate));
|
|
107
|
+
return addDays(bounds.startDate, Math.round(totalDays * Math.max(0, Math.min(1, ratio))));
|
|
108
|
+
}
|
|
109
|
+
function getDateByOverflowRatio(bounds, ratio, trackWidth) {
|
|
110
|
+
if (!bounds.startDate || !bounds.endDate) {
|
|
111
|
+
return getTodayString();
|
|
112
|
+
}
|
|
113
|
+
const totalDays = Math.max(1, getDaysBetween(bounds.startDate, bounds.endDate));
|
|
114
|
+
if (ratio < 0) {
|
|
115
|
+
return addDays(bounds.startDate, Math.floor((ratio * trackWidth) / EDGE_OVERFLOW_PIXELS_PER_DAY));
|
|
116
|
+
}
|
|
117
|
+
if (ratio > 1) {
|
|
118
|
+
return addDays(bounds.endDate, Math.ceil(((ratio - 1) * trackWidth) / EDGE_OVERFLOW_PIXELS_PER_DAY));
|
|
119
|
+
}
|
|
85
120
|
return addDays(bounds.startDate, Math.round(totalDays * ratio));
|
|
86
121
|
}
|
|
87
122
|
function getRatioByDate(date, bounds) {
|
|
@@ -118,8 +153,24 @@ function getMonthEnd(value) {
|
|
|
118
153
|
const date = parseDateString(value);
|
|
119
154
|
return formatDateString(new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + 1, 0)));
|
|
120
155
|
}
|
|
121
|
-
function
|
|
122
|
-
|
|
156
|
+
function RollingMonthLabel({ value }) {
|
|
157
|
+
const [displayValue, setDisplayValue] = React.useState(value);
|
|
158
|
+
const [previousValue, setPreviousValue] = React.useState(null);
|
|
159
|
+
React.useEffect(() => {
|
|
160
|
+
if (value === displayValue) {
|
|
161
|
+
return undefined;
|
|
162
|
+
}
|
|
163
|
+
setPreviousValue(displayValue);
|
|
164
|
+
setDisplayValue(value);
|
|
165
|
+
const timeout = window.setTimeout(() => {
|
|
166
|
+
setPreviousValue(null);
|
|
167
|
+
}, 180);
|
|
168
|
+
return () => window.clearTimeout(timeout);
|
|
169
|
+
}, [displayValue, value]);
|
|
170
|
+
return (jsxRuntime.jsxs("span", { className: "relative inline-block h-5 min-w-10 overflow-hidden align-bottom", children: [previousValue ? (jsxRuntime.jsx("span", { className: "rd-date-range-month-out absolute inset-x-0 top-0 text-center", children: previousValue })) : null, jsxRuntime.jsx("span", { className: utils.cn('absolute inset-x-0 top-0 text-center', previousValue && 'rd-date-range-month-in'), children: displayValue })] }));
|
|
171
|
+
}
|
|
172
|
+
function RandomDateRangeDialog({ open, value, anchorDate, defaultRangeDays = DEFAULT_RANGE_DAYS, onOpenChange, loadingActions, loadingFullPage, onApply, onClear, }) {
|
|
173
|
+
var _a, _b, _c, _d, _e, _f;
|
|
123
174
|
const resolvedDefaultRangeDays = clampWindowDays(defaultRangeDays);
|
|
124
175
|
const [draftRange, setDraftRange] = React.useState(value);
|
|
125
176
|
const [referenceDate, setReferenceDate] = React.useState(anchorDate);
|
|
@@ -137,12 +188,15 @@ function RandomDateRangeDialog({ open, value, anchorDate, defaultRangeDays = DEF
|
|
|
137
188
|
const resultLabelRef = React.useRef(null);
|
|
138
189
|
const selectionDaysRef = React.useRef(null);
|
|
139
190
|
const dragPreviewRef = React.useRef(null);
|
|
191
|
+
const trackBoundsRef = React.useRef(trackBounds);
|
|
192
|
+
const dragStartTrackBoundsRef = React.useRef(null);
|
|
140
193
|
const frameRef = React.useRef(null);
|
|
141
194
|
const pendingClientXRef = React.useRef(null);
|
|
142
195
|
const syncPreviewDomRef = React.useRef(() => { });
|
|
143
196
|
const buildDraggedRangeRef = React.useRef(() => null);
|
|
144
197
|
const previousBodyOverflowRef = React.useRef(null);
|
|
145
198
|
const today = React.useMemo(() => getTodayString(), []);
|
|
199
|
+
const { dialogLoading, runDialogAction } = dialogLoadingAction.useDialogLoadingAction({ loadingActions, loadingFullPage, onOpenChange });
|
|
146
200
|
const baseReferenceDate = anchorDate || today;
|
|
147
201
|
const previousOpenRef = React.useRef(false);
|
|
148
202
|
const startRatio = getRatioByDate((_a = draftRange.startDate) !== null && _a !== void 0 ? _a : baseReferenceDate, trackBounds);
|
|
@@ -153,22 +207,27 @@ function RandomDateRangeDialog({ open, value, anchorDate, defaultRangeDays = DEF
|
|
|
153
207
|
const isSingleDay = ((_c = draftRange.startDate) !== null && _c !== void 0 ? _c : null) === ((_d = draftRange.endDate) !== null && _d !== void 0 ? _d : null);
|
|
154
208
|
const startHandlePercent = isSingleDay ? Math.max(leftPercent - 0.8, 0) : leftPercent;
|
|
155
209
|
const endHandlePercent = isSingleDay ? Math.min(rightPercent + 0.8, 100) : rightPercent;
|
|
156
|
-
const trackTickCount =
|
|
157
|
-
const
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
210
|
+
const trackTickCount = VISIBLE_TRACK_DAYS;
|
|
211
|
+
const leftMonthLabel = formatMonthShort((_e = trackBounds.startDate) !== null && _e !== void 0 ? _e : baseReferenceDate);
|
|
212
|
+
const rightMonthLabel = formatMonthShort((_f = trackBounds.endDate) !== null && _f !== void 0 ? _f : baseReferenceDate);
|
|
213
|
+
const handleApply = React.useCallback(() => {
|
|
214
|
+
return onApply(draftRange);
|
|
215
|
+
}, [draftRange, onApply]);
|
|
216
|
+
function commitTrackBounds(nextTrackBounds) {
|
|
217
|
+
trackBoundsRef.current = nextTrackBounds;
|
|
218
|
+
setTrackBounds(nextTrackBounds);
|
|
219
|
+
}
|
|
163
220
|
React.useEffect(() => {
|
|
164
221
|
if (open && !previousOpenRef.current) {
|
|
222
|
+
const nextTrackBounds = buildTrackRange(baseReferenceDate, resolvedDefaultRangeDays);
|
|
165
223
|
const nextRange = {
|
|
166
224
|
startDate: baseReferenceDate,
|
|
167
225
|
endDate: addDays(baseReferenceDate, resolvedDefaultRangeDays - 1),
|
|
168
226
|
};
|
|
169
227
|
setDraftRange(nextRange);
|
|
170
228
|
setReferenceDate(baseReferenceDate);
|
|
171
|
-
|
|
229
|
+
trackBoundsRef.current = nextTrackBounds;
|
|
230
|
+
setTrackBounds(nextTrackBounds);
|
|
172
231
|
setWindowDays(resolvedDefaultRangeDays);
|
|
173
232
|
dragStartRangeRef.current = null;
|
|
174
233
|
dragModeRef.current = null;
|
|
@@ -186,16 +245,20 @@ function RandomDateRangeDialog({ open, value, anchorDate, defaultRangeDays = DEF
|
|
|
186
245
|
setReferenceDate(nextReferenceDate);
|
|
187
246
|
setWindowDays(clampedWindowDays);
|
|
188
247
|
setDraftRange(nextRange);
|
|
189
|
-
if (
|
|
190
|
-
|
|
248
|
+
if (options === null || options === void 0 ? void 0 : options.preserveTrack) {
|
|
249
|
+
commitTrackBounds(ensureRangeVisibleOnTrack(nextRange, trackBoundsRef.current));
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
commitTrackBounds(buildTrackRange(nextReferenceDate, clampedWindowDays));
|
|
191
253
|
}
|
|
192
254
|
}
|
|
193
255
|
const getPreviewPercents = React.useCallback((range) => {
|
|
194
256
|
var _a, _b;
|
|
195
257
|
const start = (_a = range.startDate) !== null && _a !== void 0 ? _a : baseReferenceDate;
|
|
196
258
|
const end = (_b = range.endDate) !== null && _b !== void 0 ? _b : start;
|
|
197
|
-
const
|
|
198
|
-
const
|
|
259
|
+
const currentTrackBounds = trackBoundsRef.current;
|
|
260
|
+
const startR = getRatioByDate(start, currentTrackBounds);
|
|
261
|
+
const endR = getRatioByDate(end, currentTrackBounds);
|
|
199
262
|
const left = Math.min(startR, endR) * 100;
|
|
200
263
|
const right = Math.max(startR, endR) * 100;
|
|
201
264
|
const width = Math.max(right - left, 0.5);
|
|
@@ -207,7 +270,7 @@ function RandomDateRangeDialog({ open, value, anchorDate, defaultRangeDays = DEF
|
|
|
207
270
|
startHandle: single ? Math.max(left - 0.8, 0) : left,
|
|
208
271
|
endHandle: single ? Math.min(right + 0.8, 100) : right,
|
|
209
272
|
};
|
|
210
|
-
}, [baseReferenceDate
|
|
273
|
+
}, [baseReferenceDate]);
|
|
211
274
|
const syncPreviewDom = React.useCallback((range) => {
|
|
212
275
|
const percents = getPreviewPercents(range);
|
|
213
276
|
if (selectionRef.current) {
|
|
@@ -231,17 +294,20 @@ function RandomDateRangeDialog({ open, value, anchorDate, defaultRangeDays = DEF
|
|
|
231
294
|
dragPreviewRef.current = draftRange;
|
|
232
295
|
syncPreviewDom(draftRange);
|
|
233
296
|
}, [draftRange, syncPreviewDom]);
|
|
297
|
+
React.useEffect(() => {
|
|
298
|
+
trackBoundsRef.current = trackBounds;
|
|
299
|
+
}, [trackBounds]);
|
|
234
300
|
function resetReferenceFromClientX(clientX) {
|
|
235
301
|
if (!trackRef.current) {
|
|
236
302
|
return;
|
|
237
303
|
}
|
|
238
304
|
const rect = trackRef.current.getBoundingClientRect();
|
|
239
|
-
const ratio =
|
|
305
|
+
const ratio = (clientX - rect.left) / rect.width;
|
|
240
306
|
const nextReferenceDate = getDateByRatio(trackBounds, ratio);
|
|
241
307
|
updateRangeByReference(nextReferenceDate, resolvedDefaultRangeDays, { preserveTrack: true });
|
|
242
308
|
}
|
|
243
309
|
function applyQuickRange(dayCount) {
|
|
244
|
-
updateRangeByReference(referenceDate, dayCount);
|
|
310
|
+
updateRangeByReference(referenceDate, dayCount, { preserveTrack: true });
|
|
245
311
|
}
|
|
246
312
|
function shiftReferenceDateByMonths(monthOffset) {
|
|
247
313
|
updateRangeByReference(addMonthsClamped(referenceDate, monthOffset), windowDays);
|
|
@@ -255,16 +321,17 @@ function RandomDateRangeDialog({ open, value, anchorDate, defaultRangeDays = DEF
|
|
|
255
321
|
pointerIdRef.current = pointerId;
|
|
256
322
|
dragStartRangeRef.current = Object.assign({}, draftRange);
|
|
257
323
|
dragPreviewRef.current = Object.assign({}, draftRange);
|
|
324
|
+
dragStartTrackBoundsRef.current = Object.assign({}, trackBoundsRef.current);
|
|
258
325
|
if (mode === 'window' &&
|
|
259
326
|
clientX !== undefined &&
|
|
260
327
|
trackRef.current &&
|
|
261
328
|
draftRange.startDate &&
|
|
262
329
|
draftRange.endDate &&
|
|
263
|
-
|
|
264
|
-
|
|
330
|
+
dragStartTrackBoundsRef.current.startDate &&
|
|
331
|
+
dragStartTrackBoundsRef.current.endDate) {
|
|
265
332
|
const rect = trackRef.current.getBoundingClientRect();
|
|
266
|
-
const ratio =
|
|
267
|
-
const pointerDate = getDateByRatio(
|
|
333
|
+
const ratio = (clientX - rect.left) / rect.width;
|
|
334
|
+
const pointerDate = getDateByRatio(dragStartTrackBoundsRef.current, ratio);
|
|
268
335
|
windowDragOffsetDaysRef.current = getDaysBetween(draftRange.startDate, pointerDate);
|
|
269
336
|
}
|
|
270
337
|
else {
|
|
@@ -272,36 +339,62 @@ function RandomDateRangeDialog({ open, value, anchorDate, defaultRangeDays = DEF
|
|
|
272
339
|
}
|
|
273
340
|
}
|
|
274
341
|
const buildDraggedRange = React.useCallback((clientX) => {
|
|
275
|
-
|
|
342
|
+
const currentTrackBounds = trackBoundsRef.current;
|
|
343
|
+
const dragStartTrackBounds = dragStartTrackBoundsRef.current;
|
|
344
|
+
if (!dragModeRef.current ||
|
|
345
|
+
!dragStartRangeRef.current ||
|
|
346
|
+
!(dragStartTrackBounds === null || dragStartTrackBounds === void 0 ? void 0 : dragStartTrackBounds.startDate) ||
|
|
347
|
+
!dragStartTrackBounds.endDate ||
|
|
348
|
+
!currentTrackBounds.startDate ||
|
|
349
|
+
!currentTrackBounds.endDate ||
|
|
350
|
+
!trackRef.current) {
|
|
276
351
|
return null;
|
|
277
352
|
}
|
|
278
353
|
const rect = trackRef.current.getBoundingClientRect();
|
|
279
|
-
const ratio =
|
|
280
|
-
const pointerDate =
|
|
354
|
+
const ratio = (clientX - rect.left) / rect.width;
|
|
355
|
+
const pointerDate = getDateByOverflowRatio(dragStartTrackBounds, ratio, rect.width);
|
|
281
356
|
const currentRange = dragStartRangeRef.current;
|
|
282
357
|
if (!currentRange.startDate || !currentRange.endDate) {
|
|
283
358
|
return null;
|
|
284
359
|
}
|
|
285
360
|
if (dragModeRef.current === 'start') {
|
|
286
|
-
const earliestStart = addDays(currentRange.endDate, -
|
|
361
|
+
const earliestStart = addDays(currentRange.endDate, -30);
|
|
287
362
|
const boundedPointerDate = compareDateStrings(pointerDate, earliestStart) < 0 ? earliestStart : pointerDate;
|
|
288
363
|
const nextStart = compareDateStrings(boundedPointerDate, currentRange.endDate) > 0 ? currentRange.endDate : boundedPointerDate;
|
|
289
|
-
|
|
364
|
+
const nextRange = { startDate: nextStart, endDate: currentRange.endDate };
|
|
365
|
+
const nextTrackBounds = ensureRangeVisibleOnTrack(nextRange, currentTrackBounds);
|
|
366
|
+
if (nextTrackBounds !== currentTrackBounds) {
|
|
367
|
+
trackBoundsRef.current = nextTrackBounds;
|
|
368
|
+
setDraftRange(nextRange);
|
|
369
|
+
setTrackBounds(nextTrackBounds);
|
|
370
|
+
}
|
|
371
|
+
return nextRange;
|
|
290
372
|
}
|
|
291
373
|
if (dragModeRef.current === 'end') {
|
|
292
374
|
const latestEnd = addDays(currentRange.startDate, MAX_RANGE_DAYS - 1);
|
|
293
375
|
const boundedPointerDate = compareDateStrings(pointerDate, latestEnd) > 0 ? latestEnd : pointerDate;
|
|
294
376
|
const nextEnd = compareDateStrings(boundedPointerDate, currentRange.startDate) < 0 ? currentRange.startDate : boundedPointerDate;
|
|
295
|
-
|
|
377
|
+
const nextRange = { startDate: currentRange.startDate, endDate: nextEnd };
|
|
378
|
+
const nextTrackBounds = ensureRangeVisibleOnTrack(nextRange, currentTrackBounds);
|
|
379
|
+
if (nextTrackBounds !== currentTrackBounds) {
|
|
380
|
+
trackBoundsRef.current = nextTrackBounds;
|
|
381
|
+
setDraftRange(nextRange);
|
|
382
|
+
setTrackBounds(nextTrackBounds);
|
|
383
|
+
}
|
|
384
|
+
return nextRange;
|
|
296
385
|
}
|
|
297
386
|
const spanDays = getDaysBetween(currentRange.startDate, currentRange.endDate);
|
|
298
|
-
const nextStart =
|
|
299
|
-
startDate: trackBounds.startDate,
|
|
300
|
-
endDate: addDays(trackBounds.endDate, -spanDays),
|
|
301
|
-
});
|
|
387
|
+
const nextStart = addDays(pointerDate, -windowDragOffsetDaysRef.current);
|
|
302
388
|
const nextEnd = addDays(nextStart, spanDays);
|
|
303
|
-
|
|
304
|
-
|
|
389
|
+
const nextRange = { startDate: nextStart, endDate: nextEnd };
|
|
390
|
+
const nextTrackBounds = ensureRangeVisibleOnTrack(nextRange, currentTrackBounds);
|
|
391
|
+
if (nextTrackBounds !== currentTrackBounds) {
|
|
392
|
+
trackBoundsRef.current = nextTrackBounds;
|
|
393
|
+
setDraftRange(nextRange);
|
|
394
|
+
setTrackBounds(nextTrackBounds);
|
|
395
|
+
}
|
|
396
|
+
return nextRange;
|
|
397
|
+
}, []);
|
|
305
398
|
React.useEffect(() => {
|
|
306
399
|
syncPreviewDomRef.current = syncPreviewDom;
|
|
307
400
|
buildDraggedRangeRef.current = buildDraggedRange;
|
|
@@ -315,6 +408,7 @@ function RandomDateRangeDialog({ open, value, anchorDate, defaultRangeDays = DEF
|
|
|
315
408
|
document.body.style.userSelect = '';
|
|
316
409
|
const nextRange = dragPreviewRef.current;
|
|
317
410
|
dragStartRangeRef.current = null;
|
|
411
|
+
dragStartTrackBoundsRef.current = null;
|
|
318
412
|
dragModeRef.current = null;
|
|
319
413
|
pointerIdRef.current = null;
|
|
320
414
|
windowDragOffsetDaysRef.current = 0;
|
|
@@ -322,6 +416,7 @@ function RandomDateRangeDialog({ open, value, anchorDate, defaultRangeDays = DEF
|
|
|
322
416
|
setDraftRange(nextRange);
|
|
323
417
|
setReferenceDate(nextRange.startDate);
|
|
324
418
|
setWindowDays(getInclusiveDayCount(nextRange));
|
|
419
|
+
commitTrackBounds(ensureRangeVisibleOnTrack(nextRange, trackBoundsRef.current));
|
|
325
420
|
}
|
|
326
421
|
}
|
|
327
422
|
React.useEffect(() => {
|
|
@@ -372,76 +467,111 @@ function RandomDateRangeDialog({ open, value, anchorDate, defaultRangeDays = DEF
|
|
|
372
467
|
};
|
|
373
468
|
}, [open]);
|
|
374
469
|
if (!open) {
|
|
375
|
-
return
|
|
470
|
+
return jsxRuntime.jsx(jsxRuntime.Fragment, { children: dialogLoading });
|
|
376
471
|
}
|
|
377
|
-
return reactDom.createPortal(jsxRuntime.jsx("div", { className: "fixed inset-0 z-120 flex select-none items-center justify-center bg-slate-950/60 px-3 py-6 backdrop-blur-sm", children: jsxRuntime.jsx("div", { className: "w-full max-w-2xl overflow-hidden rounded-3xl border border-black/10 bg-white shadow-2xl dark:border-white/10 dark:bg-slate-950", children: jsxRuntime.jsxs("div", { className: "space-y-5 p-4", children: [jsxRuntime.jsxs("div", { className: "relative flex items-center justify-center px-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
472
|
+
return reactDom.createPortal(jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("div", { className: "fixed inset-0 z-120 flex select-none items-center justify-center bg-slate-950/60 px-3 py-6 backdrop-blur-sm", children: jsxRuntime.jsx("div", { className: "w-full max-w-2xl overflow-hidden rounded-3xl border border-black/10 bg-white shadow-2xl dark:border-white/10 dark:bg-slate-950", children: jsxRuntime.jsxs("div", { className: "space-y-5 p-4", children: [jsxRuntime.jsxs("div", { className: "relative flex items-center justify-center px-9 text-center sm:px-16", children: [jsxRuntime.jsx("div", { ref: resultLabelRef, className: "min-w-0 select-none truncate text-base font-semibold text-slate-900 dark:text-white", children: getRangeLabel(draftRange) }), jsxRuntime.jsx("div", { className: "absolute right-0 top-1/2 flex -translate-y-1/2 translate-x-1 items-center sm:translate-x-0", children: jsxRuntime.jsx("button", { type: "button", onClick: () => onOpenChange(false), className: DIALOG_ICON_BUTTON_CLASS_NAME, "aria-label": "Cancel", children: jsxRuntime.jsx(icons.XIcon, { className: "h-4 w-4" }) }) })] }), jsxRuntime.jsxs("div", { className: "space-y-3", children: [jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-2", children: [jsxRuntime.jsxs("div", { className: "flex items-center gap-1", children: [jsxRuntime.jsx("button", Object.assign({ type: "button", onClick: () => {
|
|
473
|
+
flashNavButtonPress('prevYear');
|
|
474
|
+
shiftReferenceDateByYears(-1);
|
|
475
|
+
}, className: utils.cn(DIALOG_NAV_BUTTON_CLASS_NAME, pressedNavButton === 'prevYear'
|
|
476
|
+
? DIALOG_NAV_BUTTON_PRESSED_CLASS_NAME
|
|
477
|
+
: DIALOG_NAV_BUTTON_REST_CLASS_NAME) }, getNavButtonPressProps('prevYear'), { "aria-label": "Previous year", title: "Previous year", children: jsxRuntime.jsx(icons.ChevronsLeftIcon, { className: "h-4 w-4" }) })), jsxRuntime.jsx("button", Object.assign({ type: "button", onClick: () => {
|
|
478
|
+
flashNavButtonPress('prevMonth');
|
|
479
|
+
shiftReferenceDateByMonths(-1);
|
|
480
|
+
}, className: utils.cn(DIALOG_NAV_BUTTON_CLASS_NAME, pressedNavButton === 'prevMonth'
|
|
481
|
+
? DIALOG_NAV_BUTTON_PRESSED_CLASS_NAME
|
|
482
|
+
: DIALOG_NAV_BUTTON_REST_CLASS_NAME) }, getNavButtonPressProps('prevMonth'), { "aria-label": "Previous month", title: "Previous month", children: jsxRuntime.jsx(icons.ChevronLeftIcon, { className: "h-4 w-4" }) }))] }), jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [jsxRuntime.jsx("button", { type: "button", onClick: () => {
|
|
483
|
+
const nextRange = {
|
|
484
|
+
startDate: baseReferenceDate,
|
|
485
|
+
endDate: addDays(baseReferenceDate, resolvedDefaultRangeDays - 1),
|
|
486
|
+
};
|
|
487
|
+
setReferenceDate(baseReferenceDate);
|
|
488
|
+
commitTrackBounds(buildTrackRange(baseReferenceDate, resolvedDefaultRangeDays));
|
|
489
|
+
setWindowDays(resolvedDefaultRangeDays);
|
|
490
|
+
setDraftRange(nextRange);
|
|
491
|
+
onClear === null || onClear === void 0 ? void 0 : onClear(nextRange);
|
|
492
|
+
}, className: DIALOG_PILL_BUTTON_CLASS_NAME, children: "Today" }), jsxRuntime.jsx("button", { type: "button", onClick: () => {
|
|
493
|
+
const nextRange = {
|
|
494
|
+
startDate: getMonthStart(referenceDate),
|
|
495
|
+
endDate: addDays(getMonthStart(referenceDate), MAX_RANGE_DAYS - 1),
|
|
496
|
+
};
|
|
497
|
+
const clampedEndDate = compareDateStrings(nextRange.endDate, getMonthEnd(referenceDate)) > 0
|
|
498
|
+
? getMonthEnd(referenceDate)
|
|
499
|
+
: nextRange.endDate;
|
|
500
|
+
const normalizedRange = {
|
|
501
|
+
startDate: nextRange.startDate,
|
|
502
|
+
endDate: clampedEndDate,
|
|
503
|
+
};
|
|
504
|
+
setDraftRange(normalizedRange);
|
|
505
|
+
setWindowDays(getInclusiveDayCount(normalizedRange));
|
|
506
|
+
setReferenceDate(normalizedRange.startDate);
|
|
507
|
+
commitTrackBounds(buildTrackRange(normalizedRange.startDate, getInclusiveDayCount(normalizedRange)));
|
|
508
|
+
}, className: DIALOG_PILL_BUTTON_CLASS_NAME, children: "This Month" })] }), jsxRuntime.jsxs("div", { className: "flex items-center gap-1", children: [jsxRuntime.jsx("button", Object.assign({ type: "button", onClick: () => {
|
|
509
|
+
flashNavButtonPress('nextMonth');
|
|
510
|
+
shiftReferenceDateByMonths(1);
|
|
511
|
+
}, className: utils.cn(DIALOG_NAV_BUTTON_CLASS_NAME, pressedNavButton === 'nextMonth'
|
|
512
|
+
? DIALOG_NAV_BUTTON_PRESSED_CLASS_NAME
|
|
513
|
+
: DIALOG_NAV_BUTTON_REST_CLASS_NAME) }, getNavButtonPressProps('nextMonth'), { "aria-label": "Next month", title: "Next month", children: jsxRuntime.jsx(icons.ChevronRightIcon, { className: "h-4 w-4" }) })), jsxRuntime.jsx("button", Object.assign({ type: "button", onClick: () => {
|
|
514
|
+
flashNavButtonPress('nextYear');
|
|
515
|
+
shiftReferenceDateByYears(1);
|
|
516
|
+
}, className: utils.cn(DIALOG_NAV_BUTTON_CLASS_NAME, pressedNavButton === 'nextYear'
|
|
517
|
+
? DIALOG_NAV_BUTTON_PRESSED_CLASS_NAME
|
|
518
|
+
: DIALOG_NAV_BUTTON_REST_CLASS_NAME) }, getNavButtonPressProps('nextYear'), { "aria-label": "Next year", title: "Next year", children: jsxRuntime.jsx(icons.ChevronsRightIcon, { className: "h-4 w-4" }) }))] })] }), jsxRuntime.jsxs("div", { className: "relative h-21", children: [jsxRuntime.jsxs("div", { className: "absolute inset-x-0 top-0 grid grid-cols-[3.5rem_minmax(0,1fr)_3.5rem] items-center gap-2 text-sm font-semibold text-slate-500 dark:text-slate-400", children: [jsxRuntime.jsxs("span", { className: "relative block select-none text-center", children: [jsxRuntime.jsx(RollingMonthLabel, { value: leftMonthLabel }), jsxRuntime.jsx("span", { className: "pointer-events-none absolute left-1/2 top-7 h-2.5 w-2.5 -translate-x-1/2 rounded-full bg-slate-400 dark:bg-slate-500" }), jsxRuntime.jsx("span", { className: "pointer-events-none absolute left-1/2 top-[1.95rem] h-9 w-0.5 -translate-x-1/2 bg-slate-400 dark:bg-slate-500" })] }), jsxRuntime.jsx("div", { className: "flex min-w-0 items-center justify-center gap-1", children: [
|
|
519
|
+
{ label: '+7', days: 7 },
|
|
520
|
+
{ label: '+10', days: 10 },
|
|
521
|
+
{ label: '+15', days: 15 },
|
|
522
|
+
{ label: '+30', days: 30 },
|
|
523
|
+
].map((item) => (jsxRuntime.jsx("button", { type: "button", onClick: () => applyQuickRange(item.days), className: DIALOG_PILL_BUTTON_COMPACT_CLASS_NAME, children: item.label }, item.label))) }), jsxRuntime.jsxs("span", { className: "relative block select-none text-center", children: [jsxRuntime.jsx(RollingMonthLabel, { value: rightMonthLabel }), jsxRuntime.jsx("span", { className: "pointer-events-none absolute right-1/2 top-7 h-2.5 w-2.5 translate-x-1/2 rounded-full bg-slate-400 dark:bg-slate-500" }), jsxRuntime.jsx("span", { className: "pointer-events-none absolute right-1/2 top-[1.95rem] h-9 w-0.5 translate-x-1/2 bg-slate-400 dark:bg-slate-500" })] })] }), jsxRuntime.jsx("div", { className: "absolute inset-x-0 top-[3.35rem] h-10 touch-none", onDoubleClick: (event) => {
|
|
524
|
+
event.stopPropagation();
|
|
525
|
+
resetReferenceFromClientX(event.clientX);
|
|
526
|
+
}, children: jsxRuntime.jsxs("div", { ref: trackRef, className: "absolute inset-x-0 top-1/2 h-3 -translate-y-1/2 rounded-full bg-slate-400/30 dark:bg-slate-500/25", children: [jsxRuntime.jsx("div", { "aria-hidden": "true", className: "pointer-events-none absolute inset-x-0 top-1/2 grid h-8 -translate-y-1/2 items-center", style: { gridTemplateColumns: `repeat(${trackTickCount}, minmax(0, 1fr))` }, children: Array.from({ length: trackTickCount }, (_, index) => {
|
|
527
|
+
return (jsxRuntime.jsx("span", { className: "flex justify-center", children: jsxRuntime.jsx("span", { className: utils.cn('rounded-full bg-slate-400/55 dark:bg-slate-500/55', 'h-3 w-px') }) }, index));
|
|
528
|
+
}) }), jsxRuntime.jsx("div", { ref: selectionRef, className: "absolute top-1/2 z-10 h-4 touch-none -translate-y-1/2 overflow-visible rounded-md border bg-white dark:bg-slate-950", style: { left: `${leftPercent}%`, width: `${widthPercent}%`, borderColor: lib.themeSvgIconColor }, onPointerDown: (event) => {
|
|
529
|
+
event.stopPropagation();
|
|
530
|
+
beginDrag('window', event.pointerId, event.clientX);
|
|
531
|
+
}, children: jsxRuntime.jsx("div", { ref: selectionDaysRef, className: "pointer-events-none absolute inset-0 z-30 flex select-none items-center justify-center text-xs font-semibold text-sky-700 dark:text-sky-100", children: `${getInclusiveDayCount(draftRange)}D` }) }), jsxRuntime.jsx("button", { ref: startHandleRef, type: "button", className: "absolute top-1/2 z-20 h-6 w-6 touch-none -translate-x-1/2 -translate-y-1/2 rounded-full border bg-white shadow-sm dark:bg-slate-950", style: { left: `${startHandlePercent}%`, borderColor: lib.themeSvgIconColor }, onPointerDown: (event) => {
|
|
532
|
+
event.stopPropagation();
|
|
533
|
+
beginDrag('start', event.pointerId);
|
|
534
|
+
}, "aria-label": "Adjust start date" }), jsxRuntime.jsx("button", { ref: endHandleRef, type: "button", className: "absolute top-1/2 z-20 h-6 w-6 touch-none -translate-x-1/2 -translate-y-1/2 rounded-full border bg-white shadow-sm dark:bg-slate-950", style: { left: `${endHandlePercent}%`, borderColor: lib.themeSvgIconColor }, onPointerDown: (event) => {
|
|
535
|
+
event.stopPropagation();
|
|
536
|
+
beginDrag('end', event.pointerId);
|
|
537
|
+
}, "aria-label": "Adjust end date" })] }) })] }), jsxRuntime.jsx("div", { className: "flex justify-end", children: jsxRuntime.jsx(xButton.XButton, { type: "single", variant: "soft", minWidth: "min-w-[110px]", className: "w-auto", iconClassName: "h-4 w-4", button: {
|
|
538
|
+
icon: jsxRuntime.jsx(icons.CheckCheckIcon, {}),
|
|
539
|
+
text: 'Apply',
|
|
540
|
+
disabled: !draftRange.startDate || !draftRange.endDate,
|
|
541
|
+
onClick: () => {
|
|
542
|
+
void runDialogAction('confirm', handleApply);
|
|
543
|
+
},
|
|
544
|
+
} }) })] })] }) }) }), jsxRuntime.jsx("style", { children: `
|
|
545
|
+
@keyframes rd-date-range-month-in {
|
|
546
|
+
from {
|
|
547
|
+
opacity: 0;
|
|
548
|
+
transform: translateY(-0.45rem);
|
|
549
|
+
}
|
|
550
|
+
to {
|
|
551
|
+
opacity: 1;
|
|
552
|
+
transform: translateY(0);
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
@keyframes rd-date-range-month-out {
|
|
557
|
+
from {
|
|
558
|
+
opacity: 1;
|
|
559
|
+
transform: translateY(0);
|
|
560
|
+
}
|
|
561
|
+
to {
|
|
562
|
+
opacity: 0;
|
|
563
|
+
transform: translateY(0.45rem);
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
.rd-date-range-month-in {
|
|
568
|
+
animation: rd-date-range-month-in 180ms ease-out both;
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
.rd-date-range-month-out {
|
|
572
|
+
animation: rd-date-range-month-out 180ms ease-out both;
|
|
573
|
+
}
|
|
574
|
+
` }), dialogLoading] }), document.body);
|
|
445
575
|
}
|
|
446
576
|
|
|
447
577
|
exports.RandomDateRangeDialog = RandomDateRangeDialog;
|