@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,99 @@
|
|
|
1
|
+
// src/components/theme-switcher/theme-switcher.meta.ts
|
|
2
|
+
var themeSwitcherMeta = {
|
|
3
|
+
name: "ThemeSwitcher",
|
|
4
|
+
summary: "A segmented light / dark / system switch. Presentational: it renders the selected color preference and reports changes via onValueChange; pair it with useSableTheme() when the app uses SableThemeProvider. A radiogroup of three icon buttons (sun / moon / desktop).",
|
|
5
|
+
status: "stable",
|
|
6
|
+
keywords: [
|
|
7
|
+
"theme switcher",
|
|
8
|
+
"color mode",
|
|
9
|
+
"dark mode",
|
|
10
|
+
"appearance"
|
|
11
|
+
],
|
|
12
|
+
usage: {
|
|
13
|
+
description: "Use ThemeSwitcher for light, dark, and system color mode preference.",
|
|
14
|
+
bestPractices: [
|
|
15
|
+
{
|
|
16
|
+
guidance: "do",
|
|
17
|
+
description: "Use it where users expect appearance controls, such as app chrome or settings."
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
guidance: "do",
|
|
21
|
+
description: "Respect persisted system or user preference when initializing the control."
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
guidance: "dont",
|
|
25
|
+
description: "Do not use ThemeSwitcher to choose brand themes or component style presets."
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
guidance: "dont",
|
|
29
|
+
description: 'Do not hand-build another segmented capsule for a different choice. ThemeSwitcher wears the shared segmented look (lib/segmented); for any other single-select switch use ToggleGroup appearance="segmented".'
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
guidance: "dont",
|
|
33
|
+
description: "Do not omit the `system` option or default to a hardcoded mode. Overriding the OS preference is the single most common accessibility complaint about theme controls."
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
related: {
|
|
38
|
+
components: [
|
|
39
|
+
"ThemeSelector",
|
|
40
|
+
"Switch",
|
|
41
|
+
"Toggle"
|
|
42
|
+
]
|
|
43
|
+
},
|
|
44
|
+
props: [
|
|
45
|
+
{
|
|
46
|
+
name: "value",
|
|
47
|
+
type: '"light" | "dark" | "system"',
|
|
48
|
+
description: "The currently selected color preference."
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: "onValueChange",
|
|
52
|
+
type: "(value: ThemeMode) => void",
|
|
53
|
+
description: "Called with the next color preference when an option is chosen."
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: "label",
|
|
57
|
+
type: "string",
|
|
58
|
+
default: '"Theme"',
|
|
59
|
+
description: "Accessible label for the radiogroup."
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: "className",
|
|
63
|
+
type: "string",
|
|
64
|
+
description: "Merged onto the outer radiogroup container."
|
|
65
|
+
}
|
|
66
|
+
],
|
|
67
|
+
tokensUsed: [
|
|
68
|
+
"border",
|
|
69
|
+
"card",
|
|
70
|
+
"muted-foreground",
|
|
71
|
+
"foreground",
|
|
72
|
+
"accent",
|
|
73
|
+
"accent-foreground",
|
|
74
|
+
"ring"
|
|
75
|
+
],
|
|
76
|
+
a11y: [
|
|
77
|
+
'The container is role="radiogroup" with an aria-label; each option is role="radio" with aria-checked reflecting the selected value.',
|
|
78
|
+
"Each icon button carries an aria-label (Light / Dark / System) plus a title tooltip, since the visual is icon-only.",
|
|
79
|
+
"Focus-visible draws a 2px ring on the focused option; selection styling reads from aria-checked.",
|
|
80
|
+
"Presentational only: it does not change the document theme; pass useSableTheme().setPreference or apply the change in onValueChange."
|
|
81
|
+
],
|
|
82
|
+
examples: [
|
|
83
|
+
{
|
|
84
|
+
label: "Controlled",
|
|
85
|
+
code: 'const [theme, setTheme] = useState<ThemeMode>("system")\n<ThemeSwitcher value={theme} onValueChange={setTheme} />'
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
label: "With SableThemeProvider",
|
|
89
|
+
code: "const { preference, setPreference } = useSableTheme()\n<ThemeSwitcher value={preference} onValueChange={setPreference} />"
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
label: "Light selected",
|
|
93
|
+
code: '<ThemeSwitcher value="light" onValueChange={setTheme} />'
|
|
94
|
+
}
|
|
95
|
+
]
|
|
96
|
+
};
|
|
97
|
+
export {
|
|
98
|
+
themeSwitcherMeta
|
|
99
|
+
};
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/components/thinking-orb/thinking-orb.tsx
|
|
4
|
+
import { useEffect, useRef } from "react";
|
|
5
|
+
import { cn } from "../../lib/cn.js";
|
|
6
|
+
import { useMotion } from "../../motion/MotionProvider.js";
|
|
7
|
+
import {
|
|
8
|
+
ORB_PX,
|
|
9
|
+
ORB_RENDERERS,
|
|
10
|
+
orbTuning
|
|
11
|
+
} from "./thinking-orb.render.js";
|
|
12
|
+
import { jsx } from "react/jsx-runtime";
|
|
13
|
+
var ORB_BOX = {
|
|
14
|
+
sm: "calc(var(--spacing) * 5)",
|
|
15
|
+
md: "calc(var(--spacing) * 8)",
|
|
16
|
+
lg: "calc(var(--spacing) * 16)"
|
|
17
|
+
};
|
|
18
|
+
var STILL_T = 0.6;
|
|
19
|
+
var MAX_DPR = 2;
|
|
20
|
+
function ThinkingOrb({
|
|
21
|
+
mode = "orbit",
|
|
22
|
+
size = "md",
|
|
23
|
+
speed = 1,
|
|
24
|
+
paused = false,
|
|
25
|
+
label = "Thinking",
|
|
26
|
+
className,
|
|
27
|
+
style,
|
|
28
|
+
ref,
|
|
29
|
+
...props
|
|
30
|
+
}) {
|
|
31
|
+
const canvasRef = useRef(null);
|
|
32
|
+
const { enabled } = useMotion();
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
const canvas = canvasRef.current;
|
|
35
|
+
if (!canvas) return;
|
|
36
|
+
const ctx = canvas.getContext("2d");
|
|
37
|
+
if (!ctx) return;
|
|
38
|
+
const dpr = Math.min(MAX_DPR, globalThis.devicePixelRatio || 1);
|
|
39
|
+
let px = ORB_PX[size];
|
|
40
|
+
const fit = () => {
|
|
41
|
+
const measured = Math.round(canvas.getBoundingClientRect().width);
|
|
42
|
+
px = measured > 0 ? measured : ORB_PX[size];
|
|
43
|
+
canvas.width = Math.round(px * dpr);
|
|
44
|
+
canvas.height = Math.round(px * dpr);
|
|
45
|
+
};
|
|
46
|
+
fit();
|
|
47
|
+
const render = ORB_RENDERERS[mode];
|
|
48
|
+
const tuning = orbTuning(mode, size);
|
|
49
|
+
const rate = tuning.speed * speed;
|
|
50
|
+
const draw = (t) => {
|
|
51
|
+
const ink = globalThis.getComputedStyle(canvas).color;
|
|
52
|
+
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
|
|
53
|
+
ctx.clearRect(0, 0, px, px);
|
|
54
|
+
ctx.fillStyle = ink;
|
|
55
|
+
ctx.strokeStyle = ink;
|
|
56
|
+
render(ctx, px, t, tuning);
|
|
57
|
+
};
|
|
58
|
+
const resizer = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(() => {
|
|
59
|
+
fit();
|
|
60
|
+
if (!enabled || paused) draw(STILL_T);
|
|
61
|
+
});
|
|
62
|
+
resizer?.observe(canvas);
|
|
63
|
+
if (!enabled || paused) {
|
|
64
|
+
draw(STILL_T);
|
|
65
|
+
return () => resizer?.disconnect();
|
|
66
|
+
}
|
|
67
|
+
let frame = 0;
|
|
68
|
+
let running = false;
|
|
69
|
+
const tick = () => {
|
|
70
|
+
draw(performance.now() / 1e3 * rate);
|
|
71
|
+
if (running) frame = requestAnimationFrame(tick);
|
|
72
|
+
};
|
|
73
|
+
const start = () => {
|
|
74
|
+
if (running) return;
|
|
75
|
+
running = true;
|
|
76
|
+
frame = requestAnimationFrame(tick);
|
|
77
|
+
};
|
|
78
|
+
const stop = () => {
|
|
79
|
+
running = false;
|
|
80
|
+
cancelAnimationFrame(frame);
|
|
81
|
+
};
|
|
82
|
+
draw(performance.now() / 1e3 * rate);
|
|
83
|
+
let visible = true;
|
|
84
|
+
const observer = typeof IntersectionObserver === "undefined" ? null : new IntersectionObserver(([entry]) => {
|
|
85
|
+
visible = entry.isIntersecting;
|
|
86
|
+
if (visible && document.visibilityState !== "hidden") start();
|
|
87
|
+
else stop();
|
|
88
|
+
});
|
|
89
|
+
observer?.observe(canvas);
|
|
90
|
+
const onVisibility = () => {
|
|
91
|
+
if (document.visibilityState === "hidden") stop();
|
|
92
|
+
else if (visible) start();
|
|
93
|
+
};
|
|
94
|
+
document.addEventListener("visibilitychange", onVisibility);
|
|
95
|
+
if (!observer) start();
|
|
96
|
+
return () => {
|
|
97
|
+
stop();
|
|
98
|
+
observer?.disconnect();
|
|
99
|
+
resizer?.disconnect();
|
|
100
|
+
document.removeEventListener("visibilitychange", onVisibility);
|
|
101
|
+
};
|
|
102
|
+
}, [mode, size, speed, paused, enabled]);
|
|
103
|
+
return /* @__PURE__ */ jsx(
|
|
104
|
+
"span",
|
|
105
|
+
{
|
|
106
|
+
ref,
|
|
107
|
+
role: "status",
|
|
108
|
+
"aria-label": label,
|
|
109
|
+
className: cn("inline-flex items-center justify-center", className),
|
|
110
|
+
style: { width: ORB_BOX[size], height: ORB_BOX[size], ...style },
|
|
111
|
+
...props,
|
|
112
|
+
children: /* @__PURE__ */ jsx(
|
|
113
|
+
"canvas",
|
|
114
|
+
{
|
|
115
|
+
ref: canvasRef,
|
|
116
|
+
"aria-hidden": "true",
|
|
117
|
+
className: "block size-full"
|
|
118
|
+
}
|
|
119
|
+
)
|
|
120
|
+
}
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
ThinkingOrb.displayName = "ThinkingOrb";
|
|
124
|
+
export {
|
|
125
|
+
ThinkingOrb
|
|
126
|
+
};
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
// src/components/thinking-orb/thinking-orb.meta.ts
|
|
2
|
+
var thinkingOrbMeta = {
|
|
3
|
+
name: "ThinkingOrb",
|
|
4
|
+
summary: "Canvas dot-cloud 'agent is thinking' indicator. Three generated modes (orbit / globe / mesh) drawn from pure math \u2014 no icon dependency, no animation library. Ink follows currentColor; size steps are separately tuned.",
|
|
5
|
+
status: "stable",
|
|
6
|
+
keywords: [
|
|
7
|
+
"thinking",
|
|
8
|
+
"orb",
|
|
9
|
+
"agent",
|
|
10
|
+
"ai",
|
|
11
|
+
"chat",
|
|
12
|
+
"loading",
|
|
13
|
+
"streaming",
|
|
14
|
+
"indeterminate",
|
|
15
|
+
"canvas"
|
|
16
|
+
],
|
|
17
|
+
usage: {
|
|
18
|
+
description: "Use ThinkingOrb while an AI agent is working and there is nothing specific to report yet \u2014 before the first token streams, or between tool calls. It is a richer, more characterful sibling of Spinner for the one place in a product where the wait is the experience.",
|
|
19
|
+
bestPractices: [
|
|
20
|
+
{
|
|
21
|
+
guidance: "do",
|
|
22
|
+
description: "Reserve it for the single active agent state \u2014 the composer, the streaming message header, a standalone thinking screen. One orb on screen reads as intent; several read as decoration."
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
guidance: "do",
|
|
26
|
+
description: "Switch mode to say what kind of work is happening: orbit for generic thinking, globe while searching or retrieving, mesh while relating sources or running tools. Pair it with a text status so the phase is legible without decoding the animation."
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
guidance: "do",
|
|
30
|
+
description: 'Use size="sm" inline in a message row or composer and size="lg" only when the orb is the main thing on screen. The size steps are separately tuned, not scaled, so the small one stays legible.'
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
guidance: "dont",
|
|
34
|
+
description: "Do not put one on every row of a list or in a repeated skeleton. Each orb runs its own animation frame loop painting hundreds of arcs; use Skeleton for content-shaped waits and Spinner inside buttons."
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
guidance: "dont",
|
|
38
|
+
description: "Do not use it for a determinate wait. It carries no sense of how far along anything is \u2014 reach for Progress when a percentage exists."
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
guidance: "dont",
|
|
42
|
+
description: "Do not rely on the animation alone to announce the wait. Give the label a short constant phrase (it is the role=status announcement) or place a status message next to it."
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
guidance: "dont",
|
|
46
|
+
description: 'Do not pass a label that changes while the orb is up. It is the accessible name of a live region, so every change re-announces the whole thing \u2014 feed it a per-token phase and a screen reader interrupts on each delta: "Chromatic drift" \u2192 "Chromatic drift \xB7 rgb-shift" \u2192 "Chromatic drift \xB7 rgb-shift \u2192 grain", which is unusable. The label names the wait ("Thinking"); the phase belongs in adjacent text, as in the "Inline with a status line" example. If the phase must be announced, announce it once when the turn settles from a separate live region \u2014 not per update.'
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
},
|
|
50
|
+
related: {
|
|
51
|
+
components: ["Spinner", "Skeleton", "Progress", "InlineStatus", "ChatComposer", "Message"]
|
|
52
|
+
},
|
|
53
|
+
props: [
|
|
54
|
+
{
|
|
55
|
+
name: "mode",
|
|
56
|
+
type: '"orbit" | "globe" | "mesh"',
|
|
57
|
+
default: '"orbit"',
|
|
58
|
+
description: "Which cloud to draw. orbit = generic working, globe = searching/retrieving (a scan band sweeps pole to pole), mesh = relating things (nodes wire to near neighbours and signals run the edges)."
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: "size",
|
|
62
|
+
type: '"sm" | "md" | "lg"',
|
|
63
|
+
default: '"md"',
|
|
64
|
+
description: "Rendered box on the spacing scale: sm 5 units (20px at the default spacing; inline in a composer or message row), md 8 (32px; beside a status line), lg 16 (64px; standalone). The box moves with density like the text beside it, and the canvas re-measures it. Each step has its own dot density, dot size and speed."
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: "speed",
|
|
68
|
+
type: "number",
|
|
69
|
+
default: "1",
|
|
70
|
+
description: "Multiplier on top of the per-size tuned speed. Below ~0.5 the orb reads as stalled."
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
name: "paused",
|
|
74
|
+
type: "boolean",
|
|
75
|
+
default: "false",
|
|
76
|
+
description: "Freeze on a representative still frame without unmounting."
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: "label",
|
|
80
|
+
type: "string",
|
|
81
|
+
default: '"Thinking"',
|
|
82
|
+
description: "Accessible label announced by screen readers while visible (sets aria-label on the role=status element). Must stay constant for as long as the orb is mounted \u2014 it names the wait, it does not report progress."
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
name: "className",
|
|
86
|
+
type: "string",
|
|
87
|
+
description: "Set the ink with a semantic text-* token (the dots are drawn from the element's computed color). The box is sized by the size prop, not by className."
|
|
88
|
+
}
|
|
89
|
+
],
|
|
90
|
+
tokensUsed: ["foreground", "muted-foreground", "primary"],
|
|
91
|
+
motion: [
|
|
92
|
+
{
|
|
93
|
+
slot: "arrival",
|
|
94
|
+
recipe: "none",
|
|
95
|
+
part: "Root",
|
|
96
|
+
why: "The orb appears when work starts, and the point cloud is already in motion on its first painted frame. There is nothing to stage."
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
slot: "response",
|
|
100
|
+
recipe: "none",
|
|
101
|
+
part: "Root",
|
|
102
|
+
why: "It reports state; it is not a control. A hover reaction would suggest the wait is something you can click your way out of."
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
slot: "transition",
|
|
106
|
+
recipe: "none",
|
|
107
|
+
part: "Root",
|
|
108
|
+
why: "Changing `mode` swaps the renderer on the next frame: the cloud is redrawn as the new shape, not morphed into it. The phase change is carried by the status text beside the orb, which is what a reader actually reads; a per-particle morph would be decoration on top of it."
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
slot: "activity",
|
|
112
|
+
recipe: "custom",
|
|
113
|
+
part: "Root",
|
|
114
|
+
why: "The cloud is drawn per frame on a canvas by a single requestAnimationFrame loop \u2014 no CSS animation exists to name here. The loop reads the motion policy itself, which is the part worth checking when auditing: `custom` means the kill-switch is honoured in JS rather than by --motion-scale."
|
|
115
|
+
}
|
|
116
|
+
],
|
|
117
|
+
a11y: [
|
|
118
|
+
"Wrapped in role=status, a polite live region, with an aria-label (default 'Thinking'); the canvas itself is aria-hidden.",
|
|
119
|
+
"Because that label is the live region's accessible name, it must not change while the orb is mounted \u2014 a name that churns re-announces on every change, so a phase recomputed per streamed delta becomes an interruption per delta. Keep the label constant and let the phase live in adjacent text; announce an outcome once when the work settles, from a separate region.",
|
|
120
|
+
"Ink is the element's computed color, so contrast is the consumer's token choice \u2014 pair with foreground or muted-foreground rather than a decorative tint.",
|
|
121
|
+
"Honours the motion policy: under prefers-reduced-motion or <MotionProvider> off, it paints one still frame and never starts an animation loop.",
|
|
122
|
+
"The loop also stops when the orb scrolls out of view or the tab is backgrounded, so a forgotten orb cannot burn a CPU core."
|
|
123
|
+
],
|
|
124
|
+
examples: [
|
|
125
|
+
{ label: "Default", code: "<ThinkingOrb />" },
|
|
126
|
+
{
|
|
127
|
+
label: "Modes",
|
|
128
|
+
code: '<ThinkingOrb mode="orbit" size="lg" />\n<ThinkingOrb mode="globe" size="lg" />\n<ThinkingOrb mode="mesh" size="lg" />'
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
label: "Inline with a status line (the label stays constant, the phase moves)",
|
|
132
|
+
code: '<InlineStatus icon={<ThinkingOrb mode="globe" size="sm" label="Searching" />}>Searching your workspace\u2026</InlineStatus>'
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
label: "Tinted and paused",
|
|
136
|
+
code: '<ThinkingOrb size="lg" className="text-primary" paused />'
|
|
137
|
+
}
|
|
138
|
+
]
|
|
139
|
+
};
|
|
140
|
+
export {
|
|
141
|
+
thinkingOrbMeta
|
|
142
|
+
};
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
// src/components/thinking-orb/thinking-orb.render.ts
|
|
2
|
+
var ORB_PX = { sm: 20, md: 32, lg: 64 };
|
|
3
|
+
var ORB_TUNING = {
|
|
4
|
+
orbit: {
|
|
5
|
+
sm: { density: 0.35, dotScale: 3.4, speed: 1.9 },
|
|
6
|
+
md: { density: 0.55, dotScale: 2.3, speed: 1.5 },
|
|
7
|
+
lg: { density: 1, dotScale: 1.6, speed: 1.2 }
|
|
8
|
+
},
|
|
9
|
+
globe: {
|
|
10
|
+
sm: { density: 0.16, dotScale: 3.2, speed: 1.6 },
|
|
11
|
+
md: { density: 0.4, dotScale: 2.2, speed: 1.3 },
|
|
12
|
+
lg: { density: 1, dotScale: 1.5, speed: 1 }
|
|
13
|
+
},
|
|
14
|
+
mesh: {
|
|
15
|
+
sm: { density: 0.22, dotScale: 3.2, speed: 2.2 },
|
|
16
|
+
md: { density: 0.5, dotScale: 2.2, speed: 1.8 },
|
|
17
|
+
lg: { density: 1, dotScale: 1.6, speed: 1.4 }
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
function orbTuning(mode, size) {
|
|
21
|
+
return ORB_TUNING[mode][size];
|
|
22
|
+
}
|
|
23
|
+
var TAU = Math.PI * 2;
|
|
24
|
+
var MIN_R = 0.3;
|
|
25
|
+
function hash(a, b) {
|
|
26
|
+
const n = Math.sin(a * 12.9898 + b * 78.233) * 43758.5453;
|
|
27
|
+
return n - Math.floor(n);
|
|
28
|
+
}
|
|
29
|
+
function spherePoint(i, n) {
|
|
30
|
+
const golden = Math.PI * (3 - Math.sqrt(5));
|
|
31
|
+
const y = 1 - 2 * (i + 0.5) / n;
|
|
32
|
+
const r = Math.sqrt(Math.max(0, 1 - y * y));
|
|
33
|
+
const theta = i * golden;
|
|
34
|
+
return [r * Math.cos(theta), y, r * Math.sin(theta)];
|
|
35
|
+
}
|
|
36
|
+
function count(base, density, floor = 3) {
|
|
37
|
+
return Math.max(floor, Math.round(base * Math.sqrt(density)));
|
|
38
|
+
}
|
|
39
|
+
function dotBase(size, dotScale) {
|
|
40
|
+
return (size / 300) ** 0.6 * dotScale;
|
|
41
|
+
}
|
|
42
|
+
function projector(yaw, pitch, cx, cy, radius) {
|
|
43
|
+
const sy = Math.sin(yaw);
|
|
44
|
+
const cyaw = Math.cos(yaw);
|
|
45
|
+
const sp = Math.sin(pitch);
|
|
46
|
+
const cp = Math.cos(pitch);
|
|
47
|
+
return (x, y, z) => {
|
|
48
|
+
const rx = x * cyaw + z * sy;
|
|
49
|
+
const rz = -x * sy + z * cyaw;
|
|
50
|
+
const ry = y * cp - rz * sp;
|
|
51
|
+
const depth = y * sp + rz * cp;
|
|
52
|
+
return [cx + rx * radius, cy - ry * radius, depth];
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function ringBasis(ax, ay, az) {
|
|
56
|
+
const [rx, ry, rz] = Math.abs(ax) < 0.9 ? [1, 0, 0] : [0, 1, 0];
|
|
57
|
+
let e1x = ay * rz - az * ry;
|
|
58
|
+
let e1y = az * rx - ax * rz;
|
|
59
|
+
let e1z = ax * ry - ay * rx;
|
|
60
|
+
const len = Math.max(1e-6, Math.hypot(e1x, e1y, e1z));
|
|
61
|
+
e1x /= len;
|
|
62
|
+
e1y /= len;
|
|
63
|
+
e1z /= len;
|
|
64
|
+
const e2x = ay * e1z - az * e1y;
|
|
65
|
+
const e2y = az * e1x - ax * e1z;
|
|
66
|
+
const e2z = ax * e1y - ay * e1x;
|
|
67
|
+
return [
|
|
68
|
+
[e1x, e1y, e1z],
|
|
69
|
+
[e2x, e2y, e2z]
|
|
70
|
+
];
|
|
71
|
+
}
|
|
72
|
+
function paintDots(ctx, dots) {
|
|
73
|
+
dots.sort((a, b) => a.z - b.z);
|
|
74
|
+
for (const d of dots) {
|
|
75
|
+
if (d.a < 0.02) continue;
|
|
76
|
+
ctx.globalAlpha = Math.min(1, d.a);
|
|
77
|
+
ctx.beginPath();
|
|
78
|
+
ctx.arc(d.x, d.y, Math.max(MIN_R, d.r), 0, TAU);
|
|
79
|
+
ctx.fill();
|
|
80
|
+
}
|
|
81
|
+
ctx.globalAlpha = 1;
|
|
82
|
+
}
|
|
83
|
+
function paintLines(ctx, lines) {
|
|
84
|
+
for (const l of lines) {
|
|
85
|
+
if (l.a < 0.02) continue;
|
|
86
|
+
ctx.globalAlpha = Math.min(1, l.a);
|
|
87
|
+
ctx.lineWidth = l.w;
|
|
88
|
+
ctx.beginPath();
|
|
89
|
+
ctx.moveTo(l.x1, l.y1);
|
|
90
|
+
ctx.lineTo(l.x2, l.y2);
|
|
91
|
+
ctx.stroke();
|
|
92
|
+
}
|
|
93
|
+
ctx.globalAlpha = 1;
|
|
94
|
+
}
|
|
95
|
+
var orbit = (ctx, size, t, tuning) => {
|
|
96
|
+
const c = size / 2;
|
|
97
|
+
const radius = size / 2 * 0.84;
|
|
98
|
+
const project = projector(t * 0.12, 0.3, c, c, radius);
|
|
99
|
+
const rs = dotBase(size, tuning.dotScale);
|
|
100
|
+
const rings = count(10, tuning.density);
|
|
101
|
+
const traceN = count(34, tuning.density, 10);
|
|
102
|
+
const particles = count(3, tuning.density, 2);
|
|
103
|
+
const dots = [];
|
|
104
|
+
for (let i = 0; i < rings; i++) {
|
|
105
|
+
const a = hash(i, 1.7);
|
|
106
|
+
const b = hash(i, 5.2);
|
|
107
|
+
const c2 = hash(i, 8.9);
|
|
108
|
+
const rr = 0.45 + 0.5 * a;
|
|
109
|
+
const phi = a * TAU;
|
|
110
|
+
const theta = Math.acos(2 * b - 1);
|
|
111
|
+
const ax = Math.sin(theta) * Math.cos(phi);
|
|
112
|
+
const ay = Math.cos(theta);
|
|
113
|
+
const az = Math.sin(theta) * Math.sin(phi);
|
|
114
|
+
const [e1, e2] = ringBasis(ax, ay, az);
|
|
115
|
+
const spin = (0.3 + 0.6 * c2) * (c2 > 0.5 ? 1 : -1);
|
|
116
|
+
for (let g = 0; g < traceN; g++) {
|
|
117
|
+
const th = g / traceN * TAU;
|
|
118
|
+
const cs = Math.cos(th) * rr;
|
|
119
|
+
const sn = Math.sin(th) * rr;
|
|
120
|
+
const [x, y, z] = project(
|
|
121
|
+
e1[0] * cs + e2[0] * sn,
|
|
122
|
+
e1[1] * cs + e2[1] * sn,
|
|
123
|
+
e1[2] * cs + e2[2] * sn
|
|
124
|
+
);
|
|
125
|
+
const depth = (z + 1) / 2;
|
|
126
|
+
dots.push({ x, y, z, r: 0.6 * rs, a: 0.08 + 0.14 * depth });
|
|
127
|
+
}
|
|
128
|
+
for (let p = 0; p < particles; p++) {
|
|
129
|
+
const th = t * spin + p / particles * TAU + b * 6;
|
|
130
|
+
const cs = Math.cos(th) * rr;
|
|
131
|
+
const sn = Math.sin(th) * rr;
|
|
132
|
+
const [x, y, z] = project(
|
|
133
|
+
e1[0] * cs + e2[0] * sn,
|
|
134
|
+
e1[1] * cs + e2[1] * sn,
|
|
135
|
+
e1[2] * cs + e2[2] * sn
|
|
136
|
+
);
|
|
137
|
+
const depth = (z + 1) / 2;
|
|
138
|
+
dots.push({ x, y, z, r: (0.85 + 1.2 * depth) * rs, a: 0.4 + 0.55 * depth });
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
paintDots(ctx, dots);
|
|
142
|
+
};
|
|
143
|
+
var globe = (ctx, size, t, tuning) => {
|
|
144
|
+
const c = size / 2;
|
|
145
|
+
const radius = size / 2 * 0.86;
|
|
146
|
+
const project = projector(t * 0.5, 0.38, c, c, radius);
|
|
147
|
+
const rs = dotBase(size, tuning.dotScale);
|
|
148
|
+
const latRings = count(15, tuning.density, 5);
|
|
149
|
+
const lonDensity = count(40, tuning.density, 8);
|
|
150
|
+
const scan = 2 * Math.abs(t * 0.22 % 2 - 1) - 1;
|
|
151
|
+
const dots = [];
|
|
152
|
+
for (let i = 0; i <= latRings; i++) {
|
|
153
|
+
const lat = -Math.PI / 2 + i / latRings * Math.PI;
|
|
154
|
+
const cl = Math.cos(lat);
|
|
155
|
+
const sl = Math.sin(lat);
|
|
156
|
+
const n = Math.max(1, Math.round(Math.abs(cl) * lonDensity));
|
|
157
|
+
const near = Math.max(0, 1 - Math.abs(sl - scan) / 0.24);
|
|
158
|
+
for (let j = 0; j < n; j++) {
|
|
159
|
+
const lon = j / n * TAU;
|
|
160
|
+
const [x, y, z] = project(cl * Math.cos(lon), sl, cl * Math.sin(lon));
|
|
161
|
+
const depth = (z + 1) / 2;
|
|
162
|
+
dots.push({
|
|
163
|
+
x,
|
|
164
|
+
y,
|
|
165
|
+
z,
|
|
166
|
+
r: (0.45 + 1 * depth + 0.9 * near) * rs,
|
|
167
|
+
a: 0.1 + 0.4 * depth + 0.5 * near * depth
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
paintDots(ctx, dots);
|
|
172
|
+
};
|
|
173
|
+
var mesh = (ctx, size, t, tuning) => {
|
|
174
|
+
const c = size / 2;
|
|
175
|
+
const radius = size / 2 * 0.82;
|
|
176
|
+
const project = projector(t * 0.18, 0.32, c, c, radius);
|
|
177
|
+
const rs = dotBase(size, tuning.dotScale);
|
|
178
|
+
const nodeN = count(26, tuning.density, 8);
|
|
179
|
+
const signals = count(4, tuning.density, 1);
|
|
180
|
+
const threshold = Math.min(1, 0.78 * Math.sqrt(26 / nodeN));
|
|
181
|
+
const edgeGain = Math.min(1.6, 1 / Math.sqrt(tuning.density));
|
|
182
|
+
const pts = [];
|
|
183
|
+
for (let i = 0; i < nodeN; i++) {
|
|
184
|
+
const [bx, by, bz] = spherePoint(i, nodeN);
|
|
185
|
+
const x = bx + 0.16 * Math.sin(t * 0.6 + i * 1.7);
|
|
186
|
+
const y = by + 0.16 * Math.sin(t * 0.5 + i * 2.9);
|
|
187
|
+
const z = bz + 0.16 * Math.sin(t * 0.7 + i * 4.3);
|
|
188
|
+
const len = Math.max(1e-6, Math.hypot(x, y, z));
|
|
189
|
+
pts.push([x / len, y / len, z / len]);
|
|
190
|
+
}
|
|
191
|
+
const projected = pts.map(([x, y, z]) => project(x, y, z));
|
|
192
|
+
const lines = [];
|
|
193
|
+
for (let i = 0; i < nodeN; i++) {
|
|
194
|
+
for (let j = i + 1; j < nodeN; j++) {
|
|
195
|
+
const d = Math.hypot(
|
|
196
|
+
pts[i][0] - pts[j][0],
|
|
197
|
+
pts[i][1] - pts[j][1],
|
|
198
|
+
pts[i][2] - pts[j][2]
|
|
199
|
+
);
|
|
200
|
+
if (d >= threshold) continue;
|
|
201
|
+
const [x1, y1, z1] = projected[i];
|
|
202
|
+
const [x2, y2, z2] = projected[j];
|
|
203
|
+
const depth = ((z1 + z2) / 2 + 1) / 2;
|
|
204
|
+
lines.push({
|
|
205
|
+
x1,
|
|
206
|
+
y1,
|
|
207
|
+
x2,
|
|
208
|
+
y2,
|
|
209
|
+
w: Math.max(0.6, 0.5 * rs),
|
|
210
|
+
// Fade with distance so an edge appears and dissolves rather than
|
|
211
|
+
// popping in when two nodes drift across the threshold.
|
|
212
|
+
a: (1 - d / threshold) * (0.14 + 0.34 * depth) * edgeGain
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
const dots = [];
|
|
217
|
+
for (let i = 0; i < nodeN; i++) {
|
|
218
|
+
const [x, y, z] = projected[i];
|
|
219
|
+
const depth = (z + 1) / 2;
|
|
220
|
+
dots.push({ x, y, z, r: (0.7 + 1.1 * depth) * rs, a: 0.35 + 0.5 * depth });
|
|
221
|
+
}
|
|
222
|
+
for (let s = 0; s < signals; s++) {
|
|
223
|
+
const cycle = t * 0.5 + s * 7.31;
|
|
224
|
+
const tick = Math.floor(cycle);
|
|
225
|
+
const p = cycle - tick;
|
|
226
|
+
const from = Math.floor(hash(tick, s * 3.1 + 1.7) * nodeN);
|
|
227
|
+
const to = Math.floor(hash(tick, s * 5.7 + 4.2) * nodeN);
|
|
228
|
+
if (from === to || !pts[from] || !pts[to]) continue;
|
|
229
|
+
const x = pts[from][0] + (pts[to][0] - pts[from][0]) * p;
|
|
230
|
+
const y = pts[from][1] + (pts[to][1] - pts[from][1]) * p;
|
|
231
|
+
const z = pts[from][2] + (pts[to][2] - pts[from][2]) * p;
|
|
232
|
+
const len = Math.max(1e-6, Math.hypot(x, y, z));
|
|
233
|
+
const [px, py, pz] = project(x / len, y / len, z / len);
|
|
234
|
+
const depth = (pz + 1) / 2;
|
|
235
|
+
dots.push({
|
|
236
|
+
x: px,
|
|
237
|
+
y: py,
|
|
238
|
+
z: pz,
|
|
239
|
+
r: (1.1 + 1.2 * depth) * rs,
|
|
240
|
+
// Fade in and out at the ends of the run so a signal does not blink.
|
|
241
|
+
a: Math.sin(p * Math.PI) * (0.6 + 0.4 * depth)
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
paintLines(ctx, lines);
|
|
245
|
+
paintDots(ctx, dots);
|
|
246
|
+
};
|
|
247
|
+
var ORB_RENDERERS = { orbit, globe, mesh };
|
|
248
|
+
export {
|
|
249
|
+
ORB_PX,
|
|
250
|
+
ORB_RENDERERS,
|
|
251
|
+
orbTuning
|
|
252
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// src/components/toast/index.ts
|
|
2
|
+
import {
|
|
3
|
+
ToastProvider,
|
|
4
|
+
ToastViewport,
|
|
5
|
+
ToastRoot,
|
|
6
|
+
ToastTitle,
|
|
7
|
+
ToastDescription,
|
|
8
|
+
ToastClose,
|
|
9
|
+
ToastAction,
|
|
10
|
+
ToastContent,
|
|
11
|
+
toast,
|
|
12
|
+
useToast,
|
|
13
|
+
useToastManager
|
|
14
|
+
} from "./toast.js";
|
|
15
|
+
import { toastMeta } from "./toast.meta.js";
|
|
16
|
+
export {
|
|
17
|
+
ToastAction,
|
|
18
|
+
ToastClose,
|
|
19
|
+
ToastContent,
|
|
20
|
+
ToastDescription,
|
|
21
|
+
ToastProvider,
|
|
22
|
+
ToastRoot,
|
|
23
|
+
ToastTitle,
|
|
24
|
+
ToastViewport,
|
|
25
|
+
toast,
|
|
26
|
+
toastMeta,
|
|
27
|
+
useToast,
|
|
28
|
+
useToastManager
|
|
29
|
+
};
|