@vamos-ui/react 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +27 -2
- package/dist/blocks/block-heading.d.ts +29 -0
- package/dist/blocks/block-heading.js +39 -0
- package/dist/blocks/block-image.d.ts +52 -0
- package/dist/blocks/block-image.js +48 -0
- package/dist/blocks/block-link.d.ts +30 -0
- package/dist/blocks/block-link.js +36 -0
- package/dist/blocks/create-blocks.d.ts +54 -0
- package/dist/blocks/create-blocks.js +52 -0
- package/dist/blocks/index.d.ts +55 -0
- package/dist/blocks/index.js +59 -0
- package/dist/blocks/json-ld.d.ts +18 -0
- package/dist/blocks/json-ld.js +44 -0
- package/dist/blocks/labels.d.ts +20 -0
- package/dist/blocks/labels.js +43 -0
- package/dist/blocks/rich-text.d.ts +36 -0
- package/dist/blocks/rich-text.js +106 -0
- package/dist/blocks/schema/define-block.d.ts +151 -0
- package/dist/blocks/schema/define-block.js +120 -0
- package/dist/blocks/schema/emphasis.d.ts +17 -0
- package/dist/blocks/schema/emphasis.js +69 -0
- package/dist/blocks/schema/fields.d.ts +497 -0
- package/dist/blocks/schema/fields.js +240 -0
- package/dist/blocks/schema/icons.d.ts +2 -0
- package/dist/blocks/schema/icons.js +26 -0
- package/dist/blocks/schema/index.d.ts +18 -0
- package/dist/blocks/schema/index.js +21 -0
- package/dist/blocks/schema/lint-types.d.ts +16 -0
- package/dist/blocks/schema/lint-types.js +2 -0
- package/dist/blocks/schema/lint.d.ts +32 -0
- package/dist/blocks/schema/lint.js +164 -0
- package/dist/blocks/schema/localize.d.ts +20 -0
- package/dist/blocks/schema/localize.js +29 -0
- package/dist/blocks/schema/localized.d.ts +25 -0
- package/dist/blocks/schema/localized.js +53 -0
- package/dist/blocks/schema/migrate.d.ts +24 -0
- package/dist/blocks/schema/migrate.js +75 -0
- package/dist/blocks/schema/nodes.d.ts +196 -0
- package/dist/blocks/schema/nodes.js +78 -0
- package/dist/blocks/schema/rich-doc-schema.d.ts +32 -0
- package/dist/blocks/schema/rich-doc-schema.js +66 -0
- package/dist/blocks/schema/rich-doc.d.ts +90 -0
- package/dist/blocks/schema/rich-doc.js +62 -0
- package/dist/blocks/schema/safety.d.ts +20 -0
- package/dist/blocks/schema/safety.js +49 -0
- package/dist/blocks/schema/types.d.ts +172 -0
- package/dist/blocks/schema/types.js +3 -0
- package/dist/blocks/schema/validate.d.ts +17 -0
- package/dist/blocks/schema/validate.js +32 -0
- package/dist/blocks/schema/walk.d.ts +22 -0
- package/dist/blocks/schema/walk.js +60 -0
- package/dist/blocks/section-header.d.ts +38 -0
- package/dist/blocks/section-header.js +22 -0
- package/dist/blocks/section.d.ts +59 -0
- package/dist/blocks/section.js +66 -0
- package/dist/blocks/site/_kit-1.d.ts +100 -0
- package/dist/blocks/site/_kit-1.js +135 -0
- package/dist/blocks/site/_site-icon-1.d.ts +6 -0
- package/dist/blocks/site/_site-icon-1.js +15 -0
- package/dist/blocks/site/announcement-bar.d.ts +42 -0
- package/dist/blocks/site/announcement-bar.js +38 -0
- package/dist/blocks/site/announcement-dismiss.d.ts +18 -0
- package/dist/blocks/site/announcement-dismiss.js +28 -0
- package/dist/blocks/site/article-layout.d.ts +65 -0
- package/dist/blocks/site/article-layout.js +88 -0
- package/dist/blocks/site/blog-list.d.ts +79 -0
- package/dist/blocks/site/blog-list.js +78 -0
- package/dist/blocks/site/comparison-table.d.ts +54 -0
- package/dist/blocks/site/comparison-table.js +38 -0
- package/dist/blocks/site/consent-banner.d.ts +52 -0
- package/dist/blocks/site/consent-banner.js +33 -0
- package/dist/blocks/site/contact-dock.d.ts +52 -0
- package/dist/blocks/site/contact-dock.js +55 -0
- package/dist/blocks/site/contact-form.d.ts +60 -0
- package/dist/blocks/site/contact-form.js +45 -0
- package/dist/blocks/site/cta-booking.d.ts +43 -0
- package/dist/blocks/site/cta-booking.js +69 -0
- package/dist/blocks/site/cta.d.ts +74 -0
- package/dist/blocks/site/cta.js +112 -0
- package/dist/blocks/site/embed-facade.d.ts +20 -0
- package/dist/blocks/site/embed-facade.js +21 -0
- package/dist/blocks/site/faq.d.ts +48 -0
- package/dist/blocks/site/faq.js +51 -0
- package/dist/blocks/site/feature-grid.d.ts +46 -0
- package/dist/blocks/site/feature-grid.js +49 -0
- package/dist/blocks/site/feature-tabs.d.ts +22 -0
- package/dist/blocks/site/feature-tabs.js +11 -0
- package/dist/blocks/site/footer.d.ts +68 -0
- package/dist/blocks/site/footer.js +61 -0
- package/dist/blocks/site/gallery-section.d.ts +42 -0
- package/dist/blocks/site/gallery-section.js +47 -0
- package/dist/blocks/site/hero-video.d.ts +15 -0
- package/dist/blocks/site/hero-video.js +31 -0
- package/dist/blocks/site/hero.d.ts +64 -0
- package/dist/blocks/site/hero.js +67 -0
- package/dist/blocks/site/logo-strip.d.ts +42 -0
- package/dist/blocks/site/logo-strip.js +26 -0
- package/dist/blocks/site/map-hours.d.ts +83 -0
- package/dist/blocks/site/map-hours.js +125 -0
- package/dist/blocks/site/media-text.d.ts +45 -0
- package/dist/blocks/site/media-text.js +55 -0
- package/dist/blocks/site/menu-list.d.ts +74 -0
- package/dist/blocks/site/menu-list.js +84 -0
- package/dist/blocks/site/navbar-submenu.d.ts +18 -0
- package/dist/blocks/site/navbar-submenu.js +51 -0
- package/dist/blocks/site/navbar.d.ts +67 -0
- package/dist/blocks/site/navbar.js +64 -0
- package/dist/blocks/site/not-found.d.ts +40 -0
- package/dist/blocks/site/not-found.js +38 -0
- package/dist/blocks/site/page-intro.d.ts +46 -0
- package/dist/blocks/site/page-intro.js +44 -0
- package/dist/blocks/site/pricing-table.d.ts +67 -0
- package/dist/blocks/site/pricing-table.js +82 -0
- package/dist/blocks/site/process.d.ts +36 -0
- package/dist/blocks/site/process.js +41 -0
- package/dist/blocks/site/registry-1.d.ts +720 -0
- package/dist/blocks/site/registry-1.js +783 -0
- package/dist/blocks/site/registry-2.d.ts +914 -0
- package/dist/blocks/site/registry-2.js +563 -0
- package/dist/blocks/site/rich-text-section.d.ts +34 -0
- package/dist/blocks/site/rich-text-section.js +32 -0
- package/dist/blocks/site/shared/brand-icons.d.ts +21 -0
- package/dist/blocks/site/shared/brand-icons.js +56 -0
- package/dist/blocks/site/shared/consent-gate.d.ts +41 -0
- package/dist/blocks/site/shared/consent-gate.js +43 -0
- package/dist/blocks/site/shared/consent-island.d.ts +38 -0
- package/dist/blocks/site/shared/consent-island.js +63 -0
- package/dist/blocks/site/shared/consent.d.ts +49 -0
- package/dist/blocks/site/shared/consent.js +130 -0
- package/dist/blocks/site/shared/contact-form-island.d.ts +41 -0
- package/dist/blocks/site/shared/contact-form-island.js +100 -0
- package/dist/blocks/site/shared/copy-link.d.ts +10 -0
- package/dist/blocks/site/shared/copy-link.js +25 -0
- package/dist/blocks/site/shared/dock-avoid.d.ts +15 -0
- package/dist/blocks/site/shared/dock-avoid.js +107 -0
- package/dist/blocks/site/shared/dock-hours.d.ts +13 -0
- package/dist/blocks/site/shared/dock-hours.js +25 -0
- package/dist/blocks/site/shared/gallery-lightbox.d.ts +12 -0
- package/dist/blocks/site/shared/gallery-lightbox.js +10 -0
- package/dist/blocks/site/shared/island-keys.d.ts +10 -0
- package/dist/blocks/site/shared/island-keys.js +44 -0
- package/dist/blocks/site/shared/kit-2.d.ts +55 -0
- package/dist/blocks/site/shared/kit-2.js +84 -0
- package/dist/blocks/site/shared/labels-2.d.ts +209 -0
- package/dist/blocks/site/shared/labels-2.js +427 -0
- package/dist/blocks/site/shared/open-now.d.ts +22 -0
- package/dist/blocks/site/shared/open-now.js +27 -0
- package/dist/blocks/site/shared/opening-hours.d.ts +117 -0
- package/dist/blocks/site/shared/opening-hours.js +245 -0
- package/dist/blocks/site/shared/site-accent.d.ts +48 -0
- package/dist/blocks/site/shared/site-accent.js +249 -0
- package/dist/blocks/site/shared/site-form.d.ts +79 -0
- package/dist/blocks/site/shared/site-form.js +111 -0
- package/dist/blocks/site/shared/site-routing.d.ts +54 -0
- package/dist/blocks/site/shared/site-routing.js +86 -0
- package/dist/blocks/site/shared/testimonials-carousel.d.ts +17 -0
- package/dist/blocks/site/shared/testimonials-carousel.js +64 -0
- package/dist/blocks/site/site-shell.d.ts +97 -0
- package/dist/blocks/site/site-shell.js +227 -0
- package/dist/blocks/site/stats-band.d.ts +40 -0
- package/dist/blocks/site/stats-band.js +41 -0
- package/dist/blocks/site/team.d.ts +44 -0
- package/dist/blocks/site/team.js +48 -0
- package/dist/blocks/site/testimonials.d.ts +68 -0
- package/dist/blocks/site/testimonials.js +65 -0
- package/dist/blocks/types.d.ts +63 -0
- package/dist/blocks/types.js +2 -0
- package/dist/business/approval-flow.d.ts +152 -0
- package/dist/business/approval-flow.js +221 -0
- package/dist/business/export-core.d.ts +55 -0
- package/dist/business/export-core.js +101 -0
- package/dist/business/export.d.ts +148 -0
- package/dist/business/export.js +264 -0
- package/dist/business/import-core.d.ts +104 -0
- package/dist/business/import-core.js +281 -0
- package/dist/business/import-wizard.d.ts +186 -0
- package/dist/business/import-wizard.js +401 -0
- package/dist/business/index.d.ts +11 -0
- package/dist/business/index.js +20 -0
- package/dist/business/line-items-core.d.ts +129 -0
- package/dist/business/line-items-core.js +183 -0
- package/dist/business/line-items.d.ts +119 -0
- package/dist/business/line-items.js +299 -0
- package/dist/business/multi-step-form.d.ts +131 -0
- package/dist/business/multi-step-form.js +337 -0
- package/dist/business/permission-core.d.ts +59 -0
- package/dist/business/permission-core.js +99 -0
- package/dist/business/permission-matrix.d.ts +158 -0
- package/dist/business/permission-matrix.js +341 -0
- package/dist/business/setup-checklist.d.ts +80 -0
- package/dist/business/setup-checklist.js +92 -0
- package/dist/charts/area-chart.d.ts +35 -0
- package/dist/charts/area-chart.js +33 -0
- package/dist/charts/bar-chart.d.ts +27 -0
- package/dist/charts/bar-chart.js +42 -0
- package/dist/charts/bar-list.d.ts +47 -0
- package/dist/charts/bar-list.js +60 -0
- package/dist/charts/chart-shell.d.ts +173 -0
- package/dist/charts/chart-shell.js +205 -0
- package/dist/charts/chart.d.ts +73 -0
- package/dist/charts/chart.js +106 -0
- package/dist/charts/combo-chart.d.ts +29 -0
- package/dist/charts/combo-chart.js +47 -0
- package/dist/charts/donut-chart.d.ts +33 -0
- package/dist/charts/donut-chart.js +113 -0
- package/dist/charts/funnel.d.ts +51 -0
- package/dist/charts/funnel.js +69 -0
- package/dist/charts/gauge.d.ts +62 -0
- package/dist/charts/gauge.js +104 -0
- package/dist/charts/heatmap.d.ts +81 -0
- package/dist/charts/heatmap.js +338 -0
- package/dist/charts/index.d.ts +12 -0
- package/dist/charts/index.js +14 -0
- package/dist/charts/line-chart.d.ts +21 -0
- package/dist/charts/line-chart.js +36 -0
- package/dist/charts/test-utils.d.ts +2 -0
- package/dist/charts/test-utils.js +38 -0
- package/dist/charts/utils.d.ts +130 -0
- package/dist/charts/utils.js +262 -0
- package/dist/components/accordion.d.ts +47 -0
- package/dist/components/accordion.js +70 -0
- package/dist/components/activity-timeline.d.ts +149 -0
- package/dist/components/activity-timeline.js +122 -0
- package/dist/components/address-field.d.ts +116 -0
- package/dist/components/address-field.js +219 -0
- package/dist/components/alert-dialog.d.ts +99 -0
- package/dist/components/alert-dialog.js +192 -0
- package/dist/components/alert.d.ts +42 -0
- package/dist/components/alert.js +82 -0
- package/dist/components/app-shell.d.ts +159 -0
- package/dist/components/app-shell.js +289 -0
- package/dist/components/attachment-list.d.ts +96 -0
- package/dist/components/attachment-list.js +196 -0
- package/dist/components/audit-log.d.ts +150 -0
- package/dist/components/audit-log.js +205 -0
- package/dist/components/avatar.d.ts +87 -0
- package/dist/components/avatar.js +126 -0
- package/dist/components/badge.d.ts +41 -0
- package/dist/components/badge.js +68 -0
- package/dist/components/breadcrumb.d.ts +78 -0
- package/dist/components/breadcrumb.js +106 -0
- package/dist/components/button-group.d.ts +52 -0
- package/dist/components/button-group.js +77 -0
- package/dist/components/button.d.ts +58 -0
- package/dist/components/button.js +107 -0
- package/dist/components/calendar.d.ts +240 -0
- package/dist/components/calendar.js +483 -0
- package/dist/components/card.d.ts +66 -0
- package/dist/components/card.js +76 -0
- package/dist/components/carousel.d.ts +170 -0
- package/dist/components/carousel.js +348 -0
- package/dist/components/checkbox.d.ts +78 -0
- package/dist/components/checkbox.js +138 -0
- package/dist/components/color-picker.d.ts +112 -0
- package/dist/components/color-picker.js +235 -0
- package/dist/components/combobox.d.ts +136 -0
- package/dist/components/combobox.js +294 -0
- package/dist/components/command.d.ts +275 -0
- package/dist/components/command.js +493 -0
- package/dist/components/comment-thread.d.ts +252 -0
- package/dist/components/comment-thread.js +449 -0
- package/dist/components/context-menu.d.ts +77 -0
- package/dist/components/context-menu.js +82 -0
- package/dist/components/currency-input.d.ts +43 -0
- package/dist/components/currency-input.js +85 -0
- package/dist/components/date-picker.d.ts +141 -0
- package/dist/components/date-picker.js +241 -0
- package/dist/components/date-range-picker.d.ts +91 -0
- package/dist/components/date-range-picker.js +251 -0
- package/dist/components/description-list.d.ts +92 -0
- package/dist/components/description-list.js +42 -0
- package/dist/components/dialog.d.ts +139 -0
- package/dist/components/dialog.js +185 -0
- package/dist/components/dropdown-menu.d.ts +100 -0
- package/dist/components/dropdown-menu.js +102 -0
- package/dist/components/editor-layout.d.ts +166 -0
- package/dist/components/editor-layout.js +237 -0
- package/dist/components/empty-state.d.ts +49 -0
- package/dist/components/empty-state.js +68 -0
- package/dist/components/entity-card.d.ts +83 -0
- package/dist/components/entity-card.js +92 -0
- package/dist/components/file-upload.d.ts +256 -0
- package/dist/components/file-upload.js +490 -0
- package/dist/components/formatted-input.d.ts +177 -0
- package/dist/components/formatted-input.js +399 -0
- package/dist/components/hierarchy-chart.d.ts +190 -0
- package/dist/components/hierarchy-chart.js +890 -0
- package/dist/components/hover-card.d.ts +21 -0
- package/dist/components/hover-card.js +32 -0
- package/dist/components/iban-input.d.ts +38 -0
- package/dist/components/iban-input.js +112 -0
- package/dist/components/id-input.d.ts +65 -0
- package/dist/components/id-input.js +130 -0
- package/dist/components/image.d.ts +130 -0
- package/dist/components/image.js +168 -0
- package/dist/components/input-otp.d.ts +62 -0
- package/dist/components/input-otp.js +73 -0
- package/dist/components/input.d.ts +141 -0
- package/dist/components/input.js +187 -0
- package/dist/components/item.d.ts +96 -0
- package/dist/components/item.js +113 -0
- package/dist/components/kbd.d.ts +64 -0
- package/dist/components/kbd.js +119 -0
- package/dist/components/list-layout.d.ts +144 -0
- package/dist/components/list-layout.js +210 -0
- package/dist/components/native-select.d.ts +33 -0
- package/dist/components/native-select.js +48 -0
- package/dist/components/navigation-menu.d.ts +127 -0
- package/dist/components/navigation-menu.js +129 -0
- package/dist/components/notification-center.d.ts +164 -0
- package/dist/components/notification-center.js +399 -0
- package/dist/components/page-header.d.ts +60 -0
- package/dist/components/page-header.js +60 -0
- package/dist/components/pagination.d.ts +121 -0
- package/dist/components/pagination.js +174 -0
- package/dist/components/phone-input.d.ts +49 -0
- package/dist/components/phone-input.js +266 -0
- package/dist/components/popover.d.ts +38 -0
- package/dist/components/popover.js +69 -0
- package/dist/components/progress.d.ts +79 -0
- package/dist/components/progress.js +97 -0
- package/dist/components/radio-group.d.ts +43 -0
- package/dist/components/radio-group.js +81 -0
- package/dist/components/record-detail-layout.d.ts +167 -0
- package/dist/components/record-detail-layout.js +233 -0
- package/dist/components/record-picker.d.ts +199 -0
- package/dist/components/record-picker.js +650 -0
- package/dist/components/resizable.d.ts +50 -0
- package/dist/components/resizable.js +88 -0
- package/dist/components/scroll-area.d.ts +40 -0
- package/dist/components/scroll-area.js +56 -0
- package/dist/components/select.d.ts +126 -0
- package/dist/components/select.js +137 -0
- package/dist/components/separator.d.ts +31 -0
- package/dist/components/separator.js +41 -0
- package/dist/components/settings-layout.d.ts +134 -0
- package/dist/components/settings-layout.js +180 -0
- package/dist/components/sheet.d.ts +103 -0
- package/dist/components/sheet.js +165 -0
- package/dist/components/sidebar.d.ts +171 -0
- package/dist/components/sidebar.js +421 -0
- package/dist/components/signature-pad.d.ts +85 -0
- package/dist/components/signature-pad.js +283 -0
- package/dist/components/skeleton.d.ts +64 -0
- package/dist/components/skeleton.js +53 -0
- package/dist/components/slider.d.ts +57 -0
- package/dist/components/slider.js +133 -0
- package/dist/components/slug-input.d.ts +69 -0
- package/dist/components/slug-input.js +201 -0
- package/dist/components/sparkline.d.ts +54 -0
- package/dist/components/sparkline.js +122 -0
- package/dist/components/spinner.d.ts +34 -0
- package/dist/components/spinner.js +34 -0
- package/dist/components/stat.d.ts +135 -0
- package/dist/components/stat.js +130 -0
- package/dist/components/status-picker.d.ts +107 -0
- package/dist/components/status-picker.js +175 -0
- package/dist/components/stepper.d.ts +86 -0
- package/dist/components/stepper.js +103 -0
- package/dist/components/switch.d.ts +34 -0
- package/dist/components/switch.js +70 -0
- package/dist/components/table.d.ts +101 -0
- package/dist/components/table.js +72 -0
- package/dist/components/tabs.d.ts +103 -0
- package/dist/components/tabs.js +173 -0
- package/dist/components/tag-input.d.ts +77 -0
- package/dist/components/tag-input.js +305 -0
- package/dist/components/task-list.d.ts +89 -0
- package/dist/components/task-list.js +238 -0
- package/dist/components/time-picker.d.ts +119 -0
- package/dist/components/time-picker.js +399 -0
- package/dist/components/toast.d.ts +87 -0
- package/dist/components/toast.js +142 -0
- package/dist/components/toggle.d.ts +77 -0
- package/dist/components/toggle.js +109 -0
- package/dist/components/tooltip.d.ts +69 -0
- package/dist/components/tooltip.js +105 -0
- package/dist/components/top-bar.d.ts +87 -0
- package/dist/components/top-bar.js +99 -0
- package/dist/components/tree-select.d.ts +89 -0
- package/dist/components/tree-select.js +243 -0
- package/dist/components/tree-view.d.ts +109 -0
- package/dist/components/tree-view.js +170 -0
- package/dist/components/typography.d.ts +107 -0
- package/dist/components/typography.js +128 -0
- package/dist/components/user-picker.d.ts +89 -0
- package/dist/components/user-picker.js +162 -0
- package/dist/components/version-history.d.ts +191 -0
- package/dist/components/version-history.js +431 -0
- package/dist/data-table/csv.d.ts +27 -0
- package/dist/data-table/csv.js +68 -0
- package/dist/data-table/data-table.d.ts +423 -0
- package/dist/data-table/data-table.js +1259 -0
- package/dist/data-table/filter-bar.d.ts +146 -0
- package/dist/data-table/filter-bar.js +569 -0
- package/dist/data-table/filter-fns.d.ts +65 -0
- package/dist/data-table/filter-fns.js +382 -0
- package/dist/data-table/index.d.ts +8 -0
- package/dist/data-table/index.js +9 -0
- package/dist/data-table/saved-views.d.ts +100 -0
- package/dist/data-table/saved-views.js +251 -0
- package/dist/data-table/types.d.ts +168 -0
- package/dist/data-table/types.js +87 -0
- package/dist/data-table/url-state.d.ts +94 -0
- package/dist/data-table/url-state.js +303 -0
- package/dist/data-table/view-state.d.ts +16 -0
- package/dist/data-table/view-state.js +81 -0
- package/dist/editor/_test-setup.d.ts +1 -0
- package/dist/editor/_test-setup.js +33 -0
- package/dist/editor/block-editor.d.ts +137 -0
- package/dist/editor/block-editor.js +280 -0
- package/dist/editor/commands.d.ts +31 -0
- package/dist/editor/commands.js +150 -0
- package/dist/editor/context.d.ts +108 -0
- package/dist/editor/context.js +30 -0
- package/dist/editor/convert.d.ts +66 -0
- package/dist/editor/convert.js +567 -0
- package/dist/editor/drag-handle.d.ts +10 -0
- package/dist/editor/drag-handle.js +69 -0
- package/dist/editor/extensions.d.ts +34 -0
- package/dist/editor/extensions.js +239 -0
- package/dist/editor/index.d.ts +14 -0
- package/dist/editor/index.js +17 -0
- package/dist/editor/inserter.d.ts +12 -0
- package/dist/editor/inserter.js +88 -0
- package/dist/editor/inspector.d.ts +17 -0
- package/dist/editor/inspector.js +65 -0
- package/dist/editor/items.d.ts +62 -0
- package/dist/editor/items.js +195 -0
- package/dist/editor/labels.d.ts +119 -0
- package/dist/editor/labels.js +130 -0
- package/dist/editor/markdown.d.ts +14 -0
- package/dist/editor/markdown.js +209 -0
- package/dist/editor/menus.d.ts +20 -0
- package/dist/editor/menus.js +236 -0
- package/dist/editor/nodes.d.ts +14 -0
- package/dist/editor/nodes.js +201 -0
- package/dist/editor/outline.d.ts +11 -0
- package/dist/editor/outline.js +52 -0
- package/dist/editor/schema-form.d.ts +64 -0
- package/dist/editor/schema-form.js +290 -0
- package/dist/editor/slash-menu.d.ts +15 -0
- package/dist/editor/slash-menu.js +119 -0
- package/dist/fonts/catalog.d.ts +53 -0
- package/dist/fonts/catalog.js +121 -0
- package/dist/fonts/font-picker.d.ts +70 -0
- package/dist/fonts/font-picker.js +225 -0
- package/dist/fonts/index.d.ts +6 -0
- package/dist/fonts/index.js +7 -0
- package/dist/fonts/loader.d.ts +66 -0
- package/dist/fonts/loader.js +161 -0
- package/dist/fonts/pairing-picker.d.ts +31 -0
- package/dist/fonts/pairing-picker.js +81 -0
- package/dist/fonts/pairings.d.ts +84 -0
- package/dist/fonts/pairings.js +149 -0
- package/dist/fonts/provider.d.ts +34 -0
- package/dist/fonts/provider.js +51 -0
- package/dist/form/index.d.ts +1 -0
- package/dist/form/index.js +1 -0
- package/dist/format/core.d.ts +149 -0
- package/dist/format/core.js +357 -0
- package/dist/format/index.d.ts +4 -0
- package/dist/format/index.js +5 -0
- package/dist/format/use-format.d.ts +1 -0
- package/dist/format/use-format.js +3 -0
- package/dist/index.d.ts +86 -0
- package/dist/index.js +87 -0
- package/dist/lib/cn.d.ts +3 -0
- package/dist/lib/cn.js +16 -0
- package/dist/lib/color.d.ts +64 -0
- package/dist/lib/color.js +177 -0
- package/dist/lib/compose-refs.d.ts +24 -0
- package/dist/lib/compose-refs.js +45 -0
- package/dist/lib/data-islands.d.ts +194 -0
- package/dist/lib/data-islands.js +368 -0
- package/dist/lib/date.d.ts +129 -0
- package/dist/lib/date.js +386 -0
- package/dist/lib/field-context.d.ts +64 -0
- package/dist/lib/field-context.js +62 -0
- package/dist/lib/floating-arrow.d.ts +18 -0
- package/dist/lib/floating-arrow.js +15 -0
- package/dist/lib/islands.d.ts +38 -0
- package/dist/lib/islands.js +40 -0
- package/dist/lib/labels.d.ts +51 -0
- package/dist/lib/labels.js +56 -0
- package/dist/lib/layer.d.ts +36 -0
- package/dist/lib/layer.js +42 -0
- package/dist/lib/locale.d.ts +85 -0
- package/dist/lib/locale.js +105 -0
- package/dist/lib/menu.d.ts +58 -0
- package/dist/lib/menu.js +99 -0
- package/dist/lib/message-format.d.ts +20 -0
- package/dist/lib/message-format.js +116 -0
- package/dist/lib/nav.d.ts +132 -0
- package/dist/lib/nav.js +178 -0
- package/dist/lib/provider.d.ts +100 -0
- package/dist/lib/provider.js +105 -0
- package/dist/lib/public.d.ts +22 -0
- package/dist/lib/public.js +33 -0
- package/dist/lib/sr-name.d.ts +18 -0
- package/dist/lib/sr-name.js +17 -0
- package/dist/lib/text.d.ts +100 -0
- package/dist/lib/text.js +233 -0
- package/dist/lib/theme-scope.d.ts +58 -0
- package/dist/lib/theme-scope.js +59 -0
- package/dist/lib/use-async-list.d.ts +60 -0
- package/dist/lib/use-async-list.js +119 -0
- package/dist/lib/use-container-width.d.ts +19 -0
- package/dist/lib/use-container-width.js +39 -0
- package/dist/lib/use-controllable-state.d.ts +33 -0
- package/dist/lib/use-controllable-state.js +56 -0
- package/dist/lib/use-edge-fade.d.ts +13 -0
- package/dist/lib/use-edge-fade.js +43 -0
- package/dist/lib/use-formatted-input.d.ts +69 -0
- package/dist/lib/use-formatted-input.js +152 -0
- package/dist/lib/use-hotkeys.d.ts +80 -0
- package/dist/lib/use-hotkeys.js +221 -0
- package/dist/lib/use-hover-intent.d.ts +44 -0
- package/dist/lib/use-hover-intent.js +119 -0
- package/dist/lib/use-media-query.d.ts +21 -0
- package/dist/lib/use-media-query.js +28 -0
- package/dist/lib/use-reduced-motion.d.ts +8 -0
- package/dist/lib/use-reduced-motion.js +13 -0
- package/dist/lib/use-tree.d.ts +153 -0
- package/dist/lib/use-tree.js +534 -0
- package/dist/lib/value-format.d.ts +25 -0
- package/dist/lib/value-format.js +56 -0
- package/dist/lib/variants.d.ts +131 -0
- package/dist/lib/variants.js +109 -0
- package/dist/locale-data/core/date.d.ts +24 -0
- package/dist/locale-data/core/date.js +68 -0
- package/dist/locale-data/core/decimal.d.ts +19 -0
- package/dist/locale-data/core/decimal.js +79 -0
- package/dist/locale-data/core/holidays.d.ts +30 -0
- package/dist/locale-data/core/holidays.js +79 -0
- package/dist/locale-data/core/iban.d.ts +29 -0
- package/dist/locale-data/core/iban.js +74 -0
- package/dist/locale-data/core/index.d.ts +7 -0
- package/dist/locale-data/core/index.js +6 -0
- package/dist/locale-data/core/types.d.ts +173 -0
- package/dist/locale-data/core/types.js +6 -0
- package/dist/locale-data/core/week-info.d.ts +23 -0
- package/dist/locale-data/core/week-info.js +85 -0
- package/dist/locale-data/core/working-days.d.ts +27 -0
- package/dist/locale-data/core/working-days.js +133 -0
- package/dist/locale-data/index.d.ts +2 -0
- package/dist/locale-data/index.js +4 -0
- package/dist/locale-data/tr/address-tr.json +1 -0
- package/dist/locale-data/tr/address.d.ts +23 -0
- package/dist/locale-data/tr/address.js +52 -0
- package/dist/locale-data/tr/holidays.d.ts +31 -0
- package/dist/locale-data/tr/holidays.js +81 -0
- package/dist/locale-data/tr/iban.d.ts +21 -0
- package/dist/locale-data/tr/iban.js +45 -0
- package/dist/locale-data/tr/id.d.ts +36 -0
- package/dist/locale-data/tr/id.js +120 -0
- package/dist/locale-data/tr/index.d.ts +12 -0
- package/dist/locale-data/tr/index.js +33 -0
- package/dist/locale-data/tr/kdv.d.ts +91 -0
- package/dist/locale-data/tr/kdv.js +222 -0
- package/dist/locales/en.d.ts +2102 -0
- package/dist/locales/en.js +2088 -0
- package/dist/locales/tr.d.ts +2086 -0
- package/dist/locales/tr.js +2087 -0
- package/dist/media/focal-point.d.ts +42 -0
- package/dist/media/focal-point.js +96 -0
- package/dist/media/gallery-layout.d.ts +19 -0
- package/dist/media/gallery-layout.js +61 -0
- package/dist/media/gallery.d.ts +64 -0
- package/dist/media/gallery.js +138 -0
- package/dist/media/image-cropper.d.ts +86 -0
- package/dist/media/image-cropper.js +170 -0
- package/dist/media/image-field.d.ts +115 -0
- package/dist/media/image-field.js +212 -0
- package/dist/media/index.d.ts +19 -0
- package/dist/media/index.js +23 -0
- package/dist/media/lightbox.d.ts +82 -0
- package/dist/media/lightbox.js +171 -0
- package/dist/media/link-preview.d.ts +97 -0
- package/dist/media/link-preview.js +177 -0
- package/dist/media/media-library.d.ts +244 -0
- package/dist/media/media-library.js +776 -0
- package/dist/media/media-picker.d.ts +96 -0
- package/dist/media/media-picker.js +209 -0
- package/dist/media/media-provider.d.ts +23 -0
- package/dist/media/media-provider.js +44 -0
- package/dist/media/media-utils.d.ts +39 -0
- package/dist/media/media-utils.js +145 -0
- package/dist/media/memory-adapter.d.ts +22 -0
- package/dist/media/memory-adapter.js +162 -0
- package/dist/media/rest-adapter.d.ts +90 -0
- package/dist/media/rest-adapter.js +208 -0
- package/dist/media/serp.d.ts +62 -0
- package/dist/media/serp.js +108 -0
- package/dist/media/test-fixtures.d.ts +3 -0
- package/dist/media/test-fixtures.js +37 -0
- package/dist/media/types.d.ts +183 -0
- package/dist/media/types.js +3 -0
- package/dist/media/use-pan-zoom.d.ts +51 -0
- package/dist/media/use-pan-zoom.js +156 -0
- package/dist/media/use-upload-queue.d.ts +64 -0
- package/dist/media/use-upload-queue.js +115 -0
- package/dist/media/video-player.d.ts +135 -0
- package/dist/media/video-player.js +319 -0
- package/dist/next/index.d.ts +42 -0
- package/dist/next/index.js +36 -0
- package/dist/render/block-renderer.d.ts +56 -0
- package/dist/render/block-renderer.js +137 -0
- package/dist/render/index.d.ts +6 -0
- package/dist/render/index.js +7 -0
- package/dist/render/prepare.d.ts +61 -0
- package/dist/render/prepare.js +119 -0
- package/dist/scheduler/core/duration.d.ts +83 -0
- package/dist/scheduler/core/duration.js +174 -0
- package/dist/scheduler/core/gantt.d.ts +63 -0
- package/dist/scheduler/core/gantt.js +226 -0
- package/dist/scheduler/core/index.d.ts +6 -0
- package/dist/scheduler/core/index.js +7 -0
- package/dist/scheduler/core/layout.d.ts +97 -0
- package/dist/scheduler/core/layout.js +249 -0
- package/dist/scheduler/core/time-scale.d.ts +89 -0
- package/dist/scheduler/core/time-scale.js +173 -0
- package/dist/scheduler/gantt.d.ts +125 -0
- package/dist/scheduler/gantt.js +532 -0
- package/dist/scheduler/index.d.ts +6 -0
- package/dist/scheduler/index.js +7 -0
- package/dist/scheduler/resource-calendar.d.ts +218 -0
- package/dist/scheduler/resource-calendar.js +661 -0
- package/dist/scheduler/scheduler.d.ts +168 -0
- package/dist/scheduler/scheduler.js +768 -0
- package/dist/scheduler/shared.d.ts +63 -0
- package/dist/scheduler/shared.js +145 -0
- package/dist/scheduler/time-tracker.d.ts +138 -0
- package/dist/scheduler/time-tracker.js +403 -0
- package/dist/sortable/core.d.ts +67 -0
- package/dist/sortable/core.js +167 -0
- package/dist/sortable/index.d.ts +8 -0
- package/dist/sortable/index.js +10 -0
- package/dist/sortable/kanban-core.d.ts +70 -0
- package/dist/sortable/kanban-core.js +67 -0
- package/dist/sortable/kanban.d.ts +147 -0
- package/dist/sortable/kanban.js +472 -0
- package/dist/sortable/sortable-list.d.ts +71 -0
- package/dist/sortable/sortable-list.js +76 -0
- package/dist/sortable/sortable-tree.d.ts +101 -0
- package/dist/sortable/sortable-tree.js +450 -0
- package/dist/sortable/sortable.d.ts +188 -0
- package/dist/sortable/sortable.js +485 -0
- package/dist/sortable/use-pointer-drag.d.ts +75 -0
- package/dist/sortable/use-pointer-drag.js +173 -0
- package/dist/sortable/use-time-scale.d.ts +11 -0
- package/dist/sortable/use-time-scale.js +19 -0
- package/dist/styles/base.css +51 -0
- package/dist/styles/blocks.css +949 -0
- package/dist/styles/calendar.css +642 -0
- package/dist/styles/charts.css +264 -0
- package/dist/styles/data.css +474 -0
- package/dist/styles/editors.css +1022 -0
- package/dist/styles/forms.css +406 -0
- package/dist/styles/media.css +515 -0
- package/dist/styles/navigation.css +293 -0
- package/dist/styles/overlays.css +244 -0
- package/dist/styles.css +742 -0
- package/package.json +156 -4
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// Localized<T>: one value, or one value per locale. Plain strings stay valid, so single-locale
|
|
2
|
+
// and hand-written sites never see locale maps. No React, no zod — safe anywhere.
|
|
3
|
+
export const LOCALE_KEY_RE = /^[a-z]{2,3}(-[A-Za-z0-9]{2,8})*$/;
|
|
4
|
+
/** True when `value` is a locale map (`{ en: …, tr: … }`) rather than a value of T. */
|
|
5
|
+
export function isLocaleMap(value) {
|
|
6
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
7
|
+
return false;
|
|
8
|
+
const keys = Object.keys(value);
|
|
9
|
+
return keys.length > 0 && keys.every((k) => LOCALE_KEY_RE.test(k));
|
|
10
|
+
}
|
|
11
|
+
const isEmpty = (v) => v === undefined || v === null || v === "";
|
|
12
|
+
const base = (l) => l.split("-")[0].toLowerCase();
|
|
13
|
+
/** The locale chain used by `pickLocale`: exact → base language → each fallback (exact → base). */
|
|
14
|
+
export function localeChain(locale, fallback = ["en"]) {
|
|
15
|
+
const out = [];
|
|
16
|
+
for (const l of [locale, ...fallback])
|
|
17
|
+
for (const c of [l, base(l)])
|
|
18
|
+
if (!out.includes(c))
|
|
19
|
+
out.push(c);
|
|
20
|
+
return out;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Picks one locale from a `Localized<T>` value. Deterministic: exact locale → its base language →
|
|
24
|
+
* each fallback → the first non-empty value in insertion order. Empty strings count as missing.
|
|
25
|
+
*
|
|
26
|
+
* ```ts
|
|
27
|
+
* pickLocale({ en: "Book a table", tr: "Masa ayırtın" }, "tr-TR"); // "Masa ayırtın"
|
|
28
|
+
* pickLocale("Book a table", "tr"); // "Book a table"
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export function pickLocale(value, locale, opts = {}) {
|
|
32
|
+
if (!isLocaleMap(value))
|
|
33
|
+
return value;
|
|
34
|
+
const map = value;
|
|
35
|
+
const lower = {};
|
|
36
|
+
for (const k in map)
|
|
37
|
+
lower[k.toLowerCase()] = map[k];
|
|
38
|
+
for (const l of localeChain(locale, opts.fallback ?? ["en"])) {
|
|
39
|
+
const v = lower[l.toLowerCase()];
|
|
40
|
+
if (!isEmpty(v))
|
|
41
|
+
return v;
|
|
42
|
+
}
|
|
43
|
+
for (const k in map)
|
|
44
|
+
if (!isEmpty(map[k]))
|
|
45
|
+
return map[k];
|
|
46
|
+
return Object.values(map)[0];
|
|
47
|
+
}
|
|
48
|
+
/** Locales present (non-empty) in a localized value. A plain value counts as every locale. */
|
|
49
|
+
export function localesOf(value) {
|
|
50
|
+
if (!isLocaleMap(value))
|
|
51
|
+
return "all";
|
|
52
|
+
return Object.keys(value).filter((k) => !isEmpty(value[k]));
|
|
53
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { BlockNode, VamosDoc } from "./types.js";
|
|
2
|
+
import type { AnyBlockDefinition, BlockRegistry } from "./define-block.js";
|
|
3
|
+
export interface MigrationResult {
|
|
4
|
+
node: BlockNode;
|
|
5
|
+
from: number;
|
|
6
|
+
to: number;
|
|
7
|
+
migrated: boolean;
|
|
8
|
+
/** Stored with a newer schema than this definition knows: rendered as-is, never downgraded. */
|
|
9
|
+
newer?: boolean;
|
|
10
|
+
error?: Error;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Runs `def.migrate[n]` for every step from the node's `v` (default 1) to `def.version`.
|
|
14
|
+
* A failing step leaves the node untouched and reports the error — content is never dropped.
|
|
15
|
+
*/
|
|
16
|
+
export declare function migrateNode(node: BlockNode, def: AnyBlockDefinition): MigrationResult;
|
|
17
|
+
/** Document-format migrations: `docMigrations[n]` upgrades a doc from version n to n + 1. */
|
|
18
|
+
export declare const docMigrations: Record<number, (doc: Record<string, unknown>) => Record<string, unknown>>;
|
|
19
|
+
export declare const CURRENT_DOC_VERSION = 1;
|
|
20
|
+
/**
|
|
21
|
+
* Brings any stored doc to the current format and every block to its current version.
|
|
22
|
+
* Accepts the plan-06 shape `{ v: 1 }` as an alias of `{ version: 1 }`.
|
|
23
|
+
*/
|
|
24
|
+
export declare function migrateDoc(input: unknown, registry?: BlockRegistry, onResult?: (r: MigrationResult) => void): VamosDoc;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// Schema evolution: block props migrate on read (v1 → v2 → …), docs migrate by `version`.
|
|
2
|
+
/**
|
|
3
|
+
* Runs `def.migrate[n]` for every step from the node's `v` (default 1) to `def.version`.
|
|
4
|
+
* A failing step leaves the node untouched and reports the error — content is never dropped.
|
|
5
|
+
*/
|
|
6
|
+
export function migrateNode(node, def) {
|
|
7
|
+
const from = node.v ?? 1;
|
|
8
|
+
const to = def.version;
|
|
9
|
+
if (from === to)
|
|
10
|
+
return { node, from, to, migrated: false };
|
|
11
|
+
if (from > to)
|
|
12
|
+
return { node, from, to, migrated: false, newer: true };
|
|
13
|
+
let props = node.props ?? {};
|
|
14
|
+
try {
|
|
15
|
+
for (let n = from; n < to; n++) {
|
|
16
|
+
const step = def.migrate?.[n];
|
|
17
|
+
if (!step)
|
|
18
|
+
throw new Error(`No migration for "${def.type}" v${n} → v${n + 1}.`);
|
|
19
|
+
props = step(props, node);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
return { node, from, to, migrated: false, error: error instanceof Error ? error : new Error(String(error)) };
|
|
24
|
+
}
|
|
25
|
+
return { node: { ...node, v: to, props: props }, from, to, migrated: true };
|
|
26
|
+
}
|
|
27
|
+
/** Document-format migrations: `docMigrations[n]` upgrades a doc from version n to n + 1. */
|
|
28
|
+
export const docMigrations = {};
|
|
29
|
+
export const CURRENT_DOC_VERSION = 1;
|
|
30
|
+
function migrateList(list, registry, onResult) {
|
|
31
|
+
if (!list)
|
|
32
|
+
return list;
|
|
33
|
+
return list.map((node) => {
|
|
34
|
+
let next = node;
|
|
35
|
+
const def = registry?.get(node.type);
|
|
36
|
+
if (def) {
|
|
37
|
+
const r = migrateNode(node, def);
|
|
38
|
+
onResult?.(r);
|
|
39
|
+
next = r.node;
|
|
40
|
+
}
|
|
41
|
+
if (next.slots)
|
|
42
|
+
next = { ...next, slots: Object.fromEntries(Object.entries(next.slots).map(([k, v]) => [k, migrateList(v, registry, onResult)])) };
|
|
43
|
+
return next;
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Brings any stored doc to the current format and every block to its current version.
|
|
48
|
+
* Accepts the plan-06 shape `{ v: 1 }` as an alias of `{ version: 1 }`.
|
|
49
|
+
*/
|
|
50
|
+
export function migrateDoc(input, registry, onResult) {
|
|
51
|
+
if (!input || typeof input !== "object")
|
|
52
|
+
throw new TypeError("migrateDoc: expected a document object.");
|
|
53
|
+
let doc = { ...input };
|
|
54
|
+
if (doc.version === undefined && typeof doc.v === "number") {
|
|
55
|
+
doc.version = doc.v;
|
|
56
|
+
delete doc.v;
|
|
57
|
+
}
|
|
58
|
+
let version = typeof doc.version === "number" ? doc.version : 1;
|
|
59
|
+
while (version < CURRENT_DOC_VERSION) {
|
|
60
|
+
const step = docMigrations[version];
|
|
61
|
+
if (!step)
|
|
62
|
+
throw new Error(`No document migration from version ${version}.`);
|
|
63
|
+
doc = step(doc);
|
|
64
|
+
version++;
|
|
65
|
+
}
|
|
66
|
+
doc.version = CURRENT_DOC_VERSION;
|
|
67
|
+
const d = doc;
|
|
68
|
+
return {
|
|
69
|
+
...d,
|
|
70
|
+
blocks: migrateList(d.blocks ?? [], registry, onResult),
|
|
71
|
+
...(d.layout
|
|
72
|
+
? { layout: { header: migrateList(d.layout.header, registry, onResult), footer: migrateList(d.layout.footer, registry, onResult), overlay: migrateList(d.layout.overlay, registry, onResult) } }
|
|
73
|
+
: null),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { BlockNode, VamosDoc } from "./types.js";
|
|
3
|
+
export declare const ACCENTS: readonly ["lime", "ocean", "ember", "rose", "graphite"];
|
|
4
|
+
export declare const BlockThemeSchema: z.ZodObject<{
|
|
5
|
+
mode: z.ZodOptional<z.ZodEnum<{
|
|
6
|
+
light: "light";
|
|
7
|
+
dark: "dark";
|
|
8
|
+
inherit: "inherit";
|
|
9
|
+
}>>;
|
|
10
|
+
surface: z.ZodOptional<z.ZodEnum<{
|
|
11
|
+
accent: "accent";
|
|
12
|
+
media: "media";
|
|
13
|
+
surface: "surface";
|
|
14
|
+
scene: "scene";
|
|
15
|
+
"surface-2": "surface-2";
|
|
16
|
+
}>>;
|
|
17
|
+
accent: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
|
|
18
|
+
lime: "lime";
|
|
19
|
+
ocean: "ocean";
|
|
20
|
+
ember: "ember";
|
|
21
|
+
rose: "rose";
|
|
22
|
+
graphite: "graphite";
|
|
23
|
+
}>, z.ZodString]>>;
|
|
24
|
+
material: z.ZodOptional<z.ZodEnum<{
|
|
25
|
+
glass: "glass";
|
|
26
|
+
solid: "solid";
|
|
27
|
+
inherit: "inherit";
|
|
28
|
+
}>>;
|
|
29
|
+
density: z.ZodOptional<z.ZodEnum<{
|
|
30
|
+
compact: "compact";
|
|
31
|
+
comfortable: "comfortable";
|
|
32
|
+
inherit: "inherit";
|
|
33
|
+
}>>;
|
|
34
|
+
rhythm: z.ZodOptional<z.ZodEnum<{
|
|
35
|
+
normal: "normal";
|
|
36
|
+
loose: "loose";
|
|
37
|
+
tight: "tight";
|
|
38
|
+
}>>;
|
|
39
|
+
background: z.ZodOptional<z.ZodObject<{
|
|
40
|
+
src: z.ZodString;
|
|
41
|
+
alt: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>>;
|
|
42
|
+
width: z.ZodNumber;
|
|
43
|
+
height: z.ZodNumber;
|
|
44
|
+
blurDataURL: z.ZodOptional<z.ZodString>;
|
|
45
|
+
focal: z.ZodOptional<z.ZodObject<{
|
|
46
|
+
x: z.ZodNumber;
|
|
47
|
+
y: z.ZodNumber;
|
|
48
|
+
}, z.core.$strip>>;
|
|
49
|
+
decorative: z.ZodOptional<z.ZodBoolean>;
|
|
50
|
+
assetId: z.ZodOptional<z.ZodString>;
|
|
51
|
+
}, z.core.$strip>>;
|
|
52
|
+
}, z.core.$strip>;
|
|
53
|
+
/** Ids: 4–64 chars of `[A-Za-z0-9_-]` (`b_7Hq2`, nanoid, uuid all fit). */
|
|
54
|
+
export declare const BlockIdSchema: z.ZodString;
|
|
55
|
+
export declare const BlockTypeSchema: z.ZodString;
|
|
56
|
+
export declare const AnchorSchema: z.ZodString;
|
|
57
|
+
export declare const ScheduleSchema: z.ZodObject<{
|
|
58
|
+
from: z.ZodOptional<z.ZodISODateTime>;
|
|
59
|
+
until: z.ZodOptional<z.ZodISODateTime>;
|
|
60
|
+
}, z.core.$strip>;
|
|
61
|
+
/** Common node fields; `props` stays `unknown` here — `registry.nodeSchema()` narrows it per type. */
|
|
62
|
+
export declare const blockNodeBase: {
|
|
63
|
+
id: z.ZodString;
|
|
64
|
+
type: z.ZodString;
|
|
65
|
+
v: z.ZodOptional<z.ZodNumber>;
|
|
66
|
+
variant: z.ZodOptional<z.ZodString>;
|
|
67
|
+
content: z.ZodOptional<z.ZodArray<z.ZodType<import("./rich-doc.js").RichInline, unknown, z.core.$ZodTypeInternals<import("./rich-doc.js").RichInline, unknown>>>>;
|
|
68
|
+
theme: z.ZodOptional<z.ZodObject<{
|
|
69
|
+
mode: z.ZodOptional<z.ZodEnum<{
|
|
70
|
+
light: "light";
|
|
71
|
+
dark: "dark";
|
|
72
|
+
inherit: "inherit";
|
|
73
|
+
}>>;
|
|
74
|
+
surface: z.ZodOptional<z.ZodEnum<{
|
|
75
|
+
accent: "accent";
|
|
76
|
+
media: "media";
|
|
77
|
+
surface: "surface";
|
|
78
|
+
scene: "scene";
|
|
79
|
+
"surface-2": "surface-2";
|
|
80
|
+
}>>;
|
|
81
|
+
accent: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
|
|
82
|
+
lime: "lime";
|
|
83
|
+
ocean: "ocean";
|
|
84
|
+
ember: "ember";
|
|
85
|
+
rose: "rose";
|
|
86
|
+
graphite: "graphite";
|
|
87
|
+
}>, z.ZodString]>>;
|
|
88
|
+
material: z.ZodOptional<z.ZodEnum<{
|
|
89
|
+
glass: "glass";
|
|
90
|
+
solid: "solid";
|
|
91
|
+
inherit: "inherit";
|
|
92
|
+
}>>;
|
|
93
|
+
density: z.ZodOptional<z.ZodEnum<{
|
|
94
|
+
compact: "compact";
|
|
95
|
+
comfortable: "comfortable";
|
|
96
|
+
inherit: "inherit";
|
|
97
|
+
}>>;
|
|
98
|
+
rhythm: z.ZodOptional<z.ZodEnum<{
|
|
99
|
+
normal: "normal";
|
|
100
|
+
loose: "loose";
|
|
101
|
+
tight: "tight";
|
|
102
|
+
}>>;
|
|
103
|
+
background: z.ZodOptional<z.ZodObject<{
|
|
104
|
+
src: z.ZodString;
|
|
105
|
+
alt: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>>;
|
|
106
|
+
width: z.ZodNumber;
|
|
107
|
+
height: z.ZodNumber;
|
|
108
|
+
blurDataURL: z.ZodOptional<z.ZodString>;
|
|
109
|
+
focal: z.ZodOptional<z.ZodObject<{
|
|
110
|
+
x: z.ZodNumber;
|
|
111
|
+
y: z.ZodNumber;
|
|
112
|
+
}, z.core.$strip>>;
|
|
113
|
+
decorative: z.ZodOptional<z.ZodBoolean>;
|
|
114
|
+
assetId: z.ZodOptional<z.ZodString>;
|
|
115
|
+
}, z.core.$strip>>;
|
|
116
|
+
}, z.core.$strip>>;
|
|
117
|
+
anchor: z.ZodOptional<z.ZodString>;
|
|
118
|
+
hidden: z.ZodOptional<z.ZodBoolean>;
|
|
119
|
+
schedule: z.ZodOptional<z.ZodObject<{
|
|
120
|
+
from: z.ZodOptional<z.ZodISODateTime>;
|
|
121
|
+
until: z.ZodOptional<z.ZodISODateTime>;
|
|
122
|
+
}, z.core.$strip>>;
|
|
123
|
+
};
|
|
124
|
+
/** Storage-level node schema (any type, props unchecked). */
|
|
125
|
+
export declare const BlockNodeSchema: z.ZodType<BlockNode>;
|
|
126
|
+
export declare const SeoMetaSchema: z.ZodObject<{
|
|
127
|
+
title: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>>;
|
|
128
|
+
description: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>>;
|
|
129
|
+
image: z.ZodOptional<z.ZodObject<{
|
|
130
|
+
src: z.ZodString;
|
|
131
|
+
alt: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>>;
|
|
132
|
+
width: z.ZodNumber;
|
|
133
|
+
height: z.ZodNumber;
|
|
134
|
+
blurDataURL: z.ZodOptional<z.ZodString>;
|
|
135
|
+
focal: z.ZodOptional<z.ZodObject<{
|
|
136
|
+
x: z.ZodNumber;
|
|
137
|
+
y: z.ZodNumber;
|
|
138
|
+
}, z.core.$strip>>;
|
|
139
|
+
decorative: z.ZodOptional<z.ZodBoolean>;
|
|
140
|
+
assetId: z.ZodOptional<z.ZodString>;
|
|
141
|
+
}, z.core.$strip>>;
|
|
142
|
+
canonical: z.ZodOptional<z.ZodString>;
|
|
143
|
+
noindex: z.ZodOptional<z.ZodBoolean>;
|
|
144
|
+
}, z.core.$strip>;
|
|
145
|
+
/** Builds a VamosDoc schema around a node schema (storage-level or registry-strict). */
|
|
146
|
+
export declare function docSchemaOf(node: z.ZodType<BlockNode>): z.ZodObject<{
|
|
147
|
+
$schema: z.ZodOptional<z.ZodString>;
|
|
148
|
+
version: z.ZodLiteral<1>;
|
|
149
|
+
lang: z.ZodOptional<z.ZodString>;
|
|
150
|
+
locales: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
151
|
+
translationKey: z.ZodOptional<z.ZodString>;
|
|
152
|
+
seo: z.ZodOptional<z.ZodObject<{
|
|
153
|
+
title: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>>;
|
|
154
|
+
description: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>>;
|
|
155
|
+
image: z.ZodOptional<z.ZodObject<{
|
|
156
|
+
src: z.ZodString;
|
|
157
|
+
alt: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>>;
|
|
158
|
+
width: z.ZodNumber;
|
|
159
|
+
height: z.ZodNumber;
|
|
160
|
+
blurDataURL: z.ZodOptional<z.ZodString>;
|
|
161
|
+
focal: z.ZodOptional<z.ZodObject<{
|
|
162
|
+
x: z.ZodNumber;
|
|
163
|
+
y: z.ZodNumber;
|
|
164
|
+
}, z.core.$strip>>;
|
|
165
|
+
decorative: z.ZodOptional<z.ZodBoolean>;
|
|
166
|
+
assetId: z.ZodOptional<z.ZodString>;
|
|
167
|
+
}, z.core.$strip>>;
|
|
168
|
+
canonical: z.ZodOptional<z.ZodString>;
|
|
169
|
+
noindex: z.ZodOptional<z.ZodBoolean>;
|
|
170
|
+
}, z.core.$strip>>;
|
|
171
|
+
blocks: z.ZodArray<z.ZodType<BlockNode<Record<string, unknown>>, unknown, z.core.$ZodTypeInternals<BlockNode<Record<string, unknown>>, unknown>>>;
|
|
172
|
+
layout: z.ZodOptional<z.ZodObject<{
|
|
173
|
+
header: z.ZodOptional<z.ZodArray<z.ZodType<BlockNode<Record<string, unknown>>, unknown, z.core.$ZodTypeInternals<BlockNode<Record<string, unknown>>, unknown>>>>;
|
|
174
|
+
footer: z.ZodOptional<z.ZodArray<z.ZodType<BlockNode<Record<string, unknown>>, unknown, z.core.$ZodTypeInternals<BlockNode<Record<string, unknown>>, unknown>>>>;
|
|
175
|
+
overlay: z.ZodOptional<z.ZodArray<z.ZodType<BlockNode<Record<string, unknown>>, unknown, z.core.$ZodTypeInternals<BlockNode<Record<string, unknown>>, unknown>>>>;
|
|
176
|
+
}, z.core.$strip>>;
|
|
177
|
+
meta: z.ZodOptional<z.ZodObject<{
|
|
178
|
+
wordCount: z.ZodOptional<z.ZodNumber>;
|
|
179
|
+
readingTime: z.ZodOptional<z.ZodNumber>;
|
|
180
|
+
toc: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
181
|
+
id: z.ZodString;
|
|
182
|
+
level: z.ZodNumber;
|
|
183
|
+
text: z.ZodString;
|
|
184
|
+
}, z.core.$strip>>>;
|
|
185
|
+
}, z.core.$strip>>;
|
|
186
|
+
}, z.core.$strip>;
|
|
187
|
+
export declare const VamosDocSchema: z.ZodType<VamosDoc>;
|
|
188
|
+
export declare const PageDocSchema: z.ZodType<VamosDoc, unknown, z.core.$ZodTypeInternals<VamosDoc, unknown>>;
|
|
189
|
+
export declare const VAMOS_DOC_SCHEMA_URL = "https://ui.vamos.ist/schema/doc-1.json";
|
|
190
|
+
/**
|
|
191
|
+
* Text node types every renderer understands without a registry entry (post bodies, articles).
|
|
192
|
+
* A registry may override any of them with its own definition.
|
|
193
|
+
*/
|
|
194
|
+
export declare const CORE_TEXT_TYPES: readonly ["paragraph", "heading", "list", "list-item", "quote", "code", "divider"];
|
|
195
|
+
export type CoreTextType = (typeof CORE_TEXT_TYPES)[number];
|
|
196
|
+
export declare const isCoreTextType: (t: string) => t is CoreTextType;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// zod schemas for the frozen node/document formats (types.ts, BLOCK-FORMAT.md §1–2).
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { ImageRefSchema, localizedSchema } from "./fields.js";
|
|
4
|
+
import { RichInlineSchema } from "./rich-doc-schema.js";
|
|
5
|
+
import { LOCALE_KEY_RE } from "./localized.js";
|
|
6
|
+
export const ACCENTS = ["lime", "ocean", "ember", "rose", "graphite"];
|
|
7
|
+
export const BlockThemeSchema = z
|
|
8
|
+
.object({
|
|
9
|
+
mode: z.enum(["inherit", "light", "dark"]),
|
|
10
|
+
surface: z.enum(["scene", "surface", "surface-2", "accent", "media"]),
|
|
11
|
+
accent: z.union([z.enum(ACCENTS), z.string().regex(/^oklch\(\s*[\d.]+%?\s+[\d.]+\s+[\d.]+(deg)?\s*(\/\s*[\d.]+%?\s*)?\)$/, { message: "Custom accents must be oklch(L C H)." })]),
|
|
12
|
+
material: z.enum(["inherit", "glass", "solid"]),
|
|
13
|
+
density: z.enum(["inherit", "comfortable", "compact"]),
|
|
14
|
+
rhythm: z.enum(["tight", "normal", "loose"]),
|
|
15
|
+
background: ImageRefSchema,
|
|
16
|
+
})
|
|
17
|
+
.partial()
|
|
18
|
+
.refine((t) => t.surface !== "media" || !!t.background, { message: "A media surface needs a background image.", path: ["background"] });
|
|
19
|
+
/** Ids: 4–64 chars of `[A-Za-z0-9_-]` (`b_7Hq2`, nanoid, uuid all fit). */
|
|
20
|
+
export const BlockIdSchema = z.string().regex(/^[A-Za-z0-9_-]{4,64}$/, { message: "Block ids are 4–64 characters of A–Z, a–z, 0–9, _ and -." });
|
|
21
|
+
export const BlockTypeSchema = z.string().regex(/^[a-z][a-z0-9]*(-[a-z0-9]+)*$/, { message: "Block types are kebab-case." });
|
|
22
|
+
export const AnchorSchema = z.string().regex(/^[a-z0-9-]+$/, { message: "Anchors are lowercase letters, digits and hyphens." });
|
|
23
|
+
export const ScheduleSchema = z.object({ from: z.iso.datetime({ offset: true }), until: z.iso.datetime({ offset: true }) }).partial();
|
|
24
|
+
/** Common node fields; `props` stays `unknown` here — `registry.nodeSchema()` narrows it per type. */
|
|
25
|
+
export const blockNodeBase = {
|
|
26
|
+
id: BlockIdSchema,
|
|
27
|
+
type: BlockTypeSchema,
|
|
28
|
+
v: z.number().int().positive().optional(),
|
|
29
|
+
variant: z.string().optional(),
|
|
30
|
+
content: z.array(RichInlineSchema).optional(),
|
|
31
|
+
theme: BlockThemeSchema.optional(),
|
|
32
|
+
anchor: AnchorSchema.optional(),
|
|
33
|
+
hidden: z.boolean().optional(),
|
|
34
|
+
schedule: ScheduleSchema.optional(),
|
|
35
|
+
};
|
|
36
|
+
/** Storage-level node schema (any type, props unchecked). */
|
|
37
|
+
export const BlockNodeSchema = z.lazy(() => z.object({
|
|
38
|
+
...blockNodeBase,
|
|
39
|
+
props: z.record(z.string(), z.unknown()).optional(),
|
|
40
|
+
slots: z.record(z.string(), z.array(BlockNodeSchema)).optional(),
|
|
41
|
+
}));
|
|
42
|
+
export const SeoMetaSchema = z.object({
|
|
43
|
+
title: localizedSchema(z.string().max(120)).optional(),
|
|
44
|
+
description: localizedSchema(z.string().max(320)).optional(),
|
|
45
|
+
image: ImageRefSchema.optional(),
|
|
46
|
+
canonical: z.string().optional(),
|
|
47
|
+
noindex: z.boolean().optional(),
|
|
48
|
+
});
|
|
49
|
+
const LocaleCodeSchema = z.string().regex(LOCALE_KEY_RE);
|
|
50
|
+
/** Builds a VamosDoc schema around a node schema (storage-level or registry-strict). */
|
|
51
|
+
export function docSchemaOf(node) {
|
|
52
|
+
return z.object({
|
|
53
|
+
$schema: z.string().optional(),
|
|
54
|
+
version: z.literal(1),
|
|
55
|
+
lang: LocaleCodeSchema.optional(),
|
|
56
|
+
locales: z.array(LocaleCodeSchema).min(1).optional(),
|
|
57
|
+
translationKey: z.string().optional(),
|
|
58
|
+
seo: SeoMetaSchema.optional(),
|
|
59
|
+
blocks: z.array(node),
|
|
60
|
+
layout: z.object({ header: z.array(node), footer: z.array(node), overlay: z.array(node) }).partial().optional(),
|
|
61
|
+
meta: z
|
|
62
|
+
.object({
|
|
63
|
+
wordCount: z.number().optional(),
|
|
64
|
+
readingTime: z.number().optional(),
|
|
65
|
+
toc: z.array(z.object({ id: z.string(), level: z.number(), text: z.string() })).optional(),
|
|
66
|
+
})
|
|
67
|
+
.optional(),
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
export const VamosDocSchema = docSchemaOf(BlockNodeSchema);
|
|
71
|
+
export const PageDocSchema = VamosDocSchema;
|
|
72
|
+
export const VAMOS_DOC_SCHEMA_URL = "https://ui.vamos.ist/schema/doc-1.json";
|
|
73
|
+
/**
|
|
74
|
+
* Text node types every renderer understands without a registry entry (post bodies, articles).
|
|
75
|
+
* A registry may override any of them with its own definition.
|
|
76
|
+
*/
|
|
77
|
+
export const CORE_TEXT_TYPES = ["paragraph", "heading", "list", "list-item", "quote", "code", "divider"];
|
|
78
|
+
export const isCoreTextType = (t) => CORE_TEXT_TYPES.includes(t);
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { type RichBlock, type RichDoc, type RichInline, type RichMarkType, type RichNodeType } from "./rich-doc.js";
|
|
3
|
+
export declare const RichMarkSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
4
|
+
type: z.ZodLiteral<"bold">;
|
|
5
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
6
|
+
type: z.ZodLiteral<"italic">;
|
|
7
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
8
|
+
type: z.ZodLiteral<"underline">;
|
|
9
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
10
|
+
type: z.ZodLiteral<"strike">;
|
|
11
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
12
|
+
type: z.ZodLiteral<"code">;
|
|
13
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
14
|
+
type: z.ZodLiteral<"highlight">;
|
|
15
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
16
|
+
type: z.ZodLiteral<"sub">;
|
|
17
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
18
|
+
type: z.ZodLiteral<"sup">;
|
|
19
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
20
|
+
type: z.ZodLiteral<"link">;
|
|
21
|
+
href: z.ZodString;
|
|
22
|
+
newTab: z.ZodOptional<z.ZodBoolean>;
|
|
23
|
+
title: z.ZodOptional<z.ZodString>;
|
|
24
|
+
}, z.core.$strip>], "type">;
|
|
25
|
+
export declare const RichInlineSchema: z.ZodType<RichInline>;
|
|
26
|
+
export declare const RichBlockSchema: z.ZodType<RichBlock>;
|
|
27
|
+
export declare const RichDocSchema: z.ZodObject<{
|
|
28
|
+
type: z.ZodLiteral<"doc">;
|
|
29
|
+
content: z.ZodArray<z.ZodType<RichBlock, unknown, z.core.$ZodTypeInternals<RichBlock, unknown>>>;
|
|
30
|
+
}, z.core.$strip>;
|
|
31
|
+
/** Problems when a doc uses nodes or marks outside an allow-list (`f.rich({ nodes, marks })`). */
|
|
32
|
+
export declare function richDocAllows(doc: RichDoc, nodes?: readonly RichNodeType[], marks?: readonly RichMarkType[]): string[];
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// zod schema for RichDoc (see rich-doc.ts for the types and BLOCK-FORMAT.md §3).
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { sanitizeHref } from "./safety.js";
|
|
4
|
+
import { isBreak } from "./rich-doc.js";
|
|
5
|
+
export const RichMarkSchema = z.discriminatedUnion("type", [
|
|
6
|
+
z.object({ type: z.literal("bold") }),
|
|
7
|
+
z.object({ type: z.literal("italic") }),
|
|
8
|
+
z.object({ type: z.literal("underline") }),
|
|
9
|
+
z.object({ type: z.literal("strike") }),
|
|
10
|
+
z.object({ type: z.literal("code") }),
|
|
11
|
+
z.object({ type: z.literal("highlight") }),
|
|
12
|
+
z.object({ type: z.literal("sub") }),
|
|
13
|
+
z.object({ type: z.literal("sup") }),
|
|
14
|
+
z.object({
|
|
15
|
+
type: z.literal("link"),
|
|
16
|
+
href: z.string().refine((h) => sanitizeHref(h) !== null, { message: "Unsafe link in rich text." }),
|
|
17
|
+
newTab: z.boolean().optional(),
|
|
18
|
+
title: z.string().optional(),
|
|
19
|
+
}),
|
|
20
|
+
]);
|
|
21
|
+
export const RichInlineSchema = z.union([
|
|
22
|
+
z.object({ type: z.literal("br") }),
|
|
23
|
+
z.object({ text: z.string(), marks: z.array(RichMarkSchema).optional() }),
|
|
24
|
+
]);
|
|
25
|
+
const inline = z.array(RichInlineSchema).optional();
|
|
26
|
+
export const RichBlockSchema = z.lazy(() => z.discriminatedUnion("type", [
|
|
27
|
+
z.object({ type: z.literal("paragraph"), content: inline }),
|
|
28
|
+
z.object({ type: z.literal("heading"), level: z.union([z.literal(2), z.literal(3), z.literal(4)]), content: inline, anchor: z.string().regex(/^[a-z0-9-]+$/).optional() }),
|
|
29
|
+
z.object({
|
|
30
|
+
type: z.literal("list"),
|
|
31
|
+
ordered: z.boolean().optional(),
|
|
32
|
+
start: z.number().int().optional(),
|
|
33
|
+
items: z.array(z.object({ content: z.array(RichBlockSchema) })),
|
|
34
|
+
}),
|
|
35
|
+
z.object({ type: z.literal("blockquote"), content: z.array(RichBlockSchema), cite: z.string().optional() }),
|
|
36
|
+
z.object({ type: z.literal("code"), text: z.string(), language: z.string().optional() }),
|
|
37
|
+
z.object({ type: z.literal("hr") }),
|
|
38
|
+
]));
|
|
39
|
+
export const RichDocSchema = z.object({ type: z.literal("doc"), content: z.array(RichBlockSchema) });
|
|
40
|
+
/** Problems when a doc uses nodes or marks outside an allow-list (`f.rich({ nodes, marks })`). */
|
|
41
|
+
export function richDocAllows(doc, nodes, marks) {
|
|
42
|
+
const problems = new Set();
|
|
43
|
+
const checkInline = (c) => {
|
|
44
|
+
if (!marks || !c)
|
|
45
|
+
return;
|
|
46
|
+
for (const n of c)
|
|
47
|
+
if (!isBreak(n))
|
|
48
|
+
for (const m of n.marks ?? [])
|
|
49
|
+
if (!marks.includes(m.type))
|
|
50
|
+
problems.add(`The "${m.type}" mark is not allowed here.`);
|
|
51
|
+
};
|
|
52
|
+
const walk = (blocks) => {
|
|
53
|
+
for (const b of blocks) {
|
|
54
|
+
if (nodes && !nodes.includes(b.type))
|
|
55
|
+
problems.add(`The "${b.type}" block is not allowed here.`);
|
|
56
|
+
if (b.type === "paragraph" || b.type === "heading")
|
|
57
|
+
checkInline(b.content);
|
|
58
|
+
else if (b.type === "blockquote")
|
|
59
|
+
walk(b.content);
|
|
60
|
+
else if (b.type === "list")
|
|
61
|
+
b.items.forEach((it) => walk(it.content));
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
walk(doc.content);
|
|
65
|
+
return [...problems];
|
|
66
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/** Inline marks. Order of nesting on render is fixed (link → bold → italic → … → sup). */
|
|
2
|
+
export type RichMark = {
|
|
3
|
+
type: "bold";
|
|
4
|
+
} | {
|
|
5
|
+
type: "italic";
|
|
6
|
+
} | {
|
|
7
|
+
type: "underline";
|
|
8
|
+
} | {
|
|
9
|
+
type: "strike";
|
|
10
|
+
} | {
|
|
11
|
+
type: "code";
|
|
12
|
+
} | {
|
|
13
|
+
type: "highlight";
|
|
14
|
+
} | {
|
|
15
|
+
type: "sub";
|
|
16
|
+
} | {
|
|
17
|
+
type: "sup";
|
|
18
|
+
} | {
|
|
19
|
+
type: "link";
|
|
20
|
+
href: string;
|
|
21
|
+
newTab?: boolean;
|
|
22
|
+
title?: string;
|
|
23
|
+
};
|
|
24
|
+
export type RichMarkType = RichMark["type"];
|
|
25
|
+
/** A run of text with marks. `text` never contains `\n` — use a `{ type: "br" }` run. */
|
|
26
|
+
export interface RichTextRun {
|
|
27
|
+
text: string;
|
|
28
|
+
marks?: RichMark[];
|
|
29
|
+
}
|
|
30
|
+
/** A hard line break inside a paragraph or heading. */
|
|
31
|
+
export interface RichBreak {
|
|
32
|
+
type: "br";
|
|
33
|
+
}
|
|
34
|
+
export type RichInline = RichTextRun | RichBreak;
|
|
35
|
+
export interface RichParagraph {
|
|
36
|
+
type: "paragraph";
|
|
37
|
+
content?: RichInline[];
|
|
38
|
+
}
|
|
39
|
+
export interface RichHeading {
|
|
40
|
+
type: "heading";
|
|
41
|
+
level: 2 | 3 | 4;
|
|
42
|
+
content?: RichInline[];
|
|
43
|
+
/** Optional stable anchor (`id` on the element, TOC target). */
|
|
44
|
+
anchor?: string;
|
|
45
|
+
}
|
|
46
|
+
export interface RichListItem {
|
|
47
|
+
/** Paragraphs and nested lists. */
|
|
48
|
+
content: RichBlock[];
|
|
49
|
+
}
|
|
50
|
+
export interface RichList {
|
|
51
|
+
type: "list";
|
|
52
|
+
ordered?: boolean;
|
|
53
|
+
/** First number of an ordered list. */
|
|
54
|
+
start?: number;
|
|
55
|
+
items: RichListItem[];
|
|
56
|
+
}
|
|
57
|
+
export interface RichBlockquote {
|
|
58
|
+
type: "blockquote";
|
|
59
|
+
content: RichBlock[];
|
|
60
|
+
/** Attribution line ("— Ayşe K., head chef"). */
|
|
61
|
+
cite?: string;
|
|
62
|
+
}
|
|
63
|
+
export interface RichCode {
|
|
64
|
+
type: "code";
|
|
65
|
+
text: string;
|
|
66
|
+
language?: string;
|
|
67
|
+
}
|
|
68
|
+
export interface RichRule {
|
|
69
|
+
type: "hr";
|
|
70
|
+
}
|
|
71
|
+
export type RichBlock = RichParagraph | RichHeading | RichList | RichBlockquote | RichCode | RichRule;
|
|
72
|
+
export type RichNodeType = RichBlock["type"];
|
|
73
|
+
/** A rich-text field value: `f.rich()` stores `Localized<RichDoc>`. */
|
|
74
|
+
export interface RichDoc {
|
|
75
|
+
type: "doc";
|
|
76
|
+
content: RichBlock[];
|
|
77
|
+
}
|
|
78
|
+
export declare const RICH_NODE_TYPES: readonly ["paragraph", "heading", "list", "blockquote", "code", "hr"];
|
|
79
|
+
export declare const RICH_MARK_TYPES: readonly ["bold", "italic", "underline", "strike", "code", "highlight", "sub", "sup", "link"];
|
|
80
|
+
export declare const isBreak: (n: RichInline) => n is RichBreak;
|
|
81
|
+
/** Builds a doc from plain paragraphs (blank line = new paragraph, single newline = `br`). */
|
|
82
|
+
export declare function richFromText(text: string): RichDoc;
|
|
83
|
+
/** Plain text of inline runs (`br` → newline). */
|
|
84
|
+
export declare function inlineToText(content: readonly RichInline[] | undefined): string;
|
|
85
|
+
/** Plain text of a doc (paragraphs separated by a blank line). Search indexes, meta descriptions, reading time. */
|
|
86
|
+
export declare function richToText(doc: RichDoc | readonly RichBlock[] | undefined): string;
|
|
87
|
+
/** Word count (Unicode-aware; works for Turkish, German, etc.). */
|
|
88
|
+
export declare function countWords(text: string): number;
|
|
89
|
+
/** Visits every inline run in a doc. */
|
|
90
|
+
export declare function forEachRun(doc: RichDoc, visit: (run: RichTextRun) => void): void;
|