@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,133 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { Slot } from "radix-ui";
|
|
5
|
+
import { cn } from "../lib/cn.js";
|
|
6
|
+
import { inViewport, ioSupported, motionAllowed, observe, transitionEnd } from "./core.js";
|
|
7
|
+
const noopSubscribe = () => () => { };
|
|
8
|
+
export const useIsoLayoutEffect = typeof window === "undefined" ? React.useEffect : React.useLayoutEffect;
|
|
9
|
+
/**
|
|
10
|
+
* `true` when the component mounted on the client after hydration (a page switch, a tab, a
|
|
11
|
+
* replay); `false` when it was server-rendered and is being hydrated. Server-rendered content
|
|
12
|
+
* is already on screen, so it is never hidden again; fresh content may start hidden.
|
|
13
|
+
*/
|
|
14
|
+
export function useFreshMount() {
|
|
15
|
+
const hydrating = React.useSyncExternalStore(noopSubscribe, () => false, () => true);
|
|
16
|
+
const [fresh] = React.useState(!hydrating);
|
|
17
|
+
return fresh;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Scroll-reveal state machine on any element: `data-reveal-state` goes
|
|
21
|
+
* `pending → in → done`. CSS (motion.css) draws the states, so the hook only flips an attribute.
|
|
22
|
+
*
|
|
23
|
+
* - Server-rendered content that is already in view stays as it is (no flash, CLS 0).
|
|
24
|
+
* - Server-rendered content below the fold is hidden just before paint and revealed on scroll.
|
|
25
|
+
* - Freshly mounted content starts hidden and reveals when it enters the viewport.
|
|
26
|
+
* - Reduced motion, `data-motion="off"` or no IntersectionObserver → shown at once.
|
|
27
|
+
*
|
|
28
|
+
* Returns the props for the first render (spread them on the element).
|
|
29
|
+
*/
|
|
30
|
+
export function useReveal(ref, { once = true, rootMargin, threshold, stagger, disabled, onReveal } = {}) {
|
|
31
|
+
const fresh = useFreshMount();
|
|
32
|
+
const onRevealRef = React.useRef(onReveal);
|
|
33
|
+
onRevealRef.current = onReveal;
|
|
34
|
+
useIsoLayoutEffect(() => {
|
|
35
|
+
const el = ref.current;
|
|
36
|
+
if (!el)
|
|
37
|
+
return;
|
|
38
|
+
let timer;
|
|
39
|
+
let frame = 0;
|
|
40
|
+
const set = (s) => el.setAttribute("data-reveal-state", s);
|
|
41
|
+
const show = () => {
|
|
42
|
+
if (el.getAttribute("data-reveal-state") !== "pending")
|
|
43
|
+
return;
|
|
44
|
+
set("in");
|
|
45
|
+
onRevealRef.current?.();
|
|
46
|
+
clearTimeout(timer);
|
|
47
|
+
// After the transition, drop the reveal styles so the element's own transitions
|
|
48
|
+
// (hover, focus) are its own again.
|
|
49
|
+
timer = setTimeout(() => el.getAttribute("data-reveal-state") === "in" && set("done"), transitionEnd(el, stagger) + 60);
|
|
50
|
+
};
|
|
51
|
+
if (disabled || !motionAllowed(el)) {
|
|
52
|
+
set("done");
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (!ioSupported()) {
|
|
56
|
+
if (fresh)
|
|
57
|
+
frame = requestAnimationFrame(() => show());
|
|
58
|
+
else
|
|
59
|
+
set("done");
|
|
60
|
+
return () => cancelAnimationFrame(frame);
|
|
61
|
+
}
|
|
62
|
+
if (!fresh && inViewport(el)) {
|
|
63
|
+
set("done");
|
|
64
|
+
if (once)
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
else
|
|
68
|
+
set("pending");
|
|
69
|
+
const stop = observe(el, (entry) => {
|
|
70
|
+
if (entry.isIntersecting) {
|
|
71
|
+
show();
|
|
72
|
+
if (once)
|
|
73
|
+
stop();
|
|
74
|
+
}
|
|
75
|
+
else if (!once && entry.boundingClientRect.top > 0)
|
|
76
|
+
set("pending");
|
|
77
|
+
}, { rootMargin, threshold });
|
|
78
|
+
return () => {
|
|
79
|
+
stop();
|
|
80
|
+
clearTimeout(timer);
|
|
81
|
+
};
|
|
82
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
83
|
+
}, [fresh, once, rootMargin, threshold, stagger, disabled]);
|
|
84
|
+
return { "data-reveal-state": fresh && !disabled ? "pending" : undefined };
|
|
85
|
+
}
|
|
86
|
+
function useComposedRef(...refs) {
|
|
87
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
88
|
+
return React.useCallback((node) => {
|
|
89
|
+
for (const r of refs) {
|
|
90
|
+
if (typeof r === "function")
|
|
91
|
+
r(node);
|
|
92
|
+
else if (r)
|
|
93
|
+
r.current = node;
|
|
94
|
+
}
|
|
95
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
96
|
+
}, refs);
|
|
97
|
+
}
|
|
98
|
+
const timing = (delay, duration, extra) => ({
|
|
99
|
+
...(delay ? { "--vm-delay": `${delay}ms` } : null),
|
|
100
|
+
...(duration ? { "--vm-duration": `${duration}ms` } : null),
|
|
101
|
+
...extra,
|
|
102
|
+
});
|
|
103
|
+
/**
|
|
104
|
+
* Shows its content when it scrolls into view — opacity and transform only, so nothing moves
|
|
105
|
+
* (CLS 0). Server-rendered content is never hidden before hydration; reduced motion and
|
|
106
|
+
* `data-motion="off"` show it at once.
|
|
107
|
+
*
|
|
108
|
+
* ```tsx
|
|
109
|
+
* <Reveal effect="rise" delay={80}><Card>…</Card></Reveal>
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
export const Reveal = React.forwardRef(function Reveal({ effect = "rise", delay, duration, once, rootMargin, threshold, disabled, onReveal, asChild, className, style, ...props }, ref) {
|
|
113
|
+
const inner = React.useRef(null);
|
|
114
|
+
const setRef = useComposedRef(ref, inner);
|
|
115
|
+
const initial = useReveal(inner, { once, rootMargin, threshold, disabled, onReveal });
|
|
116
|
+
const Comp = asChild ? Slot.Root : "div";
|
|
117
|
+
return _jsx(Comp, { ref: setRef, "data-reveal": effect, ...initial, className: cn("vm-reveal", className), style: { ...timing(delay, duration), ...style }, ...props });
|
|
118
|
+
});
|
|
119
|
+
/**
|
|
120
|
+
* Reveals its direct children one after another (the 13th and later share the last slot, so a
|
|
121
|
+
* long list never keeps people waiting). Use `asChild` on a list to keep its semantics.
|
|
122
|
+
*
|
|
123
|
+
* ```tsx
|
|
124
|
+
* <Stagger asChild step={70}><ul className="grid grid-cols-3">{plans.map(…)}</ul></Stagger>
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
export const Stagger = React.forwardRef(function Stagger({ effect = "rise", step, delay, duration, once, rootMargin, threshold, disabled, onReveal, asChild, className, style, ...props }, ref) {
|
|
128
|
+
const inner = React.useRef(null);
|
|
129
|
+
const setRef = useComposedRef(ref, inner);
|
|
130
|
+
const initial = useReveal(inner, { once, rootMargin, threshold, disabled, onReveal, stagger: true });
|
|
131
|
+
const Comp = asChild ? Slot.Root : "div";
|
|
132
|
+
return (_jsx(Comp, { ref: setRef, "data-reveal": effect, "data-reveal-stagger": "", ...initial, className: cn("vm-stagger", className), style: { ...timing(delay, duration, step ? { "--vm-step": `${step}ms` } : undefined), ...style }, ...props }));
|
|
133
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
export interface UseScrollShrinkOptions {
|
|
3
|
+
/** Scroll distance in px after which the header counts as scrolled. Default 24. */
|
|
4
|
+
threshold?: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Sticky header shrink: sets `data-scrolled` on the element once the page has scrolled past
|
|
8
|
+
* `threshold` (passive listener, rAF-throttled, no re-render). Pair it with the `vm-shrink`
|
|
9
|
+
* class, which tightens the bar with transforms only, so the content below never moves (CLS 0).
|
|
10
|
+
* Returns whether it is scrolled, for anything else you want to switch.
|
|
11
|
+
*
|
|
12
|
+
* ```tsx
|
|
13
|
+
* const ref = React.useRef<HTMLElement>(null);
|
|
14
|
+
* useScrollShrink(ref);
|
|
15
|
+
* <header ref={ref} className="vm-shrink sticky top-0">…</header>
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export declare function useScrollShrink(ref: React.RefObject<HTMLElement | null>, { threshold }?: UseScrollShrinkOptions): boolean;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
/**
|
|
4
|
+
* Sticky header shrink: sets `data-scrolled` on the element once the page has scrolled past
|
|
5
|
+
* `threshold` (passive listener, rAF-throttled, no re-render). Pair it with the `vm-shrink`
|
|
6
|
+
* class, which tightens the bar with transforms only, so the content below never moves (CLS 0).
|
|
7
|
+
* Returns whether it is scrolled, for anything else you want to switch.
|
|
8
|
+
*
|
|
9
|
+
* ```tsx
|
|
10
|
+
* const ref = React.useRef<HTMLElement>(null);
|
|
11
|
+
* useScrollShrink(ref);
|
|
12
|
+
* <header ref={ref} className="vm-shrink sticky top-0">…</header>
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export function useScrollShrink(ref, { threshold = 24 } = {}) {
|
|
16
|
+
const [scrolled, setScrolled] = React.useState(false);
|
|
17
|
+
React.useEffect(() => {
|
|
18
|
+
let raf = 0;
|
|
19
|
+
let last = null;
|
|
20
|
+
const update = () => {
|
|
21
|
+
raf = 0;
|
|
22
|
+
const next = window.scrollY > threshold;
|
|
23
|
+
if (next === last)
|
|
24
|
+
return;
|
|
25
|
+
last = next;
|
|
26
|
+
const el = ref.current;
|
|
27
|
+
if (el) {
|
|
28
|
+
if (next)
|
|
29
|
+
el.setAttribute("data-scrolled", "");
|
|
30
|
+
else
|
|
31
|
+
el.removeAttribute("data-scrolled");
|
|
32
|
+
}
|
|
33
|
+
setScrolled(next);
|
|
34
|
+
};
|
|
35
|
+
const onScroll = () => {
|
|
36
|
+
if (!raf)
|
|
37
|
+
raf = requestAnimationFrame(update);
|
|
38
|
+
};
|
|
39
|
+
update();
|
|
40
|
+
window.addEventListener("scroll", onScroll, { passive: true });
|
|
41
|
+
return () => {
|
|
42
|
+
cancelAnimationFrame(raf);
|
|
43
|
+
window.removeEventListener("scroll", onScroll);
|
|
44
|
+
};
|
|
45
|
+
}, [ref, threshold]);
|
|
46
|
+
return scrolled;
|
|
47
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
export interface SkeletonSwapProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
3
|
+
/** While true the skeleton shows; when it turns false the content cross-fades in over it. */
|
|
4
|
+
loading: boolean;
|
|
5
|
+
/** The placeholder. Give it the content's size so the box does not jump when it leaves. */
|
|
6
|
+
skeleton: React.ReactNode;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Skeleton → content without a flash: both share one grid cell, the content fades in while the
|
|
10
|
+
* skeleton fades out, then the skeleton unmounts. `aria-busy` while loading. Content that is
|
|
11
|
+
* there from the first render never animates; reduced motion swaps at once.
|
|
12
|
+
*
|
|
13
|
+
* ```tsx
|
|
14
|
+
* <SkeletonSwap loading={isLoading} skeleton={<InvoiceSkeleton />}><InvoiceTable rows={rows} /></SkeletonSwap>
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export declare const SkeletonSwap: React.ForwardRefExoticComponent<SkeletonSwapProps & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { cn } from "../lib/cn.js";
|
|
5
|
+
import { motionAllowed } from "./core.js";
|
|
6
|
+
import { useIsoLayoutEffect } from "./reveal.js";
|
|
7
|
+
/**
|
|
8
|
+
* Skeleton → content without a flash: both share one grid cell, the content fades in while the
|
|
9
|
+
* skeleton fades out, then the skeleton unmounts. `aria-busy` while loading. Content that is
|
|
10
|
+
* there from the first render never animates; reduced motion swaps at once.
|
|
11
|
+
*
|
|
12
|
+
* ```tsx
|
|
13
|
+
* <SkeletonSwap loading={isLoading} skeleton={<InvoiceSkeleton />}><InvoiceTable rows={rows} /></SkeletonSwap>
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export const SkeletonSwap = React.forwardRef(function SkeletonSwap({ loading, skeleton, className, children, ...props }, ref) {
|
|
17
|
+
const inner = React.useRef(null);
|
|
18
|
+
const [prevLoading, setPrevLoading] = React.useState(loading);
|
|
19
|
+
const [leaving, setLeaving] = React.useState(false);
|
|
20
|
+
// Derived from the previous prop (React's "adjust state while rendering" pattern): the frame
|
|
21
|
+
// that flips loading → false already renders both layers, so nothing blinks.
|
|
22
|
+
if (prevLoading !== loading) {
|
|
23
|
+
setPrevLoading(loading);
|
|
24
|
+
setLeaving(!loading);
|
|
25
|
+
}
|
|
26
|
+
useIsoLayoutEffect(() => {
|
|
27
|
+
if (!leaving)
|
|
28
|
+
return;
|
|
29
|
+
if (!motionAllowed(inner.current)) {
|
|
30
|
+
setLeaving(false);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const t = setTimeout(() => setLeaving(false), 700); // safety net if animationend never fires
|
|
34
|
+
return () => clearTimeout(t);
|
|
35
|
+
}, [leaving]);
|
|
36
|
+
return (_jsxs("div", { ref: (node) => {
|
|
37
|
+
inner.current = node;
|
|
38
|
+
if (typeof ref === "function")
|
|
39
|
+
ref(node);
|
|
40
|
+
else if (ref)
|
|
41
|
+
ref.current = node;
|
|
42
|
+
}, "aria-busy": loading || undefined, "data-loading": loading ? "" : undefined, className: cn("vm-swap", className), ...props, children: [loading ? null : (_jsx("div", { className: "vm-swap-content", "data-entering": leaving ? "" : undefined, children: children })), loading || leaving ? (_jsx("div", { className: "vm-swap-skeleton", "aria-hidden": !loading || undefined, "data-leaving": loading ? undefined : "", onAnimationEnd: (e) => e.target === e.currentTarget && setLeaving(false), children: skeleton })) : null] }));
|
|
43
|
+
});
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { type UseRevealOptions } from "./reveal.js";
|
|
3
|
+
type TextTag = "h1" | "h2" | "h3" | "h4" | "p" | "span" | "div" | "blockquote";
|
|
4
|
+
export interface TextRevealProps extends Omit<React.HTMLAttributes<HTMLElement>, "children">, Omit<UseRevealOptions, "stagger"> {
|
|
5
|
+
/** The text. In `by="line"` mode, `\n` separates lines. */
|
|
6
|
+
children: string;
|
|
7
|
+
/** Element to render. Default `"h2"`. */
|
|
8
|
+
as?: TextTag;
|
|
9
|
+
/** Split into words (default) or lines. */
|
|
10
|
+
by?: "word" | "line";
|
|
11
|
+
/**
|
|
12
|
+
* mask: each unit rises from behind its own baseline (default) · fade · blur.
|
|
13
|
+
*/
|
|
14
|
+
effect?: "mask" | "fade" | "blur";
|
|
15
|
+
/** ms between two units. Default 45 (words) / 110 (lines). */
|
|
16
|
+
step?: number;
|
|
17
|
+
/** Delay before the first unit, in ms. */
|
|
18
|
+
delay?: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* A heading that reveals word by word (or line by line) as it scrolls into view. Assistive
|
|
22
|
+
* tech gets one plain string: the split copy is `aria-hidden`, the real text is a visually
|
|
23
|
+
* hidden twin. Transform and opacity only; reduced motion shows it at once.
|
|
24
|
+
*
|
|
25
|
+
* ```tsx
|
|
26
|
+
* <TextReveal as="h2">Small rooms, slow mornings, nothing to scroll.</TextReveal>
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare const TextReveal: React.ForwardRefExoticComponent<TextRevealProps & React.RefAttributes<HTMLElement>>;
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { cn } from "../lib/cn.js";
|
|
5
|
+
import { useReveal } from "./reveal.js";
|
|
6
|
+
/**
|
|
7
|
+
* A heading that reveals word by word (or line by line) as it scrolls into view. Assistive
|
|
8
|
+
* tech gets one plain string: the split copy is `aria-hidden`, the real text is a visually
|
|
9
|
+
* hidden twin. Transform and opacity only; reduced motion shows it at once.
|
|
10
|
+
*
|
|
11
|
+
* ```tsx
|
|
12
|
+
* <TextReveal as="h2">Small rooms, slow mornings, nothing to scroll.</TextReveal>
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export const TextReveal = React.forwardRef(function TextReveal({ children, as: Tag = "h2", by = "word", effect = "mask", step, delay, once, rootMargin, threshold, disabled, onReveal, className, style, ...props }, ref) {
|
|
16
|
+
const inner = React.useRef(null);
|
|
17
|
+
const initial = useReveal(inner, { once, rootMargin, threshold, disabled, onReveal });
|
|
18
|
+
const text = String(children);
|
|
19
|
+
const units = by === "line" ? text.split("\n") : text.split(/\s+/).filter(Boolean);
|
|
20
|
+
const gap = step ?? (by === "line" ? 110 : 45);
|
|
21
|
+
const Comp = Tag;
|
|
22
|
+
return (_jsxs(Comp, { ref: (node) => {
|
|
23
|
+
inner.current = node;
|
|
24
|
+
if (typeof ref === "function")
|
|
25
|
+
ref(node);
|
|
26
|
+
else if (ref)
|
|
27
|
+
ref.current = node;
|
|
28
|
+
}, "data-reveal": effect === "mask" ? "text" : effect, "data-text-reveal": by, ...initial, className: cn("vm-text-reveal", className), style: { "--vm-step": `${gap}ms`, ...(delay ? { "--vm-delay": `${delay}ms` } : null), ...style }, ...props, children: [_jsx("span", { className: "sr-only", children: by === "line" ? units.join(" ") : text }), _jsx("span", { "aria-hidden": "true", className: "vm-text-reveal-visual", children: units.map((u, i) => (_jsxs(React.Fragment, { children: [_jsx("span", { className: "vm-tr-mask", children: _jsx("span", { className: "vm-tr-unit", style: { "--vm-i": i }, children: u }) }), by === "word" && i < units.length - 1 ? " " : null] }, i))) })] }));
|
|
29
|
+
});
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
export interface TickerProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
3
|
+
/** Seconds for one full loop. Default 40. */
|
|
4
|
+
duration?: number;
|
|
5
|
+
/** Which way the strip travels (mirrored in RTL). Default `"start"`. */
|
|
6
|
+
direction?: "start" | "end";
|
|
7
|
+
/** Element for each copy of the items, e.g. `"ul"` when the children are `li`. Default `"div"`. */
|
|
8
|
+
as?: "div" | "ul" | "ol";
|
|
9
|
+
/** Space between items (any CSS length). Default `clamp(2.5rem, 6cqi, 4.5rem)`. */
|
|
10
|
+
gap?: string;
|
|
11
|
+
/** Fade the start and end edges. Default true. */
|
|
12
|
+
fade?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* A small pause control (a native checkbox — works without JavaScript). Moving content that
|
|
15
|
+
* lasts longer than five seconds needs one (WCAG 2.2.2). Default true.
|
|
16
|
+
*/
|
|
17
|
+
controls?: boolean;
|
|
18
|
+
/** Accessible name of the pause control. Default `"Pause animation"`. */
|
|
19
|
+
pauseLabel?: string;
|
|
20
|
+
/** Names the list of items (it lands on the first copy, e.g. the `ul`). */
|
|
21
|
+
"aria-label"?: string;
|
|
22
|
+
/** Classes for each copy of the items. */
|
|
23
|
+
groupClassName?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The motion kit's marquee: an endless strip of logos or words that follows the motion level. Pure CSS (server component): the items are rendered
|
|
27
|
+
* twice and the track slides by one copy. The copy is `aria-hidden` and `inert`, so assistive
|
|
28
|
+
* tech and the keyboard meet every item once. Pauses on hover and focus and with its pause
|
|
29
|
+
* control; under reduced motion or `data-motion="off"` it becomes a static, wrapped row.
|
|
30
|
+
*
|
|
31
|
+
* ```tsx
|
|
32
|
+
* <Ticker as="ul" duration={30}>{logos.map((l) => <li key={l.name}>…</li>)}</Ticker>
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare const Ticker: React.ForwardRefExoticComponent<TickerProps & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { cn } from "../lib/cn.js";
|
|
4
|
+
/**
|
|
5
|
+
* The motion kit's marquee: an endless strip of logos or words that follows the motion level. Pure CSS (server component): the items are rendered
|
|
6
|
+
* twice and the track slides by one copy. The copy is `aria-hidden` and `inert`, so assistive
|
|
7
|
+
* tech and the keyboard meet every item once. Pauses on hover and focus and with its pause
|
|
8
|
+
* control; under reduced motion or `data-motion="off"` it becomes a static, wrapped row.
|
|
9
|
+
*
|
|
10
|
+
* ```tsx
|
|
11
|
+
* <Ticker as="ul" duration={30}>{logos.map((l) => <li key={l.name}>…</li>)}</Ticker>
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export const Ticker = React.forwardRef(function Ticker({ duration = 40, direction = "start", as: Group = "div", gap, fade = true, controls = true, pauseLabel = "Pause animation", groupClassName, className, style, children, "aria-label": ariaLabel, ...props }, ref) {
|
|
15
|
+
return (_jsxs("div", { ref: ref, "data-direction": direction, "data-fade": fade ? "" : undefined, className: cn("vm-marquee", className), style: { "--vm-marquee-duration": `${duration}s`, ...(gap ? { "--vm-marquee-gap": gap } : null), ...style }, ...props, children: [_jsx("div", { className: "vm-marquee-viewport", children: _jsxs("div", { className: "vm-marquee-track", children: [_jsx(Group, { className: cn("vm-marquee-group", groupClassName), "aria-label": ariaLabel, children: children }), _jsx(Group, { className: cn("vm-marquee-group", groupClassName), "aria-hidden": "true", inert: true, "data-marquee-copy": "", children: children })] }) }), controls ? (_jsxs("label", { className: "vm-marquee-toggle", children: [_jsx("input", { type: "checkbox", className: "vm-marquee-pause sr-only", "aria-label": pauseLabel }), _jsxs("svg", { "aria-hidden": "true", viewBox: "0 0 16 16", className: "vm-marquee-icon-pause", children: [_jsx("rect", { x: "4", y: "3", width: "2.5", height: "10", rx: "0.5" }), _jsx("rect", { x: "9.5", y: "3", width: "2.5", height: "10", rx: "0.5" })] }), _jsx("svg", { "aria-hidden": "true", viewBox: "0 0 16 16", className: "vm-marquee-icon-play", children: _jsx("path", { d: "M5 3.2v9.6a.5.5 0 0 0 .77.42l7.2-4.8a.5.5 0 0 0 0-.84l-7.2-4.8A.5.5 0 0 0 5 3.2Z" }) })] })) : null] }));
|
|
16
|
+
});
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { type VamosProviderProps } from "../lib/provider.js";
|
|
3
|
+
/** The parts of Next.js the bindings need — pass the real imports. */
|
|
4
|
+
export interface NextBindings {
|
|
5
|
+
/** `import Link from "next/link"` */
|
|
6
|
+
Link: React.ComponentType<any>;
|
|
7
|
+
/** `import Image from "next/image"` (optional; default `<img>`). */
|
|
8
|
+
Image?: React.ComponentType<any>;
|
|
9
|
+
/** `import { useRouter } from "next/navigation"` */
|
|
10
|
+
useRouter: () => {
|
|
11
|
+
push: (href: string, options?: {
|
|
12
|
+
scroll?: boolean;
|
|
13
|
+
}) => void;
|
|
14
|
+
replace: (href: string, options?: {
|
|
15
|
+
scroll?: boolean;
|
|
16
|
+
}) => void;
|
|
17
|
+
};
|
|
18
|
+
/** `import { usePathname } from "next/navigation"` */
|
|
19
|
+
usePathname: () => string | null;
|
|
20
|
+
}
|
|
21
|
+
export type NextVamosProviderProps = Omit<VamosProviderProps, "Link" | "Image" | "navigate">;
|
|
22
|
+
/**
|
|
23
|
+
* Creates a `VamosProvider` wired to the Next.js App Router (Link, Image, `router.push/replace`,
|
|
24
|
+
* `usePathname`). Do it once in a client file and use the result in your root layout:
|
|
25
|
+
*
|
|
26
|
+
* ```tsx
|
|
27
|
+
* // app/providers.tsx
|
|
28
|
+
* "use client";
|
|
29
|
+
* import Link from "next/link";
|
|
30
|
+
* import Image from "next/image";
|
|
31
|
+
* import { usePathname, useRouter } from "next/navigation";
|
|
32
|
+
* import { createVamosNextProvider } from "@vamos-ui/react/next";
|
|
33
|
+
*
|
|
34
|
+
* export const Providers = createVamosNextProvider({ Link, Image, useRouter, usePathname });
|
|
35
|
+
*
|
|
36
|
+
* // app/layout.tsx (server)
|
|
37
|
+
* <Providers locale="tr-TR" messages={tr} timeZone="Europe/Istanbul" currency="TRY">{children}</Providers>
|
|
38
|
+
* ```
|
|
39
|
+
*
|
|
40
|
+
* Pass `currentPath` from the server layout too if you need the active nav item on first paint.
|
|
41
|
+
*/
|
|
42
|
+
export declare function createVamosNextProvider(next: NextBindings): ({ currentPath, children, ...props }: NextVamosProviderProps) => React.FunctionComponentElement<VamosProviderProps>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
// Public API of @vamos-ui/react/next — Next.js App Router bindings for VamosProvider.
|
|
3
|
+
// The kit never imports `next/*` itself (it isn't a dependency); you hand the pieces in once.
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { VamosProvider } from "../lib/provider.js";
|
|
6
|
+
/**
|
|
7
|
+
* Creates a `VamosProvider` wired to the Next.js App Router (Link, Image, `router.push/replace`,
|
|
8
|
+
* `usePathname`). Do it once in a client file and use the result in your root layout:
|
|
9
|
+
*
|
|
10
|
+
* ```tsx
|
|
11
|
+
* // app/providers.tsx
|
|
12
|
+
* "use client";
|
|
13
|
+
* import Link from "next/link";
|
|
14
|
+
* import Image from "next/image";
|
|
15
|
+
* import { usePathname, useRouter } from "next/navigation";
|
|
16
|
+
* import { createVamosNextProvider } from "@vamos-ui/react/next";
|
|
17
|
+
*
|
|
18
|
+
* export const Providers = createVamosNextProvider({ Link, Image, useRouter, usePathname });
|
|
19
|
+
*
|
|
20
|
+
* // app/layout.tsx (server)
|
|
21
|
+
* <Providers locale="tr-TR" messages={tr} timeZone="Europe/Istanbul" currency="TRY">{children}</Providers>
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* Pass `currentPath` from the server layout too if you need the active nav item on first paint.
|
|
25
|
+
*/
|
|
26
|
+
export function createVamosNextProvider(next) {
|
|
27
|
+
const Link = next.Link;
|
|
28
|
+
const Image = next.Image;
|
|
29
|
+
function NextVamosProvider({ currentPath, children, ...props }) {
|
|
30
|
+
const router = next.useRouter();
|
|
31
|
+
const pathname = next.usePathname();
|
|
32
|
+
const navigate = React.useCallback((href, options) => (options?.replace ? router.replace(href, { scroll: options.scroll }) : router.push(href, { scroll: options?.scroll })), [router]);
|
|
33
|
+
return React.createElement(VamosProvider, { ...props, Link, Image, navigate, currentPath: pathname ?? currentPath, children });
|
|
34
|
+
}
|
|
35
|
+
return NextVamosProvider;
|
|
36
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { type BlockLabels } from "../blocks/labels.js";
|
|
3
|
+
import { type PreparedDoc, type PrepareOptions, type Resolvers } from "./prepare.js";
|
|
4
|
+
import type { BlockAdapters } from "../blocks/types.js";
|
|
5
|
+
import type { BlockRegion } from "../blocks/schema/define-block.js";
|
|
6
|
+
import type { VamosDoc } from "../blocks/schema/types.js";
|
|
7
|
+
export interface RenderDocOptions extends PrepareOptions {
|
|
8
|
+
/** Framework bindings passed to every block (`{ Image: NextImage, Link: NextLink }`). */
|
|
9
|
+
components?: BlockAdapters;
|
|
10
|
+
/** Built-in strings (e.g. `blockLabelsTr`). */
|
|
11
|
+
labels?: Partial<BlockLabels>;
|
|
12
|
+
/** Show placeholders for unknown / invalid blocks. Default: `editMode` or not production. */
|
|
13
|
+
dev?: boolean;
|
|
14
|
+
/** Regions to render, in order. Default all four. */
|
|
15
|
+
regions?: readonly BlockRegion[];
|
|
16
|
+
/** Wrap the body in `<main id={mainId}>` (skip-link target). */
|
|
17
|
+
mainId?: string;
|
|
18
|
+
/** Emit one merged JSON-LD `@graph` script. Default true. */
|
|
19
|
+
jsonLd?: boolean;
|
|
20
|
+
/** Classes for the wrapper around consecutive text blocks. */
|
|
21
|
+
proseClassName?: string;
|
|
22
|
+
}
|
|
23
|
+
/** Edit/dev placeholder for a block that can't render normally. Server component. */
|
|
24
|
+
export declare function BlockNotice({ tone, title, hint, type, blockId, }: {
|
|
25
|
+
tone?: "danger" | "warning";
|
|
26
|
+
title: string;
|
|
27
|
+
hint?: string;
|
|
28
|
+
type: string;
|
|
29
|
+
blockId?: string;
|
|
30
|
+
}): React.JSX.Element;
|
|
31
|
+
/** Renders an already prepared (and resolved) doc. */
|
|
32
|
+
export declare function renderPrepared(prepared: PreparedDoc, opts: RenderDocOptions): React.ReactNode;
|
|
33
|
+
/**
|
|
34
|
+
* Synchronous render of a VamosDoc (RSC-safe, also works in client trees and tests).
|
|
35
|
+
* `f.query` fields stay unresolved — use `<BlockRenderer resolvers>` for data-bound blocks.
|
|
36
|
+
*
|
|
37
|
+
* ```tsx
|
|
38
|
+
* renderDoc(page, { registry: siteBlocks, locale: "tr", components: { Image: NextImage, Link: NextLink } });
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export declare function renderDoc(doc: VamosDoc | unknown, opts: RenderDocOptions): React.ReactNode;
|
|
42
|
+
export interface BlockRendererProps extends RenderDocOptions {
|
|
43
|
+
doc: VamosDoc | unknown;
|
|
44
|
+
/** Data for `f.query` fields, fetched in parallel on the server. */
|
|
45
|
+
resolvers?: Resolvers;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Async Server Component: filters hidden/scheduled blocks → migrates → validates (salvaging bad
|
|
49
|
+
* fields) → localizes → resolves queries in parallel → renders each block → merges JSON-LD.
|
|
50
|
+
*
|
|
51
|
+
* ```tsx
|
|
52
|
+
* <BlockRenderer doc={page} registry={siteBlocks} locale="tr" fallbackLocales={["en"]}
|
|
53
|
+
* components={{ Image: NextImage, Link: NextLink }} resolvers={{ posts: (q) => db.posts.list(q) }} />
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export declare function BlockRenderer({ doc, resolvers, ...opts }: BlockRendererProps): Promise<React.ReactElement>;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { cn } from "../lib/cn.js";
|
|
4
|
+
import { Container } from "../blocks/section.js";
|
|
5
|
+
import { JsonLd, mergeJsonLd } from "../blocks/json-ld.js";
|
|
6
|
+
import { renderInline } from "../blocks/rich-text.js";
|
|
7
|
+
import { blockText } from "../blocks/labels.js";
|
|
8
|
+
import { inlineToText } from "../blocks/schema/rich-doc.js";
|
|
9
|
+
import { prepareDoc, resolveDoc } from "./prepare.js";
|
|
10
|
+
const isProd = () => typeof process !== "undefined" && process.env?.NODE_ENV === "production";
|
|
11
|
+
/** Edit/dev placeholder for a block that can't render normally. Server component. */
|
|
12
|
+
export function BlockNotice({ tone = "danger", title, hint, type, blockId, }) {
|
|
13
|
+
return (_jsx("div", { className: "vb-container py-4", "data-block-id": blockId, "data-block-type": type, "data-block-notice": tone, children: _jsxs("div", { role: "note", "data-tone": tone, className: "vb-notice flex flex-col gap-1 rounded-ui px-4 py-3.5 @2xl:flex-row @2xl:items-baseline @2xl:gap-4", children: [_jsx("span", { className: "shrink-0 font-mono text-eyebrow uppercase tracking-[0.08em] text-(--tone)", children: type }), _jsxs("span", { className: "text-small", children: [_jsx("strong", { className: "font-semibold text-fg", children: title }), hint ? _jsxs("span", { className: "text-fg-muted", children: [" \u2014 ", hint] }) : null] })] }) }));
|
|
14
|
+
}
|
|
15
|
+
function editAttrs(ctx, n) {
|
|
16
|
+
return ctx.opts.editMode ? { "data-block-id": n.node.id, "data-block-type": n.node.type, "data-hidden": n.node.hidden ? "" : undefined } : {};
|
|
17
|
+
}
|
|
18
|
+
/** Core text blocks (paragraph, heading, list, quote, code, divider) — render without a registry entry. */
|
|
19
|
+
function renderCore(n, ctx, key) {
|
|
20
|
+
const { node } = n;
|
|
21
|
+
const p = (node.props ?? {});
|
|
22
|
+
const io = { components: ctx.opts.components, labels: ctx.opts.labels, locale: ctx.locale };
|
|
23
|
+
const attrs = editAttrs(ctx, n);
|
|
24
|
+
const children = (slot = "items") => (n.slots[slot] ?? []).map((c, i) => renderCore(c, ctx, `${key}-${i}`));
|
|
25
|
+
switch (node.type) {
|
|
26
|
+
case "paragraph":
|
|
27
|
+
return (_jsx("p", { ...attrs, children: renderInline(node.content, io) }, key));
|
|
28
|
+
case "heading": {
|
|
29
|
+
const level = Math.min(6, Math.max(1, p.level ?? 2));
|
|
30
|
+
const Tag = `h${level}`;
|
|
31
|
+
return (_jsx(Tag, { id: node.anchor, ...attrs, children: renderInline(node.content, io) }, key));
|
|
32
|
+
}
|
|
33
|
+
case "list": {
|
|
34
|
+
const Tag = p.ordered ? "ol" : "ul";
|
|
35
|
+
return (_jsx(Tag, { start: p.ordered && p.start && p.start !== 1 ? p.start : undefined, ...attrs, children: children() }, key));
|
|
36
|
+
}
|
|
37
|
+
case "list-item":
|
|
38
|
+
return (_jsxs("li", { ...attrs, children: [node.content?.length ? renderInline(node.content, io) : null, children()] }, key));
|
|
39
|
+
case "quote":
|
|
40
|
+
return (_jsxs("blockquote", { ...attrs, children: [node.content?.length ? _jsx("p", { children: renderInline(node.content, io) }) : null, children(), p.cite ? _jsx("footer", { children: p.cite }) : null] }, key));
|
|
41
|
+
case "code":
|
|
42
|
+
return (_jsx("pre", { "data-language": p.language, ...attrs, children: _jsx("code", { children: inlineToText(node.content) }) }, key));
|
|
43
|
+
case "divider":
|
|
44
|
+
return _jsx("hr", { ...attrs }, key);
|
|
45
|
+
default:
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function renderNode(n, ctx, key) {
|
|
50
|
+
const { node, def } = n;
|
|
51
|
+
if (n.status === "core")
|
|
52
|
+
return renderCore(n, ctx, key);
|
|
53
|
+
if (n.status === "unknown") {
|
|
54
|
+
return ctx.dev ? _jsx(BlockNotice, { type: node.type, blockId: node.id, title: ctx.t("unknownBlock", { type: node.type }), hint: ctx.t("unknownBlockHint") }, key) : null;
|
|
55
|
+
}
|
|
56
|
+
if (n.status === "unrenderable" || !def?.component) {
|
|
57
|
+
return ctx.dev ? (_jsx(BlockNotice, { type: node.type, blockId: node.id, title: ctx.t("invalidBlock", { type: node.type }), hint: def?.component ? ctx.t("invalidBlockHint", { count: n.replaced.length || 1 }) : undefined }, key)) : null;
|
|
58
|
+
}
|
|
59
|
+
if (def.jsonLd) {
|
|
60
|
+
const ld = def.jsonLd(n.props, { locale: ctx.locale, node });
|
|
61
|
+
if (ld)
|
|
62
|
+
ctx.jsonLd.push(...(Array.isArray(ld) ? ld : [ld]));
|
|
63
|
+
}
|
|
64
|
+
const Component = def.component;
|
|
65
|
+
const slots = Object.fromEntries(Object.entries(n.slots).map(([k, list]) => [k, renderList(list, ctx, `${key}-${k}`)]));
|
|
66
|
+
const element = (_jsx(Component, { ...n.props, id: node.id, variant: node.variant ?? def.defaultVariant ?? def.variants?.[0], headingLevel: n.headingLevel, theme: node.theme, anchor: node.anchor, labels: ctx.opts.labels, locale: ctx.locale, components: ctx.opts.components, editMode: ctx.opts.editMode, slots: slots, block: { id: node.id, type: node.type, mode: ctx.opts.editMode ? "edit" : "view", v: node.v ?? def.version } }));
|
|
67
|
+
const notice = ctx.dev && (n.status === "invalid" || n.status === "newer") ? (_jsx(BlockNotice, { tone: "warning", type: node.type, title: n.status === "newer" ? ctx.t("newerBlock", { type: node.type, v: node.v ?? 1 }) : ctx.t("invalidBlock", { type: node.type }), hint: n.status === "invalid" ? ctx.t("invalidBlockHint", { count: n.replaced.length }) : undefined })) : null;
|
|
68
|
+
// display:contents keeps the block's own layout while builders map clicks with closest("[data-block-id]").
|
|
69
|
+
if (ctx.opts.editMode)
|
|
70
|
+
return (_jsxs("div", { style: { display: "contents" }, ...editAttrs(ctx, n), children: [notice, element] }, key));
|
|
71
|
+
return notice ? (_jsxs(React.Fragment, { children: [notice, element] }, key)) : (_jsx(React.Fragment, { children: element }, key));
|
|
72
|
+
}
|
|
73
|
+
/** Renders a list; consecutive core text blocks share one prose wrapper. */
|
|
74
|
+
function renderList(list, ctx, keyPrefix) {
|
|
75
|
+
const out = [];
|
|
76
|
+
let run = [];
|
|
77
|
+
const flush = (i) => {
|
|
78
|
+
if (!run.length)
|
|
79
|
+
return;
|
|
80
|
+
const items = run;
|
|
81
|
+
run = [];
|
|
82
|
+
out.push(_jsx(Container, { size: "prose", className: cn("prose-ui vb-prose", ctx.opts.proseClassName), children: items.map((n, j) => renderCore(n, ctx, `${keyPrefix}-${i}-${j}`)) }, `${keyPrefix}-prose-${i}`));
|
|
83
|
+
};
|
|
84
|
+
list.forEach((n, i) => {
|
|
85
|
+
if (n.status === "core") {
|
|
86
|
+
run.push(n);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
flush(i);
|
|
90
|
+
out.push(renderNode(n, ctx, `${keyPrefix}-${i}`));
|
|
91
|
+
});
|
|
92
|
+
flush(list.length);
|
|
93
|
+
return out;
|
|
94
|
+
}
|
|
95
|
+
/** Renders an already prepared (and resolved) doc. */
|
|
96
|
+
export function renderPrepared(prepared, opts) {
|
|
97
|
+
const ctx = {
|
|
98
|
+
opts,
|
|
99
|
+
dev: opts.dev ?? (!!opts.editMode || !isProd()),
|
|
100
|
+
t: blockText(opts.labels, prepared.locale),
|
|
101
|
+
jsonLd: [],
|
|
102
|
+
locale: prepared.locale,
|
|
103
|
+
};
|
|
104
|
+
const regions = opts.regions ?? ["header", "body", "footer", "overlay"];
|
|
105
|
+
const parts = regions.map((r) => {
|
|
106
|
+
const nodes = renderList(prepared[r], ctx, r);
|
|
107
|
+
if (r === "body" && opts.mainId)
|
|
108
|
+
return (_jsx("main", { id: opts.mainId, tabIndex: -1, className: "outline-none", children: nodes }, r));
|
|
109
|
+
return _jsx(React.Fragment, { children: nodes }, r);
|
|
110
|
+
});
|
|
111
|
+
const graph = opts.jsonLd === false ? null : mergeJsonLd(ctx.jsonLd);
|
|
112
|
+
return (_jsxs(_Fragment, { children: [parts, graph ? _jsx(JsonLd, { data: graph }) : null] }));
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Synchronous render of a VamosDoc (RSC-safe, also works in client trees and tests).
|
|
116
|
+
* `f.query` fields stay unresolved — use `<BlockRenderer resolvers>` for data-bound blocks.
|
|
117
|
+
*
|
|
118
|
+
* ```tsx
|
|
119
|
+
* renderDoc(page, { registry: siteBlocks, locale: "tr", components: { Image: NextImage, Link: NextLink } });
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
122
|
+
export function renderDoc(doc, opts) {
|
|
123
|
+
return renderPrepared(prepareDoc(doc, opts), opts);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Async Server Component: filters hidden/scheduled blocks → migrates → validates (salvaging bad
|
|
127
|
+
* fields) → localizes → resolves queries in parallel → renders each block → merges JSON-LD.
|
|
128
|
+
*
|
|
129
|
+
* ```tsx
|
|
130
|
+
* <BlockRenderer doc={page} registry={siteBlocks} locale="tr" fallbackLocales={["en"]}
|
|
131
|
+
* components={{ Image: NextImage, Link: NextLink }} resolvers={{ posts: (q) => db.posts.list(q) }} />
|
|
132
|
+
* ```
|
|
133
|
+
*/
|
|
134
|
+
export async function BlockRenderer({ doc, resolvers, ...opts }) {
|
|
135
|
+
const prepared = await resolveDoc(prepareDoc(doc, opts), resolvers, opts.onIssue);
|
|
136
|
+
return _jsx(_Fragment, { children: renderPrepared(prepared, opts) });
|
|
137
|
+
}
|