snice 1.13.2 → 1.13.4

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 (295) hide show
  1. package/bin/templates/base/README.md +1 -1
  2. package/dist/components/accordion/snice-accordion-item.d.ts +25 -0
  3. package/dist/components/accordion/snice-accordion-item.js +260 -0
  4. package/dist/components/accordion/snice-accordion-item.js.map +1 -0
  5. package/dist/components/accordion/snice-accordion.d.ts +28 -0
  6. package/dist/components/accordion/snice-accordion.js +221 -0
  7. package/dist/components/accordion/snice-accordion.js.map +1 -0
  8. package/dist/components/accordion/snice-accordion.types.d.ts +29 -0
  9. package/dist/components/accordion/snice-accordion.types.js +2 -0
  10. package/dist/components/accordion/snice-accordion.types.js.map +1 -0
  11. package/dist/components/alert/snice-alert.d.ts +26 -0
  12. package/dist/components/alert/snice-alert.js +191 -0
  13. package/dist/components/alert/snice-alert.js.map +1 -0
  14. package/dist/components/alert/snice-alert.types.d.ts +11 -0
  15. package/dist/components/alert/snice-alert.types.js +2 -0
  16. package/dist/components/alert/snice-alert.types.js.map +1 -0
  17. package/dist/components/avatar/snice-avatar.d.ts +24 -0
  18. package/dist/components/avatar/snice-avatar.js +177 -0
  19. package/dist/components/avatar/snice-avatar.js.map +1 -0
  20. package/dist/components/avatar/snice-avatar.types.d.ts +12 -0
  21. package/dist/components/avatar/snice-avatar.types.js +2 -0
  22. package/dist/components/avatar/snice-avatar.types.js.map +1 -0
  23. package/dist/components/badge/snice-badge.d.ts +25 -0
  24. package/dist/components/badge/snice-badge.js +157 -0
  25. package/dist/components/badge/snice-badge.js.map +1 -0
  26. package/dist/components/badge/snice-badge.types.d.ts +15 -0
  27. package/dist/components/badge/snice-badge.types.js +2 -0
  28. package/dist/components/badge/snice-badge.types.js.map +1 -0
  29. package/dist/components/breadcrumbs/snice-breadcrumbs.d.ts +27 -0
  30. package/dist/components/breadcrumbs/snice-breadcrumbs.js +212 -0
  31. package/dist/components/breadcrumbs/snice-breadcrumbs.js.map +1 -0
  32. package/dist/components/breadcrumbs/snice-breadcrumbs.types.d.ts +23 -0
  33. package/dist/components/breadcrumbs/snice-breadcrumbs.types.js +2 -0
  34. package/dist/components/breadcrumbs/snice-breadcrumbs.types.js.map +1 -0
  35. package/dist/components/breadcrumbs/snice-crumb.d.ts +9 -0
  36. package/dist/components/breadcrumbs/snice-crumb.js +50 -0
  37. package/dist/components/breadcrumbs/snice-crumb.js.map +1 -0
  38. package/dist/components/button/snice-button.d.ts +32 -0
  39. package/dist/components/button/snice-button.js +212 -0
  40. package/dist/components/button/snice-button.js.map +1 -0
  41. package/dist/components/button/snice-button.types.d.ts +23 -0
  42. package/dist/components/button/snice-button.types.js +2 -0
  43. package/dist/components/button/snice-button.types.js.map +1 -0
  44. package/dist/components/card/snice-card.d.ts +19 -0
  45. package/dist/components/card/snice-card.js +132 -0
  46. package/dist/components/card/snice-card.js.map +1 -0
  47. package/dist/components/card/snice-card.types.d.ts +9 -0
  48. package/dist/components/card/snice-card.types.js +2 -0
  49. package/dist/components/card/snice-card.types.js.map +1 -0
  50. package/dist/components/checkbox/snice-checkbox.d.ts +34 -0
  51. package/dist/components/checkbox/snice-checkbox.js +289 -0
  52. package/dist/components/checkbox/snice-checkbox.js.map +1 -0
  53. package/dist/components/checkbox/snice-checkbox.types.d.ts +20 -0
  54. package/dist/components/checkbox/snice-checkbox.types.js +2 -0
  55. package/dist/components/checkbox/snice-checkbox.types.js.map +1 -0
  56. package/dist/components/chip/snice-chip.d.ts +28 -0
  57. package/dist/components/chip/snice-chip.js +203 -0
  58. package/dist/components/chip/snice-chip.js.map +1 -0
  59. package/dist/components/chip/snice-chip.types.d.ts +14 -0
  60. package/dist/components/chip/snice-chip.types.js +2 -0
  61. package/dist/components/chip/snice-chip.types.js.map +1 -0
  62. package/dist/components/date-picker/snice-date-picker.d.ts +82 -0
  63. package/dist/components/date-picker/snice-date-picker.js +880 -0
  64. package/dist/components/date-picker/snice-date-picker.js.map +1 -0
  65. package/dist/components/date-picker/snice-date-picker.types.d.ts +71 -0
  66. package/dist/components/date-picker/snice-date-picker.types.js +2 -0
  67. package/dist/components/date-picker/snice-date-picker.types.js.map +1 -0
  68. package/dist/components/divider/snice-divider.d.ts +17 -0
  69. package/dist/components/divider/snice-divider.js +111 -0
  70. package/dist/components/divider/snice-divider.js.map +1 -0
  71. package/dist/components/divider/snice-divider.types.d.ts +14 -0
  72. package/dist/components/divider/snice-divider.types.js +2 -0
  73. package/dist/components/divider/snice-divider.types.js.map +1 -0
  74. package/dist/components/drawer/snice-drawer.d.ts +37 -0
  75. package/dist/components/drawer/snice-drawer.js +335 -0
  76. package/dist/components/drawer/snice-drawer.js.map +1 -0
  77. package/dist/components/drawer/snice-drawer.types.d.ts +16 -0
  78. package/dist/components/drawer/snice-drawer.types.js +2 -0
  79. package/dist/components/drawer/snice-drawer.types.js.map +1 -0
  80. package/dist/components/input/snice-input.d.ts +65 -0
  81. package/dist/components/input/snice-input.js +603 -0
  82. package/dist/components/input/snice-input.js.map +1 -0
  83. package/dist/components/input/snice-input.types.d.ts +53 -0
  84. package/dist/components/input/snice-input.types.js +2 -0
  85. package/dist/components/input/snice-input.types.js.map +1 -0
  86. package/dist/components/layout/snice-layout-blog.d.ts +4 -0
  87. package/dist/components/layout/snice-layout-blog.js +56 -0
  88. package/dist/components/layout/snice-layout-blog.js.map +1 -0
  89. package/dist/components/layout/snice-layout-card.d.ts +6 -0
  90. package/dist/components/layout/snice-layout-card.js +53 -0
  91. package/dist/components/layout/snice-layout-card.js.map +1 -0
  92. package/dist/components/layout/snice-layout-centered.d.ts +5 -0
  93. package/dist/components/layout/snice-layout-centered.js +38 -0
  94. package/dist/components/layout/snice-layout-centered.js.map +1 -0
  95. package/dist/components/layout/snice-layout-dashboard.d.ts +4 -0
  96. package/dist/components/layout/snice-layout-dashboard.js +53 -0
  97. package/dist/components/layout/snice-layout-dashboard.js.map +1 -0
  98. package/dist/components/layout/snice-layout-fullscreen.d.ts +5 -0
  99. package/dist/components/layout/snice-layout-fullscreen.js +50 -0
  100. package/dist/components/layout/snice-layout-fullscreen.js.map +1 -0
  101. package/dist/components/layout/snice-layout-landing.d.ts +4 -0
  102. package/dist/components/layout/snice-layout-landing.js +55 -0
  103. package/dist/components/layout/snice-layout-landing.js.map +1 -0
  104. package/dist/components/layout/snice-layout-minimal.d.ts +4 -0
  105. package/dist/components/layout/snice-layout-minimal.js +27 -0
  106. package/dist/components/layout/snice-layout-minimal.js.map +1 -0
  107. package/dist/components/layout/snice-layout-sidebar.d.ts +5 -0
  108. package/dist/components/layout/snice-layout-sidebar.js +64 -0
  109. package/dist/components/layout/snice-layout-sidebar.js.map +1 -0
  110. package/dist/components/layout/snice-layout-split.d.ts +6 -0
  111. package/dist/components/layout/snice-layout-split.js +47 -0
  112. package/dist/components/layout/snice-layout-split.js.map +1 -0
  113. package/dist/components/layout/snice-layout.d.ts +4 -0
  114. package/dist/components/layout/snice-layout.js +43 -0
  115. package/dist/components/layout/snice-layout.js.map +1 -0
  116. package/dist/components/layout/snice-layout.types.d.ts +3 -0
  117. package/dist/components/layout/snice-layout.types.js +2 -0
  118. package/dist/components/layout/snice-layout.types.js.map +1 -0
  119. package/dist/components/login/snice-login.d.ts +45 -0
  120. package/dist/components/login/snice-login.js +385 -0
  121. package/dist/components/login/snice-login.js.map +1 -0
  122. package/dist/components/login/snice-login.types.d.ts +31 -0
  123. package/dist/components/login/snice-login.types.js +2 -0
  124. package/dist/components/login/snice-login.types.js.map +1 -0
  125. package/dist/components/modal/snice-modal.d.ts +32 -0
  126. package/dist/components/modal/snice-modal.js +288 -0
  127. package/dist/components/modal/snice-modal.js.map +1 -0
  128. package/dist/components/modal/snice-modal.types.d.ts +18 -0
  129. package/dist/components/modal/snice-modal.types.js +2 -0
  130. package/dist/components/modal/snice-modal.types.js.map +1 -0
  131. package/dist/components/pagination/snice-pagination.d.ts +26 -0
  132. package/dist/components/pagination/snice-pagination.js +373 -0
  133. package/dist/components/pagination/snice-pagination.js.map +1 -0
  134. package/dist/components/pagination/snice-pagination.types.d.ts +18 -0
  135. package/dist/components/pagination/snice-pagination.types.js +2 -0
  136. package/dist/components/pagination/snice-pagination.types.js.map +1 -0
  137. package/dist/components/progress/snice-progress.d.ts +35 -0
  138. package/dist/components/progress/snice-progress.js +295 -0
  139. package/dist/components/progress/snice-progress.js.map +1 -0
  140. package/dist/components/progress/snice-progress.types.d.ts +18 -0
  141. package/dist/components/progress/snice-progress.types.js +2 -0
  142. package/dist/components/progress/snice-progress.types.js.map +1 -0
  143. package/dist/components/radio/snice-radio.d.ts +33 -0
  144. package/dist/components/radio/snice-radio.js +286 -0
  145. package/dist/components/radio/snice-radio.js.map +1 -0
  146. package/dist/components/radio/snice-radio.types.d.ts +19 -0
  147. package/dist/components/radio/snice-radio.types.js +2 -0
  148. package/dist/components/radio/snice-radio.types.js.map +1 -0
  149. package/dist/components/select/snice-option.d.ts +17 -0
  150. package/dist/components/select/snice-option.js +77 -0
  151. package/dist/components/select/snice-option.js.map +1 -0
  152. package/dist/components/select/snice-option.types.d.ts +14 -0
  153. package/dist/components/select/snice-option.types.js +2 -0
  154. package/dist/components/select/snice-option.types.js.map +1 -0
  155. package/dist/components/select/snice-select.d.ts +89 -0
  156. package/dist/components/select/snice-select.js +900 -0
  157. package/dist/components/select/snice-select.js.map +1 -0
  158. package/dist/components/select/snice-select.types.d.ts +49 -0
  159. package/dist/components/select/snice-select.types.js +2 -0
  160. package/dist/components/select/snice-select.types.js.map +1 -0
  161. package/dist/components/skeleton/snice-skeleton.d.ts +16 -0
  162. package/dist/components/skeleton/snice-skeleton.js +159 -0
  163. package/dist/components/skeleton/snice-skeleton.js.map +1 -0
  164. package/dist/components/skeleton/snice-skeleton.types.d.ts +10 -0
  165. package/dist/components/skeleton/snice-skeleton.types.js +2 -0
  166. package/dist/components/skeleton/snice-skeleton.types.js.map +1 -0
  167. package/dist/components/switch/snice-switch.d.ts +38 -0
  168. package/dist/components/switch/snice-switch.js +309 -0
  169. package/dist/components/switch/snice-switch.js.map +1 -0
  170. package/dist/components/switch/snice-switch.types.d.ts +21 -0
  171. package/dist/components/switch/snice-switch.types.js +2 -0
  172. package/dist/components/switch/snice-switch.types.js.map +1 -0
  173. package/dist/components/symbols.d.ts +1 -0
  174. package/dist/components/symbols.js +20 -0
  175. package/dist/components/symbols.js.map +1 -0
  176. package/dist/components/table/snice-cell-boolean.d.ts +21 -0
  177. package/dist/components/table/snice-cell-boolean.js +152 -0
  178. package/dist/components/table/snice-cell-boolean.js.map +1 -0
  179. package/dist/components/table/snice-cell-date.d.ts +24 -0
  180. package/dist/components/table/snice-cell-date.js +240 -0
  181. package/dist/components/table/snice-cell-date.js.map +1 -0
  182. package/dist/components/table/snice-cell-duration.d.ts +16 -0
  183. package/dist/components/table/snice-cell-duration.js +123 -0
  184. package/dist/components/table/snice-cell-duration.js.map +1 -0
  185. package/dist/components/table/snice-cell-filesize.d.ts +16 -0
  186. package/dist/components/table/snice-cell-filesize.js +119 -0
  187. package/dist/components/table/snice-cell-filesize.js.map +1 -0
  188. package/dist/components/table/snice-cell-number.d.ts +23 -0
  189. package/dist/components/table/snice-cell-number.js +202 -0
  190. package/dist/components/table/snice-cell-number.js.map +1 -0
  191. package/dist/components/table/snice-cell-progress.d.ts +17 -0
  192. package/dist/components/table/snice-cell-progress.js +114 -0
  193. package/dist/components/table/snice-cell-progress.js.map +1 -0
  194. package/dist/components/table/snice-cell-rating.d.ts +17 -0
  195. package/dist/components/table/snice-cell-rating.js +113 -0
  196. package/dist/components/table/snice-cell-rating.js.map +1 -0
  197. package/dist/components/table/snice-cell-sparkline.d.ts +29 -0
  198. package/dist/components/table/snice-cell-sparkline.js +290 -0
  199. package/dist/components/table/snice-cell-sparkline.js.map +1 -0
  200. package/dist/components/table/snice-cell-text.d.ts +19 -0
  201. package/dist/components/table/snice-cell-text.js +153 -0
  202. package/dist/components/table/snice-cell-text.js.map +1 -0
  203. package/dist/components/table/snice-cell.d.ts +32 -0
  204. package/dist/components/table/snice-cell.js +451 -0
  205. package/dist/components/table/snice-cell.js.map +1 -0
  206. package/dist/components/table/snice-column.d.ts +62 -0
  207. package/dist/components/table/snice-column.js +440 -0
  208. package/dist/components/table/snice-column.js.map +1 -0
  209. package/dist/components/table/snice-header.d.ts +33 -0
  210. package/dist/components/table/snice-header.js +303 -0
  211. package/dist/components/table/snice-header.js.map +1 -0
  212. package/dist/components/table/snice-progress.d.ts +10 -0
  213. package/dist/components/table/snice-progress.js +91 -0
  214. package/dist/components/table/snice-progress.js.map +1 -0
  215. package/dist/components/table/snice-rating.d.ts +9 -0
  216. package/dist/components/table/snice-rating.js +68 -0
  217. package/dist/components/table/snice-rating.js.map +1 -0
  218. package/dist/components/table/snice-row.d.ts +43 -0
  219. package/dist/components/table/snice-row.js +365 -0
  220. package/dist/components/table/snice-row.js.map +1 -0
  221. package/dist/components/table/snice-table.d.ts +69 -0
  222. package/dist/components/table/snice-table.js +814 -0
  223. package/dist/components/table/snice-table.js.map +1 -0
  224. package/dist/components/table/snice-table.types.d.ts +137 -0
  225. package/dist/components/table/snice-table.types.js +2 -0
  226. package/dist/components/table/snice-table.types.js.map +1 -0
  227. package/dist/components/tabs/snice-tab-panel.d.ts +12 -0
  228. package/dist/components/tabs/snice-tab-panel.js +78 -0
  229. package/dist/components/tabs/snice-tab-panel.js.map +1 -0
  230. package/dist/components/tabs/snice-tab.d.ts +13 -0
  231. package/dist/components/tabs/snice-tab.js +90 -0
  232. package/dist/components/tabs/snice-tab.js.map +1 -0
  233. package/dist/components/tabs/snice-tabs.d.ts +34 -0
  234. package/dist/components/tabs/snice-tabs.js +367 -0
  235. package/dist/components/tabs/snice-tabs.js.map +1 -0
  236. package/dist/components/tabs/snice-tabs.types.d.ts +23 -0
  237. package/dist/components/tabs/snice-tabs.types.js +2 -0
  238. package/dist/components/tabs/snice-tabs.types.js.map +1 -0
  239. package/dist/components/toast/snice-toast-container.d.ts +25 -0
  240. package/dist/components/toast/snice-toast-container.js +251 -0
  241. package/dist/components/toast/snice-toast-container.js.map +1 -0
  242. package/dist/components/toast/snice-toast.d.ts +23 -0
  243. package/dist/components/toast/snice-toast.js +316 -0
  244. package/dist/components/toast/snice-toast.js.map +1 -0
  245. package/dist/components/toast/snice-toast.types.d.ts +30 -0
  246. package/dist/components/toast/snice-toast.types.js +2 -0
  247. package/dist/components/toast/snice-toast.types.js.map +1 -0
  248. package/dist/components/tooltip/snice-tooltip.d.ts +50 -0
  249. package/dist/components/tooltip/snice-tooltip.js +656 -0
  250. package/dist/components/tooltip/snice-tooltip.js.map +1 -0
  251. package/dist/components/tooltip/snice-tooltip.types.d.ts +18 -0
  252. package/dist/components/tooltip/snice-tooltip.types.js +2 -0
  253. package/dist/components/tooltip/snice-tooltip.types.js.map +1 -0
  254. package/dist/components/transitions.d.ts +11 -0
  255. package/dist/components/transitions.js +69 -0
  256. package/dist/components/transitions.js.map +1 -0
  257. package/dist/src/controller.d.ts +61 -0
  258. package/dist/src/controller.js +297 -0
  259. package/dist/src/controller.js.map +1 -0
  260. package/dist/src/element.d.ts +77 -0
  261. package/dist/src/element.js +805 -0
  262. package/dist/src/element.js.map +1 -0
  263. package/dist/src/events.d.ts +37 -0
  264. package/dist/src/events.js +289 -0
  265. package/dist/src/events.js.map +1 -0
  266. package/dist/src/global.d.ts +7 -0
  267. package/dist/src/global.js +23 -0
  268. package/dist/src/global.js.map +1 -0
  269. package/{src/index.ts → dist/src/index.d.ts} +1 -1
  270. package/dist/src/index.js +8 -0
  271. package/dist/src/index.js.map +1 -0
  272. package/dist/src/observe.d.ts +26 -0
  273. package/dist/src/observe.js +329 -0
  274. package/dist/src/observe.js.map +1 -0
  275. package/dist/src/request-response.d.ts +46 -0
  276. package/dist/src/request-response.js +267 -0
  277. package/dist/src/request-response.js.map +1 -0
  278. package/dist/src/router.d.ts +87 -0
  279. package/dist/src/router.js +375 -0
  280. package/dist/src/router.js.map +1 -0
  281. package/dist/src/symbols.d.ts +29 -0
  282. package/{src/symbols.ts → dist/src/symbols.js} +2 -12
  283. package/dist/src/symbols.js.map +1 -0
  284. package/dist/src/transitions.d.ts +50 -0
  285. package/dist/src/transitions.js +199 -0
  286. package/dist/src/transitions.js.map +1 -0
  287. package/package.json +6 -8
  288. package/src/controller.ts +0 -347
  289. package/src/element.ts +0 -897
  290. package/src/events.ts +0 -349
  291. package/src/global.ts +0 -31
  292. package/src/observe.ts +0 -414
  293. package/src/request-response.ts +0 -336
  294. package/src/router.ts +0 -552
  295. package/src/transitions.ts +0 -264
package/src/events.ts DELETED
@@ -1,349 +0,0 @@
1
- import { ON_HANDLERS, CLEANUP } from './symbols';
2
-
3
- export interface OnOptions {
4
- /** Use capture phase instead of bubble phase */
5
- capture?: boolean;
6
- /** Remove listener after first trigger */
7
- once?: boolean;
8
- /** Passive listener (can't preventDefault) */
9
- passive?: boolean;
10
- /** Automatically call preventDefault on the event */
11
- preventDefault?: boolean;
12
- /** Automatically call stopPropagation on the event */
13
- stopPropagation?: boolean;
14
- /** Debounce the handler by specified milliseconds */
15
- debounce?: number;
16
- /** Throttle the handler by specified milliseconds */
17
- throttle?: number;
18
- }
19
-
20
- export function on(eventName: string | string[], selectorOrOptions?: string | OnOptions, options?: OnOptions) {
21
- // Handle overloaded parameters
22
- let selector: string | undefined;
23
- let opts: OnOptions | undefined;
24
-
25
- if (typeof selectorOrOptions === 'string') {
26
- selector = selectorOrOptions;
27
- opts = options;
28
- } else {
29
- selector = undefined;
30
- opts = selectorOrOptions;
31
- }
32
-
33
- return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
34
- // Store event handler metadata
35
- if (!target[ON_HANDLERS]) {
36
- target[ON_HANDLERS] = [];
37
- }
38
-
39
- // Normalize to array and expand at decoration time
40
- const eventNames = Array.isArray(eventName) ? eventName : [eventName];
41
-
42
- // Create a handler entry for each event
43
- for (const event of eventNames) {
44
- target[ON_HANDLERS].push({
45
- eventName: event,
46
- selector,
47
- methodName: propertyKey,
48
- method: descriptor.value,
49
- options: opts
50
- });
51
- }
52
-
53
- return descriptor;
54
- };
55
- }
56
-
57
- // Helper to setup event handlers for elements
58
- export function setupEventHandlers(instance: any, element: HTMLElement) {
59
- const handlers = instance.constructor.prototype[ON_HANDLERS];
60
- if (!handlers) return;
61
-
62
- // Initialize cleanup object if needed
63
- if (!instance[CLEANUP]) {
64
- instance[CLEANUP] = { events: [], channels: [] };
65
- }
66
-
67
- for (const handler of handlers) {
68
- const originalMethod = handler.method.bind(instance);
69
- const handlerOptions = handler.options || {};
70
-
71
- // Parse event name for key modifiers
72
- const [baseEventName, keyModifier] = handler.eventName.split(':');
73
-
74
- // Create debounced/throttled wrapper if needed
75
- const createTimedWrapper = (method: Function): Function => {
76
- if (handlerOptions.debounce) {
77
- let timeoutId: any;
78
- return function(this: any, ...args: any[]) {
79
- clearTimeout(timeoutId);
80
- timeoutId = setTimeout(() => method.apply(this, args), handlerOptions.debounce);
81
- };
82
- }
83
-
84
- if (handlerOptions.throttle) {
85
- let lastCall = 0;
86
- let timeoutId: any;
87
- return function(this: any, ...args: any[]) {
88
- const now = Date.now();
89
- const remaining = handlerOptions.throttle! - (now - lastCall);
90
-
91
- if (remaining <= 0) {
92
- clearTimeout(timeoutId);
93
- lastCall = now;
94
- method.apply(this, args);
95
- } else if (!timeoutId) {
96
- timeoutId = setTimeout(() => {
97
- lastCall = Date.now();
98
- timeoutId = null;
99
- method.apply(this, args);
100
- }, remaining);
101
- }
102
- };
103
- }
104
-
105
- return method;
106
- };
107
-
108
- // Create the event handler with key modifier support
109
- const createEventHandler = (method: Function) => {
110
- if (keyModifier && (baseEventName === 'keydown' || baseEventName === 'keyup' || baseEventName === 'keypress')) {
111
- return (event: Event) => {
112
- const keyEvent = event as KeyboardEvent;
113
-
114
- // Helper to normalize key names (e.g., "Space" -> " ")
115
- const normalizeKey = (key: string): string => {
116
- if (key === 'Space') return ' ';
117
- return key;
118
- };
119
-
120
- // Check for "any modifiers" match with ~ prefix
121
- if (keyModifier.startsWith('~')) {
122
- const key = normalizeKey(keyModifier.slice(1)); // Remove the ~ and normalize
123
- // Match if key matches, regardless of modifiers
124
- if (keyEvent.key === key) {
125
- method(event);
126
- }
127
- return;
128
- }
129
-
130
- // Check for modifier combinations using +
131
- if (keyModifier.includes('+')) {
132
- const parts = keyModifier.split('+');
133
- const key = normalizeKey(parts[parts.length - 1]); // Last part is the actual key
134
- const modifiers = parts.slice(0, -1); // Everything else is modifiers
135
-
136
- // Check the actual key
137
- if (keyEvent.key !== key) return;
138
-
139
- // Create a set of expected modifiers
140
- const expectedModifiers = new Set(modifiers.map((m: string) => m.toLowerCase()));
141
- const hasCtrl = expectedModifiers.has('ctrl');
142
- const hasShift = expectedModifiers.has('shift');
143
- const hasAlt = expectedModifiers.has('alt');
144
- const hasMeta = expectedModifiers.has('meta') || expectedModifiers.has('cmd');
145
-
146
- // Check that expected modifiers are pressed and unexpected ones are not
147
- const modifiersMatch =
148
- keyEvent.ctrlKey === hasCtrl &&
149
- keyEvent.shiftKey === hasShift &&
150
- keyEvent.altKey === hasAlt &&
151
- keyEvent.metaKey === hasMeta;
152
-
153
- if (modifiersMatch) {
154
- method(event);
155
- }
156
- } else {
157
- // Default: exact match (no modifiers allowed)
158
- const key = normalizeKey(keyModifier);
159
- // Only match if key matches AND no modifiers are pressed
160
- if (keyEvent.key === key &&
161
- !keyEvent.ctrlKey &&
162
- !keyEvent.shiftKey &&
163
- !keyEvent.altKey &&
164
- !keyEvent.metaKey) {
165
- method(event);
166
- }
167
- }
168
- };
169
- }
170
- return method;
171
- };
172
-
173
- // Apply timing wrapper (debounce/throttle)
174
- const timedMethod = createTimedWrapper(originalMethod);
175
-
176
- // Wrap boundMethod in try-catch for error isolation
177
- const wrappedMethod = createEventHandler((event: Event) => {
178
- try {
179
- // Apply automatic preventDefault/stopPropagation if configured
180
- if (handlerOptions.preventDefault) {
181
- event.preventDefault();
182
- }
183
- if (handlerOptions.stopPropagation) {
184
- event.stopPropagation();
185
- }
186
-
187
- return timedMethod(event);
188
- } catch (error) {
189
- console.error(`Error in event handler ${handler.methodName}:`, error);
190
- // Don't rethrow - allow other handlers to continue
191
- }
192
- });
193
-
194
- if (handler.selector) {
195
- // Delegated event handling - use shadow root if available
196
- const eventRoot = element.shadowRoot || element;
197
- const delegatedHandler = (event: Event) => {
198
- const target = event.target as HTMLElement;
199
- let shouldHandle = false;
200
-
201
- if (target.matches && target.matches(handler.selector)) {
202
- shouldHandle = true;
203
- } else if (target.closest) {
204
- const closest = target.closest(handler.selector);
205
- if (closest) {
206
- shouldHandle = true;
207
- }
208
- }
209
-
210
- if (shouldHandle) {
211
- // Apply automatic preventDefault/stopPropagation only if we're handling this event
212
- if (handlerOptions.preventDefault) {
213
- event.preventDefault();
214
- }
215
- if (handlerOptions.stopPropagation) {
216
- event.stopPropagation();
217
- event.stopImmediatePropagation(); // Also stop other handlers on same element
218
- }
219
-
220
- wrappedMethod(event);
221
- }
222
- };
223
-
224
- const listenerOptions: AddEventListenerOptions = {
225
- capture: handlerOptions.capture || false,
226
- once: handlerOptions.once || false,
227
- passive: handlerOptions.passive || false
228
- };
229
-
230
- eventRoot.addEventListener(baseEventName, delegatedHandler, listenerOptions);
231
- instance[CLEANUP].events.push(() => {
232
- eventRoot.removeEventListener(baseEventName, delegatedHandler, listenerOptions);
233
- });
234
- } else {
235
- // Direct event handling - always on the element itself
236
- const listenerOptions: AddEventListenerOptions = {
237
- capture: handlerOptions.capture || false,
238
- once: handlerOptions.once || false,
239
- passive: handlerOptions.passive || false
240
- };
241
-
242
- element.addEventListener(baseEventName, wrappedMethod as EventListener, listenerOptions);
243
- instance[CLEANUP].events.push(() => {
244
- element.removeEventListener(baseEventName, wrappedMethod as EventListener, listenerOptions);
245
- });
246
- }
247
- }
248
- }
249
-
250
- // Helper to cleanup event handlers
251
- export function cleanupEventHandlers(instance: any) {
252
- if (instance[CLEANUP]?.events) {
253
- for (const cleanup of instance[CLEANUP].events) {
254
- cleanup();
255
- }
256
- instance[CLEANUP].events = [];
257
- }
258
- }
259
-
260
- export interface DispatchOptions extends EventInit {
261
- /**
262
- * Whether to dispatch even if the method returns undefined (default: true)
263
- */
264
- dispatchOnUndefined?: boolean;
265
- /** Debounce the dispatch by specified milliseconds */
266
- debounce?: number;
267
- /** Throttle the dispatch by specified milliseconds */
268
- throttle?: number;
269
- }
270
-
271
- /**
272
- * Decorator that automatically dispatches a custom event after a method is called.
273
- * The return value of the method becomes the event detail.
274
- *
275
- * @param eventName The name of the event to dispatch
276
- * @param options Optional configuration extending EventInit
277
- */
278
- export function dispatch(eventName: string, options?: DispatchOptions) {
279
- return function (_target: any, _propertyKey: string, descriptor: PropertyDescriptor) {
280
- const originalMethod = descriptor.value;
281
-
282
- // Create timing wrappers for dispatch
283
- let debounceTimeout: any;
284
- let throttleLastCall = 0;
285
- let throttleTimeout: any;
286
-
287
- descriptor.value = function (this: HTMLElement, ...args: any[]) {
288
- // Call the original method
289
- const result = originalMethod.apply(this, args);
290
-
291
- // Helper to dispatch the event
292
- const doDispatch = (detail: any) => {
293
- // Skip dispatch if result is undefined and dispatchOnUndefined is false
294
- if (detail === undefined && options?.dispatchOnUndefined === false) {
295
- return;
296
- }
297
-
298
- // Create event with spread operator for options
299
- const event = new CustomEvent(eventName, {
300
- bubbles: true, // Default to true for component events
301
- composed: true, // Allow crossing shadow DOM boundaries
302
- ...options, // Spread all EventInit options
303
- detail
304
- });
305
-
306
- this.dispatchEvent(event);
307
- };
308
-
309
- // Helper to handle timed dispatch
310
- const timedDispatch = (detail: any) => {
311
- if (options?.debounce) {
312
- clearTimeout(debounceTimeout);
313
- debounceTimeout = setTimeout(() => doDispatch(detail), options.debounce);
314
- } else if (options?.throttle) {
315
- const now = Date.now();
316
- const remaining = options.throttle - (now - throttleLastCall);
317
-
318
- if (remaining <= 0) {
319
- clearTimeout(throttleTimeout);
320
- throttleLastCall = now;
321
- doDispatch(detail);
322
- } else if (!throttleTimeout) {
323
- throttleTimeout = setTimeout(() => {
324
- throttleLastCall = Date.now();
325
- throttleTimeout = null;
326
- doDispatch(detail);
327
- }, remaining);
328
- }
329
- } else {
330
- doDispatch(detail);
331
- }
332
- };
333
-
334
- // Handle async methods
335
- if (result instanceof Promise) {
336
- return result.then((resolvedResult: any) => {
337
- timedDispatch(resolvedResult);
338
- return resolvedResult;
339
- });
340
- }
341
-
342
- // Sync method
343
- timedDispatch(result);
344
- return result;
345
- };
346
-
347
- return descriptor;
348
- };
349
- }
package/src/global.ts DELETED
@@ -1,31 +0,0 @@
1
- // Global namespace for Snice framework
2
- // Ensures all registries and symbols are shared across different JS files/modules
3
-
4
- export interface SniceGlobal {
5
- controllerRegistry: Map<string, any>;
6
- controllerIdCounter: number;
7
- symbols: Map<string, symbol>;
8
- }
9
-
10
- // Initialize or get the global Snice namespace
11
- function initGlobalNamespace(): SniceGlobal {
12
- if (!(globalThis as any).snice) {
13
- (globalThis as any).snice = {
14
- controllerRegistry: new Map(),
15
- controllerIdCounter: 0,
16
- symbols: new Map()
17
- };
18
- }
19
- return (globalThis as any).snice;
20
- }
21
-
22
- // Export the global namespace
23
- export const snice = initGlobalNamespace();
24
-
25
- // Helper function to get or create a global symbol
26
- export function getSymbol(name: string): symbol {
27
- if (!snice.symbols.has(name)) {
28
- snice.symbols.set(name, Symbol(name));
29
- }
30
- return snice.symbols.get(name)!;
31
- }