@vamos-ui/react 0.0.0-stage → 0.2.0
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/LICENSE +21 -0
- package/README.md +27 -2
- package/dist/blocks/block-heading.d.ts +29 -0
- package/dist/blocks/block-heading.js +39 -0
- package/dist/blocks/block-image.d.ts +52 -0
- package/dist/blocks/block-image.js +48 -0
- package/dist/blocks/block-link.d.ts +30 -0
- package/dist/blocks/block-link.js +36 -0
- package/dist/blocks/create-blocks.d.ts +54 -0
- package/dist/blocks/create-blocks.js +52 -0
- package/dist/blocks/index.d.ts +55 -0
- package/dist/blocks/index.js +59 -0
- package/dist/blocks/json-ld.d.ts +18 -0
- package/dist/blocks/json-ld.js +44 -0
- package/dist/blocks/labels.d.ts +20 -0
- package/dist/blocks/labels.js +43 -0
- package/dist/blocks/rich-text.d.ts +36 -0
- package/dist/blocks/rich-text.js +106 -0
- package/dist/blocks/schema/define-block.d.ts +151 -0
- package/dist/blocks/schema/define-block.js +120 -0
- package/dist/blocks/schema/emphasis.d.ts +17 -0
- package/dist/blocks/schema/emphasis.js +69 -0
- package/dist/blocks/schema/fields.d.ts +497 -0
- package/dist/blocks/schema/fields.js +240 -0
- package/dist/blocks/schema/icons.d.ts +2 -0
- package/dist/blocks/schema/icons.js +26 -0
- package/dist/blocks/schema/index.d.ts +18 -0
- package/dist/blocks/schema/index.js +21 -0
- package/dist/blocks/schema/lint-types.d.ts +16 -0
- package/dist/blocks/schema/lint-types.js +2 -0
- package/dist/blocks/schema/lint.d.ts +32 -0
- package/dist/blocks/schema/lint.js +164 -0
- package/dist/blocks/schema/localize.d.ts +20 -0
- package/dist/blocks/schema/localize.js +29 -0
- package/dist/blocks/schema/localized.d.ts +25 -0
- package/dist/blocks/schema/localized.js +53 -0
- package/dist/blocks/schema/migrate.d.ts +24 -0
- package/dist/blocks/schema/migrate.js +75 -0
- package/dist/blocks/schema/nodes.d.ts +196 -0
- package/dist/blocks/schema/nodes.js +78 -0
- package/dist/blocks/schema/rich-doc-schema.d.ts +32 -0
- package/dist/blocks/schema/rich-doc-schema.js +66 -0
- package/dist/blocks/schema/rich-doc.d.ts +90 -0
- package/dist/blocks/schema/rich-doc.js +62 -0
- package/dist/blocks/schema/safety.d.ts +20 -0
- package/dist/blocks/schema/safety.js +49 -0
- package/dist/blocks/schema/types.d.ts +172 -0
- package/dist/blocks/schema/types.js +3 -0
- package/dist/blocks/schema/validate.d.ts +17 -0
- package/dist/blocks/schema/validate.js +32 -0
- package/dist/blocks/schema/walk.d.ts +22 -0
- package/dist/blocks/schema/walk.js +60 -0
- package/dist/blocks/section-header.d.ts +38 -0
- package/dist/blocks/section-header.js +22 -0
- package/dist/blocks/section.d.ts +59 -0
- package/dist/blocks/section.js +66 -0
- package/dist/blocks/site/_kit-1.d.ts +100 -0
- package/dist/blocks/site/_kit-1.js +135 -0
- package/dist/blocks/site/_site-icon-1.d.ts +6 -0
- package/dist/blocks/site/_site-icon-1.js +15 -0
- package/dist/blocks/site/announcement-bar.d.ts +42 -0
- package/dist/blocks/site/announcement-bar.js +38 -0
- package/dist/blocks/site/announcement-dismiss.d.ts +18 -0
- package/dist/blocks/site/announcement-dismiss.js +28 -0
- package/dist/blocks/site/article-layout.d.ts +65 -0
- package/dist/blocks/site/article-layout.js +88 -0
- package/dist/blocks/site/blog-list.d.ts +79 -0
- package/dist/blocks/site/blog-list.js +78 -0
- package/dist/blocks/site/comparison-table.d.ts +54 -0
- package/dist/blocks/site/comparison-table.js +38 -0
- package/dist/blocks/site/consent-banner.d.ts +52 -0
- package/dist/blocks/site/consent-banner.js +33 -0
- package/dist/blocks/site/contact-dock.d.ts +52 -0
- package/dist/blocks/site/contact-dock.js +55 -0
- package/dist/blocks/site/contact-form.d.ts +60 -0
- package/dist/blocks/site/contact-form.js +45 -0
- package/dist/blocks/site/cta-booking.d.ts +43 -0
- package/dist/blocks/site/cta-booking.js +69 -0
- package/dist/blocks/site/cta.d.ts +74 -0
- package/dist/blocks/site/cta.js +112 -0
- package/dist/blocks/site/embed-facade.d.ts +20 -0
- package/dist/blocks/site/embed-facade.js +21 -0
- package/dist/blocks/site/faq.d.ts +48 -0
- package/dist/blocks/site/faq.js +51 -0
- package/dist/blocks/site/feature-grid.d.ts +46 -0
- package/dist/blocks/site/feature-grid.js +49 -0
- package/dist/blocks/site/feature-tabs.d.ts +22 -0
- package/dist/blocks/site/feature-tabs.js +11 -0
- package/dist/blocks/site/footer.d.ts +68 -0
- package/dist/blocks/site/footer.js +61 -0
- package/dist/blocks/site/gallery-section.d.ts +42 -0
- package/dist/blocks/site/gallery-section.js +47 -0
- package/dist/blocks/site/hero-video.d.ts +15 -0
- package/dist/blocks/site/hero-video.js +31 -0
- package/dist/blocks/site/hero.d.ts +64 -0
- package/dist/blocks/site/hero.js +67 -0
- package/dist/blocks/site/logo-strip.d.ts +42 -0
- package/dist/blocks/site/logo-strip.js +26 -0
- package/dist/blocks/site/map-hours.d.ts +83 -0
- package/dist/blocks/site/map-hours.js +125 -0
- package/dist/blocks/site/media-text.d.ts +45 -0
- package/dist/blocks/site/media-text.js +55 -0
- package/dist/blocks/site/menu-list.d.ts +74 -0
- package/dist/blocks/site/menu-list.js +84 -0
- package/dist/blocks/site/navbar-submenu.d.ts +18 -0
- package/dist/blocks/site/navbar-submenu.js +51 -0
- package/dist/blocks/site/navbar.d.ts +67 -0
- package/dist/blocks/site/navbar.js +64 -0
- package/dist/blocks/site/not-found.d.ts +40 -0
- package/dist/blocks/site/not-found.js +38 -0
- package/dist/blocks/site/page-intro.d.ts +46 -0
- package/dist/blocks/site/page-intro.js +44 -0
- package/dist/blocks/site/pricing-table.d.ts +67 -0
- package/dist/blocks/site/pricing-table.js +82 -0
- package/dist/blocks/site/process.d.ts +36 -0
- package/dist/blocks/site/process.js +41 -0
- package/dist/blocks/site/registry-1.d.ts +720 -0
- package/dist/blocks/site/registry-1.js +783 -0
- package/dist/blocks/site/registry-2.d.ts +914 -0
- package/dist/blocks/site/registry-2.js +563 -0
- package/dist/blocks/site/rich-text-section.d.ts +34 -0
- package/dist/blocks/site/rich-text-section.js +32 -0
- package/dist/blocks/site/shared/brand-icons.d.ts +21 -0
- package/dist/blocks/site/shared/brand-icons.js +56 -0
- package/dist/blocks/site/shared/consent-gate.d.ts +41 -0
- package/dist/blocks/site/shared/consent-gate.js +43 -0
- package/dist/blocks/site/shared/consent-island.d.ts +38 -0
- package/dist/blocks/site/shared/consent-island.js +63 -0
- package/dist/blocks/site/shared/consent.d.ts +49 -0
- package/dist/blocks/site/shared/consent.js +130 -0
- package/dist/blocks/site/shared/contact-form-island.d.ts +41 -0
- package/dist/blocks/site/shared/contact-form-island.js +100 -0
- package/dist/blocks/site/shared/copy-link.d.ts +10 -0
- package/dist/blocks/site/shared/copy-link.js +25 -0
- package/dist/blocks/site/shared/dock-avoid.d.ts +15 -0
- package/dist/blocks/site/shared/dock-avoid.js +107 -0
- package/dist/blocks/site/shared/dock-hours.d.ts +13 -0
- package/dist/blocks/site/shared/dock-hours.js +25 -0
- package/dist/blocks/site/shared/gallery-lightbox.d.ts +12 -0
- package/dist/blocks/site/shared/gallery-lightbox.js +10 -0
- package/dist/blocks/site/shared/island-keys.d.ts +10 -0
- package/dist/blocks/site/shared/island-keys.js +44 -0
- package/dist/blocks/site/shared/kit-2.d.ts +55 -0
- package/dist/blocks/site/shared/kit-2.js +84 -0
- package/dist/blocks/site/shared/labels-2.d.ts +209 -0
- package/dist/blocks/site/shared/labels-2.js +427 -0
- package/dist/blocks/site/shared/open-now.d.ts +22 -0
- package/dist/blocks/site/shared/open-now.js +27 -0
- package/dist/blocks/site/shared/opening-hours.d.ts +117 -0
- package/dist/blocks/site/shared/opening-hours.js +245 -0
- package/dist/blocks/site/shared/site-accent.d.ts +48 -0
- package/dist/blocks/site/shared/site-accent.js +249 -0
- package/dist/blocks/site/shared/site-form.d.ts +79 -0
- package/dist/blocks/site/shared/site-form.js +111 -0
- package/dist/blocks/site/shared/site-routing.d.ts +54 -0
- package/dist/blocks/site/shared/site-routing.js +86 -0
- package/dist/blocks/site/shared/testimonials-carousel.d.ts +17 -0
- package/dist/blocks/site/shared/testimonials-carousel.js +64 -0
- package/dist/blocks/site/site-shell.d.ts +97 -0
- package/dist/blocks/site/site-shell.js +227 -0
- package/dist/blocks/site/stats-band.d.ts +40 -0
- package/dist/blocks/site/stats-band.js +41 -0
- package/dist/blocks/site/team.d.ts +44 -0
- package/dist/blocks/site/team.js +48 -0
- package/dist/blocks/site/testimonials.d.ts +68 -0
- package/dist/blocks/site/testimonials.js +65 -0
- package/dist/blocks/types.d.ts +63 -0
- package/dist/blocks/types.js +2 -0
- package/dist/business/approval-flow.d.ts +152 -0
- package/dist/business/approval-flow.js +221 -0
- package/dist/business/export-core.d.ts +55 -0
- package/dist/business/export-core.js +101 -0
- package/dist/business/export.d.ts +148 -0
- package/dist/business/export.js +264 -0
- package/dist/business/import-core.d.ts +104 -0
- package/dist/business/import-core.js +281 -0
- package/dist/business/import-wizard.d.ts +186 -0
- package/dist/business/import-wizard.js +401 -0
- package/dist/business/index.d.ts +11 -0
- package/dist/business/index.js +20 -0
- package/dist/business/line-items-core.d.ts +129 -0
- package/dist/business/line-items-core.js +183 -0
- package/dist/business/line-items.d.ts +119 -0
- package/dist/business/line-items.js +299 -0
- package/dist/business/multi-step-form.d.ts +131 -0
- package/dist/business/multi-step-form.js +337 -0
- package/dist/business/permission-core.d.ts +59 -0
- package/dist/business/permission-core.js +99 -0
- package/dist/business/permission-matrix.d.ts +158 -0
- package/dist/business/permission-matrix.js +341 -0
- package/dist/business/setup-checklist.d.ts +80 -0
- package/dist/business/setup-checklist.js +92 -0
- package/dist/charts/area-chart.d.ts +35 -0
- package/dist/charts/area-chart.js +33 -0
- package/dist/charts/bar-chart.d.ts +27 -0
- package/dist/charts/bar-chart.js +42 -0
- package/dist/charts/bar-list.d.ts +47 -0
- package/dist/charts/bar-list.js +60 -0
- package/dist/charts/chart-shell.d.ts +173 -0
- package/dist/charts/chart-shell.js +205 -0
- package/dist/charts/chart.d.ts +73 -0
- package/dist/charts/chart.js +106 -0
- package/dist/charts/combo-chart.d.ts +29 -0
- package/dist/charts/combo-chart.js +47 -0
- package/dist/charts/donut-chart.d.ts +33 -0
- package/dist/charts/donut-chart.js +113 -0
- package/dist/charts/funnel.d.ts +51 -0
- package/dist/charts/funnel.js +69 -0
- package/dist/charts/gauge.d.ts +62 -0
- package/dist/charts/gauge.js +104 -0
- package/dist/charts/heatmap.d.ts +81 -0
- package/dist/charts/heatmap.js +338 -0
- package/dist/charts/index.d.ts +12 -0
- package/dist/charts/index.js +14 -0
- package/dist/charts/line-chart.d.ts +21 -0
- package/dist/charts/line-chart.js +36 -0
- package/dist/charts/test-utils.d.ts +2 -0
- package/dist/charts/test-utils.js +38 -0
- package/dist/charts/utils.d.ts +130 -0
- package/dist/charts/utils.js +262 -0
- package/dist/components/accordion.d.ts +47 -0
- package/dist/components/accordion.js +70 -0
- package/dist/components/activity-timeline.d.ts +149 -0
- package/dist/components/activity-timeline.js +122 -0
- package/dist/components/address-field.d.ts +116 -0
- package/dist/components/address-field.js +219 -0
- package/dist/components/alert-dialog.d.ts +99 -0
- package/dist/components/alert-dialog.js +192 -0
- package/dist/components/alert.d.ts +42 -0
- package/dist/components/alert.js +82 -0
- package/dist/components/app-shell.d.ts +159 -0
- package/dist/components/app-shell.js +289 -0
- package/dist/components/attachment-list.d.ts +96 -0
- package/dist/components/attachment-list.js +196 -0
- package/dist/components/audit-log.d.ts +150 -0
- package/dist/components/audit-log.js +205 -0
- package/dist/components/avatar.d.ts +87 -0
- package/dist/components/avatar.js +126 -0
- package/dist/components/badge.d.ts +41 -0
- package/dist/components/badge.js +68 -0
- package/dist/components/breadcrumb.d.ts +78 -0
- package/dist/components/breadcrumb.js +106 -0
- package/dist/components/button-group.d.ts +52 -0
- package/dist/components/button-group.js +77 -0
- package/dist/components/button.d.ts +58 -0
- package/dist/components/button.js +107 -0
- package/dist/components/calendar.d.ts +240 -0
- package/dist/components/calendar.js +483 -0
- package/dist/components/card.d.ts +66 -0
- package/dist/components/card.js +76 -0
- package/dist/components/carousel.d.ts +170 -0
- package/dist/components/carousel.js +348 -0
- package/dist/components/checkbox.d.ts +78 -0
- package/dist/components/checkbox.js +138 -0
- package/dist/components/color-picker.d.ts +112 -0
- package/dist/components/color-picker.js +235 -0
- package/dist/components/combobox.d.ts +136 -0
- package/dist/components/combobox.js +294 -0
- package/dist/components/command.d.ts +275 -0
- package/dist/components/command.js +493 -0
- package/dist/components/comment-thread.d.ts +252 -0
- package/dist/components/comment-thread.js +449 -0
- package/dist/components/context-menu.d.ts +77 -0
- package/dist/components/context-menu.js +82 -0
- package/dist/components/currency-input.d.ts +43 -0
- package/dist/components/currency-input.js +85 -0
- package/dist/components/date-picker.d.ts +141 -0
- package/dist/components/date-picker.js +241 -0
- package/dist/components/date-range-picker.d.ts +91 -0
- package/dist/components/date-range-picker.js +251 -0
- package/dist/components/description-list.d.ts +92 -0
- package/dist/components/description-list.js +42 -0
- package/dist/components/dialog.d.ts +139 -0
- package/dist/components/dialog.js +185 -0
- package/dist/components/dropdown-menu.d.ts +100 -0
- package/dist/components/dropdown-menu.js +102 -0
- package/dist/components/editor-layout.d.ts +166 -0
- package/dist/components/editor-layout.js +237 -0
- package/dist/components/empty-state.d.ts +49 -0
- package/dist/components/empty-state.js +68 -0
- package/dist/components/entity-card.d.ts +83 -0
- package/dist/components/entity-card.js +92 -0
- package/dist/components/file-upload.d.ts +256 -0
- package/dist/components/file-upload.js +490 -0
- package/dist/components/formatted-input.d.ts +177 -0
- package/dist/components/formatted-input.js +399 -0
- package/dist/components/hierarchy-chart.d.ts +190 -0
- package/dist/components/hierarchy-chart.js +890 -0
- package/dist/components/hover-card.d.ts +21 -0
- package/dist/components/hover-card.js +32 -0
- package/dist/components/iban-input.d.ts +38 -0
- package/dist/components/iban-input.js +112 -0
- package/dist/components/id-input.d.ts +65 -0
- package/dist/components/id-input.js +130 -0
- package/dist/components/image.d.ts +130 -0
- package/dist/components/image.js +168 -0
- package/dist/components/input-otp.d.ts +62 -0
- package/dist/components/input-otp.js +73 -0
- package/dist/components/input.d.ts +141 -0
- package/dist/components/input.js +187 -0
- package/dist/components/item.d.ts +96 -0
- package/dist/components/item.js +113 -0
- package/dist/components/kbd.d.ts +64 -0
- package/dist/components/kbd.js +119 -0
- package/dist/components/list-layout.d.ts +144 -0
- package/dist/components/list-layout.js +210 -0
- package/dist/components/native-select.d.ts +33 -0
- package/dist/components/native-select.js +48 -0
- package/dist/components/navigation-menu.d.ts +127 -0
- package/dist/components/navigation-menu.js +129 -0
- package/dist/components/notification-center.d.ts +164 -0
- package/dist/components/notification-center.js +399 -0
- package/dist/components/page-header.d.ts +60 -0
- package/dist/components/page-header.js +60 -0
- package/dist/components/pagination.d.ts +121 -0
- package/dist/components/pagination.js +174 -0
- package/dist/components/phone-input.d.ts +49 -0
- package/dist/components/phone-input.js +266 -0
- package/dist/components/popover.d.ts +38 -0
- package/dist/components/popover.js +69 -0
- package/dist/components/progress.d.ts +79 -0
- package/dist/components/progress.js +97 -0
- package/dist/components/radio-group.d.ts +43 -0
- package/dist/components/radio-group.js +81 -0
- package/dist/components/record-detail-layout.d.ts +167 -0
- package/dist/components/record-detail-layout.js +233 -0
- package/dist/components/record-picker.d.ts +199 -0
- package/dist/components/record-picker.js +650 -0
- package/dist/components/resizable.d.ts +50 -0
- package/dist/components/resizable.js +88 -0
- package/dist/components/scroll-area.d.ts +40 -0
- package/dist/components/scroll-area.js +56 -0
- package/dist/components/select.d.ts +126 -0
- package/dist/components/select.js +137 -0
- package/dist/components/separator.d.ts +31 -0
- package/dist/components/separator.js +41 -0
- package/dist/components/settings-layout.d.ts +134 -0
- package/dist/components/settings-layout.js +180 -0
- package/dist/components/sheet.d.ts +103 -0
- package/dist/components/sheet.js +165 -0
- package/dist/components/sidebar.d.ts +171 -0
- package/dist/components/sidebar.js +421 -0
- package/dist/components/signature-pad.d.ts +85 -0
- package/dist/components/signature-pad.js +283 -0
- package/dist/components/skeleton.d.ts +64 -0
- package/dist/components/skeleton.js +53 -0
- package/dist/components/slider.d.ts +57 -0
- package/dist/components/slider.js +133 -0
- package/dist/components/slug-input.d.ts +69 -0
- package/dist/components/slug-input.js +201 -0
- package/dist/components/sparkline.d.ts +54 -0
- package/dist/components/sparkline.js +122 -0
- package/dist/components/spinner.d.ts +34 -0
- package/dist/components/spinner.js +34 -0
- package/dist/components/stat.d.ts +135 -0
- package/dist/components/stat.js +130 -0
- package/dist/components/status-picker.d.ts +107 -0
- package/dist/components/status-picker.js +175 -0
- package/dist/components/stepper.d.ts +86 -0
- package/dist/components/stepper.js +103 -0
- package/dist/components/switch.d.ts +34 -0
- package/dist/components/switch.js +70 -0
- package/dist/components/table.d.ts +101 -0
- package/dist/components/table.js +72 -0
- package/dist/components/tabs.d.ts +103 -0
- package/dist/components/tabs.js +173 -0
- package/dist/components/tag-input.d.ts +77 -0
- package/dist/components/tag-input.js +305 -0
- package/dist/components/task-list.d.ts +89 -0
- package/dist/components/task-list.js +238 -0
- package/dist/components/time-picker.d.ts +119 -0
- package/dist/components/time-picker.js +399 -0
- package/dist/components/toast.d.ts +87 -0
- package/dist/components/toast.js +142 -0
- package/dist/components/toggle.d.ts +77 -0
- package/dist/components/toggle.js +109 -0
- package/dist/components/tooltip.d.ts +69 -0
- package/dist/components/tooltip.js +105 -0
- package/dist/components/top-bar.d.ts +87 -0
- package/dist/components/top-bar.js +99 -0
- package/dist/components/tree-select.d.ts +89 -0
- package/dist/components/tree-select.js +243 -0
- package/dist/components/tree-view.d.ts +109 -0
- package/dist/components/tree-view.js +170 -0
- package/dist/components/typography.d.ts +107 -0
- package/dist/components/typography.js +128 -0
- package/dist/components/user-picker.d.ts +89 -0
- package/dist/components/user-picker.js +162 -0
- package/dist/components/version-history.d.ts +191 -0
- package/dist/components/version-history.js +431 -0
- package/dist/data-table/csv.d.ts +27 -0
- package/dist/data-table/csv.js +68 -0
- package/dist/data-table/data-table.d.ts +423 -0
- package/dist/data-table/data-table.js +1259 -0
- package/dist/data-table/filter-bar.d.ts +146 -0
- package/dist/data-table/filter-bar.js +569 -0
- package/dist/data-table/filter-fns.d.ts +65 -0
- package/dist/data-table/filter-fns.js +382 -0
- package/dist/data-table/index.d.ts +8 -0
- package/dist/data-table/index.js +9 -0
- package/dist/data-table/saved-views.d.ts +100 -0
- package/dist/data-table/saved-views.js +251 -0
- package/dist/data-table/types.d.ts +168 -0
- package/dist/data-table/types.js +87 -0
- package/dist/data-table/url-state.d.ts +94 -0
- package/dist/data-table/url-state.js +303 -0
- package/dist/data-table/view-state.d.ts +16 -0
- package/dist/data-table/view-state.js +81 -0
- package/dist/editor/_test-setup.d.ts +1 -0
- package/dist/editor/_test-setup.js +33 -0
- package/dist/editor/block-editor.d.ts +137 -0
- package/dist/editor/block-editor.js +280 -0
- package/dist/editor/commands.d.ts +31 -0
- package/dist/editor/commands.js +150 -0
- package/dist/editor/context.d.ts +108 -0
- package/dist/editor/context.js +30 -0
- package/dist/editor/convert.d.ts +66 -0
- package/dist/editor/convert.js +567 -0
- package/dist/editor/drag-handle.d.ts +10 -0
- package/dist/editor/drag-handle.js +69 -0
- package/dist/editor/extensions.d.ts +34 -0
- package/dist/editor/extensions.js +239 -0
- package/dist/editor/index.d.ts +14 -0
- package/dist/editor/index.js +17 -0
- package/dist/editor/inserter.d.ts +12 -0
- package/dist/editor/inserter.js +88 -0
- package/dist/editor/inspector.d.ts +17 -0
- package/dist/editor/inspector.js +65 -0
- package/dist/editor/items.d.ts +62 -0
- package/dist/editor/items.js +195 -0
- package/dist/editor/labels.d.ts +119 -0
- package/dist/editor/labels.js +130 -0
- package/dist/editor/markdown.d.ts +14 -0
- package/dist/editor/markdown.js +209 -0
- package/dist/editor/menus.d.ts +20 -0
- package/dist/editor/menus.js +236 -0
- package/dist/editor/nodes.d.ts +14 -0
- package/dist/editor/nodes.js +201 -0
- package/dist/editor/outline.d.ts +11 -0
- package/dist/editor/outline.js +52 -0
- package/dist/editor/schema-form.d.ts +64 -0
- package/dist/editor/schema-form.js +290 -0
- package/dist/editor/slash-menu.d.ts +15 -0
- package/dist/editor/slash-menu.js +119 -0
- package/dist/fonts/catalog.d.ts +53 -0
- package/dist/fonts/catalog.js +121 -0
- package/dist/fonts/font-picker.d.ts +70 -0
- package/dist/fonts/font-picker.js +225 -0
- package/dist/fonts/index.d.ts +6 -0
- package/dist/fonts/index.js +7 -0
- package/dist/fonts/loader.d.ts +66 -0
- package/dist/fonts/loader.js +161 -0
- package/dist/fonts/pairing-picker.d.ts +31 -0
- package/dist/fonts/pairing-picker.js +81 -0
- package/dist/fonts/pairings.d.ts +84 -0
- package/dist/fonts/pairings.js +149 -0
- package/dist/fonts/provider.d.ts +34 -0
- package/dist/fonts/provider.js +51 -0
- package/dist/form/index.d.ts +1 -0
- package/dist/form/index.js +1 -0
- package/dist/format/core.d.ts +149 -0
- package/dist/format/core.js +357 -0
- package/dist/format/index.d.ts +4 -0
- package/dist/format/index.js +5 -0
- package/dist/format/use-format.d.ts +1 -0
- package/dist/format/use-format.js +3 -0
- package/dist/index.d.ts +86 -0
- package/dist/index.js +87 -0
- package/dist/lib/cn.d.ts +3 -0
- package/dist/lib/cn.js +16 -0
- package/dist/lib/color.d.ts +64 -0
- package/dist/lib/color.js +177 -0
- package/dist/lib/compose-refs.d.ts +24 -0
- package/dist/lib/compose-refs.js +45 -0
- package/dist/lib/data-islands.d.ts +194 -0
- package/dist/lib/data-islands.js +368 -0
- package/dist/lib/date.d.ts +129 -0
- package/dist/lib/date.js +386 -0
- package/dist/lib/field-context.d.ts +64 -0
- package/dist/lib/field-context.js +62 -0
- package/dist/lib/floating-arrow.d.ts +18 -0
- package/dist/lib/floating-arrow.js +15 -0
- package/dist/lib/islands.d.ts +38 -0
- package/dist/lib/islands.js +40 -0
- package/dist/lib/labels.d.ts +51 -0
- package/dist/lib/labels.js +56 -0
- package/dist/lib/layer.d.ts +36 -0
- package/dist/lib/layer.js +42 -0
- package/dist/lib/locale.d.ts +85 -0
- package/dist/lib/locale.js +105 -0
- package/dist/lib/menu.d.ts +58 -0
- package/dist/lib/menu.js +99 -0
- package/dist/lib/message-format.d.ts +20 -0
- package/dist/lib/message-format.js +116 -0
- package/dist/lib/nav.d.ts +132 -0
- package/dist/lib/nav.js +178 -0
- package/dist/lib/provider.d.ts +100 -0
- package/dist/lib/provider.js +105 -0
- package/dist/lib/public.d.ts +22 -0
- package/dist/lib/public.js +33 -0
- package/dist/lib/sr-name.d.ts +18 -0
- package/dist/lib/sr-name.js +17 -0
- package/dist/lib/text.d.ts +100 -0
- package/dist/lib/text.js +233 -0
- package/dist/lib/theme-scope.d.ts +58 -0
- package/dist/lib/theme-scope.js +59 -0
- package/dist/lib/use-async-list.d.ts +60 -0
- package/dist/lib/use-async-list.js +119 -0
- package/dist/lib/use-container-width.d.ts +19 -0
- package/dist/lib/use-container-width.js +39 -0
- package/dist/lib/use-controllable-state.d.ts +33 -0
- package/dist/lib/use-controllable-state.js +56 -0
- package/dist/lib/use-edge-fade.d.ts +13 -0
- package/dist/lib/use-edge-fade.js +43 -0
- package/dist/lib/use-formatted-input.d.ts +69 -0
- package/dist/lib/use-formatted-input.js +152 -0
- package/dist/lib/use-hotkeys.d.ts +80 -0
- package/dist/lib/use-hotkeys.js +221 -0
- package/dist/lib/use-hover-intent.d.ts +44 -0
- package/dist/lib/use-hover-intent.js +119 -0
- package/dist/lib/use-media-query.d.ts +21 -0
- package/dist/lib/use-media-query.js +28 -0
- package/dist/lib/use-reduced-motion.d.ts +8 -0
- package/dist/lib/use-reduced-motion.js +13 -0
- package/dist/lib/use-tree.d.ts +153 -0
- package/dist/lib/use-tree.js +534 -0
- package/dist/lib/value-format.d.ts +25 -0
- package/dist/lib/value-format.js +56 -0
- package/dist/lib/variants.d.ts +131 -0
- package/dist/lib/variants.js +109 -0
- package/dist/locale-data/core/date.d.ts +24 -0
- package/dist/locale-data/core/date.js +68 -0
- package/dist/locale-data/core/decimal.d.ts +19 -0
- package/dist/locale-data/core/decimal.js +79 -0
- package/dist/locale-data/core/holidays.d.ts +30 -0
- package/dist/locale-data/core/holidays.js +79 -0
- package/dist/locale-data/core/iban.d.ts +29 -0
- package/dist/locale-data/core/iban.js +74 -0
- package/dist/locale-data/core/index.d.ts +7 -0
- package/dist/locale-data/core/index.js +6 -0
- package/dist/locale-data/core/types.d.ts +173 -0
- package/dist/locale-data/core/types.js +6 -0
- package/dist/locale-data/core/week-info.d.ts +23 -0
- package/dist/locale-data/core/week-info.js +85 -0
- package/dist/locale-data/core/working-days.d.ts +27 -0
- package/dist/locale-data/core/working-days.js +133 -0
- package/dist/locale-data/index.d.ts +2 -0
- package/dist/locale-data/index.js +4 -0
- package/dist/locale-data/tr/address-tr.json +1 -0
- package/dist/locale-data/tr/address.d.ts +23 -0
- package/dist/locale-data/tr/address.js +52 -0
- package/dist/locale-data/tr/holidays.d.ts +31 -0
- package/dist/locale-data/tr/holidays.js +81 -0
- package/dist/locale-data/tr/iban.d.ts +21 -0
- package/dist/locale-data/tr/iban.js +45 -0
- package/dist/locale-data/tr/id.d.ts +36 -0
- package/dist/locale-data/tr/id.js +120 -0
- package/dist/locale-data/tr/index.d.ts +12 -0
- package/dist/locale-data/tr/index.js +33 -0
- package/dist/locale-data/tr/kdv.d.ts +91 -0
- package/dist/locale-data/tr/kdv.js +222 -0
- package/dist/locales/en.d.ts +2102 -0
- package/dist/locales/en.js +2088 -0
- package/dist/locales/tr.d.ts +2086 -0
- package/dist/locales/tr.js +2087 -0
- package/dist/media/focal-point.d.ts +42 -0
- package/dist/media/focal-point.js +96 -0
- package/dist/media/gallery-layout.d.ts +19 -0
- package/dist/media/gallery-layout.js +61 -0
- package/dist/media/gallery.d.ts +64 -0
- package/dist/media/gallery.js +138 -0
- package/dist/media/image-cropper.d.ts +86 -0
- package/dist/media/image-cropper.js +170 -0
- package/dist/media/image-field.d.ts +115 -0
- package/dist/media/image-field.js +212 -0
- package/dist/media/index.d.ts +19 -0
- package/dist/media/index.js +23 -0
- package/dist/media/lightbox.d.ts +82 -0
- package/dist/media/lightbox.js +171 -0
- package/dist/media/link-preview.d.ts +97 -0
- package/dist/media/link-preview.js +177 -0
- package/dist/media/media-library.d.ts +244 -0
- package/dist/media/media-library.js +776 -0
- package/dist/media/media-picker.d.ts +96 -0
- package/dist/media/media-picker.js +209 -0
- package/dist/media/media-provider.d.ts +23 -0
- package/dist/media/media-provider.js +44 -0
- package/dist/media/media-utils.d.ts +39 -0
- package/dist/media/media-utils.js +145 -0
- package/dist/media/memory-adapter.d.ts +22 -0
- package/dist/media/memory-adapter.js +162 -0
- package/dist/media/rest-adapter.d.ts +90 -0
- package/dist/media/rest-adapter.js +208 -0
- package/dist/media/serp.d.ts +62 -0
- package/dist/media/serp.js +108 -0
- package/dist/media/test-fixtures.d.ts +3 -0
- package/dist/media/test-fixtures.js +37 -0
- package/dist/media/types.d.ts +183 -0
- package/dist/media/types.js +3 -0
- package/dist/media/use-pan-zoom.d.ts +51 -0
- package/dist/media/use-pan-zoom.js +156 -0
- package/dist/media/use-upload-queue.d.ts +64 -0
- package/dist/media/use-upload-queue.js +115 -0
- package/dist/media/video-player.d.ts +135 -0
- package/dist/media/video-player.js +319 -0
- package/dist/next/index.d.ts +42 -0
- package/dist/next/index.js +36 -0
- package/dist/render/block-renderer.d.ts +56 -0
- package/dist/render/block-renderer.js +137 -0
- package/dist/render/index.d.ts +6 -0
- package/dist/render/index.js +7 -0
- package/dist/render/prepare.d.ts +61 -0
- package/dist/render/prepare.js +119 -0
- package/dist/scheduler/core/duration.d.ts +83 -0
- package/dist/scheduler/core/duration.js +174 -0
- package/dist/scheduler/core/gantt.d.ts +63 -0
- package/dist/scheduler/core/gantt.js +226 -0
- package/dist/scheduler/core/index.d.ts +6 -0
- package/dist/scheduler/core/index.js +7 -0
- package/dist/scheduler/core/layout.d.ts +97 -0
- package/dist/scheduler/core/layout.js +249 -0
- package/dist/scheduler/core/time-scale.d.ts +89 -0
- package/dist/scheduler/core/time-scale.js +173 -0
- package/dist/scheduler/gantt.d.ts +125 -0
- package/dist/scheduler/gantt.js +532 -0
- package/dist/scheduler/index.d.ts +6 -0
- package/dist/scheduler/index.js +7 -0
- package/dist/scheduler/resource-calendar.d.ts +218 -0
- package/dist/scheduler/resource-calendar.js +661 -0
- package/dist/scheduler/scheduler.d.ts +168 -0
- package/dist/scheduler/scheduler.js +768 -0
- package/dist/scheduler/shared.d.ts +63 -0
- package/dist/scheduler/shared.js +145 -0
- package/dist/scheduler/time-tracker.d.ts +138 -0
- package/dist/scheduler/time-tracker.js +403 -0
- package/dist/sortable/core.d.ts +67 -0
- package/dist/sortable/core.js +167 -0
- package/dist/sortable/index.d.ts +8 -0
- package/dist/sortable/index.js +10 -0
- package/dist/sortable/kanban-core.d.ts +70 -0
- package/dist/sortable/kanban-core.js +67 -0
- package/dist/sortable/kanban.d.ts +147 -0
- package/dist/sortable/kanban.js +472 -0
- package/dist/sortable/sortable-list.d.ts +71 -0
- package/dist/sortable/sortable-list.js +76 -0
- package/dist/sortable/sortable-tree.d.ts +101 -0
- package/dist/sortable/sortable-tree.js +450 -0
- package/dist/sortable/sortable.d.ts +188 -0
- package/dist/sortable/sortable.js +485 -0
- package/dist/sortable/use-pointer-drag.d.ts +75 -0
- package/dist/sortable/use-pointer-drag.js +173 -0
- package/dist/sortable/use-time-scale.d.ts +11 -0
- package/dist/sortable/use-time-scale.js +19 -0
- package/dist/styles/base.css +51 -0
- package/dist/styles/blocks.css +949 -0
- package/dist/styles/calendar.css +642 -0
- package/dist/styles/charts.css +264 -0
- package/dist/styles/data.css +474 -0
- package/dist/styles/editors.css +1022 -0
- package/dist/styles/forms.css +406 -0
- package/dist/styles/media.css +515 -0
- package/dist/styles/navigation.css +293 -0
- package/dist/styles/overlays.css +244 -0
- package/dist/styles.css +742 -0
- package/package.json +156 -4
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
declare const stepperLabels: {
|
|
3
|
+
label: string;
|
|
4
|
+
step: string;
|
|
5
|
+
optional: string;
|
|
6
|
+
complete: string;
|
|
7
|
+
current: string;
|
|
8
|
+
error: string;
|
|
9
|
+
skipped: string;
|
|
10
|
+
};
|
|
11
|
+
type StepperLabels = Partial<typeof stepperLabels>;
|
|
12
|
+
export type StepStatus = "upcoming" | "current" | "complete" | "error" | "skipped";
|
|
13
|
+
export interface StepItem {
|
|
14
|
+
/** Stable key. Defaults to the index. */
|
|
15
|
+
id?: string;
|
|
16
|
+
title: React.ReactNode;
|
|
17
|
+
description?: React.ReactNode;
|
|
18
|
+
/** Overrides the status derived from `value` (e.g. `"error"` from validation, `"skipped"`). */
|
|
19
|
+
status?: StepStatus;
|
|
20
|
+
/** Shows an "Optional" note under the title. */
|
|
21
|
+
optional?: boolean;
|
|
22
|
+
/** Replaces the number in the indicator (upcoming / current steps). */
|
|
23
|
+
icon?: React.ReactNode;
|
|
24
|
+
/** Never clickable. */
|
|
25
|
+
disabled?: boolean;
|
|
26
|
+
/** Vertical only: content shown under the current step. */
|
|
27
|
+
content?: React.ReactNode;
|
|
28
|
+
}
|
|
29
|
+
export interface StepProps extends Omit<StepItem, "content"> {
|
|
30
|
+
/** Vertical only: content shown under this step while it is current. */
|
|
31
|
+
children?: React.ReactNode;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* One step, for the compound API: `<Stepper value={1}><Step title="Upload" /><Step title="Map columns" /></Stepper>`.
|
|
35
|
+
* It only describes the step; `Stepper` renders it.
|
|
36
|
+
*/
|
|
37
|
+
export declare function Step(_props: StepProps): React.ReactElement | null;
|
|
38
|
+
type Variant = "numbered" | "dots" | "bar" | "compact";
|
|
39
|
+
type Size = "sm" | "md";
|
|
40
|
+
export interface StepperProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange"> {
|
|
41
|
+
/** Current step, 0-based. */
|
|
42
|
+
value: number;
|
|
43
|
+
/** Makes navigable steps clickable. Moving between steps doesn't move focus; focus your step heading. */
|
|
44
|
+
onValueChange?: (index: number) => void;
|
|
45
|
+
/** Which steps may be clicked: `"completed"` (default, steps before the current one) · `"all"` · a predicate. */
|
|
46
|
+
navigable?: "completed" | "all" | ((index: number) => boolean);
|
|
47
|
+
orientation?: "horizontal" | "vertical";
|
|
48
|
+
/** `numbered` (default) · `dots` · `bar` (segments) · `compact` ("Step 2 of 4 · Map columns" + thin bar). */
|
|
49
|
+
variant?: Variant;
|
|
50
|
+
size?: Size;
|
|
51
|
+
/** Data-driven steps. Or pass `<Step>` children. */
|
|
52
|
+
steps?: StepItem[];
|
|
53
|
+
/** Spinner in the current step's indicator (e.g. while validating). */
|
|
54
|
+
loading?: boolean;
|
|
55
|
+
/** Horizontal steppers switch to `compact` below 640px. Default `true`. */
|
|
56
|
+
responsive?: boolean;
|
|
57
|
+
labels?: StepperLabels;
|
|
58
|
+
children?: React.ReactNode;
|
|
59
|
+
}
|
|
60
|
+
export interface StepIndicatorProps extends React.HTMLAttributes<HTMLSpanElement> {
|
|
61
|
+
status: StepStatus;
|
|
62
|
+
/** 1-based number shown for upcoming / current steps. */
|
|
63
|
+
number?: number;
|
|
64
|
+
icon?: React.ReactNode;
|
|
65
|
+
loading?: boolean;
|
|
66
|
+
size?: Size;
|
|
67
|
+
}
|
|
68
|
+
/** The circle: number, check, warning or spinner. Decorative (`aria-hidden`) — status is in the step's text. */
|
|
69
|
+
export declare function StepIndicator({ status, number, icon, loading, size, className, ...props }: StepIndicatorProps): React.JSX.Element;
|
|
70
|
+
/**
|
|
71
|
+
* Shows position and status in an ordered process (wizards, import flows, approvals, checkout).
|
|
72
|
+
* Display and navigation only — form state belongs to the consumer.
|
|
73
|
+
*
|
|
74
|
+
* ```tsx
|
|
75
|
+
* <Stepper value={1} steps={[{ title: "Upload" }, { title: "Map columns" }, { title: "Review" }, { title: "Import" }]} />
|
|
76
|
+
* <Stepper value={step} onValueChange={setStep} orientation="vertical">
|
|
77
|
+
* <Step title="Company details">…form…</Step>
|
|
78
|
+
* <Step title="Billing" optional />
|
|
79
|
+
* </Stepper>
|
|
80
|
+
* ```
|
|
81
|
+
*
|
|
82
|
+
* An ordered list; the current step has `aria-current="step"` and every step's name includes its
|
|
83
|
+
* position and status ("Step 2 of 4, Map columns, current").
|
|
84
|
+
*/
|
|
85
|
+
export declare const Stepper: React.ForwardRefExoticComponent<StepperProps & React.RefAttributes<HTMLDivElement>>;
|
|
86
|
+
export {};
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { AlertTriangle, Check, Minus } from "lucide-react";
|
|
5
|
+
import { cn } from "../lib/cn.js";
|
|
6
|
+
import { useLabels } from "../lib/labels.js";
|
|
7
|
+
import { Spinner } from "./spinner.js";
|
|
8
|
+
const stepperLabels = {
|
|
9
|
+
label: "Progress",
|
|
10
|
+
step: "Step {current} of {total}",
|
|
11
|
+
optional: "Optional",
|
|
12
|
+
complete: "Completed",
|
|
13
|
+
current: "Current",
|
|
14
|
+
error: "Needs attention",
|
|
15
|
+
skipped: "Skipped",
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* One step, for the compound API: `<Stepper value={1}><Step title="Upload" /><Step title="Map columns" /></Stepper>`.
|
|
19
|
+
* It only describes the step; `Stepper` renders it.
|
|
20
|
+
*/
|
|
21
|
+
export function Step(_props) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
const indicatorSize = { sm: "size-6 text-[11px] [&_svg]:size-3", md: "size-7 text-xs [&_svg]:size-3.5" };
|
|
25
|
+
/** The circle: number, check, warning or spinner. Decorative (`aria-hidden`) — status is in the step's text. */
|
|
26
|
+
export function StepIndicator({ status, number, icon, loading, size = "md", className, ...props }) {
|
|
27
|
+
return (_jsx("span", { "aria-hidden": true, "data-slot": "step-indicator", "data-status": status, className: cn("relative inline-flex shrink-0 items-center justify-center rounded-full font-semibold tabular transition-[background-color,box-shadow,color] duration-200", indicatorSize[size], status === "complete" && "bg-accent text-accent-fg", status === "current" && "bg-surface text-fg shadow-[0_0_0_1.5px_var(--accent-ink),0_0_0_5px_var(--accent-soft)]", status === "upcoming" && "text-fg-subtle shadow-[inset_0_0_0_1.5px_var(--track)]", status === "error" && "tone-danger tone-soft shadow-[inset_0_0_0_1.5px_var(--danger)]", status === "skipped" && "border-[1.5px] border-dashed border-field-border text-fg-subtle", className), ...props, children: loading ? (_jsx(Spinner, { size: "xs" })) : status === "complete" ? (_jsx(Check, { strokeWidth: 3 })) : status === "error" ? (_jsx(AlertTriangle, { strokeWidth: 2.5 })) : status === "skipped" ? (_jsx(Minus, { strokeWidth: 2.5 })) : ((icon ?? number)) }));
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Shows position and status in an ordered process (wizards, import flows, approvals, checkout).
|
|
31
|
+
* Display and navigation only — form state belongs to the consumer.
|
|
32
|
+
*
|
|
33
|
+
* ```tsx
|
|
34
|
+
* <Stepper value={1} steps={[{ title: "Upload" }, { title: "Map columns" }, { title: "Review" }, { title: "Import" }]} />
|
|
35
|
+
* <Stepper value={step} onValueChange={setStep} orientation="vertical">
|
|
36
|
+
* <Step title="Company details">…form…</Step>
|
|
37
|
+
* <Step title="Billing" optional />
|
|
38
|
+
* </Stepper>
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* An ordered list; the current step has `aria-current="step"` and every step's name includes its
|
|
42
|
+
* position and status ("Step 2 of 4, Map columns, current").
|
|
43
|
+
*/
|
|
44
|
+
export const Stepper = React.forwardRef(function Stepper({ value, onValueChange, navigable = "completed", orientation = "horizontal", variant = "numbered", size = "md", steps: stepsProp, loading, responsive = true, labels, className, children, "aria-label": ariaLabel, ...props }, ref) {
|
|
45
|
+
const t = useLabels("stepper", stepperLabels, labels);
|
|
46
|
+
const raw = stepsProp ??
|
|
47
|
+
React.Children.toArray(children)
|
|
48
|
+
.filter((c) => React.isValidElement(c) && c.type === Step)
|
|
49
|
+
.map(({ props: { children: content, ...rest } }) => ({ ...rest, content }));
|
|
50
|
+
const total = raw.length;
|
|
51
|
+
const canNavigate = (i, status) => typeof navigable === "function" ? navigable(i) : navigable === "all" ? true : i < value || status === "complete";
|
|
52
|
+
const steps = raw.map((s, i) => {
|
|
53
|
+
const status = s.status ?? (i < value ? "complete" : i === value ? "current" : "upcoming");
|
|
54
|
+
return { ...s, index: i, status, key: s.id ?? String(i), clickable: Boolean(onValueChange) && !s.disabled && i !== value && canNavigate(i, status) };
|
|
55
|
+
});
|
|
56
|
+
const statusWord = (s) => (s === "upcoming" ? "" : t(s === "complete" ? "complete" : s));
|
|
57
|
+
const name = (s) => ({
|
|
58
|
+
before: `${t("step", { current: s.index + 1, total })}, `,
|
|
59
|
+
after: statusWord(s.status) ? `, ${statusWord(s.status)}` : "",
|
|
60
|
+
});
|
|
61
|
+
const effective = orientation === "vertical" && variant === "bar" ? "numbered" : variant;
|
|
62
|
+
const showCompactOnMobile = responsive && orientation === "horizontal" && effective !== "compact";
|
|
63
|
+
const current = steps[Math.min(Math.max(value, 0), Math.max(total - 1, 0))];
|
|
64
|
+
const compact = current ? (_jsxs("div", { "data-slot": "stepper-compact", className: cn("flex flex-col gap-2", showCompactOnMobile && "sm:hidden"), children: [_jsxs("p", { className: "flex min-w-0 items-baseline gap-1.5 text-[13px]", children: [_jsx("span", { className: "tabular shrink-0 text-fg-muted", children: t("step", { current: current.index + 1, total }) }), _jsx("span", { "aria-hidden": true, className: "text-fg-subtle", children: "\u00B7" }), _jsx("span", { className: "truncate font-medium text-fg", children: current.title }), current.status === "error" ? _jsx("span", { className: "shrink-0 text-danger", children: t("error") }) : null] }), _jsx("span", { "aria-hidden": true, className: "block h-1 overflow-hidden rounded-full bg-track", children: _jsx("span", { className: "block h-full rounded-full bg-accent transition-[width] duration-300 motion-reduce:transition-none", style: { width: `${((current.index + 1) / total) * 100}%` } }) })] })) : null;
|
|
65
|
+
const renderTrigger = (s, inner, extra) => {
|
|
66
|
+
const n = name(s);
|
|
67
|
+
const body = (_jsxs(_Fragment, { children: [_jsx("span", { className: "sr-only", children: n.before }), inner, n.after ? _jsx("span", { className: "sr-only", children: n.after }) : null] }));
|
|
68
|
+
return s.clickable ? (_jsx("button", { type: "button", "data-slot": "step-trigger", onClick: () => onValueChange?.(s.index), className: cn("group/step -m-1 flex min-w-0 items-start gap-3 rounded-ui-sm p-1 text-start outline-none focus-ring", extra), children: body })) : (_jsx("div", { "data-slot": "step-trigger", className: cn("flex min-w-0 items-start gap-3", extra), children: body }));
|
|
69
|
+
};
|
|
70
|
+
const text = (s, opts = {}) => (_jsxs("span", { className: cn("flex min-w-0 flex-col", size === "sm" ? "gap-0 pt-0.5" : "gap-0.5 pt-1", opts.hideTitle && "sr-only"), children: [_jsx("span", { "data-slot": "step-title", className: cn("font-medium leading-tight", size === "sm" ? "text-[13px]" : "text-sm", s.status === "upcoming" || s.status === "skipped" ? "text-fg-muted" : "text-fg", s.status === "error" && "text-danger", s.clickable && "group-hover/step:underline group-hover/step:decoration-line group-hover/step:underline-offset-4"), children: s.title }), s.optional ? _jsx("span", { className: "text-xs text-fg-subtle", children: t("optional") }) : null, s.description ? _jsx("span", { className: cn("text-fg-subtle", size === "sm" ? "text-xs" : "text-[13px]"), children: s.description }) : null] }));
|
|
71
|
+
const listLabel = ariaLabel ?? t("label");
|
|
72
|
+
const passed = (s) => s.index < value && s.status !== "error";
|
|
73
|
+
const connectorTop = size === "sm" ? "mt-3" : "mt-3.5";
|
|
74
|
+
let list = null;
|
|
75
|
+
if (effective === "numbered" && orientation === "horizontal") {
|
|
76
|
+
list = (_jsx("ol", { "aria-label": listLabel, className: cn("flex items-start gap-3", showCompactOnMobile && "max-sm:hidden"), children: steps.map((s, i) => (_jsxs("li", { "data-status": s.status, "aria-current": s.status === "current" || i === value ? "step" : undefined, className: "flex min-w-0 flex-auto items-start gap-3 last:flex-none", children: [renderTrigger(s, _jsxs(_Fragment, { children: [_jsx(StepIndicator, { status: s.status, number: i + 1, icon: s.icon, loading: loading && i === value, size: size }), text(s)] }), "min-w-min"), i < total - 1 ? (_jsx("span", { "aria-hidden": true, className: cn("h-px min-w-6 flex-1 transition-colors duration-300", connectorTop, passed(s) ? "bg-accent-ink" : "bg-line") })) : null] }, s.key))) }));
|
|
77
|
+
}
|
|
78
|
+
else if (effective === "numbered" || (effective === "dots" && orientation === "vertical")) {
|
|
79
|
+
const dots = effective === "dots";
|
|
80
|
+
list = (_jsx("ol", { "aria-label": listLabel, className: "flex flex-col", children: steps.map((s, i) => (_jsxs("li", { "data-status": s.status, "aria-current": i === value ? "step" : undefined, className: "grid grid-cols-[auto_minmax(0,1fr)] gap-x-3", children: [_jsxs("span", { className: "flex flex-col items-center", children: [dots ? (_jsx("span", { "aria-hidden": true, className: cn("mt-1.5 size-2.5 shrink-0 rounded-full", dotClass(s.status)) })) : (_jsx(StepIndicator, { status: s.status, number: i + 1, icon: s.icon, loading: loading && i === value, size: size, onClick: s.clickable ? () => onValueChange?.(s.index) : undefined, className: s.clickable ? "cursor-pointer" : undefined })), i < total - 1 ? _jsx("span", { "aria-hidden": true, className: cn("my-1.5 w-px min-h-5 flex-1 transition-colors duration-300", passed(s) ? "bg-accent-ink" : "bg-line") }) : null] }), _jsxs("div", { className: cn("min-w-0", i < total - 1 && (size === "sm" ? "pb-4" : "pb-6")), children: [renderTrigger(s, text(s), dots ? "-mt-0.5" : undefined), i === value && s.content ? (_jsx("div", { "data-slot": "step-content", className: cn("pt-3", size === "sm" ? "text-[13px]" : "text-sm"), children: s.content })) : null] })] }, s.key))) }));
|
|
81
|
+
}
|
|
82
|
+
else if (effective === "dots") {
|
|
83
|
+
list = (_jsx("ol", { "aria-label": listLabel, className: cn("flex items-center gap-2", showCompactOnMobile && "max-sm:hidden"), children: steps.map((s, i) => (_jsxs("li", { "data-status": s.status, "aria-current": i === value ? "step" : undefined, className: "flex flex-1 items-center gap-2 last:flex-none", children: [renderTrigger(s, _jsxs(_Fragment, { children: [_jsx("span", { "aria-hidden": true, title: typeof s.title === "string" ? s.title : undefined, className: cn("block h-2.5 rounded-full transition-[width,background-color] duration-300 motion-reduce:transition-none", i === value ? "w-6" : "w-2.5", dotClass(s.status)) }), text(s, { hideTitle: true })] }), "items-center p-1.5 -m-1.5"), i < total - 1 ? _jsx("span", { "aria-hidden": true, className: cn("h-px min-w-3 flex-1", passed(s) ? "bg-accent-ink" : "bg-line") }) : null] }, s.key))) }));
|
|
84
|
+
}
|
|
85
|
+
else if (effective === "bar") {
|
|
86
|
+
list = (_jsx("ol", { "aria-label": listLabel, className: cn("grid gap-1.5", showCompactOnMobile && "max-sm:hidden"), style: { gridTemplateColumns: `repeat(${total}, minmax(0, 1fr))` }, children: steps.map((s, i) => (_jsx("li", { "data-status": s.status, "aria-current": i === value ? "step" : undefined, className: "min-w-0", children: renderTrigger(s, _jsxs("span", { className: "flex w-full min-w-0 flex-col gap-2", children: [_jsx("span", { "aria-hidden": true, className: cn("block h-1 rounded-full transition-colors duration-300", barClass(s.status)) }), text(s)] }), "w-full") }, s.key))) }));
|
|
87
|
+
}
|
|
88
|
+
return (_jsxs("div", { ref: ref, "data-slot": "stepper", "data-orientation": orientation, "data-variant": effective, className: cn("min-w-0", className), ...props, children: [effective === "compact" ? (_jsx("ol", { "aria-label": listLabel, className: "sr-only", children: steps.map((s, i) => (_jsxs("li", { "aria-current": i === value ? "step" : undefined, children: [name(s).before, s.title, name(s).after] }, s.key))) })) : (list), effective === "compact" || showCompactOnMobile ? _jsx("div", { "aria-hidden": effective === "compact" || undefined, children: compact }) : null] }));
|
|
89
|
+
});
|
|
90
|
+
function dotClass(status) {
|
|
91
|
+
return status === "complete" ? "bg-accent-ink" : status === "current" ? "bg-accent shadow-[0_0_0_1.5px_var(--accent-ink)]" : status === "error" ? "bg-danger" : "bg-track";
|
|
92
|
+
}
|
|
93
|
+
function barClass(status) {
|
|
94
|
+
return status === "complete"
|
|
95
|
+
? "bg-accent-ink"
|
|
96
|
+
: status === "current"
|
|
97
|
+
? "bg-accent"
|
|
98
|
+
: status === "error"
|
|
99
|
+
? "bg-danger"
|
|
100
|
+
: status === "skipped"
|
|
101
|
+
? "bg-[repeating-linear-gradient(90deg,var(--track)_0_4px,transparent_4px_7px)]"
|
|
102
|
+
: "bg-track";
|
|
103
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { Switch as SwitchPrimitive } from "radix-ui";
|
|
3
|
+
export declare const switchVariants: (props?: ({
|
|
4
|
+
size?: "sm" | "md" | null | undefined;
|
|
5
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
6
|
+
export interface SwitchProps extends Omit<React.ComponentPropsWithoutRef<typeof SwitchPrimitive.Root>, "checked" | "defaultChecked" | "onCheckedChange" | "children"> {
|
|
7
|
+
checked?: boolean;
|
|
8
|
+
defaultChecked?: boolean;
|
|
9
|
+
onCheckedChange?: (checked: boolean) => void;
|
|
10
|
+
/** Text beside the switch; clicking it toggles. */
|
|
11
|
+
label?: React.ReactNode;
|
|
12
|
+
/** Secondary line under the label. */
|
|
13
|
+
description?: React.ReactNode;
|
|
14
|
+
/** `"end"` (default): switch, then label. `"start"`: label first, switch at the far end (settings rows). */
|
|
15
|
+
labelPosition?: "start" | "end";
|
|
16
|
+
size?: "sm" | "md";
|
|
17
|
+
/** A save is in flight: spinner in the thumb, `aria-busy`, changes locked. */
|
|
18
|
+
loading?: boolean;
|
|
19
|
+
invalid?: boolean;
|
|
20
|
+
/** Focusable, but can't be flipped (`aria-readonly`). */
|
|
21
|
+
readOnly?: boolean;
|
|
22
|
+
/** Classes for the track when `label` is used (`className` goes on the row). */
|
|
23
|
+
controlClassName?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Instant on/off setting: "Maintenance mode", "Accept online bookings", active/inactive in a table.
|
|
27
|
+
* Radix Switch (`role="switch"`), Field-aware, with an optimistic-save `loading` state.
|
|
28
|
+
*
|
|
29
|
+
* ```tsx
|
|
30
|
+
* <Switch label="Email digests" description="A summary every Monday at 9:00." defaultChecked />
|
|
31
|
+
* <Switch size="sm" checked={active} onCheckedChange={save} loading={saving} aria-label="Active" />
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare const Switch: React.ForwardRefExoticComponent<SwitchProps & React.RefAttributes<HTMLButtonElement>>;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { Switch as SwitchPrimitive } from "radix-ui";
|
|
5
|
+
import { cva } from "class-variance-authority";
|
|
6
|
+
import { cn } from "../lib/cn.js";
|
|
7
|
+
import { mergeIds } from "../lib/compose-refs.js";
|
|
8
|
+
import { useFieldControl } from "../lib/field-context.js";
|
|
9
|
+
import { useControllableState } from "../lib/use-controllable-state.js";
|
|
10
|
+
import { Spinner } from "./spinner.js";
|
|
11
|
+
export const switchVariants = cva([
|
|
12
|
+
"group/switch relative inline-flex shrink-0 cursor-pointer items-center rounded-full border border-transparent p-[2px] outline-none",
|
|
13
|
+
"bg-track transition-[background-color,box-shadow] duration-200",
|
|
14
|
+
"data-[state=unchecked]:hover:bg-[color-mix(in_srgb,var(--track),var(--fg)_9%)]",
|
|
15
|
+
"data-[state=checked]:bg-accent data-[state=checked]:shadow-[inset_0_0_0_1px_color-mix(in_srgb,var(--fg)_10%,transparent)]",
|
|
16
|
+
"focus-visible:shadow-[0_0_0_2px_var(--scene),0_0_0_4px_var(--ring)]",
|
|
17
|
+
"aria-invalid:shadow-[inset_0_0_0_1.5px_var(--danger)]",
|
|
18
|
+
"disabled:cursor-not-allowed disabled:opacity-45 aria-busy:cursor-progress",
|
|
19
|
+
], {
|
|
20
|
+
variants: {
|
|
21
|
+
size: {
|
|
22
|
+
/** 28 × 16 — table rows, dense lists. */
|
|
23
|
+
sm: "h-4 w-7 [--switch-thumb-size:12px] [--switch-travel:12px]",
|
|
24
|
+
/** 36 × 20. */
|
|
25
|
+
md: "h-5 w-9 [--switch-thumb-size:16px] [--switch-travel:16px]",
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
defaultVariants: { size: "md" },
|
|
29
|
+
});
|
|
30
|
+
/**
|
|
31
|
+
* Instant on/off setting: "Maintenance mode", "Accept online bookings", active/inactive in a table.
|
|
32
|
+
* Radix Switch (`role="switch"`), Field-aware, with an optimistic-save `loading` state.
|
|
33
|
+
*
|
|
34
|
+
* ```tsx
|
|
35
|
+
* <Switch label="Email digests" description="A summary every Monday at 9:00." defaultChecked />
|
|
36
|
+
* <Switch size="sm" checked={active} onCheckedChange={save} loading={saving} aria-label="Active" />
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export const Switch = React.forwardRef(function Switch(rawProps, ref) {
|
|
40
|
+
const { checked: checkedProp, defaultChecked, onCheckedChange, label, description, labelPosition = "end", size = "md", loading, invalid, className, controlClassName, style, ...rest } = rawProps;
|
|
41
|
+
const control = useFieldControl({ ...rest, "aria-invalid": invalid ? true : rest["aria-invalid"] });
|
|
42
|
+
const { readOnly, required, ...controlProps } = control;
|
|
43
|
+
const [checked, setChecked] = useControllableState({
|
|
44
|
+
value: checkedProp,
|
|
45
|
+
defaultValue: defaultChecked ?? false,
|
|
46
|
+
onChange: onCheckedChange,
|
|
47
|
+
name: "Switch",
|
|
48
|
+
});
|
|
49
|
+
const autoId = React.useId();
|
|
50
|
+
const id = controlProps.id ?? (label ? `sw${autoId.replace(/:/g, "")}` : undefined);
|
|
51
|
+
const descId = description ? `${id ?? autoId}-desc` : undefined;
|
|
52
|
+
const labelId = label ? `${id ?? autoId}-label` : undefined;
|
|
53
|
+
const labelledBy = controlProps["aria-labelledby"] ?? (label && !controlProps["aria-label"] ? labelId : undefined);
|
|
54
|
+
const locked = readOnly || loading;
|
|
55
|
+
const track = (_jsx(SwitchPrimitive.Root, { ref: ref, "data-slot": "switch", "data-size": size, ...controlProps, id: id, required: required, "aria-required": required || undefined, "aria-readonly": readOnly || undefined, "aria-busy": loading || undefined, "aria-labelledby": labelledBy, "aria-describedby": mergeIds(controlProps["aria-describedby"], descId), checked: checked, onCheckedChange: (next) => {
|
|
56
|
+
if (locked)
|
|
57
|
+
return;
|
|
58
|
+
setChecked(next);
|
|
59
|
+
}, onKeyDown: (e) => {
|
|
60
|
+
if (locked && (e.key === " " || e.key === "Enter"))
|
|
61
|
+
e.preventDefault();
|
|
62
|
+
controlProps.onKeyDown?.(e);
|
|
63
|
+
}, className: cn(switchVariants({ size }), label ? controlClassName : cn(controlClassName, className)), style: label ? undefined : style, children: _jsx(SwitchPrimitive.Thumb, { "data-slot": "switch-thumb", className: cn("pointer-events-none flex size-(--switch-thumb-size) items-center justify-center rounded-full bg-(--switch-thumb) text-fg-muted", "shadow-[0_1px_2px_rgb(0_0_0/0.18),0_0_0_0.5px_rgb(0_0_0/0.06)]", "transition-[transform,width,background-color] duration-200 ease-[cubic-bezier(0.3,1.3,0.5,1)]", "data-[state=checked]:translate-x-[calc(var(--switch-travel)*var(--dir))] data-[state=checked]:bg-accent-fg data-[state=checked]:text-accent",
|
|
64
|
+
// a little stretch while pressed
|
|
65
|
+
"group-active/switch:w-[calc(var(--switch-thumb-size)+3px)] group-active/switch:data-[state=checked]:translate-x-[calc((var(--switch-travel)-3px)*var(--dir))]"), children: loading ? _jsx(Spinner, { size: size === "sm" ? 9 : 11 }) : null }) }));
|
|
66
|
+
if (!label)
|
|
67
|
+
return track;
|
|
68
|
+
const text = (_jsxs("label", { htmlFor: id, className: cn("grid min-w-0 select-none gap-0.5", controlProps.disabled ? "cursor-not-allowed opacity-60" : "cursor-pointer"), children: [_jsx("span", { id: labelId, className: cn("text-fg", size === "sm" ? "text-[13px] leading-4" : "text-sm leading-5"), children: label }), description ? (_jsx("span", { id: descId, className: cn("text-pretty leading-[1.45] text-fg-subtle", size === "sm" ? "text-[11.5px]" : "text-xs"), children: description })) : null] }));
|
|
69
|
+
return (_jsxs("div", { "data-slot": "switch-row", "data-label-position": labelPosition, className: cn("flex items-start gap-3", labelPosition === "start" && "justify-between gap-6", className), style: style, children: [labelPosition === "start" ? text : null, _jsx("span", { className: cn("flex shrink-0 items-center", size === "sm" ? "h-4" : "h-5"), children: track }), labelPosition === "end" ? text : null] }));
|
|
70
|
+
});
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
type Align = "start" | "center" | "end";
|
|
3
|
+
export interface TableContainerProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
4
|
+
/** Accessible name of the scroll region (required when the table can scroll). */
|
|
5
|
+
"aria-label"?: string;
|
|
6
|
+
/** Max height; the header stays visible with `<Table stickyHeader>`. E.g. `"24rem"`. */
|
|
7
|
+
maxHeight?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Scroll wrapper for a Table: horizontal (and optional vertical) scrolling with soft edge fades
|
|
11
|
+
* that show there is more content. It is a focusable, named region so keyboard users can scroll.
|
|
12
|
+
*/
|
|
13
|
+
export declare const TableContainer: React.ForwardRefExoticComponent<TableContainerProps & React.RefAttributes<HTMLDivElement>>;
|
|
14
|
+
export interface TableProps extends React.TableHTMLAttributes<HTMLTableElement> {
|
|
15
|
+
/** Row height + cell padding (`--row-h`, `--cell-px`). `"inherit"` follows the page `data-density`. Default `"inherit"`. */
|
|
16
|
+
density?: "inherit" | "compact" | "comfortable" | "spacious";
|
|
17
|
+
/** Zebra rows. */
|
|
18
|
+
striped?: boolean;
|
|
19
|
+
/** Row hover tint. Default `true`. */
|
|
20
|
+
hover?: boolean;
|
|
21
|
+
/** `"rows"` (default) hairlines between rows · `"grid"` every cell · `"none"`. */
|
|
22
|
+
bordered?: "rows" | "grid" | "none";
|
|
23
|
+
/** Keep the header visible while the TableContainer scrolls. Opaque (never blurred). */
|
|
24
|
+
stickyHeader?: boolean;
|
|
25
|
+
/** Pin the first column while scrolling sideways. */
|
|
26
|
+
stickyFirstColumn?: boolean;
|
|
27
|
+
/** `"fixed"` uses the column widths you set (`<TableHead style={{ width }}>`). Default `"auto"`. */
|
|
28
|
+
layout?: "auto" | "fixed";
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Styled semantic table for small and static data: line items, settings lists, chart data.
|
|
32
|
+
* Server-component compatible. Give it a `<TableCaption>` or `aria-label`.
|
|
33
|
+
*
|
|
34
|
+
* ```tsx
|
|
35
|
+
* <TableContainer aria-label="Invoice lines">
|
|
36
|
+
* <Table>
|
|
37
|
+
* <TableCaption>Invoice INV-2041</TableCaption>
|
|
38
|
+
* <TableHeader><TableRow><TableHead>Item</TableHead><TableHead numeric>Amount</TableHead></TableRow></TableHeader>
|
|
39
|
+
* <TableBody><TableRow><TableCell>Design retainer</TableCell><TableCell numeric>$4,500.00</TableCell></TableRow></TableBody>
|
|
40
|
+
* </Table>
|
|
41
|
+
* </TableContainer>
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare const Table: React.ForwardRefExoticComponent<TableProps & React.RefAttributes<HTMLTableElement>>;
|
|
45
|
+
export interface TableCaptionProps extends React.HTMLAttributes<HTMLTableCaptionElement> {
|
|
46
|
+
/** Keep the caption for screen readers only. */
|
|
47
|
+
visuallyHidden?: boolean;
|
|
48
|
+
/** Default `"bottom"`. */
|
|
49
|
+
side?: "top" | "bottom";
|
|
50
|
+
}
|
|
51
|
+
/** Names the table. Visible under the table by default; `visuallyHidden` keeps it for screen readers. */
|
|
52
|
+
export declare const TableCaption: React.ForwardRefExoticComponent<TableCaptionProps & React.RefAttributes<HTMLTableCaptionElement>>;
|
|
53
|
+
export declare const TableHeader: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLTableSectionElement> & React.RefAttributes<HTMLTableSectionElement>>;
|
|
54
|
+
export declare const TableBody: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLTableSectionElement> & React.RefAttributes<HTMLTableSectionElement>>;
|
|
55
|
+
export declare const TableFooter: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLTableSectionElement> & React.RefAttributes<HTMLTableSectionElement>>;
|
|
56
|
+
export interface TableRowProps extends React.HTMLAttributes<HTMLTableRowElement> {
|
|
57
|
+
/** Selected row (`data-state="selected"`, `aria-selected`). */
|
|
58
|
+
selected?: boolean;
|
|
59
|
+
/** Dimmed, non-interactive row. */
|
|
60
|
+
disabled?: boolean;
|
|
61
|
+
/** Accent bar at the start edge — e.g. the row you just created. */
|
|
62
|
+
highlighted?: boolean;
|
|
63
|
+
}
|
|
64
|
+
export declare const TableRow: React.ForwardRefExoticComponent<TableRowProps & React.RefAttributes<HTMLTableRowElement>>;
|
|
65
|
+
export interface TableHeadProps extends Omit<React.ThHTMLAttributes<HTMLTableCellElement>, "align"> {
|
|
66
|
+
align?: Align;
|
|
67
|
+
/** Numbers: end-aligned, tabular, mono. */
|
|
68
|
+
numeric?: boolean;
|
|
69
|
+
/** Current sort of this column. Set `false` for a sortable column that is not sorted. */
|
|
70
|
+
sort?: "asc" | "desc" | false;
|
|
71
|
+
/** Makes the header a sort button (`aria-sort` on the `th`). */
|
|
72
|
+
onSort?: () => void;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Column header (`<th scope="col">`). With `onSort` the label becomes a button and the cell
|
|
76
|
+
* gets `aria-sort`.
|
|
77
|
+
*/
|
|
78
|
+
export declare const TableHead: React.ForwardRefExoticComponent<TableHeadProps & React.RefAttributes<HTMLTableCellElement>>;
|
|
79
|
+
export interface TableCellProps extends Omit<React.TdHTMLAttributes<HTMLTableCellElement>, "align"> {
|
|
80
|
+
align?: Align;
|
|
81
|
+
/** Numbers and money: end-aligned, tabular, mono — also in RTL. */
|
|
82
|
+
numeric?: boolean;
|
|
83
|
+
/** `true` cuts to one line with an ellipsis; a number clamps to that many lines. */
|
|
84
|
+
truncate?: boolean | number;
|
|
85
|
+
/** Render as a row header (`<th scope="row">`) — e.g. the name column. */
|
|
86
|
+
rowHeader?: boolean;
|
|
87
|
+
}
|
|
88
|
+
export declare const TableCell: React.ForwardRefExoticComponent<TableCellProps & React.RefAttributes<HTMLTableCellElement>>;
|
|
89
|
+
export interface TableEmptyProps extends Omit<React.HTMLAttributes<HTMLTableRowElement>, "title"> {
|
|
90
|
+
/** Number of columns to span. */
|
|
91
|
+
colSpan: number;
|
|
92
|
+
/** Replace the icon (`false` for none). */
|
|
93
|
+
icon?: React.ReactNode | false;
|
|
94
|
+
/** Main line. Default "No results". */
|
|
95
|
+
title?: React.ReactNode;
|
|
96
|
+
/** Secondary line. Children render as actions (e.g. "Clear filters"). */
|
|
97
|
+
description?: React.ReactNode;
|
|
98
|
+
}
|
|
99
|
+
/** A single full-width row for an empty table body. */
|
|
100
|
+
export declare const TableEmpty: React.ForwardRefExoticComponent<TableEmptyProps & React.RefAttributes<HTMLTableRowElement>>;
|
|
101
|
+
export {};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { ArrowDown, ArrowUp, ChevronsUpDown } from "lucide-react";
|
|
4
|
+
import { cn } from "../lib/cn.js";
|
|
5
|
+
import { DataLabel } from "../lib/data-islands.js";
|
|
6
|
+
import { EmptyState } from "./empty-state.js";
|
|
7
|
+
const alignClass = { start: "text-start", center: "text-center", end: "text-end" };
|
|
8
|
+
/**
|
|
9
|
+
* Scroll wrapper for a Table: horizontal (and optional vertical) scrolling with soft edge fades
|
|
10
|
+
* that show there is more content. It is a focusable, named region so keyboard users can scroll.
|
|
11
|
+
*/
|
|
12
|
+
export const TableContainer = React.forwardRef(function TableContainer({ className, maxHeight, style, ...props }, ref) {
|
|
13
|
+
return (_jsx("div", { ref: ref, role: "region", tabIndex: 0, "data-slot": "table-container", className: cn("ui-table-scroll relative w-full overflow-auto overscroll-x-contain rounded-[inherit] focus-ring", className), style: maxHeight ? { maxHeight, ...style } : style, ...props }));
|
|
14
|
+
});
|
|
15
|
+
/**
|
|
16
|
+
* Styled semantic table for small and static data: line items, settings lists, chart data.
|
|
17
|
+
* Server-component compatible. Give it a `<TableCaption>` or `aria-label`.
|
|
18
|
+
*
|
|
19
|
+
* ```tsx
|
|
20
|
+
* <TableContainer aria-label="Invoice lines">
|
|
21
|
+
* <Table>
|
|
22
|
+
* <TableCaption>Invoice INV-2041</TableCaption>
|
|
23
|
+
* <TableHeader><TableRow><TableHead>Item</TableHead><TableHead numeric>Amount</TableHead></TableRow></TableHeader>
|
|
24
|
+
* <TableBody><TableRow><TableCell>Design retainer</TableCell><TableCell numeric>$4,500.00</TableCell></TableRow></TableBody>
|
|
25
|
+
* </Table>
|
|
26
|
+
* </TableContainer>
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export const Table = React.forwardRef(function Table({ className, density = "inherit", striped, hover = true, bordered = "rows", stickyHeader, stickyFirstColumn, layout = "auto", children, ...props }, ref) {
|
|
30
|
+
if (process.env.NODE_ENV !== "production" && !props["aria-label"] && !props["aria-labelledby"]) {
|
|
31
|
+
const hasCaption = React.Children.toArray(children).some((c) => React.isValidElement(c) && c.type === TableCaption);
|
|
32
|
+
if (!hasCaption)
|
|
33
|
+
console.warn("[vamos-ui] <Table> needs a <TableCaption>, aria-label or aria-labelledby.");
|
|
34
|
+
}
|
|
35
|
+
return (_jsx("table", { ref: ref, "data-slot": "table", "data-density": density === "inherit" ? undefined : density, "data-striped": striped ? "" : undefined, "data-hover": hover ? "" : undefined, "data-bordered": bordered, "data-sticky-header": stickyHeader ? "" : undefined, "data-sticky-column": stickyFirstColumn ? "" : undefined, className: cn("ui-table w-full caption-bottom border-separate border-spacing-0 text-[13px] text-fg", layout === "fixed" && "table-fixed", className), ...props, children: children }));
|
|
36
|
+
});
|
|
37
|
+
/** Names the table. Visible under the table by default; `visuallyHidden` keeps it for screen readers. */
|
|
38
|
+
export const TableCaption = React.forwardRef(function TableCaption({ className, visuallyHidden, side = "bottom", ...props }, ref) {
|
|
39
|
+
return (_jsx("caption", { ref: ref, "data-slot": "table-caption", className: cn(visuallyHidden ? "sr-only" : "px-(--cell-px) py-3 text-start text-xs text-fg-subtle", side === "top" && "caption-top pt-0", className), ...props }));
|
|
40
|
+
});
|
|
41
|
+
export const TableHeader = React.forwardRef(function TableHeader({ className, ...props }, ref) {
|
|
42
|
+
return _jsx("thead", { ref: ref, "data-slot": "table-header", className: className, ...props });
|
|
43
|
+
});
|
|
44
|
+
export const TableBody = React.forwardRef(function TableBody({ className, ...props }, ref) {
|
|
45
|
+
return _jsx("tbody", { ref: ref, "data-slot": "table-body", className: className, ...props });
|
|
46
|
+
});
|
|
47
|
+
export const TableFooter = React.forwardRef(function TableFooter({ className, ...props }, ref) {
|
|
48
|
+
return _jsx("tfoot", { ref: ref, "data-slot": "table-footer", className: cn("font-medium", className), ...props });
|
|
49
|
+
});
|
|
50
|
+
export const TableRow = React.forwardRef(function TableRow({ className, selected, disabled, highlighted, ...props }, ref) {
|
|
51
|
+
return (_jsx("tr", { ref: ref, "data-slot": "table-row", "data-state": selected ? "selected" : undefined, "data-disabled": disabled ? "" : undefined, "data-highlighted": highlighted ? "" : undefined, "aria-selected": selected === undefined ? undefined : selected, "aria-disabled": disabled || undefined, className: className, ...props }));
|
|
52
|
+
});
|
|
53
|
+
/**
|
|
54
|
+
* Column header (`<th scope="col">`). With `onSort` the label becomes a button and the cell
|
|
55
|
+
* gets `aria-sort`.
|
|
56
|
+
*/
|
|
57
|
+
export const TableHead = React.forwardRef(function TableHead({ className, align, numeric, sort, onSort, scope = "col", children, ...props }, ref) {
|
|
58
|
+
const a = align ?? (numeric ? "end" : "start");
|
|
59
|
+
const sortable = sort !== undefined || onSort !== undefined;
|
|
60
|
+
const SortIcon = sort === "asc" ? ArrowUp : sort === "desc" ? ArrowDown : ChevronsUpDown;
|
|
61
|
+
return (_jsx("th", { ref: ref, scope: scope, "data-slot": "table-head", "data-numeric": numeric ? "" : undefined, "aria-sort": sortable ? (sort === "asc" ? "ascending" : sort === "desc" ? "descending" : "none") : undefined, className: cn("h-[calc(var(--row-h)*0.78)] px-(--cell-px) align-middle text-xs font-medium whitespace-nowrap text-fg-muted", alignClass[a], className), ...props, children: sortable ? (_jsxs("button", { type: "button", onClick: onSort, "data-sorted": sort ? "" : undefined, className: cn("-mx-1.5 inline-flex items-center gap-1 rounded-ui-sm px-1.5 py-1 font-medium transition-colors hover:bg-hover hover:text-fg focus-ring data-sorted:text-fg", a === "end" && "flex-row-reverse"), children: [children, _jsx(SortIcon, { "aria-hidden": true, className: cn("size-3.5 shrink-0", sort ? "text-fg" : "text-fg-subtle") })] })) : (children) }));
|
|
62
|
+
});
|
|
63
|
+
export const TableCell = React.forwardRef(function TableCell({ className, align, numeric, truncate, rowHeader, children, ...props }, ref) {
|
|
64
|
+
const a = align ?? (numeric ? "end" : "start");
|
|
65
|
+
const Comp = rowHeader ? "th" : "td";
|
|
66
|
+
const clamp = typeof truncate === "number" && truncate > 1;
|
|
67
|
+
return (_jsx(Comp, { ref: ref, ...(rowHeader ? { scope: "row" } : {}), "data-slot": "table-cell", "data-numeric": numeric ? "" : undefined, className: cn("h-(--row-h) px-(--cell-px) py-2 align-middle", alignClass[a], numeric && "font-mono text-[12.5px] whitespace-nowrap tabular", rowHeader && "font-medium", truncate === true || truncate === 1 ? "max-w-0 truncate" : null, className), ...props, children: clamp ? (_jsx("span", { className: "line-clamp-(--lines)", style: { ["--lines"]: truncate }, children: children })) : (children) }));
|
|
68
|
+
});
|
|
69
|
+
/** A single full-width row for an empty table body. */
|
|
70
|
+
export const TableEmpty = React.forwardRef(function TableEmpty({ colSpan, icon, title, description, className, children, ...props }, ref) {
|
|
71
|
+
return (_jsx("tr", { ref: ref, "data-slot": "table-empty", className: className, ...props, children: _jsx("td", { colSpan: colSpan, className: "px-(--cell-px) py-8", children: _jsx(EmptyState, { kind: "no-results", size: "sm", icon: icon, title: title ?? _jsx(DataLabel, { ns: "table", id: "empty" }), description: description, actions: children }) }) }));
|
|
72
|
+
});
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { Tabs as RadixTabs } from "radix-ui";
|
|
3
|
+
import { type VariantProps } from "class-variance-authority";
|
|
4
|
+
import { type BadgeProps } from "./badge.js";
|
|
5
|
+
export declare const tabsListVariants: (props?: ({
|
|
6
|
+
variant?: "underline" | "pill" | "segmented" | null | undefined;
|
|
7
|
+
fill?: boolean | null | undefined;
|
|
8
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
9
|
+
export declare const tabsTriggerVariants: (props?: ({
|
|
10
|
+
variant?: "underline" | "pill" | "segmented" | null | undefined;
|
|
11
|
+
size?: "sm" | "md" | null | undefined;
|
|
12
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
13
|
+
type TabsVariant = NonNullable<VariantProps<typeof tabsListVariants>["variant"]>;
|
|
14
|
+
type TabsSize = "sm" | "md";
|
|
15
|
+
type TabsOrientation = "horizontal" | "vertical";
|
|
16
|
+
export interface TabsProps extends Omit<React.ComponentPropsWithoutRef<typeof RadixTabs.Root>, "value" | "defaultValue" | "onValueChange"> {
|
|
17
|
+
value?: string;
|
|
18
|
+
defaultValue?: string;
|
|
19
|
+
onValueChange?: (value: string) => void;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Switches between views of the same context (WAI-ARIA Tabs: arrows, Home/End).
|
|
23
|
+
* Inactive panels unmount by default; pass `forceMount` on a `TabsContent` to keep it.
|
|
24
|
+
*
|
|
25
|
+
* ```tsx
|
|
26
|
+
* <Tabs defaultValue="overview">
|
|
27
|
+
* <TabsList>
|
|
28
|
+
* <TabsTrigger value="overview">Overview</TabsTrigger>
|
|
29
|
+
* <TabsTrigger value="deals" count={4}>Deals</TabsTrigger>
|
|
30
|
+
* </TabsList>
|
|
31
|
+
* <TabsContent value="overview">…</TabsContent>
|
|
32
|
+
* </Tabs>
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* `activationMode="manual"` for heavy panels (focus moves with arrows, Enter/Space selects).
|
|
36
|
+
* For route-based tabs use `TabsLinkList` — that is navigation, not the Tabs pattern.
|
|
37
|
+
*/
|
|
38
|
+
export declare const Tabs: React.ForwardRefExoticComponent<TabsProps & React.RefAttributes<HTMLDivElement>>;
|
|
39
|
+
export interface TabsListProps extends React.ComponentPropsWithoutRef<typeof RadixTabs.List> {
|
|
40
|
+
/** `underline` (pages, records) · `pill` (status filters) · `segmented` (view switch). Default `underline`. */
|
|
41
|
+
variant?: TabsVariant;
|
|
42
|
+
size?: TabsSize;
|
|
43
|
+
/** Equal-width tabs that fill the row. */
|
|
44
|
+
fill?: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* `"scroll"`: when tabs don't fit, the strip scrolls with edge fade masks and the selected tab
|
|
47
|
+
* is kept in view. Default `"scroll"` for horizontal lists. `"none"` lets the list wrap/clip.
|
|
48
|
+
*/
|
|
49
|
+
overflow?: "scroll" | "none";
|
|
50
|
+
}
|
|
51
|
+
/** The row (or column) of tab triggers. */
|
|
52
|
+
export declare const TabsList: React.ForwardRefExoticComponent<TabsListProps & React.RefAttributes<HTMLDivElement>>;
|
|
53
|
+
export interface TabsTriggerProps extends React.ComponentPropsWithoutRef<typeof RadixTabs.Trigger> {
|
|
54
|
+
/** Leading icon. */
|
|
55
|
+
icon?: React.ReactNode;
|
|
56
|
+
/** Trailing count (locale-formatted, 99+). Announced as part of the name: "Draft, 12". */
|
|
57
|
+
count?: number;
|
|
58
|
+
/** Badge tone for `count`. Default `neutral` (the selected tab uses `accent`). */
|
|
59
|
+
badgeTone?: BadgeProps["tone"];
|
|
60
|
+
}
|
|
61
|
+
/** One tab. `value` must match a `TabsContent`. */
|
|
62
|
+
export declare const TabsTrigger: React.ForwardRefExoticComponent<TabsTriggerProps & React.RefAttributes<HTMLButtonElement>>;
|
|
63
|
+
export interface TabsContentProps extends React.ComponentPropsWithoutRef<typeof RadixTabs.Content> {
|
|
64
|
+
}
|
|
65
|
+
/** The panel for one tab. Unmounted while inactive unless `forceMount`. */
|
|
66
|
+
export declare const TabsContent: React.ForwardRefExoticComponent<TabsContentProps & React.RefAttributes<HTMLDivElement>>;
|
|
67
|
+
export interface TabsLinkListProps extends React.HTMLAttributes<HTMLElement> {
|
|
68
|
+
/** Accessible name of the `nav`, e.g. "Contact sections". Required when the page has more than one nav. */
|
|
69
|
+
"aria-label"?: string;
|
|
70
|
+
variant?: TabsVariant;
|
|
71
|
+
size?: TabsSize;
|
|
72
|
+
fill?: boolean;
|
|
73
|
+
orientation?: TabsOrientation;
|
|
74
|
+
overflow?: "scroll" | "none";
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Route-based tabs: a `<nav>` of links with `aria-current="page"` on the active one. Links use the
|
|
78
|
+
* app's router `Link` from `VamosProvider`, and the active tab is derived from `currentPath`
|
|
79
|
+
* unless a `TabsLink` sets `active`.
|
|
80
|
+
*
|
|
81
|
+
* ```tsx
|
|
82
|
+
* <TabsLinkList aria-label="Contact sections">
|
|
83
|
+
* <TabsLink href="/contacts/42" exact>Overview</TabsLink>
|
|
84
|
+
* <TabsLink href="/contacts/42/deals" count={4}>Deals</TabsLink>
|
|
85
|
+
* </TabsLinkList>
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export declare const TabsLinkList: React.ForwardRefExoticComponent<TabsLinkListProps & React.RefAttributes<HTMLElement>>;
|
|
89
|
+
export interface TabsLinkProps extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, "href"> {
|
|
90
|
+
href: string;
|
|
91
|
+
/** Force the active state. Default: derived from `currentPath` (`exact` for an index route). */
|
|
92
|
+
active?: boolean;
|
|
93
|
+
/** Match only this exact path (use for the first, "Overview" tab). */
|
|
94
|
+
exact?: boolean;
|
|
95
|
+
icon?: React.ReactNode;
|
|
96
|
+
count?: number;
|
|
97
|
+
badgeTone?: BadgeProps["tone"];
|
|
98
|
+
/** Dims the link and removes it from the tab order. */
|
|
99
|
+
disabled?: boolean;
|
|
100
|
+
}
|
|
101
|
+
/** One route tab. Renders the app's `Link`. */
|
|
102
|
+
export declare const TabsLink: React.ForwardRefExoticComponent<TabsLinkProps & React.RefAttributes<HTMLAnchorElement>>;
|
|
103
|
+
export {};
|