@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,63 @@
|
|
|
1
|
+
// src/components/accordion/accordion.tsx
|
|
2
|
+
import { Accordion as Base } from "@base-ui/react/accordion";
|
|
3
|
+
import { Icon } from "../../icon/Icon.js";
|
|
4
|
+
import { cn } from "../../lib/cn.js";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
var Accordion = Base.Root;
|
|
7
|
+
function AccordionItem({ className, ...props }) {
|
|
8
|
+
return /* @__PURE__ */ jsx(
|
|
9
|
+
Base.Item,
|
|
10
|
+
{
|
|
11
|
+
className: cn("border-b border-border", className),
|
|
12
|
+
...props
|
|
13
|
+
}
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
function AccordionTrigger({
|
|
17
|
+
className,
|
|
18
|
+
children,
|
|
19
|
+
indicator,
|
|
20
|
+
...props
|
|
21
|
+
}) {
|
|
22
|
+
return /* @__PURE__ */ jsx(Base.Header, { children: /* @__PURE__ */ jsxs(
|
|
23
|
+
Base.Trigger,
|
|
24
|
+
{
|
|
25
|
+
className: cn(
|
|
26
|
+
"flex w-full items-start justify-between gap-3 py-4 text-start text-title-sm text-foreground motion-interactive hover:text-muted-foreground rounded-sm focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50",
|
|
27
|
+
!indicator && "[&[data-panel-open]_[data-slot=accordion-chevron]]:rotate-180",
|
|
28
|
+
className
|
|
29
|
+
),
|
|
30
|
+
...props,
|
|
31
|
+
children: [
|
|
32
|
+
children,
|
|
33
|
+
/* @__PURE__ */ jsx(
|
|
34
|
+
"span",
|
|
35
|
+
{
|
|
36
|
+
"data-slot": "accordion-chevron",
|
|
37
|
+
className: "flex h-[1lh] shrink-0 items-center motion-interactive",
|
|
38
|
+
children: indicator ?? /* @__PURE__ */ jsx(Icon, { name: "chevron-down", className: "text-xs text-muted-foreground" })
|
|
39
|
+
}
|
|
40
|
+
)
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
) });
|
|
44
|
+
}
|
|
45
|
+
function AccordionPanel({ className, children, ...props }) {
|
|
46
|
+
return /* @__PURE__ */ jsx(
|
|
47
|
+
Base.Panel,
|
|
48
|
+
{
|
|
49
|
+
className: cn(
|
|
50
|
+
"h-[var(--accordion-panel-height)] text-body-md text-muted-foreground motion-disclosure data-[ending-style]:h-0 data-[starting-style]:h-0",
|
|
51
|
+
className
|
|
52
|
+
),
|
|
53
|
+
...props,
|
|
54
|
+
children: /* @__PURE__ */ jsx("div", { className: "pb-4", children })
|
|
55
|
+
}
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
export {
|
|
59
|
+
Accordion,
|
|
60
|
+
AccordionItem,
|
|
61
|
+
AccordionPanel,
|
|
62
|
+
AccordionTrigger
|
|
63
|
+
};
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
// src/components/accordion/accordion.meta.ts
|
|
2
|
+
var accordionMeta = {
|
|
3
|
+
name: "Accordion",
|
|
4
|
+
summary: "Stacked, collapsible disclosure sections over Base UI Accordion \u2014 roving focus, arrow-key navigation, ARIA region/heading/button wiring, and an animated height transition. Each item pairs a full-width trigger (with a rotating chevron) and a panel.",
|
|
5
|
+
status: "stable",
|
|
6
|
+
keywords: [
|
|
7
|
+
"accordion",
|
|
8
|
+
"disclosure",
|
|
9
|
+
"collapse",
|
|
10
|
+
"faq"
|
|
11
|
+
],
|
|
12
|
+
usage: {
|
|
13
|
+
description: "Use Accordion to reveal a vertical set of related sections while keeping the surrounding page scannable.",
|
|
14
|
+
bestPractices: [
|
|
15
|
+
{
|
|
16
|
+
guidance: "do",
|
|
17
|
+
description: "Use concise trigger text that describes the content revealed below it."
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
guidance: "do",
|
|
21
|
+
description: "Keep section content focused so expanding one item does not feel like navigating to a new page."
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
guidance: "dont",
|
|
25
|
+
description: "Do not hide required fields, primary actions, or critical errors inside collapsed sections."
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
guidance: "dont",
|
|
29
|
+
description: "Do not nest an Accordion inside an Accordion. Two layers of roving focus fight each other, and the arrow keys become ambiguous \u2014 flatten the hierarchy or use a Tree."
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
anatomy: [
|
|
33
|
+
{
|
|
34
|
+
name: "AccordionItem",
|
|
35
|
+
required: true,
|
|
36
|
+
description: "One expandable section in the group."
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: "AccordionTrigger",
|
|
40
|
+
required: true,
|
|
41
|
+
description: "The button-like control that opens the section."
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: "AccordionPanel",
|
|
45
|
+
required: true,
|
|
46
|
+
description: "The content revealed by the trigger."
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
},
|
|
50
|
+
related: {
|
|
51
|
+
components: [
|
|
52
|
+
"Collapsible",
|
|
53
|
+
"Tabs"
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
props: [
|
|
57
|
+
{
|
|
58
|
+
name: "Accordion (Root)",
|
|
59
|
+
type: "Base UI Accordion.Root props (value, defaultValue, multiple, disabled, onValueChange, orientation, loopFocus, keepMounted, hiddenUntilFound)",
|
|
60
|
+
default: "\u2014",
|
|
61
|
+
description: "Groups all items and owns the open value(s). Uncontrolled via defaultValue, controlled via value."
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
name: "defaultValue",
|
|
65
|
+
type: "Value[]",
|
|
66
|
+
default: "[]",
|
|
67
|
+
description: "Uncontrolled set of item values that start expanded (e.g. ['faq-1'])."
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
name: "value",
|
|
71
|
+
type: "Value[]",
|
|
72
|
+
default: "\u2014",
|
|
73
|
+
description: "Controlled set of expanded item values; pair with onValueChange."
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
name: "onValueChange",
|
|
77
|
+
type: "(value: Value[]) => void",
|
|
78
|
+
description: "Called with the new set of expanded item values when an item opens or closes."
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
name: "multiple",
|
|
82
|
+
type: "boolean",
|
|
83
|
+
default: "false",
|
|
84
|
+
description: "Whether more than one item can be open at the same time. When false, opening one closes the others."
|
|
85
|
+
}
|
|
86
|
+
],
|
|
87
|
+
subcomponents: [
|
|
88
|
+
{
|
|
89
|
+
name: "AccordionItem",
|
|
90
|
+
type: "Base UI Accordion.Item props + className (value, disabled, onOpenChange)",
|
|
91
|
+
description: "Pairs a header with its panel. Give each a stable `value` to control or set initial open state."
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
name: "AccordionTrigger",
|
|
95
|
+
type: "Base UI Accordion.Trigger props + className + indicator?: ReactNode",
|
|
96
|
+
description: "The header button (Header + Trigger composed). Renders children plus a chevron that rotates via data-[panel-open] by default; pass `indicator` to replace the icon and its open-state behavior entirely (e.g. a plus that becomes an \xD7 for a FAQ-style toggle)."
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: "AccordionPanel",
|
|
100
|
+
type: "Base UI Accordion.Panel props + className (keepMounted, hiddenUntilFound)",
|
|
101
|
+
description: "The collapsible body. Animates height using the --accordion-panel-height CSS var; fades on data-[starting-style]/data-[ending-style]."
|
|
102
|
+
}
|
|
103
|
+
],
|
|
104
|
+
tokensUsed: ["border", "foreground", "muted-foreground", "ring"],
|
|
105
|
+
motion: [
|
|
106
|
+
{
|
|
107
|
+
slot: "arrival",
|
|
108
|
+
recipe: "none",
|
|
109
|
+
part: "Root",
|
|
110
|
+
why: "An accordion is page furniture that is present from first paint. Animating it in would stage content the reader is already scanning past."
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
slot: "response",
|
|
114
|
+
recipe: "motion-interactive",
|
|
115
|
+
part: "AccordionTrigger",
|
|
116
|
+
why: "The whole header row is the hit target, and it looks like a heading rather than a control. The hover shift is what tells the reader it can be clicked before they click it."
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
slot: "transition",
|
|
120
|
+
recipe: "motion-disclosure",
|
|
121
|
+
part: "AccordionPanel",
|
|
122
|
+
why: "Panel height is the only cue that content came from THIS header rather than appearing at the bottom of the page. Snapping it open moves everything below by a screenful with nothing connecting cause to effect."
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
slot: "activity",
|
|
126
|
+
recipe: "none",
|
|
127
|
+
part: "Root",
|
|
128
|
+
why: "Nothing here is indeterminate \u2014 the panel content is already resident. A panel that loads on expand should put its own loader inside the panel."
|
|
129
|
+
}
|
|
130
|
+
],
|
|
131
|
+
a11y: [
|
|
132
|
+
"Base UI renders the trigger inside an <h3> heading and wires aria-expanded / aria-controls to the panel region.",
|
|
133
|
+
"Arrow keys move roving focus between triggers; Home/End jump to the first/last; loopFocus wraps by default.",
|
|
134
|
+
"Each trigger toggles its panel with Enter/Space; the panel is announced as a labelled region.",
|
|
135
|
+
"A disabled AccordionItem dims and is skipped by keyboard focus while neighbouring items stay interactive.",
|
|
136
|
+
"The chevron rotation is driven by data-[panel-open] and the focus ring by focus-visible \u2014 both honor reduced-motion via the consumer's transitions."
|
|
137
|
+
],
|
|
138
|
+
examples: [
|
|
139
|
+
{
|
|
140
|
+
label: "Single (default)",
|
|
141
|
+
code: '<Accordion defaultValue={["a"]}><AccordionItem value="a"><AccordionTrigger>Is it permanent?</AccordionTrigger><AccordionPanel>Yes \u2014 stored on Arweave.</AccordionPanel></AccordionItem><AccordionItem value="b"><AccordionTrigger>How much?</AccordionTrigger><AccordionPanel>A one-time mint fee.</AccordionPanel></AccordionItem></Accordion>'
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
label: "Multiple open",
|
|
145
|
+
code: '<Accordion multiple defaultValue={["a", "b"]}><AccordionItem value="a"><AccordionTrigger>First</AccordionTrigger><AccordionPanel>One.</AccordionPanel></AccordionItem><AccordionItem value="b"><AccordionTrigger>Second</AccordionTrigger><AccordionPanel>Two.</AccordionPanel></AccordionItem></Accordion>'
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
label: "Custom indicator (plus-becomes-\xD7)",
|
|
149
|
+
code: '<Accordion defaultValue={["a"]}><AccordionItem value="a"><AccordionTrigger indicator={<Icon name="plus" className="text-xs text-muted-foreground transition-transform [[data-panel-open]_&]:rotate-45" />}>Is it permanent?</AccordionTrigger><AccordionPanel>Yes \u2014 stored on Arweave.</AccordionPanel></AccordionItem></Accordion>'
|
|
150
|
+
}
|
|
151
|
+
]
|
|
152
|
+
};
|
|
153
|
+
export {
|
|
154
|
+
accordionMeta
|
|
155
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// src/components/accordion/index.ts
|
|
2
|
+
import {
|
|
3
|
+
Accordion,
|
|
4
|
+
AccordionItem,
|
|
5
|
+
AccordionTrigger,
|
|
6
|
+
AccordionPanel
|
|
7
|
+
} from "./accordion.js";
|
|
8
|
+
import { accordionMeta } from "./accordion.meta.js";
|
|
9
|
+
export {
|
|
10
|
+
Accordion,
|
|
11
|
+
AccordionItem,
|
|
12
|
+
AccordionPanel,
|
|
13
|
+
AccordionTrigger,
|
|
14
|
+
accordionMeta
|
|
15
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// src/components/app-header/app-header.tsx
|
|
2
|
+
import { cn } from "../../lib/cn.js";
|
|
3
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
function AppHeader({
|
|
5
|
+
leading,
|
|
6
|
+
title,
|
|
7
|
+
actions,
|
|
8
|
+
className,
|
|
9
|
+
...props
|
|
10
|
+
}) {
|
|
11
|
+
return /* @__PURE__ */ jsx(
|
|
12
|
+
"header",
|
|
13
|
+
{
|
|
14
|
+
className: cn(
|
|
15
|
+
"sticky top-0 z-(--z-nav) w-full border-b border-border bg-background pt-[env(safe-area-inset-top,0px)] lg:hidden",
|
|
16
|
+
className
|
|
17
|
+
),
|
|
18
|
+
...props,
|
|
19
|
+
children: /* @__PURE__ */ jsxs("div", { className: "grid h-[var(--nav-height,56px)] grid-cols-[1fr_auto_1fr] items-center px-4", children: [
|
|
20
|
+
/* @__PURE__ */ jsx("div", { className: "flex items-center justify-start gap-(--control-gap)", children: leading }),
|
|
21
|
+
/* @__PURE__ */ jsx("div", { className: "flex min-w-0 items-center justify-center text-title-lg", children: /* @__PURE__ */ jsx("span", { className: "min-w-0 truncate", children: title }) }),
|
|
22
|
+
/* @__PURE__ */ jsx("div", { className: "flex items-center justify-end gap-(--control-gap)", children: actions })
|
|
23
|
+
] })
|
|
24
|
+
}
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
AppHeader.displayName = "AppHeader";
|
|
28
|
+
export {
|
|
29
|
+
AppHeader
|
|
30
|
+
};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// src/components/app-header/app-header.meta.ts
|
|
2
|
+
var appHeaderMeta = {
|
|
3
|
+
name: "AppHeader",
|
|
4
|
+
summary: "Mobile top bar (sticky, hidden at lg) with leading / title / actions slots on a 3-column grid that keeps the title optically centered. Grows into the top safe-area.",
|
|
5
|
+
status: "stable",
|
|
6
|
+
keywords: [
|
|
7
|
+
"app header",
|
|
8
|
+
"top bar",
|
|
9
|
+
"mobile header",
|
|
10
|
+
"chrome"
|
|
11
|
+
],
|
|
12
|
+
usage: {
|
|
13
|
+
description: "Use AppHeader for compact application chrome at the top of a screen, usually with navigation, identity, and a small action set. Pass it to AppShell's `header` slot so screen content clears it on mobile (it is sticky and hides itself at lg).",
|
|
14
|
+
bestPractices: [
|
|
15
|
+
{
|
|
16
|
+
guidance: "do",
|
|
17
|
+
description: "Keep the header actions narrow and predictable so the page title remains legible."
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
guidance: "do",
|
|
21
|
+
description: "Use it once per app view as chrome, not as repeated content inside page sections."
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
guidance: "dont",
|
|
25
|
+
description: "Do not overload it with filters, forms, or page-specific controls that belong in the content area."
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
guidance: "dont",
|
|
29
|
+
description: "Do not render more than one per app, or put a second one inside a route. It is sticky chrome, so two of them stack and permanently eat the top of the viewport."
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
},
|
|
33
|
+
related: {
|
|
34
|
+
components: [
|
|
35
|
+
"AppShell",
|
|
36
|
+
"PageHeader",
|
|
37
|
+
"BottomNav"
|
|
38
|
+
]
|
|
39
|
+
},
|
|
40
|
+
props: [
|
|
41
|
+
{
|
|
42
|
+
name: "leading",
|
|
43
|
+
type: "ReactNode",
|
|
44
|
+
description: "Leading slot \u2014 back button, create action, or menu trigger."
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: "title",
|
|
48
|
+
type: "ReactNode",
|
|
49
|
+
description: "Center slot \u2014 brand wordmark or contextual page title."
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
name: "actions",
|
|
53
|
+
type: "ReactNode",
|
|
54
|
+
description: "Trailing slot \u2014 wallet trigger, action buttons."
|
|
55
|
+
}
|
|
56
|
+
],
|
|
57
|
+
a11y: [
|
|
58
|
+
"Renders a <header> landmark.",
|
|
59
|
+
"Pair with a leading control that has an accessible label (e.g. a BackButton)."
|
|
60
|
+
],
|
|
61
|
+
tokensUsed: ["background", "border", "foreground"],
|
|
62
|
+
examples: [
|
|
63
|
+
{
|
|
64
|
+
label: "Contextual header",
|
|
65
|
+
code: '<AppHeader leading={<Button size="icon" variant="ghost" aria-label="Back"><Icon name="chevron-left" /></Button>} title="Notifications" />'
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
label: "Choosing between AppHeader and PageHeader",
|
|
69
|
+
code: `// AppHeader is APP chrome \u2014 it persists across routes and holds global
|
|
70
|
+
// affordances (brand, search, account). One per app.
|
|
71
|
+
<AppShell header={<AppHeader title="Studio" />}>
|
|
72
|
+
<Region max="content">Route content</Region>
|
|
73
|
+
</AppShell>
|
|
74
|
+
|
|
75
|
+
// PageHeader is CONTENT \u2014 it introduces the current route and scrolls away
|
|
76
|
+
// with it. One per page, INSIDE the region.
|
|
77
|
+
<Region max="content">
|
|
78
|
+
<PageHeader title="Billing" description="Plans, invoices, payment methods." />
|
|
79
|
+
</Region>
|
|
80
|
+
|
|
81
|
+
// \u2717 Putting route-specific actions in AppHeader. They then persist onto routes
|
|
82
|
+
// where they mean nothing, and the header becomes a dumping ground.`
|
|
83
|
+
}
|
|
84
|
+
]
|
|
85
|
+
};
|
|
86
|
+
export {
|
|
87
|
+
appHeaderMeta
|
|
88
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/components/app-shell/app-shell-dock.tsx
|
|
4
|
+
import { useEffect, useRef } from "react";
|
|
5
|
+
import { cn } from "../../lib/cn.js";
|
|
6
|
+
import { jsx } from "react/jsx-runtime";
|
|
7
|
+
function AppShellDock({ aboveBottomNav, children }) {
|
|
8
|
+
const ref = useRef(null);
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
const dock = ref.current;
|
|
11
|
+
const shell = dock?.parentElement;
|
|
12
|
+
if (!dock || !shell || typeof ResizeObserver === "undefined") return;
|
|
13
|
+
const publish = () => shell.style.setProperty("--dock-height", `${dock.offsetHeight}px`);
|
|
14
|
+
publish();
|
|
15
|
+
const observer = new ResizeObserver(publish);
|
|
16
|
+
observer.observe(dock);
|
|
17
|
+
return () => {
|
|
18
|
+
observer.disconnect();
|
|
19
|
+
shell.style.removeProperty("--dock-height");
|
|
20
|
+
};
|
|
21
|
+
}, []);
|
|
22
|
+
return /* @__PURE__ */ jsx(
|
|
23
|
+
"div",
|
|
24
|
+
{
|
|
25
|
+
ref,
|
|
26
|
+
"data-app-shell-dock": "",
|
|
27
|
+
className: cn(
|
|
28
|
+
"sticky bottom-0 z-(--z-nav)",
|
|
29
|
+
aboveBottomNav && "bottom-[calc(var(--nav-height)+env(safe-area-inset-bottom,0px))] lg:bottom-0"
|
|
30
|
+
),
|
|
31
|
+
children
|
|
32
|
+
}
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
export {
|
|
36
|
+
AppShellDock
|
|
37
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// src/components/app-shell/app-shell.tsx
|
|
2
|
+
import { cn } from "../../lib/cn.js";
|
|
3
|
+
import { buttonVariants } from "../button/button.variants.js";
|
|
4
|
+
import { AppShellDock } from "./app-shell-dock.js";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
function AppShell({
|
|
7
|
+
banners,
|
|
8
|
+
header,
|
|
9
|
+
sidebar,
|
|
10
|
+
bottomNav,
|
|
11
|
+
dock,
|
|
12
|
+
overlays,
|
|
13
|
+
className,
|
|
14
|
+
children,
|
|
15
|
+
...rest
|
|
16
|
+
}) {
|
|
17
|
+
return /* @__PURE__ */ jsxs(
|
|
18
|
+
"div",
|
|
19
|
+
{
|
|
20
|
+
className: cn(
|
|
21
|
+
// `overflow-x-clip` (not `-hidden`) contains horizontal bleed WITHOUT
|
|
22
|
+
// establishing a scroll container — `-hidden` forces `overflow-y: auto`,
|
|
23
|
+
// which breaks `position: sticky` on a descendant Sidebar.
|
|
24
|
+
"flex min-h-screen flex-col overflow-x-clip bg-background text-foreground",
|
|
25
|
+
className
|
|
26
|
+
),
|
|
27
|
+
...rest,
|
|
28
|
+
children: [
|
|
29
|
+
/* @__PURE__ */ jsx(
|
|
30
|
+
"a",
|
|
31
|
+
{
|
|
32
|
+
href: "#main-content",
|
|
33
|
+
className: cn(
|
|
34
|
+
buttonVariants({ variant: "primary", size: "sm" }),
|
|
35
|
+
"text-label-md sr-only focus:not-sr-only focus:fixed focus:start-2 focus:top-2 focus:z-(--z-skip-link)"
|
|
36
|
+
),
|
|
37
|
+
children: "Skip to content"
|
|
38
|
+
}
|
|
39
|
+
),
|
|
40
|
+
banners ? /* @__PURE__ */ jsx("div", { className: "relative z-(--z-nav)", children: banners }) : null,
|
|
41
|
+
header,
|
|
42
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-h-0 flex-1", children: [
|
|
43
|
+
sidebar,
|
|
44
|
+
/* @__PURE__ */ jsx(
|
|
45
|
+
"main",
|
|
46
|
+
{
|
|
47
|
+
id: "main-content",
|
|
48
|
+
style: { containerType: "inline-size" },
|
|
49
|
+
className: cn(
|
|
50
|
+
"min-w-0 flex-1",
|
|
51
|
+
bottomNav && "pb-[calc(var(--nav-height)+env(safe-area-inset-bottom,0px))] lg:pb-0"
|
|
52
|
+
),
|
|
53
|
+
children
|
|
54
|
+
}
|
|
55
|
+
)
|
|
56
|
+
] }),
|
|
57
|
+
dock ? /* @__PURE__ */ jsx(AppShellDock, { aboveBottomNav: Boolean(bottomNav), children: dock }) : null,
|
|
58
|
+
bottomNav,
|
|
59
|
+
overlays
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
AppShell.displayName = "AppShell";
|
|
65
|
+
export {
|
|
66
|
+
AppShell
|
|
67
|
+
};
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
// src/components/app-shell/app-shell.meta.ts
|
|
2
|
+
var appShellMeta = {
|
|
3
|
+
name: "AppShell",
|
|
4
|
+
summary: "The application frame: slots for status banners, a mobile header, a desktop sidebar, main content, a mobile bottom nav, a persistent dock (a now-playing or call bar), and floating overlays \u2014 plus a built-in skip link and #main-content target.",
|
|
5
|
+
keywords: [
|
|
6
|
+
"app shell",
|
|
7
|
+
"layout",
|
|
8
|
+
"frame",
|
|
9
|
+
"sidebar",
|
|
10
|
+
"header",
|
|
11
|
+
"bottom nav",
|
|
12
|
+
"mobile",
|
|
13
|
+
"banners",
|
|
14
|
+
"main",
|
|
15
|
+
"dock",
|
|
16
|
+
"player bar",
|
|
17
|
+
"now playing",
|
|
18
|
+
"persistent"
|
|
19
|
+
],
|
|
20
|
+
usage: {
|
|
21
|
+
description: "Use AppShell as the outer product frame for authenticated or app-like experiences. It coordinates responsive chrome slots and guarantees a skip link plus main landmark; put route content inside the children and let AppHeader, Sidebar, BottomNav, and Banner own their own semantics.",
|
|
22
|
+
bestPractices: [
|
|
23
|
+
{
|
|
24
|
+
guidance: "do",
|
|
25
|
+
description: "Use AppShell once around the route tree or major app area so the skip link and main landmark stay stable."
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
guidance: "do",
|
|
29
|
+
description: "Pass app-wide outage or status messages through banners so they remain above the frame."
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
guidance: "do",
|
|
33
|
+
description: "Use Region inside the main content to choose each route's reading width."
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
guidance: "do",
|
|
37
|
+
description: "Wrap EVERY return of a route in its own Page or Region \u2014 including early returns for loading, empty and error states. AppShell's <main> deliberately carries no padding (it is a frame, and padding belongs to the region that chose the width), so a route that returns a bare spinner or error renders flush against the chrome. This is the most common conversion bug: the happy path gets a Page, the three early returns do not."
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
guidance: "dont",
|
|
41
|
+
description: "Nest AppShell inside route cards or panels. It is page chrome, not local content."
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
guidance: "dont",
|
|
45
|
+
description: "Put desktop-only navigation in the mobile header slot or mobile-only controls in the sidebar slot."
|
|
46
|
+
}
|
|
47
|
+
],
|
|
48
|
+
anatomy: [
|
|
49
|
+
{
|
|
50
|
+
name: "Banners",
|
|
51
|
+
required: false,
|
|
52
|
+
description: "Full-width app status messages rendered above the shell."
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: "Header",
|
|
56
|
+
required: false,
|
|
57
|
+
description: "Mobile top chrome, usually AppHeader."
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
name: "Sidebar",
|
|
61
|
+
required: false,
|
|
62
|
+
description: "Desktop navigation chrome, usually Sidebar."
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
name: "Main",
|
|
66
|
+
required: true,
|
|
67
|
+
description: "The route content landmark with id main-content."
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
name: "Bottom nav",
|
|
71
|
+
required: false,
|
|
72
|
+
description: "Mobile fixed navigation with reserved bottom space."
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
name: "Dock",
|
|
76
|
+
required: false,
|
|
77
|
+
description: "Persistent bottom chrome that outlives routes \u2014 a now-playing bar, a call bar. Sticky above the bottom nav; the desktop Sidebar shortens to clear it."
|
|
78
|
+
}
|
|
79
|
+
]
|
|
80
|
+
},
|
|
81
|
+
related: {
|
|
82
|
+
components: ["AppHeader", "Sidebar", "SideNav", "BottomNav", "Banner"],
|
|
83
|
+
patterns: ["DashboardPage", "FeedPage", "SettingsPage"]
|
|
84
|
+
},
|
|
85
|
+
status: "stable",
|
|
86
|
+
props: [
|
|
87
|
+
{
|
|
88
|
+
name: "banners",
|
|
89
|
+
type: "ReactNode",
|
|
90
|
+
description: "Full-width status banners pinned in flow above the frame (offline / chain-down)."
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
name: "header",
|
|
94
|
+
type: "ReactNode",
|
|
95
|
+
description: "Mobile top header (e.g. AppHeader); expected to hide itself at lg."
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
name: "sidebar",
|
|
99
|
+
type: "ReactNode",
|
|
100
|
+
description: "Desktop side navigation (e.g. Sidebar); expected to hide itself below lg. Leading column of the body row."
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
name: "bottomNav",
|
|
104
|
+
type: "ReactNode",
|
|
105
|
+
description: "Mobile bottom navigation (e.g. BottomNav); fixed to the bottom edge. main reserves space for it."
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
name: "dock",
|
|
109
|
+
type: "ReactNode",
|
|
110
|
+
description: 'Persistent chrome kept on screen across routes (a now-playing bar, an active-call bar, an upload tray). Full width, sticky to the bottom edge and above bottomNav on mobile; its height is published as --dock-height and the app Sidebar subtracts it. In flow, so main needs no reserved space. The contents paint their own surface and top border, and name themselves (e.g. <section aria-label="Player">). Mount AppShell in a layout that survives navigation, or the playback restarts.'
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
name: "overlays",
|
|
114
|
+
type: "ReactNode",
|
|
115
|
+
description: "Floating overlays \u2014 a message launcher, FAB, or modal mount points."
|
|
116
|
+
}
|
|
117
|
+
],
|
|
118
|
+
a11y: [
|
|
119
|
+
"Renders a skip link to #main-content as the first focusable element.",
|
|
120
|
+
'Wraps content in a <main id="main-content"> landmark.',
|
|
121
|
+
"Slot components own their own ARIA (nav landmarks, labels).",
|
|
122
|
+
"The dock follows <main> in DOM order, so keyboard and screen-reader users reach the player after the page content, not before it."
|
|
123
|
+
],
|
|
124
|
+
tokensUsed: ["background", "foreground", "primary", "primary-foreground"],
|
|
125
|
+
examples: [
|
|
126
|
+
{
|
|
127
|
+
label: "Full frame",
|
|
128
|
+
code: `<AppShell
|
|
129
|
+
banners={<Banner tone="warning">Network congested \u2014 mints may be slow.</Banner>}
|
|
130
|
+
header={<AppHeader title="Studio" />}
|
|
131
|
+
sidebar={
|
|
132
|
+
<Sidebar>
|
|
133
|
+
<SidebarNav>
|
|
134
|
+
<SidebarItem icon={<Icon name="home" />} label="Home" active render={<Link to="/" />} />
|
|
135
|
+
<SidebarItem icon={<Icon name="bell" />} label="Notifications" render={<Link to="/notifications" />} />
|
|
136
|
+
<SidebarItem icon={<Icon name="gear" />} label="Settings" render={<Link to="/settings" />} />
|
|
137
|
+
</SidebarNav>
|
|
138
|
+
</Sidebar>
|
|
139
|
+
}
|
|
140
|
+
bottomNav={
|
|
141
|
+
<BottomNav>
|
|
142
|
+
<BottomNavItem icon={<Icon name="home" />} label="Home" active render={<Link to="/" />} />
|
|
143
|
+
<BottomNavItem icon={<Icon name="bell" />} label="Alerts" render={<Link to="/notifications" />} />
|
|
144
|
+
</BottomNav>
|
|
145
|
+
}
|
|
146
|
+
>
|
|
147
|
+
<Region max="feed">
|
|
148
|
+
<PageHeader title="Home" description="Latest posts from artists you follow." />
|
|
149
|
+
</Region>
|
|
150
|
+
</AppShell>`
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
label: "Minimal (sidebar + content only)",
|
|
154
|
+
code: `<AppShell
|
|
155
|
+
sidebar={
|
|
156
|
+
<Sidebar>
|
|
157
|
+
<SidebarNav>
|
|
158
|
+
<SidebarItem icon={<Icon name="home" />} label="Dashboard" active render={<Link to="/" />} />
|
|
159
|
+
</SidebarNav>
|
|
160
|
+
</Sidebar>
|
|
161
|
+
}
|
|
162
|
+
>
|
|
163
|
+
<Region max="wide">
|
|
164
|
+
<PageHeader title="Dashboard" />
|
|
165
|
+
</Region>
|
|
166
|
+
</AppShell>`
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
label: "Route content width",
|
|
170
|
+
code: '<AppShell sidebar={<Sidebar><SidebarNav><SidebarItem icon={<Icon name="home" />} label="Home" active /></SidebarNav></Sidebar>}><Region max="content"><PageHeader title="Settings" description="Manage account and workspace preferences." /><Card><CardHeader><CardTitle>Profile</CardTitle></CardHeader><CardContent><Field label="Display name"><Input defaultValue="Nova" /></Field></CardContent></Card></Region></AppShell>'
|
|
171
|
+
}
|
|
172
|
+
]
|
|
173
|
+
};
|
|
174
|
+
export {
|
|
175
|
+
appShellMeta
|
|
176
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// src/components/area-chart/area-chart.tsx
|
|
2
|
+
import { CartesianChart } from "../../lib/chart/cartesian.js";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
function AreaChart(props) {
|
|
5
|
+
return /* @__PURE__ */ jsx(CartesianChart, { kind: "area", ...props });
|
|
6
|
+
}
|
|
7
|
+
AreaChart.displayName = "AreaChart";
|
|
8
|
+
export {
|
|
9
|
+
AreaChart
|
|
10
|
+
};
|