themelia-react-ui 1.0.2 → 2.0.1
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/CHANGELOG.md +632 -1
- package/README.md +31 -13
- package/dist/accordion-B6a3vVgA.js +207 -0
- package/dist/accordion-B6a3vVgA.js.map +1 -0
- package/dist/action-menu-TzCoSlwL.js +280 -0
- package/dist/action-menu-TzCoSlwL.js.map +1 -0
- package/dist/{affordance-geometry.generated-CL84ZN9A.js → affordance-geometry.generated-B5iu-Mkr.js} +9 -3
- package/dist/affordance-geometry.generated-B5iu-Mkr.js.map +1 -0
- package/dist/{ai-artifact-DLVdK0Py.js → ai-artifact-BMJdv-6q.js} +389 -391
- package/dist/ai-artifact-BMJdv-6q.js.map +1 -0
- package/dist/{app-shell-C_fKpljx.js → app-shell-ZK5RWdo6.js} +4 -4
- package/dist/{app-shell-C_fKpljx.js.map → app-shell-ZK5RWdo6.js.map} +1 -1
- package/dist/attachment-BtfhGm8i.js +245 -0
- package/dist/attachment-BtfhGm8i.js.map +1 -0
- package/dist/{auth-CAQcasMV.js → auth-CYxKfo69.js} +239 -237
- package/dist/auth-CYxKfo69.js.map +1 -0
- package/dist/{avatar-Bu2HhitA.js → avatar-BBnEJIx8.js} +71 -68
- package/dist/avatar-BBnEJIx8.js.map +1 -0
- package/dist/badge-MrKVNzW9.js +93 -0
- package/dist/badge-MrKVNzW9.js.map +1 -0
- package/dist/base/accordion.js +1 -1
- package/dist/base/action-menu.js +1 -1
- package/dist/base/attachment.js +1 -1
- package/dist/base/avatar.js +1 -1
- package/dist/base/badge.js +1 -1
- package/dist/base/batch-action-bar.js +3 -0
- package/dist/base/buttons.js +2 -3
- package/dist/base/cards.js +2 -2
- package/dist/base/carousel.js +19 -19
- package/dist/base/carousel.js.map +1 -1
- package/dist/base/cascader.js +234 -224
- package/dist/base/cascader.js.map +1 -1
- package/dist/base/chart.js +1 -1
- package/dist/base/choice-inputs.js +3 -3
- package/dist/base/code-block.js +1 -1
- package/dist/base/combobox.js +1 -1
- package/dist/base/command.js +1 -1
- package/dist/base/copyable.js +1 -1
- package/dist/base/date-pickers.js +2 -2
- package/dist/base/display.js +7 -7
- package/dist/base/feedback.js +3 -3
- package/dist/base/forms-numeric.js +1 -1
- package/dist/base/forms.js +2 -2
- package/dist/base/inline-edit.js +81 -76
- package/dist/base/inline-edit.js.map +1 -1
- package/dist/base/item.js +1 -1
- package/dist/base/media-gallery.js +1 -1
- package/dist/base/metadata-list.js +3 -0
- package/dist/base/navigation.js +7 -7
- package/dist/base/popover-menu.js +1 -1
- package/dist/base/popover.js +1 -1
- package/dist/base/qr-code.js +7 -4
- package/dist/base/qr-code.js.map +1 -1
- package/dist/base/repeaters.js +175 -174
- package/dist/base/repeaters.js.map +1 -1
- package/dist/base/sheet.js +1 -1
- package/dist/base/sidebar.js +1 -1
- package/dist/base/signature-pad.js +148 -138
- package/dist/base/signature-pad.js.map +1 -1
- package/dist/base/skeleton.js +1 -1
- package/dist/base/spinner.js +1 -1
- package/dist/base/structure.js +1 -1
- package/dist/base/table.js +1 -1
- package/dist/base/text-inputs.js +2 -2
- package/dist/base/toaster.js +4 -4
- package/dist/base/toaster.js.map +1 -1
- package/dist/base/tree.js +1 -1
- package/dist/base/upload-queue.js +1 -1
- package/dist/base/upload.js +3 -3
- package/dist/base/value-inputs.js +2 -2
- package/dist/batch-action-bar-BZGDG-Si.js +104 -0
- package/dist/batch-action-bar-BZGDG-Si.js.map +1 -0
- package/dist/blocks/admin.js +264 -253
- package/dist/blocks/admin.js.map +1 -1
- package/dist/blocks/ai.js +293 -323
- package/dist/blocks/ai.js.map +1 -1
- package/dist/blocks/analytics/usage-card.js +1 -1
- package/dist/blocks/analytics.js +596 -587
- package/dist/blocks/analytics.js.map +1 -1
- package/dist/blocks/collaboration.js +1 -1
- package/dist/blocks/commerce/receipt.js +1 -1
- package/dist/blocks/commerce.js +2246 -1693
- package/dist/blocks/commerce.js.map +1 -1
- package/dist/blocks/data-display.js +3 -2
- package/dist/blocks/onboarding.js +50 -49
- package/dist/blocks/onboarding.js.map +1 -1
- package/dist/blocks/planning.js +82 -91
- package/dist/blocks/planning.js.map +1 -1
- package/dist/blocks/timelines.js +1 -1
- package/dist/breadcrumbs-D5t7I023.js +129 -0
- package/dist/breadcrumbs-D5t7I023.js.map +1 -0
- package/dist/{button-BZyfTvwm.js → button-QYwiyhD2.js} +15 -14
- package/dist/button-QYwiyhD2.js.map +1 -0
- package/dist/buttons-SbIcm1HJ.js +661 -0
- package/dist/buttons-SbIcm1HJ.js.map +1 -0
- package/dist/{cards-qGSErLw_.js → cards-CiiHpKYd.js} +8 -8
- package/dist/cards-CiiHpKYd.js.map +1 -0
- package/dist/{chart-Bsc5BICK.js → chart-QfrARkXl.js} +17 -15
- package/dist/chart-QfrARkXl.js.map +1 -0
- package/dist/checkbox-DhB6K0bK.js +36 -0
- package/dist/checkbox-DhB6K0bK.js.map +1 -0
- package/dist/choice-inputs-t6w3ATNz.js +766 -0
- package/dist/choice-inputs-t6w3ATNz.js.map +1 -0
- package/dist/code-block-Dgbu-CU3.js +185 -0
- package/dist/code-block-Dgbu-CU3.js.map +1 -0
- package/dist/{collapsible-ClvC7Bj3.js → collapsible-D8AEGU1-.js} +4 -4
- package/dist/{collapsible-ClvC7Bj3.js.map → collapsible-D8AEGU1-.js.map} +1 -1
- package/dist/{collection-content-D6S8cv_n.js → collection-content-uK16Grv0.js} +3 -3
- package/dist/{collection-content-D6S8cv_n.js.map → collection-content-uK16Grv0.js.map} +1 -1
- package/dist/{combobox-BFnbJJp3.js → combobox-2Ic8N9bL.js} +103 -98
- package/dist/combobox-2Ic8N9bL.js.map +1 -0
- package/dist/combobox-DLl0bfiq.js +867 -0
- package/dist/combobox-DLl0bfiq.js.map +1 -0
- package/dist/{command-BnmSchli.js → command-kNR20o7x.js} +34 -30
- package/dist/command-kNR20o7x.js.map +1 -0
- package/dist/{comments-u5L0OGip.js → comments-BpDuCUUu.js} +304 -301
- package/dist/comments-BpDuCUUu.js.map +1 -0
- package/dist/components/base/accordion/accordion-variants.d.ts +3 -3
- package/dist/components/base/action-menu/action-menu.d.ts +27 -5
- package/dist/components/base/action-menu/action-menu.recipes.d.ts +21 -0
- package/dist/components/base/action-menu/index.d.ts +1 -0
- package/dist/components/base/avatar/stacked-avatars.d.ts +5 -4
- package/dist/components/base/badge/badge.d.ts +1 -1
- package/dist/components/base/badge/badge.recipes.d.ts +6 -6
- package/dist/components/base/batch-action-bar/batch-action-bar.d.ts +50 -0
- package/dist/components/base/batch-action-bar/batch-action-bar.strings.d.ts +20 -0
- package/dist/components/base/batch-action-bar/index.d.ts +8 -0
- package/dist/components/base/buttons/base-button.d.ts +7 -0
- package/dist/components/base/buttons/button-group.recipes.d.ts +2 -2
- package/dist/components/base/buttons/button.recipes.d.ts +2 -2
- package/dist/components/base/buttons/button.variants.d.ts +1 -0
- package/dist/components/base/buttons/loader-button.d.ts +3 -1
- package/dist/components/base/buttons/text-button.d.ts +2 -2
- package/dist/components/base/carousel/carousel.d.ts +3 -1
- package/dist/components/base/chart/chart.d.ts +7 -7
- package/dist/components/base/choice-inputs/checkbox.d.ts +6 -7
- package/dist/components/base/choice-inputs/choice-types.d.ts +24 -3
- package/dist/components/base/choice-inputs/pill-radio-group.d.ts +9 -0
- package/dist/components/base/choice-inputs/select-popup.d.ts +9 -1
- package/dist/components/base/choice-inputs/switch-card.d.ts +1 -1
- package/dist/components/base/date-pickers/date-picker-field.d.ts +23 -0
- package/dist/components/base/date-pickers/datepicker.types.d.ts +13 -3
- package/dist/components/base/display/alert-dialog.d.ts +10 -3
- package/dist/components/base/display/content-block.d.ts +4 -2
- package/dist/components/base/display/date-block.d.ts +1 -1
- package/dist/components/base/display/dialog.d.ts +8 -5
- package/dist/components/base/display/icon-badge/icon-badge.d.ts +1 -1
- package/dist/components/base/display/surface-title.d.ts +6 -1
- package/dist/components/base/feedback/alert.d.ts +1 -1
- package/dist/components/base/feedback/state-display.d.ts +5 -4
- package/dist/components/base/forms/form-sizing.d.ts +43 -8
- package/dist/components/base/forms/workflow.d.ts +2 -0
- package/dist/components/base/forms-numeric/coordinates-input.d.ts +3 -0
- package/dist/components/base/forms-numeric/rounding-mode-select.d.ts +4 -1
- package/dist/components/base/metadata-list/index.d.ts +12 -0
- package/dist/components/{blocks/data-display/metadata → base/metadata-list}/metadata-list.d.ts +28 -25
- package/dist/components/{blocks/data-display/metadata → base/metadata-list}/metadata-value.d.ts +2 -2
- package/dist/components/base/navigation/dropdown-menu.d.ts +2 -2
- package/dist/components/base/navigation/index.d.ts +1 -1
- package/dist/components/base/navigation/language-switcher.d.ts +4 -1
- package/dist/components/base/navigation/overflow-tab-bar.d.ts +7 -0
- package/dist/components/base/navigation/page-header/index.d.ts +1 -0
- package/dist/components/base/navigation/page-header/page-header-commands.d.ts +73 -0
- package/dist/components/base/navigation/page-header/page-header.d.ts +30 -4
- package/dist/components/base/qr-code/qr-code.d.ts +2 -0
- package/dist/components/base/sheet/index.d.ts +29 -1
- package/dist/components/base/sheet/sheet.d.ts +10 -5
- package/dist/components/base/signature-pad/signature-pad.types.d.ts +5 -1
- package/dist/components/base/signature-pad/signature-pad.utils.d.ts +11 -3
- package/dist/components/base/spinner/spinner.d.ts +3 -2
- package/dist/components/base/structure/structure.types.d.ts +1 -1
- package/dist/components/base/text-inputs/field-clear-button.d.ts +6 -0
- package/dist/components/base/text-inputs/input-group.d.ts +2 -2
- package/dist/components/base/upload/upload.recipes.d.ts +33 -0
- package/dist/components/base/value-inputs/date-time-input.d.ts +4 -2
- package/dist/components/base/value-inputs/index.d.ts +5 -5
- package/dist/components/base/value-inputs/tags-input.d.ts +38 -12
- package/dist/components/blocks/admin/api-key-list/api-key-list.types.d.ts +1 -1
- package/dist/components/blocks/analytics/format-metric-value.d.ts +11 -1
- package/dist/components/blocks/analytics/index.d.ts +1 -1
- package/dist/components/blocks/analytics/use-metric-format-options.d.ts +3 -0
- package/dist/components/blocks/commerce/address-card/address-card.d.ts +1 -1
- package/dist/components/blocks/commerce/address-card/types.d.ts +4 -1
- package/dist/components/blocks/commerce/booking-calendar-event-card/booking-calendar-event-card.d.ts +4 -0
- package/dist/components/blocks/commerce/booking-calendar-event-card/booking-calendar-event-card.types.d.ts +2 -2
- package/dist/components/blocks/commerce/cart-summary/cart-summary.d.ts +3 -1
- package/dist/components/blocks/commerce/cart-summary/index.d.ts +2 -2
- package/dist/components/blocks/commerce/cart-summary/types.d.ts +6 -1
- package/dist/components/blocks/commerce/discount-stack/discount-stack.d.ts +3 -1
- package/dist/components/blocks/commerce/discount-stack/index.d.ts +2 -2
- package/dist/components/blocks/commerce/discount-stack/types.d.ts +16 -4
- package/dist/components/blocks/commerce/fulfillment-group/fulfillment-group.d.ts +5 -0
- package/dist/components/blocks/commerce/fulfillment-group/index.d.ts +2 -0
- package/dist/components/blocks/commerce/fulfillment-group/types.d.ts +43 -0
- package/dist/components/blocks/commerce/index.d.ts +13 -5
- package/dist/components/blocks/commerce/inventory-section/types.d.ts +4 -1
- package/dist/components/blocks/commerce/invoice-header/invoice-header.d.ts +1 -1
- package/dist/components/blocks/commerce/invoice-header/types.d.ts +4 -2
- package/dist/components/blocks/commerce/invoice-mini/invoice-mini.d.ts +1 -1
- package/dist/components/blocks/commerce/invoice-mini/types.d.ts +2 -1
- package/dist/components/blocks/commerce/loyalty-points/types.d.ts +1 -1
- package/dist/components/blocks/commerce/order-customer/index.d.ts +2 -0
- package/dist/components/blocks/commerce/order-customer/order-customer.d.ts +5 -0
- package/dist/components/blocks/commerce/order-customer/types.d.ts +48 -0
- package/dist/components/blocks/commerce/order-header/index.d.ts +2 -0
- package/dist/components/blocks/commerce/order-header/order-header.d.ts +5 -0
- package/dist/components/blocks/commerce/order-header/types.d.ts +37 -0
- package/dist/components/blocks/commerce/order-line-item/index.d.ts +2 -0
- package/dist/components/blocks/commerce/order-line-item/order-line-item.d.ts +5 -0
- package/dist/components/blocks/commerce/order-line-item/types.d.ts +46 -0
- package/dist/components/blocks/commerce/order-status/types.d.ts +4 -0
- package/dist/components/blocks/commerce/order-summary/index.d.ts +2 -0
- package/dist/components/blocks/commerce/order-summary/order-summary.d.ts +5 -0
- package/dist/components/blocks/commerce/order-summary/types.d.ts +42 -0
- package/dist/components/blocks/commerce/order-transactions/index.d.ts +2 -0
- package/dist/components/blocks/commerce/order-transactions/order-transactions.d.ts +5 -0
- package/dist/components/blocks/commerce/order-transactions/types.d.ts +46 -0
- package/dist/components/blocks/commerce/payment-method/index.d.ts +2 -2
- package/dist/components/blocks/commerce/payment-method/payment-method.d.ts +9 -1
- package/dist/components/blocks/commerce/payment-method/types.d.ts +14 -1
- package/dist/components/blocks/commerce/refund-status/index.d.ts +2 -2
- package/dist/components/blocks/commerce/refund-status/refund-status.d.ts +3 -1
- package/dist/components/blocks/commerce/refund-status/types.d.ts +6 -3
- package/dist/components/blocks/commerce/seo-listing/seo-listing-card.d.ts +1 -1
- package/dist/components/blocks/commerce/seo-listing/types.d.ts +3 -1
- package/dist/components/blocks/commerce/shared/address-lines.d.ts +21 -0
- package/dist/components/blocks/commerce/shared/line-thumbnail.d.ts +9 -0
- package/dist/components/blocks/commerce/shared/order-status.d.ts +51 -0
- package/dist/components/blocks/commerce/shipment-tracking/shipment-tracking.d.ts +1 -1
- package/dist/components/blocks/commerce/shipment-tracking/types.d.ts +27 -6
- package/dist/components/blocks/commerce/summary-panel/amount-row.d.ts +2 -0
- package/dist/components/blocks/commerce/summary-panel/index.d.ts +3 -0
- package/dist/components/blocks/commerce/summary-panel/summary-panel.d.ts +2 -0
- package/dist/components/blocks/commerce/summary-panel/types.d.ts +26 -0
- package/dist/components/blocks/commerce/tax-breakdown/tax-breakdown.d.ts +1 -1
- package/dist/components/blocks/commerce/tax-breakdown/types.d.ts +2 -1
- package/dist/components/blocks/commerce/vendor-profile/types.d.ts +4 -1
- package/dist/components/blocks/data-display/dense-info-card/dense-info.strings.d.ts +4 -1
- package/dist/components/blocks/data-display/inline-stat/inline-stat.d.ts +4 -1
- package/dist/components/blocks/data-display/metadata/index.d.ts +30 -4
- package/dist/components/features/activities/partials/activity-row.d.ts +6 -2
- package/dist/components/features/activities/partials/tone-tokens.d.ts +0 -6
- package/dist/components/features/global-search/partials/global-search-group-heading.d.ts +15 -0
- package/dist/components/features/global-search/partials/global-search-idle-state.d.ts +1 -1
- package/dist/components/features/global-search/partials/tone-palettes.d.ts +0 -5
- package/dist/components/features/kanban/kanban.d.ts +1 -1
- package/dist/components/features/kanban/kanban.strings.d.ts +1 -1
- package/dist/components/features/kanban/kanban.types.d.ts +2 -2
- package/dist/components/features/media-library/hooks/use-media-library.d.ts +1 -1
- package/dist/components/features/media-library/index.d.ts +1 -1
- package/dist/components/features/media-library/media-library.d.ts +1 -1
- package/dist/components/features/media-library/media-library.strings.d.ts +4 -0
- package/dist/components/features/media-library/media-library.types.d.ts +74 -1
- package/dist/components/features/media-library/partials/media-library-partials.d.ts +3 -3
- package/dist/components/features/mentions/partials/mention-kind-toggles.d.ts +16 -0
- package/dist/components/features/overlays/alert-dialog.d.ts +1 -1
- package/dist/components/features/overlays/dialog.d.ts +1 -1
- package/dist/components/features/overlays/drawer.d.ts +1 -1
- package/dist/components/features/overlays/hooks/use-overlay-actions.d.ts +2 -2
- package/dist/components/features/overlays/hooks/use-overlay-visibility.d.ts +11 -4
- package/dist/components/features/overlays/index.d.ts +1 -1
- package/dist/components/features/overlays/overlay-tone-icon.d.ts +37 -0
- package/dist/components/features/overlays/overlays.types.d.ts +62 -19
- package/dist/components/features/products/components/product-contract-overview.d.ts +5 -0
- package/dist/components/features/products/components/product-details-card.d.ts +5 -0
- package/dist/components/features/products/components/product-operations-card.d.ts +5 -0
- package/dist/components/features/products/components/product-option-action-menu.d.ts +5 -0
- package/dist/components/features/products/components/product-options-summary.d.ts +5 -0
- package/dist/components/features/products/components/product-policies-card.d.ts +5 -0
- package/dist/components/features/products/components/product-quote-preview-card.d.ts +5 -0
- package/dist/components/features/products/components/product-readiness-card.d.ts +5 -0
- package/dist/components/features/products/components/product-structure-card.d.ts +5 -0
- package/dist/components/features/products/components/product-variant-action-menu.d.ts +23 -1
- package/dist/components/features/products/components/product-variants-manager.d.ts +1 -1
- package/dist/components/features/products/partials/index.d.ts +1 -1
- package/dist/components/features/products/partials/product-metric-tile.d.ts +6 -0
- package/dist/components/features/products/partials/product-tone.d.ts +11 -1
- package/dist/components/features/products/products.types.d.ts +11 -3
- package/dist/components/features/resource/index.d.ts +1 -1
- package/dist/components/features/resource/resource.d.ts +1 -1
- package/dist/components/features/resource/resource.types.d.ts +34 -6
- package/dist/components/features/rich-text-editor/index.d.ts +2 -1
- package/dist/components/features/rich-text-editor/partials/image-nodes.d.ts +13 -0
- package/dist/components/features/rich-text-editor/partials/image-uploads.d.ts +66 -0
- package/dist/components/features/rich-text-editor/partials/inline-reference-node.d.ts +19 -0
- package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +1 -1
- package/dist/components/features/rich-text-editor/rich-text-editor.strings.d.ts +14 -0
- package/dist/components/features/rich-text-editor/rich-text-editor.types.d.ts +45 -0
- package/dist/components/features/rich-text-editor/use-rich-text-images.d.ts +18 -0
- package/dist/components/features/sync/index.d.ts +26 -3
- package/dist/components/features/table/data-table.d.ts +1 -1
- package/dist/components/features/table/partials/cell-renderers.d.ts +1 -1
- package/dist/components/features/table/table.types.d.ts +32 -7
- package/dist/components/layout/page/index.d.ts +1 -1
- package/dist/components/layout/page/page.types.d.ts +51 -4
- package/dist/components/layout/page/partials/page-actions.d.ts +1 -0
- package/dist/components/layout/page/partials/page-header.d.ts +1 -1
- package/dist/components/layout/settings/settings.d.ts +16 -2
- package/dist/components/layout/workspace/workspace.types.d.ts +21 -4
- package/dist/components/primitives/date.d.ts +16 -3
- package/dist/components/primitives/dimensions.d.ts +6 -0
- package/dist/components/primitives/duration.d.ts +6 -0
- package/dist/components/primitives/file-size.d.ts +6 -0
- package/dist/components/primitives/index.d.ts +1 -1
- package/dist/components/primitives/initials.d.ts +11 -2
- package/dist/components/primitives/link.d.ts +7 -0
- package/dist/components/primitives/money.d.ts +29 -7
- package/dist/components/primitives/number.d.ts +17 -0
- package/dist/components/primitives/value-typography.d.ts +54 -0
- package/dist/components/primitives/value.d.ts +31 -6
- package/dist/components/typography/heading.d.ts +9 -1
- package/dist/components/typography/label.d.ts +3 -0
- package/dist/components/typography/rich-text/index.d.ts +1 -1
- package/dist/components/typography/rich-text/rich-text-tree.d.ts +19 -0
- package/dist/components/typography/rich-text/rich-text.d.ts +16 -0
- package/dist/components/typography/running-text.d.ts +12 -0
- package/dist/components/typography/text-link.d.ts +24 -1
- package/dist/components/typography/text.d.ts +12 -0
- package/dist/components/typography/text.styles.d.ts +35 -13
- package/dist/components/ui/button.d.ts +1 -1
- package/dist/components/ui/checkbox.d.ts +6 -0
- package/dist/components/ui/overlay.recipes.d.ts +6 -2
- package/dist/components/ui/select.d.ts +3 -1
- package/dist/components/ui/switch.d.ts +5 -0
- package/dist/{containers-DqB-bSYE.js → containers-DmWiJa2I.js} +36 -35
- package/dist/containers-DmWiJa2I.js.map +1 -0
- package/dist/{copyable-BTSByfmq.js → copyable-B3Gwgdqc.js} +6 -6
- package/dist/{copyable-BTSByfmq.js.map → copyable-B3Gwgdqc.js.map} +1 -1
- package/dist/data-display-DafIvCl5.js +960 -0
- package/dist/data-display-DafIvCl5.js.map +1 -0
- package/dist/date-BgK3bTdo.js +144 -0
- package/dist/date-BgK3bTdo.js.map +1 -0
- package/dist/date-picker-CF-DtUpF.js +1529 -0
- package/dist/date-picker-CF-DtUpF.js.map +1 -0
- package/dist/date-pickers-BmzxJl5l.js +174 -0
- package/dist/date-pickers-BmzxJl5l.js.map +1 -0
- package/dist/{display-CS6Hbk18.js → display-DsQTVzMz.js} +88 -87
- package/dist/display-DsQTVzMz.js.map +1 -0
- package/dist/{dropdown-menu-D-boNgGO.js → dropdown-menu-E2qmdC7o.js} +23 -16
- package/dist/dropdown-menu-E2qmdC7o.js.map +1 -0
- package/dist/features/activities.js +437 -521
- package/dist/features/activities.js.map +1 -1
- package/dist/features/ai-chat.js +174 -172
- package/dist/features/ai-chat.js.map +1 -1
- package/dist/features/async-preview.js +8 -8
- package/dist/features/async-preview.js.map +1 -1
- package/dist/features/combobox.js +1 -1
- package/dist/features/comments.js +1 -1
- package/dist/features/data-view.js +139 -138
- package/dist/features/data-view.js.map +1 -1
- package/dist/features/email-composer/engine.js +1 -1
- package/dist/features/email-composer.js +353 -352
- package/dist/features/email-composer.js.map +1 -1
- package/dist/features/event-calendar.js +262 -269
- package/dist/features/event-calendar.js.map +1 -1
- package/dist/features/filters.js +1 -1
- package/dist/features/global-search.js +307 -310
- package/dist/features/global-search.js.map +1 -1
- package/dist/features/kanban.js +95 -97
- package/dist/features/kanban.js.map +1 -1
- package/dist/features/map.js +56 -57
- package/dist/features/map.js.map +1 -1
- package/dist/features/media-library.js +914 -824
- package/dist/features/media-library.js.map +1 -1
- package/dist/features/mentions.js +1 -1
- package/dist/features/overlays.js +1 -1
- package/dist/features/products.js +1272 -1311
- package/dist/features/products.js.map +1 -1
- package/dist/features/questionnaire.js +204 -194
- package/dist/features/questionnaire.js.map +1 -1
- package/dist/features/resource-assignment.js +103 -95
- package/dist/features/resource-assignment.js.map +1 -1
- package/dist/features/resource.js +77 -69
- package/dist/features/resource.js.map +1 -1
- package/dist/features/rich-text-editor.js +30 -11
- package/dist/features/rich-text-editor.js.map +1 -1
- package/dist/features/schema-form.js +193 -189
- package/dist/features/schema-form.js.map +1 -1
- package/dist/features/suggestions.js +3 -3
- package/dist/features/sync.js +7 -7
- package/dist/features/sync.js.map +1 -1
- package/dist/features/table.js +1 -1
- package/dist/features/theme-tweaker.js +455 -455
- package/dist/features/theme-tweaker.js.map +1 -1
- package/dist/feedback-qNuMBtRH.js +233 -0
- package/dist/feedback-qNuMBtRH.js.map +1 -0
- package/dist/field-affordance-recipes-qQeIf4lG.js +48 -0
- package/dist/field-affordance-recipes-qQeIf4lG.js.map +1 -0
- package/dist/field-state-recipes-BVA2CWHo.js +12 -0
- package/dist/field-state-recipes-BVA2CWHo.js.map +1 -0
- package/dist/{filters-D6FF8L6s.js → filters-BkHH53uv.js} +414 -412
- package/dist/filters-BkHH53uv.js.map +1 -0
- package/dist/focus-recipes-B653VaLq.js +12 -0
- package/dist/focus-recipes-B653VaLq.js.map +1 -0
- package/dist/{form-field-CZwrkP7m.js → form-field-DUt4UxSV.js} +7 -7
- package/dist/{form-field-CZwrkP7m.js.map → form-field-DUt4UxSV.js.map} +1 -1
- package/dist/form-sizing-By94KzXE.js +130 -0
- package/dist/form-sizing-By94KzXE.js.map +1 -0
- package/dist/{forms-B5NCbkSC.js → forms-Bzha-Y3B.js} +25 -25
- package/dist/forms-Bzha-Y3B.js.map +1 -0
- package/dist/forms-numeric-C0bvjRPZ.js +906 -0
- package/dist/forms-numeric-C0bvjRPZ.js.map +1 -0
- package/dist/{header-kxruN3RM.js → header-BOefOKd1.js} +38 -41
- package/dist/header-BOefOKd1.js.map +1 -0
- package/dist/{hooks-BrlnCwQd.js → hooks-9k_TtmKh.js} +2 -2
- package/dist/{hooks-BrlnCwQd.js.map → hooks-9k_TtmKh.js.map} +1 -1
- package/dist/{http-CdEIHyQf.js → http-D_6rOnzU.js} +2 -2
- package/dist/{http-CdEIHyQf.js.map → http-D_6rOnzU.js.map} +1 -1
- package/dist/icon-badge-CAuKupo9.js +55 -0
- package/dist/icon-badge-CAuKupo9.js.map +1 -0
- package/dist/index.js +7 -7
- package/dist/input-DWhBBBww.js +262 -0
- package/dist/input-DWhBBBww.js.map +1 -0
- package/dist/{input-vxcaNCYC.js → input-Ddi_LSYv.js} +3 -3
- package/dist/{input-vxcaNCYC.js.map → input-Ddi_LSYv.js.map} +1 -1
- package/dist/interaction-recipes-CHr0dJUs.js +24 -0
- package/dist/interaction-recipes-CHr0dJUs.js.map +1 -0
- package/dist/item-DEmDiTlD.js +265 -0
- package/dist/item-DEmDiTlD.js.map +1 -0
- package/dist/layer-recipes-CCpklYME.js +13 -0
- package/dist/layer-recipes-CCpklYME.js.map +1 -0
- package/dist/layout/app-shell.js +1 -1
- package/dist/layout/auth.js +1 -1
- package/dist/layout/containers.js +1 -1
- package/dist/layout/header.js +1 -1
- package/dist/layout/hooks.js +1 -1
- package/dist/layout/navigation.js +1 -1
- package/dist/layout/page.js +1 -1
- package/dist/layout/settings.js +1 -1
- package/dist/layout/sidebar.js +2 -2
- package/dist/layout/workspace.js +1 -1
- package/dist/layout.js +10 -10
- package/dist/lib/affordance-geometry.generated.d.ts +7 -1
- package/dist/lib/field-affordance-recipes.d.ts +41 -1
- package/dist/lib/field-state-recipes.d.ts +9 -6
- package/dist/lib/focus-recipes.d.ts +24 -0
- package/dist/lib/format.d.ts +9 -0
- package/dist/lib/interaction-recipes.d.ts +35 -0
- package/dist/lib/layer-recipes.d.ts +19 -0
- package/dist/lib/money-format.d.ts +30 -0
- package/dist/lib/motion-recipes.d.ts +1 -0
- package/dist/lib/overlay-anatomy-recipes.d.ts +2 -1
- package/dist/lib/safe-image-src.d.ts +10 -0
- package/dist/lib/sanitize-html.d.ts +15 -3
- package/dist/lib/surface-recipes.d.ts +48 -6
- package/dist/lib/token-merge.generated.d.ts +17 -14
- package/dist/lib/tone-recipes.d.ts +79 -0
- package/dist/lib/track-recipes.d.ts +1 -1
- package/dist/lib/ui-provider/hooks.d.ts +2 -1
- package/dist/lib/ui-provider/index.d.ts +2 -2
- package/dist/lib/ui-provider/provider.d.ts +7 -2
- package/dist/lib/ui-provider/store.d.ts +6 -2
- package/dist/lib/ui-provider/types.d.ts +14 -2
- package/dist/lib/utils.js +1 -1
- package/dist/media-gallery-DcTtAaeC.js +203 -0
- package/dist/media-gallery-DcTtAaeC.js.map +1 -0
- package/dist/mentions-D-uyCh01.js +568 -0
- package/dist/mentions-D-uyCh01.js.map +1 -0
- package/dist/{message-SZUNB1eX.js → message-CdHgIWKf.js} +5 -5
- package/dist/{message-SZUNB1eX.js.map → message-CdHgIWKf.js.map} +1 -1
- package/dist/metadata-list-X5rYAKSB.js +394 -0
- package/dist/metadata-list-X5rYAKSB.js.map +1 -0
- package/dist/{motion-recipes-B6jKXEcN.js → motion-recipes-ChBg4HBq.js} +3 -2
- package/dist/{motion-recipes-B6jKXEcN.js.map → motion-recipes-ChBg4HBq.js.map} +1 -1
- package/dist/navigation-D3KwXmaq.js +145 -0
- package/dist/navigation-D3KwXmaq.js.map +1 -0
- package/dist/navigation-HJf5zxlH.js +268 -0
- package/dist/navigation-HJf5zxlH.js.map +1 -0
- package/dist/{navigation-row-recipes-DQEXQcqY.js → navigation-row-recipes-BVowojQw.js} +2 -2
- package/dist/{navigation-row-recipes-DQEXQcqY.js.map → navigation-row-recipes-BVowojQw.js.map} +1 -1
- package/dist/number-DMhe-Vsk.js +352 -0
- package/dist/number-DMhe-Vsk.js.map +1 -0
- package/dist/overflow-tab-bar-sQHXLlwQ.js +280 -0
- package/dist/overflow-tab-bar-sQHXLlwQ.js.map +1 -0
- package/dist/overlay.recipes-8GHqmlb4.js +6 -0
- package/dist/overlay.recipes-8GHqmlb4.js.map +1 -0
- package/dist/overlays-I0axtYA6.js +999 -0
- package/dist/overlays-I0axtYA6.js.map +1 -0
- package/dist/{page-hGmT4nWK.js → page-B5dTH9gE.js} +79 -68
- package/dist/page-B5dTH9gE.js.map +1 -0
- package/dist/page-header-commands-DjzFEq3E.js +126 -0
- package/dist/page-header-commands-DjzFEq3E.js.map +1 -0
- package/dist/{pagination-NLGqRirf.js → pagination-3bPA_a6K.js} +19 -19
- package/dist/{pagination-NLGqRirf.js.map → pagination-3bPA_a6K.js.map} +1 -1
- package/dist/{popover-CghIYdQf.js → popover-Di55PyAI.js} +8 -8
- package/dist/popover-Di55PyAI.js.map +1 -0
- package/dist/{popover-menu-B4PoWhRl.js → popover-menu-B71Tn2Qz.js} +6 -6
- package/dist/{popover-menu-B4PoWhRl.js.map → popover-menu-B71Tn2Qz.js.map} +1 -1
- package/dist/{popover.recipes-QlD4JenO.js → popover.recipes-Bdyhj2db.js} +2 -2
- package/dist/{popover.recipes-QlD4JenO.js.map → popover.recipes-Bdyhj2db.js.map} +1 -1
- package/dist/primitives-B-CkiEMU.js +379 -0
- package/dist/primitives-B-CkiEMU.js.map +1 -0
- package/dist/primitives.js +5 -5
- package/dist/{progress-BroqrAyV.js → progress-rnS8-uAW.js} +11 -11
- package/dist/progress-rnS8-uAW.js.map +1 -0
- package/dist/{receipt-BuJynLgf.js → receipt-D0oswZ0p.js} +6 -6
- package/dist/{receipt-BuJynLgf.js.map → receipt-D0oswZ0p.js.map} +1 -1
- package/dist/rich-text-DvGulsNJ.js +78 -0
- package/dist/rich-text-DvGulsNJ.js.map +1 -0
- package/dist/rich-text-editor-sMU_Scqm.js +1204 -0
- package/dist/rich-text-editor-sMU_Scqm.js.map +1 -0
- package/dist/rich-text-editor.recipes-CadiF_Uu.js +88 -0
- package/dist/rich-text-editor.recipes-CadiF_Uu.js.map +1 -0
- package/dist/rich-text-editor.strings-CB59ekH2.js +38 -0
- package/dist/rich-text-editor.strings-CB59ekH2.js.map +1 -0
- package/dist/safe-image-src-C6kQSMBZ.js +17 -0
- package/dist/safe-image-src-C6kQSMBZ.js.map +1 -0
- package/dist/sanitize-html-DsQmI48u.js +92 -0
- package/dist/sanitize-html-DsQmI48u.js.map +1 -0
- package/dist/scroll-area-Bt_vXY2b.js +48 -0
- package/dist/scroll-area-Bt_vXY2b.js.map +1 -0
- package/dist/{separator-BNIgG3au.js → separator-C8DlRGwF.js} +4 -4
- package/dist/separator-C8DlRGwF.js.map +1 -0
- package/dist/{separator-BhtFyo4x.js → separator-CYHnjsAb.js} +2 -2
- package/dist/{separator-BhtFyo4x.js.map → separator-CYHnjsAb.js.map} +1 -1
- package/dist/services/actions/action-adapters.d.ts +22 -0
- package/dist/services/actions/index.d.ts +1 -1
- package/dist/services/actions.js +23 -6
- package/dist/services/actions.js.map +1 -1
- package/dist/settings-CQW3b-Cu.js +170 -0
- package/dist/settings-CQW3b-Cu.js.map +1 -0
- package/dist/sheet-4SEvVYzA.js +210 -0
- package/dist/sheet-4SEvVYzA.js.map +1 -0
- package/dist/{sidebar-CyR4XKwR.js → sidebar-C7WWR29L.js} +181 -180
- package/dist/sidebar-C7WWR29L.js.map +1 -0
- package/dist/sidebar-d7Dg80ln.js +511 -0
- package/dist/sidebar-d7Dg80ln.js.map +1 -0
- package/dist/{skeleton-3F0uhYn3.js → skeleton-Cz890JZF.js} +10 -10
- package/dist/skeleton-Cz890JZF.js.map +1 -0
- package/dist/smart-card-lFKxn5Hu.js +595 -0
- package/dist/smart-card-lFKxn5Hu.js.map +1 -0
- package/dist/{spinner-Cpf7oRkF.js → spinner-fa3h1Aif.js} +10 -8
- package/dist/spinner-fa3h1Aif.js.map +1 -0
- package/dist/{structure-CRdqVawd.js → structure-DC2dygdA.js} +3 -3
- package/dist/{structure-CRdqVawd.js.map → structure-DC2dygdA.js.map} +1 -1
- package/dist/{structure.recipes-Bqhf9oIh.js → structure.recipes-EPz60cU8.js} +37 -19
- package/dist/structure.recipes-EPz60cU8.js.map +1 -0
- package/dist/style.css +1 -1
- package/dist/surface-recipes-BKRVW8Os.js +43 -0
- package/dist/surface-recipes-BKRVW8Os.js.map +1 -0
- package/dist/table-CIKyLUsy.js +163 -0
- package/dist/table-CIKyLUsy.js.map +1 -0
- package/dist/{table-CcRDZiLP.js → table-CrcLN9Io.js} +544 -530
- package/dist/table-CrcLN9Io.js.map +1 -0
- package/dist/tabs-DwBJfjxX.js +190 -0
- package/dist/tabs-DwBJfjxX.js.map +1 -0
- package/dist/{text-inputs-DsR56TR-.js → text-inputs-aaK9wcDT.js} +151 -155
- package/dist/text-inputs-aaK9wcDT.js.map +1 -0
- package/dist/{text.styles-Q4sGAIgA.js → text.styles-g4He6UIW.js} +17 -14
- package/dist/text.styles-g4He6UIW.js.map +1 -0
- package/dist/theme.css +16 -12
- package/dist/themes/green.css +24 -0
- package/dist/{timelines-D1pkt3se.js → timelines-C_SBwHNP.js} +154 -164
- package/dist/timelines-C_SBwHNP.js.map +1 -0
- package/dist/tone-recipes-CPoExcTE.js +70 -0
- package/dist/tone-recipes-CPoExcTE.js.map +1 -0
- package/dist/tooltip-CsfgrfS7.js +111 -0
- package/dist/tooltip-CsfgrfS7.js.map +1 -0
- package/dist/track-recipes-CDcKmndW.js +10 -0
- package/dist/track-recipes-CDcKmndW.js.map +1 -0
- package/dist/{tree-BtmYyMZV.js → tree-BiKhg8AY.js} +72 -70
- package/dist/tree-BiKhg8AY.js.map +1 -0
- package/dist/typography/rich-text.js +1 -1
- package/dist/typography-DTRkE9zL.js +117 -0
- package/dist/typography-DTRkE9zL.js.map +1 -0
- package/dist/typography.js +2 -2
- package/dist/{ui-provider-DRPn3qNl.js → ui-provider-1D_NSYzO.js} +30 -23
- package/dist/ui-provider-1D_NSYzO.js.map +1 -0
- package/dist/ui-provider.js +3 -3
- package/dist/{upload-CDbYw1WN.js → upload-BO8-CLN6.js} +294 -293
- package/dist/upload-BO8-CLN6.js.map +1 -0
- package/dist/{upload-queue-CNd_hH_a.js → upload-queue-EOC8g1gf.js} +133 -138
- package/dist/upload-queue-EOC8g1gf.js.map +1 -0
- package/dist/upload.recipes-BbxTqrCT.js +61 -0
- package/dist/upload.recipes-BbxTqrCT.js.map +1 -0
- package/dist/{usage-card-VyJLUwRr.js → usage-card-obRaBskq.js} +42 -43
- package/dist/{usage-card-VyJLUwRr.js.map → usage-card-obRaBskq.js.map} +1 -1
- package/dist/{utils-BvH9PSmq.js → utils-l5LpDw2z.js} +264 -62
- package/dist/utils-l5LpDw2z.js.map +1 -0
- package/dist/value-inputs-TAYMX111.js +947 -0
- package/dist/value-inputs-TAYMX111.js.map +1 -0
- package/dist/value-typography-b8wpz1eX.js +116 -0
- package/dist/value-typography-b8wpz1eX.js.map +1 -0
- package/dist/workspace-DH0v0KcB.js +407 -0
- package/dist/workspace-DH0v0KcB.js.map +1 -0
- package/docs/consumer-skill/SKILL.md +62 -50
- package/docs/consumer-skill/examples/app-layout.tsx +3 -5
- package/docs/consumer-skill/examples/composition.tsx +3 -3
- package/docs/consumer-skill/examples/detail.tsx +59 -13
- package/docs/consumer-skill/examples/edit.tsx +2 -2
- package/docs/consumer-skill/examples/layout-blocks.tsx +20 -0
- package/docs/consumer-skill/examples/manifest.json +28 -6
- package/docs/consumer-skill/examples/receipt.tsx +2 -2
- package/docs/consumer-skill/examples/scoped-directory.tsx +3 -3
- package/docs/consumer-skill/examples/website.tsx +1 -1
- package/docs/consumer-skill/references/agents-md.md +33 -0
- package/docs/consumer-skill/references/analytics.md +1 -1
- package/docs/consumer-skill/references/composition.md +139 -24
- package/docs/consumer-skill/references/design-contract.md +12 -3
- package/docs/consumer-skill/references/discovery.md +4 -0
- package/docs/consumer-skill/references/installation.md +33 -1
- package/docs/consumer-skill/references/integration.md +32 -1
- package/docs/consumer-skill/references/public-api.json +1051 -610
- package/docs/consumer-skill/references/review.md +44 -8
- package/docs/consumer-skill/references/theming.md +14 -4
- package/docs/consumer-skill/references/tokens.json +5 -2
- package/docs/consumer-skill/references/workflows.md +30 -9
- package/docs/consumer-skill/scripts/composition-policy.mjs +127 -6
- package/docs/consumer-skill/scripts/discovery.mjs +11 -3
- package/docs/consumer-skill/scripts/pin-button-defaults.mjs +95 -0
- package/docs/consumer-skill/scripts/surface-policy.mjs +139 -5
- package/package.json +13 -3
- package/dist/accordion-BRTcsp8J.js +0 -205
- package/dist/accordion-BRTcsp8J.js.map +0 -1
- package/dist/action-menu-Drxw_vJk.js +0 -265
- package/dist/action-menu-Drxw_vJk.js.map +0 -1
- package/dist/affordance-geometry.generated-CL84ZN9A.js.map +0 -1
- package/dist/ai-artifact-DLVdK0Py.js.map +0 -1
- package/dist/attachment-DbjUWsP0.js +0 -244
- package/dist/attachment-DbjUWsP0.js.map +0 -1
- package/dist/auth-CAQcasMV.js.map +0 -1
- package/dist/avatar-Bu2HhitA.js.map +0 -1
- package/dist/badge-CzId1Wlm.js +0 -92
- package/dist/badge-CzId1Wlm.js.map +0 -1
- package/dist/breadcrumbs-BuYz5SDU.js +0 -128
- package/dist/breadcrumbs-BuYz5SDU.js.map +0 -1
- package/dist/button-BZDasD04.js +0 -651
- package/dist/button-BZDasD04.js.map +0 -1
- package/dist/button-BZyfTvwm.js.map +0 -1
- package/dist/buttons-D_6KJvEE.js +0 -99
- package/dist/buttons-D_6KJvEE.js.map +0 -1
- package/dist/cards-qGSErLw_.js.map +0 -1
- package/dist/chart-Bsc5BICK.js.map +0 -1
- package/dist/checkbox-BQNDjUCh.js +0 -34
- package/dist/checkbox-BQNDjUCh.js.map +0 -1
- package/dist/choice-inputs-Mk3iWbhr.js +0 -725
- package/dist/choice-inputs-Mk3iWbhr.js.map +0 -1
- package/dist/code-block-DzHKRybS.js +0 -183
- package/dist/code-block-DzHKRybS.js.map +0 -1
- package/dist/combobox-BFnbJJp3.js.map +0 -1
- package/dist/combobox-hozNwUcc.js +0 -847
- package/dist/combobox-hozNwUcc.js.map +0 -1
- package/dist/command-BnmSchli.js.map +0 -1
- package/dist/comments-u5L0OGip.js.map +0 -1
- package/dist/containers-DqB-bSYE.js.map +0 -1
- package/dist/data-display-Bihs9Ven.js +0 -1342
- package/dist/data-display-Bihs9Ven.js.map +0 -1
- package/dist/date-DOKhJPu7.js +0 -140
- package/dist/date-DOKhJPu7.js.map +0 -1
- package/dist/date-picker-DzP5HQq7.js +0 -1541
- package/dist/date-picker-DzP5HQq7.js.map +0 -1
- package/dist/date-pickers-BpgGz7S-.js +0 -196
- package/dist/date-pickers-BpgGz7S-.js.map +0 -1
- package/dist/display-CS6Hbk18.js.map +0 -1
- package/dist/dropdown-menu-D-boNgGO.js.map +0 -1
- package/dist/feedback-CJkUAapr.js +0 -233
- package/dist/feedback-CJkUAapr.js.map +0 -1
- package/dist/field-affordance-recipes-uKY4MsZ_.js +0 -25
- package/dist/field-affordance-recipes-uKY4MsZ_.js.map +0 -1
- package/dist/field-state-recipes-DQQpiLWC.js +0 -11
- package/dist/field-state-recipes-DQQpiLWC.js.map +0 -1
- package/dist/filters-D6FF8L6s.js.map +0 -1
- package/dist/form-sizing-QP8aIRaW.js +0 -103
- package/dist/form-sizing-QP8aIRaW.js.map +0 -1
- package/dist/format-iamDSqs2.js +0 -110
- package/dist/format-iamDSqs2.js.map +0 -1
- package/dist/forms-B5NCbkSC.js.map +0 -1
- package/dist/forms-numeric-Crrm80Lm.js +0 -867
- package/dist/forms-numeric-Crrm80Lm.js.map +0 -1
- package/dist/header-kxruN3RM.js.map +0 -1
- package/dist/icon-badge-Btc6pQrp.js +0 -53
- package/dist/icon-badge-Btc6pQrp.js.map +0 -1
- package/dist/input-SX9V0AL3.js +0 -255
- package/dist/input-SX9V0AL3.js.map +0 -1
- package/dist/item-DE4YnuJx.js +0 -258
- package/dist/item-DE4YnuJx.js.map +0 -1
- package/dist/media-gallery-DLp3HAz0.js +0 -201
- package/dist/media-gallery-DLp3HAz0.js.map +0 -1
- package/dist/mentions-Cl0Kt_Pd.js +0 -565
- package/dist/mentions-Cl0Kt_Pd.js.map +0 -1
- package/dist/navigation-DnQSNMT0.js +0 -276
- package/dist/navigation-DnQSNMT0.js.map +0 -1
- package/dist/navigation-DyytsLRB.js +0 -265
- package/dist/navigation-DyytsLRB.js.map +0 -1
- package/dist/number-DasMFWEG.js +0 -269
- package/dist/number-DasMFWEG.js.map +0 -1
- package/dist/overlay.recipes-BxW5FIfK.js +0 -6
- package/dist/overlay.recipes-BxW5FIfK.js.map +0 -1
- package/dist/overlays-DUbs1KEi.js +0 -1011
- package/dist/overlays-DUbs1KEi.js.map +0 -1
- package/dist/page-hGmT4nWK.js.map +0 -1
- package/dist/page-header-D8nERkn5.js +0 -112
- package/dist/page-header-D8nERkn5.js.map +0 -1
- package/dist/popover-CghIYdQf.js.map +0 -1
- package/dist/primitives-C7ff0QaI.js +0 -337
- package/dist/primitives-C7ff0QaI.js.map +0 -1
- package/dist/progress-BroqrAyV.js.map +0 -1
- package/dist/rich-text-DlxDOtf4.js +0 -32
- package/dist/rich-text-DlxDOtf4.js.map +0 -1
- package/dist/rich-text-editor-BKyG7rWz.js +0 -574
- package/dist/rich-text-editor-BKyG7rWz.js.map +0 -1
- package/dist/rich-text-editor.recipes-B72Nfuze.js +0 -81
- package/dist/rich-text-editor.recipes-B72Nfuze.js.map +0 -1
- package/dist/rich-text-editor.strings-BpnIQgMl.js +0 -25
- package/dist/rich-text-editor.strings-BpnIQgMl.js.map +0 -1
- package/dist/sanitize-html-BG9FGe-j.js +0 -64
- package/dist/sanitize-html-BG9FGe-j.js.map +0 -1
- package/dist/scroll-area-D-pIhEKl.js +0 -47
- package/dist/scroll-area-D-pIhEKl.js.map +0 -1
- package/dist/separator-BNIgG3au.js.map +0 -1
- package/dist/settings-DOTOzeZ2.js +0 -161
- package/dist/settings-DOTOzeZ2.js.map +0 -1
- package/dist/sheet-BFhrNehm.js +0 -205
- package/dist/sheet-BFhrNehm.js.map +0 -1
- package/dist/sidebar-CyR4XKwR.js.map +0 -1
- package/dist/sidebar-SvGJ0Zwi.js +0 -506
- package/dist/sidebar-SvGJ0Zwi.js.map +0 -1
- package/dist/skeleton-3F0uhYn3.js.map +0 -1
- package/dist/smart-card-DjGVV2xr.js +0 -584
- package/dist/smart-card-DjGVV2xr.js.map +0 -1
- package/dist/spinner-Cpf7oRkF.js.map +0 -1
- package/dist/structure.recipes-Bqhf9oIh.js.map +0 -1
- package/dist/surface-recipes-Dd__PD-w.js +0 -28
- package/dist/surface-recipes-Dd__PD-w.js.map +0 -1
- package/dist/table-CLtJTxoR.js +0 -147
- package/dist/table-CLtJTxoR.js.map +0 -1
- package/dist/table-CcRDZiLP.js.map +0 -1
- package/dist/tabs-BNgu7g0u.js +0 -188
- package/dist/tabs-BNgu7g0u.js.map +0 -1
- package/dist/text-inputs-DsR56TR-.js.map +0 -1
- package/dist/text.styles-Q4sGAIgA.js.map +0 -1
- package/dist/timelines-D1pkt3se.js.map +0 -1
- package/dist/track-recipes-LLPNVwFg.js +0 -10
- package/dist/track-recipes-LLPNVwFg.js.map +0 -1
- package/dist/tree-BtmYyMZV.js.map +0 -1
- package/dist/typography-BxQgiZyw.js +0 -96
- package/dist/typography-BxQgiZyw.js.map +0 -1
- package/dist/ui-provider-DRPn3qNl.js.map +0 -1
- package/dist/upload-CDbYw1WN.js.map +0 -1
- package/dist/upload-queue-CNd_hH_a.js.map +0 -1
- package/dist/use-file-drop-target-BX7GnhoQ.js +0 -39
- package/dist/use-file-drop-target-BX7GnhoQ.js.map +0 -1
- package/dist/utils-BvH9PSmq.js.map +0 -1
- package/dist/value-inputs-D0KCrfVC.js +0 -840
- package/dist/value-inputs-D0KCrfVC.js.map +0 -1
- package/dist/workspace-CcR8r-Nt.js +0 -395
- package/dist/workspace-CcR8r-Nt.js.map +0 -1
- /package/dist/components/{blocks/data-display/metadata → base/metadata-list}/metadata-list.strings.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signature-pad.js","names":["Text","Button","Stack","fieldStateRecipes","Input","FormField","defaultSignaturePadStrings","emptySignature","isSignatureEmpty","value","stroke","clamp","normalizeSignature","point","drawSignature","context","width","height","first","strokeWidth","i","a","b","escapeXml","text","character","signaturePadToSVG","signature","ink","index","SignaturePad","forwardRef","controlledValue","stringsProp","rootProps","props","controlled","internalValue","setInternalValue","useState","defaultValue","normalizedControlledValue","useMemo","valueRef","useRef","undoHistory","redoHistory","historyVersion","setHistoryVersion","live","drawing","setDrawing","canvasRef","fieldRef","typedRef","lastPublished","generatedId","useId","rootId","id","strings","useStrings","instructions","allowTypedSignature","locked","disabled","readOnly","inkWidth","paint","canvas","bounds","scale","cancelStroke","publish","normalized","next","history","onValueChange","version","undo","previous","redo","focus","useImperativeHandle","ref","snapshot","format","options","useEffect","redraw","resize","theme","ancestor","owner","active","resetTimer","reset","event","form","name","required","pointFrom","sample","finish","endpoint","last","empty","cn","className","invalid","samples","SignaturePadPreview","pointIndex"],"sources":["../../src/components/base/signature-pad/signature-pad.types.ts","../../src/components/base/signature-pad/signature-pad.utils.ts","../../src/components/base/signature-pad/signature-pad.tsx"],"sourcesContent":["import type { ComponentPropsWithoutRef } from 'react';\nimport type { StringsProp } from '../../../lib/strings';\n\n/** Coordinates are fractions of the drawing area, so signatures survive resize. */\nexport interface SignaturePadPoint { x: number; y: number; pressure: number }\nexport interface SignaturePadStroke { points: readonly SignaturePadPoint[] }\nexport interface SignaturePadValue {\n\tstrokes: readonly SignaturePadStroke[];\n\t/** Accessible alternative to drawing; included in exports and native form data. */\n\ttypedName?: string;\n}\nexport type SignaturePadFormat = 'png' | 'svg' | 'json';\nexport interface SignaturePadExportOptions { width?: number; height?: number; scale?: number }\nexport interface SignaturePadHandle {\n\tfocus: () => void;\n\tclear: () => void;\n\tundo: () => void;\n\tredo: () => void;\n\t/** PNG is a data URL, SVG is markup, JSON is the structured value. */\n\tserialize: (format?: SignaturePadFormat, options?: SignaturePadExportOptions) => string;\n}\nexport interface SignaturePadStrings {\n\tlabel: string; instructions: string; drawingInstructions: string; placeholder: string; typedName: string;\n\tundo: string; redo: string; clear: string; empty: string; signed: string;\n}\nexport const defaultSignaturePadStrings: SignaturePadStrings = {\n\tlabel: 'Signature', instructions: 'Draw with a pointer or type your name below. Escape cancels a stroke; Control or Command Z undoes it.',\n\tdrawingInstructions: 'Draw with a pointer. Escape cancels a stroke; Control or Command Z undoes it.',\n\tplaceholder: 'Sign here', typedName: 'Or type your full name',\n\tundo: 'Undo', redo: 'Redo', clear: 'Clear signature', empty: 'Signature is empty', signed: 'Signature entered',\n};\nexport interface SignaturePadProps extends Omit<ComponentPropsWithoutRef<'div'>, 'children' | 'defaultValue' | 'onChange'> {\n\t/** Controlled structured signature. */\n\tvalue?: SignaturePadValue;\n\t/** Initial structured signature for uncontrolled use. */\n\tdefaultValue?: SignaturePadValue;\n\tonValueChange?: (value: SignaturePadValue) => void;\n\tdisabled?: boolean;\n\treadOnly?: boolean;\n\tinvalid?: boolean;\n\t/** Native field serializes JSON; an empty signature fails required validation. */\n\tname?: string;\n\tform?: string;\n\trequired?: boolean;\n\t/** Shows the keyboard-accessible typed signature alternative. @default true */\n\tallowTypedSignature?: boolean;\n\t/** Ink diameter in CSS drawing pixels; pen pressure varies it. @default 2 */\n\tstrokeWidth?: number;\n\tstrings?: StringsProp<SignaturePadStrings>;\n}\nexport interface SignaturePadPreviewProps extends ComponentPropsWithoutRef<'svg'> {\n\tvalue: SignaturePadValue;\n\tstrokeWidth?: number;\n}\n","import type { SignaturePadValue } from './signature-pad.types';\n\nexport const emptySignature: SignaturePadValue = { strokes: [] };\nexport function isSignatureEmpty(value: SignaturePadValue): boolean {\n\treturn !value.typedName?.trim() && !value.strokes.some((stroke) => stroke.points.length > 0);\n}\nconst clamp = (value: number) => Number.isFinite(value) ? Math.min(1, Math.max(0, value)) : 0;\nexport function normalizeSignature(value: SignaturePadValue): SignaturePadValue {\n\treturn {\n\t\tstrokes: value.strokes.filter((stroke) => stroke.points.length > 0).map((stroke) => ({\n\t\t\tpoints: stroke.points.map((point) => ({ x: clamp(point.x), y: clamp(point.y), pressure: clamp(point.pressure) })),\n\t\t})),\n\t\t...(value.typedName !== undefined ? { typedName: value.typedName } : {}),\n\t};\n}\n\n/** Drawing geometry, separate from structural UI spacing and theme tokens. */\nexport function drawSignature(context: CanvasRenderingContext2D, value: SignaturePadValue, width: number, height: number, strokeWidth: number) {\n\tcontext.clearRect(0, 0, width, height);\n\tcontext.lineCap = 'round';\n\tcontext.lineJoin = 'round';\n\tfor (const stroke of value.strokes) {\n\t\tconst first = stroke.points[0];\n\t\tif (!first) continue;\n\t\tif (stroke.points.length === 1) {\n\t\t\tcontext.beginPath();\n\t\t\tcontext.arc(first.x * width, first.y * height, strokeWidth * (0.5 + first.pressure) / 2, 0, Math.PI * 2);\n\t\t\tcontext.fill();\n\t\t}\n\t\tfor (let i = 1; i < stroke.points.length; i++) {\n\t\t\tconst a = stroke.points[i - 1]; const b = stroke.points[i];\n\t\t\tcontext.lineWidth = strokeWidth * (0.5 + (a.pressure + b.pressure) / 2);\n\t\t\tcontext.beginPath(); context.moveTo(a.x * width, a.y * height); context.lineTo(b.x * width, b.y * height); context.stroke();\n\t\t}\n\t}\n\tif (value.typedName) {\n\t\tcontext.font = `${Math.max(12, height / 5)}px cursive`;\n\t\tcontext.textBaseline = 'bottom';\n\t\tcontext.fillText(value.typedName, width * 0.04, height * 0.9, width * 0.92);\n\t}\n}\n\nconst escapeXml = (text: string) => text.replace(/[&<>\"']/g, (character) => ({ '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''' })[character]!);\n/** Semantic currentColor is preserved unless a resolved export ink is supplied. */\nexport function signaturePadToSVG(value: SignaturePadValue, width = 600, height = 200, strokeWidth = 2, ink = 'currentColor'): string {\n\tconst signature = normalizeSignature(value);\n\tconst shapes = signature.strokes.map((stroke) => {\n\t\tconst first = stroke.points[0];\n\t\tif (stroke.points.length === 1) return `<circle cx=\"${first.x * width}\" cy=\"${first.y * height}\" r=\"${strokeWidth * (0.5 + first.pressure) / 2}\" fill=\"${escapeXml(ink)}\"/>`;\n\t\treturn stroke.points.slice(1).map((point, index) => {\n\t\t\tconst a = stroke.points[index];\n\t\t\treturn `<path d=\"M${a.x * width} ${a.y * height}L${point.x * width} ${point.y * height}\" fill=\"none\" stroke=\"${escapeXml(ink)}\" stroke-width=\"${strokeWidth * (0.5 + (a.pressure + point.pressure) / 2)}\" stroke-linecap=\"round\"/>`;\n\t\t}).join('');\n\t}).join('');\n\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ${width} ${height}\" width=\"${width}\" height=\"${height}\">${shapes}${signature.typedName ? `<text x=\"${width * 0.04}\" y=\"${height * 0.9}\" textLength=\"${Math.min(width * 0.92, signature.typedName.length * height * 0.1)}\" font-family=\"cursive\" font-size=\"${Math.max(12, height / 5)}\" fill=\"${escapeXml(ink)}\">${escapeXml(signature.typedName)}</text>` : ''}</svg>`;\n}\n","import { forwardRef, useEffect, useLayoutEffect, useId, useImperativeHandle, useMemo, useRef, useState, type PointerEvent } from 'react';\nimport { Button } from '../buttons';\nimport { FormField } from '../forms/form-field';\nimport { Input } from '../text-inputs';\nimport { Stack } from '../structure';\nimport { Text } from '../../typography';\nimport { cn } from '../../../lib/utils';\nimport { useStrings } from '../../../lib/strings';\nimport { fieldStateRecipes } from '../../../lib/field-state-recipes';\nimport { defaultSignaturePadStrings, type SignaturePadHandle, type SignaturePadPoint, type SignaturePadProps, type SignaturePadPreviewProps, type SignaturePadValue } from './signature-pad.types';\nimport { drawSignature, emptySignature, isSignatureEmpty, normalizeSignature, signaturePadToSVG } from './signature-pad.utils';\n\nexport const SignaturePad = forwardRef<SignaturePadHandle, SignaturePadProps>(function SignaturePad(props, ref) {\n\tconst { value: controlledValue, defaultValue = emptySignature, onValueChange, disabled = false, readOnly = false, invalid,\n\t\tname, form, required, allowTypedSignature = true, strokeWidth = 2, strings: stringsProp, className, id, ...rootProps } = props;\n\tconst controlled = Object.prototype.hasOwnProperty.call(props, 'value');\n\tconst [internalValue, setInternalValue] = useState(() => normalizeSignature(defaultValue));\n\tconst normalizedControlledValue = useMemo(() => normalizeSignature(controlledValue ?? emptySignature), [controlledValue]);\n\tconst value = controlled ? normalizedControlledValue : internalValue;\n\tconst valueRef = useRef(value);\n\tuseLayoutEffect(() => { valueRef.current = value; }, [value]);\n\tconst undoHistory = useRef<SignaturePadValue[]>([]);\n\tconst redoHistory = useRef<SignaturePadValue[]>([]);\n\tconst [historyVersion, setHistoryVersion] = useState(0);\n\tconst live = useRef<{ pointerId: number; points: SignaturePadPoint[]; initial: SignaturePadValue } | null>(null);\n\tconst [drawing, setDrawing] = useState(false);\n\tconst canvasRef = useRef<HTMLCanvasElement>(null);\n\tconst fieldRef = useRef<HTMLInputElement>(null);\n\tconst typedRef = useRef<HTMLInputElement>(null);\n\tconst lastPublished = useRef<SignaturePadValue | null>(null);\n\tconst generatedId = useId();\n\tconst rootId = id ?? `signature-${generatedId}`;\n\tconst strings = useStrings(defaultSignaturePadStrings, stringsProp);\n\tconst instructions = allowTypedSignature ? strings.instructions : stringsProp?.instructions ?? strings.drawingInstructions;\n\tconst locked = disabled || readOnly;\n\tconst inkWidth = Number.isFinite(strokeWidth) ? Math.max(0.25, strokeWidth) : 2;\n\n\tconst paint = (signature: SignaturePadValue) => {\n\t\tconst canvas = canvasRef.current;\n\t\tif (!canvas) return;\n\t\tconst bounds = canvas.getBoundingClientRect();\n\t\tif (!bounds.width || !bounds.height) return;\n\t\tconst scale = window.devicePixelRatio || 1;\n\t\tif (canvas.width !== Math.round(bounds.width * scale)) canvas.width = Math.round(bounds.width * scale);\n\t\tif (canvas.height !== Math.round(bounds.height * scale)) canvas.height = Math.round(bounds.height * scale);\n\t\tconst context = canvas.getContext('2d');\n\t\tif (!context) return;\n\t\tcontext.setTransform(scale, 0, 0, scale, 0, 0);\n\t\tcontext.strokeStyle = context.fillStyle = getComputedStyle(canvas).color;\n\t\tdrawSignature(context, normalizeSignature(signature), bounds.width, bounds.height, inkWidth);\n\t};\n\tconst cancelStroke = () => {\n\t\tconst stroke = live.current;\n\t\tlive.current = null;\n\t\tsetDrawing(false);\n\t\tif (stroke && canvasRef.current?.hasPointerCapture?.(stroke.pointerId)) canvasRef.current.releasePointerCapture(stroke.pointerId);\n\t\tpaint(valueRef.current);\n\t};\n\tconst publish = (next: SignaturePadValue, history = true) => {\n\t\tif (locked) return;\n\t\tcancelStroke();\n\t\tconst normalized = normalizeSignature(next);\n\t\tif (history) { undoHistory.current.push(valueRef.current); redoHistory.current = []; }\n\t\tlastPublished.current = normalized;\n\t\tif (!controlled) { valueRef.current = normalized; setInternalValue(normalized); }\n\t\tonValueChange?.(normalized);\n\t\tsetHistoryVersion((version) => version + 1);\n\t};\n\tconst undo = () => {\n\t\tif (locked || !undoHistory.current.length) return;\n\t\tconst previous = undoHistory.current.pop()!;\n\t\tredoHistory.current.push(valueRef.current); publish(previous, false);\n\t};\n\tconst redo = () => {\n\t\tif (locked || !redoHistory.current.length) return;\n\t\tconst next = redoHistory.current.pop()!;\n\t\tundoHistory.current.push(valueRef.current); publish(next, false);\n\t};\n\tconst focus = () => (allowTypedSignature ? typedRef.current : canvasRef.current)?.focus();\n\tuseImperativeHandle(ref, () => ({ focus, undo, redo, clear: () => publish(emptySignature), serialize: (format = 'png', options = {}) => {\n\t\tconst snapshot = normalizeSignature(valueRef.current);\n\t\tif (format === 'json') return JSON.stringify(snapshot);\n\t\tconst bounds = canvasRef.current?.getBoundingClientRect();\n\t\tconst width = Number.isFinite(options.width) ? Math.max(1, options.width!) : bounds?.width || 600;\n\t\tconst height = Number.isFinite(options.height) ? Math.max(1, options.height!) : bounds?.height || 200;\n\t\tconst ink = canvasRef.current ? getComputedStyle(canvasRef.current).color : 'currentColor';\n\t\tif (format === 'svg') return signaturePadToSVG(snapshot, width, height, inkWidth, ink);\n\t\tconst scale = Number.isFinite(options.scale) ? Math.max(0.1, Math.min(8, options.scale!)) : window.devicePixelRatio || 1;\n\t\tconst canvas = document.createElement('canvas'); canvas.width = Math.round(width * scale); canvas.height = Math.round(height * scale);\n\t\tconst context = canvas.getContext('2d');\n\t\tif (!context) throw new Error('Canvas export is unavailable in this environment. Use SVG or JSON.');\n\t\tcontext.scale(scale, scale); context.strokeStyle = context.fillStyle = ink;\n\t\tdrawSignature(context, snapshot, width, height, inkWidth);\n\t\treturn canvas.toDataURL('image/png');\n\t} }));\n\n\tuseEffect(() => {\n\t\t// External replacement invalidates history; an acknowledged controlled edit retains it.\n\t\tif (controlled && JSON.stringify(value) !== JSON.stringify(lastPublished.current)) { undoHistory.current = []; redoHistory.current = []; setHistoryVersion((version) => version + 1); }\n\t\tlastPublished.current = value;\n\t\tcancelStroke();\n\t}, [value, disabled, readOnly]);\n\tuseEffect(() => {\n\t\tconst canvas = canvasRef.current;\n\t\tif (!canvas) return;\n\t\tconst redraw = () => paint(live.current ? { ...live.current.initial, strokes: [...live.current.initial.strokes, { points: live.current.points }] } : valueRef.current);\n\t\tredraw();\n\t\tconst resize = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(redraw) : undefined;\n\t\tresize?.observe(canvas);\n\t\t// Theme scopes can change without resizing the drawing area.\n\t\tconst theme = new MutationObserver(redraw);\n\t\tfor (let ancestor: HTMLElement | null = canvas; ancestor; ancestor = ancestor.parentElement) theme.observe(ancestor, { attributes: true, attributeFilter: ['class', 'style', 'data-theme'] });\n\t\twindow.addEventListener('resize', redraw);\n\t\treturn () => { resize?.disconnect(); theme.disconnect(); window.removeEventListener('resize', redraw); };\n\t}, [inkWidth]);\n\tuseEffect(() => {\n\t\tconst owner = fieldRef.current?.form ?? typedRef.current?.form ?? canvasRef.current?.closest('form');\n\t\tlet active = true;\n\t\tlet resetTimer: ReturnType<typeof setTimeout> | undefined;\n\t\t// Trusted events can run microtasks between listeners. Wait for propagation and the native default action.\n\t\tconst reset = (event: Event) => {\n\t\t\tclearTimeout(resetTimer);\n\t\t\tresetTimer = setTimeout(() => { resetTimer = undefined; if (active && !event.defaultPrevented && !locked) { undoHistory.current = []; redoHistory.current = []; publish(defaultValue, false); } }, 0);\n\t\t};\n\t\towner?.addEventListener('reset', reset);\n\t\treturn () => { active = false; clearTimeout(resetTimer); owner?.removeEventListener('reset', reset); };\n\t}, [defaultValue, controlled, locked, onValueChange, form, name, required, allowTypedSignature]);\n\tconst pointFrom = (event: PointerEvent<HTMLCanvasElement>, sample: Pick<globalThis.PointerEvent, 'clientX' | 'clientY' | 'pressure'> = event): SignaturePadPoint => {\n\t\tconst bounds = event.currentTarget.getBoundingClientRect();\n\t\treturn { x: Math.max(0, Math.min(1, (sample.clientX - bounds.left) / (bounds.width || 1))), y: Math.max(0, Math.min(1, (sample.clientY - bounds.top) / (bounds.height || 1))), pressure: event.pointerType === 'pen' ? sample.pressure || 0.5 : 0.5 };\n\t};\n\tconst finish = (event: PointerEvent<HTMLCanvasElement>) => {\n\t\tconst stroke = live.current;\n\t\tif (!stroke || stroke.pointerId !== event.pointerId) return;\n\t\t// A lift can arrive beyond the last move; keep that endpoint without duplicating a resting tap.\n\t\tconst endpoint = pointFrom(event);\n\t\tconst last = stroke.points[stroke.points.length - 1];\n\t\tif (last.x !== endpoint.x || last.y !== endpoint.y) stroke.points.push(endpoint);\n\t\tlive.current = null;\n\t\tsetDrawing(false);\n\t\tif (valueRef.current === stroke.initial) publish({ ...stroke.initial, strokes: [...stroke.initial.strokes, { points: stroke.points }] });\n\t};\n\tconst empty = isSignatureEmpty(value);\n\treturn <Stack {...rootProps} id={rootId} role=\"group\" aria-label={rootProps['aria-label'] ?? strings.label} gap=\"sm\" className={cn('signature-pad--component min-w-0', className)} data-history-version={historyVersion} data-disabled={disabled || undefined} data-readonly={readOnly || undefined}>\n\t\t<Text id={`${rootId}-instructions`} size=\"xs\" type=\"secondary\">{instructions}</Text>\n\t\t<div className={cn('signature-pad--area relative overflow-hidden rounded-inner border border-input bg-background text-foreground', fieldStateRecipes.invalid, disabled && 'cursor-not-allowed opacity-50')} aria-invalid={invalid || undefined}>\n\t\t\t<canvas ref={canvasRef} className={cn('signature-pad--canvas block w-full aspect-[3/1] min-h-40 outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset', !locked && 'touch-none cursor-crosshair')}\n\t\t\t\ttabIndex={disabled ? -1 : 0} role=\"img\" aria-label={strings.label} aria-describedby={`${rootId}-instructions ${rootId}-status`} aria-disabled={disabled || undefined} aria-invalid={invalid || undefined}\n\t\t\t\tonPointerDown={(event) => { if (locked || live.current || event.button !== 0) return; event.preventDefault(); event.currentTarget.focus(); event.currentTarget.setPointerCapture?.(event.pointerId); live.current = { pointerId: event.pointerId, points: [pointFrom(event)], initial: valueRef.current }; setDrawing(true); paint({ ...valueRef.current, strokes: [...valueRef.current.strokes, { points: live.current.points }] }); }}\n\t\t\t\tonPointerMove={(event) => {\n\t\t\t\t\tconst stroke = live.current;\n\t\t\t\t\tif (!stroke || stroke.pointerId !== event.pointerId) return;\n\t\t\t\t\tconst samples = event.nativeEvent.getCoalescedEvents?.().filter((sample) => sample.pointerId === stroke.pointerId) ?? [];\n\t\t\t\t\tfor (const sample of samples.length ? samples : [event.nativeEvent]) stroke.points.push(pointFrom(event, sample));\n\t\t\t\t\tpaint({ ...stroke.initial, strokes: [...stroke.initial.strokes, { points: stroke.points }] });\n\t\t\t\t}}\n\t\t\t\tonPointerUp={finish} onPointerCancel={(event) => { if (live.current?.pointerId === event.pointerId) cancelStroke(); }} onLostPointerCapture={(event) => { if (live.current?.pointerId === event.pointerId) cancelStroke(); }}\n\t\t\t\tonContextMenu={(event) => { if (live.current) event.preventDefault(); }}\n\t\t\t\tonKeyDown={(event) => { if (event.key === 'Escape') cancelStroke(); if (locked) return; if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'z') { event.preventDefault(); if (event.shiftKey) redo(); else undo(); } if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'y') { event.preventDefault(); redo(); } }}>\n\t\t\t\t{instructions}\n\t\t\t</canvas>\n\t\t\t{empty && !drawing && <div aria-hidden=\"true\" className=\"signature-pad--placeholder pointer-events-none absolute inset-0 flex items-center justify-center\"><Text type=\"secondary\">{strings.placeholder}</Text></div>}\n\t\t</div>\n\t\t{allowTypedSignature && <FormField label={strings.typedName} htmlFor={`${rootId}-typed`}><Input ref={typedRef} id={`${rootId}-typed`} value={value.typedName ?? ''} disabled={disabled} readOnly={readOnly} invalid={invalid} onChange={(event) => publish({ ...valueRef.current, typedName: event.target.value })} /></FormField>}\n\t\t<Stack direction=\"horizontal\" gap=\"xs\" wrap>\n\t\t\t<Button type=\"button\" buttonStyle=\"outline\" disabled={locked || !undoHistory.current.length} onClick={() => { undo(); focus(); }}>{strings.undo}</Button>\n\t\t\t<Button type=\"button\" buttonStyle=\"outline\" disabled={locked || !redoHistory.current.length} onClick={() => { redo(); focus(); }}>{strings.redo}</Button>\n\t\t\t<Button type=\"button\" buttonStyle=\"outline\" disabled={locked || empty} onClick={() => { publish(emptySignature); focus(); }}>{strings.clear}</Button>\n\t\t</Stack>\n\t\t<Text id={`${rootId}-status`} role=\"status\" size=\"xs\" type=\"secondary\">{empty ? strings.empty : strings.signed}</Text>\n\t\t{(name || required) && <input ref={fieldRef} className=\"sr-only\" type=\"text\" tabIndex={-1} aria-hidden=\"true\" name={name} form={form} disabled={disabled} readOnly={readOnly} required={required} value={empty ? '' : JSON.stringify(value)} onChange={() => {}} onFocus={focus} onInvalid={focus} />}\n\t</Stack>;\n});\n\n/** Server-renderable preview; normalized geometry follows the semantic foreground. */\nexport const SignaturePadPreview = forwardRef<SVGSVGElement, SignaturePadPreviewProps>(function SignaturePadPreview({ value, strokeWidth = 2, className, ...props }, ref) {\n\tconst normalized = normalizeSignature(value);\n\treturn <svg ref={ref} role=\"img\" viewBox=\"0 0 600 200\" aria-label=\"Signature\" {...props} className={cn('signature-pad-preview--component w-full h-auto text-foreground', className)}>\n\t\t{normalized.strokes.map((stroke, index) => stroke.points.length === 1 ? <circle key={index} cx={stroke.points[0].x * 600} cy={stroke.points[0].y * 200} r={strokeWidth * (0.5 + stroke.points[0].pressure) / 2} fill=\"currentColor\" /> : <g key={index}>{stroke.points.slice(1).map((point, pointIndex) => { const a = stroke.points[pointIndex]; return <path key={pointIndex} d={`M${a.x * 600} ${a.y * 200}L${point.x * 600} ${point.y * 200}`} fill=\"none\" stroke=\"currentColor\" strokeWidth={strokeWidth * (0.5 + (a.pressure + point.pressure) / 2)} strokeLinecap=\"round\" />; })}</g>)}\n\t\t{normalized.typedName && <text x=\"24\" y=\"180\" fill=\"currentColor\" fontFamily=\"cursive\" fontSize=\"40\" textLength={Math.min(552, normalized.typedName.length * 20)}>{normalized.typedName}</text>}\n\t</svg>;\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"signature-pad.js","names":["Text","Stack","fieldStateRecipes","Input","FormField","defaultSignaturePadStrings","emptySignature","isSignatureEmpty","value","stroke","clamp","normalizeSignature","point","signatureFallbackFont","drawSignature","context","width","height","first","strokeWidth","i","a","b","maxWidth","fontSize","fontFamily","measured","escapeXml","text","character","signaturePadToSVG","signature","ink","index","SignaturePad","forwardRef","controlledValue","stringsProp","rootProps","props","controlled","internalValue","setInternalValue","useState","defaultValue","normalizedControlledValue","useMemo","valueRef","useRef","undoHistory","redoHistory","historyVersion","setHistoryVersion","live","drawing","setDrawing","canvasRef","fieldRef","typedRef","lastPublished","generatedId","useId","rootId","id","strings","useStrings","instructions","allowTypedSignature","locked","disabled","readOnly","inkWidth","paint","canvas","bounds","scale","style","cancelStroke","publish","normalized","next","history","onValueChange","version","undo","previous","redo","focus","useImperativeHandle","ref","snapshot","format","options","useEffect","redraw","resize","theme","ancestor","fonts","owner","active","resetTimer","reset","event","form","name","required","pointFrom","sample","finish","endpoint","last","empty","cn","className","invalid","samples","Button","SignaturePadPreview","pointIndex"],"sources":["../../src/components/base/signature-pad/signature-pad.types.ts","../../src/components/base/signature-pad/signature-pad.utils.ts","../../src/components/base/signature-pad/signature-pad.tsx"],"sourcesContent":["import type { ComponentPropsWithoutRef } from 'react';\nimport type { StringsProp } from '../../../lib/strings';\n\n/** Coordinates are fractions of the drawing area, so signatures survive resize. */\nexport interface SignaturePadPoint { x: number; y: number; pressure: number }\nexport interface SignaturePadStroke { points: readonly SignaturePadPoint[] }\nexport interface SignaturePadValue {\n\tstrokes: readonly SignaturePadStroke[];\n\t/** Accessible alternative to drawing; included in exports and native form data. */\n\ttypedName?: string;\n}\nexport type SignaturePadFormat = 'png' | 'svg' | 'json';\nexport interface SignaturePadExportOptions { width?: number; height?: number; scale?: number }\nexport interface SignaturePadHandle {\n\tfocus: () => void;\n\tclear: () => void;\n\tundo: () => void;\n\tredo: () => void;\n\t/** PNG is a data URL, SVG is markup, JSON is the structured value. */\n\tserialize: (format?: SignaturePadFormat, options?: SignaturePadExportOptions) => string;\n}\nexport interface SignaturePadStrings {\n\tlabel: string; instructions: string; drawingInstructions: string; placeholder: string; typedName: string;\n\tundo: string; redo: string; clear: string; empty: string; signed: string;\n}\nexport const defaultSignaturePadStrings: SignaturePadStrings = {\n\tlabel: 'Signature', instructions: 'Draw with a pointer or type your name below. Escape cancels a stroke; Control or Command Z undoes it.',\n\tdrawingInstructions: 'Draw with a pointer. Escape cancels a stroke; Control or Command Z undoes it.',\n\tplaceholder: 'Sign here', typedName: 'Or type your full name',\n\tundo: 'Undo', redo: 'Redo', clear: 'Clear signature', empty: 'Signature is empty', signed: 'Signature entered',\n};\nexport interface SignaturePadProps extends Omit<ComponentPropsWithoutRef<'div'>, 'children' | 'defaultValue' | 'onChange'> {\n\t/** Controlled structured signature. */\n\tvalue?: SignaturePadValue;\n\t/** Initial structured signature for uncontrolled use. */\n\tdefaultValue?: SignaturePadValue;\n\tonValueChange?: (value: SignaturePadValue) => void;\n\tdisabled?: boolean;\n\treadOnly?: boolean;\n\tinvalid?: boolean;\n\t/** Native field serializes JSON; an empty signature fails required validation. */\n\tname?: string;\n\tform?: string;\n\trequired?: boolean;\n\t/**\n\t * Shows the keyboard-accessible typed signature alternative. The typed name is\n\t * drawn and exported in the pad's font family: the theme sans unless a font is\n\t * set on the pad through `className` or `style`. @default true\n\t */\n\tallowTypedSignature?: boolean;\n\t/** Ink diameter in CSS drawing pixels; pen pressure varies it. @default 2 */\n\tstrokeWidth?: number;\n\tstrings?: StringsProp<SignaturePadStrings>;\n}\nexport interface SignaturePadPreviewProps extends ComponentPropsWithoutRef<'svg'> {\n\tvalue: SignaturePadValue;\n\tstrokeWidth?: number;\n}\n","import type { SignaturePadValue } from './signature-pad.types';\n\nexport const emptySignature: SignaturePadValue = { strokes: [] };\nexport function isSignatureEmpty(value: SignaturePadValue): boolean {\n\treturn !value.typedName?.trim() && !value.strokes.some((stroke) => stroke.points.length > 0);\n}\nconst clamp = (value: number) => Number.isFinite(value) ? Math.min(1, Math.max(0, value)) : 0;\nexport function normalizeSignature(value: SignaturePadValue): SignaturePadValue {\n\treturn {\n\t\tstrokes: value.strokes.filter((stroke) => stroke.points.length > 0).map((stroke) => ({\n\t\t\tpoints: stroke.points.map((point) => ({ x: clamp(point.x), y: clamp(point.y), pressure: clamp(point.pressure) })),\n\t\t})),\n\t\t...(value.typedName !== undefined ? { typedName: value.typedName } : {}),\n\t};\n}\n\n/**\n * A typed name is drawn in the field's own font family: the theme sans unless the\n * consumer sets a font on the pad. This fallback applies only outside the DOM.\n */\nexport const signatureFallbackFont = 'sans-serif';\n\n/** Drawing geometry, separate from structural UI spacing and theme tokens. */\nexport function drawSignature(context: CanvasRenderingContext2D, value: SignaturePadValue, width: number, height: number, strokeWidth: number, fontFamily = signatureFallbackFont) {\n\tcontext.clearRect(0, 0, width, height);\n\tcontext.lineCap = 'round';\n\tcontext.lineJoin = 'round';\n\tfor (const stroke of value.strokes) {\n\t\tconst first = stroke.points[0];\n\t\tif (!first) continue;\n\t\tif (stroke.points.length === 1) {\n\t\t\tcontext.beginPath();\n\t\t\tcontext.arc(first.x * width, first.y * height, strokeWidth * (0.5 + first.pressure) / 2, 0, Math.PI * 2);\n\t\t\tcontext.fill();\n\t\t}\n\t\tfor (let i = 1; i < stroke.points.length; i++) {\n\t\t\tconst a = stroke.points[i - 1]; const b = stroke.points[i];\n\t\t\tcontext.lineWidth = strokeWidth * (0.5 + (a.pressure + b.pressure) / 2);\n\t\t\tcontext.beginPath(); context.moveTo(a.x * width, a.y * height); context.lineTo(b.x * width, b.y * height); context.stroke();\n\t\t}\n\t}\n\tif (value.typedName) {\n\t\t// A long name steps the font down to fit before the canvas narrows its glyphs.\n\t\tconst maxWidth = width * 0.92;\n\t\tlet fontSize = Math.max(12, height / 5);\n\t\tcontext.font = `${fontSize}px ${fontFamily}`;\n\t\tconst measured = context.measureText?.(value.typedName).width ?? 0;\n\t\tif (measured > maxWidth) {\n\t\t\tfontSize = Math.max(12, fontSize * maxWidth / measured);\n\t\t\tcontext.font = `${fontSize}px ${fontFamily}`;\n\t\t}\n\t\tcontext.textBaseline = 'bottom';\n\t\tcontext.fillText(value.typedName, width * 0.04, height * 0.9, maxWidth);\n\t}\n}\n\nconst escapeXml = (text: string) => text.replace(/[&<>\"']/g, (character) => ({ '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''' })[character]!);\n/**\n * Semantic currentColor is preserved unless a resolved export ink is supplied. The\n * typed name uses `fontFamily`, which SignaturePad resolves from its rendered font.\n */\nexport function signaturePadToSVG(value: SignaturePadValue, width = 600, height = 200, strokeWidth = 2, ink = 'currentColor', fontFamily = signatureFallbackFont): string {\n\tconst signature = normalizeSignature(value);\n\tconst shapes = signature.strokes.map((stroke) => {\n\t\tconst first = stroke.points[0];\n\t\tif (stroke.points.length === 1) return `<circle cx=\"${first.x * width}\" cy=\"${first.y * height}\" r=\"${strokeWidth * (0.5 + first.pressure) / 2}\" fill=\"${escapeXml(ink)}\"/>`;\n\t\treturn stroke.points.slice(1).map((point, index) => {\n\t\t\tconst a = stroke.points[index];\n\t\t\treturn `<path d=\"M${a.x * width} ${a.y * height}L${point.x * width} ${point.y * height}\" fill=\"none\" stroke=\"${escapeXml(ink)}\" stroke-width=\"${strokeWidth * (0.5 + (a.pressure + point.pressure) / 2)}\" stroke-linecap=\"round\"/>`;\n\t\t}).join('');\n\t}).join('');\n\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ${width} ${height}\" width=\"${width}\" height=\"${height}\">${shapes}${signature.typedName ? `<text x=\"${width * 0.04}\" y=\"${height * 0.9}\" textLength=\"${Math.min(width * 0.92, signature.typedName.length * height * 0.1)}\" font-family=\"${escapeXml(fontFamily)}\" font-size=\"${Math.max(12, height / 5)}\" fill=\"${escapeXml(ink)}\">${escapeXml(signature.typedName)}</text>` : ''}</svg>`;\n}\n","import { forwardRef, useEffect, useLayoutEffect, useId, useImperativeHandle, useMemo, useRef, useState, type PointerEvent } from 'react';\nimport { Button } from '../buttons';\nimport { FormField } from '../forms/form-field';\nimport { Input } from '../text-inputs';\nimport { Stack } from '../structure';\nimport { Text } from '../../typography';\nimport { cn } from '../../../lib/utils';\nimport { useStrings } from '../../../lib/strings';\nimport { fieldStateRecipes } from '../../../lib/field-state-recipes';\nimport { defaultSignaturePadStrings, type SignaturePadHandle, type SignaturePadPoint, type SignaturePadProps, type SignaturePadPreviewProps, type SignaturePadValue } from './signature-pad.types';\nimport { drawSignature, emptySignature, isSignatureEmpty, normalizeSignature, signaturePadToSVG } from './signature-pad.utils';\n\nexport const SignaturePad = forwardRef<SignaturePadHandle, SignaturePadProps>(function SignaturePad(props, ref) {\n\tconst { value: controlledValue, defaultValue = emptySignature, onValueChange, disabled = false, readOnly = false, invalid,\n\t\tname, form, required, allowTypedSignature = true, strokeWidth = 2, strings: stringsProp, className, id, ...rootProps } = props;\n\tconst controlled = Object.prototype.hasOwnProperty.call(props, 'value');\n\tconst [internalValue, setInternalValue] = useState(() => normalizeSignature(defaultValue));\n\tconst normalizedControlledValue = useMemo(() => normalizeSignature(controlledValue ?? emptySignature), [controlledValue]);\n\tconst value = controlled ? normalizedControlledValue : internalValue;\n\tconst valueRef = useRef(value);\n\tuseLayoutEffect(() => { valueRef.current = value; }, [value]);\n\tconst undoHistory = useRef<SignaturePadValue[]>([]);\n\tconst redoHistory = useRef<SignaturePadValue[]>([]);\n\tconst [historyVersion, setHistoryVersion] = useState(0);\n\tconst live = useRef<{ pointerId: number; points: SignaturePadPoint[]; initial: SignaturePadValue } | null>(null);\n\tconst [drawing, setDrawing] = useState(false);\n\tconst canvasRef = useRef<HTMLCanvasElement>(null);\n\tconst fieldRef = useRef<HTMLInputElement>(null);\n\tconst typedRef = useRef<HTMLInputElement>(null);\n\tconst lastPublished = useRef<SignaturePadValue | null>(null);\n\tconst generatedId = useId();\n\tconst rootId = id ?? `signature-${generatedId}`;\n\tconst strings = useStrings(defaultSignaturePadStrings, stringsProp);\n\tconst instructions = allowTypedSignature ? strings.instructions : stringsProp?.instructions ?? strings.drawingInstructions;\n\tconst locked = disabled || readOnly;\n\tconst inkWidth = Number.isFinite(strokeWidth) ? Math.max(0.25, strokeWidth) : 2;\n\n\tconst paint = (signature: SignaturePadValue) => {\n\t\tconst canvas = canvasRef.current;\n\t\tif (!canvas) return;\n\t\tconst bounds = canvas.getBoundingClientRect();\n\t\tif (!bounds.width || !bounds.height) return;\n\t\tconst scale = window.devicePixelRatio || 1;\n\t\tif (canvas.width !== Math.round(bounds.width * scale)) canvas.width = Math.round(bounds.width * scale);\n\t\tif (canvas.height !== Math.round(bounds.height * scale)) canvas.height = Math.round(bounds.height * scale);\n\t\tconst context = canvas.getContext('2d');\n\t\tif (!context) return;\n\t\tcontext.setTransform(scale, 0, 0, scale, 0, 0);\n\t\tconst style = getComputedStyle(canvas);\n\t\tcontext.strokeStyle = context.fillStyle = style.color;\n\t\tdrawSignature(context, normalizeSignature(signature), bounds.width, bounds.height, inkWidth, style.fontFamily || undefined);\n\t};\n\tconst cancelStroke = () => {\n\t\tconst stroke = live.current;\n\t\tlive.current = null;\n\t\tsetDrawing(false);\n\t\tif (stroke && canvasRef.current?.hasPointerCapture?.(stroke.pointerId)) canvasRef.current.releasePointerCapture(stroke.pointerId);\n\t\tpaint(valueRef.current);\n\t};\n\tconst publish = (next: SignaturePadValue, history = true) => {\n\t\tif (locked) return;\n\t\tcancelStroke();\n\t\tconst normalized = normalizeSignature(next);\n\t\tif (history) { undoHistory.current.push(valueRef.current); redoHistory.current = []; }\n\t\tlastPublished.current = normalized;\n\t\tif (!controlled) { valueRef.current = normalized; setInternalValue(normalized); }\n\t\tonValueChange?.(normalized);\n\t\tsetHistoryVersion((version) => version + 1);\n\t};\n\tconst undo = () => {\n\t\tif (locked || !undoHistory.current.length) return;\n\t\tconst previous = undoHistory.current.pop()!;\n\t\tredoHistory.current.push(valueRef.current); publish(previous, false);\n\t};\n\tconst redo = () => {\n\t\tif (locked || !redoHistory.current.length) return;\n\t\tconst next = redoHistory.current.pop()!;\n\t\tundoHistory.current.push(valueRef.current); publish(next, false);\n\t};\n\tconst focus = () => (allowTypedSignature ? typedRef.current : canvasRef.current)?.focus();\n\tuseImperativeHandle(ref, () => ({ focus, undo, redo, clear: () => publish(emptySignature), serialize: (format = 'png', options = {}) => {\n\t\tconst snapshot = normalizeSignature(valueRef.current);\n\t\tif (format === 'json') return JSON.stringify(snapshot);\n\t\tconst bounds = canvasRef.current?.getBoundingClientRect();\n\t\tconst width = Number.isFinite(options.width) ? Math.max(1, options.width!) : bounds?.width || 600;\n\t\tconst height = Number.isFinite(options.height) ? Math.max(1, options.height!) : bounds?.height || 200;\n\t\tconst style = canvasRef.current ? getComputedStyle(canvasRef.current) : undefined;\n\t\tconst ink = style?.color || 'currentColor';\n\t\tconst fontFamily = style?.fontFamily || undefined;\n\t\tif (format === 'svg') return signaturePadToSVG(snapshot, width, height, inkWidth, ink, fontFamily);\n\t\tconst scale = Number.isFinite(options.scale) ? Math.max(0.1, Math.min(8, options.scale!)) : window.devicePixelRatio || 1;\n\t\tconst canvas = document.createElement('canvas'); canvas.width = Math.round(width * scale); canvas.height = Math.round(height * scale);\n\t\tconst context = canvas.getContext('2d');\n\t\tif (!context) throw new Error('Canvas export is unavailable in this environment. Use SVG or JSON.');\n\t\tcontext.scale(scale, scale); context.strokeStyle = context.fillStyle = ink;\n\t\tdrawSignature(context, snapshot, width, height, inkWidth, fontFamily);\n\t\treturn canvas.toDataURL('image/png');\n\t} }));\n\n\tuseEffect(() => {\n\t\t// External replacement invalidates history; an acknowledged controlled edit retains it.\n\t\tif (controlled && JSON.stringify(value) !== JSON.stringify(lastPublished.current)) { undoHistory.current = []; redoHistory.current = []; setHistoryVersion((version) => version + 1); }\n\t\tlastPublished.current = value;\n\t\tcancelStroke();\n\t}, [value, disabled, readOnly]);\n\tuseEffect(() => {\n\t\tconst canvas = canvasRef.current;\n\t\tif (!canvas) return;\n\t\tconst redraw = () => paint(live.current ? { ...live.current.initial, strokes: [...live.current.initial.strokes, { points: live.current.points }] } : valueRef.current);\n\t\tredraw();\n\t\tconst resize = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(redraw) : undefined;\n\t\tresize?.observe(canvas);\n\t\t// Theme scopes can change without resizing the drawing area.\n\t\tconst theme = new MutationObserver(redraw);\n\t\tfor (let ancestor: HTMLElement | null = canvas; ancestor; ancestor = ancestor.parentElement) theme.observe(ancestor, { attributes: true, attributeFilter: ['class', 'style', 'data-theme'] });\n\t\twindow.addEventListener('resize', redraw);\n\t\t// A typed name drawn before the theme font finished loading repaints in it.\n\t\tconst fonts = typeof document !== 'undefined' ? document.fonts : undefined;\n\t\tfonts?.addEventListener?.('loadingdone', redraw);\n\t\treturn () => { resize?.disconnect(); theme.disconnect(); window.removeEventListener('resize', redraw); fonts?.removeEventListener?.('loadingdone', redraw); };\n\t}, [inkWidth]);\n\tuseEffect(() => {\n\t\tconst owner = fieldRef.current?.form ?? typedRef.current?.form ?? canvasRef.current?.closest('form');\n\t\tlet active = true;\n\t\tlet resetTimer: ReturnType<typeof setTimeout> | undefined;\n\t\t// Trusted events can run microtasks between listeners. Wait for propagation and the native default action.\n\t\tconst reset = (event: Event) => {\n\t\t\tclearTimeout(resetTimer);\n\t\t\tresetTimer = setTimeout(() => { resetTimer = undefined; if (active && !event.defaultPrevented && !locked) { undoHistory.current = []; redoHistory.current = []; publish(defaultValue, false); } }, 0);\n\t\t};\n\t\towner?.addEventListener('reset', reset);\n\t\treturn () => { active = false; clearTimeout(resetTimer); owner?.removeEventListener('reset', reset); };\n\t}, [defaultValue, controlled, locked, onValueChange, form, name, required, allowTypedSignature]);\n\tconst pointFrom = (event: PointerEvent<HTMLCanvasElement>, sample: Pick<globalThis.PointerEvent, 'clientX' | 'clientY' | 'pressure'> = event): SignaturePadPoint => {\n\t\tconst bounds = event.currentTarget.getBoundingClientRect();\n\t\treturn { x: Math.max(0, Math.min(1, (sample.clientX - bounds.left) / (bounds.width || 1))), y: Math.max(0, Math.min(1, (sample.clientY - bounds.top) / (bounds.height || 1))), pressure: event.pointerType === 'pen' ? sample.pressure || 0.5 : 0.5 };\n\t};\n\tconst finish = (event: PointerEvent<HTMLCanvasElement>) => {\n\t\tconst stroke = live.current;\n\t\tif (!stroke || stroke.pointerId !== event.pointerId) return;\n\t\t// A lift can arrive beyond the last move; keep that endpoint without duplicating a resting tap.\n\t\tconst endpoint = pointFrom(event);\n\t\tconst last = stroke.points[stroke.points.length - 1];\n\t\tif (last.x !== endpoint.x || last.y !== endpoint.y) stroke.points.push(endpoint);\n\t\tlive.current = null;\n\t\tsetDrawing(false);\n\t\tif (valueRef.current === stroke.initial) publish({ ...stroke.initial, strokes: [...stroke.initial.strokes, { points: stroke.points }] });\n\t};\n\tconst empty = isSignatureEmpty(value);\n\treturn <Stack {...rootProps} id={rootId} role=\"group\" aria-label={rootProps['aria-label'] ?? strings.label} gap=\"sm\" className={cn('signature-pad--component min-w-0 font-sans', className)} data-history-version={historyVersion} data-disabled={disabled || undefined} data-readonly={readOnly || undefined}>\n\t\t<Text id={`${rootId}-instructions`} size=\"xs\" type=\"secondary\">{instructions}</Text>\n\t\t{/* The drawing area is the field frame: keyboard focus on the canvas draws the\n\t\t shared outer ring on the frame, like any other field, instead of an inset ring. */}\n\t\t<div className={cn('signature-pad--area relative overflow-hidden rounded-inner border border-input bg-background text-foreground transition-[color,box-shadow]', 'has-[canvas:focus-visible]:border-ring has-[canvas:focus-visible]:ring-3 has-[canvas:focus-visible]:ring-ring/50', fieldStateRecipes.invalid, 'aria-invalid:has-[canvas:focus-visible]:border-destructive aria-invalid:has-[canvas:focus-visible]:ring-destructive/30 dark:aria-invalid:has-[canvas:focus-visible]:ring-destructive/50', disabled && 'cursor-not-allowed opacity-50')} aria-invalid={invalid || undefined}>\n\t\t\t<canvas ref={canvasRef} className={cn('signature-pad--canvas block w-full aspect-[3/1] min-h-40 outline-none', !locked && 'touch-none cursor-crosshair')}\n\t\t\t\ttabIndex={disabled ? -1 : 0} role=\"img\" aria-label={strings.label} aria-describedby={`${rootId}-instructions ${rootId}-status`} aria-disabled={disabled || undefined} aria-invalid={invalid || undefined}\n\t\t\t\tonPointerDown={(event) => { if (locked || live.current || event.button !== 0) return; event.preventDefault(); event.currentTarget.focus(); event.currentTarget.setPointerCapture?.(event.pointerId); live.current = { pointerId: event.pointerId, points: [pointFrom(event)], initial: valueRef.current }; setDrawing(true); paint({ ...valueRef.current, strokes: [...valueRef.current.strokes, { points: live.current.points }] }); }}\n\t\t\t\tonPointerMove={(event) => {\n\t\t\t\t\tconst stroke = live.current;\n\t\t\t\t\tif (!stroke || stroke.pointerId !== event.pointerId) return;\n\t\t\t\t\tconst samples = event.nativeEvent.getCoalescedEvents?.().filter((sample) => sample.pointerId === stroke.pointerId) ?? [];\n\t\t\t\t\tfor (const sample of samples.length ? samples : [event.nativeEvent]) stroke.points.push(pointFrom(event, sample));\n\t\t\t\t\tpaint({ ...stroke.initial, strokes: [...stroke.initial.strokes, { points: stroke.points }] });\n\t\t\t\t}}\n\t\t\t\tonPointerUp={finish} onPointerCancel={(event) => { if (live.current?.pointerId === event.pointerId) cancelStroke(); }} onLostPointerCapture={(event) => { if (live.current?.pointerId === event.pointerId) cancelStroke(); }}\n\t\t\t\tonContextMenu={(event) => { if (live.current) event.preventDefault(); }}\n\t\t\t\tonKeyDown={(event) => { if (event.key === 'Escape') cancelStroke(); if (locked) return; if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'z') { event.preventDefault(); if (event.shiftKey) redo(); else undo(); } if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'y') { event.preventDefault(); redo(); } }}>\n\t\t\t\t{instructions}\n\t\t\t</canvas>\n\t\t\t{empty && !drawing && <div aria-hidden=\"true\" className=\"signature-pad--placeholder pointer-events-none absolute inset-0 flex items-center justify-center\"><Text type=\"secondary\">{strings.placeholder}</Text></div>}\n\t\t</div>\n\t\t{allowTypedSignature && <FormField label={strings.typedName} htmlFor={`${rootId}-typed`}><Input ref={typedRef} id={`${rootId}-typed`} value={value.typedName ?? ''} disabled={disabled} readOnly={readOnly} invalid={invalid} onChange={(event) => publish({ ...valueRef.current, typedName: event.target.value })} /></FormField>}\n\t\t<Stack direction=\"horizontal\" gap=\"xs\" wrap>\n\t\t\t<Button type=\"button\" buttonStyle=\"outline\" disabled={locked || !undoHistory.current.length} onClick={() => { undo(); focus(); }}>{strings.undo}</Button>\n\t\t\t<Button type=\"button\" buttonStyle=\"outline\" disabled={locked || !redoHistory.current.length} onClick={() => { redo(); focus(); }}>{strings.redo}</Button>\n\t\t\t<Button type=\"button\" buttonStyle=\"outline\" disabled={locked || empty} onClick={() => { publish(emptySignature); focus(); }}>{strings.clear}</Button>\n\t\t</Stack>\n\t\t<Text id={`${rootId}-status`} role=\"status\" size=\"xs\" type=\"secondary\">{empty ? strings.empty : strings.signed}</Text>\n\t\t{(name || required) && <input ref={fieldRef} className=\"sr-only\" type=\"text\" tabIndex={-1} aria-hidden=\"true\" name={name} form={form} disabled={disabled} readOnly={readOnly} required={required} value={empty ? '' : JSON.stringify(value)} onChange={() => {}} onFocus={focus} onInvalid={focus} />}\n\t</Stack>;\n});\n\n/** Server-renderable preview; normalized geometry follows the semantic foreground. */\nexport const SignaturePadPreview = forwardRef<SVGSVGElement, SignaturePadPreviewProps>(function SignaturePadPreview({ value, strokeWidth = 2, className, ...props }, ref) {\n\tconst normalized = normalizeSignature(value);\n\treturn <svg ref={ref} role=\"img\" viewBox=\"0 0 600 200\" aria-label=\"Signature\" {...props} className={cn('signature-pad-preview--component w-full h-auto font-sans text-foreground', className)}>\n\t\t{normalized.strokes.map((stroke, index) => stroke.points.length === 1 ? <circle key={index} cx={stroke.points[0].x * 600} cy={stroke.points[0].y * 200} r={strokeWidth * (0.5 + stroke.points[0].pressure) / 2} fill=\"currentColor\" /> : <g key={index}>{stroke.points.slice(1).map((point, pointIndex) => { const a = stroke.points[pointIndex]; return <path key={pointIndex} d={`M${a.x * 600} ${a.y * 200}L${point.x * 600} ${point.y * 200}`} fill=\"none\" stroke=\"currentColor\" strokeWidth={strokeWidth * (0.5 + (a.pressure + point.pressure) / 2)} strokeLinecap=\"round\" />; })}</g>)}\n\t\t{normalized.typedName && <text x=\"24\" y=\"180\" fill=\"currentColor\" fontSize=\"40\" textLength={Math.min(552, normalized.typedName.length * 20)}>{normalized.typedName}</text>}\n\t</svg>;\n});\n"],"mappings":"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"}
|
package/dist/base/skeleton.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { a as e, i as t, n, r, t as i } from "../skeleton-
|
|
2
|
+
import { a as e, i as t, n, r, t as i } from "../skeleton-Cz890JZF.js";
|
|
3
3
|
export { i as ContentSkeleton, n as PageSkeleton, r as Skeleton, t as TableSkeleton, e as TwoColumnPageSkeleton };
|
package/dist/base/spinner.js
CHANGED
package/dist/base/structure.js
CHANGED
package/dist/base/table.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { a as e, c as t, i as n, n as r, o as i, r as a, s as o, t as s } from "../table-
|
|
2
|
+
import { a as e, c as t, i as n, n as r, o as i, r as a, s as o, t as s } from "../table-CIKyLUsy.js";
|
|
3
3
|
export { s as Table, r as TableBody, a as TableCaption, n as TableCell, e as TableFooter, i as TableHead, o as TableHeader, t as TableRow };
|
package/dist/base/text-inputs.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { n as e, t } from "../input-
|
|
3
|
-
import { a as n, c as r, d as i, i as a, l as o, n as s, o as c, r as l, s as u, t as d, u as f } from "../text-inputs-
|
|
2
|
+
import { n as e, t } from "../input-DWhBBBww.js";
|
|
3
|
+
import { a as n, c as r, d as i, i as a, l as o, n as s, o as c, r as l, s as u, t as d, u as f } from "../text-inputs-aaK9wcDT.js";
|
|
4
4
|
export { t as Input, n as InputGroup, c as InputGroupAddon, u as InputGroupButton, r as InputGroupInput, o as InputGroupText, f as InputGroupTextarea, l as PasswordInput, d as SlugField, i as Textarea, e as defaultInputStrings, a as defaultPasswordInputStrings, s as slugifyValue };
|
package/dist/base/toaster.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
3
|
-
import { t } from "../utils-
|
|
2
|
+
import { p as e } from "../ui-provider-1D_NSYzO.js";
|
|
3
|
+
import { t } from "../utils-l5LpDw2z.js";
|
|
4
4
|
import { jsx as n } from "react/jsx-runtime";
|
|
5
5
|
import { CircleCheckIcon as r, InfoIcon as i, Loader2Icon as a, OctagonXIcon as o, TriangleAlertIcon as s } from "lucide-react";
|
|
6
6
|
import { Toaster as c } from "sonner";
|
|
@@ -24,7 +24,7 @@ var l = ({ theme: e = "system", ...t }) => /* @__PURE__ */ n(c, {
|
|
|
24
24
|
toastOptions: { classNames: { toast: "cn-toast" } },
|
|
25
25
|
...t
|
|
26
26
|
}), u = {
|
|
27
|
-
toast: "toaster--toast font-sans !min-h-action-lg !items-center !gap-space-md !rounded-radius !border !border-inverse-border !bg-inverse-background !p-surface has-[[data-close-button]]:!pe-[calc(var(--
|
|
27
|
+
toast: "toaster--toast font-sans !min-h-action-lg !items-center !gap-space-md !rounded-radius !border !border-inverse-border !bg-inverse-background !p-surface has-[[data-close-button]]:!pe-[calc(var(--height-action)*8/9*var(--density-scale)+0.75rem*var(--space-scale))] !text-inverse-foreground !shadow-lg",
|
|
28
28
|
title: "toaster--title text-sm font-medium leading-snug text-current",
|
|
29
29
|
description: "toaster--description !text-inverse-muted text-xs leading-snug",
|
|
30
30
|
icon: "toaster--icon !m-0 flex size-icon-lg shrink-0 items-center justify-center self-center text-inverse-muted",
|
|
@@ -77,7 +77,7 @@ function m({ duration: r, position: i, theme: a, closeButton: o, richColors: s,
|
|
|
77
77
|
};
|
|
78
78
|
return /* @__PURE__ */ n(l, {
|
|
79
79
|
..._,
|
|
80
|
-
className: t("toaster group toaster--component", h),
|
|
80
|
+
className: t("toaster group toaster--component dark", h),
|
|
81
81
|
duration: r ?? v,
|
|
82
82
|
position: i ?? y,
|
|
83
83
|
theme: a ?? b ?? "dark",
|
package/dist/base/toaster.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toaster.js","names":["Toaster","Sonner","PrimitiveToaster","useToastConfig","Toaster$1","Toaster$2","props","CircleCheckIcon","InfoIcon","TriangleAlertIcon","OctagonXIcon","Loader2Icon","DEFAULT_TOAST_CLASS_NAMES","DEFAULT_TOAST_ICONS","DEFAULT_TOAST_STYLE","mergeToastClassNames","cn","overrides","Toaster","durationProp","positionProp","themeProp","closeButtonProp","richColorsProp","visibleToastsProp","resolvedToastOptions","toastOptions","className","duration","position","theme","closeButton","richColors","visibleToasts","icons","style"],"sources":["../../src/components/ui/sonner.tsx","../../src/components/base/toaster/toaster.tsx"],"sourcesContent":["import { CircleCheckIcon, InfoIcon, TriangleAlertIcon, OctagonXIcon, Loader2Icon } from \"lucide-react\"\nimport { Toaster as Sonner, type ToasterProps } from \"sonner\"\n\nconst Toaster = ({ theme = \"system\", ...props }: ToasterProps) => {\n return (\n <Sonner\n theme={theme}\n className=\"toaster group\"\n icons={{\n success: (\n <CircleCheckIcon className=\"size-4\" />\n ),\n info: (\n <InfoIcon className=\"size-4\" />\n ),\n warning: (\n <TriangleAlertIcon className=\"size-4\" />\n ),\n error: (\n <OctagonXIcon className=\"size-4\" />\n ),\n loading: (\n <Loader2Icon className=\"size-4 animate-spin\" />\n ),\n }}\n style={\n {\n \"--normal-bg\": \"var(--popover)\",\n \"--normal-text\": \"var(--popover-foreground)\",\n \"--normal-border\": \"var(--border)\",\n \"--border-radius\": \"var(--radius)\",\n } as React.CSSProperties\n }\n toastOptions={{\n classNames: {\n toast: \"cn-toast\",\n },\n }}\n {...props}\n />\n )\n}\n\nexport { Toaster }\n","/**\n * Toaster — base wrapper around the shadcn `ui/sonner` `<Toaster>` that\n * applies library-wide defaults from `<UIProvider>`:\n *\n * - `toast.duration` → default lifetime in ms\n * - `toast.position` → default screen position\n * - `toast.theme` / `toast.closeButton` / `toast.visibleToasts`\n * / `toast.richColors` → Sonner display defaults\n *\n * Per-mount props on this component still win over the store, so a single\n * `<Toaster duration={10_000} />` continues to override the global default.\n */\nimport {\n\tCircleCheckIcon,\n\tInfoIcon,\n\tLoader2Icon,\n\tOctagonXIcon,\n\tTriangleAlertIcon,\n} from 'lucide-react';\nimport type { CSSProperties } from 'react';\nimport type { ToastClassnames, ToasterProps } from 'sonner';\n\nimport { Toaster as PrimitiveToaster } from '../../ui/sonner';\nimport { useToastConfig } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\n\nexport type { ToasterProps };\n\ntype ToastIcons = NonNullable<ToasterProps['icons']>;\n\nconst DEFAULT_TOAST_CLASS_NAMES = {\n\ttoast:\n\t\t'toaster--toast font-sans !min-h-action-lg !items-center !gap-space-md !rounded-radius !border !border-inverse-border !bg-inverse-background !p-surface has-[[data-close-button]]:!pe-[calc(var(--
|
|
1
|
+
{"version":3,"file":"toaster.js","names":["Toaster","Sonner","PrimitiveToaster","useToastConfig","Toaster$1","Toaster$2","props","CircleCheckIcon","InfoIcon","TriangleAlertIcon","OctagonXIcon","Loader2Icon","DEFAULT_TOAST_CLASS_NAMES","DEFAULT_TOAST_ICONS","DEFAULT_TOAST_STYLE","mergeToastClassNames","cn","overrides","Toaster","durationProp","positionProp","themeProp","closeButtonProp","richColorsProp","visibleToastsProp","resolvedToastOptions","toastOptions","className","duration","position","theme","closeButton","richColors","visibleToasts","icons","style"],"sources":["../../src/components/ui/sonner.tsx","../../src/components/base/toaster/toaster.tsx"],"sourcesContent":["import { CircleCheckIcon, InfoIcon, TriangleAlertIcon, OctagonXIcon, Loader2Icon } from \"lucide-react\"\nimport { Toaster as Sonner, type ToasterProps } from \"sonner\"\n\nconst Toaster = ({ theme = \"system\", ...props }: ToasterProps) => {\n return (\n <Sonner\n theme={theme}\n className=\"toaster group\"\n icons={{\n success: (\n <CircleCheckIcon className=\"size-4\" />\n ),\n info: (\n <InfoIcon className=\"size-4\" />\n ),\n warning: (\n <TriangleAlertIcon className=\"size-4\" />\n ),\n error: (\n <OctagonXIcon className=\"size-4\" />\n ),\n loading: (\n <Loader2Icon className=\"size-4 animate-spin\" />\n ),\n }}\n style={\n {\n \"--normal-bg\": \"var(--popover)\",\n \"--normal-text\": \"var(--popover-foreground)\",\n \"--normal-border\": \"var(--border)\",\n \"--border-radius\": \"var(--radius)\",\n } as React.CSSProperties\n }\n toastOptions={{\n classNames: {\n toast: \"cn-toast\",\n },\n }}\n {...props}\n />\n )\n}\n\nexport { Toaster }\n","/**\n * Toaster — base wrapper around the shadcn `ui/sonner` `<Toaster>` that\n * applies library-wide defaults from `<UIProvider>`:\n *\n * - `toast.duration` → default lifetime in ms\n * - `toast.position` → default screen position\n * - `toast.theme` / `toast.closeButton` / `toast.visibleToasts`\n * / `toast.richColors` → Sonner display defaults\n *\n * Per-mount props on this component still win over the store, so a single\n * `<Toaster duration={10_000} />` continues to override the global default.\n */\nimport {\n\tCircleCheckIcon,\n\tInfoIcon,\n\tLoader2Icon,\n\tOctagonXIcon,\n\tTriangleAlertIcon,\n} from 'lucide-react';\nimport type { CSSProperties } from 'react';\nimport type { ToastClassnames, ToasterProps } from 'sonner';\n\nimport { Toaster as PrimitiveToaster } from '../../ui/sonner';\nimport { useToastConfig } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\n\nexport type { ToasterProps };\n\ntype ToastIcons = NonNullable<ToasterProps['icons']>;\n\nconst DEFAULT_TOAST_CLASS_NAMES = {\n\ttoast:\n\t\t'toaster--toast font-sans !min-h-action-lg !items-center !gap-space-md !rounded-radius !border !border-inverse-border !bg-inverse-background !p-surface has-[[data-close-button]]:!pe-[calc(var(--height-action)*8/9*var(--density-scale)+0.75rem*var(--space-scale))] !text-inverse-foreground !shadow-lg',\n\ttitle: 'toaster--title text-sm font-medium leading-snug text-current',\n\tdescription: 'toaster--description !text-inverse-muted text-xs leading-snug',\n\ticon:\n\t\t'toaster--icon !m-0 flex size-icon-lg shrink-0 items-center justify-center self-center text-inverse-muted',\n\tcloseButton:\n\t\t'toaster--close-button !left-auto !right-space-sm !top-1/2 !size-action-xs !translate-x-0 !-translate-y-1/2 !transform-none !border-inverse-border !bg-transparent !text-inverse-foreground !opacity-60 transition-[background-color,opacity] hover:!bg-inverse-surface hover:!opacity-100',\n\tactionButton:\n\t\t'toaster--action-button !h-action-sm !rounded-inner !bg-inverse-foreground !m-0 shrink-0 !px-control-sm !text-sm !font-medium !text-inverse-background',\n\tcancelButton:\n\t\t'toaster--cancel-button !h-action-sm !rounded-inner !bg-inverse-surface !m-0 shrink-0 !px-control-sm !text-sm !font-medium !text-inverse-foreground',\n\tsuccess: 'toaster--success',\n\tinfo: 'toaster--info',\n\twarning: 'toaster--warning',\n\terror: 'toaster--error',\n\tloading: 'toaster--loading',\n\tdefault: 'toaster--default',\n\tcontent: 'toaster--content grid min-w-0 flex-1 gap-dense py-0 wrap-anywhere',\n} satisfies ToastClassnames;\n\nconst DEFAULT_TOAST_ICONS = {\n\tsuccess: <CircleCheckIcon className=\"size-icon-lg text-success\" />,\n\tinfo: <InfoIcon className=\"size-icon-lg text-info\" />,\n\twarning: <TriangleAlertIcon className=\"size-icon-lg text-warning-accent\" />,\n\terror: <OctagonXIcon className=\"size-icon-lg text-destructive\" />,\n\tloading: <Loader2Icon className=\"size-icon-lg animate-spin text-inverse-muted\" />,\n} satisfies ToastIcons;\n\nconst DEFAULT_TOAST_STYLE = {\n\t'--normal-bg': 'var(--inverse-background)',\n\t'--normal-text': 'var(--inverse-foreground)',\n\t'--normal-border': 'var(--inverse-border)',\n\t'--border-radius': 'var(--radius-md)',\n\t'--width': 'min(92vw, 24rem)',\n} as CSSProperties;\n\nfunction mergeToastClassNames(overrides?: ToastClassnames): ToastClassnames {\n\treturn {\n\t\ttoast: cn(DEFAULT_TOAST_CLASS_NAMES.toast, overrides?.toast),\n\t\ttitle: cn(DEFAULT_TOAST_CLASS_NAMES.title, overrides?.title),\n\t\tdescription: cn(DEFAULT_TOAST_CLASS_NAMES.description, overrides?.description),\n\t\ticon: cn(DEFAULT_TOAST_CLASS_NAMES.icon, overrides?.icon),\n\t\tcloseButton: cn(DEFAULT_TOAST_CLASS_NAMES.closeButton, overrides?.closeButton),\n\t\tactionButton: cn(DEFAULT_TOAST_CLASS_NAMES.actionButton, overrides?.actionButton),\n\t\tcancelButton: cn(DEFAULT_TOAST_CLASS_NAMES.cancelButton, overrides?.cancelButton),\n\t\tsuccess: cn(DEFAULT_TOAST_CLASS_NAMES.success, overrides?.success),\n\t\tinfo: cn(DEFAULT_TOAST_CLASS_NAMES.info, overrides?.info),\n\t\twarning: cn(DEFAULT_TOAST_CLASS_NAMES.warning, overrides?.warning),\n\t\terror: cn(DEFAULT_TOAST_CLASS_NAMES.error, overrides?.error),\n\t\tloading: cn(DEFAULT_TOAST_CLASS_NAMES.loading, overrides?.loading),\n\t\tdefault: cn(DEFAULT_TOAST_CLASS_NAMES.default, overrides?.default),\n\t\tloader: overrides?.loader,\n\t\tcontent: cn(DEFAULT_TOAST_CLASS_NAMES.content, overrides?.content),\n\t};\n}\n\nexport function Toaster({\n\tduration: durationProp,\n\tposition: positionProp,\n\ttheme: themeProp,\n\tcloseButton: closeButtonProp,\n\trichColors: richColorsProp,\n\tvisibleToasts: visibleToastsProp,\n\ttoastOptions,\n\ticons,\n\tclassName,\n\tstyle,\n\t...props\n}: ToasterProps) {\n\tconst {\n\t\tduration,\n\t\tposition,\n\t\ttheme,\n\t\tcloseButton,\n\t\trichColors,\n\t\tvisibleToasts,\n\t} = useToastConfig();\n\n\tconst resolvedToastOptions: ToasterProps['toastOptions'] = {\n\t\t...toastOptions,\n\t\tclassNames: mergeToastClassNames(toastOptions?.classNames),\n\t};\n\n\treturn (\n\t\t<PrimitiveToaster\n\t\t\t{...props}\n\t\t\t// Toasts always sit on the inverse (dark) surface. Scoping the dark theme here\n\t\t\t// resolves status icons and the focus ring to their dark-surface values, so a\n\t\t\t// light page does not paint dark-green or dark-red glyphs on a dark toast.\n\t\t\tclassName={cn('toaster group toaster--component dark', className)}\n\t\t\tduration={durationProp ?? duration}\n\t\t\tposition={positionProp ?? position}\n\t\t\ttheme={themeProp ?? theme ?? 'dark'}\n\t\t\tcloseButton={closeButtonProp ?? closeButton}\n\t\t\trichColors={richColorsProp ?? richColors}\n\t\t\tvisibleToasts={visibleToastsProp ?? visibleToasts}\n\t\t\ttoastOptions={resolvedToastOptions}\n\t\t\ticons={{ ...DEFAULT_TOAST_ICONS, ...icons }}\n\t\t\tstyle={{ ...DEFAULT_TOAST_STYLE, ...style } as CSSProperties}\n\t\t/>\n\t);\n}\n\nToaster.displayName = 'Toaster';\n"],"mappings":"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"}
|
package/dist/base/tree.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { i as e, n as t, r as n, t as r } from "../upload-queue-
|
|
2
|
+
import { i as e, n as t, r as n, t as r } from "../upload-queue-EOC8g1gf.js";
|
|
3
3
|
export { n as UploadProgressList, r as UploadTray, e as defaultUploadProgressListStrings, t as defaultUploadTrayStrings };
|
package/dist/base/upload.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { n as e, t } from "../media-gallery-
|
|
3
|
-
import { a as n, i as r, n as i, o as a, r as o, t as s } from "../upload-queue-
|
|
4
|
-
import { a as c, i as l, n as u, o as d, r as f, t as p } from "../upload-
|
|
2
|
+
import { n as e, t } from "../media-gallery-DcTtAaeC.js";
|
|
3
|
+
import { a as n, i as r, n as i, o as a, r as o, t as s } from "../upload-queue-EOC8g1gf.js";
|
|
4
|
+
import { a as c, i as l, n as u, o as d, r as f, t as p } from "../upload-BO8-CLN6.js";
|
|
5
5
|
export { p as AvatarUpload, n as Dropzone, c as FileUpload, f as ImageUpload, t as MediaGallery, o as UploadProgressList, s as UploadTray, u as defaultAvatarUploadStrings, a as defaultDropzoneStrings, d as defaultFileUploadStrings, l as defaultImageUploadStrings, e as defaultMediaGalleryStrings, r as defaultUploadProgressListStrings, i as defaultUploadTrayStrings };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { a as e, c as t,
|
|
3
|
-
export {
|
|
2
|
+
import { a as e, c as t, d as n, i as r, l as i, n as a, o, r as s, s as c, t as l, u } from "../value-inputs-TAYMX111.js";
|
|
3
|
+
export { o as COUNTRY_PREFIX_MAP, r as ColorInput, c as DEFAULT_COUNTRY_PREFIXES, l as DateTimeInput, t as PhoneInput, a as SliderField, u as TagsInput, e as defaultColorInputStrings, i as defaultPhoneInputStrings, s as defaultSliderStrings, n as defaultTagsInputStrings };
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useStrings as e } from "./lib/strings.js";
|
|
3
|
+
import { t } from "./utils-l5LpDw2z.js";
|
|
4
|
+
import { n } from "./buttons-SbIcm1HJ.js";
|
|
5
|
+
import { s as r } from "./typography-DTRkE9zL.js";
|
|
6
|
+
import { t as i } from "./motion-recipes-ChBg4HBq.js";
|
|
7
|
+
import { a, i as o, t as s } from "./surface-recipes-BKRVW8Os.js";
|
|
8
|
+
import { t as c } from "./layer-recipes-CCpklYME.js";
|
|
9
|
+
import { useCallback as l, useEffect as u, useRef as d, useState as f } from "react";
|
|
10
|
+
import { jsx as p, jsxs as m } from "react/jsx-runtime";
|
|
11
|
+
//#region src/components/base/batch-action-bar/batch-action-bar.strings.ts
|
|
12
|
+
var h = {
|
|
13
|
+
summary: (e, t) => t === void 0 ? `${e} selected` : `${e} of ${t} selected`,
|
|
14
|
+
clear: "Clear",
|
|
15
|
+
label: "Batch actions"
|
|
16
|
+
}, g = `batch-action-bar--component box-border flex min-w-0 flex-wrap items-center justify-between gap-space-md rounded-radius p-surface-xs ${a.anchored.shell}`, _ = {
|
|
17
|
+
floating: t("fixed bottom-[calc(var(--spacing-space-xl)+env(safe-area-inset-bottom,0px))] left-1/2 w-max max-w-[calc(100%-2*var(--spacing-space-xl))] -translate-x-1/2", "bg-popover text-popover-foreground", s.lifted, c.chrome, i.dock),
|
|
18
|
+
inline: t("w-full text-foreground", o.band)
|
|
19
|
+
};
|
|
20
|
+
function v(e) {
|
|
21
|
+
return !!e && e.isConnected;
|
|
22
|
+
}
|
|
23
|
+
function y(e, t) {
|
|
24
|
+
return !e || !(t instanceof Node) ? !1 : e.contains(t) || e.querySelector("[aria-expanded=\"true\"]") !== null;
|
|
25
|
+
}
|
|
26
|
+
function b({ selectedCount: i, totalCount: a, onClear: o, placement: s = "floating", returnFocusRef: c, strings: b, children: x, className: S }) {
|
|
27
|
+
let C = e(h, b), w = i > 0, [T, E] = f(!1);
|
|
28
|
+
u(() => {
|
|
29
|
+
E(w);
|
|
30
|
+
}, [w]);
|
|
31
|
+
let D = d(null), O = d(!1), k = d(null);
|
|
32
|
+
u(() => {
|
|
33
|
+
if (!w || typeof document > "u") return;
|
|
34
|
+
let e = (e) => {
|
|
35
|
+
let t = D.current, n = y(t, e.target);
|
|
36
|
+
if (n && !O.current) {
|
|
37
|
+
let n = e.relatedTarget;
|
|
38
|
+
k.current = n instanceof HTMLElement && !y(t, n) ? n : null;
|
|
39
|
+
}
|
|
40
|
+
O.current = n;
|
|
41
|
+
}, t = (e) => {
|
|
42
|
+
y(D.current, e.target) || (O.current = !1);
|
|
43
|
+
};
|
|
44
|
+
return document.addEventListener("focusin", e), document.addEventListener("pointerdown", t, !0), () => {
|
|
45
|
+
document.removeEventListener("focusin", e), document.removeEventListener("pointerdown", t, !0);
|
|
46
|
+
};
|
|
47
|
+
}, [w]);
|
|
48
|
+
let A = l(() => {
|
|
49
|
+
let e = v(k.current) ? k.current : null, t = v(c?.current) ? c.current : null;
|
|
50
|
+
k.current = null;
|
|
51
|
+
let n = t && e && t.contains(e) ? [e, t] : [t, e];
|
|
52
|
+
for (let t of n) if (t && (t.focus(t === e ? { preventScroll: !0 } : void 0), document.activeElement === t)) return;
|
|
53
|
+
}, [c]), j = l(() => {
|
|
54
|
+
if (!O.current) return;
|
|
55
|
+
O.current = !1;
|
|
56
|
+
let e = document.activeElement;
|
|
57
|
+
(!e || e === document.body || !e.isConnected) && A();
|
|
58
|
+
}, [A]);
|
|
59
|
+
u(() => {
|
|
60
|
+
w || j();
|
|
61
|
+
}, [w, j]);
|
|
62
|
+
let M = d(j);
|
|
63
|
+
M.current = j, u(() => () => M.current(), []);
|
|
64
|
+
let N = (e) => {
|
|
65
|
+
e.key === "Escape" && o && !e.defaultPrevented && e.target instanceof Node && e.currentTarget.contains(e.target) && (e.preventDefault(), e.stopPropagation(), o());
|
|
66
|
+
};
|
|
67
|
+
if (!w) return null;
|
|
68
|
+
let P = x != null && x !== !1;
|
|
69
|
+
return /* @__PURE__ */ m("div", {
|
|
70
|
+
ref: D,
|
|
71
|
+
role: "region",
|
|
72
|
+
"aria-label": C.label,
|
|
73
|
+
"data-slot": "batch-action-bar",
|
|
74
|
+
"data-placement": s,
|
|
75
|
+
onKeyDown: N,
|
|
76
|
+
className: t(g, _[s], S),
|
|
77
|
+
children: [/* @__PURE__ */ p("div", {
|
|
78
|
+
"data-slot": "batch-action-bar-summary",
|
|
79
|
+
className: "batch-action-bar--summary min-w-0 px-control",
|
|
80
|
+
"aria-live": "polite",
|
|
81
|
+
"aria-atomic": "true",
|
|
82
|
+
children: T && /* @__PURE__ */ p(r, {
|
|
83
|
+
tag: "span",
|
|
84
|
+
className: "tabular-nums",
|
|
85
|
+
children: C.summary(i, a)
|
|
86
|
+
})
|
|
87
|
+
}), (P || !!o) && /* @__PURE__ */ m("div", {
|
|
88
|
+
"data-slot": "batch-action-bar-actions",
|
|
89
|
+
className: "batch-action-bar--actions flex min-w-0 shrink flex-wrap items-center gap-space-xs before:my-space-xs before:w-px before:self-stretch before:bg-border/60 max-sm:before:hidden",
|
|
90
|
+
children: [x, !!o && /* @__PURE__ */ p(n, {
|
|
91
|
+
type: "button",
|
|
92
|
+
tone: "neutral",
|
|
93
|
+
buttonStyle: "ghost",
|
|
94
|
+
onClick: o,
|
|
95
|
+
children: C.clear
|
|
96
|
+
})]
|
|
97
|
+
})]
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
b.displayName = "BatchActionBar";
|
|
101
|
+
//#endregion
|
|
102
|
+
export { h as n, b as t };
|
|
103
|
+
|
|
104
|
+
//# sourceMappingURL=batch-action-bar-BZGDG-Si.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-action-bar-BZGDG-Si.js","names":["Text","motionRecipes","neutralFillRecipes","elevationRecipes","layerRecipes","defaultBatchActionBarStrings","total","selected","barRecipe","surfaceDividerRecipes","placementRecipes","cn","isConnectedElement","node","isWithinBar","bar","BatchActionBar","stringsProp","strings","useStrings","visible","selectedCount","countReady","setCountReady","useState","barRef","useRef","focusInsideRef","focusOriginRef","handleFocusIn","inside","event","from","handlePointerDown","restoreFocus","useCallback","origin","owner","returnFocusRef","candidates","candidate","handBackFocus","active","handBackFocusRef","useEffect","handleKeyDown","onClear","hasActions","children","placement","className","totalCount","Button"],"sources":["../src/components/base/batch-action-bar/batch-action-bar.strings.ts","../src/components/base/batch-action-bar/batch-action-bar.tsx"],"sourcesContent":["/**\n * Default user-facing strings for `<BatchActionBar>`.\n *\n * Consumers wire their own i18n at the call site:\n *\n * <BatchActionBar strings={{ summary: (n, total) => t('selection.summary', { n, total }) }} … />\n */\n\nexport interface BatchActionBarStrings {\n\t/**\n\t * The selection summary (\"3 selected\", \"3 of 250 selected\"). A function,\n\t * because the sentence shape varies by language; `total` is `undefined`\n\t * when the caller does not know or bound the total.\n\t */\n\tsummary: (selected: number, total?: number) => string;\n\t/** The control that drops the selection. */\n\tclear: string;\n\t/** The accessible name of the bar's region. */\n\tlabel: string;\n}\n\nexport const defaultBatchActionBarStrings: BatchActionBarStrings = {\n\tsummary: (selected, total) =>\n\t\ttotal === undefined ? `${selected} selected` : `${selected} of ${total} selected`,\n\tclear: 'Clear',\n\tlabel: 'Batch actions',\n};\n","/**\n * BatchActionBar — the bar shown once a selection exists: the count, the bulk\n * actions, and a way out.\n *\n * Several features share it (DataTable, MediaLibrary, product variants), so it\n * lives in base. `floating` docks to the bottom centre of the viewport, so the\n * selection stays reachable after scrolling a long list; `inline` stays in flow\n * inside a panel that scrolls its own body, where a dock would cover the rows.\n *\n * Callers can mount it unconditionally: at a count of zero it renders nothing.\n * The count is a polite live region, so changes are announced. Escape inside\n * the bar clears, and when the bar goes away with focus inside it (Clear, or an\n * action that drops the selection), focus returns to `returnFocusRef` or to the\n * control focus came from rather than falling to the document body.\n */\nimport { useCallback, useEffect, useRef, useState, type KeyboardEvent, type ReactNode, type RefObject } from 'react';\n\nimport { Button } from '../buttons';\nimport { Text } from '../../typography';\nimport { layerRecipes } from '../../../lib/layer-recipes';\nimport { motionRecipes } from '../../../lib/motion-recipes';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { elevationRecipes, neutralFillRecipes, surfaceDividerRecipes } from '../../../lib/surface-recipes';\nimport { cn } from '../../../lib/utils';\n\nimport { defaultBatchActionBarStrings, type BatchActionBarStrings } from './batch-action-bar.strings';\n\nexport type BatchActionBarPlacement = 'floating' | 'inline';\n\nexport interface BatchActionBarProps {\n\t/** How many items are selected. At zero or below no bar renders, so a caller can mount it unconditionally. */\n\tselectedCount: number;\n\t/** Denominator for the summary. Omit when the total is unknown or unbounded. */\n\ttotalCount?: number;\n\t/** Drops the selection. Omit to render no Clear control or Escape shortcut; a selection the user cannot drop needs a reason. */\n\tonClear?: () => void;\n\t/**\n\t * `floating` (default) docks to the bottom centre of the viewport, or of the\n\t * nearest transformed ancestor; `inline` sits in flow at full width.\n\t */\n\tplacement?: BatchActionBarPlacement;\n\t/**\n\t * Where focus goes when the bar disappears while focus is inside it: the list\n\t * it acts on, or that list's select-all control. When focus entered the bar\n\t * from a control inside this element that is still there, it returns to that\n\t * control instead. Without it, or when it cannot take focus, focus returns to\n\t * the control it entered the bar from, if that is still in the document.\n\t */\n\treturnFocusRef?: RefObject<HTMLElement | null>;\n\t/** Overrides this bar's own copy: `summary(selected, total)`, `clear`, and the region's accessible `label`. */\n\tstrings?: StringsProp<BatchActionBarStrings>;\n\t/** The bulk actions: buttons, a menu, whatever the surface needs. Clear follows them. */\n\tchildren?: ReactNode;\n\t/** Merged onto the bar. */\n\tclassName?: string;\n}\n\n// Both placements share one geometry: the compact anchored-surface inset and\n// shell radius, so the bar's buttons sit in the same frame as a menu's rows.\nconst barRecipe = `batch-action-bar--component box-border flex min-w-0 flex-wrap items-center justify-between gap-space-md rounded-radius p-surface-xs ${surfaceDividerRecipes.anchored.shell}`;\n\nconst placementRecipes: Record<BatchActionBarPlacement, string> = {\n\t// Above sticky headers and toolbars, below the menus and dialogs its own\n\t// actions open. Opaque and lifted, so it never reads as part of the list\n\t// scrolling underneath. 100% rather than 100vw, so a dock inside a\n\t// transformed ancestor does not overhang it.\n\tfloating: cn(\n\t\t'fixed bottom-[calc(var(--spacing-space-xl)+env(safe-area-inset-bottom,0px))] left-1/2 w-max max-w-[calc(100%-2*var(--spacing-space-xl))] -translate-x-1/2',\n\t\t'bg-popover text-popover-foreground',\n\t\televationRecipes.lifted,\n\t\tlayerRecipes.chrome,\n\t\tmotionRecipes.dock,\n\t),\n\tinline: cn('w-full text-foreground', neutralFillRecipes.band),\n};\n\nfunction isConnectedElement(node: HTMLElement | null | undefined): node is HTMLElement {\n\treturn !!node && node.isConnected;\n}\n\n/**\n * Inside the bar, or inside a popup one of its actions has open: a menu is\n * portaled out of the bar's DOM but unmounts with it, so focus there is lost\n * with the bar just the same.\n */\nfunction isWithinBar(bar: HTMLElement | null, node: EventTarget | null): boolean {\n\tif (!bar || !(node instanceof Node)) return false;\n\treturn bar.contains(node) || bar.querySelector('[aria-expanded=\"true\"]') !== null;\n}\n\nexport function BatchActionBar({\n\tselectedCount,\n\ttotalCount,\n\tonClear,\n\tplacement = 'floating',\n\treturnFocusRef,\n\tstrings: stringsProp,\n\tchildren,\n\tclassName,\n}: BatchActionBarProps) {\n\tconst strings = useStrings(defaultBatchActionBarStrings, stringsProp);\n\tconst visible = selectedCount > 0;\n\n\t// The count is a polite live region. It mounts empty and fills once the bar\n\t// is in the document: a live region inserted together with its text is often\n\t// not read, and a second, hidden copy of the count would be read twice.\n\tconst [countReady, setCountReady] = useState(false);\n\tuseEffect(() => {\n\t\tsetCountReady(visible);\n\t}, [visible]);\n\n\tconst barRef = useRef<HTMLDivElement>(null);\n\t// Whether focus was last known to be inside the bar, and the control it came from.\n\tconst focusInsideRef = useRef(false);\n\tconst focusOriginRef = useRef<HTMLElement | null>(null);\n\n\t// Track focus through document listeners rather than blur: browsers differ\n\t// on whether removing a focused node fires blur, and the bar's own removal\n\t// is exactly the moment that matters.\n\tuseEffect(() => {\n\t\tif (!visible || typeof document === 'undefined') return;\n\t\tconst handleFocusIn = (event: FocusEvent) => {\n\t\t\tconst bar = barRef.current;\n\t\t\tconst inside = isWithinBar(bar, event.target);\n\t\t\tif (inside && !focusInsideRef.current) {\n\t\t\t\tconst from = event.relatedTarget;\n\t\t\t\tfocusOriginRef.current = from instanceof HTMLElement && !isWithinBar(bar, from) ? from : null;\n\t\t\t}\n\t\t\tfocusInsideRef.current = inside;\n\t\t};\n\t\t// Pressing somewhere else moves on, even when nothing there takes focus.\n\t\tconst handlePointerDown = (event: PointerEvent) => {\n\t\t\tif (!isWithinBar(barRef.current, event.target)) focusInsideRef.current = false;\n\t\t};\n\t\tdocument.addEventListener('focusin', handleFocusIn);\n\t\tdocument.addEventListener('pointerdown', handlePointerDown, true);\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('focusin', handleFocusIn);\n\t\t\tdocument.removeEventListener('pointerdown', handlePointerDown, true);\n\t\t};\n\t}, [visible]);\n\n\tconst restoreFocus = useCallback(() => {\n\t\tconst origin = isConnectedElement(focusOriginRef.current) ? focusOriginRef.current : null;\n\t\tconst owner = isConnectedElement(returnFocusRef?.current) ? returnFocusRef.current : null;\n\t\tfocusOriginRef.current = null;\n\t\t// Entered from inside the owner, and that control is still there: the\n\t\t// user keeps their place in the list. Otherwise the owner, then the origin.\n\t\t// Going back to the origin restores where focus was, so it never scrolls\n\t\t// the page to it.\n\t\tconst candidates = owner && origin && owner.contains(origin) ? [origin, owner] : [owner, origin];\n\t\tfor (const candidate of candidates) {\n\t\t\tif (!candidate) continue;\n\t\t\tcandidate.focus(candidate === origin ? { preventScroll: true } : undefined);\n\t\t\tif (document.activeElement === candidate) return;\n\t\t}\n\t}, [returnFocusRef]);\n\n\t// The bar went away with focus inside it: hand focus back instead of\n\t// dropping it on the body. An action that already moved focus on (a\n\t// dialog, the next field) keeps it.\n\tconst handBackFocus = useCallback(() => {\n\t\tif (!focusInsideRef.current) return;\n\t\tfocusInsideRef.current = false;\n\t\tconst active = document.activeElement;\n\t\tconst lost = !active || active === document.body || !active.isConnected;\n\t\tif (lost) restoreFocus();\n\t}, [restoreFocus]);\n\tuseEffect(() => {\n\t\tif (!visible) handBackFocus();\n\t}, [visible, handBackFocus]);\n\t// The same when a caller unmounts the bar together with the selection.\n\tconst handBackFocusRef = useRef(handBackFocus);\n\thandBackFocusRef.current = handBackFocus;\n\tuseEffect(() => () => handBackFocusRef.current(), []);\n\n\tconst handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n\t\tif (event.key !== 'Escape' || !onClear || event.defaultPrevented) return;\n\t\t// React bubbles events out of portals; a menu opened from an action owns\n\t\t// its own Escape, so only keys pressed in the bar's DOM clear.\n\t\tif (!(event.target instanceof Node) || !event.currentTarget.contains(event.target)) return;\n\t\tevent.preventDefault();\n\t\t// One Escape, one layer: the dialog or drawer around the bar stays open.\n\t\tevent.stopPropagation();\n\t\tonClear();\n\t};\n\n\t// Nothing selected, nothing rendered.\n\tif (!visible) return null;\n\n\tconst hasActions = children !== undefined && children !== null && children !== false;\n\n\treturn (\n\t\t<div\n\t\t\tref={barRef}\n\t\t\t// A named region, so screen reader users can find the bar again after the list.\n\t\t\trole=\"region\"\n\t\t\taria-label={strings.label}\n\t\t\tdata-slot=\"batch-action-bar\"\n\t\t\tdata-placement={placement}\n\t\t\tonKeyDown={handleKeyDown}\n\t\t\tclassName={cn(barRecipe, placementRecipes[placement], className)}\n\t\t>\n\t\t\t{/*\n\t\t\t * Not `role=\"status\"`, which would collide with the page's own status\n\t\t\t * line. The control inset lines the count up with the buttons' labels,\n\t\t\t * also when the actions wrap below it. Tabular figures, so a changing\n\t\t\t * count does not shift a centred dock.\n\t\t\t */}\n\t\t\t<div\n\t\t\t\tdata-slot=\"batch-action-bar-summary\"\n\t\t\t\tclassName=\"batch-action-bar--summary min-w-0 px-control\"\n\t\t\t\taria-live=\"polite\"\n\t\t\t\taria-atomic=\"true\"\n\t\t\t>\n\t\t\t\t{countReady && (\n\t\t\t\t\t<Text tag=\"span\" className=\"tabular-nums\">\n\t\t\t\t\t\t{strings.summary(selectedCount, totalCount)}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t{(hasActions || !!onClear) && (\n\t\t\t\t<div\n\t\t\t\t\tdata-slot=\"batch-action-bar-actions\"\n\t\t\t\t\t// A rule between the count and the verbs, so the count does not read\n\t\t\t\t\t// as another button. Wrapped below the count on narrow screens, where\n\t\t\t\t\t// the rule would lead the row, it hides.\n\t\t\t\t\tclassName=\"batch-action-bar--actions flex min-w-0 shrink flex-wrap items-center gap-space-xs before:my-space-xs before:w-px before:self-stretch before:bg-border/60 max-sm:before:hidden\"\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t\t{!!onClear && (\n\t\t\t\t\t\t<Button type=\"button\" tone=\"neutral\" buttonStyle=\"ghost\" onClick={onClear}>\n\t\t\t\t\t\t\t{strings.clear}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nBatchActionBar.displayName = 'BatchActionBar';\n"],"mappings":"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"}
|