@ziix/calendar 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -57,6 +57,14 @@ export declare class Calendar {
57
57
  getEvents(): CalEvent[];
58
58
  getResources(): CalResource[];
59
59
  getResourceById(id: string | number): ResourceHandle | null;
60
+ private resourceRenderScheduled;
61
+ /**
62
+ * Coalesce resource-area re-renders: many setExtendedProp calls in a row (e.g.
63
+ * pushing work hours / punch-ins for every resource) collapse into a single
64
+ * cell update on the next microtask, and event bars are never rebuilt — so the
65
+ * timeline doesn't flicker.
66
+ */
67
+ private scheduleResourceRender;
60
68
  private resourceHandle;
61
69
  private handle;
62
70
  /** Build the inner body of an event, honouring the `renderEvent` hook. */
@@ -1 +1 @@
1
- .zc{--zc-border: #e2e2e2;--zc-bg: #ffffff;--zc-muted-bg: #f6f6f6;--zc-fg: #1a1a1a;--zc-muted-fg: #6b7280;--zc-today-bg: #f0f6ff;--zc-now: #ef4444;--zc-btn-bg: transparent;--zc-btn-fg: var(--zc-fg);--zc-btn-border: var(--zc-border);--zc-btn-hover-bg: var(--zc-muted-bg);--zc-btn-active-bg: #e7efff;--zc-event-bg: #c7dbff;--zc-event-border: #a9c6ff;--zc-event-fg: #1e3a5f;--zc-nonbusiness: oklch(0 0 0 / .045);--zc-radius: 6px;--zc-font: inherit;display:flex;flex-direction:column;box-sizing:border-box;font-family:var(--zc-font);color:var(--zc-fg);background:var(--zc-bg)}.zc *,.zc *:before,.zc *:after{box-sizing:border-box}.zc-toolbar{display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:.5rem .75rem;flex:0 0 auto}.zc-toolbar-section{display:flex;align-items:center;gap:.375rem}.zc-btn-group{display:inline-flex}.zc-btn-group .zc-btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0;margin-left:-1px}.zc-btn-group .zc-btn:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.zc-toolbar-center{flex:1 1 auto;justify-content:center}.zc-title{margin:0;font-size:1rem;font-weight:600;text-transform:capitalize}.zc-btn{-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;font:inherit;font-size:.875rem;line-height:1.2;padding:.375rem .75rem;border-radius:var(--zc-radius);border:1px solid var(--zc-btn-border);background:var(--zc-btn-bg);color:var(--zc-btn-fg)}.zc-btn:hover{background:var(--zc-btn-hover-bg)}.zc-btn:active{background:var(--zc-btn-active-bg)}.zc-body{flex:1 1 auto;overflow:auto;position:relative;border-top:1px solid var(--zc-border)}.zc-timegrid{display:flex;align-items:stretch;position:relative;min-height:100%}.zc-axis{position:relative;flex:0 0 56px;border-right:1px solid var(--zc-border)}.zc-axis-label{position:absolute;right:6px;transform:translateY(-50%);font-size:.6875rem;color:var(--zc-muted-fg);white-space:nowrap}.zc-col{position:relative;flex:1 1 auto}.zc-slot-line{position:absolute;left:0;right:0;border-top:1px solid var(--zc-border);opacity:.4}.zc-slot-line.zc-slot-major{opacity:1}.zc-event{position:absolute;overflow:hidden;border-radius:var(--zc-radius);border:1px solid var(--zc-event-border);background:var(--zc-event-bg);color:var(--zc-event-fg);font-size:.75rem;cursor:pointer}.zc-event-main{padding:2px 4px;height:100%}.zc-event-default{display:flex;flex-direction:column;gap:1px;line-height:1.2}.zc-event-time{font-variant-numeric:tabular-nums;opacity:.85}.zc-event-title{font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.zc-timeline{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:stretch}.zc-tl-resource-area{display:flex;flex-direction:column;overflow:hidden;border-right:1px solid var(--zc-border);background:var(--zc-bg)}.zc-tl-resource-head,.zc-tl-resource-row{display:flex;align-items:stretch;flex:0 0 auto}.zc-tl-resource-head{border-bottom:1px solid var(--zc-border);background:var(--zc-muted-bg);font-weight:600;font-size:.75rem}.zc-tl-col-head{display:flex;align-items:center;padding:0 .5rem;overflow:hidden;white-space:nowrap}.zc-tl-resource-body{flex:1 1 auto;overflow:hidden}.zc-tl-resource-row{border-bottom:1px solid var(--zc-border)}.zc-tl-col-cell{display:flex;flex-direction:column;justify-content:center;padding:.25rem .5rem;overflow:hidden;font-size:.8125rem;min-width:0}.zc-tl-group-row{display:flex;align-items:center;padding:0 .5rem;background:var(--zc-muted-bg);color:var(--zc-muted-fg);font-size:.6875rem;font-weight:700;text-transform:uppercase;letter-spacing:.03em}.zc-tl-time-area{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;overflow:hidden}.zc-tl-time-head{flex:0 0 auto;overflow:hidden;position:relative;border-bottom:1px solid var(--zc-border);background:var(--zc-muted-bg)}.zc-tl-axis{position:relative;height:100%}.zc-tl-axis-label{position:absolute;top:0;bottom:0;display:flex;align-items:center;padding-left:4px;font-size:.6875rem;color:var(--zc-muted-fg);white-space:nowrap;border-left:1px solid var(--zc-border)}.zc-tl-time-body{flex:1 1 auto;overflow:auto;position:relative}.zc-tl-time-canvas{position:relative;min-height:100%}.zc-tl-overlay{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;z-index:0}.zc-tl-vline{position:absolute;top:0;bottom:0;border-left:1px solid var(--zc-border);opacity:.6}.zc-tl-now{position:absolute;top:0;bottom:0;border-left:2px solid var(--zc-now);z-index:3}.zc-tl-rows{position:relative;z-index:1}.zc-tl-row{position:relative;border-bottom:1px solid var(--zc-border)}.zc-tl-group-spacer{background:var(--zc-muted-bg);opacity:.5}.zc-tl-event{display:flex;align-items:stretch}.zc-tl-event .zc-event-main{padding:3px 6px}.zc-rg{position:absolute;top:0;right:0;bottom:0;left:0;overflow-y:auto;overflow-x:hidden}.zc-rg-head{position:sticky;top:0;z-index:5;display:flex;align-items:stretch;background:var(--zc-muted-bg);border-bottom:1px solid var(--zc-border)}.zc-rg-corner{flex:0 0 56px;width:56px;border-right:1px solid var(--zc-border)}.zc-rg-head-cols{flex:1 1 auto;display:flex;flex-direction:column;min-width:0}.zc-rg-group-row,.zc-rg-label-row{display:flex;align-items:stretch}.zc-rg-group-band{display:flex;align-items:center;justify-content:center;padding:2px 4px;border-left:1px solid var(--zc-border);font-size:.625rem;font-weight:700;text-transform:uppercase;letter-spacing:.03em;color:var(--zc-muted-fg);overflow:hidden;white-space:nowrap}.zc-rg-label{flex:1 1 0;display:flex;align-items:center;justify-content:center;padding:4px 6px;border-left:1px solid var(--zc-border);font-size:.8125rem;font-weight:600;min-width:0;overflow:hidden;text-align:center}.zc-rg-canvas{display:flex;align-items:stretch}.zc-rg-cols{position:relative;flex:1 1 auto;display:flex;align-items:stretch;min-width:0}.zc-rg-col{position:relative;flex:1 1 0;border-left:1px solid var(--zc-border);min-width:0}.zc-rg-col>.zc-select-box{left:2px;right:2px}.zc-rg-now{z-index:4}.zc-body.zc-closed .zc-col,.zc-body.zc-closed .zc-tl-time-canvas,.zc-body.zc-closed .zc-rg-cols{background:var(--zc-nonbusiness)}.zc-event.zc-dragging{z-index:6;opacity:.9;box-shadow:0 2px 8px #0000002e}.zc-resize-handle{position:absolute;z-index:2}.zc-resize-s{left:0;right:0;bottom:0;height:6px;cursor:ns-resize}.zc-resize-e,.zc-resize-w{top:0;bottom:0;width:6px;cursor:ew-resize}.zc-resize-e{right:0}.zc-resize-w{left:0}.zc-select-box{position:absolute;z-index:5;background:var(--zc-event-bg);border:1px solid var(--zc-event-border);opacity:.45;pointer-events:none;border-radius:var(--zc-radius)}.zc-col>.zc-select-box{left:2px;right:2px}.zc-tl-select{top:2px;bottom:2px}.zc-tl-row.zc-drop-target{background:var(--zc-today-bg)}.zc-now-indicator{position:absolute;left:0;right:0;height:0;border-top:2px solid var(--zc-now);z-index:4;pointer-events:none}.zc-now-indicator:before{content:"";position:absolute;left:-1px;top:-4px;width:7px;height:7px;border-radius:50%;background:var(--zc-now)}
1
+ .zc{--zc-border: #e2e2e2;--zc-bg: #ffffff;--zc-muted-bg: #f6f6f6;--zc-fg: #1a1a1a;--zc-muted-fg: #6b7280;--zc-today-bg: #f0f6ff;--zc-now: #ef4444;--zc-btn-bg: transparent;--zc-btn-fg: var(--zc-fg);--zc-btn-border: var(--zc-border);--zc-btn-hover-bg: var(--zc-muted-bg);--zc-btn-active-bg: #e7efff;--zc-event-bg: #c7dbff;--zc-event-border: #a9c6ff;--zc-event-fg: #1e3a5f;--zc-nonbusiness: oklch(0 0 0 / .045);--zc-radius: 6px;--zc-font: inherit;display:flex;flex-direction:column;box-sizing:border-box;font-family:var(--zc-font);color:var(--zc-fg);background:var(--zc-bg)}.zc *,.zc *:before,.zc *:after{box-sizing:border-box}.zc-toolbar{display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:.5rem .75rem;flex:0 0 auto}.zc-toolbar-section{display:flex;align-items:center;gap:.375rem}.zc-btn-group{display:inline-flex}.zc-btn-group .zc-btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0;margin-left:-1px}.zc-btn-group .zc-btn:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.zc-toolbar-center{flex:1 1 auto;justify-content:center}.zc-title{margin:0;font-size:1rem;font-weight:600;text-transform:capitalize}.zc-btn{-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;font:inherit;font-size:.875rem;line-height:1.2;padding:.375rem .75rem;border-radius:var(--zc-radius);border:1px solid var(--zc-btn-border);background:var(--zc-btn-bg);color:var(--zc-btn-fg)}.zc-btn:hover{background:var(--zc-btn-hover-bg)}.zc-btn:active{background:var(--zc-btn-active-bg)}.zc-body{flex:1 1 auto;overflow:auto;position:relative;border-top:1px solid var(--zc-border)}.zc-timegrid{display:flex;align-items:stretch;position:relative;min-height:100%}.zc-axis{position:relative;flex:0 0 56px;border-right:1px solid var(--zc-border)}.zc-axis-label{position:absolute;right:6px;transform:translateY(-50%);font-size:.6875rem;color:var(--zc-muted-fg);white-space:nowrap}.zc-col{position:relative;flex:1 1 auto}.zc-slot-line{position:absolute;left:0;right:0;border-top:1px solid var(--zc-border);opacity:.4}.zc-slot-line.zc-slot-major{opacity:1}.zc-event{position:absolute;overflow:hidden;border-radius:var(--zc-radius);border:1px solid var(--zc-event-border);background:var(--zc-event-bg);color:var(--zc-event-fg);font-size:.75rem;cursor:pointer}.zc-event-main{padding:2px 4px;height:100%}.zc-event-default{display:flex;flex-direction:column;gap:1px;line-height:1.2}.zc-event-time{font-variant-numeric:tabular-nums;opacity:.85}.zc-event-title{font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.zc-timeline{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:stretch}.zc-tl-resource-area{display:flex;flex-direction:column;overflow:hidden;border-right:1px solid var(--zc-border);background:var(--zc-bg)}.zc-tl-resource-head,.zc-tl-resource-row{display:flex;align-items:stretch;flex:0 0 auto}.zc-tl-resource-head{border-bottom:1px solid var(--zc-border);background:var(--zc-muted-bg);font-weight:600;font-size:.75rem}.zc-tl-col-head{display:flex;align-items:center;padding:0 .5rem;overflow:hidden;white-space:nowrap}.zc-tl-resource-body{flex:1 1 auto;overflow:hidden}.zc-tl-resource-row{border-bottom:1px solid var(--zc-border)}.zc-tl-col-cell{display:flex;flex-direction:column;justify-content:center;gap:2px;padding:.5rem;overflow:hidden;font-size:.8125rem;min-width:0}.zc-tl-group-row{display:flex;align-items:center;padding:0 .5rem;background:var(--zc-muted-bg);color:var(--zc-muted-fg);font-size:.6875rem;font-weight:700;text-transform:uppercase;letter-spacing:.03em}.zc-tl-time-area{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;overflow:hidden}.zc-tl-time-head{flex:0 0 auto;overflow:hidden;position:relative;border-bottom:1px solid var(--zc-border);background:var(--zc-muted-bg)}.zc-tl-axis{position:relative;height:100%}.zc-tl-axis-label{position:absolute;top:0;bottom:0;display:flex;align-items:center;padding-left:4px;font-size:.6875rem;color:var(--zc-muted-fg);white-space:nowrap;border-left:1px solid var(--zc-border)}.zc-tl-time-body{flex:1 1 auto;overflow:auto;position:relative}.zc-tl-time-canvas{position:relative;min-height:100%}.zc-tl-overlay{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;z-index:0}.zc-tl-vline{position:absolute;top:0;bottom:0;border-left:1px solid var(--zc-border);opacity:.6}.zc-tl-now{position:absolute;top:0;bottom:0;border-left:2px solid var(--zc-now);z-index:3}.zc-tl-rows{position:relative;z-index:1}.zc-tl-row{position:relative;border-bottom:1px solid var(--zc-border)}.zc-tl-group-spacer{background:var(--zc-muted-bg);opacity:.5}.zc-tl-event{display:flex;align-items:stretch}.zc-tl-event .zc-event-main{padding:3px 6px}.zc-rg{position:absolute;top:0;right:0;bottom:0;left:0;overflow-y:auto;overflow-x:hidden}.zc-rg-head{position:sticky;top:0;z-index:5;display:flex;align-items:stretch;background:var(--zc-muted-bg);border-bottom:1px solid var(--zc-border)}.zc-rg-corner{flex:0 0 56px;width:56px;border-right:1px solid var(--zc-border)}.zc-rg-head-cols{flex:1 1 auto;display:flex;flex-direction:column;min-width:0}.zc-rg-group-row,.zc-rg-label-row{display:flex;align-items:stretch}.zc-rg-group-band{display:flex;align-items:center;justify-content:center;padding:2px 4px;border-left:1px solid var(--zc-border);font-size:.625rem;font-weight:700;text-transform:uppercase;letter-spacing:.03em;color:var(--zc-muted-fg);overflow:hidden;white-space:nowrap}.zc-rg-label{flex:1 1 0;display:flex;align-items:center;justify-content:center;padding:4px 6px;border-left:1px solid var(--zc-border);font-size:.8125rem;font-weight:600;min-width:0;overflow:hidden;text-align:center}.zc-rg-canvas{display:flex;align-items:stretch}.zc-rg-cols{position:relative;flex:1 1 auto;display:flex;align-items:stretch;min-width:0}.zc-rg-col{position:relative;flex:1 1 0;border-left:1px solid var(--zc-border);min-width:0}.zc-rg-col>.zc-select-box{left:2px;right:2px}.zc-rg-now{z-index:4}.zc-body.zc-closed .zc-col,.zc-body.zc-closed .zc-tl-time-canvas,.zc-body.zc-closed .zc-rg-cols{background:var(--zc-nonbusiness)}.zc-event.zc-dragging{z-index:6;opacity:.9;box-shadow:0 2px 8px #0000002e}.zc-resize-handle{position:absolute;z-index:2}.zc-resize-s{left:0;right:0;bottom:0;height:6px;cursor:ns-resize}.zc-resize-e,.zc-resize-w{top:0;bottom:0;width:6px;cursor:ew-resize}.zc-resize-e{right:0}.zc-resize-w{left:0}.zc-select-box{position:absolute;z-index:5;background:var(--zc-event-bg);border:1px solid var(--zc-event-border);opacity:.45;pointer-events:none;border-radius:var(--zc-radius)}.zc-col>.zc-select-box{left:2px;right:2px}.zc-tl-select{top:2px;bottom:2px}.zc-tl-row.zc-drop-target,.zc-rg-col.zc-drop-target{background:var(--zc-today-bg);outline:2px dashed var(--zc-event-border);outline-offset:-2px}.zc-now-indicator{position:absolute;left:0;right:0;height:0;border-top:2px solid var(--zc-now);z-index:4;pointer-events:none}.zc-now-indicator:before{content:"";position:absolute;left:-1px;top:-4px;width:7px;height:7px;border-radius:50%;background:var(--zc-now)}
@@ -7,10 +7,10 @@ function b(p, t) {
7
7
  const e = C(p);
8
8
  return t ? e.tz(t) : e;
9
9
  }
10
- function $(p) {
10
+ function P(p) {
11
11
  return p ? C().tz(p) : C();
12
12
  }
13
- function R(p) {
13
+ function $(p) {
14
14
  const t = p.split(":"), e = Number(t[0]) || 0, i = Number(t[1]) || 0;
15
15
  return e * 60 + i;
16
16
  }
@@ -25,7 +25,7 @@ function L(p, t, e, i) {
25
25
  return new Intl.DateTimeFormat(e, { ...t, timeZone: i }).format(p.toDate());
26
26
  }
27
27
  function N(p = {}) {
28
- const t = R(p.min ?? "00:00"), e = R(p.max ?? "24:00"), i = p.duration ?? 15, n = p.labelInterval ?? 60, s = Math.max(0, e - t), o = i > 0 ? Math.ceil(s / i) : 0;
28
+ const t = $(p.min ?? "00:00"), e = $(p.max ?? "24:00"), i = p.duration ?? 15, n = p.labelInterval ?? 60, s = Math.max(0, e - t), o = i > 0 ? Math.ceil(s / i) : 0;
29
29
  return { min: t, max: e, duration: i, labelInterval: n, slots: o, totalMinutes: s };
30
30
  }
31
31
  class _ {
@@ -81,13 +81,15 @@ class X {
81
81
  this.groupField = t, this.orderField = e, this.list = [];
82
82
  }
83
83
  normalize(t) {
84
- const e = t[this.groupField], i = t[this.orderField];
84
+ const e = t[this.groupField], i = t[this.orderField], n = /* @__PURE__ */ new Set(["id", "title", "group", "order", "extendedProps", this.groupField, this.orderField]), s = {};
85
+ for (const o of Object.keys(t))
86
+ n.has(o) || (s[o] = t[o]);
85
87
  return {
86
88
  id: String(t.id),
87
89
  title: t.title ?? "",
88
90
  group: e != null ? String(e) : null,
89
91
  order: typeof i == "number" ? i : 0,
90
- extendedProps: t.extendedProps ?? {},
92
+ extendedProps: { ...s, ...t.extendedProps ?? {} },
91
93
  raw: t
92
94
  };
93
95
  }
@@ -122,7 +124,7 @@ class X {
122
124
  return t;
123
125
  }
124
126
  }
125
- function I(p) {
127
+ function S(p) {
126
128
  const t = [...p].sort(
127
129
  (o, r) => o.start.valueOf() - r.start.valueOf() || r.end.valueOf() - o.end.valueOf()
128
130
  ), e = [];
@@ -130,19 +132,19 @@ function I(p) {
130
132
  const s = () => {
131
133
  if (i.length === 0) return;
132
134
  const o = [];
133
- for (const c of i) {
134
- let a = !1;
135
+ for (const a of i) {
136
+ let c = !1;
135
137
  for (const l of o)
136
- if (l[l.length - 1].end.valueOf() <= c.start.valueOf()) {
137
- l.push(c), a = !0;
138
+ if (l[l.length - 1].end.valueOf() <= a.start.valueOf()) {
139
+ l.push(a), c = !0;
138
140
  break;
139
141
  }
140
- a || o.push([c]);
142
+ c || o.push([a]);
141
143
  }
142
144
  const r = o.length;
143
- o.forEach((c, a) => {
144
- for (const l of c)
145
- e.push({ event: l, col: a, cols: r, left: a / r, width: 1 / r });
145
+ o.forEach((a, c) => {
146
+ for (const l of a)
147
+ e.push({ event: l, col: c, cols: r, left: c / r, width: 1 / r });
146
148
  }), i = [], n = -1 / 0;
147
149
  };
148
150
  for (const o of t)
@@ -152,19 +154,19 @@ function I(p) {
152
154
  function w(p, t) {
153
155
  const e = t.threshold ?? 4, i = p.clientX, n = p.clientY;
154
156
  let s = !1;
155
- const o = (c) => {
157
+ const o = (a) => {
156
158
  var u, g;
157
- const a = c, l = a.clientX - i, d = a.clientY - n;
158
- !s && Math.hypot(l, d) < e || (s || (s = !0, (u = t.onStart) == null || u.call(t, a)), (g = t.onMove) == null || g.call(t, { dx: l, dy: d, moved: !0, event: a }));
159
- }, r = (c) => {
159
+ const c = a, l = c.clientX - i, d = c.clientY - n;
160
+ !s && Math.hypot(l, d) < e || (s || (s = !0, (u = t.onStart) == null || u.call(t, c)), (g = t.onMove) == null || g.call(t, { dx: l, dy: d, moved: !0, event: c }));
161
+ }, r = (a) => {
160
162
  var l;
161
163
  window.removeEventListener("pointermove", o), window.removeEventListener("pointerup", r), window.removeEventListener("pointercancel", r);
162
- const a = c;
164
+ const c = a;
163
165
  (l = t.onEnd) == null || l.call(t, {
164
- dx: a.clientX - i,
165
- dy: a.clientY - n,
166
+ dx: c.clientX - i,
167
+ dy: c.clientY - n,
166
168
  moved: s,
167
- event: a
169
+ event: c
168
170
  });
169
171
  };
170
172
  window.addEventListener("pointermove", o), window.addEventListener("pointerup", r), window.addEventListener("pointercancel", r);
@@ -229,10 +231,10 @@ class F {
229
231
  renderEvents() {
230
232
  if (!this.content) return;
231
233
  this.content.querySelectorAll(".zc-event").forEach((i) => i.remove());
232
- const t = this.cal.axis, e = I(this.eventsFor());
234
+ const t = this.cal.axis, e = S(this.eventsFor());
233
235
  for (const i of e) {
234
- const n = i.event, s = f(n.start), o = f(n.end) || t.max, r = m(s, t.min, t.max), c = m(o, t.min, t.max), a = (r - t.min) * this.pxPerMinute, l = Math.max(E - 2, (c - r) * this.pxPerMinute), d = h("div", "zc-event");
235
- d.dataset.eventId = n.id, d.style.top = `${a}px`, d.style.height = `${l}px`, d.style.left = `calc(${i.left * 100}% + 2px)`, d.style.width = `calc(${i.width * 100}% - 4px)`, n.color && d.style.setProperty("--zc-event-bg", n.color), n.textColor && d.style.setProperty("--zc-event-fg", n.textColor), d.appendChild(this.cal.renderEventContent(n)), this.bindBar(d, n), this.content.appendChild(d), this.cal.fireEventMount(n, d);
236
+ const n = i.event, s = f(n.start), o = f(n.end) || t.max, r = m(s, t.min, t.max), a = m(o, t.min, t.max), c = (r - t.min) * this.pxPerMinute, l = Math.max(E - 2, (a - r) * this.pxPerMinute), d = h("div", "zc-event");
237
+ d.dataset.eventId = n.id, d.style.top = `${c}px`, d.style.height = `${l}px`, d.style.left = `calc(${i.left * 100}% + 2px)`, d.style.width = `calc(${i.width * 100}% - 4px)`, n.color && d.style.setProperty("--zc-event-bg", n.color), n.textColor && d.style.setProperty("--zc-event-fg", n.textColor), d.appendChild(this.cal.renderEventContent(n)), this.bindBar(d, n), this.content.appendChild(d), this.cal.fireEventMount(n, d);
236
238
  }
237
239
  this.renderNowIndicator();
238
240
  }
@@ -255,22 +257,22 @@ class F {
255
257
  t.appendChild(i), i.addEventListener("pointerdown", (n) => this.beginResize(n, t, e)), t.addEventListener("pointerdown", (n) => {
256
258
  if (n.button !== 0 || n.target.closest(".zc-resize-handle")) return;
257
259
  n.preventDefault();
258
- const s = this.cal.axis, o = e.end.diff(e.start, "minute"), r = f(e.start), c = this.minuteAtY(n.clientY), a = (l) => m(
259
- x(r + (this.minuteAtY(l) - c), s.duration),
260
+ const s = this.cal.axis, o = e.end.diff(e.start, "minute"), r = f(e.start), a = this.minuteAtY(n.clientY), c = (l) => m(
261
+ x(r + (this.minuteAtY(l) - a), s.duration),
260
262
  s.min,
261
263
  s.max - o
262
264
  );
263
265
  w(n, {
264
266
  onStart: () => t.classList.add("zc-dragging"),
265
267
  onMove: ({ event: l }) => {
266
- t.style.top = `${(a(l.clientY) - s.min) * this.pxPerMinute}px`;
268
+ t.style.top = `${(c(l.clientY) - s.min) * this.pxPerMinute}px`;
267
269
  },
268
270
  onEnd: ({ moved: l, event: d }) => {
269
271
  if (t.classList.remove("zc-dragging"), !l) {
270
272
  this.cal.fireEventClick(e, t, d);
271
273
  return;
272
274
  }
273
- const u = this.timeAt(a(d.clientY));
275
+ const u = this.timeAt(c(d.clientY));
274
276
  this.cal.commitEventChange(e, u, u.add(o, "minute"), e.resourceId);
275
277
  }
276
278
  });
@@ -285,8 +287,8 @@ class F {
285
287
  onMove: ({ event: r }) => {
286
288
  e.style.height = `${(o(r.clientY) - s) * this.pxPerMinute}px`;
287
289
  },
288
- onEnd: ({ moved: r, event: c }) => {
289
- e.classList.remove("zc-dragging"), r && this.cal.commitEventChange(i, i.start, this.timeAt(o(c.clientY)), i.resourceId);
290
+ onEnd: ({ moved: r, event: a }) => {
291
+ e.classList.remove("zc-dragging"), r && this.cal.commitEventChange(i, i.start, this.timeAt(o(a.clientY)), i.resourceId);
290
292
  }
291
293
  });
292
294
  }
@@ -297,16 +299,16 @@ class F {
297
299
  const e = this.cal.axis, i = m(x(this.minuteAtY(t.clientY), e.duration), e.min, e.max), n = h("div", "zc-select-box");
298
300
  this.content.appendChild(n);
299
301
  const s = (o) => {
300
- const r = m(x(this.minuteAtY(o), e.duration), e.min, e.max), c = Math.min(i, r), a = Math.max(i, r);
301
- n.style.top = `${(c - e.min) * this.pxPerMinute}px`, n.style.height = `${(a - c) * this.pxPerMinute}px`;
302
+ const r = m(x(this.minuteAtY(o), e.duration), e.min, e.max), a = Math.min(i, r), c = Math.max(i, r);
303
+ n.style.top = `${(a - e.min) * this.pxPerMinute}px`, n.style.height = `${(c - a) * this.pxPerMinute}px`;
302
304
  };
303
305
  w(t, {
304
306
  onMove: ({ event: o }) => s(o.clientY),
305
307
  onEnd: ({ moved: o, event: r }) => {
306
308
  if (n.remove(), !o) return;
307
- const c = m(x(this.minuteAtY(r.clientY), e.duration), e.min, e.max);
308
- let a = Math.min(i, c), l = Math.max(i, c);
309
- l <= a && (l = Math.min(a + e.duration, e.max)), !(l <= a) && this.cal.commitSelect(this.timeAt(a), this.timeAt(l), null, r);
309
+ const a = m(x(this.minuteAtY(r.clientY), e.duration), e.min, e.max);
310
+ let c = Math.min(i, a), l = Math.max(i, a);
311
+ l <= c && (l = Math.min(c + e.duration, e.max)), !(l <= c) && this.cal.commitSelect(this.timeAt(c), this.timeAt(l), null, r);
310
312
  }
311
313
  });
312
314
  });
@@ -363,24 +365,24 @@ class V {
363
365
  n.appendChild(this.colsEl), this.rootEl.appendChild(n), this.root.appendChild(this.rootEl), this.renderEvents();
364
366
  }
365
367
  buildHead(t, e) {
366
- var r, c;
368
+ var r, a;
367
369
  const i = h("div", "zc-rg-head"), n = h("div", "zc-rg-corner");
368
370
  i.appendChild(n);
369
371
  const s = h("div", "zc-rg-head-cols");
370
372
  if (e) {
371
- const a = h("div", "zc-rg-group-row");
373
+ const c = h("div", "zc-rg-group-row");
372
374
  for (const l of t) {
373
375
  const d = h("div", "zc-rg-group-band");
374
- d.style.flex = `${l.resources.length} 1 0`, d.textContent = l.group ?? "", a.appendChild(d);
376
+ d.style.flex = `${l.resources.length} 1 0`, d.textContent = l.group ?? "", c.appendChild(d);
375
377
  }
376
- s.appendChild(a);
378
+ s.appendChild(c);
377
379
  }
378
380
  const o = h("div", "zc-rg-label-row");
379
- for (const a of t.flatMap((l) => l.resources)) {
381
+ for (const c of t.flatMap((l) => l.resources)) {
380
382
  const l = h("div", "zc-rg-label");
381
- l.dataset.resourceId = a.id;
382
- const d = (c = (r = this.cal.options).renderResource) == null ? void 0 : c.call(r, a);
383
- d != null ? typeof d == "string" ? l.innerHTML = d : l.appendChild(d) : l.textContent = a.title, o.appendChild(l);
383
+ l.dataset.resourceId = c.id;
384
+ const d = (a = (r = this.cal.options).renderResource) == null ? void 0 : a.call(r, c);
385
+ d != null ? typeof d == "string" ? l.innerHTML = d : l.appendChild(d) : l.textContent = c.title, o.appendChild(l);
384
386
  }
385
387
  return s.appendChild(o), i.appendChild(s), i;
386
388
  }
@@ -407,9 +409,9 @@ class V {
407
409
  const t = this.range(), e = this.cal.axis;
408
410
  for (const { resource: i, content: n } of this.cols) {
409
411
  n.querySelectorAll(".zc-event").forEach((o) => o.remove());
410
- const s = I(this.cal.events.inRange(t.start, t.end, i.id));
412
+ const s = S(this.cal.events.inRange(t.start, t.end, i.id));
411
413
  for (const o of s) {
412
- const r = o.event, c = f(r.start), a = f(r.end) || e.max, l = m(c, e.min, e.max), d = m(a, e.min, e.max), u = (l - e.min) * this.pxPerMinute, g = Math.max(E - 2, (d - l) * this.pxPerMinute), v = h("div", "zc-event");
414
+ const r = o.event, a = f(r.start), c = f(r.end) || e.max, l = m(a, e.min, e.max), d = m(c, e.min, e.max), u = (l - e.min) * this.pxPerMinute, g = Math.max(E - 2, (d - l) * this.pxPerMinute), v = h("div", "zc-event");
413
415
  v.dataset.eventId = r.id, v.style.top = `${u}px`, v.style.height = `${g}px`, v.style.left = `calc(${o.left * 100}% + 2px)`, v.style.width = `calc(${o.width * 100}% - 4px)`, r.color && v.style.setProperty("--zc-event-bg", r.color), r.textColor && v.style.setProperty("--zc-event-fg", r.textColor), v.appendChild(this.cal.renderEventContent(r)), this.bindBar(v, r), n.appendChild(v), this.cal.fireEventMount(r, v);
414
416
  }
415
417
  }
@@ -440,6 +442,18 @@ class V {
440
442
  const s = n == null ? void 0 : n.closest(".zc-rg-col[data-resource-id]");
441
443
  return s ? s.dataset.resourceId ?? null : void 0;
442
444
  }
445
+ highlightCol(t, e) {
446
+ var s;
447
+ this.clearHighlight();
448
+ const i = e.style.pointerEvents;
449
+ e.style.pointerEvents = "none";
450
+ const n = document.elementFromPoint(t.clientX, t.clientY);
451
+ e.style.pointerEvents = i, (s = n == null ? void 0 : n.closest(".zc-rg-col[data-resource-id]")) == null || s.classList.add("zc-drop-target");
452
+ }
453
+ clearHighlight() {
454
+ var t;
455
+ (t = this.colsEl) == null || t.querySelectorAll(".zc-drop-target").forEach((e) => e.classList.remove("zc-drop-target"));
456
+ }
443
457
  bindBar(t, e) {
444
458
  if (this.cal.bindContextMenu(t, e), !this.cal.editable) {
445
459
  t.addEventListener("click", (n) => this.cal.fireEventClick(e, t, n));
@@ -450,22 +464,22 @@ class V {
450
464
  t.appendChild(i), i.addEventListener("pointerdown", (n) => this.beginResize(n, t, e)), t.addEventListener("pointerdown", (n) => {
451
465
  if (n.button !== 0 || n.target.closest(".zc-resize-handle")) return;
452
466
  n.preventDefault();
453
- const s = this.cal.axis, o = e.end.diff(e.start, "minute"), r = f(e.start), c = this.minuteAtY(n.clientY), a = (l) => m(
454
- x(r + (this.minuteAtY(l) - c), s.duration),
467
+ const s = this.cal.axis, o = e.end.diff(e.start, "minute"), r = f(e.start), a = this.minuteAtY(n.clientY), c = (l) => m(
468
+ x(r + (this.minuteAtY(l) - a), s.duration),
455
469
  s.min,
456
470
  s.max - o
457
471
  );
458
472
  w(n, {
459
473
  onStart: () => t.classList.add("zc-dragging"),
460
474
  onMove: ({ event: l }) => {
461
- t.style.top = `${(a(l.clientY) - s.min) * this.pxPerMinute}px`;
475
+ t.style.top = `${(c(l.clientY) - s.min) * this.pxPerMinute}px`, this.highlightCol(l, t);
462
476
  },
463
477
  onEnd: ({ moved: l, event: d }) => {
464
- if (t.classList.remove("zc-dragging"), !l) {
478
+ if (t.classList.remove("zc-dragging"), this.clearHighlight(), !l) {
465
479
  this.cal.fireEventClick(e, t, d);
466
480
  return;
467
481
  }
468
- const u = this.timeAt(a(d.clientY)), g = this.resourceIdAt(d, t) ?? e.resourceId;
482
+ const u = this.timeAt(c(d.clientY)), g = this.resourceIdAt(d, t) ?? e.resourceId;
469
483
  this.cal.commitEventChange(e, u, u.add(o, "minute"), g);
470
484
  }
471
485
  });
@@ -480,8 +494,8 @@ class V {
480
494
  onMove: ({ event: r }) => {
481
495
  e.style.height = `${(o(r.clientY) - s) * this.pxPerMinute}px`;
482
496
  },
483
- onEnd: ({ moved: r, event: c }) => {
484
- e.classList.remove("zc-dragging"), r && this.cal.commitEventChange(i, i.start, this.timeAt(o(c.clientY)), i.resourceId);
497
+ onEnd: ({ moved: r, event: a }) => {
498
+ e.classList.remove("zc-dragging"), r && this.cal.commitEventChange(i, i.start, this.timeAt(o(a.clientY)), i.resourceId);
485
499
  }
486
500
  });
487
501
  }
@@ -491,17 +505,17 @@ class V {
491
505
  i.preventDefault();
492
506
  const n = this.cal.axis, s = m(x(this.minuteAtY(i.clientY), n.duration), n.min, n.max), o = h("div", "zc-select-box zc-rg-select");
493
507
  t.appendChild(o);
494
- const r = (c) => {
495
- const a = m(x(this.minuteAtY(c), n.duration), n.min, n.max), l = Math.min(s, a), d = Math.max(s, a);
508
+ const r = (a) => {
509
+ const c = m(x(this.minuteAtY(a), n.duration), n.min, n.max), l = Math.min(s, c), d = Math.max(s, c);
496
510
  o.style.top = `${(l - n.min) * this.pxPerMinute}px`, o.style.height = `${(d - l) * this.pxPerMinute}px`;
497
511
  };
498
512
  w(i, {
499
- onMove: ({ event: c }) => r(c.clientY),
500
- onEnd: ({ moved: c, event: a }) => {
501
- if (o.remove(), !c) return;
502
- const l = m(x(this.minuteAtY(a.clientY), n.duration), n.min, n.max);
513
+ onMove: ({ event: a }) => r(a.clientY),
514
+ onEnd: ({ moved: a, event: c }) => {
515
+ if (o.remove(), !a) return;
516
+ const l = m(x(this.minuteAtY(c.clientY), n.duration), n.min, n.max);
503
517
  let d = Math.min(s, l), u = Math.max(s, l);
504
- u <= d && (u = Math.min(d + n.duration, n.max)), !(u <= d) && this.cal.commitSelect(this.timeAt(d), this.timeAt(u), e, a);
518
+ u <= d && (u = Math.min(d + n.duration, n.max)), !(u <= d) && this.cal.commitSelect(this.timeAt(d), this.timeAt(u), e, c);
505
519
  }
506
520
  });
507
521
  });
@@ -511,14 +525,14 @@ class V {
511
525
  (t = this.rootEl) == null || t.remove(), this.rootEl = void 0, this.colsEl = void 0, this.nowLine = null, this.cols = [];
512
526
  }
513
527
  }
514
- const T = 38, H = 26, G = 48, Y = 4, U = 90, W = 14;
515
- class q {
528
+ const H = 38, T = 26, q = 48, Y = 4, G = 90, W = 14;
529
+ class U {
516
530
  constructor(t, e) {
517
531
  this.cal = t, this.root = e;
518
532
  }
519
533
  // ---- geometry ------------------------------------------------------------
520
534
  get pxPerMinute() {
521
- return U / 60;
535
+ return G / 60;
522
536
  }
523
537
  get width() {
524
538
  return this.cal.axis.totalMinutes * this.pxPerMinute;
@@ -557,14 +571,14 @@ class q {
557
571
  const t = h("div", "zc-tl-resource-area");
558
572
  this.applyWidth(t, ((s = this.cal.options.resourceArea) == null ? void 0 : s.width) ?? "25%", !1), ((o = this.cal.options.resourceArea) == null ? void 0 : o.width) == null && (t.style.flex = "0 0 25%");
559
573
  const e = h("div", "zc-tl-resource-head");
560
- e.style.height = `${T}px`;
574
+ e.style.height = `${H}px`;
561
575
  for (const r of this.columns()) {
562
- const c = h("div", "zc-tl-col-head");
563
- this.applyWidth(c, r.width), c.textContent = r.header ?? "", e.appendChild(c);
576
+ const a = h("div", "zc-tl-col-head");
577
+ this.applyWidth(a, r.width), a.textContent = r.header ?? "", e.appendChild(a);
564
578
  }
565
579
  this.resourceBody = h("div", "zc-tl-resource-body"), this.resourceRows = h("div", "zc-tl-resource-rows"), this.resourceBody.appendChild(this.resourceRows), t.append(e, this.resourceBody);
566
580
  const i = h("div", "zc-tl-time-area");
567
- this.timeHead = h("div", "zc-tl-time-head"), this.timeHead.style.height = `${T}px`, this.buildAxisHeader(this.timeHead), this.timeBody = h("div", "zc-tl-time-body");
581
+ this.timeHead = h("div", "zc-tl-time-head"), this.timeHead.style.height = `${H}px`, this.buildAxisHeader(this.timeHead), this.timeBody = h("div", "zc-tl-time-body");
568
582
  const n = h("div", "zc-tl-time-canvas");
569
583
  n.style.width = `${this.width}px`, this.overlay = h("div", "zc-tl-overlay"), this.buildOverlayLines(this.overlay), this.rowsEl = h("div", "zc-tl-rows"), n.append(this.overlay, this.rowsEl), this.timeBody.appendChild(n), i.append(this.timeHead, this.timeBody), this.rootEl.append(t, i), this.root.appendChild(this.rootEl), this.onScroll = () => {
570
584
  this.resourceBody && this.timeBody && (this.resourceBody.scrollTop = this.timeBody.scrollTop), this.timeHead && this.timeBody && (this.timeHead.scrollLeft = this.timeBody.scrollLeft);
@@ -591,6 +605,19 @@ class q {
591
605
  renderEvents() {
592
606
  this.relayout();
593
607
  }
608
+ /** Re-render only the resource-area cells, leaving event bars untouched. */
609
+ renderResources() {
610
+ this.resourceRows && this.resourceRows.querySelectorAll(".zc-tl-resource-row[data-resource-id]").forEach((t) => {
611
+ const e = this.cal.resources.get(t.dataset.resourceId ?? "");
612
+ if (e) {
613
+ t.innerHTML = "";
614
+ for (const i of this.columns()) {
615
+ const n = h("div", "zc-tl-col-cell");
616
+ this.applyWidth(n, i.width), this.fillResourceCell(n, i, e), t.appendChild(n);
617
+ }
618
+ }
619
+ });
620
+ }
594
621
  /** Rebuild rows in both panes from the current resources + events. */
595
622
  relayout() {
596
623
  if (!this.resourceRows || !this.rowsEl) return;
@@ -607,31 +634,31 @@ class q {
607
634
  }
608
635
  appendGroupRow(t) {
609
636
  const e = h("div", "zc-tl-resource-row zc-tl-group-row");
610
- e.style.height = `${H}px`, e.textContent = t, this.resourceRows.appendChild(e);
637
+ e.style.height = `${T}px`, e.textContent = t, this.resourceRows.appendChild(e);
611
638
  const i = h("div", "zc-tl-row zc-tl-group-spacer");
612
- i.style.height = `${H}px`, this.rowsEl.appendChild(i);
639
+ i.style.height = `${T}px`, this.rowsEl.appendChild(i);
613
640
  }
614
641
  appendResourceRow(t, e) {
615
- const i = I(e), n = i.reduce((d, u) => Math.max(d, u.cols), 1), s = this.cal.options.eventMinHeight ?? G, o = n * s + 2 * Y, r = s, c = h("div", "zc-tl-resource-row");
616
- c.style.height = `${o}px`, c.dataset.resourceId = t.id;
642
+ const i = S(e), n = i.reduce((d, u) => Math.max(d, u.cols), 1), s = this.cal.options.eventMinHeight ?? q, o = n * s + 2 * Y, r = s, a = h("div", "zc-tl-resource-row");
643
+ a.style.height = `${o}px`, a.dataset.resourceId = t.id;
617
644
  for (const d of this.columns()) {
618
645
  const u = h("div", "zc-tl-col-cell");
619
- this.applyWidth(u, d.width), this.fillResourceCell(u, d, t), c.appendChild(u);
646
+ this.applyWidth(u, d.width), this.fillResourceCell(u, d, t), a.appendChild(u);
620
647
  }
621
- this.resourceRows.appendChild(c);
622
- const a = h("div", "zc-tl-row");
623
- a.style.height = `${o}px`, a.dataset.resourceId = t.id;
648
+ this.resourceRows.appendChild(a);
649
+ const c = h("div", "zc-tl-row");
650
+ c.style.height = `${o}px`, c.dataset.resourceId = t.id;
624
651
  const l = this.cal.axis;
625
652
  for (const d of i) {
626
653
  const u = d.event, g = f(u.start);
627
654
  let v = f(u.end);
628
655
  v <= g && (v = l.max);
629
- const z = m(g, l.min, l.max), S = m(v, l.min, l.max);
630
- if (S <= l.min || z >= l.max) continue;
631
- const P = (z - l.min) * this.pxPerMinute, B = Math.max(W, (S - z) * this.pxPerMinute), D = Y + d.col * r, y = h("div", "zc-event zc-tl-event");
632
- y.dataset.eventId = u.id, y.style.left = `${P}px`, y.style.width = `${Math.min(B, this.width - P)}px`, y.style.top = `${D}px`, y.style.height = `${r - 2}px`, u.color && y.style.setProperty("--zc-event-bg", u.color), u.textColor && y.style.setProperty("--zc-event-fg", u.textColor), y.appendChild(this.cal.renderEventContent(u)), this.bindBar(y, u), a.appendChild(y), this.cal.fireEventMount(u, y);
656
+ const z = m(g, l.min, l.max), I = m(v, l.min, l.max);
657
+ if (I <= l.min || z >= l.max) continue;
658
+ const R = (z - l.min) * this.pxPerMinute, B = Math.max(W, (I - z) * this.pxPerMinute), D = Y + d.col * r, y = h("div", "zc-event zc-tl-event");
659
+ y.dataset.eventId = u.id, y.style.left = `${R}px`, y.style.width = `${Math.min(B, this.width - R)}px`, y.style.top = `${D}px`, y.style.height = `${r - 2}px`, u.color && y.style.setProperty("--zc-event-bg", u.color), u.textColor && y.style.setProperty("--zc-event-fg", u.textColor), y.appendChild(this.cal.renderEventContent(u)), this.bindBar(y, u), c.appendChild(y), this.cal.fireEventMount(u, y);
633
660
  }
634
- this.bindRowSelect(a, t), this.rowsEl.appendChild(a);
661
+ this.bindRowSelect(c, t), this.rowsEl.appendChild(c);
635
662
  }
636
663
  // ---- interaction ---------------------------------------------------------
637
664
  timeAt(t) {
@@ -666,8 +693,8 @@ class q {
666
693
  t.append(i, n), i.addEventListener("pointerdown", (s) => this.beginResize(s, t, e, "start")), n.addEventListener("pointerdown", (s) => this.beginResize(s, t, e, "end")), t.addEventListener("pointerdown", (s) => {
667
694
  if (s.button !== 0 || s.target.closest(".zc-resize-handle")) return;
668
695
  s.preventDefault();
669
- const o = this.cal.axis, r = e.end.diff(e.start, "minute"), c = f(e.start), a = this.minuteAtX(s.clientX), l = (d) => m(
670
- x(c + (this.minuteAtX(d) - a), o.duration),
696
+ const o = this.cal.axis, r = e.end.diff(e.start, "minute"), a = f(e.start), c = this.minuteAtX(s.clientX), l = (d) => m(
697
+ x(a + (this.minuteAtX(d) - c), o.duration),
671
698
  o.min,
672
699
  o.max - r
673
700
  );
@@ -694,23 +721,23 @@ class q {
694
721
  w(t, {
695
722
  onStart: () => e.classList.add("zc-dragging"),
696
723
  onMove: ({ event: r }) => {
697
- const c = o(r.clientX);
724
+ const a = o(r.clientX);
698
725
  if (n === "end") {
699
- const a = Math.max(c, f(i.start) + s.duration);
700
- e.style.width = `${(a - f(i.start)) * this.pxPerMinute}px`;
726
+ const c = Math.max(a, f(i.start) + s.duration);
727
+ e.style.width = `${(c - f(i.start)) * this.pxPerMinute}px`;
701
728
  } else {
702
- const a = Math.min(c, f(i.end) - s.duration);
703
- e.style.left = `${(a - s.min) * this.pxPerMinute}px`, e.style.width = `${(f(i.end) - a) * this.pxPerMinute}px`;
729
+ const c = Math.min(a, f(i.end) - s.duration);
730
+ e.style.left = `${(c - s.min) * this.pxPerMinute}px`, e.style.width = `${(f(i.end) - c) * this.pxPerMinute}px`;
704
731
  }
705
732
  },
706
- onEnd: ({ moved: r, event: c }) => {
733
+ onEnd: ({ moved: r, event: a }) => {
707
734
  if (e.classList.remove("zc-dragging"), !r) return;
708
- const a = o(c.clientX);
735
+ const c = o(a.clientX);
709
736
  if (n === "end") {
710
- const l = Math.max(a, f(i.start) + s.duration);
737
+ const l = Math.max(c, f(i.start) + s.duration);
711
738
  this.cal.commitEventChange(i, i.start, this.timeAt(l), i.resourceId);
712
739
  } else {
713
- const l = Math.min(a, f(i.end) - s.duration);
740
+ const l = Math.min(c, f(i.end) - s.duration);
714
741
  this.cal.commitEventChange(i, this.timeAt(l), i.end, i.resourceId);
715
742
  }
716
743
  }
@@ -722,17 +749,17 @@ class q {
722
749
  i.preventDefault();
723
750
  const n = this.cal.axis, s = m(x(this.minuteAtX(i.clientX), n.duration), n.min, n.max), o = h("div", "zc-select-box zc-tl-select");
724
751
  t.appendChild(o);
725
- const r = (c) => {
726
- const a = m(x(this.minuteAtX(c), n.duration), n.min, n.max), l = Math.min(s, a), d = Math.max(s, a);
752
+ const r = (a) => {
753
+ const c = m(x(this.minuteAtX(a), n.duration), n.min, n.max), l = Math.min(s, c), d = Math.max(s, c);
727
754
  o.style.left = `${(l - n.min) * this.pxPerMinute}px`, o.style.width = `${(d - l) * this.pxPerMinute}px`;
728
755
  };
729
756
  w(i, {
730
- onMove: ({ event: c }) => r(c.clientX),
731
- onEnd: ({ moved: c, event: a }) => {
732
- if (o.remove(), !c) return;
733
- const l = m(x(this.minuteAtX(a.clientX), n.duration), n.min, n.max);
757
+ onMove: ({ event: a }) => r(a.clientX),
758
+ onEnd: ({ moved: a, event: c }) => {
759
+ if (o.remove(), !a) return;
760
+ const l = m(x(this.minuteAtX(c.clientX), n.duration), n.min, n.max);
734
761
  let d = Math.min(s, l), u = Math.max(s, l);
735
- u <= d && (u = Math.min(d + n.duration, n.max)), !(u <= d) && this.cal.commitSelect(this.timeAt(d), this.timeAt(u), e, a);
762
+ u <= d && (u = Math.min(d + n.duration, n.max)), !(u <= d) && this.cal.commitSelect(this.timeAt(d), this.timeAt(u), e, c);
736
763
  }
737
764
  });
738
765
  });
@@ -773,10 +800,10 @@ const M = {
773
800
  }, j = { start: "", center: "title", end: "today prev next" };
774
801
  class Q {
775
802
  constructor(t, e = {}) {
776
- this.viewImpl = null, this.bodyEl = null, this.titleEl = null, this.el = t, this.options = e, this.events = new _(e.timezone), this.resources = new X(
803
+ this.viewImpl = null, this.bodyEl = null, this.titleEl = null, this.resourceRenderScheduled = !1, this.el = t, this.options = e, this.events = new _(e.timezone), this.resources = new X(
777
804
  e.resourceGroupField ?? "group",
778
805
  e.resourceOrder ?? "order"
779
- ), this._view = e.view ?? "day", this._date = e.date ? b(e.date, e.timezone) : $(e.timezone), Array.isArray(e.resources) && this.resources.set(e.resources), Array.isArray(e.events) && this.events.set(e.events);
806
+ ), this._view = e.view ?? "day", this._date = e.date ? b(e.date, e.timezone) : P(e.timezone), Array.isArray(e.resources) && this.resources.set(e.resources), Array.isArray(e.events) && this.events.set(e.events);
780
807
  }
781
808
  // ---- derived state -------------------------------------------------------
782
809
  get tz() {
@@ -828,7 +855,7 @@ class Q {
828
855
  return this.options.selectable === !0;
829
856
  }
830
857
  now() {
831
- return $(this.tz);
858
+ return P(this.tz);
832
859
  }
833
860
  // ---- lifecycle -----------------------------------------------------------
834
861
  render() {
@@ -848,7 +875,7 @@ class Q {
848
875
  case "resource-day":
849
876
  return new V(this, e);
850
877
  case "timeline":
851
- return new q(this, e);
878
+ return new U(this, e);
852
879
  default:
853
880
  throw new Error(`[@ziix/calendar] unknown view: ${String(t)}`);
854
881
  }
@@ -909,17 +936,27 @@ class Q {
909
936
  const e = this.resources.get(t);
910
937
  return e ? this.resourceHandle(e) : null;
911
938
  }
939
+ /**
940
+ * Coalesce resource-area re-renders: many setExtendedProp calls in a row (e.g.
941
+ * pushing work hours / punch-ins for every resource) collapse into a single
942
+ * cell update on the next microtask, and event bars are never rebuilt — so the
943
+ * timeline doesn't flicker.
944
+ */
945
+ scheduleResourceRender() {
946
+ this.resourceRenderScheduled || (this.resourceRenderScheduled = !0, queueMicrotask(() => {
947
+ var t, e;
948
+ this.resourceRenderScheduled = !1, (t = this.viewImpl) != null && t.renderResources ? this.viewImpl.renderResources() : (e = this.viewImpl) == null || e.renderEvents();
949
+ }));
950
+ }
912
951
  resourceHandle(t) {
913
952
  return {
914
953
  id: t.id,
915
954
  resource: t,
916
955
  setExtendedProp: (e, i) => {
917
- var n;
918
- t.extendedProps[e] = i, (n = this.viewImpl) == null || n.renderEvents();
956
+ t.extendedProps[e] = i, this.scheduleResourceRender();
919
957
  },
920
958
  setProp: (e, i) => {
921
- var n;
922
- e === "title" ? t.title = i : t.group = i, (n = this.viewImpl) == null || n.renderEvents();
959
+ e === "title" ? t.title = i : t.group = i, this.scheduleResourceRender();
923
960
  }
924
961
  };
925
962
  }
@@ -988,11 +1025,11 @@ class Q {
988
1025
  * preview by re-rendering) when the move is rejected.
989
1026
  */
990
1027
  commitEventChange(t, e, i, n) {
991
- var c, a, l, d, u;
1028
+ var a, c, l, d, u;
992
1029
  if (t.start.isSame(e) && t.end.isSame(i) && t.resourceId === n)
993
- return (c = this.viewImpl) == null || c.renderEvents(), !1;
994
- if (!this.allowsOverlap() && this.hasCollision(t, e, i, n))
995
1030
  return (a = this.viewImpl) == null || a.renderEvents(), !1;
1031
+ if (!this.allowsOverlap() && this.hasCollision(t, e, i, n))
1032
+ return (c = this.viewImpl) == null || c.renderEvents(), !1;
996
1033
  const o = { ...t };
997
1034
  t.start = e, t.end = i, t.resourceId = n, (l = this.viewImpl) == null || l.renderEvents();
998
1035
  const r = () => {
@@ -1022,10 +1059,10 @@ class Q {
1022
1059
  n.appendChild(this.renderToolbarToken("title"));
1023
1060
  continue;
1024
1061
  }
1025
- const c = document.createElement("div");
1026
- c.className = "zc-btn-group";
1027
- for (const a of r) c.appendChild(this.renderToolbarToken(a));
1028
- n.appendChild(c);
1062
+ const a = document.createElement("div");
1063
+ a.className = "zc-btn-group";
1064
+ for (const c of r) a.appendChild(this.renderToolbarToken(c));
1065
+ n.appendChild(a);
1029
1066
  }
1030
1067
  e.appendChild(n);
1031
1068
  }
@@ -1075,9 +1112,9 @@ export {
1075
1112
  f as dayMinutes,
1076
1113
  L as intlFormat,
1077
1114
  A as minutesToTime,
1078
- $ as nowTz,
1079
- I as packEvents,
1080
- R as timeToMinutes,
1115
+ P as nowTz,
1116
+ S as packEvents,
1117
+ $ as timeToMinutes,
1081
1118
  b as toTz
1082
1119
  };
1083
1120
  //# sourceMappingURL=ziix-calendar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ziix-calendar.js","sources":["../src/datelib.ts","../src/store/EventStore.ts","../src/store/ResourceStore.ts","../src/layout/overlap.ts","../src/interaction/pointer.ts","../src/views/View.ts","../src/views/DayView.ts","../src/views/ResourceDayView.ts","../src/views/TimelineView.ts","../src/Calendar.ts"],"sourcesContent":["import dayjs from 'dayjs'\nimport type { Dayjs } from 'dayjs'\nimport utc from 'dayjs/plugin/utc'\nimport timezone from 'dayjs/plugin/timezone'\nimport type { SlotConfig } from './types'\n\ndayjs.extend(utc)\ndayjs.extend(timezone)\n\n/** Parse a value into a Dayjs anchored to `tz` (the shop timezone), if given. */\nexport function toTz(value: string | Date | Dayjs, tz?: string): Dayjs {\n const d = dayjs(value)\n return tz ? d.tz(tz) : d\n}\n\n/** \"Now\" in the calendar timezone. */\nexport function nowTz(tz?: string): Dayjs {\n return tz ? dayjs().tz(tz) : dayjs()\n}\n\n/** Parse 'HH:mm' / 'HH:mm:ss' / '24:00' into minutes from midnight. */\nexport function timeToMinutes(t: string): number {\n const parts = t.split(':')\n const h = Number(parts[0]) || 0\n const m = Number(parts[1]) || 0\n return h * 60 + m\n}\n\n/** Format minutes-from-midnight back to a zero-padded 'HH:mm'. */\nexport function minutesToTime(min: number): string {\n const h = Math.floor(min / 60)\n const m = min % 60\n return `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}`\n}\n\n/** Minutes from midnight for a Dayjs, read in its own (tz-applied) clock. */\nexport function dayMinutes(d: Dayjs): number {\n return d.hour() * 60 + d.minute()\n}\n\n/** Format an absolute instant in the given timezone via Intl. */\nexport function intlFormat(\n d: Dayjs,\n opts: Intl.DateTimeFormatOptions,\n localeTag: string,\n tz?: string,\n): string {\n return new Intl.DateTimeFormat(localeTag, { ...opts, timeZone: tz }).format(d.toDate())\n}\n\n/** Resolved, numeric time-axis derived from a SlotConfig. */\nexport interface SlotAxis {\n /** First visible minute from midnight. */\n min: number\n /** Last visible minute from midnight. */\n max: number\n /** Minutes per slot. */\n duration: number\n /** Minutes between axis labels. */\n labelInterval: number\n /** Number of whole slots between min and max. */\n slots: number\n /** Total visible minutes (max - min). */\n totalMinutes: number\n}\n\nexport function buildAxis(slot: SlotConfig = {}): SlotAxis {\n const min = timeToMinutes(slot.min ?? '00:00')\n const max = timeToMinutes(slot.max ?? '24:00')\n const duration = slot.duration ?? 15\n const labelInterval = slot.labelInterval ?? 60\n const totalMinutes = Math.max(0, max - min)\n const slots = duration > 0 ? Math.ceil(totalMinutes / duration) : 0\n return { min, max, duration, labelInterval, slots, totalMinutes }\n}\n","import type { Dayjs } from 'dayjs'\nimport type { CalEvent, EventInput } from '../types'\nimport { toTz } from '../datelib'\n\n/** Normalises raw event input, dedupes by id, and answers range/resource queries. */\nexport class EventStore {\n private map = new Map<string, CalEvent>()\n\n constructor(private tz?: string) {}\n\n normalize(input: EventInput): CalEvent {\n const start = toTz(input.start, this.tz)\n const end = input.end ? toTz(input.end, this.tz) : start.add(30, 'minute')\n return {\n id: String(input.id),\n title: input.title ?? '',\n start,\n end,\n resourceId: input.resourceId != null ? String(input.resourceId) : null,\n allDay: Boolean(input.allDay),\n color: input.color,\n textColor: input.textColor,\n extendedProps: input.extendedProps ?? {},\n raw: input,\n }\n }\n\n /** Replace the entire set, deduping by id (last write wins). */\n set(inputs: EventInput[]): void {\n this.map.clear()\n for (const input of inputs) {\n const e = this.normalize(input)\n this.map.set(e.id, e)\n }\n }\n\n add(input: EventInput): CalEvent {\n const e = this.normalize(input)\n this.map.set(e.id, e)\n return e\n }\n\n remove(id: string | number): boolean {\n return this.map.delete(String(id))\n }\n\n get(id: string | number): CalEvent | undefined {\n return this.map.get(String(id))\n }\n\n all(): CalEvent[] {\n return [...this.map.values()]\n }\n\n /**\n * Events overlapping [start, end). When `resourceId` is supplied (including\n * `null` for unassigned), only events on that resource are returned.\n */\n inRange(start: Dayjs, end: Dayjs, resourceId?: string | null): CalEvent[] {\n return this.all().filter((e) => {\n if (resourceId !== undefined && e.resourceId !== resourceId) return false\n return e.start.isBefore(end) && e.end.isAfter(start)\n })\n }\n}\n","import type { CalResource, ResourceInput } from '../types'\n\n/** Normalises resources, reads the configured group/order fields, and sorts. */\nexport class ResourceStore {\n private list: CalResource[] = []\n\n constructor(\n private groupField = 'group',\n private orderField = 'order',\n ) {}\n\n normalize(input: ResourceInput): CalResource {\n const groupVal = input[this.groupField]\n const orderVal = input[this.orderField]\n return {\n id: String(input.id),\n title: input.title ?? '',\n group: groupVal != null ? String(groupVal) : null,\n order: typeof orderVal === 'number' ? orderVal : 0,\n extendedProps: input.extendedProps ?? {},\n raw: input,\n }\n }\n\n set(inputs: ResourceInput[]): void {\n this.list = inputs.map((i) => this.normalize(i))\n }\n\n all(): CalResource[] {\n return [...this.list]\n }\n\n get(id: string | number): CalResource | undefined {\n return this.list.find((r) => r.id === String(id))\n }\n\n /**\n * Resources in display order. With `resourceOrder: 'id'` they are sorted by a\n * natural id comparison (so 'E2' precedes 'E10'); with a numeric order field\n * they sort by it; otherwise the original input order is preserved (sort is\n * stable).\n */\n ordered(): CalResource[] {\n if (this.orderField === 'id') {\n return [...this.list].sort((a, b) => a.id.localeCompare(b.id, undefined, { numeric: true }))\n }\n if (this.list.every((r) => r.order === 0)) {\n return [...this.list] // no explicit order → keep input order\n }\n return [...this.list].sort((a, b) => a.order - b.order)\n }\n\n /**\n * Grouped resources preserving first-seen group order. Returns a flat list of\n * `{ group, resources }` buckets; ungrouped resources land in a `null` bucket.\n */\n grouped(): Array<{ group: string | null; resources: CalResource[] }> {\n const buckets: Array<{ group: string | null; resources: CalResource[] }> = []\n const index = new Map<string | null, number>()\n for (const r of this.ordered()) {\n let i = index.get(r.group)\n if (i === undefined) {\n i = buckets.length\n index.set(r.group, i)\n buckets.push({ group: r.group, resources: [] })\n }\n buckets[i].resources.push(r)\n }\n return buckets\n }\n}\n","import type { CalEvent } from '../types'\n\nexport interface PackedEvent {\n event: CalEvent\n /** Column index within the cluster. */\n col: number\n /** Number of columns in the cluster. */\n cols: number\n /** Left offset as a 0..1 fraction of the column width. */\n left: number\n /** Width as a 0..1 fraction of the column width. */\n width: number\n}\n\n/**\n * Pack events that share a single column (resource/day) into side-by-side\n * sub-columns so overlapping events never cover each other — the classic\n * interval-graph greedy colouring.\n *\n * Events are expected to already belong to the same column; callers filter by\n * resource first.\n */\nexport function packEvents(events: CalEvent[]): PackedEvent[] {\n const sorted = [...events].sort(\n (a, b) => a.start.valueOf() - b.start.valueOf() || b.end.valueOf() - a.end.valueOf(),\n )\n\n const result: PackedEvent[] = []\n let cluster: CalEvent[] = []\n let clusterEnd = -Infinity\n\n const flush = () => {\n if (cluster.length === 0) return\n const columns: CalEvent[][] = []\n for (const ev of cluster) {\n let placed = false\n for (const col of columns) {\n const last = col[col.length - 1]\n if (last.end.valueOf() <= ev.start.valueOf()) {\n col.push(ev)\n placed = true\n break\n }\n }\n if (!placed) columns.push([ev])\n }\n const cols = columns.length\n columns.forEach((col, ci) => {\n for (const ev of col) {\n result.push({ event: ev, col: ci, cols, left: ci / cols, width: 1 / cols })\n }\n })\n cluster = []\n clusterEnd = -Infinity\n }\n\n for (const ev of sorted) {\n if (cluster.length > 0 && ev.start.valueOf() >= clusterEnd) flush()\n cluster.push(ev)\n clusterEnd = Math.max(clusterEnd, ev.end.valueOf())\n }\n flush()\n\n return result\n}\n","/** Context handed to drag move/end callbacks. */\nexport interface DragContext {\n /** Horizontal delta from the pointer-down position, in px. */\n dx: number\n /** Vertical delta from the pointer-down position, in px. */\n dy: number\n /** Whether the drag threshold was exceeded (i.e. a real drag, not a click). */\n moved: boolean\n /** The current pointer/mouse event. */\n event: MouseEvent\n}\n\nexport interface DragHandlers {\n /** Pixels of movement before a drag is considered started (default 4). */\n threshold?: number\n /** Fired once, when the threshold is first exceeded. */\n onStart?(event: MouseEvent): void\n /** Fired on every pointer move after the drag has started. */\n onMove?(ctx: DragContext): void\n /** Fired once on pointer up / cancel. `moved` distinguishes drag from click. */\n onEnd?(ctx: DragContext): void\n}\n\n/**\n * Track a pointer drag from a pointerdown event. Listeners live on `window` for\n * the duration of the gesture so the pointer can leave the origin element.\n * `onStart`/`onMove` only fire once movement passes the threshold, so a plain\n * click ends with `moved === false` and no `onStart`.\n */\nexport function startDrag(down: MouseEvent, handlers: DragHandlers): void {\n const threshold = handlers.threshold ?? 4\n const startX = down.clientX\n const startY = down.clientY\n let started = false\n\n const move = (e: Event) => {\n const me = e as MouseEvent\n const dx = me.clientX - startX\n const dy = me.clientY - startY\n if (!started && Math.hypot(dx, dy) < threshold) return\n if (!started) {\n started = true\n handlers.onStart?.(me)\n }\n handlers.onMove?.({ dx, dy, moved: true, event: me })\n }\n\n const up = (e: Event) => {\n window.removeEventListener('pointermove', move)\n window.removeEventListener('pointerup', up)\n window.removeEventListener('pointercancel', up)\n const me = e as MouseEvent\n handlers.onEnd?.({\n dx: me.clientX - startX,\n dy: me.clientY - startY,\n moved: started,\n event: me,\n })\n }\n\n window.addEventListener('pointermove', move)\n window.addEventListener('pointerup', up)\n window.addEventListener('pointercancel', up)\n}\n\n/** Round a minute value to the nearest slot boundary. */\nexport function snap(minute: number, slot: number): number {\n if (slot <= 0) return minute\n return Math.round(minute / slot) * slot\n}\n","import type { DateRange } from '../types'\n\n/** Contract every view (day, resource-day, timeline) implements. */\nexport interface View {\n /** Build the static DOM structure (axis, columns/rows) and render events. */\n mount(): void\n /** Re-place events only, without rebuilding the static structure. */\n renderEvents(): void\n /** Tear down and detach all DOM owned by the view. */\n unmount(): void\n /** The date window this view currently shows, in the calendar timezone. */\n range(): DateRange\n /** Human-readable title for the toolbar. */\n title(): string\n}\n\n/** Tiny DOM helper shared by views. */\nexport function el(tag: string, cls: string): HTMLElement {\n const node = document.createElement(tag)\n node.className = cls\n return node\n}\n\nexport function clamp(value: number, lo: number, hi: number): number {\n return Math.max(lo, Math.min(hi, value))\n}\n","import type { Calendar } from '../Calendar'\nimport type { Dayjs } from 'dayjs'\nimport type { DateRange, CalEvent } from '../types'\nimport { dayMinutes, minutesToTime, intlFormat } from '../datelib'\nimport { packEvents } from '../layout/overlap'\nimport { startDrag, snap } from '../interaction/pointer'\nimport { el, clamp, type View } from './View'\n\n/** Pixel height of one slot-duration on the time axis. */\nexport const SLOT_PX = 24\n\n/**\n * Single-column day view: a vertical time axis\n * with absolutely-positioned, overlap-packed events. Supports drag-move,\n * resize and drag-select when `editable`/`selectable` are set.\n */\nexport class DayView implements View {\n protected grid?: HTMLElement\n protected content?: HTMLElement\n private nowLine: HTMLElement | null = null\n\n constructor(\n protected cal: Calendar,\n protected root: HTMLElement,\n ) {}\n\n protected get pxPerMinute(): number {\n return SLOT_PX / this.cal.axis.duration\n }\n\n protected get contentHeight(): number {\n return this.cal.axis.slots * SLOT_PX\n }\n\n protected localeTag(): string {\n return this.cal.locale.intl ?? this.cal.locale.code\n }\n\n range(): DateRange {\n const d = this.cal.date\n return { start: d.startOf('day'), end: d.endOf('day') }\n }\n\n title(): string {\n return intlFormat(\n this.cal.date,\n { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' },\n this.localeTag(),\n this.cal.tz,\n )\n }\n\n mount(): void {\n const axis = this.cal.axis\n this.grid = el('div', 'zc-timegrid')\n\n const axisCol = el('div', 'zc-axis')\n axisCol.style.height = `${this.contentHeight}px`\n for (let m = axis.min; m <= axis.max; m += axis.labelInterval) {\n const label = el('div', 'zc-axis-label')\n label.style.top = `${(m - axis.min) * this.pxPerMinute}px`\n label.textContent = minutesToTime(m)\n axisCol.appendChild(label)\n }\n\n this.content = el('div', 'zc-col')\n this.content.style.height = `${this.contentHeight}px`\n for (let s = 0; s <= axis.slots; s++) {\n const line = el('div', 'zc-slot-line')\n if ((s * axis.duration) % axis.labelInterval === 0) line.classList.add('zc-slot-major')\n line.style.top = `${s * SLOT_PX}px`\n this.content.appendChild(line)\n }\n\n this.grid.appendChild(axisCol)\n this.grid.appendChild(this.content)\n this.root.appendChild(this.grid)\n this.bindSelect()\n this.renderEvents()\n }\n\n /** Events to lay out in this column. Subclasses scope this by resource. */\n protected eventsFor(): CalEvent[] {\n const r = this.range()\n return this.cal.events.inRange(r.start, r.end)\n }\n\n renderEvents(): void {\n if (!this.content) return\n this.content.querySelectorAll('.zc-event').forEach((n) => n.remove())\n\n const axis = this.cal.axis\n const packed = packEvents(this.eventsFor())\n for (const p of packed) {\n const ev = p.event\n const rawStart = dayMinutes(ev.start)\n const rawEnd = dayMinutes(ev.end) || axis.max\n const startMin = clamp(rawStart, axis.min, axis.max)\n const endMin = clamp(rawEnd, axis.min, axis.max)\n const top = (startMin - axis.min) * this.pxPerMinute\n const height = Math.max(SLOT_PX - 2, (endMin - startMin) * this.pxPerMinute)\n\n const node = el('div', 'zc-event')\n node.dataset.eventId = ev.id\n node.style.top = `${top}px`\n node.style.height = `${height}px`\n node.style.left = `calc(${p.left * 100}% + 2px)`\n node.style.width = `calc(${p.width * 100}% - 4px)`\n if (ev.color) node.style.setProperty('--zc-event-bg', ev.color)\n if (ev.textColor) node.style.setProperty('--zc-event-fg', ev.textColor)\n node.appendChild(this.cal.renderEventContent(ev))\n this.bindBar(node, ev)\n this.content.appendChild(node)\n this.cal.fireEventMount(ev, node)\n }\n\n this.renderNowIndicator()\n }\n\n // ---- interaction ---------------------------------------------------------\n\n private timeAt(minute: number): Dayjs {\n return this.cal.date.startOf('day').add(minute, 'minute')\n }\n\n private minuteAtY(clientY: number): number {\n const rect = this.content!.getBoundingClientRect()\n return this.cal.axis.min + (clientY - rect.top) / this.pxPerMinute\n }\n\n /** Wire click, drag-move and resize on an event bar (or just click if read-only). */\n private bindBar(bar: HTMLElement, ev: CalEvent): void {\n this.cal.bindContextMenu(bar, ev)\n if (!this.cal.editable) {\n bar.addEventListener('click', (jsEvent) => this.cal.fireEventClick(ev, bar, jsEvent))\n return\n }\n bar.style.cursor = 'move'\n\n const handle = el('div', 'zc-resize-handle zc-resize-s')\n bar.appendChild(handle)\n handle.addEventListener('pointerdown', (down) => this.beginResize(down, bar, ev))\n\n bar.addEventListener('pointerdown', (down) => {\n if (down.button !== 0) return\n if ((down.target as HTMLElement).closest('.zc-resize-handle')) return\n down.preventDefault()\n const axis = this.cal.axis\n const durMin = ev.end.diff(ev.start, 'minute')\n const origStartMin = dayMinutes(ev.start)\n const grabMin = this.minuteAtY(down.clientY)\n const place = (clientY: number): number =>\n clamp(\n snap(origStartMin + (this.minuteAtY(clientY) - grabMin), axis.duration),\n axis.min,\n axis.max - durMin,\n )\n startDrag(down, {\n onStart: () => bar.classList.add('zc-dragging'),\n onMove: ({ event }) => {\n bar.style.top = `${(place(event.clientY) - axis.min) * this.pxPerMinute}px`\n },\n onEnd: ({ moved, event }) => {\n bar.classList.remove('zc-dragging')\n if (!moved) {\n this.cal.fireEventClick(ev, bar, event)\n return\n }\n const newStart = this.timeAt(place(event.clientY))\n this.cal.commitEventChange(ev, newStart, newStart.add(durMin, 'minute'), ev.resourceId)\n },\n })\n })\n }\n\n private beginResize(down: MouseEvent, bar: HTMLElement, ev: CalEvent): void {\n if (down.button !== 0) return\n down.stopPropagation()\n down.preventDefault()\n const axis = this.cal.axis\n const startMin = dayMinutes(ev.start)\n const endAt = (clientY: number): number =>\n clamp(snap(this.minuteAtY(clientY), axis.duration), startMin + axis.duration, axis.max)\n startDrag(down, {\n onStart: () => bar.classList.add('zc-dragging'),\n onMove: ({ event }) => {\n bar.style.height = `${(endAt(event.clientY) - startMin) * this.pxPerMinute}px`\n },\n onEnd: ({ moved, event }) => {\n bar.classList.remove('zc-dragging')\n if (!moved) return\n this.cal.commitEventChange(ev, ev.start, this.timeAt(endAt(event.clientY)), ev.resourceId)\n },\n })\n }\n\n private bindSelect(): void {\n if (!this.cal.selectable || !this.content) return\n this.content.addEventListener('pointerdown', (down) => {\n if (down.button !== 0) return\n if ((down.target as HTMLElement).closest('.zc-event')) return\n down.preventDefault()\n const axis = this.cal.axis\n const anchor = clamp(snap(this.minuteAtY(down.clientY), axis.duration), axis.min, axis.max)\n const box = el('div', 'zc-select-box')\n this.content!.appendChild(box)\n const place = (clientY: number) => {\n const cur = clamp(snap(this.minuteAtY(clientY), axis.duration), axis.min, axis.max)\n const lo = Math.min(anchor, cur)\n const hi = Math.max(anchor, cur)\n box.style.top = `${(lo - axis.min) * this.pxPerMinute}px`\n box.style.height = `${(hi - lo) * this.pxPerMinute}px`\n }\n startDrag(down, {\n onMove: ({ event }) => place(event.clientY),\n onEnd: ({ moved, event }) => {\n box.remove()\n if (!moved) return\n const cur = clamp(snap(this.minuteAtY(event.clientY), axis.duration), axis.min, axis.max)\n let lo = Math.min(anchor, cur)\n let hi = Math.max(anchor, cur)\n if (hi <= lo) hi = Math.min(lo + axis.duration, axis.max)\n if (hi <= lo) return\n this.cal.commitSelect(this.timeAt(lo), this.timeAt(hi), null, event)\n },\n })\n })\n }\n\n protected renderNowIndicator(): void {\n this.nowLine?.remove()\n this.nowLine = null\n if (!this.cal.options.nowIndicator || !this.content) return\n const now = this.cal.now()\n if (!now.isSame(this.cal.date, 'day')) return\n const axis = this.cal.axis\n const nm = dayMinutes(now)\n if (nm < axis.min || nm > axis.max) return\n this.nowLine = el('div', 'zc-now-indicator')\n this.nowLine.style.top = `${(nm - axis.min) * this.pxPerMinute}px`\n this.content.appendChild(this.nowLine)\n }\n\n unmount(): void {\n this.grid?.remove()\n this.grid = undefined\n this.content = undefined\n this.nowLine = null\n }\n}\n","import type { Calendar } from '../Calendar'\nimport type { Dayjs } from 'dayjs'\nimport type { DateRange, CalEvent, CalResource } from '../types'\nimport { dayMinutes, minutesToTime, intlFormat } from '../datelib'\nimport { packEvents } from '../layout/overlap'\nimport { startDrag, snap } from '../interaction/pointer'\nimport { el, clamp, type View } from './View'\nimport { SLOT_PX } from './DayView'\n\n/**\n * Resources-as-columns day view: a shared vertical time axis with one column per resource,\n * grouped under sticky header bands. Reuses the day view's vertical geometry and\n * supports drag-move (incl. across columns → resource change), resize and\n * drag-select.\n */\nexport class ResourceDayView implements View {\n private rootEl?: HTMLElement\n private colsEl?: HTMLElement\n private nowLine: HTMLElement | null = null\n private cols: Array<{ resource: CalResource; content: HTMLElement }> = []\n\n constructor(\n private cal: Calendar,\n private root: HTMLElement,\n ) {}\n\n private get pxPerMinute(): number {\n return SLOT_PX / this.cal.axis.duration\n }\n\n private get contentHeight(): number {\n return this.cal.axis.slots * SLOT_PX\n }\n\n private localeTag(): string {\n return this.cal.locale.intl ?? this.cal.locale.code\n }\n\n range(): DateRange {\n const d = this.cal.date\n return { start: d.startOf('day'), end: d.endOf('day') }\n }\n\n title(): string {\n return intlFormat(\n this.cal.date,\n { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' },\n this.localeTag(),\n this.cal.tz,\n )\n }\n\n // ---- mount ---------------------------------------------------------------\n\n mount(): void {\n this.rootEl = el('div', 'zc-rg')\n const groups = this.cal.resources.grouped()\n const ordered = groups.flatMap((g) => g.resources)\n const showGroups = groups.length > 1 || groups.some((g) => g.group !== null)\n\n this.rootEl.appendChild(this.buildHead(groups, showGroups))\n\n const canvas = el('div', 'zc-rg-canvas')\n canvas.style.height = `${this.contentHeight}px`\n canvas.appendChild(this.buildAxis())\n\n this.colsEl = el('div', 'zc-rg-cols')\n this.cols = []\n for (const resource of ordered) {\n const col = el('div', 'zc-rg-col')\n col.dataset.resourceId = resource.id\n this.buildSlotLines(col)\n this.bindColSelect(col, resource)\n this.colsEl.appendChild(col)\n this.cols.push({ resource, content: col })\n }\n canvas.appendChild(this.colsEl)\n this.rootEl.appendChild(canvas)\n this.root.appendChild(this.rootEl)\n\n this.renderEvents()\n }\n\n private buildHead(\n groups: Array<{ group: string | null; resources: CalResource[] }>,\n showGroups: boolean,\n ): HTMLElement {\n const head = el('div', 'zc-rg-head')\n const corner = el('div', 'zc-rg-corner')\n head.appendChild(corner)\n\n const cols = el('div', 'zc-rg-head-cols')\n if (showGroups) {\n const groupRow = el('div', 'zc-rg-group-row')\n for (const bucket of groups) {\n const band = el('div', 'zc-rg-group-band')\n band.style.flex = `${bucket.resources.length} 1 0`\n band.textContent = bucket.group ?? ''\n groupRow.appendChild(band)\n }\n cols.appendChild(groupRow)\n }\n const labelRow = el('div', 'zc-rg-label-row')\n for (const resource of groups.flatMap((g) => g.resources)) {\n const cell = el('div', 'zc-rg-label')\n cell.dataset.resourceId = resource.id\n const custom = this.cal.options.renderResource?.(resource)\n if (custom != null) {\n if (typeof custom === 'string') cell.innerHTML = custom\n else cell.appendChild(custom)\n } else {\n cell.textContent = resource.title\n }\n labelRow.appendChild(cell)\n }\n cols.appendChild(labelRow)\n head.appendChild(cols)\n return head\n }\n\n private buildAxis(): HTMLElement {\n const axisCol = el('div', 'zc-axis zc-rg-axis')\n axisCol.style.height = `${this.contentHeight}px`\n const axis = this.cal.axis\n for (let m = axis.min; m <= axis.max; m += axis.labelInterval) {\n const label = el('div', 'zc-axis-label')\n label.style.top = `${(m - axis.min) * this.pxPerMinute}px`\n label.textContent = minutesToTime(m)\n axisCol.appendChild(label)\n }\n return axisCol\n }\n\n private buildSlotLines(col: HTMLElement): void {\n const axis = this.cal.axis\n for (let s = 0; s <= axis.slots; s++) {\n const line = el('div', 'zc-slot-line')\n if ((s * axis.duration) % axis.labelInterval === 0) line.classList.add('zc-slot-major')\n line.style.top = `${s * SLOT_PX}px`\n col.appendChild(line)\n }\n }\n\n // ---- events --------------------------------------------------------------\n\n renderEvents(): void {\n if (!this.colsEl) return\n const range = this.range()\n const axis = this.cal.axis\n for (const { resource, content } of this.cols) {\n content.querySelectorAll('.zc-event').forEach((n) => n.remove())\n const packed = packEvents(this.cal.events.inRange(range.start, range.end, resource.id))\n for (const p of packed) {\n const ev = p.event\n const rawStart = dayMinutes(ev.start)\n const rawEnd = dayMinutes(ev.end) || axis.max\n const startMin = clamp(rawStart, axis.min, axis.max)\n const endMin = clamp(rawEnd, axis.min, axis.max)\n const top = (startMin - axis.min) * this.pxPerMinute\n const height = Math.max(SLOT_PX - 2, (endMin - startMin) * this.pxPerMinute)\n\n const bar = el('div', 'zc-event')\n bar.dataset.eventId = ev.id\n bar.style.top = `${top}px`\n bar.style.height = `${height}px`\n bar.style.left = `calc(${p.left * 100}% + 2px)`\n bar.style.width = `calc(${p.width * 100}% - 4px)`\n if (ev.color) bar.style.setProperty('--zc-event-bg', ev.color)\n if (ev.textColor) bar.style.setProperty('--zc-event-fg', ev.textColor)\n bar.appendChild(this.cal.renderEventContent(ev))\n this.bindBar(bar, ev)\n content.appendChild(bar)\n this.cal.fireEventMount(ev, bar)\n }\n }\n this.renderNowIndicator()\n }\n\n private renderNowIndicator(): void {\n this.nowLine?.remove()\n this.nowLine = null\n if (!this.cal.options.nowIndicator || !this.colsEl) return\n const now = this.cal.now()\n if (!now.isSame(this.cal.date, 'day')) return\n const axis = this.cal.axis\n const nm = dayMinutes(now)\n if (nm < axis.min || nm > axis.max) return\n this.nowLine = el('div', 'zc-now-indicator zc-rg-now')\n this.nowLine.style.top = `${(nm - axis.min) * this.pxPerMinute}px`\n this.colsEl.appendChild(this.nowLine)\n }\n\n // ---- interaction ---------------------------------------------------------\n\n private timeAt(minute: number): Dayjs {\n return this.cal.date.startOf('day').add(minute, 'minute')\n }\n\n private minuteAtY(clientY: number): number {\n const rect = this.colsEl!.getBoundingClientRect()\n return this.cal.axis.min + (clientY - rect.top) / this.pxPerMinute\n }\n\n /** The resource column under the pointer (bar ignored for hit-testing). */\n private resourceIdAt(event: MouseEvent, bar: HTMLElement): string | null | undefined {\n const prev = bar.style.pointerEvents\n bar.style.pointerEvents = 'none'\n const target = document.elementFromPoint(event.clientX, event.clientY) as HTMLElement | null\n bar.style.pointerEvents = prev\n const col = target?.closest('.zc-rg-col[data-resource-id]') as HTMLElement | null\n return col ? (col.dataset.resourceId ?? null) : undefined\n }\n\n private bindBar(bar: HTMLElement, ev: CalEvent): void {\n this.cal.bindContextMenu(bar, ev)\n if (!this.cal.editable) {\n bar.addEventListener('click', (jsEvent) => this.cal.fireEventClick(ev, bar, jsEvent))\n return\n }\n bar.style.cursor = 'move'\n const handle = el('div', 'zc-resize-handle zc-resize-s')\n bar.appendChild(handle)\n handle.addEventListener('pointerdown', (down) => this.beginResize(down, bar, ev))\n\n bar.addEventListener('pointerdown', (down) => {\n if (down.button !== 0) return\n if ((down.target as HTMLElement).closest('.zc-resize-handle')) return\n down.preventDefault()\n const axis = this.cal.axis\n const durMin = ev.end.diff(ev.start, 'minute')\n const origStartMin = dayMinutes(ev.start)\n const grabMin = this.minuteAtY(down.clientY)\n const startMinAt = (clientY: number): number =>\n clamp(\n snap(origStartMin + (this.minuteAtY(clientY) - grabMin), axis.duration),\n axis.min,\n axis.max - durMin,\n )\n startDrag(down, {\n onStart: () => bar.classList.add('zc-dragging'),\n onMove: ({ event }) => {\n bar.style.top = `${(startMinAt(event.clientY) - axis.min) * this.pxPerMinute}px`\n },\n onEnd: ({ moved, event }) => {\n bar.classList.remove('zc-dragging')\n if (!moved) {\n this.cal.fireEventClick(ev, bar, event)\n return\n }\n const newStart = this.timeAt(startMinAt(event.clientY))\n const newResource = this.resourceIdAt(event, bar) ?? ev.resourceId\n this.cal.commitEventChange(ev, newStart, newStart.add(durMin, 'minute'), newResource)\n },\n })\n })\n }\n\n private beginResize(down: MouseEvent, bar: HTMLElement, ev: CalEvent): void {\n if (down.button !== 0) return\n down.stopPropagation()\n down.preventDefault()\n const axis = this.cal.axis\n const startMin = dayMinutes(ev.start)\n const endAt = (clientY: number): number =>\n clamp(snap(this.minuteAtY(clientY), axis.duration), startMin + axis.duration, axis.max)\n startDrag(down, {\n onStart: () => bar.classList.add('zc-dragging'),\n onMove: ({ event }) => {\n bar.style.height = `${(endAt(event.clientY) - startMin) * this.pxPerMinute}px`\n },\n onEnd: ({ moved, event }) => {\n bar.classList.remove('zc-dragging')\n if (!moved) return\n this.cal.commitEventChange(ev, ev.start, this.timeAt(endAt(event.clientY)), ev.resourceId)\n },\n })\n }\n\n private bindColSelect(col: HTMLElement, resource: CalResource): void {\n if (!this.cal.selectable) return\n col.addEventListener('pointerdown', (down) => {\n if (down.button !== 0) return\n if ((down.target as HTMLElement).closest('.zc-event')) return\n down.preventDefault()\n const axis = this.cal.axis\n const anchor = clamp(snap(this.minuteAtY(down.clientY), axis.duration), axis.min, axis.max)\n const box = el('div', 'zc-select-box zc-rg-select')\n col.appendChild(box)\n const place = (clientY: number) => {\n const cur = clamp(snap(this.minuteAtY(clientY), axis.duration), axis.min, axis.max)\n const lo = Math.min(anchor, cur)\n const hi = Math.max(anchor, cur)\n box.style.top = `${(lo - axis.min) * this.pxPerMinute}px`\n box.style.height = `${(hi - lo) * this.pxPerMinute}px`\n }\n startDrag(down, {\n onMove: ({ event }) => place(event.clientY),\n onEnd: ({ moved, event }) => {\n box.remove()\n if (!moved) return\n const cur = clamp(snap(this.minuteAtY(event.clientY), axis.duration), axis.min, axis.max)\n let lo = Math.min(anchor, cur)\n let hi = Math.max(anchor, cur)\n if (hi <= lo) hi = Math.min(lo + axis.duration, axis.max)\n if (hi <= lo) return\n this.cal.commitSelect(this.timeAt(lo), this.timeAt(hi), resource, event)\n },\n })\n })\n }\n\n unmount(): void {\n this.rootEl?.remove()\n this.rootEl = undefined\n this.colsEl = undefined\n this.nowLine = null\n this.cols = []\n }\n}\n","import type { Calendar } from '../Calendar'\nimport type { Dayjs } from 'dayjs'\nimport type { DateRange, CalEvent, CalResource, ResourceColumn } from '../types'\nimport { dayMinutes, minutesToTime, intlFormat } from '../datelib'\nimport { packEvents } from '../layout/overlap'\nimport { startDrag, snap } from '../interaction/pointer'\nimport { el, clamp, type View } from './View'\n\n/** Header (time axis / column header) height in px. */\nconst HEAD_H = 38\n/** Group header row height in px. */\nconst GROUP_H = 26\n/** Default minimum height of one stacked event level in px (override via `eventMinHeight`). */\nconst DEFAULT_EVENT_MIN_H = 48\n/** Vertical padding inside a resource row in px. */\nconst PAD = 4\n/** Width of one hour on the time axis in px. */\nconst HOUR_PX = 90\n/** Minimum rendered width of an event bar in px. */\nconst EVENT_MIN_W = 14\n\n/**\n * Resources-as-rows horizontal timeline.\n *\n * Layout: a sticky resource area (one or more columns) on the left and a\n * horizontally-scrolling time grid on the right. Resources may be grouped; each\n * resource is a row whose height grows to stack overlapping events into levels.\n * Supports drag-move (incl. across resource rows), resize and drag-select when\n * `editable`/`selectable` are set.\n */\nexport class TimelineView implements View {\n private rootEl?: HTMLElement\n private resourceBody?: HTMLElement\n private resourceRows?: HTMLElement\n private timeHead?: HTMLElement\n private timeBody?: HTMLElement\n private rowsEl?: HTMLElement\n private overlay?: HTMLElement\n private onScroll?: () => void\n\n constructor(\n private cal: Calendar,\n private root: HTMLElement,\n ) {}\n\n // ---- geometry ------------------------------------------------------------\n\n private get pxPerMinute(): number {\n return HOUR_PX / 60\n }\n\n private get width(): number {\n return this.cal.axis.totalMinutes * this.pxPerMinute\n }\n\n private localeTag(): string {\n return this.cal.locale.intl ?? this.cal.locale.code\n }\n\n range(): DateRange {\n const d = this.cal.date\n return { start: d.startOf('day'), end: d.endOf('day') }\n }\n\n title(): string {\n return intlFormat(\n this.cal.date,\n { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' },\n this.localeTag(),\n this.cal.tz,\n )\n }\n\n // ---- resource columns ----------------------------------------------------\n\n private columns(): ResourceColumn[] {\n const configured = this.cal.options.resourceArea?.columns\n if (configured && configured.length) return configured\n // Default: a single column rendering the resource label.\n return [{ field: 'title', header: '' }]\n }\n\n private applyWidth(node: HTMLElement, width: number | string | undefined, flexFallback = true): void {\n if (width != null) {\n const w = typeof width === 'number' ? `${width}px` : width\n node.style.flex = `0 0 ${w}`\n node.style.width = w\n } else if (flexFallback) {\n node.style.flex = '1 1 0'\n }\n }\n\n // ---- mount ---------------------------------------------------------------\n\n mount(): void {\n this.rootEl = el('div', 'zc-timeline')\n\n // Resource area (sticky left).\n const resourceArea = el('div', 'zc-tl-resource-area')\n this.applyWidth(resourceArea, this.cal.options.resourceArea?.width ?? '25%', false)\n if (this.cal.options.resourceArea?.width == null) resourceArea.style.flex = '0 0 25%'\n\n const resourceHead = el('div', 'zc-tl-resource-head')\n resourceHead.style.height = `${HEAD_H}px`\n for (const col of this.columns()) {\n const cell = el('div', 'zc-tl-col-head')\n this.applyWidth(cell, col.width)\n cell.textContent = col.header ?? ''\n resourceHead.appendChild(cell)\n }\n this.resourceBody = el('div', 'zc-tl-resource-body')\n this.resourceRows = el('div', 'zc-tl-resource-rows')\n this.resourceBody.appendChild(this.resourceRows)\n resourceArea.append(resourceHead, this.resourceBody)\n\n // Time area (scrolls horizontally; body scrolls vertically).\n const timeArea = el('div', 'zc-tl-time-area')\n this.timeHead = el('div', 'zc-tl-time-head')\n this.timeHead.style.height = `${HEAD_H}px`\n this.buildAxisHeader(this.timeHead)\n\n this.timeBody = el('div', 'zc-tl-time-body')\n const canvas = el('div', 'zc-tl-time-canvas')\n canvas.style.width = `${this.width}px`\n this.overlay = el('div', 'zc-tl-overlay')\n this.buildOverlayLines(this.overlay)\n this.rowsEl = el('div', 'zc-tl-rows')\n canvas.append(this.overlay, this.rowsEl)\n this.timeBody.appendChild(canvas)\n timeArea.append(this.timeHead, this.timeBody)\n\n this.rootEl.append(resourceArea, timeArea)\n this.root.appendChild(this.rootEl)\n\n // Keep the three scroll planes in sync.\n this.onScroll = () => {\n if (this.resourceBody && this.timeBody) this.resourceBody.scrollTop = this.timeBody.scrollTop\n if (this.timeHead && this.timeBody) this.timeHead.scrollLeft = this.timeBody.scrollLeft\n }\n this.timeBody.addEventListener('scroll', this.onScroll, { passive: true })\n\n this.relayout()\n }\n\n private buildAxisHeader(head: HTMLElement): void {\n const inner = el('div', 'zc-tl-axis')\n inner.style.width = `${this.width}px`\n const axis = this.cal.axis\n for (let m = axis.min; m <= axis.max; m += axis.labelInterval) {\n const label = el('div', 'zc-tl-axis-label')\n label.style.left = `${(m - axis.min) * this.pxPerMinute}px`\n label.textContent = minutesToTime(m)\n inner.appendChild(label)\n }\n head.appendChild(inner)\n }\n\n private buildOverlayLines(overlay: HTMLElement): void {\n const axis = this.cal.axis\n for (let m = axis.min; m <= axis.max; m += axis.labelInterval) {\n const line = el('div', 'zc-tl-vline')\n line.style.left = `${(m - axis.min) * this.pxPerMinute}px`\n overlay.appendChild(line)\n }\n }\n\n // ---- layout (rows + events) ---------------------------------------------\n\n renderEvents(): void {\n this.relayout()\n }\n\n /** Rebuild rows in both panes from the current resources + events. */\n private relayout(): void {\n if (!this.resourceRows || !this.rowsEl) return\n this.resourceRows.innerHTML = ''\n this.rowsEl.innerHTML = ''\n\n const range = this.range()\n const groups = this.cal.resources.grouped()\n const showGroupHeaders = groups.length > 1 || groups.some((g) => g.group !== null)\n\n for (const bucket of groups) {\n if (showGroupHeaders && bucket.group !== null) {\n this.appendGroupRow(bucket.group)\n }\n for (const resource of bucket.resources) {\n const events = this.cal.events.inRange(range.start, range.end, resource.id)\n this.appendResourceRow(resource, events)\n }\n }\n\n this.renderNowIndicator()\n }\n\n private appendGroupRow(label: string): void {\n const r = el('div', 'zc-tl-resource-row zc-tl-group-row')\n r.style.height = `${GROUP_H}px`\n r.textContent = label\n this.resourceRows!.appendChild(r)\n\n const t = el('div', 'zc-tl-row zc-tl-group-spacer')\n t.style.height = `${GROUP_H}px`\n this.rowsEl!.appendChild(t)\n }\n\n private appendResourceRow(resource: CalResource, events: CalEvent[]): void {\n const packed = packEvents(events)\n const levels = packed.reduce((max, p) => Math.max(max, p.cols), 1)\n // Each stacked level keeps at least eventMinHeight, so the row grows with the\n // number of overlapping events instead of squashing them together.\n const eventMinH = this.cal.options.eventMinHeight ?? DEFAULT_EVENT_MIN_H\n const rowH = levels * eventMinH + 2 * PAD\n const levelH = eventMinH\n\n // Resource-area row: one cell per column.\n const rRow = el('div', 'zc-tl-resource-row')\n rRow.style.height = `${rowH}px`\n rRow.dataset.resourceId = resource.id\n for (const col of this.columns()) {\n const cell = el('div', 'zc-tl-col-cell')\n this.applyWidth(cell, col.width)\n this.fillResourceCell(cell, col, resource)\n rRow.appendChild(cell)\n }\n this.resourceRows!.appendChild(rRow)\n\n // Time-grid row: event bars positioned along the x-axis.\n const tRow = el('div', 'zc-tl-row')\n tRow.style.height = `${rowH}px`\n tRow.dataset.resourceId = resource.id\n const axis = this.cal.axis\n for (const p of packed) {\n const ev = p.event\n const rawStart = dayMinutes(ev.start)\n let rawEnd = dayMinutes(ev.end)\n if (rawEnd <= rawStart) rawEnd = axis.max\n const startMin = clamp(rawStart, axis.min, axis.max)\n const endMin = clamp(rawEnd, axis.min, axis.max)\n if (endMin <= axis.min || startMin >= axis.max) continue\n\n const x = (startMin - axis.min) * this.pxPerMinute\n const w = Math.max(EVENT_MIN_W, (endMin - startMin) * this.pxPerMinute)\n const top = PAD + p.col * levelH\n\n const bar = el('div', 'zc-event zc-tl-event')\n bar.dataset.eventId = ev.id\n bar.style.left = `${x}px`\n bar.style.width = `${Math.min(w, this.width - x)}px`\n bar.style.top = `${top}px`\n bar.style.height = `${levelH - 2}px`\n if (ev.color) bar.style.setProperty('--zc-event-bg', ev.color)\n if (ev.textColor) bar.style.setProperty('--zc-event-fg', ev.textColor)\n bar.appendChild(this.cal.renderEventContent(ev))\n this.bindBar(bar, ev)\n tRow.appendChild(bar)\n this.cal.fireEventMount(ev, bar)\n }\n this.bindRowSelect(tRow, resource)\n this.rowsEl!.appendChild(tRow)\n }\n\n // ---- interaction ---------------------------------------------------------\n\n private timeAt(minute: number): Dayjs {\n return this.cal.date.startOf('day').add(minute, 'minute')\n }\n\n private minuteAtX(clientX: number): number {\n const rect = this.rowsEl!.getBoundingClientRect()\n return this.cal.axis.min + (clientX - rect.left) / this.pxPerMinute\n }\n\n /** The resource row currently under the pointer (bar ignored for hit-testing). */\n private rowAt(event: MouseEvent, bar: HTMLElement): HTMLElement | null {\n const prev = bar.style.pointerEvents\n bar.style.pointerEvents = 'none'\n const target = document.elementFromPoint(event.clientX, event.clientY) as HTMLElement | null\n bar.style.pointerEvents = prev\n return (target?.closest('.zc-tl-row[data-resource-id]') as HTMLElement | null) ?? null\n }\n\n private highlightRow(event: MouseEvent, bar: HTMLElement): void {\n this.clearHighlight()\n this.rowAt(event, bar)?.classList.add('zc-drop-target')\n }\n\n private clearHighlight(): void {\n this.rowsEl?.querySelectorAll('.zc-drop-target').forEach((n) => n.classList.remove('zc-drop-target'))\n }\n\n private bindBar(bar: HTMLElement, ev: CalEvent): void {\n this.cal.bindContextMenu(bar, ev)\n if (!this.cal.editable) {\n bar.addEventListener('click', (jsEvent) => this.cal.fireEventClick(ev, bar, jsEvent))\n return\n }\n bar.style.cursor = 'move'\n\n const west = el('div', 'zc-resize-handle zc-resize-w')\n const east = el('div', 'zc-resize-handle zc-resize-e')\n bar.append(west, east)\n west.addEventListener('pointerdown', (down) => this.beginResize(down, bar, ev, 'start'))\n east.addEventListener('pointerdown', (down) => this.beginResize(down, bar, ev, 'end'))\n\n bar.addEventListener('pointerdown', (down) => {\n if (down.button !== 0) return\n if ((down.target as HTMLElement).closest('.zc-resize-handle')) return\n down.preventDefault()\n const axis = this.cal.axis\n const durMin = ev.end.diff(ev.start, 'minute')\n const origStartMin = dayMinutes(ev.start)\n const grabMin = this.minuteAtX(down.clientX)\n const startMinAt = (clientX: number): number =>\n clamp(\n snap(origStartMin + (this.minuteAtX(clientX) - grabMin), axis.duration),\n axis.min,\n axis.max - durMin,\n )\n startDrag(down, {\n onStart: () => bar.classList.add('zc-dragging'),\n onMove: ({ event }) => {\n bar.style.left = `${(startMinAt(event.clientX) - axis.min) * this.pxPerMinute}px`\n this.highlightRow(event, bar)\n },\n onEnd: ({ moved, event }) => {\n bar.classList.remove('zc-dragging')\n this.clearHighlight()\n if (!moved) {\n this.cal.fireEventClick(ev, bar, event)\n return\n }\n const row = this.rowAt(event, bar)\n const newResource = row ? (row.dataset.resourceId ?? null) : ev.resourceId\n const newStart = this.timeAt(startMinAt(event.clientX))\n this.cal.commitEventChange(ev, newStart, newStart.add(durMin, 'minute'), newResource)\n },\n })\n })\n }\n\n private beginResize(down: MouseEvent, bar: HTMLElement, ev: CalEvent, edge: 'start' | 'end'): void {\n if (down.button !== 0) return\n down.stopPropagation()\n down.preventDefault()\n const axis = this.cal.axis\n const minuteAt = (clientX: number) => clamp(snap(this.minuteAtX(clientX), axis.duration), axis.min, axis.max)\n startDrag(down, {\n onStart: () => bar.classList.add('zc-dragging'),\n onMove: ({ event }) => {\n const m = minuteAt(event.clientX)\n if (edge === 'end') {\n const endMin = Math.max(m, dayMinutes(ev.start) + axis.duration)\n bar.style.width = `${(endMin - dayMinutes(ev.start)) * this.pxPerMinute}px`\n } else {\n const startMin = Math.min(m, dayMinutes(ev.end) - axis.duration)\n bar.style.left = `${(startMin - axis.min) * this.pxPerMinute}px`\n bar.style.width = `${(dayMinutes(ev.end) - startMin) * this.pxPerMinute}px`\n }\n },\n onEnd: ({ moved, event }) => {\n bar.classList.remove('zc-dragging')\n if (!moved) return\n const m = minuteAt(event.clientX)\n if (edge === 'end') {\n const endMin = Math.max(m, dayMinutes(ev.start) + axis.duration)\n this.cal.commitEventChange(ev, ev.start, this.timeAt(endMin), ev.resourceId)\n } else {\n const startMin = Math.min(m, dayMinutes(ev.end) - axis.duration)\n this.cal.commitEventChange(ev, this.timeAt(startMin), ev.end, ev.resourceId)\n }\n },\n })\n }\n\n private bindRowSelect(tRow: HTMLElement, resource: CalResource): void {\n if (!this.cal.selectable) return\n tRow.addEventListener('pointerdown', (down) => {\n if (down.button !== 0) return\n if ((down.target as HTMLElement).closest('.zc-event')) return\n down.preventDefault()\n const axis = this.cal.axis\n const anchor = clamp(snap(this.minuteAtX(down.clientX), axis.duration), axis.min, axis.max)\n const box = el('div', 'zc-select-box zc-tl-select')\n tRow.appendChild(box)\n const place = (clientX: number) => {\n const cur = clamp(snap(this.minuteAtX(clientX), axis.duration), axis.min, axis.max)\n const lo = Math.min(anchor, cur)\n const hi = Math.max(anchor, cur)\n box.style.left = `${(lo - axis.min) * this.pxPerMinute}px`\n box.style.width = `${(hi - lo) * this.pxPerMinute}px`\n }\n startDrag(down, {\n onMove: ({ event }) => place(event.clientX),\n onEnd: ({ moved, event }) => {\n box.remove()\n if (!moved) return\n const cur = clamp(snap(this.minuteAtX(event.clientX), axis.duration), axis.min, axis.max)\n let lo = Math.min(anchor, cur)\n let hi = Math.max(anchor, cur)\n if (hi <= lo) hi = Math.min(lo + axis.duration, axis.max)\n if (hi <= lo) return\n this.cal.commitSelect(this.timeAt(lo), this.timeAt(hi), resource, event)\n },\n })\n })\n }\n\n private fillResourceCell(cell: HTMLElement, col: ResourceColumn, resource: CalResource): void {\n if (col.render) {\n const out = col.render(resource)\n if (typeof out === 'string') cell.innerHTML = out\n else cell.appendChild(out)\n return\n }\n // The label column defers to the renderResource hook when present.\n if ((col.field === 'title' || !col.field) && this.cal.options.renderResource) {\n const out = this.cal.options.renderResource(resource)\n if (typeof out === 'string') cell.innerHTML = out\n else cell.appendChild(out)\n return\n }\n const value = col.field ? resource.raw[col.field] : resource.title\n cell.textContent = value != null ? String(value) : ''\n }\n\n private renderNowIndicator(): void {\n this.overlay?.querySelector('.zc-tl-now')?.remove()\n if (!this.cal.options.nowIndicator || !this.overlay) return\n const now = this.cal.now()\n if (!now.isSame(this.cal.date, 'day')) return\n const axis = this.cal.axis\n const nm = dayMinutes(now)\n if (nm < axis.min || nm > axis.max) return\n const line = el('div', 'zc-tl-now')\n line.style.left = `${(nm - axis.min) * this.pxPerMinute}px`\n this.overlay.appendChild(line)\n }\n\n unmount(): void {\n if (this.onScroll) this.timeBody?.removeEventListener('scroll', this.onScroll)\n this.rootEl?.remove()\n this.rootEl = undefined\n this.resourceBody = undefined\n this.resourceRows = undefined\n this.timeHead = undefined\n this.timeBody = undefined\n this.rowsEl = undefined\n this.overlay = undefined\n this.onScroll = undefined\n }\n}\n","import type { Dayjs } from 'dayjs'\nimport type {\n CalendarOptions,\n ViewType,\n CalEvent,\n CalResource,\n EventInput,\n EventHandle,\n ResourceHandle,\n Locale,\n ToolbarConfig,\n} from './types'\nimport { EventStore } from './store/EventStore'\nimport { ResourceStore } from './store/ResourceStore'\nimport { buildAxis, nowTz, toTz, intlFormat } from './datelib'\nimport type { SlotAxis } from './datelib'\nimport type { View } from './views/View'\nimport { DayView } from './views/DayView'\nimport { ResourceDayView } from './views/ResourceDayView'\nimport { TimelineView } from './views/TimelineView'\n\n// Neutral English defaults — every label is overridable via the `locale` option,\n// so a host app passes its own translations in.\nconst DEFAULT_LOCALE: Locale = {\n code: 'en',\n buttons: { today: 'Today', prev: '‹', next: '›' },\n ariaLabels: { today: 'Today', prev: 'Previous', next: 'Next' },\n}\n\nconst DEFAULT_TOOLBAR: ToolbarConfig = { start: '', center: 'title', end: 'today prev next' }\n\n/**\n * The public, framework-agnostic calendar. Construct with a host element and\n * options, then `render()`. Mirrors the imperative surface hosts rely on\n * (render/destroy/refetchEvents/addEvent/getEventById/gotoDate/changeView/…) so\n * Preact and React callers can drive it through a ref.\n */\nexport class Calendar {\n readonly el: HTMLElement\n options: CalendarOptions\n readonly events: EventStore\n readonly resources: ResourceStore\n\n private _date: Dayjs\n private _view: ViewType\n private viewImpl: View | null = null\n private bodyEl: HTMLElement | null = null\n private titleEl: HTMLElement | null = null\n\n constructor(el: HTMLElement, options: CalendarOptions = {}) {\n this.el = el\n this.options = options\n this.events = new EventStore(options.timezone)\n this.resources = new ResourceStore(\n options.resourceGroupField ?? 'group',\n options.resourceOrder ?? 'order',\n )\n this._view = options.view ?? 'day'\n this._date = options.date ? toTz(options.date, options.timezone) : nowTz(options.timezone)\n if (Array.isArray(options.resources)) this.resources.set(options.resources)\n if (Array.isArray(options.events)) this.events.set(options.events)\n }\n\n // ---- derived state -------------------------------------------------------\n\n get tz(): string | undefined {\n return this.options.timezone\n }\n\n get date(): Dayjs {\n return this._date\n }\n\n get view(): ViewType {\n return this._view\n }\n\n get axis(): SlotAxis {\n return buildAxis(this.options.slot)\n }\n\n get locale(): Locale {\n const l = this.options.locale\n if (!l) return DEFAULT_LOCALE\n if (typeof l === 'string') return { ...DEFAULT_LOCALE, code: l }\n return {\n ...DEFAULT_LOCALE,\n ...l,\n buttons: { ...DEFAULT_LOCALE.buttons, ...l.buttons },\n ariaLabels: { ...DEFAULT_LOCALE.ariaLabels, ...l.ariaLabels },\n }\n }\n\n get firstDay(): number {\n return this.locale.firstDay ?? this.options.firstDay ?? 1\n }\n\n /** Start of the currently-shown view range, in the calendar timezone. */\n get activeStart(): Dayjs {\n return this.viewImpl?.range().start ?? this._date.startOf('day')\n }\n\n /** End of the currently-shown view range. */\n get activeEnd(): Dayjs {\n return this.viewImpl?.range().end ?? this._date.endOf('day')\n }\n\n /** The active view's type and date window. */\n getView(): { type: ViewType; activeStart: Dayjs; activeEnd: Dayjs } {\n return { type: this._view, activeStart: this.activeStart, activeEnd: this.activeEnd }\n }\n\n private isDayClosed(): boolean {\n const d = this.options.dayClosed\n if (d === undefined) return false\n return typeof d === 'function' ? d(this._date) : d\n }\n\n get editable(): boolean {\n return this.options.editable === true\n }\n\n get selectable(): boolean {\n return this.options.selectable === true\n }\n\n now(): Dayjs {\n return nowTz(this.tz)\n }\n\n // ---- lifecycle -----------------------------------------------------------\n\n render(): this {\n this.el.classList.add('zc')\n this.el.innerHTML = ''\n if (this.options.height != null) {\n this.el.style.height =\n typeof this.options.height === 'number' ? `${this.options.height}px` : this.options.height\n }\n this.renderToolbar()\n this.bodyEl = document.createElement('div')\n this.bodyEl.className = 'zc-body'\n this.el.appendChild(this.bodyEl)\n this.mountView()\n void this.reload()\n return this\n }\n\n destroy(): void {\n this.viewImpl?.unmount()\n this.viewImpl = null\n this.el.innerHTML = ''\n this.el.classList.remove('zc')\n }\n\n // ---- views ---------------------------------------------------------------\n\n private createView(type: ViewType): View {\n const root = this.bodyEl\n if (!root) throw new Error('[@ziix/calendar] render() must run before a view is created')\n switch (type) {\n case 'day':\n return new DayView(this, root)\n case 'resource-day':\n return new ResourceDayView(this, root)\n case 'timeline':\n return new TimelineView(this, root)\n default:\n throw new Error(`[@ziix/calendar] unknown view: ${String(type)}`)\n }\n }\n\n private mountView(): void {\n if (!this.bodyEl) return\n this.viewImpl?.unmount()\n this.bodyEl.innerHTML = ''\n this.viewImpl = this.createView(this._view)\n this.viewImpl.mount()\n this.bodyEl.classList.toggle('zc-closed', this.isDayClosed())\n this.updateTitle()\n this.emitDatesSet()\n }\n\n changeView(type: ViewType): void {\n this._view = type\n this.mountView()\n void this.reload()\n }\n\n // ---- navigation ----------------------------------------------------------\n\n gotoDate(date: string | Date | Dayjs): void {\n this._date = toTz(date as string | Date, this.tz)\n this.mountView()\n void this.reload()\n }\n\n today(): void {\n this.gotoDate(this.now())\n }\n\n prev(): void {\n this.gotoDate(this._date.subtract(1, 'day'))\n }\n\n next(): void {\n this.gotoDate(this._date.add(1, 'day'))\n }\n\n // ---- data ----------------------------------------------------------------\n\n /** Refetch resources (if a function source), rebuild structure, then events. */\n async reload(): Promise<void> {\n if (typeof this.options.resources === 'function') {\n await this.refetchResources()\n this.mountView()\n }\n await this.refetchEvents()\n }\n\n private async refetchResources(): Promise<void> {\n const src = this.options.resources\n if (typeof src !== 'function') return\n const range = this.viewImpl?.range()\n if (!range) return\n this.resources.set(await src(range))\n }\n\n async refetchEvents(): Promise<void> {\n const src = this.options.events\n const range = this.viewImpl?.range()\n if (typeof src === 'function' && range) {\n this.events.set(await src(range))\n }\n this.options.onEventsSet?.(this.events.all())\n this.viewImpl?.renderEvents()\n }\n\n addEvent(input: EventInput): EventHandle {\n const e = this.events.add(input)\n this.viewImpl?.renderEvents()\n return this.handle(e)\n }\n\n getEventById(id: string | number): EventHandle | null {\n const e = this.events.get(id)\n return e ? this.handle(e) : null\n }\n\n getEvents(): CalEvent[] {\n return this.events.all()\n }\n\n getResources(): CalResource[] {\n return this.resources.all()\n }\n\n getResourceById(id: string | number): ResourceHandle | null {\n const r = this.resources.get(id)\n return r ? this.resourceHandle(r) : null\n }\n\n private resourceHandle(r: CalResource): ResourceHandle {\n return {\n id: r.id,\n resource: r,\n setExtendedProp: (key, value) => {\n r.extendedProps[key] = value\n this.viewImpl?.renderEvents()\n },\n setProp: (key, value) => {\n if (key === 'title') r.title = value\n else r.group = value\n this.viewImpl?.renderEvents()\n },\n }\n }\n\n private handle(e: CalEvent): EventHandle {\n return {\n id: e.id,\n event: e,\n remove: () => {\n this.events.remove(e.id)\n this.viewImpl?.renderEvents()\n },\n setExtendedProp: (key, value) => {\n e.extendedProps[key] = value\n this.viewImpl?.renderEvents()\n },\n }\n }\n\n // ---- rendering helpers used by views ------------------------------------\n\n /** Build the inner body of an event, honouring the `renderEvent` hook. */\n renderEventContent(event: CalEvent): HTMLElement {\n const wrap = document.createElement('div')\n wrap.className = 'zc-event-main'\n const custom = this.options.renderEvent?.(event)\n if (custom != null) {\n if (typeof custom === 'string') wrap.innerHTML = custom\n else wrap.appendChild(custom)\n } else {\n wrap.appendChild(this.defaultEventContent(event))\n }\n return wrap\n }\n\n private defaultEventContent(event: CalEvent): HTMLElement {\n const frag = document.createElement('div')\n frag.className = 'zc-event-default'\n const time = document.createElement('span')\n time.className = 'zc-event-time'\n const fmt = this.options.timeFormat ?? { hour: '2-digit', minute: '2-digit', hour12: false }\n time.textContent = intlFormat(event.start, fmt, this.locale.intl ?? this.locale.code, this.tz)\n const title = document.createElement('span')\n title.className = 'zc-event-title'\n title.textContent = event.title\n frag.append(time, title)\n return frag\n }\n\n // ---- callback dispatch (called by views) --------------------------------\n\n fireEventClick(event: CalEvent, el: HTMLElement, jsEvent: MouseEvent): void {\n this.options.onEventClick?.({ event, el, jsEvent })\n }\n\n fireEventMount(event: CalEvent, el: HTMLElement): void {\n this.options.onEventMount?.({ event, el })\n }\n\n /** Attach a right-click handler to an event bar when `onEventContextMenu` is set. */\n bindContextMenu(el: HTMLElement, event: CalEvent): void {\n const handler = this.options.onEventContextMenu\n if (!handler) return\n el.addEventListener('contextmenu', (jsEvent) => {\n jsEvent.preventDefault()\n handler({ event, el, jsEvent })\n })\n }\n\n /** Whether events are allowed to overlap on the same resource (default true). */\n private allowsOverlap(): boolean {\n const o = this.options.eventOverlap\n if (o === undefined) return true\n return typeof o === 'function' ? o() : o\n }\n\n private hasCollision(event: CalEvent, start: Dayjs, end: Dayjs, resourceId: string | null): boolean {\n return this.events\n .all()\n .some(\n (e) =>\n e.id !== event.id &&\n e.resourceId === resourceId &&\n e.start.isBefore(end) &&\n e.end.isAfter(start),\n )\n }\n\n /**\n * Apply a drag/resize result: gate on `eventOverlap`, mutate the event,\n * re-render, and fire `onEventChange`. Returns false (and reverts the live\n * preview by re-rendering) when the move is rejected.\n */\n commitEventChange(\n event: CalEvent,\n start: Dayjs,\n end: Dayjs,\n resourceId: string | null,\n ): boolean {\n const unchanged =\n event.start.isSame(start) && event.end.isSame(end) && event.resourceId === resourceId\n if (unchanged) {\n this.viewImpl?.renderEvents()\n return false\n }\n if (!this.allowsOverlap() && this.hasCollision(event, start, end, resourceId)) {\n this.viewImpl?.renderEvents()\n return false\n }\n const oldEvent: CalEvent = { ...event }\n event.start = start\n event.end = end\n event.resourceId = resourceId\n this.viewImpl?.renderEvents()\n const revert = () => {\n event.start = oldEvent.start\n event.end = oldEvent.end\n event.resourceId = oldEvent.resourceId\n this.viewImpl?.renderEvents()\n }\n this.options.onEventChange?.({ event, oldEvent, revert })\n return true\n }\n\n /** Gate a drag-selection on `selectAllow`, then fire `onSelect`. */\n commitSelect(start: Dayjs, end: Dayjs, resource: CalResource | null, jsEvent: MouseEvent): boolean {\n if (this.options.selectAllow && !this.options.selectAllow({ start, end, resource })) return false\n this.options.onSelect?.({ start, end, resource, jsEvent })\n return true\n }\n\n // ---- toolbar -------------------------------------------------------------\n\n private renderToolbar(): void {\n if (this.options.toolbar === false) return\n const cfg = this.options.toolbar ?? DEFAULT_TOOLBAR\n const toolbar = document.createElement('div')\n toolbar.className = 'zc-toolbar'\n for (const section of ['start', 'center', 'end'] as const) {\n const sec = document.createElement('div')\n sec.className = `zc-toolbar-section zc-toolbar-${section}`\n const spec = cfg[section]\n if (spec) {\n // Whitespace separates button groups (gap between them); commas join\n // buttons within a group with no gap — e.g. 'today prev,next'.\n for (const group of spec.split(/\\s+/).filter(Boolean)) {\n const tokens = group.split(',').filter(Boolean)\n if (tokens.length === 1 && tokens[0] === 'title') {\n sec.appendChild(this.renderToolbarToken('title'))\n continue\n }\n const groupEl = document.createElement('div')\n groupEl.className = 'zc-btn-group'\n for (const token of tokens) groupEl.appendChild(this.renderToolbarToken(token))\n sec.appendChild(groupEl)\n }\n }\n toolbar.appendChild(sec)\n }\n this.el.appendChild(toolbar)\n }\n\n private renderToolbarToken(token: string): HTMLElement {\n if (token === 'title') {\n this.titleEl = document.createElement('h2')\n this.titleEl.className = 'zc-title'\n return this.titleEl\n }\n const btn = document.createElement('button')\n btn.type = 'button'\n btn.className = 'zc-btn'\n btn.dataset.zcButton = token\n const labels = this.locale.buttons ?? {}\n const aria = this.locale.ariaLabels ?? {}\n if (token === 'today') {\n btn.textContent = labels.today ?? 'Today'\n if (aria.today) btn.setAttribute('aria-label', aria.today)\n btn.onclick = () => this.today()\n } else if (token === 'prev') {\n btn.textContent = labels.prev ?? '‹'\n btn.setAttribute('aria-label', aria.prev ?? 'Previous')\n btn.onclick = () => this.prev()\n } else if (token === 'next') {\n btn.textContent = labels.next ?? '›'\n btn.setAttribute('aria-label', aria.next ?? 'Next')\n btn.onclick = () => this.next()\n } else {\n const custom = this.options.buttons?.[token]\n if (custom) {\n if (custom.icon) {\n const icon = document.createElement('span')\n icon.className = custom.icon\n btn.appendChild(icon)\n }\n if (custom.text) btn.appendChild(document.createTextNode(custom.text))\n btn.onclick = (jsEvent) => custom.onClick(jsEvent)\n } else {\n btn.textContent = token\n }\n }\n return btn\n }\n\n private updateTitle(): void {\n if (this.titleEl) this.titleEl.textContent = this.viewImpl?.title() ?? ''\n }\n\n private emitDatesSet(): void {\n const r = this.viewImpl?.range()\n if (r) this.options.onDatesSet?.({ start: r.start, end: r.end, view: this._view })\n }\n}\n"],"names":["dayjs","utc","timezone","toTz","value","tz","d","nowTz","timeToMinutes","t","parts","h","m","minutesToTime","min","dayMinutes","intlFormat","opts","localeTag","buildAxis","slot","max","duration","labelInterval","totalMinutes","slots","EventStore","input","start","end","inputs","e","id","resourceId","ResourceStore","groupField","orderField","groupVal","orderVal","i","r","a","b","buckets","index","packEvents","events","sorted","result","cluster","clusterEnd","flush","columns","ev","placed","col","cols","ci","startDrag","down","handlers","threshold","startX","startY","started","move","me","dx","dy","_a","_b","up","snap","minute","el","tag","cls","node","clamp","lo","hi","SLOT_PX","DayView","cal","root","axis","axisCol","label","s","line","n","packed","p","rawStart","rawEnd","startMin","endMin","top","height","clientY","rect","bar","jsEvent","handle","durMin","origStartMin","grabMin","place","event","moved","newStart","endAt","anchor","box","cur","now","nm","ResourceDayView","groups","ordered","g","showGroups","canvas","resource","head","corner","groupRow","bucket","band","labelRow","cell","custom","range","content","prev","target","startMinAt","newResource","HEAD_H","GROUP_H","DEFAULT_EVENT_MIN_H","PAD","HOUR_PX","EVENT_MIN_W","TimelineView","configured","width","flexFallback","w","resourceArea","resourceHead","timeArea","inner","overlay","showGroupHeaders","levels","eventMinH","rowH","levelH","rRow","tRow","x","clientX","west","east","row","edge","minuteAt","out","DEFAULT_LOCALE","DEFAULT_TOOLBAR","Calendar","options","l","type","date","src","_c","_d","key","wrap","frag","time","fmt","title","handler","o","oldEvent","revert","_e","cfg","toolbar","section","sec","spec","group","tokens","groupEl","token","btn","labels","aria","icon"],"mappings":"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"}
1
+ {"version":3,"file":"ziix-calendar.js","sources":["../src/datelib.ts","../src/store/EventStore.ts","../src/store/ResourceStore.ts","../src/layout/overlap.ts","../src/interaction/pointer.ts","../src/views/View.ts","../src/views/DayView.ts","../src/views/ResourceDayView.ts","../src/views/TimelineView.ts","../src/Calendar.ts"],"sourcesContent":["import dayjs from 'dayjs'\nimport type { Dayjs } from 'dayjs'\nimport utc from 'dayjs/plugin/utc'\nimport timezone from 'dayjs/plugin/timezone'\nimport type { SlotConfig } from './types'\n\ndayjs.extend(utc)\ndayjs.extend(timezone)\n\n/** Parse a value into a Dayjs anchored to `tz` (the shop timezone), if given. */\nexport function toTz(value: string | Date | Dayjs, tz?: string): Dayjs {\n const d = dayjs(value)\n return tz ? d.tz(tz) : d\n}\n\n/** \"Now\" in the calendar timezone. */\nexport function nowTz(tz?: string): Dayjs {\n return tz ? dayjs().tz(tz) : dayjs()\n}\n\n/** Parse 'HH:mm' / 'HH:mm:ss' / '24:00' into minutes from midnight. */\nexport function timeToMinutes(t: string): number {\n const parts = t.split(':')\n const h = Number(parts[0]) || 0\n const m = Number(parts[1]) || 0\n return h * 60 + m\n}\n\n/** Format minutes-from-midnight back to a zero-padded 'HH:mm'. */\nexport function minutesToTime(min: number): string {\n const h = Math.floor(min / 60)\n const m = min % 60\n return `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}`\n}\n\n/** Minutes from midnight for a Dayjs, read in its own (tz-applied) clock. */\nexport function dayMinutes(d: Dayjs): number {\n return d.hour() * 60 + d.minute()\n}\n\n/** Format an absolute instant in the given timezone via Intl. */\nexport function intlFormat(\n d: Dayjs,\n opts: Intl.DateTimeFormatOptions,\n localeTag: string,\n tz?: string,\n): string {\n return new Intl.DateTimeFormat(localeTag, { ...opts, timeZone: tz }).format(d.toDate())\n}\n\n/** Resolved, numeric time-axis derived from a SlotConfig. */\nexport interface SlotAxis {\n /** First visible minute from midnight. */\n min: number\n /** Last visible minute from midnight. */\n max: number\n /** Minutes per slot. */\n duration: number\n /** Minutes between axis labels. */\n labelInterval: number\n /** Number of whole slots between min and max. */\n slots: number\n /** Total visible minutes (max - min). */\n totalMinutes: number\n}\n\nexport function buildAxis(slot: SlotConfig = {}): SlotAxis {\n const min = timeToMinutes(slot.min ?? '00:00')\n const max = timeToMinutes(slot.max ?? '24:00')\n const duration = slot.duration ?? 15\n const labelInterval = slot.labelInterval ?? 60\n const totalMinutes = Math.max(0, max - min)\n const slots = duration > 0 ? Math.ceil(totalMinutes / duration) : 0\n return { min, max, duration, labelInterval, slots, totalMinutes }\n}\n","import type { Dayjs } from 'dayjs'\nimport type { CalEvent, EventInput } from '../types'\nimport { toTz } from '../datelib'\n\n/** Normalises raw event input, dedupes by id, and answers range/resource queries. */\nexport class EventStore {\n private map = new Map<string, CalEvent>()\n\n constructor(private tz?: string) {}\n\n normalize(input: EventInput): CalEvent {\n const start = toTz(input.start, this.tz)\n const end = input.end ? toTz(input.end, this.tz) : start.add(30, 'minute')\n return {\n id: String(input.id),\n title: input.title ?? '',\n start,\n end,\n resourceId: input.resourceId != null ? String(input.resourceId) : null,\n allDay: Boolean(input.allDay),\n color: input.color,\n textColor: input.textColor,\n extendedProps: input.extendedProps ?? {},\n raw: input,\n }\n }\n\n /** Replace the entire set, deduping by id (last write wins). */\n set(inputs: EventInput[]): void {\n this.map.clear()\n for (const input of inputs) {\n const e = this.normalize(input)\n this.map.set(e.id, e)\n }\n }\n\n add(input: EventInput): CalEvent {\n const e = this.normalize(input)\n this.map.set(e.id, e)\n return e\n }\n\n remove(id: string | number): boolean {\n return this.map.delete(String(id))\n }\n\n get(id: string | number): CalEvent | undefined {\n return this.map.get(String(id))\n }\n\n all(): CalEvent[] {\n return [...this.map.values()]\n }\n\n /**\n * Events overlapping [start, end). When `resourceId` is supplied (including\n * `null` for unassigned), only events on that resource are returned.\n */\n inRange(start: Dayjs, end: Dayjs, resourceId?: string | null): CalEvent[] {\n return this.all().filter((e) => {\n if (resourceId !== undefined && e.resourceId !== resourceId) return false\n return e.start.isBefore(end) && e.end.isAfter(start)\n })\n }\n}\n","import type { CalResource, ResourceInput } from '../types'\n\n/** Normalises resources, reads the configured group/order fields, and sorts. */\nexport class ResourceStore {\n private list: CalResource[] = []\n\n constructor(\n private groupField = 'group',\n private orderField = 'order',\n ) {}\n\n normalize(input: ResourceInput): CalResource {\n const groupVal = input[this.groupField]\n const orderVal = input[this.orderField]\n // Non-standard top-level fields are folded into extendedProps so callers can\n // read everything from one place regardless of how the source shaped it.\n const known = new Set(['id', 'title', 'group', 'order', 'extendedProps', this.groupField, this.orderField])\n const extra: Record<string, unknown> = {}\n for (const key of Object.keys(input)) {\n if (!known.has(key)) extra[key] = input[key]\n }\n return {\n id: String(input.id),\n title: input.title ?? '',\n group: groupVal != null ? String(groupVal) : null,\n order: typeof orderVal === 'number' ? orderVal : 0,\n extendedProps: { ...extra, ...(input.extendedProps ?? {}) },\n raw: input,\n }\n }\n\n set(inputs: ResourceInput[]): void {\n this.list = inputs.map((i) => this.normalize(i))\n }\n\n all(): CalResource[] {\n return [...this.list]\n }\n\n get(id: string | number): CalResource | undefined {\n return this.list.find((r) => r.id === String(id))\n }\n\n /**\n * Resources in display order. With `resourceOrder: 'id'` they are sorted by a\n * natural id comparison (so 'E2' precedes 'E10'); with a numeric order field\n * they sort by it; otherwise the original input order is preserved (sort is\n * stable).\n */\n ordered(): CalResource[] {\n if (this.orderField === 'id') {\n return [...this.list].sort((a, b) => a.id.localeCompare(b.id, undefined, { numeric: true }))\n }\n if (this.list.every((r) => r.order === 0)) {\n return [...this.list] // no explicit order → keep input order\n }\n return [...this.list].sort((a, b) => a.order - b.order)\n }\n\n /**\n * Grouped resources preserving first-seen group order. Returns a flat list of\n * `{ group, resources }` buckets; ungrouped resources land in a `null` bucket.\n */\n grouped(): Array<{ group: string | null; resources: CalResource[] }> {\n const buckets: Array<{ group: string | null; resources: CalResource[] }> = []\n const index = new Map<string | null, number>()\n for (const r of this.ordered()) {\n let i = index.get(r.group)\n if (i === undefined) {\n i = buckets.length\n index.set(r.group, i)\n buckets.push({ group: r.group, resources: [] })\n }\n buckets[i].resources.push(r)\n }\n return buckets\n }\n}\n","import type { CalEvent } from '../types'\n\nexport interface PackedEvent {\n event: CalEvent\n /** Column index within the cluster. */\n col: number\n /** Number of columns in the cluster. */\n cols: number\n /** Left offset as a 0..1 fraction of the column width. */\n left: number\n /** Width as a 0..1 fraction of the column width. */\n width: number\n}\n\n/**\n * Pack events that share a single column (resource/day) into side-by-side\n * sub-columns so overlapping events never cover each other — the classic\n * interval-graph greedy colouring.\n *\n * Events are expected to already belong to the same column; callers filter by\n * resource first.\n */\nexport function packEvents(events: CalEvent[]): PackedEvent[] {\n const sorted = [...events].sort(\n (a, b) => a.start.valueOf() - b.start.valueOf() || b.end.valueOf() - a.end.valueOf(),\n )\n\n const result: PackedEvent[] = []\n let cluster: CalEvent[] = []\n let clusterEnd = -Infinity\n\n const flush = () => {\n if (cluster.length === 0) return\n const columns: CalEvent[][] = []\n for (const ev of cluster) {\n let placed = false\n for (const col of columns) {\n const last = col[col.length - 1]\n if (last.end.valueOf() <= ev.start.valueOf()) {\n col.push(ev)\n placed = true\n break\n }\n }\n if (!placed) columns.push([ev])\n }\n const cols = columns.length\n columns.forEach((col, ci) => {\n for (const ev of col) {\n result.push({ event: ev, col: ci, cols, left: ci / cols, width: 1 / cols })\n }\n })\n cluster = []\n clusterEnd = -Infinity\n }\n\n for (const ev of sorted) {\n if (cluster.length > 0 && ev.start.valueOf() >= clusterEnd) flush()\n cluster.push(ev)\n clusterEnd = Math.max(clusterEnd, ev.end.valueOf())\n }\n flush()\n\n return result\n}\n","/** Context handed to drag move/end callbacks. */\nexport interface DragContext {\n /** Horizontal delta from the pointer-down position, in px. */\n dx: number\n /** Vertical delta from the pointer-down position, in px. */\n dy: number\n /** Whether the drag threshold was exceeded (i.e. a real drag, not a click). */\n moved: boolean\n /** The current pointer/mouse event. */\n event: MouseEvent\n}\n\nexport interface DragHandlers {\n /** Pixels of movement before a drag is considered started (default 4). */\n threshold?: number\n /** Fired once, when the threshold is first exceeded. */\n onStart?(event: MouseEvent): void\n /** Fired on every pointer move after the drag has started. */\n onMove?(ctx: DragContext): void\n /** Fired once on pointer up / cancel. `moved` distinguishes drag from click. */\n onEnd?(ctx: DragContext): void\n}\n\n/**\n * Track a pointer drag from a pointerdown event. Listeners live on `window` for\n * the duration of the gesture so the pointer can leave the origin element.\n * `onStart`/`onMove` only fire once movement passes the threshold, so a plain\n * click ends with `moved === false` and no `onStart`.\n */\nexport function startDrag(down: MouseEvent, handlers: DragHandlers): void {\n const threshold = handlers.threshold ?? 4\n const startX = down.clientX\n const startY = down.clientY\n let started = false\n\n const move = (e: Event) => {\n const me = e as MouseEvent\n const dx = me.clientX - startX\n const dy = me.clientY - startY\n if (!started && Math.hypot(dx, dy) < threshold) return\n if (!started) {\n started = true\n handlers.onStart?.(me)\n }\n handlers.onMove?.({ dx, dy, moved: true, event: me })\n }\n\n const up = (e: Event) => {\n window.removeEventListener('pointermove', move)\n window.removeEventListener('pointerup', up)\n window.removeEventListener('pointercancel', up)\n const me = e as MouseEvent\n handlers.onEnd?.({\n dx: me.clientX - startX,\n dy: me.clientY - startY,\n moved: started,\n event: me,\n })\n }\n\n window.addEventListener('pointermove', move)\n window.addEventListener('pointerup', up)\n window.addEventListener('pointercancel', up)\n}\n\n/** Round a minute value to the nearest slot boundary. */\nexport function snap(minute: number, slot: number): number {\n if (slot <= 0) return minute\n return Math.round(minute / slot) * slot\n}\n","import type { DateRange } from '../types'\n\n/** Contract every view (day, resource-day, timeline) implements. */\nexport interface View {\n /** Build the static DOM structure (axis, columns/rows) and render events. */\n mount(): void\n /** Re-place events only, without rebuilding the static structure. */\n renderEvents(): void\n /**\n * Re-render only the resource-area cells (e.g. after a resource's\n * extendedProps change), leaving event bars untouched. Optional — views\n * without a resource area can omit it.\n */\n renderResources?(): void\n /** Tear down and detach all DOM owned by the view. */\n unmount(): void\n /** The date window this view currently shows, in the calendar timezone. */\n range(): DateRange\n /** Human-readable title for the toolbar. */\n title(): string\n}\n\n/** Tiny DOM helper shared by views. */\nexport function el(tag: string, cls: string): HTMLElement {\n const node = document.createElement(tag)\n node.className = cls\n return node\n}\n\nexport function clamp(value: number, lo: number, hi: number): number {\n return Math.max(lo, Math.min(hi, value))\n}\n","import type { Calendar } from '../Calendar'\nimport type { Dayjs } from 'dayjs'\nimport type { DateRange, CalEvent } from '../types'\nimport { dayMinutes, minutesToTime, intlFormat } from '../datelib'\nimport { packEvents } from '../layout/overlap'\nimport { startDrag, snap } from '../interaction/pointer'\nimport { el, clamp, type View } from './View'\n\n/** Pixel height of one slot-duration on the time axis. */\nexport const SLOT_PX = 24\n\n/**\n * Single-column day view: a vertical time axis\n * with absolutely-positioned, overlap-packed events. Supports drag-move,\n * resize and drag-select when `editable`/`selectable` are set.\n */\nexport class DayView implements View {\n protected grid?: HTMLElement\n protected content?: HTMLElement\n private nowLine: HTMLElement | null = null\n\n constructor(\n protected cal: Calendar,\n protected root: HTMLElement,\n ) {}\n\n protected get pxPerMinute(): number {\n return SLOT_PX / this.cal.axis.duration\n }\n\n protected get contentHeight(): number {\n return this.cal.axis.slots * SLOT_PX\n }\n\n protected localeTag(): string {\n return this.cal.locale.intl ?? this.cal.locale.code\n }\n\n range(): DateRange {\n const d = this.cal.date\n return { start: d.startOf('day'), end: d.endOf('day') }\n }\n\n title(): string {\n return intlFormat(\n this.cal.date,\n { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' },\n this.localeTag(),\n this.cal.tz,\n )\n }\n\n mount(): void {\n const axis = this.cal.axis\n this.grid = el('div', 'zc-timegrid')\n\n const axisCol = el('div', 'zc-axis')\n axisCol.style.height = `${this.contentHeight}px`\n for (let m = axis.min; m <= axis.max; m += axis.labelInterval) {\n const label = el('div', 'zc-axis-label')\n label.style.top = `${(m - axis.min) * this.pxPerMinute}px`\n label.textContent = minutesToTime(m)\n axisCol.appendChild(label)\n }\n\n this.content = el('div', 'zc-col')\n this.content.style.height = `${this.contentHeight}px`\n for (let s = 0; s <= axis.slots; s++) {\n const line = el('div', 'zc-slot-line')\n if ((s * axis.duration) % axis.labelInterval === 0) line.classList.add('zc-slot-major')\n line.style.top = `${s * SLOT_PX}px`\n this.content.appendChild(line)\n }\n\n this.grid.appendChild(axisCol)\n this.grid.appendChild(this.content)\n this.root.appendChild(this.grid)\n this.bindSelect()\n this.renderEvents()\n }\n\n /** Events to lay out in this column. Subclasses scope this by resource. */\n protected eventsFor(): CalEvent[] {\n const r = this.range()\n return this.cal.events.inRange(r.start, r.end)\n }\n\n renderEvents(): void {\n if (!this.content) return\n this.content.querySelectorAll('.zc-event').forEach((n) => n.remove())\n\n const axis = this.cal.axis\n const packed = packEvents(this.eventsFor())\n for (const p of packed) {\n const ev = p.event\n const rawStart = dayMinutes(ev.start)\n const rawEnd = dayMinutes(ev.end) || axis.max\n const startMin = clamp(rawStart, axis.min, axis.max)\n const endMin = clamp(rawEnd, axis.min, axis.max)\n const top = (startMin - axis.min) * this.pxPerMinute\n const height = Math.max(SLOT_PX - 2, (endMin - startMin) * this.pxPerMinute)\n\n const node = el('div', 'zc-event')\n node.dataset.eventId = ev.id\n node.style.top = `${top}px`\n node.style.height = `${height}px`\n node.style.left = `calc(${p.left * 100}% + 2px)`\n node.style.width = `calc(${p.width * 100}% - 4px)`\n if (ev.color) node.style.setProperty('--zc-event-bg', ev.color)\n if (ev.textColor) node.style.setProperty('--zc-event-fg', ev.textColor)\n node.appendChild(this.cal.renderEventContent(ev))\n this.bindBar(node, ev)\n this.content.appendChild(node)\n this.cal.fireEventMount(ev, node)\n }\n\n this.renderNowIndicator()\n }\n\n // ---- interaction ---------------------------------------------------------\n\n private timeAt(minute: number): Dayjs {\n return this.cal.date.startOf('day').add(minute, 'minute')\n }\n\n private minuteAtY(clientY: number): number {\n const rect = this.content!.getBoundingClientRect()\n return this.cal.axis.min + (clientY - rect.top) / this.pxPerMinute\n }\n\n /** Wire click, drag-move and resize on an event bar (or just click if read-only). */\n private bindBar(bar: HTMLElement, ev: CalEvent): void {\n this.cal.bindContextMenu(bar, ev)\n if (!this.cal.editable) {\n bar.addEventListener('click', (jsEvent) => this.cal.fireEventClick(ev, bar, jsEvent))\n return\n }\n bar.style.cursor = 'move'\n\n const handle = el('div', 'zc-resize-handle zc-resize-s')\n bar.appendChild(handle)\n handle.addEventListener('pointerdown', (down) => this.beginResize(down, bar, ev))\n\n bar.addEventListener('pointerdown', (down) => {\n if (down.button !== 0) return\n if ((down.target as HTMLElement).closest('.zc-resize-handle')) return\n down.preventDefault()\n const axis = this.cal.axis\n const durMin = ev.end.diff(ev.start, 'minute')\n const origStartMin = dayMinutes(ev.start)\n const grabMin = this.minuteAtY(down.clientY)\n const place = (clientY: number): number =>\n clamp(\n snap(origStartMin + (this.minuteAtY(clientY) - grabMin), axis.duration),\n axis.min,\n axis.max - durMin,\n )\n startDrag(down, {\n onStart: () => bar.classList.add('zc-dragging'),\n onMove: ({ event }) => {\n bar.style.top = `${(place(event.clientY) - axis.min) * this.pxPerMinute}px`\n },\n onEnd: ({ moved, event }) => {\n bar.classList.remove('zc-dragging')\n if (!moved) {\n this.cal.fireEventClick(ev, bar, event)\n return\n }\n const newStart = this.timeAt(place(event.clientY))\n this.cal.commitEventChange(ev, newStart, newStart.add(durMin, 'minute'), ev.resourceId)\n },\n })\n })\n }\n\n private beginResize(down: MouseEvent, bar: HTMLElement, ev: CalEvent): void {\n if (down.button !== 0) return\n down.stopPropagation()\n down.preventDefault()\n const axis = this.cal.axis\n const startMin = dayMinutes(ev.start)\n const endAt = (clientY: number): number =>\n clamp(snap(this.minuteAtY(clientY), axis.duration), startMin + axis.duration, axis.max)\n startDrag(down, {\n onStart: () => bar.classList.add('zc-dragging'),\n onMove: ({ event }) => {\n bar.style.height = `${(endAt(event.clientY) - startMin) * this.pxPerMinute}px`\n },\n onEnd: ({ moved, event }) => {\n bar.classList.remove('zc-dragging')\n if (!moved) return\n this.cal.commitEventChange(ev, ev.start, this.timeAt(endAt(event.clientY)), ev.resourceId)\n },\n })\n }\n\n private bindSelect(): void {\n if (!this.cal.selectable || !this.content) return\n this.content.addEventListener('pointerdown', (down) => {\n if (down.button !== 0) return\n if ((down.target as HTMLElement).closest('.zc-event')) return\n down.preventDefault()\n const axis = this.cal.axis\n const anchor = clamp(snap(this.minuteAtY(down.clientY), axis.duration), axis.min, axis.max)\n const box = el('div', 'zc-select-box')\n this.content!.appendChild(box)\n const place = (clientY: number) => {\n const cur = clamp(snap(this.minuteAtY(clientY), axis.duration), axis.min, axis.max)\n const lo = Math.min(anchor, cur)\n const hi = Math.max(anchor, cur)\n box.style.top = `${(lo - axis.min) * this.pxPerMinute}px`\n box.style.height = `${(hi - lo) * this.pxPerMinute}px`\n }\n startDrag(down, {\n onMove: ({ event }) => place(event.clientY),\n onEnd: ({ moved, event }) => {\n box.remove()\n if (!moved) return\n const cur = clamp(snap(this.minuteAtY(event.clientY), axis.duration), axis.min, axis.max)\n let lo = Math.min(anchor, cur)\n let hi = Math.max(anchor, cur)\n if (hi <= lo) hi = Math.min(lo + axis.duration, axis.max)\n if (hi <= lo) return\n this.cal.commitSelect(this.timeAt(lo), this.timeAt(hi), null, event)\n },\n })\n })\n }\n\n protected renderNowIndicator(): void {\n this.nowLine?.remove()\n this.nowLine = null\n if (!this.cal.options.nowIndicator || !this.content) return\n const now = this.cal.now()\n if (!now.isSame(this.cal.date, 'day')) return\n const axis = this.cal.axis\n const nm = dayMinutes(now)\n if (nm < axis.min || nm > axis.max) return\n this.nowLine = el('div', 'zc-now-indicator')\n this.nowLine.style.top = `${(nm - axis.min) * this.pxPerMinute}px`\n this.content.appendChild(this.nowLine)\n }\n\n unmount(): void {\n this.grid?.remove()\n this.grid = undefined\n this.content = undefined\n this.nowLine = null\n }\n}\n","import type { Calendar } from '../Calendar'\nimport type { Dayjs } from 'dayjs'\nimport type { DateRange, CalEvent, CalResource } from '../types'\nimport { dayMinutes, minutesToTime, intlFormat } from '../datelib'\nimport { packEvents } from '../layout/overlap'\nimport { startDrag, snap } from '../interaction/pointer'\nimport { el, clamp, type View } from './View'\nimport { SLOT_PX } from './DayView'\n\n/**\n * Resources-as-columns day view: a shared vertical time axis with one column per resource,\n * grouped under sticky header bands. Reuses the day view's vertical geometry and\n * supports drag-move (incl. across columns → resource change), resize and\n * drag-select.\n */\nexport class ResourceDayView implements View {\n private rootEl?: HTMLElement\n private colsEl?: HTMLElement\n private nowLine: HTMLElement | null = null\n private cols: Array<{ resource: CalResource; content: HTMLElement }> = []\n\n constructor(\n private cal: Calendar,\n private root: HTMLElement,\n ) {}\n\n private get pxPerMinute(): number {\n return SLOT_PX / this.cal.axis.duration\n }\n\n private get contentHeight(): number {\n return this.cal.axis.slots * SLOT_PX\n }\n\n private localeTag(): string {\n return this.cal.locale.intl ?? this.cal.locale.code\n }\n\n range(): DateRange {\n const d = this.cal.date\n return { start: d.startOf('day'), end: d.endOf('day') }\n }\n\n title(): string {\n return intlFormat(\n this.cal.date,\n { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' },\n this.localeTag(),\n this.cal.tz,\n )\n }\n\n // ---- mount ---------------------------------------------------------------\n\n mount(): void {\n this.rootEl = el('div', 'zc-rg')\n const groups = this.cal.resources.grouped()\n const ordered = groups.flatMap((g) => g.resources)\n const showGroups = groups.length > 1 || groups.some((g) => g.group !== null)\n\n this.rootEl.appendChild(this.buildHead(groups, showGroups))\n\n const canvas = el('div', 'zc-rg-canvas')\n canvas.style.height = `${this.contentHeight}px`\n canvas.appendChild(this.buildAxis())\n\n this.colsEl = el('div', 'zc-rg-cols')\n this.cols = []\n for (const resource of ordered) {\n const col = el('div', 'zc-rg-col')\n col.dataset.resourceId = resource.id\n this.buildSlotLines(col)\n this.bindColSelect(col, resource)\n this.colsEl.appendChild(col)\n this.cols.push({ resource, content: col })\n }\n canvas.appendChild(this.colsEl)\n this.rootEl.appendChild(canvas)\n this.root.appendChild(this.rootEl)\n\n this.renderEvents()\n }\n\n private buildHead(\n groups: Array<{ group: string | null; resources: CalResource[] }>,\n showGroups: boolean,\n ): HTMLElement {\n const head = el('div', 'zc-rg-head')\n const corner = el('div', 'zc-rg-corner')\n head.appendChild(corner)\n\n const cols = el('div', 'zc-rg-head-cols')\n if (showGroups) {\n const groupRow = el('div', 'zc-rg-group-row')\n for (const bucket of groups) {\n const band = el('div', 'zc-rg-group-band')\n band.style.flex = `${bucket.resources.length} 1 0`\n band.textContent = bucket.group ?? ''\n groupRow.appendChild(band)\n }\n cols.appendChild(groupRow)\n }\n const labelRow = el('div', 'zc-rg-label-row')\n for (const resource of groups.flatMap((g) => g.resources)) {\n const cell = el('div', 'zc-rg-label')\n cell.dataset.resourceId = resource.id\n const custom = this.cal.options.renderResource?.(resource)\n if (custom != null) {\n if (typeof custom === 'string') cell.innerHTML = custom\n else cell.appendChild(custom)\n } else {\n cell.textContent = resource.title\n }\n labelRow.appendChild(cell)\n }\n cols.appendChild(labelRow)\n head.appendChild(cols)\n return head\n }\n\n private buildAxis(): HTMLElement {\n const axisCol = el('div', 'zc-axis zc-rg-axis')\n axisCol.style.height = `${this.contentHeight}px`\n const axis = this.cal.axis\n for (let m = axis.min; m <= axis.max; m += axis.labelInterval) {\n const label = el('div', 'zc-axis-label')\n label.style.top = `${(m - axis.min) * this.pxPerMinute}px`\n label.textContent = minutesToTime(m)\n axisCol.appendChild(label)\n }\n return axisCol\n }\n\n private buildSlotLines(col: HTMLElement): void {\n const axis = this.cal.axis\n for (let s = 0; s <= axis.slots; s++) {\n const line = el('div', 'zc-slot-line')\n if ((s * axis.duration) % axis.labelInterval === 0) line.classList.add('zc-slot-major')\n line.style.top = `${s * SLOT_PX}px`\n col.appendChild(line)\n }\n }\n\n // ---- events --------------------------------------------------------------\n\n renderEvents(): void {\n if (!this.colsEl) return\n const range = this.range()\n const axis = this.cal.axis\n for (const { resource, content } of this.cols) {\n content.querySelectorAll('.zc-event').forEach((n) => n.remove())\n const packed = packEvents(this.cal.events.inRange(range.start, range.end, resource.id))\n for (const p of packed) {\n const ev = p.event\n const rawStart = dayMinutes(ev.start)\n const rawEnd = dayMinutes(ev.end) || axis.max\n const startMin = clamp(rawStart, axis.min, axis.max)\n const endMin = clamp(rawEnd, axis.min, axis.max)\n const top = (startMin - axis.min) * this.pxPerMinute\n const height = Math.max(SLOT_PX - 2, (endMin - startMin) * this.pxPerMinute)\n\n const bar = el('div', 'zc-event')\n bar.dataset.eventId = ev.id\n bar.style.top = `${top}px`\n bar.style.height = `${height}px`\n bar.style.left = `calc(${p.left * 100}% + 2px)`\n bar.style.width = `calc(${p.width * 100}% - 4px)`\n if (ev.color) bar.style.setProperty('--zc-event-bg', ev.color)\n if (ev.textColor) bar.style.setProperty('--zc-event-fg', ev.textColor)\n bar.appendChild(this.cal.renderEventContent(ev))\n this.bindBar(bar, ev)\n content.appendChild(bar)\n this.cal.fireEventMount(ev, bar)\n }\n }\n this.renderNowIndicator()\n }\n\n private renderNowIndicator(): void {\n this.nowLine?.remove()\n this.nowLine = null\n if (!this.cal.options.nowIndicator || !this.colsEl) return\n const now = this.cal.now()\n if (!now.isSame(this.cal.date, 'day')) return\n const axis = this.cal.axis\n const nm = dayMinutes(now)\n if (nm < axis.min || nm > axis.max) return\n this.nowLine = el('div', 'zc-now-indicator zc-rg-now')\n this.nowLine.style.top = `${(nm - axis.min) * this.pxPerMinute}px`\n this.colsEl.appendChild(this.nowLine)\n }\n\n // ---- interaction ---------------------------------------------------------\n\n private timeAt(minute: number): Dayjs {\n return this.cal.date.startOf('day').add(minute, 'minute')\n }\n\n private minuteAtY(clientY: number): number {\n const rect = this.colsEl!.getBoundingClientRect()\n return this.cal.axis.min + (clientY - rect.top) / this.pxPerMinute\n }\n\n /** The resource column under the pointer (bar ignored for hit-testing). */\n private resourceIdAt(event: MouseEvent, bar: HTMLElement): string | null | undefined {\n const prev = bar.style.pointerEvents\n bar.style.pointerEvents = 'none'\n const target = document.elementFromPoint(event.clientX, event.clientY) as HTMLElement | null\n bar.style.pointerEvents = prev\n const col = target?.closest('.zc-rg-col[data-resource-id]') as HTMLElement | null\n return col ? (col.dataset.resourceId ?? null) : undefined\n }\n\n private highlightCol(event: MouseEvent, bar: HTMLElement): void {\n this.clearHighlight()\n const prev = bar.style.pointerEvents\n bar.style.pointerEvents = 'none'\n const target = document.elementFromPoint(event.clientX, event.clientY) as HTMLElement | null\n bar.style.pointerEvents = prev\n target?.closest('.zc-rg-col[data-resource-id]')?.classList.add('zc-drop-target')\n }\n\n private clearHighlight(): void {\n this.colsEl?.querySelectorAll('.zc-drop-target').forEach((n) => n.classList.remove('zc-drop-target'))\n }\n\n private bindBar(bar: HTMLElement, ev: CalEvent): void {\n this.cal.bindContextMenu(bar, ev)\n if (!this.cal.editable) {\n bar.addEventListener('click', (jsEvent) => this.cal.fireEventClick(ev, bar, jsEvent))\n return\n }\n bar.style.cursor = 'move'\n const handle = el('div', 'zc-resize-handle zc-resize-s')\n bar.appendChild(handle)\n handle.addEventListener('pointerdown', (down) => this.beginResize(down, bar, ev))\n\n bar.addEventListener('pointerdown', (down) => {\n if (down.button !== 0) return\n if ((down.target as HTMLElement).closest('.zc-resize-handle')) return\n down.preventDefault()\n const axis = this.cal.axis\n const durMin = ev.end.diff(ev.start, 'minute')\n const origStartMin = dayMinutes(ev.start)\n const grabMin = this.minuteAtY(down.clientY)\n const startMinAt = (clientY: number): number =>\n clamp(\n snap(origStartMin + (this.minuteAtY(clientY) - grabMin), axis.duration),\n axis.min,\n axis.max - durMin,\n )\n startDrag(down, {\n onStart: () => bar.classList.add('zc-dragging'),\n onMove: ({ event }) => {\n bar.style.top = `${(startMinAt(event.clientY) - axis.min) * this.pxPerMinute}px`\n this.highlightCol(event, bar)\n },\n onEnd: ({ moved, event }) => {\n bar.classList.remove('zc-dragging')\n this.clearHighlight()\n if (!moved) {\n this.cal.fireEventClick(ev, bar, event)\n return\n }\n const newStart = this.timeAt(startMinAt(event.clientY))\n const newResource = this.resourceIdAt(event, bar) ?? ev.resourceId\n this.cal.commitEventChange(ev, newStart, newStart.add(durMin, 'minute'), newResource)\n },\n })\n })\n }\n\n private beginResize(down: MouseEvent, bar: HTMLElement, ev: CalEvent): void {\n if (down.button !== 0) return\n down.stopPropagation()\n down.preventDefault()\n const axis = this.cal.axis\n const startMin = dayMinutes(ev.start)\n const endAt = (clientY: number): number =>\n clamp(snap(this.minuteAtY(clientY), axis.duration), startMin + axis.duration, axis.max)\n startDrag(down, {\n onStart: () => bar.classList.add('zc-dragging'),\n onMove: ({ event }) => {\n bar.style.height = `${(endAt(event.clientY) - startMin) * this.pxPerMinute}px`\n },\n onEnd: ({ moved, event }) => {\n bar.classList.remove('zc-dragging')\n if (!moved) return\n this.cal.commitEventChange(ev, ev.start, this.timeAt(endAt(event.clientY)), ev.resourceId)\n },\n })\n }\n\n private bindColSelect(col: HTMLElement, resource: CalResource): void {\n if (!this.cal.selectable) return\n col.addEventListener('pointerdown', (down) => {\n if (down.button !== 0) return\n if ((down.target as HTMLElement).closest('.zc-event')) return\n down.preventDefault()\n const axis = this.cal.axis\n const anchor = clamp(snap(this.minuteAtY(down.clientY), axis.duration), axis.min, axis.max)\n const box = el('div', 'zc-select-box zc-rg-select')\n col.appendChild(box)\n const place = (clientY: number) => {\n const cur = clamp(snap(this.minuteAtY(clientY), axis.duration), axis.min, axis.max)\n const lo = Math.min(anchor, cur)\n const hi = Math.max(anchor, cur)\n box.style.top = `${(lo - axis.min) * this.pxPerMinute}px`\n box.style.height = `${(hi - lo) * this.pxPerMinute}px`\n }\n startDrag(down, {\n onMove: ({ event }) => place(event.clientY),\n onEnd: ({ moved, event }) => {\n box.remove()\n if (!moved) return\n const cur = clamp(snap(this.minuteAtY(event.clientY), axis.duration), axis.min, axis.max)\n let lo = Math.min(anchor, cur)\n let hi = Math.max(anchor, cur)\n if (hi <= lo) hi = Math.min(lo + axis.duration, axis.max)\n if (hi <= lo) return\n this.cal.commitSelect(this.timeAt(lo), this.timeAt(hi), resource, event)\n },\n })\n })\n }\n\n unmount(): void {\n this.rootEl?.remove()\n this.rootEl = undefined\n this.colsEl = undefined\n this.nowLine = null\n this.cols = []\n }\n}\n","import type { Calendar } from '../Calendar'\nimport type { Dayjs } from 'dayjs'\nimport type { DateRange, CalEvent, CalResource, ResourceColumn } from '../types'\nimport { dayMinutes, minutesToTime, intlFormat } from '../datelib'\nimport { packEvents } from '../layout/overlap'\nimport { startDrag, snap } from '../interaction/pointer'\nimport { el, clamp, type View } from './View'\n\n/** Header (time axis / column header) height in px. */\nconst HEAD_H = 38\n/** Group header row height in px. */\nconst GROUP_H = 26\n/** Default minimum height of one stacked event level in px (override via `eventMinHeight`). */\nconst DEFAULT_EVENT_MIN_H = 48\n/** Vertical padding inside a resource row in px. */\nconst PAD = 4\n/** Width of one hour on the time axis in px. */\nconst HOUR_PX = 90\n/** Minimum rendered width of an event bar in px. */\nconst EVENT_MIN_W = 14\n\n/**\n * Resources-as-rows horizontal timeline.\n *\n * Layout: a sticky resource area (one or more columns) on the left and a\n * horizontally-scrolling time grid on the right. Resources may be grouped; each\n * resource is a row whose height grows to stack overlapping events into levels.\n * Supports drag-move (incl. across resource rows), resize and drag-select when\n * `editable`/`selectable` are set.\n */\nexport class TimelineView implements View {\n private rootEl?: HTMLElement\n private resourceBody?: HTMLElement\n private resourceRows?: HTMLElement\n private timeHead?: HTMLElement\n private timeBody?: HTMLElement\n private rowsEl?: HTMLElement\n private overlay?: HTMLElement\n private onScroll?: () => void\n\n constructor(\n private cal: Calendar,\n private root: HTMLElement,\n ) {}\n\n // ---- geometry ------------------------------------------------------------\n\n private get pxPerMinute(): number {\n return HOUR_PX / 60\n }\n\n private get width(): number {\n return this.cal.axis.totalMinutes * this.pxPerMinute\n }\n\n private localeTag(): string {\n return this.cal.locale.intl ?? this.cal.locale.code\n }\n\n range(): DateRange {\n const d = this.cal.date\n return { start: d.startOf('day'), end: d.endOf('day') }\n }\n\n title(): string {\n return intlFormat(\n this.cal.date,\n { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' },\n this.localeTag(),\n this.cal.tz,\n )\n }\n\n // ---- resource columns ----------------------------------------------------\n\n private columns(): ResourceColumn[] {\n const configured = this.cal.options.resourceArea?.columns\n if (configured && configured.length) return configured\n // Default: a single column rendering the resource label.\n return [{ field: 'title', header: '' }]\n }\n\n private applyWidth(node: HTMLElement, width: number | string | undefined, flexFallback = true): void {\n if (width != null) {\n const w = typeof width === 'number' ? `${width}px` : width\n node.style.flex = `0 0 ${w}`\n node.style.width = w\n } else if (flexFallback) {\n node.style.flex = '1 1 0'\n }\n }\n\n // ---- mount ---------------------------------------------------------------\n\n mount(): void {\n this.rootEl = el('div', 'zc-timeline')\n\n // Resource area (sticky left).\n const resourceArea = el('div', 'zc-tl-resource-area')\n this.applyWidth(resourceArea, this.cal.options.resourceArea?.width ?? '25%', false)\n if (this.cal.options.resourceArea?.width == null) resourceArea.style.flex = '0 0 25%'\n\n const resourceHead = el('div', 'zc-tl-resource-head')\n resourceHead.style.height = `${HEAD_H}px`\n for (const col of this.columns()) {\n const cell = el('div', 'zc-tl-col-head')\n this.applyWidth(cell, col.width)\n cell.textContent = col.header ?? ''\n resourceHead.appendChild(cell)\n }\n this.resourceBody = el('div', 'zc-tl-resource-body')\n this.resourceRows = el('div', 'zc-tl-resource-rows')\n this.resourceBody.appendChild(this.resourceRows)\n resourceArea.append(resourceHead, this.resourceBody)\n\n // Time area (scrolls horizontally; body scrolls vertically).\n const timeArea = el('div', 'zc-tl-time-area')\n this.timeHead = el('div', 'zc-tl-time-head')\n this.timeHead.style.height = `${HEAD_H}px`\n this.buildAxisHeader(this.timeHead)\n\n this.timeBody = el('div', 'zc-tl-time-body')\n const canvas = el('div', 'zc-tl-time-canvas')\n canvas.style.width = `${this.width}px`\n this.overlay = el('div', 'zc-tl-overlay')\n this.buildOverlayLines(this.overlay)\n this.rowsEl = el('div', 'zc-tl-rows')\n canvas.append(this.overlay, this.rowsEl)\n this.timeBody.appendChild(canvas)\n timeArea.append(this.timeHead, this.timeBody)\n\n this.rootEl.append(resourceArea, timeArea)\n this.root.appendChild(this.rootEl)\n\n // Keep the three scroll planes in sync.\n this.onScroll = () => {\n if (this.resourceBody && this.timeBody) this.resourceBody.scrollTop = this.timeBody.scrollTop\n if (this.timeHead && this.timeBody) this.timeHead.scrollLeft = this.timeBody.scrollLeft\n }\n this.timeBody.addEventListener('scroll', this.onScroll, { passive: true })\n\n this.relayout()\n }\n\n private buildAxisHeader(head: HTMLElement): void {\n const inner = el('div', 'zc-tl-axis')\n inner.style.width = `${this.width}px`\n const axis = this.cal.axis\n for (let m = axis.min; m <= axis.max; m += axis.labelInterval) {\n const label = el('div', 'zc-tl-axis-label')\n label.style.left = `${(m - axis.min) * this.pxPerMinute}px`\n label.textContent = minutesToTime(m)\n inner.appendChild(label)\n }\n head.appendChild(inner)\n }\n\n private buildOverlayLines(overlay: HTMLElement): void {\n const axis = this.cal.axis\n for (let m = axis.min; m <= axis.max; m += axis.labelInterval) {\n const line = el('div', 'zc-tl-vline')\n line.style.left = `${(m - axis.min) * this.pxPerMinute}px`\n overlay.appendChild(line)\n }\n }\n\n // ---- layout (rows + events) ---------------------------------------------\n\n renderEvents(): void {\n this.relayout()\n }\n\n /** Re-render only the resource-area cells, leaving event bars untouched. */\n renderResources(): void {\n if (!this.resourceRows) return\n this.resourceRows\n .querySelectorAll<HTMLElement>('.zc-tl-resource-row[data-resource-id]')\n .forEach((row) => {\n const resource = this.cal.resources.get(row.dataset.resourceId ?? '')\n if (!resource) return\n row.innerHTML = ''\n for (const col of this.columns()) {\n const cell = el('div', 'zc-tl-col-cell')\n this.applyWidth(cell, col.width)\n this.fillResourceCell(cell, col, resource)\n row.appendChild(cell)\n }\n })\n }\n\n /** Rebuild rows in both panes from the current resources + events. */\n private relayout(): void {\n if (!this.resourceRows || !this.rowsEl) return\n this.resourceRows.innerHTML = ''\n this.rowsEl.innerHTML = ''\n\n const range = this.range()\n const groups = this.cal.resources.grouped()\n const showGroupHeaders = groups.length > 1 || groups.some((g) => g.group !== null)\n\n for (const bucket of groups) {\n if (showGroupHeaders && bucket.group !== null) {\n this.appendGroupRow(bucket.group)\n }\n for (const resource of bucket.resources) {\n const events = this.cal.events.inRange(range.start, range.end, resource.id)\n this.appendResourceRow(resource, events)\n }\n }\n\n this.renderNowIndicator()\n }\n\n private appendGroupRow(label: string): void {\n const r = el('div', 'zc-tl-resource-row zc-tl-group-row')\n r.style.height = `${GROUP_H}px`\n r.textContent = label\n this.resourceRows!.appendChild(r)\n\n const t = el('div', 'zc-tl-row zc-tl-group-spacer')\n t.style.height = `${GROUP_H}px`\n this.rowsEl!.appendChild(t)\n }\n\n private appendResourceRow(resource: CalResource, events: CalEvent[]): void {\n const packed = packEvents(events)\n const levels = packed.reduce((max, p) => Math.max(max, p.cols), 1)\n // Each stacked level keeps at least eventMinHeight, so the row grows with the\n // number of overlapping events instead of squashing them together.\n const eventMinH = this.cal.options.eventMinHeight ?? DEFAULT_EVENT_MIN_H\n const rowH = levels * eventMinH + 2 * PAD\n const levelH = eventMinH\n\n // Resource-area row: one cell per column.\n const rRow = el('div', 'zc-tl-resource-row')\n rRow.style.height = `${rowH}px`\n rRow.dataset.resourceId = resource.id\n for (const col of this.columns()) {\n const cell = el('div', 'zc-tl-col-cell')\n this.applyWidth(cell, col.width)\n this.fillResourceCell(cell, col, resource)\n rRow.appendChild(cell)\n }\n this.resourceRows!.appendChild(rRow)\n\n // Time-grid row: event bars positioned along the x-axis.\n const tRow = el('div', 'zc-tl-row')\n tRow.style.height = `${rowH}px`\n tRow.dataset.resourceId = resource.id\n const axis = this.cal.axis\n for (const p of packed) {\n const ev = p.event\n const rawStart = dayMinutes(ev.start)\n let rawEnd = dayMinutes(ev.end)\n if (rawEnd <= rawStart) rawEnd = axis.max\n const startMin = clamp(rawStart, axis.min, axis.max)\n const endMin = clamp(rawEnd, axis.min, axis.max)\n if (endMin <= axis.min || startMin >= axis.max) continue\n\n const x = (startMin - axis.min) * this.pxPerMinute\n const w = Math.max(EVENT_MIN_W, (endMin - startMin) * this.pxPerMinute)\n const top = PAD + p.col * levelH\n\n const bar = el('div', 'zc-event zc-tl-event')\n bar.dataset.eventId = ev.id\n bar.style.left = `${x}px`\n bar.style.width = `${Math.min(w, this.width - x)}px`\n bar.style.top = `${top}px`\n bar.style.height = `${levelH - 2}px`\n if (ev.color) bar.style.setProperty('--zc-event-bg', ev.color)\n if (ev.textColor) bar.style.setProperty('--zc-event-fg', ev.textColor)\n bar.appendChild(this.cal.renderEventContent(ev))\n this.bindBar(bar, ev)\n tRow.appendChild(bar)\n this.cal.fireEventMount(ev, bar)\n }\n this.bindRowSelect(tRow, resource)\n this.rowsEl!.appendChild(tRow)\n }\n\n // ---- interaction ---------------------------------------------------------\n\n private timeAt(minute: number): Dayjs {\n return this.cal.date.startOf('day').add(minute, 'minute')\n }\n\n private minuteAtX(clientX: number): number {\n const rect = this.rowsEl!.getBoundingClientRect()\n return this.cal.axis.min + (clientX - rect.left) / this.pxPerMinute\n }\n\n /** The resource row currently under the pointer (bar ignored for hit-testing). */\n private rowAt(event: MouseEvent, bar: HTMLElement): HTMLElement | null {\n const prev = bar.style.pointerEvents\n bar.style.pointerEvents = 'none'\n const target = document.elementFromPoint(event.clientX, event.clientY) as HTMLElement | null\n bar.style.pointerEvents = prev\n return (target?.closest('.zc-tl-row[data-resource-id]') as HTMLElement | null) ?? null\n }\n\n private highlightRow(event: MouseEvent, bar: HTMLElement): void {\n this.clearHighlight()\n this.rowAt(event, bar)?.classList.add('zc-drop-target')\n }\n\n private clearHighlight(): void {\n this.rowsEl?.querySelectorAll('.zc-drop-target').forEach((n) => n.classList.remove('zc-drop-target'))\n }\n\n private bindBar(bar: HTMLElement, ev: CalEvent): void {\n this.cal.bindContextMenu(bar, ev)\n if (!this.cal.editable) {\n bar.addEventListener('click', (jsEvent) => this.cal.fireEventClick(ev, bar, jsEvent))\n return\n }\n bar.style.cursor = 'move'\n\n const west = el('div', 'zc-resize-handle zc-resize-w')\n const east = el('div', 'zc-resize-handle zc-resize-e')\n bar.append(west, east)\n west.addEventListener('pointerdown', (down) => this.beginResize(down, bar, ev, 'start'))\n east.addEventListener('pointerdown', (down) => this.beginResize(down, bar, ev, 'end'))\n\n bar.addEventListener('pointerdown', (down) => {\n if (down.button !== 0) return\n if ((down.target as HTMLElement).closest('.zc-resize-handle')) return\n down.preventDefault()\n const axis = this.cal.axis\n const durMin = ev.end.diff(ev.start, 'minute')\n const origStartMin = dayMinutes(ev.start)\n const grabMin = this.minuteAtX(down.clientX)\n const startMinAt = (clientX: number): number =>\n clamp(\n snap(origStartMin + (this.minuteAtX(clientX) - grabMin), axis.duration),\n axis.min,\n axis.max - durMin,\n )\n startDrag(down, {\n onStart: () => bar.classList.add('zc-dragging'),\n onMove: ({ event }) => {\n bar.style.left = `${(startMinAt(event.clientX) - axis.min) * this.pxPerMinute}px`\n this.highlightRow(event, bar)\n },\n onEnd: ({ moved, event }) => {\n bar.classList.remove('zc-dragging')\n this.clearHighlight()\n if (!moved) {\n this.cal.fireEventClick(ev, bar, event)\n return\n }\n const row = this.rowAt(event, bar)\n const newResource = row ? (row.dataset.resourceId ?? null) : ev.resourceId\n const newStart = this.timeAt(startMinAt(event.clientX))\n this.cal.commitEventChange(ev, newStart, newStart.add(durMin, 'minute'), newResource)\n },\n })\n })\n }\n\n private beginResize(down: MouseEvent, bar: HTMLElement, ev: CalEvent, edge: 'start' | 'end'): void {\n if (down.button !== 0) return\n down.stopPropagation()\n down.preventDefault()\n const axis = this.cal.axis\n const minuteAt = (clientX: number) => clamp(snap(this.minuteAtX(clientX), axis.duration), axis.min, axis.max)\n startDrag(down, {\n onStart: () => bar.classList.add('zc-dragging'),\n onMove: ({ event }) => {\n const m = minuteAt(event.clientX)\n if (edge === 'end') {\n const endMin = Math.max(m, dayMinutes(ev.start) + axis.duration)\n bar.style.width = `${(endMin - dayMinutes(ev.start)) * this.pxPerMinute}px`\n } else {\n const startMin = Math.min(m, dayMinutes(ev.end) - axis.duration)\n bar.style.left = `${(startMin - axis.min) * this.pxPerMinute}px`\n bar.style.width = `${(dayMinutes(ev.end) - startMin) * this.pxPerMinute}px`\n }\n },\n onEnd: ({ moved, event }) => {\n bar.classList.remove('zc-dragging')\n if (!moved) return\n const m = minuteAt(event.clientX)\n if (edge === 'end') {\n const endMin = Math.max(m, dayMinutes(ev.start) + axis.duration)\n this.cal.commitEventChange(ev, ev.start, this.timeAt(endMin), ev.resourceId)\n } else {\n const startMin = Math.min(m, dayMinutes(ev.end) - axis.duration)\n this.cal.commitEventChange(ev, this.timeAt(startMin), ev.end, ev.resourceId)\n }\n },\n })\n }\n\n private bindRowSelect(tRow: HTMLElement, resource: CalResource): void {\n if (!this.cal.selectable) return\n tRow.addEventListener('pointerdown', (down) => {\n if (down.button !== 0) return\n if ((down.target as HTMLElement).closest('.zc-event')) return\n down.preventDefault()\n const axis = this.cal.axis\n const anchor = clamp(snap(this.minuteAtX(down.clientX), axis.duration), axis.min, axis.max)\n const box = el('div', 'zc-select-box zc-tl-select')\n tRow.appendChild(box)\n const place = (clientX: number) => {\n const cur = clamp(snap(this.minuteAtX(clientX), axis.duration), axis.min, axis.max)\n const lo = Math.min(anchor, cur)\n const hi = Math.max(anchor, cur)\n box.style.left = `${(lo - axis.min) * this.pxPerMinute}px`\n box.style.width = `${(hi - lo) * this.pxPerMinute}px`\n }\n startDrag(down, {\n onMove: ({ event }) => place(event.clientX),\n onEnd: ({ moved, event }) => {\n box.remove()\n if (!moved) return\n const cur = clamp(snap(this.minuteAtX(event.clientX), axis.duration), axis.min, axis.max)\n let lo = Math.min(anchor, cur)\n let hi = Math.max(anchor, cur)\n if (hi <= lo) hi = Math.min(lo + axis.duration, axis.max)\n if (hi <= lo) return\n this.cal.commitSelect(this.timeAt(lo), this.timeAt(hi), resource, event)\n },\n })\n })\n }\n\n private fillResourceCell(cell: HTMLElement, col: ResourceColumn, resource: CalResource): void {\n if (col.render) {\n const out = col.render(resource)\n if (typeof out === 'string') cell.innerHTML = out\n else cell.appendChild(out)\n return\n }\n // The label column defers to the renderResource hook when present.\n if ((col.field === 'title' || !col.field) && this.cal.options.renderResource) {\n const out = this.cal.options.renderResource(resource)\n if (typeof out === 'string') cell.innerHTML = out\n else cell.appendChild(out)\n return\n }\n const value = col.field ? resource.raw[col.field] : resource.title\n cell.textContent = value != null ? String(value) : ''\n }\n\n private renderNowIndicator(): void {\n this.overlay?.querySelector('.zc-tl-now')?.remove()\n if (!this.cal.options.nowIndicator || !this.overlay) return\n const now = this.cal.now()\n if (!now.isSame(this.cal.date, 'day')) return\n const axis = this.cal.axis\n const nm = dayMinutes(now)\n if (nm < axis.min || nm > axis.max) return\n const line = el('div', 'zc-tl-now')\n line.style.left = `${(nm - axis.min) * this.pxPerMinute}px`\n this.overlay.appendChild(line)\n }\n\n unmount(): void {\n if (this.onScroll) this.timeBody?.removeEventListener('scroll', this.onScroll)\n this.rootEl?.remove()\n this.rootEl = undefined\n this.resourceBody = undefined\n this.resourceRows = undefined\n this.timeHead = undefined\n this.timeBody = undefined\n this.rowsEl = undefined\n this.overlay = undefined\n this.onScroll = undefined\n }\n}\n","import type { Dayjs } from 'dayjs'\nimport type {\n CalendarOptions,\n ViewType,\n CalEvent,\n CalResource,\n EventInput,\n EventHandle,\n ResourceHandle,\n Locale,\n ToolbarConfig,\n} from './types'\nimport { EventStore } from './store/EventStore'\nimport { ResourceStore } from './store/ResourceStore'\nimport { buildAxis, nowTz, toTz, intlFormat } from './datelib'\nimport type { SlotAxis } from './datelib'\nimport type { View } from './views/View'\nimport { DayView } from './views/DayView'\nimport { ResourceDayView } from './views/ResourceDayView'\nimport { TimelineView } from './views/TimelineView'\n\n// Neutral English defaults — every label is overridable via the `locale` option,\n// so a host app passes its own translations in.\nconst DEFAULT_LOCALE: Locale = {\n code: 'en',\n buttons: { today: 'Today', prev: '‹', next: '›' },\n ariaLabels: { today: 'Today', prev: 'Previous', next: 'Next' },\n}\n\nconst DEFAULT_TOOLBAR: ToolbarConfig = { start: '', center: 'title', end: 'today prev next' }\n\n/**\n * The public, framework-agnostic calendar. Construct with a host element and\n * options, then `render()`. Mirrors the imperative surface hosts rely on\n * (render/destroy/refetchEvents/addEvent/getEventById/gotoDate/changeView/…) so\n * Preact and React callers can drive it through a ref.\n */\nexport class Calendar {\n readonly el: HTMLElement\n options: CalendarOptions\n readonly events: EventStore\n readonly resources: ResourceStore\n\n private _date: Dayjs\n private _view: ViewType\n private viewImpl: View | null = null\n private bodyEl: HTMLElement | null = null\n private titleEl: HTMLElement | null = null\n\n constructor(el: HTMLElement, options: CalendarOptions = {}) {\n this.el = el\n this.options = options\n this.events = new EventStore(options.timezone)\n this.resources = new ResourceStore(\n options.resourceGroupField ?? 'group',\n options.resourceOrder ?? 'order',\n )\n this._view = options.view ?? 'day'\n this._date = options.date ? toTz(options.date, options.timezone) : nowTz(options.timezone)\n if (Array.isArray(options.resources)) this.resources.set(options.resources)\n if (Array.isArray(options.events)) this.events.set(options.events)\n }\n\n // ---- derived state -------------------------------------------------------\n\n get tz(): string | undefined {\n return this.options.timezone\n }\n\n get date(): Dayjs {\n return this._date\n }\n\n get view(): ViewType {\n return this._view\n }\n\n get axis(): SlotAxis {\n return buildAxis(this.options.slot)\n }\n\n get locale(): Locale {\n const l = this.options.locale\n if (!l) return DEFAULT_LOCALE\n if (typeof l === 'string') return { ...DEFAULT_LOCALE, code: l }\n return {\n ...DEFAULT_LOCALE,\n ...l,\n buttons: { ...DEFAULT_LOCALE.buttons, ...l.buttons },\n ariaLabels: { ...DEFAULT_LOCALE.ariaLabels, ...l.ariaLabels },\n }\n }\n\n get firstDay(): number {\n return this.locale.firstDay ?? this.options.firstDay ?? 1\n }\n\n /** Start of the currently-shown view range, in the calendar timezone. */\n get activeStart(): Dayjs {\n return this.viewImpl?.range().start ?? this._date.startOf('day')\n }\n\n /** End of the currently-shown view range. */\n get activeEnd(): Dayjs {\n return this.viewImpl?.range().end ?? this._date.endOf('day')\n }\n\n /** The active view's type and date window. */\n getView(): { type: ViewType; activeStart: Dayjs; activeEnd: Dayjs } {\n return { type: this._view, activeStart: this.activeStart, activeEnd: this.activeEnd }\n }\n\n private isDayClosed(): boolean {\n const d = this.options.dayClosed\n if (d === undefined) return false\n return typeof d === 'function' ? d(this._date) : d\n }\n\n get editable(): boolean {\n return this.options.editable === true\n }\n\n get selectable(): boolean {\n return this.options.selectable === true\n }\n\n now(): Dayjs {\n return nowTz(this.tz)\n }\n\n // ---- lifecycle -----------------------------------------------------------\n\n render(): this {\n this.el.classList.add('zc')\n this.el.innerHTML = ''\n if (this.options.height != null) {\n this.el.style.height =\n typeof this.options.height === 'number' ? `${this.options.height}px` : this.options.height\n }\n this.renderToolbar()\n this.bodyEl = document.createElement('div')\n this.bodyEl.className = 'zc-body'\n this.el.appendChild(this.bodyEl)\n this.mountView()\n void this.reload()\n return this\n }\n\n destroy(): void {\n this.viewImpl?.unmount()\n this.viewImpl = null\n this.el.innerHTML = ''\n this.el.classList.remove('zc')\n }\n\n // ---- views ---------------------------------------------------------------\n\n private createView(type: ViewType): View {\n const root = this.bodyEl\n if (!root) throw new Error('[@ziix/calendar] render() must run before a view is created')\n switch (type) {\n case 'day':\n return new DayView(this, root)\n case 'resource-day':\n return new ResourceDayView(this, root)\n case 'timeline':\n return new TimelineView(this, root)\n default:\n throw new Error(`[@ziix/calendar] unknown view: ${String(type)}`)\n }\n }\n\n private mountView(): void {\n if (!this.bodyEl) return\n this.viewImpl?.unmount()\n this.bodyEl.innerHTML = ''\n this.viewImpl = this.createView(this._view)\n this.viewImpl.mount()\n this.bodyEl.classList.toggle('zc-closed', this.isDayClosed())\n this.updateTitle()\n this.emitDatesSet()\n }\n\n changeView(type: ViewType): void {\n this._view = type\n this.mountView()\n void this.reload()\n }\n\n // ---- navigation ----------------------------------------------------------\n\n gotoDate(date: string | Date | Dayjs): void {\n this._date = toTz(date as string | Date, this.tz)\n this.mountView()\n void this.reload()\n }\n\n today(): void {\n this.gotoDate(this.now())\n }\n\n prev(): void {\n this.gotoDate(this._date.subtract(1, 'day'))\n }\n\n next(): void {\n this.gotoDate(this._date.add(1, 'day'))\n }\n\n // ---- data ----------------------------------------------------------------\n\n /** Refetch resources (if a function source), rebuild structure, then events. */\n async reload(): Promise<void> {\n if (typeof this.options.resources === 'function') {\n await this.refetchResources()\n this.mountView()\n }\n await this.refetchEvents()\n }\n\n private async refetchResources(): Promise<void> {\n const src = this.options.resources\n if (typeof src !== 'function') return\n const range = this.viewImpl?.range()\n if (!range) return\n this.resources.set(await src(range))\n }\n\n async refetchEvents(): Promise<void> {\n const src = this.options.events\n const range = this.viewImpl?.range()\n if (typeof src === 'function' && range) {\n this.events.set(await src(range))\n }\n this.options.onEventsSet?.(this.events.all())\n this.viewImpl?.renderEvents()\n }\n\n addEvent(input: EventInput): EventHandle {\n const e = this.events.add(input)\n this.viewImpl?.renderEvents()\n return this.handle(e)\n }\n\n getEventById(id: string | number): EventHandle | null {\n const e = this.events.get(id)\n return e ? this.handle(e) : null\n }\n\n getEvents(): CalEvent[] {\n return this.events.all()\n }\n\n getResources(): CalResource[] {\n return this.resources.all()\n }\n\n getResourceById(id: string | number): ResourceHandle | null {\n const r = this.resources.get(id)\n return r ? this.resourceHandle(r) : null\n }\n\n private resourceRenderScheduled = false\n\n /**\n * Coalesce resource-area re-renders: many setExtendedProp calls in a row (e.g.\n * pushing work hours / punch-ins for every resource) collapse into a single\n * cell update on the next microtask, and event bars are never rebuilt — so the\n * timeline doesn't flicker.\n */\n private scheduleResourceRender(): void {\n if (this.resourceRenderScheduled) return\n this.resourceRenderScheduled = true\n queueMicrotask(() => {\n this.resourceRenderScheduled = false\n if (this.viewImpl?.renderResources) this.viewImpl.renderResources()\n else this.viewImpl?.renderEvents()\n })\n }\n\n private resourceHandle(r: CalResource): ResourceHandle {\n return {\n id: r.id,\n resource: r,\n setExtendedProp: (key, value) => {\n r.extendedProps[key] = value\n this.scheduleResourceRender()\n },\n setProp: (key, value) => {\n if (key === 'title') r.title = value\n else r.group = value\n this.scheduleResourceRender()\n },\n }\n }\n\n private handle(e: CalEvent): EventHandle {\n return {\n id: e.id,\n event: e,\n remove: () => {\n this.events.remove(e.id)\n this.viewImpl?.renderEvents()\n },\n setExtendedProp: (key, value) => {\n e.extendedProps[key] = value\n this.viewImpl?.renderEvents()\n },\n }\n }\n\n // ---- rendering helpers used by views ------------------------------------\n\n /** Build the inner body of an event, honouring the `renderEvent` hook. */\n renderEventContent(event: CalEvent): HTMLElement {\n const wrap = document.createElement('div')\n wrap.className = 'zc-event-main'\n const custom = this.options.renderEvent?.(event)\n if (custom != null) {\n if (typeof custom === 'string') wrap.innerHTML = custom\n else wrap.appendChild(custom)\n } else {\n wrap.appendChild(this.defaultEventContent(event))\n }\n return wrap\n }\n\n private defaultEventContent(event: CalEvent): HTMLElement {\n const frag = document.createElement('div')\n frag.className = 'zc-event-default'\n const time = document.createElement('span')\n time.className = 'zc-event-time'\n const fmt = this.options.timeFormat ?? { hour: '2-digit', minute: '2-digit', hour12: false }\n time.textContent = intlFormat(event.start, fmt, this.locale.intl ?? this.locale.code, this.tz)\n const title = document.createElement('span')\n title.className = 'zc-event-title'\n title.textContent = event.title\n frag.append(time, title)\n return frag\n }\n\n // ---- callback dispatch (called by views) --------------------------------\n\n fireEventClick(event: CalEvent, el: HTMLElement, jsEvent: MouseEvent): void {\n this.options.onEventClick?.({ event, el, jsEvent })\n }\n\n fireEventMount(event: CalEvent, el: HTMLElement): void {\n this.options.onEventMount?.({ event, el })\n }\n\n /** Attach a right-click handler to an event bar when `onEventContextMenu` is set. */\n bindContextMenu(el: HTMLElement, event: CalEvent): void {\n const handler = this.options.onEventContextMenu\n if (!handler) return\n el.addEventListener('contextmenu', (jsEvent) => {\n jsEvent.preventDefault()\n handler({ event, el, jsEvent })\n })\n }\n\n /** Whether events are allowed to overlap on the same resource (default true). */\n private allowsOverlap(): boolean {\n const o = this.options.eventOverlap\n if (o === undefined) return true\n return typeof o === 'function' ? o() : o\n }\n\n private hasCollision(event: CalEvent, start: Dayjs, end: Dayjs, resourceId: string | null): boolean {\n return this.events\n .all()\n .some(\n (e) =>\n e.id !== event.id &&\n e.resourceId === resourceId &&\n e.start.isBefore(end) &&\n e.end.isAfter(start),\n )\n }\n\n /**\n * Apply a drag/resize result: gate on `eventOverlap`, mutate the event,\n * re-render, and fire `onEventChange`. Returns false (and reverts the live\n * preview by re-rendering) when the move is rejected.\n */\n commitEventChange(\n event: CalEvent,\n start: Dayjs,\n end: Dayjs,\n resourceId: string | null,\n ): boolean {\n const unchanged =\n event.start.isSame(start) && event.end.isSame(end) && event.resourceId === resourceId\n if (unchanged) {\n this.viewImpl?.renderEvents()\n return false\n }\n if (!this.allowsOverlap() && this.hasCollision(event, start, end, resourceId)) {\n this.viewImpl?.renderEvents()\n return false\n }\n const oldEvent: CalEvent = { ...event }\n event.start = start\n event.end = end\n event.resourceId = resourceId\n this.viewImpl?.renderEvents()\n const revert = () => {\n event.start = oldEvent.start\n event.end = oldEvent.end\n event.resourceId = oldEvent.resourceId\n this.viewImpl?.renderEvents()\n }\n this.options.onEventChange?.({ event, oldEvent, revert })\n return true\n }\n\n /** Gate a drag-selection on `selectAllow`, then fire `onSelect`. */\n commitSelect(start: Dayjs, end: Dayjs, resource: CalResource | null, jsEvent: MouseEvent): boolean {\n if (this.options.selectAllow && !this.options.selectAllow({ start, end, resource })) return false\n this.options.onSelect?.({ start, end, resource, jsEvent })\n return true\n }\n\n // ---- toolbar -------------------------------------------------------------\n\n private renderToolbar(): void {\n if (this.options.toolbar === false) return\n const cfg = this.options.toolbar ?? DEFAULT_TOOLBAR\n const toolbar = document.createElement('div')\n toolbar.className = 'zc-toolbar'\n for (const section of ['start', 'center', 'end'] as const) {\n const sec = document.createElement('div')\n sec.className = `zc-toolbar-section zc-toolbar-${section}`\n const spec = cfg[section]\n if (spec) {\n // Whitespace separates button groups (gap between them); commas join\n // buttons within a group with no gap — e.g. 'today prev,next'.\n for (const group of spec.split(/\\s+/).filter(Boolean)) {\n const tokens = group.split(',').filter(Boolean)\n if (tokens.length === 1 && tokens[0] === 'title') {\n sec.appendChild(this.renderToolbarToken('title'))\n continue\n }\n const groupEl = document.createElement('div')\n groupEl.className = 'zc-btn-group'\n for (const token of tokens) groupEl.appendChild(this.renderToolbarToken(token))\n sec.appendChild(groupEl)\n }\n }\n toolbar.appendChild(sec)\n }\n this.el.appendChild(toolbar)\n }\n\n private renderToolbarToken(token: string): HTMLElement {\n if (token === 'title') {\n this.titleEl = document.createElement('h2')\n this.titleEl.className = 'zc-title'\n return this.titleEl\n }\n const btn = document.createElement('button')\n btn.type = 'button'\n btn.className = 'zc-btn'\n btn.dataset.zcButton = token\n const labels = this.locale.buttons ?? {}\n const aria = this.locale.ariaLabels ?? {}\n if (token === 'today') {\n btn.textContent = labels.today ?? 'Today'\n if (aria.today) btn.setAttribute('aria-label', aria.today)\n btn.onclick = () => this.today()\n } else if (token === 'prev') {\n btn.textContent = labels.prev ?? '‹'\n btn.setAttribute('aria-label', aria.prev ?? 'Previous')\n btn.onclick = () => this.prev()\n } else if (token === 'next') {\n btn.textContent = labels.next ?? '›'\n btn.setAttribute('aria-label', aria.next ?? 'Next')\n btn.onclick = () => this.next()\n } else {\n const custom = this.options.buttons?.[token]\n if (custom) {\n if (custom.icon) {\n const icon = document.createElement('span')\n icon.className = custom.icon\n btn.appendChild(icon)\n }\n if (custom.text) btn.appendChild(document.createTextNode(custom.text))\n btn.onclick = (jsEvent) => custom.onClick(jsEvent)\n } else {\n btn.textContent = token\n }\n }\n return btn\n }\n\n private updateTitle(): void {\n if (this.titleEl) this.titleEl.textContent = this.viewImpl?.title() ?? ''\n }\n\n private emitDatesSet(): void {\n const r = this.viewImpl?.range()\n if (r) this.options.onDatesSet?.({ start: r.start, end: r.end, view: this._view })\n }\n}\n"],"names":["dayjs","utc","timezone","toTz","value","tz","d","nowTz","timeToMinutes","t","parts","h","m","minutesToTime","min","dayMinutes","intlFormat","opts","localeTag","buildAxis","slot","max","duration","labelInterval","totalMinutes","slots","EventStore","input","start","end","inputs","e","id","resourceId","ResourceStore","groupField","orderField","groupVal","orderVal","known","extra","key","i","r","a","b","buckets","index","packEvents","events","sorted","result","cluster","clusterEnd","flush","columns","ev","placed","col","cols","ci","startDrag","down","handlers","threshold","startX","startY","started","move","me","dx","dy","_a","_b","up","snap","minute","el","tag","cls","node","clamp","lo","hi","SLOT_PX","DayView","cal","root","axis","axisCol","label","s","line","n","packed","p","rawStart","rawEnd","startMin","endMin","top","height","clientY","rect","bar","jsEvent","handle","durMin","origStartMin","grabMin","place","event","moved","newStart","endAt","anchor","box","cur","now","nm","ResourceDayView","groups","ordered","g","showGroups","canvas","resource","head","corner","groupRow","bucket","band","labelRow","cell","custom","range","content","prev","target","startMinAt","newResource","HEAD_H","GROUP_H","DEFAULT_EVENT_MIN_H","PAD","HOUR_PX","EVENT_MIN_W","TimelineView","configured","width","flexFallback","w","resourceArea","resourceHead","timeArea","inner","overlay","row","showGroupHeaders","levels","eventMinH","rowH","levelH","rRow","tRow","x","clientX","west","east","edge","minuteAt","out","DEFAULT_LOCALE","DEFAULT_TOOLBAR","Calendar","options","l","type","date","src","_c","_d","wrap","frag","time","fmt","title","handler","o","oldEvent","revert","_e","cfg","toolbar","section","sec","spec","group","tokens","groupEl","token","btn","labels","aria","icon"],"mappings":";;;AAMAA,EAAM,OAAOC,CAAG;AAChBD,EAAM,OAAOE,CAAQ;AAGd,SAASC,EAAKC,GAA8BC,GAAoB;AACrE,QAAMC,IAAIN,EAAMI,CAAK;AACrB,SAAOC,IAAKC,EAAE,GAAGD,CAAE,IAAIC;AACzB;AAGO,SAASC,EAAMF,GAAoB;AACxC,SAAOA,IAAKL,EAAA,EAAQ,GAAGK,CAAE,IAAIL,EAAA;AAC/B;AAGO,SAASQ,EAAcC,GAAmB;AAC/C,QAAMC,IAAQD,EAAE,MAAM,GAAG,GACnBE,IAAI,OAAOD,EAAM,CAAC,CAAC,KAAK,GACxBE,IAAI,OAAOF,EAAM,CAAC,CAAC,KAAK;AAC9B,SAAOC,IAAI,KAAKC;AAClB;AAGO,SAASC,EAAcC,GAAqB;AACjD,QAAMH,IAAI,KAAK,MAAMG,IAAM,EAAE,GACvBF,IAAIE,IAAM;AAChB,SAAO,GAAG,OAAOH,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAOC,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AACpE;AAGO,SAASG,EAAWT,GAAkB;AAC3C,SAAOA,EAAE,KAAA,IAAS,KAAKA,EAAE,OAAA;AAC3B;AAGO,SAASU,EACdV,GACAW,GACAC,GACAb,GACQ;AACR,SAAO,IAAI,KAAK,eAAea,GAAW,EAAE,GAAGD,GAAM,UAAUZ,EAAA,CAAI,EAAE,OAAOC,EAAE,QAAQ;AACxF;AAkBO,SAASa,EAAUC,IAAmB,IAAc;AACzD,QAAMN,IAAMN,EAAcY,EAAK,OAAO,OAAO,GACvCC,IAAMb,EAAcY,EAAK,OAAO,OAAO,GACvCE,IAAWF,EAAK,YAAY,IAC5BG,IAAgBH,EAAK,iBAAiB,IACtCI,IAAe,KAAK,IAAI,GAAGH,IAAMP,CAAG,GACpCW,IAAQH,IAAW,IAAI,KAAK,KAAKE,IAAeF,CAAQ,IAAI;AAClE,SAAO,EAAE,KAAAR,GAAK,KAAAO,GAAK,UAAAC,GAAU,eAAAC,GAAe,OAAAE,GAAO,cAAAD,EAAA;AACrD;ACrEO,MAAME,EAAW;AAAA,EAGtB,YAAoBrB,GAAa;AAAb,SAAA,KAAAA,GAFpB,KAAQ,0BAAU,IAAA;AAAA,EAEgB;AAAA,EAElC,UAAUsB,GAA6B;AACrC,UAAMC,IAAQzB,EAAKwB,EAAM,OAAO,KAAK,EAAE,GACjCE,IAAMF,EAAM,MAAMxB,EAAKwB,EAAM,KAAK,KAAK,EAAE,IAAIC,EAAM,IAAI,IAAI,QAAQ;AACzE,WAAO;AAAA,MACL,IAAI,OAAOD,EAAM,EAAE;AAAA,MACnB,OAAOA,EAAM,SAAS;AAAA,MACtB,OAAAC;AAAA,MACA,KAAAC;AAAA,MACA,YAAYF,EAAM,cAAc,OAAO,OAAOA,EAAM,UAAU,IAAI;AAAA,MAClE,QAAQ,EAAQA,EAAM;AAAA,MACtB,OAAOA,EAAM;AAAA,MACb,WAAWA,EAAM;AAAA,MACjB,eAAeA,EAAM,iBAAiB,CAAA;AAAA,MACtC,KAAKA;AAAA,IAAA;AAAA,EAET;AAAA;AAAA,EAGA,IAAIG,GAA4B;AAC9B,SAAK,IAAI,MAAA;AACT,eAAWH,KAASG,GAAQ;AAC1B,YAAMC,IAAI,KAAK,UAAUJ,CAAK;AAC9B,WAAK,IAAI,IAAII,EAAE,IAAIA,CAAC;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,IAAIJ,GAA6B;AAC/B,UAAM,IAAI,KAAK,UAAUA,CAAK;AAC9B,gBAAK,IAAI,IAAI,EAAE,IAAI,CAAC,GACb;AAAA,EACT;AAAA,EAEA,OAAOK,GAA8B;AACnC,WAAO,KAAK,IAAI,OAAO,OAAOA,CAAE,CAAC;AAAA,EACnC;AAAA,EAEA,IAAIA,GAA2C;AAC7C,WAAO,KAAK,IAAI,IAAI,OAAOA,CAAE,CAAC;AAAA,EAChC;AAAA,EAEA,MAAkB;AAChB,WAAO,CAAC,GAAG,KAAK,IAAI,QAAQ;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQJ,GAAcC,GAAYI,GAAwC;AACxE,WAAO,KAAK,IAAA,EAAM,OAAO,CAACF,MACpBE,MAAe,UAAaF,EAAE,eAAeE,IAAmB,KAC7DF,EAAE,MAAM,SAASF,CAAG,KAAKE,EAAE,IAAI,QAAQH,CAAK,CACpD;AAAA,EACH;AACF;AC7DO,MAAMM,EAAc;AAAA,EAGzB,YACUC,IAAa,SACbC,IAAa,SACrB;AAFQ,SAAA,aAAAD,GACA,KAAA,aAAAC,GAJV,KAAQ,OAAsB,CAAA;AAAA,EAK3B;AAAA,EAEH,UAAUT,GAAmC;AAC3C,UAAMU,IAAWV,EAAM,KAAK,UAAU,GAChCW,IAAWX,EAAM,KAAK,UAAU,GAGhCY,IAAQ,oBAAI,IAAI,CAAC,MAAM,SAAS,SAAS,SAAS,iBAAiB,KAAK,YAAY,KAAK,UAAU,CAAC,GACpGC,IAAiC,CAAA;AACvC,eAAWC,KAAO,OAAO,KAAKd,CAAK;AACjC,MAAKY,EAAM,IAAIE,CAAG,MAAGD,EAAMC,CAAG,IAAId,EAAMc,CAAG;AAE7C,WAAO;AAAA,MACL,IAAI,OAAOd,EAAM,EAAE;AAAA,MACnB,OAAOA,EAAM,SAAS;AAAA,MACtB,OAAOU,KAAY,OAAO,OAAOA,CAAQ,IAAI;AAAA,MAC7C,OAAO,OAAOC,KAAa,WAAWA,IAAW;AAAA,MACjD,eAAe,EAAE,GAAGE,GAAO,GAAIb,EAAM,iBAAiB,CAAA,EAAC;AAAA,MACvD,KAAKA;AAAA,IAAA;AAAA,EAET;AAAA,EAEA,IAAIG,GAA+B;AACjC,SAAK,OAAOA,EAAO,IAAI,CAACY,MAAM,KAAK,UAAUA,CAAC,CAAC;AAAA,EACjD;AAAA,EAEA,MAAqB;AACnB,WAAO,CAAC,GAAG,KAAK,IAAI;AAAA,EACtB;AAAA,EAEA,IAAIV,GAA8C;AAChD,WAAO,KAAK,KAAK,KAAK,CAACW,MAAMA,EAAE,OAAO,OAAOX,CAAE,CAAC;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAyB;AACvB,WAAI,KAAK,eAAe,OACf,CAAC,GAAG,KAAK,IAAI,EAAE,KAAK,CAACY,GAAGC,MAAMD,EAAE,GAAG,cAAcC,EAAE,IAAI,QAAW,EAAE,SAAS,GAAA,CAAM,CAAC,IAEzF,KAAK,KAAK,MAAM,CAACF,MAAMA,EAAE,UAAU,CAAC,IAC/B,CAAC,GAAG,KAAK,IAAI,IAEf,CAAC,GAAG,KAAK,IAAI,EAAE,KAAK,CAACC,GAAGC,MAAMD,EAAE,QAAQC,EAAE,KAAK;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAqE;AACnE,UAAMC,IAAqE,CAAA,GACrEC,wBAAY,IAAA;AAClB,eAAWJ,KAAK,KAAK,WAAW;AAC9B,UAAID,IAAIK,EAAM,IAAIJ,EAAE,KAAK;AACzB,MAAID,MAAM,WACRA,IAAII,EAAQ,QACZC,EAAM,IAAIJ,EAAE,OAAOD,CAAC,GACpBI,EAAQ,KAAK,EAAE,OAAOH,EAAE,OAAO,WAAW,CAAA,GAAI,IAEhDG,EAAQJ,CAAC,EAAE,UAAU,KAAKC,CAAC;AAAA,IAC7B;AACA,WAAOG;AAAA,EACT;AACF;ACvDO,SAASE,EAAWC,GAAmC;AAC5D,QAAMC,IAAS,CAAC,GAAGD,CAAM,EAAE;AAAA,IACzB,CAACL,GAAGC,MAAMD,EAAE,MAAM,YAAYC,EAAE,MAAM,QAAA,KAAaA,EAAE,IAAI,YAAYD,EAAE,IAAI,QAAA;AAAA,EAAQ,GAG/EO,IAAwB,CAAA;AAC9B,MAAIC,IAAsB,CAAA,GACtBC,IAAa;AAEjB,QAAMC,IAAQ,MAAM;AAClB,QAAIF,EAAQ,WAAW,EAAG;AAC1B,UAAMG,IAAwB,CAAA;AAC9B,eAAWC,KAAMJ,GAAS;AACxB,UAAIK,IAAS;AACb,iBAAWC,KAAOH;AAEhB,YADaG,EAAIA,EAAI,SAAS,CAAC,EACtB,IAAI,QAAA,KAAaF,EAAG,MAAM,WAAW;AAC5C,UAAAE,EAAI,KAAKF,CAAE,GACXC,IAAS;AACT;AAAA,QACF;AAEF,MAAKA,KAAQF,EAAQ,KAAK,CAACC,CAAE,CAAC;AAAA,IAChC;AACA,UAAMG,IAAOJ,EAAQ;AACrB,IAAAA,EAAQ,QAAQ,CAACG,GAAKE,MAAO;AAC3B,iBAAWJ,KAAME;AACf,QAAAP,EAAO,KAAK,EAAE,OAAOK,GAAI,KAAKI,GAAI,MAAAD,GAAM,MAAMC,IAAKD,GAAM,OAAO,IAAIA,GAAM;AAAA,IAE9E,CAAC,GACDP,IAAU,CAAA,GACVC,IAAa;AAAA,EACf;AAEA,aAAWG,KAAMN;AACf,IAAIE,EAAQ,SAAS,KAAKI,EAAG,MAAM,QAAA,KAAaH,KAAYC,EAAA,GAC5DF,EAAQ,KAAKI,CAAE,GACfH,IAAa,KAAK,IAAIA,GAAYG,EAAG,IAAI,SAAS;AAEpD,SAAAF,EAAA,GAEOH;AACT;ACnCO,SAASU,EAAUC,GAAkBC,GAA8B;AACxE,QAAMC,IAAYD,EAAS,aAAa,GAClCE,IAASH,EAAK,SACdI,IAASJ,EAAK;AACpB,MAAIK,IAAU;AAEd,QAAMC,IAAO,CAACrC,MAAa;;AACzB,UAAMsC,IAAKtC,GACLuC,IAAKD,EAAG,UAAUJ,GAClBM,IAAKF,EAAG,UAAUH;AACxB,IAAI,CAACC,KAAW,KAAK,MAAMG,GAAIC,CAAE,IAAIP,MAChCG,MACHA,IAAU,KACVK,IAAAT,EAAS,YAAT,QAAAS,EAAA,KAAAT,GAAmBM,MAErBI,IAAAV,EAAS,WAAT,QAAAU,EAAA,KAAAV,GAAkB,EAAE,IAAAO,GAAI,IAAAC,GAAI,OAAO,IAAM,OAAOF;EAClD,GAEMK,IAAK,CAAC3C,MAAa;;AACvB,WAAO,oBAAoB,eAAeqC,CAAI,GAC9C,OAAO,oBAAoB,aAAaM,CAAE,GAC1C,OAAO,oBAAoB,iBAAiBA,CAAE;AAC9C,UAAML,IAAKtC;AACX,KAAAyC,IAAAT,EAAS,UAAT,QAAAS,EAAA,KAAAT,GAAiB;AAAA,MACf,IAAIM,EAAG,UAAUJ;AAAA,MACjB,IAAII,EAAG,UAAUH;AAAA,MACjB,OAAOC;AAAA,MACP,OAAOE;AAAA,IAAA;AAAA,EAEX;AAEA,SAAO,iBAAiB,eAAeD,CAAI,GAC3C,OAAO,iBAAiB,aAAaM,CAAE,GACvC,OAAO,iBAAiB,iBAAiBA,CAAE;AAC7C;AAGO,SAASC,EAAKC,GAAgBxD,GAAsB;AACzD,SAAIA,KAAQ,IAAUwD,IACf,KAAK,MAAMA,IAASxD,CAAI,IAAIA;AACrC;AC9CO,SAASyD,EAAGC,GAAaC,GAA0B;AACxD,QAAMC,IAAO,SAAS,cAAcF,CAAG;AACvC,SAAAE,EAAK,YAAYD,GACVC;AACT;AAEO,SAASC,EAAM7E,GAAe8E,GAAYC,GAAoB;AACnE,SAAO,KAAK,IAAID,GAAI,KAAK,IAAIC,GAAI/E,CAAK,CAAC;AACzC;ACtBO,MAAMgF,IAAU;AAOhB,MAAMC,EAAwB;AAAA,EAKnC,YACYC,GACAC,GACV;AAFU,SAAA,MAAAD,GACA,KAAA,OAAAC,GAJZ,KAAQ,UAA8B;AAAA,EAKnC;AAAA,EAEH,IAAc,cAAsB;AAClC,WAAOH,IAAU,KAAK,IAAI,KAAK;AAAA,EACjC;AAAA,EAEA,IAAc,gBAAwB;AACpC,WAAO,KAAK,IAAI,KAAK,QAAQA;AAAA,EAC/B;AAAA,EAEU,YAAoB;AAC5B,WAAO,KAAK,IAAI,OAAO,QAAQ,KAAK,IAAI,OAAO;AAAA,EACjD;AAAA,EAEA,QAAmB;AACjB,UAAM9E,IAAI,KAAK,IAAI;AACnB,WAAO,EAAE,OAAOA,EAAE,QAAQ,KAAK,GAAG,KAAKA,EAAE,MAAM,KAAK,EAAA;AAAA,EACtD;AAAA,EAEA,QAAgB;AACd,WAAOU;AAAA,MACL,KAAK,IAAI;AAAA,MACT,EAAE,SAAS,QAAQ,KAAK,WAAW,OAAO,QAAQ,MAAM,UAAA;AAAA,MACxD,KAAK,UAAA;AAAA,MACL,KAAK,IAAI;AAAA,IAAA;AAAA,EAEb;AAAA,EAEA,QAAc;AACZ,UAAMwE,IAAO,KAAK,IAAI;AACtB,SAAK,OAAOX,EAAG,OAAO,aAAa;AAEnC,UAAMY,IAAUZ,EAAG,OAAO,SAAS;AACnC,IAAAY,EAAQ,MAAM,SAAS,GAAG,KAAK,aAAa;AAC5C,aAAS7E,IAAI4E,EAAK,KAAK5E,KAAK4E,EAAK,KAAK5E,KAAK4E,EAAK,eAAe;AAC7D,YAAME,IAAQb,EAAG,OAAO,eAAe;AACvC,MAAAa,EAAM,MAAM,MAAM,IAAI9E,IAAI4E,EAAK,OAAO,KAAK,WAAW,MACtDE,EAAM,cAAc7E,EAAcD,CAAC,GACnC6E,EAAQ,YAAYC,CAAK;AAAA,IAC3B;AAEA,SAAK,UAAUb,EAAG,OAAO,QAAQ,GACjC,KAAK,QAAQ,MAAM,SAAS,GAAG,KAAK,aAAa;AACjD,aAASc,IAAI,GAAGA,KAAKH,EAAK,OAAOG,KAAK;AACpC,YAAMC,IAAOf,EAAG,OAAO,cAAc;AACrC,MAAKc,IAAIH,EAAK,WAAYA,EAAK,kBAAkB,KAAGI,EAAK,UAAU,IAAI,eAAe,GACtFA,EAAK,MAAM,MAAM,GAAGD,IAAIP,CAAO,MAC/B,KAAK,QAAQ,YAAYQ,CAAI;AAAA,IAC/B;AAEA,SAAK,KAAK,YAAYH,CAAO,GAC7B,KAAK,KAAK,YAAY,KAAK,OAAO,GAClC,KAAK,KAAK,YAAY,KAAK,IAAI,GAC/B,KAAK,WAAA,GACL,KAAK,aAAA;AAAA,EACP;AAAA;AAAA,EAGU,YAAwB;AAChC,UAAM9C,IAAI,KAAK,MAAA;AACf,WAAO,KAAK,IAAI,OAAO,QAAQA,EAAE,OAAOA,EAAE,GAAG;AAAA,EAC/C;AAAA,EAEA,eAAqB;AACnB,QAAI,CAAC,KAAK,QAAS;AACnB,SAAK,QAAQ,iBAAiB,WAAW,EAAE,QAAQ,CAACkD,MAAMA,EAAE,QAAQ;AAEpE,UAAML,IAAO,KAAK,IAAI,MAChBM,IAAS9C,EAAW,KAAK,UAAA,CAAW;AAC1C,eAAW+C,KAAKD,GAAQ;AACtB,YAAMtC,IAAKuC,EAAE,OACPC,IAAWjF,EAAWyC,EAAG,KAAK,GAC9ByC,IAASlF,EAAWyC,EAAG,GAAG,KAAKgC,EAAK,KACpCU,IAAWjB,EAAMe,GAAUR,EAAK,KAAKA,EAAK,GAAG,GAC7CW,IAASlB,EAAMgB,GAAQT,EAAK,KAAKA,EAAK,GAAG,GACzCY,KAAOF,IAAWV,EAAK,OAAO,KAAK,aACnCa,IAAS,KAAK,IAAIjB,IAAU,IAAIe,IAASD,KAAY,KAAK,WAAW,GAErElB,IAAOH,EAAG,OAAO,UAAU;AACjC,MAAAG,EAAK,QAAQ,UAAUxB,EAAG,IAC1BwB,EAAK,MAAM,MAAM,GAAGoB,CAAG,MACvBpB,EAAK,MAAM,SAAS,GAAGqB,CAAM,MAC7BrB,EAAK,MAAM,OAAO,QAAQe,EAAE,OAAO,GAAG,YACtCf,EAAK,MAAM,QAAQ,QAAQe,EAAE,QAAQ,GAAG,YACpCvC,EAAG,SAAOwB,EAAK,MAAM,YAAY,iBAAiBxB,EAAG,KAAK,GAC1DA,EAAG,aAAWwB,EAAK,MAAM,YAAY,iBAAiBxB,EAAG,SAAS,GACtEwB,EAAK,YAAY,KAAK,IAAI,mBAAmBxB,CAAE,CAAC,GAChD,KAAK,QAAQwB,GAAMxB,CAAE,GACrB,KAAK,QAAQ,YAAYwB,CAAI,GAC7B,KAAK,IAAI,eAAexB,GAAIwB,CAAI;AAAA,IAClC;AAEA,SAAK,mBAAA;AAAA,EACP;AAAA;AAAA,EAIQ,OAAOJ,GAAuB;AACpC,WAAO,KAAK,IAAI,KAAK,QAAQ,KAAK,EAAE,IAAIA,GAAQ,QAAQ;AAAA,EAC1D;AAAA,EAEQ,UAAU0B,GAAyB;AACzC,UAAMC,IAAO,KAAK,QAAS,sBAAA;AAC3B,WAAO,KAAK,IAAI,KAAK,OAAOD,IAAUC,EAAK,OAAO,KAAK;AAAA,EACzD;AAAA;AAAA,EAGQ,QAAQC,GAAkBhD,GAAoB;AAEpD,QADA,KAAK,IAAI,gBAAgBgD,GAAKhD,CAAE,GAC5B,CAAC,KAAK,IAAI,UAAU;AACtB,MAAAgD,EAAI,iBAAiB,SAAS,CAACC,MAAY,KAAK,IAAI,eAAejD,GAAIgD,GAAKC,CAAO,CAAC;AACpF;AAAA,IACF;AACA,IAAAD,EAAI,MAAM,SAAS;AAEnB,UAAME,IAAS7B,EAAG,OAAO,8BAA8B;AACvD,IAAA2B,EAAI,YAAYE,CAAM,GACtBA,EAAO,iBAAiB,eAAe,CAAC5C,MAAS,KAAK,YAAYA,GAAM0C,GAAKhD,CAAE,CAAC,GAEhFgD,EAAI,iBAAiB,eAAe,CAAC1C,MAAS;AAE5C,UADIA,EAAK,WAAW,KACfA,EAAK,OAAuB,QAAQ,mBAAmB,EAAG;AAC/D,MAAAA,EAAK,eAAA;AACL,YAAM0B,IAAO,KAAK,IAAI,MAChBmB,IAASnD,EAAG,IAAI,KAAKA,EAAG,OAAO,QAAQ,GACvCoD,IAAe7F,EAAWyC,EAAG,KAAK,GAClCqD,IAAU,KAAK,UAAU/C,EAAK,OAAO,GACrCgD,IAAQ,CAACR,MACbrB;AAAA,QACEN,EAAKiC,KAAgB,KAAK,UAAUN,CAAO,IAAIO,IAAUrB,EAAK,QAAQ;AAAA,QACtEA,EAAK;AAAA,QACLA,EAAK,MAAMmB;AAAA,MAAA;AAEf,MAAA9C,EAAUC,GAAM;AAAA,QACd,SAAS,MAAM0C,EAAI,UAAU,IAAI,aAAa;AAAA,QAC9C,QAAQ,CAAC,EAAE,OAAAO,QAAY;AACrB,UAAAP,EAAI,MAAM,MAAM,IAAIM,EAAMC,EAAM,OAAO,IAAIvB,EAAK,OAAO,KAAK,WAAW;AAAA,QACzE;AAAA,QACA,OAAO,CAAC,EAAE,OAAAwB,GAAO,OAAAD,QAAY;AAE3B,cADAP,EAAI,UAAU,OAAO,aAAa,GAC9B,CAACQ,GAAO;AACV,iBAAK,IAAI,eAAexD,GAAIgD,GAAKO,CAAK;AACtC;AAAA,UACF;AACA,gBAAME,IAAW,KAAK,OAAOH,EAAMC,EAAM,OAAO,CAAC;AACjD,eAAK,IAAI,kBAAkBvD,GAAIyD,GAAUA,EAAS,IAAIN,GAAQ,QAAQ,GAAGnD,EAAG,UAAU;AAAA,QACxF;AAAA,MAAA,CACD;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEQ,YAAYM,GAAkB0C,GAAkBhD,GAAoB;AAC1E,QAAIM,EAAK,WAAW,EAAG;AACvB,IAAAA,EAAK,gBAAA,GACLA,EAAK,eAAA;AACL,UAAM0B,IAAO,KAAK,IAAI,MAChBU,IAAWnF,EAAWyC,EAAG,KAAK,GAC9B0D,IAAQ,CAACZ,MACbrB,EAAMN,EAAK,KAAK,UAAU2B,CAAO,GAAGd,EAAK,QAAQ,GAAGU,IAAWV,EAAK,UAAUA,EAAK,GAAG;AACxF,IAAA3B,EAAUC,GAAM;AAAA,MACd,SAAS,MAAM0C,EAAI,UAAU,IAAI,aAAa;AAAA,MAC9C,QAAQ,CAAC,EAAE,OAAAO,QAAY;AACrB,QAAAP,EAAI,MAAM,SAAS,IAAIU,EAAMH,EAAM,OAAO,IAAIb,KAAY,KAAK,WAAW;AAAA,MAC5E;AAAA,MACA,OAAO,CAAC,EAAE,OAAAc,GAAO,OAAAD,QAAY;AAE3B,QADAP,EAAI,UAAU,OAAO,aAAa,GAC7BQ,KACL,KAAK,IAAI,kBAAkBxD,GAAIA,EAAG,OAAO,KAAK,OAAO0D,EAAMH,EAAM,OAAO,CAAC,GAAGvD,EAAG,UAAU;AAAA,MAC3F;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EAEQ,aAAmB;AACzB,IAAI,CAAC,KAAK,IAAI,cAAc,CAAC,KAAK,WAClC,KAAK,QAAQ,iBAAiB,eAAe,CAACM,MAAS;AAErD,UADIA,EAAK,WAAW,KACfA,EAAK,OAAuB,QAAQ,WAAW,EAAG;AACvD,MAAAA,EAAK,eAAA;AACL,YAAM0B,IAAO,KAAK,IAAI,MAChB2B,IAASlC,EAAMN,EAAK,KAAK,UAAUb,EAAK,OAAO,GAAG0B,EAAK,QAAQ,GAAGA,EAAK,KAAKA,EAAK,GAAG,GACpF4B,IAAMvC,EAAG,OAAO,eAAe;AACrC,WAAK,QAAS,YAAYuC,CAAG;AAC7B,YAAMN,IAAQ,CAACR,MAAoB;AACjC,cAAMe,IAAMpC,EAAMN,EAAK,KAAK,UAAU2B,CAAO,GAAGd,EAAK,QAAQ,GAAGA,EAAK,KAAKA,EAAK,GAAG,GAC5EN,IAAK,KAAK,IAAIiC,GAAQE,CAAG,GACzBlC,IAAK,KAAK,IAAIgC,GAAQE,CAAG;AAC/B,QAAAD,EAAI,MAAM,MAAM,IAAIlC,IAAKM,EAAK,OAAO,KAAK,WAAW,MACrD4B,EAAI,MAAM,SAAS,IAAIjC,IAAKD,KAAM,KAAK,WAAW;AAAA,MACpD;AACA,MAAArB,EAAUC,GAAM;AAAA,QACd,QAAQ,CAAC,EAAE,OAAAiD,QAAYD,EAAMC,EAAM,OAAO;AAAA,QAC1C,OAAO,CAAC,EAAE,OAAAC,GAAO,OAAAD,QAAY;AAE3B,cADAK,EAAI,OAAA,GACA,CAACJ,EAAO;AACZ,gBAAMK,IAAMpC,EAAMN,EAAK,KAAK,UAAUoC,EAAM,OAAO,GAAGvB,EAAK,QAAQ,GAAGA,EAAK,KAAKA,EAAK,GAAG;AACxF,cAAIN,IAAK,KAAK,IAAIiC,GAAQE,CAAG,GACzBlC,IAAK,KAAK,IAAIgC,GAAQE,CAAG;AAE7B,UADIlC,KAAMD,MAAIC,IAAK,KAAK,IAAID,IAAKM,EAAK,UAAUA,EAAK,GAAG,IACpD,EAAAL,KAAMD,MACV,KAAK,IAAI,aAAa,KAAK,OAAOA,CAAE,GAAG,KAAK,OAAOC,CAAE,GAAG,MAAM4B,CAAK;AAAA,QACrE;AAAA,MAAA,CACD;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEU,qBAA2B;;AAGnC,SAFAvC,IAAA,KAAK,YAAL,QAAAA,EAAc,UACd,KAAK,UAAU,MACX,CAAC,KAAK,IAAI,QAAQ,gBAAgB,CAAC,KAAK,QAAS;AACrD,UAAM8C,IAAM,KAAK,IAAI,IAAA;AACrB,QAAI,CAACA,EAAI,OAAO,KAAK,IAAI,MAAM,KAAK,EAAG;AACvC,UAAM9B,IAAO,KAAK,IAAI,MAChB+B,IAAKxG,EAAWuG,CAAG;AACzB,IAAIC,IAAK/B,EAAK,OAAO+B,IAAK/B,EAAK,QAC/B,KAAK,UAAUX,EAAG,OAAO,kBAAkB,GAC3C,KAAK,QAAQ,MAAM,MAAM,IAAI0C,IAAK/B,EAAK,OAAO,KAAK,WAAW,MAC9D,KAAK,QAAQ,YAAY,KAAK,OAAO;AAAA,EACvC;AAAA,EAEA,UAAgB;;AACd,KAAAhB,IAAA,KAAK,SAAL,QAAAA,EAAW,UACX,KAAK,OAAO,QACZ,KAAK,UAAU,QACf,KAAK,UAAU;AAAA,EACjB;AACF;AC1OO,MAAMgD,EAAgC;AAAA,EAM3C,YACUlC,GACAC,GACR;AAFQ,SAAA,MAAAD,GACA,KAAA,OAAAC,GALV,KAAQ,UAA8B,MACtC,KAAQ,OAA+D,CAAA;AAAA,EAKpE;AAAA,EAEH,IAAY,cAAsB;AAChC,WAAOH,IAAU,KAAK,IAAI,KAAK;AAAA,EACjC;AAAA,EAEA,IAAY,gBAAwB;AAClC,WAAO,KAAK,IAAI,KAAK,QAAQA;AAAA,EAC/B;AAAA,EAEQ,YAAoB;AAC1B,WAAO,KAAK,IAAI,OAAO,QAAQ,KAAK,IAAI,OAAO;AAAA,EACjD;AAAA,EAEA,QAAmB;AACjB,UAAM9E,IAAI,KAAK,IAAI;AACnB,WAAO,EAAE,OAAOA,EAAE,QAAQ,KAAK,GAAG,KAAKA,EAAE,MAAM,KAAK,EAAA;AAAA,EACtD;AAAA,EAEA,QAAgB;AACd,WAAOU;AAAA,MACL,KAAK,IAAI;AAAA,MACT,EAAE,SAAS,QAAQ,KAAK,WAAW,OAAO,QAAQ,MAAM,UAAA;AAAA,MACxD,KAAK,UAAA;AAAA,MACL,KAAK,IAAI;AAAA,IAAA;AAAA,EAEb;AAAA;AAAA,EAIA,QAAc;AACZ,SAAK,SAAS6D,EAAG,OAAO,OAAO;AAC/B,UAAM4C,IAAS,KAAK,IAAI,UAAU,QAAA,GAC5BC,IAAUD,EAAO,QAAQ,CAACE,MAAMA,EAAE,SAAS,GAC3CC,IAAaH,EAAO,SAAS,KAAKA,EAAO,KAAK,CAACE,MAAMA,EAAE,UAAU,IAAI;AAE3E,SAAK,OAAO,YAAY,KAAK,UAAUF,GAAQG,CAAU,CAAC;AAE1D,UAAMC,IAAShD,EAAG,OAAO,cAAc;AACvC,IAAAgD,EAAO,MAAM,SAAS,GAAG,KAAK,aAAa,MAC3CA,EAAO,YAAY,KAAK,WAAW,GAEnC,KAAK,SAAShD,EAAG,OAAO,YAAY,GACpC,KAAK,OAAO,CAAA;AACZ,eAAWiD,KAAYJ,GAAS;AAC9B,YAAMhE,IAAMmB,EAAG,OAAO,WAAW;AACjC,MAAAnB,EAAI,QAAQ,aAAaoE,EAAS,IAClC,KAAK,eAAepE,CAAG,GACvB,KAAK,cAAcA,GAAKoE,CAAQ,GAChC,KAAK,OAAO,YAAYpE,CAAG,GAC3B,KAAK,KAAK,KAAK,EAAE,UAAAoE,GAAU,SAASpE,GAAK;AAAA,IAC3C;AACA,IAAAmE,EAAO,YAAY,KAAK,MAAM,GAC9B,KAAK,OAAO,YAAYA,CAAM,GAC9B,KAAK,KAAK,YAAY,KAAK,MAAM,GAEjC,KAAK,aAAA;AAAA,EACP;AAAA,EAEQ,UACNJ,GACAG,GACa;;AACb,UAAMG,IAAOlD,EAAG,OAAO,YAAY,GAC7BmD,IAASnD,EAAG,OAAO,cAAc;AACvC,IAAAkD,EAAK,YAAYC,CAAM;AAEvB,UAAMrE,IAAOkB,EAAG,OAAO,iBAAiB;AACxC,QAAI+C,GAAY;AACd,YAAMK,IAAWpD,EAAG,OAAO,iBAAiB;AAC5C,iBAAWqD,KAAUT,GAAQ;AAC3B,cAAMU,IAAOtD,EAAG,OAAO,kBAAkB;AACzC,QAAAsD,EAAK,MAAM,OAAO,GAAGD,EAAO,UAAU,MAAM,QAC5CC,EAAK,cAAcD,EAAO,SAAS,IACnCD,EAAS,YAAYE,CAAI;AAAA,MAC3B;AACA,MAAAxE,EAAK,YAAYsE,CAAQ;AAAA,IAC3B;AACA,UAAMG,IAAWvD,EAAG,OAAO,iBAAiB;AAC5C,eAAWiD,KAAYL,EAAO,QAAQ,CAACE,MAAMA,EAAE,SAAS,GAAG;AACzD,YAAMU,IAAOxD,EAAG,OAAO,aAAa;AACpC,MAAAwD,EAAK,QAAQ,aAAaP,EAAS;AACnC,YAAMQ,KAAS7D,KAAAD,IAAA,KAAK,IAAI,SAAQ,mBAAjB,gBAAAC,EAAA,KAAAD,GAAkCsD;AACjD,MAAIQ,KAAU,OACR,OAAOA,KAAW,WAAUD,EAAK,YAAYC,IAC5CD,EAAK,YAAYC,CAAM,IAE5BD,EAAK,cAAcP,EAAS,OAE9BM,EAAS,YAAYC,CAAI;AAAA,IAC3B;AACA,WAAA1E,EAAK,YAAYyE,CAAQ,GACzBL,EAAK,YAAYpE,CAAI,GACdoE;AAAA,EACT;AAAA,EAEQ,YAAyB;AAC/B,UAAMtC,IAAUZ,EAAG,OAAO,oBAAoB;AAC9C,IAAAY,EAAQ,MAAM,SAAS,GAAG,KAAK,aAAa;AAC5C,UAAMD,IAAO,KAAK,IAAI;AACtB,aAAS5E,IAAI4E,EAAK,KAAK5E,KAAK4E,EAAK,KAAK5E,KAAK4E,EAAK,eAAe;AAC7D,YAAME,IAAQb,EAAG,OAAO,eAAe;AACvC,MAAAa,EAAM,MAAM,MAAM,IAAI9E,IAAI4E,EAAK,OAAO,KAAK,WAAW,MACtDE,EAAM,cAAc7E,EAAcD,CAAC,GACnC6E,EAAQ,YAAYC,CAAK;AAAA,IAC3B;AACA,WAAOD;AAAA,EACT;AAAA,EAEQ,eAAe/B,GAAwB;AAC7C,UAAM8B,IAAO,KAAK,IAAI;AACtB,aAASG,IAAI,GAAGA,KAAKH,EAAK,OAAOG,KAAK;AACpC,YAAMC,IAAOf,EAAG,OAAO,cAAc;AACrC,MAAKc,IAAIH,EAAK,WAAYA,EAAK,kBAAkB,KAAGI,EAAK,UAAU,IAAI,eAAe,GACtFA,EAAK,MAAM,MAAM,GAAGD,IAAIP,CAAO,MAC/B1B,EAAI,YAAYkC,CAAI;AAAA,IACtB;AAAA,EACF;AAAA;AAAA,EAIA,eAAqB;AACnB,QAAI,CAAC,KAAK,OAAQ;AAClB,UAAM2C,IAAQ,KAAK,MAAA,GACb/C,IAAO,KAAK,IAAI;AACtB,eAAW,EAAE,UAAAsC,GAAU,SAAAU,EAAA,KAAa,KAAK,MAAM;AAC7C,MAAAA,EAAQ,iBAAiB,WAAW,EAAE,QAAQ,CAAC3C,MAAMA,EAAE,QAAQ;AAC/D,YAAMC,IAAS9C,EAAW,KAAK,IAAI,OAAO,QAAQuF,EAAM,OAAOA,EAAM,KAAKT,EAAS,EAAE,CAAC;AACtF,iBAAW/B,KAAKD,GAAQ;AACtB,cAAMtC,IAAKuC,EAAE,OACPC,IAAWjF,EAAWyC,EAAG,KAAK,GAC9ByC,IAASlF,EAAWyC,EAAG,GAAG,KAAKgC,EAAK,KACpCU,IAAWjB,EAAMe,GAAUR,EAAK,KAAKA,EAAK,GAAG,GAC7CW,IAASlB,EAAMgB,GAAQT,EAAK,KAAKA,EAAK,GAAG,GACzCY,KAAOF,IAAWV,EAAK,OAAO,KAAK,aACnCa,IAAS,KAAK,IAAIjB,IAAU,IAAIe,IAASD,KAAY,KAAK,WAAW,GAErEM,IAAM3B,EAAG,OAAO,UAAU;AAChC,QAAA2B,EAAI,QAAQ,UAAUhD,EAAG,IACzBgD,EAAI,MAAM,MAAM,GAAGJ,CAAG,MACtBI,EAAI,MAAM,SAAS,GAAGH,CAAM,MAC5BG,EAAI,MAAM,OAAO,QAAQT,EAAE,OAAO,GAAG,YACrCS,EAAI,MAAM,QAAQ,QAAQT,EAAE,QAAQ,GAAG,YACnCvC,EAAG,SAAOgD,EAAI,MAAM,YAAY,iBAAiBhD,EAAG,KAAK,GACzDA,EAAG,aAAWgD,EAAI,MAAM,YAAY,iBAAiBhD,EAAG,SAAS,GACrEgD,EAAI,YAAY,KAAK,IAAI,mBAAmBhD,CAAE,CAAC,GAC/C,KAAK,QAAQgD,GAAKhD,CAAE,GACpBgF,EAAQ,YAAYhC,CAAG,GACvB,KAAK,IAAI,eAAehD,GAAIgD,CAAG;AAAA,MACjC;AAAA,IACF;AACA,SAAK,mBAAA;AAAA,EACP;AAAA,EAEQ,qBAA2B;;AAGjC,SAFAhC,IAAA,KAAK,YAAL,QAAAA,EAAc,UACd,KAAK,UAAU,MACX,CAAC,KAAK,IAAI,QAAQ,gBAAgB,CAAC,KAAK,OAAQ;AACpD,UAAM8C,IAAM,KAAK,IAAI,IAAA;AACrB,QAAI,CAACA,EAAI,OAAO,KAAK,IAAI,MAAM,KAAK,EAAG;AACvC,UAAM9B,IAAO,KAAK,IAAI,MAChB+B,IAAKxG,EAAWuG,CAAG;AACzB,IAAIC,IAAK/B,EAAK,OAAO+B,IAAK/B,EAAK,QAC/B,KAAK,UAAUX,EAAG,OAAO,4BAA4B,GACrD,KAAK,QAAQ,MAAM,MAAM,IAAI0C,IAAK/B,EAAK,OAAO,KAAK,WAAW,MAC9D,KAAK,OAAO,YAAY,KAAK,OAAO;AAAA,EACtC;AAAA;AAAA,EAIQ,OAAOZ,GAAuB;AACpC,WAAO,KAAK,IAAI,KAAK,QAAQ,KAAK,EAAE,IAAIA,GAAQ,QAAQ;AAAA,EAC1D;AAAA,EAEQ,UAAU0B,GAAyB;AACzC,UAAMC,IAAO,KAAK,OAAQ,sBAAA;AAC1B,WAAO,KAAK,IAAI,KAAK,OAAOD,IAAUC,EAAK,OAAO,KAAK;AAAA,EACzD;AAAA;AAAA,EAGQ,aAAaQ,GAAmBP,GAA6C;AACnF,UAAMiC,IAAOjC,EAAI,MAAM;AACvB,IAAAA,EAAI,MAAM,gBAAgB;AAC1B,UAAMkC,IAAS,SAAS,iBAAiB3B,EAAM,SAASA,EAAM,OAAO;AACrE,IAAAP,EAAI,MAAM,gBAAgBiC;AAC1B,UAAM/E,IAAMgF,KAAA,gBAAAA,EAAQ,QAAQ;AAC5B,WAAOhF,IAAOA,EAAI,QAAQ,cAAc,OAAQ;AAAA,EAClD;AAAA,EAEQ,aAAaqD,GAAmBP,GAAwB;;AAC9D,SAAK,eAAA;AACL,UAAMiC,IAAOjC,EAAI,MAAM;AACvB,IAAAA,EAAI,MAAM,gBAAgB;AAC1B,UAAMkC,IAAS,SAAS,iBAAiB3B,EAAM,SAASA,EAAM,OAAO;AACrE,IAAAP,EAAI,MAAM,gBAAgBiC,IAC1BjE,IAAAkE,KAAA,gBAAAA,EAAQ,QAAQ,oCAAhB,QAAAlE,EAAiD,UAAU,IAAI;AAAA,EACjE;AAAA,EAEQ,iBAAuB;;AAC7B,KAAAA,IAAA,KAAK,WAAL,QAAAA,EAAa,iBAAiB,mBAAmB,QAAQ,CAACqB,MAAMA,EAAE,UAAU,OAAO,gBAAgB;AAAA,EACrG;AAAA,EAEQ,QAAQW,GAAkBhD,GAAoB;AAEpD,QADA,KAAK,IAAI,gBAAgBgD,GAAKhD,CAAE,GAC5B,CAAC,KAAK,IAAI,UAAU;AACtB,MAAAgD,EAAI,iBAAiB,SAAS,CAACC,MAAY,KAAK,IAAI,eAAejD,GAAIgD,GAAKC,CAAO,CAAC;AACpF;AAAA,IACF;AACA,IAAAD,EAAI,MAAM,SAAS;AACnB,UAAME,IAAS7B,EAAG,OAAO,8BAA8B;AACvD,IAAA2B,EAAI,YAAYE,CAAM,GACtBA,EAAO,iBAAiB,eAAe,CAAC5C,MAAS,KAAK,YAAYA,GAAM0C,GAAKhD,CAAE,CAAC,GAEhFgD,EAAI,iBAAiB,eAAe,CAAC1C,MAAS;AAE5C,UADIA,EAAK,WAAW,KACfA,EAAK,OAAuB,QAAQ,mBAAmB,EAAG;AAC/D,MAAAA,EAAK,eAAA;AACL,YAAM0B,IAAO,KAAK,IAAI,MAChBmB,IAASnD,EAAG,IAAI,KAAKA,EAAG,OAAO,QAAQ,GACvCoD,IAAe7F,EAAWyC,EAAG,KAAK,GAClCqD,IAAU,KAAK,UAAU/C,EAAK,OAAO,GACrC6E,IAAa,CAACrC,MAClBrB;AAAA,QACEN,EAAKiC,KAAgB,KAAK,UAAUN,CAAO,IAAIO,IAAUrB,EAAK,QAAQ;AAAA,QACtEA,EAAK;AAAA,QACLA,EAAK,MAAMmB;AAAA,MAAA;AAEf,MAAA9C,EAAUC,GAAM;AAAA,QACd,SAAS,MAAM0C,EAAI,UAAU,IAAI,aAAa;AAAA,QAC9C,QAAQ,CAAC,EAAE,OAAAO,QAAY;AACrB,UAAAP,EAAI,MAAM,MAAM,IAAImC,EAAW5B,EAAM,OAAO,IAAIvB,EAAK,OAAO,KAAK,WAAW,MAC5E,KAAK,aAAauB,GAAOP,CAAG;AAAA,QAC9B;AAAA,QACA,OAAO,CAAC,EAAE,OAAAQ,GAAO,OAAAD,QAAY;AAG3B,cAFAP,EAAI,UAAU,OAAO,aAAa,GAClC,KAAK,eAAA,GACD,CAACQ,GAAO;AACV,iBAAK,IAAI,eAAexD,GAAIgD,GAAKO,CAAK;AACtC;AAAA,UACF;AACA,gBAAME,IAAW,KAAK,OAAO0B,EAAW5B,EAAM,OAAO,CAAC,GAChD6B,IAAc,KAAK,aAAa7B,GAAOP,CAAG,KAAKhD,EAAG;AACxD,eAAK,IAAI,kBAAkBA,GAAIyD,GAAUA,EAAS,IAAIN,GAAQ,QAAQ,GAAGiC,CAAW;AAAA,QACtF;AAAA,MAAA,CACD;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEQ,YAAY9E,GAAkB0C,GAAkBhD,GAAoB;AAC1E,QAAIM,EAAK,WAAW,EAAG;AACvB,IAAAA,EAAK,gBAAA,GACLA,EAAK,eAAA;AACL,UAAM0B,IAAO,KAAK,IAAI,MAChBU,IAAWnF,EAAWyC,EAAG,KAAK,GAC9B0D,IAAQ,CAACZ,MACbrB,EAAMN,EAAK,KAAK,UAAU2B,CAAO,GAAGd,EAAK,QAAQ,GAAGU,IAAWV,EAAK,UAAUA,EAAK,GAAG;AACxF,IAAA3B,EAAUC,GAAM;AAAA,MACd,SAAS,MAAM0C,EAAI,UAAU,IAAI,aAAa;AAAA,MAC9C,QAAQ,CAAC,EAAE,OAAAO,QAAY;AACrB,QAAAP,EAAI,MAAM,SAAS,IAAIU,EAAMH,EAAM,OAAO,IAAIb,KAAY,KAAK,WAAW;AAAA,MAC5E;AAAA,MACA,OAAO,CAAC,EAAE,OAAAc,GAAO,OAAAD,QAAY;AAE3B,QADAP,EAAI,UAAU,OAAO,aAAa,GAC7BQ,KACL,KAAK,IAAI,kBAAkBxD,GAAIA,EAAG,OAAO,KAAK,OAAO0D,EAAMH,EAAM,OAAO,CAAC,GAAGvD,EAAG,UAAU;AAAA,MAC3F;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EAEQ,cAAcE,GAAkBoE,GAA6B;AACnE,IAAK,KAAK,IAAI,cACdpE,EAAI,iBAAiB,eAAe,CAACI,MAAS;AAE5C,UADIA,EAAK,WAAW,KACfA,EAAK,OAAuB,QAAQ,WAAW,EAAG;AACvD,MAAAA,EAAK,eAAA;AACL,YAAM0B,IAAO,KAAK,IAAI,MAChB2B,IAASlC,EAAMN,EAAK,KAAK,UAAUb,EAAK,OAAO,GAAG0B,EAAK,QAAQ,GAAGA,EAAK,KAAKA,EAAK,GAAG,GACpF4B,IAAMvC,EAAG,OAAO,4BAA4B;AAClD,MAAAnB,EAAI,YAAY0D,CAAG;AACnB,YAAMN,IAAQ,CAACR,MAAoB;AACjC,cAAMe,IAAMpC,EAAMN,EAAK,KAAK,UAAU2B,CAAO,GAAGd,EAAK,QAAQ,GAAGA,EAAK,KAAKA,EAAK,GAAG,GAC5EN,IAAK,KAAK,IAAIiC,GAAQE,CAAG,GACzBlC,IAAK,KAAK,IAAIgC,GAAQE,CAAG;AAC/B,QAAAD,EAAI,MAAM,MAAM,IAAIlC,IAAKM,EAAK,OAAO,KAAK,WAAW,MACrD4B,EAAI,MAAM,SAAS,IAAIjC,IAAKD,KAAM,KAAK,WAAW;AAAA,MACpD;AACA,MAAArB,EAAUC,GAAM;AAAA,QACd,QAAQ,CAAC,EAAE,OAAAiD,QAAYD,EAAMC,EAAM,OAAO;AAAA,QAC1C,OAAO,CAAC,EAAE,OAAAC,GAAO,OAAAD,QAAY;AAE3B,cADAK,EAAI,OAAA,GACA,CAACJ,EAAO;AACZ,gBAAMK,IAAMpC,EAAMN,EAAK,KAAK,UAAUoC,EAAM,OAAO,GAAGvB,EAAK,QAAQ,GAAGA,EAAK,KAAKA,EAAK,GAAG;AACxF,cAAIN,IAAK,KAAK,IAAIiC,GAAQE,CAAG,GACzBlC,IAAK,KAAK,IAAIgC,GAAQE,CAAG;AAE7B,UADIlC,KAAMD,MAAIC,IAAK,KAAK,IAAID,IAAKM,EAAK,UAAUA,EAAK,GAAG,IACpD,EAAAL,KAAMD,MACV,KAAK,IAAI,aAAa,KAAK,OAAOA,CAAE,GAAG,KAAK,OAAOC,CAAE,GAAG2C,GAAUf,CAAK;AAAA,QACzE;AAAA,MAAA,CACD;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,UAAgB;;AACd,KAAAvC,IAAA,KAAK,WAAL,QAAAA,EAAa,UACb,KAAK,SAAS,QACd,KAAK,SAAS,QACd,KAAK,UAAU,MACf,KAAK,OAAO,CAAA;AAAA,EACd;AACF;ACpUA,MAAMqE,IAAS,IAETC,IAAU,IAEVC,IAAsB,IAEtBC,IAAM,GAENC,IAAU,IAEVC,IAAc;AAWb,MAAMC,EAA6B;AAAA,EAUxC,YACU7D,GACAC,GACR;AAFQ,SAAA,MAAAD,GACA,KAAA,OAAAC;AAAA,EACP;AAAA;AAAA,EAIH,IAAY,cAAsB;AAChC,WAAO0D,IAAU;AAAA,EACnB;AAAA,EAEA,IAAY,QAAgB;AAC1B,WAAO,KAAK,IAAI,KAAK,eAAe,KAAK;AAAA,EAC3C;AAAA,EAEQ,YAAoB;AAC1B,WAAO,KAAK,IAAI,OAAO,QAAQ,KAAK,IAAI,OAAO;AAAA,EACjD;AAAA,EAEA,QAAmB;AACjB,UAAM3I,IAAI,KAAK,IAAI;AACnB,WAAO,EAAE,OAAOA,EAAE,QAAQ,KAAK,GAAG,KAAKA,EAAE,MAAM,KAAK,EAAA;AAAA,EACtD;AAAA,EAEA,QAAgB;AACd,WAAOU;AAAA,MACL,KAAK,IAAI;AAAA,MACT,EAAE,SAAS,QAAQ,KAAK,WAAW,OAAO,QAAQ,MAAM,UAAA;AAAA,MACxD,KAAK,UAAA;AAAA,MACL,KAAK,IAAI;AAAA,IAAA;AAAA,EAEb;AAAA;AAAA,EAIQ,UAA4B;;AAClC,UAAMoI,KAAa5E,IAAA,KAAK,IAAI,QAAQ,iBAAjB,gBAAAA,EAA+B;AAClD,WAAI4E,KAAcA,EAAW,SAAeA,IAErC,CAAC,EAAE,OAAO,SAAS,QAAQ,IAAI;AAAA,EACxC;AAAA,EAEQ,WAAWpE,GAAmBqE,GAAoCC,IAAe,IAAY;AACnG,QAAID,KAAS,MAAM;AACjB,YAAME,IAAI,OAAOF,KAAU,WAAW,GAAGA,CAAK,OAAOA;AACrD,MAAArE,EAAK,MAAM,OAAO,OAAOuE,CAAC,IAC1BvE,EAAK,MAAM,QAAQuE;AAAA,IACrB,OAAWD,MACTtE,EAAK,MAAM,OAAO;AAAA,EAEtB;AAAA;AAAA,EAIA,QAAc;;AACZ,SAAK,SAASH,EAAG,OAAO,aAAa;AAGrC,UAAM2E,IAAe3E,EAAG,OAAO,qBAAqB;AACpD,SAAK,WAAW2E,KAAchF,IAAA,KAAK,IAAI,QAAQ,iBAAjB,gBAAAA,EAA+B,UAAS,OAAO,EAAK,KAC9EC,IAAA,KAAK,IAAI,QAAQ,iBAAjB,gBAAAA,EAA+B,UAAS,SAAM+E,EAAa,MAAM,OAAO;AAE5E,UAAMC,IAAe5E,EAAG,OAAO,qBAAqB;AACpD,IAAA4E,EAAa,MAAM,SAAS,GAAGZ,CAAM;AACrC,eAAWnF,KAAO,KAAK,WAAW;AAChC,YAAM2E,IAAOxD,EAAG,OAAO,gBAAgB;AACvC,WAAK,WAAWwD,GAAM3E,EAAI,KAAK,GAC/B2E,EAAK,cAAc3E,EAAI,UAAU,IACjC+F,EAAa,YAAYpB,CAAI;AAAA,IAC/B;AACA,SAAK,eAAexD,EAAG,OAAO,qBAAqB,GACnD,KAAK,eAAeA,EAAG,OAAO,qBAAqB,GACnD,KAAK,aAAa,YAAY,KAAK,YAAY,GAC/C2E,EAAa,OAAOC,GAAc,KAAK,YAAY;AAGnD,UAAMC,IAAW7E,EAAG,OAAO,iBAAiB;AAC5C,SAAK,WAAWA,EAAG,OAAO,iBAAiB,GAC3C,KAAK,SAAS,MAAM,SAAS,GAAGgE,CAAM,MACtC,KAAK,gBAAgB,KAAK,QAAQ,GAElC,KAAK,WAAWhE,EAAG,OAAO,iBAAiB;AAC3C,UAAMgD,IAAShD,EAAG,OAAO,mBAAmB;AAC5C,IAAAgD,EAAO,MAAM,QAAQ,GAAG,KAAK,KAAK,MAClC,KAAK,UAAUhD,EAAG,OAAO,eAAe,GACxC,KAAK,kBAAkB,KAAK,OAAO,GACnC,KAAK,SAASA,EAAG,OAAO,YAAY,GACpCgD,EAAO,OAAO,KAAK,SAAS,KAAK,MAAM,GACvC,KAAK,SAAS,YAAYA,CAAM,GAChC6B,EAAS,OAAO,KAAK,UAAU,KAAK,QAAQ,GAE5C,KAAK,OAAO,OAAOF,GAAcE,CAAQ,GACzC,KAAK,KAAK,YAAY,KAAK,MAAM,GAGjC,KAAK,WAAW,MAAM;AACpB,MAAI,KAAK,gBAAgB,KAAK,kBAAe,aAAa,YAAY,KAAK,SAAS,YAChF,KAAK,YAAY,KAAK,kBAAe,SAAS,aAAa,KAAK,SAAS;AAAA,IAC/E,GACA,KAAK,SAAS,iBAAiB,UAAU,KAAK,UAAU,EAAE,SAAS,IAAM,GAEzE,KAAK,SAAA;AAAA,EACP;AAAA,EAEQ,gBAAgB3B,GAAyB;AAC/C,UAAM4B,IAAQ9E,EAAG,OAAO,YAAY;AACpC,IAAA8E,EAAM,MAAM,QAAQ,GAAG,KAAK,KAAK;AACjC,UAAMnE,IAAO,KAAK,IAAI;AACtB,aAAS5E,IAAI4E,EAAK,KAAK5E,KAAK4E,EAAK,KAAK5E,KAAK4E,EAAK,eAAe;AAC7D,YAAME,IAAQb,EAAG,OAAO,kBAAkB;AAC1C,MAAAa,EAAM,MAAM,OAAO,IAAI9E,IAAI4E,EAAK,OAAO,KAAK,WAAW,MACvDE,EAAM,cAAc7E,EAAcD,CAAC,GACnC+I,EAAM,YAAYjE,CAAK;AAAA,IACzB;AACA,IAAAqC,EAAK,YAAY4B,CAAK;AAAA,EACxB;AAAA,EAEQ,kBAAkBC,GAA4B;AACpD,UAAMpE,IAAO,KAAK,IAAI;AACtB,aAAS5E,IAAI4E,EAAK,KAAK5E,KAAK4E,EAAK,KAAK5E,KAAK4E,EAAK,eAAe;AAC7D,YAAMI,IAAOf,EAAG,OAAO,aAAa;AACpC,MAAAe,EAAK,MAAM,OAAO,IAAIhF,IAAI4E,EAAK,OAAO,KAAK,WAAW,MACtDoE,EAAQ,YAAYhE,CAAI;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA,EAIA,eAAqB;AACnB,SAAK,SAAA;AAAA,EACP;AAAA;AAAA,EAGA,kBAAwB;AACtB,IAAK,KAAK,gBACV,KAAK,aACF,iBAA8B,uCAAuC,EACrE,QAAQ,CAACiE,MAAQ;AAChB,YAAM/B,IAAW,KAAK,IAAI,UAAU,IAAI+B,EAAI,QAAQ,cAAc,EAAE;AACpE,UAAK/B,GACL;AAAA,QAAA+B,EAAI,YAAY;AAChB,mBAAWnG,KAAO,KAAK,WAAW;AAChC,gBAAM2E,IAAOxD,EAAG,OAAO,gBAAgB;AACvC,eAAK,WAAWwD,GAAM3E,EAAI,KAAK,GAC/B,KAAK,iBAAiB2E,GAAM3E,GAAKoE,CAAQ,GACzC+B,EAAI,YAAYxB,CAAI;AAAA,QACtB;AAAA;AAAA,IACF,CAAC;AAAA,EACL;AAAA;AAAA,EAGQ,WAAiB;AACvB,QAAI,CAAC,KAAK,gBAAgB,CAAC,KAAK,OAAQ;AACxC,SAAK,aAAa,YAAY,IAC9B,KAAK,OAAO,YAAY;AAExB,UAAME,IAAQ,KAAK,MAAA,GACbd,IAAS,KAAK,IAAI,UAAU,QAAA,GAC5BqC,IAAmBrC,EAAO,SAAS,KAAKA,EAAO,KAAK,CAACE,MAAMA,EAAE,UAAU,IAAI;AAEjF,eAAWO,KAAUT,GAAQ;AAC3B,MAAIqC,KAAoB5B,EAAO,UAAU,QACvC,KAAK,eAAeA,EAAO,KAAK;AAElC,iBAAWJ,KAAYI,EAAO,WAAW;AACvC,cAAMjF,IAAS,KAAK,IAAI,OAAO,QAAQsF,EAAM,OAAOA,EAAM,KAAKT,EAAS,EAAE;AAC1E,aAAK,kBAAkBA,GAAU7E,CAAM;AAAA,MACzC;AAAA,IACF;AAEA,SAAK,mBAAA;AAAA,EACP;AAAA,EAEQ,eAAeyC,GAAqB;AAC1C,UAAM/C,IAAIkC,EAAG,OAAO,oCAAoC;AACxD,IAAAlC,EAAE,MAAM,SAAS,GAAGmG,CAAO,MAC3BnG,EAAE,cAAc+C,GAChB,KAAK,aAAc,YAAY/C,CAAC;AAEhC,UAAMlC,IAAIoE,EAAG,OAAO,8BAA8B;AAClD,IAAApE,EAAE,MAAM,SAAS,GAAGqI,CAAO,MAC3B,KAAK,OAAQ,YAAYrI,CAAC;AAAA,EAC5B;AAAA,EAEQ,kBAAkBqH,GAAuB7E,GAA0B;AACzE,UAAM6C,IAAS9C,EAAWC,CAAM,GAC1B8G,IAASjE,EAAO,OAAO,CAACzE,GAAK0E,MAAM,KAAK,IAAI1E,GAAK0E,EAAE,IAAI,GAAG,CAAC,GAG3DiE,IAAY,KAAK,IAAI,QAAQ,kBAAkBjB,GAC/CkB,IAAOF,IAASC,IAAY,IAAIhB,GAChCkB,IAASF,GAGTG,IAAOtF,EAAG,OAAO,oBAAoB;AAC3C,IAAAsF,EAAK,MAAM,SAAS,GAAGF,CAAI,MAC3BE,EAAK,QAAQ,aAAarC,EAAS;AACnC,eAAWpE,KAAO,KAAK,WAAW;AAChC,YAAM2E,IAAOxD,EAAG,OAAO,gBAAgB;AACvC,WAAK,WAAWwD,GAAM3E,EAAI,KAAK,GAC/B,KAAK,iBAAiB2E,GAAM3E,GAAKoE,CAAQ,GACzCqC,EAAK,YAAY9B,CAAI;AAAA,IACvB;AACA,SAAK,aAAc,YAAY8B,CAAI;AAGnC,UAAMC,IAAOvF,EAAG,OAAO,WAAW;AAClC,IAAAuF,EAAK,MAAM,SAAS,GAAGH,CAAI,MAC3BG,EAAK,QAAQ,aAAatC,EAAS;AACnC,UAAMtC,IAAO,KAAK,IAAI;AACtB,eAAWO,KAAKD,GAAQ;AACtB,YAAMtC,IAAKuC,EAAE,OACPC,IAAWjF,EAAWyC,EAAG,KAAK;AACpC,UAAIyC,IAASlF,EAAWyC,EAAG,GAAG;AAC9B,MAAIyC,KAAUD,MAAUC,IAAST,EAAK;AACtC,YAAMU,IAAWjB,EAAMe,GAAUR,EAAK,KAAKA,EAAK,GAAG,GAC7CW,IAASlB,EAAMgB,GAAQT,EAAK,KAAKA,EAAK,GAAG;AAC/C,UAAIW,KAAUX,EAAK,OAAOU,KAAYV,EAAK,IAAK;AAEhD,YAAM6E,KAAKnE,IAAWV,EAAK,OAAO,KAAK,aACjC+D,IAAI,KAAK,IAAIL,IAAc/C,IAASD,KAAY,KAAK,WAAW,GAChEE,IAAM4C,IAAMjD,EAAE,MAAMmE,GAEpB1D,IAAM3B,EAAG,OAAO,sBAAsB;AAC5C,MAAA2B,EAAI,QAAQ,UAAUhD,EAAG,IACzBgD,EAAI,MAAM,OAAO,GAAG6D,CAAC,MACrB7D,EAAI,MAAM,QAAQ,GAAG,KAAK,IAAI+C,GAAG,KAAK,QAAQc,CAAC,CAAC,MAChD7D,EAAI,MAAM,MAAM,GAAGJ,CAAG,MACtBI,EAAI,MAAM,SAAS,GAAG0D,IAAS,CAAC,MAC5B1G,EAAG,SAAOgD,EAAI,MAAM,YAAY,iBAAiBhD,EAAG,KAAK,GACzDA,EAAG,aAAWgD,EAAI,MAAM,YAAY,iBAAiBhD,EAAG,SAAS,GACrEgD,EAAI,YAAY,KAAK,IAAI,mBAAmBhD,CAAE,CAAC,GAC/C,KAAK,QAAQgD,GAAKhD,CAAE,GACpB4G,EAAK,YAAY5D,CAAG,GACpB,KAAK,IAAI,eAAehD,GAAIgD,CAAG;AAAA,IACjC;AACA,SAAK,cAAc4D,GAAMtC,CAAQ,GACjC,KAAK,OAAQ,YAAYsC,CAAI;AAAA,EAC/B;AAAA;AAAA,EAIQ,OAAOxF,GAAuB;AACpC,WAAO,KAAK,IAAI,KAAK,QAAQ,KAAK,EAAE,IAAIA,GAAQ,QAAQ;AAAA,EAC1D;AAAA,EAEQ,UAAU0F,GAAyB;AACzC,UAAM/D,IAAO,KAAK,OAAQ,sBAAA;AAC1B,WAAO,KAAK,IAAI,KAAK,OAAO+D,IAAU/D,EAAK,QAAQ,KAAK;AAAA,EAC1D;AAAA;AAAA,EAGQ,MAAMQ,GAAmBP,GAAsC;AACrE,UAAMiC,IAAOjC,EAAI,MAAM;AACvB,IAAAA,EAAI,MAAM,gBAAgB;AAC1B,UAAMkC,IAAS,SAAS,iBAAiB3B,EAAM,SAASA,EAAM,OAAO;AACrE,WAAAP,EAAI,MAAM,gBAAgBiC,IAClBC,KAAA,gBAAAA,EAAQ,QAAQ,oCAA0D;AAAA,EACpF;AAAA,EAEQ,aAAa3B,GAAmBP,GAAwB;;AAC9D,SAAK,eAAA,IACLhC,IAAA,KAAK,MAAMuC,GAAOP,CAAG,MAArB,QAAAhC,EAAwB,UAAU,IAAI;AAAA,EACxC;AAAA,EAEQ,iBAAuB;;AAC7B,KAAAA,IAAA,KAAK,WAAL,QAAAA,EAAa,iBAAiB,mBAAmB,QAAQ,CAACqB,MAAMA,EAAE,UAAU,OAAO,gBAAgB;AAAA,EACrG;AAAA,EAEQ,QAAQW,GAAkBhD,GAAoB;AAEpD,QADA,KAAK,IAAI,gBAAgBgD,GAAKhD,CAAE,GAC5B,CAAC,KAAK,IAAI,UAAU;AACtB,MAAAgD,EAAI,iBAAiB,SAAS,CAACC,MAAY,KAAK,IAAI,eAAejD,GAAIgD,GAAKC,CAAO,CAAC;AACpF;AAAA,IACF;AACA,IAAAD,EAAI,MAAM,SAAS;AAEnB,UAAM+D,IAAO1F,EAAG,OAAO,8BAA8B,GAC/C2F,IAAO3F,EAAG,OAAO,8BAA8B;AACrD,IAAA2B,EAAI,OAAO+D,GAAMC,CAAI,GACrBD,EAAK,iBAAiB,eAAe,CAACzG,MAAS,KAAK,YAAYA,GAAM0C,GAAKhD,GAAI,OAAO,CAAC,GACvFgH,EAAK,iBAAiB,eAAe,CAAC1G,MAAS,KAAK,YAAYA,GAAM0C,GAAKhD,GAAI,KAAK,CAAC,GAErFgD,EAAI,iBAAiB,eAAe,CAAC1C,MAAS;AAE5C,UADIA,EAAK,WAAW,KACfA,EAAK,OAAuB,QAAQ,mBAAmB,EAAG;AAC/D,MAAAA,EAAK,eAAA;AACL,YAAM0B,IAAO,KAAK,IAAI,MAChBmB,IAASnD,EAAG,IAAI,KAAKA,EAAG,OAAO,QAAQ,GACvCoD,IAAe7F,EAAWyC,EAAG,KAAK,GAClCqD,IAAU,KAAK,UAAU/C,EAAK,OAAO,GACrC6E,IAAa,CAAC2B,MAClBrF;AAAA,QACEN,EAAKiC,KAAgB,KAAK,UAAU0D,CAAO,IAAIzD,IAAUrB,EAAK,QAAQ;AAAA,QACtEA,EAAK;AAAA,QACLA,EAAK,MAAMmB;AAAA,MAAA;AAEf,MAAA9C,EAAUC,GAAM;AAAA,QACd,SAAS,MAAM0C,EAAI,UAAU,IAAI,aAAa;AAAA,QAC9C,QAAQ,CAAC,EAAE,OAAAO,QAAY;AACrB,UAAAP,EAAI,MAAM,OAAO,IAAImC,EAAW5B,EAAM,OAAO,IAAIvB,EAAK,OAAO,KAAK,WAAW,MAC7E,KAAK,aAAauB,GAAOP,CAAG;AAAA,QAC9B;AAAA,QACA,OAAO,CAAC,EAAE,OAAAQ,GAAO,OAAAD,QAAY;AAG3B,cAFAP,EAAI,UAAU,OAAO,aAAa,GAClC,KAAK,eAAA,GACD,CAACQ,GAAO;AACV,iBAAK,IAAI,eAAexD,GAAIgD,GAAKO,CAAK;AACtC;AAAA,UACF;AACA,gBAAM8C,IAAM,KAAK,MAAM9C,GAAOP,CAAG,GAC3BoC,IAAciB,IAAOA,EAAI,QAAQ,cAAc,OAAQrG,EAAG,YAC1DyD,IAAW,KAAK,OAAO0B,EAAW5B,EAAM,OAAO,CAAC;AACtD,eAAK,IAAI,kBAAkBvD,GAAIyD,GAAUA,EAAS,IAAIN,GAAQ,QAAQ,GAAGiC,CAAW;AAAA,QACtF;AAAA,MAAA,CACD;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEQ,YAAY9E,GAAkB0C,GAAkBhD,GAAciH,GAA6B;AACjG,QAAI3G,EAAK,WAAW,EAAG;AACvB,IAAAA,EAAK,gBAAA,GACLA,EAAK,eAAA;AACL,UAAM0B,IAAO,KAAK,IAAI,MAChBkF,IAAW,CAACJ,MAAoBrF,EAAMN,EAAK,KAAK,UAAU2F,CAAO,GAAG9E,EAAK,QAAQ,GAAGA,EAAK,KAAKA,EAAK,GAAG;AAC5G,IAAA3B,EAAUC,GAAM;AAAA,MACd,SAAS,MAAM0C,EAAI,UAAU,IAAI,aAAa;AAAA,MAC9C,QAAQ,CAAC,EAAE,OAAAO,QAAY;AACrB,cAAMnG,IAAI8J,EAAS3D,EAAM,OAAO;AAChC,YAAI0D,MAAS,OAAO;AAClB,gBAAMtE,IAAS,KAAK,IAAIvF,GAAGG,EAAWyC,EAAG,KAAK,IAAIgC,EAAK,QAAQ;AAC/D,UAAAgB,EAAI,MAAM,QAAQ,IAAIL,IAASpF,EAAWyC,EAAG,KAAK,KAAK,KAAK,WAAW;AAAA,QACzE,OAAO;AACL,gBAAM0C,IAAW,KAAK,IAAItF,GAAGG,EAAWyC,EAAG,GAAG,IAAIgC,EAAK,QAAQ;AAC/D,UAAAgB,EAAI,MAAM,OAAO,IAAIN,IAAWV,EAAK,OAAO,KAAK,WAAW,MAC5DgB,EAAI,MAAM,QAAQ,IAAIzF,EAAWyC,EAAG,GAAG,IAAI0C,KAAY,KAAK,WAAW;AAAA,QACzE;AAAA,MACF;AAAA,MACA,OAAO,CAAC,EAAE,OAAAc,GAAO,OAAAD,QAAY;AAE3B,YADAP,EAAI,UAAU,OAAO,aAAa,GAC9B,CAACQ,EAAO;AACZ,cAAMpG,IAAI8J,EAAS3D,EAAM,OAAO;AAChC,YAAI0D,MAAS,OAAO;AAClB,gBAAMtE,IAAS,KAAK,IAAIvF,GAAGG,EAAWyC,EAAG,KAAK,IAAIgC,EAAK,QAAQ;AAC/D,eAAK,IAAI,kBAAkBhC,GAAIA,EAAG,OAAO,KAAK,OAAO2C,CAAM,GAAG3C,EAAG,UAAU;AAAA,QAC7E,OAAO;AACL,gBAAM0C,IAAW,KAAK,IAAItF,GAAGG,EAAWyC,EAAG,GAAG,IAAIgC,EAAK,QAAQ;AAC/D,eAAK,IAAI,kBAAkBhC,GAAI,KAAK,OAAO0C,CAAQ,GAAG1C,EAAG,KAAKA,EAAG,UAAU;AAAA,QAC7E;AAAA,MACF;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EAEQ,cAAc4G,GAAmBtC,GAA6B;AACpE,IAAK,KAAK,IAAI,cACdsC,EAAK,iBAAiB,eAAe,CAACtG,MAAS;AAE7C,UADIA,EAAK,WAAW,KACfA,EAAK,OAAuB,QAAQ,WAAW,EAAG;AACvD,MAAAA,EAAK,eAAA;AACL,YAAM0B,IAAO,KAAK,IAAI,MAChB2B,IAASlC,EAAMN,EAAK,KAAK,UAAUb,EAAK,OAAO,GAAG0B,EAAK,QAAQ,GAAGA,EAAK,KAAKA,EAAK,GAAG,GACpF4B,IAAMvC,EAAG,OAAO,4BAA4B;AAClD,MAAAuF,EAAK,YAAYhD,CAAG;AACpB,YAAMN,IAAQ,CAACwD,MAAoB;AACjC,cAAMjD,IAAMpC,EAAMN,EAAK,KAAK,UAAU2F,CAAO,GAAG9E,EAAK,QAAQ,GAAGA,EAAK,KAAKA,EAAK,GAAG,GAC5EN,IAAK,KAAK,IAAIiC,GAAQE,CAAG,GACzBlC,IAAK,KAAK,IAAIgC,GAAQE,CAAG;AAC/B,QAAAD,EAAI,MAAM,OAAO,IAAIlC,IAAKM,EAAK,OAAO,KAAK,WAAW,MACtD4B,EAAI,MAAM,QAAQ,IAAIjC,IAAKD,KAAM,KAAK,WAAW;AAAA,MACnD;AACA,MAAArB,EAAUC,GAAM;AAAA,QACd,QAAQ,CAAC,EAAE,OAAAiD,QAAYD,EAAMC,EAAM,OAAO;AAAA,QAC1C,OAAO,CAAC,EAAE,OAAAC,GAAO,OAAAD,QAAY;AAE3B,cADAK,EAAI,OAAA,GACA,CAACJ,EAAO;AACZ,gBAAMK,IAAMpC,EAAMN,EAAK,KAAK,UAAUoC,EAAM,OAAO,GAAGvB,EAAK,QAAQ,GAAGA,EAAK,KAAKA,EAAK,GAAG;AACxF,cAAIN,IAAK,KAAK,IAAIiC,GAAQE,CAAG,GACzBlC,IAAK,KAAK,IAAIgC,GAAQE,CAAG;AAE7B,UADIlC,KAAMD,MAAIC,IAAK,KAAK,IAAID,IAAKM,EAAK,UAAUA,EAAK,GAAG,IACpD,EAAAL,KAAMD,MACV,KAAK,IAAI,aAAa,KAAK,OAAOA,CAAE,GAAG,KAAK,OAAOC,CAAE,GAAG2C,GAAUf,CAAK;AAAA,QACzE;AAAA,MAAA,CACD;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEQ,iBAAiBsB,GAAmB3E,GAAqBoE,GAA6B;AAC5F,QAAIpE,EAAI,QAAQ;AACd,YAAMiH,IAAMjH,EAAI,OAAOoE,CAAQ;AAC/B,MAAI,OAAO6C,KAAQ,WAAUtC,EAAK,YAAYsC,IACzCtC,EAAK,YAAYsC,CAAG;AACzB;AAAA,IACF;AAEA,SAAKjH,EAAI,UAAU,WAAW,CAACA,EAAI,UAAU,KAAK,IAAI,QAAQ,gBAAgB;AAC5E,YAAMiH,IAAM,KAAK,IAAI,QAAQ,eAAe7C,CAAQ;AACpD,MAAI,OAAO6C,KAAQ,WAAUtC,EAAK,YAAYsC,IACzCtC,EAAK,YAAYsC,CAAG;AACzB;AAAA,IACF;AACA,UAAMvK,IAAQsD,EAAI,QAAQoE,EAAS,IAAIpE,EAAI,KAAK,IAAIoE,EAAS;AAC7D,IAAAO,EAAK,cAAcjI,KAAS,OAAO,OAAOA,CAAK,IAAI;AAAA,EACrD;AAAA,EAEQ,qBAA2B;;AAEjC,SADAqE,KAAAD,IAAA,KAAK,YAAL,gBAAAA,EAAc,cAAc,kBAA5B,QAAAC,EAA2C,UACvC,CAAC,KAAK,IAAI,QAAQ,gBAAgB,CAAC,KAAK,QAAS;AACrD,UAAM6C,IAAM,KAAK,IAAI,IAAA;AACrB,QAAI,CAACA,EAAI,OAAO,KAAK,IAAI,MAAM,KAAK,EAAG;AACvC,UAAM9B,IAAO,KAAK,IAAI,MAChB+B,IAAKxG,EAAWuG,CAAG;AACzB,QAAIC,IAAK/B,EAAK,OAAO+B,IAAK/B,EAAK,IAAK;AACpC,UAAMI,IAAOf,EAAG,OAAO,WAAW;AAClC,IAAAe,EAAK,MAAM,OAAO,IAAI2B,IAAK/B,EAAK,OAAO,KAAK,WAAW,MACvD,KAAK,QAAQ,YAAYI,CAAI;AAAA,EAC/B;AAAA,EAEA,UAAgB;;AACd,IAAI,KAAK,cAAUpB,IAAA,KAAK,aAAL,QAAAA,EAAe,oBAAoB,UAAU,KAAK,aACrEC,IAAA,KAAK,WAAL,QAAAA,EAAa,UACb,KAAK,SAAS,QACd,KAAK,eAAe,QACpB,KAAK,eAAe,QACpB,KAAK,WAAW,QAChB,KAAK,WAAW,QAChB,KAAK,SAAS,QACd,KAAK,UAAU,QACf,KAAK,WAAW;AAAA,EAClB;AACF;AC9bA,MAAMmG,IAAyB;AAAA,EAC7B,MAAM;AAAA,EACN,SAAS,EAAE,OAAO,SAAS,MAAM,KAAK,MAAM,IAAA;AAAA,EAC5C,YAAY,EAAE,OAAO,SAAS,MAAM,YAAY,MAAM,OAAA;AACxD,GAEMC,IAAiC,EAAE,OAAO,IAAI,QAAQ,SAAS,KAAK,kBAAA;AAQnE,MAAMC,EAAS;AAAA,EAYpB,YAAYjG,GAAiBkG,IAA2B,IAAI;AAJ5D,SAAQ,WAAwB,MAChC,KAAQ,SAA6B,MACrC,KAAQ,UAA8B,MAuNtC,KAAQ,0BAA0B,IApNhC,KAAK,KAAKlG,GACV,KAAK,UAAUkG,GACf,KAAK,SAAS,IAAIrJ,EAAWqJ,EAAQ,QAAQ,GAC7C,KAAK,YAAY,IAAI7I;AAAA,MACnB6I,EAAQ,sBAAsB;AAAA,MAC9BA,EAAQ,iBAAiB;AAAA,IAAA,GAE3B,KAAK,QAAQA,EAAQ,QAAQ,OAC7B,KAAK,QAAQA,EAAQ,OAAO5K,EAAK4K,EAAQ,MAAMA,EAAQ,QAAQ,IAAIxK,EAAMwK,EAAQ,QAAQ,GACrF,MAAM,QAAQA,EAAQ,SAAS,KAAG,KAAK,UAAU,IAAIA,EAAQ,SAAS,GACtE,MAAM,QAAQA,EAAQ,MAAM,KAAG,KAAK,OAAO,IAAIA,EAAQ,MAAM;AAAA,EACnE;AAAA;AAAA,EAIA,IAAI,KAAyB;AAC3B,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,IAAI,OAAc;AAChB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,OAAiB;AACnB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,OAAiB;AACnB,WAAO5J,EAAU,KAAK,QAAQ,IAAI;AAAA,EACpC;AAAA,EAEA,IAAI,SAAiB;AACnB,UAAM6J,IAAI,KAAK,QAAQ;AACvB,WAAKA,IACD,OAAOA,KAAM,WAAiB,EAAE,GAAGJ,GAAgB,MAAMI,EAAA,IACtD;AAAA,MACL,GAAGJ;AAAA,MACH,GAAGI;AAAA,MACH,SAAS,EAAE,GAAGJ,EAAe,SAAS,GAAGI,EAAE,QAAA;AAAA,MAC3C,YAAY,EAAE,GAAGJ,EAAe,YAAY,GAAGI,EAAE,WAAA;AAAA,IAAW,IAN/CJ;AAAA,EAQjB;AAAA,EAEA,IAAI,WAAmB;AACrB,WAAO,KAAK,OAAO,YAAY,KAAK,QAAQ,YAAY;AAAA,EAC1D;AAAA;AAAA,EAGA,IAAI,cAAqB;;AACvB,aAAOpG,IAAA,KAAK,aAAL,gBAAAA,EAAe,QAAQ,UAAS,KAAK,MAAM,QAAQ,KAAK;AAAA,EACjE;AAAA;AAAA,EAGA,IAAI,YAAmB;;AACrB,aAAOA,IAAA,KAAK,aAAL,gBAAAA,EAAe,QAAQ,QAAO,KAAK,MAAM,MAAM,KAAK;AAAA,EAC7D;AAAA;AAAA,EAGA,UAAoE;AAClE,WAAO,EAAE,MAAM,KAAK,OAAO,aAAa,KAAK,aAAa,WAAW,KAAK,UAAA;AAAA,EAC5E;AAAA,EAEQ,cAAuB;AAC7B,UAAMlE,IAAI,KAAK,QAAQ;AACvB,WAAIA,MAAM,SAAkB,KACrB,OAAOA,KAAM,aAAaA,EAAE,KAAK,KAAK,IAAIA;AAAA,EACnD;AAAA,EAEA,IAAI,WAAoB;AACtB,WAAO,KAAK,QAAQ,aAAa;AAAA,EACnC;AAAA,EAEA,IAAI,aAAsB;AACxB,WAAO,KAAK,QAAQ,eAAe;AAAA,EACrC;AAAA,EAEA,MAAa;AACX,WAAOC,EAAM,KAAK,EAAE;AAAA,EACtB;AAAA;AAAA,EAIA,SAAe;AACb,gBAAK,GAAG,UAAU,IAAI,IAAI,GAC1B,KAAK,GAAG,YAAY,IAChB,KAAK,QAAQ,UAAU,SACzB,KAAK,GAAG,MAAM,SACZ,OAAO,KAAK,QAAQ,UAAW,WAAW,GAAG,KAAK,QAAQ,MAAM,OAAO,KAAK,QAAQ,SAExF,KAAK,cAAA,GACL,KAAK,SAAS,SAAS,cAAc,KAAK,GAC1C,KAAK,OAAO,YAAY,WACxB,KAAK,GAAG,YAAY,KAAK,MAAM,GAC/B,KAAK,UAAA,GACA,KAAK,OAAA,GACH;AAAA,EACT;AAAA,EAEA,UAAgB;;AACd,KAAAiE,IAAA,KAAK,aAAL,QAAAA,EAAe,WACf,KAAK,WAAW,MAChB,KAAK,GAAG,YAAY,IACpB,KAAK,GAAG,UAAU,OAAO,IAAI;AAAA,EAC/B;AAAA;AAAA,EAIQ,WAAWyG,GAAsB;AACvC,UAAM1F,IAAO,KAAK;AAClB,QAAI,CAACA,EAAM,OAAM,IAAI,MAAM,6DAA6D;AACxF,YAAQ0F,GAAA;AAAA,MACN,KAAK;AACH,eAAO,IAAI5F,EAAQ,MAAME,CAAI;AAAA,MAC/B,KAAK;AACH,eAAO,IAAIiC,EAAgB,MAAMjC,CAAI;AAAA,MACvC,KAAK;AACH,eAAO,IAAI4D,EAAa,MAAM5D,CAAI;AAAA,MACpC;AACE,cAAM,IAAI,MAAM,kCAAkC,OAAO0F,CAAI,CAAC,EAAE;AAAA,IAAA;AAAA,EAEtE;AAAA,EAEQ,YAAkB;;AACxB,IAAK,KAAK,YACVzG,IAAA,KAAK,aAAL,QAAAA,EAAe,WACf,KAAK,OAAO,YAAY,IACxB,KAAK,WAAW,KAAK,WAAW,KAAK,KAAK,GAC1C,KAAK,SAAS,MAAA,GACd,KAAK,OAAO,UAAU,OAAO,aAAa,KAAK,aAAa,GAC5D,KAAK,YAAA,GACL,KAAK,aAAA;AAAA,EACP;AAAA,EAEA,WAAWyG,GAAsB;AAC/B,SAAK,QAAQA,GACb,KAAK,UAAA,GACA,KAAK,OAAA;AAAA,EACZ;AAAA;AAAA,EAIA,SAASC,GAAmC;AAC1C,SAAK,QAAQ/K,EAAK+K,GAAuB,KAAK,EAAE,GAChD,KAAK,UAAA,GACA,KAAK,OAAA;AAAA,EACZ;AAAA,EAEA,QAAc;AACZ,SAAK,SAAS,KAAK,KAAK;AAAA,EAC1B;AAAA,EAEA,OAAa;AACX,SAAK,SAAS,KAAK,MAAM,SAAS,GAAG,KAAK,CAAC;AAAA,EAC7C;AAAA,EAEA,OAAa;AACX,SAAK,SAAS,KAAK,MAAM,IAAI,GAAG,KAAK,CAAC;AAAA,EACxC;AAAA;AAAA;AAAA,EAKA,MAAM,SAAwB;AAC5B,IAAI,OAAO,KAAK,QAAQ,aAAc,eACpC,MAAM,KAAK,iBAAA,GACX,KAAK,UAAA,IAEP,MAAM,KAAK,cAAA;AAAA,EACb;AAAA,EAEA,MAAc,mBAAkC;;AAC9C,UAAMC,IAAM,KAAK,QAAQ;AACzB,QAAI,OAAOA,KAAQ,WAAY;AAC/B,UAAM5C,KAAQ/D,IAAA,KAAK,aAAL,gBAAAA,EAAe;AAC7B,IAAK+D,KACL,KAAK,UAAU,IAAI,MAAM4C,EAAI5C,CAAK,CAAC;AAAA,EACrC;AAAA,EAEA,MAAM,gBAA+B;;AACnC,UAAM4C,IAAM,KAAK,QAAQ,QACnB5C,KAAQ/D,IAAA,KAAK,aAAL,gBAAAA,EAAe;AAC7B,IAAI,OAAO2G,KAAQ,cAAc5C,KAC/B,KAAK,OAAO,IAAI,MAAM4C,EAAI5C,CAAK,CAAC,IAElC6C,KAAA3G,IAAA,KAAK,SAAQ,gBAAb,QAAA2G,EAAA,KAAA3G,GAA2B,KAAK,OAAO,SACvC4G,IAAA,KAAK,aAAL,QAAAA,EAAe;AAAA,EACjB;AAAA,EAEA,SAAS1J,GAAgC;;AACvC,UAAM,IAAI,KAAK,OAAO,IAAIA,CAAK;AAC/B,YAAA6C,IAAA,KAAK,aAAL,QAAAA,EAAe,gBACR,KAAK,OAAO,CAAC;AAAA,EACtB;AAAA,EAEA,aAAaxC,GAAyC;AACpD,UAAM,IAAI,KAAK,OAAO,IAAIA,CAAE;AAC5B,WAAO,IAAI,KAAK,OAAO,CAAC,IAAI;AAAA,EAC9B;AAAA,EAEA,YAAwB;AACtB,WAAO,KAAK,OAAO,IAAA;AAAA,EACrB;AAAA,EAEA,eAA8B;AAC5B,WAAO,KAAK,UAAU,IAAA;AAAA,EACxB;AAAA,EAEA,gBAAgBA,GAA4C;AAC1D,UAAMW,IAAI,KAAK,UAAU,IAAIX,CAAE;AAC/B,WAAOW,IAAI,KAAK,eAAeA,CAAC,IAAI;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,yBAA+B;AACrC,IAAI,KAAK,4BACT,KAAK,0BAA0B,IAC/B,eAAe,MAAM;;AACnB,WAAK,0BAA0B,KAC3B6B,IAAA,KAAK,aAAL,QAAAA,EAAe,kBAAiB,KAAK,SAAS,gBAAA,KAC7CC,IAAA,KAAK,aAAL,QAAAA,EAAe;AAAA,IACtB,CAAC;AAAA,EACH;AAAA,EAEQ,eAAe9B,GAAgC;AACrD,WAAO;AAAA,MACL,IAAIA,EAAE;AAAA,MACN,UAAUA;AAAA,MACV,iBAAiB,CAACF,GAAKrC,MAAU;AAC/B,QAAAuC,EAAE,cAAcF,CAAG,IAAIrC,GACvB,KAAK,uBAAA;AAAA,MACP;AAAA,MACA,SAAS,CAACqC,GAAKrC,MAAU;AACvB,QAAIqC,MAAQ,UAASE,EAAE,QAAQvC,MACxB,QAAQA,GACf,KAAK,uBAAA;AAAA,MACP;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEQ,OAAO2B,GAA0B;AACvC,WAAO;AAAA,MACL,IAAIA,EAAE;AAAA,MACN,OAAOA;AAAA,MACP,QAAQ,MAAM;;AACZ,aAAK,OAAO,OAAOA,EAAE,EAAE,IACvByC,IAAA,KAAK,aAAL,QAAAA,EAAe;AAAA,MACjB;AAAA,MACA,iBAAiB,CAAC/B,GAAKrC,MAAU;;AAC/B,QAAA2B,EAAE,cAAcU,CAAG,IAAIrC,IACvBoE,IAAA,KAAK,aAAL,QAAAA,EAAe;AAAA,MACjB;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA,EAKA,mBAAmBuC,GAA8B;;AAC/C,UAAMuE,IAAO,SAAS,cAAc,KAAK;AACzC,IAAAA,EAAK,YAAY;AACjB,UAAMhD,KAAS7D,KAAAD,IAAA,KAAK,SAAQ,gBAAb,gBAAAC,EAAA,KAAAD,GAA2BuC;AAC1C,WAAIuB,KAAU,OACR,OAAOA,KAAW,WAAUgD,EAAK,YAAYhD,IAC5CgD,EAAK,YAAYhD,CAAM,IAE5BgD,EAAK,YAAY,KAAK,oBAAoBvE,CAAK,CAAC,GAE3CuE;AAAA,EACT;AAAA,EAEQ,oBAAoBvE,GAA8B;AACxD,UAAMwE,IAAO,SAAS,cAAc,KAAK;AACzC,IAAAA,EAAK,YAAY;AACjB,UAAMC,IAAO,SAAS,cAAc,MAAM;AAC1C,IAAAA,EAAK,YAAY;AACjB,UAAMC,IAAM,KAAK,QAAQ,cAAc,EAAE,MAAM,WAAW,QAAQ,WAAW,QAAQ,GAAA;AACrF,IAAAD,EAAK,cAAcxK,EAAW+F,EAAM,OAAO0E,GAAK,KAAK,OAAO,QAAQ,KAAK,OAAO,MAAM,KAAK,EAAE;AAC7F,UAAMC,IAAQ,SAAS,cAAc,MAAM;AAC3C,WAAAA,EAAM,YAAY,kBAClBA,EAAM,cAAc3E,EAAM,OAC1BwE,EAAK,OAAOC,GAAME,CAAK,GAChBH;AAAA,EACT;AAAA;AAAA,EAIA,eAAexE,GAAiBlC,GAAiB4B,GAA2B;;AAC1E,KAAAhC,KAAAD,IAAA,KAAK,SAAQ,iBAAb,QAAAC,EAAA,KAAAD,GAA4B,EAAE,OAAAuC,GAAO,IAAAlC,GAAI,SAAA4B;EAC3C;AAAA,EAEA,eAAeM,GAAiBlC,GAAuB;;AACrD,KAAAJ,KAAAD,IAAA,KAAK,SAAQ,iBAAb,QAAAC,EAAA,KAAAD,GAA4B,EAAE,OAAAuC,GAAO,IAAAlC;EACvC;AAAA;AAAA,EAGA,gBAAgBA,GAAiBkC,GAAuB;AACtD,UAAM4E,IAAU,KAAK,QAAQ;AAC7B,IAAKA,KACL9G,EAAG,iBAAiB,eAAe,CAAC4B,MAAY;AAC9C,MAAAA,EAAQ,eAAA,GACRkF,EAAQ,EAAE,OAAA5E,GAAO,IAAAlC,GAAI,SAAA4B,EAAA,CAAS;AAAA,IAChC,CAAC;AAAA,EACH;AAAA;AAAA,EAGQ,gBAAyB;AAC/B,UAAMmF,IAAI,KAAK,QAAQ;AACvB,WAAIA,MAAM,SAAkB,KACrB,OAAOA,KAAM,aAAaA,EAAA,IAAMA;AAAA,EACzC;AAAA,EAEQ,aAAa7E,GAAiBnF,GAAcC,GAAYI,GAAoC;AAClG,WAAO,KAAK,OACT,IAAA,EACA;AAAA,MACC,CAACF,MACCA,EAAE,OAAOgF,EAAM,MACfhF,EAAE,eAAeE,KACjBF,EAAE,MAAM,SAASF,CAAG,KACpBE,EAAE,IAAI,QAAQH,CAAK;AAAA,IAAA;AAAA,EAE3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBACEmF,GACAnF,GACAC,GACAI,GACS;;AAGT,QADE8E,EAAM,MAAM,OAAOnF,CAAK,KAAKmF,EAAM,IAAI,OAAOlF,CAAG,KAAKkF,EAAM,eAAe9E;AAE3E,cAAAuC,IAAA,KAAK,aAAL,QAAAA,EAAe,gBACR;AAET,QAAI,CAAC,KAAK,cAAA,KAAmB,KAAK,aAAauC,GAAOnF,GAAOC,GAAKI,CAAU;AAC1E,cAAAwC,IAAA,KAAK,aAAL,QAAAA,EAAe,gBACR;AAET,UAAMoH,IAAqB,EAAE,GAAG9E,EAAA;AAChC,IAAAA,EAAM,QAAQnF,GACdmF,EAAM,MAAMlF,GACZkF,EAAM,aAAa9E,IACnBmJ,IAAA,KAAK,aAAL,QAAAA,EAAe;AACf,UAAMU,IAAS,MAAM;;AACnB,MAAA/E,EAAM,QAAQ8E,EAAS,OACvB9E,EAAM,MAAM8E,EAAS,KACrB9E,EAAM,aAAa8E,EAAS,aAC5BrH,IAAA,KAAK,aAAL,QAAAA,EAAe;AAAA,IACjB;AACA,YAAAuH,KAAAV,IAAA,KAAK,SAAQ,kBAAb,QAAAU,EAAA,KAAAV,GAA6B,EAAE,OAAAtE,GAAO,UAAA8E,GAAU,QAAAC,MACzC;AAAA,EACT;AAAA;AAAA,EAGA,aAAalK,GAAcC,GAAYiG,GAA8BrB,GAA8B;;AACjG,WAAI,KAAK,QAAQ,eAAe,CAAC,KAAK,QAAQ,YAAY,EAAE,OAAA7E,GAAO,KAAAC,GAAK,UAAAiG,EAAA,CAAU,IAAU,OAC5FrD,KAAAD,IAAA,KAAK,SAAQ,aAAb,QAAAC,EAAA,KAAAD,GAAwB,EAAE,OAAA5C,GAAO,KAAAC,GAAK,UAAAiG,GAAU,SAAArB,MACzC;AAAA,EACT;AAAA;AAAA,EAIQ,gBAAsB;AAC5B,QAAI,KAAK,QAAQ,YAAY,GAAO;AACpC,UAAMuF,IAAM,KAAK,QAAQ,WAAWnB,GAC9BoB,IAAU,SAAS,cAAc,KAAK;AAC5C,IAAAA,EAAQ,YAAY;AACpB,eAAWC,KAAW,CAAC,SAAS,UAAU,KAAK,GAAY;AACzD,YAAMC,IAAM,SAAS,cAAc,KAAK;AACxC,MAAAA,EAAI,YAAY,iCAAiCD,CAAO;AACxD,YAAME,IAAOJ,EAAIE,CAAO;AACxB,UAAIE;AAGF,mBAAWC,KAASD,EAAK,MAAM,KAAK,EAAE,OAAO,OAAO,GAAG;AACrD,gBAAME,IAASD,EAAM,MAAM,GAAG,EAAE,OAAO,OAAO;AAC9C,cAAIC,EAAO,WAAW,KAAKA,EAAO,CAAC,MAAM,SAAS;AAChD,YAAAH,EAAI,YAAY,KAAK,mBAAmB,OAAO,CAAC;AAChD;AAAA,UACF;AACA,gBAAMI,IAAU,SAAS,cAAc,KAAK;AAC5C,UAAAA,EAAQ,YAAY;AACpB,qBAAWC,KAASF,EAAQ,CAAAC,EAAQ,YAAY,KAAK,mBAAmBC,CAAK,CAAC;AAC9E,UAAAL,EAAI,YAAYI,CAAO;AAAA,QACzB;AAEF,MAAAN,EAAQ,YAAYE,CAAG;AAAA,IACzB;AACA,SAAK,GAAG,YAAYF,CAAO;AAAA,EAC7B;AAAA,EAEQ,mBAAmBO,GAA4B;;AACrD,QAAIA,MAAU;AACZ,kBAAK,UAAU,SAAS,cAAc,IAAI,GAC1C,KAAK,QAAQ,YAAY,YAClB,KAAK;AAEd,UAAMC,IAAM,SAAS,cAAc,QAAQ;AAC3C,IAAAA,EAAI,OAAO,UACXA,EAAI,YAAY,UAChBA,EAAI,QAAQ,WAAWD;AACvB,UAAME,IAAS,KAAK,OAAO,WAAW,CAAA,GAChCC,IAAO,KAAK,OAAO,cAAc,CAAA;AACvC,QAAIH,MAAU;AACZ,MAAAC,EAAI,cAAcC,EAAO,SAAS,SAC9BC,EAAK,SAAOF,EAAI,aAAa,cAAcE,EAAK,KAAK,GACzDF,EAAI,UAAU,MAAM,KAAK,MAAA;AAAA,aAChBD,MAAU;AACnB,MAAAC,EAAI,cAAcC,EAAO,QAAQ,KACjCD,EAAI,aAAa,cAAcE,EAAK,QAAQ,UAAU,GACtDF,EAAI,UAAU,MAAM,KAAK,KAAA;AAAA,aAChBD,MAAU;AACnB,MAAAC,EAAI,cAAcC,EAAO,QAAQ,KACjCD,EAAI,aAAa,cAAcE,EAAK,QAAQ,MAAM,GAClDF,EAAI,UAAU,MAAM,KAAK,KAAA;AAAA,SACpB;AACL,YAAMnE,KAAS9D,IAAA,KAAK,QAAQ,YAAb,gBAAAA,EAAuBgI;AACtC,UAAIlE,GAAQ;AACV,YAAIA,EAAO,MAAM;AACf,gBAAMsE,IAAO,SAAS,cAAc,MAAM;AAC1C,UAAAA,EAAK,YAAYtE,EAAO,MACxBmE,EAAI,YAAYG,CAAI;AAAA,QACtB;AACA,QAAItE,EAAO,QAAMmE,EAAI,YAAY,SAAS,eAAenE,EAAO,IAAI,CAAC,GACrEmE,EAAI,UAAU,CAAChG,MAAY6B,EAAO,QAAQ7B,CAAO;AAAA,MACnD;AACE,QAAAgG,EAAI,cAAcD;AAAA,IAEtB;AACA,WAAOC;AAAA,EACT;AAAA,EAEQ,cAAoB;;AAC1B,IAAI,KAAK,YAAS,KAAK,QAAQ,gBAAcjI,IAAA,KAAK,aAAL,gBAAAA,EAAe,YAAW;AAAA,EACzE;AAAA,EAEQ,eAAqB;;AAC3B,UAAM7B,KAAI6B,IAAA,KAAK,aAAL,gBAAAA,EAAe;AACzB,IAAI7B,OAAGyI,KAAA3G,IAAA,KAAK,SAAQ,eAAb,QAAA2G,EAAA,KAAA3G,GAA0B,EAAE,OAAO9B,EAAE,OAAO,KAAKA,EAAE,KAAK,MAAM,KAAK;EAC5E;AACF;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ziix/calendar",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Framework-agnostic resource & time-grid calendar with day, resource-day and timeline views, drag/resize/select, grouping and timezone-correct rendering.",
5
5
  "type": "module",
6
6
  "license": "MIT",