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.
- 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/components.d.ts +2 -0
- package/adapters/react/components.d.ts.map +1 -1
- package/adapters/react/components.js +1 -0
- package/adapters/react/components.js.map +1 -1
- package/adapters/react/components.ts +2 -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.js +1 -1
- package/adapters/react/useRequestHandler.js.map +1 -1
- 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/snice-action-bar.js +1 -1
- package/dist/cdn/action-bar/snice-action-bar.min.js +1 -1
- 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/snice-binpack.js +1 -1
- package/dist/cdn/binpack/snice-binpack.min.js +1 -1
- 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/snice-button.js +1 -1
- package/dist/cdn/button/snice-button.min.js +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/snice-login.js +1 -1
- package/dist/cdn/login/snice-login.min.js +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 +40 -15
- package/dist/cdn/runtime/snice-runtime.esm.js.map +1 -1
- package/dist/cdn/runtime/snice-runtime.esm.min.js +7 -7
- package/dist/cdn/runtime/snice-runtime.esm.min.js.map +1 -1
- package/dist/cdn/runtime/snice-runtime.js +40 -15
- package/dist/cdn/runtime/snice-runtime.js.map +1 -1
- package/dist/cdn/runtime/snice-runtime.min.js +6 -6
- 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/snice-table.js +1 -1
- package/dist/cdn/table/snice-table.min.js +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/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/index.cjs +37 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.esm.js +37 -12
- package/dist/index.esm.js.map +1 -1
- package/dist/index.iife.js +37 -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.js +1 -1
- package/dist/react/useRequestHandler.js.map +1 -1
- 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/README.md +7 -7
- package/docs/ai/components/grid.md +116 -0
- package/docs/ai/patterns.md +24 -0
- package/docs/ai/react-integration.md +97 -0
- package/docs/components/grid.md +249 -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-plan.md +1178 -0
- package/docs/react-integration.md +508 -0
- package/docs/request-response.md +7 -21
- 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
|
@@ -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 {
|
|
@@ -41,10 +41,7 @@ export class LoginPage extends HTMLElement {
|
|
|
41
41
|
password: credentials.password
|
|
42
42
|
});
|
|
43
43
|
|
|
44
|
-
if (this.ctx
|
|
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(--
|
|
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-
|
|
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,
|
|
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 {
|
|
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
|
-
@
|
|
23
|
-
|
|
24
|
-
const daemon =
|
|
25
|
-
this.unsubscribe
|
|
26
|
-
this.
|
|
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(--
|
|
169
|
+
color: var(--snice-color-primary);
|
|
168
170
|
}
|
|
169
171
|
|
|
170
172
|
.count {
|
|
171
173
|
font-size: 0.8125rem;
|
|
172
|
-
color: var(--text-
|
|
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(--
|
|
184
|
-
border-radius: var(--radius-
|
|
185
|
-
background: var(--
|
|
186
|
-
color: var(--text-
|
|
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(--
|
|
194
|
-
color: var(--
|
|
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(--
|
|
199
|
-
border-color: var(--
|
|
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
|
|
39
|
-
|
|
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(--
|
|
142
|
+
color: var(--snice-color-primary);
|
|
145
143
|
}
|
|
146
144
|
|
|
147
145
|
.email {
|
|
148
146
|
margin: 0 0 1rem 0;
|
|
149
|
-
color: var(--text-
|
|
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(--
|
|
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(--
|
|
180
|
-
border-radius: var(--radius-
|
|
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(--
|
|
183
|
+
color: var(--snice-color-text);
|
|
186
184
|
}
|
|
187
185
|
|
|
188
186
|
.value {
|
|
189
|
-
color: var(--text-
|
|
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-
|
|
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 === '
|
|
59
|
-
document.documentElement.
|
|
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.
|
|
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
|
|
77
|
-
if (
|
|
78
|
-
|
|
79
|
-
|
|
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(--
|
|
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-
|
|
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(--
|
|
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(--
|
|
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(--
|
|
236
|
-
border: 2px solid var(--
|
|
237
|
-
border-radius: var(--radius-
|
|
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(--
|
|
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(--
|
|
245
|
+
border-color: var(--snice-color-primary);
|
|
246
246
|
}
|
|
247
247
|
|
|
248
248
|
.theme-btn.active {
|
|
249
|
-
border-color: var(--
|
|
250
|
-
background: color-mix(in srgb, var(--
|
|
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(--
|
|
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-
|
|
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
|
+
}
|
|
@@ -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
|