@memobit/libs 3.1.5 → 3.2.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.
@@ -1 +1 @@
1
- .chip{--chip-color:var(--body-accent-color);justify-content:center;align-items:center;gap:var(--spacing-8);border:var(--spacing-1) solid var(--delimiter-color);max-width:100%;color:var(--body-color);cursor:pointer;font-family:inherit;font-size:var(--font-size-sm);background:0 0;border-radius:999px;transition:background .2s,border-color .2s,color .2s;display:inline-flex}.chip:hover:not(:disabled){border-color:var(--chip-hover-border-color,var(--chip-color));background:var(--chip-hover-background-color,var(--card-background-accent-color));color:var(--chip-hover-color,var(--body-color-accent))}.chip:disabled{cursor:not-allowed;opacity:.6}.chip--selected,.chip--selected:hover:not(:disabled){border-color:var(--chip-selected-border-color,var(--body-accent-color));background:var(--chip-selected-background-color,var(--card-background-accent-color));color:var(--chip-selected-color,var(--body-accent-color))}.chip--plain{background:0 0;border-color:#0000}.chip--default{--chip-color:var(--body-accent-color)}.chip--info{--chip-color:var(--button-info-background-color)}.chip--success{--chip-color:var(--button-success-background-color)}.chip--warning{--chip-color:var(--button-warning-background-color)}.chip--danger{--chip-color:var(--button-danger-background-color)}.chip--custom.chip--selected,.chip--info.chip--selected,.chip--success.chip--selected,.chip--warning.chip--selected,.chip--danger.chip--selected,.chip--custom.chip--selected:hover:not(:disabled),.chip--info.chip--selected:hover:not(:disabled),.chip--success.chip--selected:hover:not(:disabled),.chip--warning.chip--selected:hover:not(:disabled),.chip--danger.chip--selected:hover:not(:disabled){border-color:var(--chip-color);background:color-mix(in srgb, var(--chip-color) 18%, transparent);color:var(--chip-color)}.chip--custom{background:color-mix(in srgb, var(--chip-color) 22%, transparent);color:var(--body-color)}.chip--custom:hover:not(:disabled){background:color-mix(in srgb, var(--chip-color) 32%, transparent)}.chip--custom.chip--selected,.chip--custom.chip--selected:hover:not(:disabled){background:var(--chip-color);border-color:var(--chip-color);color:var(--button-default-color,white)}.chip--xsmall{min-height:var(--spacing-20);gap:var(--spacing-4);padding:var(--spacing-2) var(--spacing-8);font-size:var(--font-size-xxs)}.chip--small{min-height:var(--spacing-24);gap:var(--spacing-4);padding:var(--spacing-4) var(--spacing-12);font-size:var(--font-size-xs)}.chip--medium{min-height:var(--spacing-32);gap:var(--spacing-8);padding:var(--spacing-8) 14px;font-size:var(--font-size-sm)}.chip--large{min-height:var(--spacing-40);gap:var(--spacing-12);padding:var(--spacing-12) var(--spacing-20);font-size:var(--font-size-md)}.chip__swatch{background-color:var(--chip-color);border-radius:999px;flex-shrink:0;width:10px;height:10px}.chip__label{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.chip__count{color:var(--body-color-muted);font-size:var(--font-size-xs);flex-shrink:0}.chip>.icon{flex-shrink:0}.chip--selected .chip__count{color:var(--chip-selected-count-color,var(--body-color-muted))}.chip--xsmall .chip__swatch{width:var(--spacing-4);height:var(--spacing-4)}.chip--small .chip__swatch{width:var(--spacing-8);height:var(--spacing-8)}.chip--large .chip__swatch{width:var(--spacing-12);height:var(--spacing-12)}.chip--xsmall .chip__count{font-size:var(--font-size-xxs)}.chip--large .chip__count{font-size:var(--font-size-sm)}
1
+ .chip{--chip-color:var(--body-accent-color);justify-content:center;align-items:center;gap:var(--spacing-8);border:var(--spacing-1) solid var(--delimiter-color);max-width:100%;color:var(--body-color);cursor:pointer;font-family:inherit;font-size:var(--font-size-sm);background:0 0;border-radius:999px;transition:background .2s,border-color .2s,color .2s;display:inline-flex}.chip:hover:not(:disabled){border-color:var(--chip-hover-border-color,var(--chip-color));background:var(--chip-hover-background-color,var(--card-background-accent-color));color:var(--chip-hover-color,var(--body-color-accent))}.chip:disabled{cursor:not-allowed;opacity:.6}.chip--selected,.chip--selected:hover:not(:disabled){border-color:var(--chip-selected-border-color,var(--body-accent-color));background:var(--chip-selected-background-color,var(--card-background-accent-color));color:var(--chip-selected-color,var(--body-accent-color))}.chip--plain{background:0 0;border-color:#0000}.chip--default{--chip-color:var(--body-accent-color)}.chip--info{--chip-color:var(--button-info-background-color)}.chip--success{--chip-color:var(--button-success-background-color)}.chip--warning{--chip-color:var(--button-warning-background-color)}.chip--danger{--chip-color:var(--button-danger-background-color)}.chip--custom.chip--selected,.chip--info.chip--selected,.chip--success.chip--selected,.chip--warning.chip--selected,.chip--danger.chip--selected,.chip--custom.chip--selected:hover:not(:disabled),.chip--info.chip--selected:hover:not(:disabled),.chip--success.chip--selected:hover:not(:disabled),.chip--warning.chip--selected:hover:not(:disabled),.chip--danger.chip--selected:hover:not(:disabled){border-color:var(--chip-color);background:color-mix(in srgb, var(--chip-color) 18%, transparent);color:var(--chip-color)}.chip--custom{background:color-mix(in srgb, var(--chip-color) 22%, transparent);color:var(--body-color)}.chip--custom:hover:not(:disabled){background:color-mix(in srgb, var(--chip-color) 32%, transparent)}.chip--custom.chip--selected,.chip--custom.chip--selected:hover:not(:disabled){background:var(--chip-color);border-color:var(--chip-color);color:var(--button-default-color,white)}.chip--xsmall{min-height:var(--spacing-20);gap:var(--spacing-4);padding:var(--spacing-2) var(--spacing-8);font-size:var(--font-size-xxs)}.chip--small{min-height:var(--spacing-24);gap:var(--spacing-4);padding:var(--spacing-4) var(--spacing-12);font-size:var(--font-size-xs)}.chip--medium{min-height:var(--spacing-32);gap:var(--spacing-8);padding:var(--spacing-8) 14px;font-size:var(--font-size-sm)}.chip--large{min-height:var(--spacing-40);gap:var(--spacing-12);padding:var(--spacing-12) var(--spacing-20);font-size:var(--font-size-md)}.chip__swatch{background-color:var(--chip-color);width:10px;height:10px;box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--body-color) 30%, transparent);border-radius:999px;flex-shrink:0}.chip__label{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.chip__count{color:var(--body-color-muted);font-size:var(--font-size-xs);flex-shrink:0}.chip>.icon{flex-shrink:0}.chip--selected .chip__count{color:var(--chip-selected-count-color,var(--body-color-muted))}.chip--xsmall .chip__swatch{width:var(--spacing-4);height:var(--spacing-4)}.chip--small .chip__swatch{width:var(--spacing-8);height:var(--spacing-8)}.chip--large .chip__swatch{width:var(--spacing-12);height:var(--spacing-12)}.chip--xsmall .chip__count{font-size:var(--font-size-xxs)}.chip--large .chip__count{font-size:var(--font-size-sm)}
@@ -1 +1 @@
1
- .color-picker{gap:var(--spacing-12);border:1px solid var(--delimiter-color);border-radius:var(--radius);padding:var(--spacing-16);background:var(--card-background-color);flex-direction:column;width:320px;display:flex}.color-picker__swatches{gap:var(--spacing-6);flex-direction:column;display:flex}.color-picker__swatches-label{font-size:var(--font-size-xxs);color:var(--body-sub-title-color)}.color-picker__swatches-row{gap:var(--spacing-6);flex-wrap:wrap;display:flex}.color-picker__swatch{width:var(--spacing-20);height:var(--spacing-20);border:1px solid var(--delimiter-color);cursor:pointer;transition:transform var(--transition-fast);border-radius:50%;padding:0}.color-picker__swatch:hover{transform:scale(1.15)}.color-picker__swatch.is-selected{outline:2px solid var(--body-accent-color);outline-offset:2px}.color-picker__preview{border-radius:var(--radius);border:1px solid var(--delimiter-color);width:100%;height:40px}.color-picker__controls{gap:var(--spacing-12);flex-direction:column;display:flex}.color-picker__sv{border-radius:var(--radius);cursor:crosshair;touch-action:none;-webkit-user-select:none;user-select:none;width:100%;height:180px;position:relative;overflow:hidden}.color-picker__sv-white,.color-picker__sv-black{position:absolute;inset:0}.color-picker__sv-white{background:linear-gradient(90deg,#fff,#fff0)}.color-picker__sv-black{background:linear-gradient(#0000,#000)}.color-picker__sv-handle{border:2px solid #fff;border-radius:50%;width:12px;height:12px;position:absolute;transform:translate(-6px,-6px);box-shadow:0 0 0 1px #0000004d}.color-picker__slider input[type=range]{width:100%}.color-picker__mode-toggle{gap:var(--spacing-8);display:flex}.color-picker__mode-toggle .button{padding:6px 10px}.color-picker__mode-toggle .button.is-active{border:1px solid var(--body-accent-color);color:var(--body-accent-color)}.color-picker__fields{gap:var(--spacing-8);grid-template-columns:1fr;display:grid}.color-picker__fields .input-text-wrapper,.color-picker__fields .input-number-wrapper{width:100%}.color-picker__fields--rgb,.color-picker__fields--hsl,.color-picker__fields--hex{grid-template-columns:repeat(3,1fr)}.color-picker__fields--hex .input-text-wrapper{grid-column:span 3}
1
+ .color-picker{gap:var(--spacing-12);border:1px solid var(--delimiter-color);border-radius:var(--radius);padding:var(--spacing-16);background:var(--card-background-color);flex-direction:column;width:320px;display:flex}.color-picker__swatches{gap:var(--spacing-6);flex-direction:column;display:flex}.color-picker__swatches-label{font-size:var(--font-size-xxs);color:var(--body-sub-title-color)}.color-picker__swatches-row{gap:var(--spacing-6);flex-wrap:wrap;display:flex}.color-picker__swatch{width:var(--spacing-20);height:var(--spacing-20);border:1px solid color-mix(in srgb, var(--body-color) 30%, transparent);cursor:pointer;transition:transform var(--transition-fast);border-radius:50%;padding:0}.color-picker__swatch:hover{transform:scale(1.15)}.color-picker__swatch.is-selected{outline:2px solid var(--body-accent-color);outline-offset:2px}.color-picker__preview{border-radius:var(--radius);border:1px solid var(--delimiter-color);width:100%;height:40px}.color-picker__controls{gap:var(--spacing-12);flex-direction:column;display:flex}.color-picker__sv{border-radius:var(--radius);cursor:crosshair;touch-action:none;-webkit-user-select:none;user-select:none;width:100%;height:180px;position:relative;overflow:hidden}.color-picker__sv-white,.color-picker__sv-black{position:absolute;inset:0}.color-picker__sv-white{background:linear-gradient(90deg,#fff,#fff0)}.color-picker__sv-black{background:linear-gradient(#0000,#000)}.color-picker__sv-handle{border:2px solid #fff;border-radius:50%;width:12px;height:12px;position:absolute;transform:translate(-6px,-6px);box-shadow:0 0 0 1px #0000004d}.color-picker__slider input[type=range]{width:100%}.color-picker__mode-toggle{gap:var(--spacing-8);display:flex}.color-picker__mode-toggle .button{padding:6px 10px}.color-picker__mode-toggle .button.is-active{border:1px solid var(--body-accent-color);color:var(--body-accent-color)}.color-picker__fields{gap:var(--spacing-8);grid-template-columns:1fr;display:grid}.color-picker__fields .input-text-wrapper,.color-picker__fields .input-number-wrapper{width:100%}.color-picker__fields--rgb,.color-picker__fields--hsl,.color-picker__fields--hex{grid-template-columns:repeat(3,1fr)}.color-picker__fields--hex .input-text-wrapper{grid-column:span 3}
@@ -1,9 +1,9 @@
1
- import { getIsoWeek as J, getMonthMatrix as Q, isSameDay as R, isToday as U, isWeekend as V } from "../../helpers/Datetime.js";
2
- import { bucketEventsByDay as W } from "./EventCalendar.helpers.js";
3
- import { EventCalendarChip as X } from "./EventCalendar.Chip.js";
4
- import { useMemo as c, useState as T } from "react";
5
- import { jsx as a, jsxs as l } from "react/jsx-runtime";
6
- var p = [
1
+ import { getIsoWeek as ae, getMonthMatrix as re, isSameDay as oe, isToday as ce, isWeekend as le } from "../../helpers/Datetime.js";
2
+ import { bucketEventsByDay as se, isMultiDayEvent as ie, layoutWeekSpans as de, startOfDay as g } from "./EventCalendar.helpers.js";
3
+ import { EventCalendarChip as z } from "./EventCalendar.Chip.js";
4
+ import { useCallback as M, useEffect as ue, useMemo as d, useState as T } from "react";
5
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
6
+ var C = [
7
7
  "Sun",
8
8
  "Mon",
9
9
  "Tue",
@@ -12,107 +12,169 @@ var p = [
12
12
  "Fri",
13
13
  "Sat"
14
14
  ];
15
- function ae({ date: s, dragEnabled: g, draggingId: b, emptyLabel: k, events: m, firstDayOfWeek: d, maxEventsPerDay: D, onDayClick: N, onDragEnd: j, onDragStart: B, onDrop: $, onEventClick: A, onOpenDay: i, renderEvent: F, showWeekNumbers: y }) {
16
- const [L, w] = T(null), [P, v] = T(null), u = c(() => Q(s.getFullYear(), s.getMonth(), d), [s, d]), M = c(() => u.flat(), [u]), f = c(() => W(m, M), [m, M]), Y = c(() => new Map(f.map((n) => [n.date.toDateString(), n])), [f]), K = c(() => d === 1 ? [...p.slice(1), p[0]] : p, [d]), q = s.getMonth(), z = m.length > 0, G = /* @__PURE__ */ new Date(), H = (n, o) => {
17
- n.preventDefault(), v(null), $(o, !0);
18
- }, I = (n, o) => {
19
- !g || b === null || (n.preventDefault(), n.dataTransfer.dropEffect = "move", v(o));
15
+ function ge({ date: u, dragEnabled: f, draggingId: w, emptyLabel: x, events: m, firstDayOfWeek: v, maxEventsPerDay: E, onDayClick: S, onDragEnd: $, onDragStart: L, onDrop: G, onEventClick: P, onOpenDay: _, onRangeSelect: h, renderEvent: j, showWeekNumbers: B }) {
16
+ const [H, A] = T(null), [J, D] = T(null), [r, b] = T(null);
17
+ ue(() => {
18
+ if (!r) return;
19
+ const e = () => {
20
+ if (r.anchor.getTime() !== r.focus.getTime()) {
21
+ const [a, i] = [r.anchor, r.focus].sort((l, N) => l.getTime() - N.getTime());
22
+ h?.({
23
+ start: a,
24
+ end: i
25
+ });
26
+ }
27
+ b(null);
28
+ };
29
+ return window.addEventListener("pointerup", e), window.addEventListener("pointercancel", e), () => {
30
+ window.removeEventListener("pointerup", e), window.removeEventListener("pointercancel", e);
31
+ };
32
+ }, [h, r]);
33
+ const Q = M((e, a) => {
34
+ !h || e.button !== 0 || e.target.closest(".event-calendar__chip, button") || b({
35
+ anchor: g(a),
36
+ focus: g(a)
37
+ });
38
+ }, [h]), U = M((e) => {
39
+ b((a) => a && {
40
+ ...a,
41
+ focus: g(e)
42
+ });
43
+ }, []), V = M((e) => {
44
+ if (!r) return !1;
45
+ const a = g(e).getTime(), i = Math.min(r.anchor.getTime(), r.focus.getTime()), l = Math.max(r.anchor.getTime(), r.focus.getTime());
46
+ return a >= i && a <= l;
47
+ }, [r]), y = d(() => re(u.getFullYear(), u.getMonth(), v), [u, v]), F = d(() => y.flat(), [y]), I = d(() => se(m, F), [m, F]), X = d(() => new Map(I.map((e) => [e.date.toDateString(), e])), [I]), Z = d(() => v === 1 ? [...C.slice(1), C[0]] : C, [v]), O = u.getMonth(), R = m.length > 0, ee = /* @__PURE__ */ new Date(), ne = (e, a) => {
48
+ e.preventDefault(), D(null), G(a, !0);
49
+ }, te = (e, a) => {
50
+ !f || w === null || (e.preventDefault(), e.dataTransfer.dropEffect = "move", D(a));
20
51
  };
21
- return /* @__PURE__ */ l("div", {
52
+ return /* @__PURE__ */ s("div", {
22
53
  className: "event-calendar__month",
23
54
  children: [
24
- /* @__PURE__ */ l("div", {
55
+ /* @__PURE__ */ s("div", {
25
56
  className: "event-calendar__weekdays",
26
- children: [y && /* @__PURE__ */ a("div", {
57
+ children: [B && /* @__PURE__ */ o("div", {
27
58
  className: "event-calendar__week-number event-calendar__week-number--head",
28
59
  children: "Wk"
29
- }), K.map((n) => /* @__PURE__ */ a("div", {
60
+ }), Z.map((e) => /* @__PURE__ */ o("div", {
30
61
  className: "event-calendar__weekday",
31
- children: n
32
- }, n))]
62
+ children: e
63
+ }, e))]
33
64
  }),
34
- /* @__PURE__ */ a("div", {
65
+ /* @__PURE__ */ o("div", {
35
66
  className: "event-calendar__weeks",
36
- children: u.map((n, o) => /* @__PURE__ */ l("div", {
37
- className: ["event-calendar__week", n.some((t) => R(t, G)) ? "event-calendar__week--current" : ""].filter(Boolean).join(" "),
38
- children: [y && /* @__PURE__ */ a("div", {
39
- className: "event-calendar__week-number",
40
- children: J(n[0])
41
- }), n.map((t) => {
42
- const r = t.toDateString(), h = Y.get(r), _ = h ? [...h.allDay, ...h.timed] : [], S = L === r, C = t.getDate() === 1 ? `${t.toLocaleDateString(void 0, { month: "short" })} ${t.getDate()}` : String(t.getDate()), x = S ? _ : _.slice(0, D), E = _.length - x.length;
43
- return /* @__PURE__ */ l("div", {
44
- className: [
45
- "event-calendar__day",
46
- t.getMonth() === q ? "" : "event-calendar__day--outside",
47
- U(t) ? "event-calendar__day--today" : "",
48
- V(t) ? "event-calendar__day--weekend" : "",
49
- P === r ? "event-calendar__day--drop-target" : "",
50
- N ? "event-calendar__day--clickable" : ""
51
- ].filter(Boolean).join(" "),
52
- onClick: () => N?.(t),
53
- onDragLeave: () => v((e) => e === r ? null : e),
54
- onDragOver: (e) => I(e, r),
55
- onDrop: (e) => H(e, t),
56
- children: [i ? /* @__PURE__ */ a("button", {
57
- className: "event-calendar__day-number event-calendar__day-number--button",
58
- onClick: (e) => {
59
- e.stopPropagation(), i(t);
60
- },
61
- type: "button",
62
- children: C
63
- }) : /* @__PURE__ */ a("div", {
64
- className: "event-calendar__day-number",
65
- children: C
66
- }), /* @__PURE__ */ l("div", {
67
- className: "event-calendar__day-events",
68
- children: [
69
- x.map((e) => /* @__PURE__ */ a(X, {
70
- dragEnabled: g,
71
- event: e,
72
- isDragging: b === e.id,
73
- onClick: A,
74
- onDragEnd: j,
75
- onDragStart: B,
76
- renderEvent: F,
77
- showTime: !0
78
- }, `${e.id}-${r}`)),
79
- E > 0 && /* @__PURE__ */ l("button", {
80
- className: "event-calendar__more",
81
- onClick: (e) => {
82
- if (e.stopPropagation(), i) {
83
- i(t);
84
- return;
85
- }
86
- w(r);
67
+ children: y.map((e, a) => {
68
+ const i = e.some((n) => oe(n, ee)), l = de(m, e), N = l.reduce((n, c) => Math.max(n, c.lane + 1), 0);
69
+ return /* @__PURE__ */ s("div", {
70
+ className: ["event-calendar__week", i ? "event-calendar__week--current" : ""].filter(Boolean).join(" "),
71
+ children: [B && /* @__PURE__ */ o("div", {
72
+ className: "event-calendar__week-number",
73
+ children: ae(e[0])
74
+ }), /* @__PURE__ */ s("div", {
75
+ className: "event-calendar__week-days",
76
+ style: { "--event-calendar-span-lanes": N },
77
+ children: [l.length > 0 && /* @__PURE__ */ o("div", {
78
+ className: "event-calendar__week-spans",
79
+ children: l.map((n) => /* @__PURE__ */ o(z, {
80
+ className: [
81
+ "event-calendar__chip--span",
82
+ n.isStart ? "" : "event-calendar__chip--span-continues-before",
83
+ n.isEnd ? "" : "event-calendar__chip--span-continues-after"
84
+ ].filter(Boolean).join(" "),
85
+ dragEnabled: f,
86
+ event: n.event,
87
+ isDragging: w === n.event.id,
88
+ onClick: P,
89
+ onDragEnd: $,
90
+ onDragStart: L,
91
+ renderEvent: j,
92
+ style: {
93
+ left: `${n.startIndex / e.length * 100}%`,
94
+ width: `${(n.endIndex - n.startIndex + 1) / e.length * 100}%`,
95
+ top: `calc(${n.lane} * var(--event-calendar-span-row))`
96
+ }
97
+ }, `${n.event.id}-span-${a}`))
98
+ }), e.map((n) => {
99
+ const c = n.toDateString(), k = X.get(c), p = k ? [...k.allDay.filter((t) => !ie(t)), ...k.timed] : [], W = H === c, Y = n.getDate() === 1 ? `${n.toLocaleDateString(void 0, { month: "short" })} ${n.getDate()}` : String(n.getDate()), K = W ? p : p.slice(0, E), q = p.length - K.length;
100
+ return /* @__PURE__ */ s("div", {
101
+ className: [
102
+ "event-calendar__day",
103
+ n.getMonth() === O ? "" : "event-calendar__day--outside",
104
+ ce(n) ? "event-calendar__day--today" : "",
105
+ le(n) ? "event-calendar__day--weekend" : "",
106
+ J === c ? "event-calendar__day--drop-target" : "",
107
+ V(n) ? "event-calendar__day--selecting" : "",
108
+ S ? "event-calendar__day--clickable" : ""
109
+ ].filter(Boolean).join(" "),
110
+ onClick: () => S?.(n),
111
+ onDragLeave: () => D((t) => t === c ? null : t),
112
+ onDragOver: (t) => te(t, c),
113
+ onDrop: (t) => ne(t, n),
114
+ onPointerDown: (t) => Q(t, n),
115
+ onPointerEnter: () => U(n),
116
+ children: [_ ? /* @__PURE__ */ o("button", {
117
+ className: "event-calendar__day-number event-calendar__day-number--button",
118
+ onClick: (t) => {
119
+ t.stopPropagation(), _(n);
87
120
  },
88
121
  type: "button",
122
+ children: Y
123
+ }) : /* @__PURE__ */ o("div", {
124
+ className: "event-calendar__day-number",
125
+ children: Y
126
+ }), /* @__PURE__ */ s("div", {
127
+ className: "event-calendar__day-events",
89
128
  children: [
90
- "+",
91
- E,
92
- " more"
129
+ K.map((t) => /* @__PURE__ */ o(z, {
130
+ dragEnabled: f,
131
+ event: t,
132
+ isDragging: w === t.id,
133
+ onClick: P,
134
+ onDragEnd: $,
135
+ onDragStart: L,
136
+ renderEvent: j,
137
+ showTime: !0
138
+ }, `${t.id}-${c}`)),
139
+ q > 0 && /* @__PURE__ */ s("button", {
140
+ className: "event-calendar__more",
141
+ onClick: (t) => {
142
+ if (t.stopPropagation(), _) {
143
+ _(n);
144
+ return;
145
+ }
146
+ A(c);
147
+ },
148
+ type: "button",
149
+ children: [
150
+ "+",
151
+ q,
152
+ " more"
153
+ ]
154
+ }),
155
+ W && p.length > E && /* @__PURE__ */ o("button", {
156
+ className: "event-calendar__more",
157
+ onClick: (t) => {
158
+ t.stopPropagation(), A(null);
159
+ },
160
+ type: "button",
161
+ children: "Show less"
162
+ })
93
163
  ]
94
- }),
95
- S && _.length > D && /* @__PURE__ */ a("button", {
96
- className: "event-calendar__more",
97
- onClick: (e) => {
98
- e.stopPropagation(), w(null);
99
- },
100
- type: "button",
101
- children: "Show less"
102
- })
103
- ]
164
+ })]
165
+ }, c);
104
166
  })]
105
- }, r);
106
- })]
107
- }, o))
167
+ })]
168
+ }, a);
169
+ })
108
170
  }),
109
- !z && k && /* @__PURE__ */ a("div", {
171
+ !R && x && /* @__PURE__ */ o("div", {
110
172
  className: "event-calendar__empty",
111
- children: k
173
+ children: x
112
174
  })
113
175
  ]
114
176
  });
115
177
  }
116
178
  export {
117
- ae as EventCalendarMonth
179
+ ge as EventCalendarMonth
118
180
  };
@@ -1,117 +1,142 @@
1
- import { isToday as S, isWeekend as F } from "../../helpers/Datetime.js";
2
- import { bucketEventsByDay as b, formatHourLabel as q, getWeekDays as z, isActiveHour as T, layoutDayEvents as E, startOfDay as G } from "./EventCalendar.helpers.js";
3
- import { EventCalendarChip as R } from "./EventCalendar.Chip.js";
4
- import { useEffect as J, useMemo as _, useRef as K, useState as P } from "react";
5
- import { jsx as l, jsxs as s } from "react/jsx-runtime";
6
- var Q = 8;
7
- function H({ activeHours: d, date: y, dayEndHour: m, dayStartHour: n, defaultDurationMinutes: U, dragEnabled: h, draggingId: p, events: u, firstDayOfWeek: w, hourHeight: c, onDayClick: N, onDragEnd: k, onDragStart: $, onDrop: j, onEventClick: L, renderEvent: O }) {
8
- const [B, o] = P(null), f = K(null), g = _(() => z(y, w), [y, w]), i = _(() => b(u, g), [u, g]), D = _(() => Array.from({ length: Math.max(m - n, 1) }, (e, t) => n + t), [n, m]), W = i.some((e) => e.allDay.length > 0), x = D.length * c, A = _(() => {
9
- const e = i.flatMap((t) => t.timed.map((a) => a.start.getHours()));
10
- return e.length > 0 ? Math.min(...e) : d?.start ?? Q;
11
- }, [d, i]);
12
- J(() => {
13
- if (!f.current) return;
14
- const e = Math.max(A - n - 1, 0);
15
- f.current.scrollTop = e * c;
1
+ import { isToday as R, isWeekend as q } from "../../helpers/Datetime.js";
2
+ import { bucketEventsByDay as z, formatHourLabel as G, getWeekDays as I, isActiveHour as W, isMultiDayEvent as J, layoutDayEvents as K, layoutWeekSpans as P, startOfDay as Q } from "./EventCalendar.helpers.js";
3
+ import { EventCalendarChip as x } from "./EventCalendar.Chip.js";
4
+ import { useEffect as V, useMemo as v, useRef as X, useState as Y } from "react";
5
+ import { jsx as n, jsxs as s } from "react/jsx-runtime";
6
+ var Z = 8;
7
+ function ne({ activeHours: _, date: j, dayEndHour: g, dayStartHour: r, defaultDurationMinutes: U, dragEnabled: m, draggingId: h, events: p, firstDayOfWeek: L, hourHeight: i, onDayClick: B, onDragEnd: y, onDragStart: u, onDrop: M, onEventClick: D, renderEvent: w }) {
8
+ const [O, d] = Y(null), N = X(null), l = v(() => I(j, L), [j, L]), o = v(() => z(p, l), [p, l]), k = v(() => Array.from({ length: Math.max(g - r, 1) }, (e, t) => r + t), [r, g]), F = o.some((e) => e.allDay.length > 0), $ = v(() => P(p, l), [p, l]), b = $.reduce((e, t) => Math.max(e, t.lane + 1), 0), S = k.length * i, A = v(() => {
9
+ const e = o.flatMap((t) => t.timed.map((a) => a.start.getHours()));
10
+ return e.length > 0 ? Math.min(...e) : _?.start ?? Z;
11
+ }, [_, o]);
12
+ V(() => {
13
+ if (!N.current) return;
14
+ const e = Math.max(A - r - 1, 0);
15
+ N.current.scrollTop = e * i;
16
16
  }, [
17
- n,
17
+ r,
18
18
  A,
19
- c
19
+ i
20
20
  ]);
21
21
  const C = (e, t) => {
22
- const a = G(e);
22
+ const a = Q(e);
23
23
  return a.setHours(t, 0, 0, 0), a;
24
- }, M = (e, t) => {
25
- !h || p === null || (e.preventDefault(), e.dataTransfer.dropEffect = "move", o(t));
24
+ }, T = (e, t) => {
25
+ !m || h === null || (e.preventDefault(), e.dataTransfer.dropEffect = "move", d(t));
26
26
  };
27
27
  return /* @__PURE__ */ s("div", {
28
28
  className: "event-calendar__week-view",
29
29
  children: [
30
30
  /* @__PURE__ */ s("div", {
31
31
  className: "event-calendar__week-head",
32
- children: [/* @__PURE__ */ l("div", { className: "event-calendar__gutter-spacer" }), g.map((e) => /* @__PURE__ */ s("div", {
32
+ children: [/* @__PURE__ */ n("div", { className: "event-calendar__gutter-spacer" }), l.map((e) => /* @__PURE__ */ s("div", {
33
33
  className: [
34
34
  "event-calendar__week-day-head",
35
- S(e) ? "event-calendar__week-day-head--today" : "",
36
- F(e) ? "event-calendar__week-day-head--weekend" : ""
35
+ R(e) ? "event-calendar__week-day-head--today" : "",
36
+ q(e) ? "event-calendar__week-day-head--weekend" : ""
37
37
  ].filter(Boolean).join(" "),
38
- children: [/* @__PURE__ */ l("span", {
38
+ children: [/* @__PURE__ */ n("span", {
39
39
  className: "event-calendar__week-day-name",
40
40
  children: e.toLocaleDateString(void 0, { weekday: "short" })
41
- }), /* @__PURE__ */ l("span", {
41
+ }), /* @__PURE__ */ n("span", {
42
42
  className: "event-calendar__week-day-number",
43
43
  children: e.getDate()
44
44
  })]
45
45
  }, e.toDateString()))]
46
46
  }),
47
- W && /* @__PURE__ */ s("div", {
47
+ F && /* @__PURE__ */ s("div", {
48
48
  className: "event-calendar__all-day",
49
- children: [/* @__PURE__ */ l("div", {
49
+ children: [/* @__PURE__ */ n("div", {
50
50
  className: "event-calendar__gutter-label",
51
51
  children: "All day"
52
- }), i.map((e) => {
53
- const t = `allday-${e.date.toDateString()}`;
54
- return /* @__PURE__ */ l("div", {
55
- className: ["event-calendar__all-day-cell", B === t ? "event-calendar__all-day-cell--drop-target" : ""].filter(Boolean).join(" "),
56
- onDragLeave: () => o((a) => a === t ? null : a),
57
- onDragOver: (a) => M(a, t),
58
- onDrop: (a) => {
59
- a.preventDefault(), o(null), j(e.date, !0);
60
- },
61
- children: e.allDay.map((a) => /* @__PURE__ */ l(R, {
62
- dragEnabled: h,
63
- event: a,
64
- isDragging: p === a.id,
65
- onClick: L,
66
- onDragEnd: k,
67
- onDragStart: $,
68
- renderEvent: O
69
- }, `${a.id}-${t}`))
70
- }, t);
52
+ }), /* @__PURE__ */ s("div", {
53
+ className: "event-calendar__all-day-cells",
54
+ style: { "--event-calendar-span-lanes": b },
55
+ children: [$.length > 0 && /* @__PURE__ */ n("div", {
56
+ className: "event-calendar__week-spans",
57
+ children: $.map((e) => /* @__PURE__ */ n(x, {
58
+ className: [
59
+ "event-calendar__chip--span",
60
+ e.isStart ? "" : "event-calendar__chip--span-continues-before",
61
+ e.isEnd ? "" : "event-calendar__chip--span-continues-after"
62
+ ].filter(Boolean).join(" "),
63
+ dragEnabled: m,
64
+ event: e.event,
65
+ isDragging: h === e.event.id,
66
+ onClick: D,
67
+ onDragEnd: y,
68
+ onDragStart: u,
69
+ renderEvent: w,
70
+ style: {
71
+ left: `${e.startIndex / l.length * 100}%`,
72
+ width: `${(e.endIndex - e.startIndex + 1) / l.length * 100}%`,
73
+ top: `calc(${e.lane} * var(--event-calendar-span-row))`
74
+ }
75
+ }, `${e.event.id}-span`))
76
+ }), o.map((e) => {
77
+ const t = `allday-${e.date.toDateString()}`;
78
+ return /* @__PURE__ */ n("div", {
79
+ className: ["event-calendar__all-day-cell", O === t ? "event-calendar__all-day-cell--drop-target" : ""].filter(Boolean).join(" "),
80
+ onDragLeave: () => d((a) => a === t ? null : a),
81
+ onDragOver: (a) => T(a, t),
82
+ onDrop: (a) => {
83
+ a.preventDefault(), d(null), M(e.date, !0);
84
+ },
85
+ children: e.allDay.filter((a) => !J(a)).map((a) => /* @__PURE__ */ n(x, {
86
+ dragEnabled: m,
87
+ event: a,
88
+ isDragging: h === a.id,
89
+ onClick: D,
90
+ onDragEnd: y,
91
+ onDragStart: u,
92
+ renderEvent: w
93
+ }, `${a.id}-${t}`))
94
+ }, t);
95
+ })]
71
96
  })]
72
97
  }),
73
98
  /* @__PURE__ */ s("div", {
74
99
  className: "event-calendar__week-body",
75
- ref: f,
76
- children: [/* @__PURE__ */ l("div", {
100
+ ref: N,
101
+ children: [/* @__PURE__ */ n("div", {
77
102
  className: "event-calendar__gutter",
78
- style: { height: x },
79
- children: D.map((e) => /* @__PURE__ */ l("div", {
80
- className: ["event-calendar__gutter-hour", T(e, d) ? "" : "event-calendar__gutter-hour--inactive"].filter(Boolean).join(" "),
81
- style: { height: c },
82
- children: /* @__PURE__ */ l("span", { children: q(e) })
103
+ style: { height: S },
104
+ children: k.map((e) => /* @__PURE__ */ n("div", {
105
+ className: ["event-calendar__gutter-hour", W(e, _) ? "" : "event-calendar__gutter-hour--inactive"].filter(Boolean).join(" "),
106
+ style: { height: i },
107
+ children: /* @__PURE__ */ n("span", { children: G(e) })
83
108
  }, e))
84
- }), i.map((e) => {
85
- const t = E(e.timed, n, m, U);
109
+ }), o.map((e) => {
110
+ const t = K(e.timed, r, g, U);
86
111
  return /* @__PURE__ */ s("div", {
87
- className: ["event-calendar__week-column", S(e.date) ? "event-calendar__week-column--today" : ""].filter(Boolean).join(" "),
88
- style: { height: x },
89
- children: [D.map((a) => {
90
- const v = `${e.date.toDateString()}-${a}`;
91
- return /* @__PURE__ */ l("div", {
112
+ className: ["event-calendar__week-column", R(e.date) ? "event-calendar__week-column--today" : ""].filter(Boolean).join(" "),
113
+ style: { height: S },
114
+ children: [k.map((a) => {
115
+ const f = `${e.date.toDateString()}-${a}`;
116
+ return /* @__PURE__ */ n("div", {
92
117
  className: [
93
118
  "event-calendar__slot",
94
- T(a, d) ? "" : "event-calendar__slot--inactive",
95
- B === v ? "event-calendar__slot--drop-target" : "",
96
- N ? "event-calendar__slot--clickable" : ""
119
+ W(a, _) ? "" : "event-calendar__slot--inactive",
120
+ O === f ? "event-calendar__slot--drop-target" : "",
121
+ B ? "event-calendar__slot--clickable" : ""
97
122
  ].filter(Boolean).join(" "),
98
- onClick: () => N?.(C(e.date, a)),
99
- onDragLeave: () => o((r) => r === v ? null : r),
100
- onDragOver: (r) => M(r, v),
101
- onDrop: (r) => {
102
- r.preventDefault(), o(null), j(C(e.date, a), !1);
123
+ onClick: () => B?.(C(e.date, a)),
124
+ onDragLeave: () => d((c) => c === f ? null : c),
125
+ onDragOver: (c) => T(c, f),
126
+ onDrop: (c) => {
127
+ c.preventDefault(), d(null), M(C(e.date, a), !1);
103
128
  },
104
- style: { height: c }
105
- }, v);
106
- }), t.map((a) => /* @__PURE__ */ l(R, {
129
+ style: { height: i }
130
+ }, f);
131
+ }), t.map((a) => /* @__PURE__ */ n(x, {
107
132
  className: "event-calendar__chip--positioned",
108
- dragEnabled: h,
133
+ dragEnabled: m,
109
134
  event: a.event,
110
- isDragging: p === a.event.id,
111
- onClick: L,
112
- onDragEnd: k,
113
- onDragStart: $,
114
- renderEvent: O,
135
+ isDragging: h === a.event.id,
136
+ onClick: D,
137
+ onDragEnd: y,
138
+ onDragStart: u,
139
+ renderEvent: w,
115
140
  showTime: !0,
116
141
  style: {
117
142
  top: `${a.top}%`,
@@ -127,5 +152,5 @@ function H({ activeHours: d, date: y, dayEndHour: m, dayStartHour: n, defaultDur
127
152
  });
128
153
  }
129
154
  export {
130
- H as EventCalendarWeek
155
+ ne as EventCalendarWeek
131
156
  };
@@ -1 +1 @@
1
- .event-calendar{gap:var(--spacing-12);width:100%;color:var(--body-color);--event-calendar-chip-color:var(--body-accent-color);flex-direction:column;display:flex}.event-calendar__header{align-items:center;gap:var(--spacing-12);flex-wrap:wrap;display:flex}.event-calendar__header .toggle-buttons{align-self:center;height:auto}.event-calendar__nav{align-items:center;gap:var(--spacing-4);display:flex}.event-calendar__title{font-size:var(--font-size-lg);font-weight:var(--font-weight-semibold);color:var(--body-title-color);flex:auto;margin:0}.event-calendar__header-extra{align-items:center;gap:var(--spacing-8);display:flex}.event-calendar__viewport{touch-action:pan-y}.event-calendar__month{border:1px solid var(--card-border-color);border-radius:var(--radius);background-color:var(--card-background-color);flex-direction:column;display:flex;overflow:hidden}.event-calendar__weekdays,.event-calendar__week{display:flex}.event-calendar__weekdays{background-color:var(--card-background-accent-color);border-bottom:1px solid var(--card-border-color)}.event-calendar__week-number{width:var(--spacing-32);border-right:1px solid var(--card-border-color);background-color:var(--card-background-accent-color);font-size:var(--font-size-xxs);font-variant-numeric:tabular-nums;font-weight:var(--font-weight-semibold);color:var(--body-sub-title-color);opacity:.7;flex:none;justify-content:center;align-items:center;display:flex}.event-calendar__week-number--head{text-transform:uppercase;letter-spacing:.04em}.event-calendar__week--current .event-calendar__week-number{background-color:color-mix(in srgb, var(--body-accent-color) 22%, var(--card-background-accent-color));color:var(--body-color-accent);opacity:1}.event-calendar__weekday{min-width:0;padding:var(--spacing-8);text-align:center;font-size:var(--font-size-xs);font-weight:var(--font-weight-semibold);text-transform:uppercase;letter-spacing:.04em;color:var(--body-color-muted);flex:1 1 0}.event-calendar__weeks{flex-direction:column;display:flex}.event-calendar__week{border-bottom:1px solid var(--card-border-color);flex:auto}.event-calendar__week:last-child{border-bottom:none}.event-calendar__week--current{box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--body-accent-color) 45%, transparent)}.event-calendar__day{gap:var(--spacing-4);min-width:0;min-height:var(--spacing-100);padding:var(--spacing-6);border-right:1px solid var(--card-border-color);transition:background-color var(--transition-fast);flex-direction:column;flex:1 1 0;display:flex}.event-calendar__day:last-child{border-right:none}.event-calendar__day--weekend{background-color:var(--card-background-accent-color)}.event-calendar__day--outside{background-color:color-mix(in srgb, var(--card-border-color) 22%, var(--card-background-color))}.event-calendar__day--outside .event-calendar__day-number{opacity:.5}.event-calendar__day--outside.event-calendar__day--weekend{background-color:color-mix(in srgb, var(--card-border-color) 30%, var(--card-background-accent-color))}.event-calendar__day--clickable:hover{cursor:pointer;background-color:color-mix(in srgb, var(--body-accent-color) 8%, transparent)}.event-calendar__day--drop-target{background-color:color-mix(in srgb, var(--body-accent-color) 18%, transparent);box-shadow:inset 0 0 0 2px var(--body-accent-color)}.event-calendar__day-number{font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);color:var(--body-color-muted);background:0 0;border:none;align-self:flex-start;padding:0}.event-calendar__day-number--button{min-width:var(--spacing-20);height:var(--spacing-20);border-radius:var(--radius-full);cursor:pointer}.event-calendar__day-number--button:hover{background-color:color-mix(in srgb, var(--body-accent-color) 20%, transparent);color:var(--body-color-accent)}.event-calendar__day--today .event-calendar__day-number{min-width:var(--spacing-20);height:var(--spacing-20);padding:0 var(--spacing-4);border-radius:var(--radius-full);background-color:var(--body-accent-color);color:var(--card-background-color);font-weight:var(--font-weight-bold);justify-content:center;align-self:flex-start;align-items:center;display:inline-flex}.event-calendar__day-events{gap:var(--spacing-2);flex-direction:column;min-width:0;display:flex}.event-calendar__more{padding:var(--spacing-1) var(--spacing-4);border-radius:var(--radius-sm);color:var(--body-color-muted);font-size:var(--font-size-xxs);font-weight:var(--font-weight-medium);cursor:pointer;background:0 0;border:none;align-self:flex-start}.event-calendar__more:hover{color:var(--body-accent-color);background-color:color-mix(in srgb, var(--body-accent-color) 12%, transparent)}.event-calendar__empty{padding:var(--spacing-16);text-align:center;color:var(--body-color-muted);font-size:var(--font-size-sm);border-top:1px solid var(--card-border-color)}.event-calendar__week-view{border:1px solid var(--card-border-color);border-radius:var(--radius);background-color:var(--card-background-color);flex-direction:column;display:flex;overflow:hidden}.event-calendar__week-head{background-color:var(--card-background-accent-color);border-bottom:1px solid var(--card-border-color);display:flex}.event-calendar__gutter-spacer,.event-calendar__gutter-label,.event-calendar__gutter{flex:0 0 var(--spacing-60);width:var(--spacing-60);border-right:1px solid var(--card-border-color)}.event-calendar__gutter-label{padding:var(--spacing-4) var(--spacing-6);font-size:var(--font-size-xxs);color:var(--body-color-muted);justify-content:flex-end;align-items:center;display:flex}.event-calendar__week-day-head{align-items:center;gap:var(--spacing-2);min-width:0;padding:var(--spacing-8) var(--spacing-4);border-right:1px solid var(--card-border-color);flex-direction:column;flex:1 1 0;display:flex}.event-calendar__week-day-head:last-child{border-right:none}.event-calendar__week-day-head--weekend{background-color:color-mix(in srgb, var(--body-color-muted) 8%, transparent)}.event-calendar__week-day-name{font-size:var(--font-size-xxs);text-transform:uppercase;letter-spacing:.04em;color:var(--body-color-muted)}.event-calendar__week-day-number{font-size:var(--font-size-md);font-weight:var(--font-weight-semibold);color:var(--body-color)}.event-calendar__week-day-head--today .event-calendar__week-day-number{min-width:var(--spacing-24);height:var(--spacing-24);border-radius:var(--radius-full);background-color:var(--body-accent-color);color:var(--card-background-color);justify-content:center;align-items:center;display:inline-flex}.event-calendar__all-day{border-bottom:1px solid var(--card-border-color);display:flex}.event-calendar__all-day-cell{gap:var(--spacing-2);min-width:0;padding:var(--spacing-4);border-right:1px solid var(--card-border-color);flex-direction:column;flex:1 1 0;display:flex}.event-calendar__all-day-cell:last-child{border-right:none}.event-calendar__all-day-cell--drop-target{background-color:color-mix(in srgb, var(--body-accent-color) 18%, transparent)}.event-calendar__week-body{max-height:var(--spacing-400);display:flex;overflow-y:auto}.event-calendar__gutter{flex-direction:column;display:flex}.event-calendar__gutter-hour{padding-right:var(--spacing-6);font-size:var(--font-size-xxs);color:var(--body-color-muted);justify-content:flex-end;align-items:flex-start;display:flex}.event-calendar__gutter-hour span{transform:translateY(-50%)}.event-calendar__gutter-hour:first-child span{transform:none}.event-calendar__gutter-hour--inactive{opacity:.5}.event-calendar__week-column{border-right:1px solid var(--card-border-color);flex:1 1 0;min-width:0;position:relative}.event-calendar__week-column:last-child{border-right:none}.event-calendar__week-column--today{background-color:color-mix(in srgb, var(--body-accent-color) 6%, transparent)}.event-calendar__slot{border-bottom:1px solid color-mix(in srgb, var(--card-border-color) 60%, transparent);transition:background-color var(--transition-fast)}.event-calendar__slot--inactive{background-color:color-mix(in srgb, var(--body-background) 60%, transparent)}.event-calendar__slot--clickable:hover{cursor:pointer;background-color:color-mix(in srgb, var(--body-accent-color) 10%, transparent)}.event-calendar__slot--drop-target{background-color:color-mix(in srgb, var(--body-accent-color) 22%, transparent)}.event-calendar__chip{align-items:baseline;gap:var(--spacing-4);min-width:0;padding:var(--spacing-1) var(--spacing-6);border-radius:var(--radius-sm);border-left:3px solid var(--event-calendar-chip-color);background-color:color-mix(in srgb, var(--event-calendar-chip-color) 18%, var(--card-background-color));color:var(--body-color);font-size:var(--font-size-xs);transition:background-color var(--transition-fast), opacity var(--transition-fast);line-height:1.5;display:flex;overflow:hidden}.event-calendar__chip--positioned{flex-direction:column;align-items:flex-start;gap:0;position:absolute}.event-calendar__chip--clickable:hover{cursor:pointer;background-color:color-mix(in srgb, var(--event-calendar-chip-color) 30%, var(--card-background-color))}.event-calendar__chip--draggable{cursor:grab}.event-calendar__chip--dragging{opacity:.4}.event-calendar__chip--accent{--event-calendar-chip-color:var(--body-accent-color)}.event-calendar__chip--success{--event-calendar-chip-color:var(--button-success-background-color)}.event-calendar__chip--warning{--event-calendar-chip-color:var(--button-warning-background-color)}.event-calendar__chip--danger{--event-calendar-chip-color:var(--button-danger-background-color)}.event-calendar__chip--muted{--event-calendar-chip-color:var(--body-color-muted)}.event-calendar__chip--ghost{--event-calendar-chip-color:var(--body-color-muted);border:1px dashed var(--event-calendar-chip-color);color:var(--body-color-muted);background-color:#0000;border-left-style:solid;border-left-width:3px}.event-calendar__chip--done{--event-calendar-chip-color:var(--body-color-muted);opacity:.6}.event-calendar__chip--done .event-calendar__chip-title{text-decoration:line-through}.event-calendar__chip-leading{flex:none;align-self:center;align-items:center;line-height:1;display:inline-flex}.event-calendar__chip-leading .icon{width:var(--spacing-12);height:var(--spacing-12)}.event-calendar__chip-time{font-variant-numeric:tabular-nums;font-size:var(--font-size-xxs);color:var(--body-color-muted);flex:none}.event-calendar__chip-title{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}@media (width<=767px){.event-calendar__header{gap:var(--spacing-8)}.event-calendar__nav{flex:auto}.event-calendar__header .toggle-buttons{flex:none;margin-left:auto}.event-calendar__title{font-size:var(--font-size-md);flex:100%;order:-1}.event-calendar__header-extra{flex:100%;order:1}.event-calendar__week-number{width:var(--spacing-20)}.event-calendar__day{min-height:var(--spacing-64);padding:var(--spacing-4)}.event-calendar__weekday{padding:var(--spacing-4);font-size:var(--font-size-xxs)}.event-calendar__chip{padding:0 var(--spacing-4)}.event-calendar__chip-time{display:none}:is(.event-calendar__month .event-calendar__chip:has(.event-calendar__chip-leading),.event-calendar__week-view .event-calendar__chip:has(.event-calendar__chip-leading)){padding:var(--spacing-2);justify-content:center;align-items:center;gap:0}:is(.event-calendar__month .event-calendar__chip:has(.event-calendar__chip-leading) .event-calendar__chip-title,.event-calendar__week-view .event-calendar__chip:has(.event-calendar__chip-leading) .event-calendar__chip-title){display:none}.event-calendar__gutter-spacer,.event-calendar__gutter-label,.event-calendar__gutter{flex-basis:var(--spacing-40);width:var(--spacing-40)}}
1
+ .event-calendar{--event-calendar-span-row:calc(var(--spacing-20) + var(--spacing-2));gap:var(--spacing-12);width:100%;color:var(--body-color);--event-calendar-chip-color:var(--body-accent-color);flex-direction:column;display:flex}.event-calendar__header{align-items:center;gap:var(--spacing-12);flex-wrap:wrap;display:flex}.event-calendar__header .toggle-buttons{align-self:center;height:auto}.event-calendar__nav{align-items:center;gap:var(--spacing-4);display:flex}.event-calendar__title{font-size:var(--font-size-lg);font-weight:var(--font-weight-semibold);color:var(--body-title-color);flex:auto;margin:0}.event-calendar__header-extra{align-items:center;gap:var(--spacing-8);display:flex}.event-calendar__viewport{touch-action:pan-y}.event-calendar__month{border:1px solid var(--card-border-color);border-radius:var(--radius);background-color:var(--card-background-color);flex-direction:column;display:flex;overflow:hidden}.event-calendar__weekdays,.event-calendar__week{display:flex}.event-calendar__week-days{flex:auto;min-width:0;display:flex;position:relative}.event-calendar__all-day-cells{position:relative}.event-calendar__all-day-cells>.event-calendar__week-spans{top:var(--spacing-4)}.event-calendar__all-day-cells{min-width:0;padding-top:calc(var(--event-calendar-span-lanes,0) * var(--event-calendar-span-row));flex:auto;display:flex}.event-calendar__week-spans{top:var(--spacing-24);pointer-events:none;z-index:1;position:absolute;left:0;right:0}.event-calendar__chip--span{margin:0 var(--spacing-2);pointer-events:auto;width:auto;position:absolute}.event-calendar__chip--span.event-calendar__chip--span-continues-before{border-left-width:0;border-top-left-radius:0;border-bottom-left-radius:0;margin-left:0}.event-calendar__chip--span.event-calendar__chip--span-continues-after{border-top-right-radius:0;border-bottom-right-radius:0;margin-right:0}.event-calendar__weekdays{background-color:var(--card-background-accent-color);border-bottom:1px solid var(--card-border-color)}.event-calendar__week-number{width:var(--spacing-32);border-right:1px solid var(--card-border-color);background-color:var(--card-background-accent-color);font-size:var(--font-size-xxs);font-variant-numeric:tabular-nums;font-weight:var(--font-weight-semibold);color:var(--body-sub-title-color);opacity:.7;flex:none;justify-content:center;align-items:center;display:flex}.event-calendar__week-number--head{text-transform:uppercase;letter-spacing:.04em}.event-calendar__week--current .event-calendar__week-number{background-color:color-mix(in srgb, var(--body-accent-color) 22%, var(--card-background-accent-color));color:var(--body-color-accent);opacity:1}.event-calendar__weekday{min-width:0;padding:var(--spacing-8);text-align:center;font-size:var(--font-size-xs);font-weight:var(--font-weight-semibold);text-transform:uppercase;letter-spacing:.04em;color:var(--body-color-muted);flex:1 1 0}.event-calendar__weeks{flex-direction:column;display:flex}.event-calendar__week{border-bottom:1px solid var(--card-border-color);flex:auto}.event-calendar__week:last-child{border-bottom:none}.event-calendar__week--current{box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--body-accent-color) 45%, transparent)}.event-calendar__day{gap:var(--spacing-4);min-width:0;min-height:var(--spacing-100);padding:var(--spacing-6);border-right:1px solid var(--card-border-color);transition:background-color var(--transition-fast);flex-direction:column;flex:1 1 0;display:flex}.event-calendar__day:last-child{border-right:none}.event-calendar__day--weekend{background-color:var(--card-background-accent-color)}.event-calendar__day--outside{background-color:color-mix(in srgb, var(--card-border-color) 22%, var(--card-background-color))}.event-calendar__day--outside .event-calendar__day-number{opacity:.5}.event-calendar__day--outside.event-calendar__day--weekend{background-color:color-mix(in srgb, var(--card-border-color) 30%, var(--card-background-accent-color))}.event-calendar__day--clickable:hover{cursor:pointer;background-color:color-mix(in srgb, var(--body-accent-color) 8%, transparent)}.event-calendar__day--drop-target{background-color:color-mix(in srgb, var(--body-accent-color) 18%, transparent);box-shadow:inset 0 0 0 2px var(--body-accent-color)}.event-calendar__day--selecting{background-color:color-mix(in srgb, var(--body-accent-color) 14%, transparent)}.event-calendar__week-days{-webkit-user-select:none;user-select:none}.event-calendar__day-number{font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);color:var(--body-color-muted);background:0 0;border:none;align-self:flex-start;padding:0}.event-calendar__day-number--button{min-width:var(--spacing-20);height:var(--spacing-20);border-radius:var(--radius-full);cursor:pointer}.event-calendar__day-number--button:hover{background-color:color-mix(in srgb, var(--body-accent-color) 20%, transparent);color:var(--body-color-accent)}.event-calendar__day--today .event-calendar__day-number{min-width:var(--spacing-20);height:var(--spacing-20);padding:0 var(--spacing-4);border-radius:var(--radius-full);background-color:var(--body-accent-color);color:var(--card-background-color);font-weight:var(--font-weight-bold);justify-content:center;align-self:flex-start;align-items:center;display:inline-flex}.event-calendar__day-events{margin-top:calc(var(--event-calendar-span-lanes,0) * var(--event-calendar-span-row));gap:var(--spacing-2);flex-direction:column;min-width:0;display:flex}.event-calendar__more{padding:var(--spacing-1) var(--spacing-4);border-radius:var(--radius-sm);color:var(--body-color-muted);font-size:var(--font-size-xxs);font-weight:var(--font-weight-medium);cursor:pointer;background:0 0;border:none;align-self:flex-start}.event-calendar__more:hover{color:var(--body-accent-color);background-color:color-mix(in srgb, var(--body-accent-color) 12%, transparent)}.event-calendar__empty{padding:var(--spacing-16);text-align:center;color:var(--body-color-muted);font-size:var(--font-size-sm);border-top:1px solid var(--card-border-color)}.event-calendar__week-view{border:1px solid var(--card-border-color);border-radius:var(--radius);background-color:var(--card-background-color);flex-direction:column;display:flex;overflow:hidden}.event-calendar__week-head{background-color:var(--card-background-accent-color);border-bottom:1px solid var(--card-border-color);display:flex}.event-calendar__gutter-spacer,.event-calendar__gutter-label,.event-calendar__gutter{flex:0 0 var(--spacing-60);width:var(--spacing-60);border-right:1px solid var(--card-border-color)}.event-calendar__gutter-label{padding:var(--spacing-4) var(--spacing-6);font-size:var(--font-size-xxs);color:var(--body-color-muted);justify-content:flex-end;align-items:center;display:flex}.event-calendar__week-day-head{align-items:center;gap:var(--spacing-2);min-width:0;padding:var(--spacing-8) var(--spacing-4);border-right:1px solid var(--card-border-color);flex-direction:column;flex:1 1 0;display:flex}.event-calendar__week-day-head:last-child{border-right:none}.event-calendar__week-day-head--weekend{background-color:color-mix(in srgb, var(--body-color-muted) 8%, transparent)}.event-calendar__week-day-name{font-size:var(--font-size-xxs);text-transform:uppercase;letter-spacing:.04em;color:var(--body-color-muted)}.event-calendar__week-day-number{font-size:var(--font-size-md);font-weight:var(--font-weight-semibold);color:var(--body-color)}.event-calendar__week-day-head--today .event-calendar__week-day-number{min-width:var(--spacing-24);height:var(--spacing-24);border-radius:var(--radius-full);background-color:var(--body-accent-color);color:var(--card-background-color);justify-content:center;align-items:center;display:inline-flex}.event-calendar__all-day{border-bottom:1px solid var(--card-border-color);display:flex}.event-calendar__all-day-cell{gap:var(--spacing-2);min-width:0;padding:var(--spacing-4);border-right:1px solid var(--card-border-color);flex-direction:column;flex:1 1 0;display:flex}.event-calendar__all-day-cell:last-child{border-right:none}.event-calendar__all-day-cell--drop-target{background-color:color-mix(in srgb, var(--body-accent-color) 18%, transparent)}.event-calendar__week-body{max-height:var(--spacing-400);display:flex;overflow-y:auto}.event-calendar__gutter{flex-direction:column;display:flex}.event-calendar__gutter-hour{padding-right:var(--spacing-6);font-size:var(--font-size-xxs);color:var(--body-color-muted);justify-content:flex-end;align-items:flex-start;display:flex}.event-calendar__gutter-hour span{transform:translateY(-50%)}.event-calendar__gutter-hour:first-child span{transform:none}.event-calendar__gutter-hour--inactive{opacity:.5}.event-calendar__week-column{border-right:1px solid var(--card-border-color);flex:1 1 0;min-width:0;position:relative}.event-calendar__week-column:last-child{border-right:none}.event-calendar__week-column--today{background-color:color-mix(in srgb, var(--body-accent-color) 6%, transparent)}.event-calendar__slot{border-bottom:1px solid color-mix(in srgb, var(--card-border-color) 60%, transparent);transition:background-color var(--transition-fast)}.event-calendar__slot--inactive{background-color:color-mix(in srgb, var(--body-background) 60%, transparent)}.event-calendar__slot--clickable:hover{cursor:pointer;background-color:color-mix(in srgb, var(--body-accent-color) 10%, transparent)}.event-calendar__slot--drop-target{background-color:color-mix(in srgb, var(--body-accent-color) 22%, transparent)}.event-calendar__chip{align-items:baseline;gap:var(--spacing-4);min-width:0;padding:var(--spacing-1) var(--spacing-6);border-radius:var(--radius-sm);border-left:3px solid var(--event-calendar-chip-color);background-color:color-mix(in srgb, var(--event-calendar-chip-color) 18%, var(--card-background-color));color:var(--body-color);font-size:var(--font-size-xs);transition:background-color var(--transition-fast), opacity var(--transition-fast);line-height:1.5;display:flex;overflow:hidden}.event-calendar__chip--positioned{flex-direction:column;align-items:flex-start;gap:0;position:absolute}.event-calendar__chip--clickable:hover{cursor:pointer;background-color:color-mix(in srgb, var(--event-calendar-chip-color) 30%, var(--card-background-color))}.event-calendar__chip--draggable{cursor:grab}.event-calendar__chip--dragging{opacity:.4}.event-calendar__chip--accent{--event-calendar-chip-color:var(--body-accent-color)}.event-calendar__chip--success{--event-calendar-chip-color:var(--button-success-background-color)}.event-calendar__chip--warning{--event-calendar-chip-color:var(--button-warning-background-color)}.event-calendar__chip--danger{--event-calendar-chip-color:var(--button-danger-background-color)}.event-calendar__chip--muted{--event-calendar-chip-color:var(--body-color-muted)}.event-calendar__chip--ghost{--event-calendar-chip-color:var(--body-color-muted);border:1px dashed var(--event-calendar-chip-color);color:var(--body-color-muted);background-color:#0000;border-left-style:solid;border-left-width:3px}.event-calendar__chip--done{--event-calendar-chip-color:var(--body-color-muted);opacity:.6}.event-calendar__chip--done .event-calendar__chip-title{text-decoration:line-through}.event-calendar__chip-leading{flex:none;align-self:center;align-items:center;line-height:1;display:inline-flex}.event-calendar__chip-leading .icon{width:var(--spacing-12);height:var(--spacing-12)}.event-calendar__chip-time{font-variant-numeric:tabular-nums;font-size:var(--font-size-xxs);color:var(--body-color-muted);flex:none}.event-calendar__chip-title{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}@media (width<=767px){.event-calendar__header{gap:var(--spacing-8)}.event-calendar__nav{flex:auto}.event-calendar__header .toggle-buttons{flex:none;margin-left:auto}.event-calendar__title{font-size:var(--font-size-md);flex:100%;order:-1}.event-calendar__header-extra{flex:100%;order:1}.event-calendar__week-number{width:var(--spacing-20)}.event-calendar__day{min-height:var(--spacing-64);padding:var(--spacing-4)}.event-calendar__weekday{padding:var(--spacing-4);font-size:var(--font-size-xxs)}.event-calendar__chip{padding:0 var(--spacing-4)}.event-calendar__chip-time{display:none}:is(.event-calendar__month .event-calendar__chip:has(.event-calendar__chip-leading),.event-calendar__week-view .event-calendar__chip:has(.event-calendar__chip-leading)){padding:var(--spacing-2);justify-content:center;align-items:center;gap:0}:is(.event-calendar__month .event-calendar__chip:has(.event-calendar__chip-leading) .event-calendar__chip-title,.event-calendar__week-view .event-calendar__chip:has(.event-calendar__chip-leading) .event-calendar__chip-title){display:none}.event-calendar__gutter-spacer,.event-calendar__gutter-label,.event-calendar__gutter{flex-basis:var(--spacing-40);width:var(--spacing-40)}}
@@ -1,72 +1,93 @@
1
- import { addDays as y, isSameDay as S } from "../../helpers/Datetime.js";
2
- var d = (t) => new Date(t.getFullYear(), t.getMonth(), t.getDate()), x = (t, r) => {
3
- const n = (t.getDay() - r + 7) % 7;
4
- return y(d(t), -n);
5
- }, T = (t, r) => {
6
- const n = x(t, r);
7
- return Array.from({ length: 7 }, (o, i) => y(n, i));
8
- }, w = (t) => t.getHours() * 60 + t.getMinutes(), v = (t, r) => t.end ?? new Date(t.start.getTime() + r * 6e4), k = (t, r) => r.map((n) => {
1
+ import { addDays as D, isSameDay as w } from "../../helpers/Datetime.js";
2
+ var g = (t) => new Date(t.getFullYear(), t.getMonth(), t.getDate()), T = (t, r) => {
3
+ const a = (t.getDay() - r + 7) % 7;
4
+ return D(g(t), -a);
5
+ }, B = (t, r) => {
6
+ const a = T(t, r);
7
+ return Array.from({ length: 7 }, (o, i) => D(a, i));
8
+ }, S = (t) => t.getHours() * 60 + t.getMinutes(), v = (t, r) => t.end ?? new Date(t.start.getTime() + r * 6e4), O = (t, r) => r.map((a) => {
9
9
  const o = [], i = [];
10
- return t.forEach((e) => {
11
- if (e.allDay) {
12
- const h = d(e.start), m = d(e.end ?? e.start);
13
- n >= h && n <= m && o.push(e);
10
+ return t.forEach((s) => {
11
+ if (s.allDay) {
12
+ const l = g(s.start), e = g(s.end ?? s.start);
13
+ a >= l && a <= e && o.push(s);
14
14
  return;
15
15
  }
16
- S(e.start, n) && i.push(e);
17
- }), i.sort((e, h) => e.start.getTime() - h.start.getTime()), {
18
- date: n,
16
+ w(s.start, a) && i.push(s);
17
+ }), i.sort((s, l) => s.start.getTime() - l.start.getTime()), {
18
+ date: a,
19
19
  allDay: o,
20
20
  timed: i
21
21
  };
22
- }), O = (t, r, n, o) => {
22
+ }), W = (t, r, a, o) => {
23
23
  if (t.length === 0) return [];
24
- const i = r * 60, e = n * 60, h = Math.max(e - i, 1), m = t.map((a) => {
25
- const u = w(a.start);
24
+ const i = r * 60, s = a * 60, l = Math.max(s - i, 1), e = t.map((n) => {
25
+ const d = S(n.start);
26
26
  return {
27
- event: a,
28
- start: u,
29
- end: Math.max(w(v(a, o)), u + 15)
27
+ event: n,
28
+ start: d,
29
+ end: Math.max(S(v(n, o)), d + 15)
30
30
  };
31
- }), D = [];
32
- let l = [], c = -1;
31
+ }), u = [];
32
+ let h = [], m = -1;
33
33
  const p = () => {
34
- if (l.length === 0) return;
35
- const a = [], u = /* @__PURE__ */ new Map();
36
- l.forEach((s) => {
37
- let g = a.findIndex((f) => f <= s.start);
38
- g === -1 && (g = a.length), a[g] = s.end, u.set(s.event, g);
34
+ if (h.length === 0) return;
35
+ const n = [], d = /* @__PURE__ */ new Map();
36
+ h.forEach((c) => {
37
+ let f = n.findIndex((M) => M <= c.start);
38
+ f === -1 && (f = n.length), n[f] = c.end, d.set(c.event, f);
39
39
  });
40
- const M = a.length;
41
- l.forEach((s) => {
42
- const g = u.get(s.event) ?? 0, f = (s.start - i) / h * 100, E = (s.end - s.start) / h * 100;
43
- D.push({
44
- event: s.event,
45
- top: Math.max(f, 0),
46
- height: Math.min(Math.max(E, 1.5), 100 - Math.max(f, 0)),
47
- left: g / M * 100,
48
- width: 1 / M * 100
40
+ const E = n.length;
41
+ h.forEach((c) => {
42
+ const f = d.get(c.event) ?? 0, M = (c.start - i) / l * 100, y = (c.end - c.start) / l * 100;
43
+ u.push({
44
+ event: c.event,
45
+ top: Math.max(M, 0),
46
+ height: Math.min(Math.max(y, 1.5), 100 - Math.max(M, 0)),
47
+ left: f / E * 100,
48
+ width: 1 / E * 100
49
49
  });
50
- }), l = [], c = -1;
50
+ }), h = [], m = -1;
51
51
  };
52
- return [...m].sort((a, u) => a.start - u.start || a.end - u.end).forEach((a) => {
53
- l.length > 0 && a.start >= c && p(), l.push(a), c = Math.max(c, a.end);
54
- }), p(), D;
55
- }, $ = (t, r, n) => {
56
- if (!n) return new Date(r);
57
- const o = d(r);
52
+ return [...e].sort((n, d) => n.start - d.start || n.end - d.end).forEach((n) => {
53
+ h.length > 0 && n.start >= m && p(), h.push(n), m = Math.max(m, n.end);
54
+ }), p(), u;
55
+ }, $ = (t, r, a) => {
56
+ if (!a) return new Date(r);
57
+ const o = g(r);
58
58
  return o.setHours(t.start.getHours(), t.start.getMinutes(), 0, 0), o;
59
- }, b = (t, r) => !r || t >= r.start && t < r.end, A = (t) => `${t.toString().padStart(2, "0")}:00`, C = (t) => `${t.getHours().toString().padStart(2, "0")}:${t.getMinutes().toString().padStart(2, "0")}`;
59
+ }, k = (t, r) => !r || t >= r.start && t < r.end, C = (t) => `${t.toString().padStart(2, "0")}:00`, F = (t) => `${t.getHours().toString().padStart(2, "0")}:${t.getMinutes().toString().padStart(2, "0")}`, I = (t) => !!(t.allDay && t.end && g(t.end) > g(t.start)), H = 864e5, x = (t, r) => Math.round((r.getTime() - t.getTime()) / H), Y = (t, r) => {
60
+ if (r.length === 0) return [];
61
+ const a = g(r[0]), o = g(r[r.length - 1]), i = r.length - 1, s = t.filter(I).map((e) => ({
62
+ event: e,
63
+ start: g(e.start),
64
+ end: g(e.end ?? e.start)
65
+ })).filter(({ end: e, start: u }) => e >= a && u <= o).sort((e, u) => e.start.getTime() - u.start.getTime() || u.end.getTime() - e.end.getTime()), l = [];
66
+ return s.map(({ end: e, event: u, start: h }) => {
67
+ const m = Math.max(x(a, h), 0), p = Math.min(x(a, e), i);
68
+ let n = l.findIndex((d) => d < m);
69
+ return n === -1 && (n = l.length), l[n] = p, {
70
+ event: u,
71
+ startIndex: m,
72
+ endIndex: p,
73
+ lane: n,
74
+ isStart: h >= a,
75
+ isEnd: e <= o
76
+ };
77
+ });
78
+ };
60
79
  export {
61
- k as bucketEventsByDay,
80
+ O as bucketEventsByDay,
62
81
  $ as buildDroppedStart,
63
- C as formatEventTime,
64
- A as formatHourLabel,
82
+ F as formatEventTime,
83
+ C as formatHourLabel,
65
84
  v as getEventEnd,
66
- T as getWeekDays,
67
- b as isActiveHour,
68
- O as layoutDayEvents,
69
- w as minutesFromMidnight,
70
- d as startOfDay,
71
- x as startOfWeek
85
+ B as getWeekDays,
86
+ k as isActiveHour,
87
+ I as isMultiDayEvent,
88
+ W as layoutDayEvents,
89
+ Y as layoutWeekSpans,
90
+ S as minutesFromMidnight,
91
+ g as startOfDay,
92
+ T as startOfWeek
72
93
  };
@@ -1,16 +1,16 @@
1
1
  import './EventCalendar.css';
2
2
  import { Button as N } from "../Button/Button2.js";
3
- import { addDays as Z, addMonths as H } from "../../helpers/Datetime.js";
4
- import { useSwipe as ee } from "../../hooks/useSwipe.js";
5
- import { buildDroppedStart as te, getWeekDays as ae, startOfDay as T } from "./EventCalendar.helpers.js";
6
- import { DayAgenda as ne } from "../DayAgenda/DayAgenda2.js";
7
- import { ToggleButtons as re } from "../ToggleButtons/ToggleButtons2.js";
8
- import { EventCalendarMonth as le } from "./EventCalendar.Month.js";
9
- import { EventCalendarWeek as oe } from "./EventCalendar.Week.js";
3
+ import { addDays as H, addMonths as ee } from "../../helpers/Datetime.js";
4
+ import { useSwipe as te } from "../../hooks/useSwipe.js";
5
+ import { buildDroppedStart as ae, getWeekDays as ne, startOfDay as T } from "./EventCalendar.helpers.js";
6
+ import { DayAgenda as re } from "../DayAgenda/DayAgenda2.js";
7
+ import { ToggleButtons as le } from "../ToggleButtons/ToggleButtons2.js";
8
+ import { EventCalendarMonth as oe } from "./EventCalendar.Month.js";
9
+ import { EventCalendarWeek as ie } from "./EventCalendar.Week.js";
10
10
  /* empty css */
11
- import { useCallback as s, useMemo as ie, useState as f } from "react";
11
+ import { useCallback as s, useMemo as se, useState as f } from "react";
12
12
  import { jsx as n, jsxs as F } from "react/jsx-runtime";
13
- var se = [{
13
+ var ce = [{
14
14
  key: "month",
15
15
  label: "Month",
16
16
  icon: "calendar-month"
@@ -18,27 +18,27 @@ var se = [{
18
18
  key: "week",
19
19
  label: "Week",
20
20
  icon: "calendar-week"
21
- }], ce = (r) => r.toLocaleDateString(void 0, {
21
+ }], de = (r) => r.toLocaleDateString(void 0, {
22
22
  month: "long",
23
23
  year: "numeric"
24
- }), d = (r) => r.toLocaleDateString(void 0, { month: "short" }), de = (r, D) => {
25
- const l = ae(r, D), t = l[0], a = l[l.length - 1];
24
+ }), d = (r) => r.toLocaleDateString(void 0, { month: "short" }), me = (r, D) => {
25
+ const l = ne(r, D), t = l[0], a = l[l.length - 1];
26
26
  return t.getFullYear() !== a.getFullYear() ? `${t.getDate()} ${d(t)} ${t.getFullYear()} – ${a.getDate()} ${d(a)} ${a.getFullYear()}` : t.getMonth() !== a.getMonth() ? `${t.getDate()} ${d(t)} – ${a.getDate()} ${d(a)} ${a.getFullYear()}` : `${t.getDate()} – ${a.getDate()} ${d(a)} ${a.getFullYear()}`;
27
27
  };
28
- function Se({ activeHours: r, className: D, date: l, dayAgenda: t = !1, dayEndHour: a = 24, dayStartHour: y = 0, defaultDurationMinutes: C = 30, emptyLabel: Y, events: b, firstDayOfWeek: v = 0, headerExtra: z, hourHeight: V = 44, maxEventsPerDay: W = 3, onDateChange: $, onDayClick: _, onEventClick: m, onEventDrop: g, onViewChange: w, renderEvent: B, showHeader: x = !0, showWeekNumbers: L = !1, swipeNavigation: P = !0, view: h }) {
29
- const [A, E] = f(() => T(l ?? /* @__PURE__ */ new Date())), [O, R] = f(h ?? "month"), [c, S] = f(null), [I, u] = f(null), o = l ?? A, i = h ?? O, q = !!g, M = s((e) => {
30
- $ && $(e), l || E(e);
31
- }, [l, $]), G = s((e) => {
32
- w && w(e), h || R(e);
28
+ function Me({ activeHours: r, className: D, date: l, dayAgenda: t = !1, dayEndHour: a = 24, dayStartHour: y = 0, defaultDurationMinutes: C = 30, emptyLabel: Y, events: b, firstDayOfWeek: v = 0, headerExtra: z, hourHeight: V = 44, maxEventsPerDay: W = 3, onDateChange: $, onDayClick: _, onEventClick: m, onEventDrop: g, onRangeSelect: x, onViewChange: w, renderEvent: B, showHeader: L = !0, showWeekNumbers: P = !1, swipeNavigation: A = !0, view: h }) {
29
+ const [E, O] = f(() => T(l ?? /* @__PURE__ */ new Date())), [R, q] = f(h ?? "month"), [c, S] = f(null), [I, u] = f(null), o = l ?? E, i = h ?? R, G = !!g, M = s((e) => {
30
+ $ && $(e), l || O(e);
31
+ }, [l, $]), J = s((e) => {
32
+ w && w(e), h || q(e);
33
33
  }, [w, h]), p = s((e) => {
34
- M(i === "month" ? H(o, e) : Z(o, e * 7));
34
+ M(i === "month" ? ee(o, e) : H(o, e * 7));
35
35
  }, [
36
36
  o,
37
37
  i,
38
38
  M
39
- ]), J = s((e, X) => {
40
- !c || !g || (g(c, te(c, e, X)), S(null));
41
- }, [c, g]), k = s((e) => u(T(e)), []), K = s((e) => {
39
+ ]), K = s((e, Z) => {
40
+ !c || !g || (g(c, ae(c, e, Z)), S(null));
41
+ }, [c, g]), k = s((e) => u(T(e)), []), Q = s((e) => {
42
42
  if (t) {
43
43
  k(e.start);
44
44
  return;
@@ -48,33 +48,34 @@ function Se({ activeHours: r, className: D, date: l, dayAgenda: t = !1, dayEndHo
48
48
  t,
49
49
  m,
50
50
  k
51
- ]), Q = ee({
52
- enabled: P,
51
+ ]), U = te({
52
+ enabled: A,
53
53
  onSwipeLeft: () => p(1),
54
54
  onSwipeRight: () => p(-1)
55
- }), U = ie(() => i === "month" ? ce(o) : de(o, v), [
55
+ }), X = se(() => i === "month" ? de(o) : me(o, v), [
56
56
  o,
57
57
  i,
58
58
  v
59
59
  ]), j = {
60
60
  activeHours: r,
61
61
  date: o,
62
- dragEnabled: q,
62
+ dragEnabled: G,
63
63
  draggingId: c?.id ?? null,
64
64
  events: b,
65
65
  firstDayOfWeek: v,
66
66
  onDayClick: _,
67
67
  onDragEnd: () => S(null),
68
68
  onDragStart: (e) => S(e),
69
- onDrop: J,
70
- onEventClick: t || m ? K : void 0,
69
+ onDrop: K,
70
+ onRangeSelect: x,
71
+ onEventClick: t || m ? Q : void 0,
71
72
  renderEvent: B,
72
- showWeekNumbers: L
73
+ showWeekNumbers: P
73
74
  };
74
75
  return /* @__PURE__ */ F("div", {
75
76
  className: ["event-calendar", D ?? ""].filter(Boolean).join(" "),
76
77
  children: [
77
- x && /* @__PURE__ */ F("div", {
78
+ L && /* @__PURE__ */ F("div", {
78
79
  className: "event-calendar__header",
79
80
  children: [
80
81
  /* @__PURE__ */ F("div", {
@@ -103,29 +104,29 @@ function Se({ activeHours: r, className: D, date: l, dayAgenda: t = !1, dayEndHo
103
104
  }),
104
105
  /* @__PURE__ */ n("h2", {
105
106
  className: "event-calendar__title",
106
- children: U
107
+ children: X
107
108
  }),
108
109
  z && /* @__PURE__ */ n("div", {
109
110
  className: "event-calendar__header-extra",
110
111
  children: z
111
112
  }),
112
- /* @__PURE__ */ n(re, {
113
- onToggleChange: (e) => G(e),
113
+ /* @__PURE__ */ n(le, {
114
+ onToggleChange: (e) => J(e),
114
115
  size: "small",
115
116
  state: i,
116
- states: se
117
+ states: ce
117
118
  })
118
119
  ]
119
120
  }),
120
121
  /* @__PURE__ */ n("div", {
121
122
  className: "event-calendar__viewport",
122
- ...Q,
123
- children: i === "month" ? /* @__PURE__ */ n(le, {
123
+ ...U,
124
+ children: i === "month" ? /* @__PURE__ */ n(oe, {
124
125
  ...j,
125
126
  emptyLabel: Y,
126
127
  maxEventsPerDay: W,
127
128
  onOpenDay: t ? k : void 0
128
- }) : /* @__PURE__ */ n(oe, {
129
+ }) : /* @__PURE__ */ n(ie, {
129
130
  ...j,
130
131
  dayEndHour: a,
131
132
  dayStartHour: y,
@@ -133,7 +134,7 @@ function Se({ activeHours: r, className: D, date: l, dayAgenda: t = !1, dayEndHo
133
134
  hourHeight: V
134
135
  })
135
136
  }),
136
- I && /* @__PURE__ */ n(ne, {
137
+ I && /* @__PURE__ */ n(re, {
137
138
  activeHours: r,
138
139
  date: I,
139
140
  onDateChange: u,
@@ -151,5 +152,5 @@ function Se({ activeHours: r, className: D, date: l, dayAgenda: t = !1, dayEndHo
151
152
  });
152
153
  }
153
154
  export {
154
- Se as EventCalendar
155
+ Me as EventCalendar
155
156
  };
@@ -23,7 +23,7 @@ var r = (i) => {
23
23
  const o = {
24
24
  ...i,
25
25
  lib: d,
26
- libBuildNumber: 452,
26
+ libBuildNumber: 461,
27
27
  libCommit: n,
28
28
  libBuildDate: t
29
29
  };
package/dist/index.d.ts CHANGED
@@ -1430,7 +1430,7 @@ declare interface ErrorBoundaryState {
1430
1430
  error: Error | null;
1431
1431
  }
1432
1432
 
1433
- export declare function EventCalendar<T>({ activeHours, className, date, dayAgenda, dayEndHour, dayStartHour, defaultDurationMinutes, emptyLabel, events, firstDayOfWeek, headerExtra, hourHeight, maxEventsPerDay, onDateChange, onDayClick, onEventClick, onEventDrop, onViewChange, renderEvent, showHeader, showWeekNumbers, swipeNavigation, view, }: EventCalendarProps<T>): JSX.Element;
1433
+ export declare function EventCalendar<T>({ activeHours, className, date, dayAgenda, dayEndHour, dayStartHour, defaultDurationMinutes, emptyLabel, events, firstDayOfWeek, headerExtra, hourHeight, maxEventsPerDay, onDateChange, onDayClick, onEventClick, onEventDrop, onRangeSelect, onViewChange, renderEvent, showHeader, showWeekNumbers, swipeNavigation, view, }: EventCalendarProps<T>): JSX.Element;
1434
1434
 
1435
1435
  export declare interface EventCalendarProps<T = unknown> {
1436
1436
  events: CalendarEvent<T>[];
@@ -1452,6 +1452,18 @@ export declare interface EventCalendarProps<T = unknown> {
1452
1452
  onEventClick?: (event: CalendarEvent<T>) => void;
1453
1453
  /** Fires on the empty part of a day cell (month) or an hour slot (week). */
1454
1454
  onDayClick?: (date: Date) => void;
1455
+ /**
1456
+ * Dragging across the month grid selects a run of days and fires this on release, with
1457
+ * `start` always the earlier end whichever way the drag went. It is how a period gets
1458
+ * created by pointing at it rather than typing two dates into a form.
1459
+ *
1460
+ * A press that never leaves its day is a click, not a selection, and goes to
1461
+ * `onDayClick` instead — so the two can both be set without competing.
1462
+ */
1463
+ onRangeSelect?: (range: {
1464
+ start: Date;
1465
+ end: Date;
1466
+ }) => void;
1455
1467
  /**
1456
1468
  * Enables drag-to-reschedule. `nextStart` keeps the original time of day in month
1457
1469
  * view, and snaps to the dropped hour slot in week view.
package/dist/version.js CHANGED
@@ -1,4 +1,4 @@
1
- var I = "3.1.5", B = 452, L = "7f7e753", _ = "2026-10-02T12:17:26.091Z", r = "452";
1
+ var I = "3.2.0", B = 461, L = "0282050", _ = "2026-10-02T16:22:52.153Z", r = "461";
2
2
  export {
3
3
  _ as LIB_BUILD_DATE,
4
4
  r as LIB_BUILD_ID,
package/dist/version.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "3.1.5",
3
- "buildNumber": 452,
4
- "commit": "7f7e753",
5
- "buildDate": "2026-10-02T12:17:26.091Z"
2
+ "version": "3.2.0",
3
+ "buildNumber": 461,
4
+ "commit": "0282050",
5
+ "buildDate": "2026-10-02T16:22:52.153Z"
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memobit/libs",
3
- "version": "3.1.5",
3
+ "version": "3.2.0",
4
4
  "description": "React component library powering the Memobit apps — 100+ components, helpers and hooks. Icons ship as @memobit/icons and themes as @memobit/themes. TypeScript-first, ESM-only, React 19.",
5
5
  "keywords": [
6
6
  "react",