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/observe.ts DELETED
@@ -1,414 +0,0 @@
1
- import { OBSERVERS, CLEANUP, IS_CONTROLLER_INSTANCE } from './symbols';
2
-
3
- export interface ObserveOptions {
4
- /** For IntersectionObserver: threshold of visibility */
5
- threshold?: number | number[];
6
- /** For IntersectionObserver: margin around root */
7
- rootMargin?: string;
8
- /** For IntersectionObserver: root element (defaults to viewport) */
9
- root?: Element | null;
10
- /** For ResizeObserver: which box model to observe */
11
- box?: 'content-box' | 'border-box';
12
- /** Throttle the callback by specified milliseconds */
13
- throttle?: number;
14
- /** For MutationObserver: observe subtree (use with caution) */
15
- subtree?: boolean;
16
- /** Maximum depth for subtree observation (safety limit) */
17
- maxDepth?: number;
18
- }
19
-
20
- interface ObserverMetadata {
21
- type: string;
22
- target: string;
23
- selector?: string;
24
- methodName: string;
25
- method: Function;
26
- options?: ObserveOptions;
27
- }
28
-
29
- // Global cache for MediaQueryList objects
30
- const mediaQueryCache = new Map<string, MediaQueryList>();
31
-
32
- // Global WeakMap to track observer instances for reuse
33
- const intersectionObservers = new WeakMap<object, IntersectionObserver>();
34
-
35
- /**
36
- * Decorator for observing external changes like viewport intersection, resize, media queries, and DOM mutations
37
- *
38
- * @param target - The observation target (e.g., 'intersection', 'resize', 'media:(min-width: 768px)', 'mutation:childList') or array of targets
39
- * @param selectorOrOptions - CSS selector for element to observe OR options object
40
- * @param options - Options object (when second parameter is a selector)
41
- */
42
- export function observe(observeTarget: string | string[], selectorOrOptions?: string | ObserveOptions, options?: ObserveOptions) {
43
- // Handle overloaded parameters
44
- let selector: string | undefined;
45
- let opts: ObserveOptions | undefined;
46
-
47
- if (typeof selectorOrOptions === 'string') {
48
- selector = selectorOrOptions;
49
- opts = options;
50
- } else {
51
- selector = undefined;
52
- opts = selectorOrOptions;
53
- }
54
-
55
- return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
56
- // Store observer metadata
57
- if (!target[OBSERVERS]) {
58
- target[OBSERVERS] = [];
59
- }
60
-
61
- // Normalize to array
62
- const observeTargets = Array.isArray(observeTarget) ? observeTarget : [observeTarget];
63
-
64
- // Create an observer entry for each target
65
- for (const targetString of observeTargets) {
66
- // Parse the observation type from the observeTarget string
67
- const [type, ...modifiers] = targetString.split(':');
68
-
69
- target[OBSERVERS].push({
70
- type,
71
- target: modifiers.join(':'), // Rejoin for media queries or mutation types
72
- selector,
73
- methodName: propertyKey,
74
- method: descriptor.value,
75
- options: opts
76
- });
77
- }
78
-
79
- return descriptor;
80
- };
81
- }
82
-
83
- // Helper to setup observers for elements
84
- export function setupObservers(instance: any, element: HTMLElement) {
85
- // Only check the prototype, not the instance itself to avoid property access issues
86
- const observers = instance.constructor.prototype[OBSERVERS];
87
- if (!observers || !Array.isArray(observers) || observers.length === 0) {
88
- return;
89
- }
90
-
91
- // Initialize cleanup object if needed
92
- if (!instance[CLEANUP]) {
93
- instance[CLEANUP] = { events: [], channels: [], observers: [] };
94
- } else if (!instance[CLEANUP].observers) {
95
- instance[CLEANUP].observers = [];
96
- }
97
-
98
- for (const observer of observers) {
99
- const method = observer.method.bind(instance);
100
-
101
- // Apply throttling if specified
102
- const callback = observer.options?.throttle
103
- ? createThrottledCallback(method, observer.options.throttle)
104
- : method;
105
-
106
- switch (observer.type) {
107
- case 'intersection':
108
- setupIntersectionObserver(instance, element, observer, callback);
109
- break;
110
- case 'resize':
111
- setupResizeObserver(instance, element, observer, callback);
112
- break;
113
- case 'media':
114
- setupMediaQueryObserver(instance, element, observer, callback);
115
- break;
116
- case 'mutation':
117
- setupMutationObserver(instance, element, observer, callback);
118
- break;
119
- default:
120
- console.warn(`Unknown observer type: ${observer.type}`);
121
- }
122
- }
123
- }
124
-
125
- function setupIntersectionObserver(
126
- instance: any,
127
- element: HTMLElement,
128
- observer: ObserverMetadata,
129
- callback: Function
130
- ) {
131
- const options: IntersectionObserverInit = {
132
- threshold: observer.options?.threshold ?? 0,
133
- rootMargin: observer.options?.rootMargin ?? '0px',
134
- root: observer.options?.root ?? null
135
- };
136
-
137
- // Create a key for reusing observers with same options
138
- const optionsKey = JSON.stringify(options);
139
-
140
- // Wrap callback to handle return value
141
- const wrappedCallback = (entries: IntersectionObserverEntry[]) => {
142
- for (const entry of entries) {
143
- try {
144
- const result = callback(entry);
145
- // If callback returns false, stop observing that element
146
- if (result === false && io) {
147
- io.unobserve(entry.target);
148
- }
149
- } catch (error) {
150
- console.error(`Error in intersection observer ${observer.methodName}:`, error);
151
- }
152
- }
153
- };
154
-
155
- // Check if IntersectionObserver is available
156
- if (typeof IntersectionObserver === 'undefined') {
157
- console.warn('IntersectionObserver is not available in this environment');
158
- return;
159
- }
160
-
161
- // Create or reuse IntersectionObserver
162
- let io = intersectionObservers.get({ instance, options: optionsKey });
163
- if (!io) {
164
- io = new IntersectionObserver(wrappedCallback, options);
165
- intersectionObservers.set({ instance, options: optionsKey }, io);
166
- }
167
-
168
- // Find target elements
169
- const targets = observer.selector
170
- ? Array.from(element.shadowRoot?.querySelectorAll(observer.selector) || [])
171
- : [element];
172
-
173
- // Start observing
174
- targets.forEach(target => io!.observe(target));
175
-
176
- // Store cleanup
177
- instance[CLEANUP].observers.push(() => {
178
- targets.forEach(target => io!.unobserve(target));
179
- // Only disconnect if no more targets
180
- if (io!.takeRecords().length === 0) {
181
- io!.disconnect();
182
- }
183
- });
184
- }
185
-
186
- function setupResizeObserver(
187
- instance: any,
188
- element: HTMLElement,
189
- observer: ObserverMetadata,
190
- callback: Function
191
- ) {
192
- const box = observer.options?.box || 'content-box';
193
-
194
- // Wrap callback with error handling
195
- const wrappedCallback = (entries: ResizeObserverEntry[]) => {
196
- for (const entry of entries) {
197
- try {
198
- callback(entry);
199
- } catch (error) {
200
- console.error(`Error in resize observer ${observer.methodName}:`, error);
201
- }
202
- }
203
- };
204
-
205
- // Check if ResizeObserver is available
206
- if (typeof ResizeObserver === 'undefined') {
207
- console.warn('ResizeObserver is not available in this environment');
208
- return;
209
- }
210
-
211
- // Create ResizeObserver
212
- const ro = new ResizeObserver(wrappedCallback);
213
-
214
- // Find target elements
215
- const targets = observer.selector
216
- ? Array.from(element.shadowRoot?.querySelectorAll(observer.selector) || [])
217
- : [element];
218
-
219
- // Start observing with options
220
- targets.forEach(target => {
221
- ro.observe(target, { box });
222
- });
223
-
224
- // Store cleanup
225
- instance[CLEANUP].observers.push(() => {
226
- ro.disconnect();
227
- });
228
- }
229
-
230
- function setupMediaQueryObserver(
231
- instance: any,
232
- _element: HTMLElement,
233
- observer: ObserverMetadata,
234
- callback: Function
235
- ) {
236
- // Extract media query from target (e.g., "media:(min-width: 768px)" -> "(min-width: 768px)")
237
- const mediaQuery = observer.target;
238
-
239
- if (!mediaQuery) {
240
- console.warn('Media query observer requires a query string');
241
- return;
242
- }
243
-
244
- // Get or create MediaQueryList (cached globally)
245
- let mql = mediaQueryCache.get(mediaQuery);
246
- if (!mql) {
247
- try {
248
- mql = window.matchMedia(mediaQuery);
249
- mediaQueryCache.set(mediaQuery, mql);
250
- } catch (error) {
251
- console.error(`Invalid media query: ${mediaQuery}`, error);
252
- return;
253
- }
254
- }
255
-
256
- // Wrap callback with error handling
257
- const wrappedCallback = (event: MediaQueryListEvent | MediaQueryList) => {
258
- try {
259
- callback('matches' in event ? event.matches : (event as MediaQueryListEvent).matches);
260
- } catch (error) {
261
- console.error(`Error in media query observer ${observer.methodName}:`, error);
262
- }
263
- };
264
-
265
- // Call immediately with current state
266
- wrappedCallback(mql);
267
-
268
- // Listen for changes
269
- const changeHandler = (e: MediaQueryListEvent) => wrappedCallback(e);
270
-
271
- // Modern browsers use addEventListener
272
- if (mql.addEventListener) {
273
- mql.addEventListener('change', changeHandler);
274
- instance[CLEANUP].observers.push(() => {
275
- mql!.removeEventListener('change', changeHandler);
276
- });
277
- } else {
278
- // Fallback for older browsers
279
- mql.addListener(changeHandler);
280
- instance[CLEANUP].observers.push(() => {
281
- mql!.removeListener(changeHandler);
282
- });
283
- }
284
- }
285
-
286
- function setupMutationObserver(
287
- instance: any,
288
- element: HTMLElement,
289
- observer: ObserverMetadata,
290
- callback: Function
291
- ) {
292
- // Parse mutation type and attribute from target
293
- // e.g., "childList", "attributes:class", "attributes:data-state"
294
- const parts = observer.target.split(':');
295
- const mutationType = parts[0] || 'childList';
296
- const attributeName = parts[1];
297
-
298
- // Build MutationObserver options
299
- const options: MutationObserverInit = {};
300
-
301
- switch (mutationType) {
302
- case 'childList':
303
- options.childList = true;
304
- break;
305
- case 'attributes':
306
- options.attributes = true;
307
- if (attributeName) {
308
- options.attributeFilter = [attributeName];
309
- }
310
- break;
311
- default:
312
- console.warn(`Unknown mutation type: ${mutationType}`);
313
- return;
314
- }
315
-
316
- // Apply subtree with safety limits
317
- if (observer.options?.subtree) {
318
- options.subtree = true;
319
- // Could implement maxDepth checking in the callback
320
- if (observer.options.maxDepth) {
321
- console.warn('maxDepth is set but requires custom implementation');
322
- }
323
- }
324
-
325
- // Wrap callback with error handling
326
- const wrappedCallback = (mutations: MutationRecord[]) => {
327
- try {
328
- // Filter mutations if maxDepth is specified (simplified version)
329
- if (observer.options?.maxDepth && observer.options.subtree) {
330
- const maxDepth = observer.options!.maxDepth!;
331
- const filtered = mutations.filter(mutation => {
332
- // Simple depth check (could be more sophisticated)
333
- let depth = 0;
334
- let current = mutation.target as Node;
335
- const root = element.shadowRoot || element;
336
- while (current && current !== root && depth < maxDepth) {
337
- current = current.parentNode!;
338
- depth++;
339
- }
340
- return depth < maxDepth;
341
- });
342
- if (filtered.length > 0) {
343
- callback(filtered);
344
- }
345
- } else {
346
- callback(mutations);
347
- }
348
- } catch (error) {
349
- console.error(`Error in mutation observer ${observer.methodName}:`, error);
350
- }
351
- };
352
-
353
- // Create MutationObserver
354
- const mo = new MutationObserver(wrappedCallback);
355
-
356
- // Find target elements
357
- const isController = instance[IS_CONTROLLER_INSTANCE] === true;
358
-
359
- // For mutation observers without selector:
360
- // - Controllers: observe the shadow DOM of the element they're attached to (if it exists)
361
- // - Elements: observe the element itself (light DOM) to avoid infinite loops
362
- const targets = observer.selector
363
- ? Array.from(element.shadowRoot?.querySelectorAll(observer.selector) || [])
364
- : isController && element.shadowRoot
365
- ? [element.shadowRoot]
366
- : [element];
367
-
368
- // Start observing
369
- targets.forEach(target => {
370
- mo.observe(target, options);
371
- });
372
-
373
- // Store cleanup
374
- instance[CLEANUP].observers.push(() => {
375
- mo.disconnect();
376
- });
377
- }
378
-
379
- function createThrottledCallback(callback: Function, delay: number): Function {
380
- let lastCall = 0;
381
- let timeout: any = null;
382
-
383
- return function(this: any, ...args: any[]) {
384
- const now = Date.now();
385
- const remaining = delay - (now - lastCall);
386
-
387
- if (remaining <= 0) {
388
- // Enough time has passed, execute immediately
389
- if (timeout) {
390
- clearTimeout(timeout);
391
- timeout = null;
392
- }
393
- lastCall = now;
394
- return callback.apply(this, args);
395
- } else if (!timeout) {
396
- // Schedule for later
397
- timeout = setTimeout(() => {
398
- lastCall = Date.now();
399
- timeout = null;
400
- callback.apply(this, args);
401
- }, remaining);
402
- }
403
- };
404
- }
405
-
406
- // Helper to cleanup observers
407
- export function cleanupObservers(instance: any) {
408
- if (instance[CLEANUP]?.observers) {
409
- for (const cleanup of instance[CLEANUP].observers) {
410
- cleanup();
411
- }
412
- instance[CLEANUP].observers = [];
413
- }
414
- }