snice 5.2.3 → 6.0.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 (653) hide show
  1. package/README.md +5 -8
  2. package/adapters/react/SniceProvider.js +1 -1
  3. package/adapters/react/SniceRouter.js +1 -1
  4. package/adapters/react/audio-recorder.d.ts +0 -4
  5. package/adapters/react/audio-recorder.d.ts.map +1 -1
  6. package/adapters/react/audio-recorder.js +1 -1
  7. package/adapters/react/audio-recorder.js.map +1 -1
  8. package/adapters/react/audio-recorder.tsx +1 -5
  9. package/adapters/react/avatar.d.ts +0 -1
  10. package/adapters/react/avatar.d.ts.map +1 -1
  11. package/adapters/react/avatar.js +1 -1
  12. package/adapters/react/avatar.js.map +1 -1
  13. package/adapters/react/avatar.tsx +1 -2
  14. package/adapters/react/breadcrumbs.d.ts +0 -1
  15. package/adapters/react/breadcrumbs.d.ts.map +1 -1
  16. package/adapters/react/breadcrumbs.js +1 -1
  17. package/adapters/react/breadcrumbs.js.map +1 -1
  18. package/adapters/react/breadcrumbs.tsx +1 -2
  19. package/adapters/react/camera-annotate.d.ts +0 -5
  20. package/adapters/react/camera-annotate.d.ts.map +1 -1
  21. package/adapters/react/camera-annotate.js +1 -1
  22. package/adapters/react/camera-annotate.js.map +1 -1
  23. package/adapters/react/camera-annotate.tsx +1 -6
  24. package/adapters/react/card.d.ts +0 -2
  25. package/adapters/react/card.d.ts.map +1 -1
  26. package/adapters/react/card.js +1 -1
  27. package/adapters/react/card.js.map +1 -1
  28. package/adapters/react/card.tsx +1 -3
  29. package/adapters/react/carousel.d.ts +0 -1
  30. package/adapters/react/carousel.d.ts.map +1 -1
  31. package/adapters/react/carousel.js +1 -1
  32. package/adapters/react/carousel.js.map +1 -1
  33. package/adapters/react/carousel.tsx +1 -2
  34. package/adapters/react/cart.d.ts +0 -1
  35. package/adapters/react/cart.d.ts.map +1 -1
  36. package/adapters/react/cart.js +1 -1
  37. package/adapters/react/cart.js.map +1 -1
  38. package/adapters/react/cart.tsx +1 -2
  39. package/adapters/react/chart.d.ts +0 -5
  40. package/adapters/react/chart.d.ts.map +1 -1
  41. package/adapters/react/chart.js +1 -1
  42. package/adapters/react/chart.js.map +1 -1
  43. package/adapters/react/chart.tsx +1 -6
  44. package/adapters/react/chat.d.ts +4 -1
  45. package/adapters/react/chat.d.ts.map +1 -1
  46. package/adapters/react/chat.js +2 -2
  47. package/adapters/react/chat.js.map +1 -1
  48. package/adapters/react/chat.tsx +6 -3
  49. package/adapters/react/chip.d.ts +0 -1
  50. package/adapters/react/chip.d.ts.map +1 -1
  51. package/adapters/react/chip.js +1 -1
  52. package/adapters/react/chip.js.map +1 -1
  53. package/adapters/react/chip.tsx +1 -2
  54. package/adapters/react/command-palette.d.ts +0 -4
  55. package/adapters/react/command-palette.d.ts.map +1 -1
  56. package/adapters/react/command-palette.js +1 -1
  57. package/adapters/react/command-palette.js.map +1 -1
  58. package/adapters/react/command-palette.tsx +1 -5
  59. package/adapters/react/comments.d.ts +0 -1
  60. package/adapters/react/comments.d.ts.map +1 -1
  61. package/adapters/react/comments.js +1 -1
  62. package/adapters/react/comments.js.map +1 -1
  63. package/adapters/react/comments.tsx +1 -2
  64. package/adapters/react/countdown.d.ts +0 -4
  65. package/adapters/react/countdown.d.ts.map +1 -1
  66. package/adapters/react/countdown.js +1 -1
  67. package/adapters/react/countdown.js.map +1 -1
  68. package/adapters/react/countdown.tsx +1 -5
  69. package/adapters/react/date-time-picker.d.ts +0 -1
  70. package/adapters/react/date-time-picker.d.ts.map +1 -1
  71. package/adapters/react/date-time-picker.js +1 -1
  72. package/adapters/react/date-time-picker.js.map +1 -1
  73. package/adapters/react/date-time-picker.tsx +1 -2
  74. package/adapters/react/file-upload.d.ts +0 -2
  75. package/adapters/react/file-upload.d.ts.map +1 -1
  76. package/adapters/react/file-upload.js +1 -1
  77. package/adapters/react/file-upload.js.map +1 -1
  78. package/adapters/react/file-upload.tsx +1 -3
  79. package/adapters/react/heatmap.d.ts +0 -4
  80. package/adapters/react/heatmap.d.ts.map +1 -1
  81. package/adapters/react/heatmap.js +1 -1
  82. package/adapters/react/heatmap.js.map +1 -1
  83. package/adapters/react/heatmap.tsx +1 -5
  84. package/adapters/react/image.d.ts +0 -2
  85. package/adapters/react/image.d.ts.map +1 -1
  86. package/adapters/react/image.js +1 -1
  87. package/adapters/react/image.js.map +1 -1
  88. package/adapters/react/image.tsx +1 -3
  89. package/adapters/react/kanban.d.ts +0 -4
  90. package/adapters/react/kanban.d.ts.map +1 -1
  91. package/adapters/react/kanban.js +1 -1
  92. package/adapters/react/kanban.js.map +1 -1
  93. package/adapters/react/kanban.tsx +1 -5
  94. package/adapters/react/key-value.d.ts +0 -2
  95. package/adapters/react/key-value.d.ts.map +1 -1
  96. package/adapters/react/key-value.js +1 -1
  97. package/adapters/react/key-value.js.map +1 -1
  98. package/adapters/react/key-value.tsx +1 -3
  99. package/adapters/react/leaderboard.d.ts +0 -1
  100. package/adapters/react/leaderboard.d.ts.map +1 -1
  101. package/adapters/react/leaderboard.js +1 -1
  102. package/adapters/react/leaderboard.js.map +1 -1
  103. package/adapters/react/leaderboard.tsx +1 -2
  104. package/adapters/react/map.d.ts +0 -3
  105. package/adapters/react/map.d.ts.map +1 -1
  106. package/adapters/react/map.js +1 -1
  107. package/adapters/react/map.js.map +1 -1
  108. package/adapters/react/map.tsx +1 -4
  109. package/adapters/react/markdown.d.ts +1 -1
  110. package/adapters/react/markdown.d.ts.map +1 -1
  111. package/adapters/react/markdown.js +1 -1
  112. package/adapters/react/markdown.js.map +1 -1
  113. package/adapters/react/markdown.tsx +2 -2
  114. package/adapters/react/matchRoute.d.ts +1 -1
  115. package/adapters/react/matchRoute.js +38 -4
  116. package/adapters/react/matchRoute.js.map +1 -1
  117. package/adapters/react/message-strip.d.ts +1 -1
  118. package/adapters/react/message-strip.js +1 -1
  119. package/adapters/react/message-strip.tsx +2 -2
  120. package/adapters/react/music-player.d.ts +0 -1
  121. package/adapters/react/music-player.d.ts.map +1 -1
  122. package/adapters/react/music-player.js +1 -1
  123. package/adapters/react/music-player.js.map +1 -1
  124. package/adapters/react/music-player.tsx +1 -2
  125. package/adapters/react/org-chart.d.ts +0 -1
  126. package/adapters/react/org-chart.d.ts.map +1 -1
  127. package/adapters/react/org-chart.js +1 -1
  128. package/adapters/react/org-chart.js.map +1 -1
  129. package/adapters/react/org-chart.tsx +1 -2
  130. package/adapters/react/paint.d.ts +0 -1
  131. package/adapters/react/paint.d.ts.map +1 -1
  132. package/adapters/react/paint.js +1 -1
  133. package/adapters/react/paint.js.map +1 -1
  134. package/adapters/react/paint.tsx +1 -2
  135. package/adapters/react/podcast-player.d.ts +0 -2
  136. package/adapters/react/podcast-player.d.ts.map +1 -1
  137. package/adapters/react/podcast-player.js +1 -1
  138. package/adapters/react/podcast-player.js.map +1 -1
  139. package/adapters/react/podcast-player.tsx +1 -3
  140. package/adapters/react/product-card.d.ts +0 -3
  141. package/adapters/react/product-card.d.ts.map +1 -1
  142. package/adapters/react/product-card.js +1 -1
  143. package/adapters/react/product-card.js.map +1 -1
  144. package/adapters/react/product-card.tsx +1 -4
  145. package/adapters/react/qr-reader.d.ts +0 -4
  146. package/adapters/react/qr-reader.d.ts.map +1 -1
  147. package/adapters/react/qr-reader.js +1 -1
  148. package/adapters/react/qr-reader.js.map +1 -1
  149. package/adapters/react/qr-reader.tsx +1 -5
  150. package/adapters/react/recipe.d.ts +0 -5
  151. package/adapters/react/recipe.d.ts.map +1 -1
  152. package/adapters/react/recipe.js +1 -1
  153. package/adapters/react/recipe.js.map +1 -1
  154. package/adapters/react/recipe.tsx +1 -6
  155. package/adapters/react/route-specificity.d.ts +1 -0
  156. package/adapters/react/spotlight.d.ts +0 -2
  157. package/adapters/react/spotlight.d.ts.map +1 -1
  158. package/adapters/react/spotlight.js +1 -1
  159. package/adapters/react/spotlight.js.map +1 -1
  160. package/adapters/react/spotlight.tsx +1 -3
  161. package/adapters/react/tag-input.d.ts +0 -4
  162. package/adapters/react/tag-input.d.ts.map +1 -1
  163. package/adapters/react/tag-input.js +1 -1
  164. package/adapters/react/tag-input.js.map +1 -1
  165. package/adapters/react/tag-input.tsx +1 -5
  166. package/adapters/react/terminal.d.ts +0 -1
  167. package/adapters/react/terminal.d.ts.map +1 -1
  168. package/adapters/react/terminal.js +1 -1
  169. package/adapters/react/terminal.js.map +1 -1
  170. package/adapters/react/terminal.tsx +1 -2
  171. package/adapters/react/time-picker.d.ts +0 -1
  172. package/adapters/react/time-picker.d.ts.map +1 -1
  173. package/adapters/react/time-picker.js +1 -1
  174. package/adapters/react/time-picker.js.map +1 -1
  175. package/adapters/react/time-picker.tsx +1 -2
  176. package/adapters/react/timer.d.ts +0 -1
  177. package/adapters/react/timer.d.ts.map +1 -1
  178. package/adapters/react/timer.js +1 -1
  179. package/adapters/react/timer.js.map +1 -1
  180. package/adapters/react/timer.tsx +1 -2
  181. package/adapters/react/useRequestHandler.js +1 -1
  182. package/adapters/react/video-player.d.ts +0 -6
  183. package/adapters/react/video-player.d.ts.map +1 -1
  184. package/adapters/react/video-player.js +1 -1
  185. package/adapters/react/video-player.js.map +1 -1
  186. package/adapters/react/video-player.tsx +1 -7
  187. package/adapters/react/virtual-scroller.d.ts +0 -1
  188. package/adapters/react/virtual-scroller.d.ts.map +1 -1
  189. package/adapters/react/virtual-scroller.js +1 -1
  190. package/adapters/react/virtual-scroller.js.map +1 -1
  191. package/adapters/react/virtual-scroller.tsx +1 -2
  192. package/bin/templates/default/tests/services/jwt.test.ts +8 -1
  193. package/bin/templates/react/tests/services/jwt.test.ts +10 -3
  194. package/dist/cdn/accordion/snice-accordion.js +1 -1
  195. package/dist/cdn/accordion/snice-accordion.min.js +1 -1
  196. package/dist/cdn/action-bar/README.md +2 -2
  197. package/dist/cdn/action-bar/snice-action-bar.js +2 -2
  198. package/dist/cdn/action-bar/snice-action-bar.js.map +1 -1
  199. package/dist/cdn/action-bar/snice-action-bar.min.js +2 -2
  200. package/dist/cdn/action-bar/snice-action-bar.min.js.map +1 -1
  201. package/dist/cdn/activity-feed/snice-activity-feed.js +1 -1
  202. package/dist/cdn/activity-feed/snice-activity-feed.min.js +1 -1
  203. package/dist/cdn/alert/snice-alert.js +1 -1
  204. package/dist/cdn/alert/snice-alert.js.map +1 -1
  205. package/dist/cdn/alert/snice-alert.min.js +1 -1
  206. package/dist/cdn/alert/snice-alert.min.js.map +1 -1
  207. package/dist/cdn/app-tiles/snice-app-tiles.js +1 -1
  208. package/dist/cdn/app-tiles/snice-app-tiles.min.js +1 -1
  209. package/dist/cdn/approval-flow/snice-approval-flow.js +1 -1
  210. package/dist/cdn/approval-flow/snice-approval-flow.js.map +1 -1
  211. package/dist/cdn/approval-flow/snice-approval-flow.min.js +1 -1
  212. package/dist/cdn/approval-flow/snice-approval-flow.min.js.map +1 -1
  213. package/dist/cdn/audio-recorder/snice-audio-recorder.js +1 -1
  214. package/dist/cdn/audio-recorder/snice-audio-recorder.min.js +1 -1
  215. package/dist/cdn/availability/snice-availability.js +1 -1
  216. package/dist/cdn/availability/snice-availability.min.js +1 -1
  217. package/dist/cdn/avatar/snice-avatar.js +1 -1
  218. package/dist/cdn/avatar/snice-avatar.min.js +1 -1
  219. package/dist/cdn/avatar-group/snice-avatar-group.js +1 -1
  220. package/dist/cdn/avatar-group/snice-avatar-group.min.js +1 -1
  221. package/dist/cdn/badge/snice-badge.js +1 -1
  222. package/dist/cdn/badge/snice-badge.js.map +1 -1
  223. package/dist/cdn/badge/snice-badge.min.js +1 -1
  224. package/dist/cdn/badge/snice-badge.min.js.map +1 -1
  225. package/dist/cdn/banner/README.md +1 -1
  226. package/dist/cdn/banner/snice-banner.js +2 -2
  227. package/dist/cdn/banner/snice-banner.js.map +1 -1
  228. package/dist/cdn/banner/snice-banner.min.js +2 -2
  229. package/dist/cdn/banner/snice-banner.min.js.map +1 -1
  230. package/dist/cdn/binpack/snice-binpack.js +1 -1
  231. package/dist/cdn/binpack/snice-binpack.min.js +1 -1
  232. package/dist/cdn/book/snice-book.js +1 -1
  233. package/dist/cdn/book/snice-book.min.js +1 -1
  234. package/dist/cdn/booking/snice-booking.js +1 -1
  235. package/dist/cdn/booking/snice-booking.min.js +1 -1
  236. package/dist/cdn/breadcrumbs/snice-breadcrumbs.js +1 -1
  237. package/dist/cdn/breadcrumbs/snice-breadcrumbs.js.map +1 -1
  238. package/dist/cdn/breadcrumbs/snice-breadcrumbs.min.js +1 -1
  239. package/dist/cdn/breadcrumbs/snice-breadcrumbs.min.js.map +1 -1
  240. package/dist/cdn/button/snice-button.js +1 -1
  241. package/dist/cdn/button/snice-button.js.map +1 -1
  242. package/dist/cdn/button/snice-button.min.js +1 -1
  243. package/dist/cdn/button/snice-button.min.js.map +1 -1
  244. package/dist/cdn/calendar/snice-calendar.js +1 -1
  245. package/dist/cdn/calendar/snice-calendar.min.js +1 -1
  246. package/dist/cdn/camera/snice-camera.js +1 -1
  247. package/dist/cdn/camera/snice-camera.min.js +1 -1
  248. package/dist/cdn/camera-annotate/snice-camera-annotate.js +1 -1
  249. package/dist/cdn/camera-annotate/snice-camera-annotate.min.js +1 -1
  250. package/dist/cdn/candlestick/snice-candlestick.js +1 -1
  251. package/dist/cdn/candlestick/snice-candlestick.min.js +1 -1
  252. package/dist/cdn/card/snice-card.js +1 -1
  253. package/dist/cdn/card/snice-card.min.js +1 -1
  254. package/dist/cdn/carousel/snice-carousel.js +1 -1
  255. package/dist/cdn/carousel/snice-carousel.min.js +1 -1
  256. package/dist/cdn/cart/snice-cart.js +1 -1
  257. package/dist/cdn/cart/snice-cart.min.js +1 -1
  258. package/dist/cdn/chart/snice-chart.js +1 -1
  259. package/dist/cdn/chart/snice-chart.js.map +1 -1
  260. package/dist/cdn/chart/snice-chart.min.js +1 -1
  261. package/dist/cdn/chart/snice-chart.min.js.map +1 -1
  262. package/dist/cdn/chat/README.md +2 -2
  263. package/dist/cdn/chat/snice-chat.js +785 -89
  264. package/dist/cdn/chat/snice-chat.js.map +1 -1
  265. package/dist/cdn/chat/snice-chat.min.js +71 -75
  266. package/dist/cdn/chat/snice-chat.min.js.map +1 -1
  267. package/dist/cdn/checkbox/snice-checkbox.js +1 -1
  268. package/dist/cdn/checkbox/snice-checkbox.min.js +1 -1
  269. package/dist/cdn/chip/snice-chip.js +1 -1
  270. package/dist/cdn/chip/snice-chip.js.map +1 -1
  271. package/dist/cdn/chip/snice-chip.min.js +1 -1
  272. package/dist/cdn/chip/snice-chip.min.js.map +1 -1
  273. package/dist/cdn/code-block/snice-code-block.js +1 -1
  274. package/dist/cdn/code-block/snice-code-block.min.js +1 -1
  275. package/dist/cdn/color-display/snice-color-display.js +1 -1
  276. package/dist/cdn/color-display/snice-color-display.min.js +1 -1
  277. package/dist/cdn/color-picker/snice-color-picker.js +1 -1
  278. package/dist/cdn/color-picker/snice-color-picker.min.js +1 -1
  279. package/dist/cdn/command-palette/README.md +1 -1
  280. package/dist/cdn/command-palette/snice-command-palette.js +2 -2
  281. package/dist/cdn/command-palette/snice-command-palette.js.map +1 -1
  282. package/dist/cdn/command-palette/snice-command-palette.min.js +2 -2
  283. package/dist/cdn/command-palette/snice-command-palette.min.js.map +1 -1
  284. package/dist/cdn/comments/snice-comments.js +1 -1
  285. package/dist/cdn/comments/snice-comments.min.js +1 -1
  286. package/dist/cdn/countdown/snice-countdown.js +1 -1
  287. package/dist/cdn/countdown/snice-countdown.min.js +1 -1
  288. package/dist/cdn/cropper/snice-cropper.js +1 -1
  289. package/dist/cdn/cropper/snice-cropper.min.js +1 -1
  290. package/dist/cdn/data-card/snice-data-card.js +1 -1
  291. package/dist/cdn/data-card/snice-data-card.js.map +1 -1
  292. package/dist/cdn/data-card/snice-data-card.min.js +1 -1
  293. package/dist/cdn/data-card/snice-data-card.min.js.map +1 -1
  294. package/dist/cdn/date-picker/snice-date-picker.js +1 -1
  295. package/dist/cdn/date-picker/snice-date-picker.min.js +1 -1
  296. package/dist/cdn/date-range-picker/snice-date-range-picker.js +1 -1
  297. package/dist/cdn/date-range-picker/snice-date-range-picker.min.js +1 -1
  298. package/dist/cdn/date-time-picker/snice-date-time-picker.js +1 -1
  299. package/dist/cdn/date-time-picker/snice-date-time-picker.min.js +1 -1
  300. package/dist/cdn/diff/snice-diff.js +1 -1
  301. package/dist/cdn/diff/snice-diff.min.js +1 -1
  302. package/dist/cdn/divider/snice-divider.js +1 -1
  303. package/dist/cdn/divider/snice-divider.min.js +1 -1
  304. package/dist/cdn/doc/snice-doc.js +1 -1
  305. package/dist/cdn/doc/snice-doc.min.js +1 -1
  306. package/dist/cdn/draw/snice-draw.js +1 -1
  307. package/dist/cdn/draw/snice-draw.min.js +1 -1
  308. package/dist/cdn/drawer/snice-drawer.js +1 -1
  309. package/dist/cdn/drawer/snice-drawer.js.map +1 -1
  310. package/dist/cdn/drawer/snice-drawer.min.js +1 -1
  311. package/dist/cdn/drawer/snice-drawer.min.js.map +1 -1
  312. package/dist/cdn/empty-state/snice-empty-state.js +1 -1
  313. package/dist/cdn/empty-state/snice-empty-state.js.map +1 -1
  314. package/dist/cdn/empty-state/snice-empty-state.min.js +1 -1
  315. package/dist/cdn/empty-state/snice-empty-state.min.js.map +1 -1
  316. package/dist/cdn/estimate/snice-estimate.js +1 -1
  317. package/dist/cdn/estimate/snice-estimate.min.js +1 -1
  318. package/dist/cdn/file-gallery/snice-file-gallery.js +1 -1
  319. package/dist/cdn/file-gallery/snice-file-gallery.min.js +1 -1
  320. package/dist/cdn/file-upload/snice-file-upload.js +1 -1
  321. package/dist/cdn/file-upload/snice-file-upload.min.js +1 -1
  322. package/dist/cdn/flip-card/snice-flip-card.js +1 -1
  323. package/dist/cdn/flip-card/snice-flip-card.min.js +1 -1
  324. package/dist/cdn/flow/snice-flow.js +1 -1
  325. package/dist/cdn/flow/snice-flow.min.js +1 -1
  326. package/dist/cdn/form-layout/snice-form-layout.js +1 -1
  327. package/dist/cdn/form-layout/snice-form-layout.min.js +1 -1
  328. package/dist/cdn/funnel/snice-funnel.js +1 -1
  329. package/dist/cdn/funnel/snice-funnel.js.map +1 -1
  330. package/dist/cdn/funnel/snice-funnel.min.js +1 -1
  331. package/dist/cdn/funnel/snice-funnel.min.js.map +1 -1
  332. package/dist/cdn/gantt/snice-gantt.js +1 -1
  333. package/dist/cdn/gantt/snice-gantt.min.js +1 -1
  334. package/dist/cdn/gauge/snice-gauge.js +1 -1
  335. package/dist/cdn/gauge/snice-gauge.min.js +1 -1
  336. package/dist/cdn/grid/snice-grid.js +1 -1
  337. package/dist/cdn/grid/snice-grid.min.js +1 -1
  338. package/dist/cdn/heatmap/snice-heatmap.js +1 -1
  339. package/dist/cdn/heatmap/snice-heatmap.min.js +1 -1
  340. package/dist/cdn/image/snice-image.js +1 -1
  341. package/dist/cdn/image/snice-image.js.map +1 -1
  342. package/dist/cdn/image/snice-image.min.js +1 -1
  343. package/dist/cdn/image/snice-image.min.js.map +1 -1
  344. package/dist/cdn/input/snice-input.js +1 -1
  345. package/dist/cdn/input/snice-input.js.map +1 -1
  346. package/dist/cdn/input/snice-input.min.js +1 -1
  347. package/dist/cdn/input/snice-input.min.js.map +1 -1
  348. package/dist/cdn/invoice/README.md +1 -1
  349. package/dist/cdn/invoice/snice-invoice.js +2 -2
  350. package/dist/cdn/invoice/snice-invoice.js.map +1 -1
  351. package/dist/cdn/invoice/snice-invoice.min.js +2 -2
  352. package/dist/cdn/invoice/snice-invoice.min.js.map +1 -1
  353. package/dist/cdn/kanban/snice-kanban.js +1 -1
  354. package/dist/cdn/kanban/snice-kanban.min.js +1 -1
  355. package/dist/cdn/key-value/snice-key-value.js +1 -1
  356. package/dist/cdn/key-value/snice-key-value.min.js +1 -1
  357. package/dist/cdn/kpi/snice-kpi.js +1 -1
  358. package/dist/cdn/kpi/snice-kpi.js.map +1 -1
  359. package/dist/cdn/kpi/snice-kpi.min.js +1 -1
  360. package/dist/cdn/kpi/snice-kpi.min.js.map +1 -1
  361. package/dist/cdn/layout/snice-layout.js +1 -1
  362. package/dist/cdn/layout/snice-layout.min.js +1 -1
  363. package/dist/cdn/leaderboard/snice-leaderboard.js +1 -1
  364. package/dist/cdn/leaderboard/snice-leaderboard.min.js +1 -1
  365. package/dist/cdn/link/snice-link.js +1 -1
  366. package/dist/cdn/link/snice-link.min.js +1 -1
  367. package/dist/cdn/link-preview/snice-link-preview.js +1 -1
  368. package/dist/cdn/link-preview/snice-link-preview.min.js +1 -1
  369. package/dist/cdn/list/snice-list.js +1 -1
  370. package/dist/cdn/list/snice-list.js.map +1 -1
  371. package/dist/cdn/list/snice-list.min.js +1 -1
  372. package/dist/cdn/list/snice-list.min.js.map +1 -1
  373. package/dist/cdn/location/snice-location.js +1 -1
  374. package/dist/cdn/location/snice-location.js.map +1 -1
  375. package/dist/cdn/location/snice-location.min.js +1 -1
  376. package/dist/cdn/location/snice-location.min.js.map +1 -1
  377. package/dist/cdn/login/snice-login.js +3 -1
  378. package/dist/cdn/login/snice-login.js.map +1 -1
  379. package/dist/cdn/login/snice-login.min.js +1 -1
  380. package/dist/cdn/login/snice-login.min.js.map +1 -1
  381. package/dist/cdn/map/snice-map.js +1 -1
  382. package/dist/cdn/map/snice-map.min.js +1 -1
  383. package/dist/cdn/markdown/README.md +2 -2
  384. package/dist/cdn/markdown/snice-markdown.js +16 -3
  385. package/dist/cdn/markdown/snice-markdown.js.map +1 -1
  386. package/dist/cdn/markdown/snice-markdown.min.js +3 -3
  387. package/dist/cdn/markdown/snice-markdown.min.js.map +1 -1
  388. package/dist/cdn/masonry/snice-masonry.js +1 -1
  389. package/dist/cdn/masonry/snice-masonry.min.js +1 -1
  390. package/dist/cdn/menu/snice-menu.js +2 -2
  391. package/dist/cdn/menu/snice-menu.js.map +1 -1
  392. package/dist/cdn/menu/snice-menu.min.js +2 -2
  393. package/dist/cdn/menu/snice-menu.min.js.map +1 -1
  394. package/dist/cdn/message-strip/snice-message-strip.js +9 -9
  395. package/dist/cdn/message-strip/snice-message-strip.js.map +1 -1
  396. package/dist/cdn/message-strip/snice-message-strip.min.js +3 -3
  397. package/dist/cdn/message-strip/snice-message-strip.min.js.map +1 -1
  398. package/dist/cdn/metric-table/snice-metric-table.js +1 -1
  399. package/dist/cdn/metric-table/snice-metric-table.min.js +1 -1
  400. package/dist/cdn/modal/snice-modal.js +1 -1
  401. package/dist/cdn/modal/snice-modal.js.map +1 -1
  402. package/dist/cdn/modal/snice-modal.min.js +1 -1
  403. package/dist/cdn/modal/snice-modal.min.js.map +1 -1
  404. package/dist/cdn/music-player/snice-music-player.js +1 -1
  405. package/dist/cdn/music-player/snice-music-player.min.js +1 -1
  406. package/dist/cdn/nav/snice-nav.js +1 -1
  407. package/dist/cdn/nav/snice-nav.min.js +1 -1
  408. package/dist/cdn/network-graph/snice-network-graph.js +1 -1
  409. package/dist/cdn/network-graph/snice-network-graph.js.map +1 -1
  410. package/dist/cdn/network-graph/snice-network-graph.min.js +1 -1
  411. package/dist/cdn/network-graph/snice-network-graph.min.js.map +1 -1
  412. package/dist/cdn/notification-center/snice-notification-center.js +1 -1
  413. package/dist/cdn/notification-center/snice-notification-center.js.map +1 -1
  414. package/dist/cdn/notification-center/snice-notification-center.min.js +1 -1
  415. package/dist/cdn/notification-center/snice-notification-center.min.js.map +1 -1
  416. package/dist/cdn/order-tracker/snice-order-tracker.js +1 -1
  417. package/dist/cdn/order-tracker/snice-order-tracker.min.js +1 -1
  418. package/dist/cdn/org-chart/snice-org-chart.js +1 -1
  419. package/dist/cdn/org-chart/snice-org-chart.min.js +1 -1
  420. package/dist/cdn/pagination/snice-pagination.js +1 -1
  421. package/dist/cdn/pagination/snice-pagination.min.js +1 -1
  422. package/dist/cdn/paint/snice-paint.js +1 -1
  423. package/dist/cdn/paint/snice-paint.min.js +1 -1
  424. package/dist/cdn/pdf-viewer/snice-pdf-viewer.js +1 -1
  425. package/dist/cdn/pdf-viewer/snice-pdf-viewer.min.js +1 -1
  426. package/dist/cdn/permission-matrix/snice-permission-matrix.js +1 -1
  427. package/dist/cdn/permission-matrix/snice-permission-matrix.min.js +1 -1
  428. package/dist/cdn/podcast-player/snice-podcast-player.js +1 -1
  429. package/dist/cdn/podcast-player/snice-podcast-player.min.js +1 -1
  430. package/dist/cdn/popover/snice-popover.js +1 -1
  431. package/dist/cdn/popover/snice-popover.min.js +1 -1
  432. package/dist/cdn/pricing-table/snice-pricing-table.js +1 -1
  433. package/dist/cdn/pricing-table/snice-pricing-table.min.js +1 -1
  434. package/dist/cdn/product-card/snice-product-card.js +3 -3
  435. package/dist/cdn/product-card/snice-product-card.js.map +1 -1
  436. package/dist/cdn/product-card/snice-product-card.min.js +3 -3
  437. package/dist/cdn/product-card/snice-product-card.min.js.map +1 -1
  438. package/dist/cdn/progress/README.md +1 -1
  439. package/dist/cdn/progress/snice-progress.js +2 -2
  440. package/dist/cdn/progress/snice-progress.js.map +1 -1
  441. package/dist/cdn/progress/snice-progress.min.js +2 -2
  442. package/dist/cdn/progress/snice-progress.min.js.map +1 -1
  443. package/dist/cdn/progress-ring/snice-progress-ring.js +2 -2
  444. package/dist/cdn/progress-ring/snice-progress-ring.js.map +1 -1
  445. package/dist/cdn/progress-ring/snice-progress-ring.min.js +2 -2
  446. package/dist/cdn/progress-ring/snice-progress-ring.min.js.map +1 -1
  447. package/dist/cdn/qr-code/snice-qr-code.js +1 -1
  448. package/dist/cdn/qr-code/snice-qr-code.min.js +1 -1
  449. package/dist/cdn/qr-reader/snice-qr-reader.js +1 -1
  450. package/dist/cdn/qr-reader/snice-qr-reader.min.js +1 -1
  451. package/dist/cdn/radio/snice-radio.js +1 -1
  452. package/dist/cdn/radio/snice-radio.min.js +1 -1
  453. package/dist/cdn/range-slider/snice-range-slider.js +1 -1
  454. package/dist/cdn/range-slider/snice-range-slider.min.js +1 -1
  455. package/dist/cdn/rating/snice-rating.js +1 -1
  456. package/dist/cdn/rating/snice-rating.min.js +1 -1
  457. package/dist/cdn/receipt/snice-receipt.js +1 -1
  458. package/dist/cdn/receipt/snice-receipt.min.js +1 -1
  459. package/dist/cdn/recipe/snice-recipe.js +1 -1
  460. package/dist/cdn/recipe/snice-recipe.min.js +1 -1
  461. package/dist/cdn/runtime/README.md +2 -2
  462. package/dist/cdn/runtime/snice-runtime.esm.js +644 -172
  463. package/dist/cdn/runtime/snice-runtime.esm.js.map +1 -1
  464. package/dist/cdn/runtime/snice-runtime.esm.min.js +8 -8
  465. package/dist/cdn/runtime/snice-runtime.esm.min.js.map +1 -1
  466. package/dist/cdn/runtime/snice-runtime.js +644 -172
  467. package/dist/cdn/runtime/snice-runtime.js.map +1 -1
  468. package/dist/cdn/runtime/snice-runtime.min.js +8 -8
  469. package/dist/cdn/runtime/snice-runtime.min.js.map +1 -1
  470. package/dist/cdn/sankey/snice-sankey.js +1 -1
  471. package/dist/cdn/sankey/snice-sankey.js.map +1 -1
  472. package/dist/cdn/sankey/snice-sankey.min.js +1 -1
  473. package/dist/cdn/sankey/snice-sankey.min.js.map +1 -1
  474. package/dist/cdn/segmented-control/snice-segmented-control.js +1 -1
  475. package/dist/cdn/segmented-control/snice-segmented-control.min.js +1 -1
  476. package/dist/cdn/select/snice-select.js +1 -1
  477. package/dist/cdn/select/snice-select.min.js +1 -1
  478. package/dist/cdn/skeleton/snice-skeleton.js +1 -1
  479. package/dist/cdn/skeleton/snice-skeleton.min.js +1 -1
  480. package/dist/cdn/slider/snice-slider.js +1 -1
  481. package/dist/cdn/slider/snice-slider.min.js +1 -1
  482. package/dist/cdn/sortable/snice-sortable.js +1 -1
  483. package/dist/cdn/sortable/snice-sortable.min.js +1 -1
  484. package/dist/cdn/sparkline/snice-sparkline.js +1 -1
  485. package/dist/cdn/sparkline/snice-sparkline.min.js +1 -1
  486. package/dist/cdn/spinner/snice-spinner.js +1 -1
  487. package/dist/cdn/spinner/snice-spinner.min.js +1 -1
  488. package/dist/cdn/split-button/snice-split-button.js +1 -1
  489. package/dist/cdn/split-button/snice-split-button.js.map +1 -1
  490. package/dist/cdn/split-button/snice-split-button.min.js +1 -1
  491. package/dist/cdn/split-button/snice-split-button.min.js.map +1 -1
  492. package/dist/cdn/split-pane/snice-split-pane.js +1 -1
  493. package/dist/cdn/split-pane/snice-split-pane.min.js +1 -1
  494. package/dist/cdn/spotlight/snice-spotlight.js +1 -1
  495. package/dist/cdn/spotlight/snice-spotlight.min.js +1 -1
  496. package/dist/cdn/stat-group/snice-stat-group.js +1 -1
  497. package/dist/cdn/stat-group/snice-stat-group.min.js +1 -1
  498. package/dist/cdn/step-input/snice-step-input.js +1 -1
  499. package/dist/cdn/step-input/snice-step-input.min.js +1 -1
  500. package/dist/cdn/stepper/snice-stepper.js +1 -1
  501. package/dist/cdn/stepper/snice-stepper.min.js +1 -1
  502. package/dist/cdn/switch/snice-switch.js +1 -1
  503. package/dist/cdn/switch/snice-switch.min.js +1 -1
  504. package/dist/cdn/table/README.md +1 -1
  505. package/dist/cdn/table/snice-table.js +14 -4
  506. package/dist/cdn/table/snice-table.js.map +1 -1
  507. package/dist/cdn/table/snice-table.min.js +14 -4
  508. package/dist/cdn/table/snice-table.min.js.map +1 -1
  509. package/dist/cdn/tabs/snice-tabs.js +1 -1
  510. package/dist/cdn/tabs/snice-tabs.min.js +1 -1
  511. package/dist/cdn/tag/snice-tag.js +1 -1
  512. package/dist/cdn/tag/snice-tag.min.js +1 -1
  513. package/dist/cdn/tag-input/snice-tag-input.js +2 -2
  514. package/dist/cdn/tag-input/snice-tag-input.js.map +1 -1
  515. package/dist/cdn/tag-input/snice-tag-input.min.js +2 -2
  516. package/dist/cdn/tag-input/snice-tag-input.min.js.map +1 -1
  517. package/dist/cdn/terminal/snice-terminal.js +1 -1
  518. package/dist/cdn/terminal/snice-terminal.min.js +1 -1
  519. package/dist/cdn/testimonial/snice-testimonial.js +1 -1
  520. package/dist/cdn/testimonial/snice-testimonial.min.js +1 -1
  521. package/dist/cdn/textarea/snice-textarea.js +1 -1
  522. package/dist/cdn/textarea/snice-textarea.min.js +1 -1
  523. package/dist/cdn/time-picker/README.md +1 -1
  524. package/dist/cdn/time-picker/snice-time-picker.js +18 -13
  525. package/dist/cdn/time-picker/snice-time-picker.js.map +1 -1
  526. package/dist/cdn/time-picker/snice-time-picker.min.js +3 -3
  527. package/dist/cdn/time-picker/snice-time-picker.min.js.map +1 -1
  528. package/dist/cdn/time-range-picker/snice-time-range-picker.js +1 -1
  529. package/dist/cdn/time-range-picker/snice-time-range-picker.min.js +1 -1
  530. package/dist/cdn/timeline/snice-timeline.js +1 -1
  531. package/dist/cdn/timeline/snice-timeline.js.map +1 -1
  532. package/dist/cdn/timeline/snice-timeline.min.js +1 -1
  533. package/dist/cdn/timeline/snice-timeline.min.js.map +1 -1
  534. package/dist/cdn/timer/snice-timer.js +1 -1
  535. package/dist/cdn/timer/snice-timer.min.js +1 -1
  536. package/dist/cdn/toast/snice-toast.js +1 -1
  537. package/dist/cdn/toast/snice-toast.js.map +1 -1
  538. package/dist/cdn/toast/snice-toast.min.js +1 -1
  539. package/dist/cdn/toast/snice-toast.min.js.map +1 -1
  540. package/dist/cdn/tooltip/snice-tooltip.js +1 -1
  541. package/dist/cdn/tooltip/snice-tooltip.min.js +1 -1
  542. package/dist/cdn/tree/snice-tree.js +1 -1
  543. package/dist/cdn/tree/snice-tree.min.js +1 -1
  544. package/dist/cdn/treemap/snice-treemap.js +1 -1
  545. package/dist/cdn/treemap/snice-treemap.js.map +1 -1
  546. package/dist/cdn/treemap/snice-treemap.min.js +1 -1
  547. package/dist/cdn/treemap/snice-treemap.min.js.map +1 -1
  548. package/dist/cdn/user-card/snice-user-card.js +1 -1
  549. package/dist/cdn/user-card/snice-user-card.min.js +1 -1
  550. package/dist/cdn/video-player/snice-video-player.js +1 -1
  551. package/dist/cdn/video-player/snice-video-player.min.js +1 -1
  552. package/dist/cdn/virtual-scroller/snice-virtual-scroller.js +1 -1
  553. package/dist/cdn/virtual-scroller/snice-virtual-scroller.min.js +1 -1
  554. package/dist/cdn/waterfall/snice-waterfall.js +1 -1
  555. package/dist/cdn/waterfall/snice-waterfall.min.js +1 -1
  556. package/dist/cdn/weather/snice-weather.js +1 -1
  557. package/dist/cdn/weather/snice-weather.min.js +1 -1
  558. package/dist/cdn/work-order/snice-work-order.js +1 -1
  559. package/dist/cdn/work-order/snice-work-order.min.js +1 -1
  560. package/dist/components/action-bar/snice-action-bar.js +1 -1
  561. package/dist/components/action-bar/snice-action-bar.js.map +1 -1
  562. package/dist/components/banner/snice-banner.js +1 -1
  563. package/dist/components/banner/snice-banner.js.map +1 -1
  564. package/dist/components/chat/snice-chat-message.d.ts +32 -0
  565. package/dist/components/chat/snice-chat-message.js +127 -0
  566. package/dist/components/chat/snice-chat-message.js.map +1 -0
  567. package/dist/components/chat/snice-chat-message.types.d.ts +30 -0
  568. package/dist/components/chat/snice-chat.d.ts +31 -4
  569. package/dist/components/chat/snice-chat.js +363 -90
  570. package/dist/components/chat/snice-chat.js.map +1 -1
  571. package/dist/components/chat/snice-chat.types.d.ts +34 -3
  572. package/dist/components/command-palette/snice-command-palette.js +1 -1
  573. package/dist/components/command-palette/snice-command-palette.js.map +1 -1
  574. package/dist/components/icons/index.d.ts +4 -0
  575. package/dist/components/icons/index.js +5 -1
  576. package/dist/components/icons/index.js.map +1 -1
  577. package/dist/components/invoice/snice-invoice.js +1 -1
  578. package/dist/components/invoice/snice-invoice.js.map +1 -1
  579. package/dist/components/login/snice-login.d.ts +2 -2
  580. package/dist/components/login/snice-login.js +2 -0
  581. package/dist/components/login/snice-login.js.map +1 -1
  582. package/dist/components/login/snice-login.types.d.ts +4 -0
  583. package/dist/components/markdown/snice-markdown.d.ts +1 -0
  584. package/dist/components/markdown/snice-markdown.js +15 -2
  585. package/dist/components/markdown/snice-markdown.js.map +1 -1
  586. package/dist/components/menu/snice-menu.js +1 -1
  587. package/dist/components/menu/snice-menu.js.map +1 -1
  588. package/dist/components/message-strip/snice-message-strip.d.ts +1 -1
  589. package/dist/components/message-strip/snice-message-strip.js +8 -8
  590. package/dist/components/message-strip/snice-message-strip.types.d.ts +1 -1
  591. package/dist/components/product-card/snice-product-card.js +2 -2
  592. package/dist/components/product-card/snice-product-card.js.map +1 -1
  593. package/dist/components/progress/snice-progress.js +1 -1
  594. package/dist/components/progress/snice-progress.js.map +1 -1
  595. package/dist/components/progress-ring/snice-progress-ring.js +1 -1
  596. package/dist/components/progress-ring/snice-progress-ring.js.map +1 -1
  597. package/dist/components/table/snice-table.js +13 -3
  598. package/dist/components/table/snice-table.js.map +1 -1
  599. package/dist/components/tag-input/snice-tag-input.js +1 -1
  600. package/dist/components/tag-input/snice-tag-input.js.map +1 -1
  601. package/dist/components/time-picker/snice-time-picker.js +17 -12
  602. package/dist/components/time-picker/snice-time-picker.js.map +1 -1
  603. package/dist/components/utils.d.ts +6 -0
  604. package/dist/components/utils.js +1 -1
  605. package/dist/components/utils.js.map +1 -1
  606. package/dist/element.d.ts +2 -1
  607. package/dist/events.d.ts +6 -0
  608. package/dist/index.cjs +641 -169
  609. package/dist/index.cjs.map +1 -1
  610. package/dist/index.esm.js +641 -169
  611. package/dist/index.esm.js.map +1 -1
  612. package/dist/index.iife.js +641 -169
  613. package/dist/index.iife.js.map +1 -1
  614. package/dist/parts.d.ts +1 -8
  615. package/dist/react/SniceProvider.js +1 -1
  616. package/dist/react/SniceRouter.js +1 -1
  617. package/dist/react/index.js +1 -1
  618. package/dist/react/matchRoute.d.ts +1 -1
  619. package/dist/react/matchRoute.js +38 -4
  620. package/dist/react/matchRoute.js.map +1 -1
  621. package/dist/react/route-specificity.d.ts +1 -0
  622. package/dist/react/useRequestHandler.js +1 -1
  623. package/dist/render.d.ts +7 -0
  624. package/dist/route-specificity.d.ts +1 -0
  625. package/dist/symbols.cjs +14 -1
  626. package/dist/symbols.cjs.map +1 -1
  627. package/dist/symbols.d.ts +3 -0
  628. package/dist/symbols.esm.js +12 -2
  629. package/dist/symbols.esm.js.map +1 -1
  630. package/dist/transitions.cjs +1 -1
  631. package/dist/transitions.esm.js +1 -1
  632. package/dist/types/context.d.ts +5 -2
  633. package/dist/types/dispatch-options.d.ts +7 -0
  634. package/dist/types/index.d.ts +1 -0
  635. package/dist/types/on-options.d.ts +14 -0
  636. package/dist/types/watch-options.d.ts +9 -0
  637. package/dist/utils.d.ts +26 -0
  638. package/docs/ai/DEVELOPMENT.md +1 -1
  639. package/docs/ai/README.md +11 -0
  640. package/docs/ai/api.md +24 -5
  641. package/docs/ai/cdn.md +31 -0
  642. package/docs/ai/components/chat.md +57 -1
  643. package/docs/ai/components/message-strip.md +3 -3
  644. package/docs/ai/decorators.md +44 -5
  645. package/docs/cdn.md +56 -0
  646. package/docs/components/chat.md +108 -2
  647. package/docs/components/message-strip.md +8 -8
  648. package/docs/elements.md +21 -0
  649. package/docs/events.md +88 -0
  650. package/docs/superpowers/specs/2026-05-26-chat-styling-design.md +155 -0
  651. package/docs/superpowers/specs/2026-05-27-chat-theming-REMAINING.md +83 -0
  652. package/docs/superpowers/specs/2026-06-09-chat-custom-content-design.md +233 -0
  653. package/package.json +1 -1
package/dist/parts.d.ts CHANGED
@@ -156,14 +156,7 @@ export interface KeyboardFilter {
156
156
  meta?: boolean;
157
157
  anyModifiers?: boolean;
158
158
  }
159
- /**
160
- * Parse keyboard shortcut specification
161
- * Examples:
162
- * "enter" -> { key: "Enter" }
163
- * "ctrl+s" -> { key: "s", ctrl: true }
164
- * "ctrl+shift+s" -> { key: "s", ctrl: true, shift: true }
165
- * "~enter" -> { key: "Enter", anyModifiers: true }
166
- */
159
+ export declare function warnIfModifierMisuse(eventName: string): void;
167
160
  export declare function parseKeyboardFilter(spec: string): KeyboardFilter;
168
161
  /**
169
162
  * Check if keyboard event matches the filter
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * snice v5.2.2
2
+ * snice v5.2.3
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.
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * snice v5.2.2
2
+ * snice v5.2.3
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.
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * snice v5.2.2
2
+ * snice v5.2.3
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.
@@ -11,6 +11,6 @@ export interface MatchResult {
11
11
  /**
12
12
  * Match a URL path against an array of route configs.
13
13
  * Uses pica-route — same matching as vanilla Snice's Router.
14
- * Routes are sorted by specificity (longest spec first).
14
+ * Routes are sorted by per-segment specificity (static > dynamic > wildcard).
15
15
  */
16
16
  export declare function matchRoutes(routes: RouteConfig[], pathname: string): MatchResult | null;
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * snice v5.2.2
2
+ * snice v5.2.3
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,14 +8,48 @@
8
8
  */
9
9
  import { Route } from 'pica-route';
10
10
 
11
+ /**
12
+ * Route specificity scorer for the React binding.
13
+ *
14
+ * IMPORTANT: keep this in exact sync with `src/route-specificity.ts`. The React
15
+ * integration is bundled in isolation (rootDir: src/react) and cannot import
16
+ * across that boundary, so the scorer is mirrored here. The `matchRoutes`
17
+ * resolution tests exercise this copy, so behavioral drift is caught.
18
+ *
19
+ * Scoring is per-segment by ROLE, not string length: a static segment outweighs
20
+ * a dynamic (`:param`) segment, which outweighs a wildcard (`*` / `*name`). So
21
+ * `/post/new` beats `/post/:id`, and a splat always ranks last. Sort callers
22
+ * descending by this score (highest = most specific = first).
23
+ */
24
+ const STATIC_SEGMENT = 10;
25
+ const DYNAMIC_SEGMENT = 3;
26
+ const WILDCARD_SEGMENT = -2;
27
+ function routeSpecificity(spec) {
28
+ const segments = spec.split('/').filter(Boolean);
29
+ // Base on segment count so a deeper path outranks a shallower one on ties.
30
+ let score = segments.length;
31
+ for (const segment of segments) {
32
+ if (segment.startsWith('*')) {
33
+ score += WILDCARD_SEGMENT;
34
+ }
35
+ else if (segment.startsWith(':')) {
36
+ score += DYNAMIC_SEGMENT;
37
+ }
38
+ else {
39
+ score += STATIC_SEGMENT;
40
+ }
41
+ }
42
+ return score;
43
+ }
44
+
11
45
  /**
12
46
  * Match a URL path against an array of route configs.
13
47
  * Uses pica-route — same matching as vanilla Snice's Router.
14
- * Routes are sorted by specificity (longest spec first).
48
+ * Routes are sorted by per-segment specificity (static > dynamic > wildcard).
15
49
  */
16
50
  function matchRoutes(routes, pathname) {
17
- // Sort by specificity (longest path first), same as vanilla Router
18
- const sorted = [...routes].sort((a, b) => b.path.length - a.path.length);
51
+ // Sort by specificity (most specific first), same model as the vanilla Router.
52
+ const sorted = [...routes].sort((a, b) => routeSpecificity(b.path) - routeSpecificity(a.path));
19
53
  for (const route of sorted) {
20
54
  const matcher = new Route(route.path);
21
55
  const params = matcher.match(pathname);
@@ -1 +1 @@
1
- {"version":3,"file":"matchRoute.js","sources":["../../src/react/matchRoute.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;AAaA;;;;AAIG;AACG,SAAU,WAAW,CAAC,MAAqB,EAAE,QAAgB,EAAA;;AAEjE,IAAA,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;AAExE,IAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;QAC1B,MAAM,OAAO,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;QACrC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;AACtC,QAAA,IAAI,MAAM,KAAK,KAAK,EAAE;YACpB,OAAO;gBACL,KAAK,EAAE,KAAK,CAAC,KAAK;AAClB,gBAAA,MAAM,EAAE,MAAqB;gBAC7B,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB;QACH;IACF;AAEA,IAAA,OAAO,IAAI;AACb;;;;"}
1
+ {"version":3,"file":"matchRoute.js","sources":["../../src/react/route-specificity.ts","../../src/react/matchRoute.ts"],"sourcesContent":[null,null],"names":[],"mappings":";;;;;;;;;;AAAA;;;;;;;;;;;;AAYG;AACH,MAAM,cAAc,GAAG,EAAE;AACzB,MAAM,eAAe,GAAG,CAAC;AACzB,MAAM,gBAAgB,GAAG,EAAE;AAErB,SAAU,gBAAgB,CAAC,IAAY,EAAA;AAC3C,IAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;;AAEhD,IAAA,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM;AAE3B,IAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;AAC9B,QAAA,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YAC3B,KAAK,IAAI,gBAAgB;QAC3B;AAAO,aAAA,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YAClC,KAAK,IAAI,eAAe;QAC1B;aAAO;YACL,KAAK,IAAI,cAAc;QACzB;IACF;AAEA,IAAA,OAAO,KAAK;AACd;;ACnBA;;;;AAIG;AACG,SAAU,WAAW,CAAC,MAAqB,EAAE,QAAgB,EAAA;;AAEjE,IAAA,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAE9F,IAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;QAC1B,MAAM,OAAO,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;QACrC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;AACtC,QAAA,IAAI,MAAM,KAAK,KAAK,EAAE;YACpB,OAAO;gBACL,KAAK,EAAE,KAAK,CAAC,KAAK;AAClB,gBAAA,MAAM,EAAE,MAAqB;gBAC7B,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB;QACH;IACF;AAEA,IAAA,OAAO,IAAI;AACb;;;;"}
@@ -0,0 +1 @@
1
+ export declare function routeSpecificity(spec: string): number;
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * snice v5.2.2
2
+ * snice v5.2.3
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.
package/dist/render.d.ts CHANGED
@@ -39,6 +39,13 @@ export interface RenderOptions {
39
39
  * @param immediate - Force immediate render (used for initial render)
40
40
  */
41
41
  export declare function requestRender(element: HTMLElement, immediate?: boolean): void;
42
+ /**
43
+ * Clear any pending debounce/throttle render timers on an element (e.g. on
44
+ * disconnect, so they don't fire on a dead element and retain it until they
45
+ * expire). Returns true if a render was actually pending, so the caller can
46
+ * arrange a replay on reconnect via PENDING_RECONNECT_RENDER.
47
+ */
48
+ export declare function clearRenderTimers(element: HTMLElement): boolean;
42
49
  /**
43
50
  * @render decorator for component rendering
44
51
  *
@@ -0,0 +1 @@
1
+ export declare function routeSpecificity(spec: string): number;
package/dist/symbols.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * snice v5.2.2
2
+ * snice v5.2.3
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.
@@ -35,6 +35,12 @@ const READY_PROMISE = getSymbol('ready-promise');
35
35
  const READY_RESOLVE = getSymbol('ready-resolve');
36
36
  const RENDERED_PROMISE = getSymbol('rendered-promise');
37
37
  const RENDERED_RESOLVE = getSymbol('rendered-resolve');
38
+ // Set when a render is requested but dropped because the element was
39
+ // disconnected; consumed on reconnect to replay exactly the missed render.
40
+ const PENDING_RECONNECT_RENDER = getSymbol('pending-reconnect-render');
41
+ // Per-element synchronous render-nesting depth, used to cap runaway re-entry
42
+ // without a shared global counter that one element could exhaust for others.
43
+ const RENDER_DEPTH = getSymbol('render-depth');
38
44
  const CONTROLLER = getSymbol('controller');
39
45
  const INITIALIZED = getSymbol('initialized');
40
46
  // Event handler symbols
@@ -115,6 +121,10 @@ const ADOPTED_METHODS = getSymbol('adopted-methods');
115
121
  // Controller attach-abort — set to an AbortController while attachController
116
122
  // is awaiting element.ready, so detachController can short-circuit the wait.
117
123
  const CONTROLLER_ABORT = getSymbol('controller-abort');
124
+ // Set on a controller instance once it has gotten past element.ready and is
125
+ // being attached, so detachController knows not to run detach() on a controller
126
+ // whose attach() was aborted before it ever ran.
127
+ const CONTROLLER_ATTACHED = getSymbol('controller-attached');
118
128
  const PROPERTY_DEFINERS = getSymbol('property-definers');
119
129
 
120
130
  exports.ADOPTED_HANDLERS = ADOPTED_HANDLERS;
@@ -135,6 +145,7 @@ exports.CONTEXT_UNREGISTER = CONTEXT_UNREGISTER;
135
145
  exports.CONTEXT_UPDATE = CONTEXT_UPDATE;
136
146
  exports.CONTROLLER = CONTROLLER;
137
147
  exports.CONTROLLER_ABORT = CONTROLLER_ABORT;
148
+ exports.CONTROLLER_ATTACHED = CONTROLLER_ATTACHED;
138
149
  exports.CONTROLLER_ID = CONTROLLER_ID;
139
150
  exports.CONTROLLER_KEY = CONTROLLER_KEY;
140
151
  exports.CONTROLLER_NAME_KEY = CONTROLLER_NAME_KEY;
@@ -163,6 +174,7 @@ exports.PAGE_TRANSITION = PAGE_TRANSITION;
163
174
  exports.PARENT_STYLES_METHODS = PARENT_STYLES_METHODS;
164
175
  exports.PARTS = PARTS;
165
176
  exports.PART_TIMERS = PART_TIMERS;
177
+ exports.PENDING_RECONNECT_RENDER = PENDING_RECONNECT_RENDER;
166
178
  exports.PRE_INIT_PROPERTY_VALUES = PRE_INIT_PROPERTY_VALUES;
167
179
  exports.PROPERTIES = PROPERTIES;
168
180
  exports.PROPERTIES_INITIALIZED = PROPERTIES_INITIALIZED;
@@ -179,6 +191,7 @@ exports.REGISTERED_ELEMENTS = REGISTERED_ELEMENTS;
179
191
  exports.RENDERED_PROMISE = RENDERED_PROMISE;
180
192
  exports.RENDERED_RESOLVE = RENDERED_RESOLVE;
181
193
  exports.RENDER_CALLBACKS = RENDER_CALLBACKS;
194
+ exports.RENDER_DEPTH = RENDER_DEPTH;
182
195
  exports.RENDER_INSTANCE = RENDER_INSTANCE;
183
196
  exports.RENDER_METHOD = RENDER_METHOD;
184
197
  exports.RENDER_OPTIONS = RENDER_OPTIONS;
@@ -1 +1 @@
1
- {"version":3,"file":"symbols.cjs","sources":["../src/global.ts","../src/symbols.ts"],"sourcesContent":[null,null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"symbols.cjs","sources":["../src/global.ts","../src/symbols.ts"],"sourcesContent":[null,null],"names":[],"mappings":"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"}
package/dist/symbols.d.ts CHANGED
@@ -8,6 +8,8 @@ export declare const READY_PROMISE: symbol;
8
8
  export declare const READY_RESOLVE: symbol;
9
9
  export declare const RENDERED_PROMISE: symbol;
10
10
  export declare const RENDERED_RESOLVE: symbol;
11
+ export declare const PENDING_RECONNECT_RENDER: symbol;
12
+ export declare const RENDER_DEPTH: symbol;
11
13
  export declare const CONTROLLER: symbol;
12
14
  export declare const INITIALIZED: symbol;
13
15
  export declare const ON_HANDLERS: symbol;
@@ -71,4 +73,5 @@ export declare const RECONNECT_METHODS: symbol;
71
73
  export declare const MOVED_METHODS: symbol;
72
74
  export declare const ADOPTED_METHODS: symbol;
73
75
  export declare const CONTROLLER_ABORT: symbol;
76
+ export declare const CONTROLLER_ATTACHED: symbol;
74
77
  export declare const PROPERTY_DEFINERS: symbol;
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * snice v5.2.2
2
+ * snice v5.2.3
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.
@@ -33,6 +33,12 @@ const READY_PROMISE = getSymbol('ready-promise');
33
33
  const READY_RESOLVE = getSymbol('ready-resolve');
34
34
  const RENDERED_PROMISE = getSymbol('rendered-promise');
35
35
  const RENDERED_RESOLVE = getSymbol('rendered-resolve');
36
+ // Set when a render is requested but dropped because the element was
37
+ // disconnected; consumed on reconnect to replay exactly the missed render.
38
+ const PENDING_RECONNECT_RENDER = getSymbol('pending-reconnect-render');
39
+ // Per-element synchronous render-nesting depth, used to cap runaway re-entry
40
+ // without a shared global counter that one element could exhaust for others.
41
+ const RENDER_DEPTH = getSymbol('render-depth');
36
42
  const CONTROLLER = getSymbol('controller');
37
43
  const INITIALIZED = getSymbol('initialized');
38
44
  // Event handler symbols
@@ -113,7 +119,11 @@ const ADOPTED_METHODS = getSymbol('adopted-methods');
113
119
  // Controller attach-abort — set to an AbortController while attachController
114
120
  // is awaiting element.ready, so detachController can short-circuit the wait.
115
121
  const CONTROLLER_ABORT = getSymbol('controller-abort');
122
+ // Set on a controller instance once it has gotten past element.ready and is
123
+ // being attached, so detachController knows not to run detach() on a controller
124
+ // whose attach() was aborted before it ever ran.
125
+ const CONTROLLER_ATTACHED = getSymbol('controller-attached');
116
126
  const PROPERTY_DEFINERS = getSymbol('property-definers');
117
127
 
118
- export { ADOPTED_HANDLERS, ADOPTED_METHODS, ADOPTED_TIMERS, CHANNEL_HANDLERS, CLEANUP, CONTEXT_CALLED, CONTEXT_HANDLER, CONTEXT_METHODS, CONTEXT_METHOD_NAME, CONTEXT_NOTIFY_ELEMENT, CONTEXT_OPTIONS, CONTEXT_REGISTER, CONTEXT_REQUEST_HANDLER, CONTEXT_TIMER, CONTEXT_UNREGISTER, CONTEXT_UPDATE, CONTROLLER, CONTROLLER_ABORT, CONTROLLER_ID, CONTROLLER_KEY, CONTROLLER_NAME_KEY, CONTROLLER_OPERATIONS, CREATED_AT, CURRENT_PAGE_MARKER, DISPATCH_TIMERS, DISPOSE_HANDLERS, DISPOSE_METHODS, EXPLICITLY_SET_PROPERTIES, INITIALIZED, IS_CONTROLLER_CLASS, IS_CONTROLLER_INSTANCE, IS_ELEMENT_CLASS, IS_UPDATING, MOVED_HANDLERS, MOVED_METHODS, MOVED_TIMERS, NATIVE_CONTROLLER, NAVIGATION_CONTEXT_INSTANCE, OBSERVERS, OBSERVE_METHODS, ON_HANDLERS, ON_METHODS, PAGE_TRANSITION, PARENT_STYLES_METHODS, PARTS, PART_TIMERS, PRE_INIT_PROPERTY_VALUES, PROPERTIES, PROPERTIES_INITIALIZED, PROPERTY_DEFINERS, PROPERTY_VALUES, PROPERTY_WATCHERS, READY_HANDLERS, READY_METHODS, READY_PROMISE, READY_RESOLVE, RECONNECT_HANDLERS, RECONNECT_METHODS, REGISTERED_ELEMENTS, RENDERED_PROMISE, RENDERED_RESOLVE, RENDER_CALLBACKS, RENDER_INSTANCE, RENDER_METHOD, RENDER_OPTIONS, RENDER_TIMERS, RESPOND_METHODS, ROUTER_CONTEXT, SETTING_FROM_PROPERTY, STYLES_APPLIED, STYLES_METHOD, WATCH_METHODS, getSymbol };
128
+ export { ADOPTED_HANDLERS, ADOPTED_METHODS, ADOPTED_TIMERS, CHANNEL_HANDLERS, CLEANUP, CONTEXT_CALLED, CONTEXT_HANDLER, CONTEXT_METHODS, CONTEXT_METHOD_NAME, CONTEXT_NOTIFY_ELEMENT, CONTEXT_OPTIONS, CONTEXT_REGISTER, CONTEXT_REQUEST_HANDLER, CONTEXT_TIMER, CONTEXT_UNREGISTER, CONTEXT_UPDATE, CONTROLLER, CONTROLLER_ABORT, CONTROLLER_ATTACHED, CONTROLLER_ID, CONTROLLER_KEY, CONTROLLER_NAME_KEY, CONTROLLER_OPERATIONS, CREATED_AT, CURRENT_PAGE_MARKER, DISPATCH_TIMERS, DISPOSE_HANDLERS, DISPOSE_METHODS, EXPLICITLY_SET_PROPERTIES, INITIALIZED, IS_CONTROLLER_CLASS, IS_CONTROLLER_INSTANCE, IS_ELEMENT_CLASS, IS_UPDATING, MOVED_HANDLERS, MOVED_METHODS, MOVED_TIMERS, NATIVE_CONTROLLER, NAVIGATION_CONTEXT_INSTANCE, OBSERVERS, OBSERVE_METHODS, ON_HANDLERS, ON_METHODS, PAGE_TRANSITION, PARENT_STYLES_METHODS, PARTS, PART_TIMERS, PENDING_RECONNECT_RENDER, PRE_INIT_PROPERTY_VALUES, PROPERTIES, PROPERTIES_INITIALIZED, PROPERTY_DEFINERS, PROPERTY_VALUES, PROPERTY_WATCHERS, READY_HANDLERS, READY_METHODS, READY_PROMISE, READY_RESOLVE, RECONNECT_HANDLERS, RECONNECT_METHODS, REGISTERED_ELEMENTS, RENDERED_PROMISE, RENDERED_RESOLVE, RENDER_CALLBACKS, RENDER_DEPTH, RENDER_INSTANCE, RENDER_METHOD, RENDER_OPTIONS, RENDER_TIMERS, RESPOND_METHODS, ROUTER_CONTEXT, SETTING_FROM_PROPERTY, STYLES_APPLIED, STYLES_METHOD, WATCH_METHODS, getSymbol };
119
129
  //# sourceMappingURL=symbols.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"symbols.esm.js","sources":["../src/global.ts","../src/symbols.ts"],"sourcesContent":[null,null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"symbols.esm.js","sources":["../src/global.ts","../src/symbols.ts"],"sourcesContent":[null,null],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * snice v5.2.2
2
+ * snice v5.2.3
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.
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * snice v5.2.2
2
+ * snice v5.2.3
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.
@@ -17,10 +17,13 @@ export declare class Context {
17
17
  */
18
18
  [CONTEXT_REGISTER]: (element: HTMLElement, methodName: string) => void;
19
19
  /**
20
- * Unregister an element from receiving context updates
20
+ * Unregister an element from receiving context updates. With a methodName,
21
+ * removes only that one handler (so a `once` handler tearing itself down
22
+ * doesn't kill the element's other @context handlers); without one, removes
23
+ * the element entirely (used on disconnect).
21
24
  * @internal Used by @context decorator cleanup
22
25
  */
23
- [CONTEXT_UNREGISTER]: (element: HTMLElement) => void;
26
+ [CONTEXT_UNREGISTER]: (element: HTMLElement, methodName?: string) => void;
24
27
  /**
25
28
  * Update the context and notify all registered elements
26
29
  * Prevents infinite loops by tracking update state
@@ -1,3 +1,4 @@
1
+ import type { OnScope } from './on-options';
1
2
  export interface DispatchOptions extends EventInit {
2
3
  /**
3
4
  * Whether to dispatch even if the method returns undefined (default: true)
@@ -7,4 +8,10 @@ export interface DispatchOptions extends EventInit {
7
8
  debounce?: number;
8
9
  /** Throttle the dispatch by specified milliseconds */
9
10
  throttle?: number;
11
+ /**
12
+ * Where to dispatch the event. Default is the host element.
13
+ * Use `'global'` to dispatch on `document`, a selector for an ancestor
14
+ * (via `closest()`), a direct EventTarget, or a resolver function.
15
+ */
16
+ scope?: OnScope;
10
17
  }
@@ -1,5 +1,6 @@
1
1
  export * from './query-options';
2
2
  export * from './property-options';
3
+ export * from './watch-options';
3
4
  export * from './property-converter';
4
5
  export * from './snice-element';
5
6
  export * from './part-options';
@@ -1,3 +1,11 @@
1
+ /**
2
+ * Resolver for the EventTarget where the listener is attached.
3
+ * - `'global'`: attach to `document` (cross-cutting events)
4
+ * - string: treated as a CSS selector for `host.closest(selector)` (nearest ancestor)
5
+ * - `Element` / `EventTarget`: attached directly to that node
6
+ * - `() => Element | EventTarget | null`: called at connect time; null skips
7
+ */
8
+ export type OnScope = 'global' | string | EventTarget | ((this: HTMLElement) => EventTarget | null);
1
9
  export interface OnOptions {
2
10
  /** Use capture phase instead of bubble phase */
3
11
  capture?: boolean;
@@ -15,4 +23,10 @@ export interface OnOptions {
15
23
  throttle?: number;
16
24
  /** CSS selector to target specific elements within shadow root */
17
25
  target?: string;
26
+ /**
27
+ * Where to attach the listener. Default is the host element.
28
+ * Use `'global'` for document-wide events, a selector for an ancestor
29
+ * (via `closest()`), a direct EventTarget, or a resolver function.
30
+ */
31
+ scope?: OnScope;
18
32
  }
@@ -0,0 +1,9 @@
1
+ export interface WatchOptions {
2
+ /**
3
+ * Whether the watcher fires once during initialization with the element's
4
+ * initial value (`oldValue` is `undefined`), in addition to firing on later
5
+ * changes. Defaults to `true`. Set `false` for a change-only watcher — e.g.
6
+ * one that dispatches an event, so it doesn't emit spuriously on mount.
7
+ */
8
+ immediate?: boolean;
9
+ }
package/dist/utils.d.ts CHANGED
@@ -21,6 +21,11 @@ export declare function parseAttributeValue(attributeValue: string | null, prope
21
21
  * @param initialValue - The default value assigned to the property field (used for type detection)
22
22
  * @returns The string representation for the HTML attribute, or null if value should remove attribute
23
23
  */
24
+ /**
25
+ * Default property dirty-check: has the value changed? Like `!==`, but treats
26
+ * NaN → NaN as unchanged (NaN !== NaN would otherwise re-fire forever).
27
+ */
28
+ export declare function notEqual(value: unknown, old: unknown): boolean;
24
29
  /**
25
30
  * Extract attribute name from property options
26
31
  */
@@ -82,6 +87,13 @@ export declare function ensureObj(obj: any, sym: symbol): Record<string, any>;
82
87
  * Invoke property watchers for a given property change
83
88
  */
84
89
  export declare function invokeWatchers(instance: any, constructor: any, propName: string, oldValue: any, newValue: any): void;
90
+ /**
91
+ * Fire the one-time initialization call for `@watch(..., { immediate: true })`
92
+ * handlers. Runs once per declared property after the element is initialized,
93
+ * passing the effective initial value with `oldValue` undefined. Non-immediate
94
+ * watchers are untouched — they only react to later changes.
95
+ */
96
+ export declare function invokeImmediateWatchers(instance: any, constructor: any): void;
85
97
  /**
86
98
  * Create a debounced version of a function
87
99
  */
@@ -90,4 +102,18 @@ export declare function createDebounced<T extends (...args: any[]) => any>(fn: T
90
102
  * Create a throttled version of a function (leading + trailing edge)
91
103
  */
92
104
  export declare function createThrottled<T extends (...args: any[]) => any>(fn: T, delay: number): T;
105
+ /**
106
+ * Resolve a scope option to a concrete EventTarget.
107
+ *
108
+ * - undefined → host element (default behavior)
109
+ * - 'global' → `document`
110
+ * - string → `host.closest(selector)` (nearest matching ancestor)
111
+ * - EventTarget instance → that target directly
112
+ * - resolver function → called with host as `this`, returns target or null
113
+ *
114
+ * Returns null when the scope cannot be resolved (e.g. selector matches no
115
+ * ancestor, resolver returns null). Caller decides how to handle null —
116
+ * typically warn in dev and skip listener attachment.
117
+ */
118
+ export declare function resolveScope(host: HTMLElement, scope: unknown): EventTarget | null;
93
119
  export declare function valueToAttribute(value: any, propertyOptions: PropertyOptions, initialValue?: any): string | null;
@@ -99,7 +99,7 @@ All CDN builds use the shared runtime (external `snice` imports). Load `snice-ru
99
99
  - IIFE: `.js` + `.min.js`
100
100
  - Sourcemaps + README
101
101
 
102
- **Size:** Runtime ~20KB gzip, components ~1-93KB each
102
+ **Size:** Runtime ~21KB gzip, components ~1-93KB each
103
103
 
104
104
  **Features:**
105
105
  - Shared runtime (external snice imports)
package/docs/ai/README.md CHANGED
@@ -49,6 +49,17 @@ claude mcp add snice -- npx snice mcp
49
49
  - `search_docs` - Search documentation
50
50
  - `validate_code` - Check code for common mistakes
51
51
 
52
+ ## CDN / Standalone Usage
53
+
54
+ Runtime first, then one bundle per component (any order after runtime):
55
+ ```html
56
+ <script src="snice-runtime.min.js"></script> <!-- required, first -->
57
+ <script src="snice-button.min.js"></script>
58
+ <snice-button variant="primary">Click me</snice-button>
59
+ ```
60
+ - Omit the runtime → elements never register → blank page.
61
+ - Full details (load order, bundle families, `theme.css` + dark mode, `.min.js` vs `.esm`): [cdn.md](cdn.md).
62
+
52
63
  ## Pitfalls
53
64
 
54
65
  **Decorators:**
package/docs/ai/api.md CHANGED
@@ -42,8 +42,9 @@
42
42
  // Syncs with attributes, triggers re-render
43
43
  // Types: String (default), Number, Boolean, Object, Array
44
44
 
45
- @watch(...propertyNames: string[])
46
- // Called on property change: (oldVal, newVal, propertyName) => void
45
+ @watch(...propertyNames: string[], options?: { immediate?: boolean })
46
+ // Fires once on init: (undefined, initialValue, propertyName), then on every change: (oldVal, newVal, propertyName)
47
+ // { immediate: false } → change-only, skip the init call (use for event-dispatching watchers)
47
48
  ```
48
49
 
49
50
  ## Lifecycle
@@ -79,15 +80,31 @@ html`
79
80
  ```typescript
80
81
  @on(event: string | string[], selector?: string, options?: OnOptions)
81
82
  // Works in elements + controllers
82
- // Options: { debounce?, throttle?, preventDefault?, stopPropagation?, once?, capture?, passive?, target? }
83
+ // Options: { debounce?, throttle?, preventDefault?, stopPropagation?, once?, capture?, passive?, target?, scope? }
83
84
  // target: CSS selector for shadow DOM event delegation
85
+ // scope: 'global' | selector | EventTarget | () => EventTarget | null — redirects listener attachment
84
86
  // Keyboard: 'keydown:Enter', 'keydown.escape', 'keydown:ctrl+s', 'keydown:~Space'
85
87
  // Supports both ':' and '.' notation
86
88
 
87
- @dispatch(eventName: string, options?: { debounce?, throttle?, dispatchOnUndefined? })
89
+ @dispatch(eventName: string, options?: { debounce?, throttle?, dispatchOnUndefined?, scope?, ...EventInit })
88
90
  // Fires CustomEvent after method, detail = return value
89
91
  // Supports async methods (dispatches after promise resolves)
90
92
  // dispatchOnUndefined: false (default) — skips dispatch if method returns undefined
93
+ // scope: 'global' | selector | EventTarget | () => EventTarget | null — redirects dispatch target
94
+ ```
95
+
96
+ **scope option (shared by @on and @dispatch):**
97
+ ```typescript
98
+ // omitted → host element (default)
99
+ // 'global' → document
100
+ // 'app-shell' → host.closest('app-shell')
101
+ // someEl → that EventTarget
102
+ // function → called with host as `this`; null skips with console.warn
103
+
104
+ @on('bus:save', { scope: 'global' }) // document-level listener
105
+ @on('bus:added', { scope: 'cart-shell' }) // ancestor-scoped listener
106
+ @dispatch('bus:save', { scope: 'global' }) // dispatch on document
107
+ @dispatch('bus:added', { scope: 'cart-shell' })// dispatch on ancestor
91
108
  ```
92
109
 
93
110
  ## Communication
@@ -257,7 +274,9 @@ attr="${val}" // Attribute
257
274
  ```typescript
258
275
  interface TemplateResult { readonly _$litType$: number; }
259
276
  interface CSSResult { cssText: string; }
260
- interface OnOptions { debounce?, throttle?, preventDefault?, stopPropagation?, once?, capture?, passive?, target? }
277
+ interface OnOptions { debounce?, throttle?, preventDefault?, stopPropagation?, once?, capture?, passive?, target?, scope? }
278
+ interface DispatchOptions extends EventInit { debounce?, throttle?, dispatchOnUndefined?, scope? }
279
+ type OnScope = 'global' | string | EventTarget | ((this: HTMLElement) => EventTarget | null)
261
280
  interface RenderOptions { debounce?, throttle?, once?, sync?, differential? }
262
281
  interface Layout { update(context, placards, route, params) }
263
282
  interface Placard { name, title, icon?, description?, order?, show?, visibleOn?, parent?, group?, searchTerms?, hotkeys?, breadcrumbs?, tooltip? }
package/docs/ai/cdn.md ADDED
@@ -0,0 +1,31 @@
1
+ # CDN / Standalone Usage
2
+
3
+ Use any component on a plain HTML page — no bundler. Each component is a standalone `.min.js` sharing one runtime.
4
+
5
+ ## Load order
6
+
7
+ Runtime first, then one bundle per component (components any order after runtime):
8
+ ```html
9
+ <link rel="stylesheet" href="theme.css"> <!-- optional: tokens + dark mode -->
10
+ <script src="snice-runtime.min.js"></script> <!-- required, first -->
11
+ <script src="snice-button.min.js"></script>
12
+ <snice-button variant="primary">Click me</snice-button>
13
+ ```
14
+ - `snice-runtime.min.js` shared by all — omit it → elements never register → blank page.
15
+
16
+ ## Bundle families
17
+
18
+ One bundle registers its whole family:
19
+ - `snice-tabs.min.js` → `<snice-tabs>` `<snice-tab>` `<snice-tab-panel>`
20
+ - `snice-select.min.js` → `<snice-select>` `<snice-option>`
21
+ - `snice-toast.min.js` → `<snice-toast>` `<snice-toast-container>`
22
+
23
+ ## Theme / dark mode
24
+
25
+ - `theme.css` optional — components have light-mode fallbacks; add it for full tokens + dark mode.
26
+ - Dark follows OS by default; force with `<html data-theme="dark">` (or `"light"` to pin).
27
+
28
+ ## Builds
29
+
30
+ - Use `.min.js` (IIFE) for `<script src>`, not `.esm.min.js` (ESM, for bundlers).
31
+ - Build one: `snice build-component <name>`.
@@ -2,6 +2,11 @@
2
2
 
3
3
  Slack-style chat interface with messages, typing indicators, reactions, and file attachments.
4
4
 
5
+ ## Components
6
+
7
+ - `snice-chat` - container
8
+ - `snice-chat-message` - declarative message child (rendered first; `messages`-array entries append after)
9
+
5
10
  ## Properties
6
11
 
7
12
  ```typescript
@@ -13,6 +18,26 @@ allowFiles: boolean = true; // attribute: allow-files
13
18
  showTyping: boolean = true; // attribute: show-typing
14
19
  showAvatars: boolean = true; // attribute: show-avatars
15
20
  showTimestamps: boolean = true; // attribute: show-timestamps
21
+ authorColors: Record<string,string> = {}; // property only; per-author colors
22
+ colorAuthors: boolean = false; // attribute: color-authors; auto color per author
23
+ markdown: boolean = false; // render bodies as markdown by default
24
+ layout: 'default' | 'bubbles' = 'default'; // 'bubbles' = aligned colored bubbles
25
+ ```
26
+
27
+ ChatMessage adds: `format?: 'text'|'markdown'` (unset = chat-level `markdown` applies), `authorColor?: string` (CSS color; values containing `;`/`{`/`}` are rejected).
28
+
29
+ ### snice-chat-message attributes
30
+
31
+ ```typescript
32
+ author: string = '';
33
+ avatar: string = '';
34
+ type: 'text'|'file'|'image'|'system' = 'text';
35
+ format?: 'text'|'markdown'; // unset = chat-level markdown applies
36
+ edited: boolean = false;
37
+ authorColor: string = ''; // attribute: author-color
38
+ reactions?: MessageReaction[]; // property only
39
+ attachment?: MessageAttachment; // property only
40
+ // body = element text content
16
41
  ```
17
42
 
18
43
  ## Methods
@@ -32,18 +57,30 @@ showTimestamps: boolean = true; // attribute: show-timestamps
32
57
  - `message-edit` -> `{ messageId: string, newContent: string }`
33
58
  - `message-delete` -> `{ messageId: string }`
34
59
  - `message-react` -> `{ messageId: string, emoji: string }`
35
- - `message-thread` -> `{ messageId: string }`
36
60
  - `typing-start` -> `{}`
37
61
  - `typing-stop` -> `{}`
38
62
 
63
+ React, edit, and delete self-apply to the local `messages` model AND emit the event — don't also mutate in the handler or it double-applies. On backend rejection, revert via `updateMessage()`. Delete is confirmed inline first. `message-send` does not self-add; the consumer adds the sent message.
64
+
39
65
  ## CSS Parts
40
66
 
41
67
  - `base` - Chat container
42
68
  - `messages` - Messages scrollable area
69
+ - `message` / `message-own` / `message-other` - message row (+ own/other variants)
70
+ - `system-message` - system message row
71
+ - `avatar`, `author`, `timestamp`, `edited`, `message-text` - message internals
72
+ - `attachment` - message attachment
73
+ - `reactions` / `reaction` / `reaction-active` - reactions
74
+ - `actions` - hover action menu (react on any message; edit/delete owner-only)
75
+ - `edit-input` / `edit-save` / `edit-cancel` - inline editor (shown while editing)
76
+ - `delete-confirm` / `delete-confirm-yes` / `delete-confirm-no` - inline delete confirmation
77
+ - `typing-indicator` - typing indicator row
43
78
  - `input-area` - Input area wrapper
44
79
  - `input-container` - Input + buttons container
45
80
  - `input` - Textarea input field
46
81
 
82
+ Per-author color is injected inline as `--snice-chat-author-color`; `::part(author)` reads it.
83
+
47
84
  ## Basic Usage
48
85
 
49
86
  ```html
@@ -63,6 +100,25 @@ chat.addTypingIndicator('Alice');
63
100
  chat.removeTypingIndicator('Alice');
64
101
  ```
65
102
 
103
+ ```html
104
+ <!-- declarative messages (slot first; messages array appends after) -->
105
+ <snice-chat current-user="Me" color-authors layout="bubbles" markdown>
106
+ <snice-chat-message slot="messages" author="Alice">shipped **v5.3**</snice-chat-message>
107
+ <snice-chat-message slot="messages" author="Me" format="text">on it</snice-chat-message>
108
+ </snice-chat>
109
+ ```
110
+
111
+ ```typescript
112
+ chat.authorColors = { Alice: '#e11d48' }; // explicit per-author color
113
+ chat.addMessage({ type:'text', author:'Alice', timestamp:new Date(),
114
+ format:'markdown', content:'run `npm i snice@latest`' });
115
+ ```
116
+
117
+ ```css
118
+ snice-chat::part(author) { font-family: 'Inter'; }
119
+ snice-chat::part(message-own) { background: rgba(37,99,235,.06); }
120
+ ```
121
+
66
122
  ## Accessibility
67
123
 
68
124
  - Keyboard navigation for messages and controls