snice 5.0.0 → 5.1.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 (311) 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 +104 -44
  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 +104 -44
  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 +17 -7
  287. package/dist/index.cjs +101 -41
  288. package/dist/index.cjs.map +1 -1
  289. package/dist/index.esm.js +101 -41
  290. package/dist/index.esm.js.map +1 -1
  291. package/dist/index.iife.js +101 -41
  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/ai/api.md +11 -5
  306. package/docs/ai/architecture.md +3 -5
  307. package/docs/ai/decorators.md +6 -1
  308. package/docs/ai/patterns.md +7 -13
  309. package/docs/elements.md +28 -21
  310. package/docs/routing.md +19 -10
  311. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * snice v4.40.0
2
+ * snice v5.0.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.
@@ -92,6 +92,7 @@ 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');
95
96
  // Registration de-dup sets on the constructor — replace previous `__*Methods`
96
97
  // expando strings that violated the no-double-underscore rule.
97
98
  const CONTEXT_METHODS = getSymbol('context-methods');
@@ -267,13 +268,17 @@ var Snice = (function (exports) {
267
268
  const names = elementsMap.get(element);
268
269
  if (!names)
269
270
  continue;
270
- for (const methodName of names) {
271
- if (typeof element[methodName] === 'function') {
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') {
272
277
  try {
273
- element[methodName](this);
278
+ fn(this);
274
279
  }
275
280
  catch (error) {
276
- console.error(`Error calling @context method ${methodName}:`, error);
281
+ console.error(`Error calling @context handler ${handlerName}:`, error);
277
282
  }
278
283
  }
279
284
  }
@@ -288,10 +293,13 @@ var Snice = (function (exports) {
288
293
  const names = this[REGISTERED_ELEMENTS].get(element);
289
294
  if (!names)
290
295
  return;
291
- for (const methodName of names) {
292
- if (typeof element[methodName] === 'function') {
293
- element[methodName](this);
294
- }
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);
295
303
  }
296
304
  }
297
305
  }
@@ -2960,46 +2968,78 @@ var Snice = (function (exports) {
2960
2968
  /**
2961
2969
  * @context decorator for receiving router context updates
2962
2970
  *
2971
+ * Works on both methods and fields:
2972
+ *
2973
+ * - **Method form**: the method is invoked with the current Context on every
2974
+ * update (and once at register time so the first render sees the context).
2975
+ * - **Field form**: the field is overwritten with the current Context on
2976
+ * every update (and once at register time). Pair with `@property` if you
2977
+ * want assignment to also schedule a re-render.
2978
+ *
2963
2979
  * @example
2964
2980
  * ```typescript
2965
2981
  * @element('my-layout')
2966
2982
  * class MyLayout extends HTMLElement {
2967
- * @context
2983
+ * // Method form
2984
+ * @context()
2968
2985
  * handleContext(ctx: Context) {
2969
- * this.renderNav(ctx.placards, ctx.currentRoute);
2986
+ * this.renderNav(ctx.navigation.placards, ctx.navigation.route);
2970
2987
  * }
2971
2988
  *
2972
- * @context({ debounce: 300 })
2973
- * handleContextDebounced(ctx: Context) {
2974
- * // Called after 300ms of no updates
2975
- * }
2989
+ * // Field form — the field is populated before first render
2990
+ * @context() ctx!: Context;
2991
+ *
2992
+ * // Field + @property — assignment also triggers re-render
2993
+ * @property({ attribute: false }) @context() reactiveCtx!: Context;
2976
2994
  * }
2977
2995
  * ```
2978
2996
  */
2979
2997
  function context$1(options = {}) {
2980
- return function (originalMethod, context) {
2981
- const methodName = context.name;
2982
- context.addInitializer(function () {
2998
+ return function (value, decoratorContext) {
2999
+ const name = decoratorContext.name;
3000
+ const kind = decoratorContext.kind;
3001
+ const registerHandler = function () {
2983
3002
  const constructor = this.constructor;
2984
- // hasOwnProperty guards so subclasses don't mutate parent state via
2985
- // the prototype chain.
3003
+ // De-dupe: methods identify by reference, fields identify by name.
2986
3004
  if (!Object.prototype.hasOwnProperty.call(constructor, CONTEXT_METHODS)) {
2987
3005
  constructor[CONTEXT_METHODS] = new Set();
2988
3006
  }
2989
- if (constructor[CONTEXT_METHODS].has(originalMethod))
3007
+ const dedupeKey = kind === 'method' ? value : `field:${name}`;
3008
+ if (constructor[CONTEXT_METHODS].has(dedupeKey))
2990
3009
  return;
2991
- constructor[CONTEXT_METHODS].add(originalMethod);
3010
+ constructor[CONTEXT_METHODS].add(dedupeKey);
2992
3011
  if (!Object.prototype.hasOwnProperty.call(constructor, CONTEXT_HANDLERS)) {
2993
3012
  const inherited = constructor[CONTEXT_HANDLERS];
2994
3013
  constructor[CONTEXT_HANDLERS] = inherited ? [...inherited] : [];
2995
3014
  }
2996
- constructor[CONTEXT_HANDLERS].push({
2997
- methodName,
2998
- method: originalMethod,
2999
- options,
3000
- });
3001
- });
3002
- return originalMethod;
3015
+ if (kind === 'method') {
3016
+ constructor[CONTEXT_HANDLERS].push({
3017
+ kind: 'method',
3018
+ methodName: name,
3019
+ method: value,
3020
+ options,
3021
+ });
3022
+ }
3023
+ else if (kind === 'field' || kind === 'accessor') {
3024
+ constructor[CONTEXT_HANDLERS].push({
3025
+ kind: 'field',
3026
+ fieldName: name,
3027
+ options,
3028
+ });
3029
+ }
3030
+ };
3031
+ if (kind === 'method') {
3032
+ decoratorContext.addInitializer(registerHandler);
3033
+ return value;
3034
+ }
3035
+ // Field decorators: do registration via the init function (fires per
3036
+ // instance during construction, with `this` bound). Returning the init
3037
+ // function is the canonical Stage 3 way for field decorators —
3038
+ // `addInitializer` for fields can be late or unreliable across runtimes.
3039
+ return function (initialValue) {
3040
+ registerHandler.call(this);
3041
+ return initialValue;
3042
+ };
3003
3043
  };
3004
3044
  }
3005
3045
  /**
@@ -3018,18 +3058,30 @@ var Snice = (function (exports) {
3018
3058
  }
3019
3059
  // Store the Context instance for cleanup
3020
3060
  element[NAVIGATION_CONTEXT_INSTANCE] = ctx;
3061
+ // Per-element Map of handler-name → wrapped function. Symbol-keyed so it
3062
+ // doesn't pollute the element's public surface.
3063
+ let wrapped = element[WRAPPED_CONTEXT_HANDLERS];
3064
+ if (!wrapped) {
3065
+ wrapped = new Map();
3066
+ element[WRAPPED_CONTEXT_HANDLERS] = wrapped;
3067
+ }
3021
3068
  // Register each handler with the Context
3022
3069
  for (const handler of handlers) {
3023
- const { methodName, method, options } = handler;
3024
- const wrappedMethodName = `__wrapped_${methodName}`;
3070
+ const { kind, options } = handler;
3071
+ const handlerName = kind === 'field' ? handler.fieldName : handler.methodName;
3025
3072
  // Create wrapped method with timing controls
3026
- element[wrappedMethodName] = function (context) {
3073
+ const wrappedFn = function (context) {
3027
3074
  // Skip if already called once
3028
3075
  if (options.once && element[CONTEXT_CALLED]) {
3029
3076
  return;
3030
3077
  }
3031
3078
  const callMethod = () => {
3032
- method.call(element, context);
3079
+ if (kind === 'field') {
3080
+ element[handler.fieldName] = context;
3081
+ }
3082
+ else {
3083
+ handler.method.call(element, context);
3084
+ }
3033
3085
  // Handle once option
3034
3086
  if (options.once) {
3035
3087
  element[CONTEXT_CALLED] = true;
@@ -3044,7 +3096,7 @@ var Snice = (function (exports) {
3044
3096
  // element overwriting each other's state.
3045
3097
  const timerSlot = element[CONTEXT_TIMER] ||
3046
3098
  (element[CONTEXT_TIMER] = {});
3047
- const timerKey = methodName;
3099
+ const timerKey = handlerName;
3048
3100
  if (options.debounce) {
3049
3101
  clearTimeout(timerSlot[timerKey]?.timeout);
3050
3102
  timerSlot[timerKey] = {
@@ -3063,9 +3115,20 @@ var Snice = (function (exports) {
3063
3115
  }
3064
3116
  callMethod();
3065
3117
  };
3066
- // Register with the Context using the wrapped method name
3118
+ wrapped.set(handlerName, wrappedFn);
3119
+ // Register with the Context using the handler name (lookup goes through
3120
+ // the WRAPPED_CONTEXT_HANDLERS Map on the element).
3067
3121
  if (typeof ctx[CONTEXT_REGISTER] === 'function') {
3068
- ctx[CONTEXT_REGISTER](element, wrappedMethodName);
3122
+ ctx[CONTEXT_REGISTER](element, handlerName);
3123
+ }
3124
+ // Synchronously emit current context to the just-registered handler so
3125
+ // field/method values are populated BEFORE the first render microtask
3126
+ // flushes — eliminates the cold-render flicker where ctx is undefined.
3127
+ try {
3128
+ wrappedFn(ctx);
3129
+ }
3130
+ catch (error) {
3131
+ console.error(`Error invoking @context handler at registration:`, error);
3069
3132
  }
3070
3133
  }
3071
3134
  }
@@ -3087,11 +3150,8 @@ var Snice = (function (exports) {
3087
3150
  }
3088
3151
  delete element[CONTEXT_TIMER];
3089
3152
  }
3090
- for (const handler of handlers) {
3091
- // Clean up wrapped method
3092
- const wrappedMethodName = `__wrapped_${handler.methodName}`;
3093
- delete element[wrappedMethodName];
3094
- }
3153
+ // Drop the per-element wrapped-handlers Map.
3154
+ delete element[WRAPPED_CONTEXT_HANDLERS];
3095
3155
  // Unregister from Context if available
3096
3156
  const ctx = element[NAVIGATION_CONTEXT_INSTANCE];
3097
3157
  if (ctx && typeof ctx[CONTEXT_UNREGISTER] === 'function') {