@nomideusz/svelte-calendar 0.6.3 → 0.6.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +192 -10
  2. package/dist/adapters/composite.d.ts +15 -0
  3. package/dist/adapters/composite.js +65 -0
  4. package/dist/adapters/index.d.ts +5 -1
  5. package/dist/adapters/index.js +2 -0
  6. package/dist/adapters/mapped.d.ts +170 -0
  7. package/dist/adapters/mapped.js +343 -0
  8. package/dist/adapters/recurring.d.ts +4 -0
  9. package/dist/adapters/recurring.js +5 -10
  10. package/dist/adapters/types.d.ts +11 -2
  11. package/dist/assets/favicon.svg +9 -1
  12. package/dist/calendar/Calendar.svelte +161 -90
  13. package/dist/calendar/Calendar.svelte.d.ts +12 -0
  14. package/dist/core/index.d.ts +3 -1
  15. package/dist/core/index.js +2 -0
  16. package/dist/core/measure.d.ts +104 -0
  17. package/dist/core/measure.js +195 -0
  18. package/dist/core/time.js +2 -2
  19. package/dist/core/types.d.ts +32 -0
  20. package/dist/engine/event-store.svelte.js +22 -7
  21. package/dist/headless/create-agenda.svelte.d.ts +67 -0
  22. package/dist/headless/create-agenda.svelte.js +139 -0
  23. package/dist/headless/create-calendar.svelte.d.ts +2 -0
  24. package/dist/headless/create-calendar.svelte.js +380 -0
  25. package/dist/headless/index.d.ts +4 -0
  26. package/dist/headless/index.js +2 -0
  27. package/dist/headless/types.d.ts +219 -0
  28. package/dist/headless/types.js +1 -0
  29. package/dist/index.d.ts +6 -4
  30. package/dist/index.js +4 -2
  31. package/dist/primitives/DayHeader.svelte +6 -6
  32. package/dist/primitives/EmptySlot.svelte +3 -3
  33. package/dist/primitives/EventBlock.svelte +99 -14
  34. package/dist/primitives/NowIndicator.svelte +5 -5
  35. package/dist/views/agenda/AgendaDay.svelte +215 -116
  36. package/dist/views/agenda/AgendaWeek.svelte +166 -113
  37. package/dist/views/mobile/MobileDay.svelte +45 -21
  38. package/dist/views/mobile/MobileWeek.svelte +85 -35
  39. package/dist/views/planner/PlannerDay.svelte +116 -60
  40. package/dist/views/planner/PlannerWeek.svelte +228 -166
  41. package/dist/views/shared/context.svelte.d.ts +47 -0
  42. package/dist/views/shared/context.svelte.js +47 -0
  43. package/dist/views/shared/format.d.ts +19 -0
  44. package/dist/views/shared/format.js +46 -0
  45. package/dist/views/shared/index.d.ts +4 -0
  46. package/dist/views/shared/index.js +2 -0
  47. package/package.json +9 -2
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Shared context reader for calendar views.
3
+ *
4
+ * Calendar.svelte sets a single 'calendar' context with reactive getters.
5
+ * This module reads it and returns a typed interface for views.
6
+ */
7
+ import { getContext } from 'svelte';
8
+ import { sod } from '../../core/time.js';
9
+ /**
10
+ * Read the calendar context.
11
+ * Call at component init time (top-level script).
12
+ * Returns an object with getters that delegate to the raw context.
13
+ */
14
+ export function useCalendarContext() {
15
+ const raw = getContext('calendar');
16
+ return {
17
+ get viewState() { return raw?.viewState; },
18
+ get drag() { return raw?.drag; },
19
+ get commitDrag() { return raw?.commitDrag; },
20
+ get snapInterval() { return raw?.snapInterval ?? 15; },
21
+ get showNav() { return raw?.showNavigation ?? true; },
22
+ get equalDays() { return raw?.equalDays ?? false; },
23
+ get showDates() { return raw?.showDates ?? true; },
24
+ get hideDays() { return raw?.hideDays; },
25
+ get isMobile() { return raw?.mobile ?? false; },
26
+ get autoHeight() { return raw?.autoHeight ?? false; },
27
+ get compact() { return raw?.compact ?? false; },
28
+ get readOnly() { return raw?.readOnly ?? false; },
29
+ get blockedSlots() { return raw?.blockedSlots; },
30
+ get dayHeaderSnippet() { return raw?.dayHeaderSnippet; },
31
+ get minDuration() { return raw?.minDuration; },
32
+ get maxDuration() { return raw?.maxDuration; },
33
+ get oneventhover() { return raw?.oneventhover; },
34
+ get disabledDates() { return raw?.disabledDates; },
35
+ get disabledSet() { return new Set(raw?.disabledDates?.map(d => sod(d.getTime())) ?? []); },
36
+ get loadRange() {
37
+ if (!raw)
38
+ return undefined;
39
+ return {
40
+ get current() { return raw.loadRange; },
41
+ set: (r) => raw.setLoadRange(r),
42
+ };
43
+ },
44
+ get eventSnippet() { return raw?.eventSnippet; },
45
+ get emptySnippet() { return raw?.emptySnippet; },
46
+ };
47
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Shared format helpers for agenda views.
3
+ * Extracted from duplicated code in AgendaDay and AgendaWeek.
4
+ */
5
+ import type { TimelineEvent } from '../../core/types.js';
6
+ export declare function fmtTime(d: Date, locale?: string): string;
7
+ export declare function duration(ev: TimelineEvent): string;
8
+ export declare function timeUntilMs(ms: number, now: number): string;
9
+ export declare function progress(ev: TimelineEvent, now: number): number;
10
+ /**
11
+ * Group overlapping events into time slots.
12
+ * Used by both AgendaDay and AgendaWeek.
13
+ */
14
+ export interface TimeSlot {
15
+ startMs: number;
16
+ endMs: number;
17
+ events: TimelineEvent[];
18
+ }
19
+ export declare function groupIntoSlots(evts: TimelineEvent[]): TimeSlot[];
@@ -0,0 +1,46 @@
1
+ import { fmtTime as _fmtTime, fmtDuration, getLabels } from '../../core/locale.js';
2
+ export function fmtTime(d, locale) {
3
+ return _fmtTime(d, locale);
4
+ }
5
+ export function duration(ev) {
6
+ return fmtDuration(ev.start, ev.end);
7
+ }
8
+ export function timeUntilMs(ms, now) {
9
+ const L = getLabels();
10
+ const diff = ms - now;
11
+ if (diff <= 0)
12
+ return L.now;
13
+ const tMins = Math.floor(diff / 60000);
14
+ if (tMins < 60)
15
+ return `in ${tMins}m`;
16
+ const hrs = Math.floor(tMins / 60);
17
+ const rm = tMins % 60;
18
+ if (hrs < 24)
19
+ return rm > 0 ? `in ${hrs}h ${rm}m` : `in ${hrs}h`;
20
+ const days = Math.floor(hrs / 24);
21
+ return `in ${days}d`;
22
+ }
23
+ export function progress(ev, now) {
24
+ const s = ev.start.getTime();
25
+ const e = ev.end.getTime();
26
+ return Math.min(1, Math.max(0, (now - s) / (e - s)));
27
+ }
28
+ export function groupIntoSlots(evts) {
29
+ const sorted = [...evts].sort((a, b) => a.start.getTime() - b.start.getTime());
30
+ const slots = [];
31
+ for (const ev of sorted) {
32
+ const last = slots[slots.length - 1];
33
+ if (last && ev.start.getTime() < last.endMs) {
34
+ last.events.push(ev);
35
+ last.endMs = Math.max(last.endMs, ev.end.getTime());
36
+ }
37
+ else {
38
+ slots.push({
39
+ startMs: ev.start.getTime(),
40
+ endMs: ev.end.getTime(),
41
+ events: [ev],
42
+ });
43
+ }
44
+ }
45
+ return slots;
46
+ }
@@ -0,0 +1,4 @@
1
+ export { useCalendarContext } from './context.svelte.js';
2
+ export type { CalendarContext } from './context.svelte.js';
3
+ export { fmtTime, duration, timeUntilMs, progress, groupIntoSlots } from './format.js';
4
+ export type { TimeSlot } from './format.js';
@@ -0,0 +1,2 @@
1
+ export { useCalendarContext } from './context.svelte.js';
2
+ export { fmtTime, duration, timeUntilMs, progress, groupIntoSlots } from './format.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nomideusz/svelte-calendar",
3
- "version": "0.6.3",
3
+ "version": "0.6.5",
4
4
  "description": "A themeable Svelte 5 calendar with Day and Week views — Planner and Agenda.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -34,9 +34,16 @@
34
34
  "test:watch": "vitest"
35
35
  },
36
36
  "peerDependencies": {
37
- "svelte": "^5.0.0"
37
+ "svelte": "^5.0.0",
38
+ "@chenglou/pretext": "^0.0.4"
39
+ },
40
+ "peerDependenciesMeta": {
41
+ "@chenglou/pretext": {
42
+ "optional": true
43
+ }
38
44
  },
39
45
  "devDependencies": {
46
+ "@chenglou/pretext": "^0.0.4",
40
47
  "@sveltejs/adapter-auto": "^7.0.0",
41
48
  "@sveltejs/kit": "^2.50.2",
42
49
  "@sveltejs/package": "^2.5.7",