@sableui/react 0.6.2 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +2 -2
- package/CHANGELOG.md +315 -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 +203 -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 +34 -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 +618 -34
- 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 +30 -8
- 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 +24 -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 +215 -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.d.ts +7 -1
- package/dist/presets/index.js +53 -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/traffic-sources-block.md +1 -1
- package/llms/blocks/traffic-trend-block.md +5 -3
- 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/pie-chart.md +2 -2
- package/llms/components/radial-chart.md +1 -1
- 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/layout/region.md +16 -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/building-a-page.md +34 -3
- package/llms/tasks/converting-an-app.md +14 -4
- package/llms/tasks/creating-a-preset.md +4 -1
- package/llms/tasks/reviewing-a-design.md +19 -0
- package/llms/tasks/using-presets.md +19 -0
- package/llms-full.txt +1066 -78
- package/llms.txt +26 -9
- package/package.json +1 -1
- package/registry.json +2342 -164
- package/scripts/agent-setup.mjs +90 -0
- package/scripts/design-presets.mjs +59 -6
- 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 +67 -24
- 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,215 @@
|
|
|
1
|
+
// src/lib/component-guidance.ts
|
|
2
|
+
function bestPractices(dos, donts) {
|
|
3
|
+
return [
|
|
4
|
+
...dos.map((description) => ({
|
|
5
|
+
guidance: "do",
|
|
6
|
+
description
|
|
7
|
+
})),
|
|
8
|
+
...donts.map((description) => ({
|
|
9
|
+
guidance: "dont",
|
|
10
|
+
description
|
|
11
|
+
}))
|
|
12
|
+
];
|
|
13
|
+
}
|
|
14
|
+
function anatomy(parts) {
|
|
15
|
+
return parts.map(([name, required, description]) => ({
|
|
16
|
+
name,
|
|
17
|
+
required,
|
|
18
|
+
description
|
|
19
|
+
}));
|
|
20
|
+
}
|
|
21
|
+
function guidance({
|
|
22
|
+
keywords,
|
|
23
|
+
description,
|
|
24
|
+
dos,
|
|
25
|
+
donts,
|
|
26
|
+
anatomy: parts,
|
|
27
|
+
related
|
|
28
|
+
}) {
|
|
29
|
+
return {
|
|
30
|
+
keywords,
|
|
31
|
+
usage: {
|
|
32
|
+
description,
|
|
33
|
+
bestPractices: bestPractices(dos, donts),
|
|
34
|
+
...parts ? { anatomy: anatomy(parts) } : {}
|
|
35
|
+
},
|
|
36
|
+
...related ? { related } : {}
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
var componentGuidance = {
|
|
40
|
+
// ThemeSelector: guidance now lives in its own meta (usage.bestPractices).
|
|
41
|
+
// The entry that was here was dead code — see the dual-home check in
|
|
42
|
+
// build-registry.mjs — and its "use ThemeSwitcher for colour mode" dont was
|
|
43
|
+
// lost for as long as both existed. Recovered into the meta.
|
|
44
|
+
Region: guidance({
|
|
45
|
+
keywords: ["region", "page width", "container", "layout"],
|
|
46
|
+
description: "Use Region as the page-width primitive that applies fluid page inset and an optional purpose-named max width.",
|
|
47
|
+
dos: [
|
|
48
|
+
"Choose the max value by what the person does on the page: read (prose), fill in a form (form), scroll one stream (feed), review one record or settings (content), scan and compare rows or cards (wide).",
|
|
49
|
+
"Omit max (fluid) for work across panes, a board, an editor or a map, where a flexible part uses the extra width; cap text inside it with --measure-prose.",
|
|
50
|
+
"Give sibling routes in one nav the same width so the header does not jump between them.",
|
|
51
|
+
"Review a capped or fluid route at 1920px and 2560px: a cap is a ceiling, so below the cap plus app chrome every choice looks the same.",
|
|
52
|
+
"Use Region near the route or section boundary so inner layout stays intentional."
|
|
53
|
+
],
|
|
54
|
+
donts: [
|
|
55
|
+
"Do not use Region as a global wrapper that forces every page into the same max width.",
|
|
56
|
+
"Do not go fluid when the extra width only widens the gaps between fixed columns; cap it.",
|
|
57
|
+
"Do not read full as edge to edge: it is the largest cap and keeps the page inset. Use bleed for edge to edge."
|
|
58
|
+
],
|
|
59
|
+
related: { components: ["Page", "Grid", "Columns"] }
|
|
60
|
+
}),
|
|
61
|
+
Page: guidance({
|
|
62
|
+
keywords: ["page", "route shell", "region", "stack"],
|
|
63
|
+
description: "Use Page as a route content shell that combines Region sizing with vertical rhythm.",
|
|
64
|
+
dos: [
|
|
65
|
+
"Use it as the top-level wrapper for route content after application chrome.",
|
|
66
|
+
"Set max by the page's content role rather than by the current viewport."
|
|
67
|
+
],
|
|
68
|
+
donts: [
|
|
69
|
+
"Do not confuse Page with AppShell; Page is content, AppShell is the frame around routes."
|
|
70
|
+
],
|
|
71
|
+
related: { components: ["Region", "Stack", "PageHeader", "AppShell"] }
|
|
72
|
+
}),
|
|
73
|
+
Grid: guidance({
|
|
74
|
+
keywords: ["grid", "card grid", "auto fit", "layout"],
|
|
75
|
+
description: "Use Grid for uniform grid layouts inside a Region, especially card grids that can breathe responsively.",
|
|
76
|
+
dos: [
|
|
77
|
+
"Prefer minItemWidth for responsive card grids that do not need breakpoint-specific spans.",
|
|
78
|
+
'Keep the default track="fill" for collections whose count is data (search results, shelves, galleries): sparse rows keep their empty columns, so one result stays one cell wide.',
|
|
79
|
+
'Use track="fit" only for a fixed set designed to span the row, such as three KPI cards.',
|
|
80
|
+
"Use explicit columns only when the design truly needs a fixed track count."
|
|
81
|
+
],
|
|
82
|
+
donts: [
|
|
83
|
+
"Do not use Grid to set a page's reading width; use Region or Center.",
|
|
84
|
+
'Do not use track="fit" for results or other data-driven collections: with one or two items the empty columns collapse and each item stretches across the row (a single result rendered as a full-width cover).'
|
|
85
|
+
],
|
|
86
|
+
related: { components: ["Region", "Columns", "Card"] }
|
|
87
|
+
}),
|
|
88
|
+
Columns: guidance({
|
|
89
|
+
keywords: ["columns", "12 column", "span", "layout"],
|
|
90
|
+
description: "Use Columns and Col for proportioned layouts that need explicit spans, such as list-detail or asymmetric panes.",
|
|
91
|
+
dos: [
|
|
92
|
+
"Use breakpoint span maps when the same layout needs to collapse cleanly on smaller screens.",
|
|
93
|
+
"Use Columns for proportional composition, not for uniform card wrapping."
|
|
94
|
+
],
|
|
95
|
+
donts: [
|
|
96
|
+
"Do not use column spans as a replacement for Region width or text measure."
|
|
97
|
+
],
|
|
98
|
+
anatomy: [
|
|
99
|
+
["Columns", true, "The explicit column track container."],
|
|
100
|
+
["Col", true, "A child cell with span and optional start placement."]
|
|
101
|
+
],
|
|
102
|
+
related: { components: ["Grid", "SplitPane", "Region"] }
|
|
103
|
+
}),
|
|
104
|
+
Stack: guidance({
|
|
105
|
+
keywords: ["stack", "vertical rhythm", "layout", "spacing"],
|
|
106
|
+
description: "Use Stack for vertical flow where child spacing should follow the Sable rhythm scale.",
|
|
107
|
+
dos: [
|
|
108
|
+
"Use smaller gaps within a group and larger gaps between sections.",
|
|
109
|
+
"Use Stack instead of ad hoc margins when siblings form a vertical composition."
|
|
110
|
+
],
|
|
111
|
+
donts: [
|
|
112
|
+
"Do not use Stack to create page width or grid structure; pair it with Region, Grid, or Columns."
|
|
113
|
+
],
|
|
114
|
+
related: { components: ["Row", "Page", "Fieldset"] }
|
|
115
|
+
}),
|
|
116
|
+
Row: guidance({
|
|
117
|
+
keywords: ["row", "toolbar", "horizontal", "layout"],
|
|
118
|
+
description: "Use Row for horizontal clusters such as action groups, toolbars, metadata, and inline controls.",
|
|
119
|
+
dos: [
|
|
120
|
+
"Use wrap when controls may not fit on smaller screens.",
|
|
121
|
+
"Use justify and align intentionally so clusters scan as one unit."
|
|
122
|
+
],
|
|
123
|
+
donts: [
|
|
124
|
+
"Do not use Row for navigation menus or dense tabular structure."
|
|
125
|
+
],
|
|
126
|
+
related: { components: ["Stack", "Button", "Spacer"] }
|
|
127
|
+
}),
|
|
128
|
+
Spacer: guidance({
|
|
129
|
+
keywords: ["spacer", "spacing", "grow", "layout"],
|
|
130
|
+
description: "Use Spacer for explicit rhythm space or a flex grow pusher between siblings.",
|
|
131
|
+
dos: [
|
|
132
|
+
"Use grow inside Row when one side of a cluster should push to the far edge.",
|
|
133
|
+
"Use fixed size only when the space has semantic rhythm value."
|
|
134
|
+
],
|
|
135
|
+
donts: [
|
|
136
|
+
"Do not use Spacer to patch broad layout problems that should be solved by Stack, Row, Grid, or Region."
|
|
137
|
+
],
|
|
138
|
+
related: { components: ["Row", "Stack"] }
|
|
139
|
+
}),
|
|
140
|
+
Center: guidance({
|
|
141
|
+
keywords: ["center", "measure", "reading width", "layout"],
|
|
142
|
+
description: "Use Center to center a block and optionally cap its width inside a wider layout.",
|
|
143
|
+
dos: [
|
|
144
|
+
"Use it for reading columns, forms, or compact content inside a broad Region.",
|
|
145
|
+
"Choose a named max when the content role matches Sable's measure tokens."
|
|
146
|
+
],
|
|
147
|
+
donts: [
|
|
148
|
+
"Do not use Center for full page inset or app chrome; use Region or AppShell."
|
|
149
|
+
],
|
|
150
|
+
related: { components: ["Region", "Page", "Stack"] }
|
|
151
|
+
}),
|
|
152
|
+
AspectBox: guidance({
|
|
153
|
+
keywords: ["aspect box", "aspect ratio", "media", "layout shift"],
|
|
154
|
+
description: "Use AspectBox to reserve stable aspect-ratio space for async media, embeds, and responsive previews.",
|
|
155
|
+
dos: [
|
|
156
|
+
"Use it around images, video, and embeds that should not shift layout while loading.",
|
|
157
|
+
"Match the ratio to the expected media or design slot."
|
|
158
|
+
],
|
|
159
|
+
donts: [
|
|
160
|
+
"Do not use AspectBox for content whose height should grow with text or controls."
|
|
161
|
+
],
|
|
162
|
+
related: { components: ["Video", "Dialog", "Browser"] }
|
|
163
|
+
}),
|
|
164
|
+
Bleed: guidance({
|
|
165
|
+
keywords: ["bleed", "full bleed", "media band", "layout"],
|
|
166
|
+
description: "Use Bleed to let a band or media element escape an inset or width-capped ancestor while staying within the content area.",
|
|
167
|
+
dos: [
|
|
168
|
+
"Use it for hero bands, profile covers, or media that should align beyond a capped page column.",
|
|
169
|
+
"Keep surrounding content inside Region or Page so the bleed remains intentional."
|
|
170
|
+
],
|
|
171
|
+
donts: [
|
|
172
|
+
"Do not use Bleed to place content under fixed app chrome or sidebars."
|
|
173
|
+
],
|
|
174
|
+
related: { components: ["Page", "Region", "AspectBox"] }
|
|
175
|
+
}),
|
|
176
|
+
SplitPane: guidance({
|
|
177
|
+
keywords: ["split pane", "two pane", "list detail", "responsive"],
|
|
178
|
+
description: "Use SplitPane for responsive two-pane layouts where a primary pane and supporting pane stay conceptually linked.",
|
|
179
|
+
dos: [
|
|
180
|
+
"Use it for media-detail, list-detail, or editor-preview workflows.",
|
|
181
|
+
"Pick a ratio that reflects the actual priority of the panes."
|
|
182
|
+
],
|
|
183
|
+
donts: [
|
|
184
|
+
"Do not use SplitPane for unrelated columns or uniform grids."
|
|
185
|
+
],
|
|
186
|
+
related: { components: ["Columns", "Grid", "Sheet"] }
|
|
187
|
+
}),
|
|
188
|
+
SafeArea: guidance({
|
|
189
|
+
keywords: ["safe area", "notch", "home indicator", "fixed chrome"],
|
|
190
|
+
description: "Use SafeArea to pad fixed or native-shell surfaces away from device notches and home indicators.",
|
|
191
|
+
dos: [
|
|
192
|
+
"Use it around fixed headers, bottom bars, and native-shell surfaces.",
|
|
193
|
+
"Target only the edges that need device inset padding when possible."
|
|
194
|
+
],
|
|
195
|
+
donts: [
|
|
196
|
+
"Do not wrap normal document-flow content in SafeArea unless it actually touches unsafe edges."
|
|
197
|
+
],
|
|
198
|
+
related: { components: ["BottomNav", "AppHeader", "AppShell"] }
|
|
199
|
+
}),
|
|
200
|
+
GridOverlay: guidance({
|
|
201
|
+
keywords: ["grid overlay", "debug", "layout visualizer", "docs"],
|
|
202
|
+
description: "Use GridOverlay only as a development or documentation visualizer for the column structure.",
|
|
203
|
+
dos: [
|
|
204
|
+
"Use it inside a position-relative layout while debugging alignment.",
|
|
205
|
+
"Keep it gated behind docs, debug, or development-only state."
|
|
206
|
+
],
|
|
207
|
+
donts: [
|
|
208
|
+
"Do not ship GridOverlay as visible product UI."
|
|
209
|
+
],
|
|
210
|
+
related: { components: ["Grid", "Columns", "Region"] }
|
|
211
|
+
})
|
|
212
|
+
};
|
|
213
|
+
export {
|
|
214
|
+
componentGuidance
|
|
215
|
+
};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/lib/density.tsx
|
|
4
|
+
import { createContext, useContext } from "react";
|
|
5
|
+
import { jsx } from "react/jsx-runtime";
|
|
6
|
+
var DensityContext = createContext("comfortable");
|
|
7
|
+
var DensityProvider = DensityContext.Provider;
|
|
8
|
+
function useDensity() {
|
|
9
|
+
return useContext(DensityContext);
|
|
10
|
+
}
|
|
11
|
+
function useAnchoredDensity() {
|
|
12
|
+
return { "data-density": useDensity() };
|
|
13
|
+
}
|
|
14
|
+
function Density({
|
|
15
|
+
value,
|
|
16
|
+
className,
|
|
17
|
+
children,
|
|
18
|
+
...props
|
|
19
|
+
}) {
|
|
20
|
+
return /* @__PURE__ */ jsx(DensityContext.Provider, { value, children: /* @__PURE__ */ jsx("div", { "data-density": value, className, ...props, children }) });
|
|
21
|
+
}
|
|
22
|
+
Density.displayName = "Density";
|
|
23
|
+
function useTypeTier() {
|
|
24
|
+
return useDensity() === "compact" ? {
|
|
25
|
+
body: "text-ui-md",
|
|
26
|
+
label: "text-ui-micro",
|
|
27
|
+
prose: "text-ui-body",
|
|
28
|
+
secondary: "text-ui-sm",
|
|
29
|
+
supporting: "text-ui-sm",
|
|
30
|
+
control: "text-ui-md",
|
|
31
|
+
action: "text-ui-md",
|
|
32
|
+
heading: "text-ui-section"
|
|
33
|
+
} : {
|
|
34
|
+
body: "text-body-md",
|
|
35
|
+
// Group labels. Was `text-label-xs` — the uppercase eyebrow — which put
|
|
36
|
+
// tracked capitals in every menu, select and command list, against
|
|
37
|
+
// the typography rule (no uppercase in UI chrome). Sentence-case
|
|
38
|
+
// caption reads as a quiet heading without shouting.
|
|
39
|
+
label: "text-caption",
|
|
40
|
+
prose: "text-body-md",
|
|
41
|
+
secondary: "text-body-xs",
|
|
42
|
+
supporting: "text-body-sm",
|
|
43
|
+
control: "text-label-md",
|
|
44
|
+
action: "text-label-lg",
|
|
45
|
+
heading: "text-title-sm"
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export {
|
|
49
|
+
Density,
|
|
50
|
+
DensityProvider,
|
|
51
|
+
useAnchoredDensity,
|
|
52
|
+
useDensity,
|
|
53
|
+
useTypeTier
|
|
54
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// src/lib/field-shell.ts
|
|
2
|
+
var FIELD_SHELL = "rounded-sm border border-input bg-card motion-interactive placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50";
|
|
3
|
+
var MOBILE_FIELD_TIER = "max-sm:text-body-lg";
|
|
4
|
+
var FIELD_INVALID = "aria-[invalid=true]:border-destructive aria-[invalid=true]:ring-destructive/30";
|
|
5
|
+
var FIELD_SHELL_XS = "rounded-[var(--panel-field-radius,var(--radius-xs))] border-transparent bg-panel-field hover:bg-panel-field-hover";
|
|
6
|
+
export {
|
|
7
|
+
FIELD_INVALID,
|
|
8
|
+
FIELD_SHELL,
|
|
9
|
+
FIELD_SHELL_XS,
|
|
10
|
+
MOBILE_FIELD_TIER
|
|
11
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// src/lib/glyphs.tsx
|
|
2
|
+
import { Icon } from "../icon/index.js";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
function PlayPauseGlyph({ playing }) {
|
|
5
|
+
return /* @__PURE__ */ jsx(Icon, { name: playing ? "pause" : "play", variant: "solid", className: "text-base" });
|
|
6
|
+
}
|
|
7
|
+
export {
|
|
8
|
+
PlayPauseGlyph
|
|
9
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// src/lib/heading-row.tsx
|
|
2
|
+
import { BLEED_FIRST_START, BLEED_LAST_END } from "./bleed.js";
|
|
3
|
+
import { cn } from "./cn.js";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
function HeadingRow({
|
|
6
|
+
as: Title,
|
|
7
|
+
title,
|
|
8
|
+
titleId,
|
|
9
|
+
titleClassName,
|
|
10
|
+
band,
|
|
11
|
+
leading,
|
|
12
|
+
actions
|
|
13
|
+
}) {
|
|
14
|
+
const hasControls = Boolean(leading || actions);
|
|
15
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-start justify-between gap-x-3 gap-y-2", children: [
|
|
16
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 basis-48 items-start gap-2", children: [
|
|
17
|
+
leading ? /* @__PURE__ */ jsx("div", { className: cn("shrink-0", BLEED_FIRST_START), children: leading }) : null,
|
|
18
|
+
title ? /* @__PURE__ */ jsx(
|
|
19
|
+
Title,
|
|
20
|
+
{
|
|
21
|
+
id: titleId,
|
|
22
|
+
className: cn(
|
|
23
|
+
"min-w-0 text-balance break-words",
|
|
24
|
+
titleClassName,
|
|
25
|
+
hasControls && band
|
|
26
|
+
),
|
|
27
|
+
children: title
|
|
28
|
+
}
|
|
29
|
+
) : null
|
|
30
|
+
] }),
|
|
31
|
+
actions ? /* @__PURE__ */ jsx("div", { className: cn("flex shrink-0 flex-wrap items-center gap-2", BLEED_FIRST_START, BLEED_LAST_END), children: actions }) : null
|
|
32
|
+
] });
|
|
33
|
+
}
|
|
34
|
+
export {
|
|
35
|
+
HeadingRow
|
|
36
|
+
};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/lib/highlight-glide.tsx
|
|
4
|
+
import { useLayoutEffect, useRef } from "react";
|
|
5
|
+
import { jsx } from "react/jsx-runtime";
|
|
6
|
+
function HighlightGlide({ className = "rounded-popup-item bg-accent" }) {
|
|
7
|
+
const ref = useRef(null);
|
|
8
|
+
useLayoutEffect(() => {
|
|
9
|
+
const glide = ref.current;
|
|
10
|
+
const host = glide?.parentElement;
|
|
11
|
+
if (!glide || !host) return;
|
|
12
|
+
host.setAttribute("data-glide", "");
|
|
13
|
+
let shown = false;
|
|
14
|
+
let frame = 0;
|
|
15
|
+
const place = () => {
|
|
16
|
+
const row = host.querySelector("[data-highlighted]:not([data-highlight-glide])");
|
|
17
|
+
if (!row) {
|
|
18
|
+
shown = false;
|
|
19
|
+
glide.style.opacity = "0";
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const hostBox = host.getBoundingClientRect();
|
|
23
|
+
const rowBox = row.getBoundingClientRect();
|
|
24
|
+
const scale = host.offsetWidth > 0 ? hostBox.width / host.offsetWidth || 1 : 1;
|
|
25
|
+
const x = (rowBox.left - hostBox.left) / scale + host.scrollLeft - host.clientLeft;
|
|
26
|
+
const y = (rowBox.top - hostBox.top) / scale + host.scrollTop - host.clientTop;
|
|
27
|
+
const geometry = (s) => {
|
|
28
|
+
s.width = `${rowBox.width / scale}px`;
|
|
29
|
+
s.height = `${rowBox.height / scale}px`;
|
|
30
|
+
s.transform = `translate(${x}px, ${y}px)`;
|
|
31
|
+
};
|
|
32
|
+
if (!shown) {
|
|
33
|
+
glide.style.transitionProperty = "opacity";
|
|
34
|
+
geometry(glide.style);
|
|
35
|
+
cancelAnimationFrame(frame);
|
|
36
|
+
frame = requestAnimationFrame(() => {
|
|
37
|
+
glide.style.transitionProperty = "transform, width, height, opacity";
|
|
38
|
+
});
|
|
39
|
+
shown = true;
|
|
40
|
+
} else {
|
|
41
|
+
geometry(glide.style);
|
|
42
|
+
}
|
|
43
|
+
glide.style.opacity = "1";
|
|
44
|
+
};
|
|
45
|
+
place();
|
|
46
|
+
const mutations = new MutationObserver(place);
|
|
47
|
+
mutations.observe(host, { attributes: true, attributeFilter: ["data-highlighted"], subtree: true, childList: true });
|
|
48
|
+
const resize = new ResizeObserver(place);
|
|
49
|
+
resize.observe(host);
|
|
50
|
+
host.addEventListener("scroll", place, true);
|
|
51
|
+
host.addEventListener("transitionend", place);
|
|
52
|
+
host.addEventListener("animationend", place);
|
|
53
|
+
return () => {
|
|
54
|
+
cancelAnimationFrame(frame);
|
|
55
|
+
mutations.disconnect();
|
|
56
|
+
resize.disconnect();
|
|
57
|
+
host.removeEventListener("scroll", place, true);
|
|
58
|
+
host.removeEventListener("transitionend", place);
|
|
59
|
+
host.removeEventListener("animationend", place);
|
|
60
|
+
host.removeAttribute("data-glide");
|
|
61
|
+
};
|
|
62
|
+
}, []);
|
|
63
|
+
return /* @__PURE__ */ jsx(
|
|
64
|
+
"span",
|
|
65
|
+
{
|
|
66
|
+
ref,
|
|
67
|
+
"aria-hidden": true,
|
|
68
|
+
"data-highlight-glide": "",
|
|
69
|
+
className: `pointer-events-none absolute top-0 ${className}`,
|
|
70
|
+
style: {
|
|
71
|
+
// Physical, not logical: the translate is measured from
|
|
72
|
+
// getBoundingClientRect, which is physical in RTL too.
|
|
73
|
+
left: 0,
|
|
74
|
+
opacity: 0,
|
|
75
|
+
transitionProperty: "opacity",
|
|
76
|
+
transitionDuration: "var(--motion-duration-instant)",
|
|
77
|
+
transitionTimingFunction: "var(--motion-ease-standard)"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
export {
|
|
83
|
+
HighlightGlide
|
|
84
|
+
};
|
package/dist/lib/meta.js
ADDED
|
File without changes
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/lib/portal-theme-scope.tsx
|
|
4
|
+
import {
|
|
5
|
+
useMemo,
|
|
6
|
+
useRef,
|
|
7
|
+
useState
|
|
8
|
+
} from "react";
|
|
9
|
+
import { mergeRefs } from "./refs.js";
|
|
10
|
+
import { useIsomorphicLayoutEffect } from "./use-isomorphic-layout-effect.js";
|
|
11
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
12
|
+
function resolvePortalThemeScope(from) {
|
|
13
|
+
const root = from.ownerDocument.documentElement;
|
|
14
|
+
const scope = {};
|
|
15
|
+
const themeEl = from.closest("[data-sable-theme]");
|
|
16
|
+
if (themeEl && themeEl !== root) {
|
|
17
|
+
const theme = themeEl.getAttribute("data-sable-theme");
|
|
18
|
+
if (theme) scope.theme = theme;
|
|
19
|
+
const view = from.ownerDocument.defaultView;
|
|
20
|
+
const fontFamily = view?.getComputedStyle(themeEl).fontFamily;
|
|
21
|
+
if (fontFamily) scope.fontFamily = fontFamily;
|
|
22
|
+
}
|
|
23
|
+
const modeEl = from.closest(".dark, .light");
|
|
24
|
+
if (modeEl && modeEl !== root) {
|
|
25
|
+
scope.mode = modeEl.classList.contains("light") ? "light" : "dark";
|
|
26
|
+
}
|
|
27
|
+
return scope;
|
|
28
|
+
}
|
|
29
|
+
function applyPortalThemeScope(target, scope) {
|
|
30
|
+
if (scope.theme) target.setAttribute("data-sable-theme", scope.theme);
|
|
31
|
+
if (scope.mode) {
|
|
32
|
+
target.classList.toggle("dark", scope.mode === "dark");
|
|
33
|
+
target.classList.toggle("light", scope.mode === "light");
|
|
34
|
+
}
|
|
35
|
+
if (scope.theme && scope.fontFamily) target.style.fontFamily = scope.fontFamily;
|
|
36
|
+
}
|
|
37
|
+
function usePortalThemeScope() {
|
|
38
|
+
const [portal, setPortal] = useState(null);
|
|
39
|
+
const [probed, setProbed] = useState(null);
|
|
40
|
+
const probeRef = useRef(null);
|
|
41
|
+
const pending = portal !== null && probed !== portal;
|
|
42
|
+
useIsomorphicLayoutEffect(() => {
|
|
43
|
+
if (!pending || !portal) return;
|
|
44
|
+
const probe = probeRef.current;
|
|
45
|
+
if (probe) applyPortalThemeScope(portal, resolvePortalThemeScope(probe));
|
|
46
|
+
setProbed(portal);
|
|
47
|
+
}, [pending, portal]);
|
|
48
|
+
return {
|
|
49
|
+
portalRef: setPortal,
|
|
50
|
+
probe: pending ? /* @__PURE__ */ jsx("span", { ref: probeRef, hidden: true, "data-sable-portal-probe": "" }) : null
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function withPortalThemeScope(Portal) {
|
|
54
|
+
function ScopedPortal(props) {
|
|
55
|
+
const { ref } = props;
|
|
56
|
+
const scope = usePortalThemeScope();
|
|
57
|
+
const merged = useMemo(
|
|
58
|
+
() => mergeRefs(ref, scope.portalRef),
|
|
59
|
+
[ref, scope.portalRef]
|
|
60
|
+
);
|
|
61
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
62
|
+
/* @__PURE__ */ jsx(Portal, { ...props, ref: merged }),
|
|
63
|
+
scope.probe
|
|
64
|
+
] });
|
|
65
|
+
}
|
|
66
|
+
ScopedPortal.displayName = `ScopedPortal(${Portal.displayName ?? "Portal"})`;
|
|
67
|
+
return ScopedPortal;
|
|
68
|
+
}
|
|
69
|
+
export {
|
|
70
|
+
applyPortalThemeScope,
|
|
71
|
+
resolvePortalThemeScope,
|
|
72
|
+
usePortalThemeScope,
|
|
73
|
+
withPortalThemeScope
|
|
74
|
+
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
"use client";
|
|
2
2
|
|
|
3
3
|
// src/lib/presentation.tsx
|
|
4
|
+
import { createContext, useContext } from "react";
|
|
4
5
|
var PresentationContext = createContext("page");
|
|
5
6
|
var PresentationProvider = PresentationContext.Provider;
|
|
6
7
|
function usePresentation() {
|
|
@@ -8,5 +9,9 @@ function usePresentation() {
|
|
|
8
9
|
}
|
|
9
10
|
var CardDepthContext = createContext(0);
|
|
10
11
|
var StackedActionsContext = createContext(false);
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
export {
|
|
13
|
+
CardDepthContext,
|
|
14
|
+
PresentationProvider,
|
|
15
|
+
StackedActionsContext,
|
|
16
|
+
usePresentation
|
|
17
|
+
};
|
package/dist/lib/refs.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// src/lib/refs.ts
|
|
2
|
+
function setRef(ref, value) {
|
|
3
|
+
if (typeof ref === "function") ref(value);
|
|
4
|
+
else if (ref) ref.current = value;
|
|
5
|
+
}
|
|
6
|
+
function mergeRefs(...refs) {
|
|
7
|
+
return (value) => {
|
|
8
|
+
for (const ref of refs) setRef(ref, value);
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export {
|
|
12
|
+
mergeRefs,
|
|
13
|
+
setRef
|
|
14
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// src/lib/scrub-gesture.ts
|
|
2
|
+
function beginScrub(e, {
|
|
3
|
+
value,
|
|
4
|
+
step,
|
|
5
|
+
clamp,
|
|
6
|
+
onValueChange,
|
|
7
|
+
onGestureStart,
|
|
8
|
+
onGestureEnd,
|
|
9
|
+
disabled,
|
|
10
|
+
preventDefaultOnDown = true
|
|
11
|
+
}) {
|
|
12
|
+
if (disabled) return;
|
|
13
|
+
if (preventDefaultOnDown) e.preventDefault();
|
|
14
|
+
const startX = e.clientX;
|
|
15
|
+
const startValue = value;
|
|
16
|
+
const target = e.currentTarget;
|
|
17
|
+
let moved = false;
|
|
18
|
+
function onMove(ev) {
|
|
19
|
+
const dx = ev.clientX - startX;
|
|
20
|
+
if (!moved) {
|
|
21
|
+
if (Math.abs(dx) < 2) return;
|
|
22
|
+
moved = true;
|
|
23
|
+
onGestureStart?.();
|
|
24
|
+
}
|
|
25
|
+
ev.preventDefault();
|
|
26
|
+
onValueChange?.(clamp(startValue + dx * step * (ev.shiftKey ? 0.1 : 1)));
|
|
27
|
+
}
|
|
28
|
+
function onUp() {
|
|
29
|
+
if (moved) {
|
|
30
|
+
onGestureEnd?.();
|
|
31
|
+
target.addEventListener(
|
|
32
|
+
"click",
|
|
33
|
+
(ev) => {
|
|
34
|
+
ev.preventDefault();
|
|
35
|
+
ev.stopPropagation();
|
|
36
|
+
},
|
|
37
|
+
{ capture: true, once: true }
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
window.removeEventListener("pointermove", onMove);
|
|
41
|
+
window.removeEventListener("pointerup", onUp);
|
|
42
|
+
window.removeEventListener("pointercancel", onUp);
|
|
43
|
+
}
|
|
44
|
+
window.addEventListener("pointermove", onMove);
|
|
45
|
+
window.addEventListener("pointerup", onUp);
|
|
46
|
+
window.addEventListener("pointercancel", onUp);
|
|
47
|
+
}
|
|
48
|
+
export {
|
|
49
|
+
beginScrub
|
|
50
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// src/lib/segmented.ts
|
|
2
|
+
var SEGMENTED_INNER_RADIUS = "rounded-[max(0px,calc(var(--button-radius,9999px)-3px))]";
|
|
3
|
+
var SEGMENTED_TRACK = "relative inline-flex w-fit flex-row items-center gap-0.5 rounded-[var(--button-radius,9999px)] border border-border bg-card p-0.5";
|
|
4
|
+
var SEGMENTED_ITEM = "relative z-10 inline-flex h-7 min-w-7 items-center justify-center rounded-[max(0px,calc(var(--button-radius,9999px)-3px))] text-muted-foreground motion-interactive motion-press hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring";
|
|
5
|
+
var SEGMENTED_ITEM_ON = "bg-accent text-accent-foreground hover:text-accent-foreground";
|
|
6
|
+
var SEGMENTED_STEP = "calc(var(--spacing) * 7.5)";
|
|
7
|
+
export {
|
|
8
|
+
SEGMENTED_INNER_RADIUS,
|
|
9
|
+
SEGMENTED_ITEM,
|
|
10
|
+
SEGMENTED_ITEM_ON,
|
|
11
|
+
SEGMENTED_STEP,
|
|
12
|
+
SEGMENTED_TRACK
|
|
13
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// src/lib/selection-card.ts
|
|
2
|
+
var SELECTION_CARD_SHELL = [
|
|
3
|
+
"group relative flex cursor-pointer border border-input bg-card p-4 text-start motion-interactive motion-press",
|
|
4
|
+
"hover:border-ring",
|
|
5
|
+
// Focus is an OUTLINE, not a ring: the checked state is an inset ring in the
|
|
6
|
+
// tone colour, and both rings write box-shadow, so a focused checked card
|
|
7
|
+
// used to lose its tone ring to the focus ring.
|
|
8
|
+
"focus-within:outline-2 focus-within:outline-solid focus-within:outline-offset-2 focus-within:outline-ring",
|
|
9
|
+
"data-disabled:cursor-not-allowed data-disabled:opacity-50 data-disabled:hover:border-input"
|
|
10
|
+
].join(" ");
|
|
11
|
+
var SELECTION_CARD_LAYOUT = {
|
|
12
|
+
row: "items-start gap-3 rounded-md",
|
|
13
|
+
tile: "flex-col gap-3 rounded-lg"
|
|
14
|
+
};
|
|
15
|
+
var SELECTION_CARD_TILE_HEAD = "flex w-full items-start justify-between gap-3";
|
|
16
|
+
var SELECTION_CARD_GLYPH = "shrink-0 text-2xl leading-none motion-interactive";
|
|
17
|
+
var SELECTION_CARD_TONES = ["neutral", "standard", "collectible", "edition", "info", "warning"];
|
|
18
|
+
var SELECTION_CARD_CHECKED = {
|
|
19
|
+
neutral: "data-[checked]:border-transparent data-[checked]:ring-[1.5px] data-[checked]:ring-inset data-[checked]:ring-primary data-[checked]:bg-muted",
|
|
20
|
+
standard: "data-[checked]:border-transparent data-[checked]:ring-[1.5px] data-[checked]:ring-inset data-[checked]:ring-tone-standard",
|
|
21
|
+
collectible: "data-[checked]:border-transparent data-[checked]:ring-[1.5px] data-[checked]:ring-inset data-[checked]:ring-tone-collectible",
|
|
22
|
+
edition: "data-[checked]:border-transparent data-[checked]:ring-[1.5px] data-[checked]:ring-inset data-[checked]:ring-tone-edition",
|
|
23
|
+
info: "data-[checked]:border-transparent data-[checked]:ring-[1.5px] data-[checked]:ring-inset data-[checked]:ring-tone-info",
|
|
24
|
+
warning: "data-[checked]:border-transparent data-[checked]:ring-[1.5px] data-[checked]:ring-inset data-[checked]:ring-tone-warning"
|
|
25
|
+
};
|
|
26
|
+
var CHECK_BOX = "flex size-4.5 shrink-0 items-center justify-center rounded-xs border border-control-border bg-card motion-interactive";
|
|
27
|
+
var RADIO_RING = "relative inline-flex size-4.5 shrink-0 rounded-full border border-control-border bg-card motion-interactive";
|
|
28
|
+
var RADIO_DOT = "absolute left-1/2 top-1/2 size-2 -translate-x-1/2 -translate-y-1/2 rounded-full motion-interactive ease-spring data-[starting-style]:scale-0 data-[ending-style]:scale-0";
|
|
29
|
+
var CHECK_MARK_SIZE = "text-[length:--spacing(2.75)]";
|
|
30
|
+
export {
|
|
31
|
+
CHECK_BOX,
|
|
32
|
+
CHECK_MARK_SIZE,
|
|
33
|
+
RADIO_DOT,
|
|
34
|
+
RADIO_RING,
|
|
35
|
+
SELECTION_CARD_CHECKED,
|
|
36
|
+
SELECTION_CARD_GLYPH,
|
|
37
|
+
SELECTION_CARD_LAYOUT,
|
|
38
|
+
SELECTION_CARD_SHELL,
|
|
39
|
+
SELECTION_CARD_TILE_HEAD,
|
|
40
|
+
SELECTION_CARD_TONES
|
|
41
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// src/lib/status-tone.ts
|
|
2
|
+
var STATUS_TONES = ["neutral", "info", "success", "warning", "destructive"];
|
|
3
|
+
var STATUS_TONE_ICON = {
|
|
4
|
+
neutral: { name: "info", className: "text-muted-foreground" },
|
|
5
|
+
info: { name: "info", className: "text-tone-info" },
|
|
6
|
+
success: { name: "circle-check", className: "text-success" },
|
|
7
|
+
warning: { name: "warning", className: "text-tone-warning" },
|
|
8
|
+
destructive: { name: "warning", className: "text-destructive" }
|
|
9
|
+
};
|
|
10
|
+
export {
|
|
11
|
+
STATUS_TONES,
|
|
12
|
+
STATUS_TONE_ICON
|
|
13
|
+
};
|