@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,214 @@
|
|
|
1
|
+
// src/lib/taxonomy.ts
|
|
2
|
+
var COMPONENT_GROUPS = [
|
|
3
|
+
"Actions",
|
|
4
|
+
"Badges & pills",
|
|
5
|
+
"Charts",
|
|
6
|
+
"Chat & AI",
|
|
7
|
+
"Containers",
|
|
8
|
+
"Data display",
|
|
9
|
+
"Forms",
|
|
10
|
+
"Layout",
|
|
11
|
+
"Loading & progress",
|
|
12
|
+
"Media & mockups",
|
|
13
|
+
"Navigation",
|
|
14
|
+
"Overlays",
|
|
15
|
+
"Selection",
|
|
16
|
+
"Status",
|
|
17
|
+
"Text & code"
|
|
18
|
+
];
|
|
19
|
+
var COMPONENT_TAXONOMY = {
|
|
20
|
+
/* ── Actions ──────────────────────────────────────────────────────────────
|
|
21
|
+
Things whose whole purpose is to DO something on activation. `OverflowMenu`
|
|
22
|
+
is here, not in Overlays: it is the "more actions" button a reader reaches
|
|
23
|
+
for as an action (and the options half of Button's "main action with
|
|
24
|
+
options" pattern) — that its list opens in a layer is how it works, not
|
|
25
|
+
what it is. Copying is `useCopy` on a Button, not a component. */
|
|
26
|
+
Button: ["Actions", "either"],
|
|
27
|
+
OverflowMenu: ["Actions", "either"],
|
|
28
|
+
Toolbar: ["Actions", "either"],
|
|
29
|
+
/* ── Forms ────────────────────────────────────────────────────────────────
|
|
30
|
+
Typing or entering a value, and the structure a form is built from.
|
|
31
|
+
Choosing from options moved out to Selection. `ColorField` and
|
|
32
|
+
`ScrubField` are form vocabulary that happens to be used in tool chrome —
|
|
33
|
+
the register tag carries that, not the group. */
|
|
34
|
+
Calendar: ["Forms", "either"],
|
|
35
|
+
ColorField: ["Forms", "either"],
|
|
36
|
+
DatePicker: ["Forms", "either"],
|
|
37
|
+
Fieldset: ["Forms", "either"],
|
|
38
|
+
FileDropzone: ["Forms", "page"],
|
|
39
|
+
Form: ["Forms", "either"],
|
|
40
|
+
Input: ["Forms", "either"],
|
|
41
|
+
Label: ["Forms", "either"],
|
|
42
|
+
NumberField: ["Forms", "either"],
|
|
43
|
+
OtpField: ["Forms", "either"],
|
|
44
|
+
ScrubField: ["Forms", "workspace"],
|
|
45
|
+
SearchInput: ["Forms", "either"],
|
|
46
|
+
Textarea: ["Forms", "either"],
|
|
47
|
+
/* ── Selection ────────────────────────────────────────────────────────────
|
|
48
|
+
Choosing from options: on/off, one of many, several of many, a point on a
|
|
49
|
+
range. Split from Forms so a 27-item group became two a reader can scan.
|
|
50
|
+
`Toggle` sits with `Switch`, which its own meta calls its sibling;
|
|
51
|
+
`ThemeSelector`/`ThemeSwitcher` capture a stored preference. */
|
|
52
|
+
Checkbox: ["Selection", "either"],
|
|
53
|
+
CheckboxCard: ["Selection", "page"],
|
|
54
|
+
RadioCard: ["Selection", "page"],
|
|
55
|
+
Combobox: ["Selection", "either"],
|
|
56
|
+
DisclosurePicker: ["Selection", "either"],
|
|
57
|
+
FontPicker: ["Selection", "either"],
|
|
58
|
+
Radio: ["Selection", "either"],
|
|
59
|
+
Select: ["Selection", "either"],
|
|
60
|
+
Slider: ["Selection", "either"],
|
|
61
|
+
Switch: ["Selection", "either"],
|
|
62
|
+
ThemeSelector: ["Selection", "either"],
|
|
63
|
+
ThemeSwitcher: ["Selection", "either"],
|
|
64
|
+
Toggle: ["Selection", "either"],
|
|
65
|
+
/* ── Overlays ─────────────────────────────────────────────────────────────
|
|
66
|
+
Anything that renders above the page in its own layer. */
|
|
67
|
+
CommandMenu: ["Overlays", "either"],
|
|
68
|
+
ContextCard: ["Overlays", "page"],
|
|
69
|
+
ContextMenu: ["Overlays", "either"],
|
|
70
|
+
DestructiveActionModal: ["Overlays", "either"],
|
|
71
|
+
Dialog: ["Overlays", "either"],
|
|
72
|
+
Feedback: ["Overlays", "page"],
|
|
73
|
+
Menu: ["Overlays", "either"],
|
|
74
|
+
Popover: ["Overlays", "either"],
|
|
75
|
+
SettingsMenu: ["Overlays", "either"],
|
|
76
|
+
Sheet: ["Overlays", "either"],
|
|
77
|
+
Tooltip: ["Overlays", "either"],
|
|
78
|
+
/* ── Navigation ───────────────────────────────────────────────────────────
|
|
79
|
+
Getting somewhere else, or to more of the same thing. `Pagination` and
|
|
80
|
+
`ShowMore` (and a `Button` with `loading` for load-more) reveal more content and
|
|
81
|
+
stay together; `Tree` is the hierarchy browser. */
|
|
82
|
+
Breadcrumbs: ["Navigation", "either"],
|
|
83
|
+
BottomNav: ["Navigation", "page"],
|
|
84
|
+
Pagination: ["Navigation", "either"],
|
|
85
|
+
ShowMore: ["Navigation", "page"],
|
|
86
|
+
SideNav: ["Navigation", "page"],
|
|
87
|
+
Sidebar: ["Navigation", "page"],
|
|
88
|
+
Tabs: ["Navigation", "either"],
|
|
89
|
+
Tree: ["Navigation", "workspace"],
|
|
90
|
+
/* ── Layout ───────────────────────────────────────────────────────────────
|
|
91
|
+
The frame a product lives in, in either register (renamed from "Shells":
|
|
92
|
+
a designer looks for the app header and panels under Layout). The layout
|
|
93
|
+
PRIMITIVES — Stack, Row, Region, Grid — are foundations, not components,
|
|
94
|
+
and live on the Grid & layout page. */
|
|
95
|
+
AppHeader: ["Layout", "page"],
|
|
96
|
+
AppShell: ["Layout", "page"],
|
|
97
|
+
PageHeader: ["Layout", "page"],
|
|
98
|
+
PanelGroup: ["Layout", "workspace"],
|
|
99
|
+
PanelSection: ["Layout", "workspace"],
|
|
100
|
+
SectionHeader: ["Layout", "page"],
|
|
101
|
+
StatusBar: ["Layout", "workspace"],
|
|
102
|
+
Workspace: ["Layout", "workspace"],
|
|
103
|
+
/* ── Containers ───────────────────────────────────────────────────────────
|
|
104
|
+
A box that holds other content: bounds it, folds it, scrolls it, divides
|
|
105
|
+
it. `Card` moved here from Data Display — people look for a card as a
|
|
106
|
+
container, not as a way of showing data. */
|
|
107
|
+
Accordion: ["Containers", "either"],
|
|
108
|
+
Card: ["Containers", "page"],
|
|
109
|
+
Collapsible: ["Containers", "either"],
|
|
110
|
+
Scroller: ["Containers", "either"],
|
|
111
|
+
Separator: ["Containers", "either"],
|
|
112
|
+
/* ── Charts ───────────────────────────────────────────────────────────────
|
|
113
|
+
Plotted data for dashboards, landing pages and decks: SVG on the theme's
|
|
114
|
+
tones, with arrival and data-change motion and a data table for assistive
|
|
115
|
+
tech. Data-heavy apps (streaming, zoom, thousands of points) belong on a
|
|
116
|
+
charting library. `SegmentedBar` and `Meter` stay in Data display: they
|
|
117
|
+
are readings, not plots. */
|
|
118
|
+
AreaChart: ["Charts", "page"],
|
|
119
|
+
BarChart: ["Charts", "page"],
|
|
120
|
+
LineChart: ["Charts", "page"],
|
|
121
|
+
PieChart: ["Charts", "page"],
|
|
122
|
+
RadarChart: ["Charts", "page"],
|
|
123
|
+
RadialChart: ["Charts", "page"],
|
|
124
|
+
Sparkline: ["Charts", "either"],
|
|
125
|
+
/* ── Data display ─────────────────────────────────────────────────────────
|
|
126
|
+
Showing records and readings. `Meter` (bar or ring) is here: it shows a
|
|
127
|
+
value within a known range (a reading), which is not loading or progress. */
|
|
128
|
+
Avatar: ["Data display", "either"],
|
|
129
|
+
DataTable: ["Data display", "either"],
|
|
130
|
+
DateTile: ["Data display", "page"],
|
|
131
|
+
Entity: ["Data display", "either"],
|
|
132
|
+
GlidingHighlight: ["Data display", "either"],
|
|
133
|
+
Meter: ["Data display", "either"],
|
|
134
|
+
RelativeTime: ["Data display", "either"],
|
|
135
|
+
SegmentedBar: ["Data display", "either"],
|
|
136
|
+
Table: ["Data display", "either"],
|
|
137
|
+
/* ── Badges & pills ───────────────────────────────────────────────────────
|
|
138
|
+
Small labelled shapes. `Badge` (with `dot`) / `StatusDot` belong HERE, not in
|
|
139
|
+
Status: an earlier audit moved them next to Toast/Banner and the crossing
|
|
140
|
+
links went UP (14 → 21) — they relate to Badge, Pill and Entity, which is
|
|
141
|
+
a badge-shaped argument. This group makes that finding the obvious home. */
|
|
142
|
+
Badge: ["Badges & pills", "either"],
|
|
143
|
+
NotificationBadge: ["Badges & pills", "either"],
|
|
144
|
+
Pill: ["Badges & pills", "page"],
|
|
145
|
+
StatusDot: ["Badges & pills", "either"],
|
|
146
|
+
/* ── Text & code ──────────────────────────────────────────────────────────
|
|
147
|
+
Presenting a string: code, a shortcut, a truncated path, a copyable value. */
|
|
148
|
+
Code: ["Text & code", "either"],
|
|
149
|
+
CodeBlock: ["Text & code", "either"],
|
|
150
|
+
Kbd: ["Text & code", "either"],
|
|
151
|
+
MiddleTruncate: ["Text & code", "either"],
|
|
152
|
+
/* ── Status ───────────────────────────────────────────────────────────────
|
|
153
|
+
Telling the user what happened or what state they are in: alerts,
|
|
154
|
+
callouts, empty and error states. `Note` (a callout) joins Banner and
|
|
155
|
+
Toast — it is where a designer looks for an "alert" box. */
|
|
156
|
+
Banner: ["Status", "page"],
|
|
157
|
+
EmptyState: ["Status", "page"],
|
|
158
|
+
InlineStatus: ["Status", "either"],
|
|
159
|
+
Note: ["Status", "page"],
|
|
160
|
+
Toast: ["Status", "either"],
|
|
161
|
+
/* ── Loading & progress ───────────────────────────────────────────────────
|
|
162
|
+
Waiting, and how far along something is. */
|
|
163
|
+
PageLoader: ["Loading & progress", "page"],
|
|
164
|
+
Progress: ["Loading & progress", "either"],
|
|
165
|
+
Skeleton: ["Loading & progress", "either"],
|
|
166
|
+
Spinner: ["Loading & progress", "either"],
|
|
167
|
+
Stepper: ["Loading & progress", "page"],
|
|
168
|
+
/* ── Chat & AI ────────────────────────────────────────────────────────────
|
|
169
|
+
A deliberate exception to "group by kind", made for finding: someone
|
|
170
|
+
building a conversation looks for one place, and these were scattered
|
|
171
|
+
across five groups. The rule that keeps it from becoming a second home for
|
|
172
|
+
everything: a member exists ONLY inside a conversation. A Button used in a
|
|
173
|
+
chat is still a Button; a Message has no meaning outside one. */
|
|
174
|
+
Attachment: ["Chat & AI", "either"],
|
|
175
|
+
Bubble: ["Chat & AI", "either"],
|
|
176
|
+
ChatComposer: ["Chat & AI", "either"],
|
|
177
|
+
Marker: ["Chat & AI", "either"],
|
|
178
|
+
Message: ["Chat & AI", "either"],
|
|
179
|
+
MessageScroller: ["Chat & AI", "either"],
|
|
180
|
+
StreamingText: ["Chat & AI", "either"],
|
|
181
|
+
ThinkingOrb: ["Chat & AI", "either"],
|
|
182
|
+
/* ── Media & mockups ──────────────────────────────────────────────────────
|
|
183
|
+
Presenting images and video: players, galleries, scrolling strips, and the
|
|
184
|
+
device frames a product image sits in. `Video` was filed as a mockup; it is
|
|
185
|
+
a player, and it sits with the other media now. */
|
|
186
|
+
Browser: ["Media & mockups", "page"],
|
|
187
|
+
Carousel: ["Media & mockups", "page"],
|
|
188
|
+
GradientArt: ["Media & mockups", "either"],
|
|
189
|
+
Marquee: ["Media & mockups", "page"],
|
|
190
|
+
MediaImage: ["Media & mockups", "either"],
|
|
191
|
+
MediaTile: ["Media & mockups", "page"],
|
|
192
|
+
Phone: ["Media & mockups", "page"],
|
|
193
|
+
Video: ["Media & mockups", "page"]
|
|
194
|
+
};
|
|
195
|
+
function componentsInGroup(group) {
|
|
196
|
+
return Object.entries(COMPONENT_TAXONOMY).filter(([, [g]]) => g === group).map(([name]) => name).sort((a, b) => componentLabel(a).localeCompare(componentLabel(b)));
|
|
197
|
+
}
|
|
198
|
+
function componentSlug(name) {
|
|
199
|
+
return name.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
|
|
200
|
+
}
|
|
201
|
+
var LABEL_OVERRIDES = {
|
|
202
|
+
DestructiveActionModal: "Destructive Modal",
|
|
203
|
+
OtpField: "OTP Field"
|
|
204
|
+
};
|
|
205
|
+
function componentLabel(name) {
|
|
206
|
+
return LABEL_OVERRIDES[name] ?? name.replace(/([a-z0-9])([A-Z])/g, "$1 $2");
|
|
207
|
+
}
|
|
208
|
+
export {
|
|
209
|
+
COMPONENT_GROUPS,
|
|
210
|
+
COMPONENT_TAXONOMY,
|
|
211
|
+
componentLabel,
|
|
212
|
+
componentSlug,
|
|
213
|
+
componentsInGroup
|
|
214
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// src/lib/trim-label.tsx
|
|
2
|
+
import { Children, isValidElement } from "react";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
function trimLabel(children) {
|
|
5
|
+
if (typeof children === "string" || typeof children === "number") {
|
|
6
|
+
return /* @__PURE__ */ jsx("span", { className: "sable-label-trim", children });
|
|
7
|
+
}
|
|
8
|
+
if (children == null || typeof children === "boolean") return children;
|
|
9
|
+
if (isValidElement(children)) return children;
|
|
10
|
+
let wrapped = false;
|
|
11
|
+
const out = Children.map(children, (child, i) => {
|
|
12
|
+
if (typeof child !== "string" && typeof child !== "number") return child;
|
|
13
|
+
wrapped = true;
|
|
14
|
+
return /* @__PURE__ */ jsx("span", { className: "sable-label-trim", children: child }, `label-${i}`);
|
|
15
|
+
});
|
|
16
|
+
return wrapped ? out : children;
|
|
17
|
+
}
|
|
18
|
+
export {
|
|
19
|
+
trimLabel
|
|
20
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/lib/use-copy.ts
|
|
4
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
5
|
+
function useCopy(text, { timeout = 1500 } = {}) {
|
|
6
|
+
const [copied, setCopied] = useState(false);
|
|
7
|
+
const timer = useRef(null);
|
|
8
|
+
useEffect(() => () => {
|
|
9
|
+
if (timer.current) clearTimeout(timer.current);
|
|
10
|
+
}, []);
|
|
11
|
+
const copy = useCallback(async () => {
|
|
12
|
+
if (typeof navigator === "undefined" || !navigator.clipboard) return false;
|
|
13
|
+
try {
|
|
14
|
+
await navigator.clipboard.writeText(text);
|
|
15
|
+
} catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
setCopied(true);
|
|
19
|
+
if (timer.current) clearTimeout(timer.current);
|
|
20
|
+
timer.current = setTimeout(() => setCopied(false), timeout);
|
|
21
|
+
return true;
|
|
22
|
+
}, [text, timeout]);
|
|
23
|
+
return { copy, copied };
|
|
24
|
+
}
|
|
25
|
+
export {
|
|
26
|
+
useCopy
|
|
27
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/lib/use-edge-fade.ts
|
|
4
|
+
import { useCallback, useState } from "react";
|
|
5
|
+
import { useIsomorphicLayoutEffect } from "./use-isomorphic-layout-effect.js";
|
|
6
|
+
import { useResizeObserver } from "./use-resize-observer.js";
|
|
7
|
+
function useEdgeFade(ref, orientation) {
|
|
8
|
+
const [showStart, setShowStart] = useState(false);
|
|
9
|
+
const [showEnd, setShowEnd] = useState(false);
|
|
10
|
+
const sync = useCallback(() => {
|
|
11
|
+
const el = ref.current;
|
|
12
|
+
if (!el) return;
|
|
13
|
+
if (orientation === "horizontal") {
|
|
14
|
+
const { scrollLeft, scrollWidth, clientWidth } = el;
|
|
15
|
+
setShowStart(scrollLeft > 0);
|
|
16
|
+
setShowEnd(scrollLeft < scrollWidth - clientWidth - 1);
|
|
17
|
+
} else {
|
|
18
|
+
const { scrollTop, scrollHeight, clientHeight } = el;
|
|
19
|
+
setShowStart(scrollTop > 0);
|
|
20
|
+
setShowEnd(scrollTop < scrollHeight - clientHeight - 1);
|
|
21
|
+
}
|
|
22
|
+
}, [ref, orientation]);
|
|
23
|
+
useIsomorphicLayoutEffect(sync);
|
|
24
|
+
useResizeObserver(sync, [ref]);
|
|
25
|
+
const fade = "calc(var(--spacing) * 7)";
|
|
26
|
+
const direction = orientation === "vertical" ? "bottom" : "right";
|
|
27
|
+
const mask = showStart || showEnd ? `linear-gradient(to ${direction}, ${showStart ? "transparent" : "#000"}, #000 ${showStart ? fade : "0"}, #000 ${showEnd ? `calc(100% - ${fade})` : "100%"}, ${showEnd ? "transparent" : "#000"})` : void 0;
|
|
28
|
+
return { sync, style: mask ? { maskImage: mask, WebkitMaskImage: mask } : void 0 };
|
|
29
|
+
}
|
|
30
|
+
export {
|
|
31
|
+
useEdgeFade
|
|
32
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/lib/use-resize-observer.ts
|
|
4
|
+
import { useIsomorphicLayoutEffect } from "./use-isomorphic-layout-effect.js";
|
|
5
|
+
function useResizeObserver(measure, refs) {
|
|
6
|
+
useIsomorphicLayoutEffect(() => {
|
|
7
|
+
measure();
|
|
8
|
+
if (typeof ResizeObserver === "undefined") return;
|
|
9
|
+
const ro = new ResizeObserver(measure);
|
|
10
|
+
for (const ref of refs) {
|
|
11
|
+
if (ref.current) ro.observe(ref.current);
|
|
12
|
+
}
|
|
13
|
+
return () => ro.disconnect();
|
|
14
|
+
}, [measure]);
|
|
15
|
+
}
|
|
16
|
+
export {
|
|
17
|
+
useResizeObserver
|
|
18
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/lib/use-scroll-activity.ts
|
|
4
|
+
import { useCallback, useEffect, useRef } from "react";
|
|
5
|
+
var LINGER_MS = 600;
|
|
6
|
+
function useScrollActivity() {
|
|
7
|
+
const nodeRef = useRef(null);
|
|
8
|
+
const timer = useRef(null);
|
|
9
|
+
const clear = useCallback(() => {
|
|
10
|
+
if (timer.current !== null) {
|
|
11
|
+
window.clearTimeout(timer.current);
|
|
12
|
+
timer.current = null;
|
|
13
|
+
}
|
|
14
|
+
}, []);
|
|
15
|
+
const onScroll = useCallback(() => {
|
|
16
|
+
const node = nodeRef.current;
|
|
17
|
+
if (!node) return;
|
|
18
|
+
node.setAttribute("data-scrolling", "");
|
|
19
|
+
clear();
|
|
20
|
+
timer.current = window.setTimeout(() => {
|
|
21
|
+
nodeRef.current?.removeAttribute("data-scrolling");
|
|
22
|
+
timer.current = null;
|
|
23
|
+
}, LINGER_MS);
|
|
24
|
+
}, [clear]);
|
|
25
|
+
const setNode = useCallback(
|
|
26
|
+
(node) => {
|
|
27
|
+
const previous = nodeRef.current;
|
|
28
|
+
if (previous === node) return;
|
|
29
|
+
if (previous) {
|
|
30
|
+
previous.removeEventListener("scroll", onScroll);
|
|
31
|
+
previous.removeAttribute("data-scrolling");
|
|
32
|
+
}
|
|
33
|
+
nodeRef.current = node;
|
|
34
|
+
if (node) node.addEventListener("scroll", onScroll, { passive: true });
|
|
35
|
+
},
|
|
36
|
+
[onScroll]
|
|
37
|
+
);
|
|
38
|
+
useEffect(() => {
|
|
39
|
+
return () => {
|
|
40
|
+
clear();
|
|
41
|
+
const node = nodeRef.current;
|
|
42
|
+
if (node) {
|
|
43
|
+
node.removeEventListener("scroll", onScroll);
|
|
44
|
+
node.removeAttribute("data-scrolling");
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}, [clear, onScroll]);
|
|
48
|
+
return setNode;
|
|
49
|
+
}
|
|
50
|
+
export {
|
|
51
|
+
useScrollActivity
|
|
52
|
+
};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/lib/use-wheel-to-horizontal.ts
|
|
4
|
+
import { useCallback, useRef } from "react";
|
|
5
|
+
var LINE_HEIGHT = 16;
|
|
6
|
+
var PAGE_HEIGHT = 400;
|
|
7
|
+
function toPixels(delta, mode) {
|
|
8
|
+
if (mode === 1) return delta * LINE_HEIGHT;
|
|
9
|
+
if (mode === 2) return delta * PAGE_HEIGHT;
|
|
10
|
+
return delta;
|
|
11
|
+
}
|
|
12
|
+
function useWheelToHorizontal(enabled = true) {
|
|
13
|
+
const nodeRef = useRef(null);
|
|
14
|
+
const onWheel = useCallback((event) => {
|
|
15
|
+
const el = nodeRef.current;
|
|
16
|
+
if (!el) return;
|
|
17
|
+
if (event.shiftKey) return;
|
|
18
|
+
if (Math.abs(event.deltaX) > Math.abs(event.deltaY)) return;
|
|
19
|
+
if (event.deltaY === 0) return;
|
|
20
|
+
const delta = toPixels(event.deltaY, event.deltaMode);
|
|
21
|
+
const max = el.scrollWidth - el.clientWidth;
|
|
22
|
+
if (max <= 0) return;
|
|
23
|
+
const atStart = Math.round(el.scrollLeft) <= 0;
|
|
24
|
+
const atEnd = Math.round(el.scrollLeft) >= max;
|
|
25
|
+
if (delta < 0 && atStart || delta > 0 && atEnd) return;
|
|
26
|
+
event.preventDefault();
|
|
27
|
+
el.scrollLeft += delta;
|
|
28
|
+
}, []);
|
|
29
|
+
return useCallback(
|
|
30
|
+
(node) => {
|
|
31
|
+
const previous = nodeRef.current;
|
|
32
|
+
if (previous === node) return;
|
|
33
|
+
previous?.removeEventListener("wheel", onWheel);
|
|
34
|
+
nodeRef.current = node;
|
|
35
|
+
if (node && enabled) {
|
|
36
|
+
node.addEventListener("wheel", onWheel, { passive: false });
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
[enabled, onWheel]
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
function scrollRegionKeyDown(event, orientation) {
|
|
43
|
+
const el = event.currentTarget;
|
|
44
|
+
const horizontal = orientation === "horizontal";
|
|
45
|
+
const page = horizontal ? el.clientWidth : el.clientHeight;
|
|
46
|
+
const step = Math.max(40, page * 0.2);
|
|
47
|
+
const back = horizontal ? "ArrowLeft" : "ArrowUp";
|
|
48
|
+
const forward = horizontal ? "ArrowRight" : "ArrowDown";
|
|
49
|
+
const axis = horizontal ? "scrollLeft" : "scrollTop";
|
|
50
|
+
const max = horizontal ? el.scrollWidth - el.clientWidth : el.scrollHeight - el.clientHeight;
|
|
51
|
+
let next = null;
|
|
52
|
+
if (event.key === back) next = el[axis] - step;
|
|
53
|
+
else if (event.key === forward) next = el[axis] + step;
|
|
54
|
+
else if (event.key === "Home") next = 0;
|
|
55
|
+
else if (event.key === "End") next = max;
|
|
56
|
+
else if (event.key === "PageUp") next = el[axis] - page;
|
|
57
|
+
else if (event.key === "PageDown") next = el[axis] + page;
|
|
58
|
+
if (next === null) return;
|
|
59
|
+
event.preventDefault();
|
|
60
|
+
el[axis] = Math.max(0, Math.min(max, next));
|
|
61
|
+
}
|
|
62
|
+
export {
|
|
63
|
+
scrollRegionKeyDown,
|
|
64
|
+
useWheelToHorizontal
|
|
65
|
+
};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/motion/MotionProvider.tsx
|
|
4
|
+
import {
|
|
5
|
+
createContext,
|
|
6
|
+
useCallback,
|
|
7
|
+
useContext,
|
|
8
|
+
useEffect,
|
|
9
|
+
useMemo,
|
|
10
|
+
useState
|
|
11
|
+
} from "react";
|
|
12
|
+
import { useReducedMotion } from "./useReducedMotion.js";
|
|
13
|
+
import { jsx } from "react/jsx-runtime";
|
|
14
|
+
var MotionContext = createContext(null);
|
|
15
|
+
function resolveEnabled(policy, prefersReducedMotion) {
|
|
16
|
+
if (policy === "off" || policy === "reduced") return false;
|
|
17
|
+
if (policy === "full") return true;
|
|
18
|
+
return !prefersReducedMotion;
|
|
19
|
+
}
|
|
20
|
+
function MotionProvider({
|
|
21
|
+
children,
|
|
22
|
+
defaultPolicy = "system",
|
|
23
|
+
policy: controlledPolicy,
|
|
24
|
+
onPolicyChange,
|
|
25
|
+
target = "root"
|
|
26
|
+
}) {
|
|
27
|
+
const [uncontrolled, setUncontrolled] = useState(defaultPolicy);
|
|
28
|
+
const policy = controlledPolicy ?? uncontrolled;
|
|
29
|
+
const prefersReducedMotion = useReducedMotion();
|
|
30
|
+
const setPolicy = useCallback(
|
|
31
|
+
(next) => {
|
|
32
|
+
if (controlledPolicy === void 0) setUncontrolled(next);
|
|
33
|
+
onPolicyChange?.(next);
|
|
34
|
+
},
|
|
35
|
+
[controlledPolicy, onPolicyChange]
|
|
36
|
+
);
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
const el = target === "root" ? typeof document !== "undefined" ? document.documentElement : null : target();
|
|
39
|
+
if (!el) return;
|
|
40
|
+
if (policy === "system") {
|
|
41
|
+
el.removeAttribute("data-motion");
|
|
42
|
+
} else {
|
|
43
|
+
el.setAttribute("data-motion", policy);
|
|
44
|
+
}
|
|
45
|
+
return () => {
|
|
46
|
+
el.removeAttribute("data-motion");
|
|
47
|
+
};
|
|
48
|
+
}, [policy, target]);
|
|
49
|
+
const value = useMemo(
|
|
50
|
+
() => ({
|
|
51
|
+
policy,
|
|
52
|
+
setPolicy,
|
|
53
|
+
prefersReducedMotion,
|
|
54
|
+
enabled: resolveEnabled(policy, prefersReducedMotion)
|
|
55
|
+
}),
|
|
56
|
+
[policy, setPolicy, prefersReducedMotion]
|
|
57
|
+
);
|
|
58
|
+
return /* @__PURE__ */ jsx(MotionContext.Provider, { value, children });
|
|
59
|
+
}
|
|
60
|
+
function useMotion() {
|
|
61
|
+
const ctx = useContext(MotionContext);
|
|
62
|
+
const prefersReducedMotion = useReducedMotion();
|
|
63
|
+
if (ctx) return ctx;
|
|
64
|
+
return {
|
|
65
|
+
policy: "system",
|
|
66
|
+
setPolicy: () => {
|
|
67
|
+
},
|
|
68
|
+
prefersReducedMotion,
|
|
69
|
+
enabled: resolveEnabled("system", prefersReducedMotion)
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
export {
|
|
73
|
+
MotionProvider,
|
|
74
|
+
useMotion
|
|
75
|
+
};
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/motion/Presence.tsx
|
|
4
|
+
import { cloneElement, isValidElement, useRef, useState } from "react";
|
|
5
|
+
import { mergeRefs } from "../lib/refs.js";
|
|
6
|
+
import { useIsomorphicLayoutEffect } from "../lib/use-isomorphic-layout-effect.js";
|
|
7
|
+
import { useMotion } from "./MotionProvider.js";
|
|
8
|
+
function motionScale(node) {
|
|
9
|
+
const raw = Number.parseFloat(getComputedStyle(node).getPropertyValue("--motion-scale"));
|
|
10
|
+
return Number.isFinite(raw) ? Math.max(0, raw) : 1;
|
|
11
|
+
}
|
|
12
|
+
function Presence({
|
|
13
|
+
show,
|
|
14
|
+
children,
|
|
15
|
+
duration,
|
|
16
|
+
easing,
|
|
17
|
+
offset = 8,
|
|
18
|
+
onExitComplete
|
|
19
|
+
}) {
|
|
20
|
+
const { enabled } = useMotion();
|
|
21
|
+
const [mounted, setMounted] = useState(show);
|
|
22
|
+
const nodeRef = useRef(null);
|
|
23
|
+
const prevShow = useRef(show);
|
|
24
|
+
const animRef = useRef(null);
|
|
25
|
+
const exitCompleteRef = useRef(onExitComplete);
|
|
26
|
+
const didExit = useRef(false);
|
|
27
|
+
useIsomorphicLayoutEffect(() => {
|
|
28
|
+
exitCompleteRef.current = onExitComplete;
|
|
29
|
+
});
|
|
30
|
+
useIsomorphicLayoutEffect(() => () => {
|
|
31
|
+
if (!animRef.current) return;
|
|
32
|
+
animRef.current.onfinish = null;
|
|
33
|
+
animRef.current.oncancel = null;
|
|
34
|
+
animRef.current.cancel();
|
|
35
|
+
animRef.current = null;
|
|
36
|
+
}, []);
|
|
37
|
+
useIsomorphicLayoutEffect(() => {
|
|
38
|
+
if (!mounted && didExit.current) {
|
|
39
|
+
didExit.current = false;
|
|
40
|
+
exitCompleteRef.current?.();
|
|
41
|
+
}
|
|
42
|
+
}, [mounted]);
|
|
43
|
+
useIsomorphicLayoutEffect(() => {
|
|
44
|
+
const node = nodeRef.current;
|
|
45
|
+
const was = prevShow.current;
|
|
46
|
+
prevShow.current = show;
|
|
47
|
+
if (was === show && (enabled || !animRef.current)) return;
|
|
48
|
+
if (animRef.current) {
|
|
49
|
+
animRef.current.onfinish = null;
|
|
50
|
+
animRef.current.oncancel = null;
|
|
51
|
+
animRef.current.cancel();
|
|
52
|
+
animRef.current = null;
|
|
53
|
+
}
|
|
54
|
+
const canAnimate = enabled && node && typeof node.animate === "function";
|
|
55
|
+
const scale = node ? motionScale(node) : 1;
|
|
56
|
+
if (show) {
|
|
57
|
+
setMounted(true);
|
|
58
|
+
if (!canAnimate || !node) return;
|
|
59
|
+
animRef.current = node.animate(
|
|
60
|
+
[
|
|
61
|
+
{ opacity: 0, transform: `translateY(${offset}px)` },
|
|
62
|
+
{ opacity: 1, transform: "translateY(0)" }
|
|
63
|
+
],
|
|
64
|
+
{
|
|
65
|
+
duration: (duration?.enter ?? 200) * scale,
|
|
66
|
+
easing: easing?.enter ?? "cubic-bezier(0, 0, 0.2, 1)",
|
|
67
|
+
fill: "backwards"
|
|
68
|
+
}
|
|
69
|
+
);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const finish = () => {
|
|
73
|
+
if (animRef.current) {
|
|
74
|
+
animRef.current.onfinish = null;
|
|
75
|
+
animRef.current.oncancel = null;
|
|
76
|
+
animRef.current.cancel();
|
|
77
|
+
}
|
|
78
|
+
animRef.current = null;
|
|
79
|
+
didExit.current = true;
|
|
80
|
+
setMounted(false);
|
|
81
|
+
};
|
|
82
|
+
if (!canAnimate || !node) {
|
|
83
|
+
finish();
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const anim = node.animate(
|
|
87
|
+
[
|
|
88
|
+
{ opacity: 1, transform: "translateY(0)" },
|
|
89
|
+
{ opacity: 0, transform: `translateY(${offset}px)` }
|
|
90
|
+
],
|
|
91
|
+
{
|
|
92
|
+
duration: (duration?.exit ?? 150) * scale,
|
|
93
|
+
easing: easing?.exit ?? "cubic-bezier(0.4, 0, 1, 1)",
|
|
94
|
+
fill: "forwards"
|
|
95
|
+
}
|
|
96
|
+
);
|
|
97
|
+
animRef.current = anim;
|
|
98
|
+
anim.onfinish = finish;
|
|
99
|
+
anim.oncancel = finish;
|
|
100
|
+
}, [show, enabled, offset, duration?.enter, duration?.exit, easing?.enter, easing?.exit]);
|
|
101
|
+
if (!show && !mounted) return null;
|
|
102
|
+
if (!isValidElement(children)) return children;
|
|
103
|
+
const element = children;
|
|
104
|
+
const childRef = element.props.ref;
|
|
105
|
+
return cloneElement(element, {
|
|
106
|
+
ref: mergeRefs(nodeRef, childRef)
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
Presence.displayName = "Presence";
|
|
110
|
+
export {
|
|
111
|
+
Presence
|
|
112
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/motion/Reveal.tsx
|
|
4
|
+
import { cn } from "../lib/cn.js";
|
|
5
|
+
import { useMotion } from "./MotionProvider.js";
|
|
6
|
+
import { useInView } from "./useInView.js";
|
|
7
|
+
import { jsx } from "react/jsx-runtime";
|
|
8
|
+
function Reveal({
|
|
9
|
+
as,
|
|
10
|
+
delay,
|
|
11
|
+
when = true,
|
|
12
|
+
once,
|
|
13
|
+
amount,
|
|
14
|
+
rootMargin,
|
|
15
|
+
className,
|
|
16
|
+
style,
|
|
17
|
+
children,
|
|
18
|
+
...props
|
|
19
|
+
}) {
|
|
20
|
+
const Comp = as ?? "div";
|
|
21
|
+
const { enabled } = useMotion();
|
|
22
|
+
const { ref, inView } = useInView({ once, amount, rootMargin });
|
|
23
|
+
const shown = inView && when || !enabled;
|
|
24
|
+
return /* @__PURE__ */ jsx(
|
|
25
|
+
Comp,
|
|
26
|
+
{
|
|
27
|
+
ref,
|
|
28
|
+
"data-reveal": shown ? "in" : "out",
|
|
29
|
+
className: cn("motion-reveal", className),
|
|
30
|
+
style: delay ? {
|
|
31
|
+
transitionDelay: enabled ? `calc(${delay}ms * var(--motion-scale, 1))` : "0ms",
|
|
32
|
+
...style
|
|
33
|
+
} : style,
|
|
34
|
+
...props,
|
|
35
|
+
children
|
|
36
|
+
}
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
Reveal.displayName = "Reveal";
|
|
40
|
+
export {
|
|
41
|
+
Reveal
|
|
42
|
+
};
|