snice 4.29.0 → 4.30.1

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 (516) hide show
  1. package/README.md +3 -10
  2. package/adapters/react/SniceProvider.d.ts +71 -0
  3. package/adapters/react/SniceProvider.js +49 -0
  4. package/adapters/react/SniceProvider.js.map +1 -0
  5. package/adapters/react/SniceRouter.d.ts +44 -0
  6. package/adapters/react/SniceRouter.js +190 -0
  7. package/adapters/react/SniceRouter.js.map +1 -0
  8. package/adapters/react/components.d.ts +2 -0
  9. package/adapters/react/components.d.ts.map +1 -1
  10. package/adapters/react/components.js +1 -0
  11. package/adapters/react/components.js.map +1 -1
  12. package/adapters/react/components.ts +2 -0
  13. package/adapters/react/grid.d.ts +36 -0
  14. package/adapters/react/grid.d.ts.map +1 -0
  15. package/adapters/react/grid.js +24 -0
  16. package/adapters/react/grid.js.map +1 -0
  17. package/adapters/react/grid.tsx +44 -0
  18. package/adapters/react/index.d.ts +5 -0
  19. package/adapters/react/index.d.ts.map +1 -1
  20. package/adapters/react/index.js +3 -2
  21. package/adapters/react/index.js.map +1 -1
  22. package/adapters/react/index.ts +6 -3
  23. package/adapters/react/matchRoute.d.ts +16 -0
  24. package/adapters/react/matchRoute.js +32 -0
  25. package/adapters/react/matchRoute.js.map +1 -0
  26. package/adapters/react/types.d.ts +1 -15
  27. package/adapters/react/types.d.ts.map +1 -1
  28. package/adapters/react/types.ts +1 -15
  29. package/adapters/react/useRequestHandler.js +1 -1
  30. package/adapters/react/useRequestHandler.js.map +1 -1
  31. package/bin/snice.js +8 -13
  32. package/bin/templates/{pwa → default}/index.html +1 -1
  33. package/bin/templates/{pwa → default}/src/components/app-header.ts +36 -18
  34. package/bin/templates/{pwa → default}/src/components/notification-badge.ts +2 -21
  35. package/bin/templates/{pwa → default}/src/components/search-bar.ts +12 -12
  36. package/bin/templates/default/src/context.ts +17 -0
  37. package/bin/templates/{pwa → default}/src/controllers/notification-controller.ts +10 -15
  38. package/bin/templates/{pwa → default}/src/daemons/notifications.ts +0 -12
  39. package/bin/templates/{pwa → default}/src/main.ts +1 -7
  40. package/bin/templates/{pwa → default}/src/middleware/error.ts +1 -8
  41. package/bin/templates/{pwa → default}/src/pages/dashboard.ts +17 -18
  42. package/bin/templates/{pwa → default}/src/pages/data.ts +24 -24
  43. package/bin/templates/{pwa → default}/src/pages/login.ts +3 -6
  44. package/bin/templates/{pwa → default}/src/pages/notifications.ts +21 -19
  45. package/bin/templates/{pwa → default}/src/pages/profile.ts +10 -12
  46. package/bin/templates/{pwa → default}/src/pages/settings.ts +22 -22
  47. package/bin/templates/default/src/router.ts +13 -0
  48. package/bin/templates/default/src/styles/global.css +16 -0
  49. package/bin/templates/{pwa → default}/tsconfig.json +2 -1
  50. package/bin/templates/react/README.md +124 -0
  51. package/bin/templates/react/global.d.ts +10 -0
  52. package/bin/templates/react/index.html +15 -0
  53. package/bin/templates/react/package.json +31 -0
  54. package/bin/templates/react/src/App.tsx +112 -0
  55. package/bin/templates/react/src/components/AppHeader.tsx +85 -0
  56. package/bin/templates/react/src/components/AppLayout.tsx +11 -0
  57. package/bin/templates/react/src/components/NotificationBadge.tsx +13 -0
  58. package/bin/templates/react/src/components/SearchBar.tsx +63 -0
  59. package/bin/templates/react/src/daemons/notifications.ts +136 -0
  60. package/bin/templates/react/src/fetcher.ts +15 -0
  61. package/bin/templates/react/src/guards/auth.ts +6 -0
  62. package/bin/templates/react/src/main.tsx +27 -0
  63. package/bin/templates/react/src/middleware/auth.ts +16 -0
  64. package/bin/templates/react/src/middleware/error.ts +29 -0
  65. package/bin/templates/react/src/middleware/retry.ts +31 -0
  66. package/bin/templates/react/src/pages/DashboardPage.tsx +111 -0
  67. package/bin/templates/react/src/pages/DataPage.tsx +119 -0
  68. package/bin/templates/react/src/pages/LoginPage.tsx +46 -0
  69. package/bin/templates/react/src/pages/NotificationsPage.tsx +119 -0
  70. package/bin/templates/react/src/pages/ProfilePage.tsx +92 -0
  71. package/bin/templates/react/src/pages/SettingsPage.tsx +165 -0
  72. package/bin/templates/react/src/services/auth.ts +48 -0
  73. package/bin/templates/react/src/services/jwt.ts +35 -0
  74. package/bin/templates/react/src/services/storage.ts +24 -0
  75. package/bin/templates/react/src/styles/global.css +382 -0
  76. package/bin/templates/react/src/types/auth.ts +21 -0
  77. package/bin/templates/react/src/types/notifications.ts +9 -0
  78. package/bin/templates/react/tests/helpers/test-utils.ts +79 -0
  79. package/bin/templates/react/tests/middleware/auth.test.ts +67 -0
  80. package/bin/templates/react/tests/middleware/error.test.ts +105 -0
  81. package/bin/templates/react/tests/middleware/retry.test.ts +103 -0
  82. package/bin/templates/react/tests/services/auth.test.ts +89 -0
  83. package/bin/templates/react/tests/services/jwt.test.ts +76 -0
  84. package/bin/templates/react/tests/services/storage.test.ts +69 -0
  85. package/bin/templates/{base → react}/tsconfig.json +4 -6
  86. package/bin/templates/react/vite.config.ts +18 -0
  87. package/bin/templates/react/vitest.config.ts +18 -0
  88. package/dist/cdn/accordion/snice-accordion.js +1 -1
  89. package/dist/cdn/accordion/snice-accordion.min.js +1 -1
  90. package/dist/cdn/action-bar/snice-action-bar.js +1 -1
  91. package/dist/cdn/action-bar/snice-action-bar.min.js +1 -1
  92. package/dist/cdn/activity-feed/snice-activity-feed.js +1 -1
  93. package/dist/cdn/activity-feed/snice-activity-feed.min.js +1 -1
  94. package/dist/cdn/alert/snice-alert.js +1 -1
  95. package/dist/cdn/alert/snice-alert.min.js +1 -1
  96. package/dist/cdn/app-tiles/snice-app-tiles.js +1 -1
  97. package/dist/cdn/app-tiles/snice-app-tiles.min.js +1 -1
  98. package/dist/cdn/approval-flow/snice-approval-flow.js +1 -1
  99. package/dist/cdn/approval-flow/snice-approval-flow.min.js +1 -1
  100. package/dist/cdn/audio-recorder/snice-audio-recorder.js +1 -1
  101. package/dist/cdn/audio-recorder/snice-audio-recorder.min.js +1 -1
  102. package/dist/cdn/availability/snice-availability.js +1 -1
  103. package/dist/cdn/availability/snice-availability.min.js +1 -1
  104. package/dist/cdn/avatar/snice-avatar.js +1 -1
  105. package/dist/cdn/avatar/snice-avatar.min.js +1 -1
  106. package/dist/cdn/avatar-group/snice-avatar-group.js +1 -1
  107. package/dist/cdn/avatar-group/snice-avatar-group.min.js +1 -1
  108. package/dist/cdn/badge/snice-badge.js +1 -1
  109. package/dist/cdn/badge/snice-badge.min.js +1 -1
  110. package/dist/cdn/banner/snice-banner.js +1 -1
  111. package/dist/cdn/banner/snice-banner.min.js +1 -1
  112. package/dist/cdn/binpack/snice-binpack.js +1 -1
  113. package/dist/cdn/binpack/snice-binpack.min.js +1 -1
  114. package/dist/cdn/book/snice-book.js +1 -1
  115. package/dist/cdn/book/snice-book.min.js +1 -1
  116. package/dist/cdn/booking/snice-booking.js +1 -1
  117. package/dist/cdn/booking/snice-booking.min.js +1 -1
  118. package/dist/cdn/breadcrumbs/snice-breadcrumbs.js +1 -1
  119. package/dist/cdn/breadcrumbs/snice-breadcrumbs.min.js +1 -1
  120. package/dist/cdn/button/snice-button.js +1 -1
  121. package/dist/cdn/button/snice-button.min.js +1 -1
  122. package/dist/cdn/calendar/snice-calendar.js +1 -1
  123. package/dist/cdn/calendar/snice-calendar.min.js +1 -1
  124. package/dist/cdn/camera/snice-camera.js +1 -1
  125. package/dist/cdn/camera/snice-camera.min.js +1 -1
  126. package/dist/cdn/camera-annotate/snice-camera-annotate.js +1 -1
  127. package/dist/cdn/camera-annotate/snice-camera-annotate.min.js +1 -1
  128. package/dist/cdn/candlestick/snice-candlestick.js +1 -1
  129. package/dist/cdn/candlestick/snice-candlestick.min.js +1 -1
  130. package/dist/cdn/card/snice-card.js +1 -1
  131. package/dist/cdn/card/snice-card.min.js +1 -1
  132. package/dist/cdn/carousel/snice-carousel.js +1 -1
  133. package/dist/cdn/carousel/snice-carousel.min.js +1 -1
  134. package/dist/cdn/cart/snice-cart.js +1 -1
  135. package/dist/cdn/cart/snice-cart.min.js +1 -1
  136. package/dist/cdn/chart/snice-chart.js +1 -1
  137. package/dist/cdn/chart/snice-chart.min.js +1 -1
  138. package/dist/cdn/chat/snice-chat.js +1 -1
  139. package/dist/cdn/chat/snice-chat.min.js +1 -1
  140. package/dist/cdn/checkbox/snice-checkbox.js +1 -1
  141. package/dist/cdn/checkbox/snice-checkbox.min.js +1 -1
  142. package/dist/cdn/chip/README.md +2 -2
  143. package/dist/cdn/chip/snice-chip.js +2 -2
  144. package/dist/cdn/chip/snice-chip.js.map +1 -1
  145. package/dist/cdn/chip/snice-chip.min.js +3 -3
  146. package/dist/cdn/chip/snice-chip.min.js.map +1 -1
  147. package/dist/cdn/code-block/snice-code-block.js +1 -1
  148. package/dist/cdn/code-block/snice-code-block.min.js +1 -1
  149. package/dist/cdn/color-display/snice-color-display.js +1 -1
  150. package/dist/cdn/color-display/snice-color-display.min.js +1 -1
  151. package/dist/cdn/color-picker/snice-color-picker.js +1 -1
  152. package/dist/cdn/color-picker/snice-color-picker.min.js +1 -1
  153. package/dist/cdn/command-palette/snice-command-palette.js +1 -1
  154. package/dist/cdn/command-palette/snice-command-palette.min.js +1 -1
  155. package/dist/cdn/comments/snice-comments.js +1 -1
  156. package/dist/cdn/comments/snice-comments.min.js +1 -1
  157. package/dist/cdn/countdown/snice-countdown.js +1 -1
  158. package/dist/cdn/countdown/snice-countdown.min.js +1 -1
  159. package/dist/cdn/cropper/snice-cropper.js +1 -1
  160. package/dist/cdn/cropper/snice-cropper.min.js +1 -1
  161. package/dist/cdn/data-card/snice-data-card.js +1 -1
  162. package/dist/cdn/data-card/snice-data-card.min.js +1 -1
  163. package/dist/cdn/date-picker/README.md +1 -1
  164. package/dist/cdn/date-picker/snice-date-picker.js +2 -2
  165. package/dist/cdn/date-picker/snice-date-picker.js.map +1 -1
  166. package/dist/cdn/date-picker/snice-date-picker.min.js +2 -2
  167. package/dist/cdn/date-picker/snice-date-picker.min.js.map +1 -1
  168. package/dist/cdn/date-range-picker/README.md +1 -1
  169. package/dist/cdn/date-range-picker/snice-date-range-picker.js +2 -2
  170. package/dist/cdn/date-range-picker/snice-date-range-picker.js.map +1 -1
  171. package/dist/cdn/date-range-picker/snice-date-range-picker.min.js +11 -11
  172. package/dist/cdn/date-range-picker/snice-date-range-picker.min.js.map +1 -1
  173. package/dist/cdn/date-time-picker/README.md +1 -1
  174. package/dist/cdn/date-time-picker/snice-date-time-picker.js +2 -2
  175. package/dist/cdn/date-time-picker/snice-date-time-picker.js.map +1 -1
  176. package/dist/cdn/date-time-picker/snice-date-time-picker.min.js +2 -2
  177. package/dist/cdn/date-time-picker/snice-date-time-picker.min.js.map +1 -1
  178. package/dist/cdn/diff/snice-diff.js +1 -1
  179. package/dist/cdn/diff/snice-diff.min.js +1 -1
  180. package/dist/cdn/divider/snice-divider.js +1 -1
  181. package/dist/cdn/divider/snice-divider.min.js +1 -1
  182. package/dist/cdn/doc/snice-doc.js +1 -1
  183. package/dist/cdn/doc/snice-doc.min.js +1 -1
  184. package/dist/cdn/draw/README.md +2 -2
  185. package/dist/cdn/draw/snice-draw.js +26 -4
  186. package/dist/cdn/draw/snice-draw.js.map +1 -1
  187. package/dist/cdn/draw/snice-draw.min.js +3 -3
  188. package/dist/cdn/draw/snice-draw.min.js.map +1 -1
  189. package/dist/cdn/drawer/snice-drawer.js +1 -1
  190. package/dist/cdn/drawer/snice-drawer.min.js +1 -1
  191. package/dist/cdn/empty-state/snice-empty-state.js +1 -1
  192. package/dist/cdn/empty-state/snice-empty-state.min.js +1 -1
  193. package/dist/cdn/estimate/snice-estimate.js +1 -1
  194. package/dist/cdn/estimate/snice-estimate.min.js +1 -1
  195. package/dist/cdn/file-gallery/snice-file-gallery.js +1 -1
  196. package/dist/cdn/file-gallery/snice-file-gallery.min.js +1 -1
  197. package/dist/cdn/file-upload/snice-file-upload.js +1 -1
  198. package/dist/cdn/file-upload/snice-file-upload.min.js +1 -1
  199. package/dist/cdn/flip-card/snice-flip-card.js +1 -1
  200. package/dist/cdn/flip-card/snice-flip-card.min.js +1 -1
  201. package/dist/cdn/flow/snice-flow.js +1 -1
  202. package/dist/cdn/flow/snice-flow.min.js +1 -1
  203. package/dist/cdn/form-layout/snice-form-layout.js +1 -1
  204. package/dist/cdn/form-layout/snice-form-layout.min.js +1 -1
  205. package/dist/cdn/funnel/snice-funnel.js +1 -1
  206. package/dist/cdn/funnel/snice-funnel.min.js +1 -1
  207. package/dist/cdn/gantt/snice-gantt.js +1 -1
  208. package/dist/cdn/gantt/snice-gantt.min.js +1 -1
  209. package/dist/cdn/gauge/snice-gauge.js +1 -1
  210. package/dist/cdn/gauge/snice-gauge.min.js +1 -1
  211. package/dist/cdn/grid/README.md +27 -0
  212. package/dist/cdn/grid/snice-grid.js +862 -0
  213. package/dist/cdn/grid/snice-grid.js.map +1 -0
  214. package/dist/cdn/grid/snice-grid.min.js +13 -0
  215. package/dist/cdn/grid/snice-grid.min.js.map +1 -0
  216. package/dist/cdn/heatmap/snice-heatmap.js +1 -1
  217. package/dist/cdn/heatmap/snice-heatmap.min.js +1 -1
  218. package/dist/cdn/image/snice-image.js +1 -1
  219. package/dist/cdn/image/snice-image.min.js +1 -1
  220. package/dist/cdn/input/snice-input.js +1 -1
  221. package/dist/cdn/input/snice-input.min.js +1 -1
  222. package/dist/cdn/invoice/snice-invoice.js +1 -1
  223. package/dist/cdn/invoice/snice-invoice.min.js +1 -1
  224. package/dist/cdn/kanban/snice-kanban.js +1 -1
  225. package/dist/cdn/kanban/snice-kanban.min.js +1 -1
  226. package/dist/cdn/key-value/snice-key-value.js +1 -1
  227. package/dist/cdn/key-value/snice-key-value.min.js +1 -1
  228. package/dist/cdn/kpi/snice-kpi.js +1 -1
  229. package/dist/cdn/kpi/snice-kpi.min.js +1 -1
  230. package/dist/cdn/layout/snice-layout.js +1 -1
  231. package/dist/cdn/layout/snice-layout.min.js +1 -1
  232. package/dist/cdn/leaderboard/snice-leaderboard.js +1 -1
  233. package/dist/cdn/leaderboard/snice-leaderboard.min.js +1 -1
  234. package/dist/cdn/link/snice-link.js +1 -1
  235. package/dist/cdn/link/snice-link.min.js +1 -1
  236. package/dist/cdn/link-preview/snice-link-preview.js +1 -1
  237. package/dist/cdn/link-preview/snice-link-preview.min.js +1 -1
  238. package/dist/cdn/list/snice-list.js +1 -1
  239. package/dist/cdn/list/snice-list.min.js +1 -1
  240. package/dist/cdn/location/snice-location.js +1 -1
  241. package/dist/cdn/location/snice-location.min.js +1 -1
  242. package/dist/cdn/login/snice-login.js +1 -1
  243. package/dist/cdn/login/snice-login.min.js +1 -1
  244. package/dist/cdn/map/snice-map.js +1 -1
  245. package/dist/cdn/map/snice-map.min.js +1 -1
  246. package/dist/cdn/markdown/snice-markdown.js +1 -1
  247. package/dist/cdn/markdown/snice-markdown.min.js +1 -1
  248. package/dist/cdn/masonry/snice-masonry.js +1 -1
  249. package/dist/cdn/masonry/snice-masonry.min.js +1 -1
  250. package/dist/cdn/menu/snice-menu.js +1 -1
  251. package/dist/cdn/menu/snice-menu.min.js +1 -1
  252. package/dist/cdn/message-strip/README.md +2 -2
  253. package/dist/cdn/message-strip/snice-message-strip.js +2 -2
  254. package/dist/cdn/message-strip/snice-message-strip.js.map +1 -1
  255. package/dist/cdn/message-strip/snice-message-strip.min.js +6 -6
  256. package/dist/cdn/message-strip/snice-message-strip.min.js.map +1 -1
  257. package/dist/cdn/metric-table/snice-metric-table.js +1 -1
  258. package/dist/cdn/metric-table/snice-metric-table.min.js +1 -1
  259. package/dist/cdn/modal/snice-modal.js +1 -1
  260. package/dist/cdn/modal/snice-modal.min.js +1 -1
  261. package/dist/cdn/music-player/snice-music-player.js +1 -1
  262. package/dist/cdn/music-player/snice-music-player.min.js +1 -1
  263. package/dist/cdn/nav/snice-nav.js +1 -1
  264. package/dist/cdn/nav/snice-nav.min.js +1 -1
  265. package/dist/cdn/network-graph/snice-network-graph.js +1 -1
  266. package/dist/cdn/network-graph/snice-network-graph.min.js +1 -1
  267. package/dist/cdn/notification-center/snice-notification-center.js +1 -1
  268. package/dist/cdn/notification-center/snice-notification-center.min.js +1 -1
  269. package/dist/cdn/order-tracker/snice-order-tracker.js +1 -1
  270. package/dist/cdn/order-tracker/snice-order-tracker.min.js +1 -1
  271. package/dist/cdn/org-chart/snice-org-chart.js +1 -1
  272. package/dist/cdn/org-chart/snice-org-chart.min.js +1 -1
  273. package/dist/cdn/pagination/snice-pagination.js +1 -1
  274. package/dist/cdn/pagination/snice-pagination.min.js +1 -1
  275. package/dist/cdn/paint/README.md +2 -2
  276. package/dist/cdn/paint/snice-paint.js +26 -3
  277. package/dist/cdn/paint/snice-paint.js.map +1 -1
  278. package/dist/cdn/paint/snice-paint.min.js +3 -3
  279. package/dist/cdn/paint/snice-paint.min.js.map +1 -1
  280. package/dist/cdn/pdf-viewer/snice-pdf-viewer.js +1 -1
  281. package/dist/cdn/pdf-viewer/snice-pdf-viewer.min.js +1 -1
  282. package/dist/cdn/permission-matrix/snice-permission-matrix.js +1 -1
  283. package/dist/cdn/permission-matrix/snice-permission-matrix.min.js +1 -1
  284. package/dist/cdn/podcast-player/snice-podcast-player.js +1 -1
  285. package/dist/cdn/podcast-player/snice-podcast-player.min.js +1 -1
  286. package/dist/cdn/pricing-table/snice-pricing-table.js +1 -1
  287. package/dist/cdn/pricing-table/snice-pricing-table.min.js +1 -1
  288. package/dist/cdn/product-card/README.md +1 -1
  289. package/dist/cdn/product-card/snice-product-card.js +1 -1
  290. package/dist/cdn/product-card/snice-product-card.min.js +1 -1
  291. package/dist/cdn/progress/snice-progress.js +1 -1
  292. package/dist/cdn/progress/snice-progress.min.js +1 -1
  293. package/dist/cdn/progress-ring/snice-progress-ring.js +1 -1
  294. package/dist/cdn/progress-ring/snice-progress-ring.min.js +1 -1
  295. package/dist/cdn/qr-code/snice-qr-code.js +1 -1
  296. package/dist/cdn/qr-code/snice-qr-code.min.js +1 -1
  297. package/dist/cdn/qr-reader/snice-qr-reader.js +1 -1
  298. package/dist/cdn/qr-reader/snice-qr-reader.min.js +1 -1
  299. package/dist/cdn/radio/snice-radio.js +1 -1
  300. package/dist/cdn/radio/snice-radio.min.js +1 -1
  301. package/dist/cdn/range-slider/snice-range-slider.js +1 -1
  302. package/dist/cdn/range-slider/snice-range-slider.min.js +1 -1
  303. package/dist/cdn/rating/snice-rating.js +1 -1
  304. package/dist/cdn/rating/snice-rating.min.js +1 -1
  305. package/dist/cdn/receipt/snice-receipt.js +1 -1
  306. package/dist/cdn/receipt/snice-receipt.min.js +1 -1
  307. package/dist/cdn/recipe/snice-recipe.js +1 -1
  308. package/dist/cdn/recipe/snice-recipe.min.js +1 -1
  309. package/dist/cdn/runtime/README.md +2 -2
  310. package/dist/cdn/runtime/snice-runtime.esm.js +40 -15
  311. package/dist/cdn/runtime/snice-runtime.esm.js.map +1 -1
  312. package/dist/cdn/runtime/snice-runtime.esm.min.js +7 -7
  313. package/dist/cdn/runtime/snice-runtime.esm.min.js.map +1 -1
  314. package/dist/cdn/runtime/snice-runtime.js +40 -15
  315. package/dist/cdn/runtime/snice-runtime.js.map +1 -1
  316. package/dist/cdn/runtime/snice-runtime.min.js +6 -6
  317. package/dist/cdn/runtime/snice-runtime.min.js.map +1 -1
  318. package/dist/cdn/sankey/snice-sankey.js +1 -1
  319. package/dist/cdn/sankey/snice-sankey.min.js +1 -1
  320. package/dist/cdn/segmented-control/snice-segmented-control.js +1 -1
  321. package/dist/cdn/segmented-control/snice-segmented-control.min.js +1 -1
  322. package/dist/cdn/select/snice-select.js +1 -1
  323. package/dist/cdn/select/snice-select.min.js +1 -1
  324. package/dist/cdn/skeleton/snice-skeleton.js +1 -1
  325. package/dist/cdn/skeleton/snice-skeleton.min.js +1 -1
  326. package/dist/cdn/slider/snice-slider.js +1 -1
  327. package/dist/cdn/slider/snice-slider.min.js +1 -1
  328. package/dist/cdn/sortable/snice-sortable.js +1 -1
  329. package/dist/cdn/sortable/snice-sortable.min.js +1 -1
  330. package/dist/cdn/sparkline/snice-sparkline.js +1 -1
  331. package/dist/cdn/sparkline/snice-sparkline.min.js +1 -1
  332. package/dist/cdn/spinner/snice-spinner.js +1 -1
  333. package/dist/cdn/spinner/snice-spinner.min.js +1 -1
  334. package/dist/cdn/split-button/snice-split-button.js +1 -1
  335. package/dist/cdn/split-button/snice-split-button.min.js +1 -1
  336. package/dist/cdn/split-pane/snice-split-pane.js +1 -1
  337. package/dist/cdn/split-pane/snice-split-pane.min.js +1 -1
  338. package/dist/cdn/spotlight/snice-spotlight.js +1 -1
  339. package/dist/cdn/spotlight/snice-spotlight.min.js +1 -1
  340. package/dist/cdn/spreadsheet/snice-spreadsheet.js +1 -1
  341. package/dist/cdn/spreadsheet/snice-spreadsheet.min.js +1 -1
  342. package/dist/cdn/stat-group/snice-stat-group.js +1 -1
  343. package/dist/cdn/stat-group/snice-stat-group.min.js +1 -1
  344. package/dist/cdn/step-input/snice-step-input.js +1 -1
  345. package/dist/cdn/step-input/snice-step-input.min.js +1 -1
  346. package/dist/cdn/stepper/snice-stepper.js +1 -1
  347. package/dist/cdn/stepper/snice-stepper.min.js +1 -1
  348. package/dist/cdn/switch/snice-switch.js +1 -1
  349. package/dist/cdn/switch/snice-switch.min.js +1 -1
  350. package/dist/cdn/table/snice-table.js +1 -1
  351. package/dist/cdn/table/snice-table.min.js +1 -1
  352. package/dist/cdn/tabs/snice-tabs.js +1 -1
  353. package/dist/cdn/tabs/snice-tabs.min.js +1 -1
  354. package/dist/cdn/tag/README.md +1 -1
  355. package/dist/cdn/tag/snice-tag.js +2 -2
  356. package/dist/cdn/tag/snice-tag.js.map +1 -1
  357. package/dist/cdn/tag/snice-tag.min.js +3 -3
  358. package/dist/cdn/tag/snice-tag.min.js.map +1 -1
  359. package/dist/cdn/tag-input/README.md +2 -2
  360. package/dist/cdn/tag-input/snice-tag-input.js +2 -2
  361. package/dist/cdn/tag-input/snice-tag-input.js.map +1 -1
  362. package/dist/cdn/tag-input/snice-tag-input.min.js +2 -2
  363. package/dist/cdn/tag-input/snice-tag-input.min.js.map +1 -1
  364. package/dist/cdn/terminal/snice-terminal.js +1 -1
  365. package/dist/cdn/terminal/snice-terminal.min.js +1 -1
  366. package/dist/cdn/testimonial/snice-testimonial.js +1 -1
  367. package/dist/cdn/testimonial/snice-testimonial.min.js +1 -1
  368. package/dist/cdn/textarea/snice-textarea.js +1 -1
  369. package/dist/cdn/textarea/snice-textarea.min.js +1 -1
  370. package/dist/cdn/time-picker/README.md +1 -1
  371. package/dist/cdn/time-picker/snice-time-picker.js +2 -2
  372. package/dist/cdn/time-picker/snice-time-picker.js.map +1 -1
  373. package/dist/cdn/time-picker/snice-time-picker.min.js +2 -2
  374. package/dist/cdn/time-picker/snice-time-picker.min.js.map +1 -1
  375. package/dist/cdn/time-range-picker/snice-time-range-picker.js +1 -1
  376. package/dist/cdn/time-range-picker/snice-time-range-picker.min.js +1 -1
  377. package/dist/cdn/timeline/snice-timeline.js +1 -1
  378. package/dist/cdn/timeline/snice-timeline.min.js +1 -1
  379. package/dist/cdn/timer/snice-timer.js +1 -1
  380. package/dist/cdn/timer/snice-timer.min.js +1 -1
  381. package/dist/cdn/toast/README.md +1 -1
  382. package/dist/cdn/toast/snice-toast.js +7 -3
  383. package/dist/cdn/toast/snice-toast.js.map +1 -1
  384. package/dist/cdn/toast/snice-toast.min.js +6 -6
  385. package/dist/cdn/toast/snice-toast.min.js.map +1 -1
  386. package/dist/cdn/tooltip/snice-tooltip.js +1 -1
  387. package/dist/cdn/tooltip/snice-tooltip.min.js +1 -1
  388. package/dist/cdn/tree/snice-tree.js +1 -1
  389. package/dist/cdn/tree/snice-tree.min.js +1 -1
  390. package/dist/cdn/treemap/snice-treemap.js +1 -1
  391. package/dist/cdn/treemap/snice-treemap.min.js +1 -1
  392. package/dist/cdn/user-card/snice-user-card.js +1 -1
  393. package/dist/cdn/user-card/snice-user-card.min.js +1 -1
  394. package/dist/cdn/video-player/snice-video-player.js +1 -1
  395. package/dist/cdn/video-player/snice-video-player.min.js +1 -1
  396. package/dist/cdn/virtual-scroller/snice-virtual-scroller.js +1 -1
  397. package/dist/cdn/virtual-scroller/snice-virtual-scroller.min.js +1 -1
  398. package/dist/cdn/waterfall/README.md +1 -1
  399. package/dist/cdn/waterfall/snice-waterfall.js +1 -1
  400. package/dist/cdn/waterfall/snice-waterfall.min.js +1 -1
  401. package/dist/cdn/weather/snice-weather.js +1 -1
  402. package/dist/cdn/weather/snice-weather.min.js +1 -1
  403. package/dist/cdn/work-order/snice-work-order.js +1 -1
  404. package/dist/cdn/work-order/snice-work-order.min.js +1 -1
  405. package/dist/components/chip/snice-chip.js +1 -1
  406. package/dist/components/chip/snice-chip.js.map +1 -1
  407. package/dist/components/date-picker/snice-date-picker.js +1 -1
  408. package/dist/components/date-picker/snice-date-picker.js.map +1 -1
  409. package/dist/components/date-range-picker/snice-date-range-picker.js +1 -1
  410. package/dist/components/date-range-picker/snice-date-range-picker.js.map +1 -1
  411. package/dist/components/date-time-picker/snice-date-time-picker.js +1 -1
  412. package/dist/components/date-time-picker/snice-date-time-picker.js.map +1 -1
  413. package/dist/components/draw/snice-draw.d.ts +2 -0
  414. package/dist/components/draw/snice-draw.js +25 -3
  415. package/dist/components/draw/snice-draw.js.map +1 -1
  416. package/dist/components/grid/snice-grid.d.ts +73 -0
  417. package/dist/components/grid/snice-grid.js +795 -0
  418. package/dist/components/grid/snice-grid.js.map +1 -0
  419. package/dist/components/grid/snice-grid.types.d.ts +41 -0
  420. package/dist/components/message-strip/snice-message-strip.js +1 -1
  421. package/dist/components/message-strip/snice-message-strip.js.map +1 -1
  422. package/dist/components/paint/snice-paint.d.ts +2 -0
  423. package/dist/components/paint/snice-paint.js +25 -2
  424. package/dist/components/paint/snice-paint.js.map +1 -1
  425. package/dist/components/tag/snice-tag.js +1 -1
  426. package/dist/components/tag/snice-tag.js.map +1 -1
  427. package/dist/components/tag-input/snice-tag-input.js +1 -1
  428. package/dist/components/tag-input/snice-tag-input.js.map +1 -1
  429. package/dist/components/theme/theme.css +15 -0
  430. package/dist/components/time-picker/snice-time-picker.js +1 -1
  431. package/dist/components/time-picker/snice-time-picker.js.map +1 -1
  432. package/dist/components/toast/snice-toast-container.js +4 -0
  433. package/dist/components/toast/snice-toast-container.js.map +1 -1
  434. package/dist/components/toast/snice-toast.js +2 -2
  435. package/dist/index.cjs +37 -12
  436. package/dist/index.cjs.map +1 -1
  437. package/dist/index.esm.js +37 -12
  438. package/dist/index.esm.js.map +1 -1
  439. package/dist/index.iife.js +37 -12
  440. package/dist/index.iife.js.map +1 -1
  441. package/dist/react/SniceProvider.d.ts +71 -0
  442. package/dist/react/SniceProvider.js +49 -0
  443. package/dist/react/SniceProvider.js.map +1 -0
  444. package/dist/react/SniceRouter.d.ts +44 -0
  445. package/dist/react/SniceRouter.js +190 -0
  446. package/dist/react/SniceRouter.js.map +1 -0
  447. package/dist/react/index.d.ts +3 -0
  448. package/dist/react/index.js +14 -0
  449. package/dist/react/index.js.map +1 -0
  450. package/dist/react/matchRoute.d.ts +16 -0
  451. package/dist/react/matchRoute.js +32 -0
  452. package/dist/react/matchRoute.js.map +1 -0
  453. package/dist/react/useRequestHandler.js +1 -1
  454. package/dist/react/useRequestHandler.js.map +1 -1
  455. package/dist/symbols.cjs +1 -1
  456. package/dist/symbols.esm.js +1 -1
  457. package/dist/transitions.cjs +1 -1
  458. package/dist/transitions.esm.js +1 -1
  459. package/dist/types/guard.d.ts +4 -11
  460. package/docs/ai/README.md +7 -7
  461. package/docs/ai/components/grid.md +116 -0
  462. package/docs/ai/patterns.md +24 -0
  463. package/docs/ai/react-integration.md +97 -0
  464. package/docs/components/grid.md +249 -0
  465. package/docs/plans/2026-03-10-grid-component-design.md +138 -0
  466. package/docs/plans/2026-03-10-grid-component-plan.md +716 -0
  467. package/docs/plans/2026-03-10-react-integration-plan.md +1178 -0
  468. package/docs/react-integration.md +508 -0
  469. package/docs/request-response.md +7 -21
  470. package/package.json +1 -1
  471. package/bin/templates/base/README.md +0 -33
  472. package/bin/templates/base/global.d.ts +0 -14
  473. package/bin/templates/base/index.html +0 -13
  474. package/bin/templates/base/package.json +0 -21
  475. package/bin/templates/base/src/components/counter-button.ts +0 -88
  476. package/bin/templates/base/src/components/counter-button.types.ts +0 -7
  477. package/bin/templates/base/src/components/feature-card.ts +0 -59
  478. package/bin/templates/base/src/components/feature-card.types.ts +0 -5
  479. package/bin/templates/base/src/controllers/counter-controller.ts +0 -24
  480. package/bin/templates/base/src/main.ts +0 -24
  481. package/bin/templates/base/src/pages/about-page.ts +0 -68
  482. package/bin/templates/base/src/pages/home-page.ts +0 -105
  483. package/bin/templates/base/src/pages/not-found-page.ts +0 -55
  484. package/bin/templates/base/src/router.ts +0 -9
  485. package/bin/templates/base/src/styles/global.css +0 -27
  486. package/bin/templates/base/src/types/api-response.ts +0 -5
  487. package/bin/templates/base/src/types/status.ts +0 -1
  488. package/bin/templates/base/src/types/theme.ts +0 -1
  489. package/bin/templates/base/src/types/user.ts +0 -5
  490. package/bin/templates/base/vite.config.ts +0 -38
  491. package/bin/templates/pwa/public/vite.svg +0 -1
  492. package/bin/templates/pwa/src/router.ts +0 -20
  493. package/bin/templates/pwa/src/styles/global.css +0 -64
  494. /package/bin/templates/{pwa → default}/README.md +0 -0
  495. /package/bin/templates/{pwa → default}/global.d.ts +0 -0
  496. /package/bin/templates/{pwa → default}/package.json +0 -0
  497. /package/bin/templates/{pwa → default}/public/icons/.gitkeep +0 -0
  498. /package/bin/templates/{base → default}/public/vite.svg +0 -0
  499. /package/bin/templates/{pwa → default}/src/fetcher.ts +0 -0
  500. /package/bin/templates/{pwa → default}/src/guards/auth.ts +0 -0
  501. /package/bin/templates/{pwa → default}/src/middleware/auth.ts +0 -0
  502. /package/bin/templates/{pwa → default}/src/middleware/retry.ts +0 -0
  503. /package/bin/templates/{pwa → default}/src/services/auth.ts +0 -0
  504. /package/bin/templates/{pwa → default}/src/services/jwt.ts +0 -0
  505. /package/bin/templates/{pwa → default}/src/services/storage.ts +0 -0
  506. /package/bin/templates/{pwa → default}/src/types/auth.ts +0 -0
  507. /package/bin/templates/{pwa → default}/src/types/notifications.ts +0 -0
  508. /package/bin/templates/{pwa → default}/tests/helpers/test-utils.ts +0 -0
  509. /package/bin/templates/{pwa → default}/tests/middleware/auth.test.ts +0 -0
  510. /package/bin/templates/{pwa → default}/tests/middleware/error.test.ts +0 -0
  511. /package/bin/templates/{pwa → default}/tests/middleware/retry.test.ts +0 -0
  512. /package/bin/templates/{pwa → default}/tests/services/auth.test.ts +0 -0
  513. /package/bin/templates/{pwa → default}/tests/services/jwt.test.ts +0 -0
  514. /package/bin/templates/{pwa → default}/tests/services/storage.test.ts +0 -0
  515. /package/bin/templates/{pwa → default}/vite.config.ts +0 -0
  516. /package/bin/templates/{pwa → default}/vitest.config.ts +0 -0
@@ -1,9 +1,9 @@
1
1
  import { page } from '../router';
2
- import { render, styles, html, css, context, observe, ready, dispose } from 'snice';
2
+ import { render, styles, html, css, context, observe, dispose } from 'snice';
3
3
  import type { Placard, Context } from 'snice';
4
4
  import type { Principal } from '../types/auth';
5
5
  import { isAuthenticated } from '../guards/auth';
6
- import { getNotificationsDaemon } from '../daemons/notifications';
6
+ import type { NotificationsDaemon } from '../daemons/notifications';
7
7
 
8
8
  const placard: Placard = {
9
9
  name: 'dashboard',
@@ -24,14 +24,13 @@ export class DashboardPage extends HTMLElement {
24
24
  handleContext(ctx: Context) {
25
25
  const principal = ctx.application.principal as Principal | undefined;
26
26
  this.userName = principal?.user?.name || 'User';
27
- }
28
27
 
29
- @ready()
30
- initialize() {
31
- const daemon = getNotificationsDaemon();
32
- this.unsubscribe = daemon.subscribe(() => {
33
- this.notificationCount++;
34
- });
28
+ const daemon = ctx.application.notifications as NotificationsDaemon;
29
+ if (daemon && !this.unsubscribe) {
30
+ this.unsubscribe = daemon.subscribe(() => {
31
+ this.notificationCount++;
32
+ });
33
+ }
35
34
  }
36
35
 
37
36
  @dispose()
@@ -147,12 +146,12 @@ export class DashboardPage extends HTMLElement {
147
146
  }
148
147
 
149
148
  h1 {
150
- color: var(--primary-color);
149
+ color: var(--snice-color-primary);
151
150
  margin: 0 0 0.5rem 0;
152
151
  }
153
152
 
154
153
  .subtitle {
155
- color: var(--text-light);
154
+ color: var(--snice-color-text-secondary);
156
155
  margin: 0;
157
156
  }
158
157
 
@@ -172,13 +171,13 @@ export class DashboardPage extends HTMLElement {
172
171
  display: block;
173
172
  font-size: 2rem;
174
173
  font-weight: 700;
175
- color: var(--primary-color);
174
+ color: var(--snice-color-primary);
176
175
  }
177
176
 
178
177
  .stat-label {
179
178
  display: block;
180
179
  font-size: 0.8125rem;
181
- color: var(--text-light);
180
+ color: var(--snice-color-text-secondary);
182
181
  margin-top: 0.25rem;
183
182
  }
184
183
 
@@ -194,7 +193,7 @@ export class DashboardPage extends HTMLElement {
194
193
 
195
194
  h3 {
196
195
  margin: 0 0 1rem 0;
197
- color: var(--primary-color);
196
+ color: var(--snice-color-primary);
198
197
  }
199
198
 
200
199
  ul {
@@ -204,18 +203,18 @@ export class DashboardPage extends HTMLElement {
204
203
 
205
204
  li {
206
205
  margin: 0.5rem 0;
207
- color: var(--text-color);
206
+ color: var(--snice-color-text);
208
207
  }
209
208
 
210
209
  code {
211
- background: var(--bg-secondary);
210
+ background: var(--snice-color-background-secondary);
212
211
  padding: 0.125rem 0.375rem;
213
- border-radius: var(--radius-sm);
212
+ border-radius: var(--snice-border-radius-md);
214
213
  font-size: 0.8125rem;
215
214
  }
216
215
 
217
216
  p {
218
- color: var(--text-light);
217
+ color: var(--snice-color-text-secondary);
219
218
  margin: 0 0 0.5rem 0;
220
219
  }
221
220
 
@@ -93,11 +93,11 @@ export class DataPage extends HTMLElement {
93
93
 
94
94
  getStatusColor(status: string): string {
95
95
  const colors: Record<string, string> = {
96
- active: 'var(--success-color)',
97
- pending: 'var(--warning-color)',
98
- archived: 'var(--text-light)'
96
+ active: 'var(--snice-color-success)',
97
+ pending: 'var(--snice-color-warning)',
98
+ archived: 'var(--snice-color-text-secondary)'
99
99
  };
100
- return colors[status] || 'var(--text-light)';
100
+ return colors[status] || 'var(--snice-color-text-secondary)';
101
101
  }
102
102
 
103
103
  @render()
@@ -193,12 +193,12 @@ export class DataPage extends HTMLElement {
193
193
 
194
194
  h1 {
195
195
  margin: 0;
196
- color: var(--primary-color);
196
+ color: var(--snice-color-primary);
197
197
  }
198
198
 
199
199
  .count {
200
200
  font-size: 0.875rem;
201
- color: var(--text-light);
201
+ color: var(--snice-color-text-secondary);
202
202
  }
203
203
 
204
204
  .toolbar {
@@ -219,23 +219,23 @@ export class DataPage extends HTMLElement {
219
219
 
220
220
  .filter-btn {
221
221
  padding: 0.375rem 0.75rem;
222
- border: 1px solid var(--border-color);
223
- border-radius: var(--radius-sm);
224
- background: var(--bg-primary);
225
- color: var(--text-light);
222
+ border: 1px solid var(--snice-color-border);
223
+ border-radius: var(--snice-border-radius-md);
224
+ background: var(--snice-color-background);
225
+ color: var(--snice-color-text-secondary);
226
226
  font-size: 0.8125rem;
227
227
  cursor: pointer;
228
228
  transition: all 0.15s;
229
229
  }
230
230
 
231
231
  .filter-btn:hover {
232
- border-color: var(--primary-color);
233
- color: var(--primary-color);
232
+ border-color: var(--snice-color-primary);
233
+ color: var(--snice-color-primary);
234
234
  }
235
235
 
236
236
  .filter-btn.active {
237
- background: var(--primary-color);
238
- border-color: var(--primary-color);
237
+ background: var(--snice-color-primary);
238
+ border-color: var(--snice-color-primary);
239
239
  color: white;
240
240
  }
241
241
 
@@ -246,8 +246,8 @@ export class DataPage extends HTMLElement {
246
246
  }
247
247
 
248
248
  .data-table {
249
- border: 1px solid var(--border-color);
250
- border-radius: var(--radius-md);
249
+ border: 1px solid var(--snice-color-border);
250
+ border-radius: var(--snice-border-radius-lg);
251
251
  overflow: hidden;
252
252
  }
253
253
 
@@ -255,37 +255,37 @@ export class DataPage extends HTMLElement {
255
255
  display: grid;
256
256
  grid-template-columns: 1fr 120px 100px;
257
257
  padding: 0.75rem 1rem;
258
- background: var(--bg-secondary);
258
+ background: var(--snice-color-background-secondary);
259
259
  font-size: 0.75rem;
260
260
  font-weight: 600;
261
261
  text-transform: uppercase;
262
262
  letter-spacing: 0.05em;
263
- color: var(--text-light);
263
+ color: var(--snice-color-text-secondary);
264
264
  }
265
265
 
266
266
  .table-row {
267
267
  display: grid;
268
268
  grid-template-columns: 1fr 120px 100px;
269
269
  padding: 1rem;
270
- border-top: 1px solid var(--border-color);
270
+ border-top: 1px solid var(--snice-color-border);
271
271
  align-items: center;
272
272
  transition: background 0.15s;
273
273
  }
274
274
 
275
275
  .table-row:hover {
276
- background: var(--bg-secondary);
276
+ background: var(--snice-color-background-secondary);
277
277
  }
278
278
 
279
279
  .col-title strong {
280
280
  display: block;
281
- color: var(--text-color);
281
+ color: var(--snice-color-text);
282
282
  font-size: 0.9375rem;
283
283
  }
284
284
 
285
285
  .description {
286
286
  display: block;
287
287
  font-size: 0.8125rem;
288
- color: var(--text-light);
288
+ color: var(--snice-color-text-secondary);
289
289
  margin-top: 0.125rem;
290
290
  }
291
291
 
@@ -294,7 +294,7 @@ export class DataPage extends HTMLElement {
294
294
  align-items: center;
295
295
  gap: 0.375rem;
296
296
  font-size: 0.8125rem;
297
- color: var(--text-color);
297
+ color: var(--snice-color-text);
298
298
  text-transform: capitalize;
299
299
  }
300
300
 
@@ -307,7 +307,7 @@ export class DataPage extends HTMLElement {
307
307
 
308
308
  .col-date {
309
309
  font-size: 0.8125rem;
310
- color: var(--text-light);
310
+ color: var(--snice-color-text-secondary);
311
311
  }
312
312
 
313
313
  .data-table.compact .table-header {
@@ -41,10 +41,7 @@ export class LoginPage extends HTMLElement {
41
41
  password: credentials.password
42
42
  });
43
43
 
44
- if (this.ctx && this.ctx.application.principal) {
45
- const principal = this.ctx.application.principal as Principal;
46
- principal.user = result.user;
47
- principal.isAuthenticated = true;
44
+ if (this.ctx) {
48
45
  this.ctx.update();
49
46
  }
50
47
 
@@ -96,7 +93,7 @@ export class LoginPage extends HTMLElement {
96
93
  display: block;
97
94
  height: 100vh;
98
95
  overflow: hidden;
99
- background: linear-gradient(135deg, var(--primary-color) 0%, var(--secondary-color) 100%);
96
+ background: linear-gradient(135deg, var(--snice-color-primary) 0%, var(--snice-color-primary-hover) 100%);
100
97
  }
101
98
 
102
99
  .container {
@@ -116,7 +113,7 @@ export class LoginPage extends HTMLElement {
116
113
  .hint {
117
114
  margin: 0.25rem 0;
118
115
  font-size: 0.875rem;
119
- color: var(--text-light);
116
+ color: var(--snice-color-text-secondary);
120
117
  text-align: center;
121
118
  }
122
119
  `;
@@ -1,8 +1,8 @@
1
1
  import { page } from '../router';
2
- import { render, styles, html, css, ready, dispose, watch, on } from 'snice';
3
- import type { Placard } from 'snice';
2
+ import { render, styles, html, css, context, dispose, watch, on } from 'snice';
3
+ import type { Placard, Context } from 'snice';
4
4
  import { isAuthenticated } from '../guards/auth';
5
- import { getNotificationsDaemon } from '../daemons/notifications';
5
+ import type { NotificationsDaemon } from '../daemons/notifications';
6
6
  import type { Notification, NotificationType } from '../types/notifications';
7
7
 
8
8
  const placard: Placard = {
@@ -19,12 +19,14 @@ export class NotificationsPage extends HTMLElement {
19
19
  filter: NotificationType | 'all' = 'all';
20
20
  private unsubscribe: (() => void) | null = null;
21
21
 
22
- @ready()
23
- initialize() {
24
- const daemon = getNotificationsDaemon();
25
- this.unsubscribe = daemon.subscribe((notification) => {
26
- this.notifications = [notification, ...this.notifications];
27
- });
22
+ @context()
23
+ handleContext(ctx: Context) {
24
+ const daemon = ctx.application.notifications as NotificationsDaemon;
25
+ if (daemon && !this.unsubscribe) {
26
+ this.unsubscribe = daemon.subscribe((notification) => {
27
+ this.notifications = [notification, ...this.notifications];
28
+ });
29
+ }
28
30
  }
29
31
 
30
32
  @dispose()
@@ -164,12 +166,12 @@ export class NotificationsPage extends HTMLElement {
164
166
 
165
167
  h1 {
166
168
  margin: 0;
167
- color: var(--primary-color);
169
+ color: var(--snice-color-primary);
168
170
  }
169
171
 
170
172
  .count {
171
173
  font-size: 0.8125rem;
172
- color: var(--text-light);
174
+ color: var(--snice-color-text-secondary);
173
175
  }
174
176
 
175
177
  .filters {
@@ -180,23 +182,23 @@ export class NotificationsPage extends HTMLElement {
180
182
 
181
183
  .filter-btn {
182
184
  padding: 0.375rem 0.75rem;
183
- border: 1px solid var(--border-color);
184
- border-radius: var(--radius-sm);
185
- background: var(--bg-primary);
186
- color: var(--text-light);
185
+ border: 1px solid var(--snice-color-border);
186
+ border-radius: var(--snice-border-radius-md);
187
+ background: var(--snice-color-background);
188
+ color: var(--snice-color-text-secondary);
187
189
  font-size: 0.8125rem;
188
190
  cursor: pointer;
189
191
  transition: all 0.15s;
190
192
  }
191
193
 
192
194
  .filter-btn:hover {
193
- border-color: var(--primary-color);
194
- color: var(--primary-color);
195
+ border-color: var(--snice-color-primary);
196
+ color: var(--snice-color-primary);
195
197
  }
196
198
 
197
199
  .filter-btn.active {
198
- background: var(--primary-color);
199
- border-color: var(--primary-color);
200
+ background: var(--snice-color-primary);
201
+ border-color: var(--snice-color-primary);
200
202
  color: white;
201
203
  }
202
204
 
@@ -35,10 +35,8 @@ export class ProfilePage extends HTMLElement {
35
35
  async handleLogout() {
36
36
  await logout();
37
37
 
38
- if (this.ctx && this.ctx.application.principal) {
39
- const principal = this.ctx.application.principal as Principal;
40
- principal.user = null;
41
- principal.isAuthenticated = false;
38
+ if (this.ctx) {
39
+ this.ctx.update();
42
40
  }
43
41
 
44
42
  window.location.hash = '#/login';
@@ -141,12 +139,12 @@ export class ProfilePage extends HTMLElement {
141
139
 
142
140
  h1 {
143
141
  margin: 0 0 0.5rem 0;
144
- color: var(--primary-color);
142
+ color: var(--snice-color-primary);
145
143
  }
146
144
 
147
145
  .email {
148
146
  margin: 0 0 1rem 0;
149
- color: var(--text-light);
147
+ color: var(--snice-color-text-secondary);
150
148
  }
151
149
 
152
150
  .header-actions a {
@@ -163,7 +161,7 @@ export class ProfilePage extends HTMLElement {
163
161
 
164
162
  h3 {
165
163
  margin: 0 0 1rem 0;
166
- color: var(--primary-color);
164
+ color: var(--snice-color-primary);
167
165
  }
168
166
 
169
167
  .info-grid {
@@ -176,22 +174,22 @@ export class ProfilePage extends HTMLElement {
176
174
  display: flex;
177
175
  justify-content: space-between;
178
176
  padding: 0.75rem;
179
- background: var(--bg-secondary);
180
- border-radius: var(--radius-sm);
177
+ background: var(--snice-color-background-secondary);
178
+ border-radius: var(--snice-border-radius-md);
181
179
  }
182
180
 
183
181
  .label {
184
182
  font-weight: 600;
185
- color: var(--text-color);
183
+ color: var(--snice-color-text);
186
184
  }
187
185
 
188
186
  .value {
189
- color: var(--text-light);
187
+ color: var(--snice-color-text-secondary);
190
188
  }
191
189
 
192
190
  .section p {
193
191
  margin: 0 0 1rem 0;
194
- color: var(--text-light);
192
+ color: var(--snice-color-text-secondary);
195
193
  }
196
194
  `;
197
195
  }
@@ -3,6 +3,7 @@ import { render, styles, context, dispatch, on, html, css } from 'snice';
3
3
  import type { Placard, Context } from 'snice';
4
4
  import { isAuthenticated } from '../guards/auth';
5
5
  import type { Principal } from '../types/auth';
6
+ import { getUser, setUser } from '../services/storage';
6
7
 
7
8
  const placard: Placard = {
8
9
  name: 'settings',
@@ -55,12 +56,10 @@ export class SettingsPage extends HTMLElement {
55
56
  }
56
57
 
57
58
  private applyTheme(theme: string) {
58
- if (theme === 'dark') {
59
- document.documentElement.style.colorScheme = 'dark';
60
- } else if (theme === 'light') {
61
- document.documentElement.style.colorScheme = 'light';
59
+ if (theme === 'system') {
60
+ document.documentElement.removeAttribute('data-theme');
62
61
  } else {
63
- document.documentElement.style.colorScheme = '';
62
+ document.documentElement.setAttribute('data-theme', theme);
64
63
  }
65
64
  }
66
65
 
@@ -73,10 +72,11 @@ export class SettingsPage extends HTMLElement {
73
72
  @dispatch('settings-saved')
74
73
  saveSettings() {
75
74
  if (this.ctx) {
76
- const principal = this.ctx.application.principal as Principal;
77
- if (principal.user) {
78
- principal.user.name = this.displayName;
79
- principal.user.email = this.email;
75
+ const user = getUser();
76
+ if (user) {
77
+ user.name = this.displayName;
78
+ user.email = this.email;
79
+ setUser(user);
80
80
  }
81
81
  this.ctx.update();
82
82
  }
@@ -181,13 +181,13 @@ export class SettingsPage extends HTMLElement {
181
181
 
182
182
  h1 {
183
183
  margin: 0 0 0.25rem 0;
184
- color: var(--primary-color);
184
+ color: var(--snice-color-primary);
185
185
  }
186
186
 
187
187
  .hint {
188
188
  margin: 0 0 2rem 0;
189
189
  font-size: 0.8125rem;
190
- color: var(--text-light);
190
+ color: var(--snice-color-text-secondary);
191
191
  }
192
192
 
193
193
  .section {
@@ -197,7 +197,7 @@ export class SettingsPage extends HTMLElement {
197
197
 
198
198
  h3 {
199
199
  margin: 0 0 1.25rem 0;
200
- color: var(--primary-color);
200
+ color: var(--snice-color-primary);
201
201
  }
202
202
 
203
203
  .form-group {
@@ -213,7 +213,7 @@ export class SettingsPage extends HTMLElement {
213
213
  margin-bottom: 0.375rem;
214
214
  font-size: 0.875rem;
215
215
  font-weight: 500;
216
- color: var(--text-color);
216
+ color: var(--snice-color-text);
217
217
  }
218
218
 
219
219
  snice-input {
@@ -232,22 +232,22 @@ export class SettingsPage extends HTMLElement {
232
232
  align-items: center;
233
233
  gap: 0.5rem;
234
234
  padding: 1rem;
235
- background: var(--bg-secondary);
236
- border: 2px solid var(--border-color);
237
- border-radius: var(--radius-md);
235
+ background: var(--snice-color-background-secondary);
236
+ border: 2px solid var(--snice-color-border);
237
+ border-radius: var(--snice-border-radius-lg);
238
238
  cursor: pointer;
239
- color: var(--text-color);
239
+ color: var(--snice-color-text);
240
240
  font-size: 0.875rem;
241
241
  transition: border-color 0.2s;
242
242
  }
243
243
 
244
244
  .theme-btn:hover {
245
- border-color: var(--primary-color);
245
+ border-color: var(--snice-color-primary);
246
246
  }
247
247
 
248
248
  .theme-btn.active {
249
- border-color: var(--primary-color);
250
- background: color-mix(in srgb, var(--primary-color) 10%, transparent);
249
+ border-color: var(--snice-color-primary);
250
+ background: color-mix(in srgb, var(--snice-color-primary) 10%, transparent);
251
251
  }
252
252
 
253
253
  .theme-icon {
@@ -263,13 +263,13 @@ export class SettingsPage extends HTMLElement {
263
263
  .toggle-label {
264
264
  margin: 0;
265
265
  font-weight: 500;
266
- color: var(--text-color);
266
+ color: var(--snice-color-text);
267
267
  }
268
268
 
269
269
  .toggle-desc {
270
270
  margin: 0.25rem 0 0 0;
271
271
  font-size: 0.8125rem;
272
- color: var(--text-light);
272
+ color: var(--snice-color-text-secondary);
273
273
  }
274
274
 
275
275
  .actions {
@@ -0,0 +1,13 @@
1
+ import { Router } from 'snice';
2
+ import { fetcher } from './fetcher';
3
+ import { appContext } from './context';
4
+
5
+ const { page, initialize, navigate } = Router({
6
+ target: '#app',
7
+ type: 'hash',
8
+ layout: 'snice-layout',
9
+ fetcher,
10
+ context: appContext
11
+ });
12
+
13
+ export { page, initialize, navigate };
@@ -0,0 +1,16 @@
1
+ * {
2
+ box-sizing: border-box;
3
+ }
4
+
5
+ body {
6
+ margin: 0;
7
+ padding: 0;
8
+ font-family: var(--snice-font-family);
9
+ background: var(--snice-color-background-secondary);
10
+ color: var(--snice-color-text);
11
+ line-height: var(--snice-line-height-normal);
12
+ }
13
+
14
+ #app {
15
+ min-height: 100vh;
16
+ }
@@ -14,7 +14,8 @@
14
14
  "noFallthroughCasesInSwitch": true,
15
15
  "experimentalDecorators": false,
16
16
  "emitDecoratorMetadata": false,
17
- "useDefineForClassFields": false
17
+ "useDefineForClassFields": false,
18
+ "types": ["vite/client"]
18
19
  },
19
20
  "include": ["src", "tests"]
20
21
  }
@@ -0,0 +1,124 @@
1
+ # {{projectName}}
2
+
3
+ A React application built with [Snice](https://github.com/sniceio/snice).
4
+
5
+ ## Features
6
+
7
+ - **JWT Authentication** - Token-based auth with automatic refresh and middleware
8
+ - **Protected Routes** - Guards with `(context, params) => boolean` signature
9
+ - **Middleware Pattern** - Composable fetch middleware (auth headers, error handling, retry)
10
+ - **Live Notifications** - WebSocket daemon with real-time updates and badge counter
11
+ - **Theme Switching** - Light, dark, and system theme with persistence
12
+ - **Data Listing** - Filterable table with debounced search
13
+ - **Snice Components** - Pre-built UI adapters (Card, Alert, Avatar, Switch, Badge, Divider, Login)
14
+ - **React Hooks** - `useSniceContext()`, `useNavigate()`, `useParams()`, `useRoute()`
15
+ - **Type-Safe** - Full TypeScript support
16
+ - **Fast Build** - Vite + React
17
+
18
+ ## Getting Started
19
+
20
+ ```bash
21
+ # Install dependencies
22
+ npm install
23
+
24
+ # Start dev server
25
+ npm run dev
26
+
27
+ # Build for production
28
+ npm run build
29
+
30
+ # Preview production build
31
+ npm run preview
32
+
33
+ # Type check
34
+ npm run type-check
35
+
36
+ # Run tests
37
+ npm run test
38
+ ```
39
+
40
+ ## Demo Credentials
41
+
42
+ - **Email:** demo@example.com
43
+ - **Password:** demo
44
+
45
+ ## Project Structure
46
+
47
+ ```
48
+ src/
49
+ components/ # React components
50
+ AppHeader.tsx # Nav bar with user avatar, menu, notifications
51
+ AppLayout.tsx # Layout wrapper with header
52
+ NotificationBadge.tsx # Notification count badge
53
+ SearchBar.tsx # Debounced search input
54
+ pages/ # Page components (rendered by routes)
55
+ LoginPage.tsx # Login form using Snice Login adapter
56
+ DashboardPage.tsx # Stats cards, feature lists
57
+ ProfilePage.tsx # User profile with avatar
58
+ NotificationsPage.tsx # Live notification feed with filters
59
+ SettingsPage.tsx # Theme, profile editing, notifications toggle
60
+ DataPage.tsx # Data table with search and status filters
61
+ services/ # Business logic (auth, storage, jwt)
62
+ middleware/ # Fetch middleware (auth, error, retry)
63
+ daemons/ # Lifecycle-managed classes (notifications WebSocket)
64
+ guards/ # Route guards (auth)
65
+ types/ # TypeScript types
66
+ styles/ # Global styles with snice theme variables
67
+ ```
68
+
69
+ ## Snice React Integration
70
+
71
+ - `<SniceRouter>` - Root provider with URL routing, context, and layout
72
+ - `<Route>` - Route definitions with guards, placards, and layout override
73
+ - `useSniceContext()` - Access application context (`{ application, navigation, navigate }`)
74
+ - `useNavigate()` - Programmatic navigation
75
+ - `useParams()` - Current route parameters
76
+ - `useRoute()` - Current route pattern
77
+ - Snice component adapters: `Card`, `Button`, `Input`, `Alert`, `Avatar`, `Badge`, `Spinner`, `Switch`, `Divider`, `EmptyState`, `Layout`, `Login`, `Tabs`
78
+
79
+ ## Customization
80
+
81
+ ### Replace Mock API
82
+
83
+ Update `src/services/auth.ts` to call your real API:
84
+
85
+ ```typescript
86
+ export async function login(credentials: LoginCredentials) {
87
+ const response = await fetch('https://your-api.com/auth/login', {
88
+ method: 'POST',
89
+ headers: { 'Content-Type': 'application/json' },
90
+ body: JSON.stringify(credentials)
91
+ });
92
+ const data = await response.json();
93
+ setToken(data.token);
94
+ setUser(data.user);
95
+ return data;
96
+ }
97
+ ```
98
+
99
+ ### Enable Real WebSocket
100
+
101
+ Update `src/daemons/notifications.ts`:
102
+
103
+ ```typescript
104
+ // Replace startMockNotifications() with:
105
+ this.connect();
106
+ ```
107
+
108
+ ### Configure Environment
109
+
110
+ Create `.env` file:
111
+
112
+ ```
113
+ VITE_API_URL=https://your-api.com
114
+ VITE_WS_URL=wss://your-ws.com
115
+ ```
116
+
117
+ ## Learn More
118
+
119
+ - [Snice Documentation](https://sniceio.github.io/snice)
120
+ - [React Documentation](https://react.dev)
121
+
122
+ ## License
123
+
124
+ MIT