snice 4.29.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/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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAClE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACpE,YAAY,EACV,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EACjB,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,wBAAwB,EACxB,gBAAgB,EAChB,0BAA0B,EAC3B,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACnG,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACtF,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAClE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACpE,YAAY,EACV,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EACjB,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,wBAAwB,EACxB,gBAAgB,EAChB,0BAA0B,EAC3B,MAAM,SAAS,CAAC;AAGjB,cAAc,cAAc,CAAC"}
|
package/adapters/react/index.js
CHANGED
|
@@ -30,10 +30,11 @@
|
|
|
30
30
|
*
|
|
31
31
|
* @module snice/react
|
|
32
32
|
*/
|
|
33
|
+
export { SniceProvider, useSniceContext, useNavigate, useParams, useRoute } from './SniceProvider';
|
|
34
|
+
export { SniceRouter, Route } from './SniceRouter';
|
|
35
|
+
export { useRequestHandler } from './useRequestHandler';
|
|
33
36
|
export { createReactAdapter, useSniceFormValue } from './wrapper';
|
|
34
37
|
export { kebabToCamel, camelToKebab, extractComponentMetadata, isFormAssociated, waitForComponentDefinition } from './utils';
|
|
35
|
-
// Component adapters will be generated and exported here
|
|
36
|
-
// This is a placeholder for the generated adapters
|
|
37
38
|
// Auto-generated component exports
|
|
38
39
|
export * from './components';
|
|
39
40
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AASlE,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,wBAAwB,EACxB,gBAAgB,EAChB,0BAA0B,EAC3B,MAAM,SAAS,CAAC;AAEjB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEnG,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AASlE,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,wBAAwB,EACxB,gBAAgB,EAChB,0BAA0B,EAC3B,MAAM,SAAS,CAAC;AAEjB,mCAAmC;AACnC,cAAc,cAAc,CAAC"}
|
package/adapters/react/index.ts
CHANGED
|
@@ -31,6 +31,12 @@
|
|
|
31
31
|
* @module snice/react
|
|
32
32
|
*/
|
|
33
33
|
|
|
34
|
+
export { SniceProvider, useSniceContext, useNavigate, useParams, useRoute } from './SniceProvider';
|
|
35
|
+
export type { SniceReactContext, SniceProviderProps, Placard } from './SniceProvider';
|
|
36
|
+
export { SniceRouter, Route } from './SniceRouter';
|
|
37
|
+
export type { SniceRouterProps, RouteProps } from './SniceRouter';
|
|
38
|
+
export { useRequestHandler } from './useRequestHandler';
|
|
39
|
+
|
|
34
40
|
export { createReactAdapter, useSniceFormValue } from './wrapper';
|
|
35
41
|
export type { AdapterConfig, SniceComponentProps } from './wrapper';
|
|
36
42
|
export type {
|
|
@@ -48,8 +54,5 @@ export {
|
|
|
48
54
|
waitForComponentDefinition
|
|
49
55
|
} from './utils';
|
|
50
56
|
|
|
51
|
-
// Component adapters will be generated and exported here
|
|
52
|
-
// This is a placeholder for the generated adapters
|
|
53
|
-
|
|
54
57
|
// Auto-generated component exports
|
|
55
58
|
export * from './components';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type RouteParams } from 'pica-route';
|
|
2
|
+
export interface RouteConfig {
|
|
3
|
+
path: string;
|
|
4
|
+
index: number;
|
|
5
|
+
}
|
|
6
|
+
export interface MatchResult {
|
|
7
|
+
index: number;
|
|
8
|
+
params: RouteParams;
|
|
9
|
+
path: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Match a URL path against an array of route configs.
|
|
13
|
+
* Uses pica-route — same matching as vanilla Snice's Router.
|
|
14
|
+
* Routes are sorted by specificity (longest spec first).
|
|
15
|
+
*/
|
|
16
|
+
export declare function matchRoutes(routes: RouteConfig[], pathname: string): MatchResult | null;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* snice v4.29.0
|
|
3
|
+
* A decorator-driven web component library with differential rendering, routing, controllers, and 130+ ready-made UI components. Use as much or as little as you want. Zero dependencies, works anywhere.
|
|
4
|
+
* (c) 2024
|
|
5
|
+
* Released under the MIT License.
|
|
6
|
+
*/
|
|
7
|
+
import { Route } from 'pica-route';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Match a URL path against an array of route configs.
|
|
11
|
+
* Uses pica-route — same matching as vanilla Snice's Router.
|
|
12
|
+
* Routes are sorted by specificity (longest spec first).
|
|
13
|
+
*/
|
|
14
|
+
function matchRoutes(routes, pathname) {
|
|
15
|
+
// Sort by specificity (longest path first), same as vanilla Router
|
|
16
|
+
const sorted = [...routes].sort((a, b) => b.path.length - a.path.length);
|
|
17
|
+
for (const route of sorted) {
|
|
18
|
+
const matcher = new Route(route.path);
|
|
19
|
+
const params = matcher.match(pathname);
|
|
20
|
+
if (params !== false) {
|
|
21
|
+
return {
|
|
22
|
+
index: route.index,
|
|
23
|
+
params: params,
|
|
24
|
+
path: route.path,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export { matchRoutes };
|
|
32
|
+
//# sourceMappingURL=matchRoute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matchRoute.js","sources":["../../src/react/matchRoute.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;AAaA;;;;AAIG;AACG,SAAU,WAAW,CAAC,MAAqB,EAAE,QAAgB,EAAA;;AAEjE,IAAA,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;AAExE,IAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;QAC1B,MAAM,OAAO,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;QACrC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;AACtC,QAAA,IAAI,MAAM,KAAK,KAAK,EAAE;YACpB,OAAO;gBACL,KAAK,EAAE,KAAK,CAAC,KAAK;AAClB,gBAAA,MAAM,EAAE,MAAqB;gBAC7B,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB;QACH;IACF;AAEA,IAAA,OAAO,IAAI;AACb;;;;"}
|
|
@@ -2,15 +2,9 @@ import React from 'react';
|
|
|
2
2
|
/**
|
|
3
3
|
* Base props that all Snice React components extend
|
|
4
4
|
*/
|
|
5
|
-
export interface SniceBaseProps {
|
|
5
|
+
export interface SniceBaseProps extends React.HTMLAttributes<HTMLElement> {
|
|
6
6
|
/** Ref to the underlying web component element */
|
|
7
7
|
ref?: React.Ref<any>;
|
|
8
|
-
/** Children to render inside the component */
|
|
9
|
-
children?: React.ReactNode;
|
|
10
|
-
/** Class name for styling */
|
|
11
|
-
className?: string;
|
|
12
|
-
/** Inline styles */
|
|
13
|
-
style?: React.CSSProperties;
|
|
14
8
|
}
|
|
15
9
|
/**
|
|
16
10
|
* Props for form-associated Snice components
|
|
@@ -26,14 +20,6 @@ export interface SniceFormProps extends SniceBaseProps {
|
|
|
26
20
|
required?: boolean;
|
|
27
21
|
/** Whether the control is readonly */
|
|
28
22
|
readonly?: boolean;
|
|
29
|
-
/** Callback when value changes */
|
|
30
|
-
onChange?: (event: Event) => void;
|
|
31
|
-
/** Callback on input */
|
|
32
|
-
onInput?: (event: Event) => void;
|
|
33
|
-
/** Callback on blur */
|
|
34
|
-
onBlur?: (event: FocusEvent) => void;
|
|
35
|
-
/** Callback on focus */
|
|
36
|
-
onFocus?: (event: FocusEvent) => void;
|
|
37
23
|
}
|
|
38
24
|
/**
|
|
39
25
|
* Ref type for components with methods
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;GAEG;AACH,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC;IACvE,kDAAkD;IAClD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,cAAc;IACpD,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,sCAAsC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kCAAkC;IAClC,OAAO,EAAE,WAAW,CAAC;IACrB,0BAA0B;IAC1B,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB,yBAAyB;IACzB,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC;IAClB,2CAA2C;IAC3C,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,YAAa,SAAQ,iBAAiB;IACrD,6BAA6B;IAC7B,KAAK,EAAE,GAAG,CAAC;CACZ;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,IAAI,MAAM,IAAI,EAAE,GAChF,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,GACzB,CAAC,CAAC;AAEN;;GAEG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,MAAM,CAAC,EAAE,GAC9E,GAAG,CAAC,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,GACxC,CAAC,CAAC;AAEN;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,GAAG;IACxC,MAAM,EAAE,CAAC,CAAC;CACX;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,GAAG,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC"}
|
package/adapters/react/types.ts
CHANGED
|
@@ -3,15 +3,9 @@ import React from 'react';
|
|
|
3
3
|
/**
|
|
4
4
|
* Base props that all Snice React components extend
|
|
5
5
|
*/
|
|
6
|
-
export interface SniceBaseProps {
|
|
6
|
+
export interface SniceBaseProps extends React.HTMLAttributes<HTMLElement> {
|
|
7
7
|
/** Ref to the underlying web component element */
|
|
8
8
|
ref?: React.Ref<any>;
|
|
9
|
-
/** Children to render inside the component */
|
|
10
|
-
children?: React.ReactNode;
|
|
11
|
-
/** Class name for styling */
|
|
12
|
-
className?: string;
|
|
13
|
-
/** Inline styles */
|
|
14
|
-
style?: React.CSSProperties;
|
|
15
9
|
}
|
|
16
10
|
|
|
17
11
|
/**
|
|
@@ -28,14 +22,6 @@ export interface SniceFormProps extends SniceBaseProps {
|
|
|
28
22
|
required?: boolean;
|
|
29
23
|
/** Whether the control is readonly */
|
|
30
24
|
readonly?: boolean;
|
|
31
|
-
/** Callback when value changes */
|
|
32
|
-
onChange?: (event: Event) => void;
|
|
33
|
-
/** Callback on input */
|
|
34
|
-
onInput?: (event: Event) => void;
|
|
35
|
-
/** Callback on blur */
|
|
36
|
-
onBlur?: (event: FocusEvent) => void;
|
|
37
|
-
/** Callback on focus */
|
|
38
|
-
onFocus?: (event: FocusEvent) => void;
|
|
39
25
|
}
|
|
40
26
|
|
|
41
27
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* snice v4.
|
|
2
|
+
* snice v4.29.0
|
|
3
3
|
* A decorator-driven web component library with differential rendering, routing, controllers, and 130+ ready-made UI components. Use as much or as little as you want. Zero dependencies, works anywhere.
|
|
4
4
|
* (c) 2024
|
|
5
5
|
* Released under the MIT License.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useRequestHandler.js","sources":["../../src/
|
|
1
|
+
{"version":3,"file":"useRequestHandler.js","sources":["../../src/react/useRequestHandler.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCG;AAYH;;;;;;AAMG;SACa,iBAAiB,CAC/B,GAA2C,EAC3C,MAA0B,EAC1B,OAAkC,EAAA;AAElC,IAAA,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;AAChC,IAAA,SAAS,CAAC,OAAO,GAAG,MAAM;AAE1B,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC;AAClC,IAAA,UAAU,CAAC,OAAO,GAAG,OAAO;AAE5B,IAAA,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;IAEzD,SAAS,CAAC,MAAK;AACb,QAAA,MAAM,MAAM,GAAgB,GAAG,EAAE,OAAO,IAAI,QAAQ;QACpD,MAAM,QAAQ,GAAmB,EAAE;QAEnC,KAAK,MAAM,WAAW,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;AACjD,YAAA,IAAI,CAAC,WAAW;gBAAE;AAClB,YAAA,MAAM,SAAS,GAAG,CAAA,SAAA,EAAY,WAAW,EAAE;AAE3C,YAAA,MAAM,QAAQ,GAAG,CAAC,KAAY,KAAI;gBAChC,MAAM,EAAE,GAAG,KAAoB;gBAC/B,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM;AAE9C,gBAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE;oBAChC,EAAE,CAAC,cAAc,EAAE;oBACnB,EAAE,CAAC,wBAAwB,EAAE;oBAC7B,EAAE,CAAC,eAAe,EAAE;gBACtB;gBAEA,SAAS,CAAC,OAAO,EAAE;gBAEnB,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC;gBAC9C,IAAI,CAAC,OAAO,EAAE;oBACZ,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,CAAA,mCAAA,EAAsC,WAAW,CAAA,CAAA,CAAG,CAAC,CAAC;oBAC5E;gBACF;gBAEA,OAAO,CAAC,OAAO;qBACZ,IAAI,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC;AAC3B,qBAAA,IAAI,CAAC,CAAC,MAAW,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;AAC1C,qBAAA,KAAK,CAAC,CAAC,KAAU,KAAI;AACpB,oBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;oBAClB,OAAO,CAAC,KAAK,CAAC,CAAA,6BAAA,EAAgC,WAAW,CAAA,UAAA,CAAY,EAAE,KAAK,CAAC;AAC/E,gBAAA,CAAC,CAAC;AACN,YAAA,CAAC;AAED,YAAA,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC;AAC5C,YAAA,QAAQ,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACtE;AAEA,QAAA,OAAO,MAAK;YACV,KAAK,MAAM,EAAE,IAAI,QAAQ;AAAE,gBAAA,EAAE,EAAE;AACjC,QAAA,CAAC;;AAEH,IAAA,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AACxB;;;;"}
|
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
|
}
|