snice 5.2.1 → 5.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (310) hide show
  1. package/adapters/react/SniceProvider.js +1 -1
  2. package/adapters/react/SniceRouter.js +1 -1
  3. package/adapters/react/matchRoute.js +1 -1
  4. package/adapters/react/useRequestHandler.js +1 -1
  5. package/dist/cdn/accordion/snice-accordion.js +1 -1
  6. package/dist/cdn/accordion/snice-accordion.min.js +1 -1
  7. package/dist/cdn/action-bar/snice-action-bar.js +1 -1
  8. package/dist/cdn/action-bar/snice-action-bar.min.js +1 -1
  9. package/dist/cdn/activity-feed/snice-activity-feed.js +1 -1
  10. package/dist/cdn/activity-feed/snice-activity-feed.min.js +1 -1
  11. package/dist/cdn/alert/snice-alert.js +1 -1
  12. package/dist/cdn/alert/snice-alert.min.js +1 -1
  13. package/dist/cdn/app-tiles/snice-app-tiles.js +1 -1
  14. package/dist/cdn/app-tiles/snice-app-tiles.min.js +1 -1
  15. package/dist/cdn/approval-flow/snice-approval-flow.js +1 -1
  16. package/dist/cdn/approval-flow/snice-approval-flow.min.js +1 -1
  17. package/dist/cdn/audio-recorder/snice-audio-recorder.js +1 -1
  18. package/dist/cdn/audio-recorder/snice-audio-recorder.min.js +1 -1
  19. package/dist/cdn/availability/snice-availability.js +1 -1
  20. package/dist/cdn/availability/snice-availability.min.js +1 -1
  21. package/dist/cdn/avatar/snice-avatar.js +1 -1
  22. package/dist/cdn/avatar/snice-avatar.min.js +1 -1
  23. package/dist/cdn/avatar-group/snice-avatar-group.js +1 -1
  24. package/dist/cdn/avatar-group/snice-avatar-group.min.js +1 -1
  25. package/dist/cdn/badge/snice-badge.js +1 -1
  26. package/dist/cdn/badge/snice-badge.min.js +1 -1
  27. package/dist/cdn/banner/snice-banner.js +1 -1
  28. package/dist/cdn/banner/snice-banner.min.js +1 -1
  29. package/dist/cdn/binpack/snice-binpack.js +1 -1
  30. package/dist/cdn/binpack/snice-binpack.min.js +1 -1
  31. package/dist/cdn/book/snice-book.js +1 -1
  32. package/dist/cdn/book/snice-book.min.js +1 -1
  33. package/dist/cdn/booking/snice-booking.js +1 -1
  34. package/dist/cdn/booking/snice-booking.min.js +1 -1
  35. package/dist/cdn/breadcrumbs/snice-breadcrumbs.js +1 -1
  36. package/dist/cdn/breadcrumbs/snice-breadcrumbs.min.js +1 -1
  37. package/dist/cdn/button/snice-button.js +1 -1
  38. package/dist/cdn/button/snice-button.min.js +1 -1
  39. package/dist/cdn/calendar/snice-calendar.js +1 -1
  40. package/dist/cdn/calendar/snice-calendar.min.js +1 -1
  41. package/dist/cdn/camera/snice-camera.js +1 -1
  42. package/dist/cdn/camera/snice-camera.min.js +1 -1
  43. package/dist/cdn/camera-annotate/snice-camera-annotate.js +1 -1
  44. package/dist/cdn/camera-annotate/snice-camera-annotate.min.js +1 -1
  45. package/dist/cdn/candlestick/snice-candlestick.js +1 -1
  46. package/dist/cdn/candlestick/snice-candlestick.min.js +1 -1
  47. package/dist/cdn/card/snice-card.js +1 -1
  48. package/dist/cdn/card/snice-card.min.js +1 -1
  49. package/dist/cdn/carousel/snice-carousel.js +1 -1
  50. package/dist/cdn/carousel/snice-carousel.min.js +1 -1
  51. package/dist/cdn/cart/snice-cart.js +1 -1
  52. package/dist/cdn/cart/snice-cart.min.js +1 -1
  53. package/dist/cdn/chart/snice-chart.js +1 -1
  54. package/dist/cdn/chart/snice-chart.min.js +1 -1
  55. package/dist/cdn/chat/snice-chat.js +1 -1
  56. package/dist/cdn/chat/snice-chat.min.js +1 -1
  57. package/dist/cdn/checkbox/snice-checkbox.js +1 -1
  58. package/dist/cdn/checkbox/snice-checkbox.min.js +1 -1
  59. package/dist/cdn/chip/snice-chip.js +1 -1
  60. package/dist/cdn/chip/snice-chip.min.js +1 -1
  61. package/dist/cdn/code-block/snice-code-block.js +1 -1
  62. package/dist/cdn/code-block/snice-code-block.min.js +1 -1
  63. package/dist/cdn/color-display/snice-color-display.js +1 -1
  64. package/dist/cdn/color-display/snice-color-display.min.js +1 -1
  65. package/dist/cdn/color-picker/snice-color-picker.js +1 -1
  66. package/dist/cdn/color-picker/snice-color-picker.min.js +1 -1
  67. package/dist/cdn/command-palette/snice-command-palette.js +1 -1
  68. package/dist/cdn/command-palette/snice-command-palette.min.js +1 -1
  69. package/dist/cdn/comments/snice-comments.js +1 -1
  70. package/dist/cdn/comments/snice-comments.min.js +1 -1
  71. package/dist/cdn/countdown/snice-countdown.js +1 -1
  72. package/dist/cdn/countdown/snice-countdown.min.js +1 -1
  73. package/dist/cdn/cropper/snice-cropper.js +1 -1
  74. package/dist/cdn/cropper/snice-cropper.min.js +1 -1
  75. package/dist/cdn/data-card/snice-data-card.js +1 -1
  76. package/dist/cdn/data-card/snice-data-card.min.js +1 -1
  77. package/dist/cdn/date-picker/snice-date-picker.js +1 -1
  78. package/dist/cdn/date-picker/snice-date-picker.min.js +1 -1
  79. package/dist/cdn/date-range-picker/snice-date-range-picker.js +1 -1
  80. package/dist/cdn/date-range-picker/snice-date-range-picker.min.js +1 -1
  81. package/dist/cdn/date-time-picker/snice-date-time-picker.js +1 -1
  82. package/dist/cdn/date-time-picker/snice-date-time-picker.min.js +1 -1
  83. package/dist/cdn/diff/snice-diff.js +1 -1
  84. package/dist/cdn/diff/snice-diff.min.js +1 -1
  85. package/dist/cdn/divider/snice-divider.js +1 -1
  86. package/dist/cdn/divider/snice-divider.min.js +1 -1
  87. package/dist/cdn/doc/snice-doc.js +1 -1
  88. package/dist/cdn/doc/snice-doc.min.js +1 -1
  89. package/dist/cdn/draw/snice-draw.js +1 -1
  90. package/dist/cdn/draw/snice-draw.min.js +1 -1
  91. package/dist/cdn/drawer/snice-drawer.js +1 -1
  92. package/dist/cdn/drawer/snice-drawer.min.js +1 -1
  93. package/dist/cdn/empty-state/snice-empty-state.js +1 -1
  94. package/dist/cdn/empty-state/snice-empty-state.min.js +1 -1
  95. package/dist/cdn/estimate/snice-estimate.js +1 -1
  96. package/dist/cdn/estimate/snice-estimate.min.js +1 -1
  97. package/dist/cdn/file-gallery/snice-file-gallery.js +1 -1
  98. package/dist/cdn/file-gallery/snice-file-gallery.min.js +1 -1
  99. package/dist/cdn/file-upload/snice-file-upload.js +1 -1
  100. package/dist/cdn/file-upload/snice-file-upload.min.js +1 -1
  101. package/dist/cdn/flip-card/snice-flip-card.js +1 -1
  102. package/dist/cdn/flip-card/snice-flip-card.min.js +1 -1
  103. package/dist/cdn/flow/snice-flow.js +1 -1
  104. package/dist/cdn/flow/snice-flow.min.js +1 -1
  105. package/dist/cdn/form-layout/snice-form-layout.js +1 -1
  106. package/dist/cdn/form-layout/snice-form-layout.min.js +1 -1
  107. package/dist/cdn/funnel/snice-funnel.js +1 -1
  108. package/dist/cdn/funnel/snice-funnel.min.js +1 -1
  109. package/dist/cdn/gantt/snice-gantt.js +1 -1
  110. package/dist/cdn/gantt/snice-gantt.min.js +1 -1
  111. package/dist/cdn/gauge/snice-gauge.js +1 -1
  112. package/dist/cdn/gauge/snice-gauge.min.js +1 -1
  113. package/dist/cdn/grid/snice-grid.js +1 -1
  114. package/dist/cdn/grid/snice-grid.min.js +1 -1
  115. package/dist/cdn/heatmap/snice-heatmap.js +1 -1
  116. package/dist/cdn/heatmap/snice-heatmap.min.js +1 -1
  117. package/dist/cdn/image/snice-image.js +1 -1
  118. package/dist/cdn/image/snice-image.min.js +1 -1
  119. package/dist/cdn/input/snice-input.js +1 -1
  120. package/dist/cdn/input/snice-input.min.js +1 -1
  121. package/dist/cdn/invoice/snice-invoice.js +1 -1
  122. package/dist/cdn/invoice/snice-invoice.min.js +1 -1
  123. package/dist/cdn/kanban/snice-kanban.js +1 -1
  124. package/dist/cdn/kanban/snice-kanban.min.js +1 -1
  125. package/dist/cdn/key-value/snice-key-value.js +1 -1
  126. package/dist/cdn/key-value/snice-key-value.min.js +1 -1
  127. package/dist/cdn/kpi/snice-kpi.js +1 -1
  128. package/dist/cdn/kpi/snice-kpi.min.js +1 -1
  129. package/dist/cdn/layout/snice-layout.js +1 -1
  130. package/dist/cdn/layout/snice-layout.min.js +1 -1
  131. package/dist/cdn/leaderboard/snice-leaderboard.js +1 -1
  132. package/dist/cdn/leaderboard/snice-leaderboard.min.js +1 -1
  133. package/dist/cdn/link/snice-link.js +1 -1
  134. package/dist/cdn/link/snice-link.min.js +1 -1
  135. package/dist/cdn/link-preview/snice-link-preview.js +1 -1
  136. package/dist/cdn/link-preview/snice-link-preview.min.js +1 -1
  137. package/dist/cdn/list/snice-list.js +1 -1
  138. package/dist/cdn/list/snice-list.min.js +1 -1
  139. package/dist/cdn/location/snice-location.js +1 -1
  140. package/dist/cdn/location/snice-location.min.js +1 -1
  141. package/dist/cdn/login/snice-login.js +1 -1
  142. package/dist/cdn/login/snice-login.min.js +1 -1
  143. package/dist/cdn/map/snice-map.js +1 -1
  144. package/dist/cdn/map/snice-map.min.js +1 -1
  145. package/dist/cdn/markdown/snice-markdown.js +1 -1
  146. package/dist/cdn/markdown/snice-markdown.min.js +1 -1
  147. package/dist/cdn/masonry/snice-masonry.js +1 -1
  148. package/dist/cdn/masonry/snice-masonry.min.js +1 -1
  149. package/dist/cdn/menu/snice-menu.js +1 -1
  150. package/dist/cdn/menu/snice-menu.min.js +1 -1
  151. package/dist/cdn/message-strip/snice-message-strip.js +1 -1
  152. package/dist/cdn/message-strip/snice-message-strip.min.js +1 -1
  153. package/dist/cdn/metric-table/snice-metric-table.js +1 -1
  154. package/dist/cdn/metric-table/snice-metric-table.min.js +1 -1
  155. package/dist/cdn/modal/snice-modal.js +1 -1
  156. package/dist/cdn/modal/snice-modal.min.js +1 -1
  157. package/dist/cdn/music-player/snice-music-player.js +1 -1
  158. package/dist/cdn/music-player/snice-music-player.min.js +1 -1
  159. package/dist/cdn/nav/snice-nav.js +1 -1
  160. package/dist/cdn/nav/snice-nav.min.js +1 -1
  161. package/dist/cdn/network-graph/snice-network-graph.js +1 -1
  162. package/dist/cdn/network-graph/snice-network-graph.min.js +1 -1
  163. package/dist/cdn/notification-center/snice-notification-center.js +1 -1
  164. package/dist/cdn/notification-center/snice-notification-center.min.js +1 -1
  165. package/dist/cdn/order-tracker/snice-order-tracker.js +1 -1
  166. package/dist/cdn/order-tracker/snice-order-tracker.min.js +1 -1
  167. package/dist/cdn/org-chart/snice-org-chart.js +1 -1
  168. package/dist/cdn/org-chart/snice-org-chart.min.js +1 -1
  169. package/dist/cdn/pagination/snice-pagination.js +1 -1
  170. package/dist/cdn/pagination/snice-pagination.min.js +1 -1
  171. package/dist/cdn/paint/snice-paint.js +1 -1
  172. package/dist/cdn/paint/snice-paint.min.js +1 -1
  173. package/dist/cdn/pdf-viewer/snice-pdf-viewer.js +1 -1
  174. package/dist/cdn/pdf-viewer/snice-pdf-viewer.min.js +1 -1
  175. package/dist/cdn/permission-matrix/snice-permission-matrix.js +1 -1
  176. package/dist/cdn/permission-matrix/snice-permission-matrix.min.js +1 -1
  177. package/dist/cdn/podcast-player/snice-podcast-player.js +1 -1
  178. package/dist/cdn/podcast-player/snice-podcast-player.min.js +1 -1
  179. package/dist/cdn/popover/snice-popover.js +1 -1
  180. package/dist/cdn/popover/snice-popover.min.js +1 -1
  181. package/dist/cdn/pricing-table/snice-pricing-table.js +1 -1
  182. package/dist/cdn/pricing-table/snice-pricing-table.min.js +1 -1
  183. package/dist/cdn/product-card/snice-product-card.js +1 -1
  184. package/dist/cdn/product-card/snice-product-card.min.js +1 -1
  185. package/dist/cdn/progress/snice-progress.js +1 -1
  186. package/dist/cdn/progress/snice-progress.min.js +1 -1
  187. package/dist/cdn/progress-ring/snice-progress-ring.js +1 -1
  188. package/dist/cdn/progress-ring/snice-progress-ring.min.js +1 -1
  189. package/dist/cdn/qr-code/snice-qr-code.js +1 -1
  190. package/dist/cdn/qr-code/snice-qr-code.min.js +1 -1
  191. package/dist/cdn/qr-reader/snice-qr-reader.js +1 -1
  192. package/dist/cdn/qr-reader/snice-qr-reader.min.js +1 -1
  193. package/dist/cdn/radio/snice-radio.js +1 -1
  194. package/dist/cdn/radio/snice-radio.min.js +1 -1
  195. package/dist/cdn/range-slider/snice-range-slider.js +1 -1
  196. package/dist/cdn/range-slider/snice-range-slider.min.js +1 -1
  197. package/dist/cdn/rating/snice-rating.js +1 -1
  198. package/dist/cdn/rating/snice-rating.min.js +1 -1
  199. package/dist/cdn/receipt/snice-receipt.js +1 -1
  200. package/dist/cdn/receipt/snice-receipt.min.js +1 -1
  201. package/dist/cdn/recipe/snice-recipe.js +1 -1
  202. package/dist/cdn/recipe/snice-recipe.min.js +1 -1
  203. package/dist/cdn/runtime/README.md +2 -2
  204. package/dist/cdn/runtime/snice-runtime.esm.js +161 -236
  205. package/dist/cdn/runtime/snice-runtime.esm.js.map +1 -1
  206. package/dist/cdn/runtime/snice-runtime.esm.min.js +8 -8
  207. package/dist/cdn/runtime/snice-runtime.esm.min.js.map +1 -1
  208. package/dist/cdn/runtime/snice-runtime.js +161 -236
  209. package/dist/cdn/runtime/snice-runtime.js.map +1 -1
  210. package/dist/cdn/runtime/snice-runtime.min.js +8 -8
  211. package/dist/cdn/runtime/snice-runtime.min.js.map +1 -1
  212. package/dist/cdn/sankey/snice-sankey.js +1 -1
  213. package/dist/cdn/sankey/snice-sankey.min.js +1 -1
  214. package/dist/cdn/segmented-control/snice-segmented-control.js +1 -1
  215. package/dist/cdn/segmented-control/snice-segmented-control.min.js +1 -1
  216. package/dist/cdn/select/snice-select.js +1 -1
  217. package/dist/cdn/select/snice-select.min.js +1 -1
  218. package/dist/cdn/skeleton/snice-skeleton.js +1 -1
  219. package/dist/cdn/skeleton/snice-skeleton.min.js +1 -1
  220. package/dist/cdn/slider/snice-slider.js +1 -1
  221. package/dist/cdn/slider/snice-slider.min.js +1 -1
  222. package/dist/cdn/sortable/snice-sortable.js +1 -1
  223. package/dist/cdn/sortable/snice-sortable.min.js +1 -1
  224. package/dist/cdn/sparkline/snice-sparkline.js +1 -1
  225. package/dist/cdn/sparkline/snice-sparkline.min.js +1 -1
  226. package/dist/cdn/spinner/snice-spinner.js +1 -1
  227. package/dist/cdn/spinner/snice-spinner.min.js +1 -1
  228. package/dist/cdn/split-button/snice-split-button.js +1 -1
  229. package/dist/cdn/split-button/snice-split-button.min.js +1 -1
  230. package/dist/cdn/split-pane/snice-split-pane.js +1 -1
  231. package/dist/cdn/split-pane/snice-split-pane.min.js +1 -1
  232. package/dist/cdn/spotlight/snice-spotlight.js +1 -1
  233. package/dist/cdn/spotlight/snice-spotlight.min.js +1 -1
  234. package/dist/cdn/stat-group/snice-stat-group.js +1 -1
  235. package/dist/cdn/stat-group/snice-stat-group.min.js +1 -1
  236. package/dist/cdn/step-input/snice-step-input.js +1 -1
  237. package/dist/cdn/step-input/snice-step-input.min.js +1 -1
  238. package/dist/cdn/stepper/snice-stepper.js +1 -1
  239. package/dist/cdn/stepper/snice-stepper.min.js +1 -1
  240. package/dist/cdn/switch/snice-switch.js +1 -1
  241. package/dist/cdn/switch/snice-switch.min.js +1 -1
  242. package/dist/cdn/table/snice-table.js +1 -1
  243. package/dist/cdn/table/snice-table.min.js +1 -1
  244. package/dist/cdn/tabs/snice-tabs.js +1 -1
  245. package/dist/cdn/tabs/snice-tabs.min.js +1 -1
  246. package/dist/cdn/tag/snice-tag.js +1 -1
  247. package/dist/cdn/tag/snice-tag.min.js +1 -1
  248. package/dist/cdn/tag-input/snice-tag-input.js +1 -1
  249. package/dist/cdn/tag-input/snice-tag-input.min.js +1 -1
  250. package/dist/cdn/terminal/snice-terminal.js +1 -1
  251. package/dist/cdn/terminal/snice-terminal.min.js +1 -1
  252. package/dist/cdn/testimonial/snice-testimonial.js +1 -1
  253. package/dist/cdn/testimonial/snice-testimonial.min.js +1 -1
  254. package/dist/cdn/textarea/snice-textarea.js +1 -1
  255. package/dist/cdn/textarea/snice-textarea.min.js +1 -1
  256. package/dist/cdn/time-picker/snice-time-picker.js +1 -1
  257. package/dist/cdn/time-picker/snice-time-picker.min.js +1 -1
  258. package/dist/cdn/time-range-picker/snice-time-range-picker.js +1 -1
  259. package/dist/cdn/time-range-picker/snice-time-range-picker.min.js +1 -1
  260. package/dist/cdn/timeline/snice-timeline.js +1 -1
  261. package/dist/cdn/timeline/snice-timeline.min.js +1 -1
  262. package/dist/cdn/timer/snice-timer.js +1 -1
  263. package/dist/cdn/timer/snice-timer.min.js +1 -1
  264. package/dist/cdn/toast/snice-toast.js +1 -1
  265. package/dist/cdn/toast/snice-toast.min.js +1 -1
  266. package/dist/cdn/tooltip/snice-tooltip.js +1 -1
  267. package/dist/cdn/tooltip/snice-tooltip.min.js +1 -1
  268. package/dist/cdn/tree/snice-tree.js +1 -1
  269. package/dist/cdn/tree/snice-tree.min.js +1 -1
  270. package/dist/cdn/treemap/snice-treemap.js +1 -1
  271. package/dist/cdn/treemap/snice-treemap.min.js +1 -1
  272. package/dist/cdn/user-card/snice-user-card.js +1 -1
  273. package/dist/cdn/user-card/snice-user-card.min.js +1 -1
  274. package/dist/cdn/video-player/snice-video-player.js +1 -1
  275. package/dist/cdn/video-player/snice-video-player.min.js +1 -1
  276. package/dist/cdn/virtual-scroller/snice-virtual-scroller.js +1 -1
  277. package/dist/cdn/virtual-scroller/snice-virtual-scroller.min.js +1 -1
  278. package/dist/cdn/waterfall/snice-waterfall.js +1 -1
  279. package/dist/cdn/waterfall/snice-waterfall.min.js +1 -1
  280. package/dist/cdn/weather/snice-weather.js +1 -1
  281. package/dist/cdn/weather/snice-weather.min.js +1 -1
  282. package/dist/cdn/work-order/snice-work-order.js +1 -1
  283. package/dist/cdn/work-order/snice-work-order.min.js +1 -1
  284. package/dist/context.d.ts +9 -19
  285. package/dist/index.cjs +158 -233
  286. package/dist/index.cjs.map +1 -1
  287. package/dist/index.esm.js +158 -233
  288. package/dist/index.esm.js.map +1 -1
  289. package/dist/index.iife.js +158 -233
  290. package/dist/index.iife.js.map +1 -1
  291. package/dist/react/SniceProvider.js +1 -1
  292. package/dist/react/SniceRouter.js +1 -1
  293. package/dist/react/index.js +1 -1
  294. package/dist/react/matchRoute.js +1 -1
  295. package/dist/react/useRequestHandler.js +1 -1
  296. package/dist/symbols.cjs +1 -3
  297. package/dist/symbols.cjs.map +1 -1
  298. package/dist/symbols.d.ts +0 -1
  299. package/dist/symbols.esm.js +2 -3
  300. package/dist/symbols.esm.js.map +1 -1
  301. package/dist/transitions.cjs +1 -1
  302. package/dist/transitions.esm.js +1 -1
  303. package/docs/ai/api.md +5 -10
  304. package/docs/ai/architecture.md +5 -3
  305. package/docs/ai/decorators.md +1 -6
  306. package/docs/ai/patterns.md +13 -7
  307. package/docs/controllers.md +0 -41
  308. package/docs/elements.md +21 -28
  309. package/docs/routing.md +10 -19
  310. package/package.json +1 -1
@@ -1,11 +1,11 @@
1
1
  /*!
2
- * snice v5.2.1
2
+ * snice v5.2.2
3
3
  * A decorator-driven web component library with differential rendering, routing, controllers, and 130+ ready-made UI components. Use as much or as little as you want. Zero dependencies, works anywhere.
4
4
  * (c) 2024
5
5
  * Released under the MIT License.
6
6
  */
7
7
  /*!
8
- * snice v5.2.0
8
+ * snice v5.2.1
9
9
  * A decorator-driven web component library with differential rendering, routing, controllers, and 130+ ready-made UI components. Use as much or as little as you want. Zero dependencies, works anywhere.
10
10
  * (c) 2024
11
11
  * Released under the MIT License.
@@ -95,7 +95,6 @@ const CONTEXT_NOTIFY_ELEMENT = getSymbol('context-notify-element');
95
95
  const CONTEXT_TIMER = getSymbol('context-timer');
96
96
  const CONTEXT_CALLED = getSymbol('context-called');
97
97
  const CONTEXT_UPDATE = getSymbol('context-update');
98
- const WRAPPED_CONTEXT_HANDLERS = getSymbol('wrapped-context-handlers');
99
98
  // Registration de-dup sets on the constructor — replace previous `__*Methods`
100
99
  // expando strings that violated the no-double-underscore rule.
101
100
  const CONTEXT_METHODS = getSymbol('context-methods');
@@ -271,17 +270,13 @@ class Context {
271
270
  const names = elementsMap.get(element);
272
271
  if (!names)
273
272
  continue;
274
- const wrapped = element[WRAPPED_CONTEXT_HANDLERS];
275
- if (!wrapped)
276
- continue;
277
- for (const handlerName of names) {
278
- const fn = wrapped.get(handlerName);
279
- if (typeof fn === 'function') {
273
+ for (const methodName of names) {
274
+ if (typeof element[methodName] === 'function') {
280
275
  try {
281
- fn(this);
276
+ element[methodName](this);
282
277
  }
283
278
  catch (error) {
284
- console.error(`Error calling @context handler ${handlerName}:`, error);
279
+ console.error(`Error calling @context method ${methodName}:`, error);
285
280
  }
286
281
  }
287
282
  }
@@ -296,13 +291,10 @@ class Context {
296
291
  const names = this[REGISTERED_ELEMENTS].get(element);
297
292
  if (!names)
298
293
  return;
299
- const wrapped = element[WRAPPED_CONTEXT_HANDLERS];
300
- if (!wrapped)
301
- return;
302
- for (const handlerName of names) {
303
- const fn = wrapped.get(handlerName);
304
- if (typeof fn === 'function')
305
- fn(this);
294
+ for (const methodName of names) {
295
+ if (typeof element[methodName] === 'function') {
296
+ element[methodName](this);
297
+ }
306
298
  }
307
299
  }
308
300
  }
@@ -2685,208 +2677,6 @@ function cleanupEventHandlers(instance) {
2685
2677
  instance[CLEANUP].events = [];
2686
2678
  }
2687
2679
 
2688
- /**
2689
- * @context decorator for receiving router context updates
2690
- */
2691
- const CONTEXT_HANDLERS = getSymbol('context-handlers');
2692
- /**
2693
- * @context decorator for receiving router context updates
2694
- *
2695
- * Works on both methods and fields:
2696
- *
2697
- * - **Method form**: the method is invoked with the current Context on every
2698
- * update (and once at register time so the first render sees the context).
2699
- * - **Field form**: the field is overwritten with the current Context on
2700
- * every update (and once at register time). Pair with `@property` if you
2701
- * want assignment to also schedule a re-render.
2702
- *
2703
- * @example
2704
- * ```typescript
2705
- * @element('my-layout')
2706
- * class MyLayout extends HTMLElement {
2707
- * // Method form
2708
- * @context()
2709
- * handleContext(ctx: Context) {
2710
- * this.renderNav(ctx.navigation.placards, ctx.navigation.route);
2711
- * }
2712
- *
2713
- * // Field form — the field is populated before first render
2714
- * @context() ctx!: Context;
2715
- *
2716
- * // Field + @property — assignment also triggers re-render
2717
- * @property({ attribute: false }) @context() reactiveCtx!: Context;
2718
- * }
2719
- * ```
2720
- */
2721
- function context$1(options = {}) {
2722
- return function (value, decoratorContext) {
2723
- const name = decoratorContext.name;
2724
- const kind = decoratorContext.kind;
2725
- const registerHandler = function () {
2726
- const constructor = this.constructor;
2727
- // De-dupe: methods identify by reference, fields identify by name.
2728
- if (!Object.prototype.hasOwnProperty.call(constructor, CONTEXT_METHODS)) {
2729
- constructor[CONTEXT_METHODS] = new Set();
2730
- }
2731
- const dedupeKey = kind === 'method' ? value : `field:${name}`;
2732
- if (constructor[CONTEXT_METHODS].has(dedupeKey))
2733
- return;
2734
- constructor[CONTEXT_METHODS].add(dedupeKey);
2735
- if (!Object.prototype.hasOwnProperty.call(constructor, CONTEXT_HANDLERS)) {
2736
- const inherited = constructor[CONTEXT_HANDLERS];
2737
- constructor[CONTEXT_HANDLERS] = inherited ? [...inherited] : [];
2738
- }
2739
- if (kind === 'method') {
2740
- constructor[CONTEXT_HANDLERS].push({
2741
- kind: 'method',
2742
- methodName: name,
2743
- method: value,
2744
- options,
2745
- });
2746
- }
2747
- else if (kind === 'field' || kind === 'accessor') {
2748
- constructor[CONTEXT_HANDLERS].push({
2749
- kind: 'field',
2750
- fieldName: name,
2751
- options,
2752
- });
2753
- }
2754
- };
2755
- if (kind === 'method') {
2756
- decoratorContext.addInitializer(registerHandler);
2757
- return value;
2758
- }
2759
- // Field decorators: do registration via the init function (fires per
2760
- // instance during construction, with `this` bound). Returning the init
2761
- // function is the canonical Stage 3 way for field decorators —
2762
- // `addInitializer` for fields can be late or unreliable across runtimes.
2763
- return function (initialValue) {
2764
- registerHandler.call(this);
2765
- return initialValue;
2766
- };
2767
- };
2768
- }
2769
- /**
2770
- * Setup context handler for an element instance
2771
- * Called automatically during element connection
2772
- */
2773
- // Accepts an HTMLElement OR a controller instance — both are plain objects
2774
- // that may carry CONTEXT_HANDLER and a constructor with CONTEXT_HANDLERS.
2775
- function setupContextHandler(element) {
2776
- const handlers = element.constructor[CONTEXT_HANDLERS];
2777
- if (!handlers || !Array.isArray(handlers) || handlers.length === 0) {
2778
- return;
2779
- }
2780
- // Get the Context instance from the router
2781
- const ctx = element[CONTEXT_HANDLER];
2782
- if (!ctx) {
2783
- return;
2784
- }
2785
- // Store the Context instance for cleanup
2786
- element[NAVIGATION_CONTEXT_INSTANCE] = ctx;
2787
- // Per-element Map of handler-name → wrapped function. Symbol-keyed so it
2788
- // doesn't pollute the element's public surface.
2789
- let wrapped = element[WRAPPED_CONTEXT_HANDLERS];
2790
- if (!wrapped) {
2791
- wrapped = new Map();
2792
- element[WRAPPED_CONTEXT_HANDLERS] = wrapped;
2793
- }
2794
- // Register each handler with the Context
2795
- for (const handler of handlers) {
2796
- const { kind, options } = handler;
2797
- const handlerName = kind === 'field' ? handler.fieldName : handler.methodName;
2798
- // Create wrapped method with timing controls
2799
- const wrappedFn = function (context) {
2800
- // Skip if already called once
2801
- if (options.once && element[CONTEXT_CALLED]) {
2802
- return;
2803
- }
2804
- const callMethod = () => {
2805
- if (kind === 'field') {
2806
- element[handler.fieldName] = context;
2807
- }
2808
- else {
2809
- handler.method.call(element, context);
2810
- }
2811
- // Handle once option
2812
- if (options.once) {
2813
- element[CONTEXT_CALLED] = true;
2814
- // Unregister after first call
2815
- const ctx = element[NAVIGATION_CONTEXT_INSTANCE];
2816
- if (ctx && typeof ctx[CONTEXT_UNREGISTER] === 'function') {
2817
- ctx[CONTEXT_UNREGISTER](element);
2818
- }
2819
- }
2820
- };
2821
- // Per-handler timer slot to avoid debounce/throttle handlers on the same
2822
- // element overwriting each other's state.
2823
- const timerSlot = element[CONTEXT_TIMER] ||
2824
- (element[CONTEXT_TIMER] = {});
2825
- const timerKey = handlerName;
2826
- if (options.debounce) {
2827
- clearTimeout(timerSlot[timerKey]?.timeout);
2828
- timerSlot[timerKey] = {
2829
- timeout: setTimeout(callMethod, options.debounce),
2830
- };
2831
- return;
2832
- }
2833
- if (options.throttle) {
2834
- const now = Date.now();
2835
- const lastCall = timerSlot[timerKey]?.lastCall || 0;
2836
- if (now - lastCall >= options.throttle) {
2837
- timerSlot[timerKey] = { lastCall: now };
2838
- callMethod();
2839
- }
2840
- return;
2841
- }
2842
- callMethod();
2843
- };
2844
- wrapped.set(handlerName, wrappedFn);
2845
- // Register with the Context using the handler name (lookup goes through
2846
- // the WRAPPED_CONTEXT_HANDLERS Map on the element).
2847
- if (typeof ctx[CONTEXT_REGISTER] === 'function') {
2848
- ctx[CONTEXT_REGISTER](element, handlerName);
2849
- }
2850
- // Synchronously emit current context to the just-registered handler so
2851
- // field/method values are populated BEFORE the first render microtask
2852
- // flushes — eliminates the cold-render flicker where ctx is undefined.
2853
- try {
2854
- wrappedFn(ctx);
2855
- }
2856
- catch (error) {
2857
- console.error(`Error invoking @context handler at registration:`, error);
2858
- }
2859
- }
2860
- }
2861
- /**
2862
- * Cleanup context handler for an element instance
2863
- * Called automatically during element disconnection
2864
- */
2865
- function cleanupContextHandler(element) {
2866
- const handlers = element.constructor[CONTEXT_HANDLERS];
2867
- if (!handlers || !Array.isArray(handlers) || handlers.length === 0) {
2868
- return;
2869
- }
2870
- // Clear any pending debounce timers (per-handler slots)
2871
- const timerSlot = element[CONTEXT_TIMER];
2872
- if (timerSlot && typeof timerSlot === 'object') {
2873
- for (const key of Object.keys(timerSlot)) {
2874
- if (timerSlot[key]?.timeout)
2875
- clearTimeout(timerSlot[key].timeout);
2876
- }
2877
- delete element[CONTEXT_TIMER];
2878
- }
2879
- // Drop the per-element wrapped-handlers Map.
2880
- delete element[WRAPPED_CONTEXT_HANDLERS];
2881
- // Unregister from Context if available
2882
- const ctx = element[NAVIGATION_CONTEXT_INSTANCE];
2883
- if (ctx && typeof ctx[CONTEXT_UNREGISTER] === 'function') {
2884
- ctx[CONTEXT_UNREGISTER](element);
2885
- }
2886
- delete element[NAVIGATION_CONTEXT_INSTANCE];
2887
- delete element[CONTEXT_CALLED];
2888
- }
2889
-
2890
2680
  // Controller-scoped cleanup registry
2891
2681
  class ControllerScope {
2892
2682
  constructor() {
@@ -2992,14 +2782,6 @@ async function attachController(element, controllerName) {
2992
2782
  if (routerContext !== undefined) {
2993
2783
  controllerInstance[ROUTER_CONTEXT] = routerContext;
2994
2784
  }
2995
- // Mirror the element's CONTEXT_HANDLER onto the controller so
2996
- // setupContextHandler can wire @context() handlers declared on the
2997
- // controller class. This makes @context() work identically on elements
2998
- // and controllers.
2999
- const ctxHandler = element[CONTEXT_HANDLER];
3000
- if (ctxHandler !== undefined) {
3001
- controllerInstance[CONTEXT_HANDLER] = ctxHandler;
3002
- }
3003
2785
  // Store references
3004
2786
  element[CONTROLLER_KEY] = controllerInstance;
3005
2787
  element[CONTROLLER_NAME_KEY] = controllerName;
@@ -3038,8 +2820,6 @@ async function attachController(element, controllerName) {
3038
2820
  setupResponseHandlers(controllerInstance, element);
3039
2821
  // Setup @on event handlers for controller
3040
2822
  setupEventHandlers(controllerInstance, element);
3041
- // Setup @context() handlers for controller (fires sync emit at register)
3042
- setupContextHandler(controllerInstance);
3043
2823
  element.dispatchEvent(new CustomEvent('controller-attached', {
3044
2824
  detail: { name: controllerName, controller: controllerInstance }
3045
2825
  }));
@@ -3076,15 +2856,12 @@ async function detachController(element) {
3076
2856
  cleanupResponseHandlers(controllerInstance);
3077
2857
  // Cleanup @on event handlers for controller
3078
2858
  cleanupEventHandlers(controllerInstance);
3079
- // Cleanup @context() handlers for controller
3080
- cleanupContextHandler(controllerInstance);
3081
2859
  // Cleanup the controller scope
3082
2860
  if (scope) {
3083
2861
  await scope.cleanup();
3084
2862
  }
3085
- // Clean up router/context references
2863
+ // Clean up router context reference
3086
2864
  delete controllerInstance[ROUTER_CONTEXT];
3087
- delete controllerInstance[CONTEXT_HANDLER];
3088
2865
  delete element[CONTROLLER_KEY];
3089
2866
  delete element[CONTROLLER_NAME_KEY];
3090
2867
  delete element[CONTROLLER_OPERATIONS];
@@ -3179,6 +2956,154 @@ function useNativeElementControllers() {
3179
2956
  globalThis.sniceNativeControllerObserver = observer;
3180
2957
  }
3181
2958
 
2959
+ /**
2960
+ * @context decorator for receiving router context updates
2961
+ */
2962
+ const CONTEXT_HANDLERS = getSymbol('context-handlers');
2963
+ /**
2964
+ * @context decorator for receiving router context updates
2965
+ *
2966
+ * @example
2967
+ * ```typescript
2968
+ * @element('my-layout')
2969
+ * class MyLayout extends HTMLElement {
2970
+ * @context
2971
+ * handleContext(ctx: Context) {
2972
+ * this.renderNav(ctx.placards, ctx.currentRoute);
2973
+ * }
2974
+ *
2975
+ * @context({ debounce: 300 })
2976
+ * handleContextDebounced(ctx: Context) {
2977
+ * // Called after 300ms of no updates
2978
+ * }
2979
+ * }
2980
+ * ```
2981
+ */
2982
+ function context$1(options = {}) {
2983
+ return function (originalMethod, context) {
2984
+ const methodName = context.name;
2985
+ context.addInitializer(function () {
2986
+ const constructor = this.constructor;
2987
+ // hasOwnProperty guards so subclasses don't mutate parent state via
2988
+ // the prototype chain.
2989
+ if (!Object.prototype.hasOwnProperty.call(constructor, CONTEXT_METHODS)) {
2990
+ constructor[CONTEXT_METHODS] = new Set();
2991
+ }
2992
+ if (constructor[CONTEXT_METHODS].has(originalMethod))
2993
+ return;
2994
+ constructor[CONTEXT_METHODS].add(originalMethod);
2995
+ if (!Object.prototype.hasOwnProperty.call(constructor, CONTEXT_HANDLERS)) {
2996
+ const inherited = constructor[CONTEXT_HANDLERS];
2997
+ constructor[CONTEXT_HANDLERS] = inherited ? [...inherited] : [];
2998
+ }
2999
+ constructor[CONTEXT_HANDLERS].push({
3000
+ methodName,
3001
+ method: originalMethod,
3002
+ options,
3003
+ });
3004
+ });
3005
+ return originalMethod;
3006
+ };
3007
+ }
3008
+ /**
3009
+ * Setup context handler for an element instance
3010
+ * Called automatically during element connection
3011
+ */
3012
+ function setupContextHandler(element) {
3013
+ const handlers = element.constructor[CONTEXT_HANDLERS];
3014
+ if (!handlers || !Array.isArray(handlers) || handlers.length === 0) {
3015
+ return;
3016
+ }
3017
+ // Get the Context instance from the router
3018
+ const ctx = element[CONTEXT_HANDLER];
3019
+ if (!ctx) {
3020
+ return;
3021
+ }
3022
+ // Store the Context instance for cleanup
3023
+ element[NAVIGATION_CONTEXT_INSTANCE] = ctx;
3024
+ // Register each handler with the Context
3025
+ for (const handler of handlers) {
3026
+ const { methodName, method, options } = handler;
3027
+ const wrappedMethodName = `__wrapped_${methodName}`;
3028
+ // Create wrapped method with timing controls
3029
+ element[wrappedMethodName] = function (context) {
3030
+ // Skip if already called once
3031
+ if (options.once && element[CONTEXT_CALLED]) {
3032
+ return;
3033
+ }
3034
+ const callMethod = () => {
3035
+ method.call(element, context);
3036
+ // Handle once option
3037
+ if (options.once) {
3038
+ element[CONTEXT_CALLED] = true;
3039
+ // Unregister after first call
3040
+ const ctx = element[NAVIGATION_CONTEXT_INSTANCE];
3041
+ if (ctx && typeof ctx[CONTEXT_UNREGISTER] === 'function') {
3042
+ ctx[CONTEXT_UNREGISTER](element);
3043
+ }
3044
+ }
3045
+ };
3046
+ // Per-handler timer slot to avoid debounce/throttle handlers on the same
3047
+ // element overwriting each other's state.
3048
+ const timerSlot = element[CONTEXT_TIMER] ||
3049
+ (element[CONTEXT_TIMER] = {});
3050
+ const timerKey = methodName;
3051
+ if (options.debounce) {
3052
+ clearTimeout(timerSlot[timerKey]?.timeout);
3053
+ timerSlot[timerKey] = {
3054
+ timeout: setTimeout(callMethod, options.debounce),
3055
+ };
3056
+ return;
3057
+ }
3058
+ if (options.throttle) {
3059
+ const now = Date.now();
3060
+ const lastCall = timerSlot[timerKey]?.lastCall || 0;
3061
+ if (now - lastCall >= options.throttle) {
3062
+ timerSlot[timerKey] = { lastCall: now };
3063
+ callMethod();
3064
+ }
3065
+ return;
3066
+ }
3067
+ callMethod();
3068
+ };
3069
+ // Register with the Context using the wrapped method name
3070
+ if (typeof ctx[CONTEXT_REGISTER] === 'function') {
3071
+ ctx[CONTEXT_REGISTER](element, wrappedMethodName);
3072
+ }
3073
+ }
3074
+ }
3075
+ /**
3076
+ * Cleanup context handler for an element instance
3077
+ * Called automatically during element disconnection
3078
+ */
3079
+ function cleanupContextHandler(element) {
3080
+ const handlers = element.constructor[CONTEXT_HANDLERS];
3081
+ if (!handlers || !Array.isArray(handlers) || handlers.length === 0) {
3082
+ return;
3083
+ }
3084
+ // Clear any pending debounce timers (per-handler slots)
3085
+ const timerSlot = element[CONTEXT_TIMER];
3086
+ if (timerSlot && typeof timerSlot === 'object') {
3087
+ for (const key of Object.keys(timerSlot)) {
3088
+ if (timerSlot[key]?.timeout)
3089
+ clearTimeout(timerSlot[key].timeout);
3090
+ }
3091
+ delete element[CONTEXT_TIMER];
3092
+ }
3093
+ for (const handler of handlers) {
3094
+ // Clean up wrapped method
3095
+ const wrappedMethodName = `__wrapped_${handler.methodName}`;
3096
+ delete element[wrappedMethodName];
3097
+ }
3098
+ // Unregister from Context if available
3099
+ const ctx = element[NAVIGATION_CONTEXT_INSTANCE];
3100
+ if (ctx && typeof ctx[CONTEXT_UNREGISTER] === 'function') {
3101
+ ctx[CONTEXT_UNREGISTER](element);
3102
+ }
3103
+ delete element[NAVIGATION_CONTEXT_INSTANCE];
3104
+ delete element[CONTEXT_CALLED];
3105
+ }
3106
+
3182
3107
  /**
3183
3108
  * @render and @styles decorators for Snice v3.0.0
3184
3109
  * Provides automatic differential rendering on property changes
@@ -6176,7 +6101,7 @@ if (typeof document !== 'undefined') {
6176
6101
  }
6177
6102
 
6178
6103
  /*!
6179
- * snice v5.2.0
6104
+ * snice v5.2.1
6180
6105
  * A decorator-driven web component library with differential rendering, routing, controllers, and 130+ ready-made UI components. Use as much or as little as you want. Zero dependencies, works anywhere.
6181
6106
  * (c) 2024
6182
6107
  * Released under the MIT License.
@@ -6195,7 +6120,7 @@ if (!globalThis.snice) {
6195
6120
  }
6196
6121
 
6197
6122
  /*!
6198
- * snice v5.2.0
6123
+ * snice v5.2.1
6199
6124
  * A decorator-driven web component library with differential rendering, routing, controllers, and 130+ ready-made UI components. Use as much or as little as you want. Zero dependencies, works anywhere.
6200
6125
  * (c) 2024
6201
6126
  * Released under the MIT License.