snice 4.28.0 → 4.30.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.
- package/README.md +3 -10
- package/adapters/react/SniceProvider.d.ts +71 -0
- package/adapters/react/SniceProvider.js +49 -0
- package/adapters/react/SniceProvider.js.map +1 -0
- package/adapters/react/SniceRouter.d.ts +44 -0
- package/adapters/react/SniceRouter.js +190 -0
- package/adapters/react/SniceRouter.js.map +1 -0
- package/adapters/react/action-bar.d.ts +30 -0
- package/adapters/react/action-bar.d.ts.map +1 -0
- package/adapters/react/action-bar.js +24 -0
- package/adapters/react/action-bar.js.map +1 -0
- package/adapters/react/action-bar.tsx +38 -0
- package/adapters/react/binpack.d.ts +35 -0
- package/adapters/react/binpack.d.ts.map +1 -0
- package/adapters/react/binpack.js +24 -0
- package/adapters/react/binpack.js.map +1 -0
- package/adapters/react/binpack.tsx +43 -0
- package/adapters/react/components.d.ts +6 -0
- package/adapters/react/components.d.ts.map +1 -1
- package/adapters/react/components.js +3 -0
- package/adapters/react/components.js.map +1 -1
- package/adapters/react/components.ts +6 -0
- package/adapters/react/grid.d.ts +36 -0
- package/adapters/react/grid.d.ts.map +1 -0
- package/adapters/react/grid.js +24 -0
- package/adapters/react/grid.js.map +1 -0
- package/adapters/react/grid.tsx +44 -0
- package/adapters/react/index.d.ts +5 -0
- package/adapters/react/index.d.ts.map +1 -1
- package/adapters/react/index.js +3 -2
- package/adapters/react/index.js.map +1 -1
- package/adapters/react/index.ts +6 -3
- package/adapters/react/matchRoute.d.ts +16 -0
- package/adapters/react/matchRoute.js +32 -0
- package/adapters/react/matchRoute.js.map +1 -0
- package/adapters/react/types.d.ts +1 -15
- package/adapters/react/types.d.ts.map +1 -1
- package/adapters/react/types.ts +1 -15
- package/adapters/react/useRequestHandler.d.ts +56 -0
- package/adapters/react/useRequestHandler.js +103 -0
- package/adapters/react/useRequestHandler.js.map +1 -0
- package/bin/snice.js +8 -13
- package/bin/templates/{pwa → default}/index.html +1 -1
- package/bin/templates/{pwa → default}/src/components/app-header.ts +36 -18
- package/bin/templates/{pwa → default}/src/components/notification-badge.ts +2 -21
- package/bin/templates/{pwa → default}/src/components/search-bar.ts +12 -12
- package/bin/templates/default/src/context.ts +17 -0
- package/bin/templates/{pwa → default}/src/controllers/notification-controller.ts +10 -15
- package/bin/templates/{pwa → default}/src/daemons/notifications.ts +0 -12
- package/bin/templates/{pwa → default}/src/main.ts +1 -7
- package/bin/templates/{pwa → default}/src/middleware/error.ts +1 -8
- package/bin/templates/{pwa → default}/src/pages/dashboard.ts +17 -18
- package/bin/templates/{pwa → default}/src/pages/data.ts +24 -24
- package/bin/templates/{pwa → default}/src/pages/login.ts +3 -6
- package/bin/templates/{pwa → default}/src/pages/notifications.ts +21 -19
- package/bin/templates/{pwa → default}/src/pages/profile.ts +10 -12
- package/bin/templates/{pwa → default}/src/pages/settings.ts +22 -22
- package/bin/templates/default/src/router.ts +13 -0
- package/bin/templates/default/src/styles/global.css +16 -0
- package/bin/templates/{pwa → default}/tsconfig.json +2 -1
- package/bin/templates/react/README.md +124 -0
- package/bin/templates/react/global.d.ts +10 -0
- package/bin/templates/react/index.html +15 -0
- package/bin/templates/react/package.json +31 -0
- package/bin/templates/react/src/App.tsx +112 -0
- package/bin/templates/react/src/components/AppHeader.tsx +85 -0
- package/bin/templates/react/src/components/AppLayout.tsx +11 -0
- package/bin/templates/react/src/components/NotificationBadge.tsx +13 -0
- package/bin/templates/react/src/components/SearchBar.tsx +63 -0
- package/bin/templates/react/src/daemons/notifications.ts +136 -0
- package/bin/templates/react/src/fetcher.ts +15 -0
- package/bin/templates/react/src/guards/auth.ts +6 -0
- package/bin/templates/react/src/main.tsx +27 -0
- package/bin/templates/react/src/middleware/auth.ts +16 -0
- package/bin/templates/react/src/middleware/error.ts +29 -0
- package/bin/templates/react/src/middleware/retry.ts +31 -0
- package/bin/templates/react/src/pages/DashboardPage.tsx +111 -0
- package/bin/templates/react/src/pages/DataPage.tsx +119 -0
- package/bin/templates/react/src/pages/LoginPage.tsx +46 -0
- package/bin/templates/react/src/pages/NotificationsPage.tsx +119 -0
- package/bin/templates/react/src/pages/ProfilePage.tsx +92 -0
- package/bin/templates/react/src/pages/SettingsPage.tsx +165 -0
- package/bin/templates/react/src/services/auth.ts +48 -0
- package/bin/templates/react/src/services/jwt.ts +35 -0
- package/bin/templates/react/src/services/storage.ts +24 -0
- package/bin/templates/react/src/styles/global.css +382 -0
- package/bin/templates/react/src/types/auth.ts +21 -0
- package/bin/templates/react/src/types/notifications.ts +9 -0
- package/bin/templates/react/tests/helpers/test-utils.ts +79 -0
- package/bin/templates/react/tests/middleware/auth.test.ts +67 -0
- package/bin/templates/react/tests/middleware/error.test.ts +105 -0
- package/bin/templates/react/tests/middleware/retry.test.ts +103 -0
- package/bin/templates/react/tests/services/auth.test.ts +89 -0
- package/bin/templates/react/tests/services/jwt.test.ts +76 -0
- package/bin/templates/react/tests/services/storage.test.ts +69 -0
- package/bin/templates/{base → react}/tsconfig.json +4 -6
- package/bin/templates/react/vite.config.ts +18 -0
- package/bin/templates/react/vitest.config.ts +18 -0
- package/dist/cdn/accordion/snice-accordion.js +1 -1
- package/dist/cdn/accordion/snice-accordion.min.js +1 -1
- package/dist/cdn/action-bar/README.md +27 -0
- package/dist/cdn/action-bar/snice-action-bar.js +249 -0
- package/dist/cdn/action-bar/snice-action-bar.js.map +1 -0
- package/dist/cdn/action-bar/snice-action-bar.min.js +12 -0
- package/dist/cdn/action-bar/snice-action-bar.min.js.map +1 -0
- package/dist/cdn/activity-feed/snice-activity-feed.js +1 -1
- package/dist/cdn/activity-feed/snice-activity-feed.min.js +1 -1
- package/dist/cdn/alert/snice-alert.js +1 -1
- package/dist/cdn/alert/snice-alert.min.js +1 -1
- package/dist/cdn/app-tiles/snice-app-tiles.js +1 -1
- package/dist/cdn/app-tiles/snice-app-tiles.min.js +1 -1
- package/dist/cdn/approval-flow/snice-approval-flow.js +1 -1
- package/dist/cdn/approval-flow/snice-approval-flow.min.js +1 -1
- package/dist/cdn/audio-recorder/snice-audio-recorder.js +1 -1
- package/dist/cdn/audio-recorder/snice-audio-recorder.min.js +1 -1
- package/dist/cdn/availability/snice-availability.js +1 -1
- package/dist/cdn/availability/snice-availability.min.js +1 -1
- package/dist/cdn/avatar/snice-avatar.js +1 -1
- package/dist/cdn/avatar/snice-avatar.min.js +1 -1
- package/dist/cdn/avatar-group/snice-avatar-group.js +1 -1
- package/dist/cdn/avatar-group/snice-avatar-group.min.js +1 -1
- package/dist/cdn/badge/snice-badge.js +1 -1
- package/dist/cdn/badge/snice-badge.min.js +1 -1
- package/dist/cdn/banner/snice-banner.js +1 -1
- package/dist/cdn/banner/snice-banner.min.js +1 -1
- package/dist/cdn/binpack/README.md +27 -0
- package/dist/cdn/binpack/snice-binpack.js +1037 -0
- package/dist/cdn/binpack/snice-binpack.js.map +1 -0
- package/dist/cdn/binpack/snice-binpack.min.js +13 -0
- package/dist/cdn/binpack/snice-binpack.min.js.map +1 -0
- package/dist/cdn/book/snice-book.js +1 -1
- package/dist/cdn/book/snice-book.min.js +1 -1
- package/dist/cdn/booking/snice-booking.js +1 -1
- package/dist/cdn/booking/snice-booking.min.js +1 -1
- package/dist/cdn/breadcrumbs/snice-breadcrumbs.js +1 -1
- package/dist/cdn/breadcrumbs/snice-breadcrumbs.min.js +1 -1
- package/dist/cdn/button/README.md +1 -1
- package/dist/cdn/button/snice-button.js +2 -2
- package/dist/cdn/button/snice-button.js.map +1 -1
- package/dist/cdn/button/snice-button.min.js +2 -2
- package/dist/cdn/button/snice-button.min.js.map +1 -1
- package/dist/cdn/calendar/snice-calendar.js +1 -1
- package/dist/cdn/calendar/snice-calendar.min.js +1 -1
- package/dist/cdn/camera/snice-camera.js +1 -1
- package/dist/cdn/camera/snice-camera.min.js +1 -1
- package/dist/cdn/camera-annotate/snice-camera-annotate.js +1 -1
- package/dist/cdn/camera-annotate/snice-camera-annotate.min.js +1 -1
- package/dist/cdn/candlestick/snice-candlestick.js +1 -1
- package/dist/cdn/candlestick/snice-candlestick.min.js +1 -1
- package/dist/cdn/card/snice-card.js +1 -1
- package/dist/cdn/card/snice-card.min.js +1 -1
- package/dist/cdn/carousel/snice-carousel.js +1 -1
- package/dist/cdn/carousel/snice-carousel.min.js +1 -1
- package/dist/cdn/cart/snice-cart.js +1 -1
- package/dist/cdn/cart/snice-cart.min.js +1 -1
- package/dist/cdn/chart/snice-chart.js +1 -1
- package/dist/cdn/chart/snice-chart.min.js +1 -1
- package/dist/cdn/chat/snice-chat.js +1 -1
- package/dist/cdn/chat/snice-chat.min.js +1 -1
- package/dist/cdn/checkbox/snice-checkbox.js +1 -1
- package/dist/cdn/checkbox/snice-checkbox.min.js +1 -1
- package/dist/cdn/chip/README.md +2 -2
- package/dist/cdn/chip/snice-chip.js +2 -2
- package/dist/cdn/chip/snice-chip.js.map +1 -1
- package/dist/cdn/chip/snice-chip.min.js +3 -3
- package/dist/cdn/chip/snice-chip.min.js.map +1 -1
- package/dist/cdn/code-block/snice-code-block.js +1 -1
- package/dist/cdn/code-block/snice-code-block.min.js +1 -1
- package/dist/cdn/color-display/snice-color-display.js +1 -1
- package/dist/cdn/color-display/snice-color-display.min.js +1 -1
- package/dist/cdn/color-picker/snice-color-picker.js +1 -1
- package/dist/cdn/color-picker/snice-color-picker.min.js +1 -1
- package/dist/cdn/command-palette/snice-command-palette.js +1 -1
- package/dist/cdn/command-palette/snice-command-palette.min.js +1 -1
- package/dist/cdn/comments/snice-comments.js +1 -1
- package/dist/cdn/comments/snice-comments.min.js +1 -1
- package/dist/cdn/countdown/snice-countdown.js +1 -1
- package/dist/cdn/countdown/snice-countdown.min.js +1 -1
- package/dist/cdn/cropper/snice-cropper.js +1 -1
- package/dist/cdn/cropper/snice-cropper.min.js +1 -1
- package/dist/cdn/data-card/snice-data-card.js +1 -1
- package/dist/cdn/data-card/snice-data-card.min.js +1 -1
- package/dist/cdn/date-picker/README.md +1 -1
- package/dist/cdn/date-picker/snice-date-picker.js +2 -2
- package/dist/cdn/date-picker/snice-date-picker.js.map +1 -1
- package/dist/cdn/date-picker/snice-date-picker.min.js +2 -2
- package/dist/cdn/date-picker/snice-date-picker.min.js.map +1 -1
- package/dist/cdn/date-range-picker/README.md +1 -1
- package/dist/cdn/date-range-picker/snice-date-range-picker.js +2 -2
- package/dist/cdn/date-range-picker/snice-date-range-picker.js.map +1 -1
- package/dist/cdn/date-range-picker/snice-date-range-picker.min.js +11 -11
- package/dist/cdn/date-range-picker/snice-date-range-picker.min.js.map +1 -1
- package/dist/cdn/date-time-picker/README.md +1 -1
- package/dist/cdn/date-time-picker/snice-date-time-picker.js +2 -2
- package/dist/cdn/date-time-picker/snice-date-time-picker.js.map +1 -1
- package/dist/cdn/date-time-picker/snice-date-time-picker.min.js +2 -2
- package/dist/cdn/date-time-picker/snice-date-time-picker.min.js.map +1 -1
- package/dist/cdn/diff/snice-diff.js +1 -1
- package/dist/cdn/diff/snice-diff.min.js +1 -1
- package/dist/cdn/divider/snice-divider.js +1 -1
- package/dist/cdn/divider/snice-divider.min.js +1 -1
- package/dist/cdn/doc/snice-doc.js +1 -1
- package/dist/cdn/doc/snice-doc.min.js +1 -1
- package/dist/cdn/draw/README.md +2 -2
- package/dist/cdn/draw/snice-draw.js +26 -4
- package/dist/cdn/draw/snice-draw.js.map +1 -1
- package/dist/cdn/draw/snice-draw.min.js +3 -3
- package/dist/cdn/draw/snice-draw.min.js.map +1 -1
- package/dist/cdn/drawer/snice-drawer.js +1 -1
- package/dist/cdn/drawer/snice-drawer.min.js +1 -1
- package/dist/cdn/empty-state/snice-empty-state.js +1 -1
- package/dist/cdn/empty-state/snice-empty-state.min.js +1 -1
- package/dist/cdn/estimate/snice-estimate.js +1 -1
- package/dist/cdn/estimate/snice-estimate.min.js +1 -1
- package/dist/cdn/file-gallery/snice-file-gallery.js +1 -1
- package/dist/cdn/file-gallery/snice-file-gallery.min.js +1 -1
- package/dist/cdn/file-upload/snice-file-upload.js +1 -1
- package/dist/cdn/file-upload/snice-file-upload.min.js +1 -1
- package/dist/cdn/flip-card/snice-flip-card.js +1 -1
- package/dist/cdn/flip-card/snice-flip-card.min.js +1 -1
- package/dist/cdn/flow/snice-flow.js +1 -1
- package/dist/cdn/flow/snice-flow.min.js +1 -1
- package/dist/cdn/form-layout/snice-form-layout.js +1 -1
- package/dist/cdn/form-layout/snice-form-layout.min.js +1 -1
- package/dist/cdn/funnel/snice-funnel.js +1 -1
- package/dist/cdn/funnel/snice-funnel.min.js +1 -1
- package/dist/cdn/gantt/snice-gantt.js +1 -1
- package/dist/cdn/gantt/snice-gantt.min.js +1 -1
- package/dist/cdn/gauge/snice-gauge.js +1 -1
- package/dist/cdn/gauge/snice-gauge.min.js +1 -1
- package/dist/cdn/grid/README.md +27 -0
- package/dist/cdn/grid/snice-grid.js +862 -0
- package/dist/cdn/grid/snice-grid.js.map +1 -0
- package/dist/cdn/grid/snice-grid.min.js +13 -0
- package/dist/cdn/grid/snice-grid.min.js.map +1 -0
- package/dist/cdn/heatmap/snice-heatmap.js +1 -1
- package/dist/cdn/heatmap/snice-heatmap.min.js +1 -1
- package/dist/cdn/image/snice-image.js +1 -1
- package/dist/cdn/image/snice-image.min.js +1 -1
- package/dist/cdn/input/snice-input.js +1 -1
- package/dist/cdn/input/snice-input.min.js +1 -1
- package/dist/cdn/invoice/snice-invoice.js +1 -1
- package/dist/cdn/invoice/snice-invoice.min.js +1 -1
- package/dist/cdn/kanban/snice-kanban.js +1 -1
- package/dist/cdn/kanban/snice-kanban.min.js +1 -1
- package/dist/cdn/key-value/snice-key-value.js +1 -1
- package/dist/cdn/key-value/snice-key-value.min.js +1 -1
- package/dist/cdn/kpi/snice-kpi.js +1 -1
- package/dist/cdn/kpi/snice-kpi.min.js +1 -1
- package/dist/cdn/layout/snice-layout.js +1 -1
- package/dist/cdn/layout/snice-layout.min.js +1 -1
- package/dist/cdn/leaderboard/snice-leaderboard.js +1 -1
- package/dist/cdn/leaderboard/snice-leaderboard.min.js +1 -1
- package/dist/cdn/link/snice-link.js +1 -1
- package/dist/cdn/link/snice-link.min.js +1 -1
- package/dist/cdn/link-preview/snice-link-preview.js +1 -1
- package/dist/cdn/link-preview/snice-link-preview.min.js +1 -1
- package/dist/cdn/list/snice-list.js +1 -1
- package/dist/cdn/list/snice-list.min.js +1 -1
- package/dist/cdn/location/snice-location.js +1 -1
- package/dist/cdn/location/snice-location.min.js +1 -1
- package/dist/cdn/login/README.md +2 -2
- package/dist/cdn/login/snice-login.js +2 -2
- package/dist/cdn/login/snice-login.js.map +1 -1
- package/dist/cdn/login/snice-login.min.js +2 -2
- package/dist/cdn/login/snice-login.min.js.map +1 -1
- package/dist/cdn/map/snice-map.js +1 -1
- package/dist/cdn/map/snice-map.min.js +1 -1
- package/dist/cdn/markdown/snice-markdown.js +1 -1
- package/dist/cdn/markdown/snice-markdown.min.js +1 -1
- package/dist/cdn/masonry/snice-masonry.js +1 -1
- package/dist/cdn/masonry/snice-masonry.min.js +1 -1
- package/dist/cdn/menu/snice-menu.js +1 -1
- package/dist/cdn/menu/snice-menu.min.js +1 -1
- package/dist/cdn/message-strip/README.md +2 -2
- package/dist/cdn/message-strip/snice-message-strip.js +2 -2
- package/dist/cdn/message-strip/snice-message-strip.js.map +1 -1
- package/dist/cdn/message-strip/snice-message-strip.min.js +6 -6
- package/dist/cdn/message-strip/snice-message-strip.min.js.map +1 -1
- package/dist/cdn/metric-table/snice-metric-table.js +1 -1
- package/dist/cdn/metric-table/snice-metric-table.min.js +1 -1
- package/dist/cdn/modal/snice-modal.js +1 -1
- package/dist/cdn/modal/snice-modal.min.js +1 -1
- package/dist/cdn/music-player/snice-music-player.js +1 -1
- package/dist/cdn/music-player/snice-music-player.min.js +1 -1
- package/dist/cdn/nav/snice-nav.js +1 -1
- package/dist/cdn/nav/snice-nav.min.js +1 -1
- package/dist/cdn/network-graph/snice-network-graph.js +1 -1
- package/dist/cdn/network-graph/snice-network-graph.min.js +1 -1
- package/dist/cdn/notification-center/snice-notification-center.js +1 -1
- package/dist/cdn/notification-center/snice-notification-center.min.js +1 -1
- package/dist/cdn/order-tracker/snice-order-tracker.js +1 -1
- package/dist/cdn/order-tracker/snice-order-tracker.min.js +1 -1
- package/dist/cdn/org-chart/snice-org-chart.js +1 -1
- package/dist/cdn/org-chart/snice-org-chart.min.js +1 -1
- package/dist/cdn/pagination/snice-pagination.js +1 -1
- package/dist/cdn/pagination/snice-pagination.min.js +1 -1
- package/dist/cdn/paint/README.md +2 -2
- package/dist/cdn/paint/snice-paint.js +26 -3
- package/dist/cdn/paint/snice-paint.js.map +1 -1
- package/dist/cdn/paint/snice-paint.min.js +3 -3
- package/dist/cdn/paint/snice-paint.min.js.map +1 -1
- package/dist/cdn/pdf-viewer/snice-pdf-viewer.js +1 -1
- package/dist/cdn/pdf-viewer/snice-pdf-viewer.min.js +1 -1
- package/dist/cdn/permission-matrix/snice-permission-matrix.js +1 -1
- package/dist/cdn/permission-matrix/snice-permission-matrix.min.js +1 -1
- package/dist/cdn/podcast-player/snice-podcast-player.js +1 -1
- package/dist/cdn/podcast-player/snice-podcast-player.min.js +1 -1
- package/dist/cdn/pricing-table/snice-pricing-table.js +1 -1
- package/dist/cdn/pricing-table/snice-pricing-table.min.js +1 -1
- package/dist/cdn/product-card/README.md +1 -1
- package/dist/cdn/product-card/snice-product-card.js +1 -1
- package/dist/cdn/product-card/snice-product-card.min.js +1 -1
- package/dist/cdn/progress/snice-progress.js +1 -1
- package/dist/cdn/progress/snice-progress.min.js +1 -1
- package/dist/cdn/progress-ring/snice-progress-ring.js +1 -1
- package/dist/cdn/progress-ring/snice-progress-ring.min.js +1 -1
- package/dist/cdn/qr-code/snice-qr-code.js +1 -1
- package/dist/cdn/qr-code/snice-qr-code.min.js +1 -1
- package/dist/cdn/qr-reader/snice-qr-reader.js +1 -1
- package/dist/cdn/qr-reader/snice-qr-reader.min.js +1 -1
- package/dist/cdn/radio/snice-radio.js +1 -1
- package/dist/cdn/radio/snice-radio.min.js +1 -1
- package/dist/cdn/range-slider/snice-range-slider.js +1 -1
- package/dist/cdn/range-slider/snice-range-slider.min.js +1 -1
- package/dist/cdn/rating/snice-rating.js +1 -1
- package/dist/cdn/rating/snice-rating.min.js +1 -1
- package/dist/cdn/receipt/snice-receipt.js +1 -1
- package/dist/cdn/receipt/snice-receipt.min.js +1 -1
- package/dist/cdn/recipe/snice-recipe.js +1 -1
- package/dist/cdn/recipe/snice-recipe.min.js +1 -1
- package/dist/cdn/runtime/README.md +2 -2
- package/dist/cdn/runtime/snice-runtime.esm.js +109 -16
- package/dist/cdn/runtime/snice-runtime.esm.js.map +1 -1
- package/dist/cdn/runtime/snice-runtime.esm.min.js +8 -8
- package/dist/cdn/runtime/snice-runtime.esm.min.js.map +1 -1
- package/dist/cdn/runtime/snice-runtime.js +109 -15
- package/dist/cdn/runtime/snice-runtime.js.map +1 -1
- package/dist/cdn/runtime/snice-runtime.min.js +7 -7
- package/dist/cdn/runtime/snice-runtime.min.js.map +1 -1
- package/dist/cdn/sankey/snice-sankey.js +1 -1
- package/dist/cdn/sankey/snice-sankey.min.js +1 -1
- package/dist/cdn/segmented-control/snice-segmented-control.js +1 -1
- package/dist/cdn/segmented-control/snice-segmented-control.min.js +1 -1
- package/dist/cdn/select/snice-select.js +1 -1
- package/dist/cdn/select/snice-select.min.js +1 -1
- package/dist/cdn/skeleton/snice-skeleton.js +1 -1
- package/dist/cdn/skeleton/snice-skeleton.min.js +1 -1
- package/dist/cdn/slider/snice-slider.js +1 -1
- package/dist/cdn/slider/snice-slider.min.js +1 -1
- package/dist/cdn/sortable/snice-sortable.js +1 -1
- package/dist/cdn/sortable/snice-sortable.min.js +1 -1
- package/dist/cdn/sparkline/snice-sparkline.js +1 -1
- package/dist/cdn/sparkline/snice-sparkline.min.js +1 -1
- package/dist/cdn/spinner/snice-spinner.js +1 -1
- package/dist/cdn/spinner/snice-spinner.min.js +1 -1
- package/dist/cdn/split-button/snice-split-button.js +1 -1
- package/dist/cdn/split-button/snice-split-button.min.js +1 -1
- package/dist/cdn/split-pane/snice-split-pane.js +1 -1
- package/dist/cdn/split-pane/snice-split-pane.min.js +1 -1
- package/dist/cdn/spotlight/snice-spotlight.js +1 -1
- package/dist/cdn/spotlight/snice-spotlight.min.js +1 -1
- package/dist/cdn/spreadsheet/snice-spreadsheet.js +1 -1
- package/dist/cdn/spreadsheet/snice-spreadsheet.min.js +1 -1
- package/dist/cdn/stat-group/snice-stat-group.js +1 -1
- package/dist/cdn/stat-group/snice-stat-group.min.js +1 -1
- package/dist/cdn/step-input/snice-step-input.js +1 -1
- package/dist/cdn/step-input/snice-step-input.min.js +1 -1
- package/dist/cdn/stepper/snice-stepper.js +1 -1
- package/dist/cdn/stepper/snice-stepper.min.js +1 -1
- package/dist/cdn/switch/snice-switch.js +1 -1
- package/dist/cdn/switch/snice-switch.min.js +1 -1
- package/dist/cdn/table/README.md +1 -1
- package/dist/cdn/table/snice-table.js +2 -2
- package/dist/cdn/table/snice-table.js.map +1 -1
- package/dist/cdn/table/snice-table.min.js +2 -2
- package/dist/cdn/table/snice-table.min.js.map +1 -1
- package/dist/cdn/tabs/snice-tabs.js +1 -1
- package/dist/cdn/tabs/snice-tabs.min.js +1 -1
- package/dist/cdn/tag/README.md +1 -1
- package/dist/cdn/tag/snice-tag.js +2 -2
- package/dist/cdn/tag/snice-tag.js.map +1 -1
- package/dist/cdn/tag/snice-tag.min.js +3 -3
- package/dist/cdn/tag/snice-tag.min.js.map +1 -1
- package/dist/cdn/tag-input/README.md +2 -2
- package/dist/cdn/tag-input/snice-tag-input.js +2 -2
- package/dist/cdn/tag-input/snice-tag-input.js.map +1 -1
- package/dist/cdn/tag-input/snice-tag-input.min.js +2 -2
- package/dist/cdn/tag-input/snice-tag-input.min.js.map +1 -1
- package/dist/cdn/terminal/snice-terminal.js +1 -1
- package/dist/cdn/terminal/snice-terminal.min.js +1 -1
- package/dist/cdn/testimonial/snice-testimonial.js +1 -1
- package/dist/cdn/testimonial/snice-testimonial.min.js +1 -1
- package/dist/cdn/textarea/snice-textarea.js +1 -1
- package/dist/cdn/textarea/snice-textarea.min.js +1 -1
- package/dist/cdn/time-picker/README.md +1 -1
- package/dist/cdn/time-picker/snice-time-picker.js +2 -2
- package/dist/cdn/time-picker/snice-time-picker.js.map +1 -1
- package/dist/cdn/time-picker/snice-time-picker.min.js +2 -2
- package/dist/cdn/time-picker/snice-time-picker.min.js.map +1 -1
- package/dist/cdn/time-range-picker/snice-time-range-picker.js +1 -1
- package/dist/cdn/time-range-picker/snice-time-range-picker.min.js +1 -1
- package/dist/cdn/timeline/snice-timeline.js +1 -1
- package/dist/cdn/timeline/snice-timeline.min.js +1 -1
- package/dist/cdn/timer/snice-timer.js +1 -1
- package/dist/cdn/timer/snice-timer.min.js +1 -1
- package/dist/cdn/toast/README.md +1 -1
- package/dist/cdn/toast/snice-toast.js +7 -3
- package/dist/cdn/toast/snice-toast.js.map +1 -1
- package/dist/cdn/toast/snice-toast.min.js +6 -6
- package/dist/cdn/toast/snice-toast.min.js.map +1 -1
- package/dist/cdn/tooltip/snice-tooltip.js +1 -1
- package/dist/cdn/tooltip/snice-tooltip.min.js +1 -1
- package/dist/cdn/tree/snice-tree.js +1 -1
- package/dist/cdn/tree/snice-tree.min.js +1 -1
- package/dist/cdn/treemap/snice-treemap.js +1 -1
- package/dist/cdn/treemap/snice-treemap.min.js +1 -1
- package/dist/cdn/user-card/snice-user-card.js +1 -1
- package/dist/cdn/user-card/snice-user-card.min.js +1 -1
- package/dist/cdn/video-player/snice-video-player.js +1 -1
- package/dist/cdn/video-player/snice-video-player.min.js +1 -1
- package/dist/cdn/virtual-scroller/snice-virtual-scroller.js +1 -1
- package/dist/cdn/virtual-scroller/snice-virtual-scroller.min.js +1 -1
- package/dist/cdn/waterfall/README.md +1 -1
- package/dist/cdn/waterfall/snice-waterfall.js +1 -1
- package/dist/cdn/waterfall/snice-waterfall.min.js +1 -1
- package/dist/cdn/weather/snice-weather.js +1 -1
- package/dist/cdn/weather/snice-weather.min.js +1 -1
- package/dist/cdn/work-order/snice-work-order.js +1 -1
- package/dist/cdn/work-order/snice-work-order.min.js +1 -1
- package/dist/components/action-bar/snice-action-bar.d.ts +22 -0
- package/dist/components/action-bar/snice-action-bar.js +182 -0
- package/dist/components/action-bar/snice-action-bar.js.map +1 -0
- package/dist/components/action-bar/snice-action-bar.types.d.ts +17 -0
- package/dist/components/binpack/snice-binpack.d.ts +82 -0
- package/dist/components/binpack/snice-binpack.js +970 -0
- package/dist/components/binpack/snice-binpack.js.map +1 -0
- package/dist/components/binpack/snice-binpack.types.d.ts +52 -0
- package/dist/components/button/snice-button.js +1 -1
- package/dist/components/button/snice-button.js.map +1 -1
- package/dist/components/chip/snice-chip.js +1 -1
- package/dist/components/chip/snice-chip.js.map +1 -1
- package/dist/components/date-picker/snice-date-picker.js +1 -1
- package/dist/components/date-picker/snice-date-picker.js.map +1 -1
- package/dist/components/date-range-picker/snice-date-range-picker.js +1 -1
- package/dist/components/date-range-picker/snice-date-range-picker.js.map +1 -1
- package/dist/components/date-time-picker/snice-date-time-picker.js +1 -1
- package/dist/components/date-time-picker/snice-date-time-picker.js.map +1 -1
- package/dist/components/draw/snice-draw.d.ts +2 -0
- package/dist/components/draw/snice-draw.js +25 -3
- package/dist/components/draw/snice-draw.js.map +1 -1
- package/dist/components/grid/snice-grid.d.ts +73 -0
- package/dist/components/grid/snice-grid.js +795 -0
- package/dist/components/grid/snice-grid.js.map +1 -0
- package/dist/components/grid/snice-grid.types.d.ts +41 -0
- package/dist/components/message-strip/snice-message-strip.js +1 -1
- package/dist/components/message-strip/snice-message-strip.js.map +1 -1
- package/dist/components/paint/snice-paint.d.ts +2 -0
- package/dist/components/paint/snice-paint.js +25 -2
- package/dist/components/paint/snice-paint.js.map +1 -1
- package/dist/components/tag/snice-tag.js +1 -1
- package/dist/components/tag/snice-tag.js.map +1 -1
- package/dist/components/tag-input/snice-tag-input.js +1 -1
- package/dist/components/tag-input/snice-tag-input.js.map +1 -1
- package/dist/components/theme/theme.css +15 -0
- package/dist/components/time-picker/snice-time-picker.js +1 -1
- package/dist/components/time-picker/snice-time-picker.js.map +1 -1
- package/dist/components/toast/snice-toast-container.js +4 -0
- package/dist/components/toast/snice-toast-container.js.map +1 -1
- package/dist/components/toast/snice-toast.js +2 -2
- package/dist/create-request-handler.d.ts +42 -0
- package/dist/index.cjs +106 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.esm.js +106 -13
- package/dist/index.esm.js.map +1 -1
- package/dist/index.iife.js +106 -12
- package/dist/index.iife.js.map +1 -1
- package/dist/react/SniceProvider.d.ts +71 -0
- package/dist/react/SniceProvider.js +49 -0
- package/dist/react/SniceProvider.js.map +1 -0
- package/dist/react/SniceRouter.d.ts +44 -0
- package/dist/react/SniceRouter.js +190 -0
- package/dist/react/SniceRouter.js.map +1 -0
- package/dist/react/index.d.ts +3 -0
- package/dist/react/index.js +14 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/matchRoute.d.ts +16 -0
- package/dist/react/matchRoute.js +32 -0
- package/dist/react/matchRoute.js.map +1 -0
- package/dist/react/useRequestHandler.d.ts +56 -0
- package/dist/react/useRequestHandler.js +103 -0
- package/dist/react/useRequestHandler.js.map +1 -0
- package/dist/symbols.cjs +1 -1
- package/dist/symbols.esm.js +1 -1
- package/dist/transitions.cjs +1 -1
- package/dist/transitions.esm.js +1 -1
- package/dist/types/guard.d.ts +4 -11
- package/docs/ai/DEVELOPMENT.md +1 -1
- package/docs/ai/README.md +7 -7
- package/docs/ai/components/accordion.md +46 -80
- package/docs/ai/components/action-bar.md +75 -0
- package/docs/ai/components/activity-feed.md +7 -7
- package/docs/ai/components/alert.md +26 -44
- package/docs/ai/components/app-tiles.md +34 -39
- package/docs/ai/components/approval-flow.md +1 -1
- package/docs/ai/components/audio-recorder.md +35 -67
- package/docs/ai/components/availability.md +13 -34
- package/docs/ai/components/avatar-group.md +26 -13
- package/docs/ai/components/avatar.md +52 -36
- package/docs/ai/components/badge.md +21 -32
- package/docs/ai/components/banner.md +21 -43
- package/docs/ai/components/binpack.md +89 -0
- package/docs/ai/components/book.md +25 -23
- package/docs/ai/components/booking.md +31 -36
- package/docs/ai/components/breadcrumbs.md +36 -11
- package/docs/ai/components/button.md +33 -44
- package/docs/ai/components/calendar.md +37 -70
- package/docs/ai/components/camera-annotate.md +31 -64
- package/docs/ai/components/camera.md +38 -120
- package/docs/ai/components/candlestick.md +32 -52
- package/docs/ai/components/card.md +20 -30
- package/docs/ai/components/carousel.md +32 -32
- package/docs/ai/components/cart.md +24 -29
- package/docs/ai/components/chart.md +29 -114
- package/docs/ai/components/chat.md +38 -75
- package/docs/ai/components/checkbox.md +22 -41
- package/docs/ai/components/chip.md +18 -54
- package/docs/ai/components/code-block.md +57 -178
- package/docs/ai/components/color-display.md +12 -32
- package/docs/ai/components/color-picker.md +17 -39
- package/docs/ai/components/command-palette.md +49 -71
- package/docs/ai/components/comments.md +55 -36
- package/docs/ai/components/countdown.md +28 -30
- package/docs/ai/components/cropper.md +33 -33
- package/docs/ai/components/data-card.md +20 -14
- package/docs/ai/components/date-picker.md +40 -47
- package/docs/ai/components/date-range-picker.md +31 -15
- package/docs/ai/components/date-time-picker.md +23 -46
- package/docs/ai/components/diff.md +30 -31
- package/docs/ai/components/divider.md +17 -47
- package/docs/ai/components/doc.md +43 -68
- package/docs/ai/components/draw.md +35 -87
- package/docs/ai/components/drawer.md +48 -77
- package/docs/ai/components/empty-state.md +10 -44
- package/docs/ai/components/estimate.md +33 -58
- package/docs/ai/components/file-gallery.md +48 -100
- package/docs/ai/components/file-upload.md +17 -53
- package/docs/ai/components/flip-card.md +31 -23
- package/docs/ai/components/flow.md +37 -65
- package/docs/ai/components/form-builder.md +35 -75
- package/docs/ai/components/form-layout.md +10 -20
- package/docs/ai/components/funnel.md +33 -48
- package/docs/ai/components/gantt.md +27 -23
- package/docs/ai/components/gauge.md +16 -17
- package/docs/ai/components/grid.md +116 -0
- package/docs/ai/components/heatmap.md +21 -21
- package/docs/ai/components/image.md +7 -13
- package/docs/ai/components/input.md +38 -70
- package/docs/ai/components/invoice.md +35 -36
- package/docs/ai/components/kanban.md +32 -61
- package/docs/ai/components/key-value.md +32 -16
- package/docs/ai/components/kpi.md +38 -73
- package/docs/ai/components/layout.md +29 -23
- package/docs/ai/components/leaderboard.md +28 -37
- package/docs/ai/components/link-preview.md +12 -18
- package/docs/ai/components/link.md +10 -7
- package/docs/ai/components/list.md +21 -5
- package/docs/ai/components/location.md +21 -25
- package/docs/ai/components/login.md +14 -9
- package/docs/ai/components/map.md +27 -33
- package/docs/ai/components/markdown.md +20 -24
- package/docs/ai/components/masonry.md +10 -14
- package/docs/ai/components/mentions.md +26 -12
- package/docs/ai/components/menu.md +54 -52
- package/docs/ai/components/message-strip.md +20 -20
- package/docs/ai/components/metric-table.md +14 -21
- package/docs/ai/components/modal.md +27 -18
- package/docs/ai/components/music-player.md +49 -41
- package/docs/ai/components/nav.md +34 -31
- package/docs/ai/components/network-graph.md +27 -42
- package/docs/ai/components/notification-center.md +31 -33
- package/docs/ai/components/order-tracker.md +36 -27
- package/docs/ai/components/org-chart.md +36 -31
- package/docs/ai/components/pagination.md +34 -26
- package/docs/ai/components/paint.md +53 -91
- package/docs/ai/components/pdf-viewer.md +35 -36
- package/docs/ai/components/permission-matrix.md +26 -31
- package/docs/ai/components/podcast-player.md +64 -70
- package/docs/ai/components/pricing-table.md +37 -48
- package/docs/ai/components/product-card.md +58 -41
- package/docs/ai/components/progress-ring.md +20 -24
- package/docs/ai/components/progress.md +28 -45
- package/docs/ai/components/qr-code.md +25 -27
- package/docs/ai/components/qr-reader.md +20 -23
- package/docs/ai/components/radio.md +17 -15
- package/docs/ai/components/range-slider.md +22 -11
- package/docs/ai/components/rating.md +29 -33
- package/docs/ai/components/receipt.md +50 -127
- package/docs/ai/components/recipe.md +44 -42
- package/docs/ai/components/sankey.md +21 -30
- package/docs/ai/components/scheduler.md +29 -41
- package/docs/ai/components/segmented-control.md +11 -15
- package/docs/ai/components/select.md +58 -102
- package/docs/ai/components/skeleton.md +16 -30
- package/docs/ai/components/slider.md +26 -20
- package/docs/ai/components/sortable.md +25 -27
- package/docs/ai/components/sparkline.md +21 -17
- package/docs/ai/components/spinner.md +9 -5
- package/docs/ai/components/split-button.md +10 -13
- package/docs/ai/components/split-pane.md +19 -14
- package/docs/ai/components/spotlight.md +31 -26
- package/docs/ai/components/spreadsheet.md +51 -97
- package/docs/ai/components/stat-group.md +9 -19
- package/docs/ai/components/step-input.md +17 -15
- package/docs/ai/components/stepper.md +14 -15
- package/docs/ai/components/switch.md +15 -9
- package/docs/ai/components/table.md +24 -84
- package/docs/ai/components/tabs.md +18 -10
- package/docs/ai/components/tag-input.md +18 -29
- package/docs/ai/components/tag.md +10 -22
- package/docs/ai/components/terminal.md +9 -9
- package/docs/ai/components/testimonial.md +9 -19
- package/docs/ai/components/textarea.md +15 -16
- package/docs/ai/components/theme.md +3 -3
- package/docs/ai/components/time-picker.md +30 -49
- package/docs/ai/components/time-range-picker.md +16 -15
- package/docs/ai/components/timeline.md +5 -4
- package/docs/ai/components/timer.md +8 -8
- package/docs/ai/components/toast.md +24 -18
- package/docs/ai/components/tooltip.md +11 -22
- package/docs/ai/components/tree.md +9 -9
- package/docs/ai/components/treemap.md +14 -13
- package/docs/ai/components/user-card.md +21 -27
- package/docs/ai/components/video-player.md +35 -52
- package/docs/ai/components/virtual-scroller.md +1 -1
- package/docs/ai/components/waterfall.md +17 -16
- package/docs/ai/components/weather.md +19 -34
- package/docs/ai/components/work-order.md +58 -134
- package/docs/ai/patterns.md +87 -0
- package/docs/ai/react-integration.md +97 -0
- package/docs/components/accordion.md +72 -151
- package/docs/components/action-bar.md +185 -0
- package/docs/components/activity-feed.md +9 -14
- package/docs/components/alert.md +17 -109
- package/docs/components/app-tiles.md +58 -43
- package/docs/components/approval-flow.md +8 -14
- package/docs/components/audio-recorder.md +45 -51
- package/docs/components/availability.md +30 -45
- package/docs/components/avatar-group.md +34 -14
- package/docs/components/avatar.md +20 -55
- package/docs/components/badge.md +53 -470
- package/docs/components/banner.md +44 -30
- package/docs/components/binpack.md +208 -0
- package/docs/components/book.md +78 -57
- package/docs/components/booking.md +35 -87
- package/docs/components/breadcrumbs.md +74 -448
- package/docs/components/button.md +72 -603
- package/docs/components/calendar.md +77 -261
- package/docs/components/camera-annotate.md +44 -96
- package/docs/components/camera.md +94 -333
- package/docs/components/candlestick.md +79 -116
- package/docs/components/card.md +51 -689
- package/docs/components/carousel.md +29 -76
- package/docs/components/cart.md +44 -136
- package/docs/components/chart.md +95 -438
- package/docs/components/chat.md +175 -439
- package/docs/components/checkbox.md +52 -609
- package/docs/components/chip.md +45 -574
- package/docs/components/code-block.md +157 -421
- package/docs/components/color-display.md +45 -54
- package/docs/components/color-picker.md +103 -36
- package/docs/components/command-palette.md +98 -92
- package/docs/components/comments.md +16 -10
- package/docs/components/countdown.md +15 -20
- package/docs/components/cropper.md +14 -16
- package/docs/components/data-card.md +16 -15
- package/docs/components/date-picker.md +45 -25
- package/docs/components/date-range-picker.md +140 -87
- package/docs/components/date-time-picker.md +25 -28
- package/docs/components/diff.md +22 -17
- package/docs/components/divider.md +18 -20
- package/docs/components/doc.md +105 -197
- package/docs/components/draw.md +117 -223
- package/docs/components/drawer.md +113 -478
- package/docs/components/empty-state.md +13 -29
- package/docs/components/estimate.md +58 -118
- package/docs/components/file-gallery.md +123 -495
- package/docs/components/file-upload.md +36 -123
- package/docs/components/flip-card.md +30 -34
- package/docs/components/flow.md +74 -89
- package/docs/components/form-builder.md +59 -86
- package/docs/components/form-layout.md +21 -31
- package/docs/components/funnel.md +21 -22
- package/docs/components/gantt.md +5 -5
- package/docs/components/gauge.md +5 -23
- package/docs/components/grid.md +249 -0
- package/docs/components/heatmap.md +13 -55
- package/docs/components/image.md +28 -32
- package/docs/components/input.md +25 -14
- package/docs/components/invoice.md +34 -33
- package/docs/components/kanban.md +99 -394
- package/docs/components/key-value.md +22 -12
- package/docs/components/kpi.md +41 -112
- package/docs/components/layout.md +7 -13
- package/docs/components/leaderboard.md +52 -76
- package/docs/components/link-preview.md +20 -16
- package/docs/components/link.md +22 -19
- package/docs/components/list.md +44 -26
- package/docs/components/location.md +9 -13
- package/docs/components/login.md +42 -36
- package/docs/components/map.md +24 -46
- package/docs/components/markdown.md +14 -25
- package/docs/components/masonry.md +15 -13
- package/docs/components/mentions.md +36 -25
- package/docs/components/menu.md +39 -46
- package/docs/components/message-strip.md +15 -51
- package/docs/components/metric-table.md +50 -72
- package/docs/components/modal.md +32 -43
- package/docs/components/music-player.md +41 -49
- package/docs/components/nav.md +23 -13
- package/docs/components/network-graph.md +14 -13
- package/docs/components/notification-center.md +68 -172
- package/docs/components/order-tracker.md +72 -117
- package/docs/components/org-chart.md +58 -207
- package/docs/components/pagination.md +67 -89
- package/docs/components/paint.md +86 -172
- package/docs/components/pdf-viewer.md +46 -151
- package/docs/components/permission-matrix.md +61 -112
- package/docs/components/podcast-player.md +41 -119
- package/docs/components/pricing-table.md +104 -147
- package/docs/components/product-card.md +94 -197
- package/docs/components/progress-ring.md +29 -32
- package/docs/components/progress.md +30 -61
- package/docs/components/qr-code.md +53 -61
- package/docs/components/qr-reader.md +53 -42
- package/docs/components/radio.md +42 -40
- package/docs/components/range-slider.md +41 -30
- package/docs/components/rating.md +50 -84
- package/docs/components/receipt.md +91 -129
- package/docs/components/recipe.md +107 -216
- package/docs/components/sankey.md +47 -83
- package/docs/components/scheduler.md +81 -184
- package/docs/components/segmented-control.md +48 -40
- package/docs/components/select.md +107 -129
- package/docs/components/skeleton.md +33 -47
- package/docs/components/slider.md +49 -53
- package/docs/components/sortable.md +43 -186
- package/docs/components/sparkline.md +26 -25
- package/docs/components/spinner.md +32 -37
- package/docs/components/split-button.md +43 -23
- package/docs/components/split-pane.md +41 -58
- package/docs/components/spotlight.md +53 -145
- package/docs/components/spreadsheet.md +84 -307
- package/docs/components/stat-group.md +27 -61
- package/docs/components/step-input.md +44 -41
- package/docs/components/stepper.md +55 -89
- package/docs/components/switch.md +39 -39
- package/docs/components/table.md +27 -32
- package/docs/components/tabs.md +36 -27
- package/docs/components/tag-input.md +50 -176
- package/docs/components/tag.md +12 -50
- package/docs/components/terminal.md +32 -37
- package/docs/components/testimonial.md +24 -81
- package/docs/components/textarea.md +9 -14
- package/docs/components/theme.md +10 -23
- package/docs/components/time-picker.md +48 -72
- package/docs/components/time-range-picker.md +22 -41
- package/docs/components/timeline.md +7 -14
- package/docs/components/timer.md +16 -32
- package/docs/components/toast.md +19 -45
- package/docs/components/tooltip.md +13 -115
- package/docs/components/tree.md +2 -19
- package/docs/components/treemap.md +19 -43
- package/docs/components/user-card.md +13 -22
- package/docs/components/video-player.md +53 -227
- package/docs/components/virtual-scroller.md +11 -44
- package/docs/components/waterfall.md +58 -137
- package/docs/components/weather.md +94 -153
- package/docs/components/work-order.md +56 -143
- package/docs/plans/2026-03-09-action-bar-design.md +104 -0
- package/docs/plans/2026-03-09-action-bar-plan.md +676 -0
- package/docs/plans/2026-03-10-grid-component-design.md +138 -0
- package/docs/plans/2026-03-10-grid-component-plan.md +716 -0
- package/docs/plans/2026-03-10-react-integration-design.md +166 -0
- package/docs/plans/2026-03-10-react-integration-plan.md +1178 -0
- package/docs/react-integration.md +508 -0
- package/docs/request-response.md +63 -0
- package/package.json +1 -1
- package/bin/templates/base/README.md +0 -33
- package/bin/templates/base/global.d.ts +0 -14
- package/bin/templates/base/index.html +0 -13
- package/bin/templates/base/package.json +0 -21
- package/bin/templates/base/src/components/counter-button.ts +0 -88
- package/bin/templates/base/src/components/counter-button.types.ts +0 -7
- package/bin/templates/base/src/components/feature-card.ts +0 -59
- package/bin/templates/base/src/components/feature-card.types.ts +0 -5
- package/bin/templates/base/src/controllers/counter-controller.ts +0 -24
- package/bin/templates/base/src/main.ts +0 -24
- package/bin/templates/base/src/pages/about-page.ts +0 -68
- package/bin/templates/base/src/pages/home-page.ts +0 -105
- package/bin/templates/base/src/pages/not-found-page.ts +0 -55
- package/bin/templates/base/src/router.ts +0 -9
- package/bin/templates/base/src/styles/global.css +0 -27
- package/bin/templates/base/src/types/api-response.ts +0 -5
- package/bin/templates/base/src/types/status.ts +0 -1
- package/bin/templates/base/src/types/theme.ts +0 -1
- package/bin/templates/base/src/types/user.ts +0 -5
- package/bin/templates/base/vite.config.ts +0 -38
- package/bin/templates/pwa/public/vite.svg +0 -1
- package/bin/templates/pwa/src/router.ts +0 -20
- package/bin/templates/pwa/src/styles/global.css +0 -64
- /package/bin/templates/{pwa → default}/README.md +0 -0
- /package/bin/templates/{pwa → default}/global.d.ts +0 -0
- /package/bin/templates/{pwa → default}/package.json +0 -0
- /package/bin/templates/{pwa → default}/public/icons/.gitkeep +0 -0
- /package/bin/templates/{base → default}/public/vite.svg +0 -0
- /package/bin/templates/{pwa → default}/src/fetcher.ts +0 -0
- /package/bin/templates/{pwa → default}/src/guards/auth.ts +0 -0
- /package/bin/templates/{pwa → default}/src/middleware/auth.ts +0 -0
- /package/bin/templates/{pwa → default}/src/middleware/retry.ts +0 -0
- /package/bin/templates/{pwa → default}/src/services/auth.ts +0 -0
- /package/bin/templates/{pwa → default}/src/services/jwt.ts +0 -0
- /package/bin/templates/{pwa → default}/src/services/storage.ts +0 -0
- /package/bin/templates/{pwa → default}/src/types/auth.ts +0 -0
- /package/bin/templates/{pwa → default}/src/types/notifications.ts +0 -0
- /package/bin/templates/{pwa → default}/tests/helpers/test-utils.ts +0 -0
- /package/bin/templates/{pwa → default}/tests/middleware/auth.test.ts +0 -0
- /package/bin/templates/{pwa → default}/tests/middleware/error.test.ts +0 -0
- /package/bin/templates/{pwa → default}/tests/middleware/retry.test.ts +0 -0
- /package/bin/templates/{pwa → default}/tests/services/auth.test.ts +0 -0
- /package/bin/templates/{pwa → default}/tests/services/jwt.test.ts +0 -0
- /package/bin/templates/{pwa → default}/tests/services/storage.test.ts +0 -0
- /package/bin/templates/{pwa → default}/vite.config.ts +0 -0
- /package/bin/templates/{pwa → default}/vitest.config.ts +0 -0
package/bin/snice.js
CHANGED
|
@@ -34,7 +34,7 @@ if (command === 'create-app') {
|
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
const projectPath = positional[0] || '.';
|
|
37
|
-
const template = flags.template || '
|
|
37
|
+
const template = flags.template || 'default';
|
|
38
38
|
|
|
39
39
|
createApp(projectPath, template);
|
|
40
40
|
} else if (command === 'mcp') {
|
|
@@ -79,14 +79,14 @@ if (command === 'create-app') {
|
|
|
79
79
|
Snice CLI
|
|
80
80
|
|
|
81
81
|
Usage:
|
|
82
|
-
snice create-app
|
|
83
|
-
snice create-app
|
|
82
|
+
snice create-app <project-name> Create a new Snice app
|
|
83
|
+
snice create-app . Initialize in current directory
|
|
84
84
|
snice build-component <component-name> [options] Build CDN component
|
|
85
85
|
snice validate Check project for common issues
|
|
86
86
|
snice mcp Start MCP server for AI assistants
|
|
87
87
|
|
|
88
88
|
Create App Options:
|
|
89
|
-
--template
|
|
89
|
+
--template=react Use React template instead of default
|
|
90
90
|
|
|
91
91
|
Build Component Options:
|
|
92
92
|
--output=<dir> Output directory (default: ./dist/cdn)
|
|
@@ -94,29 +94,24 @@ Build Component Options:
|
|
|
94
94
|
--minify Minify output (default: true)
|
|
95
95
|
--with-theme Include theme.css in output
|
|
96
96
|
|
|
97
|
-
Templates:
|
|
98
|
-
base - Minimal starter with counter example (default)
|
|
99
|
-
pwa - Progressive Web App with auth, middleware, and live notifications
|
|
100
|
-
|
|
101
97
|
MCP Server:
|
|
102
98
|
Start a Model Context Protocol server for AI-assisted development.
|
|
103
99
|
Connect in Claude Code: claude mcp add snice -- npx snice mcp
|
|
104
100
|
|
|
105
101
|
Examples:
|
|
106
102
|
snice create-app my-app
|
|
107
|
-
snice create-app my-app --template=
|
|
103
|
+
snice create-app my-app --template=react
|
|
108
104
|
snice build-component button
|
|
109
105
|
snice build-component button --output=./cdn --format=iife
|
|
110
106
|
snice mcp
|
|
111
107
|
`);
|
|
112
108
|
}
|
|
113
109
|
|
|
114
|
-
function createApp(projectPath, template = '
|
|
110
|
+
function createApp(projectPath, template = 'default') {
|
|
115
111
|
const targetDir = resolve(process.cwd(), projectPath);
|
|
116
112
|
const projectName = projectPath === '.' ? basename(process.cwd()) : basename(targetDir);
|
|
117
113
|
|
|
118
114
|
console.log(`\n🚀 Creating Snice app in ${targetDir}...\n`);
|
|
119
|
-
console.log(`📦 Using template: ${template}\n`);
|
|
120
115
|
|
|
121
116
|
// Check if directory exists and is empty
|
|
122
117
|
if (projectPath !== '.') {
|
|
@@ -145,7 +140,7 @@ function createApp(projectPath, template = 'base') {
|
|
|
145
140
|
// Check if template exists
|
|
146
141
|
if (!existsSync(templateDir)) {
|
|
147
142
|
console.error(`❌ Template "${template}" not found!`);
|
|
148
|
-
console.error(`Available templates:
|
|
143
|
+
console.error(`Available templates: default, react`);
|
|
149
144
|
process.exit(1);
|
|
150
145
|
}
|
|
151
146
|
|
|
@@ -341,4 +336,4 @@ function validateProject() {
|
|
|
341
336
|
console.log(` → Use .types.ts imports to avoid circular dependencies\n`);
|
|
342
337
|
}
|
|
343
338
|
}
|
|
344
|
-
}
|
|
339
|
+
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<meta name="description" content="{{projectName}} - PWA built with Snice" />
|
|
7
|
-
<meta name="theme-color" content="#
|
|
7
|
+
<meta name="theme-color" content="#2563eb" />
|
|
8
8
|
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
|
9
9
|
<link rel="apple-touch-icon" href="/icons/icon-192.png" />
|
|
10
10
|
<title>{{projectName}}</title>
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { element, property, render, styles, context, on, dispatch, html, css, watch, query } from 'snice';
|
|
1
|
+
import { element, property, render, styles, context, on, dispatch, dispose, html, css, watch, query } from 'snice';
|
|
2
2
|
import type { Context } from 'snice';
|
|
3
3
|
import type { Principal, User } from '../types/auth';
|
|
4
|
+
import type { NotificationsDaemon } from '../daemons/notifications';
|
|
4
5
|
import { logout } from '../services/auth';
|
|
5
6
|
|
|
6
7
|
@element('app-header')
|
|
@@ -9,6 +10,8 @@ export class AppHeader extends HTMLElement {
|
|
|
9
10
|
@property() userAvatar = '';
|
|
10
11
|
@property({ type: Boolean }) authenticated = false;
|
|
11
12
|
@property({ type: Boolean }) menuOpen = false;
|
|
13
|
+
@property({ type: Number }) notificationCount = 0;
|
|
14
|
+
private unsubscribeNotifications: (() => void) | null = null;
|
|
12
15
|
|
|
13
16
|
@query('.user-menu') $menu!: HTMLElement;
|
|
14
17
|
|
|
@@ -19,6 +22,21 @@ export class AppHeader extends HTMLElement {
|
|
|
19
22
|
this.authenticated = principal?.isAuthenticated || false;
|
|
20
23
|
this.userName = user?.name || '';
|
|
21
24
|
this.userAvatar = user?.avatar || '';
|
|
25
|
+
|
|
26
|
+
const daemon = ctx.application.notifications as NotificationsDaemon;
|
|
27
|
+
if (daemon && !this.unsubscribeNotifications) {
|
|
28
|
+
this.unsubscribeNotifications = daemon.subscribe(() => {
|
|
29
|
+
this.notificationCount++;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
@dispose()
|
|
35
|
+
cleanupNotifications() {
|
|
36
|
+
if (this.unsubscribeNotifications) {
|
|
37
|
+
this.unsubscribeNotifications();
|
|
38
|
+
this.unsubscribeNotifications = null;
|
|
39
|
+
}
|
|
22
40
|
}
|
|
23
41
|
|
|
24
42
|
@watch('menuOpen')
|
|
@@ -57,7 +75,7 @@ export class AppHeader extends HTMLElement {
|
|
|
57
75
|
<a href="#/dashboard">Dashboard</a>
|
|
58
76
|
<a href="#/data">Data</a>
|
|
59
77
|
<a href="#/notifications">
|
|
60
|
-
<notification-badge></notification-badge>
|
|
78
|
+
<notification-badge .count=${this.notificationCount}></notification-badge>
|
|
61
79
|
Notifications
|
|
62
80
|
</a>
|
|
63
81
|
</nav>
|
|
@@ -109,14 +127,14 @@ export class AppHeader extends HTMLElement {
|
|
|
109
127
|
justify-content: space-between;
|
|
110
128
|
padding: 0 1.5rem;
|
|
111
129
|
height: 60px;
|
|
112
|
-
background: var(--
|
|
113
|
-
border-bottom: 1px solid var(--
|
|
130
|
+
background: var(--snice-color-background);
|
|
131
|
+
border-bottom: 1px solid var(--snice-color-border);
|
|
114
132
|
}
|
|
115
133
|
|
|
116
134
|
.brand a {
|
|
117
135
|
font-size: 1.25rem;
|
|
118
136
|
font-weight: 700;
|
|
119
|
-
color: var(--
|
|
137
|
+
color: var(--snice-color-primary);
|
|
120
138
|
text-decoration: none;
|
|
121
139
|
}
|
|
122
140
|
|
|
@@ -127,7 +145,7 @@ export class AppHeader extends HTMLElement {
|
|
|
127
145
|
}
|
|
128
146
|
|
|
129
147
|
.nav-links a {
|
|
130
|
-
color: var(--text-
|
|
148
|
+
color: var(--snice-color-text-secondary);
|
|
131
149
|
text-decoration: none;
|
|
132
150
|
font-size: 0.875rem;
|
|
133
151
|
font-weight: 500;
|
|
@@ -137,7 +155,7 @@ export class AppHeader extends HTMLElement {
|
|
|
137
155
|
}
|
|
138
156
|
|
|
139
157
|
.nav-links a:hover {
|
|
140
|
-
color: var(--
|
|
158
|
+
color: var(--snice-color-primary);
|
|
141
159
|
}
|
|
142
160
|
|
|
143
161
|
.user-section {
|
|
@@ -152,12 +170,12 @@ export class AppHeader extends HTMLElement {
|
|
|
152
170
|
border: none;
|
|
153
171
|
cursor: pointer;
|
|
154
172
|
padding: 0.375rem 0.5rem;
|
|
155
|
-
border-radius: var(--radius-
|
|
156
|
-
color: var(--
|
|
173
|
+
border-radius: var(--snice-border-radius-lg);
|
|
174
|
+
color: var(--snice-color-text);
|
|
157
175
|
}
|
|
158
176
|
|
|
159
177
|
.user-btn:hover {
|
|
160
|
-
background: var(--
|
|
178
|
+
background: var(--snice-color-background-secondary);
|
|
161
179
|
}
|
|
162
180
|
|
|
163
181
|
.user-name {
|
|
@@ -171,10 +189,10 @@ export class AppHeader extends HTMLElement {
|
|
|
171
189
|
top: 100%;
|
|
172
190
|
margin-top: 0.5rem;
|
|
173
191
|
min-width: 180px;
|
|
174
|
-
background: var(--
|
|
175
|
-
border: 1px solid var(--
|
|
176
|
-
border-radius: var(--radius-
|
|
177
|
-
box-shadow: var(--shadow-lg);
|
|
192
|
+
background: var(--snice-color-background);
|
|
193
|
+
border: 1px solid var(--snice-color-border);
|
|
194
|
+
border-radius: var(--snice-border-radius-lg);
|
|
195
|
+
box-shadow: var(--snice-shadow-lg);
|
|
178
196
|
padding: 0.5rem 0;
|
|
179
197
|
z-index: 100;
|
|
180
198
|
}
|
|
@@ -184,7 +202,7 @@ export class AppHeader extends HTMLElement {
|
|
|
184
202
|
display: block;
|
|
185
203
|
width: 100%;
|
|
186
204
|
padding: 0.5rem 1rem;
|
|
187
|
-
color: var(--
|
|
205
|
+
color: var(--snice-color-text);
|
|
188
206
|
text-decoration: none;
|
|
189
207
|
background: none;
|
|
190
208
|
border: none;
|
|
@@ -195,12 +213,12 @@ export class AppHeader extends HTMLElement {
|
|
|
195
213
|
|
|
196
214
|
.user-menu a:hover,
|
|
197
215
|
.user-menu button:hover {
|
|
198
|
-
background: var(--
|
|
199
|
-
color: var(--
|
|
216
|
+
background: var(--snice-color-background-secondary);
|
|
217
|
+
color: var(--snice-color-primary);
|
|
200
218
|
}
|
|
201
219
|
|
|
202
220
|
.login-link {
|
|
203
|
-
color: var(--
|
|
221
|
+
color: var(--snice-color-primary);
|
|
204
222
|
text-decoration: none;
|
|
205
223
|
font-weight: 500;
|
|
206
224
|
}
|
|
@@ -1,30 +1,11 @@
|
|
|
1
|
-
import { element, property, render, styles,
|
|
2
|
-
import { getNotificationsDaemon } from '../daemons/notifications';
|
|
1
|
+
import { element, property, render, styles, html, css, watch, query } from 'snice';
|
|
3
2
|
|
|
4
3
|
@element('notification-badge')
|
|
5
4
|
export class NotificationBadge extends HTMLElement {
|
|
6
5
|
@property({ type: Number }) count = 0;
|
|
7
6
|
|
|
8
|
-
private unsubscribe: (() => void) | null = null;
|
|
9
|
-
|
|
10
7
|
@query('.badge') $badge!: HTMLElement;
|
|
11
8
|
|
|
12
|
-
@ready()
|
|
13
|
-
initialize() {
|
|
14
|
-
const daemon = getNotificationsDaemon();
|
|
15
|
-
this.unsubscribe = daemon.subscribe(() => {
|
|
16
|
-
this.count++;
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
@dispose()
|
|
21
|
-
cleanup() {
|
|
22
|
-
if (this.unsubscribe) {
|
|
23
|
-
this.unsubscribe();
|
|
24
|
-
this.unsubscribe = null;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
9
|
@watch('count')
|
|
29
10
|
onCountChange() {
|
|
30
11
|
if (this.$badge) {
|
|
@@ -56,7 +37,7 @@ export class NotificationBadge extends HTMLElement {
|
|
|
56
37
|
min-width: 18px;
|
|
57
38
|
height: 18px;
|
|
58
39
|
padding: 0 4px;
|
|
59
|
-
background: var(--
|
|
40
|
+
background: var(--snice-color-danger);
|
|
60
41
|
color: white;
|
|
61
42
|
font-size: 0.6875rem;
|
|
62
43
|
font-weight: 600;
|
|
@@ -52,18 +52,18 @@ export class SearchBar extends HTMLElement {
|
|
|
52
52
|
align-items: center;
|
|
53
53
|
gap: 0.5rem;
|
|
54
54
|
padding: 0.5rem 0.75rem;
|
|
55
|
-
background: var(--
|
|
56
|
-
border: 1px solid var(--
|
|
57
|
-
border-radius: var(--radius-
|
|
55
|
+
background: var(--snice-color-background);
|
|
56
|
+
border: 1px solid var(--snice-color-border);
|
|
57
|
+
border-radius: var(--snice-border-radius-lg);
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
.search-container:focus-within {
|
|
61
|
-
border-color: var(--
|
|
62
|
-
box-shadow: 0 0 0 3px color-mix(in srgb, var(--
|
|
61
|
+
border-color: var(--snice-color-primary);
|
|
62
|
+
box-shadow: 0 0 0 3px color-mix(in srgb, var(--snice-color-primary) 15%, transparent);
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
.icon {
|
|
66
|
-
color: var(--text-
|
|
66
|
+
color: var(--snice-color-text-secondary);
|
|
67
67
|
font-size: 0.875rem;
|
|
68
68
|
}
|
|
69
69
|
|
|
@@ -73,26 +73,26 @@ export class SearchBar extends HTMLElement {
|
|
|
73
73
|
outline: none;
|
|
74
74
|
background: transparent;
|
|
75
75
|
font-size: 0.875rem;
|
|
76
|
-
color: var(--
|
|
76
|
+
color: var(--snice-color-text);
|
|
77
77
|
}
|
|
78
78
|
|
|
79
79
|
input::placeholder {
|
|
80
|
-
color: var(--text-
|
|
80
|
+
color: var(--snice-color-text-secondary);
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
.clear {
|
|
84
84
|
background: none;
|
|
85
85
|
border: none;
|
|
86
86
|
cursor: pointer;
|
|
87
|
-
color: var(--text-
|
|
87
|
+
color: var(--snice-color-text-secondary);
|
|
88
88
|
font-size: 0.75rem;
|
|
89
89
|
padding: 0.125rem 0.25rem;
|
|
90
|
-
border-radius: var(--radius-
|
|
90
|
+
border-radius: var(--snice-border-radius-md);
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
.clear:hover {
|
|
94
|
-
background: var(--
|
|
95
|
-
color: var(--
|
|
94
|
+
background: var(--snice-color-background-secondary);
|
|
95
|
+
color: var(--snice-color-text);
|
|
96
96
|
}
|
|
97
97
|
`;
|
|
98
98
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Principal } from './types/auth';
|
|
2
|
+
import { getUser } from './services/storage';
|
|
3
|
+
import { isAuthenticated } from './services/auth';
|
|
4
|
+
import { NotificationsDaemon } from './daemons/notifications';
|
|
5
|
+
|
|
6
|
+
// In production, use actual WebSocket URL from env
|
|
7
|
+
const wsUrl = import.meta.env.VITE_WS_URL || 'ws://localhost:8080';
|
|
8
|
+
const notifications = new NotificationsDaemon(wsUrl);
|
|
9
|
+
notifications.start();
|
|
10
|
+
|
|
11
|
+
export const appContext = {
|
|
12
|
+
principal: {
|
|
13
|
+
get user() { return getUser(); },
|
|
14
|
+
get isAuthenticated() { return isAuthenticated(); }
|
|
15
|
+
} as Principal,
|
|
16
|
+
notifications
|
|
17
|
+
};
|
|
@@ -1,33 +1,28 @@
|
|
|
1
|
-
import { controller, respond } from 'snice';
|
|
2
|
-
import { getNotificationsDaemon } from '../daemons/notifications';
|
|
1
|
+
import { controller, respond, IController } from 'snice';
|
|
3
2
|
import type { Notification } from '../types/notifications';
|
|
4
3
|
|
|
5
4
|
@controller('notification-controller')
|
|
6
|
-
export class NotificationController {
|
|
7
|
-
element
|
|
5
|
+
export class NotificationController implements IController {
|
|
6
|
+
element: HTMLElement | null = null;
|
|
8
7
|
private notifications: Notification[] = [];
|
|
9
|
-
private unsubscribe: (() => void) | null = null;
|
|
10
8
|
|
|
11
9
|
async attach(el: HTMLElement) {
|
|
12
10
|
this.element = el;
|
|
13
|
-
const daemon = getNotificationsDaemon();
|
|
14
|
-
this.unsubscribe = daemon.subscribe((notification) => {
|
|
15
|
-
this.notifications = [notification, ...this.notifications];
|
|
16
|
-
});
|
|
17
11
|
}
|
|
18
12
|
|
|
19
|
-
async detach() {
|
|
20
|
-
if (this.unsubscribe) {
|
|
21
|
-
this.unsubscribe();
|
|
22
|
-
this.unsubscribe = null;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
13
|
+
async detach() {}
|
|
25
14
|
|
|
26
15
|
@respond('get-notifications')
|
|
27
16
|
handleGetNotifications() {
|
|
28
17
|
return this.notifications;
|
|
29
18
|
}
|
|
30
19
|
|
|
20
|
+
@respond('add-notification')
|
|
21
|
+
handleAddNotification(notification: Notification) {
|
|
22
|
+
this.notifications = [notification, ...this.notifications];
|
|
23
|
+
return { added: true };
|
|
24
|
+
}
|
|
25
|
+
|
|
31
26
|
@respond('clear-notifications')
|
|
32
27
|
handleClearNotifications() {
|
|
33
28
|
this.notifications = [];
|
|
@@ -134,15 +134,3 @@ export class NotificationsDaemon {
|
|
|
134
134
|
}
|
|
135
135
|
}
|
|
136
136
|
}
|
|
137
|
-
|
|
138
|
-
// Singleton instance
|
|
139
|
-
let instance: NotificationsDaemon | null = null;
|
|
140
|
-
|
|
141
|
-
export function getNotificationsDaemon(): NotificationsDaemon {
|
|
142
|
-
if (!instance) {
|
|
143
|
-
// In production, use actual WebSocket URL from env
|
|
144
|
-
const wsUrl = import.meta.env.VITE_WS_URL || 'ws://localhost:8080';
|
|
145
|
-
instance = new NotificationsDaemon(wsUrl);
|
|
146
|
-
}
|
|
147
|
-
return instance;
|
|
148
|
-
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { initialize } from './router';
|
|
2
|
+
import 'snice/components/theme/theme.css';
|
|
2
3
|
import './styles/global.css';
|
|
3
4
|
|
|
4
5
|
// Import snice layout and components
|
|
@@ -32,13 +33,6 @@ import './pages/notifications';
|
|
|
32
33
|
import './pages/settings';
|
|
33
34
|
import './pages/data';
|
|
34
35
|
|
|
35
|
-
// Import and start daemons
|
|
36
|
-
import { getNotificationsDaemon } from './daemons/notifications';
|
|
37
|
-
|
|
38
|
-
// Start notifications daemon
|
|
39
|
-
const notificationsDaemon = getNotificationsDaemon();
|
|
40
|
-
notificationsDaemon.start();
|
|
41
|
-
|
|
42
36
|
// Initialize router
|
|
43
37
|
initialize();
|
|
44
38
|
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { Context } from 'snice';
|
|
2
|
-
import type { Principal } from '../types/auth';
|
|
3
2
|
import { clearToken } from '../services/storage';
|
|
4
3
|
|
|
5
4
|
export async function errorMiddleware(
|
|
@@ -11,13 +10,7 @@ export async function errorMiddleware(
|
|
|
11
10
|
if (response.status === 401) {
|
|
12
11
|
clearToken();
|
|
13
12
|
|
|
14
|
-
//
|
|
15
|
-
if (this.application.principal) {
|
|
16
|
-
const principal = this.application.principal as Principal;
|
|
17
|
-
principal.user = null;
|
|
18
|
-
principal.isAuthenticated = false;
|
|
19
|
-
}
|
|
20
|
-
|
|
13
|
+
// Getters in context will reflect logged-out state since token is cleared
|
|
21
14
|
window.location.href = '#/login';
|
|
22
15
|
throw new Error('Unauthorized - redirecting to login');
|
|
23
16
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { page } from '../router';
|
|
2
|
-
import { render, styles, html, css, context, observe,
|
|
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 {
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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(--
|
|
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-
|
|
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(--
|
|
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-
|
|
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(--
|
|
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(--
|
|
206
|
+
color: var(--snice-color-text);
|
|
208
207
|
}
|
|
209
208
|
|
|
210
209
|
code {
|
|
211
|
-
background: var(--
|
|
210
|
+
background: var(--snice-color-background-secondary);
|
|
212
211
|
padding: 0.125rem 0.375rem;
|
|
213
|
-
border-radius: var(--radius-
|
|
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-
|
|
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(--
|
|
97
|
-
pending: 'var(--
|
|
98
|
-
archived: 'var(--text-
|
|
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-
|
|
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(--
|
|
196
|
+
color: var(--snice-color-primary);
|
|
197
197
|
}
|
|
198
198
|
|
|
199
199
|
.count {
|
|
200
200
|
font-size: 0.875rem;
|
|
201
|
-
color: var(--text-
|
|
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(--
|
|
223
|
-
border-radius: var(--radius-
|
|
224
|
-
background: var(--
|
|
225
|
-
color: var(--text-
|
|
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(--
|
|
233
|
-
color: var(--
|
|
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(--
|
|
238
|
-
border-color: var(--
|
|
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(--
|
|
250
|
-
border-radius: var(--radius-
|
|
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(--
|
|
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-
|
|
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(--
|
|
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(--
|
|
276
|
+
background: var(--snice-color-background-secondary);
|
|
277
277
|
}
|
|
278
278
|
|
|
279
279
|
.col-title strong {
|
|
280
280
|
display: block;
|
|
281
|
-
color: var(--
|
|
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-
|
|
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(--
|
|
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-
|
|
310
|
+
color: var(--snice-color-text-secondary);
|
|
311
311
|
}
|
|
312
312
|
|
|
313
313
|
.data-table.compact .table-header {
|