snice 4.27.0 → 4.29.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/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 +4 -0
- package/adapters/react/components.d.ts.map +1 -1
- package/adapters/react/components.js +2 -0
- package/adapters/react/components.js.map +1 -1
- package/adapters/react/components.ts +4 -0
- package/adapters/react/useRequestHandler.d.ts +56 -0
- package/adapters/react/useRequestHandler.js +103 -0
- package/adapters/react/useRequestHandler.js.map +1 -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 +2 -2
- package/dist/cdn/badge/snice-badge.js.map +1 -1
- package/dist/cdn/badge/snice-badge.min.js +2 -2
- package/dist/cdn/badge/snice-badge.min.js.map +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 +11 -10
- package/dist/cdn/button/snice-button.js.map +1 -1
- package/dist/cdn/button/snice-button.min.js +3 -3
- 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/snice-chip.js +1 -1
- package/dist/cdn/chip/snice-chip.min.js +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/snice-date-picker.js +1 -1
- package/dist/cdn/date-picker/snice-date-picker.min.js +1 -1
- package/dist/cdn/date-range-picker/snice-date-range-picker.js +1 -1
- package/dist/cdn/date-range-picker/snice-date-range-picker.min.js +1 -1
- package/dist/cdn/date-time-picker/snice-date-time-picker.js +1 -1
- package/dist/cdn/date-time-picker/snice-date-time-picker.min.js +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/snice-draw.js +1 -1
- package/dist/cdn/draw/snice-draw.min.js +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/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 +11 -10
- package/dist/cdn/login/snice-login.js.map +1 -1
- package/dist/cdn/login/snice-login.min.js +5 -5
- 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/snice-message-strip.js +1 -1
- package/dist/cdn/message-strip/snice-message-strip.min.js +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/snice-paint.js +1 -1
- package/dist/cdn/paint/snice-paint.min.js +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/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 +152 -62
- 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 +152 -61
- package/dist/cdn/runtime/snice-runtime.js.map +1 -1
- package/dist/cdn/runtime/snice-runtime.min.js +8 -8
- 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 +11 -10
- package/dist/cdn/table/snice-table.js.map +1 -1
- package/dist/cdn/table/snice-table.min.js +73 -73
- 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/snice-tag.js +1 -1
- package/dist/cdn/tag/snice-tag.min.js +1 -1
- package/dist/cdn/tag-input/snice-tag-input.js +1 -1
- package/dist/cdn/tag-input/snice-tag-input.min.js +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/snice-time-picker.js +1 -1
- package/dist/cdn/time-picker/snice-time-picker.min.js +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/snice-toast.js +1 -1
- package/dist/cdn/toast/snice-toast.min.js +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/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/badge/snice-badge.js +1 -1
- package/dist/components/badge/snice-badge.js.map +1 -1
- 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.d.ts +2 -2
- package/dist/components/button/snice-button.js +11 -10
- package/dist/components/button/snice-button.js.map +1 -1
- package/dist/create-request-handler.d.ts +42 -0
- package/dist/index.cjs +149 -58
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.esm.js +149 -59
- package/dist/index.esm.js.map +1 -1
- package/dist/index.iife.js +149 -58
- package/dist/index.iife.js.map +1 -1
- package/dist/parts.d.ts +9 -7
- 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/docs/ai/DEVELOPMENT.md +1 -1
- 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/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 +63 -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/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-react-integration-design.md +166 -0
- package/docs/request-response.md +77 -0
- package/package.json +20 -10
|
@@ -0,0 +1,676 @@
|
|
|
1
|
+
# Action Bar Implementation Plan
|
|
2
|
+
|
|
3
|
+
> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
|
|
4
|
+
|
|
5
|
+
**Goal:** Build `snice-action-bar`, a positioned animated container for contextual actions with slotted content.
|
|
6
|
+
|
|
7
|
+
**Architecture:** Slot-only component using `position: absolute` within a relative parent. CSS transitions for fade+slide animation. Roving tabindex for keyboard nav. Follows existing drawer/banner patterns for show/hide lifecycle.
|
|
8
|
+
|
|
9
|
+
**Tech Stack:** Snice decorators (@element, @property, @watch, @dispatch, @render, @styles, @query, @on, @ready, @dispose), CSS transitions, role="toolbar"
|
|
10
|
+
|
|
11
|
+
**Design doc:** `docs/plans/2026-03-09-action-bar-design.md`
|
|
12
|
+
|
|
13
|
+
**Component checklist:** `.ai/component-checklist.md` — verify ALL items before marking complete.
|
|
14
|
+
|
|
15
|
+
## REQUIRED READING — Complete ALL before writing any code
|
|
16
|
+
|
|
17
|
+
### Project instructions (read first)
|
|
18
|
+
1. `CLAUDE.md` — project instructions, overrides, all links mentioned must be followed
|
|
19
|
+
|
|
20
|
+
### Development guidelines (read second)
|
|
21
|
+
2. `docs/ai/README.md` — API reference, pitfalls, decorator patterns, component import patterns
|
|
22
|
+
3. `docs/ai/DEVELOPMENT.md` — build system, testing, component file structure, adding components checklist, CDN builds, React adapters, test generation, component template
|
|
23
|
+
|
|
24
|
+
### Internal coding standards (read third — these are mandatory)
|
|
25
|
+
4. `.ai/coding-standards.md` — REQUIRED decorator patterns (@query, @on, @dispatch, @ready, @dispose, @observe, @watch, @request/@respond), CSS theme integration with fallbacks, units (rem vs px), two-tier variable pattern, container component dual API, dos and don'ts
|
|
26
|
+
5. `.ai/component-checklist.md` — every item must be satisfied before component is complete
|
|
27
|
+
6. `.ai/component-docs-guide.md` — exact doc format for both human and AI docs, section order, writing rules
|
|
28
|
+
7. `.ai/notes.md` — project organization (customer-facing vs internal), file naming, camera/timer rules, scroll spy notes
|
|
29
|
+
8. `.ai/playwright-testing.md` — E2E testing rules, .debug/ only for temp files, always headless
|
|
30
|
+
9. `.ai/tasks.md` — has pending tasks list AND required snice decorator patterns reference at the bottom
|
|
31
|
+
10. `.ai/release-checklist.md` — release process, when to manually update llms.txt
|
|
32
|
+
|
|
33
|
+
### Design spec (read fourth)
|
|
34
|
+
11. `docs/plans/2026-03-09-action-bar-design.md` — the design spec for this component
|
|
35
|
+
|
|
36
|
+
### Reference files (read as needed during implementation)
|
|
37
|
+
- `components/banner/snice-banner.ts` — closest pattern to follow (show/hide, events, @watch)
|
|
38
|
+
- `components/banner/snice-banner.types.ts` — types file pattern
|
|
39
|
+
- `components/banner/snice-banner.css` — CSS pattern with theme tokens and fallbacks
|
|
40
|
+
- `components/theme/theme.css` — all available CSS custom properties
|
|
41
|
+
- `components/drawer/snice-drawer.ts` — positioning and escape key patterns
|
|
42
|
+
- `components/tooltip/snice-tooltip.ts` — keyboard navigation pattern
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
### Task 1: Add to WIP list
|
|
47
|
+
|
|
48
|
+
**Files:**
|
|
49
|
+
- Modify: `components/.wip`
|
|
50
|
+
|
|
51
|
+
**Step 1: Add action-bar to WIP**
|
|
52
|
+
|
|
53
|
+
Add `action-bar` to `components/.wip` so it's excluded from builds while in development.
|
|
54
|
+
|
|
55
|
+
**Step 2: Create component directory**
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
mkdir -p components/action-bar
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**Step 3: Commit**
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
git add components/.wip
|
|
65
|
+
git commit -m "chore: add action-bar to WIP list"
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
### Task 2: Types file
|
|
71
|
+
|
|
72
|
+
**Files:**
|
|
73
|
+
- Create: `components/action-bar/snice-action-bar.types.ts`
|
|
74
|
+
|
|
75
|
+
**Step 1: Write types**
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
export type ActionBarPosition = 'top' | 'bottom' | 'left' | 'right' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
|
|
79
|
+
export type ActionBarSize = 'small' | 'medium';
|
|
80
|
+
export type ActionBarVariant = 'default' | 'pill';
|
|
81
|
+
|
|
82
|
+
export interface SniceActionBarElement extends HTMLElement {
|
|
83
|
+
open: boolean;
|
|
84
|
+
position: ActionBarPosition;
|
|
85
|
+
size: ActionBarSize;
|
|
86
|
+
variant: ActionBarVariant;
|
|
87
|
+
noAnimation: boolean;
|
|
88
|
+
noEscapeDismiss: boolean;
|
|
89
|
+
|
|
90
|
+
show(): void;
|
|
91
|
+
hide(): void;
|
|
92
|
+
toggle(): void;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export interface ActionBarEventDetail {
|
|
96
|
+
actionBar: SniceActionBarElement;
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**Step 2: Commit**
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
git add components/action-bar/snice-action-bar.types.ts
|
|
104
|
+
git commit -m "feat(action-bar): add type definitions"
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
### Task 3: CSS file
|
|
110
|
+
|
|
111
|
+
**Files:**
|
|
112
|
+
- Create: `components/action-bar/snice-action-bar.css`
|
|
113
|
+
- Reference: `.ai/coding-standards.md` for theme token patterns, units, fallbacks
|
|
114
|
+
|
|
115
|
+
**Step 1: Read theme.css for available tokens**
|
|
116
|
+
|
|
117
|
+
Read `components/theme/theme.css` to understand available custom properties.
|
|
118
|
+
|
|
119
|
+
**Step 2: Write styles**
|
|
120
|
+
|
|
121
|
+
Key requirements:
|
|
122
|
+
- `:host` uses `contain: layout style paint`, `display: block`, `position: absolute`
|
|
123
|
+
- Position mapping via `:host([position="..."])` attribute selectors using CSS inset properties
|
|
124
|
+
- Size variants via `:host([size="small"])`
|
|
125
|
+
- Pill variant via `:host([variant="pill"])`
|
|
126
|
+
- Animation: CSS transitions on `opacity` and `transform`
|
|
127
|
+
- Hidden state (not open, not no-animation): `opacity: 0`, `pointer-events: none`, translated away from anchor
|
|
128
|
+
- Open state: `opacity: 1`, `pointer-events: auto`, `transform: none`
|
|
129
|
+
- `no-animation` state: no transition, always visible
|
|
130
|
+
- All `var()` calls MUST have fallbacks
|
|
131
|
+
- Spacing/typography in rem, borders/shadows in px
|
|
132
|
+
- Two-tier variable pattern for customizable properties
|
|
133
|
+
|
|
134
|
+
```css
|
|
135
|
+
:host {
|
|
136
|
+
display: block;
|
|
137
|
+
position: absolute;
|
|
138
|
+
z-index: var(--action-bar-z-index, 10);
|
|
139
|
+
font-family: var(--snice-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif);
|
|
140
|
+
contain: layout style paint;
|
|
141
|
+
pointer-events: none;
|
|
142
|
+
opacity: 0;
|
|
143
|
+
transition: opacity var(--snice-transition-medium, 250ms) ease, transform var(--snice-transition-medium, 250ms) ease;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
:host([open]),
|
|
147
|
+
:host([no-animation]) {
|
|
148
|
+
pointer-events: auto;
|
|
149
|
+
opacity: 1;
|
|
150
|
+
transform: translate(0, 0);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
:host([no-animation]) {
|
|
154
|
+
transition: none;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/* Position: bottom (default) — centered bottom, slides up */
|
|
158
|
+
:host,
|
|
159
|
+
:host([position="bottom"]) {
|
|
160
|
+
bottom: var(--snice-spacing-sm, 0.75rem);
|
|
161
|
+
left: 50%;
|
|
162
|
+
transform: translate(-50%, 0.5rem);
|
|
163
|
+
}
|
|
164
|
+
:host([position="bottom"][open]),
|
|
165
|
+
:host([position="bottom"][no-animation]) {
|
|
166
|
+
transform: translate(-50%, 0);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/* Position: top — centered top, slides down */
|
|
170
|
+
:host([position="top"]) {
|
|
171
|
+
top: var(--snice-spacing-sm, 0.75rem);
|
|
172
|
+
left: 50%;
|
|
173
|
+
transform: translate(-50%, -0.5rem);
|
|
174
|
+
}
|
|
175
|
+
:host([position="top"][open]),
|
|
176
|
+
:host([position="top"][no-animation]) {
|
|
177
|
+
transform: translate(-50%, 0);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/* Position: left — centered left, slides right */
|
|
181
|
+
:host([position="left"]) {
|
|
182
|
+
left: var(--snice-spacing-sm, 0.75rem);
|
|
183
|
+
top: 50%;
|
|
184
|
+
transform: translate(-0.5rem, -50%);
|
|
185
|
+
}
|
|
186
|
+
:host([position="left"][open]),
|
|
187
|
+
:host([position="left"][no-animation]) {
|
|
188
|
+
transform: translate(0, -50%);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/* Position: right — centered right, slides left */
|
|
192
|
+
:host([position="right"]) {
|
|
193
|
+
right: var(--snice-spacing-sm, 0.75rem);
|
|
194
|
+
top: 50%;
|
|
195
|
+
transform: translate(0.5rem, -50%);
|
|
196
|
+
}
|
|
197
|
+
:host([position="right"][open]),
|
|
198
|
+
:host([position="right"][no-animation]) {
|
|
199
|
+
transform: translate(0, -50%);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/* Corners */
|
|
203
|
+
:host([position="top-left"]) {
|
|
204
|
+
top: var(--snice-spacing-sm, 0.75rem);
|
|
205
|
+
left: var(--snice-spacing-sm, 0.75rem);
|
|
206
|
+
transform: translate(-0.5rem, -0.5rem);
|
|
207
|
+
}
|
|
208
|
+
:host([position="top-left"][open]),
|
|
209
|
+
:host([position="top-left"][no-animation]) {
|
|
210
|
+
transform: translate(0, 0);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
:host([position="top-right"]) {
|
|
214
|
+
top: var(--snice-spacing-sm, 0.75rem);
|
|
215
|
+
right: var(--snice-spacing-sm, 0.75rem);
|
|
216
|
+
transform: translate(0.5rem, -0.5rem);
|
|
217
|
+
}
|
|
218
|
+
:host([position="top-right"][open]),
|
|
219
|
+
:host([position="top-right"][no-animation]) {
|
|
220
|
+
transform: translate(0, 0);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
:host([position="bottom-left"]) {
|
|
224
|
+
bottom: var(--snice-spacing-sm, 0.75rem);
|
|
225
|
+
left: var(--snice-spacing-sm, 0.75rem);
|
|
226
|
+
transform: translate(-0.5rem, 0.5rem);
|
|
227
|
+
}
|
|
228
|
+
:host([position="bottom-left"][open]),
|
|
229
|
+
:host([position="bottom-left"][no-animation]) {
|
|
230
|
+
transform: translate(0, 0);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
:host([position="bottom-right"]) {
|
|
234
|
+
bottom: var(--snice-spacing-sm, 0.75rem);
|
|
235
|
+
right: var(--snice-spacing-sm, 0.75rem);
|
|
236
|
+
transform: translate(0.5rem, 0.5rem);
|
|
237
|
+
}
|
|
238
|
+
:host([position="bottom-right"][open]),
|
|
239
|
+
:host([position="bottom-right"][no-animation]) {
|
|
240
|
+
transform: translate(0, 0);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/* Inner container */
|
|
244
|
+
.action-bar {
|
|
245
|
+
display: inline-flex;
|
|
246
|
+
align-items: center;
|
|
247
|
+
gap: var(--action-bar-gap, var(--snice-spacing-2xs, 0.25rem));
|
|
248
|
+
padding: var(--action-bar-padding, var(--snice-spacing-xs, 0.5rem));
|
|
249
|
+
background: var(--action-bar-background, var(--snice-color-background-element, rgb(252 251 249)));
|
|
250
|
+
border: var(--action-bar-border, 1px solid var(--snice-color-border, rgb(226 226 226)));
|
|
251
|
+
border-radius: var(--action-bar-border-radius, var(--snice-border-radius-lg, 0.5rem));
|
|
252
|
+
box-shadow: var(--action-bar-shadow, var(--snice-shadow-md, 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)));
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/* Pill variant */
|
|
256
|
+
:host([variant="pill"]) .action-bar {
|
|
257
|
+
border-radius: 9999px;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/* Size: small */
|
|
261
|
+
:host([size="small"]) .action-bar {
|
|
262
|
+
gap: var(--snice-spacing-3xs, 0.125rem);
|
|
263
|
+
padding: var(--snice-spacing-2xs, 0.25rem) var(--snice-spacing-xs, 0.5rem);
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
**Step 3: Commit**
|
|
268
|
+
|
|
269
|
+
```bash
|
|
270
|
+
git add components/action-bar/snice-action-bar.css
|
|
271
|
+
git commit -m "feat(action-bar): add component styles"
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
### Task 4: Component implementation
|
|
277
|
+
|
|
278
|
+
**Files:**
|
|
279
|
+
- Create: `components/action-bar/snice-action-bar.ts`
|
|
280
|
+
- Reference: `components/banner/snice-banner.ts` for pattern
|
|
281
|
+
|
|
282
|
+
**Step 1: Write component**
|
|
283
|
+
|
|
284
|
+
```typescript
|
|
285
|
+
import { element, property, watch, dispatch, render, styles, on, ready, dispose } from 'snice';
|
|
286
|
+
import { html, css } from 'snice';
|
|
287
|
+
import cssContent from './snice-action-bar.css?inline';
|
|
288
|
+
import type { ActionBarPosition, ActionBarSize, ActionBarVariant, SniceActionBarElement, ActionBarEventDetail } from './snice-action-bar.types';
|
|
289
|
+
|
|
290
|
+
@element('snice-action-bar')
|
|
291
|
+
export class SniceActionBar extends HTMLElement implements SniceActionBarElement {
|
|
292
|
+
@property({ type: Boolean }) open = false;
|
|
293
|
+
@property() position: ActionBarPosition = 'bottom';
|
|
294
|
+
@property() size: ActionBarSize = 'medium';
|
|
295
|
+
@property() variant: ActionBarVariant = 'default';
|
|
296
|
+
@property({ type: Boolean, attribute: 'no-animation' }) noAnimation = false;
|
|
297
|
+
@property({ type: Boolean, attribute: 'no-escape-dismiss' }) noEscapeDismiss = false;
|
|
298
|
+
|
|
299
|
+
@watch('open')
|
|
300
|
+
handleOpenChange() {
|
|
301
|
+
if (this.open) {
|
|
302
|
+
this.setAttribute('open', '');
|
|
303
|
+
this.emitOpen();
|
|
304
|
+
} else {
|
|
305
|
+
this.removeAttribute('open');
|
|
306
|
+
this.emitClose();
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
@watch('noAnimation')
|
|
311
|
+
handleNoAnimationChange() {
|
|
312
|
+
if (this.noAnimation) {
|
|
313
|
+
this.setAttribute('no-animation', '');
|
|
314
|
+
} else {
|
|
315
|
+
this.removeAttribute('no-animation');
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
@dispatch('action-bar-open', { bubbles: true, composed: true })
|
|
320
|
+
private emitOpen(): ActionBarEventDetail {
|
|
321
|
+
return { actionBar: this };
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
@dispatch('action-bar-close', { bubbles: true, composed: true })
|
|
325
|
+
private emitClose(): ActionBarEventDetail {
|
|
326
|
+
return { actionBar: this };
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
@on('keydown')
|
|
330
|
+
handleKeydown(e: KeyboardEvent) {
|
|
331
|
+
if (e.key === 'Escape' && !this.noEscapeDismiss) {
|
|
332
|
+
this.hide();
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
const focusable = this.getFocusableChildren();
|
|
337
|
+
if (focusable.length === 0) return;
|
|
338
|
+
|
|
339
|
+
const current = focusable.indexOf(document.activeElement as HTMLElement);
|
|
340
|
+
let next = -1;
|
|
341
|
+
|
|
342
|
+
if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {
|
|
343
|
+
e.preventDefault();
|
|
344
|
+
next = current < focusable.length - 1 ? current + 1 : 0;
|
|
345
|
+
} else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {
|
|
346
|
+
e.preventDefault();
|
|
347
|
+
next = current > 0 ? current - 1 : focusable.length - 1;
|
|
348
|
+
} else if (e.key === 'Home') {
|
|
349
|
+
e.preventDefault();
|
|
350
|
+
next = 0;
|
|
351
|
+
} else if (e.key === 'End') {
|
|
352
|
+
e.preventDefault();
|
|
353
|
+
next = focusable.length - 1;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
if (next >= 0) {
|
|
357
|
+
focusable[next].focus();
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
show() {
|
|
362
|
+
this.open = true;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
hide() {
|
|
366
|
+
this.open = false;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
toggle() {
|
|
370
|
+
this.open = !this.open;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
private getFocusableChildren(): HTMLElement[] {
|
|
374
|
+
const slot = this.shadowRoot?.querySelector('slot');
|
|
375
|
+
if (!slot) return [];
|
|
376
|
+
const elements = slot.assignedElements({ flatten: true }) as HTMLElement[];
|
|
377
|
+
return elements.filter(el =>
|
|
378
|
+
!el.hasAttribute('disabled') &&
|
|
379
|
+
(el.tabIndex >= 0 || el.matches('button, [href], input, select, textarea, [tabindex]'))
|
|
380
|
+
);
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
@render()
|
|
384
|
+
template() {
|
|
385
|
+
return html`
|
|
386
|
+
<div class="action-bar" role="toolbar" part="base">
|
|
387
|
+
<slot></slot>
|
|
388
|
+
</div>
|
|
389
|
+
`;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
@styles()
|
|
393
|
+
componentStyles() {
|
|
394
|
+
return css`${cssContent}`;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
**Step 2: Commit**
|
|
400
|
+
|
|
401
|
+
```bash
|
|
402
|
+
git add components/action-bar/snice-action-bar.ts
|
|
403
|
+
git commit -m "feat(action-bar): add component implementation"
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
---
|
|
407
|
+
|
|
408
|
+
### Task 5: Unit tests
|
|
409
|
+
|
|
410
|
+
**Files:**
|
|
411
|
+
- Create: `tests/components/action-bar.test.ts`
|
|
412
|
+
- Reference: `tests/components/banner.test.ts` for pattern
|
|
413
|
+
|
|
414
|
+
**Step 1: Write tests**
|
|
415
|
+
|
|
416
|
+
Test the following:
|
|
417
|
+
- Renders with default properties
|
|
418
|
+
- `open` property shows/hides
|
|
419
|
+
- `show()`, `hide()`, `toggle()` methods work
|
|
420
|
+
- `action-bar-open` and `action-bar-close` events fire
|
|
421
|
+
- `position` attribute renders correct positioning
|
|
422
|
+
- `variant="pill"` applies pill style
|
|
423
|
+
- `size="small"` applies small size
|
|
424
|
+
- `no-animation` mode: always visible
|
|
425
|
+
- `Escape` key calls hide
|
|
426
|
+
- `no-escape-dismiss` prevents Escape from closing
|
|
427
|
+
- Arrow key navigation between slotted children
|
|
428
|
+
- Slotted content renders in the slot
|
|
429
|
+
|
|
430
|
+
Use `createComponent`, `removeComponent`, `queryShadow`, `wait` from test utils. Import the component and types. Use `await el.ready` before assertions.
|
|
431
|
+
|
|
432
|
+
**Step 2: Run tests to verify they fail**
|
|
433
|
+
|
|
434
|
+
```bash
|
|
435
|
+
npm run test:src -- --grep "action-bar"
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
Expected: FAIL (component not built yet — but files exist)
|
|
439
|
+
|
|
440
|
+
**Step 3: Run tests to verify they pass**
|
|
441
|
+
|
|
442
|
+
```bash
|
|
443
|
+
npm run test:src -- --grep "action-bar"
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
Expected: All PASS
|
|
447
|
+
|
|
448
|
+
**Step 4: Commit**
|
|
449
|
+
|
|
450
|
+
```bash
|
|
451
|
+
git add tests/components/action-bar.test.ts
|
|
452
|
+
git commit -m "test(action-bar): add unit tests"
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
---
|
|
456
|
+
|
|
457
|
+
### Task 6: Demo page
|
|
458
|
+
|
|
459
|
+
**Files:**
|
|
460
|
+
- Create: `components/action-bar/demo.html`
|
|
461
|
+
- Reference: `components/banner/demo.html` for pattern
|
|
462
|
+
|
|
463
|
+
**Step 1: Write demo**
|
|
464
|
+
|
|
465
|
+
Create a demo page that shows:
|
|
466
|
+
- Basic action-bar with icon buttons (default variant)
|
|
467
|
+
- Pill variant
|
|
468
|
+
- All position values (top, bottom, left, right, corners)
|
|
469
|
+
- Size small vs medium
|
|
470
|
+
- Animated show/hide (hover a card to trigger)
|
|
471
|
+
- Always-visible (no-animation) mode
|
|
472
|
+
- Works in both light and dark mode (use theme tokens)
|
|
473
|
+
|
|
474
|
+
**Step 2: Manual test**
|
|
475
|
+
|
|
476
|
+
```bash
|
|
477
|
+
npm run dev
|
|
478
|
+
# Open http://localhost:5566/components/action-bar/demo.html
|
|
479
|
+
# Verify light mode, dark mode, hover animations
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
**Step 3: Commit**
|
|
483
|
+
|
|
484
|
+
```bash
|
|
485
|
+
git add components/action-bar/demo.html
|
|
486
|
+
git commit -m "feat(action-bar): add demo page"
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
---
|
|
490
|
+
|
|
491
|
+
### Task 7: Full showcase
|
|
492
|
+
|
|
493
|
+
**Files:**
|
|
494
|
+
- Create: `components/action-bar/full-showcase.html`
|
|
495
|
+
|
|
496
|
+
**Step 1: Write full showcase**
|
|
497
|
+
|
|
498
|
+
Demo ALL features: variants, sizes, positions, animation modes, keyboard nav. Follow existing full-showcase patterns from other components.
|
|
499
|
+
|
|
500
|
+
**Step 2: Commit**
|
|
501
|
+
|
|
502
|
+
```bash
|
|
503
|
+
git add components/action-bar/full-showcase.html
|
|
504
|
+
git commit -m "feat(action-bar): add full showcase"
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
---
|
|
508
|
+
|
|
509
|
+
### Task 8: Documentation
|
|
510
|
+
|
|
511
|
+
**Files:**
|
|
512
|
+
- Create: `docs/components/action-bar.md` (human-friendly)
|
|
513
|
+
- Create: `docs/ai/components/action-bar.md` (token-efficient)
|
|
514
|
+
- Reference: `.ai/component-docs-guide.md` for exact format
|
|
515
|
+
|
|
516
|
+
**Step 1: Write human docs**
|
|
517
|
+
|
|
518
|
+
Follow the section order from component-docs-guide.md:
|
|
519
|
+
1. Title + tag name
|
|
520
|
+
2. One-sentence description
|
|
521
|
+
3. Basic usage
|
|
522
|
+
4. Import paths (ESM + CDN)
|
|
523
|
+
5. Examples (variants, sizes, positions, animation, keyboard)
|
|
524
|
+
6. Slots
|
|
525
|
+
7. Properties table
|
|
526
|
+
8. Events table
|
|
527
|
+
9. Methods table
|
|
528
|
+
10. CSS Custom Properties table
|
|
529
|
+
|
|
530
|
+
**Step 2: Write AI docs**
|
|
531
|
+
|
|
532
|
+
Token-efficient format:
|
|
533
|
+
- TypeScript property signatures in code block
|
|
534
|
+
- Bullets for slots, events, methods
|
|
535
|
+
- One usage block
|
|
536
|
+
- 50-150 lines max
|
|
537
|
+
|
|
538
|
+
**Step 3: Commit**
|
|
539
|
+
|
|
540
|
+
```bash
|
|
541
|
+
git add docs/components/action-bar.md docs/ai/components/action-bar.md
|
|
542
|
+
git commit -m "docs(action-bar): add human and AI documentation"
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
---
|
|
546
|
+
|
|
547
|
+
### Task 9: React adapter + tests
|
|
548
|
+
|
|
549
|
+
**Files:**
|
|
550
|
+
- Modify: `scripts/generate-react-tests.js` (add test metadata)
|
|
551
|
+
- Reference: `scripts/generate-react-adapters.js` (auto-discovers, no changes needed)
|
|
552
|
+
|
|
553
|
+
**Step 1: Add test metadata to generate-react-tests.js**
|
|
554
|
+
|
|
555
|
+
Add entry for action-bar with properties, events, variants, sizes.
|
|
556
|
+
|
|
557
|
+
**Step 2: Generate adapters and tests**
|
|
558
|
+
|
|
559
|
+
```bash
|
|
560
|
+
npm run generate:react-adapters
|
|
561
|
+
npm run generate:react-tests
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
**Step 3: Run React tests**
|
|
565
|
+
|
|
566
|
+
```bash
|
|
567
|
+
npm run test:react-adapters -- --grep "action-bar"
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
Expected: PASS
|
|
571
|
+
|
|
572
|
+
**Step 4: Commit**
|
|
573
|
+
|
|
574
|
+
```bash
|
|
575
|
+
git add scripts/generate-react-tests.js adapters/react/ tests/react-adapters/
|
|
576
|
+
git commit -m "feat(action-bar): add React adapter and tests"
|
|
577
|
+
```
|
|
578
|
+
|
|
579
|
+
---
|
|
580
|
+
|
|
581
|
+
### Task 10: Website showcase
|
|
582
|
+
|
|
583
|
+
**Files:**
|
|
584
|
+
- Create: `public/showcases/action-bar.html` (fragment)
|
|
585
|
+
- Modify: `public/showcases/manifest.json` (add entry)
|
|
586
|
+
- Modify: `public/showcases/_footer.html` (add script tag + comp-list entry)
|
|
587
|
+
|
|
588
|
+
**Step 1: Write showcase fragment**
|
|
589
|
+
|
|
590
|
+
Start with `<div class="comp-section">`, use `comp-split` layout pattern. Interactive demo with hover trigger.
|
|
591
|
+
|
|
592
|
+
**Step 2: Add to manifest.json**
|
|
593
|
+
|
|
594
|
+
Add `"action-bar.html"` in the appropriate category section.
|
|
595
|
+
|
|
596
|
+
**Step 3: Add script tag and comp-list entry to _footer.html**
|
|
597
|
+
|
|
598
|
+
**Step 4: Rebuild showcases**
|
|
599
|
+
|
|
600
|
+
```bash
|
|
601
|
+
node public/build-showcases.js
|
|
602
|
+
```
|
|
603
|
+
|
|
604
|
+
**Step 5: Commit**
|
|
605
|
+
|
|
606
|
+
```bash
|
|
607
|
+
git add public/showcases/action-bar.html public/showcases/manifest.json public/showcases/_footer.html public/components.html
|
|
608
|
+
git commit -m "feat(action-bar): add website showcase"
|
|
609
|
+
```
|
|
610
|
+
|
|
611
|
+
---
|
|
612
|
+
|
|
613
|
+
### Task 11: Build and final verification
|
|
614
|
+
|
|
615
|
+
**Step 1: Remove from WIP**
|
|
616
|
+
|
|
617
|
+
Remove `action-bar` from `components/.wip`.
|
|
618
|
+
|
|
619
|
+
**Step 2: Full build**
|
|
620
|
+
|
|
621
|
+
```bash
|
|
622
|
+
npm run build
|
|
623
|
+
```
|
|
624
|
+
|
|
625
|
+
Expected: SUCCESS
|
|
626
|
+
|
|
627
|
+
**Step 3: CDN build**
|
|
628
|
+
|
|
629
|
+
```bash
|
|
630
|
+
npx snice build-component action-bar
|
|
631
|
+
```
|
|
632
|
+
|
|
633
|
+
**Step 4: Copy CDN to public**
|
|
634
|
+
|
|
635
|
+
```bash
|
|
636
|
+
node scripts/build-website.js
|
|
637
|
+
```
|
|
638
|
+
|
|
639
|
+
**Step 5: Run all tests**
|
|
640
|
+
|
|
641
|
+
```bash
|
|
642
|
+
npm test
|
|
643
|
+
```
|
|
644
|
+
|
|
645
|
+
Expected: ALL PASS
|
|
646
|
+
|
|
647
|
+
**Step 6: Verify against component checklist**
|
|
648
|
+
|
|
649
|
+
Run through every item in `.ai/component-checklist.md`:
|
|
650
|
+
- [ ] Pre-implementation items
|
|
651
|
+
- [ ] Implementation items
|
|
652
|
+
- [ ] Testing items
|
|
653
|
+
- [ ] React adapter items
|
|
654
|
+
- [ ] CDN build items
|
|
655
|
+
- [ ] Documentation items
|
|
656
|
+
- [ ] MCP server catalogue items
|
|
657
|
+
- [ ] Website integration items
|
|
658
|
+
- [ ] Final verification items
|
|
659
|
+
|
|
660
|
+
**Step 7: Commit**
|
|
661
|
+
|
|
662
|
+
```bash
|
|
663
|
+
git add .
|
|
664
|
+
git commit -m "feat(action-bar): complete component, remove from WIP"
|
|
665
|
+
```
|
|
666
|
+
|
|
667
|
+
---
|
|
668
|
+
|
|
669
|
+
### Stretch Goal: `for` attribute
|
|
670
|
+
|
|
671
|
+
Deferred to a follow-up task. When implemented:
|
|
672
|
+
- `for` property (string selector)
|
|
673
|
+
- `@ready()` resolves element via `this.closest(selector)` then `document.querySelector(selector)`
|
|
674
|
+
- Attaches mouseenter/mouseleave listeners
|
|
675
|
+
- `@dispose()` cleans up
|
|
676
|
+
- `@watch('for')` re-binds on change
|