@vamos-ui/react 0.0.0-stage → 0.3.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 +101 -0
- package/dist/blocks/site/_kit-1.js +137 -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 +113 -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 +52 -0
- package/dist/blocks/site/feature-grid.d.ts +46 -0
- package/dist/blocks/site/feature-grid.js +50 -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 +48 -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 +73 -0
- package/dist/blocks/site/logo-strip.d.ts +44 -0
- package/dist/blocks/site/logo-strip.js +27 -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 +56 -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 +83 -0
- package/dist/blocks/site/process.d.ts +36 -0
- package/dist/blocks/site/process.js +42 -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 +108 -0
- package/dist/blocks/site/site-shell.js +254 -0
- package/dist/blocks/site/stats-band.d.ts +42 -0
- package/dist/blocks/site/stats-band.js +45 -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 +66 -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 +12 -0
- package/dist/business/index.js +22 -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/business/signer-status.d.ts +53 -0
- package/dist/business/signer-status.js +76 -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 +46 -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/_qr-core.d.ts +26 -0
- package/dist/components/_qr-core.js +376 -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/backup-codes.d.ts +42 -0
- package/dist/components/backup-codes.js +67 -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 +281 -0
- package/dist/components/command.js +498 -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/pin-map.d.ts +58 -0
- package/dist/components/pin-map.js +167 -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/qr-code.d.ts +36 -0
- package/dist/components/qr-code.js +27 -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/sla-timer.d.ts +75 -0
- package/dist/components/sla-timer.js +142 -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/tour.d.ts +60 -0
- package/dist/components/tour.js +139 -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 +91 -0
- package/dist/index.js +92 -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 +23 -0
- package/dist/lib/public.js +34 -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 +140 -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/motion/core.d.ts +32 -0
- package/dist/motion/core.js +77 -0
- package/dist/motion/count-up.d.ts +29 -0
- package/dist/motion/count-up.js +92 -0
- package/dist/motion/index.d.ts +11 -0
- package/dist/motion/index.js +13 -0
- package/dist/motion/motion-scope.d.ts +17 -0
- package/dist/motion/motion-scope.js +16 -0
- package/dist/motion/page-transition.d.ts +33 -0
- package/dist/motion/page-transition.js +61 -0
- package/dist/motion/parallax.d.ts +37 -0
- package/dist/motion/parallax.js +90 -0
- package/dist/motion/pointer.d.ts +38 -0
- package/dist/motion/pointer.js +117 -0
- package/dist/motion/reveal.d.ts +72 -0
- package/dist/motion/reveal.js +133 -0
- package/dist/motion/scroll-shrink.d.ts +18 -0
- package/dist/motion/scroll-shrink.js +47 -0
- package/dist/motion/skeleton-swap.d.ts +17 -0
- package/dist/motion/skeleton-swap.js +43 -0
- package/dist/motion/text-reveal.d.ts +30 -0
- package/dist/motion/text-reveal.js +29 -0
- package/dist/motion/ticker.d.ts +35 -0
- package/dist/motion/ticker.js +16 -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 +105 -0
- package/dist/sortable/sortable-tree.js +462 -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/motion.css +389 -0
- package/dist/styles/navigation.css +293 -0
- package/dist/styles/overlays.css +244 -0
- package/dist/styles.css +743 -0
- package/package.json +160 -4
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { Avatar as AvatarPrimitive } from "radix-ui";
|
|
3
|
+
declare const avatarLabels: {
|
|
4
|
+
online: string;
|
|
5
|
+
away: string;
|
|
6
|
+
busy: string;
|
|
7
|
+
offline: string;
|
|
8
|
+
withStatus: string;
|
|
9
|
+
overflow: string;
|
|
10
|
+
more: string;
|
|
11
|
+
};
|
|
12
|
+
export type AvatarLabels = typeof avatarLabels;
|
|
13
|
+
export type AvatarSize = "xs" | "sm" | "md" | "lg" | "xl";
|
|
14
|
+
export type AvatarStatus = "online" | "away" | "busy" | "offline";
|
|
15
|
+
export declare const avatarVariants: (props?: ({
|
|
16
|
+
size?: "sm" | "md" | "lg" | "xl" | "xs" | null | undefined;
|
|
17
|
+
shape?: "square" | "circle" | null | undefined;
|
|
18
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
19
|
+
/** Soft background + ink text for an initials avatar, from the chart palette. */
|
|
20
|
+
export declare function avatarColor(seed: string): React.CSSProperties;
|
|
21
|
+
export interface AvatarRootProps extends React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root> {
|
|
22
|
+
size?: AvatarSize;
|
|
23
|
+
shape?: "circle" | "square";
|
|
24
|
+
}
|
|
25
|
+
/** Root of the composite API: `<AvatarRoot><AvatarImage/><AvatarFallback/></AvatarRoot>`. */
|
|
26
|
+
export declare const AvatarRoot: React.ForwardRefExoticComponent<AvatarRootProps & React.RefAttributes<HTMLSpanElement>>;
|
|
27
|
+
/** The photo. Pass `asChild` to render a framework image (Next `<Image>`). */
|
|
28
|
+
export declare const AvatarImage: React.ForwardRefExoticComponent<Omit<AvatarPrimitive.AvatarImageProps & React.RefAttributes<HTMLImageElement>, "ref"> & React.RefAttributes<HTMLImageElement>>;
|
|
29
|
+
/** Shown while the image loads (after `delayMs`), when it fails, or when there is none. */
|
|
30
|
+
export declare const AvatarFallback: React.ForwardRefExoticComponent<Omit<AvatarPrimitive.AvatarFallbackProps & React.RefAttributes<HTMLSpanElement>, "ref"> & React.RefAttributes<HTMLSpanElement>>;
|
|
31
|
+
export interface AvatarProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, "children"> {
|
|
32
|
+
/** Photo URL. Missing, `null` or failing → initials. */
|
|
33
|
+
src?: string | null;
|
|
34
|
+
/** Person or organisation name: initials, fallback colour and the accessible name. */
|
|
35
|
+
name: string;
|
|
36
|
+
/** 20 / 24 / 32 / 40 / 56 px. Default `"md"`. */
|
|
37
|
+
size?: AvatarSize;
|
|
38
|
+
/** `"square"` for organisation logos. */
|
|
39
|
+
shape?: "circle" | "square";
|
|
40
|
+
/** Presence dot (announced with the name). */
|
|
41
|
+
status?: AvatarStatus;
|
|
42
|
+
/** Override the announced status text ("In a meeting"). */
|
|
43
|
+
statusLabel?: string;
|
|
44
|
+
/** Override the computed initials (1–2 letters) or pass an icon. */
|
|
45
|
+
fallback?: React.ReactNode;
|
|
46
|
+
/** ms before the fallback shows while an image loads (avoids flashing). Default 300. */
|
|
47
|
+
delayMs?: number;
|
|
48
|
+
/** Use the same neutral colour for every fallback instead of the per-name hue. */
|
|
49
|
+
neutral?: boolean;
|
|
50
|
+
labels?: Partial<AvatarLabels>;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* A person or organisation: contact lists, assignees, comment threads, the top-bar user menu.
|
|
54
|
+
* Image with an initials fallback (locale-correct: "ilker şahin" → "İŞ" in Turkish), a colour
|
|
55
|
+
* picked from the name, and an optional status dot.
|
|
56
|
+
*
|
|
57
|
+
* ```tsx
|
|
58
|
+
* <Avatar name="Ada Lovelace" src="/people/ada.jpg" status="online" />
|
|
59
|
+
* <Avatar name="Northwind Traders" shape="square" size="lg" />
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
export declare const Avatar: React.ForwardRefExoticComponent<AvatarProps & React.RefAttributes<HTMLSpanElement>>;
|
|
63
|
+
export interface AvatarGroupProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
64
|
+
/** Avatars shown before the "+N" chip. Default 4. */
|
|
65
|
+
max?: number;
|
|
66
|
+
/** Total number of people when the list you pass is already truncated (server-side). */
|
|
67
|
+
total?: number;
|
|
68
|
+
size?: AvatarSize;
|
|
69
|
+
shape?: "circle" | "square";
|
|
70
|
+
/** Makes "+N" a button (open the full list in a popover or dialog). */
|
|
71
|
+
onOverflowClick?: () => void;
|
|
72
|
+
/** Overlap between avatars. Default `"md"`. */
|
|
73
|
+
spacing?: "sm" | "md" | "lg";
|
|
74
|
+
labels?: Partial<AvatarLabels>;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Stacked avatars with a "+N" overflow ("3 more people" for screen readers): assignees,
|
|
78
|
+
* attendees, a team on a deal.
|
|
79
|
+
*
|
|
80
|
+
* ```tsx
|
|
81
|
+
* <AvatarGroup max={3} aria-label="Assignees">
|
|
82
|
+
* {team.map((p) => <Avatar key={p.id} name={p.name} src={p.photo} />)}
|
|
83
|
+
* </AvatarGroup>
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
export declare const AvatarGroup: React.ForwardRefExoticComponent<AvatarGroupProps & React.RefAttributes<HTMLDivElement>>;
|
|
87
|
+
export {};
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { Avatar as AvatarPrimitive } from "radix-ui";
|
|
5
|
+
import { cva } from "class-variance-authority";
|
|
6
|
+
import { cn } from "../lib/cn.js";
|
|
7
|
+
import { useLabels } from "../lib/labels.js";
|
|
8
|
+
import { useLocale } from "../lib/locale.js";
|
|
9
|
+
import { initials as toInitials } from "../lib/text.js";
|
|
10
|
+
const avatarLabels = {
|
|
11
|
+
online: "Online",
|
|
12
|
+
away: "Away",
|
|
13
|
+
busy: "Busy",
|
|
14
|
+
offline: "Offline",
|
|
15
|
+
withStatus: "{name} ({status})",
|
|
16
|
+
overflow: "+{count}",
|
|
17
|
+
more: "{count, plural, one {# more person} other {# more people}}",
|
|
18
|
+
};
|
|
19
|
+
export const avatarVariants = cva("relative inline-flex shrink-0 select-none items-center justify-center align-middle font-medium leading-none tracking-[0.01em]", {
|
|
20
|
+
variants: {
|
|
21
|
+
size: {
|
|
22
|
+
xs: "size-5 text-[8.5px]",
|
|
23
|
+
sm: "size-6 text-[10px]",
|
|
24
|
+
md: "size-8 text-xs",
|
|
25
|
+
lg: "size-10 text-sm",
|
|
26
|
+
xl: "size-14 text-[19px]",
|
|
27
|
+
},
|
|
28
|
+
shape: {
|
|
29
|
+
circle: "rounded-full",
|
|
30
|
+
/** Organisation / workspace logos. */
|
|
31
|
+
square: "rounded-[28%]",
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
defaultVariants: { size: "md", shape: "circle" },
|
|
35
|
+
});
|
|
36
|
+
const dotSize = {
|
|
37
|
+
xs: "size-1.5 ring-1",
|
|
38
|
+
sm: "size-[7px] ring-[1.5px]",
|
|
39
|
+
md: "size-2 ring-2",
|
|
40
|
+
lg: "size-2.5 ring-2",
|
|
41
|
+
xl: "size-3.5 ring-[3px]",
|
|
42
|
+
};
|
|
43
|
+
const statusColor = {
|
|
44
|
+
online: "bg-success",
|
|
45
|
+
away: "bg-warning",
|
|
46
|
+
busy: "bg-danger",
|
|
47
|
+
offline: "bg-fg-subtle",
|
|
48
|
+
};
|
|
49
|
+
/** Deterministic 1–6 from a string (stable across renders and servers). */
|
|
50
|
+
function hueIndex(seed) {
|
|
51
|
+
let h = 2166136261;
|
|
52
|
+
for (let i = 0; i < seed.length; i++)
|
|
53
|
+
h = Math.imul(h ^ seed.charCodeAt(i), 16777619);
|
|
54
|
+
return ((h >>> 0) % 6) + 1;
|
|
55
|
+
}
|
|
56
|
+
/** Soft background + ink text for an initials avatar, from the chart palette. */
|
|
57
|
+
export function avatarColor(seed) {
|
|
58
|
+
const c = `var(--chart-${hueIndex(seed)})`;
|
|
59
|
+
return {
|
|
60
|
+
backgroundColor: `color-mix(in oklch, ${c} 20%, var(--surface-solid))`,
|
|
61
|
+
color: `color-mix(in oklch, ${c} 60%, var(--fg))`,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
const AvatarGroupContext = React.createContext(null);
|
|
65
|
+
/** Root of the composite API: `<AvatarRoot><AvatarImage/><AvatarFallback/></AvatarRoot>`. */
|
|
66
|
+
export const AvatarRoot = React.forwardRef(function AvatarRoot({ size, shape, className, ...props }, ref) {
|
|
67
|
+
const group = React.useContext(AvatarGroupContext);
|
|
68
|
+
const s = size ?? group?.size ?? "md";
|
|
69
|
+
const sh = shape ?? group?.shape ?? "circle";
|
|
70
|
+
return (_jsx(AvatarPrimitive.Root, { ref: ref, "data-slot": "avatar", "data-size": s, "data-shape": sh, className: cn(avatarVariants({ size: s, shape: sh }), group && "ring-2 ring-(--avatar-ring)", className), ...props }));
|
|
71
|
+
});
|
|
72
|
+
/** The photo. Pass `asChild` to render a framework image (Next `<Image>`). */
|
|
73
|
+
export const AvatarImage = React.forwardRef(function AvatarImage({ className, ...props }, ref) {
|
|
74
|
+
return _jsx(AvatarPrimitive.Image, { ref: ref, "data-slot": "avatar-image", className: cn("size-full rounded-[inherit] object-cover", className), ...props });
|
|
75
|
+
});
|
|
76
|
+
/** Shown while the image loads (after `delayMs`), when it fails, or when there is none. */
|
|
77
|
+
export const AvatarFallback = React.forwardRef(function AvatarFallback({ className, ...props }, ref) {
|
|
78
|
+
return (_jsx(AvatarPrimitive.Fallback, { ref: ref, "data-slot": "avatar-fallback", className: cn("flex size-full items-center justify-center rounded-[inherit] bg-selected text-fg-muted [&_svg]:size-[55%]", className), ...props }));
|
|
79
|
+
});
|
|
80
|
+
/**
|
|
81
|
+
* A person or organisation: contact lists, assignees, comment threads, the top-bar user menu.
|
|
82
|
+
* Image with an initials fallback (locale-correct: "ilker şahin" → "İŞ" in Turkish), a colour
|
|
83
|
+
* picked from the name, and an optional status dot.
|
|
84
|
+
*
|
|
85
|
+
* ```tsx
|
|
86
|
+
* <Avatar name="Ada Lovelace" src="/people/ada.jpg" status="online" />
|
|
87
|
+
* <Avatar name="Northwind Traders" shape="square" size="lg" />
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
export const Avatar = React.forwardRef(function Avatar({ src, name, size, shape, status, statusLabel, fallback, delayMs = 300, neutral, labels, className, style, ...props }, ref) {
|
|
91
|
+
const t = useLabels("avatar", avatarLabels, labels);
|
|
92
|
+
const { locale } = useLocale();
|
|
93
|
+
const group = React.useContext(AvatarGroupContext);
|
|
94
|
+
const s = size ?? group?.size ?? "md";
|
|
95
|
+
const statusText = status ? (statusLabel ?? t(status)) : undefined;
|
|
96
|
+
const accessible = statusText ? t("withStatus", { name, status: statusText }) : name;
|
|
97
|
+
const letters = fallback ?? (toInitials(name, locale, s === "xs" ? 1 : 2) || "?");
|
|
98
|
+
return (_jsxs(AvatarRoot, { ref: ref, size: s, shape: shape, className: className, style: style, ...props, children: [src ? _jsx(AvatarImage, { src: src, alt: accessible }) : null, _jsx(AvatarFallback, { delayMs: src ? delayMs : undefined, role: "img", "aria-label": accessible, style: neutral ? undefined : avatarColor(name), children: _jsx("span", { "aria-hidden": true, children: letters }) }), status ? (_jsx("span", { "aria-hidden": true, "data-slot": "avatar-status", "data-status": status, className: cn("absolute end-0 bottom-0 rounded-full ring-(--avatar-ring)", shape === "square" && "-end-0.5 -bottom-0.5", dotSize[s], statusColor[status]) })) : null] }));
|
|
99
|
+
});
|
|
100
|
+
const overlap = {
|
|
101
|
+
xs: { sm: "-ms-0.5", md: "-ms-1", lg: "-ms-1.5" },
|
|
102
|
+
sm: { sm: "-ms-1", md: "-ms-1.5", lg: "-ms-2" },
|
|
103
|
+
md: { sm: "-ms-1", md: "-ms-2", lg: "-ms-3" },
|
|
104
|
+
lg: { sm: "-ms-1.5", md: "-ms-2.5", lg: "-ms-4" },
|
|
105
|
+
xl: { sm: "-ms-2", md: "-ms-3.5", lg: "-ms-5" },
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* Stacked avatars with a "+N" overflow ("3 more people" for screen readers): assignees,
|
|
109
|
+
* attendees, a team on a deal.
|
|
110
|
+
*
|
|
111
|
+
* ```tsx
|
|
112
|
+
* <AvatarGroup max={3} aria-label="Assignees">
|
|
113
|
+
* {team.map((p) => <Avatar key={p.id} name={p.name} src={p.photo} />)}
|
|
114
|
+
* </AvatarGroup>
|
|
115
|
+
* ```
|
|
116
|
+
*/
|
|
117
|
+
export const AvatarGroup = React.forwardRef(function AvatarGroup({ max = 4, total, size = "md", shape = "circle", onOverflowClick, spacing = "md", labels, className, children, ...props }, ref) {
|
|
118
|
+
const t = useLabels("avatar", avatarLabels, labels);
|
|
119
|
+
const items = React.Children.toArray(children).filter(React.isValidElement);
|
|
120
|
+
const shown = items.slice(0, Math.max(0, max));
|
|
121
|
+
const extra = Math.max(0, (total ?? items.length) - shown.length);
|
|
122
|
+
const ctx = React.useMemo(() => ({ size, shape }), [size, shape]);
|
|
123
|
+
const step = overlap[size][spacing];
|
|
124
|
+
const chipClass = cn(avatarVariants({ size, shape }), "relative ring-2 ring-(--avatar-ring) bg-surface-2 font-mono tabular text-fg-muted", step);
|
|
125
|
+
return (_jsxs("div", { ref: ref, role: "group", "data-slot": "avatar-group", className: cn("flex items-center", className), ...props, children: [_jsx(AvatarGroupContext.Provider, { value: ctx, children: shown.map((child, i) => (_jsx("span", { className: cn("relative inline-flex rounded-full", i > 0 && step), children: child }, child.key ?? i))) }), extra > 0 ? (onOverflowClick ? (_jsx("button", { type: "button", "data-slot": "avatar-overflow", onClick: onOverflowClick, "aria-label": t("more", { count: extra }), className: cn(chipClass, "cursor-pointer transition-colors hover:bg-hover hover:text-fg focus-ring"), children: _jsx("span", { "aria-hidden": true, children: t("overflow", { count: extra }) }) })) : (_jsx("span", { "data-slot": "avatar-overflow", role: "img", "aria-label": t("more", { count: extra }), className: chipClass, children: _jsx("span", { "aria-hidden": true, children: t("overflow", { count: extra }) }) }))) : null] }));
|
|
126
|
+
});
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
export declare const backupCodesLabels: {
|
|
3
|
+
title: string;
|
|
4
|
+
copy: string;
|
|
5
|
+
copied: string;
|
|
6
|
+
copiedAnnouncement: string;
|
|
7
|
+
download: string;
|
|
8
|
+
regenerate: string;
|
|
9
|
+
used: string;
|
|
10
|
+
remaining: string;
|
|
11
|
+
fileHeader: string;
|
|
12
|
+
};
|
|
13
|
+
export type BackupCodesLabels = typeof backupCodesLabels;
|
|
14
|
+
export interface BackupCodesProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "title" | "onCopy"> {
|
|
15
|
+
/** One-time recovery codes, in display order. */
|
|
16
|
+
codes: string[];
|
|
17
|
+
/** Codes already spent — struck through and announced as used. */
|
|
18
|
+
used?: string[];
|
|
19
|
+
/** Heading above the grid. Default "Backup codes"; `null` hides it (label the region yourself). */
|
|
20
|
+
title?: React.ReactNode;
|
|
21
|
+
/** Name of the downloaded text file. Default `"backup-codes.txt"`. */
|
|
22
|
+
filename?: string;
|
|
23
|
+
/** Extra first line(s) of the downloaded file (account, service). */
|
|
24
|
+
fileNote?: string;
|
|
25
|
+
/** Called after the codes were copied. */
|
|
26
|
+
onCopy?: (text: string) => void;
|
|
27
|
+
/** Replace the default download (Blob + link) — e.g. to log it. */
|
|
28
|
+
onDownload?: (text: string) => void;
|
|
29
|
+
/** Shows a "New codes" button. */
|
|
30
|
+
onRegenerate?: () => void;
|
|
31
|
+
regenerating?: boolean;
|
|
32
|
+
labels?: Partial<BackupCodesLabels>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* One-time recovery codes after two-factor enrolment: a numbered monospace grid with copy,
|
|
36
|
+
* download and regenerate. Used codes stay visible, struck through.
|
|
37
|
+
*
|
|
38
|
+
* ```tsx
|
|
39
|
+
* <BackupCodes codes={codes} used={["4K7Q-PX2M"]} onRegenerate={regenerate} />
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare const BackupCodes: React.ForwardRefExoticComponent<BackupCodesProps & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { Check, Copy, Download, RefreshCw } from "lucide-react";
|
|
5
|
+
import { cn } from "../lib/cn.js";
|
|
6
|
+
import { useLabels } from "../lib/labels.js";
|
|
7
|
+
import { useFormat } from "../lib/locale.js";
|
|
8
|
+
import { Button } from "./button.js";
|
|
9
|
+
export const backupCodesLabels = {
|
|
10
|
+
title: "Backup codes",
|
|
11
|
+
copy: "Copy",
|
|
12
|
+
copied: "Copied",
|
|
13
|
+
copiedAnnouncement: "Backup codes copied to the clipboard",
|
|
14
|
+
download: "Download",
|
|
15
|
+
regenerate: "New codes",
|
|
16
|
+
used: "used",
|
|
17
|
+
remaining: "{left} of {total} left",
|
|
18
|
+
fileHeader: "Backup codes — each code works once. Keep them somewhere safe.",
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* One-time recovery codes after two-factor enrolment: a numbered monospace grid with copy,
|
|
22
|
+
* download and regenerate. Used codes stay visible, struck through.
|
|
23
|
+
*
|
|
24
|
+
* ```tsx
|
|
25
|
+
* <BackupCodes codes={codes} used={["4K7Q-PX2M"]} onRegenerate={regenerate} />
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export const BackupCodes = React.forwardRef(function BackupCodes({ codes, used = [], title, filename = "backup-codes.txt", fileNote, onCopy, onDownload, onRegenerate, regenerating, labels, className, ...props }, ref) {
|
|
29
|
+
const t = useLabels("backupCodes", backupCodesLabels, labels);
|
|
30
|
+
const f = useFormat();
|
|
31
|
+
const [copied, setCopied] = React.useState(false);
|
|
32
|
+
const usedSet = React.useMemo(() => new Set(used), [used]);
|
|
33
|
+
const titleId = React.useId();
|
|
34
|
+
const text = React.useMemo(() => [fileNote, t("fileHeader"), "", ...codes.map((c, i) => `${String(i + 1).padStart(2, " ")}. ${c}${usedSet.has(c) ? ` (${t("used")})` : ""}`)].filter((l) => l !== undefined).join("\n") + "\n", [codes, usedSet, fileNote, t]);
|
|
35
|
+
React.useEffect(() => {
|
|
36
|
+
if (!copied)
|
|
37
|
+
return;
|
|
38
|
+
const id = window.setTimeout(() => setCopied(false), 2000);
|
|
39
|
+
return () => window.clearTimeout(id);
|
|
40
|
+
}, [copied]);
|
|
41
|
+
const copy = async () => {
|
|
42
|
+
try {
|
|
43
|
+
await navigator.clipboard?.writeText(text);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
/* clipboard blocked — still report so the user can select manually */
|
|
47
|
+
}
|
|
48
|
+
setCopied(true);
|
|
49
|
+
onCopy?.(text);
|
|
50
|
+
};
|
|
51
|
+
const download = () => {
|
|
52
|
+
if (onDownload)
|
|
53
|
+
return onDownload(text);
|
|
54
|
+
const url = URL.createObjectURL(new Blob([text], { type: "text/plain;charset=utf-8" }));
|
|
55
|
+
const a = document.createElement("a");
|
|
56
|
+
a.href = url;
|
|
57
|
+
a.download = filename;
|
|
58
|
+
a.click();
|
|
59
|
+
window.setTimeout(() => URL.revokeObjectURL(url), 0);
|
|
60
|
+
};
|
|
61
|
+
const left = codes.filter((c) => !usedSet.has(c)).length;
|
|
62
|
+
const heading = title === undefined ? t("title") : title;
|
|
63
|
+
return (_jsxs("div", { ref: ref, "data-slot": "backup-codes", role: "group", "aria-labelledby": heading ? titleId : undefined, className: cn("grid gap-3", className), ...props, children: [heading ? (_jsxs("div", { className: "flex items-baseline justify-between gap-3", children: [_jsx("h3", { id: titleId, className: "text-sm font-medium text-fg", children: heading }), _jsx("span", { className: "text-xs text-fg-muted tabular", children: t("remaining", { left: f.number(left), total: f.number(codes.length) }) })] })) : null, _jsx("ol", { className: "grid grid-cols-2 gap-x-6 gap-y-1.5 rounded-ui border border-line bg-surface-2 px-4 py-3.5 font-mono text-[13px] tabular", translate: "no", children: codes.map((code, i) => {
|
|
64
|
+
const spent = usedSet.has(code);
|
|
65
|
+
return (_jsxs("li", { "data-used": spent || undefined, className: "flex items-baseline gap-3", children: [_jsx("span", { "aria-hidden": "true", className: "w-4 text-end text-[11px] text-fg-subtle", children: i + 1 }), _jsx("span", { className: cn("tracking-wide select-all", spent ? "text-fg-subtle line-through decoration-fg-subtle" : "text-fg"), children: code }), spent ? _jsxs("span", { className: "sr-only", children: ["(", t("used"), ")"] }) : null] }, code));
|
|
66
|
+
}) }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsxs(Button, { size: "sm", variant: "secondary", onClick: copy, children: [copied ? _jsx(Check, { "aria-hidden": "true" }) : _jsx(Copy, { "aria-hidden": "true" }), copied ? t("copied") : t("copy")] }), _jsxs(Button, { size: "sm", variant: "secondary", onClick: download, children: [_jsx(Download, { "aria-hidden": "true" }), t("download")] }), onRegenerate ? (_jsxs(Button, { size: "sm", variant: "ghost", className: "ms-auto", onClick: onRegenerate, loading: regenerating, children: [_jsx(RefreshCw, { "aria-hidden": "true" }), t("regenerate")] })) : null, _jsx("span", { role: "status", "aria-live": "polite", className: "sr-only", children: copied ? t("copiedAnnouncement") : "" })] })] }));
|
|
67
|
+
});
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { type VariantProps } from "class-variance-authority";
|
|
3
|
+
export declare const badgeVariants: (props?: ({
|
|
4
|
+
tone?: "accent" | "info" | "custom" | "warning" | "outline" | "danger" | "neutral" | "success" | null | undefined;
|
|
5
|
+
size?: "sm" | "md" | "lg" | null | undefined;
|
|
6
|
+
shape?: "square" | "pill" | null | undefined;
|
|
7
|
+
interactive?: boolean | null | undefined;
|
|
8
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
9
|
+
export interface BadgeProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, "color">, Omit<VariantProps<typeof badgeVariants>, "interactive"> {
|
|
10
|
+
/** Render as the child element (e.g. a `<Link>` to a filtered list). Ignored when `onRemove` is set. */
|
|
11
|
+
asChild?: boolean;
|
|
12
|
+
/** Small status dot before the label. */
|
|
13
|
+
dot?: boolean;
|
|
14
|
+
/** Any CSS colour (hex, oklch, var()) — user-defined label colours. Overrides `tone`. */
|
|
15
|
+
color?: string;
|
|
16
|
+
/** Show a number instead of children, with tabular figures and a cap (`max`). */
|
|
17
|
+
count?: number;
|
|
18
|
+
/** Cap for `count`: 120 → "99+". Default 99. */
|
|
19
|
+
max?: number;
|
|
20
|
+
/** Makes the badge a removable chip with a × button. */
|
|
21
|
+
onRemove?: () => void;
|
|
22
|
+
/** Accessible name of the × button. Default "Remove {label}" (dictionary `badge.remove`). */
|
|
23
|
+
removeLabel?: string;
|
|
24
|
+
/** Dims the badge and disables the remove button. */
|
|
25
|
+
disabled?: boolean;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Status, count and label pill — and the kit's chip (`onRemove`), reused by Tag input,
|
|
29
|
+
* Combobox multi-select and Filter bar. Server-compatible (the remove button and count
|
|
30
|
+
* formatting are tiny client islands).
|
|
31
|
+
*
|
|
32
|
+
* ```tsx
|
|
33
|
+
* <Badge tone="success" dot>Published</Badge>
|
|
34
|
+
* <Badge count={128} tone="accent" /> // "99+"
|
|
35
|
+
* <Badge onRemove={() => drop("design")}>Design</Badge>
|
|
36
|
+
* <Badge asChild interactive><Link href="/posts?status=draft">Draft</Link></Badge>
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* No CSS `uppercase` — it breaks Turkish (i → I) without the right `lang`; use `upperText()`.
|
|
40
|
+
*/
|
|
41
|
+
export declare const Badge: React.ForwardRefExoticComponent<BadgeProps & React.RefAttributes<HTMLSpanElement>>;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { Slot } from "radix-ui";
|
|
4
|
+
import { cva } from "class-variance-authority";
|
|
5
|
+
import { cn } from "../lib/cn.js";
|
|
6
|
+
import { ChipRemoveButton, LocaleCount } from "../lib/islands.js";
|
|
7
|
+
export const badgeVariants = cva("inline-flex shrink-0 items-center gap-1 whitespace-nowrap font-medium leading-none [&_svg]:size-3 [&_svg]:shrink-0", {
|
|
8
|
+
variants: {
|
|
9
|
+
tone: {
|
|
10
|
+
neutral: "bg-selected text-fg-muted",
|
|
11
|
+
accent: "bg-accent-soft text-accent-ink",
|
|
12
|
+
success: "tone-success tone-soft",
|
|
13
|
+
warning: "tone-warning tone-soft",
|
|
14
|
+
danger: "tone-danger tone-soft",
|
|
15
|
+
info: "tone-info tone-soft",
|
|
16
|
+
outline: "border border-field-border text-fg-muted",
|
|
17
|
+
/** Driven by the `color` prop (user-defined label colours). */
|
|
18
|
+
custom: "tone-soft",
|
|
19
|
+
},
|
|
20
|
+
size: {
|
|
21
|
+
sm: "h-5 px-2 text-[11px]",
|
|
22
|
+
md: "h-6 px-2.5 text-xs",
|
|
23
|
+
lg: "h-7 gap-1.5 px-3 text-[13px] [&_svg]:size-3.5",
|
|
24
|
+
},
|
|
25
|
+
shape: {
|
|
26
|
+
pill: "rounded-full",
|
|
27
|
+
/** Version / code tags. */
|
|
28
|
+
square: "rounded-ui-sm",
|
|
29
|
+
},
|
|
30
|
+
interactive: {
|
|
31
|
+
true: "cursor-pointer transition-[filter,background-color] hover:brightness-95 focus-ring",
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
defaultVariants: { tone: "neutral", size: "sm", shape: "pill" },
|
|
35
|
+
});
|
|
36
|
+
/**
|
|
37
|
+
* Status, count and label pill — and the kit's chip (`onRemove`), reused by Tag input,
|
|
38
|
+
* Combobox multi-select and Filter bar. Server-compatible (the remove button and count
|
|
39
|
+
* formatting are tiny client islands).
|
|
40
|
+
*
|
|
41
|
+
* ```tsx
|
|
42
|
+
* <Badge tone="success" dot>Published</Badge>
|
|
43
|
+
* <Badge count={128} tone="accent" /> // "99+"
|
|
44
|
+
* <Badge onRemove={() => drop("design")}>Design</Badge>
|
|
45
|
+
* <Badge asChild interactive><Link href="/posts?status=draft">Draft</Link></Badge>
|
|
46
|
+
* ```
|
|
47
|
+
*
|
|
48
|
+
* No CSS `uppercase` — it breaks Turkish (i → I) without the right `lang`; use `upperText()`.
|
|
49
|
+
*/
|
|
50
|
+
export const Badge = React.forwardRef(function Badge({ className, tone, size, shape, dot, color, count, max = 99, onRemove, removeLabel, disabled, asChild, children, style, ...props }, ref) {
|
|
51
|
+
const removable = Boolean(onRemove);
|
|
52
|
+
const Comp = asChild && !removable ? Slot.Root : "span";
|
|
53
|
+
const classes = cn(badgeVariants({ tone: color ? "custom" : tone, size, shape, interactive: asChild && !removable ? true : undefined }), count !== undefined && "tabular justify-center", count !== undefined && (size === "lg" ? "min-w-7 px-2" : size === "md" ? "min-w-6 px-2" : "min-w-5 px-1.5"), removable && "pe-1.5", disabled && "pointer-events-none opacity-50", className);
|
|
54
|
+
const content = count !== undefined ? _jsx(LocaleCount, { value: count, max: max }) : children;
|
|
55
|
+
if (Comp === Slot.Root) {
|
|
56
|
+
const slotProps = {
|
|
57
|
+
ref,
|
|
58
|
+
"data-slot": "badge",
|
|
59
|
+
className: classes,
|
|
60
|
+
style: color ? { ...style, ["--tone"]: color } : style,
|
|
61
|
+
"aria-disabled": disabled || undefined,
|
|
62
|
+
...props,
|
|
63
|
+
};
|
|
64
|
+
// Slot needs the dot and the Slottable as direct children (no fragment).
|
|
65
|
+
return dot ? (_jsxs(Slot.Root, { ...slotProps, children: [_jsx("span", { "aria-hidden": true, className: "size-1.5 shrink-0 rounded-full bg-current" }), _jsx(Slot.Slottable, { children: children })] })) : (_jsx(Slot.Root, { ...slotProps, children: children }));
|
|
66
|
+
}
|
|
67
|
+
return (_jsxs("span", { ref: ref, "data-slot": "badge", "data-tone": color ? "custom" : (tone ?? "neutral"), className: classes, style: color ? { ...style, ["--tone"]: color } : style, "aria-disabled": disabled || undefined, ...props, children: [dot ? _jsx("span", { "aria-hidden": true, className: "size-1.5 shrink-0 rounded-full bg-current" }) : null, content, onRemove ? (_jsx(ChipRemoveButton, { onRemove: onRemove, disabled: disabled, removeLabel: removeLabel, itemLabel: typeof children === "string" || typeof children === "number" ? String(children) : undefined })) : null] }));
|
|
68
|
+
});
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
declare const breadcrumbLabels: {
|
|
3
|
+
label: string;
|
|
4
|
+
showHidden: string;
|
|
5
|
+
siblings: string;
|
|
6
|
+
};
|
|
7
|
+
type BreadcrumbSize = "sm" | "md";
|
|
8
|
+
export interface BreadcrumbMenuLink {
|
|
9
|
+
label: React.ReactNode;
|
|
10
|
+
href: string;
|
|
11
|
+
/** Marks the sibling that is the current item. */
|
|
12
|
+
current?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface BreadcrumbItemData {
|
|
15
|
+
label: React.ReactNode;
|
|
16
|
+
href?: string;
|
|
17
|
+
icon?: React.ReactNode;
|
|
18
|
+
/** Jump to siblings ("Companies › Northpoint ▾" → other companies). */
|
|
19
|
+
menu?: BreadcrumbMenuLink[];
|
|
20
|
+
}
|
|
21
|
+
export interface BreadcrumbProps extends React.HTMLAttributes<HTMLElement> {
|
|
22
|
+
/** Data-driven trail. The last item is the current page. Omit for the compound API. */
|
|
23
|
+
items?: BreadcrumbItemData[];
|
|
24
|
+
/** Collapse the middle into a "…" menu when there are more items (first + last `maxItems − 2` stay). */
|
|
25
|
+
maxItems?: number;
|
|
26
|
+
/** Separator between items. Default a chevron that flips in RTL. */
|
|
27
|
+
separator?: React.ReactNode;
|
|
28
|
+
size?: BreadcrumbSize;
|
|
29
|
+
/** Websites: also output a schema.org `BreadcrumbList` JSON-LD script (items with `href`). */
|
|
30
|
+
jsonLd?: boolean;
|
|
31
|
+
/** Origin used to make JSON-LD URLs absolute, e.g. `"https://vamos.ist"`. */
|
|
32
|
+
baseUrl?: string;
|
|
33
|
+
labels?: Partial<typeof breadcrumbLabels>;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Shows where a page sits in a hierarchy and offers a way up (WAI-ARIA Breadcrumb: `nav` + `ol`,
|
|
37
|
+
* `aria-current="page"` on the last item). Links go through the app's router `Link`.
|
|
38
|
+
*
|
|
39
|
+
* ```tsx
|
|
40
|
+
* <Breadcrumb items={[{ label: "Companies", href: "/companies" }, { label: "Northpoint", href: "/companies/northpoint" }, { label: "Contacts" }]} />
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* Compound: `<Breadcrumb><BreadcrumbList><BreadcrumbItem><BreadcrumbLink href/></BreadcrumbItem><BreadcrumbSeparator/>…<BreadcrumbPage/></BreadcrumbList></Breadcrumb>`.
|
|
44
|
+
*/
|
|
45
|
+
export declare const Breadcrumb: React.ForwardRefExoticComponent<BreadcrumbProps & React.RefAttributes<HTMLElement>>;
|
|
46
|
+
/** The ordered list of crumbs. */
|
|
47
|
+
export declare const BreadcrumbList: React.ForwardRefExoticComponent<React.OlHTMLAttributes<HTMLOListElement> & React.RefAttributes<HTMLOListElement>>;
|
|
48
|
+
/** One crumb (`li`). */
|
|
49
|
+
export declare const BreadcrumbItem: React.ForwardRefExoticComponent<React.LiHTMLAttributes<HTMLLIElement> & React.RefAttributes<HTMLLIElement>>;
|
|
50
|
+
export interface BreadcrumbLinkProps extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, "href"> {
|
|
51
|
+
href?: string;
|
|
52
|
+
icon?: React.ReactNode;
|
|
53
|
+
/** Render your own link element instead (keeps the styles). */
|
|
54
|
+
asChild?: boolean;
|
|
55
|
+
}
|
|
56
|
+
/** A crumb that links up the hierarchy. Uses the app's router `Link` (external URLs open in a new tab). */
|
|
57
|
+
export declare const BreadcrumbLink: React.ForwardRefExoticComponent<BreadcrumbLinkProps & React.RefAttributes<HTMLAnchorElement>>;
|
|
58
|
+
export interface BreadcrumbPageProps extends React.HTMLAttributes<HTMLSpanElement> {
|
|
59
|
+
icon?: React.ReactNode;
|
|
60
|
+
}
|
|
61
|
+
/** The current page: plain text, `aria-current="page"` (override for a non-link middle crumb). */
|
|
62
|
+
export declare const BreadcrumbPage: React.ForwardRefExoticComponent<BreadcrumbPageProps & React.RefAttributes<HTMLSpanElement>>;
|
|
63
|
+
/** The separator between crumbs. Hidden from assistive tech. */
|
|
64
|
+
export declare function BreadcrumbSeparator({ className, children, ...props }: React.LiHTMLAttributes<HTMLLIElement>): React.JSX.Element;
|
|
65
|
+
export interface BreadcrumbEllipsisProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
66
|
+
/** The hidden crumbs, offered in a menu. Without items it renders a static "…". */
|
|
67
|
+
items?: BreadcrumbMenuLink[];
|
|
68
|
+
labels?: Partial<typeof breadcrumbLabels>;
|
|
69
|
+
}
|
|
70
|
+
/** "…" for collapsed crumbs; opens a menu with the hidden pages. */
|
|
71
|
+
export declare const BreadcrumbEllipsis: React.ForwardRefExoticComponent<BreadcrumbEllipsisProps & React.RefAttributes<HTMLButtonElement>>;
|
|
72
|
+
/** A small ▾ after a crumb that jumps to its siblings. */
|
|
73
|
+
export declare function BreadcrumbSiblings({ label, items, labels }: {
|
|
74
|
+
label: React.ReactNode;
|
|
75
|
+
items: BreadcrumbMenuLink[];
|
|
76
|
+
labels?: Partial<typeof breadcrumbLabels>;
|
|
77
|
+
}): React.JSX.Element;
|
|
78
|
+
export {};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { DropdownMenu, Slot } from "radix-ui";
|
|
5
|
+
import { ChevronRight, ChevronsUpDown, MoreHorizontal } from "lucide-react";
|
|
6
|
+
import { cva } from "class-variance-authority";
|
|
7
|
+
import { cn } from "../lib/cn.js";
|
|
8
|
+
import { useLabels } from "../lib/labels.js";
|
|
9
|
+
import { SmartLink } from "../lib/provider.js";
|
|
10
|
+
import { usePortalContainer } from "../lib/theme-scope.js";
|
|
11
|
+
import { Layer } from "../lib/layer.js";
|
|
12
|
+
import { itemVariants } from "../lib/variants.js";
|
|
13
|
+
const breadcrumbLabels = {
|
|
14
|
+
label: "Breadcrumb",
|
|
15
|
+
showHidden: "Show hidden pages",
|
|
16
|
+
siblings: "Pages next to {label}",
|
|
17
|
+
};
|
|
18
|
+
const SizeContext = React.createContext("md");
|
|
19
|
+
/**
|
|
20
|
+
* Shows where a page sits in a hierarchy and offers a way up (WAI-ARIA Breadcrumb: `nav` + `ol`,
|
|
21
|
+
* `aria-current="page"` on the last item). Links go through the app's router `Link`.
|
|
22
|
+
*
|
|
23
|
+
* ```tsx
|
|
24
|
+
* <Breadcrumb items={[{ label: "Companies", href: "/companies" }, { label: "Northpoint", href: "/companies/northpoint" }, { label: "Contacts" }]} />
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* Compound: `<Breadcrumb><BreadcrumbList><BreadcrumbItem><BreadcrumbLink href/></BreadcrumbItem><BreadcrumbSeparator/>…<BreadcrumbPage/></BreadcrumbList></Breadcrumb>`.
|
|
28
|
+
*/
|
|
29
|
+
export const Breadcrumb = React.forwardRef(function Breadcrumb({ items, maxItems, separator, size = "md", jsonLd, baseUrl, labels, className, children, ...props }, ref) {
|
|
30
|
+
const t = useLabels("breadcrumb", breadcrumbLabels, labels);
|
|
31
|
+
return (_jsx(SizeContext.Provider, { value: size, children: _jsxs("nav", { ref: ref, "aria-label": t("label"), "data-slot": "breadcrumb", className: cn("min-w-0", className), ...props, children: [items ? _jsx(BreadcrumbTrail, { items: items, maxItems: maxItems, separator: separator, labels: labels }) : children, items && jsonLd ? _jsx(BreadcrumbJsonLd, { items: items, baseUrl: baseUrl }) : null] }) }));
|
|
32
|
+
});
|
|
33
|
+
function BreadcrumbTrail({ items, maxItems, separator, labels }) {
|
|
34
|
+
const tail = maxItems ? Math.max(1, maxItems - 2) : items.length;
|
|
35
|
+
const collapse = maxItems !== undefined && items.length > maxItems && items.length > tail + 1;
|
|
36
|
+
const hidden = collapse ? items.slice(1, items.length - tail) : [];
|
|
37
|
+
const visible = collapse
|
|
38
|
+
? [{ item: items[0], index: 0 }, "ellipsis", ...items.slice(items.length - tail).map((item, i) => ({ item, index: items.length - tail + i }))]
|
|
39
|
+
: items.map((item, index) => ({ item, index }));
|
|
40
|
+
return (_jsx(BreadcrumbList, { children: visible.map((entry, i) => {
|
|
41
|
+
const sep = i > 0 ? _jsx(BreadcrumbSeparator, { children: separator }, `s${i}`) : null;
|
|
42
|
+
if (entry === "ellipsis") {
|
|
43
|
+
return (_jsxs(React.Fragment, { children: [sep, _jsx(BreadcrumbItem, { children: _jsx(BreadcrumbEllipsis, { items: hidden.map((h) => ({ label: h.label, href: h.href ?? "" })).filter((h) => h.href), labels: labels }) })] }, "ellipsis"));
|
|
44
|
+
}
|
|
45
|
+
const { item, index } = entry;
|
|
46
|
+
const last = index === items.length - 1;
|
|
47
|
+
return (_jsxs(React.Fragment, { children: [sep, _jsxs(BreadcrumbItem, { children: [last || !item.href ? (_jsx(BreadcrumbPage, { icon: item.icon, "aria-current": last ? "page" : undefined, children: item.label })) : (_jsx(BreadcrumbLink, { href: item.href, icon: item.icon, children: item.label })), item.menu?.length ? _jsx(BreadcrumbSiblings, { label: item.label, items: item.menu, labels: labels }) : null] })] }, index));
|
|
48
|
+
}) }));
|
|
49
|
+
}
|
|
50
|
+
const listVariants = cva("flex min-w-0 flex-wrap items-center text-fg-muted", {
|
|
51
|
+
variants: { size: { sm: "gap-1 text-[13px] [&_svg]:size-3.5", md: "gap-1.5 text-sm [&_svg]:size-4" } },
|
|
52
|
+
defaultVariants: { size: "md" },
|
|
53
|
+
});
|
|
54
|
+
/** The ordered list of crumbs. */
|
|
55
|
+
export const BreadcrumbList = React.forwardRef(function BreadcrumbList({ className, ...props }, ref) {
|
|
56
|
+
const size = React.useContext(SizeContext);
|
|
57
|
+
return _jsx("ol", { ref: ref, "data-slot": "breadcrumb-list", className: cn(listVariants({ size }), className), ...props });
|
|
58
|
+
});
|
|
59
|
+
/** One crumb (`li`). */
|
|
60
|
+
export const BreadcrumbItem = React.forwardRef(function BreadcrumbItem({ className, ...props }, ref) {
|
|
61
|
+
return _jsx("li", { ref: ref, "data-slot": "breadcrumb-item", className: cn("inline-flex min-w-0 items-center gap-0.5", className), ...props });
|
|
62
|
+
});
|
|
63
|
+
const crumbClass = "inline-flex min-w-0 max-w-[16rem] items-center gap-1.5 rounded-ui-sm [&_svg]:shrink-0";
|
|
64
|
+
/** A crumb that links up the hierarchy. Uses the app's router `Link` (external URLs open in a new tab). */
|
|
65
|
+
export const BreadcrumbLink = React.forwardRef(function BreadcrumbLink({ href, icon, asChild, className, children, title, ...props }, ref) {
|
|
66
|
+
const classes = cn(crumbClass, "transition-colors hover:text-fg focus-ring", className);
|
|
67
|
+
if (asChild)
|
|
68
|
+
return _jsx(Slot.Root, { ref: ref, "data-slot": "breadcrumb-link", className: classes, ...props, children: children });
|
|
69
|
+
return (_jsxs(SmartLink, { ref: ref, href: href ?? "#", "data-slot": "breadcrumb-link", className: classes, title: title ?? (typeof children === "string" ? children : undefined), ...props, children: [icon ? _jsx("span", { "aria-hidden": true, className: "inline-flex", children: icon }) : null, _jsx("span", { className: "truncate", children: children })] }));
|
|
70
|
+
});
|
|
71
|
+
/** The current page: plain text, `aria-current="page"` (override for a non-link middle crumb). */
|
|
72
|
+
export const BreadcrumbPage = React.forwardRef(function BreadcrumbPage({ icon, className, children, title, ...props }, ref) {
|
|
73
|
+
const current = !("aria-current" in props) || props["aria-current"] !== undefined;
|
|
74
|
+
return (_jsxs("span", { ref: ref, "data-slot": "breadcrumb-page", "aria-current": "page", title: title ?? (typeof children === "string" ? children : undefined), className: cn(crumbClass, current ? "font-medium text-fg" : "text-fg-muted", className), ...props, children: [icon ? _jsx("span", { "aria-hidden": true, className: "inline-flex", children: icon }) : null, _jsx("span", { className: "truncate", children: children })] }));
|
|
75
|
+
});
|
|
76
|
+
/** The separator between crumbs. Hidden from assistive tech. */
|
|
77
|
+
export function BreadcrumbSeparator({ className, children, ...props }) {
|
|
78
|
+
return (_jsx("li", { role: "presentation", "aria-hidden": true, "data-slot": "breadcrumb-separator", className: cn("inline-flex text-fg-subtle [&>svg]:rtl:-scale-x-100", className), ...props, children: children ?? _jsx(ChevronRight, { strokeWidth: 1.75 }) }));
|
|
79
|
+
}
|
|
80
|
+
const menuContentClass = "surface-popover ui-pop z-(--z-popover) min-w-48 max-w-72 rounded-ui p-1";
|
|
81
|
+
function CrumbMenu({ trigger, items }) {
|
|
82
|
+
const container = usePortalContainer();
|
|
83
|
+
return (_jsxs(DropdownMenu.Root, { children: [_jsx(DropdownMenu.Trigger, { asChild: true, children: trigger }), _jsx(DropdownMenu.Portal, { container: container, children: _jsx(Layer, { asChild: true, children: _jsx(DropdownMenu.Content, { align: "start", sideOffset: 6, className: menuContentClass, children: items.map((it, i) => (_jsx(DropdownMenu.Item, { asChild: true, className: cn(itemVariants({ size: "sm" }), it.current && "font-medium"), children: _jsx(SmartLink, { href: it.href, "aria-current": it.current ? "page" : undefined, children: _jsx("span", { className: "min-w-0 flex-1 truncate", children: it.label }) }) }, i))) }) }) })] }));
|
|
84
|
+
}
|
|
85
|
+
const iconTrigger = "inline-flex size-6 items-center justify-center rounded-ui-sm text-fg-subtle transition-colors hover:bg-hover hover:text-fg focus-ring data-[state=open]:bg-hover data-[state=open]:text-fg";
|
|
86
|
+
/** "…" for collapsed crumbs; opens a menu with the hidden pages. */
|
|
87
|
+
export const BreadcrumbEllipsis = React.forwardRef(function BreadcrumbEllipsis({ items, labels, className, ...props }, ref) {
|
|
88
|
+
const t = useLabels("breadcrumb", breadcrumbLabels, labels);
|
|
89
|
+
if (!items?.length) {
|
|
90
|
+
return (_jsxs("span", { "data-slot": "breadcrumb-ellipsis", className: "inline-flex size-6 items-center justify-center text-fg-subtle", children: [_jsx(MoreHorizontal, { "aria-hidden": true }), _jsx("span", { className: "sr-only", children: t("showHidden") })] }));
|
|
91
|
+
}
|
|
92
|
+
return (_jsx(CrumbMenu, { items: items, trigger: _jsx("button", { ref: ref, type: "button", "data-slot": "breadcrumb-ellipsis", "aria-label": t("showHidden"), className: cn(iconTrigger, className), ...props, children: _jsx(MoreHorizontal, { "aria-hidden": true }) }) }));
|
|
93
|
+
});
|
|
94
|
+
/** A small ▾ after a crumb that jumps to its siblings. */
|
|
95
|
+
export function BreadcrumbSiblings({ label, items, labels }) {
|
|
96
|
+
const t = useLabels("breadcrumb", breadcrumbLabels, labels);
|
|
97
|
+
const name = t("siblings", { label: typeof label === "string" ? label : "" }).trim();
|
|
98
|
+
return (_jsx(CrumbMenu, { items: items, trigger: _jsx("button", { type: "button", "data-slot": "breadcrumb-siblings", "aria-label": name, className: cn(iconTrigger, "size-5 [&_svg]:size-3!"), children: _jsx(ChevronsUpDown, { "aria-hidden": true }) }) }));
|
|
99
|
+
}
|
|
100
|
+
function BreadcrumbJsonLd({ items, baseUrl = "" }) {
|
|
101
|
+
const list = items
|
|
102
|
+
.filter((i) => i.href && typeof i.label === "string")
|
|
103
|
+
.map((i, n) => ({ "@type": "ListItem", position: n + 1, name: i.label, item: /^https?:/.test(i.href) ? i.href : `${baseUrl.replace(/\/$/, "")}${i.href}` }));
|
|
104
|
+
const json = JSON.stringify({ "@context": "https://schema.org", "@type": "BreadcrumbList", itemListElement: list }).replace(/</g, "\\u003c");
|
|
105
|
+
return _jsx("script", { type: "application/ld+json", dangerouslySetInnerHTML: { __html: json } });
|
|
106
|
+
}
|