@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,62 @@
|
|
|
1
|
+
// RichDoc — the frozen rich-text format (BLOCK-FORMAT.md §3). Types + pure helpers, no zod,
|
|
2
|
+
// no React: the site renderer, the editor converters and server code all import this file.
|
|
3
|
+
export const RICH_NODE_TYPES = ["paragraph", "heading", "list", "blockquote", "code", "hr"];
|
|
4
|
+
export const RICH_MARK_TYPES = ["bold", "italic", "underline", "strike", "code", "highlight", "sub", "sup", "link"];
|
|
5
|
+
export const isBreak = (n) => n.type === "br";
|
|
6
|
+
/** Builds a doc from plain paragraphs (blank line = new paragraph, single newline = `br`). */
|
|
7
|
+
export function richFromText(text) {
|
|
8
|
+
const paras = text.replace(/\r\n?/g, "\n").split(/\n{2,}/).map((p) => p.trim()).filter(Boolean);
|
|
9
|
+
return {
|
|
10
|
+
type: "doc",
|
|
11
|
+
content: paras.map((p) => ({
|
|
12
|
+
type: "paragraph",
|
|
13
|
+
content: p.split("\n").flatMap((line, i) => (i === 0 ? [{ text: line }] : [{ type: "br" }, { text: line }])),
|
|
14
|
+
})),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/** Plain text of inline runs (`br` → newline). */
|
|
18
|
+
export function inlineToText(content) {
|
|
19
|
+
if (!content)
|
|
20
|
+
return "";
|
|
21
|
+
return content.map((n) => (isBreak(n) ? "\n" : n.text)).join("");
|
|
22
|
+
}
|
|
23
|
+
function blockToText(b) {
|
|
24
|
+
switch (b.type) {
|
|
25
|
+
case "paragraph":
|
|
26
|
+
case "heading":
|
|
27
|
+
return inlineToText(b.content);
|
|
28
|
+
case "code":
|
|
29
|
+
return b.text;
|
|
30
|
+
case "hr":
|
|
31
|
+
return "";
|
|
32
|
+
case "blockquote":
|
|
33
|
+
return b.content.map(blockToText).filter(Boolean).join("\n\n");
|
|
34
|
+
case "list":
|
|
35
|
+
return b.items.map((it) => it.content.map(blockToText).filter(Boolean).join("\n")).join("\n");
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** Plain text of a doc (paragraphs separated by a blank line). Search indexes, meta descriptions, reading time. */
|
|
39
|
+
export function richToText(doc) {
|
|
40
|
+
if (!doc)
|
|
41
|
+
return "";
|
|
42
|
+
const blocks = Array.isArray(doc) ? doc : doc.content;
|
|
43
|
+
return blocks.map(blockToText).filter(Boolean).join("\n\n");
|
|
44
|
+
}
|
|
45
|
+
/** Word count (Unicode-aware; works for Turkish, German, etc.). */
|
|
46
|
+
export function countWords(text) {
|
|
47
|
+
return (text.match(/[\p{L}\p{N}][\p{L}\p{N}'’-]*/gu) ?? []).length;
|
|
48
|
+
}
|
|
49
|
+
/** Visits every inline run in a doc. */
|
|
50
|
+
export function forEachRun(doc, visit) {
|
|
51
|
+
const walk = (blocks) => {
|
|
52
|
+
for (const b of blocks) {
|
|
53
|
+
if (b.type === "paragraph" || b.type === "heading")
|
|
54
|
+
b.content?.forEach((n) => !isBreak(n) && visit(n));
|
|
55
|
+
else if (b.type === "blockquote")
|
|
56
|
+
walk(b.content);
|
|
57
|
+
else if (b.type === "list")
|
|
58
|
+
b.items.forEach((it) => walk(it.content));
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
walk(doc.content);
|
|
62
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns a safe href or `null`. Allows relative paths, `#anchors`, `?query`, `//host`, http(s),
|
|
3
|
+
* mailto, tel and sms. Rejects `javascript:`, `data:`, `vbscript:` and any other scheme —
|
|
4
|
+
* also when hidden behind whitespace, control characters or entity-like tricks.
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* sanitizeHref("/menu"); // "/menu"
|
|
8
|
+
* sanitizeHref(" javascript:alert(1)") // null
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
export declare function sanitizeHref(href: unknown): string | null;
|
|
12
|
+
/** `true` for absolute URLs on another origin (`https://…`, `//host`). mailto/tel are not "external". */
|
|
13
|
+
export declare function isExternalUrl(href: string): boolean;
|
|
14
|
+
/** Link kinds a `LinkRef` can declare (for editors and analytics). */
|
|
15
|
+
export type LinkKind = "url" | "anchor" | "tel" | "mailto" | "whatsapp" | "file";
|
|
16
|
+
/** Infers the kind of a link from its href. */
|
|
17
|
+
export declare function linkKindOf(href: string): LinkKind;
|
|
18
|
+
/** Emoji (pictographs), excluding ©, ® and ™ which legitimately appear in footers. */
|
|
19
|
+
export declare const EMOJI_RE: RegExp;
|
|
20
|
+
export declare const hasEmoji: (s: string) => boolean;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// Pure guards shared by the schema (layer 2) and the components (layer 1). No zod, no React.
|
|
2
|
+
const BLOCKED_SCHEMES = /^(javascript|data|vbscript|file|blob):/i;
|
|
3
|
+
const ALLOWED_SCHEMES = /^(https?|mailto|tel|sms):/i;
|
|
4
|
+
/**
|
|
5
|
+
* Returns a safe href or `null`. Allows relative paths, `#anchors`, `?query`, `//host`, http(s),
|
|
6
|
+
* mailto, tel and sms. Rejects `javascript:`, `data:`, `vbscript:` and any other scheme —
|
|
7
|
+
* also when hidden behind whitespace, control characters or entity-like tricks.
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* sanitizeHref("/menu"); // "/menu"
|
|
11
|
+
* sanitizeHref(" javascript:alert(1)") // null
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export function sanitizeHref(href) {
|
|
15
|
+
if (typeof href !== "string")
|
|
16
|
+
return null;
|
|
17
|
+
const trimmed = href.trim();
|
|
18
|
+
if (!trimmed)
|
|
19
|
+
return null;
|
|
20
|
+
// Browsers strip tabs/newlines/control chars inside the scheme ("java\tscript:").
|
|
21
|
+
const probe = trimmed.replace(/[\u0000- \u007f-\u009f]/g, "");
|
|
22
|
+
if (BLOCKED_SCHEMES.test(probe))
|
|
23
|
+
return null;
|
|
24
|
+
const scheme = /^([a-z][a-z\d+.-]*):/i.exec(probe);
|
|
25
|
+
if (scheme && !ALLOWED_SCHEMES.test(probe))
|
|
26
|
+
return null;
|
|
27
|
+
return trimmed;
|
|
28
|
+
}
|
|
29
|
+
/** `true` for absolute URLs on another origin (`https://…`, `//host`). mailto/tel are not "external". */
|
|
30
|
+
export function isExternalUrl(href) {
|
|
31
|
+
return /^(https?:)?\/\//i.test(href);
|
|
32
|
+
}
|
|
33
|
+
/** Infers the kind of a link from its href. */
|
|
34
|
+
export function linkKindOf(href) {
|
|
35
|
+
if (href.startsWith("#"))
|
|
36
|
+
return "anchor";
|
|
37
|
+
if (/^tel:/i.test(href))
|
|
38
|
+
return "tel";
|
|
39
|
+
if (/^mailto:/i.test(href))
|
|
40
|
+
return "mailto";
|
|
41
|
+
if (/^https?:\/\/(wa\.me|api\.whatsapp\.com)\//i.test(href))
|
|
42
|
+
return "whatsapp";
|
|
43
|
+
if (/\.(pdf|docx?|xlsx?|pptx?|zip|csv)(\?|#|$)/i.test(href))
|
|
44
|
+
return "file";
|
|
45
|
+
return "url";
|
|
46
|
+
}
|
|
47
|
+
/** Emoji (pictographs), excluding ©, ® and ™ which legitimately appear in footers. */
|
|
48
|
+
export const EMOJI_RE = /(?![©®™])\p{Extended_Pictographic}/u;
|
|
49
|
+
export const hasEmoji = (s) => EMOJI_RE.test(s);
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import type { Localized, LocaleCode } from "./localized.js";
|
|
2
|
+
import type { RichInline } from "./rich-doc.js";
|
|
3
|
+
import type { LinkKind } from "./safety.js";
|
|
4
|
+
export type BuiltInAccent = "lime" | "ocean" | "ember" | "rose" | "graphite";
|
|
5
|
+
/** Per-section token axes. Every key is optional; missing = inherit from the page. */
|
|
6
|
+
export interface BlockTheme {
|
|
7
|
+
/** `light`/`dark` re-theme the subtree; `inherit` (default) keeps the page theme. */
|
|
8
|
+
mode?: "inherit" | "light" | "dark";
|
|
9
|
+
/** Section background. `media` paints `background` under a scrim and forces dark text-on-photo. */
|
|
10
|
+
surface?: "scene" | "surface" | "surface-2" | "accent" | "media";
|
|
11
|
+
/** A built-in accent or a custom `oklch(…)` colour. */
|
|
12
|
+
accent?: BuiltInAccent | (string & {});
|
|
13
|
+
material?: "inherit" | "glass" | "solid";
|
|
14
|
+
density?: "inherit" | "comfortable" | "compact";
|
|
15
|
+
/** Vertical padding: tight ×0.55, normal, loose ×1.35. */
|
|
16
|
+
rhythm?: "tight" | "normal" | "loose";
|
|
17
|
+
/** Background image for `surface: "media"`. */
|
|
18
|
+
background?: ImageRef;
|
|
19
|
+
}
|
|
20
|
+
/** An image as stored in content. `alt` is required unless `decorative`. */
|
|
21
|
+
export interface ImageRef {
|
|
22
|
+
src: string;
|
|
23
|
+
alt?: Localized<string>;
|
|
24
|
+
width: number;
|
|
25
|
+
height: number;
|
|
26
|
+
/** Tiny LQIP data URL shown while loading. */
|
|
27
|
+
blurDataURL?: string;
|
|
28
|
+
/** 0..1 in image space; drives object-position when cropped. Default centre. */
|
|
29
|
+
focal?: {
|
|
30
|
+
x: number;
|
|
31
|
+
y: number;
|
|
32
|
+
};
|
|
33
|
+
/** Purely decorative: rendered with `alt=""`. */
|
|
34
|
+
decorative?: boolean;
|
|
35
|
+
/** CMS asset id (Media library). Components ignore it; the renderer may resolve it. */
|
|
36
|
+
assetId?: string;
|
|
37
|
+
}
|
|
38
|
+
/** A link as stored in content. `href` is localized so each locale can point at its own page. */
|
|
39
|
+
export interface LinkRef {
|
|
40
|
+
href: Localized<string>;
|
|
41
|
+
label: Localized<string>;
|
|
42
|
+
kind?: LinkKind;
|
|
43
|
+
newTab?: boolean;
|
|
44
|
+
}
|
|
45
|
+
export type CtaStyle = "primary" | "secondary" | "link";
|
|
46
|
+
export interface CtaRef {
|
|
47
|
+
link: LinkRef;
|
|
48
|
+
style: CtaStyle;
|
|
49
|
+
}
|
|
50
|
+
/** Money is a decimal string (X11), never a float. */
|
|
51
|
+
export interface MoneyValue {
|
|
52
|
+
amount: string;
|
|
53
|
+
/** ISO 4217, e.g. "TRY", "EUR". */
|
|
54
|
+
currency: string;
|
|
55
|
+
}
|
|
56
|
+
export interface AddressValue {
|
|
57
|
+
line: string;
|
|
58
|
+
district?: string;
|
|
59
|
+
city: string;
|
|
60
|
+
region?: string;
|
|
61
|
+
postalCode?: string;
|
|
62
|
+
/** ISO 3166-1 alpha-2. */
|
|
63
|
+
country: string;
|
|
64
|
+
geo?: {
|
|
65
|
+
lat: number;
|
|
66
|
+
lng: number;
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export type Weekday = "mon" | "tue" | "wed" | "thu" | "fri" | "sat" | "sun";
|
|
70
|
+
/** `"09:00"`–`"22:00"`; `close` < `open` means the range runs past midnight. */
|
|
71
|
+
export interface TimeRange {
|
|
72
|
+
open: string;
|
|
73
|
+
close: string;
|
|
74
|
+
}
|
|
75
|
+
export interface OpeningHours {
|
|
76
|
+
/** IANA zone of the business, e.g. "Europe/Istanbul". */
|
|
77
|
+
timeZone: string;
|
|
78
|
+
/** Missing or empty day = closed. */
|
|
79
|
+
weekly: Partial<Record<Weekday, TimeRange[]>>;
|
|
80
|
+
/** Date-only `YYYY-MM-DD` exceptions (holidays, events). */
|
|
81
|
+
special?: {
|
|
82
|
+
date: string;
|
|
83
|
+
closed?: boolean;
|
|
84
|
+
ranges?: TimeRange[];
|
|
85
|
+
note?: Localized<string>;
|
|
86
|
+
}[];
|
|
87
|
+
}
|
|
88
|
+
export interface QueryValue {
|
|
89
|
+
kind: "latest" | "category" | "manual";
|
|
90
|
+
limit?: number;
|
|
91
|
+
category?: string;
|
|
92
|
+
ids?: string[];
|
|
93
|
+
}
|
|
94
|
+
export interface EmbedValue {
|
|
95
|
+
provider: "youtube" | "vimeo" | "google-maps" | "openstreetmap" | "calendly";
|
|
96
|
+
url: string;
|
|
97
|
+
}
|
|
98
|
+
export type SocialNetwork = "instagram" | "facebook" | "linkedin" | "x" | "youtube" | "tiktok" | "whatsapp" | "telegram" | "google-maps" | "apple-maps" | "yandex-maps";
|
|
99
|
+
export interface SocialLink {
|
|
100
|
+
network: SocialNetwork;
|
|
101
|
+
href: string;
|
|
102
|
+
}
|
|
103
|
+
export interface BlockSchedule {
|
|
104
|
+
/** ISO datetime with zone (`2026-12-01T00:00:00Z`). */
|
|
105
|
+
from?: string;
|
|
106
|
+
until?: string;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* One block in a document. Component blocks (hero, faq…) carry `props` + `v`; text blocks
|
|
110
|
+
* (paragraph, heading…) carry inline `content`; layout blocks carry child blocks in `slots`.
|
|
111
|
+
*/
|
|
112
|
+
export interface BlockNode<P = Record<string, unknown>> {
|
|
113
|
+
/** Stable, unique within the doc: editor selection, comments, diffs, analytics, React key. */
|
|
114
|
+
id: string;
|
|
115
|
+
/** Registry key, kebab-case, never renamed. */
|
|
116
|
+
type: string;
|
|
117
|
+
/** Schema version of `props` (component blocks). Missing = 1. */
|
|
118
|
+
v?: number;
|
|
119
|
+
/** One of the block's declared variants. */
|
|
120
|
+
variant?: string;
|
|
121
|
+
props?: P;
|
|
122
|
+
/** Inline runs for text blocks (`paragraph`, `heading`, `code`, `list-item`). */
|
|
123
|
+
content?: RichInline[];
|
|
124
|
+
/** Named child lists for layout blocks (`columns.items`, `quote.items`). */
|
|
125
|
+
slots?: Record<string, BlockNode[]>;
|
|
126
|
+
theme?: BlockTheme;
|
|
127
|
+
/** Section anchor (`#menu`). */
|
|
128
|
+
anchor?: string;
|
|
129
|
+
hidden?: boolean;
|
|
130
|
+
schedule?: BlockSchedule;
|
|
131
|
+
}
|
|
132
|
+
export interface SeoMeta {
|
|
133
|
+
title?: Localized<string>;
|
|
134
|
+
description?: Localized<string>;
|
|
135
|
+
image?: ImageRef;
|
|
136
|
+
canonical?: string;
|
|
137
|
+
noindex?: boolean;
|
|
138
|
+
}
|
|
139
|
+
export interface DocMeta {
|
|
140
|
+
wordCount?: number;
|
|
141
|
+
readingTime?: number;
|
|
142
|
+
toc?: {
|
|
143
|
+
id: string;
|
|
144
|
+
level: number;
|
|
145
|
+
text: string;
|
|
146
|
+
}[];
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* The storage format of every page and post (VamosDoc v1 = PageDoc). Editor-independent;
|
|
150
|
+
* the site renders it without loading the editor.
|
|
151
|
+
*/
|
|
152
|
+
export interface VamosDoc {
|
|
153
|
+
$schema?: string;
|
|
154
|
+
version: 1;
|
|
155
|
+
/** Document-level locale (one doc per locale, linked by `translationKey`). */
|
|
156
|
+
lang?: LocaleCode;
|
|
157
|
+
/** Field-level locales stored in this doc (`["tr", "en"]`). First = default. */
|
|
158
|
+
locales?: LocaleCode[];
|
|
159
|
+
translationKey?: string;
|
|
160
|
+
seo?: SeoMeta;
|
|
161
|
+
blocks: BlockNode[];
|
|
162
|
+
/** Shared site regions. */
|
|
163
|
+
layout?: {
|
|
164
|
+
header?: BlockNode[];
|
|
165
|
+
footer?: BlockNode[];
|
|
166
|
+
overlay?: BlockNode[];
|
|
167
|
+
};
|
|
168
|
+
/** Derived by the editor, never the source of truth. */
|
|
169
|
+
meta?: DocMeta;
|
|
170
|
+
}
|
|
171
|
+
/** Alias kept for plan 06 vocabulary. */
|
|
172
|
+
export type PageDoc = VamosDoc;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { AnyBlockDefinition } from "./define-block.js";
|
|
3
|
+
import type { BlockNode } from "./types.js";
|
|
4
|
+
export interface ValidationResult<P = Record<string, unknown>> {
|
|
5
|
+
ok: boolean;
|
|
6
|
+
/** Parsed props (defaults applied). Present when `ok`. */
|
|
7
|
+
data?: P;
|
|
8
|
+
/** Top-level fields replaced by sample/default values. */
|
|
9
|
+
replaced: string[];
|
|
10
|
+
issues: z.core.$ZodIssue[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Validates a node's props against its definition. When invalid, every top-level field that fails
|
|
14
|
+
* is replaced by the block's sample value (or dropped to its default), so one bad field never
|
|
15
|
+
* blanks the whole block. `ok: false` only when even that cannot produce valid props.
|
|
16
|
+
*/
|
|
17
|
+
export declare function validateNode(node: BlockNode, def: AnyBlockDefinition): ValidationResult;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// Render-time validation with salvage: keep every valid field, replace only the broken ones.
|
|
2
|
+
/**
|
|
3
|
+
* Validates a node's props against its definition. When invalid, every top-level field that fails
|
|
4
|
+
* is replaced by the block's sample value (or dropped to its default), so one bad field never
|
|
5
|
+
* blanks the whole block. `ok: false` only when even that cannot produce valid props.
|
|
6
|
+
*/
|
|
7
|
+
export function validateNode(node, def) {
|
|
8
|
+
const props = node.props ?? {};
|
|
9
|
+
const first = def.schema.safeParse(props);
|
|
10
|
+
if (first.success)
|
|
11
|
+
return { ok: true, data: first.data, replaced: [], issues: [] };
|
|
12
|
+
const shape = def.schema.shape;
|
|
13
|
+
const sample = (def.sample(node.variant) ?? {});
|
|
14
|
+
const fixed = {};
|
|
15
|
+
const replaced = [];
|
|
16
|
+
for (const key of Object.keys(shape)) {
|
|
17
|
+
const field = shape[key];
|
|
18
|
+
const value = props[key];
|
|
19
|
+
if (field.safeParse(value).success) {
|
|
20
|
+
if (value !== undefined)
|
|
21
|
+
fixed[key] = value;
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
replaced.push(key);
|
|
25
|
+
if (sample[key] !== undefined && field.safeParse(sample[key]).success)
|
|
26
|
+
fixed[key] = sample[key];
|
|
27
|
+
}
|
|
28
|
+
const second = def.schema.safeParse(fixed);
|
|
29
|
+
return second.success
|
|
30
|
+
? { ok: true, data: second.data, replaced, issues: first.error.issues }
|
|
31
|
+
: { ok: false, replaced, issues: first.error.issues };
|
|
32
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import { type FieldMeta } from "./fields.js";
|
|
3
|
+
export interface FieldVisit {
|
|
4
|
+
schema: z.ZodType;
|
|
5
|
+
meta?: FieldMeta;
|
|
6
|
+
value: unknown;
|
|
7
|
+
/** Dot path from the props root ("items.2.title"). */
|
|
8
|
+
path: string;
|
|
9
|
+
/** The value is a Localized<T> (plain or locale map). */
|
|
10
|
+
localized: boolean;
|
|
11
|
+
}
|
|
12
|
+
/** Return `{ replace }` to substitute the value (and stop descending), `"skip"` to stop descending. */
|
|
13
|
+
export type FieldVisitor = (visit: FieldVisit) => {
|
|
14
|
+
replace: unknown;
|
|
15
|
+
} | "skip" | void;
|
|
16
|
+
/**
|
|
17
|
+
* Walks `value` alongside `schema`, calling `visit` for every node. Returns the (possibly
|
|
18
|
+
* transformed) value; the input is never mutated.
|
|
19
|
+
*/
|
|
20
|
+
export declare function mapFields(schema: z.ZodType, value: unknown, visit: FieldVisitor, path?: string): unknown;
|
|
21
|
+
/** Read-only walk. */
|
|
22
|
+
export declare function walkFields(schema: z.ZodType, value: unknown, visit: (v: FieldVisit) => "skip" | void): void;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// Schema-driven traversal of block props. Powers localize(), lintPage() and resolver lookup.
|
|
2
|
+
import { getFieldMeta, isLocalizedSchema, unwrapSchema } from "./fields.js";
|
|
3
|
+
const defOf = (s) => s._zod.def;
|
|
4
|
+
const join = (a, b) => (a ? `${a}.${b}` : String(b));
|
|
5
|
+
/**
|
|
6
|
+
* Walks `value` alongside `schema`, calling `visit` for every node. Returns the (possibly
|
|
7
|
+
* transformed) value; the input is never mutated.
|
|
8
|
+
*/
|
|
9
|
+
export function mapFields(schema, value, visit, path = "") {
|
|
10
|
+
if (value === undefined)
|
|
11
|
+
return value;
|
|
12
|
+
const localized = isLocalizedSchema(schema);
|
|
13
|
+
const result = visit({ schema, meta: getFieldMeta(schema), value, path, localized });
|
|
14
|
+
if (result && typeof result === "object" && "replace" in result)
|
|
15
|
+
return result.replace;
|
|
16
|
+
if (result === "skip" || localized)
|
|
17
|
+
return value;
|
|
18
|
+
let s = unwrapSchema(schema);
|
|
19
|
+
for (let i = 0; i < 5; i++) {
|
|
20
|
+
const d = defOf(s);
|
|
21
|
+
if (d.type === "lazy" && d.getter)
|
|
22
|
+
s = unwrapSchema(d.getter());
|
|
23
|
+
else if (d.type === "pipe" && d.in)
|
|
24
|
+
s = unwrapSchema(d.in);
|
|
25
|
+
else
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
const def = defOf(s);
|
|
29
|
+
if (def.type === "object" && def.shape && value && typeof value === "object" && !Array.isArray(value)) {
|
|
30
|
+
const src = value;
|
|
31
|
+
let out;
|
|
32
|
+
for (const key of Object.keys(def.shape)) {
|
|
33
|
+
if (!(key in src))
|
|
34
|
+
continue;
|
|
35
|
+
const next = mapFields(def.shape[key], src[key], visit, join(path, key));
|
|
36
|
+
if (next !== src[key])
|
|
37
|
+
(out ??= { ...src })[key] = next;
|
|
38
|
+
}
|
|
39
|
+
return out ?? value;
|
|
40
|
+
}
|
|
41
|
+
if (def.type === "array" && def.element && Array.isArray(value)) {
|
|
42
|
+
let out;
|
|
43
|
+
value.forEach((item, i) => {
|
|
44
|
+
const next = mapFields(def.element, item, visit, join(path, i));
|
|
45
|
+
if (next !== item)
|
|
46
|
+
(out ??= [...value])[i] = next;
|
|
47
|
+
});
|
|
48
|
+
return out ?? value;
|
|
49
|
+
}
|
|
50
|
+
if (def.type === "union" && def.options) {
|
|
51
|
+
const match = def.options.find((o) => o.safeParse(value).success);
|
|
52
|
+
if (match)
|
|
53
|
+
return mapFields(match, value, visit, path);
|
|
54
|
+
}
|
|
55
|
+
return value;
|
|
56
|
+
}
|
|
57
|
+
/** Read-only walk. */
|
|
58
|
+
export function walkFields(schema, value, visit) {
|
|
59
|
+
mapFields(schema, value, (v) => visit(v) ?? undefined);
|
|
60
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import type { BlockLabels } from "./labels.js";
|
|
3
|
+
export interface SectionHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "title"> {
|
|
4
|
+
/** Small mono line above the title ("Menu", "Since 1998"). */
|
|
5
|
+
eyebrow?: React.ReactNode;
|
|
6
|
+
/** Index before the eyebrow ("01"). */
|
|
7
|
+
index?: string;
|
|
8
|
+
/** Title; a string supports one `*emphasis*`. */
|
|
9
|
+
title?: React.ReactNode;
|
|
10
|
+
/** Intro paragraph. */
|
|
11
|
+
lead?: React.ReactNode;
|
|
12
|
+
/** Buttons / links (one primary at most). */
|
|
13
|
+
actions?: React.ReactNode;
|
|
14
|
+
/**
|
|
15
|
+
* start (default): stacked, start-aligned, capped at 64ch.
|
|
16
|
+
* split: on wide containers the title takes 5 of 12 columns, lead + actions the other 7.
|
|
17
|
+
* center: narrow measure — only for statement heroes and minimal CTAs.
|
|
18
|
+
*/
|
|
19
|
+
align?: "start" | "split" | "center";
|
|
20
|
+
/** Title size: m = section h2, l = large section title. Default `"m"`. */
|
|
21
|
+
size?: "m" | "l";
|
|
22
|
+
/** Heading level. Default 2. */
|
|
23
|
+
headingLevel?: 1 | 2 | 3;
|
|
24
|
+
/** Id for the title — pass the same value to `Section headingId`. */
|
|
25
|
+
headingId?: string;
|
|
26
|
+
editMode?: boolean;
|
|
27
|
+
labels?: Partial<BlockLabels>;
|
|
28
|
+
locale?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The heading group at the top of a block: eyebrow, title, lead, actions. Start-aligned by
|
|
32
|
+
* default (D6-2). Server component.
|
|
33
|
+
*
|
|
34
|
+
* ```tsx
|
|
35
|
+
* <SectionHeader eyebrow="Private dining" title="Rooms for *twelve* or forty" lead="…" align="split" headingId="rooms" />
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export declare const SectionHeader: React.ForwardRefExoticComponent<SectionHeaderProps & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { cn } from "../lib/cn.js";
|
|
4
|
+
import { BlockHeading, renderEmphasis } from "./block-heading.js";
|
|
5
|
+
/**
|
|
6
|
+
* The heading group at the top of a block: eyebrow, title, lead, actions. Start-aligned by
|
|
7
|
+
* default (D6-2). Server component.
|
|
8
|
+
*
|
|
9
|
+
* ```tsx
|
|
10
|
+
* <SectionHeader eyebrow="Private dining" title="Rooms for *twelve* or forty" lead="…" align="split" headingId="rooms" />
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export const SectionHeader = React.forwardRef(function SectionHeader({ eyebrow, index, title, lead, actions, align = "start", size = "m", headingLevel = 2, headingId, editMode, labels, locale, className, ...props }, ref) {
|
|
14
|
+
const heading = (_jsx(BlockHeading, { id: headingId, level: headingLevel, size: size === "l" ? "display-l" : "display-m", text: title, editMode: editMode, field: "props.title", labels: labels, locale: locale }));
|
|
15
|
+
const eyebrowEl = eyebrow || index ? (_jsxs("p", { className: cn("flex items-center gap-3 font-mono text-eyebrow uppercase tracking-[0.08em] text-fg-muted", align === "center" && "justify-center"), "data-field": editMode ? "props.eyebrow" : undefined, children: [index ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "tabular text-fg", children: index }), _jsx("span", { "aria-hidden": true, className: "h-px w-6 bg-current opacity-40" })] })) : null, eyebrow ? _jsx("span", { children: renderEmphasis(eyebrow) }) : null] })) : null;
|
|
16
|
+
const leadEl = lead ? (_jsx("p", { className: "vb-lead max-w-(--measure) text-lead text-fg-muted", "data-field": editMode ? "props.lead" : undefined, children: lead })) : null;
|
|
17
|
+
const actionsEl = actions ? _jsx("div", { className: cn("flex flex-wrap items-center gap-3", align === "center" && "justify-center"), children: actions }) : null;
|
|
18
|
+
if (align === "split") {
|
|
19
|
+
return (_jsxs("div", { ref: ref, "data-align": "split", className: cn("grid gap-x-(--gutter) gap-y-6 @4xl:grid-cols-12 @4xl:items-end", className), ...props, children: [_jsxs("div", { className: "flex flex-col gap-5 @4xl:col-span-6 @6xl:col-span-5", children: [eyebrowEl, heading] }), leadEl || actionsEl ? (_jsxs("div", { className: "flex flex-col gap-6 @4xl:col-span-6 @4xl:col-start-7 @6xl:col-span-6 @6xl:col-start-7 [&_.vb-lead]:max-w-[52ch]", children: [leadEl, actionsEl] })) : null] }));
|
|
20
|
+
}
|
|
21
|
+
return (_jsxs("div", { ref: ref, "data-align": align, className: cn("flex flex-col gap-5", align === "center" ? "mx-auto max-w-(--prose) items-center text-center [&_.vb-lead]:mx-auto" : "max-w-(--measure)", className), ...props, children: [eyebrowEl, heading, leadEl ? _jsx("div", { className: "pt-1", children: leadEl }) : null, actionsEl ? _jsx("div", { className: "pt-3", children: actionsEl }) : null] }));
|
|
22
|
+
});
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { type BlockLabels } from "./labels.js";
|
|
3
|
+
import type { BlockAdapters } from "./types.js";
|
|
4
|
+
import type { BlockTheme } from "./schema/types.js";
|
|
5
|
+
/** Readable text colour for a custom `oklch(L C H)` accent: dark ink on light accents, white on dark. */
|
|
6
|
+
export declare function accentForeground(oklch: string): string;
|
|
7
|
+
/** The `data-*`/class/style a theme maps to. Exported for blocks that render their own root. */
|
|
8
|
+
export declare function sectionThemeAttributes(theme: BlockTheme | undefined): {
|
|
9
|
+
className?: string;
|
|
10
|
+
style?: React.CSSProperties;
|
|
11
|
+
attrs: Record<string, string | undefined>;
|
|
12
|
+
};
|
|
13
|
+
export interface SectionProps extends Omit<React.HTMLAttributes<HTMLElement>, "id"> {
|
|
14
|
+
/** Landmark element. Default `"section"`. */
|
|
15
|
+
as?: "section" | "div" | "header" | "footer" | "aside" | "article" | "nav";
|
|
16
|
+
/** Per-section token axes: mode, surface, accent, material, density, rhythm, background. */
|
|
17
|
+
theme?: BlockTheme;
|
|
18
|
+
/** Section id / URL anchor (`#menu`). */
|
|
19
|
+
anchor?: string;
|
|
20
|
+
/** Id of the section's heading; sets `aria-labelledby`. */
|
|
21
|
+
headingId?: string;
|
|
22
|
+
/** Node id; emitted as `data-block-id` in edit mode. */
|
|
23
|
+
blockId?: string;
|
|
24
|
+
/** Block type; emitted as `data-block-type` in edit mode. */
|
|
25
|
+
blockType?: string;
|
|
26
|
+
editMode?: boolean;
|
|
27
|
+
/** Load the media background eagerly (above the fold). */
|
|
28
|
+
priority?: boolean;
|
|
29
|
+
/** Framework bindings for the media background. */
|
|
30
|
+
components?: BlockAdapters;
|
|
31
|
+
labels?: Partial<BlockLabels>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* The root of every block: maps `theme` onto subtree token axes, sets the container query
|
|
35
|
+
* context, vertical rhythm and the landmark's accessible name. Server component.
|
|
36
|
+
*
|
|
37
|
+
* ```tsx
|
|
38
|
+
* <Section theme={{ mode: "dark", surface: "accent", accent: "ember" }} anchor="book" headingId="book-title">
|
|
39
|
+
* <Container>…</Container>
|
|
40
|
+
* </Section>
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare const Section: React.ForwardRefExoticComponent<SectionProps & React.RefAttributes<HTMLElement>>;
|
|
44
|
+
export type ContainerSize = "content" | "wide" | "prose" | "full";
|
|
45
|
+
export interface ContainerProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
46
|
+
/** content = 76rem, wide = 90rem, prose = 42rem, full = edge to edge (gutters kept). Default `"content"`. */
|
|
47
|
+
size?: ContainerSize;
|
|
48
|
+
asChild?: never;
|
|
49
|
+
}
|
|
50
|
+
/** Centres content at a token width with fluid gutters (`--gutter`). Server component. */
|
|
51
|
+
export declare const Container: React.ForwardRefExoticComponent<ContainerProps & React.RefAttributes<HTMLDivElement>>;
|
|
52
|
+
export interface SkipLinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {
|
|
53
|
+
/** Target id. Default `"content"`. */
|
|
54
|
+
target?: string;
|
|
55
|
+
labels?: Partial<BlockLabels>;
|
|
56
|
+
locale?: string;
|
|
57
|
+
}
|
|
58
|
+
/** "Skip to content" — the first focusable element of a site, before the navbar. */
|
|
59
|
+
export declare function SkipLink({ target, labels, locale, className, children, ...props }: SkipLinkProps): React.JSX.Element;
|
|
@@ -0,0 +1,66 @@
|
|
|
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
|
+
import { BlockImage } from "./block-image.js";
|
|
5
|
+
import { blockText } from "./labels.js";
|
|
6
|
+
const BUILT_IN_ACCENTS = new Set(["lime", "ocean", "ember", "rose", "graphite"]);
|
|
7
|
+
/** Readable text colour for a custom `oklch(L C H)` accent: dark ink on light accents, white on dark. */
|
|
8
|
+
export function accentForeground(oklch) {
|
|
9
|
+
const m = /oklch\(\s*([\d.]+)(%?)/.exec(oklch);
|
|
10
|
+
const l = m ? Number(m[1]) / (m[2] ? 100 : 1) : 0.6;
|
|
11
|
+
return l >= 0.68 ? "oklch(0.18 0.02 120)" : "#fff";
|
|
12
|
+
}
|
|
13
|
+
/** The `data-*`/class/style a theme maps to. Exported for blocks that render their own root. */
|
|
14
|
+
export function sectionThemeAttributes(theme) {
|
|
15
|
+
if (!theme)
|
|
16
|
+
return { attrs: {} };
|
|
17
|
+
const mode = theme.mode && theme.mode !== "inherit" ? theme.mode : undefined;
|
|
18
|
+
// A media surface is always dark: text sits on a photo under a scrim.
|
|
19
|
+
const effectiveMode = theme.surface === "media" ? "dark" : mode;
|
|
20
|
+
const surface = theme.surface ?? (effectiveMode ? "scene" : undefined);
|
|
21
|
+
const accent = theme.accent;
|
|
22
|
+
const custom = accent && !BUILT_IN_ACCENTS.has(accent) ? accent : undefined;
|
|
23
|
+
const style = custom
|
|
24
|
+
? { "--accent-base": custom, "--accent-fg": accentForeground(custom), "--accent-ink-light": `color-mix(in oklch, ${custom} 70%, black)`, "--accent-ink-dark": `color-mix(in oklch, ${custom} 72%, white)` }
|
|
25
|
+
: undefined;
|
|
26
|
+
return {
|
|
27
|
+
className: effectiveMode,
|
|
28
|
+
style: style,
|
|
29
|
+
attrs: {
|
|
30
|
+
"data-surface": surface,
|
|
31
|
+
"data-accent": custom ? "custom" : accent,
|
|
32
|
+
"data-material": theme.material && theme.material !== "inherit" ? theme.material : undefined,
|
|
33
|
+
"data-density": theme.density && theme.density !== "inherit" ? theme.density : undefined,
|
|
34
|
+
"data-rhythm": theme.rhythm && theme.rhythm !== "normal" ? theme.rhythm : undefined,
|
|
35
|
+
"data-tone": surface && surface !== "media" ? `${surface}/${effectiveMode ?? "inherit"}` : undefined,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* The root of every block: maps `theme` onto subtree token axes, sets the container query
|
|
41
|
+
* context, vertical rhythm and the landmark's accessible name. Server component.
|
|
42
|
+
*
|
|
43
|
+
* ```tsx
|
|
44
|
+
* <Section theme={{ mode: "dark", surface: "accent", accent: "ember" }} anchor="book" headingId="book-title">
|
|
45
|
+
* <Container>…</Container>
|
|
46
|
+
* </Section>
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export const Section = React.forwardRef(function Section({ as: Comp = "section", theme, anchor, headingId, blockId, blockType, editMode, priority, components, labels, className, style, children, ...props }, ref) {
|
|
50
|
+
const t = sectionThemeAttributes(theme);
|
|
51
|
+
const bg = theme?.surface === "media" ? theme.background : undefined;
|
|
52
|
+
return (_jsxs(Comp, { ref: ref, id: anchor, "aria-labelledby": headingId, className: cn("vb-section", t.className, className), style: t.style || style ? { ...t.style, ...style } : undefined, "data-block-id": editMode ? blockId : undefined, "data-block-type": editMode ? blockType : undefined, ...t.attrs, ...props, children: [bg ? _jsx(SectionMedia, { image: bg, priority: priority, components: components, labels: labels }) : null, children] }));
|
|
53
|
+
});
|
|
54
|
+
function SectionMedia({ image, priority, components, labels }) {
|
|
55
|
+
// The photo is atmosphere; the content above carries the meaning, so it's decorative here.
|
|
56
|
+
return (_jsx("div", { className: "vb-section-media", "aria-hidden": "true", children: _jsx(BlockImage, { src: image.src, width: image.width, height: image.height, blurDataURL: image.blurDataURL, focal: image.focal, decorative: true, priority: priority, sizes: "100vw", components: components, labels: labels }) }));
|
|
57
|
+
}
|
|
58
|
+
/** Centres content at a token width with fluid gutters (`--gutter`). Server component. */
|
|
59
|
+
export const Container = React.forwardRef(function Container({ size = "content", className, ...props }, ref) {
|
|
60
|
+
return _jsx("div", { ref: ref, "data-size": size === "content" ? undefined : size, className: cn("vb-container", className), ...props });
|
|
61
|
+
});
|
|
62
|
+
/** "Skip to content" — the first focusable element of a site, before the navbar. */
|
|
63
|
+
export function SkipLink({ target = "content", labels, locale, className, children, ...props }) {
|
|
64
|
+
const t = blockText(labels, locale);
|
|
65
|
+
return (_jsx("a", { href: `#${target}`, className: cn("vb-skip surface-popover rounded-ui px-4 py-2.5 text-sm font-medium text-fg focus-ring", className), ...props, children: children ?? t("skipToContent") }));
|
|
66
|
+
}
|