@sableui/react 0.6.1 → 0.7.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/AGENTS.md +2 -2
- package/CHANGELOG.md +285 -0
- package/CONTRIBUTING.md +16 -10
- package/DESIGN.md +3 -3
- package/README.md +3 -3
- package/bin/sable-lint.mjs +18 -0
- package/bin/sable.mjs +470 -62
- package/dist/blocks/api-keys-block.js +44 -0
- package/dist/blocks/api-keys-block.meta.js +21 -0
- package/dist/blocks/chat-thread-block.js +17 -0
- package/dist/blocks/chat-thread-block.meta.js +20 -0
- package/dist/blocks/command-palette-block.js +24 -0
- package/dist/blocks/command-palette-block.meta.js +21 -0
- package/dist/blocks/cta-band-block.js +27 -0
- package/dist/blocks/cta-band-block.meta.js +20 -0
- package/dist/blocks/danger-zone-block.js +39 -0
- package/dist/blocks/danger-zone-block.meta.js +21 -0
- package/dist/blocks/device-comparison-block.js +69 -0
- package/dist/blocks/device-comparison-block.meta.js +21 -0
- package/dist/blocks/event-card-block.js +40 -0
- package/dist/blocks/event-card-block.meta.js +21 -0
- package/dist/blocks/faq-block.js +38 -0
- package/dist/blocks/faq-block.meta.js +20 -0
- package/dist/blocks/feature-grid-block.js +38 -0
- package/dist/blocks/feature-grid-block.meta.js +21 -0
- package/dist/blocks/feedback-form-block.js +30 -0
- package/dist/blocks/feedback-form-block.meta.js +21 -0
- package/dist/blocks/goal-progress-block.js +24 -0
- package/dist/blocks/goal-progress-block.meta.js +21 -0
- package/dist/blocks/hero-block.js +33 -0
- package/dist/blocks/hero-block.meta.js +21 -0
- package/dist/blocks/index.js +162 -1964
- package/dist/blocks/invite-team-block.js +36 -0
- package/dist/blocks/invite-team-block.meta.js +20 -0
- package/dist/blocks/invoice-history-block.js +41 -0
- package/dist/blocks/invoice-history-block.meta.js +21 -0
- package/dist/blocks/kpi-sparkline-block.js +29 -0
- package/dist/blocks/kpi-sparkline-block.meta.js +20 -0
- package/dist/blocks/media-player-block.js +68 -0
- package/dist/blocks/media-player-block.meta.js +21 -0
- package/dist/blocks/newsletter-block.js +35 -0
- package/dist/blocks/newsletter-block.meta.js +21 -0
- package/dist/blocks/not-found-block.js +27 -0
- package/dist/blocks/not-found-block.meta.js +20 -0
- package/dist/blocks/notification-list-block.js +32 -0
- package/dist/blocks/notification-list-block.meta.js +21 -0
- package/dist/blocks/notification-settings-block.js +25 -0
- package/dist/blocks/notification-settings-block.meta.js +20 -0
- package/dist/blocks/order-tracking-block.js +26 -0
- package/dist/blocks/order-tracking-block.meta.js +20 -0
- package/dist/blocks/pricing-card-block.js +46 -0
- package/dist/blocks/pricing-card-block.meta.js +21 -0
- package/dist/blocks/pricing-table-block.js +88 -0
- package/dist/blocks/pricing-table-block.meta.js +20 -0
- package/dist/blocks/product-card-block.js +26 -0
- package/dist/blocks/product-card-block.meta.js +21 -0
- package/dist/blocks/profile-card-block.js +58 -0
- package/dist/blocks/profile-card-block.meta.js +21 -0
- package/dist/blocks/profile-form-block.js +70 -0
- package/dist/blocks/profile-form-block.meta.js +21 -0
- package/dist/blocks/revenue-breakdown-block.js +38 -0
- package/dist/blocks/revenue-breakdown-block.meta.js +21 -0
- package/dist/blocks/sign-in-block.js +38 -0
- package/dist/blocks/sign-in-block.meta.js +21 -0
- package/dist/blocks/sign-up-block.js +48 -0
- package/dist/blocks/sign-up-block.meta.js +21 -0
- package/dist/blocks/site-footer-block.js +54 -0
- package/dist/blocks/site-footer-block.meta.js +20 -0
- package/dist/blocks/stat-row-block.js +28 -0
- package/dist/blocks/stat-row-block.meta.js +21 -0
- package/dist/blocks/steps-block.js +37 -0
- package/dist/blocks/steps-block.meta.js +20 -0
- package/dist/blocks/task-list-block.js +52 -0
- package/dist/blocks/task-list-block.meta.js +21 -0
- package/dist/blocks/team-members-block.js +49 -0
- package/dist/blocks/team-members-block.meta.js +21 -0
- package/dist/blocks/testimonial-block.js +49 -0
- package/dist/blocks/testimonial-block.meta.js +20 -0
- package/dist/blocks/traffic-sources-block.js +39 -0
- package/dist/blocks/traffic-sources-block.meta.js +21 -0
- package/dist/blocks/traffic-trend-block.js +61 -0
- package/dist/blocks/traffic-trend-block.meta.js +21 -0
- package/dist/blocks/upload-list-block.js +39 -0
- package/dist/blocks/upload-list-block.meta.js +21 -0
- package/dist/blocks/verify-code-block.js +28 -0
- package/dist/blocks/verify-code-block.meta.js +21 -0
- package/dist/blocks/wallet-block.js +48 -0
- package/dist/blocks/wallet-block.meta.js +21 -0
- package/dist/components/accordion/accordion.js +63 -0
- package/dist/components/accordion/accordion.meta.js +155 -0
- package/dist/components/accordion/index.js +15 -0
- package/dist/components/app-header/app-header.js +30 -0
- package/dist/components/app-header/app-header.meta.js +88 -0
- package/dist/components/app-header/index.js +7 -0
- package/dist/components/app-shell/app-shell-dock.js +37 -0
- package/dist/components/app-shell/app-shell.js +67 -0
- package/dist/components/app-shell/app-shell.meta.js +176 -0
- package/dist/components/app-shell/index.js +7 -0
- package/dist/components/area-chart/area-chart.js +10 -0
- package/dist/components/area-chart/area-chart.meta.js +218 -0
- package/dist/components/area-chart/index.js +7 -0
- package/dist/components/attachment/attachment.js +176 -0
- package/dist/components/attachment/attachment.meta.js +179 -0
- package/dist/components/attachment/attachment.variants.js +47 -0
- package/dist/components/attachment/index.js +7 -0
- package/dist/components/avatar/avatar.js +192 -0
- package/dist/components/avatar/avatar.meta.js +233 -0
- package/dist/components/avatar/avatar.variants.js +44 -0
- package/dist/components/avatar/index.js +22 -0
- package/dist/components/badge/badge.js +26 -0
- package/dist/components/badge/badge.meta.js +171 -0
- package/dist/components/badge/badge.variants.js +103 -0
- package/dist/components/badge/index.js +11 -0
- package/dist/components/banner/banner.js +76 -0
- package/dist/components/banner/banner.meta.js +172 -0
- package/dist/components/banner/banner.variants.js +44 -0
- package/dist/components/banner/index.js +9 -0
- package/dist/components/bar-chart/bar-chart.js +10 -0
- package/dist/components/bar-chart/bar-chart.meta.js +245 -0
- package/dist/components/bar-chart/index.js +7 -0
- package/dist/components/bottom-nav/bottom-nav.js +63 -0
- package/dist/components/bottom-nav/bottom-nav.meta.js +95 -0
- package/dist/components/bottom-nav/index.js +11 -0
- package/dist/components/breadcrumbs/breadcrumbs.js +90 -0
- package/dist/components/breadcrumbs/breadcrumbs.meta.js +111 -0
- package/dist/components/breadcrumbs/index.js +17 -0
- package/dist/components/browser/browser.js +39 -0
- package/dist/components/browser/browser.meta.js +80 -0
- package/dist/components/browser/index.js +7 -0
- package/dist/components/bubble/bubble.js +110 -0
- package/dist/components/bubble/bubble.meta.js +158 -0
- package/dist/components/bubble/bubble.variants.js +90 -0
- package/dist/components/bubble/index.js +13 -0
- package/dist/components/button/button.js +87 -0
- package/dist/components/button/button.meta.js +302 -0
- package/dist/components/button/button.variants.js +137 -0
- package/dist/components/button/index.js +9 -0
- package/dist/components/calendar/calendar.js +89 -0
- package/dist/components/calendar/calendar.meta.js +136 -0
- package/dist/components/calendar/index.js +7 -0
- package/dist/components/card/card.js +200 -0
- package/dist/components/card/card.meta.js +212 -0
- package/dist/components/card/index.js +23 -0
- package/dist/components/carousel/carousel.js +428 -0
- package/dist/components/carousel/carousel.meta.js +100 -0
- package/dist/components/carousel/index.js +7 -0
- package/dist/components/chat-composer/chat-composer.js +174 -0
- package/dist/components/chat-composer/chat-composer.meta.js +241 -0
- package/dist/components/chat-composer/chat-composer.variants.js +17 -0
- package/dist/components/chat-composer/index.js +7 -0
- package/dist/components/checkbox/checkbox-mark.js +28 -0
- package/dist/components/checkbox/checkbox.js +30 -0
- package/dist/components/checkbox/checkbox.meta.js +127 -0
- package/dist/components/checkbox/index.js +7 -0
- package/dist/components/checkbox-card/checkbox-card.js +94 -0
- package/dist/components/checkbox-card/checkbox-card.meta.js +154 -0
- package/dist/components/checkbox-card/checkbox-card.variants.js +43 -0
- package/dist/components/checkbox-card/index.js +11 -0
- package/dist/components/code/code.js +19 -0
- package/dist/components/code/code.meta.js +71 -0
- package/dist/components/code/index.js +7 -0
- package/dist/components/code-block/code-block.js +84 -0
- package/dist/components/code-block/code-block.meta.js +103 -0
- package/dist/components/code-block/index.js +8 -0
- package/dist/components/collapsible/collapsible.js +38 -0
- package/dist/components/collapsible/collapsible.meta.js +117 -0
- package/dist/components/collapsible/index.js +15 -0
- package/dist/components/color-field/color-field.js +293 -0
- package/dist/components/color-field/color-field.meta.js +142 -0
- package/dist/components/color-field/color.js +69 -0
- package/dist/components/color-field/index.js +15 -0
- package/dist/components/combobox/combobox.js +486 -0
- package/dist/components/combobox/combobox.meta.js +217 -0
- package/dist/components/combobox/index.js +37 -0
- package/dist/components/command-menu/command-menu-trigger.js +122 -0
- package/dist/components/command-menu/command-menu.js +433 -0
- package/dist/components/command-menu/command-menu.meta.js +279 -0
- package/dist/components/command-menu/index.js +21 -0
- package/dist/components/context-card/context-card.js +62 -0
- package/dist/components/context-card/context-card.meta.js +106 -0
- package/dist/components/context-card/index.js +17 -0
- package/dist/components/context-menu/context-menu.js +92 -0
- package/dist/components/context-menu/context-menu.meta.js +138 -0
- package/dist/components/context-menu/index.js +23 -0
- package/dist/components/data-table/data-table.js +142 -0
- package/dist/components/data-table/data-table.meta.js +146 -0
- package/dist/components/data-table/index.js +9 -0
- package/dist/components/date-picker/date-picker.js +196 -0
- package/dist/components/date-picker/date-picker.meta.js +164 -0
- package/dist/components/date-picker/index.js +7 -0
- package/dist/components/date-tile/date-tile.js +29 -0
- package/dist/components/date-tile/date-tile.meta.js +72 -0
- package/dist/components/date-tile/index.js +7 -0
- package/dist/components/destructive-action-modal/destructive-action-modal.js +130 -0
- package/dist/components/destructive-action-modal/destructive-action-modal.meta.js +136 -0
- package/dist/components/destructive-action-modal/index.js +9 -0
- package/dist/components/dialog/dialog.js +207 -0
- package/dist/components/dialog/dialog.meta.js +239 -0
- package/dist/components/dialog/index.js +45 -0
- package/dist/components/disclosure-picker/disclosure-picker.js +417 -0
- package/dist/components/disclosure-picker/disclosure-picker.meta.js +213 -0
- package/dist/components/disclosure-picker/index.js +21 -0
- package/dist/components/empty-state/empty-state.js +52 -0
- package/dist/components/empty-state/empty-state.meta.js +158 -0
- package/dist/components/empty-state/index.js +7 -0
- package/dist/components/entity/entity.js +70 -0
- package/dist/components/entity/entity.meta.js +108 -0
- package/dist/components/entity/entity.variants.js +16 -0
- package/dist/components/entity/index.js +7 -0
- package/dist/components/feedback/feedback.js +93 -0
- package/dist/components/feedback/feedback.meta.js +109 -0
- package/dist/components/feedback/index.js +7 -0
- package/dist/components/fieldset/fieldset.js +80 -0
- package/dist/components/fieldset/fieldset.meta.js +160 -0
- package/dist/components/fieldset/index.js +17 -0
- package/dist/components/file-dropzone/file-dropzone.js +193 -0
- package/dist/components/file-dropzone/file-dropzone.meta.js +210 -0
- package/dist/components/file-dropzone/file-dropzone.variants.js +26 -0
- package/dist/components/file-dropzone/index.js +13 -0
- package/dist/components/font-picker/font-picker.js +77 -0
- package/dist/components/font-picker/font-picker.meta.js +119 -0
- package/dist/components/font-picker/index.js +7 -0
- package/dist/components/form/form.js +145 -0
- package/dist/components/form/form.meta.js +142 -0
- package/dist/components/form/index.js +11 -0
- package/dist/components/gliding-highlight/gliding-highlight.js +50 -0
- package/dist/components/gliding-highlight/gliding-highlight.meta.js +135 -0
- package/dist/components/gliding-highlight/index.js +9 -0
- package/dist/components/gradient-art/gradient-art.js +168 -0
- package/dist/components/gradient-art/gradient-art.meta.js +81 -0
- package/dist/components/gradient-art/index.js +7 -0
- package/dist/components/gradient-art/renderer.js +336 -0
- package/dist/components/inline-status/index.js +7 -0
- package/dist/components/inline-status/inline-status.js +33 -0
- package/dist/components/inline-status/inline-status.meta.js +83 -0
- package/dist/components/inline-status/inline-status.variants.js +18 -0
- package/dist/components/input/index.js +7 -0
- package/dist/components/input/input.js +33 -0
- package/dist/components/input/input.meta.js +155 -0
- package/dist/components/kbd/index.js +8 -0
- package/dist/components/kbd/kbd.js +54 -0
- package/dist/components/kbd/kbd.meta.js +95 -0
- package/dist/components/label/index.js +7 -0
- package/dist/components/label/label.js +51 -0
- package/dist/components/label/label.meta.js +98 -0
- package/dist/components/line-chart/index.js +7 -0
- package/dist/components/line-chart/line-chart.js +10 -0
- package/dist/components/line-chart/line-chart.meta.js +222 -0
- package/dist/components/marker/index.js +7 -0
- package/dist/components/marker/marker.js +39 -0
- package/dist/components/marker/marker.meta.js +132 -0
- package/dist/components/marker/marker.variants.js +25 -0
- package/dist/components/marquee/index.js +7 -0
- package/dist/components/marquee/marquee.js +146 -0
- package/dist/components/marquee/marquee.meta.js +106 -0
- package/dist/components/media-image/index.js +7 -0
- package/dist/components/media-image/media-image.js +56 -0
- package/dist/components/media-image/media-image.meta.js +92 -0
- package/dist/components/media-tile/index.js +7 -0
- package/dist/components/media-tile/media-tile.js +135 -0
- package/dist/components/media-tile/media-tile.meta.js +133 -0
- package/dist/components/media-tile/media-tile.variants.js +48 -0
- package/dist/components/menu/index.js +33 -0
- package/dist/components/menu/menu.js +168 -0
- package/dist/components/menu/menu.meta.js +176 -0
- package/dist/components/message/index.js +7 -0
- package/dist/components/message/message.js +83 -0
- package/dist/components/message/message.meta.js +150 -0
- package/dist/components/message/message.variants.js +41 -0
- package/dist/components/message-scroller/index.js +9 -0
- package/dist/components/message-scroller/message-scroller.js +300 -0
- package/dist/components/message-scroller/message-scroller.meta.js +172 -0
- package/dist/components/meter/index.js +20 -0
- package/dist/components/meter/meter.js +112 -0
- package/dist/components/meter/meter.meta.js +227 -0
- package/dist/components/meter/meter.variants.js +61 -0
- package/dist/components/middle-truncate/index.js +7 -0
- package/dist/components/middle-truncate/middle-truncate.js +28 -0
- package/dist/components/middle-truncate/middle-truncate.meta.js +77 -0
- package/dist/components/note/index.js +9 -0
- package/dist/components/note/note.js +73 -0
- package/dist/components/note/note.meta.js +112 -0
- package/dist/components/note/note.variants.js +22 -0
- package/dist/components/notification-badge/index.js +15 -0
- package/dist/components/notification-badge/notification-badge.js +48 -0
- package/dist/components/notification-badge/notification-badge.meta.js +107 -0
- package/dist/components/notification-badge/notification-badge.variants.js +57 -0
- package/dist/components/number-field/index.js +7 -0
- package/dist/components/number-field/number-field.js +70 -0
- package/dist/components/number-field/number-field.meta.js +109 -0
- package/dist/components/otp-field/index.js +7 -0
- package/dist/components/otp-field/otp-field.js +70 -0
- package/dist/components/otp-field/otp-field.meta.js +197 -0
- package/dist/components/overflow-menu/index.js +7 -0
- package/dist/components/overflow-menu/overflow-menu.js +26 -0
- package/dist/components/overflow-menu/overflow-menu.meta.js +100 -0
- package/dist/components/page-header/index.js +7 -0
- package/dist/components/page-header/page-header.js +34 -0
- package/dist/components/page-header/page-header.meta.js +104 -0
- package/dist/components/page-loader/index.js +7 -0
- package/dist/components/page-loader/page-loader.js +37 -0
- package/dist/components/page-loader/page-loader.meta.js +85 -0
- package/dist/components/pagination/index.js +7 -0
- package/dist/components/pagination/pagination.js +105 -0
- package/dist/components/pagination/pagination.meta.js +141 -0
- package/dist/components/panel-group/index.js +10 -0
- package/dist/components/panel-group/panel-group.js +168 -0
- package/dist/components/panel-group/panel-group.meta.js +153 -0
- package/dist/components/panel-section/index.js +9 -0
- package/dist/components/panel-section/panel-section.js +115 -0
- package/dist/components/panel-section/panel-section.meta.js +156 -0
- package/dist/components/phone/index.js +7 -0
- package/dist/components/phone/phone.js +50 -0
- package/dist/{chunk-KFZ43RKU.js → components/phone/phone.meta.js} +3 -50
- package/dist/{chunk-NEQNXI2G.js → components/phone/status-icons.js} +4 -4
- package/dist/components/pie-chart/index.js +7 -0
- package/dist/components/pie-chart/pie-chart.js +191 -0
- package/dist/components/pie-chart/pie-chart.meta.js +210 -0
- package/dist/components/pill/index.js +9 -0
- package/dist/components/pill/pill.js +24 -0
- package/dist/components/pill/pill.meta.js +108 -0
- package/dist/components/pill/pill.variants.js +65 -0
- package/dist/components/popover/index.js +23 -0
- package/dist/components/popover/popover.js +100 -0
- package/dist/components/popover/popover.meta.js +136 -0
- package/dist/components/progress/index.js +19 -0
- package/dist/components/progress/progress.js +70 -0
- package/dist/components/progress/progress.meta.js +171 -0
- package/dist/components/progress/progress.variants.js +17 -0
- package/dist/components/radar-chart/index.js +7 -0
- package/dist/components/radar-chart/radar-chart.js +161 -0
- package/dist/components/radar-chart/radar-chart.meta.js +204 -0
- package/dist/components/radial-chart/index.js +7 -0
- package/dist/components/radial-chart/radial-chart.js +175 -0
- package/dist/components/radial-chart/radial-chart.meta.js +216 -0
- package/dist/components/radio/index.js +8 -0
- package/dist/components/radio/radio.js +39 -0
- package/dist/components/radio/radio.meta.js +104 -0
- package/dist/components/radio-card/index.js +7 -0
- package/dist/components/radio-card/radio-card.js +81 -0
- package/dist/components/radio-card/radio-card.meta.js +144 -0
- package/dist/components/radio-card/radio-card.variants.js +43 -0
- package/dist/components/relative-time/index.js +7 -0
- package/dist/components/relative-time/relative-time.js +47 -0
- package/dist/components/relative-time/relative-time.meta.js +77 -0
- package/dist/components/scroller/index.js +7 -0
- package/dist/components/scroller/scroller.js +111 -0
- package/dist/components/scroller/scroller.meta.js +118 -0
- package/dist/components/scrub-field/index.js +7 -0
- package/dist/components/scrub-field/scrub-field.js +124 -0
- package/dist/components/scrub-field/scrub-field.meta.js +139 -0
- package/dist/components/search-input/index.js +7 -0
- package/dist/components/search-input/search-input.js +91 -0
- package/dist/components/search-input/search-input.meta.js +129 -0
- package/dist/components/section-header/index.js +7 -0
- package/dist/components/section-header/section-header.js +39 -0
- package/dist/components/section-header/section-header.meta.js +174 -0
- package/dist/components/segmented-bar/index.js +14 -0
- package/dist/components/segmented-bar/segmented-bar.js +26 -0
- package/dist/components/segmented-bar/segmented-bar.meta.js +108 -0
- package/dist/components/segmented-bar/segmented-bar.variants.js +39 -0
- package/dist/components/select/index.js +25 -0
- package/dist/components/select/select.js +191 -0
- package/dist/components/select/select.meta.js +189 -0
- package/dist/components/separator/index.js +7 -0
- package/dist/components/separator/separator.js +42 -0
- package/dist/components/separator/separator.meta.js +84 -0
- package/dist/components/settings-menu/index.js +11 -0
- package/dist/components/settings-menu/settings-menu.js +101 -0
- package/dist/components/settings-menu/settings-menu.meta.js +177 -0
- package/dist/components/settings-menu/settings-menu.variants.js +15 -0
- package/dist/components/sheet/index.js +29 -0
- package/dist/components/sheet/sheet.js +121 -0
- package/dist/components/sheet/sheet.meta.js +167 -0
- package/dist/components/sheet/sheet.variants.js +21 -0
- package/dist/components/show-more/index.js +7 -0
- package/dist/components/show-more/show-more.js +87 -0
- package/dist/components/show-more/show-more.meta.js +79 -0
- package/dist/components/side-nav/index.js +13 -0
- package/dist/components/side-nav/side-nav.js +75 -0
- package/dist/components/side-nav/side-nav.meta.js +139 -0
- package/dist/components/side-nav/side-nav.variants.js +33 -0
- package/dist/components/sidebar/index.js +21 -0
- package/dist/components/sidebar/sidebar.js +196 -0
- package/dist/components/sidebar/sidebar.meta.js +118 -0
- package/dist/components/skeleton/index.js +7 -0
- package/dist/components/skeleton/skeleton.js +16 -0
- package/dist/components/skeleton/skeleton.meta.js +90 -0
- package/dist/components/slider/index.js +21 -0
- package/dist/components/slider/slider.js +115 -0
- package/dist/components/slider/slider.meta.js +214 -0
- package/dist/components/sparkline/index.js +7 -0
- package/dist/components/sparkline/sparkline.js +84 -0
- package/dist/components/sparkline/sparkline.meta.js +147 -0
- package/dist/components/spinner/index.js +7 -0
- package/dist/components/spinner/spinner.js +59 -0
- package/dist/components/spinner/spinner.meta.js +118 -0
- package/dist/components/status-bar/index.js +9 -0
- package/dist/components/status-bar/status-bar.js +40 -0
- package/dist/components/status-bar/status-bar.meta.js +117 -0
- package/dist/components/status-dot/index.js +9 -0
- package/dist/components/status-dot/status-dot.js +40 -0
- package/dist/components/status-dot/status-dot.meta.js +113 -0
- package/dist/components/status-dot/status-dot.variants.js +28 -0
- package/dist/components/stepper/index.js +17 -0
- package/dist/components/stepper/stepper.js +161 -0
- package/dist/components/stepper/stepper.meta.js +190 -0
- package/dist/components/stepper/stepper.variants.js +72 -0
- package/dist/components/streaming-text/index.js +7 -0
- package/dist/components/streaming-text/streaming-text.js +55 -0
- package/dist/components/streaming-text/streaming-text.meta.js +147 -0
- package/dist/components/switch/index.js +7 -0
- package/dist/components/switch/switch.js +26 -0
- package/dist/components/switch/switch.meta.js +133 -0
- package/dist/components/table/index.js +23 -0
- package/dist/components/table/table.js +117 -0
- package/dist/components/table/table.meta.js +143 -0
- package/dist/components/tabs/index.js +17 -0
- package/dist/components/tabs/tabs.js +58 -0
- package/dist/components/tabs/tabs.meta.js +120 -0
- package/dist/components/textarea/index.js +7 -0
- package/dist/components/textarea/textarea.js +38 -0
- package/dist/components/textarea/textarea.meta.js +117 -0
- package/dist/components/theme-selector/index.js +11 -0
- package/dist/components/theme-selector/theme-selector.js +145 -0
- package/dist/components/theme-selector/theme-selector.meta.js +181 -0
- package/dist/components/theme-switcher/index.js +7 -0
- package/dist/components/theme-switcher/theme-switcher.js +106 -0
- package/dist/components/theme-switcher/theme-switcher.meta.js +99 -0
- package/dist/components/thinking-orb/index.js +9 -0
- package/dist/components/thinking-orb/thinking-orb.js +126 -0
- package/dist/components/thinking-orb/thinking-orb.meta.js +142 -0
- package/dist/components/thinking-orb/thinking-orb.render.js +252 -0
- package/dist/components/toast/index.js +29 -0
- package/dist/components/toast/toast.js +254 -0
- package/dist/components/toast/toast.meta.js +261 -0
- package/dist/components/toggle/index.js +13 -0
- package/dist/components/toggle/toggle.js +51 -0
- package/dist/components/toggle/toggle.meta.js +129 -0
- package/dist/components/toolbar/index.js +27 -0
- package/dist/components/toolbar/toolbar.js +80 -0
- package/dist/components/toolbar/toolbar.meta.js +272 -0
- package/dist/components/toolbar/toolbar.variants.js +16 -0
- package/dist/components/tooltip/index.js +21 -0
- package/dist/components/tooltip/tooltip.js +74 -0
- package/dist/components/tooltip/tooltip.meta.js +156 -0
- package/dist/components/tree/index.js +12 -0
- package/dist/components/tree/tree.js +364 -0
- package/dist/components/tree/tree.meta.js +334 -0
- package/dist/components/video/index.js +7 -0
- package/dist/components/video/video.js +59 -0
- package/dist/components/video/video.meta.js +81 -0
- package/dist/components/workspace/index.js +9 -0
- package/dist/components/workspace/workspace.js +79 -0
- package/dist/components/workspace/workspace.meta.js +183 -0
- package/dist/foundations/accessibility.js +107 -0
- package/dist/foundations/index.js +25 -792
- package/dist/foundations/motion.js +135 -0
- package/dist/foundations/scrolling.js +62 -0
- package/dist/foundations/shape.js +113 -0
- package/dist/foundations/spacing.js +121 -0
- package/dist/foundations/surfaces.js +107 -0
- package/dist/foundations/types.js +0 -0
- package/dist/foundations/typography.js +152 -0
- package/dist/icon/Icon.js +30 -0
- package/dist/icon/IconProvider.js +27 -0
- package/dist/icon/compose.js +13 -0
- package/dist/icon/index.d.ts +13 -5
- package/dist/icon/index.js +13 -2
- package/dist/icon/registry.js +0 -0
- package/dist/icon-sets/brands.generated.js +123 -0
- package/dist/icon-sets/brands.js +10 -123
- package/dist/icon-sets/reicon.d.ts +3 -1
- package/dist/icon-sets/reicon.js +209 -1
- package/dist/index.d.ts +611 -33
- package/dist/index.js +211 -11351
- package/dist/ios/chrome.js +36 -0
- package/dist/ios/index.js +19 -315
- package/dist/ios/liquid-glass.js +103 -0
- package/dist/ios/native-app.js +46 -0
- package/dist/ios/navigation.js +63 -0
- package/dist/ios/phone-frame.js +64 -0
- package/dist/ios/preview-theme.js +83 -0
- package/dist/ios/preview.js +10 -137
- package/dist/ios/sheet.js +85 -0
- package/dist/ios/theme.js +19 -0
- package/dist/layout/AspectBox.js +27 -0
- package/dist/layout/Bleed.js +15 -0
- package/dist/layout/Center.js +21 -0
- package/dist/layout/Columns.js +70 -0
- package/dist/layout/Grid.js +50 -0
- package/dist/layout/GridOverlay.js +41 -0
- package/dist/layout/Page.js +11 -0
- package/dist/layout/Region.js +39 -0
- package/dist/layout/Row.js +45 -0
- package/dist/layout/SafeArea.js +26 -0
- package/dist/layout/Spacer.js +9 -0
- package/dist/layout/SplitPane.js +55 -0
- package/dist/layout/Stack.js +42 -0
- package/dist/layout/_responsive.js +16 -0
- package/dist/layout/_safeArea.js +18 -0
- package/dist/layout/index.d.ts +25 -6
- package/dist/layout/index.js +14 -2
- package/dist/lib/anchored-scroll.js +7 -0
- package/dist/lib/bleed.js +7 -0
- package/dist/lib/chart/cartesian.js +365 -0
- package/dist/lib/chart/chart-frame.js +163 -0
- package/dist/lib/chart/chart-legend.js +13 -0
- package/dist/lib/chart/chart-tooltip.js +38 -0
- package/dist/lib/chart/format.js +19 -0
- package/dist/lib/chart/geometry.js +114 -0
- package/dist/lib/chart/motion.js +34 -0
- package/dist/lib/chart/scale.js +72 -0
- package/dist/lib/chart/types.js +45 -0
- package/dist/lib/chart/use-arrival.js +41 -0
- package/dist/{chunk-SRQWQUTW.js → lib/cn.js} +5 -5
- package/dist/lib/component-guidance.js +210 -0
- package/dist/lib/density.js +54 -0
- package/dist/lib/field-shell.js +11 -0
- package/dist/lib/glyphs.js +9 -0
- package/dist/lib/heading-row.js +36 -0
- package/dist/lib/highlight-glide.js +84 -0
- package/dist/lib/hit-target.js +5 -0
- package/dist/lib/meta.js +0 -0
- package/dist/lib/portal-theme-scope.js +74 -0
- package/dist/{chunk-FKZXAFIY.js → lib/presentation.js} +8 -3
- package/dist/lib/refs.js +14 -0
- package/dist/lib/scrub-gesture.js +50 -0
- package/dist/lib/segmented.js +13 -0
- package/dist/lib/selection-card.js +41 -0
- package/dist/lib/status-tone.js +13 -0
- package/dist/lib/taxonomy.js +214 -0
- package/dist/lib/trim-label.js +20 -0
- package/dist/lib/use-copy.js +27 -0
- package/dist/lib/use-edge-fade.js +32 -0
- package/dist/lib/use-isomorphic-layout-effect.js +8 -0
- package/dist/lib/use-resize-observer.js +18 -0
- package/dist/lib/use-scroll-activity.js +52 -0
- package/dist/lib/use-wheel-to-horizontal.js +65 -0
- package/dist/motion/MotionProvider.js +75 -0
- package/dist/motion/Presence.js +112 -0
- package/dist/motion/Reveal.js +42 -0
- package/dist/motion/TextReveal.js +61 -0
- package/dist/motion/index.js +24 -0
- package/dist/motion/useInView.js +36 -0
- package/dist/motion/useReducedMotion.js +25 -0
- package/dist/motion/viewTransition.js +47 -0
- package/dist/patterns/auth-page.js +90 -0
- package/dist/patterns/auth-page.meta.js +27 -0
- package/dist/patterns/brand-landing-page.js +341 -0
- package/dist/patterns/brand-landing-page.meta.js +28 -0
- package/dist/patterns/chat-panel.js +185 -0
- package/dist/patterns/chat-panel.meta.js +31 -0
- package/dist/patterns/dashboard-page.js +332 -0
- package/dist/patterns/dashboard-page.meta.js +29 -0
- package/dist/patterns/feed-page.js +205 -0
- package/dist/patterns/feed-page.meta.js +25 -0
- package/dist/patterns/index.js +34 -2140
- package/dist/patterns/landing-page.js +356 -0
- package/dist/patterns/landing-page.meta.js +26 -0
- package/dist/patterns/list-detail-page.js +373 -0
- package/dist/patterns/list-detail-page.meta.js +24 -0
- package/dist/patterns/settings-page.js +268 -0
- package/dist/patterns/settings-page.meta.js +27 -0
- package/dist/presets/index.js +43 -185
- package/dist/styles.css +118 -3
- package/dist/{theme-provider-kQszHYji.d.ts → theme-provider-S0NVJs2Y.d.ts} +6 -1
- package/dist/{chunk-NETUFI34.js → themes/_contract.js} +14 -2
- package/dist/themes/atelier/index.js +17 -1
- package/dist/themes/contrast.js +288 -0
- package/dist/themes/ember/ember.css +6 -6
- package/dist/themes/ember/index.js +16 -1
- package/dist/themes/index.d.ts +1 -1
- package/dist/themes/index.js +3 -8
- package/dist/themes/meridian/index.js +16 -1
- package/dist/themes/poppy/index.js +17 -1
- package/dist/themes/prism/index.js +17 -1
- package/dist/themes/prism/prism.css +2 -2
- package/dist/themes/registry.js +59 -0
- package/dist/themes/sable/index.js +16 -1
- package/dist/{chunk-EFLC4NA3.js → themes/theme-provider.js} +38 -54
- package/dist/themes/verdant/index.js +17 -1
- package/llms/blocks/media-player-block.md +20 -7
- package/llms/blocks/product-card-block.md +6 -4
- package/llms/blocks/task-list-block.md +1 -1
- package/llms/blocks/verify-code-block.md +1 -1
- package/llms/components/app-shell.md +5 -2
- package/llms/components/avatar.md +25 -3
- package/llms/components/button.md +20 -1
- package/llms/components/card.md +1 -1
- package/llms/components/disclosure-picker.md +168 -0
- package/llms/components/font-picker.md +104 -0
- package/llms/components/media-image.md +98 -0
- package/llms/components/media-tile.md +143 -0
- package/llms/components/page-header.md +6 -5
- package/llms/components/section-header.md +144 -0
- package/llms/components/sheet.md +10 -0
- package/llms/components/sidebar.md +4 -3
- package/llms/components/slider.md +14 -2
- package/llms/components/theme-selector.md +44 -4
- package/llms/components/tree.md +3 -3
- package/llms/layout/grid.md +24 -3
- package/llms/patterns/dashboard-page.md +3 -6
- package/llms/patterns/feed-page.md +4 -4
- package/llms/patterns/list-detail-page.md +1 -0
- package/llms/patterns/settings-page.md +2 -5
- package/llms/reference/utilities.md +84 -4
- package/llms/tasks/converting-an-app.md +14 -4
- package/llms/tasks/reviewing-a-design.md +15 -0
- package/llms-full.txt +981 -65
- package/llms.txt +27 -10
- package/package.json +1 -1
- package/registry.json +2324 -171
- package/scripts/agent-setup.mjs +90 -0
- package/scripts/design-presets.mjs +46 -4
- package/scripts/grade.mjs +195 -29
- package/scripts/lint-rules.mjs +486 -10
- package/scripts/review-evidence.mjs +28 -1
- package/skills/sable/SKILL.md +56 -22
- package/targets/ios.json +45 -0
- package/dist/chunk-3IWZYBGH.js +0 -398
- package/dist/chunk-7MG4SHYX.js +0 -15
- package/dist/chunk-7QSDYBXO.js +0 -7421
- package/dist/chunk-ADLLDWLW.js +0 -15
- package/dist/chunk-C4Z3CF54.js +0 -15
- package/dist/chunk-EDXLM7YL.js +0 -5078
- package/dist/chunk-EHH4MHO6.js +0 -14
- package/dist/chunk-K7RUHUGC.js +0 -14
- package/dist/chunk-KO3NAEBF.js +0 -15
- package/dist/chunk-L4IEIQQA.js +0 -14
- package/dist/chunk-QJ6FWTUG.js +0 -40
- package/dist/chunk-VVW4UCDI.js +0 -4908
- package/dist/chunk-XAZGMY73.js +0 -187
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
// src/components/date-picker/date-picker.meta.ts
|
|
2
|
+
var datePickerMeta = {
|
|
3
|
+
name: "DatePicker",
|
|
4
|
+
summary: `Date (and optionally time) picker: a field-shaped trigger (the Input / SelectTrigger shell) opens a Popover holding Sable's Calendar. With granularity="day" selecting a day fires onValueChange and closes; granularity="minute" adds an hour + minute row of Selects and keeps the time-of-day when the day changes.`,
|
|
5
|
+
status: "stable",
|
|
6
|
+
keywords: [
|
|
7
|
+
"date picker",
|
|
8
|
+
"calendar",
|
|
9
|
+
"date input",
|
|
10
|
+
"date time picker",
|
|
11
|
+
"time",
|
|
12
|
+
"schedule",
|
|
13
|
+
"form"
|
|
14
|
+
],
|
|
15
|
+
usage: {
|
|
16
|
+
description: 'Use DatePicker when users need to choose one date \u2014 or, with granularity="minute", one date and time \u2014 from a compact control.',
|
|
17
|
+
bestPractices: [
|
|
18
|
+
{
|
|
19
|
+
guidance: "do",
|
|
20
|
+
description: "Use it in forms where a typed date alone would be error-prone."
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
guidance: "do",
|
|
24
|
+
description: "Show clear selected and disabled states when date rules apply."
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
guidance: "do",
|
|
28
|
+
description: 'Set granularity="minute" when a time matters, with a minuteStep that matches the real precision (15 for meetings, 5 for scheduled posts).'
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
guidance: "dont",
|
|
32
|
+
description: "Do not show a time without saying which zone it is in. A meeting time with no zone is wrong for everyone not in yours \u2014 wrap the picker in a Field whose description names the zone."
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
guidance: "dont",
|
|
36
|
+
description: "Do not leave the format ambiguous. `03/04` is two different dates depending on the reader's locale \u2014 the trigger shows a formatted date precisely so the interpretation is not guessed."
|
|
37
|
+
}
|
|
38
|
+
]
|
|
39
|
+
},
|
|
40
|
+
related: {
|
|
41
|
+
components: [
|
|
42
|
+
"Calendar",
|
|
43
|
+
"Field"
|
|
44
|
+
]
|
|
45
|
+
},
|
|
46
|
+
props: [
|
|
47
|
+
{
|
|
48
|
+
name: "value",
|
|
49
|
+
type: "Date",
|
|
50
|
+
description: "The selected date (controlled). When absent, the trigger shows a muted placeholder."
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: "defaultValue",
|
|
54
|
+
type: "Date",
|
|
55
|
+
description: "Initial value when uncontrolled (no `value` prop)."
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
name: "onValueChange",
|
|
59
|
+
type: "(date: Date | undefined) => void",
|
|
60
|
+
description: 'Fired when the day is chosen or cleared, and under granularity="minute" when the hour or minute changes. With granularity="day" it also closes the popover.'
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: "onChange",
|
|
64
|
+
type: "(date: Date | undefined) => void",
|
|
65
|
+
description: "Deprecated alias for onValueChange, kept for backwards compatibility. Both fire when set; prefer onValueChange.",
|
|
66
|
+
deprecated: "onValueChange"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
name: "granularity",
|
|
70
|
+
type: '"day" | "minute"',
|
|
71
|
+
default: '"day"',
|
|
72
|
+
description: 'What the picker chooses. "minute" adds an hour + minute row and keeps the popover open so day and time can be set in any order.'
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
name: "minuteStep",
|
|
76
|
+
type: "number",
|
|
77
|
+
default: "5",
|
|
78
|
+
description: 'Minute increment for the time row (granularity="minute" only).'
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
name: "defaultTime",
|
|
82
|
+
type: "string",
|
|
83
|
+
default: '"00:00"',
|
|
84
|
+
description: 'Time-of-day shown and applied while nothing is selected yet, as 24h "HH:mm" \u2014 the first day pick lands on this time instead of midnight (granularity="minute" only).'
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
name: "placeholder",
|
|
88
|
+
type: "string",
|
|
89
|
+
default: '"Pick a date" ("Pick date & time" with granularity="minute")',
|
|
90
|
+
description: "Trigger label shown when no date is selected."
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
name: "disabled",
|
|
94
|
+
type: "boolean",
|
|
95
|
+
description: "Disable the trigger and block selection."
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
name: "minDate",
|
|
99
|
+
type: "Date",
|
|
100
|
+
description: "Earliest selectable day (inclusive). Earlier days are disabled and navigation is bounded."
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
name: "maxDate",
|
|
104
|
+
type: "Date",
|
|
105
|
+
description: "Latest selectable day (inclusive). Later days are disabled and navigation is bounded."
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
name: "className",
|
|
109
|
+
type: "string",
|
|
110
|
+
description: "Extra classes merged onto the trigger."
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
name: "id / aria-label / aria-labelledby / aria-describedby / aria-invalid / aria-required",
|
|
114
|
+
type: "button attributes",
|
|
115
|
+
description: "Forwarded to the trigger, so a wrapping Field ties its label to the picker and announces its description and error. Pass them yourself only when labelling the picker without a Field."
|
|
116
|
+
}
|
|
117
|
+
],
|
|
118
|
+
tokensUsed: [
|
|
119
|
+
"primary",
|
|
120
|
+
"primary-foreground",
|
|
121
|
+
"accent",
|
|
122
|
+
"accent-foreground",
|
|
123
|
+
"foreground",
|
|
124
|
+
"muted-foreground",
|
|
125
|
+
"popover",
|
|
126
|
+
"popover-foreground",
|
|
127
|
+
"border",
|
|
128
|
+
"input",
|
|
129
|
+
"card",
|
|
130
|
+
"ring"
|
|
131
|
+
],
|
|
132
|
+
a11y: [
|
|
133
|
+
"Trigger opens on click/Enter/Space; the popover traps focus and restores it to the trigger on close (Base UI Popover).",
|
|
134
|
+
"The calendar grid (react-day-picker) provides a roving tabindex, arrow-key day navigation, and aria-selected on the chosen day.",
|
|
135
|
+
"Navigation chevrons render through the Icon adapter and inherit the calendar's button labels.",
|
|
136
|
+
"Esc and outside press dismiss the popover.",
|
|
137
|
+
'With granularity="minute" the hour and minute Selects are full Base UI listboxes (typeahead, ARIA) labelled "Hour" and "Minute"; selecting a day keeps the chosen time-of-day, so day and time can be set in any order.'
|
|
138
|
+
],
|
|
139
|
+
examples: [
|
|
140
|
+
{
|
|
141
|
+
label: "Controlled",
|
|
142
|
+
code: "const [date, setDate] = useState<Date>()\n<DatePicker value={date} onValueChange={setDate} />"
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
label: "Custom placeholder",
|
|
146
|
+
code: '<DatePicker placeholder="Schedule for\u2026" value={date} onValueChange={setDate} />'
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
label: "Date and time",
|
|
150
|
+
code: 'const [start, setStart] = useState<Date>()\n<DatePicker granularity="minute" value={start} onValueChange={setStart} minDate={new Date()} defaultTime="09:00" minuteStep={15} />'
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
label: "Disabled",
|
|
154
|
+
code: "<DatePicker disabled />"
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
label: "Bounded (no past dates)",
|
|
158
|
+
code: "<DatePicker value={date} onValueChange={setDate} minDate={new Date()} />"
|
|
159
|
+
}
|
|
160
|
+
]
|
|
161
|
+
};
|
|
162
|
+
export {
|
|
163
|
+
datePickerMeta
|
|
164
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// src/components/date-tile/date-tile.tsx
|
|
2
|
+
import { cn } from "../../lib/cn.js";
|
|
3
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
function isoDay(date) {
|
|
5
|
+
const pad = (n) => String(n).padStart(2, "0");
|
|
6
|
+
return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;
|
|
7
|
+
}
|
|
8
|
+
function DateTile({ date, locale, className, ...props }) {
|
|
9
|
+
const month = new Intl.DateTimeFormat(locale, { month: "short" }).format(date);
|
|
10
|
+
return /* @__PURE__ */ jsxs(
|
|
11
|
+
"time",
|
|
12
|
+
{
|
|
13
|
+
dateTime: isoDay(date),
|
|
14
|
+
className: cn(
|
|
15
|
+
"grid h-fit w-14 shrink-0 overflow-hidden rounded-[min(var(--radius-md),--spacing(3))] bg-muted text-center text-foreground",
|
|
16
|
+
className
|
|
17
|
+
),
|
|
18
|
+
...props,
|
|
19
|
+
children: [
|
|
20
|
+
/* @__PURE__ */ jsx("span", { className: "bg-primary py-0.5 text-label-sm text-primary-foreground", children: month }),
|
|
21
|
+
/* @__PURE__ */ jsx("span", { className: "flex h-9 items-center justify-center text-heading-3 leading-none tabular-nums lining-nums", children: date.getDate() })
|
|
22
|
+
]
|
|
23
|
+
}
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
DateTile.displayName = "DateTile";
|
|
27
|
+
export {
|
|
28
|
+
DateTile
|
|
29
|
+
};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// src/components/date-tile/date-tile.meta.ts
|
|
2
|
+
var dateTileMeta = {
|
|
3
|
+
name: "DateTile",
|
|
4
|
+
summary: "A calendar-page date: the short month on a primary band over the day number, in a <time> element. The leading visual of an event, booking or deadline row.",
|
|
5
|
+
keywords: ["date", "calendar", "event", "day", "month", "schedule", "booking", "tile"],
|
|
6
|
+
usage: {
|
|
7
|
+
description: "Use DateTile as the leading visual when the date is what a reader scans a list or card by \u2014 events, bookings, deadlines, releases. It sits beside a title and a time line, usually in an Entity's `leading` slot or a flex row in a CardContent. For a date inside a sentence or a row's metadata, use text or RelativeTime instead.",
|
|
8
|
+
bestPractices: [
|
|
9
|
+
{
|
|
10
|
+
guidance: "do",
|
|
11
|
+
description: "Pair the tile with a title and the full time or range in text beside it; the tile only names the day."
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
guidance: "do",
|
|
15
|
+
description: "Keep every row of a list on DateTile so the dates line up as one column."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
guidance: "dont",
|
|
19
|
+
description: 'Use it for timestamps ("2 hours ago", "Oct 14, 10:02") \u2014 that is RelativeTime or plain metadata text.'
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
guidance: "dont",
|
|
23
|
+
description: "Stretch it to its neighbour's height or restyle the band per row; the tile is a fixed shape so a column of them reads as one calendar."
|
|
24
|
+
}
|
|
25
|
+
],
|
|
26
|
+
anatomy: [
|
|
27
|
+
{ name: "Band", required: true, description: "The short month name on the primary colour." },
|
|
28
|
+
{ name: "Day", required: true, description: "The day of the month, on the muted surface." }
|
|
29
|
+
]
|
|
30
|
+
},
|
|
31
|
+
related: {
|
|
32
|
+
components: ["Entity", "Card", "RelativeTime", "Calendar"]
|
|
33
|
+
},
|
|
34
|
+
status: "stable",
|
|
35
|
+
props: [
|
|
36
|
+
{
|
|
37
|
+
name: "date",
|
|
38
|
+
type: "Date",
|
|
39
|
+
description: 'The day to show, read in local time. Rendered as `<time dateTime="YYYY-MM-DD">`.'
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: "locale",
|
|
43
|
+
type: "string",
|
|
44
|
+
default: "runtime locale",
|
|
45
|
+
description: "BCP 47 locale for the month name."
|
|
46
|
+
}
|
|
47
|
+
],
|
|
48
|
+
tokensUsed: ["muted", "primary", "primary-foreground", "foreground"],
|
|
49
|
+
motion: [
|
|
50
|
+
{ slot: "arrival", part: "Tile", recipe: "none", why: "A static label; it appears with whatever row or card holds it." },
|
|
51
|
+
{ slot: "response", part: "Tile", recipe: "none", why: "Not interactive." },
|
|
52
|
+
{ slot: "transition", part: "Tile", recipe: "none", why: "It has no states to move between." },
|
|
53
|
+
{ slot: "activity", part: "Tile", recipe: "none", why: "Nothing runs in the background." }
|
|
54
|
+
],
|
|
55
|
+
a11y: [
|
|
56
|
+
'Renders a <time> with a machine-readable `dateTime`, so the day is announced as text ("Oct 14") and parsable as a date.',
|
|
57
|
+
"The tile names only the day \u2014 state the weekday, time or range in the text beside it, where it is read in order."
|
|
58
|
+
],
|
|
59
|
+
examples: [
|
|
60
|
+
{
|
|
61
|
+
label: "Event row",
|
|
62
|
+
code: '<Row gap={4} align="start">\n <DateTile date={new Date(2026, 9, 14)} />\n <Stack gap={1}>\n <span className="text-title-lg">Design review</span>\n <span className="text-body-sm text-muted-foreground">Tuesday, 2:00 \u2013 2:45 PM</span>\n </Stack>\n</Row>'
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
label: "In an Entity list",
|
|
66
|
+
code: '<CardList>\n <Entity leading={<DateTile date={new Date(2026, 9, 14)} />} title="Design review" subtitle="Tuesday, 2:00 PM" />\n <Entity leading={<DateTile date={new Date(2026, 9, 21)} />} title="Launch" subtitle="Tuesday, all day" />\n</CardList>'
|
|
67
|
+
}
|
|
68
|
+
]
|
|
69
|
+
};
|
|
70
|
+
export {
|
|
71
|
+
dateTileMeta
|
|
72
|
+
};
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/components/destructive-action-modal/destructive-action-modal.tsx
|
|
4
|
+
import { useEffect, useRef, useState } from "react";
|
|
5
|
+
import { Button } from "../button/index.js";
|
|
6
|
+
import {
|
|
7
|
+
AlertDialog,
|
|
8
|
+
AlertDialogClose,
|
|
9
|
+
AlertDialogContent,
|
|
10
|
+
AlertDialogDescription,
|
|
11
|
+
AlertDialogFooter,
|
|
12
|
+
AlertDialogHeader,
|
|
13
|
+
AlertDialogTitle
|
|
14
|
+
} from "../dialog/index.js";
|
|
15
|
+
import { Code } from "../code/index.js";
|
|
16
|
+
import { Field } from "../form/index.js";
|
|
17
|
+
import { Input } from "../input/index.js";
|
|
18
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
19
|
+
function DestructiveActionModal({
|
|
20
|
+
open,
|
|
21
|
+
onOpenChange,
|
|
22
|
+
title,
|
|
23
|
+
description,
|
|
24
|
+
confirmLabel = "Delete",
|
|
25
|
+
cancelLabel = "Cancel",
|
|
26
|
+
onConfirm,
|
|
27
|
+
pending,
|
|
28
|
+
confirmingLabel,
|
|
29
|
+
children,
|
|
30
|
+
confirmText
|
|
31
|
+
}) {
|
|
32
|
+
const [typed, setTyped] = useState("");
|
|
33
|
+
const [internalBusy, setInternalBusy] = useState(false);
|
|
34
|
+
const inFlight = useRef(false);
|
|
35
|
+
const cancelRef = useRef(null);
|
|
36
|
+
const controlledPending = pending !== void 0;
|
|
37
|
+
const busy = pending ?? internalBusy;
|
|
38
|
+
useEffect(() => {
|
|
39
|
+
if (!open) {
|
|
40
|
+
setTyped("");
|
|
41
|
+
}
|
|
42
|
+
}, [open]);
|
|
43
|
+
const requiresMatch = typeof confirmText === "string" && confirmText.length > 0;
|
|
44
|
+
const matched = !requiresMatch || typed === confirmText;
|
|
45
|
+
async function handleConfirm() {
|
|
46
|
+
if (!matched || busy || inFlight.current) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
inFlight.current = true;
|
|
50
|
+
try {
|
|
51
|
+
const result = onConfirm();
|
|
52
|
+
if (controlledPending) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (result instanceof Promise) {
|
|
56
|
+
setInternalBusy(true);
|
|
57
|
+
try {
|
|
58
|
+
await result;
|
|
59
|
+
setInternalBusy(false);
|
|
60
|
+
onOpenChange(false);
|
|
61
|
+
} catch {
|
|
62
|
+
setInternalBusy(false);
|
|
63
|
+
}
|
|
64
|
+
} else {
|
|
65
|
+
onOpenChange(false);
|
|
66
|
+
}
|
|
67
|
+
} finally {
|
|
68
|
+
inFlight.current = false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function handleOpenChange(next) {
|
|
72
|
+
if (busy && !next) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
onOpenChange(next);
|
|
76
|
+
}
|
|
77
|
+
return /* @__PURE__ */ jsx(AlertDialog, { open, onOpenChange: handleOpenChange, children: /* @__PURE__ */ jsxs(AlertDialogContent, { initialFocus: cancelRef, children: [
|
|
78
|
+
/* @__PURE__ */ jsxs(AlertDialogHeader, { children: [
|
|
79
|
+
/* @__PURE__ */ jsx(AlertDialogTitle, { children: title }),
|
|
80
|
+
description ? /* @__PURE__ */ jsx(AlertDialogDescription, { children: description }) : null
|
|
81
|
+
] }),
|
|
82
|
+
children != null || requiresMatch ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4", children: [
|
|
83
|
+
children,
|
|
84
|
+
requiresMatch ? /* @__PURE__ */ jsx(
|
|
85
|
+
Field,
|
|
86
|
+
{
|
|
87
|
+
label: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
88
|
+
"Type ",
|
|
89
|
+
/* @__PURE__ */ jsx(Code, { children: confirmText }),
|
|
90
|
+
" to confirm"
|
|
91
|
+
] }),
|
|
92
|
+
children: /* @__PURE__ */ jsx(
|
|
93
|
+
Input,
|
|
94
|
+
{
|
|
95
|
+
value: typed,
|
|
96
|
+
onChange: (event) => setTyped(event.target.value),
|
|
97
|
+
placeholder: confirmText,
|
|
98
|
+
autoComplete: "off",
|
|
99
|
+
autoCapitalize: "off",
|
|
100
|
+
spellCheck: false
|
|
101
|
+
}
|
|
102
|
+
)
|
|
103
|
+
}
|
|
104
|
+
) : null
|
|
105
|
+
] }) : null,
|
|
106
|
+
/* @__PURE__ */ jsxs(AlertDialogFooter, { children: [
|
|
107
|
+
/* @__PURE__ */ jsx(
|
|
108
|
+
AlertDialogClose,
|
|
109
|
+
{
|
|
110
|
+
render: /* @__PURE__ */ jsx(Button, { ref: cancelRef, variant: "secondary", disabled: busy, children: cancelLabel })
|
|
111
|
+
}
|
|
112
|
+
),
|
|
113
|
+
/* @__PURE__ */ jsx(
|
|
114
|
+
Button,
|
|
115
|
+
{
|
|
116
|
+
variant: "destructive",
|
|
117
|
+
loading: busy,
|
|
118
|
+
loadingLabel: confirmingLabel ?? confirmLabel,
|
|
119
|
+
disabled: !matched,
|
|
120
|
+
onClick: handleConfirm,
|
|
121
|
+
children: confirmLabel
|
|
122
|
+
}
|
|
123
|
+
)
|
|
124
|
+
] })
|
|
125
|
+
] }) });
|
|
126
|
+
}
|
|
127
|
+
DestructiveActionModal.displayName = "DestructiveActionModal";
|
|
128
|
+
export {
|
|
129
|
+
DestructiveActionModal
|
|
130
|
+
};
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
// src/components/destructive-action-modal/destructive-action-modal.meta.ts
|
|
2
|
+
var destructiveActionModalMeta = {
|
|
3
|
+
name: "DestructiveActionModal",
|
|
4
|
+
summary: "Confirmation modal for irreversible actions, built on AlertDialog (role=alertdialog; a backdrop click does not dismiss). Pairs a secondary Cancel with a destructive confirm; awaits an async onConfirm (spinner + stays open on failure) or takes an external pending flag; optional body slot and type-to-confirm guard for high-stakes deletions.",
|
|
5
|
+
status: "stable",
|
|
6
|
+
keywords: [
|
|
7
|
+
"destructive",
|
|
8
|
+
"modal",
|
|
9
|
+
"confirmation",
|
|
10
|
+
"danger"
|
|
11
|
+
],
|
|
12
|
+
usage: {
|
|
13
|
+
description: "Use DestructiveActionModal to confirm irreversible or high-risk actions before they run.",
|
|
14
|
+
bestPractices: [
|
|
15
|
+
{
|
|
16
|
+
guidance: "do",
|
|
17
|
+
description: "Name the affected object and the consequence of the action in plain language."
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
guidance: "do",
|
|
21
|
+
description: "Make the destructive action visually distinct from the cancel path."
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
guidance: "dont",
|
|
25
|
+
description: "Do not use it for routine low-risk actions where undo or inline confirmation would be faster."
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
guidance: "dont",
|
|
29
|
+
description: "Do not put the destructive action where Cancel usually sits, or make it the default focus. A confirmation dialog exists to add friction; autofocusing Delete removes the friction it was added for."
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
},
|
|
33
|
+
related: {
|
|
34
|
+
components: [
|
|
35
|
+
"Dialog",
|
|
36
|
+
"Button",
|
|
37
|
+
"Banner"
|
|
38
|
+
]
|
|
39
|
+
},
|
|
40
|
+
props: [
|
|
41
|
+
{
|
|
42
|
+
name: "open",
|
|
43
|
+
type: "boolean",
|
|
44
|
+
description: "Controlled open state."
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: "onOpenChange",
|
|
48
|
+
type: "(open: boolean) => void",
|
|
49
|
+
description: "Called when the open state should change (Esc, Cancel, or confirm). A backdrop click does not dismiss."
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
name: "title",
|
|
53
|
+
type: "ReactNode",
|
|
54
|
+
description: "Modal heading \u2014 names the irreversible action."
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
name: "description",
|
|
58
|
+
type: "ReactNode",
|
|
59
|
+
description: "Optional supporting copy explaining the consequence."
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: "confirmLabel",
|
|
63
|
+
type: "string",
|
|
64
|
+
default: '"Delete"',
|
|
65
|
+
description: "Label for the destructive confirm button."
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
name: "cancelLabel",
|
|
69
|
+
type: "string",
|
|
70
|
+
default: '"Cancel"',
|
|
71
|
+
description: "Label for the dismissing secondary button."
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: "onConfirm",
|
|
75
|
+
type: "() => void | Promise<void>",
|
|
76
|
+
description: "Called when the user confirms. If it returns a Promise the modal shows an in-flight spinner, closes on resolve, and stays open on reject; if void it closes immediately (unless pending is controlled)."
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: "pending",
|
|
80
|
+
type: "boolean",
|
|
81
|
+
description: "Externally-driven in-flight state. Overrides the internal await tracking; the parent owns closing (the modal stays open on a synchronous confirm)."
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
name: "confirmingLabel",
|
|
85
|
+
type: "string",
|
|
86
|
+
default: "confirmLabel",
|
|
87
|
+
description: "Confirm-button label shown while the action is in flight."
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: "children",
|
|
91
|
+
type: "ReactNode",
|
|
92
|
+
description: "Body content rendered between the description and the type-to-confirm Input / footer \u2014 e.g. a warning <Note>."
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
name: "confirmText",
|
|
96
|
+
type: "string",
|
|
97
|
+
description: "When set, renders an Input the user must type matching to enable the destructive confirm button."
|
|
98
|
+
}
|
|
99
|
+
],
|
|
100
|
+
tokensUsed: [
|
|
101
|
+
"card",
|
|
102
|
+
"card-foreground",
|
|
103
|
+
"border",
|
|
104
|
+
"muted-foreground",
|
|
105
|
+
"foreground",
|
|
106
|
+
"input",
|
|
107
|
+
"destructive",
|
|
108
|
+
"destructive-foreground",
|
|
109
|
+
"secondary",
|
|
110
|
+
"secondary-foreground"
|
|
111
|
+
],
|
|
112
|
+
a11y: [
|
|
113
|
+
`Built on AlertDialog (Base UI): role="alertdialog", focus trapping, scroll lock, and aria-modal. Esc dismisses; a click on the backdrop does not, so a stray click can't throw away the decision.`,
|
|
114
|
+
"Focus opens on Cancel \u2014 the safe action \u2014 even when a type-to-confirm Input comes first, so a reflexive Enter never fires the destructive action.",
|
|
115
|
+
"The title labels the modal; the description describes it.",
|
|
116
|
+
"The type-to-confirm Input is wired to its label via htmlFor; the destructive Button is disabled (not just hidden) until the text matches.",
|
|
117
|
+
"While a confirm is in flight (awaited onConfirm or pending), both buttons disable, the confirm Button sets aria-busy, and Esc dismissal is blocked so the action can't be interrupted or double-fired."
|
|
118
|
+
],
|
|
119
|
+
examples: [
|
|
120
|
+
{
|
|
121
|
+
label: "Basic",
|
|
122
|
+
code: "<DestructiveActionModal open={open} onOpenChange={setOpen} title='Delete post?' description='This permanently removes the post. This cannot be undone.' onConfirm={handleDelete} />"
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
label: "Async confirm (awaited spinner)",
|
|
126
|
+
code: "<DestructiveActionModal open={open} onOpenChange={setOpen} title='Block user?' description='They can no longer interact with you.' confirmLabel='Block' confirmingLabel='Blocking\u2026' onConfirm={() => blockUser(id)} />"
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
label: "Body slot + type-to-confirm",
|
|
130
|
+
code: "<DestructiveActionModal open={open} onOpenChange={setOpen} title='Delete this post?' confirmText='gold rush' confirmLabel='Delete forever' onConfirm={handleDelete}><Note tone='warning'>Collectors who minted this edition keep their copies.</Note></DestructiveActionModal>"
|
|
131
|
+
}
|
|
132
|
+
]
|
|
133
|
+
};
|
|
134
|
+
export {
|
|
135
|
+
destructiveActionModalMeta
|
|
136
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// src/components/destructive-action-modal/index.ts
|
|
2
|
+
import {
|
|
3
|
+
DestructiveActionModal
|
|
4
|
+
} from "./destructive-action-modal.js";
|
|
5
|
+
import { destructiveActionModalMeta } from "./destructive-action-modal.meta.js";
|
|
6
|
+
export {
|
|
7
|
+
DestructiveActionModal,
|
|
8
|
+
destructiveActionModalMeta
|
|
9
|
+
};
|