@nomideusz/svelte-calendar 0.14.1 → 0.15.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,7 +8,7 @@ interface Props {
8
8
  events?: TimelineEvent[];
9
9
  style?: string;
10
10
  focusDate?: Date;
11
- oneventclick?: (event: TimelineEvent) => void;
11
+ oneventclick?: (event: TimelineEvent, anchor?: DOMRect) => void;
12
12
  oneventcreate?: (range: {
13
13
  start: Date;
14
14
  end: Date;
@@ -17,101 +17,82 @@
17
17
  import { createRestAdapter } from "../adapters/rest.js";
18
18
  import { createMemoryAdapter } from "../adapters/memory.js";
19
19
  import { presets } from "../theme/presets.js";
20
- let {
21
- api,
22
- events,
23
- theme = "auto",
24
- view = "week-planner",
25
- height = "600",
26
- locale,
27
- dir,
28
- mondaystart = "true",
29
- headers,
30
- readonly,
31
- pills,
32
- nav,
33
- mobile,
34
- days,
35
- compact,
36
- timezone
37
- } = $props();
20
+ let { api, events, theme = "auto", view = "week-planner", height = "600", locale, dir, mondaystart = "true", headers, readonly, pills, nav, mobile, days, compact, timezone } = $props();
21
+ // ── Parse attributes ──
38
22
  const heightValue = $derived.by(() => {
39
- const trimmed = height.trim();
40
- if (trimmed === "auto") return "auto";
41
- if (/^\d+(px)?$/.test(trimmed)) return parseInt(trimmed, 10);
42
- console.warn(`[day-calendar] Unsupported height "${height}" \u2014 use pixels or "auto". Falling back to 600.`);
43
- return 600;
23
+ const trimmed = height.trim();
24
+ if (trimmed === "auto") return "auto";
25
+ if (/^\d+(px)?$/.test(trimmed)) return parseInt(trimmed, 10);
26
+ // "100%" / "50vh" aren't supported — warn instead of rendering a 100px sliver
27
+ console.warn(`[day-calendar] Unsupported height "${height}" — use pixels or "auto". Falling back to 600.`);
28
+ return 600;
44
29
  });
45
30
  const isMondayStart = $derived(mondaystart !== "false");
46
- const themeStyle = $derived(
47
- theme in presets ? presets[theme] : presets.neutral
48
- );
49
- const dirValue = $derived(
50
- dir === "rtl" || dir === "ltr" || dir === "auto" ? dir : void 0
51
- );
52
- const mobileValue = $derived(
53
- mobile === "true" ? true : mobile === "false" ? false : "auto"
54
- );
31
+ const themeStyle = $derived(theme in presets ? presets[theme] : presets.neutral);
32
+ const dirValue = $derived(dir === "rtl" || dir === "ltr" || dir === "auto" ? dir : undefined);
33
+ const mobileValue = $derived(mobile === "true" ? true : mobile === "false" ? false : "auto");
55
34
  const daysValue = $derived.by(() => {
56
- if (!days) return void 0;
57
- const n = parseInt(days, 10);
58
- return Number.isNaN(n) || n < 1 || n > 7 ? void 0 : n;
35
+ if (!days) return undefined;
36
+ const n = parseInt(days, 10);
37
+ return Number.isNaN(n) || n < 1 || n > 7 ? undefined : n;
59
38
  });
39
+ // ── Parse static events from JSON attribute ──
60
40
  function parseHeaders(json) {
61
- if (!json) return void 0;
62
- try {
63
- const parsed = JSON.parse(json);
64
- const out = {};
65
- for (const [k, v] of Object.entries(parsed)) {
66
- out[k] = String(v);
67
- }
68
- return out;
69
- } catch {
70
- console.warn("[day-calendar] Failed to parse headers JSON:", json);
71
- return void 0;
72
- }
41
+ if (!json) return undefined;
42
+ try {
43
+ const parsed = JSON.parse(json);
44
+ const out = {};
45
+ for (const [k, v] of Object.entries(parsed)) {
46
+ out[k] = String(v);
47
+ }
48
+ return out;
49
+ } catch {
50
+ console.warn("[day-calendar] Failed to parse headers JSON:", json);
51
+ return undefined;
52
+ }
73
53
  }
74
54
  function toEvent(raw, fallbackId) {
75
- const start = new Date(String(raw.start ?? ""));
76
- const end = new Date(String(raw.end ?? ""));
77
- if (Number.isNaN(start.getTime()) || Number.isNaN(end.getTime()) || end <= start) {
78
- return null;
79
- }
80
- return {
81
- id: String(raw.id ?? fallbackId),
82
- title: String(raw.title ?? "Untitled"),
83
- start,
84
- end,
85
- color: raw.color ? String(raw.color) : void 0
86
- };
55
+ const start = new Date(String(raw.start ?? ""));
56
+ const end = new Date(String(raw.end ?? ""));
57
+ if (Number.isNaN(start.getTime()) || Number.isNaN(end.getTime()) || end <= start) {
58
+ return null;
59
+ }
60
+ return {
61
+ id: String(raw.id ?? fallbackId),
62
+ title: String(raw.title ?? "Untitled"),
63
+ start,
64
+ end,
65
+ color: raw.color ? String(raw.color) : undefined
66
+ };
87
67
  }
88
68
  function parseEvents(json) {
89
- if (!json) return [];
90
- try {
91
- const raw = JSON.parse(json);
92
- const parsed = raw.map((e, idx) => toEvent(e, `inline-${idx}`)).filter((ev) => ev !== null);
93
- if (parsed.length !== raw.length) {
94
- console.warn(`[day-calendar] Ignored ${raw.length - parsed.length} invalid event(s) from events JSON.`);
95
- }
96
- return parsed;
97
- } catch {
98
- console.warn("[day-calendar] Failed to parse events JSON:", json);
99
- return [];
100
- }
69
+ if (!json) return [];
70
+ try {
71
+ const raw = JSON.parse(json);
72
+ const parsed = raw.map((e, idx) => toEvent(e, `inline-${idx}`)).filter((ev) => ev !== null);
73
+ if (parsed.length !== raw.length) {
74
+ console.warn(`[day-calendar] Ignored ${raw.length - parsed.length} invalid event(s) from events JSON.`);
75
+ }
76
+ return parsed;
77
+ } catch {
78
+ console.warn("[day-calendar] Failed to parse events JSON:", json);
79
+ return [];
80
+ }
101
81
  }
82
+ // ── Create adapter ──
102
83
  const adapter = $derived.by(() => {
103
- if (api) {
104
- const parsedHeaders = parseHeaders(headers);
105
- return createRestAdapter({
106
- baseUrl: api,
107
- headers: parsedHeaders,
108
- mapEvents: (data) => {
109
- const arr = Array.isArray(data) ? data : data.events ?? [];
110
- return arr.map((e, idx) => toEvent(e, `api-${idx}`)).filter((ev) => ev !== null);
111
- }
112
- });
113
- }
114
- return createMemoryAdapter(parseEvents(events));
84
+ if (api) {
85
+ const parsedHeaders = parseHeaders(headers);
86
+ return createRestAdapter({
87
+ baseUrl: api,
88
+ headers: parsedHeaders,
89
+ mapEvents: (data) => {
90
+ const arr = Array.isArray(data) ? data : data.events ?? [];
91
+ return arr.map((e, idx) => toEvent(e, `api-${idx}`)).filter((ev) => ev !== null);
92
+ }
93
+ });
94
+ }
95
+ return createMemoryAdapter(parseEvents(events));
115
96
  });
116
97
  </script>
117
98
 
package/package.json CHANGED
@@ -1,9 +1,11 @@
1
1
  {
2
2
  "name": "@nomideusz/svelte-calendar",
3
- "version": "0.14.1",
3
+ "version": "0.15.2",
4
4
  "description": "A themeable Svelte 5 calendar with Day and Week views — Planner and Agenda.",
5
5
  "type": "module",
6
- "sideEffects": false,
6
+ "sideEffects": [
7
+ "./widget/widget.js"
8
+ ],
7
9
  "license": "MIT",
8
10
  "svelte": "./dist/index.js",
9
11
  "types": "./dist/index.d.ts",
@@ -21,6 +23,10 @@
21
23
  "!dist/**/*.test.*",
22
24
  "!dist/**/*.spec.*"
23
25
  ],
26
+ "imports": {
27
+ "#lib": "./src/lib",
28
+ "#lib/*": "./src/lib/*"
29
+ },
24
30
  "scripts": {
25
31
  "dev": "vite dev",
26
32
  "build": "vite build",
@@ -39,19 +45,20 @@
39
45
  "svelte": "^5.0.0"
40
46
  },
41
47
  "devDependencies": {
42
- "@sveltejs/adapter-auto": "^7.0.1",
43
- "@sveltejs/kit": "^2.69.1",
44
- "@sveltejs/package": "^2.5.8",
45
- "@sveltejs/vite-plugin-svelte": "^6.2.4",
48
+ "@sveltejs/adapter-auto": "8.0.0-next.3",
49
+ "@sveltejs/adapter-vercel": "7.0.0-next.6",
50
+ "@sveltejs/kit": "3.0.0-next.23",
51
+ "@sveltejs/package": "3.0.0-next.7",
52
+ "@sveltejs/vite-plugin-svelte": "^7.3.0",
46
53
  "@types/node": "^22.20.0",
47
54
  "@vercel/analytics": "^1.6.1",
48
55
  "jsdom": "^29.1.1",
49
56
  "marked": "^17.0.6",
50
- "svelte": "^5.56.4",
57
+ "svelte": "^5.56.9",
51
58
  "svelte-check": "^4.7.1",
52
- "typescript": "^5.9.3",
53
- "vite": "^7.3.6",
54
- "vitest": "^4.1.9"
59
+ "typescript": "^6.0.3",
60
+ "vite": "^8.2.1",
61
+ "vitest": "^4.1.10"
55
62
  },
56
63
  "dependencies": {
57
64
  "date-fns": "^4.4.0",