@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,40 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import type { BlockBaseProps } from "../types.js";
|
|
3
|
+
import type { RichDoc } from "../schema/rich-doc.js";
|
|
4
|
+
import { type SiteBlockLabels } from "./_kit-1.js";
|
|
5
|
+
export type StatsBandVariant = "inline" | "with-text" | "ledger";
|
|
6
|
+
export interface StatItem {
|
|
7
|
+
/** Numbers are formatted with `Intl` (4.8 → "4,8" in tr); strings are shown verbatim ("24/7"). */
|
|
8
|
+
value: number | string;
|
|
9
|
+
/** Small superscript unit ("%", "k", "min"). */
|
|
10
|
+
unit?: string;
|
|
11
|
+
/** Spoken unit for screen readers ("percent"). `%` is spelled out automatically. */
|
|
12
|
+
unitLabel?: string;
|
|
13
|
+
label: React.ReactNode;
|
|
14
|
+
/** Where the figure comes from ("Google Business Profile, Oct 2026"). Unsourced figures read as marketing. */
|
|
15
|
+
source?: React.ReactNode;
|
|
16
|
+
}
|
|
17
|
+
export interface StatsBandProps extends Omit<BlockBaseProps, "variant" | "labels"> {
|
|
18
|
+
/**
|
|
19
|
+
* inline: 3–4 figures on one line between vertical rules; unit as a superscript, label below.
|
|
20
|
+
* with-text: a paragraph on the start side, a 2×2 grid of figures on the end side.
|
|
21
|
+
* ledger: label, dotted leader, figure — an annual report line; mono source below.
|
|
22
|
+
*/
|
|
23
|
+
variant?: StatsBandVariant;
|
|
24
|
+
eyebrow?: React.ReactNode;
|
|
25
|
+
title?: React.ReactNode;
|
|
26
|
+
lead?: React.ReactNode;
|
|
27
|
+
/** with-text: the paragraph(s) beside the figures. */
|
|
28
|
+
body?: RichDoc | string;
|
|
29
|
+
items: StatItem[];
|
|
30
|
+
labels?: SiteBlockLabels;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Concrete, sourced numbers ("4.8 on Google · 1,240 reviews"). Semantic `dl`, Intl formatting,
|
|
34
|
+
* units spelled out for screen readers, no count-up animation. Server component.
|
|
35
|
+
*
|
|
36
|
+
* ```tsx
|
|
37
|
+
* <StatsBand items={[{ value: 4.8, label: "Google rating", source: "1,240 reviews, Nov 2026" }]} />
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export declare function StatsBand({ variant, eyebrow, title, lead, body, items, id, theme, anchor, className, headingLevel, labels, locale, components, editMode }: StatsBandProps): React.JSX.Element;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../../lib/cn.js";
|
|
3
|
+
import { Container, Section } from "../section.js";
|
|
4
|
+
import { SectionHeader } from "../section-header.js";
|
|
5
|
+
import { RichText } from "../rich-text.js";
|
|
6
|
+
import { siteText, useBlockIds } from "./_kit-1.js";
|
|
7
|
+
function formatValue(v, locale) {
|
|
8
|
+
if (typeof v !== "number")
|
|
9
|
+
return v;
|
|
10
|
+
const decimals = Math.min(2, (String(v).split(".")[1] ?? "").length);
|
|
11
|
+
return new Intl.NumberFormat(locale, { minimumFractionDigits: decimals, maximumFractionDigits: decimals }).format(v);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Concrete, sourced numbers ("4.8 on Google · 1,240 reviews"). Semantic `dl`, Intl formatting,
|
|
15
|
+
* units spelled out for screen readers, no count-up animation. Server component.
|
|
16
|
+
*
|
|
17
|
+
* ```tsx
|
|
18
|
+
* <StatsBand items={[{ value: 4.8, label: "Google rating", source: "1,240 reviews, Nov 2026" }]} />
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export function StatsBand({ variant = "inline", eyebrow, title, lead, body, items, id, theme, anchor, className, headingLevel = 2, labels, locale = "en-US", components, editMode }) {
|
|
22
|
+
const t = siteText(labels, locale);
|
|
23
|
+
const { base, headingId } = useBlockIds(id, "stats");
|
|
24
|
+
const figure = (s, size) => {
|
|
25
|
+
const spoken = s.unitLabel ?? (s.unit === "%" ? t("percent") : s.unit);
|
|
26
|
+
return (_jsxs("span", { className: cn("font-display tabular text-fg", size), children: [formatValue(s.value, locale), s.unit ? (_jsxs(_Fragment, { children: [_jsx("sup", { "aria-hidden": true, className: "vb-stat-unit ms-[0.08em] align-super font-sans text-[0.38em] font-medium tracking-normal text-fg-muted", children: s.unit }), _jsxs("span", { className: "sr-only", children: [" ", spoken] })] })) : null] }));
|
|
27
|
+
};
|
|
28
|
+
const source = (s, cls) => s.source ? (_jsxs("dd", { className: cn("font-mono text-[0.6875rem] leading-snug tracking-[0.02em] text-fg-subtle", cls), children: [_jsx("span", { className: "sr-only", children: t("source", { source: "" }) }), s.source] })) : null;
|
|
29
|
+
const header = title || eyebrow || (lead && variant !== "with-text") ? (_jsx(SectionHeader, { eyebrow: eyebrow, title: title, lead: variant === "with-text" ? undefined : lead, headingLevel: headingLevel, headingId: headingId, editMode: editMode, labels: labels, locale: locale })) : null;
|
|
30
|
+
let content;
|
|
31
|
+
if (variant === "ledger") {
|
|
32
|
+
content = (_jsxs("div", { className: "grid gap-x-(--gutter) gap-y-10 @4xl:grid-cols-12", children: [header ? _jsx("div", { className: "@4xl:col-span-4", children: header }) : null, _jsx("dl", { className: cn("flex flex-col border-t border-line", header ? "@4xl:col-span-7 @4xl:col-start-6" : "@4xl:col-span-12"), children: items.map((s, i) => (_jsxs("div", { className: "grid grid-cols-[auto_1fr_auto] items-baseline gap-x-4 gap-y-1 border-b border-line py-5", "data-field": editMode ? `props.items.${i}` : undefined, children: [_jsx("dt", { className: "text-body text-fg", children: s.label }), _jsx("span", { "aria-hidden": true, className: "vb-leader self-end" }), _jsx("dd", { className: "text-end", children: figure(s, "text-display-m") }), source(s, "col-span-3")] }, i))) })] }));
|
|
33
|
+
}
|
|
34
|
+
else if (variant === "with-text") {
|
|
35
|
+
content = (_jsxs("div", { className: "grid gap-x-(--gutter) gap-y-12 @4xl:grid-cols-12 @4xl:items-start", children: [_jsxs("div", { className: "flex flex-col gap-6 @4xl:col-span-5", children: [header, lead ? _jsx("p", { className: "vb-lead text-lead text-fg-muted", children: lead }) : null, body ? _jsx(RichText, { doc: body, components: components, labels: labels, locale: locale, headingOffset: 1, editMode: editMode, field: "props.body" }) : null] }), _jsx("dl", { className: "grid grid-cols-2 border-s border-t border-line @4xl:col-span-6 @4xl:col-start-7", children: items.slice(0, 4).map((s, i) => (_jsxs("div", { className: "flex flex-col gap-2 border-e border-b border-line p-[clamp(1rem,3cqi,2rem)]", "data-field": editMode ? `props.items.${i}` : undefined, children: [_jsx("dt", { className: "order-2 text-small text-fg-muted text-pretty", children: s.label }), _jsx("dd", { className: "order-1", children: figure(s, "text-display-l") }), source(s, "order-3 mt-auto pt-3")] }, i))) })] }));
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
content = (_jsxs("div", { className: "flex flex-col gap-12", children: [header, _jsx("dl", { className: cn("grid grid-cols-2 gap-y-10", items.length >= 3 && "@4xl:grid-cols-3", items.length >= 4 && "@4xl:grid-cols-4", items.length >= 5 && "@6xl:grid-cols-5"), children: items.map((s, i) => (_jsxs("div", { className: "vb-stat-inline flex flex-col gap-2 border-line ps-[clamp(0.75rem,2.5cqi,2rem)]", "data-field": editMode ? `props.items.${i}` : undefined, children: [_jsx("dt", { className: "order-2 max-w-[24ch] text-small text-fg-muted text-pretty", children: s.label }), _jsx("dd", { className: "order-1", children: figure(s, "text-display-l") }), source(s, "order-3")] }, i))) })] }));
|
|
39
|
+
}
|
|
40
|
+
return (_jsx(Section, { theme: theme, anchor: anchor, headingId: title ? headingId : undefined, blockId: base, blockType: "stats", editMode: editMode, className: cn("vb-stats", className), "data-variant": variant, children: _jsx(Container, { className: "vb-reveal", children: content }) }));
|
|
41
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import type { BlockBaseProps } from "../types.js";
|
|
3
|
+
import type { SocialNetwork } from "../schema/types.js";
|
|
4
|
+
import { type Site2BlockLabels } from "./shared/labels-2.js";
|
|
5
|
+
import { type SiteImage2 } from "./shared/kit-2.js";
|
|
6
|
+
export type TeamVariant = "portrait" | "list" | "feature";
|
|
7
|
+
export interface TeamMember {
|
|
8
|
+
name: React.ReactNode;
|
|
9
|
+
/** Honorific kept apart from the name ("Dr.", "Op. Dr.") — order differs per locale. */
|
|
10
|
+
title?: React.ReactNode;
|
|
11
|
+
role: React.ReactNode;
|
|
12
|
+
/** Specialty line in `list` ("Deep tissue · Sports massage"). */
|
|
13
|
+
specialty?: React.ReactNode;
|
|
14
|
+
/** 4:5 portrait. No photo = an empty inset area, never initials. */
|
|
15
|
+
photo?: SiteImage2;
|
|
16
|
+
bio?: React.ReactNode;
|
|
17
|
+
/** Up to 3 profile links, rendered as short text links ("LinkedIn"). */
|
|
18
|
+
links?: {
|
|
19
|
+
network: SocialNetwork;
|
|
20
|
+
href: string;
|
|
21
|
+
}[];
|
|
22
|
+
}
|
|
23
|
+
export interface TeamProps extends Omit<BlockBaseProps, "variant" | "labels"> {
|
|
24
|
+
/**
|
|
25
|
+
* portrait: 3–4 columns of 4:5 portraits, name + mono role below. list: a typographic list
|
|
26
|
+
* (name · role · specialty) with a portrait revealed on hover. feature: one founder or lead
|
|
27
|
+
* specialist, large portrait beside a long bio, the name set like a signature.
|
|
28
|
+
*/
|
|
29
|
+
variant?: TeamVariant;
|
|
30
|
+
eyebrow?: React.ReactNode;
|
|
31
|
+
title?: React.ReactNode;
|
|
32
|
+
lead?: React.ReactNode;
|
|
33
|
+
members: TeamMember[];
|
|
34
|
+
labels?: Site2BlockLabels;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Team and specialist introduction — spa therapists, clinic doctors, an agency team. Card-less
|
|
38
|
+
* by default (D6-1). Server component; the hover portrait in `list` is CSS only.
|
|
39
|
+
*
|
|
40
|
+
* ```tsx
|
|
41
|
+
* <Team title="The people behind your *treatment*" members={[{ name: "Elif Aydın", role: "Lead therapist", photo }]} />
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare function Team({ variant: variantProp, eyebrow, title, lead, members, id, anchor, theme, headingLevel, className, labels, locale, components, editMode }: TeamProps): React.JSX.Element;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn2 as cn } from "./shared/kit-2.js";
|
|
3
|
+
import { Section, Container } from "../section.js";
|
|
4
|
+
import { SectionHeader } from "../section-header.js";
|
|
5
|
+
import { BlockImage } from "../block-image.js";
|
|
6
|
+
import { BlockLink } from "../block-link.js";
|
|
7
|
+
import { site2Text } from "./shared/labels-2.js";
|
|
8
|
+
import { fieldAttr, textOf, useBlockIds2 } from "./shared/kit-2.js";
|
|
9
|
+
import { BRAND_NAMES } from "./shared/brand-icons.js";
|
|
10
|
+
/**
|
|
11
|
+
* Team and specialist introduction — spa therapists, clinic doctors, an agency team. Card-less
|
|
12
|
+
* by default (D6-1). Server component; the hover portrait in `list` is CSS only.
|
|
13
|
+
*
|
|
14
|
+
* ```tsx
|
|
15
|
+
* <Team title="The people behind your *treatment*" members={[{ name: "Elif Aydın", role: "Lead therapist", photo }]} />
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export function Team({ variant: variantProp = "portrait", eyebrow, title, lead, members, id, anchor, theme, headingLevel = 2, className, labels, locale = "en-US", components, editMode }) {
|
|
19
|
+
const t = site2Text(labels, locale);
|
|
20
|
+
const { headingId } = useBlockIds2(id, "team");
|
|
21
|
+
const variant = members.length === 1 ? "feature" : variantProp;
|
|
22
|
+
const ctx = { t, locale, components, labels, editMode };
|
|
23
|
+
const header = title || eyebrow || lead ? _jsx(SectionHeader, { eyebrow: eyebrow, title: title, lead: lead, headingId: headingId, headingLevel: headingLevel, editMode: editMode, labels: labels, locale: locale, align: variant === "portrait" ? "split" : "start" }) : null;
|
|
24
|
+
return (_jsx(Section, { theme: theme, anchor: anchor, headingId: title ? headingId : undefined, blockId: id, blockType: "team", editMode: editMode, className: cn("vb-team", className), "data-variant": variant, children: _jsx(Container, { className: "flex flex-col gap-12 @4xl:gap-16", children: variant === "feature" ? (_jsx(FeatureMember, { member: members[0], header: header, ctx: ctx })) : (_jsxs(_Fragment, { children: [header, variant === "list" ? (_jsx("ul", { className: "vb-team-list flex flex-col border-b border-line", children: members.map((m, i) => (_jsx(ListMember, { member: m, index: i, ctx: ctx }, i))) })) : (_jsx("ul", { className: cn("grid grid-cols-2 gap-x-(--gutter) gap-y-12", members.length % 4 === 0 || members.length > 6 ? "@4xl:grid-cols-4" : "@4xl:grid-cols-3"), children: members.map((m, i) => (_jsx(PortraitMember, { member: m, index: i, ctx: ctx }, i))) }))] })) }) }));
|
|
25
|
+
}
|
|
26
|
+
function DisplayName({ member }) {
|
|
27
|
+
return (_jsxs(_Fragment, { children: [member.title ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-fg-muted", children: member.title }), " "] })) : null, member.name] }));
|
|
28
|
+
}
|
|
29
|
+
function ProfileLinks({ member, ctx, className }) {
|
|
30
|
+
if (!member.links?.length)
|
|
31
|
+
return null;
|
|
32
|
+
const name = textOf(member.name);
|
|
33
|
+
return (_jsx("span", { className: cn("flex flex-wrap gap-x-3 gap-y-1", className), children: member.links.slice(0, 3).map((l, i) => (_jsx(BlockLink, { href: l.href, newTab: true, components: ctx.components, labels: ctx.labels, locale: ctx.locale, "aria-label": name ? ctx.t("profileOf", { name, network: BRAND_NAMES[l.network] }) : undefined, className: "relative z-10 text-small text-fg-muted underline decoration-line underline-offset-[0.25em] transition-colors hover:text-fg hover:decoration-current focus-ring rounded-[2px]", children: BRAND_NAMES[l.network] }, i))) }));
|
|
34
|
+
}
|
|
35
|
+
function Portrait({ photo, ctx, className, sizes }) {
|
|
36
|
+
if (!photo?.src)
|
|
37
|
+
return _jsx("span", { "aria-hidden": true, className: cn("block aspect-[4/5] rounded-ui bg-surface-2", className) });
|
|
38
|
+
return _jsx(BlockImage, { ...photo, alt: photo.alt ?? "", decorative: !photo.alt, aspect: "4:5", sizes: sizes, className: cn("rounded-ui", className), components: ctx.components });
|
|
39
|
+
}
|
|
40
|
+
function PortraitMember({ member, index, ctx }) {
|
|
41
|
+
return (_jsxs("li", { className: "flex flex-col gap-4", children: [_jsx(Portrait, { photo: member.photo, ctx: ctx, sizes: "(min-width: 56rem) 25vw, 50vw" }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsxs("div", { className: "flex flex-wrap items-baseline justify-between gap-x-3 gap-y-1", children: [_jsx("h3", { className: "text-h3 font-semibold tracking-[-0.012em] text-fg", ...fieldAttr(ctx.editMode, `members.${index}.name`), children: _jsx(DisplayName, { member: member }) }), _jsx(ProfileLinks, { member: member, ctx: ctx })] }), _jsx("p", { className: "font-mono text-eyebrow uppercase tracking-[0.06em] text-fg-muted", children: member.role }), member.bio ? _jsx("p", { className: "mt-2 text-small text-fg-muted text-pretty", children: member.bio }) : null] })] }));
|
|
42
|
+
}
|
|
43
|
+
function ListMember({ member, index, ctx }) {
|
|
44
|
+
return (_jsxs("li", { className: "vb-team-row group/row relative grid grid-cols-[3.5rem_1fr] items-center gap-x-4 gap-y-1 border-t border-line py-6 @2xl:grid-cols-12 @2xl:gap-x-(--gutter)", children: [_jsx("span", { className: "row-span-2 @2xl:hidden", children: _jsx(Portrait, { photo: member.photo, ctx: ctx, className: "w-14 rounded-ui-sm", sizes: "56px" }) }), _jsx("h3", { className: "text-h3 font-semibold tracking-[-0.012em] text-fg @2xl:col-span-4", ...fieldAttr(ctx.editMode, `members.${index}.name`), children: _jsx(DisplayName, { member: member }) }), _jsx("p", { className: "font-mono text-eyebrow uppercase tracking-[0.06em] text-fg-muted @2xl:col-span-3", children: member.role }), _jsxs("div", { className: "col-start-2 flex flex-wrap items-baseline gap-x-6 gap-y-1 @2xl:col-span-5 @2xl:col-start-auto @2xl:justify-between", children: [member.specialty ? _jsx("p", { className: "text-small text-fg-muted", children: member.specialty }) : _jsx("span", {}), _jsx(ProfileLinks, { member: member, ctx: ctx })] }), member.photo?.src ? (_jsx("span", { "aria-hidden": true, className: "vb-team-hover pointer-events-none absolute end-[22%] top-1/2 z-10 hidden w-40 -translate-y-1/2 @4xl:block", children: _jsx(BlockImage, { ...member.photo, decorative: true, aspect: "4:5", sizes: "160px", className: "rounded-ui", components: ctx.components }) })) : null] }));
|
|
45
|
+
}
|
|
46
|
+
function FeatureMember({ member, header, ctx }) {
|
|
47
|
+
return (_jsxs("div", { className: "grid gap-x-(--gutter) gap-y-10 @4xl:grid-cols-12 @4xl:items-start", children: [_jsx("div", { className: "@4xl:col-span-5", children: _jsx(Portrait, { photo: member.photo, ctx: ctx, sizes: "(min-width: 56rem) 40vw, 100vw" }) }), _jsxs("div", { className: "flex flex-col gap-8 @4xl:col-span-6 @4xl:col-start-7 @4xl:pt-6", children: [header, member.bio ? _jsx("div", { className: "text-lead text-fg-muted text-pretty [&_p+p]:mt-4", children: typeof member.bio === "string" ? member.bio.split(/\n{2,}/).map((p, i) => _jsx("p", { children: p }, i)) : member.bio }) : null, _jsxs("div", { className: "flex flex-col gap-2 border-t border-line pt-6", children: [_jsx("p", { className: "vb-signature font-display text-display-m italic text-fg", ...fieldAttr(ctx.editMode, "members.0.name"), children: _jsx(DisplayName, { member: member }) }), _jsx("p", { className: "font-mono text-eyebrow uppercase tracking-[0.06em] text-fg-muted", children: member.role }), _jsx(ProfileLinks, { member: member, ctx: ctx, className: "mt-2" })] })] })] }));
|
|
48
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import type { BlockBaseProps } from "../types.js";
|
|
3
|
+
import { type Site2BlockLabels } from "./shared/labels-2.js";
|
|
4
|
+
import { type SiteImage2, type SiteLink2 } from "./shared/kit-2.js";
|
|
5
|
+
export type TestimonialsVariant = "feature" | "wall" | "carousel" | "reviews";
|
|
6
|
+
export type ReviewSource = "google" | "yandex" | "tripadvisor" | "trustpilot" | "direct";
|
|
7
|
+
export declare const REVIEW_SOURCE_NAMES: Record<ReviewSource, string>;
|
|
8
|
+
export interface TestimonialItem {
|
|
9
|
+
quote: React.ReactNode;
|
|
10
|
+
author: React.ReactNode;
|
|
11
|
+
role?: React.ReactNode;
|
|
12
|
+
company?: React.ReactNode;
|
|
13
|
+
/** Small square portrait. No avatar = name only (never an initials circle). */
|
|
14
|
+
avatar?: SiteImage2;
|
|
15
|
+
/** Company logo (feature variant). */
|
|
16
|
+
logo?: SiteImage2;
|
|
17
|
+
/** 1–5. Rendered only with a `source` (D6-8). */
|
|
18
|
+
rating?: number;
|
|
19
|
+
source?: ReviewSource;
|
|
20
|
+
/** `YYYY-MM-DD`. */
|
|
21
|
+
date?: string;
|
|
22
|
+
/** Link to the original review. */
|
|
23
|
+
link?: SiteLink2;
|
|
24
|
+
}
|
|
25
|
+
export interface ReviewSummary {
|
|
26
|
+
rating: number;
|
|
27
|
+
count: number;
|
|
28
|
+
source: ReviewSource;
|
|
29
|
+
link?: SiteLink2;
|
|
30
|
+
}
|
|
31
|
+
export interface TestimonialsProps extends Omit<BlockBaseProps, "variant" | "labels"> {
|
|
32
|
+
/**
|
|
33
|
+
* feature: one large serif quote with a hanging quote mark. wall: uneven columns of quotes, no
|
|
34
|
+
* cards. carousel: sliding quotes with arrows and a "3 / 8" counter (no autoplay).
|
|
35
|
+
* reviews: sticky rating summary beside a dated review list.
|
|
36
|
+
*/
|
|
37
|
+
variant?: TestimonialsVariant;
|
|
38
|
+
eyebrow?: React.ReactNode;
|
|
39
|
+
title?: React.ReactNode;
|
|
40
|
+
lead?: React.ReactNode;
|
|
41
|
+
items: TestimonialItem[];
|
|
42
|
+
/** `reviews` variant: "4.8 on Google — 1,240 reviews". */
|
|
43
|
+
summary?: ReviewSummary;
|
|
44
|
+
labels?: Site2BlockLabels;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Customer voices: agency references, Google reviews for a spa or restaurant, SaaS quotes.
|
|
48
|
+
* `figure > blockquote + figcaption`, locale quotation marks, stars only with a named source.
|
|
49
|
+
* Server component; `carousel` adds a ~1 KB scroll-snap island.
|
|
50
|
+
*
|
|
51
|
+
* ```tsx
|
|
52
|
+
* <Testimonials variant="wall" title="What clients *say*" items={quotes} />
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export declare function Testimonials({ variant: variantProp, eyebrow, title, lead, items, summary, id, anchor, theme, headingLevel, className, labels, locale, components, editMode, }: TestimonialsProps): React.JSX.Element;
|
|
56
|
+
/** Monochrome stars with a text alternative ("4.8 out of 5"). */
|
|
57
|
+
declare const RATING_STAR_SIZE: {
|
|
58
|
+
readonly sm: "size-3";
|
|
59
|
+
readonly md: "size-3.5";
|
|
60
|
+
readonly lg: "size-5";
|
|
61
|
+
};
|
|
62
|
+
export declare function RatingStars({ rating, label, size, className }: {
|
|
63
|
+
rating: number;
|
|
64
|
+
label: string;
|
|
65
|
+
size?: keyof typeof RATING_STAR_SIZE;
|
|
66
|
+
className?: string;
|
|
67
|
+
}): React.JSX.Element;
|
|
68
|
+
export {};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { Star } from "lucide-react";
|
|
4
|
+
import { cn2 as cn } from "./shared/kit-2.js";
|
|
5
|
+
import { createFormatter } from "../../format/core.js";
|
|
6
|
+
import { Section, Container } from "../section.js";
|
|
7
|
+
import { SectionHeader } from "../section-header.js";
|
|
8
|
+
import { BlockImage } from "../block-image.js";
|
|
9
|
+
import { BlockLink } from "../block-link.js";
|
|
10
|
+
import { labelTemplates, site2Text } from "./shared/labels-2.js";
|
|
11
|
+
import { fieldAttr, formatDate2, isoDay, useBlockIds2 } from "./shared/kit-2.js";
|
|
12
|
+
import { TestimonialsCarousel } from "./shared/testimonials-carousel.js";
|
|
13
|
+
import { carouselLabelKeys } from "./shared/island-keys.js";
|
|
14
|
+
export const REVIEW_SOURCE_NAMES = { google: "Google", yandex: "Yandex", tripadvisor: "Tripadvisor", trustpilot: "Trustpilot", direct: "" };
|
|
15
|
+
/**
|
|
16
|
+
* Customer voices: agency references, Google reviews for a spa or restaurant, SaaS quotes.
|
|
17
|
+
* `figure > blockquote + figcaption`, locale quotation marks, stars only with a named source.
|
|
18
|
+
* Server component; `carousel` adds a ~1 KB scroll-snap island.
|
|
19
|
+
*
|
|
20
|
+
* ```tsx
|
|
21
|
+
* <Testimonials variant="wall" title="What clients *say*" items={quotes} />
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export function Testimonials({ variant: variantProp = "feature", eyebrow, title, lead, items, summary, id, anchor, theme, headingLevel = 2, className, labels, locale = "en-US", components, editMode, }) {
|
|
25
|
+
const t = site2Text(labels, locale);
|
|
26
|
+
const { headingId } = useBlockIds2(id, "testimonials");
|
|
27
|
+
const variant = variantProp === "carousel" && items.length < 2 ? "feature" : variantProp;
|
|
28
|
+
const ctx = { t, locale, components, labels, editMode };
|
|
29
|
+
const header = title || eyebrow || lead ? _jsx(SectionHeader, { eyebrow: eyebrow, title: title, lead: lead, headingId: headingId, headingLevel: headingLevel, editMode: editMode, labels: labels, locale: locale }) : null;
|
|
30
|
+
return (_jsx(Section, { theme: theme, anchor: anchor, headingId: title ? headingId : undefined, blockId: id, blockType: "testimonials", editMode: editMode, className: cn("vb-testimonials", className), "data-variant": variant, children: _jsx(Container, { className: "flex flex-col gap-12 @4xl:gap-16", children: variant === "carousel" ? (_jsx(TestimonialsCarousel, { header: header, count: items.length, labels: labelTemplates(labels, carouselLabelKeys), locale: locale, children: items.map((item, i) => (_jsx(QuoteFigure, { item: item, index: i, ctx: ctx, size: "m" }, i))) })) : (_jsxs(_Fragment, { children: [variant !== "reviews" ? header : null, variant === "feature" ? (_jsx(FeatureQuote, { item: items[0], ctx: ctx })) : variant === "wall" ? (_jsx("ul", { className: "vb-quote-wall gap-x-(--gutter) @2xl:columns-2 @4xl:columns-3", children: items.map((item, i) => (_jsx("li", { className: "mb-12 break-inside-avoid border-t border-line pt-6", children: _jsx(QuoteFigure, { item: item, index: i, ctx: ctx }) }, i))) })) : (_jsx(ReviewsLayout, { header: header, items: items, summary: summary, ctx: ctx }))] })) }) }));
|
|
31
|
+
}
|
|
32
|
+
/** Monochrome stars with a text alternative ("4.8 out of 5"). */
|
|
33
|
+
const RATING_STAR_SIZE = { sm: "size-3", md: "size-3.5", lg: "size-5" };
|
|
34
|
+
export function RatingStars({ rating, label, size = "md", className }) {
|
|
35
|
+
const r = Math.max(0, Math.min(5, rating));
|
|
36
|
+
const s = RATING_STAR_SIZE[size];
|
|
37
|
+
return (_jsx("span", { role: "img", "aria-label": label, className: cn("inline-flex items-center gap-0.5 text-fg", className), children: [0, 1, 2, 3, 4].map((i) => {
|
|
38
|
+
const fill = Math.max(0, Math.min(1, r - i));
|
|
39
|
+
return (_jsxs("span", { "aria-hidden": true, className: cn("relative inline-flex", s), children: [_jsx(Star, { strokeWidth: 1.5, className: cn("absolute inset-0 text-fg-subtle", s) }), fill > 0 ? (_jsx("span", { className: "absolute inset-y-0 start-0 overflow-hidden", style: { width: `${fill * 100}%` }, children: _jsx(Star, { strokeWidth: 1.5, className: cn("fill-current", s) }) })) : null] }, i));
|
|
40
|
+
}) }));
|
|
41
|
+
}
|
|
42
|
+
function Attribution({ item, ctx, align = "start", as: Comp = "figcaption" }) {
|
|
43
|
+
const meta = [item.role, item.company].filter(Boolean);
|
|
44
|
+
return (_jsxs(Comp, { className: cn("flex items-center gap-3", align === "between" && "justify-between"), children: [_jsxs("span", { className: "flex items-center gap-3", children: [item.avatar ? (_jsx(BlockImage, { ...item.avatar, alt: item.avatar.alt ?? "", decorative: !item.avatar.alt, aspect: "1:1", sizes: "40px", className: "size-10 shrink-0 rounded-full", components: ctx.components })) : null, _jsxs("span", { className: "flex flex-col", children: [_jsx("span", { className: "text-sm font-medium text-fg", children: item.author }), meta.length ? (_jsx("span", { className: "font-mono text-eyebrow uppercase tracking-[0.06em] text-fg-muted", children: meta.map((m, i) => (_jsxs(React.Fragment, { children: [i > 0 ? " · " : null, m] }, i))) })) : null] })] }), align === "between" && item.logo ? (_jsx(BlockImage, { ...item.logo, alt: item.logo.alt ?? "", decorative: !item.logo.alt, fit: "contain", className: "h-7 w-24 bg-transparent opacity-80", imgClassName: "vb-logo-mono", components: ctx.components })) : null] }));
|
|
45
|
+
}
|
|
46
|
+
function SourceLine({ item, ctx }) {
|
|
47
|
+
const showRating = item.rating !== undefined && item.source;
|
|
48
|
+
const name = item.source ? REVIEW_SOURCE_NAMES[item.source] : "";
|
|
49
|
+
if (!showRating && !item.date && !name)
|
|
50
|
+
return null;
|
|
51
|
+
return (_jsxs("p", { className: "flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-fg-muted", children: [showRating ? _jsx(RatingStars, { rating: item.rating, label: ctx.t("ratingOutOf", { rating: item.rating }) }) : null, name ? (item.link ? (_jsx(BlockLink, { href: item.link.href, newTab: item.link.newTab ?? true, components: ctx.components, labels: ctx.labels, locale: ctx.locale, className: "underline decoration-line underline-offset-[0.25em] hover:decoration-current focus-ring rounded-[2px]", children: name })) : (_jsx("span", { children: name }))) : null, item.date ? _jsx("time", { dateTime: isoDay(item.date), children: formatDate2(isoDay(item.date), ctx.locale, "medium") }) : null] }));
|
|
52
|
+
}
|
|
53
|
+
function QuoteFigure({ item, index, ctx, size = "s" }) {
|
|
54
|
+
return (_jsxs("figure", { className: "flex flex-col gap-5", children: [_jsx(SourceLine, { item: item, ctx: ctx }), _jsx("blockquote", { className: cn("text-fg text-pretty", size === "m" ? "text-lead" : "text-body"), ...fieldAttr(ctx.editMode, `items.${index}.quote`), children: _jsxs("p", { children: [_jsx("span", { "aria-hidden": true, children: ctx.t("quoteOpen") }), item.quote, _jsx("span", { "aria-hidden": true, children: ctx.t("quoteClose") })] }) }), _jsx(Attribution, { item: item, ctx: ctx })] }));
|
|
55
|
+
}
|
|
56
|
+
function FeatureQuote({ item, ctx }) {
|
|
57
|
+
return (_jsxs("figure", { className: "grid gap-y-10 @4xl:grid-cols-12 @4xl:gap-x-(--gutter)", children: [_jsxs("blockquote", { className: "relative @4xl:col-span-10 @4xl:col-start-2", ...fieldAttr(ctx.editMode, "items.0.quote"), children: [_jsx("span", { "aria-hidden": true, className: "vb-quote-mark pointer-events-none absolute -top-[0.08em] end-full me-[0.12em] font-display text-display-l leading-none text-accent-ink", children: ctx.t("quoteOpen") }), _jsxs("p", { className: "font-display text-display-m text-fg text-pretty", children: [item.quote, _jsx("span", { "aria-hidden": true, children: ctx.t("quoteClose") })] })] }), _jsxs("figcaption", { className: "flex flex-col gap-4 border-t border-line pt-6 @4xl:col-span-10 @4xl:col-start-2", children: [_jsx(Attribution, { item: item, ctx: ctx, align: "between", as: "div" }), _jsx(SourceLine, { item: item, ctx: ctx })] })] }));
|
|
58
|
+
}
|
|
59
|
+
function ReviewsLayout({ header, items, summary, ctx }) {
|
|
60
|
+
const nf = createFormatter(ctx.locale);
|
|
61
|
+
const sourceName = summary ? REVIEW_SOURCE_NAMES[summary.source] : "";
|
|
62
|
+
return (_jsxs("div", { className: "grid gap-x-(--gutter) gap-y-12 @4xl:grid-cols-12", children: [_jsxs("div", { className: "flex flex-col gap-8 @4xl:sticky @4xl:top-[calc(var(--topbar-h,0px)+2rem)] @4xl:col-span-4 @4xl:self-start", children: [header, summary ? (_jsxs("div", { className: "flex flex-col gap-3 border-t border-line pt-6", children: [_jsxs("p", { className: "flex items-baseline gap-3", children: [_jsx("span", { className: "font-display text-display-l tabular text-fg", children: nf.number(summary.rating, { minimumFractionDigits: 1, maximumFractionDigits: 1 }) }), _jsx(RatingStars, { rating: summary.rating, label: ctx.t("ratingOutOf", { rating: nf.number(summary.rating, { maximumFractionDigits: 1 }) }) })] }), _jsxs("p", { className: "text-small text-fg-muted", children: [sourceName
|
|
63
|
+
? ctx.t("ratingSummary", { rating: nf.number(summary.rating, { maximumFractionDigits: 1 }), source: sourceName })
|
|
64
|
+
: ctx.t("ratingSummaryDirect", { rating: nf.number(summary.rating, { maximumFractionDigits: 1 }) }), " ", "\u2014 ", ctx.t("reviewCount", { count: summary.count })] }), summary.link ? (_jsx(BlockLink, { href: summary.link.href, newTab: summary.link.newTab ?? true, appearance: "link", components: ctx.components, labels: ctx.labels, locale: ctx.locale, className: "self-start text-small", children: summary.link.label ?? ctx.t("readAllReviews") })) : null] })) : null] }), _jsx("ol", { className: "flex flex-col @4xl:col-span-7 @4xl:col-start-6", children: items.map((item, i) => (_jsx("li", { className: "border-t border-line py-7 first:border-t-0 first:pt-0 @4xl:first:border-t @4xl:first:pt-7", children: _jsx(QuoteFigure, { item: item, index: i, ctx: ctx }) }, i))) })] }));
|
|
65
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type * as React from "react";
|
|
2
|
+
import type { VamosImageComponent, VamosLinkComponent } from "../lib/provider.js";
|
|
3
|
+
import type { BlockTheme } from "./schema/types.js";
|
|
4
|
+
import type { BlockLabels } from "./labels.js";
|
|
5
|
+
/** Framework bindings. Defaults: `<img>` and `<a>`. Next.js: `{ Image: NextImage, Link: NextLink }`. */
|
|
6
|
+
export interface BlockAdapters {
|
|
7
|
+
Image?: VamosImageComponent;
|
|
8
|
+
Link?: VamosLinkComponent;
|
|
9
|
+
}
|
|
10
|
+
/** Props every block component accepts (the renderer sets them from the node). */
|
|
11
|
+
export interface BlockBaseProps {
|
|
12
|
+
/** One of the block's variants. */
|
|
13
|
+
variant?: string;
|
|
14
|
+
/** Node id (`data-block-id` in edit mode). */
|
|
15
|
+
id?: string;
|
|
16
|
+
/** Level of the block's title: 1 for the page intro, 2 otherwise. The renderer sets it. */
|
|
17
|
+
headingLevel?: 1 | 2 | 3;
|
|
18
|
+
theme?: BlockTheme;
|
|
19
|
+
/** Section anchor (`#menu`). */
|
|
20
|
+
anchor?: string;
|
|
21
|
+
className?: string;
|
|
22
|
+
/** Built-in UI strings (RSC has no context). */
|
|
23
|
+
labels?: Partial<BlockLabels>;
|
|
24
|
+
/** BCP 47 locale for Intl formatting. Default `"en-US"`. */
|
|
25
|
+
locale?: string;
|
|
26
|
+
/** Framework bindings (set once with `createBlocks`). */
|
|
27
|
+
components?: BlockAdapters;
|
|
28
|
+
/** Builder canvas: emit `data-block-id` / `data-field` and empty-field placeholders. */
|
|
29
|
+
editMode?: boolean;
|
|
30
|
+
}
|
|
31
|
+
/** Runtime info the renderer passes to a registered block. Plain data (crosses RSC boundaries). */
|
|
32
|
+
export interface BlockRuntime {
|
|
33
|
+
id: string;
|
|
34
|
+
type: string;
|
|
35
|
+
mode: "view" | "edit";
|
|
36
|
+
/** Schema version after migration. */
|
|
37
|
+
v: number;
|
|
38
|
+
}
|
|
39
|
+
/** What a registered block component receives: its (localized, validated) props + base props. */
|
|
40
|
+
export type BlockComponentProps<P = Record<string, unknown>> = P & BlockBaseProps & {
|
|
41
|
+
/** Rendered child blocks per slot (layout blocks). */
|
|
42
|
+
slots?: Record<string, React.ReactNode>;
|
|
43
|
+
block?: BlockRuntime;
|
|
44
|
+
};
|
|
45
|
+
/** Plain image data accepted by `BlockImage` and every block's media props. */
|
|
46
|
+
export interface ImageData {
|
|
47
|
+
src: string;
|
|
48
|
+
alt?: string;
|
|
49
|
+
width?: number;
|
|
50
|
+
height?: number;
|
|
51
|
+
blurDataURL?: string;
|
|
52
|
+
focal?: {
|
|
53
|
+
x: number;
|
|
54
|
+
y: number;
|
|
55
|
+
};
|
|
56
|
+
decorative?: boolean;
|
|
57
|
+
}
|
|
58
|
+
/** Plain link data accepted by `BlockLink` and every block's action props. */
|
|
59
|
+
export interface LinkData {
|
|
60
|
+
href: string;
|
|
61
|
+
label: React.ReactNode;
|
|
62
|
+
newTab?: boolean;
|
|
63
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { type LabelFn } from "../lib/labels.js";
|
|
3
|
+
export declare const approvalFlowLabels: {
|
|
4
|
+
label: string;
|
|
5
|
+
waiting: string;
|
|
6
|
+
active: string;
|
|
7
|
+
approved: string;
|
|
8
|
+
rejected: string;
|
|
9
|
+
changes_requested: string;
|
|
10
|
+
skipped: string;
|
|
11
|
+
withdrawn: string;
|
|
12
|
+
modeAll: string;
|
|
13
|
+
modeAny: string;
|
|
14
|
+
parallel: string;
|
|
15
|
+
condition: string;
|
|
16
|
+
due: string;
|
|
17
|
+
overdue: string;
|
|
18
|
+
pending: string;
|
|
19
|
+
decidedApproved: string;
|
|
20
|
+
decidedRejected: string;
|
|
21
|
+
decidedChanges: string;
|
|
22
|
+
decisionAt: string;
|
|
23
|
+
delegatedFrom: string;
|
|
24
|
+
delegated: string;
|
|
25
|
+
submittedBy: string;
|
|
26
|
+
summary: string;
|
|
27
|
+
summaryCurrent: string;
|
|
28
|
+
approve: string;
|
|
29
|
+
reject: string;
|
|
30
|
+
requestChanges: string;
|
|
31
|
+
delegate: string;
|
|
32
|
+
note: string;
|
|
33
|
+
noteOptional: string;
|
|
34
|
+
noteRequired: string;
|
|
35
|
+
noteMissing: string;
|
|
36
|
+
delegateTo: string;
|
|
37
|
+
delegateHint: string;
|
|
38
|
+
confirmApprove: string;
|
|
39
|
+
confirmReject: string;
|
|
40
|
+
confirmChanges: string;
|
|
41
|
+
confirmDelegate: string;
|
|
42
|
+
cancel: string;
|
|
43
|
+
doneApprove: string;
|
|
44
|
+
doneReject: string;
|
|
45
|
+
doneChanges: string;
|
|
46
|
+
doneDelegate: string;
|
|
47
|
+
failed: string;
|
|
48
|
+
cantAct: string;
|
|
49
|
+
};
|
|
50
|
+
export type ApprovalFlowLabels = typeof approvalFlowLabels;
|
|
51
|
+
export type ApprovalDecisionValue = "approved" | "rejected" | "changes_requested";
|
|
52
|
+
export type ApprovalStageStatus = "waiting" | "active" | "approved" | "rejected" | "changes_requested" | "skipped" | "withdrawn";
|
|
53
|
+
export interface ApprovalDecision {
|
|
54
|
+
value: ApprovalDecisionValue;
|
|
55
|
+
/** UTC ISO instant. */
|
|
56
|
+
at: string;
|
|
57
|
+
/** The approver's comment. */
|
|
58
|
+
note?: string;
|
|
59
|
+
delegatedFrom?: {
|
|
60
|
+
id: string;
|
|
61
|
+
name: string;
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
export interface ApprovalApprover {
|
|
65
|
+
id: string;
|
|
66
|
+
name: string;
|
|
67
|
+
avatarUrl?: string;
|
|
68
|
+
/** "Finance", "Line manager". */
|
|
69
|
+
role?: string;
|
|
70
|
+
decision?: ApprovalDecision;
|
|
71
|
+
}
|
|
72
|
+
export interface ApprovalStageData {
|
|
73
|
+
id: string;
|
|
74
|
+
title: string;
|
|
75
|
+
/** `"all"`: every approver must approve. `"any"`: one approval is enough. */
|
|
76
|
+
mode: "all" | "any";
|
|
77
|
+
/** Display text of the rule that added this stage ("Amount > $10,000"). */
|
|
78
|
+
condition?: string;
|
|
79
|
+
approvers: ApprovalApprover[];
|
|
80
|
+
status: ApprovalStageStatus;
|
|
81
|
+
/** SLA deadline (UTC ISO instant). */
|
|
82
|
+
dueAt?: string;
|
|
83
|
+
/** Consecutive stages with the same group run in parallel. */
|
|
84
|
+
parallelGroup?: string;
|
|
85
|
+
}
|
|
86
|
+
export interface ApprovalFlowProps extends Omit<React.HTMLAttributes<HTMLOListElement>, "children"> {
|
|
87
|
+
stages: ApprovalStageData[];
|
|
88
|
+
/** First node: who submitted and when. */
|
|
89
|
+
requester?: {
|
|
90
|
+
name: string;
|
|
91
|
+
avatarUrl?: string;
|
|
92
|
+
at: string;
|
|
93
|
+
note?: string;
|
|
94
|
+
};
|
|
95
|
+
orientation?: "vertical" | "horizontal";
|
|
96
|
+
/** `"compact"` = dots + "2 of 3 approved" (list rows). Same as `<ApprovalSummary>`. */
|
|
97
|
+
variant?: "full" | "compact";
|
|
98
|
+
/** Reference time for SLA. Default: now. */
|
|
99
|
+
now?: string | number;
|
|
100
|
+
labels?: Partial<ApprovalFlowLabels>;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* A multi-stage approval: sequential and parallel stages ("all of" / "any of"), approvers with
|
|
104
|
+
* decisions, timestamps and notes, conditions, SLA and delegation. Renders a flow the server
|
|
105
|
+
* defines; acting on it is `<ApprovalActions>`.
|
|
106
|
+
*
|
|
107
|
+
* ```tsx
|
|
108
|
+
* <ApprovalFlow requester={{ name: "Deniz Aydın", at: "2026-11-03T09:12:00Z" }} stages={stages} />
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
export declare const ApprovalFlow: React.ForwardRefExoticComponent<ApprovalFlowProps & React.RefAttributes<HTMLOListElement>>;
|
|
112
|
+
export interface ApprovalStageProps {
|
|
113
|
+
stage: ApprovalStageData;
|
|
114
|
+
last?: boolean;
|
|
115
|
+
horizontal?: boolean;
|
|
116
|
+
now?: string | number;
|
|
117
|
+
t: LabelFn<ApprovalFlowLabels>;
|
|
118
|
+
}
|
|
119
|
+
/** One stage node (rail + body). Rendered by `ApprovalFlow`; exported for custom layouts. */
|
|
120
|
+
export declare function ApprovalStage({ stage, last, horizontal, now, t }: ApprovalStageProps): React.JSX.Element;
|
|
121
|
+
export interface ApprovalSummaryProps extends React.HTMLAttributes<HTMLSpanElement> {
|
|
122
|
+
stages: ApprovalStageData[];
|
|
123
|
+
/** Show "Now: {stage}". Default `true`. */
|
|
124
|
+
showCurrent?: boolean;
|
|
125
|
+
labels?: Partial<ApprovalFlowLabels>;
|
|
126
|
+
}
|
|
127
|
+
/** Inline status for table rows: one dot per stage + "2 of 3 approved". */
|
|
128
|
+
export declare const ApprovalSummary: React.ForwardRefExoticComponent<ApprovalSummaryProps & React.RefAttributes<HTMLSpanElement>>;
|
|
129
|
+
export interface ApprovalActionsProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "children"> {
|
|
130
|
+
/** The viewer is a current approver. When `false` the bar explains that instead. */
|
|
131
|
+
canAct: boolean;
|
|
132
|
+
onApprove: (note?: string) => Promise<void> | void;
|
|
133
|
+
onReject: (note: string) => Promise<void> | void;
|
|
134
|
+
onRequestChanges?: (note: string) => Promise<void> | void;
|
|
135
|
+
onDelegate?: (to: {
|
|
136
|
+
id: string;
|
|
137
|
+
name: string;
|
|
138
|
+
}, note?: string) => Promise<void> | void;
|
|
139
|
+
/** People the decision can be delegated to. */
|
|
140
|
+
delegates?: {
|
|
141
|
+
id: string;
|
|
142
|
+
name: string;
|
|
143
|
+
}[];
|
|
144
|
+
/** Actions that need a note. Default `["reject", "changes"]`. */
|
|
145
|
+
requireNoteOn?: ("approve" | "reject" | "changes")[];
|
|
146
|
+
/** Text shown when `canAct` is false. */
|
|
147
|
+
cantActReason?: string;
|
|
148
|
+
size?: "sm" | "md";
|
|
149
|
+
labels?: Partial<ApprovalFlowLabels>;
|
|
150
|
+
}
|
|
151
|
+
/** Approve · Request changes · Reject · Delegate, each confirmed in a dialog with a note. Results are announced. */
|
|
152
|
+
export declare function ApprovalActions({ canAct, onApprove, onReject, onRequestChanges, onDelegate, delegates, requireNoteOn, cantActReason, size, labels, className, ...props }: ApprovalActionsProps): React.JSX.Element;
|