@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,129 @@
|
|
|
1
|
+
// src/components/toggle/toggle.meta.ts
|
|
2
|
+
var toggleMeta = {
|
|
3
|
+
name: "Toggle",
|
|
4
|
+
summary: "Pressed-state button over Base UI Toggle, plus ToggleGroup for shared single- or multi-select rows. Pressed styling reads from data-[pressed].",
|
|
5
|
+
status: "stable",
|
|
6
|
+
keywords: [
|
|
7
|
+
"toggle",
|
|
8
|
+
"pressed",
|
|
9
|
+
"button state",
|
|
10
|
+
"toolbar",
|
|
11
|
+
"segmented control",
|
|
12
|
+
"segmented",
|
|
13
|
+
"toggle group",
|
|
14
|
+
"button group",
|
|
15
|
+
"view switcher"
|
|
16
|
+
],
|
|
17
|
+
usage: {
|
|
18
|
+
description: "Use Toggle for button-like controls that can be pressed on or off within a toolbar or compact control set.",
|
|
19
|
+
bestPractices: [
|
|
20
|
+
{
|
|
21
|
+
guidance: "do",
|
|
22
|
+
description: "Use it for transient UI modes such as bold, preview, pin, or favorite."
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
guidance: "do",
|
|
26
|
+
description: "Make the pressed state visually and programmatically clear."
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
guidance: "do",
|
|
30
|
+
description: 'Use ToggleGroup appearance="segmented" for a single-select view switch (List / Grid). It is the same capsule ThemeSwitcher wears \u2014 do not hand-build a track around a row of toggles.'
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
guidance: "dont",
|
|
34
|
+
description: "Do not use Toggle for persistent application settings; use Switch."
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
guidance: "dont",
|
|
38
|
+
description: 'Do not leave an icon-only Toggle without an accessible name. It announces as "button, pressed", which tells a screen-reader user the state but never what the state applies to.'
|
|
39
|
+
}
|
|
40
|
+
],
|
|
41
|
+
anatomy: [
|
|
42
|
+
{
|
|
43
|
+
name: "Toggle",
|
|
44
|
+
required: true,
|
|
45
|
+
description: "A single pressed or unpressed control."
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: "ToggleGroup",
|
|
49
|
+
required: false,
|
|
50
|
+
description: "A coordinated group of toggle choices."
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: "ToggleGroupItem",
|
|
54
|
+
required: false,
|
|
55
|
+
description: 'One toggle inside a group \u2014 an alias of Toggle, so <Toggle value="\u2026"> inside a ToggleGroup is the same thing.'
|
|
56
|
+
}
|
|
57
|
+
]
|
|
58
|
+
},
|
|
59
|
+
related: {
|
|
60
|
+
components: [
|
|
61
|
+
"Switch",
|
|
62
|
+
"Button",
|
|
63
|
+
"Tabs"
|
|
64
|
+
]
|
|
65
|
+
},
|
|
66
|
+
props: [
|
|
67
|
+
{
|
|
68
|
+
name: "appearance",
|
|
69
|
+
type: '"default" | "segmented"',
|
|
70
|
+
default: '"default"',
|
|
71
|
+
description: "On ToggleGroup: `default` is a loose row of toggles; `segmented` draws the capsule segmented control (one track, the pressed option filled) shared with ThemeSwitcher. Toggles inside inherit it."
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: "multiple",
|
|
75
|
+
type: "boolean",
|
|
76
|
+
default: "false",
|
|
77
|
+
description: "On ToggleGroup: allow several toggles pressed at once. The default is single-select, which behaves like a radio group."
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: "Toggle",
|
|
81
|
+
type: "Base UI Toggle props (pressed, defaultPressed, onPressedChange, disabled, value) + className",
|
|
82
|
+
default: "defaultPressed: false",
|
|
83
|
+
description: "A two-state button. Uncontrolled via defaultPressed; controlled via pressed + onPressedChange. Pass value to identify it inside a ToggleGroup."
|
|
84
|
+
}
|
|
85
|
+
],
|
|
86
|
+
subcomponents: [
|
|
87
|
+
{
|
|
88
|
+
name: "ToggleGroup",
|
|
89
|
+
type: 'Base UI ToggleGroup props (value, defaultValue, onValueChange, multiple, disabled, orientation, loopFocus) + appearance?: "default" | "segmented" + className',
|
|
90
|
+
description: "Groups child Toggles and shares pressed state across them \u2014 each Toggle inside carries a value. Defaults to multiple: false (single-select) \u2014 the fit for view-mode switches and segmented controls; pass multiple to allow several pressed at once, e.g. a row of formatting toggles."
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
name: "ToggleGroupItem",
|
|
94
|
+
type: "Alias of Toggle",
|
|
95
|
+
description: "Re-export of Toggle for group composition \u2014 a Toggle carrying a value is the group item."
|
|
96
|
+
}
|
|
97
|
+
],
|
|
98
|
+
variants: {
|
|
99
|
+
appearance: ["default", "segmented"]
|
|
100
|
+
},
|
|
101
|
+
tokensUsed: ["muted-foreground", "foreground", "accent", "accent-foreground", "card", "border", "ring"],
|
|
102
|
+
a11y: [
|
|
103
|
+
"Base UI sets aria-pressed on each Toggle and manages the pressed/disabled states.",
|
|
104
|
+
"ToggleGroup provides arrow-key roving focus across its items; loopFocus wraps at the ends.",
|
|
105
|
+
"Pressed styling reads from the data-[pressed] attribute; disabled items are dimmed and non-interactive.",
|
|
106
|
+
"Always supply an aria-label (or visible text) when a Toggle holds only an icon."
|
|
107
|
+
],
|
|
108
|
+
examples: [
|
|
109
|
+
{
|
|
110
|
+
label: "Standalone",
|
|
111
|
+
code: '<Toggle aria-label="Mute">Mute</Toggle>'
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
label: "Single-select group",
|
|
115
|
+
code: '<ToggleGroup defaultValue={["list"]}><Toggle value="list" aria-label="List view"><Icon name="list" /></Toggle><Toggle value="grid" aria-label="Grid view"><Icon name="grid" /></Toggle></ToggleGroup>'
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
label: "Segmented view switch",
|
|
119
|
+
code: '<ToggleGroup appearance="segmented" defaultValue={["list"]} aria-label="View"><Toggle value="list" aria-label="List view"><Icon name="list" /></Toggle><Toggle value="grid" aria-label="Grid view"><Icon name="grid" /></Toggle></ToggleGroup>'
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
label: "Multi-select group",
|
|
123
|
+
code: '<ToggleGroup multiple defaultValue={["bold"]}><Toggle value="bold">Bold</Toggle><Toggle value="italic">Italic</Toggle></ToggleGroup>'
|
|
124
|
+
}
|
|
125
|
+
]
|
|
126
|
+
};
|
|
127
|
+
export {
|
|
128
|
+
toggleMeta
|
|
129
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// src/components/toolbar/index.ts
|
|
2
|
+
import {
|
|
3
|
+
Toolbar,
|
|
4
|
+
ToolbarButton,
|
|
5
|
+
ToolbarGroup,
|
|
6
|
+
ToolbarInput,
|
|
7
|
+
ToolbarLink,
|
|
8
|
+
ToolbarSeparator
|
|
9
|
+
} from "./toolbar.js";
|
|
10
|
+
import {
|
|
11
|
+
toolbarVariants,
|
|
12
|
+
toolbarGroupVariants,
|
|
13
|
+
toolbarSeparatorVariants
|
|
14
|
+
} from "./toolbar.variants.js";
|
|
15
|
+
import { toolbarMeta } from "./toolbar.meta.js";
|
|
16
|
+
export {
|
|
17
|
+
Toolbar,
|
|
18
|
+
ToolbarButton,
|
|
19
|
+
ToolbarGroup,
|
|
20
|
+
ToolbarInput,
|
|
21
|
+
ToolbarLink,
|
|
22
|
+
ToolbarSeparator,
|
|
23
|
+
toolbarGroupVariants,
|
|
24
|
+
toolbarMeta,
|
|
25
|
+
toolbarSeparatorVariants,
|
|
26
|
+
toolbarVariants
|
|
27
|
+
};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// src/components/toolbar/toolbar.tsx
|
|
2
|
+
import { Toolbar as Base } from "@base-ui/react/toolbar";
|
|
3
|
+
import { cn } from "../../lib/cn.js";
|
|
4
|
+
import { useTypeTier } from "../../lib/density.js";
|
|
5
|
+
import { trimLabel } from "../../lib/trim-label.js";
|
|
6
|
+
import { buttonVariants } from "../button/button.variants.js";
|
|
7
|
+
import { Input } from "../input/index.js";
|
|
8
|
+
import {
|
|
9
|
+
toolbarGroupVariants,
|
|
10
|
+
toolbarSeparatorVariants,
|
|
11
|
+
toolbarVariants
|
|
12
|
+
} from "./toolbar.variants.js";
|
|
13
|
+
import { jsx } from "react/jsx-runtime";
|
|
14
|
+
function Toolbar({ className, ...props }) {
|
|
15
|
+
return /* @__PURE__ */ jsx(Base.Root, { className: cn(toolbarVariants(), className), ...props });
|
|
16
|
+
}
|
|
17
|
+
Toolbar.displayName = "Toolbar";
|
|
18
|
+
function ToolbarButton({
|
|
19
|
+
variant = "ghost",
|
|
20
|
+
size = "sm",
|
|
21
|
+
className,
|
|
22
|
+
children,
|
|
23
|
+
...props
|
|
24
|
+
}) {
|
|
25
|
+
const tier = useTypeTier();
|
|
26
|
+
return /* @__PURE__ */ jsx(
|
|
27
|
+
Base.Button,
|
|
28
|
+
{
|
|
29
|
+
className: cn(buttonVariants({ variant, size }), tier.action, className),
|
|
30
|
+
...props,
|
|
31
|
+
children: trimLabel(children)
|
|
32
|
+
}
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
ToolbarButton.displayName = "ToolbarButton";
|
|
36
|
+
function ToolbarLink({
|
|
37
|
+
variant = "ghost",
|
|
38
|
+
size = "sm",
|
|
39
|
+
className,
|
|
40
|
+
children,
|
|
41
|
+
...props
|
|
42
|
+
}) {
|
|
43
|
+
const tier = useTypeTier();
|
|
44
|
+
return /* @__PURE__ */ jsx(
|
|
45
|
+
Base.Link,
|
|
46
|
+
{
|
|
47
|
+
className: cn(buttonVariants({ variant, size }), tier.action, className),
|
|
48
|
+
...props,
|
|
49
|
+
children: trimLabel(children)
|
|
50
|
+
}
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
ToolbarLink.displayName = "ToolbarLink";
|
|
54
|
+
function ToolbarInput({ className, ...props }) {
|
|
55
|
+
return /* @__PURE__ */ jsx(
|
|
56
|
+
Base.Input,
|
|
57
|
+
{
|
|
58
|
+
render: /* @__PURE__ */ jsx(Input, {}),
|
|
59
|
+
className: cn("h-(--control-sm) w-40", className),
|
|
60
|
+
...props
|
|
61
|
+
}
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
ToolbarInput.displayName = "ToolbarInput";
|
|
65
|
+
function ToolbarGroup({ className, ...props }) {
|
|
66
|
+
return /* @__PURE__ */ jsx(Base.Group, { className: cn(toolbarGroupVariants(), className), ...props });
|
|
67
|
+
}
|
|
68
|
+
ToolbarGroup.displayName = "ToolbarGroup";
|
|
69
|
+
function ToolbarSeparator({ className, ...props }) {
|
|
70
|
+
return /* @__PURE__ */ jsx(Base.Separator, { className: cn(toolbarSeparatorVariants(), className), ...props });
|
|
71
|
+
}
|
|
72
|
+
ToolbarSeparator.displayName = "ToolbarSeparator";
|
|
73
|
+
export {
|
|
74
|
+
Toolbar,
|
|
75
|
+
ToolbarButton,
|
|
76
|
+
ToolbarGroup,
|
|
77
|
+
ToolbarInput,
|
|
78
|
+
ToolbarLink,
|
|
79
|
+
ToolbarSeparator
|
|
80
|
+
};
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
// src/components/toolbar/toolbar.meta.ts
|
|
2
|
+
var toolbarMeta = {
|
|
3
|
+
name: "Toolbar",
|
|
4
|
+
summary: `A row or column of controls that is one tab stop, with arrow-key movement between its items (role="toolbar"), over Base UI Toolbar. Items reuse Button's ghost variants and Input, so they follow density like every other control.`,
|
|
5
|
+
status: "stable",
|
|
6
|
+
keywords: [
|
|
7
|
+
"toolbar",
|
|
8
|
+
"action bar",
|
|
9
|
+
"button row",
|
|
10
|
+
"icon buttons",
|
|
11
|
+
"formatting bar",
|
|
12
|
+
"roving focus",
|
|
13
|
+
"arrow keys",
|
|
14
|
+
"tool chrome",
|
|
15
|
+
"editor toolbar"
|
|
16
|
+
],
|
|
17
|
+
usage: {
|
|
18
|
+
description: "Use Toolbar when three or more related controls sit together and act on the same thing \u2014 a text selection, a canvas, a document, a table. Tab lands on the toolbar once and the arrow keys move along it, so a keyboard user crosses an editor's twelve buttons in one keystroke instead of twelve. It works in both registers: ghost sm buttons on a page, compact icon-xs buttons inside a Workspace.",
|
|
19
|
+
bestPractices: [
|
|
20
|
+
{
|
|
21
|
+
guidance: "do",
|
|
22
|
+
description: 'Give every Toolbar an aria-label that names what it acts on ("Text formatting", "Canvas"). With more than one toolbar on screen, that label is the only way a screen-reader user tells them apart.'
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
guidance: "do",
|
|
26
|
+
description: 'Use size="icon-sm" (page) or size="icon-xs" (workspace) with an aria-label for icon-only ToolbarButtons, and keep one size across the row so the controls line up.'
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
guidance: "do",
|
|
30
|
+
description: "Split a long row into ToolbarGroups with a ToolbarSeparator between them \u2014 undo/redo, text style, insert. Groups give the eye the same structure the arrow keys already cross."
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
guidance: "do",
|
|
34
|
+
description: `Compose triggers and toggles through ToolbarButton's render prop \u2014 render={<MenuTrigger />}, render={<PopoverTrigger />}, or render={<Toggle value="bold" />} inside a ToggleGroup \u2014 so they join the toolbar's arrow-key order.`
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
guidance: "dont",
|
|
38
|
+
description: "Put a bare Button, Toggle or Input inside a Toolbar. It renders, but it is not a toolbar item: the arrow keys skip it and it takes its own tab stop, which is the inconsistency Toolbar exists to remove. Use ToolbarButton, ToolbarInput, or render through ToolbarButton."
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
guidance: "dont",
|
|
42
|
+
description: "Wrap one or two buttons, or a dialog's Cancel/Confirm pair, in a Toolbar. Those are independent actions; arrow-key movement there is a surprise, not a shortcut. A plain row of Buttons is right."
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
guidance: "dont",
|
|
46
|
+
description: "Use Toolbar for navigation between pages or views. Links that go somewhere are Tabs, SideNav or Breadcrumbs; ToolbarLink is for the odd link that sits among actions, like Help."
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
guidance: "dont",
|
|
50
|
+
description: "Give toolbar buttons primary or destructive fills by default. A toolbar is a quiet strip of tools; the ghost default keeps it from competing with the page's one primary action."
|
|
51
|
+
}
|
|
52
|
+
],
|
|
53
|
+
anatomy: [
|
|
54
|
+
{
|
|
55
|
+
name: "Toolbar",
|
|
56
|
+
required: true,
|
|
57
|
+
description: 'The root (role="toolbar"). Owns orientation, loopFocus and disabled for everything inside it.'
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
name: "ToolbarButton",
|
|
61
|
+
required: true,
|
|
62
|
+
description: "An action. Button's ghost variants by default; `render` composes a menu trigger, popover trigger or Toggle into the toolbar."
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
name: "ToolbarGroup",
|
|
66
|
+
required: false,
|
|
67
|
+
description: "A run of related items. `disabled` disables the whole run."
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
name: "ToolbarSeparator",
|
|
71
|
+
required: false,
|
|
72
|
+
description: "A hairline between groups, oriented across the toolbar. Never a focus stop."
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
name: "ToolbarInput",
|
|
76
|
+
required: false,
|
|
77
|
+
description: "A compact Input that joins the arrow-key order \u2014 a search or find field in the bar."
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: "ToolbarLink",
|
|
81
|
+
required: false,
|
|
82
|
+
description: "An <a> styled like a ToolbarButton, for a link that sits among the actions."
|
|
83
|
+
}
|
|
84
|
+
]
|
|
85
|
+
},
|
|
86
|
+
related: {
|
|
87
|
+
components: [
|
|
88
|
+
"Button",
|
|
89
|
+
"Toggle",
|
|
90
|
+
"Menu",
|
|
91
|
+
"Popover",
|
|
92
|
+
"Tooltip",
|
|
93
|
+
"Workspace",
|
|
94
|
+
"PanelSection",
|
|
95
|
+
"Separator"
|
|
96
|
+
]
|
|
97
|
+
},
|
|
98
|
+
props: [
|
|
99
|
+
{
|
|
100
|
+
name: "orientation",
|
|
101
|
+
type: '"horizontal" | "vertical"',
|
|
102
|
+
default: '"horizontal"',
|
|
103
|
+
description: "Which arrow keys move focus (Left/Right or Up/Down) and which way the items stack. Separators turn to match."
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
name: "loopFocus",
|
|
107
|
+
type: "boolean",
|
|
108
|
+
default: "true",
|
|
109
|
+
description: "Arrowing past the last item wraps to the first, and back."
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
name: "disabled",
|
|
113
|
+
type: "boolean",
|
|
114
|
+
default: "false",
|
|
115
|
+
description: "Disables every item. Items stay focusable (aria-disabled) so the row keeps its shape under the keyboard."
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
name: "aria-label",
|
|
119
|
+
type: "string",
|
|
120
|
+
description: "Names the toolbar for assistive technology. Always set it."
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
name: "className",
|
|
124
|
+
type: "string",
|
|
125
|
+
description: "Layout overrides \u2014 e.g. `flex-1` to let the toolbar fill a bar."
|
|
126
|
+
}
|
|
127
|
+
],
|
|
128
|
+
subcomponents: [
|
|
129
|
+
{
|
|
130
|
+
name: "ToolbarButton",
|
|
131
|
+
type: '{ variant?: buttonVariants variant (default "ghost"); size?: buttonVariants size (default "sm"); disabled?: boolean; focusableWhenDisabled?: boolean (default true); render?: ReactElement } + Base UI Toolbar.Button props',
|
|
132
|
+
description: 'A toolbar action, styled exactly like <Button>. Disabled buttons stay focusable by default and carry aria-disabled. Pass size="icon-sm"/"icon-xs" plus aria-label for icon-only.'
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
name: "ToolbarLink",
|
|
136
|
+
type: '{ href?: string; variant?: buttonVariants variant (default "ghost"); size?: buttonVariants size (default "sm"); render?: ReactElement } + Base UI Toolbar.Link props',
|
|
137
|
+
description: "An <a> in the toolbar's arrow-key order, styled like a ToolbarButton."
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
name: "ToolbarInput",
|
|
141
|
+
type: "{ disabled?: boolean; focusableWhenDisabled?: boolean (default true) } + Base UI Toolbar.Input / native input props",
|
|
142
|
+
description: "Sable's Input at the sm control height (w-40 by default; override with className). Arrow keys leave the field so it does not trap the row."
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
name: "ToolbarGroup",
|
|
146
|
+
type: "{ disabled?: boolean } + Base UI Toolbar.Group props",
|
|
147
|
+
description: "Groups related items; `disabled` disables all of them."
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
name: "ToolbarSeparator",
|
|
151
|
+
type: "Base UI Toolbar.Separator props + className",
|
|
152
|
+
description: `A hairline-strong rule across the toolbar's axis, exposed as role="separator" and skipped by the arrow keys.`
|
|
153
|
+
}
|
|
154
|
+
],
|
|
155
|
+
variants: {
|
|
156
|
+
orientation: ["horizontal", "vertical"],
|
|
157
|
+
variant: ["ghost", "secondary", "outline", "primary", "destructive", "link"],
|
|
158
|
+
size: ["xs", "sm", "md", "icon", "icon-sm", "icon-xs"]
|
|
159
|
+
},
|
|
160
|
+
tokensUsed: ["foreground", "accent", "accent-foreground", "ring", "hairline-strong", "input", "card"],
|
|
161
|
+
motion: [
|
|
162
|
+
{
|
|
163
|
+
slot: "arrival",
|
|
164
|
+
recipe: "none",
|
|
165
|
+
part: "Toolbar",
|
|
166
|
+
why: "A toolbar is fixed chrome. It is present when its surface is; animating it in would leave the tools briefly unusable for no reason the user can see."
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
slot: "response",
|
|
170
|
+
recipe: "motion-interactive",
|
|
171
|
+
part: "ToolbarButton",
|
|
172
|
+
why: "Inherited from buttonVariants: hover fill, focus ring and disabled dim ease together, so the item under the arrow keys reads as the one that moved."
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
slot: "response",
|
|
176
|
+
recipe: "motion-press",
|
|
177
|
+
part: "ToolbarButton",
|
|
178
|
+
why: "Inherited from buttonVariants. Many toolbar actions change something off to the side (the canvas, the selection), so the settle on press is the confirmation that lands where the pointer is."
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
slot: "transition",
|
|
182
|
+
recipe: "none",
|
|
183
|
+
part: "Toolbar",
|
|
184
|
+
why: "The toolbar has no state of its own. Pressed state belongs to a Toggle rendered through ToolbarButton, which carries its own transition."
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
slot: "activity",
|
|
188
|
+
recipe: "none",
|
|
189
|
+
part: "Toolbar",
|
|
190
|
+
why: "A toolbar never works on its own. Pending work belongs to the surface the action targets, or to a Spinner in the button that started it."
|
|
191
|
+
}
|
|
192
|
+
],
|
|
193
|
+
a11y: [
|
|
194
|
+
'Base UI renders role="toolbar" with aria-orientation, and a roving tabindex: the toolbar is one tab stop, the arrow keys move between items, Home/End jump to the ends.',
|
|
195
|
+
"Disabled items stay focusable by default and announce as disabled (aria-disabled), so arrowing along the row never silently skips a control. Set focusableWhenDisabled={false} on an item to opt out.",
|
|
196
|
+
`ToolbarSeparator is role="separator" with the orientation opposite the toolbar's, and is not a focus stop.`,
|
|
197
|
+
"ToolbarInput lets the arrow keys move the caret and only leaves the field at either end of its text.",
|
|
198
|
+
"Always set aria-label on the Toolbar, and on every icon-only ToolbarButton.",
|
|
199
|
+
"A Toggle rendered through ToolbarButton keeps aria-pressed; a MenuTrigger keeps aria-haspopup/aria-expanded."
|
|
200
|
+
],
|
|
201
|
+
examples: [
|
|
202
|
+
{
|
|
203
|
+
label: "Formatting toolbar",
|
|
204
|
+
code: `<Toolbar aria-label="Text formatting">
|
|
205
|
+
<ToolbarGroup aria-label="History">
|
|
206
|
+
<ToolbarButton size="icon-sm" aria-label="Undo">
|
|
207
|
+
<Icon name="arrow-left" />
|
|
208
|
+
</ToolbarButton>
|
|
209
|
+
<ToolbarButton size="icon-sm" aria-label="Redo">
|
|
210
|
+
<Icon name="arrow-right" />
|
|
211
|
+
</ToolbarButton>
|
|
212
|
+
</ToolbarGroup>
|
|
213
|
+
<ToolbarSeparator />
|
|
214
|
+
<ToggleGroup multiple aria-label="Style">
|
|
215
|
+
<ToolbarButton size="icon-sm" aria-label="Bold" render={<Toggle value="bold" />}>
|
|
216
|
+
<Icon name="bold" />
|
|
217
|
+
</ToolbarButton>
|
|
218
|
+
<ToolbarButton size="icon-sm" aria-label="Italic" render={<Toggle value="italic" />}>
|
|
219
|
+
<Icon name="italic" />
|
|
220
|
+
</ToolbarButton>
|
|
221
|
+
</ToggleGroup>
|
|
222
|
+
<ToolbarSeparator />
|
|
223
|
+
<ToolbarLink href="/help">Help</ToolbarLink>
|
|
224
|
+
</Toolbar>`
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
label: "With a menu trigger and a search field",
|
|
228
|
+
code: `<Toolbar aria-label="Table">
|
|
229
|
+
<ToolbarButton>Export</ToolbarButton>
|
|
230
|
+
<Menu>
|
|
231
|
+
<ToolbarButton render={<MenuTrigger />}>View</ToolbarButton>
|
|
232
|
+
<MenuContent>
|
|
233
|
+
<MenuItem>Compact rows</MenuItem>
|
|
234
|
+
<MenuItem>Comfortable rows</MenuItem>
|
|
235
|
+
</MenuContent>
|
|
236
|
+
</Menu>
|
|
237
|
+
<ToolbarSeparator />
|
|
238
|
+
<ToolbarInput aria-label="Search rows" placeholder="Search" />
|
|
239
|
+
</Toolbar>`
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
label: "Vertical tool rail",
|
|
243
|
+
code: `<Toolbar orientation="vertical" aria-label="Tools">
|
|
244
|
+
<ToolbarButton size="icon-sm" aria-label="Select">
|
|
245
|
+
<Icon name="arrow-up" />
|
|
246
|
+
</ToolbarButton>
|
|
247
|
+
<ToolbarButton size="icon-sm" aria-label="Draw">
|
|
248
|
+
<Icon name="edit" />
|
|
249
|
+
</ToolbarButton>
|
|
250
|
+
<ToolbarSeparator />
|
|
251
|
+
<ToolbarButton size="icon-sm" aria-label="Delete" disabled>
|
|
252
|
+
<Icon name="trash" />
|
|
253
|
+
</ToolbarButton>
|
|
254
|
+
</Toolbar>`
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
label: "In a workspace bar",
|
|
258
|
+
code: `<WorkspaceBar>
|
|
259
|
+
<Toolbar aria-label="Document" className="flex-1">
|
|
260
|
+
<ToolbarButton size="xs">File</ToolbarButton>
|
|
261
|
+
<ToolbarButton size="xs">Edit</ToolbarButton>
|
|
262
|
+
<ToolbarButton size="icon-xs" aria-label="Share" className="ms-auto">
|
|
263
|
+
<Icon name="share" />
|
|
264
|
+
</ToolbarButton>
|
|
265
|
+
</Toolbar>
|
|
266
|
+
</WorkspaceBar>`
|
|
267
|
+
}
|
|
268
|
+
]
|
|
269
|
+
};
|
|
270
|
+
export {
|
|
271
|
+
toolbarMeta
|
|
272
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// src/components/toolbar/toolbar.variants.ts
|
|
2
|
+
import { cva } from "class-variance-authority";
|
|
3
|
+
var toolbarVariants = cva(
|
|
4
|
+
"inline-flex items-center gap-1 data-[orientation=vertical]:flex-col data-[orientation=vertical]:items-stretch"
|
|
5
|
+
);
|
|
6
|
+
var toolbarGroupVariants = cva(
|
|
7
|
+
"inline-flex items-center gap-1 data-[orientation=vertical]:flex-col data-[orientation=vertical]:items-stretch"
|
|
8
|
+
);
|
|
9
|
+
var toolbarSeparatorVariants = cva(
|
|
10
|
+
"shrink-0 self-stretch bg-hairline-strong data-[orientation=vertical]:mx-1 data-[orientation=vertical]:my-1.5 data-[orientation=vertical]:w-px data-[orientation=horizontal]:mx-1.5 data-[orientation=horizontal]:my-1 data-[orientation=horizontal]:h-px"
|
|
11
|
+
);
|
|
12
|
+
export {
|
|
13
|
+
toolbarGroupVariants,
|
|
14
|
+
toolbarSeparatorVariants,
|
|
15
|
+
toolbarVariants
|
|
16
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// src/components/tooltip/index.ts
|
|
2
|
+
import {
|
|
3
|
+
Tooltip,
|
|
4
|
+
TooltipProvider,
|
|
5
|
+
TooltipTrigger,
|
|
6
|
+
TooltipPortal,
|
|
7
|
+
TooltipContent,
|
|
8
|
+
TooltipArrow,
|
|
9
|
+
SimpleTooltip
|
|
10
|
+
} from "./tooltip.js";
|
|
11
|
+
import { tooltipMeta } from "./tooltip.meta.js";
|
|
12
|
+
export {
|
|
13
|
+
SimpleTooltip,
|
|
14
|
+
Tooltip,
|
|
15
|
+
TooltipArrow,
|
|
16
|
+
TooltipContent,
|
|
17
|
+
TooltipPortal,
|
|
18
|
+
TooltipProvider,
|
|
19
|
+
TooltipTrigger,
|
|
20
|
+
tooltipMeta
|
|
21
|
+
};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// src/components/tooltip/tooltip.tsx
|
|
2
|
+
import { Tooltip as Base } from "@base-ui/react/tooltip";
|
|
3
|
+
import { cn } from "../../lib/cn.js";
|
|
4
|
+
import { withPortalThemeScope } from "../../lib/portal-theme-scope.js";
|
|
5
|
+
import { useAnchoredDensity } from "../../lib/density.js";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
var TooltipProvider = Base.Provider;
|
|
8
|
+
var Tooltip = Base.Root;
|
|
9
|
+
var TooltipTrigger = Base.Trigger;
|
|
10
|
+
var TooltipPortal = withPortalThemeScope(Base.Portal);
|
|
11
|
+
function TooltipContent({
|
|
12
|
+
className,
|
|
13
|
+
children,
|
|
14
|
+
side = "top",
|
|
15
|
+
align = "center",
|
|
16
|
+
sideOffset = 6,
|
|
17
|
+
...props
|
|
18
|
+
}) {
|
|
19
|
+
const anchoredDensity = useAnchoredDensity();
|
|
20
|
+
return /* @__PURE__ */ jsx(TooltipPortal, { children: /* @__PURE__ */ jsx(Base.Positioner, { side, align, sideOffset, className: "z-(--z-overlay)", children: /* @__PURE__ */ jsx(
|
|
21
|
+
Base.Popup,
|
|
22
|
+
{
|
|
23
|
+
...anchoredDensity,
|
|
24
|
+
className: cn(
|
|
25
|
+
"select-none rounded-sm border border-border-floating bg-popover px-2.5 py-1.5 text-label-md text-popover-foreground shadow-md outline-none",
|
|
26
|
+
"motion-pop duration-(--motion-duration-fast)",
|
|
27
|
+
className
|
|
28
|
+
),
|
|
29
|
+
...props,
|
|
30
|
+
children
|
|
31
|
+
}
|
|
32
|
+
) }) });
|
|
33
|
+
}
|
|
34
|
+
function TooltipArrow({ className, ...props }) {
|
|
35
|
+
return /* @__PURE__ */ jsx(
|
|
36
|
+
Base.Arrow,
|
|
37
|
+
{
|
|
38
|
+
className: cn(
|
|
39
|
+
"group/arrow data-[side=bottom]:-top-1.5 data-[side=left]:-right-1.5 data-[side=right]:-left-1.5 data-[side=top]:-bottom-1.5",
|
|
40
|
+
className
|
|
41
|
+
),
|
|
42
|
+
...props,
|
|
43
|
+
children: /* @__PURE__ */ jsx(
|
|
44
|
+
"span",
|
|
45
|
+
{
|
|
46
|
+
"aria-hidden": true,
|
|
47
|
+
className: "block size-2.5 rotate-45 border-border-floating bg-popover group-data-[side=top]/arrow:border-b group-data-[side=top]/arrow:border-r group-data-[side=bottom]/arrow:border-t group-data-[side=bottom]/arrow:border-l group-data-[side=left]/arrow:border-t group-data-[side=left]/arrow:border-r group-data-[side=right]/arrow:border-b group-data-[side=right]/arrow:border-l"
|
|
48
|
+
}
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
function SimpleTooltip({
|
|
54
|
+
content,
|
|
55
|
+
children,
|
|
56
|
+
side,
|
|
57
|
+
align,
|
|
58
|
+
sideOffset,
|
|
59
|
+
...root
|
|
60
|
+
}) {
|
|
61
|
+
return /* @__PURE__ */ jsxs(Base.Root, { ...root, children: [
|
|
62
|
+
/* @__PURE__ */ jsx(Base.Trigger, { render: children }),
|
|
63
|
+
/* @__PURE__ */ jsx(TooltipContent, { side, align, sideOffset, children: content })
|
|
64
|
+
] });
|
|
65
|
+
}
|
|
66
|
+
export {
|
|
67
|
+
SimpleTooltip,
|
|
68
|
+
Tooltip,
|
|
69
|
+
TooltipArrow,
|
|
70
|
+
TooltipContent,
|
|
71
|
+
TooltipPortal,
|
|
72
|
+
TooltipProvider,
|
|
73
|
+
TooltipTrigger
|
|
74
|
+
};
|