@mappoh/nova 0.2.3 → 0.5.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 (327) hide show
  1. package/README.md +180 -30
  2. package/dist/a11y/index.d.ts +40 -0
  3. package/dist/a11y/index.d.ts.map +1 -0
  4. package/dist/a11y/index.js +162 -0
  5. package/dist/a11y/index.js.map +1 -0
  6. package/dist/alert/alert.d.ts +32 -0
  7. package/dist/alert/alert.d.ts.map +1 -0
  8. package/dist/alert/alert.js +307 -0
  9. package/dist/alert/alert.js.map +1 -0
  10. package/dist/alert/index.d.ts +3 -0
  11. package/dist/alert/index.d.ts.map +1 -0
  12. package/dist/alert/index.js +2 -0
  13. package/dist/alert/index.js.map +1 -0
  14. package/dist/animation/flip.d.ts +28 -0
  15. package/dist/animation/flip.d.ts.map +1 -0
  16. package/dist/animation/flip.js +113 -0
  17. package/dist/animation/flip.js.map +1 -0
  18. package/dist/animation/spring.d.ts +34 -0
  19. package/dist/animation/spring.d.ts.map +1 -0
  20. package/dist/animation/spring.js +86 -0
  21. package/dist/animation/spring.js.map +1 -0
  22. package/dist/animation/stagger.d.ts +43 -0
  23. package/dist/animation/stagger.d.ts.map +1 -0
  24. package/dist/animation/stagger.js +150 -0
  25. package/dist/animation/stagger.js.map +1 -0
  26. package/dist/avatar/avatar.d.ts +27 -0
  27. package/dist/avatar/avatar.d.ts.map +1 -0
  28. package/dist/avatar/avatar.js +132 -0
  29. package/dist/avatar/avatar.js.map +1 -0
  30. package/dist/avatar/index.d.ts +3 -0
  31. package/dist/avatar/index.d.ts.map +1 -0
  32. package/dist/avatar/index.js +2 -0
  33. package/dist/avatar/index.js.map +1 -0
  34. package/dist/badge/badge.d.ts +27 -0
  35. package/dist/badge/badge.d.ts.map +1 -0
  36. package/dist/badge/badge.js +118 -0
  37. package/dist/badge/badge.js.map +1 -0
  38. package/dist/badge/index.d.ts +3 -0
  39. package/dist/badge/index.d.ts.map +1 -0
  40. package/dist/badge/index.js +2 -0
  41. package/dist/badge/index.js.map +1 -0
  42. package/dist/cache/cache.d.ts +28 -0
  43. package/dist/cache/cache.d.ts.map +1 -0
  44. package/dist/cache/cache.js +67 -0
  45. package/dist/cache/cache.js.map +1 -0
  46. package/dist/cache/index.d.ts +3 -0
  47. package/dist/cache/index.d.ts.map +1 -0
  48. package/dist/cache/index.js +2 -0
  49. package/dist/cache/index.js.map +1 -0
  50. package/dist/chart/chart.d.ts +31 -0
  51. package/dist/chart/chart.d.ts.map +1 -0
  52. package/dist/chart/chart.js +372 -0
  53. package/dist/chart/chart.js.map +1 -0
  54. package/dist/chart/index.d.ts +3 -0
  55. package/dist/chart/index.d.ts.map +1 -0
  56. package/dist/chart/index.js +2 -0
  57. package/dist/chart/index.js.map +1 -0
  58. package/dist/color-picker/color-picker.d.ts +18 -0
  59. package/dist/color-picker/color-picker.d.ts.map +1 -0
  60. package/dist/color-picker/color-picker.js +243 -0
  61. package/dist/color-picker/color-picker.js.map +1 -0
  62. package/dist/color-picker/index.d.ts +3 -0
  63. package/dist/color-picker/index.d.ts.map +1 -0
  64. package/dist/color-picker/index.js +2 -0
  65. package/dist/color-picker/index.js.map +1 -0
  66. package/dist/combobox/combobox.d.ts +26 -0
  67. package/dist/combobox/combobox.d.ts.map +1 -0
  68. package/dist/combobox/combobox.js +262 -0
  69. package/dist/combobox/combobox.js.map +1 -0
  70. package/dist/combobox/index.d.ts +3 -0
  71. package/dist/combobox/index.d.ts.map +1 -0
  72. package/dist/combobox/index.js +2 -0
  73. package/dist/combobox/index.js.map +1 -0
  74. package/dist/command-palette/command-palette.d.ts +31 -0
  75. package/dist/command-palette/command-palette.d.ts.map +1 -0
  76. package/dist/command-palette/command-palette.js +590 -0
  77. package/dist/command-palette/command-palette.js.map +1 -0
  78. package/dist/command-palette/index.d.ts +3 -0
  79. package/dist/command-palette/index.d.ts.map +1 -0
  80. package/dist/command-palette/index.js +2 -0
  81. package/dist/command-palette/index.js.map +1 -0
  82. package/dist/component/component.d.ts +20 -2
  83. package/dist/component/component.d.ts.map +1 -1
  84. package/dist/component/component.js +115 -5
  85. package/dist/component/component.js.map +1 -1
  86. package/dist/component/connect.d.ts +50 -0
  87. package/dist/component/connect.d.ts.map +1 -1
  88. package/dist/component/connect.js +135 -0
  89. package/dist/component/connect.js.map +1 -1
  90. package/dist/component/directives.d.ts +20 -0
  91. package/dist/component/directives.d.ts.map +1 -0
  92. package/dist/component/directives.js +42 -0
  93. package/dist/component/directives.js.map +1 -0
  94. package/dist/component/html.d.ts +8 -0
  95. package/dist/component/html.d.ts.map +1 -1
  96. package/dist/component/html.js +11 -0
  97. package/dist/component/html.js.map +1 -1
  98. package/dist/component/index.d.ts +9 -3
  99. package/dist/component/index.d.ts.map +1 -1
  100. package/dist/component/index.js +6 -2
  101. package/dist/component/index.js.map +1 -1
  102. package/dist/component/portal.d.ts +32 -0
  103. package/dist/component/portal.d.ts.map +1 -0
  104. package/dist/component/portal.js +59 -0
  105. package/dist/component/portal.js.map +1 -0
  106. package/dist/component/ref.d.ts +18 -0
  107. package/dist/component/ref.d.ts.map +1 -0
  108. package/dist/component/ref.js +17 -0
  109. package/dist/component/ref.js.map +1 -0
  110. package/dist/component/slot-styles.d.ts +18 -0
  111. package/dist/component/slot-styles.d.ts.map +1 -0
  112. package/dist/component/slot-styles.js +47 -0
  113. package/dist/component/slot-styles.js.map +1 -0
  114. package/dist/component/template.d.ts +2 -0
  115. package/dist/component/template.d.ts.map +1 -1
  116. package/dist/component/template.js +122 -4
  117. package/dist/component/template.js.map +1 -1
  118. package/dist/context/context.d.ts +39 -0
  119. package/dist/context/context.d.ts.map +1 -0
  120. package/dist/context/context.js +111 -0
  121. package/dist/context/context.js.map +1 -0
  122. package/dist/context/index.d.ts +3 -0
  123. package/dist/context/index.d.ts.map +1 -0
  124. package/dist/context/index.js +2 -0
  125. package/dist/context/index.js.map +1 -0
  126. package/dist/data-table/data-table.d.ts +34 -0
  127. package/dist/data-table/data-table.d.ts.map +1 -0
  128. package/dist/data-table/data-table.js +256 -0
  129. package/dist/data-table/data-table.js.map +1 -0
  130. package/dist/data-table/index.d.ts +3 -0
  131. package/dist/data-table/index.d.ts.map +1 -0
  132. package/dist/data-table/index.js +2 -0
  133. package/dist/data-table/index.js.map +1 -0
  134. package/dist/date-picker/date-picker.d.ts +22 -0
  135. package/dist/date-picker/date-picker.d.ts.map +1 -0
  136. package/dist/date-picker/date-picker.js +282 -0
  137. package/dist/date-picker/date-picker.js.map +1 -0
  138. package/dist/date-picker/index.d.ts +3 -0
  139. package/dist/date-picker/index.d.ts.map +1 -0
  140. package/dist/date-picker/index.js +2 -0
  141. package/dist/date-picker/index.js.map +1 -0
  142. package/dist/devtools/devtools.d.ts +54 -0
  143. package/dist/devtools/devtools.d.ts.map +1 -1
  144. package/dist/devtools/devtools.js +86 -0
  145. package/dist/devtools/devtools.js.map +1 -1
  146. package/dist/devtools/index.d.ts +2 -2
  147. package/dist/devtools/index.d.ts.map +1 -1
  148. package/dist/devtools/index.js +1 -1
  149. package/dist/devtools/index.js.map +1 -1
  150. package/dist/editor/editor.d.ts +40 -0
  151. package/dist/editor/editor.d.ts.map +1 -0
  152. package/dist/editor/editor.js +955 -0
  153. package/dist/editor/editor.js.map +1 -0
  154. package/dist/editor/index.d.ts +3 -0
  155. package/dist/editor/index.d.ts.map +1 -0
  156. package/dist/editor/index.js +2 -0
  157. package/dist/editor/index.js.map +1 -0
  158. package/dist/event-bus/event-bus.d.ts +20 -0
  159. package/dist/event-bus/event-bus.d.ts.map +1 -0
  160. package/dist/event-bus/event-bus.js +55 -0
  161. package/dist/event-bus/event-bus.js.map +1 -0
  162. package/dist/event-bus/index.d.ts +3 -0
  163. package/dist/event-bus/index.d.ts.map +1 -0
  164. package/dist/event-bus/index.js +2 -0
  165. package/dist/event-bus/index.js.map +1 -0
  166. package/dist/file-upload/file-upload.d.ts +24 -0
  167. package/dist/file-upload/file-upload.d.ts.map +1 -0
  168. package/dist/file-upload/file-upload.js +177 -0
  169. package/dist/file-upload/file-upload.js.map +1 -0
  170. package/dist/file-upload/index.d.ts +3 -0
  171. package/dist/file-upload/index.d.ts.map +1 -0
  172. package/dist/file-upload/index.js +2 -0
  173. package/dist/file-upload/index.js.map +1 -0
  174. package/dist/forms/form-engine.d.ts +19 -6
  175. package/dist/forms/form-engine.d.ts.map +1 -1
  176. package/dist/forms/form-engine.js +97 -11
  177. package/dist/forms/form-engine.js.map +1 -1
  178. package/dist/forms/validators.d.ts +4 -0
  179. package/dist/forms/validators.d.ts.map +1 -1
  180. package/dist/forms/validators.js +6 -0
  181. package/dist/forms/validators.js.map +1 -1
  182. package/dist/forms/wasm-validators.d.ts +19 -11
  183. package/dist/forms/wasm-validators.d.ts.map +1 -1
  184. package/dist/forms/wasm-validators.js +191 -31
  185. package/dist/forms/wasm-validators.js.map +1 -1
  186. package/dist/gesture/gesture.d.ts +2 -0
  187. package/dist/gesture/gesture.d.ts.map +1 -1
  188. package/dist/gesture/gesture.js +81 -0
  189. package/dist/gesture/gesture.js.map +1 -1
  190. package/dist/http/http.d.ts +8 -0
  191. package/dist/http/http.d.ts.map +1 -1
  192. package/dist/http/http.js +18 -4
  193. package/dist/http/http.js.map +1 -1
  194. package/dist/i18n/i18n.d.ts +6 -0
  195. package/dist/i18n/i18n.d.ts.map +1 -1
  196. package/dist/i18n/i18n.js +71 -9
  197. package/dist/i18n/i18n.js.map +1 -1
  198. package/dist/machine/index.d.ts +3 -0
  199. package/dist/machine/index.d.ts.map +1 -0
  200. package/dist/machine/index.js +2 -0
  201. package/dist/machine/index.js.map +1 -0
  202. package/dist/machine/machine.d.ts +26 -0
  203. package/dist/machine/machine.d.ts.map +1 -0
  204. package/dist/machine/machine.js +79 -0
  205. package/dist/machine/machine.js.map +1 -0
  206. package/dist/modal/modal.d.ts.map +1 -1
  207. package/dist/modal/modal.js +13 -29
  208. package/dist/modal/modal.js.map +1 -1
  209. package/dist/notification-center/index.d.ts +3 -0
  210. package/dist/notification-center/index.d.ts.map +1 -0
  211. package/dist/notification-center/index.js +2 -0
  212. package/dist/notification-center/index.js.map +1 -0
  213. package/dist/notification-center/notification-center.d.ts +55 -0
  214. package/dist/notification-center/notification-center.d.ts.map +1 -0
  215. package/dist/notification-center/notification-center.js +941 -0
  216. package/dist/notification-center/notification-center.js.map +1 -0
  217. package/dist/pagination/index.d.ts +3 -0
  218. package/dist/pagination/index.d.ts.map +1 -0
  219. package/dist/pagination/index.js +2 -0
  220. package/dist/pagination/index.js.map +1 -0
  221. package/dist/pagination/pagination.d.ts +31 -0
  222. package/dist/pagination/pagination.d.ts.map +1 -0
  223. package/dist/pagination/pagination.js +213 -0
  224. package/dist/pagination/pagination.js.map +1 -0
  225. package/dist/progress/progress.d.ts.map +1 -1
  226. package/dist/progress/progress.js +5 -7
  227. package/dist/progress/progress.js.map +1 -1
  228. package/dist/query/index.d.ts +3 -0
  229. package/dist/query/index.d.ts.map +1 -0
  230. package/dist/query/index.js +2 -0
  231. package/dist/query/index.js.map +1 -0
  232. package/dist/query/query.d.ts +31 -0
  233. package/dist/query/query.d.ts.map +1 -0
  234. package/dist/query/query.js +150 -0
  235. package/dist/query/query.js.map +1 -0
  236. package/dist/radio-group/index.d.ts +3 -0
  237. package/dist/radio-group/index.d.ts.map +1 -0
  238. package/dist/radio-group/index.js +2 -0
  239. package/dist/radio-group/index.js.map +1 -0
  240. package/dist/radio-group/radio-group.d.ts +37 -0
  241. package/dist/radio-group/radio-group.d.ts.map +1 -0
  242. package/dist/radio-group/radio-group.js +251 -0
  243. package/dist/radio-group/radio-group.js.map +1 -0
  244. package/dist/rating/index.d.ts +3 -0
  245. package/dist/rating/index.d.ts.map +1 -0
  246. package/dist/rating/index.js +2 -0
  247. package/dist/rating/index.js.map +1 -0
  248. package/dist/rating/rating.d.ts +31 -0
  249. package/dist/rating/rating.d.ts.map +1 -0
  250. package/dist/rating/rating.js +187 -0
  251. package/dist/rating/rating.js.map +1 -0
  252. package/dist/router/index.d.ts +1 -1
  253. package/dist/router/index.d.ts.map +1 -1
  254. package/dist/router/index.js +1 -1
  255. package/dist/router/index.js.map +1 -1
  256. package/dist/router/router.d.ts +30 -1
  257. package/dist/router/router.d.ts.map +1 -1
  258. package/dist/router/router.js +131 -16
  259. package/dist/router/router.js.map +1 -1
  260. package/dist/skeleton/index.d.ts +3 -0
  261. package/dist/skeleton/index.d.ts.map +1 -0
  262. package/dist/skeleton/index.js +2 -0
  263. package/dist/skeleton/index.js.map +1 -0
  264. package/dist/skeleton/skeleton.d.ts +24 -0
  265. package/dist/skeleton/skeleton.d.ts.map +1 -0
  266. package/dist/skeleton/skeleton.js +91 -0
  267. package/dist/skeleton/skeleton.js.map +1 -0
  268. package/dist/slider/index.d.ts +3 -0
  269. package/dist/slider/index.d.ts.map +1 -0
  270. package/dist/slider/index.js +2 -0
  271. package/dist/slider/index.js.map +1 -0
  272. package/dist/slider/slider.d.ts +33 -0
  273. package/dist/slider/slider.d.ts.map +1 -0
  274. package/dist/slider/slider.js +248 -0
  275. package/dist/slider/slider.js.map +1 -0
  276. package/dist/spinner/index.d.ts +3 -0
  277. package/dist/spinner/index.d.ts.map +1 -0
  278. package/dist/spinner/index.js +2 -0
  279. package/dist/spinner/index.js.map +1 -0
  280. package/dist/spinner/spinner.d.ts +23 -0
  281. package/dist/spinner/spinner.d.ts.map +1 -0
  282. package/dist/spinner/spinner.js +82 -0
  283. package/dist/spinner/spinner.js.map +1 -0
  284. package/dist/state/store.d.ts +4 -0
  285. package/dist/state/store.d.ts.map +1 -1
  286. package/dist/state/store.js +27 -7
  287. package/dist/state/store.js.map +1 -1
  288. package/dist/sw/sw.d.ts.map +1 -1
  289. package/dist/sw/sw.js +39 -7
  290. package/dist/sw/sw.js.map +1 -1
  291. package/dist/switch/index.d.ts +3 -0
  292. package/dist/switch/index.d.ts.map +1 -0
  293. package/dist/switch/index.js +2 -0
  294. package/dist/switch/index.js.map +1 -0
  295. package/dist/switch/switch.d.ts +27 -0
  296. package/dist/switch/switch.d.ts.map +1 -0
  297. package/dist/switch/switch.js +163 -0
  298. package/dist/switch/switch.js.map +1 -0
  299. package/dist/theme/index.d.ts +2 -0
  300. package/dist/theme/index.d.ts.map +1 -1
  301. package/dist/theme/index.js +1 -0
  302. package/dist/theme/index.js.map +1 -1
  303. package/dist/theme/scale.d.ts +40 -0
  304. package/dist/theme/scale.d.ts.map +1 -0
  305. package/dist/theme/scale.js +62 -0
  306. package/dist/theme/scale.js.map +1 -0
  307. package/dist/tree-view/index.d.ts +3 -0
  308. package/dist/tree-view/index.d.ts.map +1 -0
  309. package/dist/tree-view/index.js +2 -0
  310. package/dist/tree-view/index.js.map +1 -0
  311. package/dist/tree-view/tree-view.d.ts +29 -0
  312. package/dist/tree-view/tree-view.d.ts.map +1 -0
  313. package/dist/tree-view/tree-view.js +273 -0
  314. package/dist/tree-view/tree-view.js.map +1 -0
  315. package/dist/utils/index.d.ts +29 -0
  316. package/dist/utils/index.d.ts.map +1 -0
  317. package/dist/utils/index.js +114 -0
  318. package/dist/utils/index.js.map +1 -0
  319. package/dist/websocket/index.d.ts +3 -0
  320. package/dist/websocket/index.d.ts.map +1 -0
  321. package/dist/websocket/index.js +2 -0
  322. package/dist/websocket/index.js.map +1 -0
  323. package/dist/websocket/websocket.d.ts +31 -0
  324. package/dist/websocket/websocket.d.ts.map +1 -0
  325. package/dist/websocket/websocket.js +164 -0
  326. package/dist/websocket/websocket.js.map +1 -0
  327. package/package.json +135 -2
@@ -0,0 +1,248 @@
1
+ /**
2
+ * Nova Engine — Slider / Range
3
+ *
4
+ * Custom-styled range input with pointer drag, track click,
5
+ * keyboard navigation, ARIA slider semantics, and value tooltip.
6
+ */
7
+ const STYLE_ID = 'nova-slider-styles';
8
+ function injectStyles() {
9
+ if (document.getElementById(STYLE_ID))
10
+ return;
11
+ const s = document.createElement('style');
12
+ s.id = STYLE_ID;
13
+ s.textContent = `
14
+ .nova-slider{position:relative;display:flex;flex-direction:column;gap:8px;width:100%;user-select:none;-webkit-user-select:none}
15
+ .nova-slider-label{font:13px/1.4 -apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;color:var(--color-text-secondary,rgba(255,255,255,0.6));display:flex;justify-content:space-between;align-items:center}
16
+ .nova-slider-label-value{color:var(--color-text,rgba(255,255,255,0.87));font-weight:600;font-variant-numeric:tabular-nums}
17
+ .nova-slider-track-wrapper{position:relative;height:32px;display:flex;align-items:center;cursor:pointer;touch-action:none}
18
+ .nova-slider-track{position:relative;width:100%;height:4px;border-radius:2px;background:var(--color-border,rgba(255,255,255,0.12));overflow:visible}
19
+ .nova-slider-fill{position:absolute;top:0;left:0;height:100%;border-radius:2px;background:var(--nova-slider-accent,var(--color-accent,#a78bfa));transition:width 0.05s ease-out;pointer-events:none}
20
+ .nova-slider-thumb{position:absolute;top:50%;width:16px;height:16px;border-radius:50%;background:var(--color-text,rgba(255,255,255,0.95));border:2px solid var(--nova-slider-accent,var(--color-accent,#a78bfa));transform:translate(-50%,-50%);transition:box-shadow 0.15s ease,transform 0.1s ease;cursor:grab;z-index:1}
21
+ .nova-slider-thumb:hover{box-shadow:0 0 0 4px rgba(167,139,250,0.2)}
22
+ .nova-slider-thumb--active{cursor:grabbing;transform:translate(-50%,-50%) scale(1.15);box-shadow:0 0 0 6px rgba(167,139,250,0.25)}
23
+ .nova-slider-thumb:focus-visible{outline:2px solid var(--nova-slider-accent,var(--color-accent,#a78bfa));outline-offset:2px}
24
+ .nova-slider-tooltip{position:absolute;bottom:100%;left:50%;transform:translateX(-50%);margin-bottom:8px;padding:2px 8px;border-radius:4px;background:var(--color-bg-elevated,rgba(18,18,18,0.96));color:var(--color-text,rgba(255,255,255,0.87));font:12px/1.4 -apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;font-variant-numeric:tabular-nums;font-weight:600;white-space:nowrap;pointer-events:none;opacity:0;transition:opacity 0.15s ease;border:1px solid var(--color-border,rgba(255,255,255,0.08));box-shadow:0 2px 8px rgba(0,0,0,0.3)}
25
+ .nova-slider-thumb:hover .nova-slider-tooltip,.nova-slider-thumb--active .nova-slider-tooltip,.nova-slider-thumb:focus-visible .nova-slider-tooltip{opacity:1}
26
+ @media (prefers-reduced-motion:reduce){.nova-slider-fill,.nova-slider-thumb,.nova-slider-tooltip{transition:none}}`;
27
+ document.head.appendChild(s);
28
+ }
29
+ function clamp(value, min, max) {
30
+ return Math.max(min, Math.min(max, value));
31
+ }
32
+ function snap(value, step, min) {
33
+ const steps = Math.round((value - min) / step);
34
+ return min + steps * step;
35
+ }
36
+ /** Create a custom range slider component. */
37
+ export function createSlider(container, options = {}) {
38
+ const { min = 0, max = 100, step = 1, label, showValue = true, onChange, } = options;
39
+ const initialValue = options.value !== undefined ? options.value : min;
40
+ const el = typeof container === 'string'
41
+ ? document.querySelector(container)
42
+ : container;
43
+ if (!el) {
44
+ throw new Error('[Nova Slider] Container element not found.');
45
+ }
46
+ let destroyed = false;
47
+ let currentValue = clamp(snap(initialValue, step, min), min, max);
48
+ let dragging = false;
49
+ injectStyles();
50
+ // Listener bookkeeping
51
+ const listeners = [];
52
+ function on(target, evt, fn, opts) {
53
+ target.addEventListener(evt, fn, opts);
54
+ listeners.push([target, evt, fn]);
55
+ }
56
+ // --- Render ---
57
+ const wrapper = document.createElement('div');
58
+ wrapper.className = 'nova-slider';
59
+ // Label row
60
+ let labelEl = null;
61
+ let valueLabelEl = null;
62
+ if (label || showValue) {
63
+ labelEl = document.createElement('div');
64
+ labelEl.className = 'nova-slider-label';
65
+ if (label) {
66
+ const labelText = document.createElement('span');
67
+ labelText.textContent = label;
68
+ labelEl.appendChild(labelText);
69
+ }
70
+ if (showValue) {
71
+ valueLabelEl = document.createElement('span');
72
+ valueLabelEl.className = 'nova-slider-label-value';
73
+ valueLabelEl.textContent = formatValue(currentValue);
74
+ labelEl.appendChild(valueLabelEl);
75
+ }
76
+ wrapper.appendChild(labelEl);
77
+ }
78
+ // Track wrapper (clickable area)
79
+ const trackWrapper = document.createElement('div');
80
+ trackWrapper.className = 'nova-slider-track-wrapper';
81
+ // Track
82
+ const track = document.createElement('div');
83
+ track.className = 'nova-slider-track';
84
+ // Fill
85
+ const fill = document.createElement('div');
86
+ fill.className = 'nova-slider-fill';
87
+ track.appendChild(fill);
88
+ // Thumb
89
+ const thumb = document.createElement('div');
90
+ thumb.className = 'nova-slider-thumb';
91
+ thumb.setAttribute('role', 'slider');
92
+ thumb.setAttribute('tabindex', '0');
93
+ thumb.setAttribute('aria-valuemin', String(min));
94
+ thumb.setAttribute('aria-valuemax', String(max));
95
+ thumb.setAttribute('aria-valuenow', String(currentValue));
96
+ if (label) {
97
+ thumb.setAttribute('aria-label', label);
98
+ }
99
+ // Tooltip on thumb
100
+ const tooltip = document.createElement('span');
101
+ tooltip.className = 'nova-slider-tooltip';
102
+ tooltip.textContent = formatValue(currentValue);
103
+ thumb.appendChild(tooltip);
104
+ track.appendChild(thumb);
105
+ trackWrapper.appendChild(track);
106
+ wrapper.appendChild(trackWrapper);
107
+ el.appendChild(wrapper);
108
+ // --- Display logic ---
109
+ function getPercent(value) {
110
+ if (max === min)
111
+ return 0;
112
+ return ((value - min) / (max - min)) * 100;
113
+ }
114
+ function formatValue(v) {
115
+ // Show decimals if step has decimals
116
+ const decimals = (String(step).split('.')[1] || '').length;
117
+ return v.toFixed(decimals);
118
+ }
119
+ function updateDisplay() {
120
+ const pct = getPercent(currentValue);
121
+ fill.style.width = `${pct}%`;
122
+ thumb.style.left = `${pct}%`;
123
+ thumb.setAttribute('aria-valuenow', String(currentValue));
124
+ tooltip.textContent = formatValue(currentValue);
125
+ if (valueLabelEl) {
126
+ valueLabelEl.textContent = formatValue(currentValue);
127
+ }
128
+ }
129
+ updateDisplay();
130
+ // --- Pointer interaction ---
131
+ function valueFromPointer(clientX) {
132
+ const rect = track.getBoundingClientRect();
133
+ const ratio = clamp((clientX - rect.left) / rect.width, 0, 1);
134
+ const raw = min + ratio * (max - min);
135
+ return clamp(snap(raw, step, min), min, max);
136
+ }
137
+ function onPointerDown(e) {
138
+ if (destroyed)
139
+ return;
140
+ e.preventDefault();
141
+ dragging = true;
142
+ thumb.classList.add('nova-slider-thumb--active');
143
+ thumb.setPointerCapture(e.pointerId);
144
+ const newValue = valueFromPointer(e.clientX);
145
+ if (newValue !== currentValue) {
146
+ currentValue = newValue;
147
+ updateDisplay();
148
+ onChange?.(currentValue);
149
+ }
150
+ }
151
+ function onPointerMove(e) {
152
+ if (!dragging || destroyed)
153
+ return;
154
+ e.preventDefault();
155
+ const newValue = valueFromPointer(e.clientX);
156
+ if (newValue !== currentValue) {
157
+ currentValue = newValue;
158
+ updateDisplay();
159
+ onChange?.(currentValue);
160
+ }
161
+ }
162
+ function onPointerUp() {
163
+ if (!dragging)
164
+ return;
165
+ dragging = false;
166
+ thumb.classList.remove('nova-slider-thumb--active');
167
+ }
168
+ // Track click — jump to value
169
+ on(trackWrapper, 'pointerdown', ((e) => {
170
+ if (destroyed)
171
+ return;
172
+ // If clicking the thumb itself, let thumb handle it
173
+ if (thumb.contains(e.target))
174
+ return;
175
+ e.preventDefault();
176
+ const newValue = valueFromPointer(e.clientX);
177
+ if (newValue !== currentValue) {
178
+ currentValue = newValue;
179
+ updateDisplay();
180
+ onChange?.(currentValue);
181
+ }
182
+ thumb.focus();
183
+ }));
184
+ // Thumb drag
185
+ on(thumb, 'pointerdown', onPointerDown);
186
+ on(thumb, 'pointermove', onPointerMove);
187
+ on(thumb, 'pointerup', onPointerUp);
188
+ on(thumb, 'pointercancel', onPointerUp);
189
+ on(thumb, 'lostpointercapture', onPointerUp);
190
+ // --- Keyboard navigation ---
191
+ on(thumb, 'keydown', ((e) => {
192
+ if (destroyed)
193
+ return;
194
+ let newValue = currentValue;
195
+ if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {
196
+ e.preventDefault();
197
+ newValue = clamp(currentValue + step, min, max);
198
+ }
199
+ else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {
200
+ e.preventDefault();
201
+ newValue = clamp(currentValue - step, min, max);
202
+ }
203
+ else if (e.key === 'Home') {
204
+ e.preventDefault();
205
+ newValue = min;
206
+ }
207
+ else if (e.key === 'End') {
208
+ e.preventDefault();
209
+ newValue = max;
210
+ }
211
+ else if (e.key === 'PageUp') {
212
+ e.preventDefault();
213
+ const bigStep = (max - min) / 10;
214
+ newValue = clamp(snap(currentValue + bigStep, step, min), min, max);
215
+ }
216
+ else if (e.key === 'PageDown') {
217
+ e.preventDefault();
218
+ const bigStep = (max - min) / 10;
219
+ newValue = clamp(snap(currentValue - bigStep, step, min), min, max);
220
+ }
221
+ if (newValue !== currentValue) {
222
+ currentValue = newValue;
223
+ updateDisplay();
224
+ onChange?.(currentValue);
225
+ }
226
+ }));
227
+ // --- Instance ---
228
+ return {
229
+ getValue() {
230
+ return currentValue;
231
+ },
232
+ setValue(value) {
233
+ if (destroyed)
234
+ return;
235
+ currentValue = clamp(snap(value, step, min), min, max);
236
+ updateDisplay();
237
+ },
238
+ destroy() {
239
+ if (destroyed)
240
+ return;
241
+ destroyed = true;
242
+ for (const [t, e, fn] of listeners)
243
+ t.removeEventListener(e, fn);
244
+ wrapper.remove();
245
+ },
246
+ };
247
+ }
248
+ //# sourceMappingURL=slider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slider.js","sourceRoot":"","sources":[""],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { createSpinner } from './spinner';
2
+ export type { SpinnerOptions, SpinnerInstance } from './spinner';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/spinner/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { createSpinner } from './spinner';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":[""],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Nova Engine — Spinner
3
+ *
4
+ * Lightweight loading indicators with border and dots variants,
5
+ * accessible live regions, and reduced-motion support.
6
+ */
7
+ export interface SpinnerOptions {
8
+ /** Spinner diameter in px. Default: 24 */
9
+ size?: number;
10
+ /** CSS color for the spinner. Default: uses --color-primary */
11
+ color?: string;
12
+ /** Screen reader label. Default: 'Loading' */
13
+ label?: string;
14
+ /** Animation style. Default: 'border' */
15
+ variant?: 'border' | 'dots';
16
+ }
17
+ export interface SpinnerInstance {
18
+ /** Remove spinner from DOM and clean up. */
19
+ destroy(): void;
20
+ }
21
+ /** Create an accessible loading spinner. */
22
+ export declare function createSpinner(container: string | HTMLElement, options?: SpinnerOptions): SpinnerInstance;
23
+ //# sourceMappingURL=spinner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../src/spinner/spinner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,cAAc;IAC7B,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,OAAO,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,4CAA4C;IAC5C,OAAO,IAAI,IAAI,CAAC;CACjB;AAyBD,4CAA4C;AAC5C,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,GAAG,WAAW,EAC/B,OAAO,GAAE,cAAmB,GAC3B,eAAe,CA4DjB"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Nova Engine — Spinner
3
+ *
4
+ * Lightweight loading indicators with border and dots variants,
5
+ * accessible live regions, and reduced-motion support.
6
+ */
7
+ const STYLE_ID = 'nova-spinner-styles';
8
+ function injectStyles() {
9
+ if (document.getElementById(STYLE_ID))
10
+ return;
11
+ const s = document.createElement('style');
12
+ s.id = STYLE_ID;
13
+ s.textContent = `
14
+ .nova-spinner{display:inline-flex;align-items:center;justify-content:center;vertical-align:middle}
15
+ .nova-spinner__sr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
16
+ .nova-spinner-border{border-radius:50%;border-style:solid;border-color:var(--color-border,rgba(255,255,255,0.15));border-top-color:var(--color-primary,#a78bfa);animation:nova-spinner-rotate 0.75s linear infinite}
17
+ @keyframes nova-spinner-rotate{to{transform:rotate(360deg)}}
18
+ .nova-spinner-dots{display:inline-flex;align-items:center;gap:0.25em}
19
+ .nova-spinner-dot{border-radius:50%;background:var(--color-primary,#a78bfa);animation:nova-spinner-bounce 1.4s ease-in-out infinite both}
20
+ .nova-spinner-dot:nth-child(1){animation-delay:-0.32s}
21
+ .nova-spinner-dot:nth-child(2){animation-delay:-0.16s}
22
+ @keyframes nova-spinner-bounce{0%,80%,100%{transform:scale(0.4);opacity:0.4}40%{transform:scale(1);opacity:1}}
23
+ @media(prefers-reduced-motion:reduce){
24
+ .nova-spinner-border{animation:none;border-top-color:var(--color-primary,#a78bfa);opacity:0.8}
25
+ .nova-spinner-dot{animation:none;opacity:0.7}
26
+ }`;
27
+ document.head.appendChild(s);
28
+ }
29
+ /** Create an accessible loading spinner. */
30
+ export function createSpinner(container, options = {}) {
31
+ const { size = 24, color, label = 'Loading', variant = 'border', } = options;
32
+ const el = typeof container === 'string'
33
+ ? document.querySelector(container)
34
+ : container;
35
+ let destroyed = false;
36
+ injectStyles();
37
+ const wrapper = document.createElement('span');
38
+ wrapper.className = 'nova-spinner';
39
+ wrapper.setAttribute('role', 'status');
40
+ wrapper.setAttribute('aria-label', label);
41
+ // Visually hidden text for screen readers
42
+ const srText = document.createElement('span');
43
+ srText.className = 'nova-spinner__sr';
44
+ srText.textContent = label;
45
+ wrapper.appendChild(srText);
46
+ if (variant === 'border') {
47
+ const ring = document.createElement('span');
48
+ ring.className = 'nova-spinner-border';
49
+ const borderWidth = Math.max(2, Math.round(size / 8));
50
+ ring.style.width = `${size}px`;
51
+ ring.style.height = `${size}px`;
52
+ ring.style.borderWidth = `${borderWidth}px`;
53
+ if (color)
54
+ ring.style.borderTopColor = color;
55
+ wrapper.appendChild(ring);
56
+ }
57
+ else {
58
+ const dotsWrap = document.createElement('span');
59
+ dotsWrap.className = 'nova-spinner-dots';
60
+ const dotSize = Math.max(4, Math.round(size / 4));
61
+ for (let i = 0; i < 3; i++) {
62
+ const dot = document.createElement('span');
63
+ dot.className = 'nova-spinner-dot';
64
+ dot.style.width = `${dotSize}px`;
65
+ dot.style.height = `${dotSize}px`;
66
+ if (color)
67
+ dot.style.background = color;
68
+ dotsWrap.appendChild(dot);
69
+ }
70
+ wrapper.appendChild(dotsWrap);
71
+ }
72
+ el.appendChild(wrapper);
73
+ return {
74
+ destroy() {
75
+ if (destroyed)
76
+ return;
77
+ destroyed = true;
78
+ wrapper.remove();
79
+ },
80
+ };
81
+ }
82
+ //# sourceMappingURL=spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.js","sourceRoot":"","sources":[""],"names":[],"mappings":"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"}
@@ -6,11 +6,15 @@
6
6
  */
7
7
  type Listener<T = unknown> = (newValue: T, oldValue: T) => void;
8
8
  type AnyListener = () => void;
9
+ /** Middleware receives the mutation and must call next() to allow it. */
10
+ export type Middleware<T extends Record<string, any> = Record<string, any>> = (key: keyof T, newValue: unknown, oldValue: unknown, next: () => void) => void;
9
11
  export interface StoreOptions<T extends Record<string, any>> {
10
12
  /** Initial state */
11
13
  state: T;
12
14
  /** localStorage key for persistence (optional) */
13
15
  persist?: string;
16
+ /** Middleware chain — each must call next() to allow the mutation */
17
+ middleware?: Middleware<T>[];
14
18
  }
15
19
  export interface Store<T extends Record<string, any>> {
16
20
  /** Reactive state — mutate directly, subscribers are notified */
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/state/store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,KAAK,QAAQ,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC;AAChE,KAAK,WAAW,GAAG,MAAM,IAAI,CAAC;AAE9B,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IACzD,oBAAoB;IACpB,KAAK,EAAE,CAAC,CAAC;IACT,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAClD,iEAAiE;IACjE,KAAK,EAAE,CAAC,CAAC;IACT,kCAAkC;IAClC,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC;IAC3E,8BAA8B;IAC9B,KAAK,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,IAAI,CAAC;IACzC,sCAAsC;IACtC,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC;IACxB,6BAA6B;IAC7B,KAAK,IAAI,IAAI,CAAC;IACd,oEAAoE;IACpE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;CACrC;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAwG7F"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/state/store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,KAAK,QAAQ,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC;AAChE,KAAK,WAAW,GAAG,MAAM,IAAI,CAAC;AAE9B,yEAAyE;AACzE,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAC5E,GAAG,EAAE,MAAM,CAAC,EACZ,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE,OAAO,EACjB,IAAI,EAAE,MAAM,IAAI,KACb,IAAI,CAAC;AAEV,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IACzD,oBAAoB;IACpB,KAAK,EAAE,CAAC,CAAC;IACT,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAClD,iEAAiE;IACjE,KAAK,EAAE,CAAC,CAAC;IACT,kCAAkC;IAClC,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC;IAC3E,8BAA8B;IAC9B,KAAK,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,IAAI,CAAC;IACzC,sCAAsC;IACtC,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC;IACxB,6BAA6B;IAC7B,KAAK,IAAI,IAAI,CAAC;IACd,oEAAoE;IACpE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;CACrC;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CA2H7F"}
@@ -21,10 +21,15 @@ export function createStore(options) {
21
21
  }
22
22
  const keyListeners = new Map();
23
23
  const anyListeners = new Set();
24
+ const middlewares = options.middleware ?? [];
24
25
  let batching = false;
25
26
  const batchedKeys = new Set();
27
+ const batchedOldValues = new Map();
26
28
  function notify(key, newVal, oldVal) {
27
29
  if (batching) {
30
+ // Only capture the first old value per key during a batch
31
+ if (!batchedKeys.has(key))
32
+ batchedOldValues.set(key, oldVal);
28
33
  batchedKeys.add(key);
29
34
  return;
30
35
  }
@@ -35,9 +40,9 @@ export function createStore(options) {
35
40
  }
36
41
  for (const fn of anyListeners)
37
42
  fn();
38
- persist();
43
+ persistData();
39
44
  }
40
- function persist() {
45
+ function persistData() {
41
46
  if (!options.persist)
42
47
  return;
43
48
  try {
@@ -47,14 +52,27 @@ export function createStore(options) {
47
52
  // Quota exceeded, etc.
48
53
  }
49
54
  }
55
+ /** Run mutation through middleware chain */
56
+ function applySet(target, key, value, old) {
57
+ let index = 0;
58
+ function next() {
59
+ if (index < middlewares.length) {
60
+ middlewares[index++](key, value, old, next);
61
+ }
62
+ else {
63
+ target[key] = value;
64
+ notify(key, value, old);
65
+ }
66
+ }
67
+ next();
68
+ }
50
69
  const state = new Proxy(data, {
51
70
  set(target, prop, value) {
52
71
  const key = prop;
53
72
  const old = target[key];
54
73
  if (old === value)
55
74
  return true;
56
- target[prop] = value;
57
- notify(key, value, old);
75
+ applySet(target, key, value, old);
58
76
  return true;
59
77
  },
60
78
  get(target, prop) {
@@ -86,20 +104,22 @@ export function createStore(options) {
86
104
  batch(fn) {
87
105
  batching = true;
88
106
  batchedKeys.clear();
107
+ batchedOldValues.clear();
89
108
  fn(state);
90
109
  batching = false;
91
- // Notify once per changed key
110
+ // Notify once per changed key with correct old values
92
111
  for (const key of batchedKeys) {
93
112
  const listeners = keyListeners.get(key);
94
113
  if (listeners) {
114
+ const oldVal = batchedOldValues.get(key);
95
115
  for (const fn of listeners)
96
- fn(data[key], undefined);
116
+ fn(data[key], oldVal);
97
117
  }
98
118
  }
99
119
  if (batchedKeys.size > 0) {
100
120
  for (const fn of anyListeners)
101
121
  fn();
102
- persist();
122
+ persistData();
103
123
  }
104
124
  },
105
125
  };
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":[""],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":[""],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sw.d.ts","sourceRoot":"","sources":["../../src/sw/sw.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,eAAe,GAAG,wBAAwB,GAAG,cAAc,GAAG,YAAY,CAAC;AAEvH,MAAM,WAAW,SAAS;IACxB,qDAAqD;IACrD,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,4CAA4C;IAC5C,QAAQ,EAAE,aAAa,CAAC;IACxB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,gCAAgC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,+CAA+C;IAC/C,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,SAAc,GAAG,MAAM,CAmG1D;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAOhG;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAIrD"}
1
+ {"version":3,"file":"sw.d.ts","sourceRoot":"","sources":["../../src/sw/sw.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,eAAe,GAAG,wBAAwB,GAAG,cAAc,GAAG,YAAY,CAAC;AAEvH,MAAM,WAAW,SAAS;IACxB,qDAAqD;IACrD,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,4CAA4C;IAC5C,QAAQ,EAAE,aAAa,CAAC;IACxB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,gCAAgC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,+CAA+C;IAC/C,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,SAAc,GAAG,MAAM,CAmI1D;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAOhG;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAIrD"}
package/dist/sw/sw.js CHANGED
@@ -47,23 +47,52 @@ function matchRoute(url) {
47
47
  return null;
48
48
  }
49
49
 
50
- async function cacheFirst(request, cacheName, maxAge) {
50
+ async function enforceLimit(cacheName, maxEntries, maxAge) {
51
+ const cache = await caches.open(cacheName);
52
+ const keys = await cache.keys();
53
+ const now = Date.now();
54
+ const maxAgeMs = maxAge * 1000;
55
+
56
+ // Remove expired entries
57
+ for (const key of keys) {
58
+ const response = await cache.match(key);
59
+ if (!response) continue;
60
+ const dateHeader = response.headers.get('date');
61
+ if (dateHeader) {
62
+ const age = now - new Date(dateHeader).getTime();
63
+ if (age > maxAgeMs) await cache.delete(key);
64
+ }
65
+ }
66
+
67
+ // Enforce max entries (LRU: delete oldest first)
68
+ const remaining = await cache.keys();
69
+ if (remaining.length > maxEntries) {
70
+ const toRemove = remaining.length - maxEntries;
71
+ for (let i = 0; i < toRemove; i++) {
72
+ await cache.delete(remaining[i]);
73
+ }
74
+ }
75
+ }
76
+
77
+ async function cacheFirst(request, cacheName, maxEntries, maxAge) {
51
78
  const cached = await caches.match(request);
52
79
  if (cached) return cached;
53
80
  const response = await fetch(request);
54
81
  if (response.ok) {
55
82
  const cache = await caches.open(cacheName);
56
83
  cache.put(request, response.clone());
84
+ enforceLimit(cacheName, maxEntries, maxAge).catch(() => {});
57
85
  }
58
86
  return response;
59
87
  }
60
88
 
61
- async function networkFirst(request, cacheName) {
89
+ async function networkFirst(request, cacheName, maxEntries, maxAge) {
62
90
  try {
63
91
  const response = await fetch(request);
64
92
  if (response.ok) {
65
93
  const cache = await caches.open(cacheName);
66
94
  cache.put(request, response.clone());
95
+ enforceLimit(cacheName, maxEntries, maxAge).catch(() => {});
67
96
  }
68
97
  return response;
69
98
  } catch {
@@ -72,11 +101,14 @@ async function networkFirst(request, cacheName) {
72
101
  }
73
102
  }
74
103
 
75
- async function staleWhileRevalidate(request, cacheName) {
104
+ async function staleWhileRevalidate(request, cacheName, maxEntries, maxAge) {
76
105
  const cache = await caches.open(cacheName);
77
106
  const cached = await cache.match(request);
78
107
  const fetchPromise = fetch(request).then((response) => {
79
- if (response.ok) cache.put(request, response.clone());
108
+ if (response.ok) {
109
+ cache.put(request, response.clone());
110
+ enforceLimit(cacheName, maxEntries, maxAge).catch(() => {});
111
+ }
80
112
  return response;
81
113
  });
82
114
  return cached || fetchPromise;
@@ -88,11 +120,11 @@ self.addEventListener('fetch', (event) => {
88
120
  if (!route) return;
89
121
 
90
122
  if (route.strategy === 'cache-first') {
91
- event.respondWith(cacheFirst(event.request, route.cacheName, route.maxAge));
123
+ event.respondWith(cacheFirst(event.request, route.cacheName, route.maxEntries, route.maxAge));
92
124
  } else if (route.strategy === 'network-first') {
93
- event.respondWith(networkFirst(event.request, route.cacheName));
125
+ event.respondWith(networkFirst(event.request, route.cacheName, route.maxEntries, route.maxAge));
94
126
  } else if (route.strategy === 'stale-while-revalidate') {
95
- event.respondWith(staleWhileRevalidate(event.request, route.cacheName));
127
+ event.respondWith(staleWhileRevalidate(event.request, route.cacheName, route.maxEntries, route.maxAge));
96
128
  } else if (route.strategy === 'cache-only') {
97
129
  event.respondWith(caches.match(event.request).then(r => r || new Response('Not cached', { status: 404 })));
98
130
  }
package/dist/sw/sw.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sw.js","sourceRoot":"","sources":[""],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgCH;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,UAAqB,EAAE;IAChD,MAAM,EACJ,YAAY,GAAG,kBAAkB,EACjC,QAAQ,GAAG,EAAE,EACb,MAAM,GAAG,EAAE,EACX,eAAe,EACf,WAAW,GAAG,IAAI,EAClB,YAAY,GAAG,IAAI,GACpB,GAAG,OAAO,CAAC;IAEZ,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,YAAY,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC;QACvF,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,cAAc,CAAC;QACnD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;QACpC,OAAO,cAAc,KAAK,gBAAgB,IAAI,CAAC,QAAQ,kBAAkB,SAAS,kBAAkB,UAAU,aAAa,MAAM,IAAI,CAAC;IACxI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEf,OAAO;yBACgB,YAAY;wBACb,YAAY;oBAChB,aAAa;EAC/B,eAAe,CAAC,CAAC,CAAC,6BAA6B,eAAe,IAAI,CAAC,CAAC,CAAC,gCAAgC;;;IAGnG,WAAW,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE;;;;;;;IAOxC,YAAY,CAAC,CAAC,CAAC,wCAAwC,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiE/D,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW,EAAE,KAAc;IAC1D,IAAI,CAAC,CAAC,eAAe,IAAI,SAAS,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,IAAI,GAAwB,EAAE,CAAC;IACrC,IAAI,KAAK;QAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IAC9B,OAAO,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC,CAAC,eAAe,IAAI,SAAS,CAAC;QAAE,OAAO;IAC5C,MAAM,aAAa,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC;IACvE,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;AAC9D,CAAC"}
1
+ {"version":3,"file":"sw.js","sourceRoot":"","sources":[""],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgCH;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,UAAqB,EAAE;IAChD,MAAM,EACJ,YAAY,GAAG,kBAAkB,EACjC,QAAQ,GAAG,EAAE,EACb,MAAM,GAAG,EAAE,EACX,eAAe,EACf,WAAW,GAAG,IAAI,EAClB,YAAY,GAAG,IAAI,GACpB,GAAG,OAAO,CAAC;IAEZ,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,YAAY,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC;QACvF,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,cAAc,CAAC;QACnD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;QACpC,OAAO,cAAc,KAAK,gBAAgB,IAAI,CAAC,QAAQ,kBAAkB,SAAS,kBAAkB,UAAU,aAAa,MAAM,IAAI,CAAC;IACxI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEf,OAAO;yBACgB,YAAY;wBACb,YAAY;oBAChB,aAAa;EAC/B,eAAe,CAAC,CAAC,CAAC,6BAA6B,eAAe,IAAI,CAAC,CAAC,CAAC,gCAAgC;;;IAGnG,WAAW,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE;;;;;;;IAOxC,YAAY,CAAC,CAAC,CAAC,wCAAwC,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiG/D,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW,EAAE,KAAc;IAC1D,IAAI,CAAC,CAAC,eAAe,IAAI,SAAS,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,IAAI,GAAwB,EAAE,CAAC;IACrC,IAAI,KAAK;QAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IAC9B,OAAO,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC,CAAC,eAAe,IAAI,SAAS,CAAC;QAAE,OAAO;IAC5C,MAAM,aAAa,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC;IACvE,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { createSwitch } from './switch';
2
+ export type { SwitchOptions, SwitchInstance } from './switch';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/switch/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { createSwitch } from './switch';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":[""],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC"}