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