@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,91 @@
|
|
|
1
|
+
// src/components/search-input/search-input.tsx
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { Icon } from "../../icon/index.js";
|
|
4
|
+
import { cn } from "../../lib/cn.js";
|
|
5
|
+
import { FIELD_INVALID, FIELD_SHELL, MOBILE_FIELD_TIER } from "../../lib/field-shell.js";
|
|
6
|
+
import { useDensity, useTypeTier } from "../../lib/density.js";
|
|
7
|
+
import { Button } from "../button/button.js";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
function SearchInput({
|
|
10
|
+
value,
|
|
11
|
+
defaultValue,
|
|
12
|
+
onValueChange,
|
|
13
|
+
onClear,
|
|
14
|
+
placeholder = "Search",
|
|
15
|
+
className,
|
|
16
|
+
inputClassName,
|
|
17
|
+
ref,
|
|
18
|
+
type,
|
|
19
|
+
...props
|
|
20
|
+
}) {
|
|
21
|
+
const [uncontrolled, setUncontrolled] = useState(defaultValue ?? "");
|
|
22
|
+
const controlled = value !== void 0;
|
|
23
|
+
const current = controlled ? value : uncontrolled;
|
|
24
|
+
const hasValue = current.length > 0;
|
|
25
|
+
function change(next) {
|
|
26
|
+
if (!controlled) setUncontrolled(next);
|
|
27
|
+
onValueChange?.(next);
|
|
28
|
+
}
|
|
29
|
+
function handleClear() {
|
|
30
|
+
change("");
|
|
31
|
+
onClear?.();
|
|
32
|
+
}
|
|
33
|
+
const tier = useTypeTier();
|
|
34
|
+
const density = useDensity();
|
|
35
|
+
return (
|
|
36
|
+
// The wrapper is the field: className lands here, so a width cap moves the
|
|
37
|
+
// clear button with the input instead of leaving it at the far edge of a
|
|
38
|
+
// wider box.
|
|
39
|
+
/* @__PURE__ */ jsxs("div", { className: cn("relative inline-flex w-full items-center", className), children: [
|
|
40
|
+
/* @__PURE__ */ jsx(
|
|
41
|
+
Icon,
|
|
42
|
+
{
|
|
43
|
+
name: "search",
|
|
44
|
+
className: "pointer-events-none absolute start-3 text-sm text-muted-foreground"
|
|
45
|
+
}
|
|
46
|
+
),
|
|
47
|
+
/* @__PURE__ */ jsx(
|
|
48
|
+
"input",
|
|
49
|
+
{
|
|
50
|
+
ref,
|
|
51
|
+
type: type ?? "search",
|
|
52
|
+
value: current,
|
|
53
|
+
onChange: (event) => change(event.target.value),
|
|
54
|
+
placeholder,
|
|
55
|
+
className: cn(
|
|
56
|
+
"flex h-(--control-md) w-full ps-9 pe-9 text-foreground",
|
|
57
|
+
// The shell Input and CommandMenuTrigger wear too — lib/field-shell.
|
|
58
|
+
FIELD_SHELL,
|
|
59
|
+
FIELD_INVALID,
|
|
60
|
+
"[&::-webkit-search-cancel-button]:appearance-none",
|
|
61
|
+
tier.body,
|
|
62
|
+
density === "comfortable" && MOBILE_FIELD_TIER,
|
|
63
|
+
inputClassName
|
|
64
|
+
),
|
|
65
|
+
...props
|
|
66
|
+
}
|
|
67
|
+
),
|
|
68
|
+
hasValue && !props.disabled ? (
|
|
69
|
+
// Sable's own icon button, not a hand-sized <button>: the hit area,
|
|
70
|
+
// focus ring, press and disabled fade follow the control ladder with
|
|
71
|
+
// every other icon button. Muted ink until hovered, so the X never
|
|
72
|
+
// out-shouts the query it clears.
|
|
73
|
+
/* @__PURE__ */ jsx(
|
|
74
|
+
Button,
|
|
75
|
+
{
|
|
76
|
+
variant: "ghost",
|
|
77
|
+
size: "icon-xs",
|
|
78
|
+
onClick: handleClear,
|
|
79
|
+
"aria-label": "Clear search",
|
|
80
|
+
className: "absolute end-2 text-muted-foreground hover:text-foreground",
|
|
81
|
+
children: /* @__PURE__ */ jsx(Icon, { name: "xmark" })
|
|
82
|
+
}
|
|
83
|
+
)
|
|
84
|
+
) : null
|
|
85
|
+
] })
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
SearchInput.displayName = "SearchInput";
|
|
89
|
+
export {
|
|
90
|
+
SearchInput
|
|
91
|
+
};
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// src/components/search-input/search-input.meta.ts
|
|
2
|
+
var searchInputMeta = {
|
|
3
|
+
name: "SearchInput",
|
|
4
|
+
summary: "Styled search field with a leading magnifier and a clearable X. Soft-square (rounded-sm), card surface, 2px focus ring; the clear button appears only when there is a value.",
|
|
5
|
+
status: "stable",
|
|
6
|
+
keywords: [
|
|
7
|
+
"search",
|
|
8
|
+
"input",
|
|
9
|
+
"filter",
|
|
10
|
+
"query"
|
|
11
|
+
],
|
|
12
|
+
usage: {
|
|
13
|
+
description: "Use SearchInput for text queries that filter or search a known content set.",
|
|
14
|
+
bestPractices: [
|
|
15
|
+
{
|
|
16
|
+
guidance: "do",
|
|
17
|
+
description: "Use a clear placeholder that names the content being searched."
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
guidance: "do",
|
|
21
|
+
description: "Provide a visible clear affordance when query state persists."
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
guidance: "do",
|
|
25
|
+
description: "When a button stands in for search (a header trigger that opens CommandMenu with \u2318K), use CommandMenuTrigger. It wears this field's shell from the same source, so the two cannot drift; a hand-styled button already did once, into a borderless chip that matched neither the field nor a button."
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
guidance: "dont",
|
|
29
|
+
description: "Do not use SearchInput as a command palette; use CommandMenu for global commands, opened from the header by CommandMenuTrigger. A SearchInput that opens a dialog on focus is a text box you cannot type in."
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
guidance: "dont",
|
|
33
|
+
description: "Do not search on every keystroke against an expensive backend without debouncing. The user sees results flicker and reorder under them, and you send a request per character."
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
related: {
|
|
38
|
+
components: [
|
|
39
|
+
"Input",
|
|
40
|
+
"CommandMenu",
|
|
41
|
+
"Combobox"
|
|
42
|
+
]
|
|
43
|
+
},
|
|
44
|
+
props: [
|
|
45
|
+
{
|
|
46
|
+
name: "value",
|
|
47
|
+
type: "string",
|
|
48
|
+
description: "Controlled value of the search field."
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: "defaultValue",
|
|
52
|
+
type: "string",
|
|
53
|
+
description: "Uncontrolled initial value. The field tracks its own text, so the clear button still appears and empties it."
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: "className",
|
|
57
|
+
type: "string",
|
|
58
|
+
description: "Sizes and places the whole field \u2014 magnifier, input and clear button together (e.g. max-w-80). A width cap here keeps the clear button inside the field."
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: "inputClassName",
|
|
62
|
+
type: "string",
|
|
63
|
+
description: "Classes for the <input> element alone, for the rare input-only override."
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: "onValueChange",
|
|
67
|
+
type: "(value: string) => void",
|
|
68
|
+
description: "Called with the next string on every keystroke."
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
name: "onClear",
|
|
72
|
+
type: "() => void",
|
|
73
|
+
description: "Called when the clear button is pressed. The component also fires onValueChange('') so a controlled value resets."
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
name: "placeholder",
|
|
77
|
+
type: "string",
|
|
78
|
+
default: '"Search"',
|
|
79
|
+
description: "Placeholder text shown when the field is empty."
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
name: "disabled",
|
|
83
|
+
type: "boolean",
|
|
84
|
+
default: "false",
|
|
85
|
+
description: "Dims the control and blocks pointer interaction."
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
name: "...props",
|
|
89
|
+
type: 'ComponentPropsWithRef<"input">',
|
|
90
|
+
description: "All native input attributes (name, autoFocus, ref, aria-invalid, \u2026) pass through to the <input> except value/onChange, which are owned by value/onValueChange, and className, which sizes the whole field."
|
|
91
|
+
}
|
|
92
|
+
],
|
|
93
|
+
tokensUsed: [
|
|
94
|
+
"input",
|
|
95
|
+
"card",
|
|
96
|
+
"foreground",
|
|
97
|
+
"muted-foreground",
|
|
98
|
+
"ring",
|
|
99
|
+
"destructive"
|
|
100
|
+
],
|
|
101
|
+
a11y: [
|
|
102
|
+
'Renders a native <input type="search"> \u2014 keyboard and form semantics come for free.',
|
|
103
|
+
"Associate a <label htmlFor> (or wrap) \u2014 the magnifier glyph is decorative, not a label.",
|
|
104
|
+
"The leading search Icon is pointer-events-none and purely decorative.",
|
|
105
|
+
"The clear button is a real <button> (Sable's ghost icon Button) with aria-label='Clear search' and a focus-visible ring. It is hidden while the field is disabled.",
|
|
106
|
+
"Focus-visible draws a 2px ring in the --ring token; aria-invalid raises the destructive border and ring."
|
|
107
|
+
],
|
|
108
|
+
examples: [
|
|
109
|
+
{
|
|
110
|
+
label: "Controlled",
|
|
111
|
+
code: 'const [q, setQ] = useState("")\n<SearchInput value={q} onValueChange={setQ} placeholder="Search posts" />'
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
label: "With onClear",
|
|
115
|
+
code: '<SearchInput value={q} onValueChange={setQ} onClear={() => console.log("cleared")} />'
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
label: "Uncontrolled, sized as a whole",
|
|
119
|
+
code: '<Field label="Search posts"><SearchInput defaultValue="editions" className="max-w-80" /></Field>'
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
label: "Disabled",
|
|
123
|
+
code: '<SearchInput disabled placeholder="Search" />'
|
|
124
|
+
}
|
|
125
|
+
]
|
|
126
|
+
};
|
|
127
|
+
export {
|
|
128
|
+
searchInputMeta
|
|
129
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// src/components/section-header/section-header.tsx
|
|
2
|
+
import { useId } from "react";
|
|
3
|
+
import { cn } from "../../lib/cn.js";
|
|
4
|
+
import { HeadingRow } from "../../lib/heading-row.js";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
var TITLE_TIER = {
|
|
7
|
+
md: "text-heading-3",
|
|
8
|
+
sm: "text-heading-4"
|
|
9
|
+
};
|
|
10
|
+
function SectionHeader({
|
|
11
|
+
title,
|
|
12
|
+
description,
|
|
13
|
+
actions,
|
|
14
|
+
titleAs = "h2",
|
|
15
|
+
titleId,
|
|
16
|
+
size = "md",
|
|
17
|
+
className,
|
|
18
|
+
...props
|
|
19
|
+
}) {
|
|
20
|
+
const generatedId = useId();
|
|
21
|
+
return /* @__PURE__ */ jsxs("div", { "data-slot": "section-header", className: cn("flex flex-col gap-1", className), ...props, children: [
|
|
22
|
+
/* @__PURE__ */ jsx(
|
|
23
|
+
HeadingRow,
|
|
24
|
+
{
|
|
25
|
+
as: titleAs,
|
|
26
|
+
title,
|
|
27
|
+
titleId: titleId ?? generatedId,
|
|
28
|
+
titleClassName: TITLE_TIER[size],
|
|
29
|
+
band: "flex min-h-(--control-sm) items-center",
|
|
30
|
+
actions
|
|
31
|
+
}
|
|
32
|
+
),
|
|
33
|
+
description ? /* @__PURE__ */ jsx("p", { className: "max-w-(--measure-prose) text-body-sm text-pretty text-muted-foreground", children: description }) : null
|
|
34
|
+
] });
|
|
35
|
+
}
|
|
36
|
+
SectionHeader.displayName = "SectionHeader";
|
|
37
|
+
export {
|
|
38
|
+
SectionHeader
|
|
39
|
+
};
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
// src/components/section-header/section-header.meta.ts
|
|
2
|
+
var sectionHeaderMeta = {
|
|
3
|
+
name: "SectionHeader",
|
|
4
|
+
summary: 'The heading block for one section of a page: a title (h2 by default), an optional line of description, and actions on the title row \u2014 a "View all" link or a couple of buttons \u2014 that drop beneath the title only when the row runs out of room.',
|
|
5
|
+
status: "stable",
|
|
6
|
+
keywords: [
|
|
7
|
+
"section header",
|
|
8
|
+
"section heading",
|
|
9
|
+
"section title",
|
|
10
|
+
"shelf",
|
|
11
|
+
"view all",
|
|
12
|
+
"see all",
|
|
13
|
+
"show all",
|
|
14
|
+
"h2",
|
|
15
|
+
"subsection",
|
|
16
|
+
"optical alignment",
|
|
17
|
+
"bleed"
|
|
18
|
+
],
|
|
19
|
+
usage: {
|
|
20
|
+
description: "Use SectionHeader to head each section below the page title \u2014 a home-page shelf with View all, a settings group, a list with its own actions. PageHeader is the route's single h1; every section under it takes a SectionHeader, with titleId wired to the section's aria-labelledby.",
|
|
21
|
+
bestPractices: [
|
|
22
|
+
{
|
|
23
|
+
guidance: "do",
|
|
24
|
+
description: "Wrap the header and its content in a `<section aria-labelledby={titleId}>` (a flex column with a gap, or a Stack inside it) so the section is a named region and the header's title is its name."
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
guidance: "do",
|
|
28
|
+
description: "Pick titleAs by the document outline (h2 under the page h1, h3 inside an h2 section) and size by visual weight: md for a page's sections and shelves, sm for denser groups like settings."
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
guidance: "do",
|
|
32
|
+
description: 'Keep actions to one or two `size="sm"` buttons \u2014 the title is centred on that height. A shelf\'s "View all" is a ghost Button rendered as a link (`render={<a href=\u2026 />}`), named for what it opens when the label alone is ambiguous (aria-label="View all new releases").'
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
guidance: "do",
|
|
36
|
+
description: 'Pass a ghost or link action as a plain Button and let the header align it: the last direct child bleeds by its own padding at the end, so "View all" sits on the edge of the grid below, and the first bleeds at the start, which is the edge once the actions wrap beneath the title. Filled buttons keep their edge on the line. Set bleed="none" on the Button to opt one out.'
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
guidance: "dont",
|
|
40
|
+
description: "Nudge a View all onto the edge with -me-3, or wrap the actions in your own div: the header aligns direct children only, and only by each button's real padding. If you must wrap them, set bleed on the Button inside instead."
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
guidance: "dont",
|
|
44
|
+
description: 'Use a second PageHeader for a section \u2014 that is a second h1, and the outline then reports two documents. And do not hand-build `<div className="flex justify-between"><h2 className="text-heading-3">\u2026` per shelf: it misses the wrapping, the aria wiring and the shared rhythm.'
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
guidance: "dont",
|
|
48
|
+
description: "Use SectionHeader to title a Card (use CardHeader + CardTitle) or a docked tool panel (use PanelSection). It heads a section of the page, not a surface."
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
guidance: "dont",
|
|
52
|
+
description: "Add margin to the header to space it from its content. It has no outer spacing on purpose; the section's gap owns that rhythm, so every section on the page keeps the same one."
|
|
53
|
+
}
|
|
54
|
+
],
|
|
55
|
+
anatomy: [
|
|
56
|
+
{ name: "Title", required: true, description: "The section's heading (h2 by default), wrapping rather than truncating. Its id names the section." },
|
|
57
|
+
{ name: "Description", required: false, description: "One line of supporting copy under the title, capped at the prose measure." },
|
|
58
|
+
{
|
|
59
|
+
name: "Actions",
|
|
60
|
+
required: false,
|
|
61
|
+
description: "Buttons or links at the title row's end; they move beneath the title when the row is too narrow for both. A borderless (ghost/link) Button at either end of the group is optically aligned: its label, not its invisible padding, meets the content edge."
|
|
62
|
+
}
|
|
63
|
+
]
|
|
64
|
+
},
|
|
65
|
+
related: {
|
|
66
|
+
components: ["PageHeader", "CardHeader", "PanelSection", "Grid", "Stack", "Button"],
|
|
67
|
+
patterns: ["SettingsPage", "DashboardPage"]
|
|
68
|
+
},
|
|
69
|
+
props: [
|
|
70
|
+
{ name: "title", type: "ReactNode", description: "The section's title." },
|
|
71
|
+
{ name: "description", type: "ReactNode", description: "One line of supporting copy beneath the title, capped at the prose measure." },
|
|
72
|
+
{
|
|
73
|
+
name: "actions",
|
|
74
|
+
type: "ReactNode",
|
|
75
|
+
description: `Trailing actions on the title row \u2014 a View all link or a couple of buttons, size="sm". They stay on the title's row and drop beneath it only when the row runs out of room; the title wraps rather than truncating. A ghost or link Button that ends the group bleeds by its padding at the end (and one that starts it, at the start \u2014 the edge once wrapped), so its label lines up with the content below; Button bleed="none" opts out. Direct children only.`
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
name: "titleAs",
|
|
79
|
+
type: '"h2" | "h3" | "h4"',
|
|
80
|
+
default: '"h2"',
|
|
81
|
+
description: "The heading element, chosen by the document outline: h2 for a section under the page's h1, h3 for a subsection inside one."
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
name: "titleId",
|
|
85
|
+
type: "string",
|
|
86
|
+
description: "The title's id, so the section it heads can point at it: <section aria-labelledby={titleId}>. Generated when omitted."
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: "size",
|
|
90
|
+
type: '"md" | "sm"',
|
|
91
|
+
default: '"md"',
|
|
92
|
+
description: "Visual weight, independent of the heading level: md (text-heading-3) for a page's sections and shelves; sm (text-heading-4) for denser sets \u2014 settings groups, subsections."
|
|
93
|
+
}
|
|
94
|
+
],
|
|
95
|
+
variants: {
|
|
96
|
+
size: ["md", "sm"]
|
|
97
|
+
},
|
|
98
|
+
tokensUsed: ["foreground", "muted-foreground"],
|
|
99
|
+
a11y: [
|
|
100
|
+
"Renders a real heading (h2 by default); choose titleAs by the outline, never to get a size \u2014 size sets the look.",
|
|
101
|
+
"The title always carries an id (titleId, or a generated one). Point the section at it with aria-labelledby so the section is announced as a named region and appears in landmark navigation.",
|
|
102
|
+
'A repeated "View all" is ambiguous in a links list; name each one for its section (aria-label="View all new releases") or keep the visible label specific.'
|
|
103
|
+
],
|
|
104
|
+
motion: [
|
|
105
|
+
{ slot: "arrival", recipe: "none", part: "root", why: "A heading arrives with the section it names; animating it separately would make the section's title lag its content." },
|
|
106
|
+
{ slot: "response", recipe: "none", part: "root", why: "The header itself is not interactive; the Buttons passed as actions carry their own response." },
|
|
107
|
+
{ slot: "transition", recipe: "none", part: "root", why: "It has no states of its own to move between." },
|
|
108
|
+
{ slot: "activity", recipe: "none", part: "root", why: "It never does indeterminate work." }
|
|
109
|
+
],
|
|
110
|
+
examples: [
|
|
111
|
+
{
|
|
112
|
+
label: "A shelf with View all",
|
|
113
|
+
code: `<section aria-labelledby="new-releases" className="flex flex-col gap-4">
|
|
114
|
+
<SectionHeader
|
|
115
|
+
titleId="new-releases"
|
|
116
|
+
title="New releases"
|
|
117
|
+
description="Fresh from artists you follow."
|
|
118
|
+
actions={
|
|
119
|
+
<Button variant="ghost" size="sm" render={<a href="/new" />} aria-label="View all new releases">
|
|
120
|
+
View all
|
|
121
|
+
</Button>
|
|
122
|
+
}
|
|
123
|
+
/>
|
|
124
|
+
<Grid minItemWidth="10rem" gap={2}>
|
|
125
|
+
<Card><CardHeader><CardTitle>Night Swim</CardTitle><CardDescription>Lena Vale</CardDescription></CardHeader></Card>
|
|
126
|
+
<Card><CardHeader><CardTitle>Low Tide</CardTitle><CardDescription>Harbour Lights</CardDescription></CardHeader></Card>
|
|
127
|
+
</Grid>
|
|
128
|
+
</section>`
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
label: "A settings section",
|
|
132
|
+
code: `<section aria-labelledby="playback" className="flex flex-col gap-4">
|
|
133
|
+
<SectionHeader
|
|
134
|
+
titleId="playback"
|
|
135
|
+
size="sm"
|
|
136
|
+
title="Playback"
|
|
137
|
+
description="How tracks start, end and blend into each other."
|
|
138
|
+
/>
|
|
139
|
+
<Field label="Crossfade" orientation="horizontal">
|
|
140
|
+
<Switch defaultChecked />
|
|
141
|
+
</Field>
|
|
142
|
+
<Field label="Normalize volume" orientation="horizontal">
|
|
143
|
+
<Switch />
|
|
144
|
+
</Field>
|
|
145
|
+
</section>`
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
label: "A section with two actions",
|
|
149
|
+
code: `<section aria-labelledby="playlists" className="flex flex-col gap-4">
|
|
150
|
+
<SectionHeader
|
|
151
|
+
titleId="playlists"
|
|
152
|
+
title="Your playlists"
|
|
153
|
+
actions={
|
|
154
|
+
<>
|
|
155
|
+
<Button variant="ghost" size="sm" iconStart={<Icon name="filter" />}>Filter</Button>
|
|
156
|
+
<Button size="sm" iconStart={<Icon name="plus" />}>New playlist</Button>
|
|
157
|
+
</>
|
|
158
|
+
}
|
|
159
|
+
/>
|
|
160
|
+
<Stack gap={1}>
|
|
161
|
+
<Entity className="[--entity-px:0]" title="Late drives" subtitle="42 tracks" />
|
|
162
|
+
<Entity className="[--entity-px:0]" title="Focus" subtitle="18 tracks" />
|
|
163
|
+
</Stack>
|
|
164
|
+
</section>`
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
label: "A subsection inside a section",
|
|
168
|
+
code: `<SectionHeader titleAs="h3" size="sm" title="Appears on" />`
|
|
169
|
+
}
|
|
170
|
+
]
|
|
171
|
+
};
|
|
172
|
+
export {
|
|
173
|
+
sectionHeaderMeta
|
|
174
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// src/components/segmented-bar/index.ts
|
|
2
|
+
import {
|
|
3
|
+
SEGMENTED_BAR_TONES,
|
|
4
|
+
SegmentedBar
|
|
5
|
+
} from "./segmented-bar.js";
|
|
6
|
+
import { segmentedBarSegmentVariants, segmentedBarVariants } from "./segmented-bar.variants.js";
|
|
7
|
+
import { segmentedBarMeta } from "./segmented-bar.meta.js";
|
|
8
|
+
export {
|
|
9
|
+
SEGMENTED_BAR_TONES,
|
|
10
|
+
SegmentedBar,
|
|
11
|
+
segmentedBarMeta,
|
|
12
|
+
segmentedBarSegmentVariants,
|
|
13
|
+
segmentedBarVariants
|
|
14
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// src/components/segmented-bar/segmented-bar.tsx
|
|
2
|
+
import { cn } from "../../lib/cn.js";
|
|
3
|
+
import { segmentedBarSegmentVariants, segmentedBarVariants } from "./segmented-bar.variants.js";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
var SEGMENTED_BAR_TONES = ["edition", "collectible", "standard", "info", "primary", "neutral"];
|
|
6
|
+
function SegmentedBar({ segments, label, locale, size, className, ...props }) {
|
|
7
|
+
const total = segments.reduce((sum, s) => sum + Math.max(0, s.value), 0);
|
|
8
|
+
const percent = new Intl.NumberFormat(locale, { style: "percent", maximumFractionDigits: 0 });
|
|
9
|
+
const summary = segments.map((s) => `${s.label} ${percent.format(total ? Math.max(0, s.value) / total : 0)}`).join(", ");
|
|
10
|
+
return /* @__PURE__ */ jsx("div", { role: "img", "aria-label": `${label}: ${summary}`, className: cn(segmentedBarVariants({ size }), className), ...props, children: segments.map(
|
|
11
|
+
(s, i) => s.value > 0 ? /* @__PURE__ */ jsx(
|
|
12
|
+
"span",
|
|
13
|
+
{
|
|
14
|
+
"data-slot": "segmented-bar-segment",
|
|
15
|
+
className: segmentedBarSegmentVariants({ tone: s.tone ?? SEGMENTED_BAR_TONES[i % SEGMENTED_BAR_TONES.length] }),
|
|
16
|
+
style: { flexGrow: s.value }
|
|
17
|
+
},
|
|
18
|
+
s.label
|
|
19
|
+
) : null
|
|
20
|
+
) });
|
|
21
|
+
}
|
|
22
|
+
SegmentedBar.displayName = "SegmentedBar";
|
|
23
|
+
export {
|
|
24
|
+
SEGMENTED_BAR_TONES,
|
|
25
|
+
SegmentedBar
|
|
26
|
+
};
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// src/components/segmented-bar/segmented-bar.meta.ts
|
|
2
|
+
var segmentedBarMeta = {
|
|
3
|
+
name: "SegmentedBar",
|
|
4
|
+
summary: "One bar split into the parts of a whole \u2014 revenue by type, storage by kind, results by outcome. Segments size by their share of the total; the bar is one labelled image to assistive tech.",
|
|
5
|
+
keywords: ["breakdown", "stacked", "segmented", "proportion", "split", "distribution", "category", "bar", "share"],
|
|
6
|
+
usage: {
|
|
7
|
+
description: "Use SegmentedBar when a stat card or row needs to show how a total divides into a few categories. Pair it with a legend you compose (StatusDot + label + share), placed where the card has room. For one reading against a range (storage used, quota), use Meter; for task completion, use Progress.",
|
|
8
|
+
bestPractices: [
|
|
9
|
+
{
|
|
10
|
+
guidance: "do",
|
|
11
|
+
description: "Keep it to two to six segments and give the same category the same tone everywhere it appears."
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
guidance: "do",
|
|
15
|
+
description: `Show the legend's shares in text ("42%") \u2014 colour identifies a segment, but the number is what a reader compares.`
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
guidance: "dont",
|
|
19
|
+
description: "Use it for a single value against a limit; that is Meter, which carries the meter role and its value."
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
guidance: "dont",
|
|
23
|
+
description: "Rely on tone order alone to tell segments apart; a legend row per segment, with its label, is required."
|
|
24
|
+
}
|
|
25
|
+
],
|
|
26
|
+
anatomy: [
|
|
27
|
+
{ name: "Track", required: true, description: "The rounded bar; segments fill it edge to edge with a hairline gap." },
|
|
28
|
+
{ name: "Segment", required: true, description: "One category, sized by its share of the total and filled with its tone." }
|
|
29
|
+
]
|
|
30
|
+
},
|
|
31
|
+
related: {
|
|
32
|
+
components: ["Meter", "Progress", "StatusDot", "Card"],
|
|
33
|
+
patterns: ["DashboardPage"]
|
|
34
|
+
},
|
|
35
|
+
status: "stable",
|
|
36
|
+
props: [
|
|
37
|
+
{
|
|
38
|
+
name: "segments",
|
|
39
|
+
type: "{ label: string; value: number; tone?: SegmentedBarTone }[]",
|
|
40
|
+
description: "The categories, left to right. Values in any unit; zero or negative values are skipped."
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: "label",
|
|
44
|
+
type: "string",
|
|
45
|
+
description: "What the bar breaks down. Prefixes the accessible summary of every segment's share."
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: "size",
|
|
49
|
+
type: '"sm" | "md" | "lg"',
|
|
50
|
+
default: '"md"',
|
|
51
|
+
description: "Bar thickness \u2014 the same rails as Meter and Progress."
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: "locale",
|
|
55
|
+
type: "string",
|
|
56
|
+
default: "runtime locale",
|
|
57
|
+
description: "Locale for the spoken percentages."
|
|
58
|
+
}
|
|
59
|
+
],
|
|
60
|
+
variants: {
|
|
61
|
+
size: ["sm", "md", "lg"],
|
|
62
|
+
tone: ["edition", "collectible", "standard", "info", "primary", "neutral", "success", "warning", "destructive"]
|
|
63
|
+
},
|
|
64
|
+
tokensUsed: [
|
|
65
|
+
"tone-edition",
|
|
66
|
+
"tone-collectible",
|
|
67
|
+
"tone-standard",
|
|
68
|
+
"tone-info",
|
|
69
|
+
"primary",
|
|
70
|
+
"muted-foreground",
|
|
71
|
+
"success",
|
|
72
|
+
"tone-warning",
|
|
73
|
+
"destructive"
|
|
74
|
+
],
|
|
75
|
+
motion: [
|
|
76
|
+
{
|
|
77
|
+
slot: "arrival",
|
|
78
|
+
recipe: "none",
|
|
79
|
+
part: "SegmentedBar",
|
|
80
|
+
why: "A breakdown is a reading, present with the card that reports it; growing the segments in on load would act out a change that did not happen."
|
|
81
|
+
},
|
|
82
|
+
{ slot: "response", recipe: "none", part: "SegmentedBar", why: "It reports and accepts no input." },
|
|
83
|
+
{
|
|
84
|
+
slot: "transition",
|
|
85
|
+
recipe: "custom",
|
|
86
|
+
part: "Segment",
|
|
87
|
+
why: "Each segment's share and colour ease on the motion tokens when the data changes (no recipe animates flex-grow), so the reader sees which part grew."
|
|
88
|
+
},
|
|
89
|
+
{ slot: "activity", recipe: "none", part: "SegmentedBar", why: "No indeterminate state \u2014 an unknown breakdown is not drawn." }
|
|
90
|
+
],
|
|
91
|
+
a11y: [
|
|
92
|
+
'Rendered role=img with an aria-label built from `label` and each segment\'s share ("Revenue by type: Editions 42%, Collectibles 27%"), so the whole breakdown is read in one stop.',
|
|
93
|
+
"Colour alone does not identify a segment: always show a legend with each segment's label beside the bar."
|
|
94
|
+
],
|
|
95
|
+
examples: [
|
|
96
|
+
{
|
|
97
|
+
label: "With a legend",
|
|
98
|
+
code: 'const sales = [\n { label: "Editions", value: 42, tone: "edition" },\n { label: "Collectibles", value: 27, tone: "collectible" },\n { label: "Standard", value: 19, tone: "standard" },\n] as const\n\n<Stack gap={3}>\n <SegmentedBar label="Revenue by type" segments={[...sales]} size="lg" />\n <ul className="flex flex-col gap-1.5">\n {sales.map((s) => (\n <li key={s.label} className="flex items-center gap-2 text-body-sm">\n <StatusDot tone={s.tone} />\n <span className="flex-1 text-muted-foreground">{s.label}</span>\n <span className="text-mono-caption">{s.value}%</span>\n </li>\n ))}\n </ul>\n</Stack>'
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
label: "Test results \u2014 status tones",
|
|
102
|
+
code: '<SegmentedBar\n label="Test results"\n segments={[\n { label: "Passed", value: 412, tone: "success" },\n { label: "Flaky", value: 9, tone: "warning" },\n { label: "Failed", value: 3, tone: "destructive" },\n ]}\n/>'
|
|
103
|
+
}
|
|
104
|
+
]
|
|
105
|
+
};
|
|
106
|
+
export {
|
|
107
|
+
segmentedBarMeta
|
|
108
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// src/components/segmented-bar/segmented-bar.variants.ts
|
|
2
|
+
import { cva } from "class-variance-authority";
|
|
3
|
+
var segmentedBarSegmentVariants = cva(
|
|
4
|
+
"h-full min-w-0.5 basis-0 transition-[flex-grow,background-color] duration-(--motion-duration-slow) ease-decelerate",
|
|
5
|
+
{
|
|
6
|
+
variants: {
|
|
7
|
+
tone: {
|
|
8
|
+
edition: "bg-tone-edition",
|
|
9
|
+
collectible: "bg-tone-collectible",
|
|
10
|
+
standard: "bg-tone-standard",
|
|
11
|
+
info: "bg-tone-info",
|
|
12
|
+
primary: "bg-primary",
|
|
13
|
+
neutral: "bg-muted-foreground",
|
|
14
|
+
success: "bg-success",
|
|
15
|
+
warning: "bg-tone-warning",
|
|
16
|
+
destructive: "bg-destructive"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
defaultVariants: {
|
|
20
|
+
tone: "standard"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
);
|
|
24
|
+
var segmentedBarVariants = cva("flex w-full gap-0.5 overflow-hidden rounded-full", {
|
|
25
|
+
variants: {
|
|
26
|
+
size: {
|
|
27
|
+
sm: "h-1.5",
|
|
28
|
+
md: "h-2",
|
|
29
|
+
lg: "h-3"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
defaultVariants: {
|
|
33
|
+
size: "md"
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
export {
|
|
37
|
+
segmentedBarSegmentVariants,
|
|
38
|
+
segmentedBarVariants
|
|
39
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// src/components/select/index.ts
|
|
2
|
+
import {
|
|
3
|
+
Select,
|
|
4
|
+
SelectPortal,
|
|
5
|
+
SelectGroup,
|
|
6
|
+
SelectValue,
|
|
7
|
+
SelectTrigger,
|
|
8
|
+
SelectContent,
|
|
9
|
+
SelectItem,
|
|
10
|
+
SelectGroupLabel,
|
|
11
|
+
SelectSeparator
|
|
12
|
+
} from "./select.js";
|
|
13
|
+
import { selectMeta } from "./select.meta.js";
|
|
14
|
+
export {
|
|
15
|
+
Select,
|
|
16
|
+
SelectContent,
|
|
17
|
+
SelectGroup,
|
|
18
|
+
SelectGroupLabel,
|
|
19
|
+
SelectItem,
|
|
20
|
+
SelectPortal,
|
|
21
|
+
SelectSeparator,
|
|
22
|
+
SelectTrigger,
|
|
23
|
+
SelectValue,
|
|
24
|
+
selectMeta
|
|
25
|
+
};
|