snice 4.28.0 → 4.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -10
- package/adapters/react/SniceProvider.d.ts +71 -0
- package/adapters/react/SniceProvider.js +49 -0
- package/adapters/react/SniceProvider.js.map +1 -0
- package/adapters/react/SniceRouter.d.ts +44 -0
- package/adapters/react/SniceRouter.js +190 -0
- package/adapters/react/SniceRouter.js.map +1 -0
- package/adapters/react/action-bar.d.ts +30 -0
- package/adapters/react/action-bar.d.ts.map +1 -0
- package/adapters/react/action-bar.js +24 -0
- package/adapters/react/action-bar.js.map +1 -0
- package/adapters/react/action-bar.tsx +38 -0
- package/adapters/react/binpack.d.ts +35 -0
- package/adapters/react/binpack.d.ts.map +1 -0
- package/adapters/react/binpack.js +24 -0
- package/adapters/react/binpack.js.map +1 -0
- package/adapters/react/binpack.tsx +43 -0
- package/adapters/react/components.d.ts +6 -0
- package/adapters/react/components.d.ts.map +1 -1
- package/adapters/react/components.js +3 -0
- package/adapters/react/components.js.map +1 -1
- package/adapters/react/components.ts +6 -0
- package/adapters/react/grid.d.ts +36 -0
- package/adapters/react/grid.d.ts.map +1 -0
- package/adapters/react/grid.js +24 -0
- package/adapters/react/grid.js.map +1 -0
- package/adapters/react/grid.tsx +44 -0
- package/adapters/react/index.d.ts +5 -0
- package/adapters/react/index.d.ts.map +1 -1
- package/adapters/react/index.js +3 -2
- package/adapters/react/index.js.map +1 -1
- package/adapters/react/index.ts +6 -3
- package/adapters/react/matchRoute.d.ts +16 -0
- package/adapters/react/matchRoute.js +32 -0
- package/adapters/react/matchRoute.js.map +1 -0
- package/adapters/react/types.d.ts +1 -15
- package/adapters/react/types.d.ts.map +1 -1
- package/adapters/react/types.ts +1 -15
- package/adapters/react/useRequestHandler.d.ts +56 -0
- package/adapters/react/useRequestHandler.js +103 -0
- package/adapters/react/useRequestHandler.js.map +1 -0
- package/bin/snice.js +8 -13
- package/bin/templates/{pwa → default}/index.html +1 -1
- package/bin/templates/{pwa → default}/src/components/app-header.ts +36 -18
- package/bin/templates/{pwa → default}/src/components/notification-badge.ts +2 -21
- package/bin/templates/{pwa → default}/src/components/search-bar.ts +12 -12
- package/bin/templates/default/src/context.ts +17 -0
- package/bin/templates/{pwa → default}/src/controllers/notification-controller.ts +10 -15
- package/bin/templates/{pwa → default}/src/daemons/notifications.ts +0 -12
- package/bin/templates/{pwa → default}/src/main.ts +1 -7
- package/bin/templates/{pwa → default}/src/middleware/error.ts +1 -8
- package/bin/templates/{pwa → default}/src/pages/dashboard.ts +17 -18
- package/bin/templates/{pwa → default}/src/pages/data.ts +24 -24
- package/bin/templates/{pwa → default}/src/pages/login.ts +3 -6
- package/bin/templates/{pwa → default}/src/pages/notifications.ts +21 -19
- package/bin/templates/{pwa → default}/src/pages/profile.ts +10 -12
- package/bin/templates/{pwa → default}/src/pages/settings.ts +22 -22
- package/bin/templates/default/src/router.ts +13 -0
- package/bin/templates/default/src/styles/global.css +16 -0
- package/bin/templates/{pwa → default}/tsconfig.json +2 -1
- package/bin/templates/react/README.md +124 -0
- package/bin/templates/react/global.d.ts +10 -0
- package/bin/templates/react/index.html +15 -0
- package/bin/templates/react/package.json +31 -0
- package/bin/templates/react/src/App.tsx +112 -0
- package/bin/templates/react/src/components/AppHeader.tsx +85 -0
- package/bin/templates/react/src/components/AppLayout.tsx +11 -0
- package/bin/templates/react/src/components/NotificationBadge.tsx +13 -0
- package/bin/templates/react/src/components/SearchBar.tsx +63 -0
- package/bin/templates/react/src/daemons/notifications.ts +136 -0
- package/bin/templates/react/src/fetcher.ts +15 -0
- package/bin/templates/react/src/guards/auth.ts +6 -0
- package/bin/templates/react/src/main.tsx +27 -0
- package/bin/templates/react/src/middleware/auth.ts +16 -0
- package/bin/templates/react/src/middleware/error.ts +29 -0
- package/bin/templates/react/src/middleware/retry.ts +31 -0
- package/bin/templates/react/src/pages/DashboardPage.tsx +111 -0
- package/bin/templates/react/src/pages/DataPage.tsx +119 -0
- package/bin/templates/react/src/pages/LoginPage.tsx +46 -0
- package/bin/templates/react/src/pages/NotificationsPage.tsx +119 -0
- package/bin/templates/react/src/pages/ProfilePage.tsx +92 -0
- package/bin/templates/react/src/pages/SettingsPage.tsx +165 -0
- package/bin/templates/react/src/services/auth.ts +48 -0
- package/bin/templates/react/src/services/jwt.ts +35 -0
- package/bin/templates/react/src/services/storage.ts +24 -0
- package/bin/templates/react/src/styles/global.css +382 -0
- package/bin/templates/react/src/types/auth.ts +21 -0
- package/bin/templates/react/src/types/notifications.ts +9 -0
- package/bin/templates/react/tests/helpers/test-utils.ts +79 -0
- package/bin/templates/react/tests/middleware/auth.test.ts +67 -0
- package/bin/templates/react/tests/middleware/error.test.ts +105 -0
- package/bin/templates/react/tests/middleware/retry.test.ts +103 -0
- package/bin/templates/react/tests/services/auth.test.ts +89 -0
- package/bin/templates/react/tests/services/jwt.test.ts +76 -0
- package/bin/templates/react/tests/services/storage.test.ts +69 -0
- package/bin/templates/{base → react}/tsconfig.json +4 -6
- package/bin/templates/react/vite.config.ts +18 -0
- package/bin/templates/react/vitest.config.ts +18 -0
- package/dist/cdn/accordion/snice-accordion.js +1 -1
- package/dist/cdn/accordion/snice-accordion.min.js +1 -1
- package/dist/cdn/action-bar/README.md +27 -0
- package/dist/cdn/action-bar/snice-action-bar.js +249 -0
- package/dist/cdn/action-bar/snice-action-bar.js.map +1 -0
- package/dist/cdn/action-bar/snice-action-bar.min.js +12 -0
- package/dist/cdn/action-bar/snice-action-bar.min.js.map +1 -0
- package/dist/cdn/activity-feed/snice-activity-feed.js +1 -1
- package/dist/cdn/activity-feed/snice-activity-feed.min.js +1 -1
- package/dist/cdn/alert/snice-alert.js +1 -1
- package/dist/cdn/alert/snice-alert.min.js +1 -1
- package/dist/cdn/app-tiles/snice-app-tiles.js +1 -1
- package/dist/cdn/app-tiles/snice-app-tiles.min.js +1 -1
- package/dist/cdn/approval-flow/snice-approval-flow.js +1 -1
- package/dist/cdn/approval-flow/snice-approval-flow.min.js +1 -1
- package/dist/cdn/audio-recorder/snice-audio-recorder.js +1 -1
- package/dist/cdn/audio-recorder/snice-audio-recorder.min.js +1 -1
- package/dist/cdn/availability/snice-availability.js +1 -1
- package/dist/cdn/availability/snice-availability.min.js +1 -1
- package/dist/cdn/avatar/snice-avatar.js +1 -1
- package/dist/cdn/avatar/snice-avatar.min.js +1 -1
- package/dist/cdn/avatar-group/snice-avatar-group.js +1 -1
- package/dist/cdn/avatar-group/snice-avatar-group.min.js +1 -1
- package/dist/cdn/badge/snice-badge.js +1 -1
- package/dist/cdn/badge/snice-badge.min.js +1 -1
- package/dist/cdn/banner/snice-banner.js +1 -1
- package/dist/cdn/banner/snice-banner.min.js +1 -1
- package/dist/cdn/binpack/README.md +27 -0
- package/dist/cdn/binpack/snice-binpack.js +1037 -0
- package/dist/cdn/binpack/snice-binpack.js.map +1 -0
- package/dist/cdn/binpack/snice-binpack.min.js +13 -0
- package/dist/cdn/binpack/snice-binpack.min.js.map +1 -0
- package/dist/cdn/book/snice-book.js +1 -1
- package/dist/cdn/book/snice-book.min.js +1 -1
- package/dist/cdn/booking/snice-booking.js +1 -1
- package/dist/cdn/booking/snice-booking.min.js +1 -1
- package/dist/cdn/breadcrumbs/snice-breadcrumbs.js +1 -1
- package/dist/cdn/breadcrumbs/snice-breadcrumbs.min.js +1 -1
- package/dist/cdn/button/README.md +1 -1
- package/dist/cdn/button/snice-button.js +2 -2
- package/dist/cdn/button/snice-button.js.map +1 -1
- package/dist/cdn/button/snice-button.min.js +2 -2
- package/dist/cdn/button/snice-button.min.js.map +1 -1
- package/dist/cdn/calendar/snice-calendar.js +1 -1
- package/dist/cdn/calendar/snice-calendar.min.js +1 -1
- package/dist/cdn/camera/snice-camera.js +1 -1
- package/dist/cdn/camera/snice-camera.min.js +1 -1
- package/dist/cdn/camera-annotate/snice-camera-annotate.js +1 -1
- package/dist/cdn/camera-annotate/snice-camera-annotate.min.js +1 -1
- package/dist/cdn/candlestick/snice-candlestick.js +1 -1
- package/dist/cdn/candlestick/snice-candlestick.min.js +1 -1
- package/dist/cdn/card/snice-card.js +1 -1
- package/dist/cdn/card/snice-card.min.js +1 -1
- package/dist/cdn/carousel/snice-carousel.js +1 -1
- package/dist/cdn/carousel/snice-carousel.min.js +1 -1
- package/dist/cdn/cart/snice-cart.js +1 -1
- package/dist/cdn/cart/snice-cart.min.js +1 -1
- package/dist/cdn/chart/snice-chart.js +1 -1
- package/dist/cdn/chart/snice-chart.min.js +1 -1
- package/dist/cdn/chat/snice-chat.js +1 -1
- package/dist/cdn/chat/snice-chat.min.js +1 -1
- package/dist/cdn/checkbox/snice-checkbox.js +1 -1
- package/dist/cdn/checkbox/snice-checkbox.min.js +1 -1
- package/dist/cdn/chip/README.md +2 -2
- package/dist/cdn/chip/snice-chip.js +2 -2
- package/dist/cdn/chip/snice-chip.js.map +1 -1
- package/dist/cdn/chip/snice-chip.min.js +3 -3
- package/dist/cdn/chip/snice-chip.min.js.map +1 -1
- package/dist/cdn/code-block/snice-code-block.js +1 -1
- package/dist/cdn/code-block/snice-code-block.min.js +1 -1
- package/dist/cdn/color-display/snice-color-display.js +1 -1
- package/dist/cdn/color-display/snice-color-display.min.js +1 -1
- package/dist/cdn/color-picker/snice-color-picker.js +1 -1
- package/dist/cdn/color-picker/snice-color-picker.min.js +1 -1
- package/dist/cdn/command-palette/snice-command-palette.js +1 -1
- package/dist/cdn/command-palette/snice-command-palette.min.js +1 -1
- package/dist/cdn/comments/snice-comments.js +1 -1
- package/dist/cdn/comments/snice-comments.min.js +1 -1
- package/dist/cdn/countdown/snice-countdown.js +1 -1
- package/dist/cdn/countdown/snice-countdown.min.js +1 -1
- package/dist/cdn/cropper/snice-cropper.js +1 -1
- package/dist/cdn/cropper/snice-cropper.min.js +1 -1
- package/dist/cdn/data-card/snice-data-card.js +1 -1
- package/dist/cdn/data-card/snice-data-card.min.js +1 -1
- package/dist/cdn/date-picker/README.md +1 -1
- package/dist/cdn/date-picker/snice-date-picker.js +2 -2
- package/dist/cdn/date-picker/snice-date-picker.js.map +1 -1
- package/dist/cdn/date-picker/snice-date-picker.min.js +2 -2
- package/dist/cdn/date-picker/snice-date-picker.min.js.map +1 -1
- package/dist/cdn/date-range-picker/README.md +1 -1
- package/dist/cdn/date-range-picker/snice-date-range-picker.js +2 -2
- package/dist/cdn/date-range-picker/snice-date-range-picker.js.map +1 -1
- package/dist/cdn/date-range-picker/snice-date-range-picker.min.js +11 -11
- package/dist/cdn/date-range-picker/snice-date-range-picker.min.js.map +1 -1
- package/dist/cdn/date-time-picker/README.md +1 -1
- package/dist/cdn/date-time-picker/snice-date-time-picker.js +2 -2
- package/dist/cdn/date-time-picker/snice-date-time-picker.js.map +1 -1
- package/dist/cdn/date-time-picker/snice-date-time-picker.min.js +2 -2
- package/dist/cdn/date-time-picker/snice-date-time-picker.min.js.map +1 -1
- package/dist/cdn/diff/snice-diff.js +1 -1
- package/dist/cdn/diff/snice-diff.min.js +1 -1
- package/dist/cdn/divider/snice-divider.js +1 -1
- package/dist/cdn/divider/snice-divider.min.js +1 -1
- package/dist/cdn/doc/snice-doc.js +1 -1
- package/dist/cdn/doc/snice-doc.min.js +1 -1
- package/dist/cdn/draw/README.md +2 -2
- package/dist/cdn/draw/snice-draw.js +26 -4
- package/dist/cdn/draw/snice-draw.js.map +1 -1
- package/dist/cdn/draw/snice-draw.min.js +3 -3
- package/dist/cdn/draw/snice-draw.min.js.map +1 -1
- package/dist/cdn/drawer/snice-drawer.js +1 -1
- package/dist/cdn/drawer/snice-drawer.min.js +1 -1
- package/dist/cdn/empty-state/snice-empty-state.js +1 -1
- package/dist/cdn/empty-state/snice-empty-state.min.js +1 -1
- package/dist/cdn/estimate/snice-estimate.js +1 -1
- package/dist/cdn/estimate/snice-estimate.min.js +1 -1
- package/dist/cdn/file-gallery/snice-file-gallery.js +1 -1
- package/dist/cdn/file-gallery/snice-file-gallery.min.js +1 -1
- package/dist/cdn/file-upload/snice-file-upload.js +1 -1
- package/dist/cdn/file-upload/snice-file-upload.min.js +1 -1
- package/dist/cdn/flip-card/snice-flip-card.js +1 -1
- package/dist/cdn/flip-card/snice-flip-card.min.js +1 -1
- package/dist/cdn/flow/snice-flow.js +1 -1
- package/dist/cdn/flow/snice-flow.min.js +1 -1
- package/dist/cdn/form-layout/snice-form-layout.js +1 -1
- package/dist/cdn/form-layout/snice-form-layout.min.js +1 -1
- package/dist/cdn/funnel/snice-funnel.js +1 -1
- package/dist/cdn/funnel/snice-funnel.min.js +1 -1
- package/dist/cdn/gantt/snice-gantt.js +1 -1
- package/dist/cdn/gantt/snice-gantt.min.js +1 -1
- package/dist/cdn/gauge/snice-gauge.js +1 -1
- package/dist/cdn/gauge/snice-gauge.min.js +1 -1
- package/dist/cdn/grid/README.md +27 -0
- package/dist/cdn/grid/snice-grid.js +862 -0
- package/dist/cdn/grid/snice-grid.js.map +1 -0
- package/dist/cdn/grid/snice-grid.min.js +13 -0
- package/dist/cdn/grid/snice-grid.min.js.map +1 -0
- package/dist/cdn/heatmap/snice-heatmap.js +1 -1
- package/dist/cdn/heatmap/snice-heatmap.min.js +1 -1
- package/dist/cdn/image/snice-image.js +1 -1
- package/dist/cdn/image/snice-image.min.js +1 -1
- package/dist/cdn/input/snice-input.js +1 -1
- package/dist/cdn/input/snice-input.min.js +1 -1
- package/dist/cdn/invoice/snice-invoice.js +1 -1
- package/dist/cdn/invoice/snice-invoice.min.js +1 -1
- package/dist/cdn/kanban/snice-kanban.js +1 -1
- package/dist/cdn/kanban/snice-kanban.min.js +1 -1
- package/dist/cdn/key-value/snice-key-value.js +1 -1
- package/dist/cdn/key-value/snice-key-value.min.js +1 -1
- package/dist/cdn/kpi/snice-kpi.js +1 -1
- package/dist/cdn/kpi/snice-kpi.min.js +1 -1
- package/dist/cdn/layout/snice-layout.js +1 -1
- package/dist/cdn/layout/snice-layout.min.js +1 -1
- package/dist/cdn/leaderboard/snice-leaderboard.js +1 -1
- package/dist/cdn/leaderboard/snice-leaderboard.min.js +1 -1
- package/dist/cdn/link/snice-link.js +1 -1
- package/dist/cdn/link/snice-link.min.js +1 -1
- package/dist/cdn/link-preview/snice-link-preview.js +1 -1
- package/dist/cdn/link-preview/snice-link-preview.min.js +1 -1
- package/dist/cdn/list/snice-list.js +1 -1
- package/dist/cdn/list/snice-list.min.js +1 -1
- package/dist/cdn/location/snice-location.js +1 -1
- package/dist/cdn/location/snice-location.min.js +1 -1
- package/dist/cdn/login/README.md +2 -2
- package/dist/cdn/login/snice-login.js +2 -2
- package/dist/cdn/login/snice-login.js.map +1 -1
- package/dist/cdn/login/snice-login.min.js +2 -2
- package/dist/cdn/login/snice-login.min.js.map +1 -1
- package/dist/cdn/map/snice-map.js +1 -1
- package/dist/cdn/map/snice-map.min.js +1 -1
- package/dist/cdn/markdown/snice-markdown.js +1 -1
- package/dist/cdn/markdown/snice-markdown.min.js +1 -1
- package/dist/cdn/masonry/snice-masonry.js +1 -1
- package/dist/cdn/masonry/snice-masonry.min.js +1 -1
- package/dist/cdn/menu/snice-menu.js +1 -1
- package/dist/cdn/menu/snice-menu.min.js +1 -1
- package/dist/cdn/message-strip/README.md +2 -2
- package/dist/cdn/message-strip/snice-message-strip.js +2 -2
- package/dist/cdn/message-strip/snice-message-strip.js.map +1 -1
- package/dist/cdn/message-strip/snice-message-strip.min.js +6 -6
- package/dist/cdn/message-strip/snice-message-strip.min.js.map +1 -1
- package/dist/cdn/metric-table/snice-metric-table.js +1 -1
- package/dist/cdn/metric-table/snice-metric-table.min.js +1 -1
- package/dist/cdn/modal/snice-modal.js +1 -1
- package/dist/cdn/modal/snice-modal.min.js +1 -1
- package/dist/cdn/music-player/snice-music-player.js +1 -1
- package/dist/cdn/music-player/snice-music-player.min.js +1 -1
- package/dist/cdn/nav/snice-nav.js +1 -1
- package/dist/cdn/nav/snice-nav.min.js +1 -1
- package/dist/cdn/network-graph/snice-network-graph.js +1 -1
- package/dist/cdn/network-graph/snice-network-graph.min.js +1 -1
- package/dist/cdn/notification-center/snice-notification-center.js +1 -1
- package/dist/cdn/notification-center/snice-notification-center.min.js +1 -1
- package/dist/cdn/order-tracker/snice-order-tracker.js +1 -1
- package/dist/cdn/order-tracker/snice-order-tracker.min.js +1 -1
- package/dist/cdn/org-chart/snice-org-chart.js +1 -1
- package/dist/cdn/org-chart/snice-org-chart.min.js +1 -1
- package/dist/cdn/pagination/snice-pagination.js +1 -1
- package/dist/cdn/pagination/snice-pagination.min.js +1 -1
- package/dist/cdn/paint/README.md +2 -2
- package/dist/cdn/paint/snice-paint.js +26 -3
- package/dist/cdn/paint/snice-paint.js.map +1 -1
- package/dist/cdn/paint/snice-paint.min.js +3 -3
- package/dist/cdn/paint/snice-paint.min.js.map +1 -1
- package/dist/cdn/pdf-viewer/snice-pdf-viewer.js +1 -1
- package/dist/cdn/pdf-viewer/snice-pdf-viewer.min.js +1 -1
- package/dist/cdn/permission-matrix/snice-permission-matrix.js +1 -1
- package/dist/cdn/permission-matrix/snice-permission-matrix.min.js +1 -1
- package/dist/cdn/podcast-player/snice-podcast-player.js +1 -1
- package/dist/cdn/podcast-player/snice-podcast-player.min.js +1 -1
- package/dist/cdn/pricing-table/snice-pricing-table.js +1 -1
- package/dist/cdn/pricing-table/snice-pricing-table.min.js +1 -1
- package/dist/cdn/product-card/README.md +1 -1
- package/dist/cdn/product-card/snice-product-card.js +1 -1
- package/dist/cdn/product-card/snice-product-card.min.js +1 -1
- package/dist/cdn/progress/snice-progress.js +1 -1
- package/dist/cdn/progress/snice-progress.min.js +1 -1
- package/dist/cdn/progress-ring/snice-progress-ring.js +1 -1
- package/dist/cdn/progress-ring/snice-progress-ring.min.js +1 -1
- package/dist/cdn/qr-code/snice-qr-code.js +1 -1
- package/dist/cdn/qr-code/snice-qr-code.min.js +1 -1
- package/dist/cdn/qr-reader/snice-qr-reader.js +1 -1
- package/dist/cdn/qr-reader/snice-qr-reader.min.js +1 -1
- package/dist/cdn/radio/snice-radio.js +1 -1
- package/dist/cdn/radio/snice-radio.min.js +1 -1
- package/dist/cdn/range-slider/snice-range-slider.js +1 -1
- package/dist/cdn/range-slider/snice-range-slider.min.js +1 -1
- package/dist/cdn/rating/snice-rating.js +1 -1
- package/dist/cdn/rating/snice-rating.min.js +1 -1
- package/dist/cdn/receipt/snice-receipt.js +1 -1
- package/dist/cdn/receipt/snice-receipt.min.js +1 -1
- package/dist/cdn/recipe/snice-recipe.js +1 -1
- package/dist/cdn/recipe/snice-recipe.min.js +1 -1
- package/dist/cdn/runtime/README.md +2 -2
- package/dist/cdn/runtime/snice-runtime.esm.js +109 -16
- package/dist/cdn/runtime/snice-runtime.esm.js.map +1 -1
- package/dist/cdn/runtime/snice-runtime.esm.min.js +8 -8
- package/dist/cdn/runtime/snice-runtime.esm.min.js.map +1 -1
- package/dist/cdn/runtime/snice-runtime.js +109 -15
- package/dist/cdn/runtime/snice-runtime.js.map +1 -1
- package/dist/cdn/runtime/snice-runtime.min.js +7 -7
- package/dist/cdn/runtime/snice-runtime.min.js.map +1 -1
- package/dist/cdn/sankey/snice-sankey.js +1 -1
- package/dist/cdn/sankey/snice-sankey.min.js +1 -1
- package/dist/cdn/segmented-control/snice-segmented-control.js +1 -1
- package/dist/cdn/segmented-control/snice-segmented-control.min.js +1 -1
- package/dist/cdn/select/snice-select.js +1 -1
- package/dist/cdn/select/snice-select.min.js +1 -1
- package/dist/cdn/skeleton/snice-skeleton.js +1 -1
- package/dist/cdn/skeleton/snice-skeleton.min.js +1 -1
- package/dist/cdn/slider/snice-slider.js +1 -1
- package/dist/cdn/slider/snice-slider.min.js +1 -1
- package/dist/cdn/sortable/snice-sortable.js +1 -1
- package/dist/cdn/sortable/snice-sortable.min.js +1 -1
- package/dist/cdn/sparkline/snice-sparkline.js +1 -1
- package/dist/cdn/sparkline/snice-sparkline.min.js +1 -1
- package/dist/cdn/spinner/snice-spinner.js +1 -1
- package/dist/cdn/spinner/snice-spinner.min.js +1 -1
- package/dist/cdn/split-button/snice-split-button.js +1 -1
- package/dist/cdn/split-button/snice-split-button.min.js +1 -1
- package/dist/cdn/split-pane/snice-split-pane.js +1 -1
- package/dist/cdn/split-pane/snice-split-pane.min.js +1 -1
- package/dist/cdn/spotlight/snice-spotlight.js +1 -1
- package/dist/cdn/spotlight/snice-spotlight.min.js +1 -1
- package/dist/cdn/spreadsheet/snice-spreadsheet.js +1 -1
- package/dist/cdn/spreadsheet/snice-spreadsheet.min.js +1 -1
- package/dist/cdn/stat-group/snice-stat-group.js +1 -1
- package/dist/cdn/stat-group/snice-stat-group.min.js +1 -1
- package/dist/cdn/step-input/snice-step-input.js +1 -1
- package/dist/cdn/step-input/snice-step-input.min.js +1 -1
- package/dist/cdn/stepper/snice-stepper.js +1 -1
- package/dist/cdn/stepper/snice-stepper.min.js +1 -1
- package/dist/cdn/switch/snice-switch.js +1 -1
- package/dist/cdn/switch/snice-switch.min.js +1 -1
- package/dist/cdn/table/README.md +1 -1
- package/dist/cdn/table/snice-table.js +2 -2
- package/dist/cdn/table/snice-table.js.map +1 -1
- package/dist/cdn/table/snice-table.min.js +2 -2
- package/dist/cdn/table/snice-table.min.js.map +1 -1
- package/dist/cdn/tabs/snice-tabs.js +1 -1
- package/dist/cdn/tabs/snice-tabs.min.js +1 -1
- package/dist/cdn/tag/README.md +1 -1
- package/dist/cdn/tag/snice-tag.js +2 -2
- package/dist/cdn/tag/snice-tag.js.map +1 -1
- package/dist/cdn/tag/snice-tag.min.js +3 -3
- package/dist/cdn/tag/snice-tag.min.js.map +1 -1
- package/dist/cdn/tag-input/README.md +2 -2
- package/dist/cdn/tag-input/snice-tag-input.js +2 -2
- package/dist/cdn/tag-input/snice-tag-input.js.map +1 -1
- package/dist/cdn/tag-input/snice-tag-input.min.js +2 -2
- package/dist/cdn/tag-input/snice-tag-input.min.js.map +1 -1
- package/dist/cdn/terminal/snice-terminal.js +1 -1
- package/dist/cdn/terminal/snice-terminal.min.js +1 -1
- package/dist/cdn/testimonial/snice-testimonial.js +1 -1
- package/dist/cdn/testimonial/snice-testimonial.min.js +1 -1
- package/dist/cdn/textarea/snice-textarea.js +1 -1
- package/dist/cdn/textarea/snice-textarea.min.js +1 -1
- package/dist/cdn/time-picker/README.md +1 -1
- package/dist/cdn/time-picker/snice-time-picker.js +2 -2
- package/dist/cdn/time-picker/snice-time-picker.js.map +1 -1
- package/dist/cdn/time-picker/snice-time-picker.min.js +2 -2
- package/dist/cdn/time-picker/snice-time-picker.min.js.map +1 -1
- package/dist/cdn/time-range-picker/snice-time-range-picker.js +1 -1
- package/dist/cdn/time-range-picker/snice-time-range-picker.min.js +1 -1
- package/dist/cdn/timeline/snice-timeline.js +1 -1
- package/dist/cdn/timeline/snice-timeline.min.js +1 -1
- package/dist/cdn/timer/snice-timer.js +1 -1
- package/dist/cdn/timer/snice-timer.min.js +1 -1
- package/dist/cdn/toast/README.md +1 -1
- package/dist/cdn/toast/snice-toast.js +7 -3
- package/dist/cdn/toast/snice-toast.js.map +1 -1
- package/dist/cdn/toast/snice-toast.min.js +6 -6
- package/dist/cdn/toast/snice-toast.min.js.map +1 -1
- package/dist/cdn/tooltip/snice-tooltip.js +1 -1
- package/dist/cdn/tooltip/snice-tooltip.min.js +1 -1
- package/dist/cdn/tree/snice-tree.js +1 -1
- package/dist/cdn/tree/snice-tree.min.js +1 -1
- package/dist/cdn/treemap/snice-treemap.js +1 -1
- package/dist/cdn/treemap/snice-treemap.min.js +1 -1
- package/dist/cdn/user-card/snice-user-card.js +1 -1
- package/dist/cdn/user-card/snice-user-card.min.js +1 -1
- package/dist/cdn/video-player/snice-video-player.js +1 -1
- package/dist/cdn/video-player/snice-video-player.min.js +1 -1
- package/dist/cdn/virtual-scroller/snice-virtual-scroller.js +1 -1
- package/dist/cdn/virtual-scroller/snice-virtual-scroller.min.js +1 -1
- package/dist/cdn/waterfall/README.md +1 -1
- package/dist/cdn/waterfall/snice-waterfall.js +1 -1
- package/dist/cdn/waterfall/snice-waterfall.min.js +1 -1
- package/dist/cdn/weather/snice-weather.js +1 -1
- package/dist/cdn/weather/snice-weather.min.js +1 -1
- package/dist/cdn/work-order/snice-work-order.js +1 -1
- package/dist/cdn/work-order/snice-work-order.min.js +1 -1
- package/dist/components/action-bar/snice-action-bar.d.ts +22 -0
- package/dist/components/action-bar/snice-action-bar.js +182 -0
- package/dist/components/action-bar/snice-action-bar.js.map +1 -0
- package/dist/components/action-bar/snice-action-bar.types.d.ts +17 -0
- package/dist/components/binpack/snice-binpack.d.ts +82 -0
- package/dist/components/binpack/snice-binpack.js +970 -0
- package/dist/components/binpack/snice-binpack.js.map +1 -0
- package/dist/components/binpack/snice-binpack.types.d.ts +52 -0
- package/dist/components/button/snice-button.js +1 -1
- package/dist/components/button/snice-button.js.map +1 -1
- package/dist/components/chip/snice-chip.js +1 -1
- package/dist/components/chip/snice-chip.js.map +1 -1
- package/dist/components/date-picker/snice-date-picker.js +1 -1
- package/dist/components/date-picker/snice-date-picker.js.map +1 -1
- package/dist/components/date-range-picker/snice-date-range-picker.js +1 -1
- package/dist/components/date-range-picker/snice-date-range-picker.js.map +1 -1
- package/dist/components/date-time-picker/snice-date-time-picker.js +1 -1
- package/dist/components/date-time-picker/snice-date-time-picker.js.map +1 -1
- package/dist/components/draw/snice-draw.d.ts +2 -0
- package/dist/components/draw/snice-draw.js +25 -3
- package/dist/components/draw/snice-draw.js.map +1 -1
- package/dist/components/grid/snice-grid.d.ts +73 -0
- package/dist/components/grid/snice-grid.js +795 -0
- package/dist/components/grid/snice-grid.js.map +1 -0
- package/dist/components/grid/snice-grid.types.d.ts +41 -0
- package/dist/components/message-strip/snice-message-strip.js +1 -1
- package/dist/components/message-strip/snice-message-strip.js.map +1 -1
- package/dist/components/paint/snice-paint.d.ts +2 -0
- package/dist/components/paint/snice-paint.js +25 -2
- package/dist/components/paint/snice-paint.js.map +1 -1
- package/dist/components/tag/snice-tag.js +1 -1
- package/dist/components/tag/snice-tag.js.map +1 -1
- package/dist/components/tag-input/snice-tag-input.js +1 -1
- package/dist/components/tag-input/snice-tag-input.js.map +1 -1
- package/dist/components/theme/theme.css +15 -0
- package/dist/components/time-picker/snice-time-picker.js +1 -1
- package/dist/components/time-picker/snice-time-picker.js.map +1 -1
- package/dist/components/toast/snice-toast-container.js +4 -0
- package/dist/components/toast/snice-toast-container.js.map +1 -1
- package/dist/components/toast/snice-toast.js +2 -2
- package/dist/create-request-handler.d.ts +42 -0
- package/dist/index.cjs +106 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.esm.js +106 -13
- package/dist/index.esm.js.map +1 -1
- package/dist/index.iife.js +106 -12
- package/dist/index.iife.js.map +1 -1
- package/dist/react/SniceProvider.d.ts +71 -0
- package/dist/react/SniceProvider.js +49 -0
- package/dist/react/SniceProvider.js.map +1 -0
- package/dist/react/SniceRouter.d.ts +44 -0
- package/dist/react/SniceRouter.js +190 -0
- package/dist/react/SniceRouter.js.map +1 -0
- package/dist/react/index.d.ts +3 -0
- package/dist/react/index.js +14 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/matchRoute.d.ts +16 -0
- package/dist/react/matchRoute.js +32 -0
- package/dist/react/matchRoute.js.map +1 -0
- package/dist/react/useRequestHandler.d.ts +56 -0
- package/dist/react/useRequestHandler.js +103 -0
- package/dist/react/useRequestHandler.js.map +1 -0
- package/dist/symbols.cjs +1 -1
- package/dist/symbols.esm.js +1 -1
- package/dist/transitions.cjs +1 -1
- package/dist/transitions.esm.js +1 -1
- package/dist/types/guard.d.ts +4 -11
- package/docs/ai/DEVELOPMENT.md +1 -1
- package/docs/ai/README.md +7 -7
- package/docs/ai/components/accordion.md +46 -80
- package/docs/ai/components/action-bar.md +75 -0
- package/docs/ai/components/activity-feed.md +7 -7
- package/docs/ai/components/alert.md +26 -44
- package/docs/ai/components/app-tiles.md +34 -39
- package/docs/ai/components/approval-flow.md +1 -1
- package/docs/ai/components/audio-recorder.md +35 -67
- package/docs/ai/components/availability.md +13 -34
- package/docs/ai/components/avatar-group.md +26 -13
- package/docs/ai/components/avatar.md +52 -36
- package/docs/ai/components/badge.md +21 -32
- package/docs/ai/components/banner.md +21 -43
- package/docs/ai/components/binpack.md +89 -0
- package/docs/ai/components/book.md +25 -23
- package/docs/ai/components/booking.md +31 -36
- package/docs/ai/components/breadcrumbs.md +36 -11
- package/docs/ai/components/button.md +33 -44
- package/docs/ai/components/calendar.md +37 -70
- package/docs/ai/components/camera-annotate.md +31 -64
- package/docs/ai/components/camera.md +38 -120
- package/docs/ai/components/candlestick.md +32 -52
- package/docs/ai/components/card.md +20 -30
- package/docs/ai/components/carousel.md +32 -32
- package/docs/ai/components/cart.md +24 -29
- package/docs/ai/components/chart.md +29 -114
- package/docs/ai/components/chat.md +38 -75
- package/docs/ai/components/checkbox.md +22 -41
- package/docs/ai/components/chip.md +18 -54
- package/docs/ai/components/code-block.md +57 -178
- package/docs/ai/components/color-display.md +12 -32
- package/docs/ai/components/color-picker.md +17 -39
- package/docs/ai/components/command-palette.md +49 -71
- package/docs/ai/components/comments.md +55 -36
- package/docs/ai/components/countdown.md +28 -30
- package/docs/ai/components/cropper.md +33 -33
- package/docs/ai/components/data-card.md +20 -14
- package/docs/ai/components/date-picker.md +40 -47
- package/docs/ai/components/date-range-picker.md +31 -15
- package/docs/ai/components/date-time-picker.md +23 -46
- package/docs/ai/components/diff.md +30 -31
- package/docs/ai/components/divider.md +17 -47
- package/docs/ai/components/doc.md +43 -68
- package/docs/ai/components/draw.md +35 -87
- package/docs/ai/components/drawer.md +48 -77
- package/docs/ai/components/empty-state.md +10 -44
- package/docs/ai/components/estimate.md +33 -58
- package/docs/ai/components/file-gallery.md +48 -100
- package/docs/ai/components/file-upload.md +17 -53
- package/docs/ai/components/flip-card.md +31 -23
- package/docs/ai/components/flow.md +37 -65
- package/docs/ai/components/form-builder.md +35 -75
- package/docs/ai/components/form-layout.md +10 -20
- package/docs/ai/components/funnel.md +33 -48
- package/docs/ai/components/gantt.md +27 -23
- package/docs/ai/components/gauge.md +16 -17
- package/docs/ai/components/grid.md +116 -0
- package/docs/ai/components/heatmap.md +21 -21
- package/docs/ai/components/image.md +7 -13
- package/docs/ai/components/input.md +38 -70
- package/docs/ai/components/invoice.md +35 -36
- package/docs/ai/components/kanban.md +32 -61
- package/docs/ai/components/key-value.md +32 -16
- package/docs/ai/components/kpi.md +38 -73
- package/docs/ai/components/layout.md +29 -23
- package/docs/ai/components/leaderboard.md +28 -37
- package/docs/ai/components/link-preview.md +12 -18
- package/docs/ai/components/link.md +10 -7
- package/docs/ai/components/list.md +21 -5
- package/docs/ai/components/location.md +21 -25
- package/docs/ai/components/login.md +14 -9
- package/docs/ai/components/map.md +27 -33
- package/docs/ai/components/markdown.md +20 -24
- package/docs/ai/components/masonry.md +10 -14
- package/docs/ai/components/mentions.md +26 -12
- package/docs/ai/components/menu.md +54 -52
- package/docs/ai/components/message-strip.md +20 -20
- package/docs/ai/components/metric-table.md +14 -21
- package/docs/ai/components/modal.md +27 -18
- package/docs/ai/components/music-player.md +49 -41
- package/docs/ai/components/nav.md +34 -31
- package/docs/ai/components/network-graph.md +27 -42
- package/docs/ai/components/notification-center.md +31 -33
- package/docs/ai/components/order-tracker.md +36 -27
- package/docs/ai/components/org-chart.md +36 -31
- package/docs/ai/components/pagination.md +34 -26
- package/docs/ai/components/paint.md +53 -91
- package/docs/ai/components/pdf-viewer.md +35 -36
- package/docs/ai/components/permission-matrix.md +26 -31
- package/docs/ai/components/podcast-player.md +64 -70
- package/docs/ai/components/pricing-table.md +37 -48
- package/docs/ai/components/product-card.md +58 -41
- package/docs/ai/components/progress-ring.md +20 -24
- package/docs/ai/components/progress.md +28 -45
- package/docs/ai/components/qr-code.md +25 -27
- package/docs/ai/components/qr-reader.md +20 -23
- package/docs/ai/components/radio.md +17 -15
- package/docs/ai/components/range-slider.md +22 -11
- package/docs/ai/components/rating.md +29 -33
- package/docs/ai/components/receipt.md +50 -127
- package/docs/ai/components/recipe.md +44 -42
- package/docs/ai/components/sankey.md +21 -30
- package/docs/ai/components/scheduler.md +29 -41
- package/docs/ai/components/segmented-control.md +11 -15
- package/docs/ai/components/select.md +58 -102
- package/docs/ai/components/skeleton.md +16 -30
- package/docs/ai/components/slider.md +26 -20
- package/docs/ai/components/sortable.md +25 -27
- package/docs/ai/components/sparkline.md +21 -17
- package/docs/ai/components/spinner.md +9 -5
- package/docs/ai/components/split-button.md +10 -13
- package/docs/ai/components/split-pane.md +19 -14
- package/docs/ai/components/spotlight.md +31 -26
- package/docs/ai/components/spreadsheet.md +51 -97
- package/docs/ai/components/stat-group.md +9 -19
- package/docs/ai/components/step-input.md +17 -15
- package/docs/ai/components/stepper.md +14 -15
- package/docs/ai/components/switch.md +15 -9
- package/docs/ai/components/table.md +24 -84
- package/docs/ai/components/tabs.md +18 -10
- package/docs/ai/components/tag-input.md +18 -29
- package/docs/ai/components/tag.md +10 -22
- package/docs/ai/components/terminal.md +9 -9
- package/docs/ai/components/testimonial.md +9 -19
- package/docs/ai/components/textarea.md +15 -16
- package/docs/ai/components/theme.md +3 -3
- package/docs/ai/components/time-picker.md +30 -49
- package/docs/ai/components/time-range-picker.md +16 -15
- package/docs/ai/components/timeline.md +5 -4
- package/docs/ai/components/timer.md +8 -8
- package/docs/ai/components/toast.md +24 -18
- package/docs/ai/components/tooltip.md +11 -22
- package/docs/ai/components/tree.md +9 -9
- package/docs/ai/components/treemap.md +14 -13
- package/docs/ai/components/user-card.md +21 -27
- package/docs/ai/components/video-player.md +35 -52
- package/docs/ai/components/virtual-scroller.md +1 -1
- package/docs/ai/components/waterfall.md +17 -16
- package/docs/ai/components/weather.md +19 -34
- package/docs/ai/components/work-order.md +58 -134
- package/docs/ai/patterns.md +87 -0
- package/docs/ai/react-integration.md +97 -0
- package/docs/components/accordion.md +72 -151
- package/docs/components/action-bar.md +185 -0
- package/docs/components/activity-feed.md +9 -14
- package/docs/components/alert.md +17 -109
- package/docs/components/app-tiles.md +58 -43
- package/docs/components/approval-flow.md +8 -14
- package/docs/components/audio-recorder.md +45 -51
- package/docs/components/availability.md +30 -45
- package/docs/components/avatar-group.md +34 -14
- package/docs/components/avatar.md +20 -55
- package/docs/components/badge.md +53 -470
- package/docs/components/banner.md +44 -30
- package/docs/components/binpack.md +208 -0
- package/docs/components/book.md +78 -57
- package/docs/components/booking.md +35 -87
- package/docs/components/breadcrumbs.md +74 -448
- package/docs/components/button.md +72 -603
- package/docs/components/calendar.md +77 -261
- package/docs/components/camera-annotate.md +44 -96
- package/docs/components/camera.md +94 -333
- package/docs/components/candlestick.md +79 -116
- package/docs/components/card.md +51 -689
- package/docs/components/carousel.md +29 -76
- package/docs/components/cart.md +44 -136
- package/docs/components/chart.md +95 -438
- package/docs/components/chat.md +175 -439
- package/docs/components/checkbox.md +52 -609
- package/docs/components/chip.md +45 -574
- package/docs/components/code-block.md +157 -421
- package/docs/components/color-display.md +45 -54
- package/docs/components/color-picker.md +103 -36
- package/docs/components/command-palette.md +98 -92
- package/docs/components/comments.md +16 -10
- package/docs/components/countdown.md +15 -20
- package/docs/components/cropper.md +14 -16
- package/docs/components/data-card.md +16 -15
- package/docs/components/date-picker.md +45 -25
- package/docs/components/date-range-picker.md +140 -87
- package/docs/components/date-time-picker.md +25 -28
- package/docs/components/diff.md +22 -17
- package/docs/components/divider.md +18 -20
- package/docs/components/doc.md +105 -197
- package/docs/components/draw.md +117 -223
- package/docs/components/drawer.md +113 -478
- package/docs/components/empty-state.md +13 -29
- package/docs/components/estimate.md +58 -118
- package/docs/components/file-gallery.md +123 -495
- package/docs/components/file-upload.md +36 -123
- package/docs/components/flip-card.md +30 -34
- package/docs/components/flow.md +74 -89
- package/docs/components/form-builder.md +59 -86
- package/docs/components/form-layout.md +21 -31
- package/docs/components/funnel.md +21 -22
- package/docs/components/gantt.md +5 -5
- package/docs/components/gauge.md +5 -23
- package/docs/components/grid.md +249 -0
- package/docs/components/heatmap.md +13 -55
- package/docs/components/image.md +28 -32
- package/docs/components/input.md +25 -14
- package/docs/components/invoice.md +34 -33
- package/docs/components/kanban.md +99 -394
- package/docs/components/key-value.md +22 -12
- package/docs/components/kpi.md +41 -112
- package/docs/components/layout.md +7 -13
- package/docs/components/leaderboard.md +52 -76
- package/docs/components/link-preview.md +20 -16
- package/docs/components/link.md +22 -19
- package/docs/components/list.md +44 -26
- package/docs/components/location.md +9 -13
- package/docs/components/login.md +42 -36
- package/docs/components/map.md +24 -46
- package/docs/components/markdown.md +14 -25
- package/docs/components/masonry.md +15 -13
- package/docs/components/mentions.md +36 -25
- package/docs/components/menu.md +39 -46
- package/docs/components/message-strip.md +15 -51
- package/docs/components/metric-table.md +50 -72
- package/docs/components/modal.md +32 -43
- package/docs/components/music-player.md +41 -49
- package/docs/components/nav.md +23 -13
- package/docs/components/network-graph.md +14 -13
- package/docs/components/notification-center.md +68 -172
- package/docs/components/order-tracker.md +72 -117
- package/docs/components/org-chart.md +58 -207
- package/docs/components/pagination.md +67 -89
- package/docs/components/paint.md +86 -172
- package/docs/components/pdf-viewer.md +46 -151
- package/docs/components/permission-matrix.md +61 -112
- package/docs/components/podcast-player.md +41 -119
- package/docs/components/pricing-table.md +104 -147
- package/docs/components/product-card.md +94 -197
- package/docs/components/progress-ring.md +29 -32
- package/docs/components/progress.md +30 -61
- package/docs/components/qr-code.md +53 -61
- package/docs/components/qr-reader.md +53 -42
- package/docs/components/radio.md +42 -40
- package/docs/components/range-slider.md +41 -30
- package/docs/components/rating.md +50 -84
- package/docs/components/receipt.md +91 -129
- package/docs/components/recipe.md +107 -216
- package/docs/components/sankey.md +47 -83
- package/docs/components/scheduler.md +81 -184
- package/docs/components/segmented-control.md +48 -40
- package/docs/components/select.md +107 -129
- package/docs/components/skeleton.md +33 -47
- package/docs/components/slider.md +49 -53
- package/docs/components/sortable.md +43 -186
- package/docs/components/sparkline.md +26 -25
- package/docs/components/spinner.md +32 -37
- package/docs/components/split-button.md +43 -23
- package/docs/components/split-pane.md +41 -58
- package/docs/components/spotlight.md +53 -145
- package/docs/components/spreadsheet.md +84 -307
- package/docs/components/stat-group.md +27 -61
- package/docs/components/step-input.md +44 -41
- package/docs/components/stepper.md +55 -89
- package/docs/components/switch.md +39 -39
- package/docs/components/table.md +27 -32
- package/docs/components/tabs.md +36 -27
- package/docs/components/tag-input.md +50 -176
- package/docs/components/tag.md +12 -50
- package/docs/components/terminal.md +32 -37
- package/docs/components/testimonial.md +24 -81
- package/docs/components/textarea.md +9 -14
- package/docs/components/theme.md +10 -23
- package/docs/components/time-picker.md +48 -72
- package/docs/components/time-range-picker.md +22 -41
- package/docs/components/timeline.md +7 -14
- package/docs/components/timer.md +16 -32
- package/docs/components/toast.md +19 -45
- package/docs/components/tooltip.md +13 -115
- package/docs/components/tree.md +2 -19
- package/docs/components/treemap.md +19 -43
- package/docs/components/user-card.md +13 -22
- package/docs/components/video-player.md +53 -227
- package/docs/components/virtual-scroller.md +11 -44
- package/docs/components/waterfall.md +58 -137
- package/docs/components/weather.md +94 -153
- package/docs/components/work-order.md +56 -143
- package/docs/plans/2026-03-09-action-bar-design.md +104 -0
- package/docs/plans/2026-03-09-action-bar-plan.md +676 -0
- package/docs/plans/2026-03-10-grid-component-design.md +138 -0
- package/docs/plans/2026-03-10-grid-component-plan.md +716 -0
- package/docs/plans/2026-03-10-react-integration-design.md +166 -0
- package/docs/plans/2026-03-10-react-integration-plan.md +1178 -0
- package/docs/react-integration.md +508 -0
- package/docs/request-response.md +63 -0
- package/package.json +1 -1
- package/bin/templates/base/README.md +0 -33
- package/bin/templates/base/global.d.ts +0 -14
- package/bin/templates/base/index.html +0 -13
- package/bin/templates/base/package.json +0 -21
- package/bin/templates/base/src/components/counter-button.ts +0 -88
- package/bin/templates/base/src/components/counter-button.types.ts +0 -7
- package/bin/templates/base/src/components/feature-card.ts +0 -59
- package/bin/templates/base/src/components/feature-card.types.ts +0 -5
- package/bin/templates/base/src/controllers/counter-controller.ts +0 -24
- package/bin/templates/base/src/main.ts +0 -24
- package/bin/templates/base/src/pages/about-page.ts +0 -68
- package/bin/templates/base/src/pages/home-page.ts +0 -105
- package/bin/templates/base/src/pages/not-found-page.ts +0 -55
- package/bin/templates/base/src/router.ts +0 -9
- package/bin/templates/base/src/styles/global.css +0 -27
- package/bin/templates/base/src/types/api-response.ts +0 -5
- package/bin/templates/base/src/types/status.ts +0 -1
- package/bin/templates/base/src/types/theme.ts +0 -1
- package/bin/templates/base/src/types/user.ts +0 -5
- package/bin/templates/base/vite.config.ts +0 -38
- package/bin/templates/pwa/public/vite.svg +0 -1
- package/bin/templates/pwa/src/router.ts +0 -20
- package/bin/templates/pwa/src/styles/global.css +0 -64
- /package/bin/templates/{pwa → default}/README.md +0 -0
- /package/bin/templates/{pwa → default}/global.d.ts +0 -0
- /package/bin/templates/{pwa → default}/package.json +0 -0
- /package/bin/templates/{pwa → default}/public/icons/.gitkeep +0 -0
- /package/bin/templates/{base → default}/public/vite.svg +0 -0
- /package/bin/templates/{pwa → default}/src/fetcher.ts +0 -0
- /package/bin/templates/{pwa → default}/src/guards/auth.ts +0 -0
- /package/bin/templates/{pwa → default}/src/middleware/auth.ts +0 -0
- /package/bin/templates/{pwa → default}/src/middleware/retry.ts +0 -0
- /package/bin/templates/{pwa → default}/src/services/auth.ts +0 -0
- /package/bin/templates/{pwa → default}/src/services/jwt.ts +0 -0
- /package/bin/templates/{pwa → default}/src/services/storage.ts +0 -0
- /package/bin/templates/{pwa → default}/src/types/auth.ts +0 -0
- /package/bin/templates/{pwa → default}/src/types/notifications.ts +0 -0
- /package/bin/templates/{pwa → default}/tests/helpers/test-utils.ts +0 -0
- /package/bin/templates/{pwa → default}/tests/middleware/auth.test.ts +0 -0
- /package/bin/templates/{pwa → default}/tests/middleware/error.test.ts +0 -0
- /package/bin/templates/{pwa → default}/tests/middleware/retry.test.ts +0 -0
- /package/bin/templates/{pwa → default}/tests/services/auth.test.ts +0 -0
- /package/bin/templates/{pwa → default}/tests/services/jwt.test.ts +0 -0
- /package/bin/templates/{pwa → default}/tests/services/storage.test.ts +0 -0
- /package/bin/templates/{pwa → default}/vite.config.ts +0 -0
- /package/bin/templates/{pwa → default}/vitest.config.ts +0 -0
|
@@ -1,26 +1,20 @@
|
|
|
1
|
-
<!-- AI: For
|
|
1
|
+
<!-- AI: For the AI-optimized version of this doc, see docs/ai/components/spreadsheet.md -->
|
|
2
2
|
|
|
3
|
-
# Spreadsheet
|
|
3
|
+
# Spreadsheet
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
An Excel-like editable grid with formula support, multi-cell range selection, undo/redo, column resizing, context menus, copy/paste, and auto-expanding rows and columns.
|
|
6
6
|
|
|
7
7
|
## Table of Contents
|
|
8
|
+
|
|
8
9
|
- [Properties](#properties)
|
|
9
10
|
- [Methods](#methods)
|
|
10
11
|
- [Events](#events)
|
|
11
|
-
- [CSS Custom Properties](#css-custom-properties)
|
|
12
12
|
- [CSS Parts](#css-parts)
|
|
13
|
+
- [CSS Custom Properties](#css-custom-properties)
|
|
13
14
|
- [Basic Usage](#basic-usage)
|
|
14
|
-
- [Formula Support](#formula-support)
|
|
15
15
|
- [Examples](#examples)
|
|
16
|
-
- [
|
|
17
|
-
- [Column Resizing](#column-resizing)
|
|
18
|
-
- [Context Menu](#context-menu)
|
|
19
|
-
- [Undo/Redo](#undoredo)
|
|
20
|
-
- [Auto-Expanding Grid](#auto-expanding-grid)
|
|
21
|
-
- [Keyboard Shortcuts](#keyboard-shortcuts)
|
|
16
|
+
- [Keyboard Navigation](#keyboard-navigation)
|
|
22
17
|
- [Accessibility](#accessibility)
|
|
23
|
-
- [Browser Support](#browser-support)
|
|
24
18
|
|
|
25
19
|
## Properties
|
|
26
20
|
|
|
@@ -28,119 +22,45 @@ The spreadsheet component provides an Excel-like editable grid with formula supp
|
|
|
28
22
|
|----------|------|---------|-------------|
|
|
29
23
|
| `data` | `any[][]` | `[]` | Two-dimensional array of cell values |
|
|
30
24
|
| `columns` | `SpreadsheetColumn[]` | `[]` | Column definitions with header, type, and width |
|
|
31
|
-
| `readonly` | `boolean` | `false` | Prevents cell editing
|
|
25
|
+
| `readonly` | `boolean` | `false` | Prevents cell editing |
|
|
32
26
|
|
|
33
27
|
### SpreadsheetColumn
|
|
34
28
|
|
|
35
29
|
```typescript
|
|
36
30
|
interface SpreadsheetColumn {
|
|
37
31
|
header: string; // Column header text
|
|
38
|
-
type?: 'text' | 'number' | 'date' | 'boolean' | 'select';
|
|
32
|
+
type?: 'text' | 'number' | 'date' | 'boolean' | 'select';
|
|
39
33
|
width?: number; // Column width in pixels
|
|
40
|
-
options?: string[]; //
|
|
41
|
-
}
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
### CellPosition
|
|
45
|
-
|
|
46
|
-
```typescript
|
|
47
|
-
interface CellPosition {
|
|
48
|
-
row: number;
|
|
49
|
-
col: number;
|
|
50
|
-
}
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
### CellRange
|
|
54
|
-
|
|
55
|
-
```typescript
|
|
56
|
-
interface CellRange {
|
|
57
|
-
start: CellPosition;
|
|
58
|
-
end: CellPosition;
|
|
34
|
+
options?: string[]; // Options for 'select' type cells
|
|
59
35
|
}
|
|
60
36
|
```
|
|
61
37
|
|
|
62
38
|
## Methods
|
|
63
39
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
#### `setCell(row: number, col: number, value: any): void`
|
|
72
|
-
Set a cell value. Auto-expands the data grid if the position is beyond current bounds. The change is added to the undo stack.
|
|
73
|
-
|
|
74
|
-
```typescript
|
|
75
|
-
spreadsheet.setCell(0, 1, 250);
|
|
76
|
-
spreadsheet.setCell(2, 0, '=SUM(B1:B2)');
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
#### `getData(): any[][]`
|
|
80
|
-
Get a copy of all current data.
|
|
81
|
-
|
|
82
|
-
```typescript
|
|
83
|
-
const allData = spreadsheet.getData();
|
|
84
|
-
console.log(allData);
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
#### `setData(data: any[][]): void`
|
|
88
|
-
Replace all data in the spreadsheet.
|
|
89
|
-
|
|
90
|
-
```typescript
|
|
91
|
-
spreadsheet.setData([
|
|
92
|
-
['Alice', 100],
|
|
93
|
-
['Bob', 200],
|
|
94
|
-
['Total', '=SUM(B1:B2)']
|
|
95
|
-
]);
|
|
96
|
-
```
|
|
40
|
+
| Method | Arguments | Returns | Description |
|
|
41
|
+
|--------|-----------|---------|-------------|
|
|
42
|
+
| `getCell()` | `row: number, col: number` | `any` | Get resolved cell value (formulas return computed result) |
|
|
43
|
+
| `setCell()` | `row: number, col: number, value: any` | `void` | Set cell value (auto-expands grid, adds to undo stack) |
|
|
44
|
+
| `getData()` | -- | `any[][]` | Get a copy of all current data |
|
|
45
|
+
| `setData()` | `data: any[][]` | `void` | Replace all data |
|
|
97
46
|
|
|
98
47
|
## Events
|
|
99
48
|
|
|
100
|
-
|
|
101
|
-
|
|
49
|
+
| Event | Detail | Description |
|
|
50
|
+
|-------|--------|-------------|
|
|
51
|
+
| `cell-change` | `{ row: number, col: number, value: any, oldValue: any }` | A cell value was modified |
|
|
52
|
+
| `cell-select` | `{ row: number, col: number }` | A cell was selected |
|
|
53
|
+
| `row-select` | `{ row: number }` | A row was selected (clicked row number) |
|
|
54
|
+
| `column-sort` | `{ col: number, direction: 'asc' \| 'desc' }` | A column header was clicked to sort |
|
|
102
55
|
|
|
103
|
-
|
|
104
|
-
```typescript
|
|
105
|
-
{
|
|
106
|
-
row: number;
|
|
107
|
-
col: number;
|
|
108
|
-
value: any;
|
|
109
|
-
oldValue: any;
|
|
110
|
-
}
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
### `cell-select`
|
|
114
|
-
Fired when a cell is selected.
|
|
115
|
-
|
|
116
|
-
**Event Detail:**
|
|
117
|
-
```typescript
|
|
118
|
-
{
|
|
119
|
-
row: number;
|
|
120
|
-
col: number;
|
|
121
|
-
}
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
### `row-select`
|
|
125
|
-
Fired when a row is selected (by clicking the row number).
|
|
126
|
-
|
|
127
|
-
**Event Detail:**
|
|
128
|
-
```typescript
|
|
129
|
-
{
|
|
130
|
-
row: number;
|
|
131
|
-
}
|
|
132
|
-
```
|
|
56
|
+
## CSS Parts
|
|
133
57
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
col: number;
|
|
141
|
-
direction: 'asc' | 'desc';
|
|
142
|
-
}
|
|
143
|
-
```
|
|
58
|
+
| Part | Description |
|
|
59
|
+
|------|-------------|
|
|
60
|
+
| `formula-bar` | The formula bar with cell reference and input field |
|
|
61
|
+
| `base` | The main spreadsheet grid area |
|
|
62
|
+
| `status-bar` | The bottom status bar showing selection statistics |
|
|
63
|
+
| `context-menu` | The right-click context menu |
|
|
144
64
|
|
|
145
65
|
## CSS Custom Properties
|
|
146
66
|
|
|
@@ -156,66 +76,17 @@ Fired when a column header is clicked to sort.
|
|
|
156
76
|
| `--snice-color-text-secondary` | Formula bar cell reference text | _(theme default)_ |
|
|
157
77
|
| `--snice-color-text-tertiary` | Row numbers, status bar labels, add buttons | _(theme default)_ |
|
|
158
78
|
|
|
159
|
-
## CSS Parts
|
|
160
|
-
|
|
161
|
-
Style internal elements from outside the shadow DOM using `::part()`.
|
|
162
|
-
|
|
163
|
-
| Part | Element | Description |
|
|
164
|
-
|------|---------|-------------|
|
|
165
|
-
| `formula-bar` | `<div>` | The formula bar with cell reference and input field |
|
|
166
|
-
| `base` | `<div>` | The main spreadsheet grid area |
|
|
167
|
-
| `status-bar` | `<div>` | The bottom status bar showing selection statistics |
|
|
168
|
-
| `context-menu` | `<div>` | The right-click context menu |
|
|
169
|
-
|
|
170
|
-
```css
|
|
171
|
-
snice-spreadsheet::part(formula-bar) {
|
|
172
|
-
background: #f9fafb;
|
|
173
|
-
border-bottom: 1px solid #e5e7eb;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
snice-spreadsheet::part(status-bar) {
|
|
177
|
-
font-size: 0.75rem;
|
|
178
|
-
background: #f9fafb;
|
|
179
|
-
}
|
|
180
|
-
```
|
|
181
|
-
|
|
182
79
|
## Basic Usage
|
|
183
80
|
|
|
184
|
-
```html
|
|
185
|
-
<snice-spreadsheet></snice-spreadsheet>
|
|
186
|
-
```
|
|
187
|
-
|
|
188
81
|
```typescript
|
|
189
82
|
import 'snice/components/spreadsheet/snice-spreadsheet';
|
|
190
83
|
```
|
|
191
84
|
|
|
192
|
-
## Formula Support
|
|
193
|
-
|
|
194
|
-
Cells starting with `=` are evaluated as formulas. Supported functions:
|
|
195
|
-
|
|
196
|
-
| Function | Description | Example |
|
|
197
|
-
|----------|-------------|---------|
|
|
198
|
-
| `SUM` | Sum of values in range | `=SUM(A1:A5)` |
|
|
199
|
-
| `AVG` / `AVERAGE` | Average of values in range | `=AVG(B1:B10)` |
|
|
200
|
-
| `COUNT` | Count of non-empty cells in range | `=COUNT(A1:A10)` |
|
|
201
|
-
| `MIN` | Minimum value in range | `=MIN(C1:C5)` |
|
|
202
|
-
| `MAX` | Maximum value in range | `=MAX(C1:C5)` |
|
|
203
|
-
|
|
204
|
-
Cell references use spreadsheet-style notation (A1, B2, etc.) where letters are columns and numbers are rows.
|
|
205
|
-
|
|
206
|
-
## Examples
|
|
207
|
-
|
|
208
|
-
### Basic Spreadsheet with Column Types
|
|
209
|
-
|
|
210
|
-
Define columns with different cell types and populate with data.
|
|
211
|
-
|
|
212
85
|
```html
|
|
213
|
-
<snice-spreadsheet id="
|
|
86
|
+
<snice-spreadsheet id="sheet"></snice-spreadsheet>
|
|
214
87
|
|
|
215
|
-
<script
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
const sheet = document.getElementById('basic-sheet');
|
|
88
|
+
<script>
|
|
89
|
+
const sheet = document.getElementById('sheet');
|
|
219
90
|
sheet.columns = [
|
|
220
91
|
{ header: 'Name', type: 'text' },
|
|
221
92
|
{ header: 'Amount', type: 'number', width: 100 },
|
|
@@ -229,166 +100,77 @@ Define columns with different cell types and populate with data.
|
|
|
229
100
|
</script>
|
|
230
101
|
```
|
|
231
102
|
|
|
232
|
-
|
|
103
|
+
## Examples
|
|
233
104
|
|
|
234
|
-
|
|
105
|
+
### Formula Support
|
|
235
106
|
|
|
236
|
-
|
|
237
|
-
<snice-spreadsheet id="formula-sheet"></snice-spreadsheet>
|
|
107
|
+
Cells starting with `=` are evaluated as formulas. Supported functions: `SUM`, `AVG`/`AVERAGE`, `COUNT`, `MIN`, `MAX`. Cell references use spreadsheet-style notation (A1, B2).
|
|
238
108
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
{ header: 'Q4', type: 'number', width: 80 }
|
|
247
|
-
];
|
|
248
|
-
sheet.data = [
|
|
249
|
-
['Revenue', 1200, 1400, 1100, 1600],
|
|
250
|
-
['Expenses', 800, 900, 750, 1000],
|
|
251
|
-
['Profit', '=SUM(B1:B1)-SUM(B2:B2)', '=SUM(C1:C1)-SUM(C2:C2)', '=SUM(D1:D1)-SUM(D2:D2)', '=SUM(E1:E1)-SUM(E2:E2)'],
|
|
252
|
-
['Average', '=AVG(B1:B2)', '=AVG(C1:C2)', '=AVG(D1:D2)', '=AVG(E1:E2)']
|
|
253
|
-
];
|
|
254
|
-
</script>
|
|
109
|
+
```typescript
|
|
110
|
+
sheet.data = [
|
|
111
|
+
['Revenue', 1200, 1400, 1100],
|
|
112
|
+
['Expenses', 800, 900, 750],
|
|
113
|
+
['Profit', '=B1-B2', '=C1-C2', '=D1-D2'],
|
|
114
|
+
['Total', '=SUM(B1:B2)', '=AVG(C1:C2)', '=MAX(D1:D2)']
|
|
115
|
+
];
|
|
255
116
|
```
|
|
256
117
|
|
|
257
|
-
### Read-Only
|
|
118
|
+
### Read-Only
|
|
258
119
|
|
|
259
|
-
|
|
120
|
+
Set `readonly` to display data without editing.
|
|
260
121
|
|
|
261
122
|
```html
|
|
262
|
-
<snice-spreadsheet
|
|
263
|
-
|
|
264
|
-
<script type="module">
|
|
265
|
-
const sheet = document.getElementById('readonly-sheet');
|
|
266
|
-
sheet.columns = [
|
|
267
|
-
{ header: 'Employee', type: 'text', width: 150 },
|
|
268
|
-
{ header: 'Department', type: 'text', width: 120 },
|
|
269
|
-
{ header: 'Salary', type: 'number', width: 100 }
|
|
270
|
-
];
|
|
271
|
-
sheet.data = [
|
|
272
|
-
['Jane Doe', 'Engineering', 95000],
|
|
273
|
-
['John Smith', 'Marketing', 78000],
|
|
274
|
-
['Lisa Chen', 'Engineering', 102000],
|
|
275
|
-
['Total', '', '=SUM(C1:C3)']
|
|
276
|
-
];
|
|
277
|
-
</script>
|
|
278
|
-
```
|
|
279
|
-
|
|
280
|
-
### Listening for Cell Changes
|
|
281
|
-
|
|
282
|
-
Track edits by listening for the `cell-change` event.
|
|
283
|
-
|
|
284
|
-
```html
|
|
285
|
-
<snice-spreadsheet id="tracked-sheet"></snice-spreadsheet>
|
|
286
|
-
<p id="change-log">Edit a cell to see changes here.</p>
|
|
287
|
-
|
|
288
|
-
<script type="module">
|
|
289
|
-
import type { SniceSpreadsheetElement } from 'snice/components/spreadsheet/snice-spreadsheet.types';
|
|
290
|
-
|
|
291
|
-
const sheet = document.getElementById('tracked-sheet') as SniceSpreadsheetElement;
|
|
292
|
-
const log = document.getElementById('change-log');
|
|
293
|
-
|
|
294
|
-
sheet.columns = [
|
|
295
|
-
{ header: 'Product', type: 'text' },
|
|
296
|
-
{ header: 'Price', type: 'number', width: 80 },
|
|
297
|
-
{ header: 'In Stock', type: 'boolean' }
|
|
298
|
-
];
|
|
299
|
-
sheet.data = [
|
|
300
|
-
['Widget', 9.99, true],
|
|
301
|
-
['Gadget', 24.99, false],
|
|
302
|
-
['Gizmo', 14.99, true]
|
|
303
|
-
];
|
|
304
|
-
|
|
305
|
-
sheet.addEventListener('cell-change', (e) => {
|
|
306
|
-
log.textContent = `Cell [${e.detail.row}, ${e.detail.col}] changed from "${e.detail.oldValue}" to "${e.detail.value}"`;
|
|
307
|
-
});
|
|
308
|
-
</script>
|
|
123
|
+
<snice-spreadsheet readonly></snice-spreadsheet>
|
|
309
124
|
```
|
|
310
125
|
|
|
311
126
|
### Date and Boolean Columns
|
|
312
127
|
|
|
313
128
|
Use specialized cell types for dates and checkboxes.
|
|
314
129
|
|
|
315
|
-
```
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
sheet.data = [
|
|
326
|
-
['Design mockups', '2026-03-01', false],
|
|
327
|
-
['Write tests', '2026-03-05', true],
|
|
328
|
-
['Deploy to staging', '2026-03-10', false]
|
|
329
|
-
];
|
|
330
|
-
</script>
|
|
130
|
+
```typescript
|
|
131
|
+
sheet.columns = [
|
|
132
|
+
{ header: 'Task', type: 'text', width: 200 },
|
|
133
|
+
{ header: 'Due Date', type: 'date', width: 120 },
|
|
134
|
+
{ header: 'Complete', type: 'boolean', width: 80 }
|
|
135
|
+
];
|
|
136
|
+
sheet.data = [
|
|
137
|
+
['Design mockups', '2026-03-01', false],
|
|
138
|
+
['Write tests', '2026-03-05', true],
|
|
139
|
+
];
|
|
331
140
|
```
|
|
332
141
|
|
|
333
|
-
|
|
142
|
+
### Event Handling
|
|
334
143
|
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
- **Shift+Arrow keys**: Extend the selection one cell at a time in the arrow direction
|
|
340
|
-
|
|
341
|
-
When a range is selected:
|
|
342
|
-
- The anchor cell (where selection started) has a thick blue border
|
|
343
|
-
- Other cells in the range have a light blue fill
|
|
344
|
-
- The **status bar** at the bottom shows COUNT, SUM, and AVG of numeric cells in the selection
|
|
345
|
-
|
|
346
|
-
## Column Resizing
|
|
347
|
-
|
|
348
|
-
Drag the right edge of any column header to resize it. A blue highlight appears on hover to indicate the resize handle. The minimum column width is 40px.
|
|
349
|
-
|
|
350
|
-
## Context Menu
|
|
351
|
-
|
|
352
|
-
Right-click any cell to open the context menu with these options:
|
|
353
|
-
|
|
354
|
-
| Action | Description |
|
|
355
|
-
|--------|-------------|
|
|
356
|
-
| Cut | Copy selected cell(s) and clear |
|
|
357
|
-
| Copy | Copy selected cell(s) to clipboard |
|
|
358
|
-
| Paste | Paste from clipboard |
|
|
359
|
-
| Insert Row Above | Add empty row above current |
|
|
360
|
-
| Insert Row Below | Add empty row below current |
|
|
361
|
-
| Delete Row | Remove current row |
|
|
362
|
-
| Insert Column Left | Add empty column to the left |
|
|
363
|
-
| Insert Column Right | Add empty column to the right |
|
|
364
|
-
| Delete Column | Remove current column |
|
|
365
|
-
| Clear Cell(s) | Clear selected cell(s) contents |
|
|
366
|
-
|
|
367
|
-
The context menu closes when clicking outside, pressing Escape, or selecting an action.
|
|
368
|
-
|
|
369
|
-
## Undo/Redo
|
|
370
|
-
|
|
371
|
-
The spreadsheet maintains an undo/redo history stack (up to 100 entries) for cell value changes.
|
|
144
|
+
```typescript
|
|
145
|
+
sheet.addEventListener('cell-change', (e) => {
|
|
146
|
+
console.log(`Cell [${e.detail.row}, ${e.detail.col}]: ${e.detail.oldValue} -> ${e.detail.value}`);
|
|
147
|
+
});
|
|
372
148
|
|
|
373
|
-
-
|
|
374
|
-
|
|
149
|
+
sheet.addEventListener('column-sort', (e) => {
|
|
150
|
+
console.log(`Column ${e.detail.col} sorted ${e.detail.direction}`);
|
|
151
|
+
});
|
|
152
|
+
```
|
|
375
153
|
|
|
376
|
-
|
|
154
|
+
### Multi-Cell Selection
|
|
377
155
|
|
|
378
|
-
|
|
156
|
+
- Click and drag to select a range
|
|
157
|
+
- Shift+Click to extend selection from the anchor cell
|
|
158
|
+
- Shift+Arrow keys to grow selection one cell at a time
|
|
159
|
+
- Status bar shows COUNT, SUM, and AVG of numeric cells in the selection
|
|
379
160
|
|
|
380
|
-
|
|
161
|
+
### Context Menu
|
|
381
162
|
|
|
382
|
-
-
|
|
383
|
-
- **"+" column**: A "+" button at the right end of the header appends a new empty column
|
|
384
|
-
- **Tab at last column**: When editing the last column and pressing Tab, a new column is added automatically
|
|
385
|
-
- **Enter at last row**: When editing the last row and pressing Enter, a new row is added automatically
|
|
163
|
+
Right-click any cell for options: Cut, Copy, Paste, Insert Row Above/Below, Delete Row, Insert Column Left/Right, Delete Column, Clear Cell(s).
|
|
386
164
|
|
|
387
|
-
###
|
|
165
|
+
### Auto-Expanding Grid
|
|
388
166
|
|
|
389
|
-
|
|
167
|
+
- "+" button row at bottom appends a new empty row
|
|
168
|
+
- "+" button at right of header appends a new empty column
|
|
169
|
+
- Tab at the last column auto-adds a new column
|
|
170
|
+
- Enter at the last row auto-adds a new row
|
|
171
|
+
- Empty state shows "Double-click or start typing to add data"
|
|
390
172
|
|
|
391
|
-
## Keyboard
|
|
173
|
+
## Keyboard Navigation
|
|
392
174
|
|
|
393
175
|
| Shortcut | Action |
|
|
394
176
|
|----------|--------|
|
|
@@ -403,18 +185,13 @@ When the data array is empty, the spreadsheet displays a centered message: "Doub
|
|
|
403
185
|
| Ctrl+V | Paste (supports tab-separated multi-cell paste) |
|
|
404
186
|
| Ctrl+Z | Undo |
|
|
405
187
|
| Ctrl+Y / Ctrl+Shift+Z | Redo |
|
|
406
|
-
| Any printable key | Start editing with that character
|
|
188
|
+
| Any printable key | Start editing with that character |
|
|
407
189
|
|
|
408
190
|
## Accessibility
|
|
409
191
|
|
|
410
|
-
-
|
|
411
|
-
-
|
|
412
|
-
-
|
|
413
|
-
-
|
|
414
|
-
-
|
|
415
|
-
-
|
|
416
|
-
|
|
417
|
-
## Browser Support
|
|
418
|
-
|
|
419
|
-
- Modern browsers (Chrome, Firefox, Safari, Edge)
|
|
420
|
-
- Requires Custom Elements v1 and Shadow DOM support
|
|
192
|
+
- Full keyboard navigation for cells, editing, and selection
|
|
193
|
+
- Visible focus indicator (2px blue border) on selected cell
|
|
194
|
+
- Column sort buttons are keyboard accessible
|
|
195
|
+
- Enter/F2 activates editing, Escape cancels
|
|
196
|
+
- Undo/redo history (up to 100 entries) via Ctrl+Z and Ctrl+Y
|
|
197
|
+
- Frozen row numbers (sticky left) and column headers (sticky top)
|
|
@@ -1,47 +1,34 @@
|
|
|
1
|
-
<!-- AI: For
|
|
1
|
+
<!-- AI: For the AI-optimized version of this doc, see docs/ai/components/stat-group.md -->
|
|
2
2
|
|
|
3
3
|
# Stat Group
|
|
4
4
|
|
|
5
|
-
`<snice-stat-group>`
|
|
6
|
-
|
|
7
5
|
A coordinated row of KPI cards with consistent sizing, trend indicators, and responsive grid layout.
|
|
8
6
|
|
|
9
7
|
## Table of Contents
|
|
8
|
+
|
|
10
9
|
- [Properties](#properties)
|
|
11
10
|
- [Events](#events)
|
|
12
11
|
- [CSS Parts](#css-parts)
|
|
13
12
|
- [Basic Usage](#basic-usage)
|
|
14
13
|
- [Examples](#examples)
|
|
15
|
-
|
|
16
|
-
## Importing
|
|
17
|
-
|
|
18
|
-
**ESM (bundler)**
|
|
19
|
-
```typescript
|
|
20
|
-
import 'snice/components/stat-group/snice-stat-group';
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
**CDN**
|
|
24
|
-
```html
|
|
25
|
-
<script src="snice-runtime.min.js"></script>
|
|
26
|
-
<script src="snice-stat-group.min.js"></script>
|
|
27
|
-
```
|
|
14
|
+
- [Accessibility](#accessibility)
|
|
28
15
|
|
|
29
16
|
## Properties
|
|
30
17
|
|
|
31
18
|
| Property | Type | Default | Description |
|
|
32
19
|
|----------|------|---------|-------------|
|
|
33
20
|
| `stats` | `StatItem[]` | `[]` | Array of stat objects to display |
|
|
34
|
-
| `columns` | `number` | `0` | Number of columns (0 = auto-fit) |
|
|
21
|
+
| `columns` | `number` | `0` | Number of columns (0 = auto-fit based on width) |
|
|
35
22
|
| `variant` | `'card' \| 'minimal' \| 'bordered'` | `'card'` | Visual style variant |
|
|
36
23
|
|
|
37
|
-
### StatItem
|
|
24
|
+
### StatItem
|
|
38
25
|
|
|
39
26
|
```typescript
|
|
40
27
|
interface StatItem {
|
|
41
28
|
label: string; // Stat label text
|
|
42
29
|
value: string | number; // Display value
|
|
43
30
|
trend?: 'up' | 'down' | 'neutral'; // Trend direction
|
|
44
|
-
trendValue?: string; // Trend comparison text
|
|
31
|
+
trendValue?: string; // Trend comparison text (e.g. "+12.5%")
|
|
45
32
|
icon?: string; // Icon text or emoji
|
|
46
33
|
color?: string; // Accent color for icon and value
|
|
47
34
|
}
|
|
@@ -51,7 +38,7 @@ interface StatItem {
|
|
|
51
38
|
|
|
52
39
|
| Event | Detail | Description |
|
|
53
40
|
|-------|--------|-------------|
|
|
54
|
-
| `stat-click` | `{ stat: StatItem, index: number }` |
|
|
41
|
+
| `stat-click` | `{ stat: StatItem, index: number }` | A stat card was clicked |
|
|
55
42
|
|
|
56
43
|
## CSS Parts
|
|
57
44
|
|
|
@@ -60,16 +47,6 @@ interface StatItem {
|
|
|
60
47
|
| `base` | The grid container element |
|
|
61
48
|
| `stat` | Individual stat card element |
|
|
62
49
|
|
|
63
|
-
```css
|
|
64
|
-
snice-stat-group::part(stat) {
|
|
65
|
-
border-radius: 1rem;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
snice-stat-group::part(base) {
|
|
69
|
-
gap: 2rem;
|
|
70
|
-
}
|
|
71
|
-
```
|
|
72
|
-
|
|
73
50
|
## Basic Usage
|
|
74
51
|
|
|
75
52
|
```typescript
|
|
@@ -82,7 +59,7 @@ import 'snice/components/stat-group/snice-stat-group';
|
|
|
82
59
|
<script>
|
|
83
60
|
document.getElementById('stats').stats = [
|
|
84
61
|
{ label: 'Revenue', value: '$45,231', trend: 'up', trendValue: '+12.5%' },
|
|
85
|
-
{ label: 'Users', value: '2,338', trend: 'up', trendValue: '+8.2%' }
|
|
62
|
+
{ label: 'Users', value: '2,338', trend: 'up', trendValue: '+8.2%' },
|
|
86
63
|
];
|
|
87
64
|
</script>
|
|
88
65
|
```
|
|
@@ -91,7 +68,7 @@ import 'snice/components/stat-group/snice-stat-group';
|
|
|
91
68
|
|
|
92
69
|
### Variants
|
|
93
70
|
|
|
94
|
-
Use
|
|
71
|
+
Use `variant` to change the visual style of the stat cards.
|
|
95
72
|
|
|
96
73
|
```html
|
|
97
74
|
<!-- Card (default) - bordered cards with hover effects -->
|
|
@@ -106,7 +83,7 @@ Use the `variant` attribute to change the visual style of the stat cards.
|
|
|
106
83
|
|
|
107
84
|
### Fixed Column Count
|
|
108
85
|
|
|
109
|
-
Use
|
|
86
|
+
Use `columns` to set a specific number of columns. Default `0` auto-fits based on width.
|
|
110
87
|
|
|
111
88
|
```html
|
|
112
89
|
<snice-stat-group columns="2"></snice-stat-group>
|
|
@@ -115,44 +92,33 @@ Use the `columns` attribute to set a specific number of columns. When set to `0`
|
|
|
115
92
|
|
|
116
93
|
### Trend Indicators
|
|
117
94
|
|
|
118
|
-
Each stat can display a trend direction
|
|
95
|
+
Each stat can display a trend direction with comparison text.
|
|
119
96
|
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
];
|
|
127
|
-
</script>
|
|
97
|
+
```typescript
|
|
98
|
+
el.stats = [
|
|
99
|
+
{ label: 'Revenue', value: '$45K', trend: 'up', trendValue: '+12.5% vs last month' },
|
|
100
|
+
{ label: 'Churn', value: '2.3%', trend: 'down', trendValue: '-0.5%' },
|
|
101
|
+
{ label: 'Conversion', value: '3.2%', trend: 'neutral', trendValue: '0.0%' }
|
|
102
|
+
];
|
|
128
103
|
```
|
|
129
104
|
|
|
130
105
|
### With Icons and Colors
|
|
131
106
|
|
|
132
107
|
Customize each stat with an icon and accent color.
|
|
133
108
|
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
];
|
|
140
|
-
</script>
|
|
109
|
+
```typescript
|
|
110
|
+
el.stats = [
|
|
111
|
+
{ label: 'Revenue', value: '$45,231', icon: '$', color: 'rgb(22 163 74)', trend: 'up', trendValue: '+12.5%' },
|
|
112
|
+
{ label: 'Orders', value: '1,245', icon: '\u{1F4E6}', trend: 'down', trendValue: '-3.1%' }
|
|
113
|
+
];
|
|
141
114
|
```
|
|
142
115
|
|
|
143
|
-
### Handling
|
|
144
|
-
|
|
145
|
-
Listen for the `stat-click` event to respond when a user clicks a stat card.
|
|
146
|
-
|
|
147
|
-
```html
|
|
148
|
-
<snice-stat-group id="clickable-stats"></snice-stat-group>
|
|
116
|
+
### Event Handling
|
|
149
117
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
});
|
|
155
|
-
</script>
|
|
118
|
+
```typescript
|
|
119
|
+
el.addEventListener('stat-click', (e) => {
|
|
120
|
+
console.log('Clicked:', e.detail.stat.label, 'at index', e.detail.index);
|
|
121
|
+
});
|
|
156
122
|
```
|
|
157
123
|
|
|
158
124
|
## Accessibility
|