@ziix/calendar 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,13 +1,15 @@
1
1
  # @ziix/calendar
2
2
 
3
- A framework-agnostic resource & time-grid calendar — a from-scratch, **license-free**
4
- replacement for the FullCalendar views DMS uses (`timeGridDay`, `resourceTimeGridDay`,
5
- `resourceTimeline`). No premium scheduler licence, no React/Vue/Preact dependency: a
6
- plain imperative class you drive through a ref from any framework.
3
+ By [ziix.eu](https://ziix.eu) · [npm](https://www.npmjs.com/package/@ziix/calendar)
7
4
 
8
- > **Status.** All three views (`day`, `resource-day`, `timeline`) and the full interaction
9
- > engine (drag/resize/select) are implemented and tested. Remaining work is polish, the DMS
10
- > migration and the npm release — see the roadmap below.
5
+ A framework-agnostic resource & time-grid calendar with three views **day**,
6
+ **resource-day** (resources as columns) and **timeline** (resources as rows) plus
7
+ drag/resize/select, resource grouping and timezone-correct rendering. No framework
8
+ dependency: a plain imperative class you drive through a ref from React, Preact, Vue,
9
+ Svelte or vanilla JS.
10
+
11
+ > **Status.** All three views and the full interaction engine (drag/resize/select) are
12
+ > implemented and tested, and the package is published on npm.
11
13
 
12
14
  ## Install
13
15
 
@@ -25,7 +27,7 @@ import '@ziix/calendar/styles.css'
25
27
 
26
28
  const cal = new Calendar(document.getElementById('calendar'), {
27
29
  view: 'day',
28
- timezone: 'Europe/Copenhagen', // events are placed in the shop's clock, not the browser's
30
+ timezone: 'Europe/Copenhagen', // events are placed in this timezone, not the browser's
29
31
  date: '2026-06-09',
30
32
  height: 780,
31
33
  slot: { duration: 15, min: '06:00', max: '19:00', labelInterval: 60 },
@@ -58,9 +60,8 @@ events: async ({ start, end }) => {
58
60
 
59
61
  ## Timeline view (resources as rows)
60
62
 
61
- This is the `resourceTimeline` replacement: a sticky resource area on the left and a
62
- horizontally-scrolling time grid on the right. Pass `resources` (array or function) and
63
- set `view: 'timeline'`.
63
+ A sticky resource area on the left and a horizontally-scrolling time grid on the right.
64
+ Pass `resources` (array or function) and set `view: 'timeline'`.
64
65
 
65
66
  ```js
66
67
  const cal = new Calendar(el, {
@@ -92,7 +93,7 @@ const cal = new Calendar(el, {
92
93
  { id: 1, title: 'Service', start: '...', end: '...', resourceId: 'E1' },
93
94
  ],
94
95
 
95
- // custom label for the default resource column (FullCalendar's resourceLabelContent)
96
+ // custom label for the default resource column
96
97
  renderResource: (resource) => `<strong>${resource.title}</strong>`,
97
98
 
98
99
  onEventClick: ({ event }) => openOrder(event.extendedProps.orderId),
@@ -105,8 +106,8 @@ grows to fit them. An event without a matching `resourceId` is not shown in the
105
106
 
106
107
  ### Resource-day view (resources as columns)
107
108
 
108
- `view: 'resource-day'` is the `resourceTimeGridDay` equivalent: the same vertical time axis
109
- as the day view, but with one column per resource under a sticky, grouped header. Takes the
109
+ `view: 'resource-day'` uses the same vertical time axis as the day view, but with one
110
+ column per resource under a sticky, grouped header. Takes the
110
111
  same `resources` / `resourceGroupField` / `renderResource` options as the timeline. With
111
112
  `editable`, dragging an event sideways moves it to another resource column.
112
113
 
@@ -181,7 +182,7 @@ const cal = new Calendar(el, {
181
182
 
182
183
  // false ⇒ a drop/resize that would overlap another event on the same resource is
183
184
  // rejected and snaps back. May be a function evaluated per drop.
184
- eventOverlap: () => shop.settings.calendar_overlap,
185
+ eventOverlap: () => settings.allowOverlap,
185
186
 
186
187
  // gate which ranges may be selected (e.g. only employee or rental-car rows)
187
188
  selectAllow: ({ resource }) => !!resource && /^[EC]/.test(resource.id),
@@ -233,8 +234,7 @@ working menu implementation.
233
234
 
234
235
  ## Imperative API
235
236
 
236
- The calendar is a plain class you drive through a ref — mirrors the surface FullCalendar
237
- consumers rely on:
237
+ The calendar is a plain class you drive through a ref:
238
238
 
239
239
  | Method | Purpose |
240
240
  | --- | --- |
@@ -252,13 +252,12 @@ consumers rely on:
252
252
 
253
253
  ### Real-time updates
254
254
 
255
- Drive incremental updates from a websocket without a full refetch (DMS uses Laravel Echo):
255
+ Drive incremental updates from a websocket without a full refetch:
256
256
 
257
257
  ```js
258
- echo.private(`shop.${id}`)
259
- .listen('.eventCreated', (e) => cal.addEvent(e.event))
260
- .listen('.eventUpdated', () => cal.refetchEvents())
261
- .listen('.eventRemoved', (e) => cal.getEventById(e.id)?.remove())
258
+ socket.on('event:created', (e) => cal.addEvent(e.event))
259
+ socket.on('event:updated', () => cal.refetchEvents())
260
+ socket.on('event:removed', (e) => cal.getEventById(e.id)?.remove())
262
261
  ```
263
262
 
264
263
  ### Using it from Preact / React
@@ -278,7 +277,7 @@ export function CalendarView({ shopId }) {
278
277
  useEffect(() => {
279
278
  const cal = new Calendar(elRef.current, {
280
279
  view: 'timeline',
281
- timezone: window.ziix.timezone,
280
+ timezone: 'Europe/Copenhagen',
282
281
  events: ({ start, end }) => fetchEvents(shopId, start, end),
283
282
  resources: () => fetchResources(shopId),
284
283
  onEventClick: ({ event }) => openOrder(event),
@@ -297,8 +296,7 @@ export function CalendarView({ shopId }) {
297
296
  The calendar renders almost no text of its own — column headers, resource labels and
298
297
  event content all come from **your** render hooks, so they're already in your language.
299
298
  The only built-in strings are the toolbar buttons, and the date in the title. Both are
300
- driven by the `locale` option — pass your app's translations there (DMS feeds its
301
- `trans()` values straight in):
299
+ driven by the `locale` option — pass your app's translations there:
302
300
 
303
301
  ```js
304
302
  const cal = new Calendar(el, {
@@ -306,8 +304,8 @@ const cal = new Calendar(el, {
306
304
  code: 'da',
307
305
  intl: 'da-DK', // BCP-47 tag used by Intl to format the title date
308
306
  firstDay: 1,
309
- buttons: { today: trans('e.today'), prev: '‹', next: '›' },
310
- ariaLabels: { today: trans('e.today'), prev: trans('e.prev'), next: trans('e.next') },
307
+ buttons: { today: t('today'), prev: '‹', next: '›' },
308
+ ariaLabels: { today: t('today'), prev: t('prev'), next: t('next') },
311
309
  },
312
310
  })
313
311
  ```
@@ -343,17 +341,22 @@ npm run typecheck # tsc --noEmit
343
341
  npm run build # dist/ziix-calendar.js + .css + index.d.ts
344
342
  ```
345
343
 
346
- ## Roadmap
344
+ ## Features
347
345
 
348
- | Fase | Scope | State |
349
- | --- | --- | --- |
350
- | 0 | Core: Calendar class, stores, datelib, toolbar, navigation, theming | ✅ |
351
- | 1 | `day` view: time axis, overlap packing, now indicator, event hooks | ✅ |
352
- | 3 | `timeline` view (resources as rows, horizontal axis, grouping, custom resource columns, event stacking) | ✅ |
353
- | 4 | Interaction engine: drag-move, resize, drag-select, overlap/allow gating | ✅ |
354
- | 2 | `resource-day` view (resources as columns, grouped header, cross-column move) | ✅ |
355
- | 5 | Locale pack, deep-link highlight, a11y polish | ⏳ |
346
+ - **Three views** `day`, `resource-day` (resources as columns) and `timeline`
347
+ (resources as rows, horizontal axis) with grouped resources and custom resource columns
348
+ - **Interaction** drag-move (incl. across resources), resize, drag-select, with
349
+ overlap and selection gating
350
+ - **Timezone-correct** rendering via dayjs; events placed in the configured timezone
351
+ - **Imperative API** drive it from any framework through a ref
352
+ - **Real-time friendly** add/update/remove events incrementally from a websocket
353
+ - **Themeable** via `--zc-*` custom properties; **translatable** via the `locale` option
354
+ - **Typed** — ships TypeScript declarations; one peer dependency (`dayjs`)
356
355
 
357
356
  ## License
358
357
 
359
358
  MIT
359
+
360
+ ---
361
+
362
+ Built by [ziix](https://ziix.eu).
package/dist/index.d.ts CHANGED
@@ -29,7 +29,7 @@ export declare class Calendar {
29
29
  get activeStart(): Dayjs;
30
30
  /** End of the currently-shown view range. */
31
31
  get activeEnd(): Dayjs;
32
- /** The active view's type and date window (parity with FullCalendar's `view`). */
32
+ /** The active view's type and date window. */
33
33
  getView(): {
34
34
  type: ViewType;
35
35
  activeStart: Dayjs;
@@ -204,7 +204,7 @@ export declare interface EventContextMenuInfo {
204
204
  jsEvent: MouseEvent;
205
205
  }
206
206
 
207
- /** Handle returned by addEvent/getEventById, mirroring the imperative API hosts rely on. */
207
+ /** Handle returned by addEvent/getEventById for imperative updates from outside. */
208
208
  export declare interface EventHandle {
209
209
  id: string;
210
210
  event: CalEvent;
@@ -308,7 +308,7 @@ export declare interface PackedEvent {
308
308
  /**
309
309
  * Pack events that share a single column (resource/day) into side-by-side
310
310
  * sub-columns so overlapping events never cover each other — the classic
311
- * interval-graph greedy colouring FullCalendar uses.
311
+ * interval-graph greedy colouring.
312
312
  *
313
313
  * Events are expected to already belong to the same column; callers filter by
314
314
  * resource first.
@@ -367,7 +367,7 @@ export declare class ResourceStore {
367
367
  * Resources in display order. With `resourceOrder: 'id'` they are sorted by a
368
368
  * natural id comparison (so 'E2' precedes 'E10'); with a numeric order field
369
369
  * they sort by it; otherwise the original input order is preserved (sort is
370
- * stable), matching FullCalendar's default.
370
+ * stable).
371
371
  */
372
372
  ordered(): CalResource[];
373
373
  /**
@@ -104,7 +104,7 @@ class X {
104
104
  * Resources in display order. With `resourceOrder: 'id'` they are sorted by a
105
105
  * natural id comparison (so 'E2' precedes 'E10'); with a numeric order field
106
106
  * they sort by it; otherwise the original input order is preserved (sort is
107
- * stable), matching FullCalendar's default.
107
+ * stable).
108
108
  */
109
109
  ordered() {
110
110
  return this.orderField === "id" ? [...this.list].sort((t, e) => t.id.localeCompare(e.id, void 0, { numeric: !0 })) : this.list.every((t) => t.order === 0) ? [...this.list] : [...this.list].sort((t, e) => t.order - e.order);
@@ -236,7 +236,7 @@ class F {
236
236
  }
237
237
  this.renderNowIndicator();
238
238
  }
239
- // ---- interaction (Fase 4) ------------------------------------------------
239
+ // ---- interaction ---------------------------------------------------------
240
240
  timeAt(t) {
241
241
  return this.cal.date.startOf("day").add(t, "minute");
242
242
  }
@@ -633,7 +633,7 @@ class q {
633
633
  }
634
634
  this.bindRowSelect(a, t), this.rowsEl.appendChild(a);
635
635
  }
636
- // ---- interaction (Fase 4) ------------------------------------------------
636
+ // ---- interaction ---------------------------------------------------------
637
637
  timeAt(t) {
638
638
  return this.cal.date.startOf("day").add(t, "minute");
639
639
  }
@@ -813,7 +813,7 @@ class Q {
813
813
  var t;
814
814
  return ((t = this.viewImpl) == null ? void 0 : t.range().end) ?? this._date.endOf("day");
815
815
  }
816
- /** The active view's type and date window (parity with FullCalendar's `view`). */
816
+ /** The active view's type and date window. */
817
817
  getView() {
818
818
  return { type: this._view, activeStart: this.activeStart, activeEnd: this.activeEnd };
819
819
  }
@@ -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), matching FullCalendar's default.\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 FullCalendar uses.\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 (the `timeGridDay` equivalent): a vertical time axis\n * with absolutely-positioned, overlap-packed events. Read-only in this build;\n * drag/resize arrive with the interaction engine (Fase 4).\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 (Fase 4) ------------------------------------------------\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 (the `resourceTimeGridDay` equivalent) used by\n * the team calendar: 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 (the `resourceTimeline` equivalent).\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 * Read-only in this build — drag/resize/select arrive with the interaction\n * engine (Fase 4).\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 (Fase 4) ------------------------------------------------\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 (DMS feeds its trans() values 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 (parity with FullCalendar's `view`). */\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 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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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ziix/calendar",
3
- "version": "0.1.0",
4
- "description": "Framework-agnostic resource & time-grid calendar a from-scratch, license-free replacement for FullCalendar's scheduler views.",
3
+ "version": "0.1.1",
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",
7
7
  "author": "ziix",
@@ -25,7 +25,8 @@
25
25
  "timeline",
26
26
  "resource",
27
27
  "timegrid",
28
- "fullcalendar-alternative"
28
+ "events",
29
+ "schedule"
29
30
  ],
30
31
  "main": "./dist/ziix-calendar.js",
31
32
  "module": "./dist/ziix-calendar.js",