@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,167 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { cn } from "../lib/cn.js";
|
|
5
|
+
import { useFormat } from "../lib/locale.js";
|
|
6
|
+
import { useControllableState } from "../lib/use-controllable-state.js";
|
|
7
|
+
const mercY = (lat) => Math.log(Math.tan(Math.PI / 4 + (Math.max(-85, Math.min(85, lat)) * Math.PI) / 360));
|
|
8
|
+
const toRad = (deg) => (deg * Math.PI) / 180;
|
|
9
|
+
/** Percent string with fixed precision — identical on server and client. */
|
|
10
|
+
const pct = (v) => `${(v * 100).toFixed(3)}%`;
|
|
11
|
+
function fitBounds(pins, bounds, aspect) {
|
|
12
|
+
let b = bounds;
|
|
13
|
+
if (!b) {
|
|
14
|
+
if (pins.length === 0)
|
|
15
|
+
b = { north: 1, south: -1, west: -1, east: 1 };
|
|
16
|
+
else {
|
|
17
|
+
const lats = pins.map((p) => p.lat);
|
|
18
|
+
const lngs = pins.map((p) => p.lng);
|
|
19
|
+
const [n, s, w, e] = [Math.max(...lats), Math.min(...lats), Math.min(...lngs), Math.max(...lngs)];
|
|
20
|
+
const padLat = Math.max((n - s) * 0.14, 0.01);
|
|
21
|
+
const padLng = Math.max((e - w) * 0.1, 0.01);
|
|
22
|
+
b = { north: n + padLat, south: s - padLat, west: w - padLng, east: e + padLng };
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// Expand the short side so the Mercator projection keeps true shapes at this aspect ratio.
|
|
26
|
+
const xSpan = toRad(b.east - b.west);
|
|
27
|
+
const ySpan = mercY(b.north) - mercY(b.south);
|
|
28
|
+
if (xSpan / ySpan < aspect) {
|
|
29
|
+
const extra = (ySpan * aspect - xSpan) / 2;
|
|
30
|
+
const d = (extra * 180) / Math.PI;
|
|
31
|
+
return { ...b, west: b.west - d, east: b.east + d };
|
|
32
|
+
}
|
|
33
|
+
const targetY = xSpan / aspect;
|
|
34
|
+
const mid = (mercY(b.north) + mercY(b.south)) / 2;
|
|
35
|
+
const inv = (y) => (Math.atan(Math.exp(y)) * 360) / Math.PI - 90;
|
|
36
|
+
return { ...b, north: inv(mid + targetY / 2), south: inv(mid - targetY / 2) };
|
|
37
|
+
}
|
|
38
|
+
const toneFill = {
|
|
39
|
+
accent: "bg-accent text-accent-fg",
|
|
40
|
+
neutral: "bg-fg-muted text-scene",
|
|
41
|
+
info: "bg-info text-scene",
|
|
42
|
+
success: "bg-success text-scene",
|
|
43
|
+
warning: "bg-warning text-scene",
|
|
44
|
+
danger: "bg-danger text-scene",
|
|
45
|
+
};
|
|
46
|
+
const toneVar = {
|
|
47
|
+
accent: "var(--accent)",
|
|
48
|
+
neutral: "var(--fg-muted)",
|
|
49
|
+
info: "var(--info)",
|
|
50
|
+
success: "var(--success)",
|
|
51
|
+
warning: "var(--warning)",
|
|
52
|
+
danger: "var(--danger)",
|
|
53
|
+
};
|
|
54
|
+
/** A tidy step for ticks: 0.01, 0.02, 0.05, 0.1 … */
|
|
55
|
+
function niceStep(span, target) {
|
|
56
|
+
const raw = span / target;
|
|
57
|
+
const pow = 10 ** Math.floor(Math.log10(raw));
|
|
58
|
+
const m = raw / pow;
|
|
59
|
+
return (m < 1.5 ? 1 : m < 3.5 ? 2 : m < 7.5 ? 5 : 10) * pow;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Markers on a projected sheet — stores, field jobs, vehicles, live visitors — without a tile
|
|
63
|
+
* provider. Pins are positioned in Web Mercator inside `bounds`; pass a `backdrop` to lay them
|
|
64
|
+
* over your own static map. Selection is controlled or not; arrow keys move to the nearest pin
|
|
65
|
+
* in that direction, Enter selects, Escape clears.
|
|
66
|
+
*
|
|
67
|
+
* ```tsx
|
|
68
|
+
* <PinMap aria-label="Stores" pins={stores.map((s) => ({ id: s.id, lat: s.lat, lng: s.lng, label: s.name }))}
|
|
69
|
+
* selectedId={selected} onSelectedIdChange={setSelected} />
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
export const PinMap = React.forwardRef(function PinMap({ pins, bounds, aspectRatio = 16 / 10, variant = "pin", selectedId: selectedProp, defaultSelectedId = null, onSelectedIdChange, callout, showLabels, backdrop, bare, className, style, children, ...props }, ref) {
|
|
73
|
+
const f = useFormat();
|
|
74
|
+
const [selectedId, setSelectedId] = useControllableState({ value: selectedProp, defaultValue: defaultSelectedId, onChange: onSelectedIdChange, name: "PinMap" });
|
|
75
|
+
const [focusId, setFocusId] = React.useState(null);
|
|
76
|
+
const pinRefs = React.useRef(new Map());
|
|
77
|
+
const calloutId = React.useId();
|
|
78
|
+
const b = React.useMemo(() => fitBounds(pins, bounds, aspectRatio), [pins, bounds, aspectRatio]);
|
|
79
|
+
const yTop = mercY(b.north);
|
|
80
|
+
const ySpan = yTop - mercY(b.south);
|
|
81
|
+
const project = React.useCallback((lat, lng) => ({ x: (lng - b.west) / (b.east - b.west), y: (yTop - mercY(lat)) / ySpan }), [b, yTop, ySpan]);
|
|
82
|
+
const placed = React.useMemo(() => pins.map((p) => ({ pin: p, ...project(p.lat, p.lng) })), [pins, project]);
|
|
83
|
+
const maxValue = Math.max(1, ...pins.map((p) => p.value ?? 0));
|
|
84
|
+
const tabStop = focusId && pins.some((p) => p.id === focusId) ? focusId : selectedId && pins.some((p) => p.id === selectedId) ? selectedId : pins[0]?.id;
|
|
85
|
+
const moveFocus = (id) => {
|
|
86
|
+
if (!id)
|
|
87
|
+
return;
|
|
88
|
+
setFocusId(id);
|
|
89
|
+
pinRefs.current.get(id)?.focus();
|
|
90
|
+
};
|
|
91
|
+
const onKeyDown = (e, from) => {
|
|
92
|
+
const dir = { ArrowRight: [1, 0], ArrowLeft: [-1, 0], ArrowDown: [0, 1], ArrowUp: [0, -1] }[e.key];
|
|
93
|
+
if (dir) {
|
|
94
|
+
e.preventDefault();
|
|
95
|
+
const rtl = getComputedStyle(e.currentTarget).direction === "rtl" && dir[0] !== 0;
|
|
96
|
+
const [dx, dy] = rtl ? [-dir[0], dir[1]] : dir;
|
|
97
|
+
let best;
|
|
98
|
+
let bestScore = Infinity;
|
|
99
|
+
for (const p of placed) {
|
|
100
|
+
if (p.pin.id === from.pin.id)
|
|
101
|
+
continue;
|
|
102
|
+
const vx = (p.x - from.x) * aspectRatio;
|
|
103
|
+
const vy = p.y - from.y;
|
|
104
|
+
const along = vx * dx + vy * dy;
|
|
105
|
+
if (along <= 0.0001)
|
|
106
|
+
continue;
|
|
107
|
+
const across = Math.abs(vx * dy - vy * dx);
|
|
108
|
+
const score = along + across * 2;
|
|
109
|
+
if (score < bestScore) {
|
|
110
|
+
bestScore = score;
|
|
111
|
+
best = p;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
moveFocus(best?.pin.id);
|
|
115
|
+
}
|
|
116
|
+
else if (e.key === "Home") {
|
|
117
|
+
e.preventDefault();
|
|
118
|
+
moveFocus(pins[0]?.id);
|
|
119
|
+
}
|
|
120
|
+
else if (e.key === "End") {
|
|
121
|
+
e.preventDefault();
|
|
122
|
+
moveFocus(pins.at(-1)?.id);
|
|
123
|
+
}
|
|
124
|
+
else if (e.key === "Escape" && selectedId) {
|
|
125
|
+
e.preventDefault();
|
|
126
|
+
setSelectedId(null);
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
// Ticks and scale bar.
|
|
130
|
+
const latStep = niceStep(b.north - b.south, 4);
|
|
131
|
+
const lngStep = niceStep(b.east - b.west, 6);
|
|
132
|
+
const latTicks = [];
|
|
133
|
+
for (let v = Math.ceil(b.south / latStep) * latStep; v <= b.north; v += latStep)
|
|
134
|
+
latTicks.push(Number(v.toFixed(6)));
|
|
135
|
+
const lngTicks = [];
|
|
136
|
+
for (let v = Math.ceil(b.west / lngStep) * lngStep; v <= b.east; v += lngStep)
|
|
137
|
+
lngTicks.push(Number(v.toFixed(6)));
|
|
138
|
+
const decimals = Math.max(0, -Math.floor(Math.log10(Math.min(latStep, lngStep))));
|
|
139
|
+
const widthKm = (b.east - b.west) * 111.32 * Math.cos(toRad((b.north + b.south) / 2));
|
|
140
|
+
const scaleKm = niceStep(widthKm, 5);
|
|
141
|
+
const scaleShare = scaleKm / widthKm;
|
|
142
|
+
const scaleLabel = scaleKm >= 1 ? f.number(scaleKm, { style: "unit", unit: "kilometer", unitDisplay: "short" }) : f.number(Math.round(scaleKm * 1000), { style: "unit", unit: "meter", unitDisplay: "short" });
|
|
143
|
+
const selected = placed.find((p) => p.pin.id === selectedId);
|
|
144
|
+
const renderCallout = callout === false ? null : (callout ?? ((p) => (_jsxs(_Fragment, { children: [_jsx("p", { className: "text-[13px] font-medium text-fg", children: p.label }), p.description ? _jsx("div", { className: "mt-0.5 text-xs text-fg-muted", children: p.description }) : null] }))));
|
|
145
|
+
return (_jsxs("div", { ref: ref, role: "group", "data-slot": "pin-map", className: cn("relative isolate w-full overflow-hidden rounded-ui border border-line bg-surface-2 select-none", className), style: { aspectRatio: String(aspectRatio), ...style }, ...props, children: [_jsx("div", { "aria-hidden": "true", className: "absolute inset-0 -z-10", children: backdrop ?? (_jsxs(_Fragment, { children: [_jsx("div", { className: "absolute inset-0 bg-[radial-gradient(color-mix(in_oklch,var(--fg)_14%,transparent)_0.8px,transparent_1px)] bg-[length:14px_14px] opacity-70" }), _jsxs("svg", { className: "absolute inset-0 size-full", preserveAspectRatio: "none", viewBox: "0 0 100 100", children: [latTicks.map((v) => {
|
|
146
|
+
const y = project(v, b.west).y * 100;
|
|
147
|
+
return _jsx("line", { x1: "0", x2: "100", y1: y, y2: y, vectorEffect: "non-scaling-stroke", stroke: "var(--line)", strokeWidth: "1" }, `la${v}`);
|
|
148
|
+
}), lngTicks.map((v) => {
|
|
149
|
+
const x = project(b.north, v).x * 100;
|
|
150
|
+
return _jsx("line", { y1: "0", y2: "100", x1: x, x2: x, vectorEffect: "non-scaling-stroke", stroke: "var(--line)", strokeWidth: "1" }, `lo${v}`);
|
|
151
|
+
})] })] })) }), !bare ? (_jsxs("div", { "aria-hidden": "true", className: "pointer-events-none absolute inset-0 font-mono text-[9.5px] text-fg-subtle tabular", children: [latTicks.map((v) => (_jsxs("span", { className: "absolute start-1.5 -translate-y-full pb-0.5", style: { top: pct(project(v, b.west).y) }, children: [Math.abs(v).toFixed(decimals), "\u00B0", v >= 0 ? "N" : "S"] }, `tl${v}`))), lngTicks.slice(1).map((v) => (_jsxs("span", { className: "absolute top-1.5 ps-1", style: { left: pct(project(b.north, v).x) }, children: [Math.abs(v).toFixed(decimals), "\u00B0", v >= 0 ? "E" : "W"] }, `tg${v}`))), _jsxs("span", { className: "absolute inset-x-3 bottom-2.5 flex flex-col items-end gap-1", children: [_jsx("span", { children: scaleLabel }), _jsx("span", { className: "block h-1 border-x border-b border-fg-subtle", style: { width: pct(scaleShare) } })] })] })) : null, _jsxs("div", { className: "absolute inset-0", children: [placed.map(({ pin, x, y }) => {
|
|
152
|
+
const tone = pin.tone ?? "accent";
|
|
153
|
+
const isSelected = pin.id === selectedId;
|
|
154
|
+
const size = variant === "bubble" ? Math.round(10 + Math.sqrt((pin.value ?? 0) / maxValue) * 34) : variant === "dot" ? 10 : 22;
|
|
155
|
+
return (_jsxs("button", { ref: (el) => {
|
|
156
|
+
if (el)
|
|
157
|
+
pinRefs.current.set(pin.id, el);
|
|
158
|
+
else
|
|
159
|
+
pinRefs.current.delete(pin.id);
|
|
160
|
+
}, type: "button", "data-slot": "pin-map-pin", "data-selected": isSelected || undefined, "aria-pressed": isSelected, "aria-label": pin.label, "aria-describedby": isSelected && renderCallout ? calloutId : undefined, tabIndex: pin.id === tabStop ? 0 : -1, onFocus: () => setFocusId(pin.id), onClick: () => setSelectedId(isSelected ? null : pin.id), onKeyDown: (e) => onKeyDown(e, { pin, x, y }), className: cn("group/pin absolute grid -translate-x-1/2 -translate-y-1/2 place-items-center rounded-full outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--surface-2)]", isSelected ? "z-20" : "z-10 hover:z-20 focus-visible:z-20"), style: { left: pct(x), top: pct(y), width: Math.max(size, 24), height: Math.max(size, 24) }, children: [pin.pulse ? (_jsx("span", { "aria-hidden": "true", className: "absolute rounded-full opacity-60 motion-safe:animate-ping", style: { width: Math.min(size, 22), height: Math.min(size, 22), background: toneVar[tone] } })) : null, variant === "bubble" ? (_jsx("span", { "aria-hidden": "true", className: "rounded-full border transition-transform duration-200 group-hover/pin:scale-105 motion-reduce:transition-none", style: {
|
|
161
|
+
width: size,
|
|
162
|
+
height: size,
|
|
163
|
+
background: `color-mix(in oklch, ${toneVar[tone]} ${isSelected ? 55 : 30}%, transparent)`,
|
|
164
|
+
borderColor: toneVar[tone],
|
|
165
|
+
} })) : (_jsx("span", { "aria-hidden": "true", className: cn("relative grid place-items-center rounded-full ring-2 ring-[var(--surface-solid)] shadow-[0_1px_3px_rgb(0_0_0/0.25)] transition-transform duration-200 group-hover/pin:scale-110 motion-reduce:transition-none [&_svg]:size-3", toneFill[tone], isSelected && "scale-125 ring-[var(--fg)]"), style: { width: variant === "dot" ? 9 : 18, height: variant === "dot" ? 9 : 18 }, children: variant === "pin" ? pin.icon : null })), showLabels ? (_jsx("span", { "aria-hidden": "true", className: "pointer-events-none absolute start-full ms-0.5 rounded-ui-sm bg-[color-mix(in_oklch,var(--surface-solid)_82%,transparent)] px-1 text-[11px] font-medium whitespace-nowrap text-fg", children: pin.label })) : null] }, pin.id));
|
|
166
|
+
}), selected && renderCallout ? (_jsx("div", { id: calloutId, "data-slot": "pin-map-callout", className: cn("surface-popover ui-pop pointer-events-none absolute z-30 w-max max-w-56 -translate-x-1/2 rounded-ui px-3 py-2", selected.y < 0.35 ? "mt-4" : "-translate-y-full -mt-4"), style: { left: `clamp(7rem, ${pct(selected.x)}, calc(100% - 7rem))`, top: pct(selected.y) }, children: renderCallout(selected.pin) })) : null] }), children] }));
|
|
167
|
+
});
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { Popover as PopoverPrimitive } from "radix-ui";
|
|
3
|
+
import { type VariantProps } from "class-variance-authority";
|
|
4
|
+
/** Root. Controlled (`open` / `onOpenChange`) or uncontrolled (`defaultOpen`). */
|
|
5
|
+
export declare const Popover: React.FC<PopoverPrimitive.PopoverProps>;
|
|
6
|
+
export declare const PopoverTrigger: React.ForwardRefExoticComponent<PopoverPrimitive.PopoverTriggerProps & React.RefAttributes<HTMLButtonElement>>;
|
|
7
|
+
/** Position the content against something other than the trigger. */
|
|
8
|
+
export declare const PopoverAnchor: React.ForwardRefExoticComponent<PopoverPrimitive.PopoverAnchorProps & React.RefAttributes<HTMLDivElement>>;
|
|
9
|
+
/** Closes the popover; use `asChild` with a Button. */
|
|
10
|
+
export declare const PopoverClose: React.ForwardRefExoticComponent<PopoverPrimitive.PopoverCloseProps & React.RefAttributes<HTMLButtonElement>>;
|
|
11
|
+
export declare const popoverContentVariants: (props?: ({
|
|
12
|
+
size?: "auto" | "trigger" | "sm" | "md" | "lg" | null | undefined;
|
|
13
|
+
padded?: boolean | null | undefined;
|
|
14
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
15
|
+
export interface PopoverContentProps extends React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>, VariantProps<typeof popoverContentVariants> {
|
|
16
|
+
/** Show the pointer arrow. Default `false`. */
|
|
17
|
+
arrow?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The floating panel. Portals into the nearest `ThemeScope`, sets the layer depth
|
|
21
|
+
* (only the first layer blurs in glass mode; a popover inside a dialog turns opaque),
|
|
22
|
+
* and is labelled by its `PopoverTitle` when one is rendered.
|
|
23
|
+
*/
|
|
24
|
+
export declare const PopoverContent: React.ForwardRefExoticComponent<PopoverContentProps & React.RefAttributes<HTMLDivElement>>;
|
|
25
|
+
export interface PopoverHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "title"> {
|
|
26
|
+
/** Heading; becomes the popover's accessible name. */
|
|
27
|
+
title?: React.ReactNode;
|
|
28
|
+
description?: React.ReactNode;
|
|
29
|
+
/** Trailing element (a close button, a badge). */
|
|
30
|
+
action?: React.ReactNode;
|
|
31
|
+
}
|
|
32
|
+
/** Title + optional description at the top of the content. */
|
|
33
|
+
export declare const PopoverHeader: React.ForwardRefExoticComponent<PopoverHeaderProps & React.RefAttributes<HTMLDivElement>>;
|
|
34
|
+
/** Heading inside the content; wired to `aria-labelledby`. */
|
|
35
|
+
export declare const PopoverTitle: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLHeadingElement> & React.RefAttributes<HTMLHeadingElement>>;
|
|
36
|
+
export declare function PopoverDescription({ className, ...props }: React.HTMLAttributes<HTMLParagraphElement>): React.JSX.Element;
|
|
37
|
+
/** Bottom row for actions. Bleeds to the panel edge with a hairline on top. */
|
|
38
|
+
export declare const PopoverFooter: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { Popover as PopoverPrimitive } from "radix-ui";
|
|
5
|
+
import { cva } from "class-variance-authority";
|
|
6
|
+
import { cn } from "../lib/cn.js";
|
|
7
|
+
import { usePortalContainer } from "../lib/theme-scope.js";
|
|
8
|
+
import { Layer } from "../lib/layer.js";
|
|
9
|
+
import { FloatingArrow } from "../lib/floating-arrow.js";
|
|
10
|
+
/** Root. Controlled (`open` / `onOpenChange`) or uncontrolled (`defaultOpen`). */
|
|
11
|
+
export const Popover = PopoverPrimitive.Root;
|
|
12
|
+
export const PopoverTrigger = PopoverPrimitive.Trigger;
|
|
13
|
+
/** Position the content against something other than the trigger. */
|
|
14
|
+
export const PopoverAnchor = PopoverPrimitive.Anchor;
|
|
15
|
+
/** Closes the popover; use `asChild` with a Button. */
|
|
16
|
+
export const PopoverClose = PopoverPrimitive.Close;
|
|
17
|
+
export const popoverContentVariants = cva(["surface-popover ui-pop z-(--z-popover) rounded-ui-lg outline-none", "max-h-(--radix-popover-content-available-height) overflow-y-auto overscroll-contain"], {
|
|
18
|
+
variants: {
|
|
19
|
+
size: {
|
|
20
|
+
auto: "w-auto max-w-[calc(100vw-1.5rem)]",
|
|
21
|
+
sm: "w-64 max-w-[calc(100vw-1.5rem)]",
|
|
22
|
+
md: "w-80 max-w-[calc(100vw-1.5rem)]",
|
|
23
|
+
lg: "w-[26rem] max-w-[calc(100vw-1.5rem)]",
|
|
24
|
+
/** Same width as the trigger (lists, comboboxes). */
|
|
25
|
+
trigger: "w-(--radix-popover-trigger-width) min-w-40",
|
|
26
|
+
},
|
|
27
|
+
padded: {
|
|
28
|
+
true: "p-(--popover-p) [--popover-p:calc(var(--gap)*0.85)]",
|
|
29
|
+
false: "p-0 [--popover-p:0px]",
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
defaultVariants: { size: "md", padded: true },
|
|
33
|
+
});
|
|
34
|
+
const PopoverTitleContext = React.createContext(null);
|
|
35
|
+
/**
|
|
36
|
+
* The floating panel. Portals into the nearest `ThemeScope`, sets the layer depth
|
|
37
|
+
* (only the first layer blurs in glass mode; a popover inside a dialog turns opaque),
|
|
38
|
+
* and is labelled by its `PopoverTitle` when one is rendered.
|
|
39
|
+
*/
|
|
40
|
+
export const PopoverContent = React.forwardRef(function PopoverContent({ className, size, padded, arrow = false, sideOffset = 6, collisionPadding = 12, align = "center", children, ...props }, ref) {
|
|
41
|
+
const container = usePortalContainer();
|
|
42
|
+
const titleId = React.useId();
|
|
43
|
+
const [hasTitle, setHasTitle] = React.useState(false);
|
|
44
|
+
const titleCtx = React.useMemo(() => ({ id: titleId, register: setHasTitle }), [titleId]);
|
|
45
|
+
return (_jsx(PopoverPrimitive.Portal, { container: container, children: _jsx(Layer, { asChild: true, children: _jsxs(PopoverPrimitive.Content, { ref: ref, "data-slot": "popover-content", sideOffset: sideOffset, collisionPadding: collisionPadding, align: align, "aria-labelledby": hasTitle ? titleId : undefined, className: cn(popoverContentVariants({ size, padded }), className), ...props, children: [_jsx(PopoverTitleContext.Provider, { value: titleCtx, children: children }), arrow ? (_jsx(PopoverPrimitive.Arrow, { asChild: true, width: 14, height: 7, children: _jsx(FloatingArrow, {}) })) : null] }) }) }));
|
|
46
|
+
});
|
|
47
|
+
/** Title + optional description at the top of the content. */
|
|
48
|
+
export const PopoverHeader = React.forwardRef(function PopoverHeader({ title, description, action, className, children, ...props }, ref) {
|
|
49
|
+
return (_jsxs("div", { ref: ref, "data-slot": "popover-header", className: cn("mb-3 flex items-start gap-3", className), ...props, children: [_jsxs("div", { className: "grid min-w-0 flex-1 gap-0.5", children: [title != null ? _jsx(PopoverTitle, { children: title }) : null, description != null ? _jsx(PopoverDescription, { children: description }) : null, children] }), action ? _jsx("div", { className: "-me-1 -mt-1 shrink-0", children: action }) : null] }));
|
|
50
|
+
});
|
|
51
|
+
/** Heading inside the content; wired to `aria-labelledby`. */
|
|
52
|
+
export const PopoverTitle = React.forwardRef(function PopoverTitle({ className, id, ...props }, ref) {
|
|
53
|
+
const ctx = React.useContext(PopoverTitleContext);
|
|
54
|
+
const register = ctx?.register;
|
|
55
|
+
React.useEffect(() => {
|
|
56
|
+
if (!register || id)
|
|
57
|
+
return;
|
|
58
|
+
register(true);
|
|
59
|
+
return () => register(false);
|
|
60
|
+
}, [register, id]);
|
|
61
|
+
return _jsx("h3", { ref: ref, id: id ?? ctx?.id, "data-slot": "popover-title", className: cn("text-sm font-semibold leading-tight tracking-[-0.005em] text-fg", className), ...props });
|
|
62
|
+
});
|
|
63
|
+
export function PopoverDescription({ className, ...props }) {
|
|
64
|
+
return _jsx("p", { "data-slot": "popover-description", className: cn("text-[13px] leading-snug text-fg-muted", className), ...props });
|
|
65
|
+
}
|
|
66
|
+
/** Bottom row for actions. Bleeds to the panel edge with a hairline on top. */
|
|
67
|
+
export const PopoverFooter = React.forwardRef(function PopoverFooter({ className, ...props }, ref) {
|
|
68
|
+
return (_jsx("div", { ref: ref, "data-slot": "popover-footer", className: cn("-mx-(--popover-p) -mb-(--popover-p) mt-4 flex items-center justify-end gap-2 border-t border-line px-(--popover-p) py-[calc(var(--popover-p)*0.7)]", className), ...props }));
|
|
69
|
+
});
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
export type ProgressTone = "accent" | "success" | "warning" | "danger" | "auto";
|
|
3
|
+
declare const progressLabels: {
|
|
4
|
+
of: string;
|
|
5
|
+
loading: string;
|
|
6
|
+
};
|
|
7
|
+
interface SharedProgressProps {
|
|
8
|
+
/** Current value. `null` / `undefined` → indeterminate. Values above `max` are allowed (quota overrun). */
|
|
9
|
+
value?: number | null;
|
|
10
|
+
/** Default 100. */
|
|
11
|
+
max?: number;
|
|
12
|
+
/**
|
|
13
|
+
* `"accent"` (default; turns success when complete), a status colour, or `"auto"` for quotas:
|
|
14
|
+
* above 80% warning, at or above 100% danger.
|
|
15
|
+
*/
|
|
16
|
+
tone?: ProgressTone;
|
|
17
|
+
/** How the value reads (visible and `aria-valuetext`): `"42%"` or `"1,240 of 5,000"`. Default `"percent"`. */
|
|
18
|
+
display?: "percent" | "fraction";
|
|
19
|
+
/** Override the announced value text entirely. */
|
|
20
|
+
valueText?: string;
|
|
21
|
+
labels?: Partial<typeof progressLabels>;
|
|
22
|
+
}
|
|
23
|
+
export declare const progressTrackVariants: (props?: ({
|
|
24
|
+
size?: "sm" | "md" | "xs" | null | undefined;
|
|
25
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
26
|
+
export interface ProgressProps extends SharedProgressProps, Omit<React.HTMLAttributes<HTMLDivElement>, "children"> {
|
|
27
|
+
/** 2 / 4 / 8 px. Default `"sm"`. */
|
|
28
|
+
size?: "xs" | "sm" | "md";
|
|
29
|
+
/** Visible label above the bar (linked with `aria-labelledby`). Without it, pass `aria-label`. */
|
|
30
|
+
label?: React.ReactNode;
|
|
31
|
+
/** Show the value at the end of the label row, or render your own. */
|
|
32
|
+
showValue?: boolean | ((value: number, max: number) => React.ReactNode);
|
|
33
|
+
/** Small text under the bar ("About 2 minutes left"). */
|
|
34
|
+
hint?: React.ReactNode;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Task progress or quota use. `role="progressbar"` with `aria-valuenow/min/max` and a localized
|
|
38
|
+
* `aria-valuetext` ("42%" in English, "%42" in Turkish). Fills from the inline start (right in RTL).
|
|
39
|
+
*
|
|
40
|
+
* ```tsx
|
|
41
|
+
* <Progress label="Uploading 4 files" value={42} showValue />
|
|
42
|
+
* <Progress label="Contacts imported" value={1240} max={5000} display="fraction" showValue />
|
|
43
|
+
* <Progress label="Storage" value={9.2} max={10} tone="auto" />
|
|
44
|
+
* <Progress aria-label="Loading" value={null} />
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export declare const Progress: React.ForwardRefExoticComponent<ProgressProps & React.RefAttributes<HTMLDivElement>>;
|
|
48
|
+
declare const CIRCLE: {
|
|
49
|
+
readonly sm: {
|
|
50
|
+
readonly px: 18;
|
|
51
|
+
readonly stroke: 2.5;
|
|
52
|
+
};
|
|
53
|
+
readonly md: {
|
|
54
|
+
readonly px: 40;
|
|
55
|
+
readonly stroke: 3.5;
|
|
56
|
+
};
|
|
57
|
+
readonly lg: {
|
|
58
|
+
readonly px: 64;
|
|
59
|
+
readonly stroke: 4.5;
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
export interface ProgressCircleProps extends SharedProgressProps, Omit<React.HTMLAttributes<HTMLDivElement>, "children"> {
|
|
63
|
+
/** 18 / 40 / 64 px. `sm` sits inline next to text. Default `"md"`. */
|
|
64
|
+
size?: keyof typeof CIRCLE;
|
|
65
|
+
/** Show the value in the centre (md and lg). Default `true` for lg. */
|
|
66
|
+
showValue?: boolean;
|
|
67
|
+
/** Content in the centre instead of the value (an icon, "3/5"). */
|
|
68
|
+
children?: React.ReactNode;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Compact circular progress: profile completion, a step ring, an inline upload. Needs an
|
|
72
|
+
* accessible name (`aria-label` or `aria-labelledby`).
|
|
73
|
+
*
|
|
74
|
+
* ```tsx
|
|
75
|
+
* <ProgressCircle aria-label="Profile complete" value={72} size="lg" />
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export declare const ProgressCircle: React.ForwardRefExoticComponent<ProgressCircleProps & React.RefAttributes<HTMLDivElement>>;
|
|
79
|
+
export {};
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { cva } from "class-variance-authority";
|
|
5
|
+
import { cn } from "../lib/cn.js";
|
|
6
|
+
import { useLabels } from "../lib/labels.js";
|
|
7
|
+
import { useFormat } from "../lib/locale.js";
|
|
8
|
+
const progressLabels = { of: "{value} of {max}", loading: "Loading…" };
|
|
9
|
+
function resolveTone(tone, ratio) {
|
|
10
|
+
if (tone === "auto")
|
|
11
|
+
return ratio == null ? "accent" : ratio >= 1 ? "danger" : ratio > 0.8 ? "warning" : "accent";
|
|
12
|
+
if (tone === "accent" && ratio != null && ratio >= 1)
|
|
13
|
+
return "success";
|
|
14
|
+
return tone;
|
|
15
|
+
}
|
|
16
|
+
function useProgressModel({ value, max = 100, tone = "accent", display = "percent", valueText, labels }) {
|
|
17
|
+
const f = useFormat();
|
|
18
|
+
const t = useLabels("progress", progressLabels, labels);
|
|
19
|
+
const indeterminate = value == null || Number.isNaN(value);
|
|
20
|
+
const safeMax = max > 0 ? max : 100;
|
|
21
|
+
const ratio = indeterminate ? null : Math.max(0, value) / safeMax;
|
|
22
|
+
const fill = ratio == null ? 0 : Math.min(1, ratio);
|
|
23
|
+
const text = indeterminate
|
|
24
|
+
? undefined
|
|
25
|
+
: (valueText ?? (display === "fraction" ? t("of", { value: f.number(value), max: f.number(safeMax) }) : f.percent(ratio, { maximumFractionDigits: 0 })));
|
|
26
|
+
return { indeterminate, ratio, fill, text, max: safeMax, tone: resolveTone(tone, ratio), t };
|
|
27
|
+
}
|
|
28
|
+
const fillColor = {
|
|
29
|
+
accent: "bg-accent",
|
|
30
|
+
success: "bg-success",
|
|
31
|
+
warning: "bg-warning",
|
|
32
|
+
danger: "bg-danger",
|
|
33
|
+
};
|
|
34
|
+
const strokeColor = {
|
|
35
|
+
accent: "stroke-accent-ink",
|
|
36
|
+
success: "stroke-success",
|
|
37
|
+
warning: "stroke-warning",
|
|
38
|
+
danger: "stroke-danger",
|
|
39
|
+
};
|
|
40
|
+
const valueColor = {
|
|
41
|
+
accent: "text-fg",
|
|
42
|
+
success: "text-success",
|
|
43
|
+
warning: "text-warning",
|
|
44
|
+
danger: "text-danger",
|
|
45
|
+
};
|
|
46
|
+
/* ------------------------------------------------------------------ */
|
|
47
|
+
/* Linear */
|
|
48
|
+
/* ------------------------------------------------------------------ */
|
|
49
|
+
export const progressTrackVariants = cva("relative w-full overflow-hidden rounded-full bg-track", {
|
|
50
|
+
variants: {
|
|
51
|
+
size: { xs: "h-0.5", sm: "h-1", md: "h-2" },
|
|
52
|
+
},
|
|
53
|
+
defaultVariants: { size: "sm" },
|
|
54
|
+
});
|
|
55
|
+
/**
|
|
56
|
+
* Task progress or quota use. `role="progressbar"` with `aria-valuenow/min/max` and a localized
|
|
57
|
+
* `aria-valuetext` ("42%" in English, "%42" in Turkish). Fills from the inline start (right in RTL).
|
|
58
|
+
*
|
|
59
|
+
* ```tsx
|
|
60
|
+
* <Progress label="Uploading 4 files" value={42} showValue />
|
|
61
|
+
* <Progress label="Contacts imported" value={1240} max={5000} display="fraction" showValue />
|
|
62
|
+
* <Progress label="Storage" value={9.2} max={10} tone="auto" />
|
|
63
|
+
* <Progress aria-label="Loading" value={null} />
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export const Progress = React.forwardRef(function Progress({ value, max, tone, display, valueText, labels, size, label, showValue, hint, className, id, ...props }, ref) {
|
|
67
|
+
const m = useProgressModel({ value, max, tone, display, valueText, labels });
|
|
68
|
+
const autoId = React.useId();
|
|
69
|
+
const baseId = id ?? `progress${autoId.replace(/:/g, "")}`;
|
|
70
|
+
const labelId = label ? `${baseId}-label` : undefined;
|
|
71
|
+
const hintId = hint ? `${baseId}-hint` : undefined;
|
|
72
|
+
const shownValue = m.indeterminate || !showValue ? null : typeof showValue === "function" ? showValue(value, m.max) : m.text;
|
|
73
|
+
const bar = (_jsx("div", { ref: label || hint ? undefined : ref, id: label || hint ? undefined : id, role: "progressbar", "aria-labelledby": labelId, "aria-describedby": hintId, "aria-valuemin": 0, "aria-valuemax": m.indeterminate ? undefined : m.max, "aria-valuenow": m.indeterminate ? undefined : Math.min(value, m.max), "aria-valuetext": m.indeterminate ? (label ? undefined : m.t("loading")) : m.text, "data-slot": "progress", "data-state": m.indeterminate ? "indeterminate" : m.ratio >= 1 ? "complete" : "loading", "data-tone": m.tone, className: cn("vui-progress", progressTrackVariants({ size }), !(label || hint) && className), ...(label || hint ? {} : props), children: _jsx("div", { "data-slot": "progress-indicator", className: cn("vui-progress-indicator h-full w-full origin-left rounded-full rtl:origin-right", fillColor[m.tone]), style: m.indeterminate ? undefined : { transform: `scaleX(${m.fill})` } }) }));
|
|
74
|
+
if (!label && !hint && !shownValue)
|
|
75
|
+
return bar;
|
|
76
|
+
return (_jsxs("div", { ref: ref, id: id, "data-slot": "progress-field", className: cn("grid w-full gap-1.5", className), ...props, children: [label || shownValue ? (_jsxs("div", { className: "flex items-baseline justify-between gap-3 text-[13px]", children: [label ? (_jsx("span", { id: labelId, className: "min-w-0 truncate font-medium text-fg", children: label })) : (_jsx("span", {})), shownValue ? (_jsx("span", { "aria-hidden": true, className: cn("shrink-0 font-mono text-xs tabular", valueColor[m.tone] === "text-fg" ? "text-fg-muted" : valueColor[m.tone]), children: shownValue })) : null] })) : null, bar, hint ? (_jsx("p", { id: hintId, className: "text-xs text-fg-muted", children: hint })) : null] }));
|
|
77
|
+
});
|
|
78
|
+
/* ------------------------------------------------------------------ */
|
|
79
|
+
/* Circular */
|
|
80
|
+
/* ------------------------------------------------------------------ */
|
|
81
|
+
const CIRCLE = { sm: { px: 18, stroke: 2.5 }, md: { px: 40, stroke: 3.5 }, lg: { px: 64, stroke: 4.5 } };
|
|
82
|
+
/**
|
|
83
|
+
* Compact circular progress: profile completion, a step ring, an inline upload. Needs an
|
|
84
|
+
* accessible name (`aria-label` or `aria-labelledby`).
|
|
85
|
+
*
|
|
86
|
+
* ```tsx
|
|
87
|
+
* <ProgressCircle aria-label="Profile complete" value={72} size="lg" />
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
export const ProgressCircle = React.forwardRef(function ProgressCircle({ value, max, tone, display, valueText, labels, size = "md", showValue, children, className, ...props }, ref) {
|
|
91
|
+
const m = useProgressModel({ value, max, tone, display, valueText, labels });
|
|
92
|
+
const { px, stroke } = CIRCLE[size];
|
|
93
|
+
const r = (px - stroke) / 2;
|
|
94
|
+
const showCenter = size !== "sm" && (children != null || (showValue ?? size === "lg"));
|
|
95
|
+
const pct = m.indeterminate ? 26 : m.fill * 100;
|
|
96
|
+
return (_jsxs("div", { ref: ref, role: "progressbar", "aria-valuemin": 0, "aria-valuemax": m.indeterminate ? undefined : m.max, "aria-valuenow": m.indeterminate ? undefined : Math.min(value, m.max), "aria-valuetext": m.indeterminate ? m.t("loading") : m.text, "data-slot": "progress-circle", "data-state": m.indeterminate ? "indeterminate" : m.ratio >= 1 ? "complete" : "loading", "data-tone": m.tone, className: cn("vui-progress-circle relative inline-flex shrink-0 items-center justify-center", className), style: { width: px, height: px }, ...props, children: [_jsxs("svg", { width: px, height: px, viewBox: `0 0 ${px} ${px}`, "aria-hidden": true, focusable: "false", className: "-rotate-90 rtl:-scale-y-100", children: [_jsx("circle", { cx: px / 2, cy: px / 2, r: r, fill: "none", strokeWidth: stroke, className: "stroke-track" }), _jsx("g", { className: "vui-progress-arc", children: _jsx("circle", { cx: px / 2, cy: px / 2, r: r, fill: "none", strokeWidth: stroke, strokeLinecap: "round", pathLength: 100, strokeDasharray: `${pct} 100`, className: cn(strokeColor[m.tone], "transition-[stroke-dasharray] duration-300 motion-reduce:transition-none", pct === 0 && "opacity-0") }) })] }), showCenter ? (_jsx("span", { "aria-hidden": true, className: cn("absolute inset-0 flex items-center justify-center font-mono tabular", size === "lg" ? "text-[13px] font-medium" : "text-[10px]", valueColor[m.tone]), children: children ?? (m.indeterminate ? null : display === "fraction" ? `${value}/${m.max}` : m.text) })) : null] }));
|
|
97
|
+
});
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { encodeQr, qrPath, type QrErrorCorrection, type QrMatrix } from "./_qr-core.js";
|
|
3
|
+
export { encodeQr, qrPath, type QrErrorCorrection, type QrMatrix };
|
|
4
|
+
export interface QrCodeProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "children"> {
|
|
5
|
+
/** Text to encode (URL, otpauth:// URI, Wi-Fi string…). UTF-8, byte mode. */
|
|
6
|
+
value: string;
|
|
7
|
+
/** Accessible name — say what scanning does: "QR code to add Kiln & Linen to your authenticator app". */
|
|
8
|
+
"aria-label": string;
|
|
9
|
+
/** `"M"` (default) recovers ~15% damage; a centre mark switches to `"H"` automatically. */
|
|
10
|
+
errorCorrection?: QrErrorCorrection;
|
|
11
|
+
/** Rendered width (px or any CSS length). Default `176`. */
|
|
12
|
+
size?: number | string;
|
|
13
|
+
/**
|
|
14
|
+
* Quiet zone in modules. Default `4` without a plate, `2` on the plate (the plate's padding
|
|
15
|
+
* adds the rest). Scanners need light space around the code.
|
|
16
|
+
*/
|
|
17
|
+
margin?: number;
|
|
18
|
+
/**
|
|
19
|
+
* Draw the code on a light plate (default). Codes scan most reliably dark-on-light, so the plate
|
|
20
|
+
* stays light in dark mode. `false` uses the current text colour on a transparent background.
|
|
21
|
+
*/
|
|
22
|
+
plate?: boolean;
|
|
23
|
+
/** Shown when `value` is too long for version 40. Default "Too long for a QR code". */
|
|
24
|
+
fallback?: React.ReactNode;
|
|
25
|
+
/** Small mark in the centre (logo, icon). Keep it under ~20% of the width. */
|
|
26
|
+
children?: React.ReactNode;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* A QR code drawn as one SVG path — for two-factor enrolment, invite links, tickets and
|
|
30
|
+
* payment slips. Encoded on the server or client with no dependency; works in RSC.
|
|
31
|
+
*
|
|
32
|
+
* ```tsx
|
|
33
|
+
* <QrCode value={otpauthUri} aria-label="QR code for your authenticator app" />
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export declare const QrCode: React.ForwardRefExoticComponent<QrCodeProps & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { cn } from "../lib/cn.js";
|
|
4
|
+
import { encodeQr, qrPath } from "./_qr-core.js";
|
|
5
|
+
export { encodeQr, qrPath };
|
|
6
|
+
/**
|
|
7
|
+
* A QR code drawn as one SVG path — for two-factor enrolment, invite links, tickets and
|
|
8
|
+
* payment slips. Encoded on the server or client with no dependency; works in RSC.
|
|
9
|
+
*
|
|
10
|
+
* ```tsx
|
|
11
|
+
* <QrCode value={otpauthUri} aria-label="QR code for your authenticator app" />
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export const QrCode = React.forwardRef(function QrCode({ value, errorCorrection, size = 176, margin, plate = true, fallback = "Too long for a QR code", children, className, style, ...props }, ref) {
|
|
15
|
+
const ecl = errorCorrection ?? (children ? "H" : "M");
|
|
16
|
+
let qr = null;
|
|
17
|
+
try {
|
|
18
|
+
qr = encodeQr(value, { errorCorrection: ecl });
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
qr = null;
|
|
22
|
+
}
|
|
23
|
+
const quiet = margin ?? (plate ? 2 : 4);
|
|
24
|
+
const dim = qr ? qr.size + quiet * 2 : 0;
|
|
25
|
+
const width = typeof size === "number" ? `${size}px` : size;
|
|
26
|
+
return (_jsxs("div", { ref: ref, role: "img", "data-slot": "qr-code", "data-version": qr?.version, className: cn("relative inline-grid shrink-0 place-items-center", plate && "light rounded-ui border border-line bg-[var(--surface-solid)] p-2 text-fg shadow-[var(--surface-shadow)]", className), style: { width, ...style }, ...props, children: [qr ? (_jsx("svg", { viewBox: `0 0 ${dim} ${dim}`, "aria-hidden": "true", focusable: "false", shapeRendering: "crispEdges", className: "block size-full", children: _jsx("path", { d: qrPath(qr, quiet), fill: "currentColor" }) })) : (_jsx("span", { className: "grid aspect-square w-full place-items-center p-3 text-center text-xs text-fg-muted", children: fallback })), children && qr ? (_jsx("span", { "data-slot": "qr-code-mark", className: "absolute top-1/2 left-1/2 grid size-[22%] -translate-x-1/2 -translate-y-1/2 place-items-center rounded-ui-sm bg-[var(--surface-solid)] p-[3%] [&>svg]:size-full [&>img]:size-full [&>img]:object-contain", children: children })) : null] }));
|
|
27
|
+
});
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { RadioGroup as RadioGroupPrimitive } from "radix-ui";
|
|
3
|
+
export interface RadioGroupOption<V extends string = string> {
|
|
4
|
+
value: V;
|
|
5
|
+
label: React.ReactNode;
|
|
6
|
+
description?: React.ReactNode;
|
|
7
|
+
icon?: React.ReactNode;
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface RadioGroupProps<V extends string = string> extends Omit<React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>, "value" | "defaultValue" | "onValueChange" | "orientation"> {
|
|
11
|
+
/** Selected value; `null` = nothing selected (controlled). */
|
|
12
|
+
value?: V | null;
|
|
13
|
+
defaultValue?: V | null;
|
|
14
|
+
onValueChange?: (value: V) => void;
|
|
15
|
+
/** Shorthand for the options. Or compose `RadioGroupItem` children. */
|
|
16
|
+
items?: RadioGroupOption<V>[];
|
|
17
|
+
/**
|
|
18
|
+
* `"default"`: circle + label. `"card"`: selectable tiles with icon and description (plans).
|
|
19
|
+
* `"segmented"`: a compact segmented control for short labels (a form value, not a view switch —
|
|
20
|
+
* use `ToggleGroup` for toolbar/view state).
|
|
21
|
+
*/
|
|
22
|
+
variant?: "default" | "card" | "segmented";
|
|
23
|
+
orientation?: "vertical" | "horizontal";
|
|
24
|
+
size?: "sm" | "md";
|
|
25
|
+
invalid?: boolean;
|
|
26
|
+
/** Focusable, but the selection can't change (`aria-readonly`). */
|
|
27
|
+
readOnly?: boolean;
|
|
28
|
+
}
|
|
29
|
+
export declare const RadioGroup: <V extends string = string>(props: RadioGroupProps<V> & {
|
|
30
|
+
ref?: React.Ref<HTMLDivElement>;
|
|
31
|
+
}) => React.ReactElement;
|
|
32
|
+
export interface RadioGroupItemProps extends Omit<React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>, "children"> {
|
|
33
|
+
label?: React.ReactNode;
|
|
34
|
+
description?: React.ReactNode;
|
|
35
|
+
/** Leading icon (card and segmented variants). */
|
|
36
|
+
icon?: React.ReactNode;
|
|
37
|
+
/** Free content for a card (price, badge) under the label. */
|
|
38
|
+
children?: React.ReactNode;
|
|
39
|
+
/** Classes for the radio circle (default variant). */
|
|
40
|
+
controlClassName?: string;
|
|
41
|
+
}
|
|
42
|
+
/** One option inside a `RadioGroup`. */
|
|
43
|
+
export declare const RadioGroupItem: React.ForwardRefExoticComponent<RadioGroupItemProps & React.RefAttributes<HTMLButtonElement>>;
|