rangeflow 1.0.14 → 1.0.15

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 CHANGED
@@ -4,6 +4,13 @@ A fancy date range picker built with React and Tailwind.
4
4
 
5
5
  RangeFlow gives you a date range picker with a smooth slider, quick range tabs, and a popover calendar. It is built for React 18 and 19, ships with a tiny CSS theming layer, and does not touch your app's global styles.
6
6
 
7
+ <a href="https://rangeflow.raminmousavi.dev" target="_blank">
8
+ <picture>
9
+ <source media="(prefers-color-scheme: dark)" srcset="https://raminmousavi.dev/blog-assets/post-006/rangeflow-hero-dark.png?v=1.0">
10
+ <img alt="RangeFlow Hero" src="https://raminmousavi.dev/blog-assets/post-006/rangeflow-hero.png?v=1.0">
11
+ </picture>
12
+ </a>
13
+
7
14
  ## Features
8
15
 
9
16
  - Drag based range slider that feels natural on mouse and touch.
package/dist/index.js CHANGED
@@ -8,13 +8,13 @@ import y, { clsx as b } from "clsx";
8
8
  import { useStore as x } from "zustand";
9
9
  import { KeyboardSensor as ne, PointerSensor as re } from "@dnd-kit/dom";
10
10
  import { Group as ie, Panel as S, Separator as C } from "react-resizable-panels";
11
- import { Modifier as ae, configurator as w } from "@dnd-kit/abstract";
12
- import { Rectangle as T } from "@dnd-kit/geometry";
13
- import { effect as E, signal as D } from "@dnd-kit/state";
14
- import { DayPicker as oe } from "react-day-picker";
15
- import * as O from "@radix-ui/react-popover";
11
+ import { Modifier as ae, configurator as oe } from "@dnd-kit/abstract";
12
+ import { Rectangle as w } from "@dnd-kit/geometry";
13
+ import { effect as T, signal as E } from "@dnd-kit/state";
14
+ import { DayPicker as se } from "react-day-picker";
15
+ import * as D from "@radix-ui/react-popover";
16
16
  //#region src/package/rangeflow/constants/date-ranges.ts
17
- var se = [
17
+ var ce = [
18
18
  {
19
19
  label: "2 Weeks",
20
20
  from: d().subtract(1, "weeks").toDate(),
@@ -40,29 +40,40 @@ var se = [
40
40
  from: d().subtract(6, "months").toDate(),
41
41
  to: d().add(6, "months").toDate()
42
42
  }
43
- ], k = "left-spacer", A = "right-spacer", j = "slider-track-thumb";
43
+ ], O = "left-spacer", k = "right-spacer", A = "slider-track-thumb";
44
44
  //#endregion
45
45
  //#region src/package/rangeflow/utils/clamp.ts
46
- function M(e, t, n) {
46
+ function j(e, t, n) {
47
47
  return Math.min(Math.max(e, t), n);
48
48
  }
49
49
  //#endregion
50
50
  //#region src/package/rangeflow/utils/interpolate.ts
51
- function N(e, t) {
51
+ function M(e, t) {
52
52
  return (n) => {
53
53
  let [r, i] = e, [a, o] = t;
54
54
  return a + (n - r) / (i - r) * (o - a);
55
55
  };
56
56
  }
57
57
  //#endregion
58
+ //#region src/package/rangeflow/utils/normalize-date-range.ts
59
+ function N(e) {
60
+ let t = d().startOf("day"), n = d(e.from), r = d(e.to), i = n.isValid() ? n.startOf("day") : t, a = r.isValid() ? r.startOf("day") : i;
61
+ return a.isBefore(i) && (a = i), {
62
+ start: i,
63
+ end: a
64
+ };
65
+ }
66
+ //#endregion
58
67
  //#region src/package/rangeflow/utils/create-slider-values.ts
59
- var ce = N([1, 100], [5, 100]);
68
+ var le = M([1, 100], [5, 100]);
60
69
  function P(e, t) {
61
- let n = d(e.from).startOf("day"), r = d(e.to).startOf("day").diff(n, "day"), i = d(t.from).startOf("day"), a = d(t.to).startOf("day"), o = Math.max(i.diff(n, "day"), 0), s = (a.diff(i, "day") + 1) * 100 / r, c = o * 100 / r, l = Math.max(ce(s), 5), u = M(c - (l - s), 0, Math.max(100 - l, 0));
70
+ let { start: n, end: r } = N(e), i = Math.max(r.diff(n, "day") + 1, 1), a = d(t.from), o = d(t.to), s = a.isValid() ? a.startOf("day") : n, c = o.isValid() ? o.startOf("day") : s;
71
+ c.isBefore(s) && (c = s);
72
+ let l = Math.max(Math.min(s.diff(n, "day"), i - 1), 0), u = Math.max(Math.min(c.diff(s, "day") + 1, i), 1) * 100 / i, f = l * 100 / i, p = Math.max(le(u), 5), m = j(f - (p - u), 0, Math.max(100 - p, 0));
62
73
  return {
63
- size: l,
64
- left: u,
65
- right: Math.max(100 - u - l, 0)
74
+ size: p,
75
+ left: m,
76
+ right: Math.max(100 - m - p, 0)
66
77
  };
67
78
  }
68
79
  //#endregion
@@ -108,7 +119,7 @@ var z = (e) => f()((t) => ({
108
119
  })), B = e(null);
109
120
  //#endregion
110
121
  //#region src/package/rangeflow/context/ContextProvider.tsx
111
- function V({ children: e, defaultRange: t, defaultSelected: n, disabled: r, duration: i, calendar: a = !0, ranges: o = se, CalendarProps: s, Slots: l, api: d, onChange: f }) {
122
+ function V({ children: e, defaultRange: t, defaultSelected: n, disabled: r, duration: i, calendar: a = !0, ranges: o = ce, CalendarProps: s, Slots: l, api: d, onChange: f }) {
112
123
  let m = L(), h = I({ onChange: f }), g = R(l), [_] = u(() => z({
113
124
  ranges: o,
114
125
  disabled: r,
@@ -187,7 +198,10 @@ var H = n(({ value: e, delay: t }) => {
187
198
  //#endregion
188
199
  //#region src/package/rangeflow/hooks/use-days-in-range.ts
189
200
  function W(e) {
190
- return c(() => d(e.to).diff(d(e.from), "day"), [e.from, e.to]);
201
+ return c(() => {
202
+ let { start: t, end: n } = N(e);
203
+ return Math.max(n.diff(t, "day") + 1, 1);
204
+ }, [e.from, e.to]);
191
205
  }
192
206
  //#endregion
193
207
  //#region src/package/rangeflow/hooks/use-rangeflow-slots.ts
@@ -201,18 +215,18 @@ function K(e) {
201
215
  }
202
216
  //#endregion
203
217
  //#region src/package/rangeflow/components/DateSlider/DateLabelsTrack.tsx
204
- function le(e) {
218
+ function ue(e) {
205
219
  return e > 120 ? "MMM YYYY" : e > 7 ? "MMM DD" : "ddd DD";
206
220
  }
207
- function ue(e) {
221
+ function de(e) {
208
222
  return e > 120 ? 8 : e > 30 ? 10 : e > 7 ? 8 : Math.min(e + 1, 8);
209
223
  }
210
- var de = n(() => {
224
+ var fe = n(() => {
211
225
  let e = K((e) => e.range), n = W(e), { DateLabelsTrack: r } = G(), i = c(() => {
212
- let t = le(n), r = ue(n), i = d(e.from), a = d(e.to).diff(i);
226
+ let t = ue(n), r = Math.max(de(n), 1), { start: i, end: a } = N(e), o = a.diff(i), s = Math.max(r - 1, 1);
213
227
  return Array.from({ length: r }, (e, n) => {
214
- let o = n / (r - 1);
215
- return i.add(a * o, "ms").format(t);
228
+ let r = n / s;
229
+ return i.add(o * r, "ms").format(t);
216
230
  });
217
231
  }, [
218
232
  e.from,
@@ -234,7 +248,7 @@ function q() {
234
248
  }
235
249
  //#endregion
236
250
  //#region src/package/rangeflow/icons/DoubleChevronLeftIcon.tsx
237
- function fe() {
251
+ function pe() {
238
252
  return /* @__PURE__ */ p("svg", {
239
253
  fill: "none",
240
254
  height: "15",
@@ -251,7 +265,7 @@ function fe() {
251
265
  }
252
266
  //#endregion
253
267
  //#region src/package/rangeflow/icons/DoubleChevronRightIcon.tsx
254
- function pe() {
268
+ function me() {
255
269
  return /* @__PURE__ */ p("svg", {
256
270
  fill: "none",
257
271
  height: "15",
@@ -268,7 +282,7 @@ function pe() {
268
282
  }
269
283
  //#endregion
270
284
  //#region src/package/rangeflow/components/DateSlider/DateTickers.tsx
271
- var me = n(() => {
285
+ var he = n(() => {
272
286
  let { DateTickers: e } = G(), n = Math.min(Math.max(70, W(K((e) => e.range))), 100);
273
287
  return e ? t(e) : /* @__PURE__ */ p("div", {
274
288
  className: "rangeflow-tickers flex items-center gap-2",
@@ -289,15 +303,15 @@ function J({ children: e, onClick: t }) {
289
303
  }
290
304
  //#endregion
291
305
  //#region src/package/rangeflow/utils/derive-selection-from-layout.ts
292
- var he = N([5, 100], [1, 100]);
293
- function ge(e, t) {
294
- let n = e[j], r = e[k], i = e[A], a = d(t.from).startOf("day"), o = d(t.to).startOf("day").diff(a, "day"), s = he(n), c = r + (n - s), l = Math.round(n) <= 5 ? 1 : Math.max(Math.round(s * o / 100), 1), u = M(Math.round(c * o / 100), 0, Math.max(o - l, 0));
306
+ var ge = M([5, 100], [1, 100]);
307
+ function _e(e, t) {
308
+ let n = e[A], r = e[O], i = e[k], { start: a, end: o } = N(t), s = Math.max(o.diff(a, "day") + 1, 1), c = Number.isFinite(n) ? n : 5, l = Number.isFinite(r) ? r : 0, u = ge(c), d = l + (c - u), f = Math.round(c) <= 5 ? 1 : Math.max(Math.round(u * s / 100), 1), p = j(Math.round(d * s / 100), 0, Math.max(s - f, 0));
295
309
  return {
296
310
  size: n,
297
311
  left: r,
298
312
  right: i,
299
- from: a.add(u, "day").toDate(),
300
- to: a.add(u + l - 1, "day").toDate()
313
+ from: a.add(p, "day").toDate(),
314
+ to: a.add(p + f - 1, "day").toDate()
301
315
  };
302
316
  }
303
317
  //#endregion
@@ -310,7 +324,7 @@ function Y() {
310
324
  function X() {
311
325
  let e = Y();
312
326
  return i((t) => {
313
- let { range: n, update: r } = e.getState(), { size: i, left: a, right: o, from: s, to: c } = ge(t, n);
327
+ let { range: n, update: r } = e.getState(), { size: i, left: a, right: o, from: s, to: c } = _e(t, n);
314
328
  r({
315
329
  slider: {
316
330
  size: i,
@@ -326,34 +340,34 @@ function X() {
326
340
  }
327
341
  //#endregion
328
342
  //#region src/package/rangeflow/components/DateSlider/Slider/SliderLeftSpacer.tsx
329
- function _e() {
343
+ function ve() {
330
344
  let e = K((e) => e.slider.left), [t] = u(() => e);
331
345
  return /* @__PURE__ */ p(S, {
332
346
  className: "focus:outline-none",
333
347
  defaultSize: `${t}%`,
334
- id: k,
348
+ id: O,
335
349
  minSize: 0,
336
350
  children: "\xA0"
337
351
  });
338
352
  }
339
353
  //#endregion
340
354
  //#region src/package/rangeflow/components/DateSlider/Slider/SliderRightSpacer.tsx
341
- function ve() {
355
+ function ye() {
342
356
  let e = K((e) => e.slider.right), [t] = u(() => e);
343
357
  return /* @__PURE__ */ p(S, {
344
358
  className: "focus:outline-none",
345
359
  defaultSize: `${t}%`,
346
- id: A,
360
+ id: k,
347
361
  minSize: 0,
348
362
  children: "\xA0"
349
363
  });
350
364
  }
351
365
  //#endregion
352
366
  //#region src/package/rangeflow/components/DateSlider/SliderValue.tsx
353
- var ye = n(() => {
367
+ var be = n(() => {
354
368
  let { SliderValueLabel: e } = G(), n = K((e) => e.slider.size), r = K((e) => e.selected_date), i = c(() => {
355
- let e = d(r.to).diff(r.from, "day") + 1;
356
- return n < 10 ? `${e}D` : e === 1 ? "1 Day" : `${e} Days`;
369
+ let e = d(r.from), t = d(r.to), i = e.isValid() ? e : t, a = t.isValid() ? t : e, o = a.isValid() && i.isValid() ? a.diff(i, "day") + 1 : 1, s = Number.isFinite(o) ? Math.max(o, 1) : 1;
370
+ return n < 10 ? `${s}D` : s === 1 ? "1 Day" : `${s} Days`;
357
371
  }, [
358
372
  r.from,
359
373
  r.to,
@@ -364,26 +378,26 @@ var ye = n(() => {
364
378
  className: y("rangeflow-thumb-label flex h-full w-full items-center justify-center", "mx-[clamp(0.5rem,5vw,5%)] cursor-grab", "text-xs font-medium text-nowrap text-(--rangeflow-text)"),
365
379
  children: e ? t(e, { label: i }) : i
366
380
  });
367
- }), Z = N([1, 100], [5, 100]);
368
- function be({ onHandleRef: e }) {
381
+ }), Z = M([1, 100], [5, 100]);
382
+ function xe({ onHandleRef: e }) {
369
383
  let t = K((e) => e.slider.size), n = K((e) => e.duration), r = W(K((e) => e.range)), [i] = u(() => t), a = n?.min ? Math.min(Z(n.min * 100 / r), 100) : 5, o = n?.max ? Math.min(Z(n.max * 100 / r), 100) : 100;
370
384
  return /* @__PURE__ */ p(S, {
371
385
  defaultSize: `${i}%`,
372
386
  elementRef: e,
373
- id: j,
387
+ id: A,
374
388
  maxSize: `${o}%`,
375
389
  minSize: `${a}%`,
376
390
  children: /* @__PURE__ */ p("div", {
377
391
  "data-track-handle-container": "",
378
392
  className: y("rangeflow-thumb flex items-center justify-center", "h-full rounded-sm border border-(--rangeflow-border-strong) inset-shadow-sm shadow-(color:--rangeflow-shadow-color)", "backdrop-blur-[2.5px]", "cursor-default select-none"),
379
- children: /* @__PURE__ */ p(ye, {})
393
+ children: /* @__PURE__ */ p(be, {})
380
394
  })
381
395
  });
382
396
  }
383
397
  //#endregion
384
398
  //#region src/package/rangeflow/components/DateSlider/Slider/index.tsx
385
- var xe = (e, t, n) => !!e?.querySelector("[data-separator=\"active\"]") && t["slider-track-thumb"] === n["slider-track-thumb"];
386
- function Se({ onHandleRef: e }) {
399
+ var Se = (e, t, n) => !!e?.querySelector("[data-separator=\"active\"]") && t["slider-track-thumb"] === n["slider-track-thumb"];
400
+ function Ce({ onHandleRef: e }) {
387
401
  let t = X(), { slider: { root: n } } = q(), i = l(null), a = l(null), o = l(null), s = b("rangeflow-separator h-3/4 w-0.75 self-center rounded-full transition-[background-color,opacity] duration-150", "bg-(--rangeflow-separator) hover:bg-(--rangeflow-separator-active) focus:outline-none", "data-[separator=active]:bg-(--rangeflow-separator-active)", "opacity-0 group-has-[[data-track-handle-container]:hover]:opacity-100", "hover:opacity-100 data-[separator=active]:opacity-100 data-[separator=focus]:opacity-100"), { ref: c } = te({
388
402
  id: "track-handle-draggable",
389
403
  sensors: [re.configure({ preventActivation: (e) => !(e.target instanceof HTMLDivElement) || !e.target.dataset.trackHandle }), ne]
@@ -394,11 +408,11 @@ function Se({ onHandleRef: e }) {
394
408
  },
395
409
  onDragMove: (e) => {
396
410
  if (!n.current || !a.current || !i.current || !i.current.clientWidth) return;
397
- let t = e.operation.transform.x / i.current.clientWidth * 100, r = a.current, o = r[k] + r[A], s = Math.min(Math.max(r[k] + t, 0), o);
411
+ let t = e.operation.transform.x / i.current.clientWidth * 100, r = a.current, o = r[O] + r[k], s = Math.min(Math.max(r[O] + t, 0), o);
398
412
  n.current.setLayout({
399
413
  ...r,
400
- [k]: s,
401
- [A]: o - s
414
+ [O]: s,
415
+ [k]: o - s
402
416
  });
403
417
  },
404
418
  onDragEnd: () => {
@@ -413,7 +427,7 @@ function Se({ onHandleRef: e }) {
413
427
  groupRef: n,
414
428
  onLayoutChange: (e) => {
415
429
  let a = o.current;
416
- if (a && xe(i.current, a, e)) {
430
+ if (a && Se(i.current, a, e)) {
417
431
  n.current?.setLayout(a);
418
432
  return;
419
433
  }
@@ -422,23 +436,23 @@ function Se({ onHandleRef: e }) {
422
436
  });
423
437
  },
424
438
  children: [
425
- /* @__PURE__ */ p(_e, {}),
439
+ /* @__PURE__ */ p(ve, {}),
426
440
  /* @__PURE__ */ p(C, { className: s }),
427
- /* @__PURE__ */ p(be, { onHandleRef: e }),
441
+ /* @__PURE__ */ p(xe, { onHandleRef: e }),
428
442
  /* @__PURE__ */ p(C, { className: s }),
429
- /* @__PURE__ */ p(ve, {})
443
+ /* @__PURE__ */ p(ye, {})
430
444
  ]
431
445
  })
432
446
  });
433
447
  }
434
448
  //#endregion
435
449
  //#region src/package/rangeflow/components/DateSlider/SliderTrack.tsx
436
- function Ce({ onHandleRef: e }) {
450
+ function we({ onHandleRef: e }) {
437
451
  let t = K((e) => e.update), n = K((e) => e.range), r = W(n), { slider: { root: i } } = q(), a = K((e) => e.disabled?.before), o = K((e) => e.disabled?.after), s = c(() => !a || d(n.from).isAfter(a), [n.from, a]), l = c(() => !o || d(n.to).isBefore(o), [n.to, o]), u = ({ left: e, right: t, size: n }) => {
438
452
  i.current?.setLayout({
439
- [k]: e,
440
- [j]: n,
441
- [A]: t
453
+ [O]: e,
454
+ [A]: n,
455
+ [k]: t
442
456
  });
443
457
  };
444
458
  return /* @__PURE__ */ m("div", {
@@ -457,11 +471,11 @@ function Ce({ onHandleRef: e }) {
457
471
  };
458
472
  });
459
473
  },
460
- children: /* @__PURE__ */ p(fe, {})
474
+ children: /* @__PURE__ */ p(pe, {})
461
475
  }) : null,
462
476
  /* @__PURE__ */ m("div", {
463
477
  className: "relative flex-1 px-2",
464
- children: [/* @__PURE__ */ p(Se, { onHandleRef: e }), /* @__PURE__ */ p(me, {})]
478
+ children: [/* @__PURE__ */ p(Ce, { onHandleRef: e }), /* @__PURE__ */ p(he, {})]
465
479
  }),
466
480
  l ? /* @__PURE__ */ p(J, {
467
481
  onClick: () => {
@@ -476,18 +490,18 @@ function Ce({ onHandleRef: e }) {
476
490
  };
477
491
  });
478
492
  },
479
- children: /* @__PURE__ */ p(pe, {})
493
+ children: /* @__PURE__ */ p(me, {})
480
494
  }) : null
481
495
  ]
482
496
  });
483
497
  }
484
498
  //#endregion
485
499
  //#region src/package/rangeflow/components/DateSlider/utils/restrict-inner-to-element.ts
486
- var we = class e extends ae {
487
- innerRect = D(null);
488
- containerRect = D(null);
500
+ var Te = class e extends ae {
501
+ innerRect = E(null);
502
+ containerRect = E(null);
489
503
  constructor(e, t) {
490
- super(e, t), this.destroy = E(() => {
504
+ super(e, t), this.destroy = T(() => {
491
505
  if (!this.options) return;
492
506
  let { dragOperation: t } = e;
493
507
  if (!t.status.initialized) return;
@@ -499,25 +513,25 @@ var we = class e extends ae {
499
513
  }
500
514
  apply({ transform: e }) {
501
515
  let t = this.innerRect.value, n = this.containerRect.value;
502
- return !t || !n ? e : g(new T(t.left, t.top, t.width, t.height), e, n);
516
+ return !t || !n ? e : g(new w(t.left, t.top, t.width, t.height), e, n);
503
517
  }
504
- static configure = w(e);
518
+ static configure = oe(e);
505
519
  };
506
520
  //#endregion
507
521
  //#region src/package/rangeflow/components/DateSlider/index.tsx
508
- function Te() {
522
+ function Ee() {
509
523
  let [e, t] = u(null), [n, r] = u(null);
510
524
  return /* @__PURE__ */ p("div", {
511
525
  ref: t,
512
526
  className: "rangeflow-slider relative my-8 h-3 w-full px-2",
513
527
  children: /* @__PURE__ */ m(_, {
514
- modifiers: [we.configure({
528
+ modifiers: [Te.configure({
515
529
  inner: n,
516
530
  container: e
517
531
  }), h],
518
532
  children: [
519
- /* @__PURE__ */ p(Ce, { onHandleRef: r }),
520
- /* @__PURE__ */ p(de, {}),
533
+ /* @__PURE__ */ p(we, { onHandleRef: r }),
534
+ /* @__PURE__ */ p(fe, {}),
521
535
  /* @__PURE__ */ p(v, { children: null })
522
536
  ]
523
537
  })
@@ -525,7 +539,7 @@ function Te() {
525
539
  }
526
540
  //#endregion
527
541
  //#region src/package/rangeflow/components/RangeTabs/hooks/use-apply-slider-layout.ts
528
- function Ee() {
542
+ function De() {
529
543
  let e = X(), t = K((e) => e.range.from.getTime()), n = K((e) => e.range.to.getTime()), { slider: { root: i } } = q();
530
544
  o(() => {
531
545
  r(() => {
@@ -540,7 +554,7 @@ function Ee() {
540
554
  }
541
555
  //#endregion
542
556
  //#region src/package/rangeflow/components/RangeTabs/hooks/use-tab-indicator.ts
543
- function De(e, t) {
557
+ function Oe(e, t) {
544
558
  let n = l([]), r = l(null), i = l(!1);
545
559
  return s(() => {
546
560
  let t = r.current;
@@ -566,15 +580,15 @@ function De(e, t) {
566
580
  }
567
581
  //#endregion
568
582
  //#region src/package/rangeflow/components/RangeTabs/index.tsx
569
- function Oe() {
570
- Ee();
583
+ function ke() {
584
+ De();
571
585
  let { slider: { root: e } } = q(), t = K((e) => e.ranges), n = K((e) => e.update), r = K((e) => e.range.from), i = K((e) => e.range.to), a = K((e) => e.disabled?.before), o = K((e) => e.disabled?.after), s = (t) => {
572
586
  n((n) => {
573
587
  let r = P(t, n.selected_date);
574
588
  return e.current?.setLayout({
575
- [k]: r.left,
576
- [j]: r.size,
577
- [A]: r.right
589
+ [O]: r.left,
590
+ [A]: r.size,
591
+ [k]: r.right
578
592
  }), { range: {
579
593
  from: t.from,
580
594
  to: t.to
@@ -588,7 +602,7 @@ function Oe() {
588
602
  l,
589
603
  r,
590
604
  i
591
- ]), { indicatorRef: f, registerButton: h } = De(u, l);
605
+ ]), { indicatorRef: f, registerButton: h } = Oe(u, l);
592
606
  return /* @__PURE__ */ p("div", {
593
607
  className: "rangeflow-tabs flex items-center justify-center select-none",
594
608
  children: /* @__PURE__ */ m("div", {
@@ -613,7 +627,7 @@ function Oe() {
613
627
  }
614
628
  //#endregion
615
629
  //#region src/package/rangeflow/components/Calendar/CalendarDayButton.tsx
616
- function ke({ className: e, day: t, modifiers: n, ...r }) {
630
+ function Ae({ className: e, day: t, modifiers: n, ...r }) {
617
631
  let i = l(null);
618
632
  o(() => {
619
633
  n.focused && i.current?.focus();
@@ -632,16 +646,16 @@ function ke({ className: e, day: t, modifiers: n, ...r }) {
632
646
  }
633
647
  //#endregion
634
648
  //#region src/package/rangeflow/components/Calendar/Chevron.tsx
635
- var Ae = {
649
+ var je = {
636
650
  up: "rotate-180",
637
651
  down: "",
638
652
  left: "rotate-90",
639
653
  right: "-rotate-90"
640
654
  };
641
- function je({ className: e, orientation: t = "down", size: n = 16 }) {
655
+ function Me({ className: e, orientation: t = "down", size: n = 16 }) {
642
656
  return /* @__PURE__ */ p("svg", {
643
657
  "aria-hidden": "true",
644
- className: y("shrink-0", Ae[t], e),
658
+ className: y("shrink-0", je[t], e),
645
659
  fill: "none",
646
660
  height: n,
647
661
  stroke: "currentColor",
@@ -655,8 +669,8 @@ function je({ className: e, orientation: t = "down", size: n = 16 }) {
655
669
  }
656
670
  //#endregion
657
671
  //#region src/package/rangeflow/components/Calendar/index.tsx
658
- function Me({ captionLayout: e = "label", className: t, classNames: n, components: r, showOutsideDays: i = !0, ...a }) {
659
- return /* @__PURE__ */ p(oe, {
672
+ function Ne({ captionLayout: e = "label", className: t, classNames: n, components: r, showOutsideDays: i = !0, ...a }) {
673
+ return /* @__PURE__ */ p(se, {
660
674
  captionLayout: e,
661
675
  className: y("rangeflow-calendar w-fit p-3 select-none", t),
662
676
  showOutsideDays: i,
@@ -687,8 +701,8 @@ function Me({ captionLayout: e = "label", className: t, classNames: n, component
687
701
  ...n
688
702
  },
689
703
  components: {
690
- DayButton: ke,
691
- Chevron: je,
704
+ DayButton: Ae,
705
+ Chevron: Me,
692
706
  ...r
693
707
  },
694
708
  ...a
@@ -696,42 +710,42 @@ function Me({ captionLayout: e = "label", className: t, classNames: n, component
696
710
  }
697
711
  //#endregion
698
712
  //#region src/package/rangeflow/components/Popover/index.tsx
699
- var Ne = n(({ align: e = "center", className: t, sideOffset: n = 6, children: r, ...i }) => /* @__PURE__ */ p(O.Portal, { children: /* @__PURE__ */ p(O.Content, {
713
+ var Pe = n(({ align: e = "center", className: t, sideOffset: n = 6, children: r, ...i }) => /* @__PURE__ */ p(D.Portal, { children: /* @__PURE__ */ p(D.Content, {
700
714
  align: e,
701
715
  sideOffset: n,
702
716
  ...i,
703
717
  className: y("rangeflow-date-picker-portal rangeflow-popover z-50 rounded-lg border border-(--rangeflow-border) bg-(--rangeflow-bg) p-2 text-(--rangeflow-text) shadow-md shadow-(color:--rangeflow-shadow-color) backdrop-blur-[10px] outline-none", t),
704
718
  children: r
705
- }) })), Pe = O.Root, Fe = O.Trigger;
719
+ }) })), Fe = D.Root, Q = D.Trigger;
706
720
  //#endregion
707
721
  //#region src/package/rangeflow/components/PickerBar/CalendarPopover.tsx
708
- function Q({ children: e }) {
722
+ function Ie({ children: e }) {
709
723
  let t = K((e) => e.update), n = K((e) => e.range), r = K((e) => e.selected_date), i = K((e) => e.disabled), a = K((e) => e.duration), o = K((e) => e.CalendarProps), { slider: { root: s } } = q(), c = () => {
710
- let e = d(n.from), t = d(n.to);
711
- return d(r.from).isBefore(e) && (e = d(r.from).subtract(10, "day")), d(r.to).isAfter(t) && (t = d(r.to).add(10, "day")), {
712
- from: e.toDate(),
713
- to: t.toDate()
724
+ let e = d(n.from), t = d(n.to), i = d(r.from), a = d(r.to), o = e.isValid() ? e : d(), s = t.isValid() ? t : o;
725
+ return s.isBefore(o) && (s = o), i.isValid() && i.isBefore(o) && (o = i.subtract(10, "day")), a.isValid() && a.isAfter(s) && (s = a.add(10, "day")), s.isBefore(o) && (s = o.add(1, "day")), {
726
+ from: o.toDate(),
727
+ to: s.toDate()
714
728
  };
715
729
  }, l = () => {
716
730
  let e = c(), { size: n, left: i, right: a } = P(e, r);
717
731
  s.current?.setLayout({
718
- [k]: i,
719
- [j]: n,
720
- [A]: a
732
+ [O]: i,
733
+ [A]: n,
734
+ [k]: a
721
735
  }), t({ range: e });
722
736
  };
723
- return /* @__PURE__ */ m(Pe, {
737
+ return /* @__PURE__ */ m(Fe, {
724
738
  onOpenChange: (e) => {
725
739
  e === !1 && l();
726
740
  },
727
- children: [/* @__PURE__ */ p(Fe, {
741
+ children: [/* @__PURE__ */ p(Q, {
728
742
  className: "cursor-pointer",
729
743
  children: e
730
- }), /* @__PURE__ */ p(Ne, {
744
+ }), /* @__PURE__ */ p(Pe, {
731
745
  align: "start",
732
746
  sideOffset: 10,
733
- children: /* @__PURE__ */ p(Me, {
734
- defaultMonth: r.from,
747
+ children: /* @__PURE__ */ p(Ne, {
748
+ defaultMonth: d(r.from).isValid() ? r.from : void 0,
735
749
  numberOfMonths: 2,
736
750
  showOutsideDays: !1,
737
751
  ...o,
@@ -741,9 +755,11 @@ function Q({ children: e }) {
741
755
  mode: "range",
742
756
  selected: r,
743
757
  onSelect: (e) => {
744
- !e?.from || !e?.to || t({ selected_date: {
745
- from: d(e.from).startOf("day").toDate(),
746
- to: d(e.to).startOf("day").toDate()
758
+ if (!e?.from || !e?.to) return;
759
+ let n = d(e.from).startOf("day"), r = d(e.to).startOf("day");
760
+ !n.isValid() || !r.isValid() || t({ selected_date: {
761
+ from: n.toDate(),
762
+ to: r.toDate()
747
763
  } });
748
764
  }
749
765
  })
@@ -752,7 +768,7 @@ function Q({ children: e }) {
752
768
  }
753
769
  //#endregion
754
770
  //#region src/package/rangeflow/icons/CalendarIcon.tsx
755
- function Ie() {
771
+ function Le() {
756
772
  return /* @__PURE__ */ p("svg", {
757
773
  fill: "none",
758
774
  height: "15",
@@ -772,10 +788,10 @@ function Ie() {
772
788
  function $() {
773
789
  let e = K((e) => e.selected_date), { SelectedDate: n } = G(), { from: r, to: i } = c(() => {
774
790
  let t = d(), n = d(e.from), r = d(e.to), i = n.isSame(r, "year") ? "DD MMM" : "DD MMM YYYY", a = {
775
- from: n.format(i),
776
- to: r.format(i)
791
+ from: n.isValid() ? n.format(i) : "Invalid Date",
792
+ to: r.isValid() ? r.format(i) : "Invalid Date"
777
793
  };
778
- return t.isSame(n, "day") && (a.from = "Today"), t.isSame(r, "day") && (a.to = "Today"), a;
794
+ return n.isValid() && t.isSame(n, "day") && (a.from = "Today"), r.isValid() && t.isSame(r, "day") && (a.to = "Today"), a;
779
795
  }, [e.from, e.to]);
780
796
  return n ? t(n, {
781
797
  from: r,
@@ -783,7 +799,7 @@ function $() {
783
799
  }) : /* @__PURE__ */ m("div", {
784
800
  className: "rangeflow-selected-date flex items-center gap-2 text-xs font-medium text-(--rangeflow-accent-text) select-none hover:opacity-90",
785
801
  children: [
786
- /* @__PURE__ */ p(Ie, {}),
802
+ /* @__PURE__ */ p(Le, {}),
787
803
  r,
788
804
  /* @__PURE__ */ p("span", {
789
805
  className: "text-(--rangeflow-text-faint)",
@@ -795,51 +811,51 @@ function $() {
795
811
  }
796
812
  //#endregion
797
813
  //#region src/package/rangeflow/components/PickerBar/index.tsx
798
- function Le() {
814
+ function Re() {
799
815
  let e = K((e) => e.calendar), { RangeTabs: n } = G();
800
816
  return /* @__PURE__ */ m("div", {
801
817
  className: "flex h-full items-center justify-between px-2",
802
- children: [e ? /* @__PURE__ */ p(Q, { children: /* @__PURE__ */ p($, {}) }) : /* @__PURE__ */ p($, {}), n ? t(n) : /* @__PURE__ */ p(Oe, {})]
818
+ children: [e ? /* @__PURE__ */ p(Ie, { children: /* @__PURE__ */ p($, {}) }) : /* @__PURE__ */ p($, {}), n ? t(n) : /* @__PURE__ */ p(ke, {})]
803
819
  });
804
820
  }
805
821
  //#endregion
806
822
  //#region src/package/rangeflow/hooks/use-rangeflow-events.ts
807
- function Re() {
823
+ function ze() {
808
824
  return a(B).events;
809
825
  }
810
826
  //#endregion
811
827
  //#region src/package/rangeflow/hooks/use-emit-date-change.ts
812
- function ze() {
813
- let e = Y(), { onChange: t } = Re();
828
+ function Be() {
829
+ let e = Y(), { onChange: t } = ze();
814
830
  o(() => e.subscribe((e, n) => {
815
831
  e.selected_date !== n.selected_date && t(e.selected_date);
816
832
  }), [e, t]);
817
833
  }
818
834
  //#endregion
819
835
  //#region src/package/rangeflow/Root.tsx
820
- function Be() {
821
- return ze(), /* @__PURE__ */ m("div", {
836
+ function Ve() {
837
+ return Be(), /* @__PURE__ */ m("div", {
822
838
  className: "rangeflow-date-picker rangeflow-root h-35 w-140 rounded-lg border border-(--rangeflow-border) bg-(--rangeflow-bg) text-(--rangeflow-text) shadow-md shadow-(color:--rangeflow-shadow-color)",
823
839
  children: [/* @__PURE__ */ p("div", {
824
840
  className: "rangeflow-header h-10 border-b border-(--rangeflow-border) p-2",
825
- children: /* @__PURE__ */ p(Le, {})
841
+ children: /* @__PURE__ */ p(Re, {})
826
842
  }), /* @__PURE__ */ p("div", {
827
843
  className: "rangeflow-body mx-2",
828
- children: /* @__PURE__ */ p(Te, {})
844
+ children: /* @__PURE__ */ p(Ee, {})
829
845
  })]
830
846
  });
831
847
  }
832
848
  //#endregion
833
849
  //#region src/package/rangeflow/RangeFlow.tsx
834
- function Ve(e) {
850
+ function He(e) {
835
851
  return /* @__PURE__ */ p(V, {
836
852
  ...e,
837
- children: /* @__PURE__ */ p(Be, {})
853
+ children: /* @__PURE__ */ p(Ve, {})
838
854
  });
839
855
  }
840
856
  //#endregion
841
857
  //#region src/package/rangeflow/hooks/use-rangeflow.ts
842
- function He() {
858
+ function Ue() {
843
859
  let e = l(null), t = l(null), n = i((n) => {
844
860
  let r = e.current;
845
861
  if (!r) return;
@@ -855,18 +871,18 @@ function He() {
855
871
  right: c
856
872
  }
857
873
  }), t.current?.slider.root.current?.setLayout({
858
- [k]: s,
859
- [j]: o,
860
- [A]: c
874
+ [O]: s,
875
+ [A]: o,
876
+ [k]: c
861
877
  });
862
878
  }, []), r = i((n) => {
863
879
  let r = e.current;
864
880
  if (!r) return;
865
881
  let { range: i } = r.getState(), { size: a, left: o, right: s } = P(i, n);
866
882
  t.current?.slider.root.current?.setLayout({
867
- [k]: o,
868
- [j]: a,
869
- [A]: s
883
+ [O]: o,
884
+ [A]: a,
885
+ [k]: s
870
886
  });
871
887
  }, []);
872
888
  return {
@@ -879,4 +895,4 @@ function He() {
879
895
  };
880
896
  }
881
897
  //#endregion
882
- export { Ve as RangeFlow, He as useRangeFlow };
898
+ export { He as RangeFlow, Ue as useRangeFlow };
@@ -0,0 +1,6 @@
1
+ import { default as dayjs } from 'dayjs';
2
+ import { DateRange } from '../types';
3
+ export declare function normalizeDateRange(range: DateRange): {
4
+ start: dayjs.Dayjs;
5
+ end: dayjs.Dayjs;
6
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rangeflow",
3
- "version": "1.0.14",
3
+ "version": "1.0.15",
4
4
  "type": "module",
5
5
  "description": "A fancy date range picker built with React and Tailwind.",
6
6
  "license": "MIT",