@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,341 @@
|
|
|
1
|
+
// src/patterns/brand-landing-page.tsx
|
|
2
|
+
import { Avatar } from "../components/avatar/index.js";
|
|
3
|
+
import { Badge } from "../components/badge/index.js";
|
|
4
|
+
import { Button } from "../components/button/index.js";
|
|
5
|
+
import {
|
|
6
|
+
Card,
|
|
7
|
+
CardContent,
|
|
8
|
+
CardDescription,
|
|
9
|
+
CardHeader,
|
|
10
|
+
CardTitle
|
|
11
|
+
} from "../components/card/index.js";
|
|
12
|
+
import { Input } from "../components/input/index.js";
|
|
13
|
+
import { Separator } from "../components/separator/index.js";
|
|
14
|
+
import { StatusDot } from "../components/status-dot/index.js";
|
|
15
|
+
import { Icon } from "../icon/index.js";
|
|
16
|
+
import { Grid, Region, Row, Stack } from "../layout/index.js";
|
|
17
|
+
import { Reveal, TextReveal } from "../motion/index.js";
|
|
18
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
19
|
+
var navItems = [
|
|
20
|
+
{ label: "Platform", href: "#platform" },
|
|
21
|
+
{ label: "How it works", href: "#how-it-works" },
|
|
22
|
+
{ label: "Customers", href: "#customers" },
|
|
23
|
+
{ label: "Pricing", href: "/pricing" }
|
|
24
|
+
];
|
|
25
|
+
var spaces = [
|
|
26
|
+
{ name: "Waypoint", value: "98.4%", label: "clear routes" },
|
|
27
|
+
{ name: "Fielddesk", value: "12", label: "open holds" },
|
|
28
|
+
{ name: "Archive", value: "4.8k", label: "sealed records" }
|
|
29
|
+
];
|
|
30
|
+
var routes = [
|
|
31
|
+
{ label: "Intake", state: "Open", tone: "info" },
|
|
32
|
+
{ label: "Review", state: "Live", tone: "edition" },
|
|
33
|
+
{ label: "Archive", state: "Safe", tone: "success" }
|
|
34
|
+
];
|
|
35
|
+
var bars = [
|
|
36
|
+
{ week: "w1", height: "38%", current: false },
|
|
37
|
+
{ week: "w2", height: "56%", current: false },
|
|
38
|
+
{ week: "w3", height: "44%", current: false },
|
|
39
|
+
{ week: "w4", height: "68%", current: false },
|
|
40
|
+
{ week: "w5", height: "52%", current: false },
|
|
41
|
+
{ week: "w6", height: "78%", current: false },
|
|
42
|
+
{ week: "w7", height: "60%", current: false },
|
|
43
|
+
{ week: "w8", height: "72%", current: false },
|
|
44
|
+
{ week: "w9", height: "88%", current: true }
|
|
45
|
+
];
|
|
46
|
+
var sceneMetrics = [
|
|
47
|
+
{ label: "Cleared", value: "1.8M", detail: "last 30 days" },
|
|
48
|
+
{ label: "Review", value: "42s", detail: "median path" },
|
|
49
|
+
{ label: "Spaces", value: "284", detail: "active teams" }
|
|
50
|
+
];
|
|
51
|
+
var values = [
|
|
52
|
+
{
|
|
53
|
+
icon: "lock",
|
|
54
|
+
title: "Private by default",
|
|
55
|
+
body: "Roles, approvals, and handoff history stay with the people who need them. No shared inboxes, no forwarded screenshots."
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
icon: "bell",
|
|
59
|
+
title: "Signals before surprises",
|
|
60
|
+
body: "Cove watches every route and surfaces stalled reviews and expiring approvals while there is still time to act."
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
icon: "clock",
|
|
64
|
+
title: "A trail for every decision",
|
|
65
|
+
body: "Each approval keeps its context, reviewer, and timestamp, so an audit takes an afternoon instead of a quarter."
|
|
66
|
+
}
|
|
67
|
+
];
|
|
68
|
+
var steps = [
|
|
69
|
+
{
|
|
70
|
+
number: "01",
|
|
71
|
+
title: "Connect your spaces",
|
|
72
|
+
body: "Bring teams, vendors, and record stores into one workspace, with roles that mirror how you already work."
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
number: "02",
|
|
76
|
+
title: "Route every approval",
|
|
77
|
+
body: "Requests follow the path you define, with reviewers, deadlines, and escalation built in from the start."
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
number: "03",
|
|
81
|
+
title: "Seal the record",
|
|
82
|
+
body: "Approved work is archived with its full context and is ready for review the moment it closes."
|
|
83
|
+
}
|
|
84
|
+
];
|
|
85
|
+
var outcomes = [
|
|
86
|
+
{ value: "3.2\xD7", label: "faster approvals in the first quarter" },
|
|
87
|
+
{ value: "68%", label: "fewer follow-ups on handoffs" },
|
|
88
|
+
{ value: "1 day", label: "to prepare a quarterly audit" }
|
|
89
|
+
];
|
|
90
|
+
var footerGroups = [
|
|
91
|
+
{
|
|
92
|
+
title: "Platform",
|
|
93
|
+
links: [
|
|
94
|
+
{ label: "Overview", href: "#platform" },
|
|
95
|
+
{ label: "Signals", href: "/signals" },
|
|
96
|
+
{ label: "Approvals", href: "/approvals" },
|
|
97
|
+
{ label: "Records", href: "/records" }
|
|
98
|
+
]
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
title: "Company",
|
|
102
|
+
links: [
|
|
103
|
+
{ label: "About", href: "/about" },
|
|
104
|
+
{ label: "Security", href: "/security" },
|
|
105
|
+
{ label: "Customers", href: "#customers" },
|
|
106
|
+
{ label: "Careers", href: "/careers" }
|
|
107
|
+
]
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
title: "Resources",
|
|
111
|
+
links: [
|
|
112
|
+
{ label: "Guides", href: "/guides" },
|
|
113
|
+
{ label: "Status", href: "/status" },
|
|
114
|
+
{ label: "Changelog", href: "/changelog" },
|
|
115
|
+
{ label: "Docs", href: "/docs" }
|
|
116
|
+
]
|
|
117
|
+
}
|
|
118
|
+
];
|
|
119
|
+
var legalLinks = [
|
|
120
|
+
{ label: "Privacy", href: "/privacy" },
|
|
121
|
+
{ label: "Terms", href: "/terms" },
|
|
122
|
+
{ label: "Contact", href: "/contact" }
|
|
123
|
+
];
|
|
124
|
+
function BrandLandingPage() {
|
|
125
|
+
return /* @__PURE__ */ jsxs("div", { className: "min-h-dvh overflow-hidden bg-background text-foreground", children: [
|
|
126
|
+
/* @__PURE__ */ jsx("header", { className: "relative z-10 pt-4", children: /* @__PURE__ */ jsx(Region, { max: "wide", children: /* @__PURE__ */ jsxs(
|
|
127
|
+
"nav",
|
|
128
|
+
{
|
|
129
|
+
"aria-label": "Main",
|
|
130
|
+
className: "flex min-h-15 items-center justify-between gap-3 rounded-full border border-border bg-card/90 px-3 py-2 shadow-sm backdrop-blur",
|
|
131
|
+
children: [
|
|
132
|
+
/* @__PURE__ */ jsxs("a", { href: "/", className: "flex items-center gap-2 rounded-full px-2 motion-interactive motion-press", children: [
|
|
133
|
+
/* @__PURE__ */ jsx("span", { className: "grid size-8 place-items-center rounded-full bg-primary text-primary-foreground", children: /* @__PURE__ */ jsx(Icon, { name: "sparkles", className: "text-sm" }) }),
|
|
134
|
+
/* @__PURE__ */ jsx("span", { className: "text-title-lg", children: "Cove" })
|
|
135
|
+
] }),
|
|
136
|
+
/* @__PURE__ */ jsx("div", { className: "hidden lg:block", children: /* @__PURE__ */ jsx(Row, { gap: 1, children: navItems.map((item) => /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", render: /* @__PURE__ */ jsx("a", { href: item.href }), children: item.label }, item.label)) }) }),
|
|
137
|
+
/* @__PURE__ */ jsxs(Row, { gap: 1, children: [
|
|
138
|
+
/* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", className: "max-sm:hidden", render: /* @__PURE__ */ jsx("a", { href: "/login" }), children: "Sign in" }),
|
|
139
|
+
/* @__PURE__ */ jsx(Button, { size: "sm", render: /* @__PURE__ */ jsx("a", { href: "/demo" }), children: "Request access" })
|
|
140
|
+
] })
|
|
141
|
+
]
|
|
142
|
+
}
|
|
143
|
+
) }) }),
|
|
144
|
+
/* @__PURE__ */ jsxs("main", { children: [
|
|
145
|
+
/* @__PURE__ */ jsx(Region, { as: "section", max: "wide", className: "pb-20 pt-14 sm:pt-20 lg:pb-28", children: /* @__PURE__ */ jsxs("div", { className: "grid items-center gap-12 lg:grid-cols-[1fr_1.1fr] lg:gap-10", children: [
|
|
146
|
+
/* @__PURE__ */ jsxs(Stack, { gap: 3, className: "max-w-2xl", children: [
|
|
147
|
+
/* @__PURE__ */ jsx(Badge, { appearance: "outline", icon: /* @__PURE__ */ jsx(Icon, { name: "lock", className: "text-sm" }), children: "Private operations, made legible" }),
|
|
148
|
+
/* @__PURE__ */ jsx(
|
|
149
|
+
TextReveal,
|
|
150
|
+
{
|
|
151
|
+
as: "h1",
|
|
152
|
+
text: "A calmer command center for high-trust work",
|
|
153
|
+
className: "text-balance text-display-lg sm:text-display-2xl",
|
|
154
|
+
once: true
|
|
155
|
+
}
|
|
156
|
+
),
|
|
157
|
+
/* @__PURE__ */ jsx("p", { className: "max-w-(--measure-prose) text-body-lg text-muted-foreground", children: "Cove gives teams a polished front door and a serious operating surface: approvals, signals, records, and handoffs in one understandable flow." }),
|
|
158
|
+
/* @__PURE__ */ jsxs(Row, { gap: 2, wrap: true, className: "pt-3", children: [
|
|
159
|
+
/* @__PURE__ */ jsx(Button, { size: "cta", render: /* @__PURE__ */ jsx("a", { href: "/demo" }), children: "Book a walkthrough" }),
|
|
160
|
+
/* @__PURE__ */ jsx(Button, { size: "cta", variant: "outline", render: /* @__PURE__ */ jsx("a", { href: "#platform" }), children: "Explore the platform" })
|
|
161
|
+
] })
|
|
162
|
+
] }),
|
|
163
|
+
/* @__PURE__ */ jsx("div", { className: "dark", "aria-hidden": true, inert: true, children: /* @__PURE__ */ jsx("div", { className: "overflow-hidden rounded-xl border border-border-floating bg-popover p-3 text-popover-foreground shadow-xl", children: /* @__PURE__ */ jsxs("div", { className: "rounded-concentric-xl/3 border border-border bg-card", children: [
|
|
164
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between border-b border-border px-4 py-3", children: [
|
|
165
|
+
/* @__PURE__ */ jsxs(Row, { gap: 1, children: [
|
|
166
|
+
/* @__PURE__ */ jsx(StatusDot, { tone: "warning" }),
|
|
167
|
+
/* @__PURE__ */ jsx(StatusDot, { tone: "edition" }),
|
|
168
|
+
/* @__PURE__ */ jsx(StatusDot, { tone: "success" })
|
|
169
|
+
] }),
|
|
170
|
+
/* @__PURE__ */ jsx("span", { className: "text-label-sm text-muted-foreground", children: "Live workspace" })
|
|
171
|
+
] }),
|
|
172
|
+
/* @__PURE__ */ jsxs("div", { className: "grid gap-3 p-3 md:grid-cols-[0.7fr_1.3fr]", children: [
|
|
173
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-3 max-md:hidden", children: [
|
|
174
|
+
/* @__PURE__ */ jsxs("div", { className: "rounded-concentric-xl/6 border border-border bg-background p-4", children: [
|
|
175
|
+
/* @__PURE__ */ jsx("p", { className: "text-label-sm text-muted-foreground", children: "Spaces" }),
|
|
176
|
+
/* @__PURE__ */ jsx("div", { className: "mt-4 space-y-2", children: spaces.map((space) => /* @__PURE__ */ jsxs("div", { className: "rounded-concentric-xl/10 bg-card p-3", children: [
|
|
177
|
+
/* @__PURE__ */ jsxs(Row, { justify: "between", children: [
|
|
178
|
+
/* @__PURE__ */ jsx("span", { className: "text-title-sm", children: space.name }),
|
|
179
|
+
/* @__PURE__ */ jsx("span", { className: "text-mono-sm", children: space.value })
|
|
180
|
+
] }),
|
|
181
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 text-body-xs text-muted-foreground", children: space.label })
|
|
182
|
+
] }, space.name)) })
|
|
183
|
+
] }),
|
|
184
|
+
/* @__PURE__ */ jsxs("div", { className: "rounded-concentric-xl/6 border border-border bg-background p-4", children: [
|
|
185
|
+
/* @__PURE__ */ jsxs(Row, { justify: "between", children: [
|
|
186
|
+
/* @__PURE__ */ jsx("span", { className: "text-title-sm", children: "Route status" }),
|
|
187
|
+
/* @__PURE__ */ jsx(Badge, { tone: "success", size: "sm", dot: true, children: "Healthy" })
|
|
188
|
+
] }),
|
|
189
|
+
/* @__PURE__ */ jsx("div", { className: "mt-4 space-y-2", children: routes.map((route) => /* @__PURE__ */ jsxs(Row, { justify: "between", className: "rounded-full bg-card px-3 py-2", children: [
|
|
190
|
+
/* @__PURE__ */ jsxs(Row, { gap: 1, children: [
|
|
191
|
+
/* @__PURE__ */ jsx(StatusDot, { tone: route.tone }),
|
|
192
|
+
/* @__PURE__ */ jsx("span", { className: "text-body-sm", children: route.label })
|
|
193
|
+
] }),
|
|
194
|
+
/* @__PURE__ */ jsx("span", { className: "text-label-sm text-muted-foreground", children: route.state })
|
|
195
|
+
] }, route.label)) })
|
|
196
|
+
] })
|
|
197
|
+
] }),
|
|
198
|
+
/* @__PURE__ */ jsxs("div", { className: "rounded-concentric-xl/6 border border-border bg-background p-4", children: [
|
|
199
|
+
/* @__PURE__ */ jsxs(Row, { justify: "between", className: "border-b border-border pb-4", children: [
|
|
200
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
201
|
+
/* @__PURE__ */ jsx("p", { className: "text-label-sm text-muted-foreground", children: "Signal map" }),
|
|
202
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 text-heading-4 sm:text-heading-3", children: "Every approval path in view" })
|
|
203
|
+
] }),
|
|
204
|
+
/* @__PURE__ */ jsx(Button, { variant: "secondary", size: "sm", children: "Review" })
|
|
205
|
+
] }),
|
|
206
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-5 grid gap-4 sm:mt-6 sm:gap-5", children: [
|
|
207
|
+
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-9 items-end gap-1.5 rounded-concentric-xl/10 bg-card p-4 sm:gap-2", children: bars.map((bar) => /* @__PURE__ */ jsx("div", { className: "flex h-36 items-end sm:h-56", children: /* @__PURE__ */ jsx(
|
|
208
|
+
"div",
|
|
209
|
+
{
|
|
210
|
+
className: `w-full rounded-full ${bar.current ? "bg-success" : "bg-secondary"}`,
|
|
211
|
+
style: { height: bar.height }
|
|
212
|
+
}
|
|
213
|
+
) }, bar.week)) }),
|
|
214
|
+
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-3 gap-2", children: sceneMetrics.map((metric) => /* @__PURE__ */ jsxs("div", { className: "rounded-concentric-xl/10 border border-border bg-card p-3", children: [
|
|
215
|
+
/* @__PURE__ */ jsx("p", { className: "truncate text-label-sm text-muted-foreground", children: metric.label }),
|
|
216
|
+
/* @__PURE__ */ jsx("p", { className: "mt-2 text-heading-4 sm:text-heading-3", children: metric.value }),
|
|
217
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 text-body-xs text-muted-foreground max-sm:hidden", children: metric.detail })
|
|
218
|
+
] }, metric.label)) })
|
|
219
|
+
] })
|
|
220
|
+
] })
|
|
221
|
+
] })
|
|
222
|
+
] }) }) })
|
|
223
|
+
] }) }),
|
|
224
|
+
/* @__PURE__ */ jsx("section", { id: "platform", "aria-labelledby": "brand-platform-title", className: "border-y border-border bg-muted/40 py-20 lg:py-28", children: /* @__PURE__ */ jsx(Region, { max: "wide", children: /* @__PURE__ */ jsxs(Stack, { gap: 6, children: [
|
|
225
|
+
/* @__PURE__ */ jsxs(Stack, { gap: 2, className: "max-w-2xl", children: [
|
|
226
|
+
/* @__PURE__ */ jsx("p", { className: "text-overline text-muted-foreground", children: "Why Cove" }),
|
|
227
|
+
/* @__PURE__ */ jsx("h2", { id: "brand-platform-title", className: "text-balance text-heading-1", children: "One private workspace for the decisions that matter." }),
|
|
228
|
+
/* @__PURE__ */ jsx("p", { className: "max-w-(--measure-prose) text-body-lg text-muted-foreground", children: "Most operations work lives in threads, spreadsheets, and memory. Cove gives it a home: every request routed, every signal visible, every outcome on the record." })
|
|
229
|
+
] }),
|
|
230
|
+
/* @__PURE__ */ jsx(Reveal, { children: /* @__PURE__ */ jsx(Grid, { minItemWidth: "calc(var(--spacing) * 64)", gap: 2, children: values.map((value) => /* @__PURE__ */ jsx(Card, { render: /* @__PURE__ */ jsx("article", {}), className: "h-full", children: /* @__PURE__ */ jsxs(CardContent, { className: "flex flex-col gap-2", children: [
|
|
231
|
+
/* @__PURE__ */ jsx("span", { className: "mb-4 grid size-11 place-items-center rounded-md border border-border sable-well", children: /* @__PURE__ */ jsx(Icon, { name: value.icon, className: "text-xl" }) }),
|
|
232
|
+
/* @__PURE__ */ jsx("h3", { className: "text-title-lg", children: value.title }),
|
|
233
|
+
/* @__PURE__ */ jsx("p", { className: "text-body-sm text-muted-foreground", children: value.body })
|
|
234
|
+
] }) }, value.title)) }) })
|
|
235
|
+
] }) }) }),
|
|
236
|
+
/* @__PURE__ */ jsx(Region, { as: "section", id: "how-it-works", "aria-labelledby": "brand-steps-title", max: "wide", className: "py-20 lg:py-28", children: /* @__PURE__ */ jsxs("div", { className: "grid gap-12 lg:grid-cols-[1fr_2fr] lg:gap-16", children: [
|
|
237
|
+
/* @__PURE__ */ jsxs(Stack, { gap: 2, className: "max-w-md", children: [
|
|
238
|
+
/* @__PURE__ */ jsx("p", { className: "text-overline text-muted-foreground", children: "How it works" }),
|
|
239
|
+
/* @__PURE__ */ jsx("h2", { id: "brand-steps-title", className: "text-balance text-heading-1", children: "From request to sealed record." }),
|
|
240
|
+
/* @__PURE__ */ jsx("p", { className: "text-body-md text-muted-foreground", children: "Teams are usually live within a week. Cove adapts to the routes you already run instead of asking you to start over." }),
|
|
241
|
+
/* @__PURE__ */ jsx("div", { className: "pt-3", children: /* @__PURE__ */ jsx(Button, { variant: "outline", iconEnd: /* @__PURE__ */ jsx(Icon, { name: "arrow-right" }), render: /* @__PURE__ */ jsx("a", { href: "/guides/rollout" }), children: "Read the rollout guide" }) })
|
|
242
|
+
] }),
|
|
243
|
+
/* @__PURE__ */ jsx("ol", { className: "grid gap-10 sm:grid-cols-3 sm:gap-6", children: steps.map((step) => /* @__PURE__ */ jsxs("li", { className: "flex flex-col gap-2 border-t border-border-strong pt-6", children: [
|
|
244
|
+
/* @__PURE__ */ jsx("span", { className: "text-mono-sm text-muted-foreground", children: step.number }),
|
|
245
|
+
/* @__PURE__ */ jsx("h3", { className: "mt-3 text-title-lg sm:mt-6", children: step.title }),
|
|
246
|
+
/* @__PURE__ */ jsx("p", { className: "text-body-sm text-muted-foreground", children: step.body })
|
|
247
|
+
] }, step.number)) })
|
|
248
|
+
] }) }),
|
|
249
|
+
/* @__PURE__ */ jsx(Region, { as: "section", id: "customers", "aria-label": "Customer story", max: "wide", className: "pb-20 lg:pb-28", children: /* @__PURE__ */ jsx(Card, { render: /* @__PURE__ */ jsx("figure", {}), children: /* @__PURE__ */ jsxs("div", { className: "grid lg:grid-cols-[1.5fr_1fr]", children: [
|
|
250
|
+
/* @__PURE__ */ jsxs(CardContent, { className: "flex flex-col justify-between gap-10 sm:p-10", children: [
|
|
251
|
+
/* @__PURE__ */ jsxs(Stack, { gap: 3, children: [
|
|
252
|
+
/* @__PURE__ */ jsx("p", { className: "text-overline text-muted-foreground", children: "Customer story" }),
|
|
253
|
+
/* @__PURE__ */ jsx("blockquote", { className: "text-balance text-heading-3 sm:text-heading-2", children: "\u201CWe used to chase approvals across four tools. Now every request has an owner, a deadline, and a record, and our auditors stopped asking for screenshots.\u201D" })
|
|
254
|
+
] }),
|
|
255
|
+
/* @__PURE__ */ jsxs("figcaption", { className: "flex items-center gap-3", children: [
|
|
256
|
+
/* @__PURE__ */ jsx(Avatar, { variant: "art", size: "lg", fallback: "MO" }),
|
|
257
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
258
|
+
/* @__PURE__ */ jsx("p", { className: "text-title-sm", children: "Maya Okafor" }),
|
|
259
|
+
/* @__PURE__ */ jsx("p", { className: "text-body-sm text-muted-foreground", children: "Head of operations, Fielddesk" })
|
|
260
|
+
] })
|
|
261
|
+
] })
|
|
262
|
+
] }),
|
|
263
|
+
/* @__PURE__ */ jsx("div", { className: "border-border max-lg:border-t lg:border-s", children: /* @__PURE__ */ jsx(CardContent, { className: "flex h-full flex-col justify-center gap-6 sm:p-10", children: outcomes.map((outcome, index) => /* @__PURE__ */ jsxs(Stack, { gap: 3, children: [
|
|
264
|
+
index > 0 && /* @__PURE__ */ jsx(Separator, {}),
|
|
265
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
266
|
+
/* @__PURE__ */ jsx("p", { className: "text-heading-1 sm:text-display-lg", children: outcome.value }),
|
|
267
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 text-body-sm text-muted-foreground", children: outcome.label })
|
|
268
|
+
] })
|
|
269
|
+
] }, outcome.label)) }) })
|
|
270
|
+
] }) }) }),
|
|
271
|
+
/* @__PURE__ */ jsx(Region, { as: "section", "aria-labelledby": "brand-cta-title", max: "wide", className: "pb-20 lg:pb-28", children: /* @__PURE__ */ jsx("div", { className: "dark", children: /* @__PURE__ */ jsx("div", { className: "rounded-xl border border-border bg-card px-6 py-12 text-card-foreground sm:px-12 sm:py-16", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-8 lg:flex-row lg:items-end lg:justify-between", children: [
|
|
272
|
+
/* @__PURE__ */ jsxs(Stack, { gap: 3, className: "max-w-2xl", children: [
|
|
273
|
+
/* @__PURE__ */ jsx("h2", { id: "brand-cta-title", className: "text-balance text-heading-1", children: "See your own approval paths in Cove." }),
|
|
274
|
+
/* @__PURE__ */ jsx("p", { className: "text-body-lg text-muted-foreground", children: "A 30-minute walkthrough with your routes, your roles, and your records. No slides." })
|
|
275
|
+
] }),
|
|
276
|
+
/* @__PURE__ */ jsxs(Row, { gap: 2, wrap: true, children: [
|
|
277
|
+
/* @__PURE__ */ jsx(Button, { size: "cta", render: /* @__PURE__ */ jsx("a", { href: "/demo" }), children: "Book a walkthrough" }),
|
|
278
|
+
/* @__PURE__ */ jsx(Button, { size: "cta", variant: "ghost", render: /* @__PURE__ */ jsx("a", { href: "/pricing" }), children: "View pricing" })
|
|
279
|
+
] })
|
|
280
|
+
] }) }) }) })
|
|
281
|
+
] }),
|
|
282
|
+
/* @__PURE__ */ jsx("footer", { className: "border-t border-border bg-muted/35", children: /* @__PURE__ */ jsxs(Region, { max: "wide", className: "py-12 sm:py-16", children: [
|
|
283
|
+
/* @__PURE__ */ jsxs("div", { className: "grid gap-10 lg:grid-cols-[1fr_1.35fr_1fr] lg:gap-8", children: [
|
|
284
|
+
/* @__PURE__ */ jsxs(Stack, { gap: 4, className: "max-w-sm", children: [
|
|
285
|
+
/* @__PURE__ */ jsxs("a", { href: "/", className: "flex w-fit items-center gap-2 rounded-full motion-interactive motion-press", children: [
|
|
286
|
+
/* @__PURE__ */ jsx("span", { className: "grid size-9 place-items-center rounded-full bg-primary text-primary-foreground", children: /* @__PURE__ */ jsx(Icon, { name: "sparkles", className: "text-sm" }) }),
|
|
287
|
+
/* @__PURE__ */ jsx("span", { className: "text-title-lg", children: "Cove" })
|
|
288
|
+
] }),
|
|
289
|
+
/* @__PURE__ */ jsx("p", { className: "text-body-sm text-muted-foreground", children: "A calm operating surface for teams that need trust, speed, and context without the noise." }),
|
|
290
|
+
/* @__PURE__ */ jsx(Badge, { appearance: "plain", tone: "success", dot: true, children: "All systems normal" })
|
|
291
|
+
] }),
|
|
292
|
+
/* @__PURE__ */ jsx("nav", { "aria-label": "Footer", className: "grid grid-cols-3 gap-6", children: footerGroups.map((group) => /* @__PURE__ */ jsxs("div", { children: [
|
|
293
|
+
/* @__PURE__ */ jsx("h2", { className: "text-label-md", children: group.title }),
|
|
294
|
+
/* @__PURE__ */ jsx("ul", { className: "mt-3 space-y-1", children: group.links.map((link) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(
|
|
295
|
+
"a",
|
|
296
|
+
{
|
|
297
|
+
href: link.href,
|
|
298
|
+
className: "flex min-h-9 items-center text-body-sm text-muted-foreground motion-interactive hover:text-foreground",
|
|
299
|
+
children: link.label
|
|
300
|
+
}
|
|
301
|
+
) }, link.label)) })
|
|
302
|
+
] }, group.title)) }),
|
|
303
|
+
/* @__PURE__ */ jsxs(Card, { className: "h-fit", children: [
|
|
304
|
+
/* @__PURE__ */ jsxs(CardHeader, { children: [
|
|
305
|
+
/* @__PURE__ */ jsx(CardTitle, { children: /* @__PURE__ */ jsx("h2", { children: "The Cove digest" }) }),
|
|
306
|
+
/* @__PURE__ */ jsx(CardDescription, { children: "One note a month on trusted workflows and product releases." })
|
|
307
|
+
] }),
|
|
308
|
+
/* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsxs("form", { action: "/newsletter", className: "grid gap-2 sm:grid-cols-[1fr_auto]", children: [
|
|
309
|
+
/* @__PURE__ */ jsx("label", { htmlFor: "brand-footer-email", className: "sr-only", children: "Work email" }),
|
|
310
|
+
/* @__PURE__ */ jsx(
|
|
311
|
+
Input,
|
|
312
|
+
{
|
|
313
|
+
id: "brand-footer-email",
|
|
314
|
+
name: "email",
|
|
315
|
+
type: "email",
|
|
316
|
+
autoComplete: "email",
|
|
317
|
+
placeholder: "you@company.com"
|
|
318
|
+
}
|
|
319
|
+
),
|
|
320
|
+
/* @__PURE__ */ jsx(Button, { type: "submit", className: "w-full sm:w-auto", children: "Subscribe" })
|
|
321
|
+
] }) })
|
|
322
|
+
] })
|
|
323
|
+
] }),
|
|
324
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-12 flex flex-col gap-3 border-t border-border pt-6 text-caption text-muted-foreground sm:flex-row sm:items-center sm:justify-between", children: [
|
|
325
|
+
/* @__PURE__ */ jsx("p", { children: "\xA9 2026 Cove. All rights reserved." }),
|
|
326
|
+
/* @__PURE__ */ jsx(Row, { gap: 4, wrap: true, children: legalLinks.map((link) => /* @__PURE__ */ jsx(
|
|
327
|
+
"a",
|
|
328
|
+
{
|
|
329
|
+
href: link.href,
|
|
330
|
+
className: "flex min-h-9 min-w-9 items-center motion-interactive hover:text-foreground",
|
|
331
|
+
children: link.label
|
|
332
|
+
},
|
|
333
|
+
link.label
|
|
334
|
+
)) })
|
|
335
|
+
] })
|
|
336
|
+
] }) })
|
|
337
|
+
] });
|
|
338
|
+
}
|
|
339
|
+
export {
|
|
340
|
+
BrandLandingPage
|
|
341
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// src/patterns/brand-landing-page.meta.ts
|
|
2
|
+
var brandLandingPageMeta = {
|
|
3
|
+
name: "BrandLandingPage",
|
|
4
|
+
summary: "High-fidelity brand/product landing page: pill navigation, editorial hero type, a dark product scene, a value section, a how-it-works sequence, a customer story with outcomes, a closing CTA band, and a complete branded footer.",
|
|
5
|
+
intent: "Use this for a polished product marketing route that still needs to show a credible app surface. It is warmer and more tactile than the canonical LandingPage, but avoids trend-driven neon and generic hype cues.",
|
|
6
|
+
notes: [
|
|
7
|
+
"The story runs promise \u2192 product \u2192 value \u2192 process \u2192 proof \u2192 ask: hero, product scene, 'Why Cove' value cards, a three-step how-it-works list, a customer story with outcome figures, then one closing CTA. Each section adds new evidence; no number is repeated from the product scene.",
|
|
8
|
+
"One display headline owns the first viewport; supporting copy stays in body-lg at prose measure. Section headings are heading-1 under a `text-overline` eyebrow.",
|
|
9
|
+
"The nav spends one compact pill surface, with a clear brand signal and two primary paths: sign in and request access.",
|
|
10
|
+
"The product scene and the closing CTA band are dark islands: a `dark` class on the wrapper re-scopes every semantic token, so surfaces, muted ink, Badge tones and Buttons take the theme's own dark values in either page mode. Never fake a dark panel with overlay ink at reduced opacity \u2014 status tones tuned for a light page vanish on it.",
|
|
11
|
+
"The scene is a picture of the product: `aria-hidden` + `inert` keep its sample button and figures out of the tab order and the outline. On narrow screens it drops the side column and keeps the signal map, so it scales instead of stacking into a second page.",
|
|
12
|
+
"The chart keeps past weeks on the quiet `secondary` fill and gives the current week the one accent, so the signal reads at a glance.",
|
|
13
|
+
"Value cards are real Cards with a neutral `sable-well` icon tile; the customer story is a Card rendered as a figure, with outcome figures split by Separator. The scene's nested panels take `rounded-concentric-xl/<inset>` from the shell's radius, so the corners stay parallel at any radius preset.",
|
|
14
|
+
"The footer closes the page with brand reassurance, a plain status Badge, a three-column sitemap (three columns at every width), a digest signup, and legal links.",
|
|
15
|
+
"All figures, names and the testimonial are sample content; replace them with real, verifiable claims."
|
|
16
|
+
],
|
|
17
|
+
a11y: [
|
|
18
|
+
"The brand nav is a labeled nav landmark with real links and visible text.",
|
|
19
|
+
"Each content section is a labelled region (by its h2, or aria-label for the customer story); the decorative product scene is hidden from assistive tech and inert.",
|
|
20
|
+
"The how-it-works steps are an ordered list; the testimonial is a figure with a blockquote and a figcaption naming the speaker.",
|
|
21
|
+
"The footer is a real footer landmark with a labeled footer nav, visible link text, and a labeled email field.",
|
|
22
|
+
"TextReveal preserves the full headline as one accessible label and honors reduced-motion policy; Reveal shows the value cards immediately when motion is off.",
|
|
23
|
+
"Status dots and the status Badge are paired with visible text labels so color is never the only signal."
|
|
24
|
+
]
|
|
25
|
+
};
|
|
26
|
+
export {
|
|
27
|
+
brandLandingPageMeta
|
|
28
|
+
};
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
// src/patterns/chat-panel.tsx
|
|
2
|
+
import { Icon } from "../icon/index.js";
|
|
3
|
+
import { Attachment } from "../components/attachment/index.js";
|
|
4
|
+
import { Avatar } from "../components/avatar/index.js";
|
|
5
|
+
import { Bubble } from "../components/bubble/index.js";
|
|
6
|
+
import { Button } from "../components/button/index.js";
|
|
7
|
+
import {
|
|
8
|
+
Card,
|
|
9
|
+
CardAction,
|
|
10
|
+
CardDescription,
|
|
11
|
+
CardFooter,
|
|
12
|
+
CardHeader,
|
|
13
|
+
CardTitle
|
|
14
|
+
} from "../components/card/index.js";
|
|
15
|
+
import { ChatComposer } from "../components/chat-composer/index.js";
|
|
16
|
+
import { CodeBlock } from "../components/code-block/index.js";
|
|
17
|
+
import { Marker } from "../components/marker/index.js";
|
|
18
|
+
import { MenuRadioGroup, MenuRadioItem } from "../components/menu/index.js";
|
|
19
|
+
import { Message } from "../components/message/index.js";
|
|
20
|
+
import { MessageScroller } from "../components/message-scroller/index.js";
|
|
21
|
+
import { SettingsMenu, SettingsRow } from "../components/settings-menu/index.js";
|
|
22
|
+
import { StreamingText } from "../components/streaming-text/index.js";
|
|
23
|
+
import { Toolbar, ToolbarButton } from "../components/toolbar/index.js";
|
|
24
|
+
import { SimpleTooltip } from "../components/tooltip/index.js";
|
|
25
|
+
import { Page } from "../layout/index.js";
|
|
26
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
27
|
+
var pending = true;
|
|
28
|
+
var streamed = "Yes, appends are already safe: your layout effect measures before paint. The jump is on the prepend path, which reads scrollHeight after the new rows";
|
|
29
|
+
var turns = [
|
|
30
|
+
{
|
|
31
|
+
id: "t_01",
|
|
32
|
+
mine: true,
|
|
33
|
+
body: "Our chat scroll jumps every time older messages load. What are we doing wrong?"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
id: "t_02",
|
|
37
|
+
mine: false,
|
|
38
|
+
step: "Read message-scroller.md",
|
|
39
|
+
body: "Almost always the anchor. If you preserve the scroll position by measuring the container, prepending history moves everything under the reader."
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
id: "t_03",
|
|
43
|
+
mine: false,
|
|
44
|
+
body: "Anchor on the oldest rendered message instead and add back however far it moved. Appends leave it alone, so the same rule covers both."
|
|
45
|
+
}
|
|
46
|
+
];
|
|
47
|
+
function ChatPanel() {
|
|
48
|
+
const assistant = /* @__PURE__ */ jsx(
|
|
49
|
+
Avatar,
|
|
50
|
+
{
|
|
51
|
+
variant: "art",
|
|
52
|
+
size: "sm",
|
|
53
|
+
alt: "Assistant",
|
|
54
|
+
fallback: /* @__PURE__ */ jsx(Icon, { name: "sparkles", className: "text-base" })
|
|
55
|
+
}
|
|
56
|
+
);
|
|
57
|
+
return /* @__PURE__ */ jsx(Page, { as: "main", max: "feed", gap: 0, className: "py-6", children: /* @__PURE__ */ jsxs(
|
|
58
|
+
Card,
|
|
59
|
+
{
|
|
60
|
+
render: /* @__PURE__ */ jsx("section", { "aria-labelledby": "chat-title" }),
|
|
61
|
+
className: "flex h-[calc(100dvh_-_--spacing(12))] flex-col overflow-hidden",
|
|
62
|
+
children: [
|
|
63
|
+
/* @__PURE__ */ jsxs(CardHeader, { className: "border-b border-border pb-(--card-p)", children: [
|
|
64
|
+
/* @__PURE__ */ jsx(CardTitle, { children: /* @__PURE__ */ jsx("h1", { id: "chat-title", children: "Scroll behaviour" }) }),
|
|
65
|
+
/* @__PURE__ */ jsx(CardDescription, { children: "Assistant \xB7 answers from your team's docs" }),
|
|
66
|
+
/* @__PURE__ */ jsx(CardAction, { children: /* @__PURE__ */ jsxs(Button, { variant: "ghost", size: "sm", children: [
|
|
67
|
+
/* @__PURE__ */ jsx(Icon, { name: "edit" }),
|
|
68
|
+
"New chat"
|
|
69
|
+
] }) })
|
|
70
|
+
] }),
|
|
71
|
+
/* @__PURE__ */ jsxs(MessageScroller, { className: "min-h-0 flex-1 p-(--card-p)", children: [
|
|
72
|
+
/* @__PURE__ */ jsx(Marker, { variant: "separator", children: "Today" }),
|
|
73
|
+
turns.map((turn, i) => {
|
|
74
|
+
const continues = i > 0 && turns[i - 1].mine === turn.mine;
|
|
75
|
+
return /* @__PURE__ */ jsx(
|
|
76
|
+
Message,
|
|
77
|
+
{
|
|
78
|
+
messageId: turn.id,
|
|
79
|
+
align: turn.mine ? "end" : "start",
|
|
80
|
+
grouped: continues,
|
|
81
|
+
avatar: turn.mine ? void 0 : assistant,
|
|
82
|
+
header: turn.step ? /* @__PURE__ */ jsx(Marker, { variant: "note", icon: "book", className: "justify-start", children: turn.step }) : void 0,
|
|
83
|
+
children: /* @__PURE__ */ jsx(
|
|
84
|
+
Bubble,
|
|
85
|
+
{
|
|
86
|
+
variant: turn.mine ? "primary" : "muted",
|
|
87
|
+
align: turn.mine ? "end" : "start",
|
|
88
|
+
tail: !continues,
|
|
89
|
+
children: turn.body
|
|
90
|
+
}
|
|
91
|
+
)
|
|
92
|
+
},
|
|
93
|
+
turn.id
|
|
94
|
+
);
|
|
95
|
+
}),
|
|
96
|
+
/* @__PURE__ */ jsx(
|
|
97
|
+
Message,
|
|
98
|
+
{
|
|
99
|
+
messageId: "t_04",
|
|
100
|
+
grouped: true,
|
|
101
|
+
avatar: assistant,
|
|
102
|
+
footer: /* @__PURE__ */ jsxs(Toolbar, { "aria-label": "Answer actions", children: [
|
|
103
|
+
/* @__PURE__ */ jsx(SimpleTooltip, { content: "Copy answer", children: /* @__PURE__ */ jsx(ToolbarButton, { size: "icon-sm", "aria-label": "Copy answer", children: /* @__PURE__ */ jsx(Icon, { name: "copy" }) }) }),
|
|
104
|
+
/* @__PURE__ */ jsx(SimpleTooltip, { content: "Regenerate", children: /* @__PURE__ */ jsx(ToolbarButton, { size: "icon-sm", "aria-label": "Regenerate answer", children: /* @__PURE__ */ jsx(Icon, { name: "refresh" }) }) })
|
|
105
|
+
] }),
|
|
106
|
+
children: /* @__PURE__ */ jsxs(Bubble, { variant: "plain", className: "max-w-full", children: [
|
|
107
|
+
/* @__PURE__ */ jsx("p", { className: "text-body-md text-foreground", children: "Here is the shape of it:" }),
|
|
108
|
+
/* @__PURE__ */ jsx(
|
|
109
|
+
CodeBlock,
|
|
110
|
+
{
|
|
111
|
+
code: "const shift = anchor.offsetTop - lastTop\nif (shift !== 0) viewport.scrollTop += shift",
|
|
112
|
+
filename: "preserve.ts"
|
|
113
|
+
}
|
|
114
|
+
)
|
|
115
|
+
] })
|
|
116
|
+
}
|
|
117
|
+
),
|
|
118
|
+
/* @__PURE__ */ jsxs(Message, { messageId: "t_05", align: "end", children: [
|
|
119
|
+
/* @__PURE__ */ jsx(Bubble, { variant: "primary", align: "end", children: "Here's ours. Does the same fix cover new messages arriving?" }),
|
|
120
|
+
/* @__PURE__ */ jsx(
|
|
121
|
+
Attachment,
|
|
122
|
+
{
|
|
123
|
+
name: "scroller.tsx",
|
|
124
|
+
meta: "4.2 KB \xB7 TSX",
|
|
125
|
+
onOpen: () => void 0
|
|
126
|
+
}
|
|
127
|
+
)
|
|
128
|
+
] }),
|
|
129
|
+
/* @__PURE__ */ jsx(
|
|
130
|
+
Message,
|
|
131
|
+
{
|
|
132
|
+
messageId: "t_06",
|
|
133
|
+
avatar: assistant,
|
|
134
|
+
header: /* @__PURE__ */ jsx(Marker, { variant: "note", icon: "file", className: "justify-start", children: "Read scroller.tsx" }),
|
|
135
|
+
children: /* @__PURE__ */ jsx(Bubble, { variant: "plain", children: /* @__PURE__ */ jsx(StreamingText, { text: streamed, streaming: pending }) })
|
|
136
|
+
}
|
|
137
|
+
)
|
|
138
|
+
] }),
|
|
139
|
+
/* @__PURE__ */ jsx(CardFooter, { className: "border-t border-border pt-(--card-p)", children: /* @__PURE__ */ jsx(
|
|
140
|
+
ChatComposer,
|
|
141
|
+
{
|
|
142
|
+
className: "flex-1",
|
|
143
|
+
placeholder: "Ask a follow-up\u2026",
|
|
144
|
+
busy: pending,
|
|
145
|
+
onStop: () => void 0,
|
|
146
|
+
stopLabel: "Stop answering",
|
|
147
|
+
onAttach: () => void 0,
|
|
148
|
+
footer: "Enter to send \xB7 Shift+Enter for a new line",
|
|
149
|
+
actions: /* @__PURE__ */ jsxs(
|
|
150
|
+
SettingsMenu,
|
|
151
|
+
{
|
|
152
|
+
variant: "subtle",
|
|
153
|
+
size: "xs",
|
|
154
|
+
label: "Change model and effort",
|
|
155
|
+
summary: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
156
|
+
/* @__PURE__ */ jsx("span", { className: "text-foreground", children: "5.6 Sol" }),
|
|
157
|
+
" ",
|
|
158
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "High" })
|
|
159
|
+
] }),
|
|
160
|
+
children: [
|
|
161
|
+
/* @__PURE__ */ jsx(SettingsRow, { label: "Model", value: "5.6 Sol", children: /* @__PURE__ */ jsxs(MenuRadioGroup, { defaultValue: "sol", children: [
|
|
162
|
+
/* @__PURE__ */ jsx(MenuRadioItem, { value: "sol", children: "5.6 Sol" }),
|
|
163
|
+
/* @__PURE__ */ jsx(MenuRadioItem, { value: "lite", children: "5.6 Lite" })
|
|
164
|
+
] }) }),
|
|
165
|
+
/* @__PURE__ */ jsx(SettingsRow, { label: "Effort", value: "High", children: /* @__PURE__ */ jsxs(MenuRadioGroup, { defaultValue: "high", children: [
|
|
166
|
+
/* @__PURE__ */ jsx(MenuRadioItem, { value: "low", children: "Low" }),
|
|
167
|
+
/* @__PURE__ */ jsx(MenuRadioItem, { value: "standard", children: "Standard" }),
|
|
168
|
+
/* @__PURE__ */ jsx(MenuRadioItem, { value: "high", children: "High" })
|
|
169
|
+
] }) }),
|
|
170
|
+
/* @__PURE__ */ jsx(SettingsRow, { label: "Speed", value: "Standard", children: /* @__PURE__ */ jsxs(MenuRadioGroup, { defaultValue: "standard", children: [
|
|
171
|
+
/* @__PURE__ */ jsx(MenuRadioItem, { value: "standard", children: "Standard" }),
|
|
172
|
+
/* @__PURE__ */ jsx(MenuRadioItem, { value: "priority", children: "Priority" })
|
|
173
|
+
] }) })
|
|
174
|
+
]
|
|
175
|
+
}
|
|
176
|
+
)
|
|
177
|
+
}
|
|
178
|
+
) })
|
|
179
|
+
]
|
|
180
|
+
}
|
|
181
|
+
) });
|
|
182
|
+
}
|
|
183
|
+
export {
|
|
184
|
+
ChatPanel
|
|
185
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// src/patterns/chat-panel.meta.ts
|
|
2
|
+
var chatPanelMeta = {
|
|
3
|
+
name: "ChatPanel",
|
|
4
|
+
summary: "A full-height conversation surface: titled header, scrolling transcript, and a composer pinned to the bottom \u2014 the assembled shape of an AI assistant, a support thread, or a DM.",
|
|
5
|
+
intent: "Reach for this for any conversation that owns its screen \u2014 an assistant, a support inbox thread, a DM. Not for a chat docked beside other work (compose the same three parts inside a Sheet or a PanelGroup instead), and not for a comment thread under an article, which is a FeedPage concern.",
|
|
6
|
+
notes: [
|
|
7
|
+
"The panel is a fixed-height column, not a growing page. `h-[calc(100dvh_-_--spacing(12))]` on the Card (the viewport minus the Page's py-6, in spacing units so density moves both together \u2014 a fixed `3rem` drifts the moment density moves the padding) and `flex-1 min-h-0` on the MessageScroller are what make the transcript scroll instead of the document \u2014 the single most common thing to get wrong here, and it fails by pushing the composer off the bottom of the screen.",
|
|
8
|
+
"The panel is a Card, not a hand-built bordered section: CardHeader (title, description, CardAction), the MessageScroller and a CardFooter all inset by the card's own `--card-p`, so the three regions share one edge at any card density.",
|
|
9
|
+
"`dvh` rather than `vh`: on mobile the URL bar collapses, and a `vh`-sized panel puts the composer under it exactly when someone is trying to type.",
|
|
10
|
+
"Region cap is `feed` (640px) \u2014 a conversation is a reading column, and the Bubble measure cap is tuned to the same assumption.",
|
|
11
|
+
"The composer sits outside the scroll region, in a bordered CardFooter, so it stays put while the transcript moves.",
|
|
12
|
+
"Grouping is derived from the data (`turns[i - 1].mine === turn.mine`) rather than hand-set, and the tail is dropped on continuations \u2014 that pairing is what makes a run read as one block.",
|
|
13
|
+
'What the assistant did before answering \u2014 a doc it read, a tool it ran \u2014 is a `Marker variant="note"` in that message\'s `header`, so it reads as part of the turn rather than as an event between turns.',
|
|
14
|
+
'The assistant\'s long-form answer uses `variant="plain"` and continues the same grouped run. A tinted box around a code block reads as a quote rather than as a turn. A plain Bubble sizes to its content with no measure cap, so it takes `max-w-full` here: bounded by the column, a wide code line scrolls inside the CodeBlock instead of pushing the transcript sideways on a phone.',
|
|
15
|
+
"A settled answer carries its actions (copy, regenerate) in the Message `footer` as a `Toolbar` of icon `ToolbarButton`s with tooltips \u2014 one tab stop, arrow keys between them. The answer still streaming has none: there is nothing to copy or regenerate until it settles, and Stop lives in the composer.",
|
|
16
|
+
"One turn, one Message: the reader's question and the file it refers to stack inside a single end-aligned Message rather than being sent as two.",
|
|
17
|
+
'Assistant turns share one Avatar with a glyph fallback and `alt="Assistant"` \u2014 initials like "AI" read as a person, and a fallback-only avatar is otherwise unnamed.',
|
|
18
|
+
"The answer in flight is a `StreamingText` in a `plain` Bubble, and ONE `pending` flag drives both it and the composer's `busy`. They are the same wait reported at the two ends of the panel; letting them drift gives you a composer still saying 'sending' under an answer that already finished.",
|
|
19
|
+
"A spinner `Marker` (or `ThinkingOrb`) belongs BEFORE the first token and is replaced once tokens land, not kept alongside. Two indicators for one wait read as two things happening \u2014 which is also why `StreamingText` takes `caret={false}` when something adjacent already reports it.",
|
|
20
|
+
'MessageScroller needs no configuring for this: it re-follows on "a message grew" (ResizeObserver) as well as "a message arrived", so the newest token stays pinned while a reader who has scrolled up is left alone.',
|
|
21
|
+
"For a new thread, swap the transcript's children for an `<EmptyState>` inside the same MessageScroller \u2014 the panel, header and composer are unchanged, which is the point of keeping them separate."
|
|
22
|
+
],
|
|
23
|
+
a11y: [
|
|
24
|
+
"The panel header's title is the page's <h1> (an h1 inside CardTitle, which carries the type); the transcript is a scroll region with native overflow, so keyboard scrolling works unchanged.",
|
|
25
|
+
"The answer in flight carries `aria-busy` rather than sitting in a live region. That is deliberate: a live region around streamed text announces every token, which is unusable. Announce once when the turn settles, from whatever owns the turn \u2014 the incomplete state is still exposed, just not narrated.",
|
|
26
|
+
'The composer is a real <form> whose Enter handling skips IME composition, and every icon-only control in the panel carries an accessible label \u2014 the answer actions also carry a tooltip, and the stop control is named for what it stops (`stopLabel="Stop answering"`).'
|
|
27
|
+
]
|
|
28
|
+
};
|
|
29
|
+
export {
|
|
30
|
+
chatPanelMeta
|
|
31
|
+
};
|