@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,332 @@
|
|
|
1
|
+
// src/patterns/dashboard-page.tsx
|
|
2
|
+
import { Icon } from "../icon/index.js";
|
|
3
|
+
import { AppHeader } from "../components/app-header/index.js";
|
|
4
|
+
import { AppShell } from "../components/app-shell/index.js";
|
|
5
|
+
import { Avatar } from "../components/avatar/index.js";
|
|
6
|
+
import { Badge } from "../components/badge/index.js";
|
|
7
|
+
import { BottomNav, BottomNavItem } from "../components/bottom-nav/index.js";
|
|
8
|
+
import { Button } from "../components/button/index.js";
|
|
9
|
+
import {
|
|
10
|
+
Card,
|
|
11
|
+
CardAction,
|
|
12
|
+
CardContent,
|
|
13
|
+
CardDescription,
|
|
14
|
+
CardFooter,
|
|
15
|
+
CardHeader,
|
|
16
|
+
CardList,
|
|
17
|
+
CardTitle
|
|
18
|
+
} from "../components/card/index.js";
|
|
19
|
+
import { DataTable } from "../components/data-table/index.js";
|
|
20
|
+
import { OverflowMenu } from "../components/overflow-menu/index.js";
|
|
21
|
+
import { Entity } from "../components/entity/index.js";
|
|
22
|
+
import { MenuItem, MenuSeparator } from "../components/menu/index.js";
|
|
23
|
+
import { Meter } from "../components/meter/index.js";
|
|
24
|
+
import { NotificationBadge } from "../components/notification-badge/index.js";
|
|
25
|
+
import { PageHeader } from "../components/page-header/index.js";
|
|
26
|
+
import { RelativeTime } from "../components/relative-time/index.js";
|
|
27
|
+
import {
|
|
28
|
+
Sidebar,
|
|
29
|
+
SidebarFooter,
|
|
30
|
+
SidebarBrand,
|
|
31
|
+
SidebarHeader,
|
|
32
|
+
SidebarItem,
|
|
33
|
+
SidebarNav
|
|
34
|
+
} from "../components/sidebar/index.js";
|
|
35
|
+
import { Grid, Page, Row, Stack } from "../layout/index.js";
|
|
36
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
37
|
+
var STATUS_TONE = { live: "success", scheduled: "info", "sold-out": "edition", closed: "neutral" };
|
|
38
|
+
var STATUS_LABEL = { live: "Live", scheduled: "Scheduled", "sold-out": "Sold out", closed: "Closed" };
|
|
39
|
+
var MIN = 60 * 1e3;
|
|
40
|
+
var HOUR = 60 * MIN;
|
|
41
|
+
var DAY = 24 * HOUR;
|
|
42
|
+
var usd = new Intl.NumberFormat("en-US", { style: "currency", currency: "USD", maximumFractionDigits: 0 });
|
|
43
|
+
var usdCents = new Intl.NumberFormat("en-US", { style: "currency", currency: "USD" });
|
|
44
|
+
var shortDate = (offset) => new Date(Date.now() + offset).toLocaleDateString("en-US", { month: "short", day: "numeric" });
|
|
45
|
+
var stats = [
|
|
46
|
+
{ label: "Revenue", value: "$18,240", delta: "+8.2%", up: true, note: "vs. $16,857" },
|
|
47
|
+
{ label: "Collects", value: "1,284", delta: "+3.1%", up: true, note: "182 first-time" },
|
|
48
|
+
{ label: "Collectors", value: "312", delta: "+12.4%", up: true, note: "Best month yet" },
|
|
49
|
+
{ label: "Sell-through", value: "64%", delta: "\u22121.8%", up: false, note: "6 open editions" }
|
|
50
|
+
];
|
|
51
|
+
var editions = [
|
|
52
|
+
{ id: "ed_01", title: "Gold Rush", status: "live", sold: 184, supply: 250, price: 48, released: -6 * DAY },
|
|
53
|
+
{ id: "ed_02", title: "Quiet Harbor", status: "sold-out", sold: 100, supply: 100, price: 120, released: -19 * DAY },
|
|
54
|
+
{ id: "ed_03", title: "Dusk, no. 4", status: "live", sold: 61, supply: 150, price: 64, released: -2 * DAY },
|
|
55
|
+
{ id: "ed_04", title: "Tidewater", status: "live", sold: 212, supply: 300, price: 36, released: -27 * DAY },
|
|
56
|
+
{ id: "ed_05", title: "Salt Study", status: "closed", sold: 38, supply: 75, price: 90, released: -44 * DAY },
|
|
57
|
+
{ id: "ed_06", title: "Paper Moon", status: "sold-out", sold: 50, supply: 50, price: 220, released: -58 * DAY },
|
|
58
|
+
{ id: "ed_07", title: "Night Signal", status: "scheduled", sold: 0, supply: 200, price: 56, released: 3 * DAY },
|
|
59
|
+
{ id: "ed_08", title: "Low Tide, Blue", status: "closed", sold: 72, supply: 120, price: 42, released: -71 * DAY },
|
|
60
|
+
{ id: "ed_09", title: "Ember Field", status: "sold-out", sold: 80, supply: 80, price: 140, released: -86 * DAY }
|
|
61
|
+
];
|
|
62
|
+
var editionCount = 24;
|
|
63
|
+
var payout = {
|
|
64
|
+
amount: 8214.6,
|
|
65
|
+
date: 5 * DAY,
|
|
66
|
+
lines: [
|
|
67
|
+
{ label: "Sales", value: 9127.33 },
|
|
68
|
+
{ label: "Platform fee (10%)", value: -912.73 },
|
|
69
|
+
{ label: "Deposits to", value: "Checking \u2022\u20224821" }
|
|
70
|
+
]
|
|
71
|
+
};
|
|
72
|
+
var collectors = [
|
|
73
|
+
{ id: "co_01", name: "Nina Simone", handle: "@nina", initials: "NS", pieces: 14, spent: 1460 },
|
|
74
|
+
{ id: "co_02", name: "Grace Hopper", handle: "@grace", initials: "GH", pieces: 11, spent: 1128 },
|
|
75
|
+
{ id: "co_03", name: "Frida Kahlo", handle: "@frida", initials: "FK", pieces: 9, spent: 942 },
|
|
76
|
+
{ id: "co_04", name: "Mary Shelley", handle: "@mary", initials: "MS", pieces: 6, spent: 588 }
|
|
77
|
+
];
|
|
78
|
+
var upcoming = [
|
|
79
|
+
{ id: "up_01", title: "Night Signal", detail: "Edition of 200 \xB7 $56", at: 3 * DAY },
|
|
80
|
+
{ id: "up_02", title: "Tidewater, second printing", detail: "Edition of 100 \xB7 $40", at: 12 * DAY },
|
|
81
|
+
{ id: "up_03", title: "Dusk, no. 5", detail: "Edition of 150 \xB7 $64", at: 26 * DAY },
|
|
82
|
+
{ id: "up_04", title: "Quiet Harbor, artist proofs", detail: "Edition of 10 \xB7 $480", at: 34 * DAY }
|
|
83
|
+
];
|
|
84
|
+
var activity = [
|
|
85
|
+
{ id: "ac_01", who: "Nina Simone", initials: "NS", what: "collected Gold Rush \xB7 185 of 250", when: 2 * MIN },
|
|
86
|
+
{ id: "ac_02", who: "Grace Hopper", initials: "GH", what: "collected Dusk, no. 4 \xB7 61 of 150", when: 26 * MIN },
|
|
87
|
+
{ id: "ac_03", who: "Frida Kahlo", initials: "FK", what: "tipped $20 on Tidewater", when: 1 * HOUR },
|
|
88
|
+
{ id: "ac_04", who: "Mary Shelley", initials: "MS", what: "started following you", when: 3 * HOUR },
|
|
89
|
+
{ id: "ac_05", who: "Nina Simone", initials: "NS", what: "set a reminder for Night Signal", when: 6 * HOUR }
|
|
90
|
+
];
|
|
91
|
+
function DashboardPage() {
|
|
92
|
+
return /* @__PURE__ */ jsx(
|
|
93
|
+
AppShell,
|
|
94
|
+
{
|
|
95
|
+
header: /* @__PURE__ */ jsx(
|
|
96
|
+
AppHeader,
|
|
97
|
+
{
|
|
98
|
+
title: /* @__PURE__ */ jsxs(Row, { gap: 1, align: "center", children: [
|
|
99
|
+
/* @__PURE__ */ jsx(Icon, { name: "gem", variant: "solid", className: "text-xl" }),
|
|
100
|
+
/* @__PURE__ */ jsx("span", { className: "text-title-sm", children: "Atelier" })
|
|
101
|
+
] }),
|
|
102
|
+
actions: /* @__PURE__ */ jsx(Avatar, { variant: "art", size: "sm", fallback: "AL", alt: "Ada Lovelace" })
|
|
103
|
+
}
|
|
104
|
+
),
|
|
105
|
+
bottomNav: /* @__PURE__ */ jsxs(BottomNav, { "aria-label": "Primary", children: [
|
|
106
|
+
/* @__PURE__ */ jsx(BottomNavItem, { icon: /* @__PURE__ */ jsx(Icon, { name: "grid" }), label: "Overview", showLabel: true, active: true, render: /* @__PURE__ */ jsx("a", { href: "/" }) }),
|
|
107
|
+
/* @__PURE__ */ jsx(BottomNavItem, { icon: /* @__PURE__ */ jsx(Icon, { name: "image-stack" }), label: "Editions", showLabel: true, render: /* @__PURE__ */ jsx("a", { href: "/editions" }) }),
|
|
108
|
+
/* @__PURE__ */ jsx(BottomNavItem, { icon: /* @__PURE__ */ jsx(Icon, { name: "user" }), label: "Collectors", showLabel: true, render: /* @__PURE__ */ jsx("a", { href: "/collectors" }) }),
|
|
109
|
+
/* @__PURE__ */ jsx(BottomNavItem, { icon: /* @__PURE__ */ jsx(Icon, { name: "bell" }), label: "Activity", showLabel: true, render: /* @__PURE__ */ jsx("a", { href: "/activity" }) }),
|
|
110
|
+
/* @__PURE__ */ jsx(BottomNavItem, { icon: /* @__PURE__ */ jsx(Icon, { name: "gear" }), label: "Settings", showLabel: true, render: /* @__PURE__ */ jsx("a", { href: "/settings" }) })
|
|
111
|
+
] }),
|
|
112
|
+
sidebar: /* @__PURE__ */ jsxs(Sidebar, { children: [
|
|
113
|
+
/* @__PURE__ */ jsx(SidebarHeader, { children: /* @__PURE__ */ jsx(SidebarBrand, { mark: /* @__PURE__ */ jsx(Icon, { name: "gem", variant: "solid" }), label: "Atelier", render: /* @__PURE__ */ jsx("a", { href: "/" }) }) }),
|
|
114
|
+
/* @__PURE__ */ jsxs(SidebarNav, { children: [
|
|
115
|
+
/* @__PURE__ */ jsx(SidebarItem, { icon: /* @__PURE__ */ jsx(Icon, { name: "grid" }), label: "Overview", active: true, render: /* @__PURE__ */ jsx("a", { href: "/" }) }),
|
|
116
|
+
/* @__PURE__ */ jsx(SidebarItem, { icon: /* @__PURE__ */ jsx(Icon, { name: "image-stack" }), label: "Editions", render: /* @__PURE__ */ jsx("a", { href: "/editions" }) }),
|
|
117
|
+
/* @__PURE__ */ jsx(SidebarItem, { icon: /* @__PURE__ */ jsx(Icon, { name: "user" }), label: "Collectors", render: /* @__PURE__ */ jsx("a", { href: "/collectors" }) }),
|
|
118
|
+
/* @__PURE__ */ jsx(
|
|
119
|
+
SidebarItem,
|
|
120
|
+
{
|
|
121
|
+
icon: /* @__PURE__ */ jsx(Icon, { name: "bell" }),
|
|
122
|
+
label: "Activity",
|
|
123
|
+
badge: /* @__PURE__ */ jsx(NotificationBadge, { count: 4, tone: "neutral" }),
|
|
124
|
+
render: /* @__PURE__ */ jsx("a", { href: "/activity" })
|
|
125
|
+
}
|
|
126
|
+
),
|
|
127
|
+
/* @__PURE__ */ jsx(SidebarItem, { icon: /* @__PURE__ */ jsx(Icon, { name: "gear" }), label: "Settings", render: /* @__PURE__ */ jsx("a", { href: "/settings" }) })
|
|
128
|
+
] }),
|
|
129
|
+
/* @__PURE__ */ jsx(SidebarFooter, { children: /* @__PURE__ */ jsx(
|
|
130
|
+
Entity,
|
|
131
|
+
{
|
|
132
|
+
className: "[--entity-py:0]",
|
|
133
|
+
leading: /* @__PURE__ */ jsx(Avatar, { variant: "art", size: "sm", fallback: "AL", alt: "" }),
|
|
134
|
+
title: "Ada Lovelace",
|
|
135
|
+
subtitle: "@ada",
|
|
136
|
+
action: /* @__PURE__ */ jsxs(OverflowMenu, { label: "Account", size: "icon-sm", children: [
|
|
137
|
+
/* @__PURE__ */ jsx(MenuItem, { render: /* @__PURE__ */ jsx("a", { href: "/@ada" }), children: "View profile" }),
|
|
138
|
+
/* @__PURE__ */ jsx(MenuItem, { render: /* @__PURE__ */ jsx("a", { href: "/settings" }), children: "Settings" }),
|
|
139
|
+
/* @__PURE__ */ jsx(MenuSeparator, {}),
|
|
140
|
+
/* @__PURE__ */ jsx(MenuItem, { children: "Sign out" })
|
|
141
|
+
] })
|
|
142
|
+
}
|
|
143
|
+
) })
|
|
144
|
+
] }),
|
|
145
|
+
children: /* @__PURE__ */ jsxs(Page, { max: "wide", gap: 4, className: "py-6", children: [
|
|
146
|
+
/* @__PURE__ */ jsx(
|
|
147
|
+
PageHeader,
|
|
148
|
+
{
|
|
149
|
+
title: "Overview",
|
|
150
|
+
description: "Sales and collector activity for the last 30 days.",
|
|
151
|
+
actions: /* @__PURE__ */ jsxs(Row, { gap: 2, children: [
|
|
152
|
+
/* @__PURE__ */ jsxs(Button, { variant: "outline", children: [
|
|
153
|
+
/* @__PURE__ */ jsx(Icon, { name: "download" }),
|
|
154
|
+
"Export"
|
|
155
|
+
] }),
|
|
156
|
+
/* @__PURE__ */ jsxs(Button, { children: [
|
|
157
|
+
/* @__PURE__ */ jsx(Icon, { name: "plus" }),
|
|
158
|
+
"New edition"
|
|
159
|
+
] })
|
|
160
|
+
] })
|
|
161
|
+
}
|
|
162
|
+
),
|
|
163
|
+
/* @__PURE__ */ jsx(Grid, { cols: { base: 2, xl: 4 }, gap: 3, children: stats.map((stat) => /* @__PURE__ */ jsxs(Card, { children: [
|
|
164
|
+
/* @__PURE__ */ jsxs(CardHeader, { children: [
|
|
165
|
+
/* @__PURE__ */ jsx(CardDescription, { children: stat.label }),
|
|
166
|
+
/* @__PURE__ */ jsx(CardTitle, { className: "text-mono-xl", children: stat.value })
|
|
167
|
+
] }),
|
|
168
|
+
/* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsxs(Row, { gap: 1, wrap: true, children: [
|
|
169
|
+
/* @__PURE__ */ jsx(
|
|
170
|
+
Badge,
|
|
171
|
+
{
|
|
172
|
+
tone: stat.up ? "success" : "warning",
|
|
173
|
+
size: "sm",
|
|
174
|
+
icon: /* @__PURE__ */ jsx(Icon, { name: stat.up ? "arrow-up" : "arrow-down" }),
|
|
175
|
+
children: stat.delta
|
|
176
|
+
}
|
|
177
|
+
),
|
|
178
|
+
/* @__PURE__ */ jsx("span", { className: "text-caption text-muted-foreground", children: stat.note })
|
|
179
|
+
] }) })
|
|
180
|
+
] }, stat.label)) }),
|
|
181
|
+
/* @__PURE__ */ jsxs(Grid, { cols: { base: 1, xl: 3 }, gap: 3, children: [
|
|
182
|
+
/* @__PURE__ */ jsxs(Card, { className: "flex flex-col xl:col-span-2", children: [
|
|
183
|
+
/* @__PURE__ */ jsxs(CardHeader, { children: [
|
|
184
|
+
/* @__PURE__ */ jsx(CardTitle, { children: "Editions" }),
|
|
185
|
+
/* @__PURE__ */ jsx(CardDescription, { children: "Sales across your releases, newest first." })
|
|
186
|
+
] }),
|
|
187
|
+
/* @__PURE__ */ jsx(CardContent, { flush: true, className: "mt-4 flex-1", children: /* @__PURE__ */ jsx(
|
|
188
|
+
DataTable,
|
|
189
|
+
{
|
|
190
|
+
data: editions,
|
|
191
|
+
rowKey: (row) => row.id,
|
|
192
|
+
defaultSort: { key: "released", direction: "desc" },
|
|
193
|
+
columns: [
|
|
194
|
+
{ key: "title", header: "Edition", sortable: true, className: "text-label-md whitespace-nowrap" },
|
|
195
|
+
{
|
|
196
|
+
key: "status",
|
|
197
|
+
header: "Status",
|
|
198
|
+
cell: (row) => /* @__PURE__ */ jsx(Badge, { appearance: "plain", tone: STATUS_TONE[row.status], dot: true, children: STATUS_LABEL[row.status] })
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
key: "sold",
|
|
202
|
+
header: "Sold",
|
|
203
|
+
sortable: true,
|
|
204
|
+
sortValue: (row) => row.sold / row.supply,
|
|
205
|
+
cell: (row) => /* @__PURE__ */ jsxs(Row, { gap: 3, align: "center", className: "min-w-40", children: [
|
|
206
|
+
/* @__PURE__ */ jsx(
|
|
207
|
+
Meter,
|
|
208
|
+
{
|
|
209
|
+
value: row.sold,
|
|
210
|
+
max: row.supply,
|
|
211
|
+
size: "sm",
|
|
212
|
+
tone: row.sold === row.supply ? "success" : "primary",
|
|
213
|
+
"aria-label": `${row.title} sold`,
|
|
214
|
+
getAriaValueText: (_, v) => `${v} of ${row.supply} sold`,
|
|
215
|
+
className: "flex-1"
|
|
216
|
+
}
|
|
217
|
+
),
|
|
218
|
+
/* @__PURE__ */ jsxs("span", { className: "text-mono-caption whitespace-nowrap text-muted-foreground", children: [
|
|
219
|
+
row.sold,
|
|
220
|
+
"/",
|
|
221
|
+
row.supply
|
|
222
|
+
] })
|
|
223
|
+
] })
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
key: "revenue",
|
|
227
|
+
header: "Revenue",
|
|
228
|
+
align: "end",
|
|
229
|
+
sortable: true,
|
|
230
|
+
sortValue: (row) => row.sold * row.price,
|
|
231
|
+
cell: (row) => row.sold > 0 ? /* @__PURE__ */ jsx("span", { className: "text-mono-sm", children: usd.format(row.sold * row.price) }) : /* @__PURE__ */ jsx("span", { className: "text-mono-sm text-muted-foreground", children: "\u2014" })
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
key: "released",
|
|
235
|
+
header: "Release",
|
|
236
|
+
align: "end",
|
|
237
|
+
sortable: true,
|
|
238
|
+
cell: (row) => /* @__PURE__ */ jsx("span", { className: "text-body-sm whitespace-nowrap text-muted-foreground", children: shortDate(row.released) })
|
|
239
|
+
}
|
|
240
|
+
]
|
|
241
|
+
}
|
|
242
|
+
) }),
|
|
243
|
+
/* @__PURE__ */ jsxs(CardFooter, { className: "justify-between", children: [
|
|
244
|
+
/* @__PURE__ */ jsxs("span", { className: "text-caption text-muted-foreground", children: [
|
|
245
|
+
"Showing ",
|
|
246
|
+
editions.length,
|
|
247
|
+
" of ",
|
|
248
|
+
editionCount,
|
|
249
|
+
" editions"
|
|
250
|
+
] }),
|
|
251
|
+
/* @__PURE__ */ jsxs(Button, { variant: "ghost", size: "sm", bleed: "end", render: /* @__PURE__ */ jsx("a", { href: "/editions" }), children: [
|
|
252
|
+
"View all editions",
|
|
253
|
+
/* @__PURE__ */ jsx(Icon, { name: "arrow-right" })
|
|
254
|
+
] })
|
|
255
|
+
] })
|
|
256
|
+
] }),
|
|
257
|
+
/* @__PURE__ */ jsxs(Stack, { gap: 3, children: [
|
|
258
|
+
/* @__PURE__ */ jsxs(Card, { children: [
|
|
259
|
+
/* @__PURE__ */ jsxs(CardHeader, { children: [
|
|
260
|
+
/* @__PURE__ */ jsx(CardDescription, { children: "Next payout" }),
|
|
261
|
+
/* @__PURE__ */ jsx(CardTitle, { className: "text-mono-xl", children: usdCents.format(payout.amount) }),
|
|
262
|
+
/* @__PURE__ */ jsx(CardAction, { children: /* @__PURE__ */ jsx(Badge, { tone: "info", size: "sm", icon: /* @__PURE__ */ jsx(Icon, { name: "calendar" }), children: shortDate(payout.date) }) })
|
|
263
|
+
] }),
|
|
264
|
+
/* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx("dl", { className: "sable-list-dl text-body-sm", children: payout.lines.map((line) => /* @__PURE__ */ jsxs("div", { className: "contents", children: [
|
|
265
|
+
/* @__PURE__ */ jsx("dt", { children: line.label }),
|
|
266
|
+
/* @__PURE__ */ jsx("dd", { className: typeof line.value === "number" ? "text-end text-mono-sm" : "text-end", children: typeof line.value === "number" ? usdCents.format(line.value) : line.value })
|
|
267
|
+
] }, line.label)) }) })
|
|
268
|
+
] }),
|
|
269
|
+
/* @__PURE__ */ jsxs(Card, { children: [
|
|
270
|
+
/* @__PURE__ */ jsxs(CardHeader, { children: [
|
|
271
|
+
/* @__PURE__ */ jsx(CardTitle, { children: "Top collectors" }),
|
|
272
|
+
/* @__PURE__ */ jsx(CardDescription, { children: "By spend this month." }),
|
|
273
|
+
/* @__PURE__ */ jsx(CardAction, { children: /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", render: /* @__PURE__ */ jsx("a", { href: "/collectors" }), children: "View all" }) })
|
|
274
|
+
] }),
|
|
275
|
+
/* @__PURE__ */ jsx(CardList, { children: collectors.map((person) => /* @__PURE__ */ jsx(
|
|
276
|
+
Entity,
|
|
277
|
+
{
|
|
278
|
+
leading: /* @__PURE__ */ jsx(Avatar, { variant: "art", size: "sm", fallback: person.initials, alt: "" }),
|
|
279
|
+
title: person.name,
|
|
280
|
+
subtitle: `${person.handle} \xB7 ${person.pieces} pieces`,
|
|
281
|
+
action: /* @__PURE__ */ jsx("span", { className: "text-mono-sm", children: usd.format(person.spent) })
|
|
282
|
+
},
|
|
283
|
+
person.id
|
|
284
|
+
)) })
|
|
285
|
+
] })
|
|
286
|
+
] })
|
|
287
|
+
] }),
|
|
288
|
+
/* @__PURE__ */ jsxs(Grid, { cols: { base: 1, xl: 3 }, gap: 3, children: [
|
|
289
|
+
/* @__PURE__ */ jsxs(Card, { className: "flex flex-col", children: [
|
|
290
|
+
/* @__PURE__ */ jsxs(CardHeader, { children: [
|
|
291
|
+
/* @__PURE__ */ jsx(CardTitle, { children: "Upcoming releases" }),
|
|
292
|
+
/* @__PURE__ */ jsx(CardDescription, { children: "Scheduled to open to collectors." })
|
|
293
|
+
] }),
|
|
294
|
+
/* @__PURE__ */ jsx(CardList, { children: upcoming.map((release) => /* @__PURE__ */ jsx(
|
|
295
|
+
Entity,
|
|
296
|
+
{
|
|
297
|
+
title: release.title,
|
|
298
|
+
subtitle: release.detail,
|
|
299
|
+
action: /* @__PURE__ */ jsx(RelativeTime, { date: Date.now() + release.at, className: "text-caption text-muted-foreground" })
|
|
300
|
+
},
|
|
301
|
+
release.id
|
|
302
|
+
)) }),
|
|
303
|
+
/* @__PURE__ */ jsx(CardFooter, { className: "mt-auto", children: /* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", render: /* @__PURE__ */ jsx("a", { href: "/editions/new" }), children: [
|
|
304
|
+
/* @__PURE__ */ jsx(Icon, { name: "calendar" }),
|
|
305
|
+
"Schedule a release"
|
|
306
|
+
] }) })
|
|
307
|
+
] }),
|
|
308
|
+
/* @__PURE__ */ jsxs(Card, { className: "xl:col-span-2", children: [
|
|
309
|
+
/* @__PURE__ */ jsxs(CardHeader, { children: [
|
|
310
|
+
/* @__PURE__ */ jsx(CardTitle, { children: "Activity" }),
|
|
311
|
+
/* @__PURE__ */ jsx(CardDescription, { children: "Collects, tips, and follows." }),
|
|
312
|
+
/* @__PURE__ */ jsx(CardAction, { children: /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", render: /* @__PURE__ */ jsx("a", { href: "/activity" }), children: "View all" }) })
|
|
313
|
+
] }),
|
|
314
|
+
/* @__PURE__ */ jsx(CardList, { children: activity.map((item) => /* @__PURE__ */ jsx(
|
|
315
|
+
Entity,
|
|
316
|
+
{
|
|
317
|
+
leading: /* @__PURE__ */ jsx(Avatar, { variant: "art", size: "sm", fallback: item.initials, alt: "" }),
|
|
318
|
+
title: item.who,
|
|
319
|
+
subtitle: item.what,
|
|
320
|
+
action: /* @__PURE__ */ jsx(RelativeTime, { date: Date.now() - item.when, className: "text-caption text-muted-foreground" })
|
|
321
|
+
},
|
|
322
|
+
item.id
|
|
323
|
+
)) })
|
|
324
|
+
] })
|
|
325
|
+
] })
|
|
326
|
+
] })
|
|
327
|
+
}
|
|
328
|
+
);
|
|
329
|
+
}
|
|
330
|
+
export {
|
|
331
|
+
DashboardPage
|
|
332
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// src/patterns/dashboard-page.meta.ts
|
|
2
|
+
var dashboardPageMeta = {
|
|
3
|
+
name: "DashboardPage",
|
|
4
|
+
summary: "App-shell creator dashboard: a branded Sidebar with an account footer (AppHeader + BottomNav below lg), a KPI row, an edge-to-edge editions table with sell-through Meters, and supporting payout, collector, release and activity cards \u2014 the default shape for an operator or analytics home route.",
|
|
5
|
+
intent: "Reach for this when a route's job is monitoring or managing many records (sales, orders, editions, posts) with a few headline numbers. Not for reading-focused routes (use FeedPage) or single-record routes (use ListDetailPage's detail side).",
|
|
6
|
+
notes: [
|
|
7
|
+
"Region cap is `wide` (1280px): dashboards hold tables and multi-column grids, never a reading column.",
|
|
8
|
+
"Hierarchy runs headline \u2192 records \u2192 context: KPI row, then the primary table beside its two closest companions (payout, top collectors), then the lower-priority lists (upcoming, activity). Every row of the grid is filled so the route ends on content, not empty canvas.",
|
|
9
|
+
"Stat cards: CardHeader carries the label (CardDescription) and the value; KPI values are `text-mono-xl` \u2014 the metric mono tier, tabular figures \u2014 never a heading tier. The trend Badge sits with its comparison note in CardContent, so the value keeps the full card width when the row folds to 2\xD72 on a phone.",
|
|
10
|
+
"Stat cards use an explicit cols map (2 \u2192 4) \u2014 a 4-stat row must fold to 2\xD72, never strand an orphan the way auto-fit can.",
|
|
11
|
+
"The table runs flush to the card edges with `<CardContent flush>`, which hands the card's padding to the table (`--table-edge-px`), so the first and last columns line up with the CardHeader at any card density \u2014 never hand-set pl-6/pr-6. Numeric columns align end in mono; Table scrolls horizontally inside the card on narrow screens.",
|
|
12
|
+
'Sold / supply is a `Meter` (how full a known range is), not `Progress` (task progress). Status is `Badge appearance="plain" dot`, with the app\'s own states mapped to tones once at the top of the file.',
|
|
13
|
+
"Lists are Entity rows in CardList, inset to the card padding and divided by hairlines \u2014 never CardContent with hand-tuned px. A card that shares a grid row with a taller one becomes `flex flex-col` and pins its CardFooter with `mt-auto`.",
|
|
14
|
+
"Brand and account live in the Sidebar: SidebarHeader holds the mark + wordmark, SidebarFooter holds the signed-in Entity with an OverflowMenu. Sidebar rebinds the page ink tokens to its own, so the Entity and OverflowMenu read correctly even when a theme paints the rail dark on a light page.",
|
|
15
|
+
"The page has exactly one heading-1 (PageHeader); card titles are Title tier, not headings.",
|
|
16
|
+
"Chrome (Sidebar) is outside the content grid; the Page region caps only content.",
|
|
17
|
+
"Sidebar hides below lg, so the shell's header carries an AppHeader (brand + account) and its footer a BottomNav with the same destinations \u2014 never strand mobile users without navigation."
|
|
18
|
+
],
|
|
19
|
+
a11y: [
|
|
20
|
+
'AppShell provides the skip link and <main id="main-content"> landmark.',
|
|
21
|
+
"The active SidebarItem and BottomNavItem carry aria-current via `active`.",
|
|
22
|
+
"DataTable headers are real <th>; sortable columns are announced.",
|
|
23
|
+
'Each sell-through Meter has an aria-label naming the edition and aria-valuetext reading "184 of 250 sold".',
|
|
24
|
+
"Avatars beside a visible name use an empty alt so the name is not read twice."
|
|
25
|
+
]
|
|
26
|
+
};
|
|
27
|
+
export {
|
|
28
|
+
dashboardPageMeta
|
|
29
|
+
};
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
// src/patterns/feed-page.tsx
|
|
2
|
+
import { Icon } from "../icon/index.js";
|
|
3
|
+
import { Avatar } from "../components/avatar/index.js";
|
|
4
|
+
import { Badge } from "../components/badge/index.js";
|
|
5
|
+
import { Button } from "../components/button/index.js";
|
|
6
|
+
import { Card, CardContent, CardHeader, CardList, CardTitle } from "../components/card/index.js";
|
|
7
|
+
import { OverflowMenu } from "../components/overflow-menu/index.js";
|
|
8
|
+
import { Entity } from "../components/entity/index.js";
|
|
9
|
+
import { MenuItem, MenuSeparator } from "../components/menu/index.js";
|
|
10
|
+
import { Meter, MeterLabel, MeterTrack, MeterValue } from "../components/meter/index.js";
|
|
11
|
+
import { PageHeader } from "../components/page-header/index.js";
|
|
12
|
+
import { Skeleton } from "../components/skeleton/index.js";
|
|
13
|
+
import { Tabs, TabsList, TabsPanel, TabsTrigger } from "../components/tabs/index.js";
|
|
14
|
+
import { Textarea } from "../components/textarea/index.js";
|
|
15
|
+
import { AspectBox, Page, Row, Stack } from "../layout/index.js";
|
|
16
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
17
|
+
var posts = [
|
|
18
|
+
{
|
|
19
|
+
id: "p_01",
|
|
20
|
+
author: "Ada Lovelace",
|
|
21
|
+
handle: "@ada",
|
|
22
|
+
initials: "AL",
|
|
23
|
+
time: "2h",
|
|
24
|
+
following: true,
|
|
25
|
+
body: "Gold Rush is live. 100 signed prints, each paired with the on-chain original. Thank you for waiting.",
|
|
26
|
+
media: { src: "/media/edition-cover.svg", alt: "Gold Rush, a gold-leaf study in overlapping arcs" },
|
|
27
|
+
drop: { title: "Gold Rush", price: "$120", collected: 62, supply: 100 },
|
|
28
|
+
likes: 128,
|
|
29
|
+
comments: 24
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
id: "p_02",
|
|
33
|
+
author: "Grace Hopper",
|
|
34
|
+
handle: "@grace",
|
|
35
|
+
initials: "GH",
|
|
36
|
+
time: "5h",
|
|
37
|
+
following: true,
|
|
38
|
+
body: "Process shot from this week. Compilers and copper ink \u2014 the plotter ran for eleven hours on this one.",
|
|
39
|
+
media: { src: "/media/process-shot.svg", alt: "Work-in-progress plotter drawing in copper ink" },
|
|
40
|
+
likes: 86,
|
|
41
|
+
comments: 9
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
id: "p_03",
|
|
45
|
+
author: "Nina Simone",
|
|
46
|
+
handle: "@nina",
|
|
47
|
+
initials: "NS",
|
|
48
|
+
time: "8h",
|
|
49
|
+
following: false,
|
|
50
|
+
body: "Collectors of Dusk, no. 3 \u2014 your unlockable score is now in your library. Headphones on for this one.",
|
|
51
|
+
likes: 214,
|
|
52
|
+
comments: 31
|
|
53
|
+
}
|
|
54
|
+
];
|
|
55
|
+
var suggestions = [
|
|
56
|
+
{ id: "u_01", name: "Mary Shelley", handle: "@mary", initials: "MS" },
|
|
57
|
+
{ id: "u_02", name: "Nina Simone", handle: "@nina", initials: "NS" }
|
|
58
|
+
];
|
|
59
|
+
var upcoming = [
|
|
60
|
+
{ id: "d_01", title: "Quiet Harbor", artist: "Mary Shelley", initials: "MS", date: "Sat, Oct 12" },
|
|
61
|
+
{ id: "d_02", title: "Dusk, no. 4", artist: "Nina Simone", initials: "NS", date: "Tue, Oct 15" }
|
|
62
|
+
];
|
|
63
|
+
var renderPost = (post) => /* @__PURE__ */ jsx("article", { children: /* @__PURE__ */ jsxs(Card, { children: [
|
|
64
|
+
/* @__PURE__ */ jsx(CardList, { children: /* @__PURE__ */ jsx(
|
|
65
|
+
Entity,
|
|
66
|
+
{
|
|
67
|
+
leading: /* @__PURE__ */ jsx(Avatar, { variant: "art", fallback: post.initials, alt: post.author }),
|
|
68
|
+
title: post.author,
|
|
69
|
+
subtitle: `${post.handle} \xB7 ${post.time}`,
|
|
70
|
+
action: /* @__PURE__ */ jsxs(OverflowMenu, { label: `Post options for ${post.author}`, size: "icon-sm", children: [
|
|
71
|
+
/* @__PURE__ */ jsx(MenuItem, { children: "Copy link" }),
|
|
72
|
+
/* @__PURE__ */ jsxs(MenuItem, { children: [
|
|
73
|
+
"Mute ",
|
|
74
|
+
post.handle
|
|
75
|
+
] }),
|
|
76
|
+
/* @__PURE__ */ jsx(MenuSeparator, {}),
|
|
77
|
+
/* @__PURE__ */ jsx(MenuItem, { variant: "destructive", children: "Report post" })
|
|
78
|
+
] })
|
|
79
|
+
}
|
|
80
|
+
) }),
|
|
81
|
+
/* @__PURE__ */ jsxs(CardContent, { className: "flex flex-col gap-4 pt-0", children: [
|
|
82
|
+
/* @__PURE__ */ jsx("p", { className: "text-body-md text-foreground", children: post.body }),
|
|
83
|
+
post.media ? /* @__PURE__ */ jsxs(AspectBox, { ratio: 16 / 9, className: "overflow-hidden rounded-concentric-lg/6 bg-muted", children: [
|
|
84
|
+
/* @__PURE__ */ jsx("img", { src: post.media.src, alt: post.media.alt, className: "size-full object-cover" }),
|
|
85
|
+
post.drop ? /* @__PURE__ */ jsx("div", { className: "absolute start-3 top-3", children: /* @__PURE__ */ jsx(Badge, { appearance: "overlay", size: "sm", dot: true, children: "Live drop" }) }) : null
|
|
86
|
+
] }) : null,
|
|
87
|
+
post.drop ? /* @__PURE__ */ jsxs(Stack, { gap: 1.5, children: [
|
|
88
|
+
/* @__PURE__ */ jsxs(Row, { gap: 2, align: "center", justify: "between", children: [
|
|
89
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
90
|
+
/* @__PURE__ */ jsx("p", { className: "text-title-md text-foreground", children: post.drop.title }),
|
|
91
|
+
/* @__PURE__ */ jsx("p", { className: "text-body-sm text-muted-foreground", children: `${post.drop.price} \xB7 Edition of ${post.drop.supply}` })
|
|
92
|
+
] }),
|
|
93
|
+
/* @__PURE__ */ jsx(Button, { children: `Collect for ${post.drop.price}` })
|
|
94
|
+
] }),
|
|
95
|
+
/* @__PURE__ */ jsxs(
|
|
96
|
+
Meter,
|
|
97
|
+
{
|
|
98
|
+
value: post.drop.collected,
|
|
99
|
+
max: post.drop.supply,
|
|
100
|
+
size: "sm",
|
|
101
|
+
getAriaValueText: (_, value) => `${value} of ${post.drop?.supply} collected`,
|
|
102
|
+
children: [
|
|
103
|
+
/* @__PURE__ */ jsxs(Row, { gap: 2, align: "center", justify: "between", className: "mb-2", children: [
|
|
104
|
+
/* @__PURE__ */ jsx(MeterLabel, { children: `${post.drop.collected} collected` }),
|
|
105
|
+
/* @__PURE__ */ jsx(MeterValue, { children: (_, value) => `${(post.drop?.supply ?? 0) - value} left` })
|
|
106
|
+
] }),
|
|
107
|
+
/* @__PURE__ */ jsx(MeterTrack, {})
|
|
108
|
+
]
|
|
109
|
+
}
|
|
110
|
+
)
|
|
111
|
+
] }) : null,
|
|
112
|
+
/* @__PURE__ */ jsxs(Row, { gap: 0.5, children: [
|
|
113
|
+
/* @__PURE__ */ jsxs(Button, { variant: "ghost", size: "sm", bleed: "start", "aria-label": `Like, ${post.likes} likes`, children: [
|
|
114
|
+
/* @__PURE__ */ jsx(Icon, { name: "heart" }),
|
|
115
|
+
post.likes
|
|
116
|
+
] }),
|
|
117
|
+
/* @__PURE__ */ jsxs(Button, { variant: "ghost", size: "sm", "aria-label": `Comment, ${post.comments} comments`, children: [
|
|
118
|
+
/* @__PURE__ */ jsx(Icon, { name: "comment" }),
|
|
119
|
+
post.comments
|
|
120
|
+
] }),
|
|
121
|
+
/* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", "aria-label": "Share", children: /* @__PURE__ */ jsx(Icon, { name: "share" }) })
|
|
122
|
+
] })
|
|
123
|
+
] })
|
|
124
|
+
] }) }, post.id);
|
|
125
|
+
function FeedPage() {
|
|
126
|
+
return /* @__PURE__ */ jsx(Page, { as: "main", max: "wide", gap: 4, className: "py-6", children: /* @__PURE__ */ jsxs(Row, { gap: 4, align: "start", justify: "center", children: [
|
|
127
|
+
/* @__PURE__ */ jsxs(Stack, { gap: 3, className: "min-w-0 max-w-(--region-feed) flex-1", children: [
|
|
128
|
+
/* @__PURE__ */ jsx(PageHeader, { title: "Home" }),
|
|
129
|
+
/* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsxs(Row, { gap: 1.5, align: "start", children: [
|
|
130
|
+
/* @__PURE__ */ jsx(Avatar, { variant: "art", fallback: "AL", alt: "Ada Lovelace" }),
|
|
131
|
+
/* @__PURE__ */ jsxs(Stack, { gap: 1.5, className: "min-w-0 flex-1", children: [
|
|
132
|
+
/* @__PURE__ */ jsx(
|
|
133
|
+
Textarea,
|
|
134
|
+
{
|
|
135
|
+
autoResize: true,
|
|
136
|
+
rows: 2,
|
|
137
|
+
"aria-label": "New post",
|
|
138
|
+
placeholder: "Share a process shot or an upcoming drop"
|
|
139
|
+
}
|
|
140
|
+
),
|
|
141
|
+
/* @__PURE__ */ jsxs(Row, { gap: 1, align: "center", justify: "between", children: [
|
|
142
|
+
/* @__PURE__ */ jsxs(Row, { gap: 0.5, children: [
|
|
143
|
+
/* @__PURE__ */ jsx(Button, { variant: "ghost", size: "icon-sm", "aria-label": "Add images", children: /* @__PURE__ */ jsx(Icon, { name: "image-stack" }) }),
|
|
144
|
+
/* @__PURE__ */ jsx(Button, { variant: "ghost", size: "icon-sm", "aria-label": "Attach an edition", children: /* @__PURE__ */ jsx(Icon, { name: "gem" }) })
|
|
145
|
+
] }),
|
|
146
|
+
/* @__PURE__ */ jsx(Button, { variant: "secondary", size: "sm", children: "Post" })
|
|
147
|
+
] })
|
|
148
|
+
] })
|
|
149
|
+
] }) }) }),
|
|
150
|
+
/* @__PURE__ */ jsxs(Tabs, { defaultValue: "for-you", children: [
|
|
151
|
+
/* @__PURE__ */ jsxs(TabsList, { className: "flex", children: [
|
|
152
|
+
/* @__PURE__ */ jsx(TabsTrigger, { value: "for-you", children: "For you" }),
|
|
153
|
+
/* @__PURE__ */ jsx(TabsTrigger, { value: "following", children: "Following" })
|
|
154
|
+
] }),
|
|
155
|
+
/* @__PURE__ */ jsx(TabsPanel, { value: "for-you", children: /* @__PURE__ */ jsxs(Stack, { gap: 3, children: [
|
|
156
|
+
posts.map(renderPost),
|
|
157
|
+
/* @__PURE__ */ jsx(Card, { "aria-busy": "true", children: /* @__PURE__ */ jsxs(CardContent, { className: "flex flex-col gap-4", children: [
|
|
158
|
+
/* @__PURE__ */ jsxs(Row, { gap: 1.5, align: "center", children: [
|
|
159
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "size-10 rounded-full" }),
|
|
160
|
+
/* @__PURE__ */ jsxs(Stack, { gap: 1, children: [
|
|
161
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "h-3 w-32" }),
|
|
162
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "h-3 w-20" })
|
|
163
|
+
] })
|
|
164
|
+
] }),
|
|
165
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "h-3 w-full" }),
|
|
166
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "h-3 w-2/3" })
|
|
167
|
+
] }) }),
|
|
168
|
+
/* @__PURE__ */ jsx(Button, { variant: "secondary", loading: true, loadingLabel: "Loading posts", children: "Load more posts" })
|
|
169
|
+
] }) }),
|
|
170
|
+
/* @__PURE__ */ jsx(TabsPanel, { value: "following", children: /* @__PURE__ */ jsx(Stack, { gap: 3, children: posts.filter((post) => post.following).map(renderPost) }) })
|
|
171
|
+
] })
|
|
172
|
+
] }),
|
|
173
|
+
/* @__PURE__ */ jsx("aside", { "aria-label": "Suggestions", className: "sticky top-6 hidden w-80 shrink-0 lg:block", children: /* @__PURE__ */ jsxs(Stack, { gap: 3, children: [
|
|
174
|
+
/* @__PURE__ */ jsxs(Card, { children: [
|
|
175
|
+
/* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsx(CardTitle, { render: /* @__PURE__ */ jsx("h2", {}), children: "Who to follow" }) }),
|
|
176
|
+
/* @__PURE__ */ jsx(CardList, { children: suggestions.map((person) => /* @__PURE__ */ jsx(
|
|
177
|
+
Entity,
|
|
178
|
+
{
|
|
179
|
+
leading: /* @__PURE__ */ jsx(Avatar, { variant: "art", fallback: person.initials, alt: person.name }),
|
|
180
|
+
title: person.name,
|
|
181
|
+
subtitle: person.handle,
|
|
182
|
+
action: /* @__PURE__ */ jsx(Button, { variant: "secondary", size: "sm", "aria-label": `Follow ${person.name}`, children: "Follow" })
|
|
183
|
+
},
|
|
184
|
+
person.id
|
|
185
|
+
)) })
|
|
186
|
+
] }),
|
|
187
|
+
/* @__PURE__ */ jsxs(Card, { children: [
|
|
188
|
+
/* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsx(CardTitle, { render: /* @__PURE__ */ jsx("h2", {}), children: "Upcoming drops" }) }),
|
|
189
|
+
/* @__PURE__ */ jsx(CardList, { children: upcoming.map((drop) => /* @__PURE__ */ jsx(
|
|
190
|
+
Entity,
|
|
191
|
+
{
|
|
192
|
+
leading: /* @__PURE__ */ jsx(Avatar, { variant: "art", fallback: drop.initials, alt: drop.artist }),
|
|
193
|
+
title: drop.title,
|
|
194
|
+
subtitle: `${drop.artist} \xB7 ${drop.date}`,
|
|
195
|
+
action: /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "icon-sm", "aria-label": `Remind me about ${drop.title}`, children: /* @__PURE__ */ jsx(Icon, { name: "bell" }) })
|
|
196
|
+
},
|
|
197
|
+
drop.id
|
|
198
|
+
)) })
|
|
199
|
+
] })
|
|
200
|
+
] }) })
|
|
201
|
+
] }) });
|
|
202
|
+
}
|
|
203
|
+
export {
|
|
204
|
+
FeedPage
|
|
205
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// src/patterns/feed-page.meta.ts
|
|
2
|
+
var feedPageMeta = {
|
|
3
|
+
name: "FeedPage",
|
|
4
|
+
summary: "Social reading feed with a side rail: a feed-width main column (composer, For you / Following Tabs, one Card per post, an edition drop with price, supply Meter and Collect, a Skeleton for the next page) beside a sticky rail of who-to-follow and upcoming drops that drops away below lg.",
|
|
5
|
+
intent: "Reach for this for timelines, activity streams, and any reverse-chronological reading surface where people also act on what they read. Not for record management (DashboardPage) or side-by-side browsing (ListDetailPage).",
|
|
6
|
+
notes: [
|
|
7
|
+
"The main column is capped at `--region-feed` (640px) inside a `wide` page, so posts keep a reading measure while the rail fills the desktop width. The rail is a fixed `w-80` aside, `sticky` at lg and `hidden` below it \u2014 its content is supplementary, so nothing is lost on mobile.",
|
|
8
|
+
"Feed scope is `Tabs` (underline, stretched to the column with `flex`): peer views of the same feed. The composer sits above them because posting applies to both.",
|
|
9
|
+
"The composer is a Card holding `Textarea autoResize` plus ghost icon Buttons and a secondary `Post` \u2014 not ChatComposer, which submits on Enter and is for conversations.",
|
|
10
|
+
"Each post is a Card: an Entity byline in a CardList (with an OverflowMenu for post actions), body copy, then media in an AspectBox at the asset's own ratio, inset with `rounded-concentric-lg/6` so its corners follow the card's in every theme.",
|
|
11
|
+
'An edition drop adds a `Badge appearance="overlay"` on the artwork, title and price, the one primary Button on the page (`Collect`), and a `Meter` for supply \u2014 collected against a known maximum is a level, not task progress.',
|
|
12
|
+
"Actions are ghost sm Buttons (icon + count) in a Row pulled out by the button's own padding (`-ms-3`) so the first icon sits on the text edge.",
|
|
13
|
+
"Loading the next page shows a Skeleton post in the shape the post will land in, above the explicit load-more Button in its `loading` state \u2014 predictable for keyboard and AT users, unlike infinite scroll."
|
|
14
|
+
],
|
|
15
|
+
a11y: [
|
|
16
|
+
"Each post is an <article>, so AT users can jump between posts; the rail is a labelled <aside> landmark.",
|
|
17
|
+
"Rail card titles render as h2 (CardTitle `render={<h2 />}`) under the page's one h1.",
|
|
18
|
+
"Icon-only buttons and every Follow / Remind button carry aria-labels naming their target; counts stay in the accessible name.",
|
|
19
|
+
'The supply Meter is role=meter with a getAriaValueText reading ("62 of 100 collected").',
|
|
20
|
+
'The Skeleton card is aria-busy; the loading Button keeps its label ("Loading posts").'
|
|
21
|
+
]
|
|
22
|
+
};
|
|
23
|
+
export {
|
|
24
|
+
feedPageMeta
|
|
25
|
+
};
|