@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,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ICU-lite message formatting — React-free, ~no dependencies.
|
|
3
|
+
*
|
|
4
|
+
* Supported syntax:
|
|
5
|
+
* - `{name}` — replaced with `vars.name` (numbers are formatted with the locale: 1250 → "1,250").
|
|
6
|
+
* - `{count, plural, =0 {No files} one {# file} other {# files}}` — `Intl.PluralRules`; `#` is the formatted number.
|
|
7
|
+
* - `{count, selectordinal, one {#st} two {#nd} few {#rd} other {#th}}`.
|
|
8
|
+
* - `{role, select, admin {Administrator} other {Member}}`.
|
|
9
|
+
*
|
|
10
|
+
* Unknown placeholders are left as-is (`{name}`), so a missing variable is visible, not silent.
|
|
11
|
+
*/
|
|
12
|
+
const pluralCache = new Map();
|
|
13
|
+
const numberCache = new Map();
|
|
14
|
+
function pluralRules(locale, type) {
|
|
15
|
+
const k = locale + type;
|
|
16
|
+
let r = pluralCache.get(k);
|
|
17
|
+
if (!r)
|
|
18
|
+
pluralCache.set(k, (r = new Intl.PluralRules(locale, { type })));
|
|
19
|
+
return r;
|
|
20
|
+
}
|
|
21
|
+
function numberFormat(locale) {
|
|
22
|
+
let f = numberCache.get(locale);
|
|
23
|
+
if (!f)
|
|
24
|
+
numberCache.set(locale, (f = new Intl.NumberFormat(locale)));
|
|
25
|
+
return f;
|
|
26
|
+
}
|
|
27
|
+
/** Index of the `}` closing the `{` at `open`, or -1. */
|
|
28
|
+
function closing(s, open) {
|
|
29
|
+
let depth = 0;
|
|
30
|
+
for (let i = open; i < s.length; i++) {
|
|
31
|
+
if (s[i] === "{")
|
|
32
|
+
depth++;
|
|
33
|
+
else if (s[i] === "}" && --depth === 0)
|
|
34
|
+
return i;
|
|
35
|
+
}
|
|
36
|
+
return -1;
|
|
37
|
+
}
|
|
38
|
+
function parseBranches(s) {
|
|
39
|
+
const out = new Map();
|
|
40
|
+
let i = 0;
|
|
41
|
+
while (i < s.length) {
|
|
42
|
+
while (i < s.length && /\s/.test(s[i]))
|
|
43
|
+
i++;
|
|
44
|
+
const start = i;
|
|
45
|
+
while (i < s.length && s[i] !== "{" && !/\s/.test(s[i]))
|
|
46
|
+
i++;
|
|
47
|
+
const key = s.slice(start, i);
|
|
48
|
+
while (i < s.length && /\s/.test(s[i]))
|
|
49
|
+
i++;
|
|
50
|
+
if (s[i] !== "{")
|
|
51
|
+
break;
|
|
52
|
+
const end = closing(s, i);
|
|
53
|
+
if (end === -1)
|
|
54
|
+
break;
|
|
55
|
+
if (key)
|
|
56
|
+
out.set(key, s.slice(i + 1, end));
|
|
57
|
+
i = end + 1;
|
|
58
|
+
}
|
|
59
|
+
return out;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Formats a message template.
|
|
63
|
+
*
|
|
64
|
+
* ```ts
|
|
65
|
+
* formatMessage("Remove {label}", { label: "Design" }); // "Remove Design"
|
|
66
|
+
* formatMessage("{count, plural, one {# reply} other {# replies}}", { count: 1250 }, "en-US"); // "1,250 replies"
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
export function formatMessage(template, vars = {}, locale = "en-US") {
|
|
70
|
+
if (!template.includes("{"))
|
|
71
|
+
return template;
|
|
72
|
+
let out = "";
|
|
73
|
+
let i = 0;
|
|
74
|
+
while (i < template.length) {
|
|
75
|
+
const open = template.indexOf("{", i);
|
|
76
|
+
if (open === -1) {
|
|
77
|
+
out += template.slice(i);
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
out += template.slice(i, open);
|
|
81
|
+
const close = closing(template, open);
|
|
82
|
+
if (close === -1) {
|
|
83
|
+
out += template.slice(open);
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
const inner = template.slice(open + 1, close);
|
|
87
|
+
const m = /^\s*([\w.-]+)\s*(?:,\s*(plural|selectordinal|select)\s*,([\s\S]*))?$/.exec(inner);
|
|
88
|
+
if (!m)
|
|
89
|
+
out += `{${inner}}`;
|
|
90
|
+
else {
|
|
91
|
+
const [, name, kind, rest] = m;
|
|
92
|
+
const value = vars[name];
|
|
93
|
+
if (!kind) {
|
|
94
|
+
out += value === undefined || value === null ? `{${name}}` : typeof value === "number" ? numberFormat(locale).format(value) : String(value);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
const branches = parseBranches(rest ?? "");
|
|
98
|
+
let branch;
|
|
99
|
+
if (kind === "select")
|
|
100
|
+
branch = branches.get(String(value)) ?? branches.get("other");
|
|
101
|
+
else {
|
|
102
|
+
const n = Number(value);
|
|
103
|
+
branch =
|
|
104
|
+
branches.get(`=${n}`) ??
|
|
105
|
+
branches.get(pluralRules(locale, kind === "plural" ? "cardinal" : "ordinal").select(n)) ??
|
|
106
|
+
branches.get("other");
|
|
107
|
+
if (branch !== undefined)
|
|
108
|
+
branch = branch.replace(/#/g, Number.isFinite(n) ? numberFormat(locale).format(n) : String(value));
|
|
109
|
+
}
|
|
110
|
+
out += branch === undefined ? "" : formatMessage(branch, vars, locale);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
i = close + 1;
|
|
114
|
+
}
|
|
115
|
+
return out;
|
|
116
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import type * as React from "react";
|
|
2
|
+
/**
|
|
3
|
+
* The navigation model shared by Sidebar, App shell, Breadcrumb ("auto"), Page header and the
|
|
4
|
+
* Command palette's "Go to" commands. Pure data + pure helpers (no React), so it works on the
|
|
5
|
+
* server and is unit-tested on its own.
|
|
6
|
+
*/
|
|
7
|
+
/** A count, a short label, or a styled badge. Live values go through `SidebarNav badges`, not the config. */
|
|
8
|
+
export type BadgeSpec = number | string | {
|
|
9
|
+
count?: number;
|
|
10
|
+
/** Default `"accent"`. */
|
|
11
|
+
tone?: "accent" | "danger" | "warning" | "neutral";
|
|
12
|
+
/** Only a dot (e.g. "something new"). */
|
|
13
|
+
dot?: boolean;
|
|
14
|
+
/** Accessible text, e.g. "4 pending". Default from the dictionary (`sidebar.badge`). */
|
|
15
|
+
label?: string;
|
|
16
|
+
};
|
|
17
|
+
export type NavIcon = React.ComponentType<{
|
|
18
|
+
className?: string;
|
|
19
|
+
strokeWidth?: number;
|
|
20
|
+
"aria-hidden"?: boolean | "true" | "false";
|
|
21
|
+
}>;
|
|
22
|
+
export interface NavItem {
|
|
23
|
+
/** Stable key for badges, commands, analytics and the active trail. */
|
|
24
|
+
id: string;
|
|
25
|
+
label: string;
|
|
26
|
+
/** Omitted → a section parent that only opens its children. */
|
|
27
|
+
href?: string;
|
|
28
|
+
icon?: NavIcon;
|
|
29
|
+
/** Up to 3 levels. */
|
|
30
|
+
children?: NavItem[];
|
|
31
|
+
/** Extra active patterns (`"/posts/*"` = any child path) or a predicate. */
|
|
32
|
+
match?: string[] | ((path: string) => boolean);
|
|
33
|
+
/** Hidden unless `can(permission)` (all of them for an array). UI only — enforce on the server. */
|
|
34
|
+
permission?: string | string[];
|
|
35
|
+
/** Hidden unless `features[feature]` is true (module toggle / feature flag). */
|
|
36
|
+
feature?: string;
|
|
37
|
+
/** Opens in a new tab with an ↗ icon. Default: detected from an absolute `href`. */
|
|
38
|
+
external?: boolean;
|
|
39
|
+
/** Extra search terms for ⌘K "Go to". */
|
|
40
|
+
keywords?: string[];
|
|
41
|
+
/** Static badge. */
|
|
42
|
+
badge?: BadgeSpec;
|
|
43
|
+
/** `true`, or a reason shown as a badge ("Coming soon"). */
|
|
44
|
+
disabled?: boolean | string;
|
|
45
|
+
}
|
|
46
|
+
export interface NavGroup {
|
|
47
|
+
type: "group";
|
|
48
|
+
id: string;
|
|
49
|
+
/** Section heading. */
|
|
50
|
+
label?: string;
|
|
51
|
+
items: NavItem[];
|
|
52
|
+
}
|
|
53
|
+
export interface NavSeparator {
|
|
54
|
+
type: "separator";
|
|
55
|
+
id?: string;
|
|
56
|
+
}
|
|
57
|
+
/** One entry of a nav config: an item, a labelled group (section) or a separator. */
|
|
58
|
+
export type NavNode = NavItem | NavGroup | NavSeparator;
|
|
59
|
+
/** Alias of `NavNode`. */
|
|
60
|
+
export type NavEntry = NavNode;
|
|
61
|
+
export declare const isNavGroup: (n: NavNode) => n is NavGroup;
|
|
62
|
+
export declare const isNavSeparator: (n: NavNode) => n is NavSeparator;
|
|
63
|
+
export declare const isNavItem: (n: NavNode) => n is NavItem;
|
|
64
|
+
export interface FilterNavOptions {
|
|
65
|
+
can?: (permission: string) => boolean;
|
|
66
|
+
features?: Record<string, boolean | undefined>;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Drops items the user can't see (`permission` via `can`, `feature` via `features`), then empty
|
|
70
|
+
* groups and leading / trailing / doubled separators. **UI only** — permissions must be enforced
|
|
71
|
+
* on the server.
|
|
72
|
+
*/
|
|
73
|
+
export declare function filterNav(nodes: NavNode[], options?: FilterNavOptions): NavNode[];
|
|
74
|
+
/** Top-level items of a config, with groups unwrapped. */
|
|
75
|
+
export declare function navItems(nodes: NavNode[]): NavItem[];
|
|
76
|
+
/** `true` for `http(s)://`, protocol-relative and `mailto:`-style hrefs. */
|
|
77
|
+
export declare const isAbsoluteHref: (href: string) => boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Length of the match of `pattern` against `path`, or -1. `/` matches only exactly; `"/posts"`
|
|
80
|
+
* matches `/posts` and `/posts/12`; `"/posts/*"` matches only children.
|
|
81
|
+
*/
|
|
82
|
+
export declare function matchPath(pattern: string, path: string): number;
|
|
83
|
+
export interface ActiveNav {
|
|
84
|
+
/** Ids from the top-level item down to the active leaf, e.g. `["posts", "posts.categories"]`. */
|
|
85
|
+
trail: string[];
|
|
86
|
+
leafId?: string;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* The active item by **longest-prefix match** over every `href` and `match` pattern, so the
|
|
90
|
+
* dashboard (`/site`) isn't active on `/site/posts`. The trail feeds Sidebar, Breadcrumb and Page header.
|
|
91
|
+
*/
|
|
92
|
+
export declare function resolveActive(nodes: NavNode[], path: string | undefined): ActiveNav;
|
|
93
|
+
export interface FlatNavItem {
|
|
94
|
+
id: string;
|
|
95
|
+
label: string;
|
|
96
|
+
href: string;
|
|
97
|
+
/** Labels from the top level down, e.g. `["Settings", "Reading"]`. */
|
|
98
|
+
trail: string[];
|
|
99
|
+
/** Ids from the top level down. */
|
|
100
|
+
ids: string[];
|
|
101
|
+
/** Heading of the group the item sits in. */
|
|
102
|
+
group?: string;
|
|
103
|
+
icon?: NavIcon;
|
|
104
|
+
keywords?: string[];
|
|
105
|
+
external?: boolean;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Every navigable item (has an `href`, not disabled) as a flat list — for ⌘K "Go to" and Breadcrumb.
|
|
109
|
+
* A child whose `href` equals its parent's (an "All posts" index) is folded into the parent.
|
|
110
|
+
*/
|
|
111
|
+
export declare function flattenNav(nodes: NavNode[]): FlatNavItem[];
|
|
112
|
+
/** Finds an item by id anywhere in the tree. */
|
|
113
|
+
export declare function findNavItem(nodes: NavNode[], id: string): NavItem | undefined;
|
|
114
|
+
/** Breadcrumb items for an active trail (`resolveActive(...).trail`). */
|
|
115
|
+
export declare function navTrailItems(nodes: NavNode[], trail: string[]): Array<{
|
|
116
|
+
id: string;
|
|
117
|
+
label: string;
|
|
118
|
+
href?: string;
|
|
119
|
+
}>;
|
|
120
|
+
export interface NormalisedBadge {
|
|
121
|
+
count?: number;
|
|
122
|
+
text?: string;
|
|
123
|
+
tone: "accent" | "danger" | "warning" | "neutral";
|
|
124
|
+
dot: boolean;
|
|
125
|
+
label?: string;
|
|
126
|
+
}
|
|
127
|
+
/** Normalises a `BadgeSpec`; `undefined` / `0` / empty → `undefined` (nothing to show). */
|
|
128
|
+
export declare function normaliseBadge(b: BadgeSpec | undefined | null): NormalisedBadge | undefined;
|
|
129
|
+
/** Cookie the App shell stores the collapsed state in (`"1"` = rail). Read it on the server to avoid a flash. */
|
|
130
|
+
export declare const SIDEBAR_COOKIE = "ui-sidebar";
|
|
131
|
+
/** `true` / `false` from a `ui-sidebar` cookie value (or a whole `Cookie` header); `undefined` when unset. */
|
|
132
|
+
export declare function parseSidebarCookie(value: string | null | undefined): boolean | undefined;
|
package/dist/lib/nav.js
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
export const isNavGroup = (n) => n.type === "group";
|
|
2
|
+
export const isNavSeparator = (n) => n.type === "separator";
|
|
3
|
+
export const isNavItem = (n) => !("type" in n) || n.type === undefined;
|
|
4
|
+
function allowed(item, { can, features }) {
|
|
5
|
+
if (item.permission && can) {
|
|
6
|
+
const list = Array.isArray(item.permission) ? item.permission : [item.permission];
|
|
7
|
+
if (!list.every((p) => can(p)))
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
if (item.feature && features && !features[item.feature])
|
|
11
|
+
return false;
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
function filterItems(items, o) {
|
|
15
|
+
const out = [];
|
|
16
|
+
for (const it of items) {
|
|
17
|
+
if (!allowed(it, o))
|
|
18
|
+
continue;
|
|
19
|
+
if (it.children) {
|
|
20
|
+
const children = filterItems(it.children, o);
|
|
21
|
+
// A parent with no href and no visible child has nothing to open.
|
|
22
|
+
if (!it.href && children.length === 0)
|
|
23
|
+
continue;
|
|
24
|
+
out.push({ ...it, children: children.length ? children : undefined });
|
|
25
|
+
}
|
|
26
|
+
else
|
|
27
|
+
out.push(it);
|
|
28
|
+
}
|
|
29
|
+
return out;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Drops items the user can't see (`permission` via `can`, `feature` via `features`), then empty
|
|
33
|
+
* groups and leading / trailing / doubled separators. **UI only** — permissions must be enforced
|
|
34
|
+
* on the server.
|
|
35
|
+
*/
|
|
36
|
+
export function filterNav(nodes, options = {}) {
|
|
37
|
+
const out = [];
|
|
38
|
+
for (const n of nodes) {
|
|
39
|
+
if (isNavSeparator(n)) {
|
|
40
|
+
if (out.length && !isNavSeparator(out[out.length - 1]))
|
|
41
|
+
out.push(n);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (isNavGroup(n)) {
|
|
45
|
+
const items = filterItems(n.items, options);
|
|
46
|
+
if (items.length)
|
|
47
|
+
out.push({ ...n, items });
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const [it] = filterItems([n], options);
|
|
51
|
+
if (it)
|
|
52
|
+
out.push(it);
|
|
53
|
+
}
|
|
54
|
+
while (out.length && isNavSeparator(out[out.length - 1]))
|
|
55
|
+
out.pop();
|
|
56
|
+
return out;
|
|
57
|
+
}
|
|
58
|
+
/** Top-level items of a config, with groups unwrapped. */
|
|
59
|
+
export function navItems(nodes) {
|
|
60
|
+
return nodes.flatMap((n) => (isNavGroup(n) ? n.items : isNavItem(n) ? [n] : []));
|
|
61
|
+
}
|
|
62
|
+
const clean = (p) => {
|
|
63
|
+
const path = p.split(/[?#]/)[0] || "/";
|
|
64
|
+
return path.length > 1 ? path.replace(/\/+$/, "") : path;
|
|
65
|
+
};
|
|
66
|
+
/** `true` for `http(s)://`, protocol-relative and `mailto:`-style hrefs. */
|
|
67
|
+
export const isAbsoluteHref = (href) => /^([a-z][a-z\d+.-]*:|\/\/)/i.test(href);
|
|
68
|
+
/**
|
|
69
|
+
* Length of the match of `pattern` against `path`, or -1. `/` matches only exactly; `"/posts"`
|
|
70
|
+
* matches `/posts` and `/posts/12`; `"/posts/*"` matches only children.
|
|
71
|
+
*/
|
|
72
|
+
export function matchPath(pattern, path) {
|
|
73
|
+
if (isAbsoluteHref(pattern))
|
|
74
|
+
return -1;
|
|
75
|
+
const p = clean(path);
|
|
76
|
+
if (pattern.endsWith("/*")) {
|
|
77
|
+
const base = clean(pattern.slice(0, -2));
|
|
78
|
+
return p.startsWith(base === "/" ? "/" : `${base}/`) && p !== base ? base.length + 1 : -1;
|
|
79
|
+
}
|
|
80
|
+
const t = clean(pattern);
|
|
81
|
+
if (t === "/")
|
|
82
|
+
return p === "/" ? 1 : -1;
|
|
83
|
+
return p === t || p.startsWith(`${t}/`) ? t.length : -1;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* The active item by **longest-prefix match** over every `href` and `match` pattern, so the
|
|
87
|
+
* dashboard (`/site`) isn't active on `/site/posts`. The trail feeds Sidebar, Breadcrumb and Page header.
|
|
88
|
+
*/
|
|
89
|
+
export function resolveActive(nodes, path) {
|
|
90
|
+
if (!path)
|
|
91
|
+
return { trail: [] };
|
|
92
|
+
let best = { score: -1, trail: [] };
|
|
93
|
+
const visit = (items, parents) => {
|
|
94
|
+
for (const it of items) {
|
|
95
|
+
const trail = [...parents, it.id];
|
|
96
|
+
let score = it.href ? matchPath(it.href, path) : -1;
|
|
97
|
+
if (Array.isArray(it.match))
|
|
98
|
+
for (const m of it.match)
|
|
99
|
+
score = Math.max(score, matchPath(m, path));
|
|
100
|
+
else if (typeof it.match === "function" && it.match(path))
|
|
101
|
+
score = Math.max(score, 0.5 + (it.href ? clean(it.href).length : 0));
|
|
102
|
+
// Ties go to the deeper item ("All posts" over its parent "Posts", both /site/posts).
|
|
103
|
+
if (score >= 0 && (score > best.score || (score === best.score && trail.length > best.trail.length)))
|
|
104
|
+
best = { score, trail };
|
|
105
|
+
if (it.children)
|
|
106
|
+
visit(it.children, trail);
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
visit(navItems(nodes), []);
|
|
110
|
+
return best.score < 0 ? { trail: [] } : { trail: best.trail, leafId: best.trail[best.trail.length - 1] };
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Every navigable item (has an `href`, not disabled) as a flat list — for ⌘K "Go to" and Breadcrumb.
|
|
114
|
+
* A child whose `href` equals its parent's (an "All posts" index) is folded into the parent.
|
|
115
|
+
*/
|
|
116
|
+
export function flattenNav(nodes) {
|
|
117
|
+
const out = [];
|
|
118
|
+
const seen = new Set();
|
|
119
|
+
const visit = (items, labels, ids, group, icon) => {
|
|
120
|
+
for (const it of items) {
|
|
121
|
+
const trail = [...labels, it.label];
|
|
122
|
+
const idTrail = [...ids, it.id];
|
|
123
|
+
const ic = it.icon ?? icon;
|
|
124
|
+
if (it.href && !it.disabled && !seen.has(it.href)) {
|
|
125
|
+
seen.add(it.href);
|
|
126
|
+
out.push({ id: it.id, label: it.label, href: it.href, trail, ids: idTrail, group, icon: ic, keywords: it.keywords, external: it.external ?? isAbsoluteHref(it.href) });
|
|
127
|
+
}
|
|
128
|
+
if (it.children)
|
|
129
|
+
visit(it.children, trail, idTrail, group, ic);
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
for (const n of nodes) {
|
|
133
|
+
if (isNavGroup(n))
|
|
134
|
+
visit(n.items, [], [], n.label, undefined);
|
|
135
|
+
else if (isNavItem(n))
|
|
136
|
+
visit([n], [], [], undefined, undefined);
|
|
137
|
+
}
|
|
138
|
+
return out;
|
|
139
|
+
}
|
|
140
|
+
/** Finds an item by id anywhere in the tree. */
|
|
141
|
+
export function findNavItem(nodes, id) {
|
|
142
|
+
const visit = (items) => {
|
|
143
|
+
for (const it of items) {
|
|
144
|
+
if (it.id === id)
|
|
145
|
+
return it;
|
|
146
|
+
const hit = it.children && visit(it.children);
|
|
147
|
+
if (hit)
|
|
148
|
+
return hit;
|
|
149
|
+
}
|
|
150
|
+
return undefined;
|
|
151
|
+
};
|
|
152
|
+
return visit(navItems(nodes));
|
|
153
|
+
}
|
|
154
|
+
/** Breadcrumb items for an active trail (`resolveActive(...).trail`). */
|
|
155
|
+
export function navTrailItems(nodes, trail) {
|
|
156
|
+
return trail.map((id) => findNavItem(nodes, id)).filter((x) => Boolean(x)).map((it) => ({ id: it.id, label: it.label, href: it.href }));
|
|
157
|
+
}
|
|
158
|
+
/** Normalises a `BadgeSpec`; `undefined` / `0` / empty → `undefined` (nothing to show). */
|
|
159
|
+
export function normaliseBadge(b) {
|
|
160
|
+
if (b == null || b === "" || b === 0)
|
|
161
|
+
return undefined;
|
|
162
|
+
if (typeof b === "number")
|
|
163
|
+
return { count: b, tone: "accent", dot: false };
|
|
164
|
+
if (typeof b === "string")
|
|
165
|
+
return { text: b, tone: "accent", dot: false };
|
|
166
|
+
if (!b.dot && !b.count && !b.label)
|
|
167
|
+
return undefined;
|
|
168
|
+
return { count: b.count, tone: b.tone ?? "accent", dot: Boolean(b.dot), label: b.label };
|
|
169
|
+
}
|
|
170
|
+
/** Cookie the App shell stores the collapsed state in (`"1"` = rail). Read it on the server to avoid a flash. */
|
|
171
|
+
export const SIDEBAR_COOKIE = "ui-sidebar";
|
|
172
|
+
/** `true` / `false` from a `ui-sidebar` cookie value (or a whole `Cookie` header); `undefined` when unset. */
|
|
173
|
+
export function parseSidebarCookie(value) {
|
|
174
|
+
if (!value)
|
|
175
|
+
return undefined;
|
|
176
|
+
const m = value.includes("=") ? new RegExp(`(?:^|;\\s*)${SIDEBAR_COOKIE}=([^;]*)`).exec(value)?.[1] : value;
|
|
177
|
+
return m === "1" ? true : m === "0" ? false : undefined;
|
|
178
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { type LocaleProviderProps } from "./locale.js";
|
|
3
|
+
/** Props every kit link accepts. Router links (Next `Link`) are compatible. */
|
|
4
|
+
export interface VamosLinkProps extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, "href"> {
|
|
5
|
+
href: string;
|
|
6
|
+
/** Router hint: replace the history entry. */
|
|
7
|
+
replace?: boolean;
|
|
8
|
+
/** Router hint: prefetch the target. */
|
|
9
|
+
prefetch?: boolean | null;
|
|
10
|
+
ref?: React.Ref<HTMLAnchorElement>;
|
|
11
|
+
}
|
|
12
|
+
export type VamosLinkComponent = React.ComponentType<VamosLinkProps>;
|
|
13
|
+
/** Props every kit image accepts. Next `Image` is compatible. */
|
|
14
|
+
export interface VamosImageProps extends Omit<React.ImgHTMLAttributes<HTMLImageElement>, "src" | "alt" | "width" | "height"> {
|
|
15
|
+
src: string;
|
|
16
|
+
alt: string;
|
|
17
|
+
width?: number;
|
|
18
|
+
height?: number;
|
|
19
|
+
/** Fill the positioned parent (object-fit via className). */
|
|
20
|
+
fill?: boolean;
|
|
21
|
+
/** Above-the-fold image: eager loading + high fetch priority. */
|
|
22
|
+
priority?: boolean;
|
|
23
|
+
quality?: number;
|
|
24
|
+
ref?: React.Ref<HTMLImageElement>;
|
|
25
|
+
}
|
|
26
|
+
export type VamosImageComponent = React.ComponentType<VamosImageProps>;
|
|
27
|
+
export interface NavigateOptions {
|
|
28
|
+
replace?: boolean;
|
|
29
|
+
scroll?: boolean;
|
|
30
|
+
}
|
|
31
|
+
export interface VamosContextValue {
|
|
32
|
+
Link: VamosLinkComponent;
|
|
33
|
+
Image: VamosImageComponent;
|
|
34
|
+
navigate: (href: string, options?: NavigateOptions) => void;
|
|
35
|
+
/** Current pathname, for active nav items. Pass it from the server layout to avoid a hydration flash. */
|
|
36
|
+
currentPath?: string;
|
|
37
|
+
/** Permission check used to hide nav items and actions. Hiding is not access control. */
|
|
38
|
+
can: (permission: string, resource?: unknown) => boolean;
|
|
39
|
+
/** Media adapter (see `@vamos-ui/react/media`). Typed by the consumer: `useMediaAdapter<MyAdapter>()`. */
|
|
40
|
+
media?: unknown;
|
|
41
|
+
}
|
|
42
|
+
/** Default link: a plain `<a>` (router hints are dropped). */
|
|
43
|
+
export declare const DefaultLink: React.ForwardRefExoticComponent<Omit<VamosLinkProps, "ref"> & React.RefAttributes<HTMLAnchorElement>>;
|
|
44
|
+
/** Default image: a plain `<img>` with lazy loading; `fill` covers the positioned parent. */
|
|
45
|
+
export declare const DefaultImage: React.ForwardRefExoticComponent<Omit<VamosImageProps, "ref"> & React.RefAttributes<HTMLImageElement>>;
|
|
46
|
+
export interface VamosProviderProps extends Omit<LocaleProviderProps, "children">, Partial<Omit<VamosContextValue, "currentPath">> {
|
|
47
|
+
currentPath?: string;
|
|
48
|
+
children: React.ReactNode;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* The app root bridge: locale + router + image + permissions + media, set once.
|
|
52
|
+
* The kit never imports a framework; pass your router's pieces (or use `@vamos-ui/react/next`).
|
|
53
|
+
*
|
|
54
|
+
* ```tsx
|
|
55
|
+
* "use client";
|
|
56
|
+
* import Link from "next/link";
|
|
57
|
+
* import { usePathname, useRouter } from "next/navigation";
|
|
58
|
+
*
|
|
59
|
+
* export function Providers({ children }) {
|
|
60
|
+
* const router = useRouter();
|
|
61
|
+
* return (
|
|
62
|
+
* <VamosProvider Link={Link} navigate={(href, o) => (o?.replace ? router.replace(href) : router.push(href))}
|
|
63
|
+
* currentPath={usePathname()} can={(p) => user.permissions.includes(p)} locale="en-US">
|
|
64
|
+
* {children}
|
|
65
|
+
* </VamosProvider>
|
|
66
|
+
* );
|
|
67
|
+
* }
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
export declare function VamosProvider({ Link, Image, navigate, currentPath, can, media, locale, messages, dir, timeZone, currency, children }: VamosProviderProps): React.JSX.Element;
|
|
71
|
+
/** The whole bridge value. */
|
|
72
|
+
export declare const useVamos: () => VamosContextValue;
|
|
73
|
+
/** The app's link component (default `<a>`). */
|
|
74
|
+
export declare const useLink: () => VamosLinkComponent;
|
|
75
|
+
/** The app's image component (default `<img>`). */
|
|
76
|
+
export declare const useImage: () => VamosImageComponent;
|
|
77
|
+
/** The permission check (default: everything allowed). */
|
|
78
|
+
export declare const useCan: () => VamosContextValue["can"];
|
|
79
|
+
/** The media adapter, typed by the caller. */
|
|
80
|
+
export declare const useMediaAdapter: <T = unknown>() => T | undefined;
|
|
81
|
+
/** `navigate`, `currentPath` and an `isActive(href)` helper for nav items. */
|
|
82
|
+
export declare function useNavigation(): {
|
|
83
|
+
navigate: (href: string, options?: NavigateOptions) => void;
|
|
84
|
+
currentPath: string | undefined;
|
|
85
|
+
/** `exact`: only the same path; otherwise the path or any child path (`/posts` is active on `/posts/12`). */
|
|
86
|
+
isActive(href: string, options?: {
|
|
87
|
+
exact?: boolean;
|
|
88
|
+
}): boolean;
|
|
89
|
+
};
|
|
90
|
+
/** `true` for absolute URLs to another origin, `mailto:`, `tel:` and protocol-relative links. */
|
|
91
|
+
export declare function isExternalHref(href: string): boolean;
|
|
92
|
+
export interface SmartLinkProps extends VamosLinkProps {
|
|
93
|
+
/** Force external behaviour (new tab + `rel="noopener noreferrer"`). Default: detected from `href`. */
|
|
94
|
+
external?: boolean;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Internal links go through the app's router `Link`; external ones render `<a target="_blank" rel="noopener noreferrer">`
|
|
98
|
+
* (`mailto:` / `tel:` stay in the same tab).
|
|
99
|
+
*/
|
|
100
|
+
export declare const SmartLink: React.ForwardRefExoticComponent<Omit<SmartLinkProps, "ref"> & React.RefAttributes<HTMLAnchorElement>>;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { LocaleProvider } from "./locale.js";
|
|
5
|
+
/** Default link: a plain `<a>` (router hints are dropped). */
|
|
6
|
+
export const DefaultLink = React.forwardRef(function DefaultLink({ replace: _r, prefetch: _p, ...props }, ref) {
|
|
7
|
+
return _jsx("a", { ref: ref, ...props });
|
|
8
|
+
});
|
|
9
|
+
/** Default image: a plain `<img>` with lazy loading; `fill` covers the positioned parent. */
|
|
10
|
+
export const DefaultImage = React.forwardRef(function DefaultImage({ fill, priority, quality: _q, style, loading, decoding, ...props }, ref) {
|
|
11
|
+
return (_jsx("img", { ref: ref, loading: loading ?? (priority ? "eager" : "lazy"), decoding: decoding ?? "async", fetchPriority: priority ? "high" : undefined, style: fill ? { position: "absolute", inset: 0, width: "100%", height: "100%", ...style } : style, ...props }));
|
|
12
|
+
});
|
|
13
|
+
const defaultNavigate = (href, o) => {
|
|
14
|
+
if (typeof window === "undefined")
|
|
15
|
+
return;
|
|
16
|
+
if (o?.replace)
|
|
17
|
+
window.location.replace(href);
|
|
18
|
+
else
|
|
19
|
+
window.location.assign(href);
|
|
20
|
+
};
|
|
21
|
+
const VamosContext = React.createContext({
|
|
22
|
+
Link: DefaultLink,
|
|
23
|
+
Image: DefaultImage,
|
|
24
|
+
navigate: defaultNavigate,
|
|
25
|
+
can: () => true,
|
|
26
|
+
});
|
|
27
|
+
/**
|
|
28
|
+
* The app root bridge: locale + router + image + permissions + media, set once.
|
|
29
|
+
* The kit never imports a framework; pass your router's pieces (or use `@vamos-ui/react/next`).
|
|
30
|
+
*
|
|
31
|
+
* ```tsx
|
|
32
|
+
* "use client";
|
|
33
|
+
* import Link from "next/link";
|
|
34
|
+
* import { usePathname, useRouter } from "next/navigation";
|
|
35
|
+
*
|
|
36
|
+
* export function Providers({ children }) {
|
|
37
|
+
* const router = useRouter();
|
|
38
|
+
* return (
|
|
39
|
+
* <VamosProvider Link={Link} navigate={(href, o) => (o?.replace ? router.replace(href) : router.push(href))}
|
|
40
|
+
* currentPath={usePathname()} can={(p) => user.permissions.includes(p)} locale="en-US">
|
|
41
|
+
* {children}
|
|
42
|
+
* </VamosProvider>
|
|
43
|
+
* );
|
|
44
|
+
* }
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export function VamosProvider({ Link, Image, navigate, currentPath, can, media, locale, messages, dir, timeZone, currency, children }) {
|
|
48
|
+
const parent = React.useContext(VamosContext);
|
|
49
|
+
const value = React.useMemo(() => ({
|
|
50
|
+
Link: Link ?? parent.Link,
|
|
51
|
+
Image: Image ?? parent.Image,
|
|
52
|
+
navigate: navigate ?? parent.navigate,
|
|
53
|
+
currentPath: currentPath ?? parent.currentPath,
|
|
54
|
+
can: can ?? parent.can,
|
|
55
|
+
media: media ?? parent.media,
|
|
56
|
+
}), [Link, Image, navigate, currentPath, can, media, parent]);
|
|
57
|
+
return (_jsx(VamosContext.Provider, { value: value, children: _jsx(LocaleProvider, { locale: locale, messages: messages, dir: dir, timeZone: timeZone, currency: currency, children: children }) }));
|
|
58
|
+
}
|
|
59
|
+
/** The whole bridge value. */
|
|
60
|
+
export const useVamos = () => React.useContext(VamosContext);
|
|
61
|
+
/** The app's link component (default `<a>`). */
|
|
62
|
+
export const useLink = () => React.useContext(VamosContext).Link;
|
|
63
|
+
/** The app's image component (default `<img>`). */
|
|
64
|
+
export const useImage = () => React.useContext(VamosContext).Image;
|
|
65
|
+
/** The permission check (default: everything allowed). */
|
|
66
|
+
export const useCan = () => React.useContext(VamosContext).can;
|
|
67
|
+
/** The media adapter, typed by the caller. */
|
|
68
|
+
export const useMediaAdapter = () => React.useContext(VamosContext).media;
|
|
69
|
+
const normalise = (p) => (p.length > 1 ? p.replace(/\/+$/, "") : p);
|
|
70
|
+
/** `navigate`, `currentPath` and an `isActive(href)` helper for nav items. */
|
|
71
|
+
export function useNavigation() {
|
|
72
|
+
const { navigate, currentPath } = React.useContext(VamosContext);
|
|
73
|
+
return React.useMemo(() => ({
|
|
74
|
+
navigate,
|
|
75
|
+
currentPath,
|
|
76
|
+
/** `exact`: only the same path; otherwise the path or any child path (`/posts` is active on `/posts/12`). */
|
|
77
|
+
isActive(href, options = {}) {
|
|
78
|
+
if (!currentPath)
|
|
79
|
+
return false;
|
|
80
|
+
const path = normalise(currentPath.split(/[?#]/)[0]);
|
|
81
|
+
const target = normalise(href.split(/[?#]/)[0]);
|
|
82
|
+
if (options.exact || target === "/")
|
|
83
|
+
return path === target;
|
|
84
|
+
return path === target || path.startsWith(`${target}/`);
|
|
85
|
+
},
|
|
86
|
+
}), [navigate, currentPath]);
|
|
87
|
+
}
|
|
88
|
+
/** `true` for absolute URLs to another origin, `mailto:`, `tel:` and protocol-relative links. */
|
|
89
|
+
export function isExternalHref(href) {
|
|
90
|
+
return /^([a-z][a-z\d+.-]*:|\/\/)/i.test(href);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Internal links go through the app's router `Link`; external ones render `<a target="_blank" rel="noopener noreferrer">`
|
|
94
|
+
* (`mailto:` / `tel:` stay in the same tab).
|
|
95
|
+
*/
|
|
96
|
+
export const SmartLink = React.forwardRef(function SmartLink({ href, external, target, rel, ...props }, ref) {
|
|
97
|
+
const Link = useLink();
|
|
98
|
+
const isExternal = external ?? isExternalHref(href);
|
|
99
|
+
if (isExternal) {
|
|
100
|
+
const newTab = !/^(mailto|tel|sms):/i.test(href);
|
|
101
|
+
const { replace: _r, prefetch: _p, ...rest } = props;
|
|
102
|
+
return _jsx("a", { ref: ref, href: href, target: target ?? (newTab ? "_blank" : undefined), rel: rel ?? (newTab ? "noopener noreferrer" : undefined), ...rest });
|
|
103
|
+
}
|
|
104
|
+
return _jsx(Link, { ref: ref, href: href, target: target, rel: rel, ...props });
|
|
105
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export { cn } from "./cn.js";
|
|
2
|
+
export { LocaleProvider, useLocale, useMessages, useFormat, useText, mergeMessages, directionOf, type LocaleProviderProps, type LocaleValue, type ResolvedMessages, } from "./locale.js";
|
|
3
|
+
export { useLabels, createLabels, resolveLabels, type LabelFn, type LabelValues, type LabelsProp } from "./labels.js";
|
|
4
|
+
export { formatMessage } from "./message-format.js";
|
|
5
|
+
export { en, type Messages, type MessagesInput } from "../locales/en.js";
|
|
6
|
+
export type { Formatter } from "../format/core.js";
|
|
7
|
+
export { foldText, matchText, highlightText, highlightParts, cmdkFilter, compareText, getCollator, upperText, lowerText, initials, slugify, registerTextRules, baseLanguage, type TextRules, type SlugifyOptions, } from "./text.js";
|
|
8
|
+
export { useControllableState, useLatest, useEventCallback, useIsomorphicLayoutEffect, type UseControllableStateOptions } from "./use-controllable-state.js";
|
|
9
|
+
export { composeRefs, useComposedRefs, mergeIds, setRef } from "./compose-refs.js";
|
|
10
|
+
export { useMediaQuery, useBreakpoint, breakpoints } from "./use-media-query.js";
|
|
11
|
+
export { useReducedMotion, useReducedTransparency } from "./use-reduced-motion.js";
|
|
12
|
+
export { useHotkeys, useIsMac, isApplePlatform, parseShortcut, matchesShortcut, shortcutKeys, formatKey, formatShortcut, type Shortcut, type ParsedShortcut, type UseHotkeysOptions, } from "./use-hotkeys.js";
|
|
13
|
+
export { useHoverIntent, type UseHoverIntentOptions } from "./use-hover-intent.js";
|
|
14
|
+
export { useContainerWidth, type ContainerSize } from "./use-container-width.js";
|
|
15
|
+
export { controlVariants, itemVariants, itemSlots, type ControlVariantProps, type ItemVariantProps, type MenuEntry, type MenuItemEntry, type MenuCheckboxEntry, type MenuRadioEntry, type MenuSubmenuEntry, type MenuGroupEntry, type MenuSeparatorEntry, type MenuLabelEntry, } from "./variants.js";
|
|
16
|
+
export { ThemeScope, PortalContainer, usePortalContainer, themeAttributes, type ThemeAxes, type ThemeScopeProps } from "./theme-scope.js";
|
|
17
|
+
export { Layer, LayerProvider, useLayerDepth, layerAttributes, type LayerProps } from "./layer.js";
|
|
18
|
+
export { VamosProvider, useVamos, useLink, useImage, useCan, useNavigation, useMediaAdapter, SmartLink, DefaultLink, DefaultImage, isExternalHref, type VamosProviderProps, type VamosContextValue, type VamosLinkProps, type VamosLinkComponent, type VamosImageProps, type VamosImageComponent, type NavigateOptions, type SmartLinkProps, } from "./provider.js";
|
|
19
|
+
export { useAsyncList, type AsyncLoader, type AsyncPage, type AsyncListState, type UseAsyncListOptions } from "./use-async-list.js";
|
|
20
|
+
export { parseColor, toHex, formatColor, contrastRatio, contrastLevel, readableOn, type ColorFormat } from "./color.js";
|
|
21
|
+
export { FieldContext, useFieldContext, useFieldControl, FieldContextReset, focusFirstInvalid, type FieldContextValue, type ControlA11yProps } from "./field-context.js";
|
|
22
|
+
export { ChipRemoveButton, LocalizedText, LocaleCount, type ChipRemoveButtonProps } from "./islands.js";
|
|
23
|
+
export { CopyValueButton, type CopyValueButtonProps } from "./data-islands.js";
|