@vamos-ui/react 0.0.0-stage → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +27 -2
- package/dist/blocks/block-heading.d.ts +29 -0
- package/dist/blocks/block-heading.js +39 -0
- package/dist/blocks/block-image.d.ts +52 -0
- package/dist/blocks/block-image.js +48 -0
- package/dist/blocks/block-link.d.ts +30 -0
- package/dist/blocks/block-link.js +36 -0
- package/dist/blocks/create-blocks.d.ts +54 -0
- package/dist/blocks/create-blocks.js +52 -0
- package/dist/blocks/index.d.ts +55 -0
- package/dist/blocks/index.js +59 -0
- package/dist/blocks/json-ld.d.ts +18 -0
- package/dist/blocks/json-ld.js +44 -0
- package/dist/blocks/labels.d.ts +20 -0
- package/dist/blocks/labels.js +43 -0
- package/dist/blocks/rich-text.d.ts +36 -0
- package/dist/blocks/rich-text.js +106 -0
- package/dist/blocks/schema/define-block.d.ts +151 -0
- package/dist/blocks/schema/define-block.js +120 -0
- package/dist/blocks/schema/emphasis.d.ts +17 -0
- package/dist/blocks/schema/emphasis.js +69 -0
- package/dist/blocks/schema/fields.d.ts +497 -0
- package/dist/blocks/schema/fields.js +240 -0
- package/dist/blocks/schema/icons.d.ts +2 -0
- package/dist/blocks/schema/icons.js +26 -0
- package/dist/blocks/schema/index.d.ts +18 -0
- package/dist/blocks/schema/index.js +21 -0
- package/dist/blocks/schema/lint-types.d.ts +16 -0
- package/dist/blocks/schema/lint-types.js +2 -0
- package/dist/blocks/schema/lint.d.ts +32 -0
- package/dist/blocks/schema/lint.js +164 -0
- package/dist/blocks/schema/localize.d.ts +20 -0
- package/dist/blocks/schema/localize.js +29 -0
- package/dist/blocks/schema/localized.d.ts +25 -0
- package/dist/blocks/schema/localized.js +53 -0
- package/dist/blocks/schema/migrate.d.ts +24 -0
- package/dist/blocks/schema/migrate.js +75 -0
- package/dist/blocks/schema/nodes.d.ts +196 -0
- package/dist/blocks/schema/nodes.js +78 -0
- package/dist/blocks/schema/rich-doc-schema.d.ts +32 -0
- package/dist/blocks/schema/rich-doc-schema.js +66 -0
- package/dist/blocks/schema/rich-doc.d.ts +90 -0
- package/dist/blocks/schema/rich-doc.js +62 -0
- package/dist/blocks/schema/safety.d.ts +20 -0
- package/dist/blocks/schema/safety.js +49 -0
- package/dist/blocks/schema/types.d.ts +172 -0
- package/dist/blocks/schema/types.js +3 -0
- package/dist/blocks/schema/validate.d.ts +17 -0
- package/dist/blocks/schema/validate.js +32 -0
- package/dist/blocks/schema/walk.d.ts +22 -0
- package/dist/blocks/schema/walk.js +60 -0
- package/dist/blocks/section-header.d.ts +38 -0
- package/dist/blocks/section-header.js +22 -0
- package/dist/blocks/section.d.ts +59 -0
- package/dist/blocks/section.js +66 -0
- package/dist/blocks/site/_kit-1.d.ts +101 -0
- package/dist/blocks/site/_kit-1.js +137 -0
- package/dist/blocks/site/_site-icon-1.d.ts +6 -0
- package/dist/blocks/site/_site-icon-1.js +15 -0
- package/dist/blocks/site/announcement-bar.d.ts +42 -0
- package/dist/blocks/site/announcement-bar.js +38 -0
- package/dist/blocks/site/announcement-dismiss.d.ts +18 -0
- package/dist/blocks/site/announcement-dismiss.js +28 -0
- package/dist/blocks/site/article-layout.d.ts +65 -0
- package/dist/blocks/site/article-layout.js +88 -0
- package/dist/blocks/site/blog-list.d.ts +79 -0
- package/dist/blocks/site/blog-list.js +78 -0
- package/dist/blocks/site/comparison-table.d.ts +54 -0
- package/dist/blocks/site/comparison-table.js +38 -0
- package/dist/blocks/site/consent-banner.d.ts +52 -0
- package/dist/blocks/site/consent-banner.js +33 -0
- package/dist/blocks/site/contact-dock.d.ts +52 -0
- package/dist/blocks/site/contact-dock.js +55 -0
- package/dist/blocks/site/contact-form.d.ts +60 -0
- package/dist/blocks/site/contact-form.js +45 -0
- package/dist/blocks/site/cta-booking.d.ts +43 -0
- package/dist/blocks/site/cta-booking.js +69 -0
- package/dist/blocks/site/cta.d.ts +74 -0
- package/dist/blocks/site/cta.js +113 -0
- package/dist/blocks/site/embed-facade.d.ts +20 -0
- package/dist/blocks/site/embed-facade.js +21 -0
- package/dist/blocks/site/faq.d.ts +48 -0
- package/dist/blocks/site/faq.js +52 -0
- package/dist/blocks/site/feature-grid.d.ts +46 -0
- package/dist/blocks/site/feature-grid.js +50 -0
- package/dist/blocks/site/feature-tabs.d.ts +22 -0
- package/dist/blocks/site/feature-tabs.js +11 -0
- package/dist/blocks/site/footer.d.ts +68 -0
- package/dist/blocks/site/footer.js +61 -0
- package/dist/blocks/site/gallery-section.d.ts +42 -0
- package/dist/blocks/site/gallery-section.js +48 -0
- package/dist/blocks/site/hero-video.d.ts +15 -0
- package/dist/blocks/site/hero-video.js +31 -0
- package/dist/blocks/site/hero.d.ts +64 -0
- package/dist/blocks/site/hero.js +73 -0
- package/dist/blocks/site/logo-strip.d.ts +44 -0
- package/dist/blocks/site/logo-strip.js +27 -0
- package/dist/blocks/site/map-hours.d.ts +83 -0
- package/dist/blocks/site/map-hours.js +125 -0
- package/dist/blocks/site/media-text.d.ts +45 -0
- package/dist/blocks/site/media-text.js +56 -0
- package/dist/blocks/site/menu-list.d.ts +74 -0
- package/dist/blocks/site/menu-list.js +84 -0
- package/dist/blocks/site/navbar-submenu.d.ts +18 -0
- package/dist/blocks/site/navbar-submenu.js +51 -0
- package/dist/blocks/site/navbar.d.ts +67 -0
- package/dist/blocks/site/navbar.js +64 -0
- package/dist/blocks/site/not-found.d.ts +40 -0
- package/dist/blocks/site/not-found.js +38 -0
- package/dist/blocks/site/page-intro.d.ts +46 -0
- package/dist/blocks/site/page-intro.js +44 -0
- package/dist/blocks/site/pricing-table.d.ts +67 -0
- package/dist/blocks/site/pricing-table.js +83 -0
- package/dist/blocks/site/process.d.ts +36 -0
- package/dist/blocks/site/process.js +42 -0
- package/dist/blocks/site/registry-1.d.ts +720 -0
- package/dist/blocks/site/registry-1.js +783 -0
- package/dist/blocks/site/registry-2.d.ts +914 -0
- package/dist/blocks/site/registry-2.js +563 -0
- package/dist/blocks/site/rich-text-section.d.ts +34 -0
- package/dist/blocks/site/rich-text-section.js +32 -0
- package/dist/blocks/site/shared/brand-icons.d.ts +21 -0
- package/dist/blocks/site/shared/brand-icons.js +56 -0
- package/dist/blocks/site/shared/consent-gate.d.ts +41 -0
- package/dist/blocks/site/shared/consent-gate.js +43 -0
- package/dist/blocks/site/shared/consent-island.d.ts +38 -0
- package/dist/blocks/site/shared/consent-island.js +63 -0
- package/dist/blocks/site/shared/consent.d.ts +49 -0
- package/dist/blocks/site/shared/consent.js +130 -0
- package/dist/blocks/site/shared/contact-form-island.d.ts +41 -0
- package/dist/blocks/site/shared/contact-form-island.js +100 -0
- package/dist/blocks/site/shared/copy-link.d.ts +10 -0
- package/dist/blocks/site/shared/copy-link.js +25 -0
- package/dist/blocks/site/shared/dock-avoid.d.ts +15 -0
- package/dist/blocks/site/shared/dock-avoid.js +107 -0
- package/dist/blocks/site/shared/dock-hours.d.ts +13 -0
- package/dist/blocks/site/shared/dock-hours.js +25 -0
- package/dist/blocks/site/shared/gallery-lightbox.d.ts +12 -0
- package/dist/blocks/site/shared/gallery-lightbox.js +10 -0
- package/dist/blocks/site/shared/island-keys.d.ts +10 -0
- package/dist/blocks/site/shared/island-keys.js +44 -0
- package/dist/blocks/site/shared/kit-2.d.ts +55 -0
- package/dist/blocks/site/shared/kit-2.js +84 -0
- package/dist/blocks/site/shared/labels-2.d.ts +209 -0
- package/dist/blocks/site/shared/labels-2.js +427 -0
- package/dist/blocks/site/shared/open-now.d.ts +22 -0
- package/dist/blocks/site/shared/open-now.js +27 -0
- package/dist/blocks/site/shared/opening-hours.d.ts +117 -0
- package/dist/blocks/site/shared/opening-hours.js +245 -0
- package/dist/blocks/site/shared/site-accent.d.ts +48 -0
- package/dist/blocks/site/shared/site-accent.js +249 -0
- package/dist/blocks/site/shared/site-form.d.ts +79 -0
- package/dist/blocks/site/shared/site-form.js +111 -0
- package/dist/blocks/site/shared/site-routing.d.ts +54 -0
- package/dist/blocks/site/shared/site-routing.js +86 -0
- package/dist/blocks/site/shared/testimonials-carousel.d.ts +17 -0
- package/dist/blocks/site/shared/testimonials-carousel.js +64 -0
- package/dist/blocks/site/site-shell.d.ts +108 -0
- package/dist/blocks/site/site-shell.js +254 -0
- package/dist/blocks/site/stats-band.d.ts +42 -0
- package/dist/blocks/site/stats-band.js +45 -0
- package/dist/blocks/site/team.d.ts +44 -0
- package/dist/blocks/site/team.js +48 -0
- package/dist/blocks/site/testimonials.d.ts +68 -0
- package/dist/blocks/site/testimonials.js +66 -0
- package/dist/blocks/types.d.ts +63 -0
- package/dist/blocks/types.js +2 -0
- package/dist/business/approval-flow.d.ts +152 -0
- package/dist/business/approval-flow.js +221 -0
- package/dist/business/export-core.d.ts +55 -0
- package/dist/business/export-core.js +101 -0
- package/dist/business/export.d.ts +148 -0
- package/dist/business/export.js +264 -0
- package/dist/business/import-core.d.ts +104 -0
- package/dist/business/import-core.js +281 -0
- package/dist/business/import-wizard.d.ts +186 -0
- package/dist/business/import-wizard.js +401 -0
- package/dist/business/index.d.ts +12 -0
- package/dist/business/index.js +22 -0
- package/dist/business/line-items-core.d.ts +129 -0
- package/dist/business/line-items-core.js +183 -0
- package/dist/business/line-items.d.ts +119 -0
- package/dist/business/line-items.js +299 -0
- package/dist/business/multi-step-form.d.ts +131 -0
- package/dist/business/multi-step-form.js +337 -0
- package/dist/business/permission-core.d.ts +59 -0
- package/dist/business/permission-core.js +99 -0
- package/dist/business/permission-matrix.d.ts +158 -0
- package/dist/business/permission-matrix.js +341 -0
- package/dist/business/setup-checklist.d.ts +80 -0
- package/dist/business/setup-checklist.js +92 -0
- package/dist/business/signer-status.d.ts +53 -0
- package/dist/business/signer-status.js +76 -0
- package/dist/charts/area-chart.d.ts +35 -0
- package/dist/charts/area-chart.js +33 -0
- package/dist/charts/bar-chart.d.ts +27 -0
- package/dist/charts/bar-chart.js +46 -0
- package/dist/charts/bar-list.d.ts +47 -0
- package/dist/charts/bar-list.js +60 -0
- package/dist/charts/chart-shell.d.ts +173 -0
- package/dist/charts/chart-shell.js +205 -0
- package/dist/charts/chart.d.ts +73 -0
- package/dist/charts/chart.js +106 -0
- package/dist/charts/combo-chart.d.ts +29 -0
- package/dist/charts/combo-chart.js +47 -0
- package/dist/charts/donut-chart.d.ts +33 -0
- package/dist/charts/donut-chart.js +113 -0
- package/dist/charts/funnel.d.ts +51 -0
- package/dist/charts/funnel.js +69 -0
- package/dist/charts/gauge.d.ts +62 -0
- package/dist/charts/gauge.js +104 -0
- package/dist/charts/heatmap.d.ts +81 -0
- package/dist/charts/heatmap.js +338 -0
- package/dist/charts/index.d.ts +12 -0
- package/dist/charts/index.js +14 -0
- package/dist/charts/line-chart.d.ts +21 -0
- package/dist/charts/line-chart.js +36 -0
- package/dist/charts/test-utils.d.ts +2 -0
- package/dist/charts/test-utils.js +38 -0
- package/dist/charts/utils.d.ts +130 -0
- package/dist/charts/utils.js +262 -0
- package/dist/components/_qr-core.d.ts +26 -0
- package/dist/components/_qr-core.js +376 -0
- package/dist/components/accordion.d.ts +47 -0
- package/dist/components/accordion.js +70 -0
- package/dist/components/activity-timeline.d.ts +149 -0
- package/dist/components/activity-timeline.js +122 -0
- package/dist/components/address-field.d.ts +116 -0
- package/dist/components/address-field.js +219 -0
- package/dist/components/alert-dialog.d.ts +99 -0
- package/dist/components/alert-dialog.js +192 -0
- package/dist/components/alert.d.ts +42 -0
- package/dist/components/alert.js +82 -0
- package/dist/components/app-shell.d.ts +159 -0
- package/dist/components/app-shell.js +289 -0
- package/dist/components/attachment-list.d.ts +96 -0
- package/dist/components/attachment-list.js +196 -0
- package/dist/components/audit-log.d.ts +150 -0
- package/dist/components/audit-log.js +205 -0
- package/dist/components/avatar.d.ts +87 -0
- package/dist/components/avatar.js +126 -0
- package/dist/components/backup-codes.d.ts +42 -0
- package/dist/components/backup-codes.js +67 -0
- package/dist/components/badge.d.ts +41 -0
- package/dist/components/badge.js +68 -0
- package/dist/components/breadcrumb.d.ts +78 -0
- package/dist/components/breadcrumb.js +106 -0
- package/dist/components/button-group.d.ts +52 -0
- package/dist/components/button-group.js +77 -0
- package/dist/components/button.d.ts +58 -0
- package/dist/components/button.js +107 -0
- package/dist/components/calendar.d.ts +240 -0
- package/dist/components/calendar.js +483 -0
- package/dist/components/card.d.ts +66 -0
- package/dist/components/card.js +76 -0
- package/dist/components/carousel.d.ts +170 -0
- package/dist/components/carousel.js +348 -0
- package/dist/components/checkbox.d.ts +78 -0
- package/dist/components/checkbox.js +138 -0
- package/dist/components/color-picker.d.ts +112 -0
- package/dist/components/color-picker.js +235 -0
- package/dist/components/combobox.d.ts +136 -0
- package/dist/components/combobox.js +294 -0
- package/dist/components/command.d.ts +281 -0
- package/dist/components/command.js +498 -0
- package/dist/components/comment-thread.d.ts +252 -0
- package/dist/components/comment-thread.js +449 -0
- package/dist/components/context-menu.d.ts +77 -0
- package/dist/components/context-menu.js +82 -0
- package/dist/components/currency-input.d.ts +43 -0
- package/dist/components/currency-input.js +85 -0
- package/dist/components/date-picker.d.ts +141 -0
- package/dist/components/date-picker.js +241 -0
- package/dist/components/date-range-picker.d.ts +91 -0
- package/dist/components/date-range-picker.js +251 -0
- package/dist/components/description-list.d.ts +92 -0
- package/dist/components/description-list.js +42 -0
- package/dist/components/dialog.d.ts +139 -0
- package/dist/components/dialog.js +185 -0
- package/dist/components/dropdown-menu.d.ts +100 -0
- package/dist/components/dropdown-menu.js +102 -0
- package/dist/components/editor-layout.d.ts +166 -0
- package/dist/components/editor-layout.js +237 -0
- package/dist/components/empty-state.d.ts +49 -0
- package/dist/components/empty-state.js +68 -0
- package/dist/components/entity-card.d.ts +83 -0
- package/dist/components/entity-card.js +92 -0
- package/dist/components/file-upload.d.ts +256 -0
- package/dist/components/file-upload.js +490 -0
- package/dist/components/formatted-input.d.ts +177 -0
- package/dist/components/formatted-input.js +399 -0
- package/dist/components/hierarchy-chart.d.ts +190 -0
- package/dist/components/hierarchy-chart.js +890 -0
- package/dist/components/hover-card.d.ts +21 -0
- package/dist/components/hover-card.js +32 -0
- package/dist/components/iban-input.d.ts +38 -0
- package/dist/components/iban-input.js +112 -0
- package/dist/components/id-input.d.ts +65 -0
- package/dist/components/id-input.js +130 -0
- package/dist/components/image.d.ts +130 -0
- package/dist/components/image.js +168 -0
- package/dist/components/input-otp.d.ts +62 -0
- package/dist/components/input-otp.js +73 -0
- package/dist/components/input.d.ts +141 -0
- package/dist/components/input.js +187 -0
- package/dist/components/item.d.ts +96 -0
- package/dist/components/item.js +113 -0
- package/dist/components/kbd.d.ts +64 -0
- package/dist/components/kbd.js +119 -0
- package/dist/components/list-layout.d.ts +144 -0
- package/dist/components/list-layout.js +210 -0
- package/dist/components/native-select.d.ts +33 -0
- package/dist/components/native-select.js +48 -0
- package/dist/components/navigation-menu.d.ts +127 -0
- package/dist/components/navigation-menu.js +129 -0
- package/dist/components/notification-center.d.ts +164 -0
- package/dist/components/notification-center.js +399 -0
- package/dist/components/page-header.d.ts +60 -0
- package/dist/components/page-header.js +60 -0
- package/dist/components/pagination.d.ts +121 -0
- package/dist/components/pagination.js +174 -0
- package/dist/components/phone-input.d.ts +49 -0
- package/dist/components/phone-input.js +266 -0
- package/dist/components/pin-map.d.ts +58 -0
- package/dist/components/pin-map.js +167 -0
- package/dist/components/popover.d.ts +38 -0
- package/dist/components/popover.js +69 -0
- package/dist/components/progress.d.ts +79 -0
- package/dist/components/progress.js +97 -0
- package/dist/components/qr-code.d.ts +36 -0
- package/dist/components/qr-code.js +27 -0
- package/dist/components/radio-group.d.ts +43 -0
- package/dist/components/radio-group.js +81 -0
- package/dist/components/record-detail-layout.d.ts +167 -0
- package/dist/components/record-detail-layout.js +233 -0
- package/dist/components/record-picker.d.ts +199 -0
- package/dist/components/record-picker.js +650 -0
- package/dist/components/resizable.d.ts +50 -0
- package/dist/components/resizable.js +88 -0
- package/dist/components/scroll-area.d.ts +40 -0
- package/dist/components/scroll-area.js +56 -0
- package/dist/components/select.d.ts +126 -0
- package/dist/components/select.js +137 -0
- package/dist/components/separator.d.ts +31 -0
- package/dist/components/separator.js +41 -0
- package/dist/components/settings-layout.d.ts +134 -0
- package/dist/components/settings-layout.js +180 -0
- package/dist/components/sheet.d.ts +103 -0
- package/dist/components/sheet.js +165 -0
- package/dist/components/sidebar.d.ts +171 -0
- package/dist/components/sidebar.js +421 -0
- package/dist/components/signature-pad.d.ts +85 -0
- package/dist/components/signature-pad.js +283 -0
- package/dist/components/skeleton.d.ts +64 -0
- package/dist/components/skeleton.js +53 -0
- package/dist/components/sla-timer.d.ts +75 -0
- package/dist/components/sla-timer.js +142 -0
- package/dist/components/slider.d.ts +57 -0
- package/dist/components/slider.js +133 -0
- package/dist/components/slug-input.d.ts +69 -0
- package/dist/components/slug-input.js +201 -0
- package/dist/components/sparkline.d.ts +54 -0
- package/dist/components/sparkline.js +122 -0
- package/dist/components/spinner.d.ts +34 -0
- package/dist/components/spinner.js +34 -0
- package/dist/components/stat.d.ts +135 -0
- package/dist/components/stat.js +130 -0
- package/dist/components/status-picker.d.ts +107 -0
- package/dist/components/status-picker.js +175 -0
- package/dist/components/stepper.d.ts +86 -0
- package/dist/components/stepper.js +103 -0
- package/dist/components/switch.d.ts +34 -0
- package/dist/components/switch.js +70 -0
- package/dist/components/table.d.ts +101 -0
- package/dist/components/table.js +72 -0
- package/dist/components/tabs.d.ts +103 -0
- package/dist/components/tabs.js +173 -0
- package/dist/components/tag-input.d.ts +77 -0
- package/dist/components/tag-input.js +305 -0
- package/dist/components/task-list.d.ts +89 -0
- package/dist/components/task-list.js +238 -0
- package/dist/components/time-picker.d.ts +119 -0
- package/dist/components/time-picker.js +399 -0
- package/dist/components/toast.d.ts +87 -0
- package/dist/components/toast.js +142 -0
- package/dist/components/toggle.d.ts +77 -0
- package/dist/components/toggle.js +109 -0
- package/dist/components/tooltip.d.ts +69 -0
- package/dist/components/tooltip.js +105 -0
- package/dist/components/top-bar.d.ts +87 -0
- package/dist/components/top-bar.js +99 -0
- package/dist/components/tour.d.ts +60 -0
- package/dist/components/tour.js +139 -0
- package/dist/components/tree-select.d.ts +89 -0
- package/dist/components/tree-select.js +243 -0
- package/dist/components/tree-view.d.ts +109 -0
- package/dist/components/tree-view.js +170 -0
- package/dist/components/typography.d.ts +107 -0
- package/dist/components/typography.js +128 -0
- package/dist/components/user-picker.d.ts +89 -0
- package/dist/components/user-picker.js +162 -0
- package/dist/components/version-history.d.ts +191 -0
- package/dist/components/version-history.js +431 -0
- package/dist/data-table/csv.d.ts +27 -0
- package/dist/data-table/csv.js +68 -0
- package/dist/data-table/data-table.d.ts +423 -0
- package/dist/data-table/data-table.js +1259 -0
- package/dist/data-table/filter-bar.d.ts +146 -0
- package/dist/data-table/filter-bar.js +569 -0
- package/dist/data-table/filter-fns.d.ts +65 -0
- package/dist/data-table/filter-fns.js +382 -0
- package/dist/data-table/index.d.ts +8 -0
- package/dist/data-table/index.js +9 -0
- package/dist/data-table/saved-views.d.ts +100 -0
- package/dist/data-table/saved-views.js +251 -0
- package/dist/data-table/types.d.ts +168 -0
- package/dist/data-table/types.js +87 -0
- package/dist/data-table/url-state.d.ts +94 -0
- package/dist/data-table/url-state.js +303 -0
- package/dist/data-table/view-state.d.ts +16 -0
- package/dist/data-table/view-state.js +81 -0
- package/dist/editor/_test-setup.d.ts +1 -0
- package/dist/editor/_test-setup.js +33 -0
- package/dist/editor/block-editor.d.ts +137 -0
- package/dist/editor/block-editor.js +280 -0
- package/dist/editor/commands.d.ts +31 -0
- package/dist/editor/commands.js +150 -0
- package/dist/editor/context.d.ts +108 -0
- package/dist/editor/context.js +30 -0
- package/dist/editor/convert.d.ts +66 -0
- package/dist/editor/convert.js +567 -0
- package/dist/editor/drag-handle.d.ts +10 -0
- package/dist/editor/drag-handle.js +69 -0
- package/dist/editor/extensions.d.ts +34 -0
- package/dist/editor/extensions.js +239 -0
- package/dist/editor/index.d.ts +14 -0
- package/dist/editor/index.js +17 -0
- package/dist/editor/inserter.d.ts +12 -0
- package/dist/editor/inserter.js +88 -0
- package/dist/editor/inspector.d.ts +17 -0
- package/dist/editor/inspector.js +65 -0
- package/dist/editor/items.d.ts +62 -0
- package/dist/editor/items.js +195 -0
- package/dist/editor/labels.d.ts +119 -0
- package/dist/editor/labels.js +130 -0
- package/dist/editor/markdown.d.ts +14 -0
- package/dist/editor/markdown.js +209 -0
- package/dist/editor/menus.d.ts +20 -0
- package/dist/editor/menus.js +236 -0
- package/dist/editor/nodes.d.ts +14 -0
- package/dist/editor/nodes.js +201 -0
- package/dist/editor/outline.d.ts +11 -0
- package/dist/editor/outline.js +52 -0
- package/dist/editor/schema-form.d.ts +64 -0
- package/dist/editor/schema-form.js +290 -0
- package/dist/editor/slash-menu.d.ts +15 -0
- package/dist/editor/slash-menu.js +119 -0
- package/dist/fonts/catalog.d.ts +53 -0
- package/dist/fonts/catalog.js +121 -0
- package/dist/fonts/font-picker.d.ts +70 -0
- package/dist/fonts/font-picker.js +225 -0
- package/dist/fonts/index.d.ts +6 -0
- package/dist/fonts/index.js +7 -0
- package/dist/fonts/loader.d.ts +66 -0
- package/dist/fonts/loader.js +161 -0
- package/dist/fonts/pairing-picker.d.ts +31 -0
- package/dist/fonts/pairing-picker.js +81 -0
- package/dist/fonts/pairings.d.ts +84 -0
- package/dist/fonts/pairings.js +149 -0
- package/dist/fonts/provider.d.ts +34 -0
- package/dist/fonts/provider.js +51 -0
- package/dist/form/index.d.ts +1 -0
- package/dist/form/index.js +1 -0
- package/dist/format/core.d.ts +149 -0
- package/dist/format/core.js +357 -0
- package/dist/format/index.d.ts +4 -0
- package/dist/format/index.js +5 -0
- package/dist/format/use-format.d.ts +1 -0
- package/dist/format/use-format.js +3 -0
- package/dist/index.d.ts +91 -0
- package/dist/index.js +92 -0
- package/dist/lib/cn.d.ts +3 -0
- package/dist/lib/cn.js +16 -0
- package/dist/lib/color.d.ts +64 -0
- package/dist/lib/color.js +177 -0
- package/dist/lib/compose-refs.d.ts +24 -0
- package/dist/lib/compose-refs.js +45 -0
- package/dist/lib/data-islands.d.ts +194 -0
- package/dist/lib/data-islands.js +368 -0
- package/dist/lib/date.d.ts +129 -0
- package/dist/lib/date.js +386 -0
- package/dist/lib/field-context.d.ts +64 -0
- package/dist/lib/field-context.js +62 -0
- package/dist/lib/floating-arrow.d.ts +18 -0
- package/dist/lib/floating-arrow.js +15 -0
- package/dist/lib/islands.d.ts +38 -0
- package/dist/lib/islands.js +40 -0
- package/dist/lib/labels.d.ts +51 -0
- package/dist/lib/labels.js +56 -0
- package/dist/lib/layer.d.ts +36 -0
- package/dist/lib/layer.js +42 -0
- package/dist/lib/locale.d.ts +85 -0
- package/dist/lib/locale.js +105 -0
- package/dist/lib/menu.d.ts +58 -0
- package/dist/lib/menu.js +99 -0
- package/dist/lib/message-format.d.ts +20 -0
- package/dist/lib/message-format.js +116 -0
- package/dist/lib/nav.d.ts +132 -0
- package/dist/lib/nav.js +178 -0
- package/dist/lib/provider.d.ts +100 -0
- package/dist/lib/provider.js +105 -0
- package/dist/lib/public.d.ts +23 -0
- package/dist/lib/public.js +34 -0
- package/dist/lib/sr-name.d.ts +18 -0
- package/dist/lib/sr-name.js +17 -0
- package/dist/lib/text.d.ts +100 -0
- package/dist/lib/text.js +233 -0
- package/dist/lib/theme-scope.d.ts +58 -0
- package/dist/lib/theme-scope.js +59 -0
- package/dist/lib/use-async-list.d.ts +60 -0
- package/dist/lib/use-async-list.js +119 -0
- package/dist/lib/use-container-width.d.ts +19 -0
- package/dist/lib/use-container-width.js +39 -0
- package/dist/lib/use-controllable-state.d.ts +33 -0
- package/dist/lib/use-controllable-state.js +56 -0
- package/dist/lib/use-edge-fade.d.ts +13 -0
- package/dist/lib/use-edge-fade.js +43 -0
- package/dist/lib/use-formatted-input.d.ts +69 -0
- package/dist/lib/use-formatted-input.js +152 -0
- package/dist/lib/use-hotkeys.d.ts +80 -0
- package/dist/lib/use-hotkeys.js +221 -0
- package/dist/lib/use-hover-intent.d.ts +44 -0
- package/dist/lib/use-hover-intent.js +119 -0
- package/dist/lib/use-media-query.d.ts +21 -0
- package/dist/lib/use-media-query.js +28 -0
- package/dist/lib/use-reduced-motion.d.ts +8 -0
- package/dist/lib/use-reduced-motion.js +13 -0
- package/dist/lib/use-tree.d.ts +153 -0
- package/dist/lib/use-tree.js +534 -0
- package/dist/lib/value-format.d.ts +25 -0
- package/dist/lib/value-format.js +56 -0
- package/dist/lib/variants.d.ts +131 -0
- package/dist/lib/variants.js +109 -0
- package/dist/locale-data/core/date.d.ts +24 -0
- package/dist/locale-data/core/date.js +68 -0
- package/dist/locale-data/core/decimal.d.ts +19 -0
- package/dist/locale-data/core/decimal.js +79 -0
- package/dist/locale-data/core/holidays.d.ts +30 -0
- package/dist/locale-data/core/holidays.js +79 -0
- package/dist/locale-data/core/iban.d.ts +29 -0
- package/dist/locale-data/core/iban.js +74 -0
- package/dist/locale-data/core/index.d.ts +7 -0
- package/dist/locale-data/core/index.js +6 -0
- package/dist/locale-data/core/types.d.ts +173 -0
- package/dist/locale-data/core/types.js +6 -0
- package/dist/locale-data/core/week-info.d.ts +23 -0
- package/dist/locale-data/core/week-info.js +85 -0
- package/dist/locale-data/core/working-days.d.ts +27 -0
- package/dist/locale-data/core/working-days.js +133 -0
- package/dist/locale-data/index.d.ts +2 -0
- package/dist/locale-data/index.js +4 -0
- package/dist/locale-data/tr/address-tr.json +1 -0
- package/dist/locale-data/tr/address.d.ts +23 -0
- package/dist/locale-data/tr/address.js +52 -0
- package/dist/locale-data/tr/holidays.d.ts +31 -0
- package/dist/locale-data/tr/holidays.js +81 -0
- package/dist/locale-data/tr/iban.d.ts +21 -0
- package/dist/locale-data/tr/iban.js +45 -0
- package/dist/locale-data/tr/id.d.ts +36 -0
- package/dist/locale-data/tr/id.js +120 -0
- package/dist/locale-data/tr/index.d.ts +12 -0
- package/dist/locale-data/tr/index.js +33 -0
- package/dist/locale-data/tr/kdv.d.ts +91 -0
- package/dist/locale-data/tr/kdv.js +222 -0
- package/dist/locales/en.d.ts +2102 -0
- package/dist/locales/en.js +2088 -0
- package/dist/locales/tr.d.ts +2086 -0
- package/dist/locales/tr.js +2087 -0
- package/dist/media/focal-point.d.ts +42 -0
- package/dist/media/focal-point.js +96 -0
- package/dist/media/gallery-layout.d.ts +19 -0
- package/dist/media/gallery-layout.js +61 -0
- package/dist/media/gallery.d.ts +64 -0
- package/dist/media/gallery.js +140 -0
- package/dist/media/image-cropper.d.ts +86 -0
- package/dist/media/image-cropper.js +170 -0
- package/dist/media/image-field.d.ts +115 -0
- package/dist/media/image-field.js +212 -0
- package/dist/media/index.d.ts +19 -0
- package/dist/media/index.js +23 -0
- package/dist/media/lightbox.d.ts +82 -0
- package/dist/media/lightbox.js +171 -0
- package/dist/media/link-preview.d.ts +97 -0
- package/dist/media/link-preview.js +177 -0
- package/dist/media/media-library.d.ts +244 -0
- package/dist/media/media-library.js +776 -0
- package/dist/media/media-picker.d.ts +96 -0
- package/dist/media/media-picker.js +209 -0
- package/dist/media/media-provider.d.ts +23 -0
- package/dist/media/media-provider.js +44 -0
- package/dist/media/media-utils.d.ts +39 -0
- package/dist/media/media-utils.js +145 -0
- package/dist/media/memory-adapter.d.ts +22 -0
- package/dist/media/memory-adapter.js +162 -0
- package/dist/media/rest-adapter.d.ts +90 -0
- package/dist/media/rest-adapter.js +208 -0
- package/dist/media/serp.d.ts +62 -0
- package/dist/media/serp.js +108 -0
- package/dist/media/test-fixtures.d.ts +3 -0
- package/dist/media/test-fixtures.js +37 -0
- package/dist/media/types.d.ts +183 -0
- package/dist/media/types.js +3 -0
- package/dist/media/use-pan-zoom.d.ts +51 -0
- package/dist/media/use-pan-zoom.js +156 -0
- package/dist/media/use-upload-queue.d.ts +64 -0
- package/dist/media/use-upload-queue.js +115 -0
- package/dist/media/video-player.d.ts +135 -0
- package/dist/media/video-player.js +319 -0
- package/dist/motion/core.d.ts +32 -0
- package/dist/motion/core.js +77 -0
- package/dist/motion/count-up.d.ts +29 -0
- package/dist/motion/count-up.js +92 -0
- package/dist/motion/index.d.ts +11 -0
- package/dist/motion/index.js +13 -0
- package/dist/motion/motion-scope.d.ts +17 -0
- package/dist/motion/motion-scope.js +16 -0
- package/dist/motion/page-transition.d.ts +33 -0
- package/dist/motion/page-transition.js +61 -0
- package/dist/motion/parallax.d.ts +37 -0
- package/dist/motion/parallax.js +90 -0
- package/dist/motion/pointer.d.ts +38 -0
- package/dist/motion/pointer.js +117 -0
- package/dist/motion/reveal.d.ts +72 -0
- package/dist/motion/reveal.js +133 -0
- package/dist/motion/scroll-shrink.d.ts +18 -0
- package/dist/motion/scroll-shrink.js +47 -0
- package/dist/motion/skeleton-swap.d.ts +17 -0
- package/dist/motion/skeleton-swap.js +43 -0
- package/dist/motion/text-reveal.d.ts +30 -0
- package/dist/motion/text-reveal.js +29 -0
- package/dist/motion/ticker.d.ts +35 -0
- package/dist/motion/ticker.js +16 -0
- package/dist/next/index.d.ts +42 -0
- package/dist/next/index.js +36 -0
- package/dist/render/block-renderer.d.ts +56 -0
- package/dist/render/block-renderer.js +137 -0
- package/dist/render/index.d.ts +6 -0
- package/dist/render/index.js +7 -0
- package/dist/render/prepare.d.ts +61 -0
- package/dist/render/prepare.js +119 -0
- package/dist/scheduler/core/duration.d.ts +83 -0
- package/dist/scheduler/core/duration.js +174 -0
- package/dist/scheduler/core/gantt.d.ts +63 -0
- package/dist/scheduler/core/gantt.js +226 -0
- package/dist/scheduler/core/index.d.ts +6 -0
- package/dist/scheduler/core/index.js +7 -0
- package/dist/scheduler/core/layout.d.ts +97 -0
- package/dist/scheduler/core/layout.js +249 -0
- package/dist/scheduler/core/time-scale.d.ts +89 -0
- package/dist/scheduler/core/time-scale.js +173 -0
- package/dist/scheduler/gantt.d.ts +125 -0
- package/dist/scheduler/gantt.js +532 -0
- package/dist/scheduler/index.d.ts +6 -0
- package/dist/scheduler/index.js +7 -0
- package/dist/scheduler/resource-calendar.d.ts +218 -0
- package/dist/scheduler/resource-calendar.js +661 -0
- package/dist/scheduler/scheduler.d.ts +168 -0
- package/dist/scheduler/scheduler.js +768 -0
- package/dist/scheduler/shared.d.ts +63 -0
- package/dist/scheduler/shared.js +145 -0
- package/dist/scheduler/time-tracker.d.ts +138 -0
- package/dist/scheduler/time-tracker.js +403 -0
- package/dist/sortable/core.d.ts +67 -0
- package/dist/sortable/core.js +167 -0
- package/dist/sortable/index.d.ts +8 -0
- package/dist/sortable/index.js +10 -0
- package/dist/sortable/kanban-core.d.ts +70 -0
- package/dist/sortable/kanban-core.js +67 -0
- package/dist/sortable/kanban.d.ts +147 -0
- package/dist/sortable/kanban.js +472 -0
- package/dist/sortable/sortable-list.d.ts +71 -0
- package/dist/sortable/sortable-list.js +76 -0
- package/dist/sortable/sortable-tree.d.ts +105 -0
- package/dist/sortable/sortable-tree.js +462 -0
- package/dist/sortable/sortable.d.ts +188 -0
- package/dist/sortable/sortable.js +485 -0
- package/dist/sortable/use-pointer-drag.d.ts +75 -0
- package/dist/sortable/use-pointer-drag.js +173 -0
- package/dist/sortable/use-time-scale.d.ts +11 -0
- package/dist/sortable/use-time-scale.js +19 -0
- package/dist/styles/base.css +51 -0
- package/dist/styles/blocks.css +949 -0
- package/dist/styles/calendar.css +642 -0
- package/dist/styles/charts.css +264 -0
- package/dist/styles/data.css +474 -0
- package/dist/styles/editors.css +1022 -0
- package/dist/styles/forms.css +406 -0
- package/dist/styles/media.css +515 -0
- package/dist/styles/motion.css +389 -0
- package/dist/styles/navigation.css +293 -0
- package/dist/styles/overlays.css +244 -0
- package/dist/styles.css +743 -0
- package/package.json +160 -4
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { RadioGroup as RadioGroupPrimitive } from "radix-ui";
|
|
5
|
+
import { cn } from "../lib/cn.js";
|
|
6
|
+
import { mergeIds } from "../lib/compose-refs.js";
|
|
7
|
+
import { FieldContextReset, useFieldContext } from "../lib/field-context.js";
|
|
8
|
+
import { useControllableState } from "../lib/use-controllable-state.js";
|
|
9
|
+
const RadioGroupContext = React.createContext({ variant: "default", size: "md", value: null });
|
|
10
|
+
const segmentedTrack = "inline-flex w-fit max-w-full items-stretch gap-0.5 rounded-ui border border-line bg-selected p-[3px] has-[:focus-visible]:border-ring aria-invalid:border-danger";
|
|
11
|
+
/**
|
|
12
|
+
* Pick exactly one of a small set: post visibility, invoice type, plan. WAI-ARIA radio group on
|
|
13
|
+
* Radix (one tab stop, arrow keys move and select). Labelled by the surrounding Field / Fieldset.
|
|
14
|
+
*
|
|
15
|
+
* ```tsx
|
|
16
|
+
* <Field label="Visibility">
|
|
17
|
+
* <RadioGroup name="visibility" defaultValue="public" items={[{ value: "public", label: "Public" }, { value: "private", label: "Private" }]} />
|
|
18
|
+
* </Field>
|
|
19
|
+
* <RadioGroup variant="segmented" items={…} aria-label="Billing period" />
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
function RadioGroupInner({ value: valueProp, defaultValue, onValueChange, items, variant = "default", orientation, size = "md", invalid, readOnly, disabled, required, name, id, className, children, "aria-labelledby": labelledBy, "aria-describedby": describedBy, ...props }, ref) {
|
|
23
|
+
const field = useFieldContext();
|
|
24
|
+
const [value, setValue] = useControllableState({
|
|
25
|
+
value: valueProp,
|
|
26
|
+
defaultValue: defaultValue ?? null,
|
|
27
|
+
onChange: (v) => {
|
|
28
|
+
if (v !== null)
|
|
29
|
+
onValueChange?.(v);
|
|
30
|
+
},
|
|
31
|
+
name: "RadioGroup",
|
|
32
|
+
});
|
|
33
|
+
const dir = orientation ?? (variant === "segmented" ? "horizontal" : "vertical");
|
|
34
|
+
const isInvalid = invalid ?? field?.invalid;
|
|
35
|
+
const isReadOnly = readOnly ?? field?.readOnly;
|
|
36
|
+
const isRequired = required ?? field?.required;
|
|
37
|
+
const ctx = React.useMemo(() => ({ variant, size, value, readOnly: isReadOnly }), [variant, size, value, isReadOnly]);
|
|
38
|
+
return (_jsx(RadioGroupPrimitive.Root, { ...props, ref: ref, "data-slot": "radio-group", "data-variant": variant, id: id ?? field?.id, name: name ?? field?.name, disabled: disabled ?? (field?.disabled || undefined), required: isRequired || undefined, "aria-labelledby": labelledBy ?? (props["aria-label"] ? undefined : field?.labelId), "aria-describedby": mergeIds(field?.describedBy, describedBy), "aria-invalid": isInvalid || undefined, "aria-readonly": isReadOnly || undefined, orientation: dir,
|
|
39
|
+
// Radix treats "" as "no selection".
|
|
40
|
+
value: value ?? "", onValueChange: (v) => {
|
|
41
|
+
if (isReadOnly)
|
|
42
|
+
return;
|
|
43
|
+
setValue(v);
|
|
44
|
+
}, className: cn("group/radio", variant === "segmented"
|
|
45
|
+
? segmentedTrack
|
|
46
|
+
: variant === "card"
|
|
47
|
+
? dir === "horizontal"
|
|
48
|
+
? "grid gap-2.5 sm:grid-cols-[repeat(auto-fit,minmax(12rem,1fr))]"
|
|
49
|
+
: "grid gap-2.5"
|
|
50
|
+
: dir === "horizontal"
|
|
51
|
+
? "flex flex-wrap items-start gap-x-6 gap-y-2.5"
|
|
52
|
+
: "grid gap-2.5", className), children: _jsx(FieldContextReset, { children: _jsxs(RadioGroupContext.Provider, { value: ctx, children: [items?.map((item) => (_jsx(RadioGroupItem, { value: item.value, label: item.label, description: item.description, icon: item.icon, disabled: item.disabled }, item.value))), children] }) }) }));
|
|
53
|
+
}
|
|
54
|
+
export const RadioGroup = React.forwardRef(RadioGroupInner);
|
|
55
|
+
const circle = "peer relative inline-flex shrink-0 items-center justify-center rounded-full border border-field-border-hover bg-field outline-none transition-[border-color,box-shadow,background-color] duration-150 hover:border-fg-subtle focus-visible:border-ring focus-visible:shadow-[0_0_0_3px_var(--accent-soft)] data-[state=checked]:border-accent-ink disabled:cursor-not-allowed disabled:opacity-45 group-aria-invalid/radio:border-danger";
|
|
56
|
+
/** One option inside a `RadioGroup`. */
|
|
57
|
+
export const RadioGroupItem = React.forwardRef(function RadioGroupItem({ label, description, icon, children, className, controlClassName, id: idProp, "aria-describedby": describedBy, onKeyDown, ...props }, ref) {
|
|
58
|
+
const { variant, size, value: selected, readOnly } = React.useContext(RadioGroupContext);
|
|
59
|
+
const autoId = React.useId();
|
|
60
|
+
const id = idProp ?? `rd${autoId.replace(/:/g, "")}`;
|
|
61
|
+
const labelId = `${id}-label`;
|
|
62
|
+
const descId = description ? `${id}-desc` : undefined;
|
|
63
|
+
const checked = selected === props.value;
|
|
64
|
+
const guard = (e) => {
|
|
65
|
+
onKeyDown?.(e);
|
|
66
|
+
if (readOnly && e.key === " ")
|
|
67
|
+
e.preventDefault();
|
|
68
|
+
};
|
|
69
|
+
if (variant === "segmented") {
|
|
70
|
+
return (_jsxs(RadioGroupPrimitive.Item, { ref: ref, id: id, "data-slot": "radio-segment", "aria-describedby": describedBy, onKeyDown: guard, className: cn("relative inline-flex min-w-0 flex-auto items-center justify-center gap-1.5 whitespace-nowrap rounded-[calc(var(--radius)-5px)] font-medium text-fg-muted outline-none", "transition-[background-color,color,box-shadow] duration-150 hover:text-fg", "focus-visible:shadow-[0_0_0_2px_var(--ring)]", "data-[state=checked]:bg-(--segment-thumb) data-[state=checked]:text-fg data-[state=checked]:shadow-(--segment-thumb-shadow)", "disabled:pointer-events-none disabled:opacity-45 [&_svg]:shrink-0", size === "sm" ? "h-[calc(var(--control-h)-0.5rem-8px)] px-2.5 text-xs [&_svg]:size-3.5" : "h-[calc(var(--control-h)-8px)] px-3.5 text-[13px] [&_svg]:size-4", className), ...props, children: [icon, label ?? children] }));
|
|
71
|
+
}
|
|
72
|
+
const dot = (_jsx(RadioGroupPrimitive.Item, { ref: ref, id: id, "data-slot": "radio", "aria-labelledby": label ? labelId : undefined, "aria-describedby": mergeIds(descId, describedBy), onKeyDown: guard, className: cn(circle, size === "sm" ? "size-4" : "size-[18px]", controlClassName, !label && className), ...props, children: _jsx(RadioGroupPrimitive.Indicator, { "data-slot": "radio-indicator", className: cn("ui-radio-dot rounded-full bg-accent-ink", size === "sm" ? "size-1.5" : "size-2") }) }));
|
|
73
|
+
if (!label)
|
|
74
|
+
return dot;
|
|
75
|
+
const textSize = size === "sm" ? "text-[13px]" : "text-sm";
|
|
76
|
+
const descSize = size === "sm" ? "text-[11.5px]" : "text-xs";
|
|
77
|
+
if (variant === "card") {
|
|
78
|
+
return (_jsxs("label", { htmlFor: id, "data-slot": "radio-card", "data-state": checked ? "checked" : "unchecked", "data-disabled": props.disabled ? "" : undefined, className: cn("relative flex cursor-pointer items-start gap-3 rounded-ui border border-field-border bg-field p-3.5 transition-[background-color,border-color,box-shadow] duration-150", "hover:border-field-border-hover glass:border-field-border-hover", "has-[:focus-visible]:border-ring has-[:focus-visible]:shadow-[0_0_0_3px_var(--accent-soft)]", "data-[state=checked]:border-accent-ink data-[state=checked]:bg-[color-mix(in_oklch,var(--accent-base)_11%,transparent)] data-[state=checked]:shadow-[inset_0_0_0_1px_var(--accent-ink)]", "group-aria-invalid/radio:border-danger data-disabled:cursor-not-allowed data-disabled:opacity-50", className), children: [icon ? _jsx("span", { className: "mt-px flex size-8 shrink-0 items-center justify-center rounded-ui-sm bg-surface-2 text-fg-muted [&_svg]:size-4", children: icon }) : null, _jsxs("span", { className: "grid min-w-0 flex-1 gap-0.5", children: [_jsx("span", { id: labelId, className: cn("font-medium text-fg", textSize), children: label }), description ? (_jsx("span", { id: descId, className: cn("text-pretty leading-[1.45] text-fg-muted", descSize), children: description })) : null, children ? _jsx("span", { className: "mt-1.5 block", children: children }) : null] }), _jsx("span", { className: "mt-px", children: dot })] }));
|
|
79
|
+
}
|
|
80
|
+
return (_jsxs("div", { "data-slot": "radio-row", className: cn("flex items-start gap-2.5", className), children: [_jsx("span", { className: cn("flex shrink-0 items-center", size === "sm" ? "h-[19.5px]" : "h-5"), children: dot }), _jsxs("label", { htmlFor: id, className: cn("grid min-w-0 select-none gap-0.5", props.disabled ? "cursor-not-allowed opacity-60" : "cursor-pointer"), children: [_jsx("span", { id: labelId, className: cn("leading-5 text-fg", textSize), children: label }), description ? (_jsx("span", { id: descId, className: cn("text-pretty leading-[1.45] text-fg-muted", descSize), children: description })) : null, children] })] }));
|
|
81
|
+
});
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
declare const recordLabels: {
|
|
3
|
+
pager: string;
|
|
4
|
+
pagerLabel: string;
|
|
5
|
+
previous: string;
|
|
6
|
+
next: string;
|
|
7
|
+
details: string;
|
|
8
|
+
facts: string;
|
|
9
|
+
saving: string;
|
|
10
|
+
notFound: string;
|
|
11
|
+
notFoundDescription: string;
|
|
12
|
+
forbidden: string;
|
|
13
|
+
forbiddenDescription: string;
|
|
14
|
+
loading: string;
|
|
15
|
+
resizeAside: string;
|
|
16
|
+
};
|
|
17
|
+
export type RecordLayoutLabels = Partial<typeof recordLabels>;
|
|
18
|
+
export interface SidePaneHandleProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange" | "defaultValue"> {
|
|
19
|
+
/** Current pane width in px. */
|
|
20
|
+
value: number;
|
|
21
|
+
min?: number;
|
|
22
|
+
max?: number;
|
|
23
|
+
/** Width restored on double-click. */
|
|
24
|
+
defaultValue?: number;
|
|
25
|
+
onValueChange: (width: number) => void;
|
|
26
|
+
/** Which edge of the pane the handle sits on. A pane at the inline end has its handle on its `start` edge. */
|
|
27
|
+
edge?: "start" | "end";
|
|
28
|
+
/** Keyboard step in px. Default 16 (Shift: ×4). */
|
|
29
|
+
step?: number;
|
|
30
|
+
/** Accessible name. */
|
|
31
|
+
"aria-label": string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* The drag edge of a side column (WAI-ARIA window splitter: focusable `separator` with
|
|
35
|
+
* `aria-valuenow`; arrows resize, Shift+arrows in bigger steps, Home/End jump to min/max,
|
|
36
|
+
* double-click resets). Logical: works in RTL.
|
|
37
|
+
*/
|
|
38
|
+
export declare const SidePaneHandle: React.ForwardRefExoticComponent<SidePaneHandleProps & React.RefAttributes<HTMLDivElement>>;
|
|
39
|
+
export type RecordLayoutState = "ready" | "loading" | "not-found" | "forbidden";
|
|
40
|
+
export interface RecordLayoutProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
41
|
+
/** Side column at the inline `end` (default) or `start`. */
|
|
42
|
+
asidePosition?: "end" | "start";
|
|
43
|
+
/** Side column width in px (controlled with `onAsideWidthChange`). */
|
|
44
|
+
asideWidth?: number;
|
|
45
|
+
/** Initial width when uncontrolled. Default 320. */
|
|
46
|
+
defaultAsideWidth?: number;
|
|
47
|
+
onAsideWidthChange?: (width: number) => void;
|
|
48
|
+
/** Lets the user drag (or arrow-key) the side column's edge. */
|
|
49
|
+
resizable?: boolean;
|
|
50
|
+
minAsideWidth?: number;
|
|
51
|
+
maxAsideWidth?: number;
|
|
52
|
+
/** `loading` shows a skeleton page; `not-found` / `forbidden` a full-page empty state. */
|
|
53
|
+
state?: RecordLayoutState;
|
|
54
|
+
/** Replace the default not-found page. */
|
|
55
|
+
notFound?: React.ReactNode;
|
|
56
|
+
/** Replace the default forbidden page. */
|
|
57
|
+
forbidden?: React.ReactNode;
|
|
58
|
+
/** Hides header actions. Pair with read-only fields. */
|
|
59
|
+
readOnly?: boolean;
|
|
60
|
+
labels?: RecordLayoutLabels;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* The "show one record" page: record header (media, title, status, key facts, actions, pager),
|
|
64
|
+
* a main column (tabs, overview, activity, related lists) and a side column of details.
|
|
65
|
+
* Below 42rem (672px) of its own width the side column moves under the header and its
|
|
66
|
+
* sections fold, and the key facts become a horizontal strip. It measures itself, not the
|
|
67
|
+
* viewport, so it works the same beside an App shell sidebar or in a split view.
|
|
68
|
+
*
|
|
69
|
+
* ```tsx
|
|
70
|
+
* <RecordLayout>
|
|
71
|
+
* <RecordHeader media={<Avatar name="Jane Doe" size="xl" />} title="Jane Doe" subtitle="Head of Ops · Northpoint"
|
|
72
|
+
* status={<Badge tone="success">Customer</Badge>} facts={[{ label: "Owner", value: "Meltem Aydın" }]}
|
|
73
|
+
* pager={<RecordPager index={3} total={128} prevHref="/contacts/41" nextHref="/contacts/43" />} />
|
|
74
|
+
* <RecordMain>{tabs}</RecordMain>
|
|
75
|
+
* <RecordAside><RecordAsideSection title="Details"><DescriptionList … /></RecordAsideSection></RecordAside>
|
|
76
|
+
* </RecordLayout>
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
export declare const RecordLayout: React.ForwardRefExoticComponent<RecordLayoutProps & React.RefAttributes<HTMLDivElement>>;
|
|
80
|
+
export interface RecordFact {
|
|
81
|
+
label: React.ReactNode;
|
|
82
|
+
value: React.ReactNode;
|
|
83
|
+
}
|
|
84
|
+
export interface RecordHeaderProps extends Omit<React.HTMLAttributes<HTMLElement>, "title"> {
|
|
85
|
+
/** Avatar, logo or icon well. */
|
|
86
|
+
media?: React.ReactNode;
|
|
87
|
+
/** The page's `<h1>`. */
|
|
88
|
+
title: React.ReactNode;
|
|
89
|
+
/** "Head of Operations · Northpoint Ltd". */
|
|
90
|
+
subtitle?: React.ReactNode;
|
|
91
|
+
/** Status badge next to the title. */
|
|
92
|
+
status?: React.ReactNode;
|
|
93
|
+
/** Key facts under the title: owner, stage, value, last contact. */
|
|
94
|
+
facts?: RecordFact[];
|
|
95
|
+
/** Header actions. Hidden when the layout is `readOnly`. */
|
|
96
|
+
actions?: React.ReactNode;
|
|
97
|
+
/** "← Contacts" link up a level. */
|
|
98
|
+
back?: {
|
|
99
|
+
href: string;
|
|
100
|
+
label: string;
|
|
101
|
+
};
|
|
102
|
+
/** `RecordPager` (top end). */
|
|
103
|
+
pager?: React.ReactNode;
|
|
104
|
+
/** Shows "Saving…" next to the title while inline edits save. */
|
|
105
|
+
saving?: boolean;
|
|
106
|
+
/** `sm` for nested or compact records. Default `md`. */
|
|
107
|
+
size?: "sm" | "md";
|
|
108
|
+
/** Skeleton for the title and subtitle. */
|
|
109
|
+
loading?: boolean;
|
|
110
|
+
labels?: RecordLayoutLabels;
|
|
111
|
+
}
|
|
112
|
+
/** The record's header: back link + pager, media, h1, status, subtitle, actions and key facts. */
|
|
113
|
+
export declare const RecordHeader: React.ForwardRefExoticComponent<RecordHeaderProps & React.RefAttributes<HTMLElement>>;
|
|
114
|
+
export interface RecordPagerProps extends Omit<React.HTMLAttributes<HTMLElement>, "onChange"> {
|
|
115
|
+
/** 1-based position of this record in the list it came from. */
|
|
116
|
+
index: number;
|
|
117
|
+
total: number;
|
|
118
|
+
prevHref?: string;
|
|
119
|
+
nextHref?: string;
|
|
120
|
+
/** Called instead of (or as well as) navigating. */
|
|
121
|
+
onPrevious?: () => void;
|
|
122
|
+
onNext?: () => void;
|
|
123
|
+
/** Register `k` (previous) and `j` (next). Ignored while typing in a field. Default `true`. */
|
|
124
|
+
shortcuts?: boolean;
|
|
125
|
+
labels?: RecordLayoutLabels;
|
|
126
|
+
}
|
|
127
|
+
/** "3 of 128" with previous/next buttons and `j` / `k` shortcuts. */
|
|
128
|
+
export declare const RecordPager: React.ForwardRefExoticComponent<RecordPagerProps & React.RefAttributes<HTMLElement>>;
|
|
129
|
+
export interface RecordMainProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
130
|
+
/** Route tabs (`TabsLinkList`) above the content. For in-page tabs, put `<Tabs>` in `children`. */
|
|
131
|
+
tabs?: React.ReactNode;
|
|
132
|
+
}
|
|
133
|
+
/** The main column: tabs, overview, activity, related lists. */
|
|
134
|
+
export declare const RecordMain: React.ForwardRefExoticComponent<RecordMainProps & React.RefAttributes<HTMLDivElement>>;
|
|
135
|
+
export interface RecordSectionProps extends Omit<React.HTMLAttributes<HTMLElement>, "title"> {
|
|
136
|
+
title: React.ReactNode;
|
|
137
|
+
description?: React.ReactNode;
|
|
138
|
+
/** Trailing control in the section header ("View all", "Log call"). */
|
|
139
|
+
action?: React.ReactNode;
|
|
140
|
+
/** Body padding. `none` for edge-to-edge tables and timelines. Default `md`. */
|
|
141
|
+
padding?: "none" | "md";
|
|
142
|
+
}
|
|
143
|
+
/** A titled card in the main column: overview, activity, related deals. `<section aria-labelledby>`. */
|
|
144
|
+
export declare const RecordSection: React.ForwardRefExoticComponent<RecordSectionProps & React.RefAttributes<HTMLElement>>;
|
|
145
|
+
export interface RecordAsideProps extends React.HTMLAttributes<HTMLElement> {
|
|
146
|
+
/** Accessible name of the complementary landmark. Default "Details". */
|
|
147
|
+
"aria-label"?: string;
|
|
148
|
+
labels?: RecordLayoutLabels;
|
|
149
|
+
}
|
|
150
|
+
/** The side column (`<aside>`): description lists, owners, tags, related records. */
|
|
151
|
+
export declare const RecordAside: React.ForwardRefExoticComponent<RecordAsideProps & React.RefAttributes<HTMLElement>>;
|
|
152
|
+
export interface RecordAsideSectionProps extends Omit<React.HTMLAttributes<HTMLElement>, "title"> {
|
|
153
|
+
title: React.ReactNode;
|
|
154
|
+
/** Trailing control ("Edit", "+"). */
|
|
155
|
+
action?: React.ReactNode;
|
|
156
|
+
/** Let the user fold the section on wide screens too. On narrow layouts every section folds. */
|
|
157
|
+
collapsible?: boolean;
|
|
158
|
+
/** Default `true` on wide layouts; narrow layouts start folded unless `open` is controlled. */
|
|
159
|
+
defaultOpen?: boolean;
|
|
160
|
+
open?: boolean;
|
|
161
|
+
onOpenChange?: (open: boolean) => void;
|
|
162
|
+
/** Heading level to fit the page outline. Default 2. */
|
|
163
|
+
headingLevel?: 2 | 3;
|
|
164
|
+
}
|
|
165
|
+
/** A titled block in the side column; folds like an accordion item when space is short. */
|
|
166
|
+
export declare const RecordAsideSection: React.ForwardRefExoticComponent<RecordAsideSectionProps & React.RefAttributes<HTMLElement>>;
|
|
167
|
+
export {};
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { Collapsible } from "radix-ui";
|
|
5
|
+
import { ArrowLeft, ChevronDown, ChevronLeft, ChevronRight, LockKeyhole, SearchX } from "lucide-react";
|
|
6
|
+
import { cn } from "../lib/cn.js";
|
|
7
|
+
import { useLabels } from "../lib/labels.js";
|
|
8
|
+
import { useFormat } from "../lib/locale.js";
|
|
9
|
+
import { SmartLink, useNavigation } from "../lib/provider.js";
|
|
10
|
+
import { useHotkeys } from "../lib/use-hotkeys.js";
|
|
11
|
+
import { useContainerWidth } from "../lib/use-container-width.js";
|
|
12
|
+
import { useControllableState } from "../lib/use-controllable-state.js";
|
|
13
|
+
import { useComposedRefs } from "../lib/compose-refs.js";
|
|
14
|
+
import { useEdgeFade } from "../lib/use-edge-fade.js";
|
|
15
|
+
import { Button } from "./button.js";
|
|
16
|
+
import { EmptyStateDescription, EmptyStateIcon, emptyStateVariants } from "./empty-state.js";
|
|
17
|
+
import { Skeleton, SkeletonAvatar, SkeletonText } from "./skeleton.js";
|
|
18
|
+
import { Spinner } from "./spinner.js";
|
|
19
|
+
/* ------------------------------------------------------------------ */
|
|
20
|
+
/* Labels & context */
|
|
21
|
+
/* ------------------------------------------------------------------ */
|
|
22
|
+
const recordLabels = {
|
|
23
|
+
pager: "{index} of {total}",
|
|
24
|
+
pagerLabel: "Record navigation",
|
|
25
|
+
previous: "Previous record",
|
|
26
|
+
next: "Next record",
|
|
27
|
+
details: "Details",
|
|
28
|
+
facts: "Key facts",
|
|
29
|
+
saving: "Saving…",
|
|
30
|
+
notFound: "Record not found",
|
|
31
|
+
notFoundDescription: "It may have been deleted, merged into another record, or the link is out of date.",
|
|
32
|
+
forbidden: "You don't have access to this record",
|
|
33
|
+
forbiddenDescription: "Ask an admin of this workspace to share it with you.",
|
|
34
|
+
loading: "Loading record",
|
|
35
|
+
resizeAside: "Resize side column",
|
|
36
|
+
};
|
|
37
|
+
/** Below this container width (42rem) the side column moves under the header as collapsed sections. Matches navigation.css. */
|
|
38
|
+
const NARROW = 672;
|
|
39
|
+
const RecordLayoutContext = React.createContext({
|
|
40
|
+
narrow: false,
|
|
41
|
+
readOnly: false,
|
|
42
|
+
asidePosition: "end",
|
|
43
|
+
resizable: false,
|
|
44
|
+
asideWidth: 320,
|
|
45
|
+
minAsideWidth: 260,
|
|
46
|
+
maxAsideWidth: 520,
|
|
47
|
+
defaultAsideWidth: 320,
|
|
48
|
+
setAsideWidth: () => { },
|
|
49
|
+
});
|
|
50
|
+
/**
|
|
51
|
+
* The drag edge of a side column (WAI-ARIA window splitter: focusable `separator` with
|
|
52
|
+
* `aria-valuenow`; arrows resize, Shift+arrows in bigger steps, Home/End jump to min/max,
|
|
53
|
+
* double-click resets). Logical: works in RTL.
|
|
54
|
+
*/
|
|
55
|
+
export const SidePaneHandle = React.forwardRef(function SidePaneHandle({ value, min = 240, max = 560, defaultValue, onValueChange, edge = "start", step = 16, className, onKeyDown, onDoubleClick, ...props }, ref) {
|
|
56
|
+
const innerRef = React.useRef(null);
|
|
57
|
+
const composed = useComposedRefs(ref, innerRef);
|
|
58
|
+
const [dragging, setDragging] = React.useState(false);
|
|
59
|
+
const clamp = (w) => Math.round(Math.min(max, Math.max(min, w)));
|
|
60
|
+
const dir = () => (innerRef.current && getComputedStyle(innerRef.current).direction === "rtl" ? -1 : 1);
|
|
61
|
+
// dx is a visual (screen) movement of the handle; turn it into a width change.
|
|
62
|
+
const grow = (dx) => (edge === "start" ? -dx : dx) * dir();
|
|
63
|
+
return (_jsx("div", { ref: composed, role: "separator", "aria-orientation": "vertical", "aria-valuenow": value, "aria-valuemin": min, "aria-valuemax": max, tabIndex: 0, "data-slot": "side-pane-handle", "data-dragging": dragging ? "" : undefined, className: cn("vui-pane-handle group/pane absolute inset-y-0 z-[1] w-2 cursor-col-resize touch-none outline-none", edge === "start" ? "-start-[calc(var(--gap)/2+4px)]" : "-end-[calc(var(--gap)/2+4px)]", className), onPointerDown: (e) => {
|
|
64
|
+
if (e.button !== 0)
|
|
65
|
+
return;
|
|
66
|
+
e.preventDefault();
|
|
67
|
+
const el = e.currentTarget;
|
|
68
|
+
el.setPointerCapture?.(e.pointerId);
|
|
69
|
+
const startX = e.clientX;
|
|
70
|
+
const startW = value;
|
|
71
|
+
setDragging(true);
|
|
72
|
+
const move = (ev) => onValueChange(clamp(startW + grow(ev.clientX - startX)));
|
|
73
|
+
const up = () => {
|
|
74
|
+
setDragging(false);
|
|
75
|
+
el.removeEventListener("pointermove", move);
|
|
76
|
+
el.removeEventListener("pointerup", up);
|
|
77
|
+
el.removeEventListener("pointercancel", up);
|
|
78
|
+
};
|
|
79
|
+
el.addEventListener("pointermove", move);
|
|
80
|
+
el.addEventListener("pointerup", up);
|
|
81
|
+
el.addEventListener("pointercancel", up);
|
|
82
|
+
}, onKeyDown: (e) => {
|
|
83
|
+
onKeyDown?.(e);
|
|
84
|
+
if (e.defaultPrevented)
|
|
85
|
+
return;
|
|
86
|
+
const s = e.shiftKey ? step * 4 : step;
|
|
87
|
+
let next = null;
|
|
88
|
+
if (e.key === "ArrowLeft")
|
|
89
|
+
next = value + grow(-s);
|
|
90
|
+
else if (e.key === "ArrowRight")
|
|
91
|
+
next = value + grow(s);
|
|
92
|
+
else if (e.key === "Home")
|
|
93
|
+
next = min;
|
|
94
|
+
else if (e.key === "End")
|
|
95
|
+
next = max;
|
|
96
|
+
else if (e.key === "Enter" && defaultValue !== undefined)
|
|
97
|
+
next = defaultValue;
|
|
98
|
+
if (next === null)
|
|
99
|
+
return;
|
|
100
|
+
e.preventDefault();
|
|
101
|
+
onValueChange(clamp(next));
|
|
102
|
+
}, onDoubleClick: (e) => {
|
|
103
|
+
onDoubleClick?.(e);
|
|
104
|
+
if (defaultValue !== undefined)
|
|
105
|
+
onValueChange(clamp(defaultValue));
|
|
106
|
+
}, ...props, children: _jsx("span", { "aria-hidden": true, className: cn("pointer-events-none absolute inset-y-2 start-1/2 w-px -translate-x-1/2 rounded-full bg-transparent transition-[background-color,width] duration-150 rtl:translate-x-1/2", "group-hover/pane:bg-field-border-hover group-focus-visible/pane:w-0.5 group-focus-visible/pane:bg-ring group-data-dragging/pane:w-0.5 group-data-dragging/pane:bg-accent-ink") }) }));
|
|
107
|
+
});
|
|
108
|
+
/**
|
|
109
|
+
* The "show one record" page: record header (media, title, status, key facts, actions, pager),
|
|
110
|
+
* a main column (tabs, overview, activity, related lists) and a side column of details.
|
|
111
|
+
* Below 42rem (672px) of its own width the side column moves under the header and its
|
|
112
|
+
* sections fold, and the key facts become a horizontal strip. It measures itself, not the
|
|
113
|
+
* viewport, so it works the same beside an App shell sidebar or in a split view.
|
|
114
|
+
*
|
|
115
|
+
* ```tsx
|
|
116
|
+
* <RecordLayout>
|
|
117
|
+
* <RecordHeader media={<Avatar name="Jane Doe" size="xl" />} title="Jane Doe" subtitle="Head of Ops · Northpoint"
|
|
118
|
+
* status={<Badge tone="success">Customer</Badge>} facts={[{ label: "Owner", value: "Meltem Aydın" }]}
|
|
119
|
+
* pager={<RecordPager index={3} total={128} prevHref="/contacts/41" nextHref="/contacts/43" />} />
|
|
120
|
+
* <RecordMain>{tabs}</RecordMain>
|
|
121
|
+
* <RecordAside><RecordAsideSection title="Details"><DescriptionList … /></RecordAsideSection></RecordAside>
|
|
122
|
+
* </RecordLayout>
|
|
123
|
+
* ```
|
|
124
|
+
*/
|
|
125
|
+
export const RecordLayout = React.forwardRef(function RecordLayout({ asidePosition = "end", asideWidth: asideWidthProp, defaultAsideWidth = 320, onAsideWidthChange, resizable = false, minAsideWidth = 260, maxAsideWidth = 520, state = "ready", notFound, forbidden, readOnly = false, labels, className, style, children, ...props }, ref) {
|
|
126
|
+
const t = useLabels("record", recordLabels, labels);
|
|
127
|
+
const { ref: measureRef, width } = useContainerWidth();
|
|
128
|
+
const composed = useComposedRefs(ref, measureRef);
|
|
129
|
+
const [asideWidth, setAsideWidth] = useControllableState({ value: asideWidthProp, defaultValue: defaultAsideWidth, onChange: onAsideWidthChange, name: "RecordLayout" });
|
|
130
|
+
const narrow = width !== undefined && width < NARROW;
|
|
131
|
+
const ctx = React.useMemo(() => ({ narrow, readOnly, asidePosition, resizable, asideWidth, minAsideWidth, maxAsideWidth, defaultAsideWidth, setAsideWidth, labels }), [narrow, readOnly, asidePosition, resizable, asideWidth, minAsideWidth, maxAsideWidth, defaultAsideWidth, setAsideWidth, labels]);
|
|
132
|
+
let content = children;
|
|
133
|
+
if (state === "loading")
|
|
134
|
+
content = _jsx(RecordLayoutSkeleton, { label: t("loading") });
|
|
135
|
+
else if (state === "not-found")
|
|
136
|
+
content = notFound ?? _jsx(RecordStatePage, { kind: "not-found", title: t("notFound"), description: t("notFoundDescription") });
|
|
137
|
+
else if (state === "forbidden")
|
|
138
|
+
content = forbidden ?? _jsx(RecordStatePage, { kind: "forbidden", title: t("forbidden"), description: t("forbiddenDescription") });
|
|
139
|
+
return (_jsx(RecordLayoutContext.Provider, { value: ctx, children: _jsx("div", { ref: composed, "data-slot": "record-layout", "data-state": state, "data-narrow": narrow ? "" : undefined, className: cn("@container/record w-full min-w-0", className), style: { "--record-aside-w": `${asideWidth}px`, ...style }, ...props, children: _jsx("div", { className: "vui-record-grid", "data-aside": asidePosition, children: content }) }) }));
|
|
140
|
+
});
|
|
141
|
+
/** Full-page state with the page's one h1 (EmptyState titles stop at h2). */
|
|
142
|
+
function RecordStatePage({ kind, title, description }) {
|
|
143
|
+
const Icon = kind === "forbidden" ? LockKeyhole : SearchX;
|
|
144
|
+
return (_jsxs("div", { "data-slot": "record-state", "data-kind": kind, className: cn(emptyStateVariants({ size: "lg" }), "[grid-column:1/-1]"), children: [_jsx(EmptyStateIcon, { className: "surface-2 mb-2 text-fg-muted", children: _jsx(Icon, { "aria-hidden": true }) }), _jsx("h1", { className: "font-display max-w-[36ch] text-balance text-[1.75rem] leading-tight text-fg", children: title }), _jsx(EmptyStateDescription, { size: "lg", children: description })] }));
|
|
145
|
+
}
|
|
146
|
+
function RecordLayoutSkeleton({ label }) {
|
|
147
|
+
return (_jsxs(_Fragment, { children: [_jsxs("div", { role: "status", "aria-label": label, "aria-busy": "true", className: "flex items-center gap-4 [grid-area:header]", children: [_jsx(SkeletonAvatar, { size: "xl" }), _jsxs("div", { className: "grid flex-1 gap-2", children: [_jsx(Skeleton, { className: "h-6 w-56 rounded-ui-sm" }), _jsx(Skeleton, { className: "h-4 w-40 rounded-ui-sm" })] })] }), _jsxs("div", { className: "grid gap-(--gap) [grid-area:main]", children: [_jsx("div", { className: "surface rounded-ui-lg p-(--gap)", children: _jsx(SkeletonText, { lines: 4 }) }), _jsx("div", { className: "surface rounded-ui-lg p-(--gap)", children: _jsx(SkeletonText, { lines: 3 }) })] }), _jsx("div", { className: "grid gap-3 [grid-area:aside]", children: _jsx("div", { className: "surface-2 rounded-ui-lg p-4", children: _jsx(SkeletonText, { lines: 5 }) }) })] }));
|
|
148
|
+
}
|
|
149
|
+
/** The record's header: back link + pager, media, h1, status, subtitle, actions and key facts. */
|
|
150
|
+
export const RecordHeader = React.forwardRef(function RecordHeader({ media, title, subtitle, status, facts, actions, back, pager, saving, size = "md", loading, labels, className, children, ...props }, ref) {
|
|
151
|
+
const ctx = React.useContext(RecordLayoutContext);
|
|
152
|
+
const t = useLabels("record", recordLabels, labels ?? ctx.labels);
|
|
153
|
+
const showActions = actions && !ctx.readOnly;
|
|
154
|
+
const factsRef = React.useRef(null);
|
|
155
|
+
useEdgeFade(factsRef, "x", Boolean(facts?.length));
|
|
156
|
+
return (_jsxs("header", { ref: ref, "data-slot": "record-header", "data-size": size, className: cn("flex min-w-0 flex-col gap-4 [grid-area:header]", className), ...props, children: [back || pager ? (_jsxs("div", { className: "flex min-h-8 items-center justify-between gap-3", children: [back ? (_jsxs(SmartLink, { href: back.href, className: "-ms-0.5 inline-flex w-fit items-center gap-1.5 rounded-ui-sm text-[13px] text-fg-muted transition-colors hover:text-fg focus-ring", children: [_jsx(ArrowLeft, { "aria-hidden": true, className: "size-3.5 rtl:-scale-x-100" }), back.label] })) : (_jsx("span", {})), pager] })) : null, _jsxs("div", { className: "flex flex-wrap items-start gap-x-5 gap-y-4", children: [media ? _jsx("div", { "data-slot": "record-header-media", className: "shrink-0", children: media }) : null, _jsxs("div", { className: "min-w-0 flex-[1_1_16rem] self-center", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-x-3 gap-y-1.5", children: [_jsx("h1", { "aria-busy": loading || undefined, className: cn("font-display min-w-0 text-fg [text-wrap:balance]", size === "md" ? "text-[length:calc(28px*var(--display-scale))] leading-[1.1]" : "text-[length:calc(20px*var(--display-scale))] leading-[1.15]"), children: loading ? _jsx(Skeleton, { className: "inline-block h-[0.8em] w-[min(16rem,55vw)] rounded-ui-sm align-middle" }) : title }), status && !loading ? _jsx("span", { className: "inline-flex items-center gap-2", children: status }) : null, saving ? (_jsxs("span", { role: "status", className: "inline-flex items-center gap-1.5 text-[13px] text-fg-subtle", children: [_jsx(Spinner, { size: "xs" }), " ", t("saving")] })) : null] }), loading ? (_jsx(Skeleton, { className: "mt-2 h-4 w-48 rounded-ui-sm" })) : subtitle ? (_jsx("p", { className: "mt-1 text-[14px] text-fg-muted", children: subtitle })) : null] }), showActions ? _jsx("div", { "data-slot": "record-header-actions", className: "flex flex-wrap items-center gap-2 self-center", children: actions }) : null] }), facts?.length ? (_jsx("div", { ref: factsRef, role: "group", "aria-label": t("facts"), tabIndex: 0, "data-slot": "record-facts", "data-edge-fade": "x", className: "-mx-1 overflow-x-auto scrollbar-none rounded-ui-sm px-1 focus-ring @2xl/record:overflow-visible", children: _jsx("dl", { className: "flex w-max min-w-full items-stretch @2xl/record:w-auto @2xl/record:flex-wrap @2xl/record:gap-y-3", children: facts.map((f, i) => (_jsxs("div", { className: "flex min-w-0 shrink-0 flex-col gap-1 border-s border-line px-5 first:border-s-0 first:ps-0", children: [_jsx("dt", { className: "text-[12px] text-fg-subtle", children: f.label }), _jsx("dd", { className: "tabular text-[14px] font-medium text-fg", children: f.value })] }, i))) }) })) : null, children] }));
|
|
157
|
+
});
|
|
158
|
+
/** "3 of 128" with previous/next buttons and `j` / `k` shortcuts. */
|
|
159
|
+
export const RecordPager = React.forwardRef(function RecordPager({ index, total, prevHref, nextHref, onPrevious, onNext, shortcuts = true, labels, className, ...props }, ref) {
|
|
160
|
+
const ctx = React.useContext(RecordLayoutContext);
|
|
161
|
+
const t = useLabels("record", recordLabels, labels ?? ctx.labels);
|
|
162
|
+
const f = useFormat();
|
|
163
|
+
const { navigate } = useNavigation();
|
|
164
|
+
const hasPrev = index > 1 && Boolean(prevHref || onPrevious);
|
|
165
|
+
const hasNext = index < total && Boolean(nextHref || onNext);
|
|
166
|
+
const go = (which) => {
|
|
167
|
+
const href = which === "prev" ? prevHref : nextHref;
|
|
168
|
+
const cb = which === "prev" ? onPrevious : onNext;
|
|
169
|
+
if (cb)
|
|
170
|
+
cb();
|
|
171
|
+
if (href)
|
|
172
|
+
navigate(href);
|
|
173
|
+
};
|
|
174
|
+
useHotkeys("k", () => go("prev"), { enabled: shortcuts && hasPrev });
|
|
175
|
+
useHotkeys("j", () => go("next"), { enabled: shortcuts && hasNext });
|
|
176
|
+
const step = (which) => {
|
|
177
|
+
const enabled = which === "prev" ? hasPrev : hasNext;
|
|
178
|
+
const href = which === "prev" ? prevHref : nextHref;
|
|
179
|
+
const cb = which === "prev" ? onPrevious : onNext;
|
|
180
|
+
const label = which === "prev" ? t("previous") : t("next");
|
|
181
|
+
const Icon = which === "prev" ? ChevronLeft : ChevronRight;
|
|
182
|
+
const common = {
|
|
183
|
+
"aria-label": label,
|
|
184
|
+
title: shortcuts ? `${label} (${which === "prev" ? "K" : "J"})` : label,
|
|
185
|
+
"aria-keyshortcuts": shortcuts ? (which === "prev" ? "k" : "j") : undefined,
|
|
186
|
+
variant: "ghost",
|
|
187
|
+
size: "icon-sm",
|
|
188
|
+
};
|
|
189
|
+
if (href && enabled && !cb) {
|
|
190
|
+
return (_jsx(Button, { asChild: true, ...common, children: _jsx(SmartLink, { href: href, children: _jsx(Icon, { "aria-hidden": true, className: "rtl:-scale-x-100" }) }) }));
|
|
191
|
+
}
|
|
192
|
+
return (_jsx(Button, { ...common, disabled: !enabled, onClick: () => go(which), children: _jsx(Icon, { "aria-hidden": true, className: "rtl:-scale-x-100" }) }));
|
|
193
|
+
};
|
|
194
|
+
return (_jsxs("nav", { ref: ref, "aria-label": t("pagerLabel"), "data-slot": "record-pager", className: cn("inline-flex items-center gap-1", className), ...props, children: [_jsx("span", { className: "tabular me-1 text-[13px] text-fg-muted", children: t("pager", { index: f.number(index), total: f.number(total) }) }), _jsxs("span", { className: "inline-flex items-center rounded-ui-sm border border-line", children: [step("prev"), _jsx("span", { "aria-hidden": true, className: "h-4 w-px bg-line" }), step("next")] })] }));
|
|
195
|
+
});
|
|
196
|
+
/** The main column: tabs, overview, activity, related lists. */
|
|
197
|
+
export const RecordMain = React.forwardRef(function RecordMain({ tabs, className, children, ...props }, ref) {
|
|
198
|
+
return (_jsxs("div", { ref: ref, "data-slot": "record-main", className: cn("flex min-w-0 flex-col gap-(--gap) [grid-area:main]", className), ...props, children: [tabs ? _jsx("div", { "data-slot": "record-main-tabs", className: "-mb-1", children: tabs }) : null, children] }));
|
|
199
|
+
});
|
|
200
|
+
/** A titled card in the main column: overview, activity, related deals. `<section aria-labelledby>`. */
|
|
201
|
+
export const RecordSection = React.forwardRef(function RecordSection({ title, description, action, padding = "md", className, children, id, ...props }, ref) {
|
|
202
|
+
const autoId = React.useId();
|
|
203
|
+
const titleId = `${id ?? `record-section${autoId.replace(/:/g, "")}`}-title`;
|
|
204
|
+
return (_jsxs("section", { ref: ref, id: id, "aria-labelledby": titleId, "data-slot": "record-section", className: cn("surface overflow-hidden rounded-ui-lg", className), ...props, children: [_jsxs("div", { className: "flex items-start justify-between gap-3 px-(--gap) pt-[calc(var(--gap)*0.8)]", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("h2", { id: titleId, className: "text-[15px] font-semibold text-fg", children: title }), description ? _jsx("p", { className: "mt-0.5 text-[13px] text-fg-muted", children: description }) : null] }), action ? _jsx("div", { className: "-me-1 -mt-1 flex shrink-0 items-center gap-1.5", children: action }) : null] }), _jsx("div", { className: cn(padding === "md" ? "p-(--gap) pt-3" : "pt-3"), children: children })] }));
|
|
205
|
+
});
|
|
206
|
+
/** The side column (`<aside>`): description lists, owners, tags, related records. */
|
|
207
|
+
export const RecordAside = React.forwardRef(function RecordAside({ className, children, labels, ...props }, ref) {
|
|
208
|
+
const ctx = React.useContext(RecordLayoutContext);
|
|
209
|
+
const t = useLabels("record", recordLabels, labels ?? ctx.labels);
|
|
210
|
+
return (_jsxs("aside", { ref: ref, "aria-label": props["aria-label"] ?? t("details"), "data-slot": "record-aside", className: cn("relative flex min-w-0 flex-col gap-3 [grid-area:aside]", className), ...props, children: [ctx.resizable && !ctx.narrow ? (_jsx(SidePaneHandle, { "aria-label": t("resizeAside"), edge: ctx.asidePosition === "end" ? "start" : "end", value: ctx.asideWidth, min: ctx.minAsideWidth, max: ctx.maxAsideWidth, defaultValue: ctx.defaultAsideWidth, onValueChange: ctx.setAsideWidth })) : null, children] }));
|
|
211
|
+
});
|
|
212
|
+
/** A titled block in the side column; folds like an accordion item when space is short. */
|
|
213
|
+
export const RecordAsideSection = React.forwardRef(function RecordAsideSection({ title, action, collapsible = false, defaultOpen = true, open: openProp, onOpenChange, headingLevel = 2, className, children, ...props }, ref) {
|
|
214
|
+
const { narrow } = React.useContext(RecordLayoutContext);
|
|
215
|
+
const foldable = collapsible || narrow;
|
|
216
|
+
const touched = React.useRef(false);
|
|
217
|
+
const [open, setOpen] = useControllableState({ value: openProp, defaultValue: defaultOpen, onChange: onOpenChange, name: "RecordAsideSection" });
|
|
218
|
+
// Fold when the layout turns narrow, unfold when it widens again — until the user decides.
|
|
219
|
+
React.useEffect(() => {
|
|
220
|
+
if (touched.current || openProp !== undefined)
|
|
221
|
+
return;
|
|
222
|
+
setOpen(narrow ? false : defaultOpen);
|
|
223
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
224
|
+
}, [narrow]);
|
|
225
|
+
const autoId = React.useId();
|
|
226
|
+
const titleId = `record-aside${autoId.replace(/:/g, "")}`;
|
|
227
|
+
const H = `h${headingLevel}`;
|
|
228
|
+
const isOpen = foldable ? open : true;
|
|
229
|
+
return (_jsx(Collapsible.Root, { open: isOpen, onOpenChange: (v) => {
|
|
230
|
+
touched.current = true;
|
|
231
|
+
setOpen(v);
|
|
232
|
+
}, asChild: true, children: _jsxs("section", { ref: ref, "aria-labelledby": titleId, "data-slot": "record-aside-section", "data-state": isOpen ? "open" : "closed", className: cn("surface-2 rounded-ui-lg", className), ...props, children: [_jsxs("div", { className: "flex min-h-11 items-center gap-2 ps-4 pe-2", children: [_jsx(H, { id: titleId, className: "min-w-0 flex-1 text-[13px] font-semibold text-fg", children: foldable ? (_jsxs(Collapsible.Trigger, { className: "group/aside -ms-1.5 flex w-[calc(100%+0.375rem)] items-center gap-1.5 rounded-ui-sm px-1.5 py-1 text-start outline-none focus-ring", children: [_jsx(ChevronDown, { "aria-hidden": true, className: "size-3.5 shrink-0 text-fg-subtle transition-transform duration-200 group-data-[state=closed]/aside:-rotate-90 motion-reduce:transition-none rtl:group-data-[state=closed]/aside:rotate-90" }), _jsx("span", { className: "truncate", children: title })] })) : (_jsx("span", { className: "block truncate py-1", children: title })) }), action ? _jsx("div", { className: "flex shrink-0 items-center gap-1", children: action }) : null] }), _jsx(Collapsible.Content, { className: "ui-collapse", children: _jsx("div", { className: "px-4 pb-4", children: children }) })] }) }));
|
|
233
|
+
});
|