@loidolt/theme-svelte 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +21 -0
  2. package/dist/components/AlertDialog.svelte +24 -3
  3. package/dist/components/AlertDialog.svelte.d.ts +4 -1
  4. package/dist/components/AppShell.svelte +2 -1
  5. package/dist/components/AppShell.svelte.d.ts +1 -0
  6. package/dist/components/Card.svelte +23 -5
  7. package/dist/components/Card.svelte.d.ts +11 -4
  8. package/dist/components/CodeBlock.svelte +55 -0
  9. package/dist/components/CodeBlock.svelte.d.ts +14 -0
  10. package/dist/components/CommentList.svelte +67 -0
  11. package/dist/components/CommentList.svelte.d.ts +53 -0
  12. package/dist/components/Dialog.svelte +25 -3
  13. package/dist/components/Dialog.svelte.d.ts +4 -1
  14. package/dist/components/Drawer.svelte +18 -3
  15. package/dist/components/Drawer.svelte.d.ts +4 -1
  16. package/dist/components/FileInput.svelte +47 -0
  17. package/dist/components/FileInput.svelte.d.ts +15 -0
  18. package/dist/components/Filmstrip.svelte +72 -0
  19. package/dist/components/Filmstrip.svelte.d.ts +50 -0
  20. package/dist/components/FloatingBar.svelte +43 -0
  21. package/dist/components/FloatingBar.svelte.d.ts +16 -0
  22. package/dist/components/ListRow.svelte +50 -0
  23. package/dist/components/ListRow.svelte.d.ts +18 -0
  24. package/dist/components/Marker.svelte +38 -0
  25. package/dist/components/Marker.svelte.d.ts +14 -0
  26. package/dist/components/Popover.svelte +24 -3
  27. package/dist/components/Popover.svelte.d.ts +4 -1
  28. package/dist/components/RecordStepper.svelte +58 -0
  29. package/dist/components/RecordStepper.svelte.d.ts +18 -0
  30. package/dist/components/SegmentedNav.svelte +53 -0
  31. package/dist/components/SegmentedNav.svelte.d.ts +22 -0
  32. package/dist/components/Stat.svelte +41 -0
  33. package/dist/components/Stat.svelte.d.ts +17 -0
  34. package/dist/components/StatusDot.svelte +27 -0
  35. package/dist/components/StatusDot.svelte.d.ts +12 -0
  36. package/dist/components/SwatchGroup.svelte +69 -0
  37. package/dist/components/SwatchGroup.svelte.d.ts +44 -0
  38. package/dist/components/Switch.svelte +19 -0
  39. package/dist/components/Tabs.svelte +10 -0
  40. package/dist/components/ThemeToggle.svelte +102 -31
  41. package/dist/components/ThemeToggle.svelte.d.ts +5 -10
  42. package/dist/components/Thumbnail.svelte +51 -0
  43. package/dist/components/Thumbnail.svelte.d.ts +19 -0
  44. package/dist/components/Workspace.svelte +9 -1
  45. package/dist/components/Workspace.svelte.d.ts +4 -0
  46. package/dist/index.d.ts +13 -0
  47. package/dist/index.js +13 -0
  48. package/dist/theme.svelte.js +17 -7
  49. package/dist/toaster.svelte.d.ts +2 -0
  50. package/dist/toaster.svelte.js +30 -2
  51. package/package.json +8 -7
@@ -1,3 +1,4 @@
1
+ import { onDestroy } from 'svelte';
1
2
  /**
2
3
  * Queue behind `Toast` / `ToastViewport`: auto-dismiss with the remaining time preserved
3
4
  * across `pause()`/`resume()`, so hovering a toast does not lose the countdown.
@@ -13,6 +14,13 @@
13
14
  */
14
15
  export function createToaster(options = {}) {
15
16
  const { duration: defaultDuration = 5000, max = 5 } = options;
17
+ if (!Number.isInteger(max) || max < 1) {
18
+ throw new RangeError('createToaster: `max` must be a positive integer');
19
+ }
20
+ const validDuration = (duration) => duration === Infinity || (Number.isFinite(duration) && duration >= 0);
21
+ if (!validDuration(defaultDuration)) {
22
+ throw new RangeError('createToaster: `duration` must be non-negative or Infinity');
23
+ }
16
24
  const toasts = $state([]);
17
25
  // Plain Map on purpose: these are timer handles, not UI state, and nothing renders from them.
18
26
  // `startedAt` lives per entry: toasts are pushed at different moments, so a shared start
@@ -44,17 +52,36 @@ export function createToaster(options = {}) {
44
52
  toasts.splice(index, 1);
45
53
  }
46
54
  function push(toast) {
55
+ const duration = toast.duration ?? defaultDuration;
56
+ if (!validDuration(duration)) {
57
+ throw new RangeError('createToaster: toast `duration` must be non-negative or Infinity');
58
+ }
47
59
  const id = `ldt-toast-${++counter}`;
48
60
  toasts.push({ ...toast, id });
49
61
  while (toasts.length > max)
50
62
  dismiss(toasts[0].id);
51
63
  if (!paused)
52
- arm(id, toast.duration ?? defaultDuration);
64
+ arm(id, duration);
53
65
  else {
54
- timers.set(id, { timeout: null, remaining: toast.duration ?? defaultDuration, startedAt: 0 });
66
+ timers.set(id, { timeout: null, remaining: duration, startedAt: 0 });
55
67
  }
56
68
  return id;
57
69
  }
70
+ const destroy = () => {
71
+ for (const timer of timers.values()) {
72
+ if (timer.timeout !== null)
73
+ clearTimeout(timer.timeout);
74
+ }
75
+ timers.clear();
76
+ toasts.splice(0);
77
+ paused = false;
78
+ };
79
+ try {
80
+ onDestroy(destroy);
81
+ }
82
+ catch {
83
+ /* module scope: the caller owns `destroy()` */
84
+ }
58
85
  return {
59
86
  get toasts() {
60
87
  return toasts;
@@ -92,5 +119,6 @@ export function createToaster(options = {}) {
92
119
  arm(id, timer.remaining);
93
120
  }
94
121
  },
122
+ destroy,
95
123
  };
96
124
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loidolt/theme-svelte",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Accessible Svelte 5 components for Loidolt applications",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -21,32 +21,33 @@
21
21
  "sideEffects": [
22
22
  "**/*.css"
23
23
  ],
24
- "engines": {
25
- "node": ">=22"
26
- },
27
24
  "scripts": {
28
25
  "build": "svelte-package -i src/lib -o dist && cp src/styles.css dist/styles.css",
29
26
  "prepack": "npm run build",
30
27
  "typecheck": "svelte-check --tsconfig ./tsconfig.json",
31
28
  "test": "vitest run && vitest run --config vitest.config.ssr.ts",
29
+ "test:coverage": "vitest run --coverage",
32
30
  "test:a11y": "vitest run tests/a11y.test.ts",
33
31
  "clean": "rimraf dist"
34
32
  },
35
33
  "dependencies": {
36
- "@loidolt/theme-styles": "^0.3.0",
37
- "@loidolt/theme-tokens": "^0.3.0",
34
+ "@loidolt/theme-styles": "^0.4.0",
35
+ "@loidolt/theme-tokens": "^0.4.0",
38
36
  "bits-ui": "^2.19.0"
39
37
  },
40
38
  "peerDependencies": {
41
39
  "svelte": "^5.33.0"
42
40
  },
43
41
  "devDependencies": {
42
+ "@axe-core/playwright": "^4.13.0",
43
+ "@playwright/test": "^1.62.1",
44
44
  "@sveltejs/package": "^2.5.8",
45
- "@types/node": "^24.3.0",
46
45
  "@sveltejs/vite-plugin-svelte": "^7.0.0",
47
46
  "@testing-library/jest-dom": "^6.8.0",
48
47
  "@testing-library/svelte": "^5.2.8",
49
48
  "@testing-library/user-event": "^14.6.1",
49
+ "@types/node": "^24.3.0",
50
+ "@vitest/coverage-v8": "^4.1.11",
50
51
  "jsdom": "^27.0.0",
51
52
  "rimraf": "^6.0.1",
52
53
  "svelte": "^5.56.10",