@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,177 @@
|
|
|
1
|
+
// src/components/settings-menu/settings-menu.meta.ts
|
|
2
|
+
var settingsMenuMeta = {
|
|
3
|
+
name: "SettingsMenu",
|
|
4
|
+
summary: "A compact trigger that states the current settings, over a menu of rows that change them. Each row shows its own value and opens a submenu.",
|
|
5
|
+
status: "stable",
|
|
6
|
+
keywords: [
|
|
7
|
+
"settings",
|
|
8
|
+
"model picker",
|
|
9
|
+
"model switcher",
|
|
10
|
+
"options menu",
|
|
11
|
+
"preferences",
|
|
12
|
+
"submenu",
|
|
13
|
+
"quality settings",
|
|
14
|
+
"ai chat"
|
|
15
|
+
],
|
|
16
|
+
usage: {
|
|
17
|
+
description: "For a cluster of related settings that a reader checks often and changes occasionally \u2014 the model and effort on an AI composer, quality and format on an export control, density and sort on a table. It encodes one shape: summarise the state on the trigger, then open to a list of name \u2192 current value \u2192 submenu. It knows nothing about any particular domain; the AI-model case is one instance of it.",
|
|
18
|
+
bestPractices: [
|
|
19
|
+
{
|
|
20
|
+
guidance: "do",
|
|
21
|
+
description: 'Put the current values in `summary`, not a noun. "5.6 Sol High" tells the reader where they are; a trigger reading "Settings" makes them open it to find out, which is the wrong trade for a control glanced at twenty times a session.'
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
guidance: "do",
|
|
25
|
+
description: "Give every SettingsRow a `value`. One glance at the open menu should answer every setting at once \u2014 a menu of bare names is a menu you have to explore."
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
guidance: "do",
|
|
29
|
+
description: "Use `MenuRadioGroup` + `MenuRadioItem` inside a row for single-choice settings, so the current option is checked rather than merely remembered."
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
guidance: "do",
|
|
33
|
+
description: 'Reach for `variant="subtle"` when the trigger sits on a surface where a ghost control would float unanchored \u2014 inside a ChatComposer, for instance.'
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
guidance: "dont",
|
|
37
|
+
description: "Do not use it for a single setting. One choice is a `Select`; the nesting only earns its cost when there are several related settings to summarise."
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
guidance: "dont",
|
|
41
|
+
description: 'Do not put actions in it. Rows change state; a menu that mixes "Effort \u203A" with "Delete conversation" makes destructive commands look like preferences. That is `Menu` or `OverflowMenu`.'
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
guidance: "dont",
|
|
45
|
+
description: "Do not nest more than one level deep. Past that the reader loses the path back, and the thing you have is a settings dialog wearing a menu."
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
guidance: "dont",
|
|
49
|
+
description: "Do not override the upward, end-aligned default without reason. Its home is the bottom of a composer or toolbar, where a downward menu opens off-screen."
|
|
50
|
+
}
|
|
51
|
+
],
|
|
52
|
+
anatomy: [
|
|
53
|
+
{
|
|
54
|
+
name: "Trigger",
|
|
55
|
+
required: true,
|
|
56
|
+
description: "The summary control. States the current settings and carries a chevron; quiet at rest, so it does not compete with the primary action beside it."
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: "SettingsRow",
|
|
60
|
+
required: true,
|
|
61
|
+
description: "One setting: its name, its current value, and a submenu of options. Without children it renders flat, for a row that is a statement rather than a choice."
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
name: "Submenu contents",
|
|
65
|
+
required: false,
|
|
66
|
+
description: "Usually a MenuRadioGroup of MenuRadioItems, so the active option is checked."
|
|
67
|
+
}
|
|
68
|
+
]
|
|
69
|
+
},
|
|
70
|
+
related: {
|
|
71
|
+
components: ["Menu", "OverflowMenu", "Select", "ChatComposer", "Popover"],
|
|
72
|
+
patterns: ["ChatPanel"]
|
|
73
|
+
},
|
|
74
|
+
props: [
|
|
75
|
+
{
|
|
76
|
+
name: "summary",
|
|
77
|
+
type: "ReactNode",
|
|
78
|
+
description: "What the trigger reads when closed. Give it the current values, not a noun \u2014 the control should answer before it is opened."
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
name: "label",
|
|
82
|
+
type: "string",
|
|
83
|
+
default: '"Change settings"',
|
|
84
|
+
description: "Accessible name for the trigger, since the visible summary is data rather than a label."
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
name: "variant",
|
|
88
|
+
type: '"ghost" | "subtle"',
|
|
89
|
+
default: '"ghost"',
|
|
90
|
+
description: "Resting treatment. `ghost` disappears into the surface at rest and shows its affordance on hover \u2014 right for a toolbar. `subtle` adds a fill for surfaces where a ghost trigger would float unanchored."
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
name: "size",
|
|
94
|
+
type: '"xs" | "sm"',
|
|
95
|
+
default: '"sm"',
|
|
96
|
+
description: "Trigger height, read off the density ladder so a compact scope retunes it with every other control."
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: "side",
|
|
100
|
+
type: '"top" | "bottom" | "inline-start" | "inline-end"',
|
|
101
|
+
default: '"top"',
|
|
102
|
+
description: "Which side the menu opens on. Upward by default \u2014 its home is the bottom of a composer."
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
name: "align",
|
|
106
|
+
type: '"start" | "center" | "end"',
|
|
107
|
+
default: '"end"',
|
|
108
|
+
description: "Alignment along that side."
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
name: "disabled",
|
|
112
|
+
type: "boolean",
|
|
113
|
+
description: "Disable the trigger."
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
name: "...Menu props",
|
|
117
|
+
type: "Omit<ComponentProps<typeof Menu>, 'children'>",
|
|
118
|
+
description: "`open` / `defaultOpen` / `onOpenChange` and the rest of Base UI's menu root props."
|
|
119
|
+
}
|
|
120
|
+
],
|
|
121
|
+
subcomponents: [
|
|
122
|
+
{
|
|
123
|
+
name: "SettingsRow",
|
|
124
|
+
type: "{ label: ReactNode; value?: ReactNode; disabled?: boolean; children?: ReactNode }",
|
|
125
|
+
description: "One setting. With children it opens a submenu; without them it renders as a flat statement row."
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
name: "MenuRadioGroup",
|
|
129
|
+
type: "{ value?: string; defaultValue?: string; onValueChange?: (value: string) => void }",
|
|
130
|
+
description: "Single-choice group for a row's submenu. Exported from Menu; re-used here rather than duplicated."
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
name: "MenuRadioItem",
|
|
134
|
+
type: "{ value: string; disabled?: boolean }",
|
|
135
|
+
description: "One option, with a check in a reserved leading column so labels do not shift as the highlight moves."
|
|
136
|
+
}
|
|
137
|
+
],
|
|
138
|
+
variants: {
|
|
139
|
+
variant: ["ghost", "subtle"],
|
|
140
|
+
size: ["xs", "sm"]
|
|
141
|
+
},
|
|
142
|
+
tokensUsed: [
|
|
143
|
+
"foreground",
|
|
144
|
+
"muted",
|
|
145
|
+
"muted-foreground",
|
|
146
|
+
"accent",
|
|
147
|
+
"accent-foreground",
|
|
148
|
+
"popover",
|
|
149
|
+
"popover-foreground",
|
|
150
|
+
"border",
|
|
151
|
+
"ring"
|
|
152
|
+
],
|
|
153
|
+
a11y: [
|
|
154
|
+
"Base UI's Menu underneath, so roving focus, typeahead, Esc and outside-dismissal, and the full menu/menuitemradio ARIA wiring come for free \u2014 including submenu traversal with the arrow keys.",
|
|
155
|
+
'The trigger carries an explicit `label`, because its visible text is the current state rather than a name: without it, a screen reader announces "5.6 Sol High" with no indication that it is a control or what it changes.',
|
|
156
|
+
"Radio rows are `menuitemradio` with a real checked state, so the current choice is conveyed to assistive tech rather than only by a visible tick.",
|
|
157
|
+
"The check occupies a reserved column instead of appearing on selection, so labels never shift sideways as the highlight moves \u2014 a change that reads as motion to anyone tracking position.",
|
|
158
|
+
"Submenus open on the inline-end side, which flips correctly in RTL rather than always opening right."
|
|
159
|
+
],
|
|
160
|
+
examples: [
|
|
161
|
+
{
|
|
162
|
+
label: "A model switcher in a composer",
|
|
163
|
+
code: '<ChatComposer\n onSend={send}\n actions={\n <SettingsMenu variant="subtle" size="xs" summary={<><span className="text-foreground">{model.name}</span>{" "}<span className="text-muted-foreground">{effort}</span></>}>\n <SettingsRow label="Model" value={model.name}>\n <MenuRadioGroup value={model.id} onValueChange={setModelId}>\n <MenuRadioItem value="sol">5.6 Sol</MenuRadioItem>\n <MenuRadioItem value="lite">5.6 Lite</MenuRadioItem>\n </MenuRadioGroup>\n </SettingsRow>\n <SettingsRow label="Effort" value={effort}>\n <MenuRadioGroup value={effort} onValueChange={setEffort}>\n <MenuRadioItem value="Low">Low</MenuRadioItem>\n <MenuRadioItem value="High">High</MenuRadioItem>\n </MenuRadioGroup>\n </SettingsRow>\n </SettingsMenu>\n }\n/>'
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
label: "Export options \u2014 the same shape, no chat involved",
|
|
167
|
+
code: '<SettingsMenu summary={`${format} \xB7 ${quality}`} side="bottom" align="start">\n <SettingsRow label="Format" value={format}>\n <MenuRadioGroup value={format} onValueChange={setFormat}>\n <MenuRadioItem value="PNG">PNG</MenuRadioItem>\n <MenuRadioItem value="SVG">SVG</MenuRadioItem>\n </MenuRadioGroup>\n </SettingsRow>\n <SettingsRow label="Quality" value={quality}>\n <MenuRadioGroup value={quality} onValueChange={setQuality}>\n <MenuRadioItem value="Draft">Draft</MenuRadioItem>\n <MenuRadioItem value="Final">Final</MenuRadioItem>\n </MenuRadioGroup>\n </SettingsRow>\n</SettingsMenu>'
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
label: "A flat row for a setting with nothing to choose",
|
|
171
|
+
code: '<SettingsMenu summary="Standard">\n <SettingsRow label="Speed" value="Standard">\n <MenuRadioGroup value="standard">\n <MenuRadioItem value="standard">Standard</MenuRadioItem>\n <MenuRadioItem value="priority">Priority</MenuRadioItem>\n </MenuRadioGroup>\n </SettingsRow>\n <MenuSeparator />\n <SettingsRow label="Plan" value="Team" />\n</SettingsMenu>'
|
|
172
|
+
}
|
|
173
|
+
]
|
|
174
|
+
};
|
|
175
|
+
export {
|
|
176
|
+
settingsMenuMeta
|
|
177
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// src/components/settings-menu/settings-menu.variants.ts
|
|
2
|
+
var SETTINGS_TRIGGER_VARIANT = {
|
|
3
|
+
ghost: "ghost",
|
|
4
|
+
subtle: "secondary"
|
|
5
|
+
};
|
|
6
|
+
var SETTINGS_TRIGGER_SIZE = {
|
|
7
|
+
xs: "xs",
|
|
8
|
+
sm: "sm"
|
|
9
|
+
};
|
|
10
|
+
var settingsMenuTriggerClassName = "max-w-full [--button-icon:0.75rem] data-[popup-open]:bg-accent data-[popup-open]:text-accent-foreground";
|
|
11
|
+
export {
|
|
12
|
+
SETTINGS_TRIGGER_SIZE,
|
|
13
|
+
SETTINGS_TRIGGER_VARIANT,
|
|
14
|
+
settingsMenuTriggerClassName
|
|
15
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// src/components/sheet/index.ts
|
|
2
|
+
import {
|
|
3
|
+
Sheet,
|
|
4
|
+
SheetTrigger,
|
|
5
|
+
SheetClose,
|
|
6
|
+
SheetPortal,
|
|
7
|
+
SheetContent,
|
|
8
|
+
SheetTitle,
|
|
9
|
+
SheetDescription,
|
|
10
|
+
SheetHeader,
|
|
11
|
+
SheetList,
|
|
12
|
+
SheetFooter
|
|
13
|
+
} from "./sheet.js";
|
|
14
|
+
import { sheetVariants } from "./sheet.variants.js";
|
|
15
|
+
import { sheetMeta } from "./sheet.meta.js";
|
|
16
|
+
export {
|
|
17
|
+
Sheet,
|
|
18
|
+
SheetClose,
|
|
19
|
+
SheetContent,
|
|
20
|
+
SheetDescription,
|
|
21
|
+
SheetFooter,
|
|
22
|
+
SheetHeader,
|
|
23
|
+
SheetList,
|
|
24
|
+
SheetPortal,
|
|
25
|
+
SheetTitle,
|
|
26
|
+
SheetTrigger,
|
|
27
|
+
sheetMeta,
|
|
28
|
+
sheetVariants
|
|
29
|
+
};
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// src/components/sheet/sheet.tsx
|
|
2
|
+
import { Drawer as Base } from "@base-ui/react/drawer";
|
|
3
|
+
import {
|
|
4
|
+
createContext,
|
|
5
|
+
useContext,
|
|
6
|
+
useMemo,
|
|
7
|
+
useRef,
|
|
8
|
+
useState
|
|
9
|
+
} from "react";
|
|
10
|
+
import { cn } from "../../lib/cn.js";
|
|
11
|
+
import { withPortalThemeScope } from "../../lib/portal-theme-scope.js";
|
|
12
|
+
import { PresentationProvider, StackedActionsContext, usePresentation } from "../../lib/presentation.js";
|
|
13
|
+
import { mergeRefs } from "../../lib/refs.js";
|
|
14
|
+
import { useIsomorphicLayoutEffect } from "../../lib/use-isomorphic-layout-effect.js";
|
|
15
|
+
import { sheetVariants } from "./sheet.variants.js";
|
|
16
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
17
|
+
var SWIPE_DIRECTION = {
|
|
18
|
+
right: "right",
|
|
19
|
+
left: "left",
|
|
20
|
+
top: "up",
|
|
21
|
+
bottom: "down"
|
|
22
|
+
};
|
|
23
|
+
var SheetSideContext = createContext(null);
|
|
24
|
+
function Sheet(props) {
|
|
25
|
+
const [side, setSide] = useState("right");
|
|
26
|
+
return /* @__PURE__ */ jsx(SheetSideContext.Provider, { value: setSide, children: /* @__PURE__ */ jsx(Base.Root, { ...props, swipeDirection: SWIPE_DIRECTION[side] }) });
|
|
27
|
+
}
|
|
28
|
+
var SheetTrigger = Base.Trigger;
|
|
29
|
+
var SheetClose = Base.Close;
|
|
30
|
+
var SheetPortal = withPortalThemeScope(Base.Portal);
|
|
31
|
+
function SheetContent({
|
|
32
|
+
className,
|
|
33
|
+
children,
|
|
34
|
+
side,
|
|
35
|
+
initialFocus,
|
|
36
|
+
ref,
|
|
37
|
+
...props
|
|
38
|
+
}) {
|
|
39
|
+
const reportSide = useContext(SheetSideContext);
|
|
40
|
+
const resolvedSide = side ?? "right";
|
|
41
|
+
useIsomorphicLayoutEffect(() => {
|
|
42
|
+
reportSide?.(resolvedSide);
|
|
43
|
+
}, [reportSide, resolvedSide]);
|
|
44
|
+
const popupRef = useRef(null);
|
|
45
|
+
const mergedRef = useMemo(() => mergeRefs(popupRef, ref), [ref]);
|
|
46
|
+
return /* @__PURE__ */ jsxs(SheetPortal, { children: [
|
|
47
|
+
/* @__PURE__ */ jsx(Base.Backdrop, { className: "fixed inset-0 z-(--z-overlay) bg-overlay/(--scrim-alpha) opacity-[calc(1_-_var(--drawer-swipe-progress))] motion-fade data-[swiping]:transition-none" }),
|
|
48
|
+
/* @__PURE__ */ jsx(Base.Viewport, { className: "fixed inset-0 z-(--z-overlay)", children: /* @__PURE__ */ jsx(
|
|
49
|
+
Base.Popup,
|
|
50
|
+
{
|
|
51
|
+
ref: mergedRef,
|
|
52
|
+
initialFocus: initialFocus === void 0 ? (type) => type === "touch" ? popupRef.current : true : initialFocus,
|
|
53
|
+
className: cn(sheetVariants({ side }), className),
|
|
54
|
+
...props,
|
|
55
|
+
children: /* @__PURE__ */ jsx(Base.Content, { className: "contents", children: /* @__PURE__ */ jsx(PresentationProvider, { value: resolvedSide === "bottom" ? "sheet" : "page", children }) })
|
|
56
|
+
}
|
|
57
|
+
) })
|
|
58
|
+
] });
|
|
59
|
+
}
|
|
60
|
+
function SheetTitle({ className, ...props }) {
|
|
61
|
+
return /* @__PURE__ */ jsx(
|
|
62
|
+
Base.Title,
|
|
63
|
+
{
|
|
64
|
+
className: cn("text-title-lg text-popover-foreground", className),
|
|
65
|
+
...props
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
function SheetDescription({ className, ...props }) {
|
|
70
|
+
return /* @__PURE__ */ jsx(
|
|
71
|
+
Base.Description,
|
|
72
|
+
{
|
|
73
|
+
className: cn("text-body-sm text-muted-foreground", className),
|
|
74
|
+
...props
|
|
75
|
+
}
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
function SheetHeader({ className, ...props }) {
|
|
79
|
+
return /* @__PURE__ */ jsx("div", { className: cn("flex flex-col gap-1.5", className), ...props });
|
|
80
|
+
}
|
|
81
|
+
function SheetList({ className, ...props }) {
|
|
82
|
+
return /* @__PURE__ */ jsx(
|
|
83
|
+
"div",
|
|
84
|
+
{
|
|
85
|
+
"data-slot": "sheet-list",
|
|
86
|
+
className: cn(
|
|
87
|
+
"-mx-(--sheet-p) flex flex-col [--entity-radius:0px] [--entity-px:var(--sheet-p)]",
|
|
88
|
+
className
|
|
89
|
+
),
|
|
90
|
+
...props
|
|
91
|
+
}
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
function SheetFooter({ className, children, ...props }) {
|
|
95
|
+
const stacked = usePresentation() === "sheet";
|
|
96
|
+
return /* @__PURE__ */ jsx(
|
|
97
|
+
"div",
|
|
98
|
+
{
|
|
99
|
+
"data-actions": stacked ? "stack" : "row",
|
|
100
|
+
className: cn(
|
|
101
|
+
"mt-auto flex items-center justify-end gap-2",
|
|
102
|
+
className,
|
|
103
|
+
stacked && "w-full max-w-sm flex-col-reverse items-stretch justify-start self-center"
|
|
104
|
+
),
|
|
105
|
+
...props,
|
|
106
|
+
children: stacked ? /* @__PURE__ */ jsx(StackedActionsContext.Provider, { value: true, children }) : children
|
|
107
|
+
}
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
export {
|
|
111
|
+
Sheet,
|
|
112
|
+
SheetClose,
|
|
113
|
+
SheetContent,
|
|
114
|
+
SheetDescription,
|
|
115
|
+
SheetFooter,
|
|
116
|
+
SheetHeader,
|
|
117
|
+
SheetList,
|
|
118
|
+
SheetPortal,
|
|
119
|
+
SheetTitle,
|
|
120
|
+
SheetTrigger
|
|
121
|
+
};
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
// src/components/sheet/sheet.meta.ts
|
|
2
|
+
var sheetMeta = {
|
|
3
|
+
name: "Sheet",
|
|
4
|
+
summary: "Edge-anchored drawer over Base UI Drawer \u2014 focus trap, scroll lock, Esc/outside dismissal, portal backdrop, plus swipe-to-dismiss on touch. Slides in from a viewport edge via side and swipes back out toward the same edge.",
|
|
5
|
+
status: "stable",
|
|
6
|
+
keywords: [
|
|
7
|
+
"sheet",
|
|
8
|
+
"drawer",
|
|
9
|
+
"side panel",
|
|
10
|
+
"overlay",
|
|
11
|
+
"swipe to dismiss"
|
|
12
|
+
],
|
|
13
|
+
usage: {
|
|
14
|
+
description: "Use Sheet for secondary workflows that slide in while preserving context from the underlying page.",
|
|
15
|
+
bestPractices: [
|
|
16
|
+
{
|
|
17
|
+
guidance: "do",
|
|
18
|
+
description: "Use it for inspect, edit, filter, or create flows that relate to the current page."
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
guidance: "do",
|
|
22
|
+
description: "Include clear title, close path, and footer actions for task-oriented sheets."
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
guidance: "dont",
|
|
26
|
+
description: "Do not use Sheet for simple confirmations or deeply nested workflows."
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
guidance: "dont",
|
|
30
|
+
description: "Do not use it on desktop where a Dialog fits. A sheet's affordance is edge-anchored travel for thumb reach; on a wide viewport it becomes a dialog that arrives from the wrong place."
|
|
31
|
+
}
|
|
32
|
+
],
|
|
33
|
+
anatomy: [
|
|
34
|
+
{
|
|
35
|
+
name: "SheetTrigger",
|
|
36
|
+
required: false,
|
|
37
|
+
description: "The element that opens the sheet."
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: "SheetContent",
|
|
41
|
+
required: true,
|
|
42
|
+
description: "The sliding panel content."
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: "SheetClose",
|
|
46
|
+
required: false,
|
|
47
|
+
description: "An explicit close control."
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: "SheetHeader",
|
|
51
|
+
required: false,
|
|
52
|
+
description: "The title and description region."
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: "SheetTitle",
|
|
56
|
+
required: false,
|
|
57
|
+
description: "The sheet heading."
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
name: "SheetDescription",
|
|
61
|
+
required: false,
|
|
62
|
+
description: "Supporting context for the sheet."
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
name: "SheetList",
|
|
66
|
+
required: false,
|
|
67
|
+
description: "Edge-to-edge rows (Entity) aligned with the header \u2014 a queue, notifications, a picker."
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
name: "SheetFooter",
|
|
71
|
+
required: false,
|
|
72
|
+
description: "Footer actions for the workflow."
|
|
73
|
+
}
|
|
74
|
+
]
|
|
75
|
+
},
|
|
76
|
+
related: {
|
|
77
|
+
components: [
|
|
78
|
+
"Dialog",
|
|
79
|
+
"Popover",
|
|
80
|
+
"Sidebar"
|
|
81
|
+
]
|
|
82
|
+
},
|
|
83
|
+
props: [
|
|
84
|
+
{
|
|
85
|
+
name: "Sheet (Root)",
|
|
86
|
+
type: "Base UI Drawer.Root props (open, defaultOpen, onOpenChange, onOpenChangeComplete, modal, disablePointerDismissal, actionsRef, handle) \u2014 minus swipeDirection and snap points",
|
|
87
|
+
description: `Controls open state. Uncontrolled by default. The dismiss swipe direction is not a prop: it follows SheetContent's side. onOpenChange reports reason "swipe" when a swipe closed it.`
|
|
88
|
+
}
|
|
89
|
+
],
|
|
90
|
+
subcomponents: [
|
|
91
|
+
{
|
|
92
|
+
name: "SheetContent",
|
|
93
|
+
type: 'Base UI Drawer.Popup props (initialFocus, finalFocus, \u2026) + side: "right" | "left" | "top" | "bottom" + className',
|
|
94
|
+
description: 'Backdrop + edge-anchored popup; portals to <body>. side picks which viewport edge the sheet anchors to and slides in from (defaults to "right"). Left/right are full-height side panels; top/bottom span the width up to 80vh. On touch it swipes closed toward that same edge (right swipes right, left swipes left, top swipes up, bottom swipes down).'
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
name: "SheetTrigger",
|
|
98
|
+
type: "Base UI Drawer.Trigger props (render)",
|
|
99
|
+
description: "Element that opens the sheet. Compose via render prop."
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
name: "SheetClose",
|
|
103
|
+
type: "Base UI Drawer.Close props (render)",
|
|
104
|
+
description: "Element that dismisses the sheet. Compose via render prop."
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
name: "SheetHeader",
|
|
108
|
+
type: 'ComponentProps<"div">',
|
|
109
|
+
description: "Top section holding SheetTitle/SheetDescription."
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
name: "SheetTitle",
|
|
113
|
+
type: "Base UI Drawer.Title props + className",
|
|
114
|
+
description: "The sheet's accessible name \u2014 wires aria-labelledby on the popup."
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
name: "SheetDescription",
|
|
118
|
+
type: "Base UI Drawer.Description props + className",
|
|
119
|
+
description: "Muted supporting line; wires aria-describedby."
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
name: "SheetList",
|
|
123
|
+
type: 'ComponentProps<"div">',
|
|
124
|
+
description: "Rows that run edge to edge in the sheet, Entity most often. It bleeds through the sheet's padding (--sheet-p) and hands it back to each row as --entity-px, so row content lines up with SheetHeader and a row's hover fill reaches the panel's edges. Without it a list of Entity rows sits 12px in from the header. The Sheet equivalent of CardList."
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
name: "SheetFooter",
|
|
128
|
+
type: 'ComponentProps<"div">',
|
|
129
|
+
description: "Bottom row for actions, pinned after the scrollable body. In a bottom sheet it stacks: full width, the primary on top, every button at the cta height."
|
|
130
|
+
}
|
|
131
|
+
],
|
|
132
|
+
variants: {
|
|
133
|
+
side: ["right", "left", "top", "bottom"]
|
|
134
|
+
},
|
|
135
|
+
tokensUsed: ["popover", "popover-foreground", "border", "muted-foreground"],
|
|
136
|
+
a11y: [
|
|
137
|
+
"Base UI provides focus trapping, scroll lock, aria-modal, and labelled-by wiring (SheetTitle).",
|
|
138
|
+
"The panel scrolls its own content (thin scrollbar, contained overscroll) when it outgrows its bound \u2014 the full height on left/right, 80vh on top/bottom.",
|
|
139
|
+
"Esc and click-outside dismiss by default; on touch, a swipe toward the sheet's own edge dismisses too. A short or slow drag springs back.",
|
|
140
|
+
"Swipe is an extra path, never the only one: Esc, click-outside and SheetClose all still work.",
|
|
141
|
+
"Focus matches Dialog: the first tabbable on mouse/keyboard open, the panel itself on touch (so the virtual keyboard stays down); focus returns to the trigger on close.",
|
|
142
|
+
"Render a SheetClose inside SheetContent so screen-reader users can escape the popup.",
|
|
143
|
+
"Slide animation runs via data-[starting-style]/data-[ending-style] attributes on the motion-duration token; while swiping the panel tracks the finger directly, and a released swipe finishes on the same token (scaled by flick speed), so reduced motion makes it instant.",
|
|
144
|
+
"A mouse drag that starts on sheet content selects text rather than dragging the panel; mouse dragging only starts from the padding edge."
|
|
145
|
+
],
|
|
146
|
+
examples: [
|
|
147
|
+
{
|
|
148
|
+
label: "List of rows (a queue)",
|
|
149
|
+
code: '<Sheet><SheetTrigger render={<Button variant="secondary">Queue</Button>} /><SheetContent><SheetHeader><SheetTitle>Up next</SheetTitle></SheetHeader><SheetList>{queue.map((track) => <Entity key={track.id} leading={<GradientArt aria-hidden seed={track.title} className="size-10 rounded-sm" />} title={track.title} subtitle={track.artist} />)}</SheetList></SheetContent></Sheet>'
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
label: "Basic (right)",
|
|
153
|
+
code: '<Sheet><SheetTrigger render={<Button>Open</Button>} /><SheetContent><SheetHeader><SheetTitle>Filters</SheetTitle><SheetDescription>Narrow the feed.</SheetDescription></SheetHeader><SheetFooter><SheetClose render={<Button variant="secondary">Cancel</Button>} /><SheetClose render={<Button>Apply</Button>} /></SheetFooter></SheetContent></Sheet>'
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
label: "Left side",
|
|
157
|
+
code: '<Sheet><SheetTrigger render={<Button variant="secondary">Menu</Button>} /><SheetContent side="left"><SheetHeader><SheetTitle>Navigation</SheetTitle></SheetHeader><SheetFooter><SheetClose render={<Button variant="secondary">Close</Button>} /></SheetFooter></SheetContent></Sheet>'
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
label: "Bottom side",
|
|
161
|
+
code: '<Sheet><SheetTrigger render={<Button variant="secondary">Details</Button>} /><SheetContent side="bottom"><SheetHeader><SheetTitle>Edition details</SheetTitle></SheetHeader><SheetFooter><SheetClose render={<Button variant="secondary">Close</Button>} /></SheetFooter></SheetContent></Sheet>'
|
|
162
|
+
}
|
|
163
|
+
]
|
|
164
|
+
};
|
|
165
|
+
export {
|
|
166
|
+
sheetMeta
|
|
167
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// src/components/sheet/sheet.variants.ts
|
|
2
|
+
import { cva } from "class-variance-authority";
|
|
3
|
+
var sheetVariants = cva(
|
|
4
|
+
"fixed z-(--z-overlay) flex flex-col gap-4 overflow-y-auto overscroll-contain border-border-floating bg-popover sable-surface-popover [--sheet-p:--spacing(6)] p-(--sheet-p) text-popover-foreground shadow-lg outline-none transition-transform duration-(--motion-duration-base) ease-emphasized scrollbar-quiet data-[swiping]:select-none data-[swipe-dismiss]:duration-[calc(var(--motion-duration-base)*var(--drawer-swipe-strength))]",
|
|
5
|
+
{
|
|
6
|
+
variants: {
|
|
7
|
+
side: {
|
|
8
|
+
right: "inset-y-0 right-0 [transform:translateX(var(--drawer-swipe-movement-x))] h-full w-95 max-w-[90vw] border-l data-[ending-style]:translate-x-full data-[starting-style]:translate-x-full",
|
|
9
|
+
left: "inset-y-0 left-0 [transform:translateX(var(--drawer-swipe-movement-x))] h-full w-95 max-w-[90vw] border-r data-[ending-style]:-translate-x-full data-[starting-style]:-translate-x-full",
|
|
10
|
+
top: "inset-x-0 top-0 [transform:translateY(var(--drawer-swipe-movement-y))] h-auto max-h-[80vh] w-full border-b data-[ending-style]:-translate-y-full data-[starting-style]:-translate-y-full",
|
|
11
|
+
bottom: "inset-x-0 bottom-0 [transform:translateY(var(--drawer-swipe-movement-y))] h-auto max-h-[80vh] w-full border-t data-[ending-style]:translate-y-full data-[starting-style]:translate-y-full"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
defaultVariants: {
|
|
15
|
+
side: "right"
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
);
|
|
19
|
+
export {
|
|
20
|
+
sheetVariants
|
|
21
|
+
};
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/components/show-more/show-more.tsx
|
|
4
|
+
import { useCallback, useRef, useState } from "react";
|
|
5
|
+
import { Icon } from "../../icon/index.js";
|
|
6
|
+
import { cn } from "../../lib/cn.js";
|
|
7
|
+
import { useResizeObserver } from "../../lib/use-resize-observer.js";
|
|
8
|
+
import { Button } from "../button/button.js";
|
|
9
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
10
|
+
function lineHeightOf(el) {
|
|
11
|
+
const target = el.firstElementChild ?? el;
|
|
12
|
+
const style = getComputedStyle(target);
|
|
13
|
+
const lh = Number.parseFloat(style.lineHeight);
|
|
14
|
+
if (Number.isFinite(lh)) return lh;
|
|
15
|
+
return (Number.parseFloat(style.fontSize) || 16) * 1.2;
|
|
16
|
+
}
|
|
17
|
+
function ShowMore({
|
|
18
|
+
children,
|
|
19
|
+
collapsedHeight = 96,
|
|
20
|
+
collapsedLines,
|
|
21
|
+
className,
|
|
22
|
+
...props
|
|
23
|
+
}) {
|
|
24
|
+
const [expanded, setExpanded] = useState(false);
|
|
25
|
+
const contentRef = useRef(null);
|
|
26
|
+
const [contentHeight, setContentHeight] = useState(collapsedHeight);
|
|
27
|
+
const [linesHeight, setLinesHeight] = useState(null);
|
|
28
|
+
const measure = useCallback(() => {
|
|
29
|
+
const el = contentRef.current;
|
|
30
|
+
if (!el) return;
|
|
31
|
+
setContentHeight(el.offsetHeight);
|
|
32
|
+
setLinesHeight(
|
|
33
|
+
collapsedLines !== void 0 ? Math.round(collapsedLines * lineHeightOf(el)) : null
|
|
34
|
+
);
|
|
35
|
+
}, [collapsedLines]);
|
|
36
|
+
useResizeObserver(measure, [contentRef]);
|
|
37
|
+
const collapsed = linesHeight ?? collapsedHeight;
|
|
38
|
+
const overflowing = contentHeight > collapsed;
|
|
39
|
+
const maxHeight = expanded ? contentHeight : collapsed;
|
|
40
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-2", className), ...props, children: [
|
|
41
|
+
/* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
42
|
+
/* @__PURE__ */ jsx(
|
|
43
|
+
"div",
|
|
44
|
+
{
|
|
45
|
+
className: "overflow-hidden transition-[max-height] duration-(--motion-duration-slow) ease-decelerate",
|
|
46
|
+
style: { maxHeight },
|
|
47
|
+
children: /* @__PURE__ */ jsx("div", { ref: contentRef, children })
|
|
48
|
+
}
|
|
49
|
+
),
|
|
50
|
+
overflowing && /* @__PURE__ */ jsx(
|
|
51
|
+
"div",
|
|
52
|
+
{
|
|
53
|
+
"aria-hidden": true,
|
|
54
|
+
className: cn(
|
|
55
|
+
"pointer-events-none absolute inset-x-0 bottom-0 h-12 bg-gradient-to-t from-[var(--sable-surface-bg,var(--background))] to-transparent motion-interactive",
|
|
56
|
+
expanded && "opacity-0"
|
|
57
|
+
)
|
|
58
|
+
}
|
|
59
|
+
)
|
|
60
|
+
] }),
|
|
61
|
+
overflowing && /* @__PURE__ */ jsx(
|
|
62
|
+
Button,
|
|
63
|
+
{
|
|
64
|
+
variant: "link",
|
|
65
|
+
size: "sm",
|
|
66
|
+
onClick: () => setExpanded((prev) => !prev),
|
|
67
|
+
"aria-expanded": expanded,
|
|
68
|
+
className: "self-start px-0",
|
|
69
|
+
iconEnd: /* @__PURE__ */ jsx(
|
|
70
|
+
Icon,
|
|
71
|
+
{
|
|
72
|
+
name: "chevron-down",
|
|
73
|
+
className: cn(
|
|
74
|
+
"transition-transform duration-(--motion-duration-fast) ease-standard",
|
|
75
|
+
expanded && "rotate-180"
|
|
76
|
+
)
|
|
77
|
+
}
|
|
78
|
+
),
|
|
79
|
+
children: expanded ? "Show less" : "Show more"
|
|
80
|
+
}
|
|
81
|
+
)
|
|
82
|
+
] });
|
|
83
|
+
}
|
|
84
|
+
ShowMore.displayName = "ShowMore";
|
|
85
|
+
export {
|
|
86
|
+
ShowMore
|
|
87
|
+
};
|