@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.
Files changed (102) hide show
  1. package/dist/fuma/mdx/cheet-table.d.ts +13 -0
  2. package/dist/fuma/mdx/cheet-table.js +295 -0
  3. package/dist/fuma/mdx/cheet-table.mjs +293 -0
  4. package/dist/fuma/mdx/index.d.ts +1 -0
  5. package/dist/fuma/mdx/index.js +2 -0
  6. package/dist/fuma/mdx/index.mjs +1 -0
  7. package/dist/fuma/server/features/widgets.js +2 -0
  8. package/dist/fuma/server/features/widgets.mjs +2 -0
  9. package/dist/lib/fuma-schema-check-util.d.ts +1 -1
  10. package/dist/main/alert-dialog/confirm-dialog.d.ts +2 -1
  11. package/dist/main/alert-dialog/confirm-dialog.js +3 -3
  12. package/dist/main/alert-dialog/confirm-dialog.mjs +4 -4
  13. package/dist/main/alert-dialog/dialog-loading-action.d.ts +2 -1
  14. package/dist/main/alert-dialog/dialog-loading-action.js +6 -3
  15. package/dist/main/alert-dialog/dialog-loading-action.mjs +6 -3
  16. package/dist/main/alert-dialog/dialog-styles.d.ts +4 -2
  17. package/dist/main/alert-dialog/dialog-styles.js +8 -4
  18. package/dist/main/alert-dialog/dialog-styles.mjs +7 -5
  19. package/dist/main/alert-dialog/high-priority-confirm-dialog.d.ts +2 -1
  20. package/dist/main/alert-dialog/high-priority-confirm-dialog.js +7 -7
  21. package/dist/main/alert-dialog/high-priority-confirm-dialog.mjs +8 -8
  22. package/dist/main/alert-dialog/info-dialog.d.ts +2 -1
  23. package/dist/main/alert-dialog/info-dialog.js +3 -3
  24. package/dist/main/alert-dialog/info-dialog.mjs +4 -4
  25. package/dist/main/alert-dialog/undoable-confirm-dialog.d.ts +2 -1
  26. package/dist/main/alert-dialog/undoable-confirm-dialog.js +4 -4
  27. package/dist/main/alert-dialog/undoable-confirm-dialog.mjs +5 -5
  28. package/dist/main/anime/anime-beam-frame.d.ts +3 -0
  29. package/dist/main/anime/anime-beam-frame.js +63 -0
  30. package/dist/main/anime/anime-beam-frame.mjs +61 -0
  31. package/dist/main/anime/anime-spiral-loading.d.ts +10 -0
  32. package/dist/main/anime/anime-spiral-loading.js +77 -0
  33. package/dist/main/anime/anime-spiral-loading.mjs +75 -0
  34. package/dist/main/anime/index.d.ts +2 -0
  35. package/dist/main/anime/index.js +10 -0
  36. package/dist/main/anime/index.mjs +3 -0
  37. package/dist/main/beam-frame/animate.d.ts +3 -0
  38. package/dist/main/beam-frame/animate.js +63 -0
  39. package/dist/main/beam-frame/animate.mjs +61 -0
  40. package/dist/main/beam-frame/beam-frame.d.ts +4 -0
  41. package/dist/main/beam-frame/beam-frame.js +262 -0
  42. package/dist/main/beam-frame/beam-frame.mjs +258 -0
  43. package/dist/main/beam-frame/index.d.ts +4 -0
  44. package/dist/main/beam-frame/index.js +11 -0
  45. package/dist/main/beam-frame/index.mjs +3 -0
  46. package/dist/main/beam-frame/motion.d.ts +3 -0
  47. package/dist/main/beam-frame/motion.js +61 -0
  48. package/dist/main/beam-frame/motion.mjs +59 -0
  49. package/dist/main/beam-frame/share-config.d.ts +54 -0
  50. package/dist/main/beam-frame/share-config.js +161 -0
  51. package/dist/main/beam-frame/share-config.mjs +152 -0
  52. package/dist/main/beam-frame-config.d.ts +54 -0
  53. package/dist/main/beam-frame-config.js +161 -0
  54. package/dist/main/beam-frame-config.mjs +152 -0
  55. package/dist/main/calendar/random-date-range-dialog.d.ts +5 -2
  56. package/dist/main/calendar/random-date-range-dialog.js +239 -109
  57. package/dist/main/calendar/random-date-range-dialog.mjs +242 -112
  58. package/dist/main/cta.js +17 -1
  59. package/dist/main/cta.mjs +18 -2
  60. package/dist/main/delayed-img.d.ts +1 -1
  61. package/dist/main/delayed-img.js +8 -5
  62. package/dist/main/delayed-img.mjs +8 -5
  63. package/dist/main/info-tooltip.js +70 -9
  64. package/dist/main/info-tooltip.mjs +70 -9
  65. package/dist/main/loading-frame/index.d.ts +1 -0
  66. package/dist/main/loading.d.ts +2 -1
  67. package/dist/main/loading.js +64 -26
  68. package/dist/main/loading.mjs +64 -26
  69. package/dist/main/motion/index.d.ts +1 -0
  70. package/dist/main/motion/index.js +9 -0
  71. package/dist/main/motion/index.mjs +2 -0
  72. package/dist/main/motion/motion-beam-frame.d.ts +3 -0
  73. package/dist/main/motion/motion-beam-frame.js +61 -0
  74. package/dist/main/motion/motion-beam-frame.mjs +59 -0
  75. package/dist/main/snake-loading-frame.d.ts +7 -3
  76. package/dist/main/snake-loading-frame.js +44 -252
  77. package/dist/main/snake-loading-frame.mjs +46 -254
  78. package/package.json +16 -5
  79. package/src/fuma/mdx/cheet-table.tsx +650 -0
  80. package/src/fuma/mdx/index.ts +1 -0
  81. package/src/fuma/server/features/widgets.tsx +2 -0
  82. package/src/main/alert-dialog/confirm-dialog.tsx +5 -2
  83. package/src/main/alert-dialog/dialog-loading-action.tsx +22 -5
  84. package/src/main/alert-dialog/dialog-styles.ts +13 -3
  85. package/src/main/alert-dialog/high-priority-confirm-dialog.tsx +29 -24
  86. package/src/main/alert-dialog/info-dialog.tsx +5 -2
  87. package/src/main/alert-dialog/undoable-confirm-dialog.tsx +21 -18
  88. package/src/main/anime/anime-beam-frame.tsx +128 -0
  89. package/src/main/anime/anime-spiral-loading.tsx +123 -0
  90. package/src/main/anime/index.ts +9 -0
  91. package/src/main/beam-frame-config.tsx +341 -0
  92. package/src/main/calendar/random-date-range-dialog.tsx +242 -74
  93. package/src/main/cta.tsx +50 -21
  94. package/src/main/delayed-img.tsx +9 -4
  95. package/src/main/info-tooltip.tsx +116 -20
  96. package/src/main/loading-frame/index.ts +4 -0
  97. package/src/main/loading.tsx +75 -24
  98. package/src/main/motion/index.ts +8 -0
  99. package/src/main/motion/motion-beam-frame.tsx +137 -0
  100. package/src/main/snake-loading-frame.tsx +95 -496
  101. package/src/styles/cta.css +21 -4
  102. 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 = 30;
13
- const TRACK_MIN_DAYS = 45;
14
- const TRACK_PADDING_DAYS = 20;
15
- const DIALOG_ICON_BUTTON_CLASS_NAME = 'inline-flex h-8 w-8 items-center justify-center rounded-full border border-black/10 bg-white text-slate-500 transition duration-150 hover:border-black/20 hover:bg-black/5 hover:text-slate-900 dark:border-white/10 dark:bg-slate-950 dark:text-slate-300 dark:hover:bg-white/5 dark:hover:text-white';
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 resolvedTotalDays = Math.max(TRACK_MIN_DAYS, resolvedWindowDays + TRACK_PADDING_DAYS);
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, resolvedTotalDays - 1);
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 RandomDateRangeDialog({ open, value, anchorDate, defaultRangeDays = DEFAULT_RANGE_DAYS, onOpenChange, onApply, onClear, }) {
122
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
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 = Math.max(getDaysBetween((_e = trackBounds.startDate) !== null && _e !== void 0 ? _e : baseReferenceDate, (_f = trackBounds.endDate) !== null && _f !== void 0 ? _f : baseReferenceDate) + 1, 2);
157
- const monthLabels = React.useMemo(() => {
158
- const values = [trackBounds.startDate, trackBounds.endDate]
159
- .filter((item) => Boolean(item))
160
- .map((item) => formatMonthShort(item));
161
- return [...new Set(values)];
162
- }, [trackBounds.endDate, trackBounds.startDate]);
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
- setTrackBounds(buildTrackRange(baseReferenceDate, resolvedDefaultRangeDays));
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 (!(options === null || options === void 0 ? void 0 : options.preserveTrack)) {
190
- setTrackBounds(buildTrackRange(nextReferenceDate, clampedWindowDays));
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 startR = getRatioByDate(start, trackBounds);
198
- const endR = getRatioByDate(end, trackBounds);
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, trackBounds]);
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 = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));
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
- trackBounds.startDate &&
264
- trackBounds.endDate) {
330
+ dragStartTrackBoundsRef.current.startDate &&
331
+ dragStartTrackBoundsRef.current.endDate) {
265
332
  const rect = trackRef.current.getBoundingClientRect();
266
- const ratio = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));
267
- const pointerDate = getDateByRatio(trackBounds, ratio);
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
- if (!dragModeRef.current || !dragStartRangeRef.current || !trackBounds.startDate || !trackBounds.endDate || !trackRef.current) {
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 = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));
280
- const pointerDate = getDateByRatio(trackBounds, ratio);
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, -29);
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
- return { startDate: nextStart, endDate: currentRange.endDate };
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
- return { startDate: currentRange.startDate, endDate: nextEnd };
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 = clampDateToRange(addDays(pointerDate, -windowDragOffsetDaysRef.current), {
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
- return { startDate: nextStart, endDate: nextEnd };
304
- }, [trackBounds]);
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 null;
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-16 text-center", children: [jsxRuntime.jsx("div", { ref: resultLabelRef, className: "select-none text-base font-semibold text-slate-900 dark:text-white", children: getRangeLabel(draftRange) }), jsxRuntime.jsxs("div", { className: "absolute right-0 top-1/2 flex -translate-y-1/2 items-center gap-2", 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.jsx("button", { type: "button", onClick: () => {
378
- onApply(draftRange);
379
- onOpenChange(false);
380
- }, disabled: !draftRange.startDate || !draftRange.endDate, className: utils.cn(DIALOG_ICON_BUTTON_CLASS_NAME, 'text-slate-700 dark:text-slate-100', 'disabled:cursor-not-allowed disabled:opacity-40 disabled:hover:border-black/10 disabled:hover:bg-white disabled:hover:text-slate-700 dark:disabled:hover:border-white/10 dark:disabled:hover:bg-slate-950 dark:disabled:hover:text-slate-100'), "aria-label": "Apply", children: jsxRuntime.jsx(icons.CheckCheckIcon, { className: "h-4 w-4" }) })] })] }), jsxRuntime.jsxs("div", { className: "space-y-4", 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: () => {
381
- flashNavButtonPress('prevYear');
382
- shiftReferenceDateByYears(-1);
383
- }, className: utils.cn(DIALOG_NAV_BUTTON_CLASS_NAME, pressedNavButton === 'prevYear'
384
- ? DIALOG_NAV_BUTTON_PRESSED_CLASS_NAME
385
- : 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: () => {
386
- flashNavButtonPress('prevMonth');
387
- shiftReferenceDateByMonths(-1);
388
- }, className: utils.cn(DIALOG_NAV_BUTTON_CLASS_NAME, pressedNavButton === 'prevMonth'
389
- ? DIALOG_NAV_BUTTON_PRESSED_CLASS_NAME
390
- : 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: () => {
391
- const nextRange = {
392
- startDate: baseReferenceDate,
393
- endDate: addDays(baseReferenceDate, resolvedDefaultRangeDays - 1),
394
- };
395
- setReferenceDate(baseReferenceDate);
396
- setTrackBounds(buildTrackRange(baseReferenceDate, resolvedDefaultRangeDays));
397
- setWindowDays(resolvedDefaultRangeDays);
398
- setDraftRange(nextRange);
399
- onClear === null || onClear === void 0 ? void 0 : onClear(nextRange);
400
- }, className: DIALOG_PILL_BUTTON_CLASS_NAME, children: "Current Day" }), jsxRuntime.jsx("button", { type: "button", onClick: () => {
401
- const nextRange = {
402
- startDate: getMonthStart(referenceDate),
403
- endDate: addDays(getMonthStart(referenceDate), MAX_RANGE_DAYS - 1),
404
- };
405
- const clampedEndDate = compareDateStrings(nextRange.endDate, getMonthEnd(referenceDate)) > 0
406
- ? getMonthEnd(referenceDate)
407
- : nextRange.endDate;
408
- const normalizedRange = {
409
- startDate: nextRange.startDate,
410
- endDate: clampedEndDate,
411
- };
412
- setDraftRange(normalizedRange);
413
- setWindowDays(getInclusiveDayCount(normalizedRange));
414
- setTrackBounds(buildTrackRange(normalizedRange.startDate, getInclusiveDayCount(normalizedRange)));
415
- }, 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: () => {
416
- flashNavButtonPress('nextMonth');
417
- shiftReferenceDateByMonths(1);
418
- }, className: utils.cn(DIALOG_NAV_BUTTON_CLASS_NAME, pressedNavButton === 'nextMonth'
419
- ? DIALOG_NAV_BUTTON_PRESSED_CLASS_NAME
420
- : 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: () => {
421
- flashNavButtonPress('nextYear');
422
- shiftReferenceDateByYears(1);
423
- }, className: utils.cn(DIALOG_NAV_BUTTON_CLASS_NAME, pressedNavButton === 'nextYear'
424
- ? DIALOG_NAV_BUTTON_PRESSED_CLASS_NAME
425
- : 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-24", 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: [(_g = monthLabels[0]) !== null && _g !== void 0 ? _g : formatMonthShort((_h = trackBounds.startDate) !== null && _h !== void 0 ? _h : baseReferenceDate), 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: [
426
- { label: '+7', days: 7 },
427
- { label: '+10', days: 10 },
428
- { label: '+15', days: 15 },
429
- { label: '+30', days: 30 },
430
- ].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: [(_j = monthLabels[1]) !== null && _j !== void 0 ? _j : formatMonthShort((_k = trackBounds.endDate) !== null && _k !== void 0 ? _k : baseReferenceDate), 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) => {
431
- event.stopPropagation();
432
- resetReferenceFromClientX(event.clientX);
433
- }, 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) => {
434
- 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));
435
- }) }), 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 border-sky-500 bg-white dark:border-sky-300 dark:bg-slate-950", style: { left: `${leftPercent}%`, width: `${widthPercent}%` }, onPointerDown: (event) => {
436
- event.stopPropagation();
437
- beginDrag('window', event.pointerId, event.clientX);
438
- }, 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 border-sky-500 bg-white shadow-sm dark:border-sky-300 dark:bg-slate-950", style: { left: `${startHandlePercent}%` }, onPointerDown: (event) => {
439
- event.stopPropagation();
440
- beginDrag('start', event.pointerId);
441
- }, "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 border-sky-500 bg-white shadow-sm dark:border-sky-300 dark:bg-slate-950", style: { left: `${endHandlePercent}%` }, onPointerDown: (event) => {
442
- event.stopPropagation();
443
- beginDrag('end', event.pointerId);
444
- }, "aria-label": "Adjust end date" })] }) })] })] })] }) }) }), document.body);
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;