snice 5.0.0 → 5.2.0

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