@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,334 @@
|
|
|
1
|
+
// src/components/tree/tree.meta.ts
|
|
2
|
+
var treeMeta = {
|
|
3
|
+
name: "Tree",
|
|
4
|
+
summary: "The object list a tool is built around \u2014 layers, scene graph, outline \u2014 on one shared grid, so every left edge in the panel resolves to the rail or an exact multiple of the indent step.",
|
|
5
|
+
keywords: [
|
|
6
|
+
"tree",
|
|
7
|
+
"layers",
|
|
8
|
+
"outline",
|
|
9
|
+
"scene graph",
|
|
10
|
+
"hierarchy",
|
|
11
|
+
"nesting",
|
|
12
|
+
"indent",
|
|
13
|
+
"disclosure",
|
|
14
|
+
"workspace",
|
|
15
|
+
"panel",
|
|
16
|
+
"file tree",
|
|
17
|
+
"files",
|
|
18
|
+
"folders",
|
|
19
|
+
"explorer",
|
|
20
|
+
"treeview"
|
|
21
|
+
],
|
|
22
|
+
usage: {
|
|
23
|
+
description: 'Use Tree for the hierarchy panel in a workspace: layers, objects, an inspector outline. It owns the geometry that makes nesting legible \u2014 the rail, the disclosure and type columns, and the indent step \u2014 via the density ladder (scope the panel with data-density, e.g. data-density="compact"), so nothing in the panel computes its own inset. It is also the file tree: nest rows with `subtree`, let folders manage their own open state with `defaultExpanded`, and mark kind with the `icon` convention (folder for a row with a subtree, file for a leaf). Reach for Accordion when the content is prose sections rather than nodes in a hierarchy.',
|
|
24
|
+
bestPractices: [
|
|
25
|
+
{
|
|
26
|
+
guidance: "do",
|
|
27
|
+
description: 'Give Tree an aria-label naming the hierarchy ("Layers", "Files"). It is a role="tree", and an unnamed tree is announced as just "tree".'
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
guidance: "do",
|
|
31
|
+
description: 'For a file tree, nest with `subtree` and use the icon convention: `icon={<Icon name="folder" />}` on a row with a subtree, `icon={<Icon name="file" />}` on a leaf. There are no folder/file presets \u2014 they would only bind those two props.'
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
guidance: "do",
|
|
35
|
+
description: "Give TreeAddRow the same depth as the rows it adds to, so its mark lands in their type column: one deeper than the parent for a child list, the parent's own depth for a sibling list."
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
guidance: "do",
|
|
39
|
+
description: "Put mutable per-row state (visibility, solo, a row menu) in `actions`, on the right rail. Show it on hover with `reveal-on-hover` (the row is its `group`), and at rest only when its value is the non-default one."
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
guidance: "do",
|
|
43
|
+
description: "Let section headers sit on the rail at the same height as a depth-0 row. Space and a hairline separate sections; TreeSection handles both, including dropping the divider on the first."
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
guidance: "dont",
|
|
47
|
+
description: "Hardcode a left inset anywhere in the panel. Use treeIndent(depth) or var(--tree-rail); a hand-written px value is how a tree ends up with four different left edges."
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
guidance: "dont",
|
|
51
|
+
description: "Redefine --tree-indent to anything other than --tree-column. A step smaller than the column puts a child's content left of its parent's and the nesting reads inverted."
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
guidance: "dont",
|
|
55
|
+
description: "Put the visibility toggle before the name. A leading toggle makes each row's visual start depend on its depth, so no two rows share an edge."
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
guidance: "dont",
|
|
59
|
+
description: "Hand-copy icon paths into a tree row. Use Icon and the shared semantic set, or provide an app-specific icon through the supported slot."
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
guidance: "dont",
|
|
63
|
+
description: "Use EmptyState inside a panel. It is page-register furniture (px-6 py-12 around a size-12 disc) and in 240px it spends 24px of inset and ~96px of height on nothing. Use TreeEmpty."
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
guidance: "dont",
|
|
67
|
+
description: "Show explanatory prose AND an add row in an empty section. That is two things to read where one carries the affordance; give TreeEmpty a one-line message and pass the add row as its action."
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
guidance: "dont",
|
|
71
|
+
description: "Leave a section actionable when its action cannot do anything yet \u2014 a document-level effect list with no content to apply to, for instance. Hide the section or its affordance until the thing it operates on exists."
|
|
72
|
+
}
|
|
73
|
+
],
|
|
74
|
+
anatomy: [
|
|
75
|
+
{
|
|
76
|
+
name: "Tree",
|
|
77
|
+
required: true,
|
|
78
|
+
description: "The container. Does not scroll itself \u2014 put it in a scrolling Panel, or make it the scrolling region with className."
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
name: "TreeSection",
|
|
82
|
+
required: false,
|
|
83
|
+
description: "A titled group. Header on the rail, hairline above, divider suppressed on the first section."
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: "TreeRow",
|
|
87
|
+
required: true,
|
|
88
|
+
description: "One node: rail, disclosure column, type column, name, right-rail actions."
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
name: "TreeAddRow",
|
|
92
|
+
required: false,
|
|
93
|
+
description: "The affordance that ends a branch. Mark in the type column, label in the name column."
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: "TreeEmpty",
|
|
97
|
+
required: false,
|
|
98
|
+
description: "A section's empty state at panel scale: one line, one action, optionally a dashed drop region."
|
|
99
|
+
}
|
|
100
|
+
]
|
|
101
|
+
},
|
|
102
|
+
related: {
|
|
103
|
+
components: ["Panel", "PanelSection", "Workspace", "Accordion", "SideNav"]
|
|
104
|
+
},
|
|
105
|
+
status: "stable",
|
|
106
|
+
props: [
|
|
107
|
+
{
|
|
108
|
+
name: "depth",
|
|
109
|
+
type: "number",
|
|
110
|
+
default: "0",
|
|
111
|
+
description: "Nesting level, on TreeRow and TreeAddRow. 0 sits on the rail; each level adds one --tree-indent."
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
name: "expandable",
|
|
115
|
+
type: "boolean",
|
|
116
|
+
default: "true with subtree, else false",
|
|
117
|
+
description: "Whether TreeRow renders a disclosure control. The column is reserved either way, so leaf and parent names stay aligned."
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
name: "expanded",
|
|
121
|
+
type: "boolean",
|
|
122
|
+
description: "Controlled open state for a TreeRow. Pair with onExpandedChange; omit both for an uncontrolled row."
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
name: "defaultExpanded",
|
|
126
|
+
type: "boolean",
|
|
127
|
+
default: "true",
|
|
128
|
+
description: "Uncontrolled initial open state, used when `expanded` is not passed. Pass false for a file tree's closed folders."
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
name: "onExpandedChange",
|
|
132
|
+
type: "(expanded: boolean) => void",
|
|
133
|
+
description: "Called when a TreeRow opens or closes \u2014 from the disclosure, ArrowRight/ArrowLeft, or activating a row that has no onClick. Fires in both controlled and uncontrolled use."
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
name: "subtree",
|
|
137
|
+
type: "ReactNode",
|
|
138
|
+
description: "The rows nested under a TreeRow, rendered after it while it is expanded. Nested rows inherit depth + 1 unless they pass their own `depth`, so a file tree never computes depth by hand."
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
name: "selected",
|
|
142
|
+
type: "boolean",
|
|
143
|
+
default: "false",
|
|
144
|
+
description: "Selection fill and accent bar on a TreeRow. Inside a Tree it is exposed as aria-selected on the treeitem; a row rendered outside a Tree is a plain div and exposes aria-current instead."
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
name: "toggleLabel",
|
|
148
|
+
type: "string",
|
|
149
|
+
description: `Names the thing being disclosed, for the toggle's accessible label \u2014 "Expand Background" rather than "Expand group". Every example passes it; a screen-reader user hearing twenty identical "Expand group" buttons has no way to tell them apart.`
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
name: "icon",
|
|
153
|
+
type: "ReactNode",
|
|
154
|
+
description: "The kind marker for a TreeRow, rendered in the type column at 1em. Use a semantic Icon so it follows the app icon set."
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
name: "disclosureIcon",
|
|
158
|
+
type: "ReactNode",
|
|
159
|
+
description: "Replaces TreeRow's semantic chevron-down icon. Omit to use the chevron-down from the app's IconProvider set."
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
name: "actions",
|
|
163
|
+
type: "ReactNode",
|
|
164
|
+
description: "Right-rail controls for a TreeRow: visibility, solo, a row menu."
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
name: "label",
|
|
168
|
+
type: "ReactNode",
|
|
169
|
+
description: "TreeAddRow's visible label. Name what gets added \u2014 'Add effect', not 'Add'."
|
|
170
|
+
}
|
|
171
|
+
],
|
|
172
|
+
subcomponents: [
|
|
173
|
+
{
|
|
174
|
+
name: "TreeSection",
|
|
175
|
+
type: "{ title: ReactNode; hint?: string; action?: ReactNode }",
|
|
176
|
+
description: "A titled group of rows, with the header on the rail."
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
name: "TreeRow",
|
|
180
|
+
type: "{ depth?: number; selected?: boolean; accent?: boolean; dimmed?: boolean; expandable?: boolean; expanded?: boolean; defaultExpanded?: boolean; onExpandedChange?: (expanded: boolean) => void; subtree?: ReactNode; toggleLabel?: string; disclosureIcon?: ReactNode; icon?: ReactNode; actions?: ReactNode }",
|
|
181
|
+
description: "One node in the hierarchy (role=treeitem inside a Tree). Controlled via expanded/onExpandedChange or uncontrolled via defaultExpanded; nest children with subtree. Always reserves both leading columns (disclosure and type), so a leaf's name lines up with its expandable siblings."
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
name: "TreeAddRow",
|
|
185
|
+
type: "{ depth?: number; label: ReactNode; icon?: ReactNode }",
|
|
186
|
+
description: "The add affordance, shaped as a row and aligned to the branch it adds to. Its mark sits in the type column (level with the siblings' kind markers), not the name column. `icon` replaces the built-in add mark."
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
name: "TreeEmpty",
|
|
190
|
+
type: "{ message: ReactNode; action?: ReactNode; dropTarget?: boolean; depth?: number }",
|
|
191
|
+
description: "A section's or a branch's empty state, at panel scale rather than page scale. One-line message, one action slot; dropTarget renders it as a dashed drop region and sets data-drop-target for styling. `depth` (inherited inside a subtree) starts the line on the edge of the rows that branch would hold."
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
name: "treeIndent",
|
|
195
|
+
type: "(depth: number) => string",
|
|
196
|
+
description: "The left inset for a depth, as a calc() expression reading the density ladder. Use this rather than computing pixels."
|
|
197
|
+
}
|
|
198
|
+
],
|
|
199
|
+
a11y: [
|
|
200
|
+
`Tree implements the ARIA tree view pattern: Tree is role="tree", each TreeRow and TreeAddRow is role="treeitem" with aria-level, expandable rows carry aria-expanded, and a TreeSection is a role="group" labelled by its heading. Rows stay flat in the DOM \u2014 hierarchy is aria-level \u2014 so the fills span the panel's full width.`,
|
|
201
|
+
"Keyboard: exactly one row is in the tab order (roving tabindex, seeded on the selected row, else the first). ArrowUp/Down move between visible rows; ArrowRight expands a collapsed row, then steps to its first child; ArrowLeft collapses an expanded row, else steps to its parent; Home/End jump to the ends; Enter/Space activate the row \u2014 its onClick, or toggling it when it has none. Keys pressed inside a row's own controls (an action button, a rename field) are left to that control.",
|
|
202
|
+
'Selection has one mapping: inside a Tree, `selected` is aria-selected on the treeitem; outside a Tree the row is a plain div, where aria-selected is invalid, so it falls back to aria-current. A navigation tree that wants aria-current="page" passes it through props.',
|
|
203
|
+
"Each treeitem is named by its own label (aria-labelledby the name), never by the text of its icon or action buttons.",
|
|
204
|
+
"The disclosure is a real button with aria-expanded and a label naming what it discloses, and it stops propagation so collapsing a group never changes the selection. Inside a Tree the treeitem carries aria-expanded and the arrow keys, so the button becomes a pointer target only: aria-hidden, out of the tab order, and it leaves focus where it was when clicked.",
|
|
205
|
+
"The disclosure's POINTER TARGET is bigger than the mark it draws. `--tree-column` is 20px comfortable and 18px compact, both under WCAG 2.5.8's 24x24 floor, so a centred pseudo-element takes the hit at `--control-xs` (28/24) instead. The drawn box stays on the column, because that column is also the indent step \u2014 growing the button would push every name in the tree one column right.",
|
|
206
|
+
"Right-rail actions stay in the tab order, so a row with actions costs extra Tab stops. Keep actions few and reveal them with `reveal-on-hover`, which also shows them on focus and always on touch.",
|
|
207
|
+
"`dimmed` is presentation only. A row switched off must also say so in its actions' aria-pressed or its accessible name; opacity alone is invisible to a screen reader and fails contrast.",
|
|
208
|
+
"Right-rail controls that appear on hover must also appear on focus-visible, or they are unreachable by keyboard."
|
|
209
|
+
],
|
|
210
|
+
tokensUsed: ["panel-raised", "hairline", "foreground", "muted-foreground", "primary", "ring"],
|
|
211
|
+
examples: [
|
|
212
|
+
{
|
|
213
|
+
label: "File tree",
|
|
214
|
+
code: `// Nest with subtree; folders own their open state via defaultExpanded.
|
|
215
|
+
// A row with no onClick toggles when clicked or activated, like a folder in
|
|
216
|
+
// a file explorer. Depth is inherited \u2014 never computed by hand.
|
|
217
|
+
<Tree aria-label="Files" className="max-w-xs">
|
|
218
|
+
<TreeRow
|
|
219
|
+
icon={<Icon name="folder" />}
|
|
220
|
+
toggleLabel="src"
|
|
221
|
+
subtree={
|
|
222
|
+
<>
|
|
223
|
+
<TreeRow icon={<Icon name="file" />} onClick={() => open("index.ts")}>index.ts</TreeRow>
|
|
224
|
+
<TreeRow
|
|
225
|
+
icon={<Icon name="folder" />}
|
|
226
|
+
toggleLabel="components"
|
|
227
|
+
defaultExpanded={false}
|
|
228
|
+
subtree={
|
|
229
|
+
<TreeRow icon={<Icon name="file" />} selected onClick={() => open("button.tsx")}>
|
|
230
|
+
button.tsx
|
|
231
|
+
</TreeRow>
|
|
232
|
+
}
|
|
233
|
+
>
|
|
234
|
+
components
|
|
235
|
+
</TreeRow>
|
|
236
|
+
</>
|
|
237
|
+
}
|
|
238
|
+
>
|
|
239
|
+
src
|
|
240
|
+
</TreeRow>
|
|
241
|
+
<TreeRow icon={<Icon name="file" />} onClick={() => open("README.md")}>README.md</TreeRow>
|
|
242
|
+
</Tree>`
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
label: "Layer tree with per-node effects",
|
|
246
|
+
code: `<Tree aria-label="Layers" className="min-h-0 flex-1 overflow-y-auto scrollbar-quiet">
|
|
247
|
+
<TreeSection title="Document effects" hint="Applied to the flattened composite">
|
|
248
|
+
<TreeRow depth={0} icon={<Icon name="sparkles" />}>Channel shift</TreeRow>
|
|
249
|
+
<TreeAddRow depth={0} label="Add effect" />
|
|
250
|
+
</TreeSection>
|
|
251
|
+
|
|
252
|
+
<TreeSection title="Layers" action={<span className="text-ui-num text-muted-foreground">2</span>}>
|
|
253
|
+
<TreeRow
|
|
254
|
+
depth={0}
|
|
255
|
+
expandable
|
|
256
|
+
expanded
|
|
257
|
+
toggleLabel="Backdrop"
|
|
258
|
+
icon={<Icon name="image-stack" />}
|
|
259
|
+
actions={<Button size="icon-xs" variant="ghost" aria-label="Hide Backdrop"><Icon name="eye" /></Button>}
|
|
260
|
+
>
|
|
261
|
+
Backdrop
|
|
262
|
+
</TreeRow>
|
|
263
|
+
<TreeRow depth={1} icon={<Icon name="sparkles" />}>Block displacement</TreeRow>
|
|
264
|
+
<TreeAddRow depth={1} label="Add effect" />
|
|
265
|
+
|
|
266
|
+
<TreeRow depth={0} icon={<Icon name="image-stack" />} dimmed>Overlay</TreeRow>
|
|
267
|
+
<TreeAddRow depth={0} label="Add image" />
|
|
268
|
+
</TreeSection>
|
|
269
|
+
</Tree>`
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
label: "Empty state \u2014 one line, one action",
|
|
273
|
+
code: `// A section with nothing in it offers exactly ONE way forward. Not EmptyState:
|
|
274
|
+
// that is page-register (px-6 py-12 around a size-12 disc) and in a 240px panel
|
|
275
|
+
// it spends 24px of inset and ~96px of height on nothing.
|
|
276
|
+
<TreeSection title="Layers">
|
|
277
|
+
<TreeEmpty message="No images yet" action={<TreeAddRow depth={0} label="Add image" />} />
|
|
278
|
+
</TreeSection>
|
|
279
|
+
|
|
280
|
+
// As a drop region \u2014 the app owns the drag handlers; TreeEmpty owns the frame
|
|
281
|
+
// and sets data-drop-target so a data-[drop-active] style can respond.
|
|
282
|
+
<TreeEmpty
|
|
283
|
+
dropTarget
|
|
284
|
+
message="Drop an image"
|
|
285
|
+
data-drop-active={dragging || undefined}
|
|
286
|
+
onDragOver={(e) => { e.preventDefault(); setDragging(true) }}
|
|
287
|
+
onDragLeave={() => setDragging(false)}
|
|
288
|
+
onDrop={handleDrop}
|
|
289
|
+
className="data-[drop-active]:border-primary"
|
|
290
|
+
/>`
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
label: "Selection and disclosure",
|
|
294
|
+
code: `<Tree aria-label="Layers">
|
|
295
|
+
<TreeRow
|
|
296
|
+
depth={0}
|
|
297
|
+
expandable
|
|
298
|
+
expanded={open}
|
|
299
|
+
onExpandedChange={setOpen}
|
|
300
|
+
toggleLabel="Group 1"
|
|
301
|
+
icon={<Icon name="folder" />}
|
|
302
|
+
selected
|
|
303
|
+
onClick={() => select("group-1")}
|
|
304
|
+
>
|
|
305
|
+
Group 1
|
|
306
|
+
</TreeRow>
|
|
307
|
+
{open ? <TreeRow depth={1} icon={<Icon name="file" />}>Child</TreeRow> : null}
|
|
308
|
+
</Tree>`
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
label: "An empty branch",
|
|
312
|
+
code: `// A layer with no effects: TreeEmpty at the branch's depth lands on the
|
|
313
|
+
// same edge its effect rows would \u2014 no hand-computed inset.
|
|
314
|
+
<TreeRow depth={0} icon={<Icon name="image-stack" />} toggleLabel="Overlay" subtree={
|
|
315
|
+
<>
|
|
316
|
+
<TreeEmpty message="No effects yet" />
|
|
317
|
+
<TreeAddRow label="Add effect" />
|
|
318
|
+
</>
|
|
319
|
+
}>
|
|
320
|
+
Overlay
|
|
321
|
+
</TreeRow>`
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
label: "Aligning a custom affordance",
|
|
325
|
+
code: `// Anything else that needs a tree inset reads it from the same place the rows do.
|
|
326
|
+
<div style={{ paddingInlineStart: treeIndent(1) }} className="flex h-(--control-xs) items-center">
|
|
327
|
+
<span className="text-ui-body text-muted-foreground">Drag a layer here</span>
|
|
328
|
+
</div>`
|
|
329
|
+
}
|
|
330
|
+
]
|
|
331
|
+
};
|
|
332
|
+
export {
|
|
333
|
+
treeMeta
|
|
334
|
+
};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// src/components/video/video.tsx
|
|
2
|
+
import { Icon } from "../../icon/index.js";
|
|
3
|
+
import { cn } from "../../lib/cn.js";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
var PLAY_MARK = "flex size-14 items-center justify-center rounded-full bg-overlay/85 text-overlay-foreground shadow-sm";
|
|
6
|
+
function Video({
|
|
7
|
+
src,
|
|
8
|
+
poster,
|
|
9
|
+
controls = true,
|
|
10
|
+
onRequestPlay,
|
|
11
|
+
className,
|
|
12
|
+
...props
|
|
13
|
+
}) {
|
|
14
|
+
return /* @__PURE__ */ jsx(
|
|
15
|
+
"div",
|
|
16
|
+
{
|
|
17
|
+
className: cn(
|
|
18
|
+
"relative aspect-video overflow-hidden rounded-lg border border-border bg-overlay",
|
|
19
|
+
className
|
|
20
|
+
),
|
|
21
|
+
children: src ? /* @__PURE__ */ jsx(
|
|
22
|
+
"video",
|
|
23
|
+
{
|
|
24
|
+
className: "size-full",
|
|
25
|
+
controls,
|
|
26
|
+
poster,
|
|
27
|
+
src,
|
|
28
|
+
...props
|
|
29
|
+
}
|
|
30
|
+
) : /* @__PURE__ */ jsxs("div", { className: "size-full", children: [
|
|
31
|
+
poster ? /* @__PURE__ */ jsx(
|
|
32
|
+
"img",
|
|
33
|
+
{
|
|
34
|
+
src: poster,
|
|
35
|
+
alt: "",
|
|
36
|
+
className: "size-full object-cover"
|
|
37
|
+
}
|
|
38
|
+
) : null,
|
|
39
|
+
/* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center justify-center", children: onRequestPlay ? (
|
|
40
|
+
// design-lint-disable-next-line raw-button -- an on-media play disc: it needs the overlay token pair and a 56px circle, and no Button variant or size offers either (Button has no overlay variant yet)
|
|
41
|
+
/* @__PURE__ */ jsx(
|
|
42
|
+
"button",
|
|
43
|
+
{
|
|
44
|
+
type: "button",
|
|
45
|
+
"aria-label": "Play video",
|
|
46
|
+
onClick: onRequestPlay,
|
|
47
|
+
className: cn(PLAY_MARK, "cursor-pointer motion-interactive motion-press hover:bg-overlay focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"),
|
|
48
|
+
children: /* @__PURE__ */ jsx(Icon, { name: "play", variant: "solid", className: "translate-x-px text-xl" })
|
|
49
|
+
}
|
|
50
|
+
)
|
|
51
|
+
) : /* @__PURE__ */ jsx("div", { "aria-hidden": true, className: PLAY_MARK, children: /* @__PURE__ */ jsx(Icon, { name: "play", variant: "solid", className: "translate-x-px text-xl" }) }) })
|
|
52
|
+
] })
|
|
53
|
+
}
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
Video.displayName = "Video";
|
|
57
|
+
export {
|
|
58
|
+
Video
|
|
59
|
+
};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// src/components/video/video.meta.ts
|
|
2
|
+
var videoMeta = {
|
|
3
|
+
name: "Video",
|
|
4
|
+
summary: "Styled 16:9 video player frame. Mounts a native <video> when given a src, or shows a poster/placeholder with a centered play overlay.",
|
|
5
|
+
status: "stable",
|
|
6
|
+
keywords: [
|
|
7
|
+
"video",
|
|
8
|
+
"media",
|
|
9
|
+
"player",
|
|
10
|
+
"demo"
|
|
11
|
+
],
|
|
12
|
+
usage: {
|
|
13
|
+
description: "Use Video to embed playable or previewable video media inside a page.",
|
|
14
|
+
bestPractices: [
|
|
15
|
+
{
|
|
16
|
+
guidance: "do",
|
|
17
|
+
description: "Use captions, poster imagery, and controls when the video carries information."
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
guidance: "do",
|
|
21
|
+
description: "Keep the surrounding layout stable while media loads."
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
guidance: "dont",
|
|
25
|
+
description: "Do not autoplay important audio or make video the only way to access required information."
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
guidance: "dont",
|
|
29
|
+
description: "Do not ship it without captions or a transcript. Captions are what make video usable for deaf users and searchable for everyone; a video with neither is inaccessible content you also cannot index."
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
},
|
|
33
|
+
related: {
|
|
34
|
+
components: ["Carousel", "Dialog", "Badge"]
|
|
35
|
+
},
|
|
36
|
+
props: [
|
|
37
|
+
{
|
|
38
|
+
name: "onRequestPlay",
|
|
39
|
+
type: "() => void",
|
|
40
|
+
description: 'Placeholder only (no src): renders the play mark as a real button labelled "Play video" that calls this \u2014 e.g. to load the source. Without it the mark is decorative.'
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: "src",
|
|
44
|
+
type: "string",
|
|
45
|
+
description: "Video source URL. When omitted, a poster/placeholder with a play overlay renders."
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: "poster",
|
|
49
|
+
type: "string",
|
|
50
|
+
description: "Poster image shown before playback (and as the placeholder backdrop)."
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: "controls",
|
|
54
|
+
type: "boolean",
|
|
55
|
+
default: "true",
|
|
56
|
+
description: "Show native playback controls."
|
|
57
|
+
}
|
|
58
|
+
],
|
|
59
|
+
tokensUsed: ["border", "overlay", "overlay-foreground", "ring"],
|
|
60
|
+
a11y: [
|
|
61
|
+
"Mounts a native <video> element, preserving built-in keyboard controls when controls is enabled.",
|
|
62
|
+
'Without onRequestPlay the placeholder play mark is decorative (aria-hidden) \u2014 nothing on the frame pretends to be pressable. With it, the mark is a native button named "Play video".'
|
|
63
|
+
],
|
|
64
|
+
examples: [
|
|
65
|
+
{
|
|
66
|
+
label: "With a poster",
|
|
67
|
+
code: '<Video poster="/cover.jpg" src="/clip.mp4" />'
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
label: "Placeholder (no src)",
|
|
71
|
+
code: '<Video poster="/cover.jpg" />'
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
label: "Placeholder that loads on play",
|
|
75
|
+
code: '<Video poster="/cover.jpg" src={src} onRequestPlay={() => setSrc("/clip.mp4")} />'
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
};
|
|
79
|
+
export {
|
|
80
|
+
videoMeta
|
|
81
|
+
};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/components/workspace/workspace.tsx
|
|
4
|
+
import { cn } from "../../lib/cn.js";
|
|
5
|
+
import { DensityProvider } from "../../lib/density.js";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
function Workspace({
|
|
8
|
+
toolbar,
|
|
9
|
+
statusBar,
|
|
10
|
+
density = "compact",
|
|
11
|
+
skipLinkLabel = "Skip to canvas",
|
|
12
|
+
className,
|
|
13
|
+
children,
|
|
14
|
+
...props
|
|
15
|
+
}) {
|
|
16
|
+
return (
|
|
17
|
+
// `data-density` scopes the ladder via CSS for everything in the subtree;
|
|
18
|
+
// DensityProvider carries the same value to anything that PORTALS out of it.
|
|
19
|
+
// A menu or select popup mounts at the document root, so CSS reaches it
|
|
20
|
+
// never — measured, its --control-md resolved to the comfortable 40px while
|
|
21
|
+
// the workspace around it was 32px, and --button-radius reverted to pills.
|
|
22
|
+
/* @__PURE__ */ jsx(DensityProvider, { value: density, children: /* @__PURE__ */ jsxs(
|
|
23
|
+
"div",
|
|
24
|
+
{
|
|
25
|
+
"data-density": density,
|
|
26
|
+
className: cn(
|
|
27
|
+
"grid h-dvh grid-rows-[auto_minmax(0,1fr)_auto] overflow-hidden bg-canvas text-canvas-foreground",
|
|
28
|
+
className
|
|
29
|
+
),
|
|
30
|
+
...props,
|
|
31
|
+
children: [
|
|
32
|
+
/* @__PURE__ */ jsx(
|
|
33
|
+
"a",
|
|
34
|
+
{
|
|
35
|
+
href: "#main-content",
|
|
36
|
+
className: "sr-only focus:not-sr-only focus:absolute focus:start-2 focus:top-2 focus:z-(--z-skip-link) focus:rounded-sm focus:bg-popover focus:px-3 focus:py-2 focus:text-ui-md focus:text-popover-foreground focus:ring-2 focus:ring-ring",
|
|
37
|
+
children: skipLinkLabel
|
|
38
|
+
}
|
|
39
|
+
),
|
|
40
|
+
toolbar,
|
|
41
|
+
/* @__PURE__ */ jsx("div", { className: "grid min-h-0 grid-cols-1", children }),
|
|
42
|
+
statusBar
|
|
43
|
+
]
|
|
44
|
+
}
|
|
45
|
+
) })
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
Workspace.displayName = "Workspace";
|
|
49
|
+
function WorkspaceCanvas({ className, children, ...props }) {
|
|
50
|
+
return /* @__PURE__ */ jsx(
|
|
51
|
+
"main",
|
|
52
|
+
{
|
|
53
|
+
id: "main-content",
|
|
54
|
+
className: cn("relative min-h-0 min-w-0 flex-1 overflow-hidden bg-canvas", className),
|
|
55
|
+
...props,
|
|
56
|
+
children
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
WorkspaceCanvas.displayName = "WorkspaceCanvas";
|
|
61
|
+
function WorkspaceBar({ className, children, ...props }) {
|
|
62
|
+
return /* @__PURE__ */ jsx(
|
|
63
|
+
"header",
|
|
64
|
+
{
|
|
65
|
+
className: cn(
|
|
66
|
+
"flex h-(--chrome-bar-height) shrink-0 items-center gap-1 border-b border-hairline bg-panel px-2",
|
|
67
|
+
className
|
|
68
|
+
),
|
|
69
|
+
...props,
|
|
70
|
+
children
|
|
71
|
+
}
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
WorkspaceBar.displayName = "WorkspaceBar";
|
|
75
|
+
export {
|
|
76
|
+
Workspace,
|
|
77
|
+
WorkspaceBar,
|
|
78
|
+
WorkspaceCanvas
|
|
79
|
+
};
|