snice 5.2.1 → 5.2.3

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,5 +1,5 @@
1
1
  /*!
2
- * snice v5.2.0
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.
@@ -92,7 +92,6 @@ var Snice = (function (exports) {
92
92
  const CONTEXT_TIMER = getSymbol('context-timer');
93
93
  const CONTEXT_CALLED = getSymbol('context-called');
94
94
  const CONTEXT_UPDATE = getSymbol('context-update');
95
- const WRAPPED_CONTEXT_HANDLERS = getSymbol('wrapped-context-handlers');
96
95
  // Registration de-dup sets on the constructor — replace previous `__*Methods`
97
96
  // expando strings that violated the no-double-underscore rule.
98
97
  const CONTEXT_METHODS = getSymbol('context-methods');
@@ -268,17 +267,13 @@ var Snice = (function (exports) {
268
267
  const names = elementsMap.get(element);
269
268
  if (!names)
270
269
  continue;
271
- const wrapped = element[WRAPPED_CONTEXT_HANDLERS];
272
- if (!wrapped)
273
- continue;
274
- for (const handlerName of names) {
275
- const fn = wrapped.get(handlerName);
276
- if (typeof fn === 'function') {
270
+ for (const methodName of names) {
271
+ if (typeof element[methodName] === 'function') {
277
272
  try {
278
- fn(this);
273
+ element[methodName](this);
279
274
  }
280
275
  catch (error) {
281
- console.error(`Error calling @context handler ${handlerName}:`, error);
276
+ console.error(`Error calling @context method ${methodName}:`, error);
282
277
  }
283
278
  }
284
279
  }
@@ -293,13 +288,10 @@ var Snice = (function (exports) {
293
288
  const names = this[REGISTERED_ELEMENTS].get(element);
294
289
  if (!names)
295
290
  return;
296
- const wrapped = element[WRAPPED_CONTEXT_HANDLERS];
297
- if (!wrapped)
298
- return;
299
- for (const handlerName of names) {
300
- const fn = wrapped.get(handlerName);
301
- if (typeof fn === 'function')
302
- fn(this);
291
+ for (const methodName of names) {
292
+ if (typeof element[methodName] === 'function') {
293
+ element[methodName](this);
294
+ }
303
295
  }
304
296
  }
305
297
  }
@@ -2682,208 +2674,6 @@ var Snice = (function (exports) {
2682
2674
  instance[CLEANUP].events = [];
2683
2675
  }
2684
2676
 
2685
- /**
2686
- * @context decorator for receiving router context updates
2687
- */
2688
- const CONTEXT_HANDLERS = getSymbol('context-handlers');
2689
- /**
2690
- * @context decorator for receiving router context updates
2691
- *
2692
- * Works on both methods and fields:
2693
- *
2694
- * - **Method form**: the method is invoked with the current Context on every
2695
- * update (and once at register time so the first render sees the context).
2696
- * - **Field form**: the field is overwritten with the current Context on
2697
- * every update (and once at register time). Pair with `@property` if you
2698
- * want assignment to also schedule a re-render.
2699
- *
2700
- * @example
2701
- * ```typescript
2702
- * @element('my-layout')
2703
- * class MyLayout extends HTMLElement {
2704
- * // Method form
2705
- * @context()
2706
- * handleContext(ctx: Context) {
2707
- * this.renderNav(ctx.navigation.placards, ctx.navigation.route);
2708
- * }
2709
- *
2710
- * // Field form — the field is populated before first render
2711
- * @context() ctx!: Context;
2712
- *
2713
- * // Field + @property — assignment also triggers re-render
2714
- * @property({ attribute: false }) @context() reactiveCtx!: Context;
2715
- * }
2716
- * ```
2717
- */
2718
- function context$1(options = {}) {
2719
- return function (value, decoratorContext) {
2720
- const name = decoratorContext.name;
2721
- const kind = decoratorContext.kind;
2722
- const registerHandler = function () {
2723
- const constructor = this.constructor;
2724
- // De-dupe: methods identify by reference, fields identify by name.
2725
- if (!Object.prototype.hasOwnProperty.call(constructor, CONTEXT_METHODS)) {
2726
- constructor[CONTEXT_METHODS] = new Set();
2727
- }
2728
- const dedupeKey = kind === 'method' ? value : `field:${name}`;
2729
- if (constructor[CONTEXT_METHODS].has(dedupeKey))
2730
- return;
2731
- constructor[CONTEXT_METHODS].add(dedupeKey);
2732
- if (!Object.prototype.hasOwnProperty.call(constructor, CONTEXT_HANDLERS)) {
2733
- const inherited = constructor[CONTEXT_HANDLERS];
2734
- constructor[CONTEXT_HANDLERS] = inherited ? [...inherited] : [];
2735
- }
2736
- if (kind === 'method') {
2737
- constructor[CONTEXT_HANDLERS].push({
2738
- kind: 'method',
2739
- methodName: name,
2740
- method: value,
2741
- options,
2742
- });
2743
- }
2744
- else if (kind === 'field' || kind === 'accessor') {
2745
- constructor[CONTEXT_HANDLERS].push({
2746
- kind: 'field',
2747
- fieldName: name,
2748
- options,
2749
- });
2750
- }
2751
- };
2752
- if (kind === 'method') {
2753
- decoratorContext.addInitializer(registerHandler);
2754
- return value;
2755
- }
2756
- // Field decorators: do registration via the init function (fires per
2757
- // instance during construction, with `this` bound). Returning the init
2758
- // function is the canonical Stage 3 way for field decorators —
2759
- // `addInitializer` for fields can be late or unreliable across runtimes.
2760
- return function (initialValue) {
2761
- registerHandler.call(this);
2762
- return initialValue;
2763
- };
2764
- };
2765
- }
2766
- /**
2767
- * Setup context handler for an element instance
2768
- * Called automatically during element connection
2769
- */
2770
- // Accepts an HTMLElement OR a controller instance — both are plain objects
2771
- // that may carry CONTEXT_HANDLER and a constructor with CONTEXT_HANDLERS.
2772
- function setupContextHandler(element) {
2773
- const handlers = element.constructor[CONTEXT_HANDLERS];
2774
- if (!handlers || !Array.isArray(handlers) || handlers.length === 0) {
2775
- return;
2776
- }
2777
- // Get the Context instance from the router
2778
- const ctx = element[CONTEXT_HANDLER];
2779
- if (!ctx) {
2780
- return;
2781
- }
2782
- // Store the Context instance for cleanup
2783
- element[NAVIGATION_CONTEXT_INSTANCE] = ctx;
2784
- // Per-element Map of handler-name → wrapped function. Symbol-keyed so it
2785
- // doesn't pollute the element's public surface.
2786
- let wrapped = element[WRAPPED_CONTEXT_HANDLERS];
2787
- if (!wrapped) {
2788
- wrapped = new Map();
2789
- element[WRAPPED_CONTEXT_HANDLERS] = wrapped;
2790
- }
2791
- // Register each handler with the Context
2792
- for (const handler of handlers) {
2793
- const { kind, options } = handler;
2794
- const handlerName = kind === 'field' ? handler.fieldName : handler.methodName;
2795
- // Create wrapped method with timing controls
2796
- const wrappedFn = function (context) {
2797
- // Skip if already called once
2798
- if (options.once && element[CONTEXT_CALLED]) {
2799
- return;
2800
- }
2801
- const callMethod = () => {
2802
- if (kind === 'field') {
2803
- element[handler.fieldName] = context;
2804
- }
2805
- else {
2806
- handler.method.call(element, context);
2807
- }
2808
- // Handle once option
2809
- if (options.once) {
2810
- element[CONTEXT_CALLED] = true;
2811
- // Unregister after first call
2812
- const ctx = element[NAVIGATION_CONTEXT_INSTANCE];
2813
- if (ctx && typeof ctx[CONTEXT_UNREGISTER] === 'function') {
2814
- ctx[CONTEXT_UNREGISTER](element);
2815
- }
2816
- }
2817
- };
2818
- // Per-handler timer slot to avoid debounce/throttle handlers on the same
2819
- // element overwriting each other's state.
2820
- const timerSlot = element[CONTEXT_TIMER] ||
2821
- (element[CONTEXT_TIMER] = {});
2822
- const timerKey = handlerName;
2823
- if (options.debounce) {
2824
- clearTimeout(timerSlot[timerKey]?.timeout);
2825
- timerSlot[timerKey] = {
2826
- timeout: setTimeout(callMethod, options.debounce),
2827
- };
2828
- return;
2829
- }
2830
- if (options.throttle) {
2831
- const now = Date.now();
2832
- const lastCall = timerSlot[timerKey]?.lastCall || 0;
2833
- if (now - lastCall >= options.throttle) {
2834
- timerSlot[timerKey] = { lastCall: now };
2835
- callMethod();
2836
- }
2837
- return;
2838
- }
2839
- callMethod();
2840
- };
2841
- wrapped.set(handlerName, wrappedFn);
2842
- // Register with the Context using the handler name (lookup goes through
2843
- // the WRAPPED_CONTEXT_HANDLERS Map on the element).
2844
- if (typeof ctx[CONTEXT_REGISTER] === 'function') {
2845
- ctx[CONTEXT_REGISTER](element, handlerName);
2846
- }
2847
- // Synchronously emit current context to the just-registered handler so
2848
- // field/method values are populated BEFORE the first render microtask
2849
- // flushes — eliminates the cold-render flicker where ctx is undefined.
2850
- try {
2851
- wrappedFn(ctx);
2852
- }
2853
- catch (error) {
2854
- console.error(`Error invoking @context handler at registration:`, error);
2855
- }
2856
- }
2857
- }
2858
- /**
2859
- * Cleanup context handler for an element instance
2860
- * Called automatically during element disconnection
2861
- */
2862
- function cleanupContextHandler(element) {
2863
- const handlers = element.constructor[CONTEXT_HANDLERS];
2864
- if (!handlers || !Array.isArray(handlers) || handlers.length === 0) {
2865
- return;
2866
- }
2867
- // Clear any pending debounce timers (per-handler slots)
2868
- const timerSlot = element[CONTEXT_TIMER];
2869
- if (timerSlot && typeof timerSlot === 'object') {
2870
- for (const key of Object.keys(timerSlot)) {
2871
- if (timerSlot[key]?.timeout)
2872
- clearTimeout(timerSlot[key].timeout);
2873
- }
2874
- delete element[CONTEXT_TIMER];
2875
- }
2876
- // Drop the per-element wrapped-handlers Map.
2877
- delete element[WRAPPED_CONTEXT_HANDLERS];
2878
- // Unregister from Context if available
2879
- const ctx = element[NAVIGATION_CONTEXT_INSTANCE];
2880
- if (ctx && typeof ctx[CONTEXT_UNREGISTER] === 'function') {
2881
- ctx[CONTEXT_UNREGISTER](element);
2882
- }
2883
- delete element[NAVIGATION_CONTEXT_INSTANCE];
2884
- delete element[CONTEXT_CALLED];
2885
- }
2886
-
2887
2677
  // Controller-scoped cleanup registry
2888
2678
  class ControllerScope {
2889
2679
  constructor() {
@@ -2989,14 +2779,6 @@ var Snice = (function (exports) {
2989
2779
  if (routerContext !== undefined) {
2990
2780
  controllerInstance[ROUTER_CONTEXT] = routerContext;
2991
2781
  }
2992
- // Mirror the element's CONTEXT_HANDLER onto the controller so
2993
- // setupContextHandler can wire @context() handlers declared on the
2994
- // controller class. This makes @context() work identically on elements
2995
- // and controllers.
2996
- const ctxHandler = element[CONTEXT_HANDLER];
2997
- if (ctxHandler !== undefined) {
2998
- controllerInstance[CONTEXT_HANDLER] = ctxHandler;
2999
- }
3000
2782
  // Store references
3001
2783
  element[CONTROLLER_KEY] = controllerInstance;
3002
2784
  element[CONTROLLER_NAME_KEY] = controllerName;
@@ -3035,8 +2817,6 @@ var Snice = (function (exports) {
3035
2817
  setupResponseHandlers(controllerInstance, element);
3036
2818
  // Setup @on event handlers for controller
3037
2819
  setupEventHandlers(controllerInstance, element);
3038
- // Setup @context() handlers for controller (fires sync emit at register)
3039
- setupContextHandler(controllerInstance);
3040
2820
  element.dispatchEvent(new CustomEvent('controller-attached', {
3041
2821
  detail: { name: controllerName, controller: controllerInstance }
3042
2822
  }));
@@ -3073,15 +2853,12 @@ var Snice = (function (exports) {
3073
2853
  cleanupResponseHandlers(controllerInstance);
3074
2854
  // Cleanup @on event handlers for controller
3075
2855
  cleanupEventHandlers(controllerInstance);
3076
- // Cleanup @context() handlers for controller
3077
- cleanupContextHandler(controllerInstance);
3078
2856
  // Cleanup the controller scope
3079
2857
  if (scope) {
3080
2858
  await scope.cleanup();
3081
2859
  }
3082
- // Clean up router/context references
2860
+ // Clean up router context reference
3083
2861
  delete controllerInstance[ROUTER_CONTEXT];
3084
- delete controllerInstance[CONTEXT_HANDLER];
3085
2862
  delete element[CONTROLLER_KEY];
3086
2863
  delete element[CONTROLLER_NAME_KEY];
3087
2864
  delete element[CONTROLLER_OPERATIONS];
@@ -3176,6 +2953,154 @@ var Snice = (function (exports) {
3176
2953
  globalThis.sniceNativeControllerObserver = observer;
3177
2954
  }
3178
2955
 
2956
+ /**
2957
+ * @context decorator for receiving router context updates
2958
+ */
2959
+ const CONTEXT_HANDLERS = getSymbol('context-handlers');
2960
+ /**
2961
+ * @context decorator for receiving router context updates
2962
+ *
2963
+ * @example
2964
+ * ```typescript
2965
+ * @element('my-layout')
2966
+ * class MyLayout extends HTMLElement {
2967
+ * @context
2968
+ * handleContext(ctx: Context) {
2969
+ * this.renderNav(ctx.placards, ctx.currentRoute);
2970
+ * }
2971
+ *
2972
+ * @context({ debounce: 300 })
2973
+ * handleContextDebounced(ctx: Context) {
2974
+ * // Called after 300ms of no updates
2975
+ * }
2976
+ * }
2977
+ * ```
2978
+ */
2979
+ function context$1(options = {}) {
2980
+ return function (originalMethod, context) {
2981
+ const methodName = context.name;
2982
+ context.addInitializer(function () {
2983
+ const constructor = this.constructor;
2984
+ // hasOwnProperty guards so subclasses don't mutate parent state via
2985
+ // the prototype chain.
2986
+ if (!Object.prototype.hasOwnProperty.call(constructor, CONTEXT_METHODS)) {
2987
+ constructor[CONTEXT_METHODS] = new Set();
2988
+ }
2989
+ if (constructor[CONTEXT_METHODS].has(originalMethod))
2990
+ return;
2991
+ constructor[CONTEXT_METHODS].add(originalMethod);
2992
+ if (!Object.prototype.hasOwnProperty.call(constructor, CONTEXT_HANDLERS)) {
2993
+ const inherited = constructor[CONTEXT_HANDLERS];
2994
+ constructor[CONTEXT_HANDLERS] = inherited ? [...inherited] : [];
2995
+ }
2996
+ constructor[CONTEXT_HANDLERS].push({
2997
+ methodName,
2998
+ method: originalMethod,
2999
+ options,
3000
+ });
3001
+ });
3002
+ return originalMethod;
3003
+ };
3004
+ }
3005
+ /**
3006
+ * Setup context handler for an element instance
3007
+ * Called automatically during element connection
3008
+ */
3009
+ function setupContextHandler(element) {
3010
+ const handlers = element.constructor[CONTEXT_HANDLERS];
3011
+ if (!handlers || !Array.isArray(handlers) || handlers.length === 0) {
3012
+ return;
3013
+ }
3014
+ // Get the Context instance from the router
3015
+ const ctx = element[CONTEXT_HANDLER];
3016
+ if (!ctx) {
3017
+ return;
3018
+ }
3019
+ // Store the Context instance for cleanup
3020
+ element[NAVIGATION_CONTEXT_INSTANCE] = ctx;
3021
+ // Register each handler with the Context
3022
+ for (const handler of handlers) {
3023
+ const { methodName, method, options } = handler;
3024
+ const wrappedMethodName = `__wrapped_${methodName}`;
3025
+ // Create wrapped method with timing controls
3026
+ element[wrappedMethodName] = function (context) {
3027
+ // Skip if already called once
3028
+ if (options.once && element[CONTEXT_CALLED]) {
3029
+ return;
3030
+ }
3031
+ const callMethod = () => {
3032
+ method.call(element, context);
3033
+ // Handle once option
3034
+ if (options.once) {
3035
+ element[CONTEXT_CALLED] = true;
3036
+ // Unregister after first call
3037
+ const ctx = element[NAVIGATION_CONTEXT_INSTANCE];
3038
+ if (ctx && typeof ctx[CONTEXT_UNREGISTER] === 'function') {
3039
+ ctx[CONTEXT_UNREGISTER](element);
3040
+ }
3041
+ }
3042
+ };
3043
+ // Per-handler timer slot to avoid debounce/throttle handlers on the same
3044
+ // element overwriting each other's state.
3045
+ const timerSlot = element[CONTEXT_TIMER] ||
3046
+ (element[CONTEXT_TIMER] = {});
3047
+ const timerKey = methodName;
3048
+ if (options.debounce) {
3049
+ clearTimeout(timerSlot[timerKey]?.timeout);
3050
+ timerSlot[timerKey] = {
3051
+ timeout: setTimeout(callMethod, options.debounce),
3052
+ };
3053
+ return;
3054
+ }
3055
+ if (options.throttle) {
3056
+ const now = Date.now();
3057
+ const lastCall = timerSlot[timerKey]?.lastCall || 0;
3058
+ if (now - lastCall >= options.throttle) {
3059
+ timerSlot[timerKey] = { lastCall: now };
3060
+ callMethod();
3061
+ }
3062
+ return;
3063
+ }
3064
+ callMethod();
3065
+ };
3066
+ // Register with the Context using the wrapped method name
3067
+ if (typeof ctx[CONTEXT_REGISTER] === 'function') {
3068
+ ctx[CONTEXT_REGISTER](element, wrappedMethodName);
3069
+ }
3070
+ }
3071
+ }
3072
+ /**
3073
+ * Cleanup context handler for an element instance
3074
+ * Called automatically during element disconnection
3075
+ */
3076
+ function cleanupContextHandler(element) {
3077
+ const handlers = element.constructor[CONTEXT_HANDLERS];
3078
+ if (!handlers || !Array.isArray(handlers) || handlers.length === 0) {
3079
+ return;
3080
+ }
3081
+ // Clear any pending debounce timers (per-handler slots)
3082
+ const timerSlot = element[CONTEXT_TIMER];
3083
+ if (timerSlot && typeof timerSlot === 'object') {
3084
+ for (const key of Object.keys(timerSlot)) {
3085
+ if (timerSlot[key]?.timeout)
3086
+ clearTimeout(timerSlot[key].timeout);
3087
+ }
3088
+ delete element[CONTEXT_TIMER];
3089
+ }
3090
+ for (const handler of handlers) {
3091
+ // Clean up wrapped method
3092
+ const wrappedMethodName = `__wrapped_${handler.methodName}`;
3093
+ delete element[wrappedMethodName];
3094
+ }
3095
+ // Unregister from Context if available
3096
+ const ctx = element[NAVIGATION_CONTEXT_INSTANCE];
3097
+ if (ctx && typeof ctx[CONTEXT_UNREGISTER] === 'function') {
3098
+ ctx[CONTEXT_UNREGISTER](element);
3099
+ }
3100
+ delete element[NAVIGATION_CONTEXT_INSTANCE];
3101
+ delete element[CONTEXT_CALLED];
3102
+ }
3103
+
3179
3104
  /**
3180
3105
  * @render and @styles decorators for Snice v3.0.0
3181
3106
  * Provides automatic differential rendering on property changes