themelia-react-ui 2.0.4 → 2.0.6
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 +211 -0
- package/MIGRATION.md +119 -0
- package/README.md +122 -20
- package/dist/{accordion-96o0pN62.js → accordion-0tQUZ20r.js} +13 -13
- package/dist/accordion-0tQUZ20r.js.map +1 -0
- package/dist/{action-menu-CHgs8vmj.js → action-menu-C0gjzLyE.js} +48 -45
- package/dist/action-menu-C0gjzLyE.js.map +1 -0
- package/dist/{affordance-geometry.generated-B8yGOr8-.js → affordance-geometry.generated-P-aVJisu.js} +36 -36
- package/dist/affordance-geometry.generated-P-aVJisu.js.map +1 -0
- package/dist/{ai-artifact-BZUGwBq6.js → ai-artifact-CGGpQryR.js} +281 -230
- package/dist/ai-artifact-CGGpQryR.js.map +1 -0
- package/dist/app-shell-EHuuRDGy.js +321 -0
- package/dist/app-shell-EHuuRDGy.js.map +1 -0
- package/dist/{attachment-DkoqHPPl.js → attachment-BCpA4e7i.js} +10 -10
- package/dist/{attachment-DkoqHPPl.js.map → attachment-BCpA4e7i.js.map} +1 -1
- package/dist/{auth-D2FVZ1MH.js → auth-B0girIk_.js} +49 -52
- package/dist/auth-B0girIk_.js.map +1 -0
- package/dist/{avatar-DWO_HHhB.js → avatar-B9Jnp-T-.js} +8 -8
- package/dist/avatar-B9Jnp-T-.js.map +1 -0
- package/dist/{badge-DErMA7ul.js → badge-wWauMgAt.js} +5 -5
- package/dist/{badge-DErMA7ul.js.map → badge-wWauMgAt.js.map} +1 -1
- 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 +1 -1
- package/dist/base/buttons.js +1 -1
- package/dist/base/cards.js +2 -2
- package/dist/base/carousel.js +3 -3
- package/dist/base/cascader.js +2 -372
- package/dist/base/chart.js +1 -1
- package/dist/base/choice-inputs.js +2 -2
- package/dist/base/code-block.js +1 -1
- package/dist/base/combobox.js +2 -2
- 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 +6 -6
- package/dist/base/feedback.js +4 -4
- package/dist/base/forms-numeric.js +1 -1
- package/dist/base/forms.js +2 -2
- package/dist/base/inline-edit.js +10 -10
- package/dist/base/item.js +1 -1
- package/dist/base/media-gallery.js +1 -1
- package/dist/base/metadata-list.js +1 -1
- 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 +1 -1
- package/dist/base/repeaters.js +200 -193
- package/dist/base/repeaters.js.map +1 -1
- package/dist/base/sheet.js +1 -1
- package/dist/base/sidebar.js +2 -2
- package/dist/base/signature-pad.js +8 -8
- package/dist/base/signature-pad.js.map +1 -1
- package/dist/base/skeleton.js +1 -1
- package/dist/base/spinner.js +6 -6
- package/dist/base/spinner.js.map +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 +36 -36
- 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 +1 -1
- package/dist/{batch-action-bar-CdfIkCsV.js → batch-action-bar-BoqWIIpV.js} +7 -7
- package/dist/batch-action-bar-BoqWIIpV.js.map +1 -0
- package/dist/blocks/admin.js +21 -21
- package/dist/blocks/admin.js.map +1 -1
- package/dist/blocks/ai.js +267 -247
- package/dist/blocks/ai.js.map +1 -1
- package/dist/blocks/analytics/usage-card.js +1 -1
- package/dist/blocks/analytics.js +537 -543
- 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 +1330 -1250
- package/dist/blocks/commerce.js.map +1 -1
- package/dist/blocks/data-display.js +2 -2
- package/dist/blocks/onboarding.js +6 -6
- package/dist/blocks/onboarding.js.map +1 -1
- package/dist/blocks/planning.js +11 -11
- package/dist/blocks/timelines.js +1 -1
- package/dist/{breadcrumbs-B-WFKecD.js → breadcrumbs-Bp9Ke7kd.js} +7 -7
- package/dist/breadcrumbs-Bp9Ke7kd.js.map +1 -0
- package/dist/{button-DkmK-z8E.js → button-ChBovTx0.js} +3 -3
- package/dist/button-ChBovTx0.js.map +1 -0
- package/dist/{buttons-BbfzgczK.js → buttons-DeW0bQeK.js} +16 -16
- package/dist/buttons-DeW0bQeK.js.map +1 -0
- package/dist/cards-CNXnmvV5.js +69 -0
- package/dist/cards-CNXnmvV5.js.map +1 -0
- package/dist/cascader-CrAl9zD5.js +439 -0
- package/dist/cascader-CrAl9zD5.js.map +1 -0
- package/dist/chart-I7ROnsl8.js +162 -0
- package/dist/chart-I7ROnsl8.js.map +1 -0
- package/dist/{checkbox-CzYUTPeJ.js → checkbox-MoyHIAPs.js} +3 -3
- package/dist/{checkbox-CzYUTPeJ.js.map → checkbox-MoyHIAPs.js.map} +1 -1
- package/dist/choice-inputs-DHGtx0QV.js +789 -0
- package/dist/choice-inputs-DHGtx0QV.js.map +1 -0
- package/dist/{code-block-CGNaUtAE.js → code-block-BSJyq9e-.js} +9 -9
- package/dist/code-block-BSJyq9e-.js.map +1 -0
- package/dist/{collapsible-Do4G0zcC.js → collapsible-BzJ91LUG.js} +5 -5
- package/dist/{collapsible-Do4G0zcC.js.map → collapsible-BzJ91LUG.js.map} +1 -1
- package/dist/{collection-content-C0e8SsTm.js → collection-content-CSnwtOTH.js} +3 -3
- package/dist/{collection-content-C0e8SsTm.js.map → collection-content-CSnwtOTH.js.map} +1 -1
- package/dist/combobox-Bcvu5J8O.js +363 -0
- package/dist/combobox-Bcvu5J8O.js.map +1 -0
- package/dist/combobox-C2JiSQPc.js +915 -0
- package/dist/combobox-C2JiSQPc.js.map +1 -0
- package/dist/{command-D8NrBj-b.js → command-9e52NPgK.js} +11 -11
- package/dist/command-9e52NPgK.js.map +1 -0
- package/dist/{comments-Di4w0H_S.js → comments-BsgErEqd.js} +44 -39
- package/dist/comments-BsgErEqd.js.map +1 -0
- package/dist/components/base/action-menu/action-menu.d.ts +7 -1
- package/dist/components/base/buttons/button-group.recipes.d.ts +2 -2
- package/dist/components/base/cards/card.recipes.d.ts +6 -4
- package/dist/components/base/cards/partials/card-primitives.d.ts +9 -2
- package/dist/components/base/cards/partials/smart-card-header-row.d.ts +3 -1
- package/dist/components/base/cards/smart-card.types.d.ts +3 -4
- package/dist/components/base/cascader/cascader-panel.d.ts +76 -0
- package/dist/components/base/chart/chart.d.ts +6 -1
- package/dist/components/base/choice-inputs/choice-types.d.ts +5 -1
- package/dist/components/base/choice-inputs/pill-radio-group.d.ts +7 -6
- package/dist/components/base/combobox/combobox-field.d.ts +2 -2
- package/dist/components/base/combobox/index.d.ts +4 -2
- package/dist/components/base/date-pickers/date-picker-internals.d.ts +3 -1
- package/dist/components/base/date-pickers/datepicker.types.d.ts +10 -4
- package/dist/components/base/date-pickers/time-picker.d.ts +17 -3
- package/dist/components/base/feedback/alert.d.ts +1 -1
- package/dist/components/base/feedback/state-display.d.ts +5 -1
- package/dist/components/base/feedback/state-display.strings.d.ts +9 -0
- package/dist/components/base/forms/form-field.d.ts +7 -2
- package/dist/components/base/forms/form-sizing.d.ts +7 -7
- package/dist/components/base/forms/workflow.d.ts +7 -1
- package/dist/components/base/forms-numeric/coordinates-input.d.ts +8 -1
- package/dist/components/base/forms-numeric/decimal-input.d.ts +2 -2
- package/dist/components/base/forms-numeric/dimensions-input.d.ts +4 -1
- package/dist/components/base/forms-numeric/numeric-composite-field.d.ts +12 -0
- package/dist/components/base/forms-numeric/weight-input.d.ts +6 -1
- package/dist/components/base/metadata-list/metadata-list.d.ts +1 -1
- package/dist/components/base/navigation/dropdown-menu.d.ts +1 -1
- package/dist/components/base/navigation/language-switcher.d.ts +12 -4
- package/dist/components/base/navigation/page-header/page-header-commands.d.ts +14 -7
- package/dist/components/base/navigation/page-header/page-header.d.ts +10 -3
- package/dist/components/base/popover/popover.d.ts +3 -3
- package/dist/components/base/popover/popover.recipes.d.ts +10 -6
- package/dist/components/base/repeaters/key-value-editor.d.ts +2 -1
- package/dist/components/base/sheet/sheet.d.ts +2 -0
- package/dist/components/base/sidebar/index.d.ts +1 -1
- package/dist/components/base/sidebar/sidebar.d.ts +29 -5
- package/dist/components/base/toaster/index.d.ts +1 -0
- package/dist/components/base/upload/avatar-upload.d.ts +2 -1
- package/dist/components/base/upload/image-upload.d.ts +2 -1
- package/dist/components/blocks/ai/ai-citation/types.d.ts +2 -0
- package/dist/components/blocks/ai/ai-file-tree/types.d.ts +1 -1
- package/dist/components/blocks/ai/ai-reasoning/types.d.ts +2 -0
- package/dist/components/blocks/ai/ai-sources/types.d.ts +2 -0
- package/dist/components/blocks/ai/ai-tool-call/types.d.ts +5 -1
- package/dist/components/blocks/ai/ai.strings.d.ts +2 -0
- package/dist/components/blocks/analytics/metric/metric.d.ts +4 -0
- package/dist/components/blocks/analytics/metric-comparison/metric-comparison.d.ts +4 -0
- package/dist/components/blocks/analytics/metric-grid/metric-grid.d.ts +4 -5
- package/dist/components/blocks/analytics/types.d.ts +2 -2
- package/dist/components/blocks/analytics/usage-card/usage-card.strings.d.ts +2 -0
- package/dist/components/blocks/commerce/cart-summary/cart-summary.d.ts +1 -1
- package/dist/components/blocks/commerce/cart-summary/types.d.ts +3 -1
- package/dist/components/blocks/commerce/discount-stack/discount-stack.d.ts +1 -1
- package/dist/components/blocks/commerce/discount-stack/types.d.ts +3 -1
- package/dist/components/blocks/commerce/fulfillment-group/fulfillment-group.d.ts +1 -1
- package/dist/components/blocks/commerce/fulfillment-group/types.d.ts +11 -2
- package/dist/components/blocks/commerce/index.d.ts +7 -6
- package/dist/components/blocks/commerce/inventory-section/inventory-section.d.ts +1 -1
- package/dist/components/blocks/commerce/inventory-section/types.d.ts +7 -2
- package/dist/components/blocks/commerce/invoice-header/index.d.ts +2 -1
- package/dist/components/blocks/commerce/invoice-header/invoice-header.d.ts +1 -1
- package/dist/components/blocks/commerce/invoice-header/types.d.ts +20 -6
- package/dist/components/blocks/commerce/invoice-line-items/invoice-line-items.d.ts +1 -1
- package/dist/components/blocks/commerce/invoice-line-items/types.d.ts +24 -7
- package/dist/components/blocks/commerce/invoice-mini/index.d.ts +2 -1
- package/dist/components/blocks/commerce/invoice-mini/types.d.ts +7 -1
- package/dist/components/blocks/commerce/order-customer/order-customer.d.ts +1 -1
- package/dist/components/blocks/commerce/order-customer/types.d.ts +9 -1
- package/dist/components/blocks/commerce/order-status/types.d.ts +4 -0
- package/dist/components/blocks/commerce/refund-status/refund-status.d.ts +1 -1
- package/dist/components/blocks/commerce/refund-status/types.d.ts +3 -1
- package/dist/components/blocks/commerce/shipment-tracking/shipment-tracking.d.ts +1 -1
- package/dist/components/blocks/commerce/shipment-tracking/types.d.ts +3 -1
- package/dist/components/blocks/commerce/tax-breakdown/tax-breakdown.d.ts +1 -1
- package/dist/components/blocks/commerce/tax-breakdown/types.d.ts +3 -1
- package/dist/components/blocks/data-display/empty-state/empty-state.types.d.ts +4 -3
- package/dist/components/features/activities/activities.types.d.ts +26 -13
- package/dist/components/features/activities/hooks/use-activity-resources.d.ts +2 -1
- package/dist/components/features/activities/partials/activity-marker.d.ts +7 -3
- package/dist/components/features/activities/partials/activity-row.d.ts +24 -0
- package/dist/components/features/ai-chat/hooks/use-ai-chat-scroll.d.ts +1 -1
- package/dist/components/features/appointment-calendar/appointment-calendar.d.ts +1 -1
- package/dist/components/features/appointment-calendar/appointment-calendar.types.d.ts +4 -2
- package/dist/components/features/combobox/async-resource-combobox.d.ts +2 -2
- package/dist/components/features/combobox/combobox.d.ts +2 -2
- package/dist/components/features/combobox/hooks/use-combobox-core.d.ts +2 -1
- package/dist/components/features/combobox/hooks/use-combobox-state.d.ts +1 -0
- package/dist/components/features/combobox/hooks/use-load-more.d.ts +1 -0
- package/dist/components/features/combobox/types.d.ts +37 -8
- package/dist/components/features/email-composer/types.d.ts +3 -1
- package/dist/components/features/event-calendar/colors.d.ts +2 -2
- package/dist/components/features/event-calendar/event-calendar.types.d.ts +4 -0
- package/dist/components/features/filters/facets/date-facet.d.ts +4 -2
- package/dist/components/features/filters/facets/range-facet.d.ts +12 -0
- package/dist/components/features/filters/facets/select-facet.d.ts +2 -1
- package/dist/components/features/filters/filters.strings.d.ts +4 -0
- package/dist/components/features/filters/filters.types.d.ts +6 -3
- package/dist/components/features/filters/partials/date-filter-content.d.ts +3 -2
- package/dist/components/features/filters/partials/filter-editor-header.d.ts +16 -0
- package/dist/components/features/filters/partials/filter-popover-content.d.ts +5 -3
- package/dist/components/features/filters/partials/nested-filter-options.d.ts +21 -0
- package/dist/components/features/filters/partials/range-filter-content.d.ts +12 -0
- package/dist/components/features/filters/partials/regular-filter-content.d.ts +2 -1
- package/dist/components/features/filters/utils/filter-utils.d.ts +25 -3
- package/dist/components/features/global-search/global-search.types.d.ts +2 -0
- package/dist/components/features/global-search/partials/global-search-input.d.ts +10 -0
- package/dist/components/features/global-search/partials/global-search-result-row.d.ts +7 -1
- package/dist/components/features/media-library/hooks/use-media-library.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 +8 -0
- package/dist/components/features/media-library/media-library.types.d.ts +50 -12
- package/dist/components/features/media-library/partials/media-library-partials.d.ts +4 -4
- package/dist/components/features/mentions/hooks/use-mentions.d.ts +16 -1
- package/dist/components/features/mentions/partials/mention-inline-suggestions.d.ts +5 -1
- package/dist/components/features/mentions/utils/split-html-by-mentions.d.ts +1 -7
- package/dist/components/features/overlays/hooks/use-overlay-visibility.d.ts +2 -2
- package/dist/components/features/products/components/product-options-matrix.d.ts +1 -1
- package/dist/components/features/products/components/product-variant-editor.d.ts +1 -1
- package/dist/components/features/products/components/product-variants-manager.d.ts +1 -1
- package/dist/components/features/products/products.strings.d.ts +9 -1
- package/dist/components/features/products/products.types.d.ts +45 -8
- package/dist/components/features/questionnaire/questionnaire.types.d.ts +3 -0
- package/dist/components/features/resource/resource.d.ts +6 -2
- package/dist/components/features/resource/resource.types.d.ts +14 -1
- package/dist/components/features/rich-text-editor/form-rich-text-editor.d.ts +1 -1
- package/dist/components/features/rich-text-editor/partials/caret-helpers.d.ts +1 -1
- package/dist/components/features/rich-text-editor/partials/editor-field-aria.d.ts +14 -0
- package/dist/components/features/rich-text-editor/partials/image-uploads.d.ts +1 -1
- package/dist/components/features/rich-text-editor/partials/rich-text-editor-toolbar.d.ts +3 -1
- package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +12 -2
- package/dist/components/features/rich-text-editor/rich-text-editor.types.d.ts +17 -3
- package/dist/components/features/schema-form/hooks/use-schema-form.d.ts +5 -1
- package/dist/components/features/schema-form/partials/schema-form-field.d.ts +3 -1
- package/dist/components/features/schema-form/schema-form.utils.d.ts +1 -1
- package/dist/components/features/suggestions/suggestions.types.d.ts +1 -1
- package/dist/components/features/table/data-table.d.ts +1 -1
- package/dist/components/features/table/index.d.ts +1 -0
- package/dist/components/features/table/partials/resource-cell.d.ts +22 -5
- package/dist/components/features/table/table-body.d.ts +1 -1
- package/dist/components/features/table/table-helpers.d.ts +6 -3
- package/dist/components/features/table/table.strings.d.ts +3 -0
- package/dist/components/features/table/table.types.d.ts +18 -2
- package/dist/components/layout/app-shell/app-shell.types.d.ts +35 -6
- package/dist/components/layout/app-shell/index.d.ts +1 -1
- package/dist/components/layout/app-shell/shell-regions.d.ts +27 -0
- package/dist/components/layout/app-shell/sidebar-inset-layout.d.ts +1 -1
- package/dist/components/layout/app-shell/stacked-layout.d.ts +1 -1
- package/dist/components/layout/app-shell/topbar-sidebar-layout.d.ts +1 -1
- package/dist/components/layout/containers/two-column-layout.d.ts +2 -0
- package/dist/components/layout/header/header.recipes.d.ts +6 -0
- package/dist/components/layout/header/header.types.d.ts +9 -8
- package/dist/components/layout/layout.types.d.ts +5 -3
- package/dist/components/layout/navigation/section-nav/section-nav.d.ts +5 -0
- package/dist/components/layout/navigation/side-nav.d.ts +3 -2
- package/dist/components/layout/normalize-layout-path.d.ts +1 -0
- package/dist/components/layout/page/index.d.ts +2 -1
- package/dist/components/layout/page/page.d.ts +1 -0
- package/dist/components/layout/page/page.strings.d.ts +11 -0
- package/dist/components/layout/page/page.types.d.ts +69 -17
- package/dist/components/layout/page/partials/page-header.d.ts +1 -1
- package/dist/components/layout/settings/settings.d.ts +10 -3
- package/dist/components/layout/sidebar/app-sidebar.d.ts +1 -1
- package/dist/components/layout/sidebar/components/sidebar-grouped-navigation.d.ts +1 -1
- package/dist/components/layout/sidebar/components/sidebar-navigation.d.ts +1 -1
- package/dist/components/layout/sidebar/index.d.ts +2 -1
- package/dist/components/layout/sidebar/sidebar-navigation-rail.d.ts +38 -0
- package/dist/components/layout/sidebar/sidebar.context.d.ts +6 -7
- package/dist/components/layout/sidebar/sidebar.types.d.ts +50 -10
- package/dist/components/layout/sidebar/sidebar.utils.d.ts +9 -1
- package/dist/components/layout/workspace/workspace.types.d.ts +8 -1
- package/dist/components/primitives/link.d.ts +3 -2
- package/dist/components/primitives/money.d.ts +1 -1
- package/dist/components/primitives/number.d.ts +1 -1
- package/dist/components/typography/rich-text/rich-text-tree.d.ts +7 -5
- package/dist/components/ui/alert-dialog.d.ts +2 -2
- package/dist/components/ui/combobox.d.ts +1 -1
- package/dist/components/ui/dialog.d.ts +2 -2
- package/dist/components/ui/overlay-layer.d.ts +18 -0
- package/dist/components/ui/sheet.d.ts +5 -1
- package/dist/components/ui/sidebar-state.d.ts +82 -0
- package/dist/components/ui/sidebar.d.ts +5 -17
- package/dist/{containers-CRmHf7GP.js → containers-CSdc32h9.js} +26 -18
- package/dist/containers-CSdc32h9.js.map +1 -0
- package/dist/{control-group-recipes-DBXmfh2E.js → control-group-recipes-fMuFo0H7.js} +6 -6
- package/dist/control-group-recipes-fMuFo0H7.js.map +1 -0
- package/dist/{copyable-CnGCZdX4.js → copyable-3fdHfMR3.js} +7 -7
- package/dist/{copyable-CnGCZdX4.js.map → copyable-3fdHfMR3.js.map} +1 -1
- package/dist/{data-display-D4oujtx0.js → data-display-Cmj-xZYl.js} +271 -279
- package/dist/data-display-Cmj-xZYl.js.map +1 -0
- package/dist/{date-Q7jnXxpk.js → date-Br0FicVv.js} +5 -5
- package/dist/{date-Q7jnXxpk.js.map → date-Br0FicVv.js.map} +1 -1
- package/dist/date-picker-CyQlFYsP.js +1617 -0
- package/dist/date-picker-CyQlFYsP.js.map +1 -0
- package/dist/date-pickers-tj2MXmXd.js +185 -0
- package/dist/date-pickers-tj2MXmXd.js.map +1 -0
- package/dist/{display-BB4BL_-K.js → display-CT_N2a3w.js} +9 -9
- package/dist/{display-BB4BL_-K.js.map → display-CT_N2a3w.js.map} +1 -1
- package/dist/dropdown-menu-C08iIugv.js +194 -0
- package/dist/dropdown-menu-C08iIugv.js.map +1 -0
- package/dist/features/activities.js +388 -326
- package/dist/features/activities.js.map +1 -1
- package/dist/features/ai-chat.js +46 -32
- package/dist/features/ai-chat.js.map +1 -1
- package/dist/features/appointment-calendar.js +130 -130
- package/dist/features/appointment-calendar.js.map +1 -1
- package/dist/features/async-preview.js +11 -10
- 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 +13 -13
- package/dist/features/data-view.js.map +1 -1
- package/dist/features/email-composer.js +243 -239
- package/dist/features/email-composer.js.map +1 -1
- package/dist/features/event-calendar.js +197 -199
- package/dist/features/event-calendar.js.map +1 -1
- package/dist/features/filters.js +2 -2
- package/dist/features/global-search.js +168 -143
- package/dist/features/global-search.js.map +1 -1
- package/dist/features/kanban.js +19 -30
- package/dist/features/kanban.js.map +1 -1
- package/dist/features/map/style.css +15 -0
- package/dist/features/map.js +369 -343
- package/dist/features/map.js.map +1 -1
- package/dist/features/media-library.js +1202 -975
- package/dist/features/media-library.js.map +1 -1
- package/dist/features/mentions.js +2 -2
- package/dist/features/overlays.js +1 -1
- package/dist/features/products.js +1270 -1183
- package/dist/features/products.js.map +1 -1
- package/dist/features/questionnaire.js +160 -153
- package/dist/features/questionnaire.js.map +1 -1
- package/dist/features/resource-assignment.js +8 -8
- package/dist/features/resource.js +119 -113
- package/dist/features/resource.js.map +1 -1
- package/dist/features/rich-text-editor.js +28 -19
- package/dist/features/rich-text-editor.js.map +1 -1
- package/dist/features/schema-form.js +297 -256
- package/dist/features/schema-form.js.map +1 -1
- package/dist/features/suggestions.js +57 -50
- package/dist/features/suggestions.js.map +1 -1
- package/dist/features/sync.js +3 -3
- package/dist/features/table.js +1 -1
- package/dist/features/theme-tweaker.js +470 -470
- package/dist/features/theme-tweaker.js.map +1 -1
- package/dist/feedback-Dzo1xtAU.js +246 -0
- package/dist/feedback-Dzo1xtAU.js.map +1 -0
- package/dist/{field-affordance-recipes-DjwGx8eM.js → field-affordance-recipes-D6H7tVJi.js} +5 -5
- package/dist/field-affordance-recipes-D6H7tVJi.js.map +1 -0
- package/dist/field-control-attributes-B6i335wr.js +18 -0
- package/dist/field-control-attributes-B6i335wr.js.map +1 -0
- package/dist/{field-state-recipes-BVA2CWHo.js → field-state-recipes-7sza8QbC.js} +4 -2
- package/dist/{field-state-recipes-BVA2CWHo.js.map → field-state-recipes-7sza8QbC.js.map} +1 -1
- package/dist/filters-Dl80yYtN.js +2415 -0
- package/dist/filters-Dl80yYtN.js.map +1 -0
- package/dist/form-field-CAPdwdnZ.js +74 -0
- package/dist/form-field-CAPdwdnZ.js.map +1 -0
- package/dist/{form-sizing-NXgjkmBG.js → form-sizing-CgcrUbLU.js} +5 -5
- package/dist/form-sizing-CgcrUbLU.js.map +1 -0
- package/dist/{forms-BV5m5aQF.js → forms-B3W8CH7-.js} +17 -13
- package/dist/forms-B3W8CH7-.js.map +1 -0
- package/dist/forms-numeric-CwjQJe-O.js +991 -0
- package/dist/forms-numeric-CwjQJe-O.js.map +1 -0
- package/dist/{header-BA697l4a.js → header-ZIIsRKxP.js} +145 -141
- package/dist/header-ZIIsRKxP.js.map +1 -0
- package/dist/header.recipes-BigdJjw1.js +6 -0
- package/dist/header.recipes-BigdJjw1.js.map +1 -0
- package/dist/hooks/use-files.d.ts +2 -0
- package/dist/{hooks-BQ-L7Uu2.js → hooks-BitHSh-Y.js} +27 -15
- package/dist/hooks-BitHSh-Y.js.map +1 -0
- package/dist/{icon-badge-COWbCCWu.js → icon-badge-npxF1SLX.js} +4 -4
- package/dist/{icon-badge-COWbCCWu.js.map → icon-badge-npxF1SLX.js.map} +1 -1
- package/dist/index.js +4 -5
- package/dist/{input-Cdw4k0fb.js → input-7KAc7XQL.js} +9 -9
- package/dist/{input-Cdw4k0fb.js.map → input-7KAc7XQL.js.map} +1 -1
- package/dist/input-DIREVYHs.js +21 -0
- package/dist/input-DIREVYHs.js.map +1 -0
- package/dist/{interaction-recipes-XR9ZpVYL.js → interaction-recipes-4wZ2tvfb.js} +2 -2
- package/dist/{interaction-recipes-XR9ZpVYL.js.map → interaction-recipes-4wZ2tvfb.js.map} +1 -1
- package/dist/item-FfWnaYST.js +278 -0
- package/dist/item-FfWnaYST.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 +2 -2
- package/dist/layout/settings.js +1 -1
- package/dist/layout/sidebar.js +3 -3
- package/dist/layout/workspace.js +1 -1
- package/dist/layout.js +12 -12
- package/dist/layout.types-E_GAApzO.js +30 -0
- package/dist/layout.types-E_GAApzO.js.map +1 -0
- package/dist/lib/affordance-geometry.generated.d.ts +35 -35
- package/dist/lib/control-group-recipes.d.ts +5 -5
- package/dist/lib/field-affordance-recipes.d.ts +2 -2
- package/dist/lib/field-control-attributes.d.ts +11 -0
- package/dist/lib/field-state-recipes.d.ts +2 -0
- package/dist/lib/format.d.ts +1 -0
- package/dist/lib/motion-recipes.d.ts +3 -0
- package/dist/lib/navigation-row-recipes.d.ts +7 -7
- package/dist/lib/overlay-anatomy-recipes.d.ts +3 -3
- package/dist/lib/portal-recipes.d.ts +3 -0
- package/dist/lib/surface-recipes.d.ts +1 -1
- package/dist/lib/token-merge.generated.d.ts +18 -15
- package/dist/lib/utils.js +1 -1
- package/dist/map-demo-tile.svg +1 -1
- package/dist/{media-gallery-CSl5W1Fy.js → media-gallery-C81DAnKI.js} +6 -6
- package/dist/{media-gallery-CSl5W1Fy.js.map → media-gallery-C81DAnKI.js.map} +1 -1
- package/dist/{mentions-RKOQaaIB.js → mentions-qOnedSt4.js} +237 -168
- package/dist/mentions-qOnedSt4.js.map +1 -0
- package/dist/message-BJHnn43M.js +135 -0
- package/dist/message-BJHnn43M.js.map +1 -0
- package/dist/{metadata-list-qVV7AVxa.js → metadata-list-XkqZ_UXH.js} +64 -64
- package/dist/metadata-list-XkqZ_UXH.js.map +1 -0
- package/dist/{motion-recipes-ChBg4HBq.js → motion-recipes-DitYv6P2.js} +10 -2
- package/dist/motion-recipes-DitYv6P2.js.map +1 -0
- package/dist/navigation-BgtPJAhi.js +288 -0
- package/dist/navigation-BgtPJAhi.js.map +1 -0
- package/dist/navigation-Bt-v7rWP.js +261 -0
- package/dist/navigation-Bt-v7rWP.js.map +1 -0
- package/dist/{navigation-row-recipes-WZEs-hYo.js → navigation-row-recipes-BGVLvU_O.js} +9 -9
- package/dist/navigation-row-recipes-BGVLvU_O.js.map +1 -0
- package/dist/normalize-layout-path-BmEgg6fu.js +14 -0
- package/dist/normalize-layout-path-BmEgg6fu.js.map +1 -0
- package/dist/{number-E_OiIfJz.js → number-CYqBcrSj.js} +79 -87
- package/dist/number-CYqBcrSj.js.map +1 -0
- package/dist/overflow-tab-bar-BQCA2Zn2.js +172 -0
- package/dist/overflow-tab-bar-BQCA2Zn2.js.map +1 -0
- package/dist/overlays-CC8zI3Du.js +1017 -0
- package/dist/overlays-CC8zI3Du.js.map +1 -0
- package/dist/page-BoQ1VaFJ.js +331 -0
- package/dist/page-BoQ1VaFJ.js.map +1 -0
- package/dist/page-header-commands-DIKspJfx.js +193 -0
- package/dist/page-header-commands-DIKspJfx.js.map +1 -0
- package/dist/{pagination-Ch8X_47u.js → pagination-Br8TdV9A.js} +7 -7
- package/dist/{pagination-Ch8X_47u.js.map → pagination-Br8TdV9A.js.map} +1 -1
- package/dist/popover-k8TdUcAt.js +201 -0
- package/dist/popover-k8TdUcAt.js.map +1 -0
- package/dist/{popover-menu-BYaCdFhf.js → popover-menu-yn-o0kyA.js} +7 -7
- package/dist/{popover-menu-BYaCdFhf.js.map → popover-menu-yn-o0kyA.js.map} +1 -1
- package/dist/{popover.recipes-D3j8R8Yp.js → popover.recipes-DJ0AkUan.js} +19 -12
- package/dist/popover.recipes-DJ0AkUan.js.map +1 -0
- package/dist/portal-recipes-DyUXqUtD.js +9 -0
- package/dist/portal-recipes-DyUXqUtD.js.map +1 -0
- package/dist/{primitives-Du64iDbb.js → primitives-BkkQjYl7.js} +23 -18
- package/dist/primitives-BkkQjYl7.js.map +1 -0
- package/dist/primitives.js +4 -4
- package/dist/{progress-BvF2oCdV.js → progress-DZFXXzPs.js} +9 -9
- package/dist/{progress-BvF2oCdV.js.map → progress-DZFXXzPs.js.map} +1 -1
- package/dist/{receipt-D789Jwyy.js → receipt-C7LhOg7Q.js} +7 -7
- package/dist/receipt-C7LhOg7Q.js.map +1 -0
- package/dist/rich-text-BnTzZjIo.js +45 -0
- package/dist/rich-text-BnTzZjIo.js.map +1 -0
- package/dist/{rich-text-editor-Cm1dpUpQ.js → rich-text-editor-CAurDwT5.js} +501 -424
- package/dist/rich-text-editor-CAurDwT5.js.map +1 -0
- package/dist/rich-text-editor-toolbar-DbXig7Jk.js +99 -0
- package/dist/rich-text-editor-toolbar-DbXig7Jk.js.map +1 -0
- package/dist/rich-text-tree-BqyQ_7-R.js +66 -0
- package/dist/rich-text-tree-BqyQ_7-R.js.map +1 -0
- package/dist/{sanitize-html-DsQmI48u.js → sanitize-html-BWkH4dLM.js} +29 -16
- package/dist/sanitize-html-BWkH4dLM.js.map +1 -0
- package/dist/{scroll-area-La5RXsEk.js → scroll-area-Bj6CRUif.js} +2 -2
- package/dist/{scroll-area-La5RXsEk.js.map → scroll-area-Bj6CRUif.js.map} +1 -1
- package/dist/{separator-DAEV0w65.js → separator-B9ewiCGO.js} +2 -2
- package/dist/{separator-DAEV0w65.js.map → separator-B9ewiCGO.js.map} +1 -1
- package/dist/{separator-GNfPG-90.js → separator-DM6gs2vu.js} +3 -3
- package/dist/{separator-GNfPG-90.js.map → separator-DM6gs2vu.js.map} +1 -1
- package/dist/services/actions.js +1 -1
- package/dist/settings-DZPHgpx4.js +155 -0
- package/dist/settings-DZPHgpx4.js.map +1 -0
- package/dist/sheet-C4DHsgLk.js +250 -0
- package/dist/sheet-C4DHsgLk.js.map +1 -0
- package/dist/sidebar-C8BnDwTH.js +709 -0
- package/dist/sidebar-C8BnDwTH.js.map +1 -0
- package/dist/sidebar-CmD6a-HK.js +1004 -0
- package/dist/sidebar-CmD6a-HK.js.map +1 -0
- package/dist/skeleton-DDgdhmu9.js +265 -0
- package/dist/skeleton-DDgdhmu9.js.map +1 -0
- package/dist/smart-card-B6vLxqa_.js +617 -0
- package/dist/smart-card-B6vLxqa_.js.map +1 -0
- package/dist/{structure-C0V0_Fyf.js → structure-DZJ2wbAU.js} +2 -2
- package/dist/{structure-C0V0_Fyf.js.map → structure-DZJ2wbAU.js.map} +1 -1
- package/dist/style.css +1 -1
- package/dist/{surface-recipes-BKRVW8Os.js → surface-recipes-C8mNycaY.js} +2 -2
- package/dist/{surface-recipes-BKRVW8Os.js.map → surface-recipes-C8mNycaY.js.map} +1 -1
- package/dist/{table-DH7rozUv.js → table-CBonSdTp.js} +573 -519
- package/dist/table-CBonSdTp.js.map +1 -0
- package/dist/{table-CpvnzJn9.js → table-CXSPHH25.js} +75 -71
- package/dist/table-CXSPHH25.js.map +1 -0
- package/dist/tabs-C4Kr_hCr.js +192 -0
- package/dist/tabs-C4Kr_hCr.js.map +1 -0
- package/dist/{text-inputs-DXItiR0O.js → text-inputs-jdkS3ReG.js} +18 -18
- package/dist/text-inputs-jdkS3ReG.js.map +1 -0
- package/dist/theme.css +40 -37
- package/dist/{timelines-DmtztAY_.js → timelines-CoPwdJP0.js} +13 -12
- package/dist/timelines-CoPwdJP0.js.map +1 -0
- package/dist/tooltip-31NwIpTo.js +113 -0
- package/dist/tooltip-31NwIpTo.js.map +1 -0
- package/dist/{tree-CV11PURP.js → tree-CeYVzdFE.js} +9 -9
- package/dist/{tree-CV11PURP.js.map → tree-CeYVzdFE.js.map} +1 -1
- package/dist/typography/rich-text.js +1 -1
- package/dist/{typography-CSyJrh28.js → typography-C7-YMW1S.js} +12 -12
- package/dist/{typography-CSyJrh28.js.map → typography-C7-YMW1S.js.map} +1 -1
- package/dist/typography.js +1 -1
- package/dist/ui-provider-C-74NVLc.js +178 -0
- package/dist/ui-provider-C-74NVLc.js.map +1 -0
- package/dist/ui-provider.js +2 -3
- package/dist/{upload-C9SA0X-8.js → upload-Hdm5gObf.js} +309 -296
- package/dist/upload-Hdm5gObf.js.map +1 -0
- package/dist/{upload-queue-DhQJiSRc.js → upload-queue-D0sYPuqo.js} +16 -14
- package/dist/upload-queue-D0sYPuqo.js.map +1 -0
- package/dist/{usage-card-DVTRDmGz.js → usage-card-9s8hLDfn.js} +24 -17
- package/dist/usage-card-9s8hLDfn.js.map +1 -0
- package/dist/{utils-CF3c95Io.js → utils-DhuoqFy4.js} +255 -165
- package/dist/utils-DhuoqFy4.js.map +1 -0
- package/dist/value-inputs-D3aPgq9H.js +980 -0
- package/dist/value-inputs-D3aPgq9H.js.map +1 -0
- package/dist/{value-typography-ClupF0Gz.js → value-typography-uSzzG9Gf.js} +32 -26
- package/dist/value-typography-uSzzG9Gf.js.map +1 -0
- package/dist/{workspace-9EFVXUyk.js → workspace-CC8Vchiu.js} +51 -50
- package/dist/workspace-CC8Vchiu.js.map +1 -0
- package/docs/consumer-skill/SKILL.md +4 -3
- package/docs/consumer-skill/agents/themelia-ui-designer.md +96 -0
- package/docs/consumer-skill/examples/app-layout.tsx +52 -1
- package/docs/consumer-skill/examples/commerce-lines.tsx +271 -0
- package/docs/consumer-skill/examples/custom-composition.tsx +21 -0
- package/docs/consumer-skill/examples/detail.tsx +5 -4
- package/docs/consumer-skill/examples/edit.tsx +3 -3
- package/docs/consumer-skill/examples/editable-sections.tsx +38 -0
- package/docs/consumer-skill/examples/index-table.tsx +4 -4
- package/docs/consumer-skill/examples/manifest.json +38 -1
- package/docs/consumer-skill/examples/product-media.tsx +41 -0
- package/docs/consumer-skill/examples/product-parts.tsx +81 -0
- package/docs/consumer-skill/examples/rhf-edit-page.tsx +1 -1
- package/docs/consumer-skill/examples/rhf-overlay-form.tsx +24 -11
- package/docs/consumer-skill/examples/token-domain-structure.tsx +68 -0
- package/docs/consumer-skill/references/agents-md.md +21 -19
- package/docs/consumer-skill/references/analytics.md +33 -1
- package/docs/consumer-skill/references/commerce-composition.md +97 -0
- package/docs/consumer-skill/references/component-contracts.json +21249 -14205
- package/docs/consumer-skill/references/composition-mapping.md +17 -3
- package/docs/consumer-skill/references/composition.md +177 -32
- package/docs/consumer-skill/references/critique-rubric.md +98 -0
- package/docs/consumer-skill/references/custom-composition.md +261 -0
- package/docs/consumer-skill/references/data-reading.md +79 -0
- package/docs/consumer-skill/references/design-contract.md +12 -9
- package/docs/consumer-skill/references/discovery.md +27 -3
- package/docs/consumer-skill/references/domain-structures.md +124 -0
- package/docs/consumer-skill/references/installation.md +62 -8
- package/docs/consumer-skill/references/integration.md +59 -1
- package/docs/consumer-skill/references/product-composition.md +94 -0
- package/docs/consumer-skill/references/public-api.json +3044 -445
- package/docs/consumer-skill/references/review.md +87 -10
- package/docs/consumer-skill/references/rhf-workflows.md +79 -0
- package/docs/consumer-skill/references/screen-archetypes.md +19 -7
- package/docs/consumer-skill/references/screen-decisions.md +126 -0
- package/docs/consumer-skill/references/theming.md +24 -20
- package/docs/consumer-skill/references/tokens.json +9 -9
- package/docs/consumer-skill/references/view-craft.md +153 -0
- package/docs/consumer-skill/references/view-spec.md +73 -0
- package/docs/consumer-skill/references/workflows.md +7 -1
- package/docs/consumer-skill/scripts/composition-policy.mjs +176 -26
- package/docs/consumer-skill/scripts/composition-schema.mjs +1 -1
- package/docs/consumer-skill/scripts/composition.mjs +61 -5
- package/docs/consumer-skill/scripts/discovery.mjs +54 -0
- package/docs/consumer-skill/scripts/inspect-component.mjs +1 -1
- package/docs/consumer-skill/scripts/inspection.mjs +73 -18
- package/docs/consumer-skill/scripts/setup-skills.mjs +79 -7
- package/docs/consumer-skill/scripts/surface-policy.mjs +5 -5
- package/docs/consumer-skills/themelia-components/SKILL.md +14 -13
- package/docs/consumer-skills/themelia-composition/SKILL.md +16 -17
- package/docs/consumer-skills/themelia-design/SKILL.md +55 -0
- package/docs/consumer-skills/themelia-foundation/SKILL.md +2 -1
- package/docs/consumer-skills/themelia-tokenization/SKILL.md +24 -17
- package/package.json +4 -2
- package/templates/admin-shell-template.tsx +1 -2
- package/templates/customers-template.tsx +18 -16
- package/dist/accordion-96o0pN62.js.map +0 -1
- package/dist/action-menu-CHgs8vmj.js.map +0 -1
- package/dist/affordance-geometry.generated-B8yGOr8-.js.map +0 -1
- package/dist/ai-artifact-BZUGwBq6.js.map +0 -1
- package/dist/app-shell-D63ATkIK.js +0 -237
- package/dist/app-shell-D63ATkIK.js.map +0 -1
- package/dist/auth-D2FVZ1MH.js.map +0 -1
- package/dist/avatar-DWO_HHhB.js.map +0 -1
- package/dist/base/cascader.js.map +0 -1
- package/dist/batch-action-bar-CdfIkCsV.js.map +0 -1
- package/dist/breadcrumbs-B-WFKecD.js.map +0 -1
- package/dist/button-DkmK-z8E.js.map +0 -1
- package/dist/buttons-BbfzgczK.js.map +0 -1
- package/dist/cards-4JTWqvVe.js +0 -68
- package/dist/cards-4JTWqvVe.js.map +0 -1
- package/dist/chart-C19flDQb.js +0 -155
- package/dist/chart-C19flDQb.js.map +0 -1
- package/dist/choice-inputs-JLtij2y4.js +0 -776
- package/dist/choice-inputs-JLtij2y4.js.map +0 -1
- package/dist/code-block-CGNaUtAE.js.map +0 -1
- package/dist/combobox-CBJDs6w_.js +0 -877
- package/dist/combobox-CBJDs6w_.js.map +0 -1
- package/dist/combobox-hbhSS18O.js +0 -355
- package/dist/combobox-hbhSS18O.js.map +0 -1
- package/dist/command-D8NrBj-b.js.map +0 -1
- package/dist/comments-Di4w0H_S.js.map +0 -1
- package/dist/containers-CRmHf7GP.js.map +0 -1
- package/dist/control-group-recipes-DBXmfh2E.js.map +0 -1
- package/dist/data-display-D4oujtx0.js.map +0 -1
- package/dist/date-picker-zOt1oNss.js +0 -1542
- package/dist/date-picker-zOt1oNss.js.map +0 -1
- package/dist/date-pickers-cj8IXbDC.js +0 -179
- package/dist/date-pickers-cj8IXbDC.js.map +0 -1
- package/dist/dropdown-menu-CjY8Vt7W.js +0 -193
- package/dist/dropdown-menu-CjY8Vt7W.js.map +0 -1
- package/dist/feedback-DZNL5Lg1.js +0 -239
- package/dist/feedback-DZNL5Lg1.js.map +0 -1
- package/dist/field-affordance-recipes-DjwGx8eM.js.map +0 -1
- package/dist/filters-BcT-uoFy.js +0 -2209
- package/dist/filters-BcT-uoFy.js.map +0 -1
- package/dist/form-field-CsgRmdit.js +0 -63
- package/dist/form-field-CsgRmdit.js.map +0 -1
- package/dist/form-sizing-NXgjkmBG.js.map +0 -1
- package/dist/forms-BV5m5aQF.js.map +0 -1
- package/dist/forms-numeric-Cd33AKbD.js +0 -906
- package/dist/forms-numeric-Cd33AKbD.js.map +0 -1
- package/dist/header-BA697l4a.js.map +0 -1
- package/dist/hooks-BQ-L7Uu2.js.map +0 -1
- package/dist/input-DOPL5_QE.js +0 -21
- package/dist/input-DOPL5_QE.js.map +0 -1
- package/dist/item-BvZ2DR_x.js +0 -277
- package/dist/item-BvZ2DR_x.js.map +0 -1
- package/dist/layout.types-Cn7aUzJp.js +0 -20
- package/dist/layout.types-Cn7aUzJp.js.map +0 -1
- package/dist/mentions-RKOQaaIB.js.map +0 -1
- package/dist/message-INU2xsxu.js +0 -128
- package/dist/message-INU2xsxu.js.map +0 -1
- package/dist/metadata-list-qVV7AVxa.js.map +0 -1
- package/dist/motion-recipes-ChBg4HBq.js.map +0 -1
- package/dist/navigation-BQNcg1jT.js +0 -269
- package/dist/navigation-BQNcg1jT.js.map +0 -1
- package/dist/navigation-DLF3E1IC.js +0 -145
- package/dist/navigation-DLF3E1IC.js.map +0 -1
- package/dist/navigation-row-recipes-WZEs-hYo.js.map +0 -1
- package/dist/number-E_OiIfJz.js.map +0 -1
- package/dist/overflow-tab-bar-CrbqMteP.js +0 -284
- package/dist/overflow-tab-bar-CrbqMteP.js.map +0 -1
- package/dist/overlays-BlKynmde.js +0 -1004
- package/dist/overlays-BlKynmde.js.map +0 -1
- package/dist/page-CIwNUtGr.js +0 -227
- package/dist/page-CIwNUtGr.js.map +0 -1
- package/dist/page-header-commands-DFMlNYzN.js +0 -128
- package/dist/page-header-commands-DFMlNYzN.js.map +0 -1
- package/dist/popover-uwzX2vo7.js +0 -198
- package/dist/popover-uwzX2vo7.js.map +0 -1
- package/dist/popover.recipes-D3j8R8Yp.js.map +0 -1
- package/dist/primitives-Du64iDbb.js.map +0 -1
- package/dist/receipt-D789Jwyy.js.map +0 -1
- package/dist/rich-text-CLJEf76s.js +0 -78
- package/dist/rich-text-CLJEf76s.js.map +0 -1
- package/dist/rich-text-editor-Cm1dpUpQ.js.map +0 -1
- package/dist/rich-text-editor-toolbar-L__e4x47.js +0 -94
- package/dist/rich-text-editor-toolbar-L__e4x47.js.map +0 -1
- package/dist/safe-image-src-C6kQSMBZ.js +0 -17
- package/dist/safe-image-src-C6kQSMBZ.js.map +0 -1
- package/dist/sanitize-html-DsQmI48u.js.map +0 -1
- package/dist/settings-BA2iboic.js +0 -174
- package/dist/settings-BA2iboic.js.map +0 -1
- package/dist/sheet-DoAxTb2J.js +0 -213
- package/dist/sheet-DoAxTb2J.js.map +0 -1
- package/dist/sidebar-ByqKR_W5.js +0 -512
- package/dist/sidebar-ByqKR_W5.js.map +0 -1
- package/dist/sidebar-D2iSnGJ7.js +0 -619
- package/dist/sidebar-D2iSnGJ7.js.map +0 -1
- package/dist/skeleton-CUj8O5Bd.js +0 -264
- package/dist/skeleton-CUj8O5Bd.js.map +0 -1
- package/dist/smart-card-CqkzQsK-.js +0 -614
- package/dist/smart-card-CqkzQsK-.js.map +0 -1
- package/dist/table-CpvnzJn9.js.map +0 -1
- package/dist/table-DH7rozUv.js.map +0 -1
- package/dist/tabs-eqVsJZWO.js +0 -191
- package/dist/tabs-eqVsJZWO.js.map +0 -1
- package/dist/text-inputs-DXItiR0O.js.map +0 -1
- package/dist/theme-scope-BJ6eE2xt.js +0 -50
- package/dist/theme-scope-BJ6eE2xt.js.map +0 -1
- package/dist/timelines-DmtztAY_.js.map +0 -1
- package/dist/tooltip-B4hjKtoV.js +0 -111
- package/dist/tooltip-B4hjKtoV.js.map +0 -1
- package/dist/ui-provider-CQCuCBcy.js +0 -136
- package/dist/ui-provider-CQCuCBcy.js.map +0 -1
- package/dist/upload-C9SA0X-8.js.map +0 -1
- package/dist/upload-queue-DhQJiSRc.js.map +0 -1
- package/dist/usage-card-DVTRDmGz.js.map +0 -1
- package/dist/use-mobile-vaLKwgyf.js +0 -15
- package/dist/use-mobile-vaLKwgyf.js.map +0 -1
- package/dist/utils-CF3c95Io.js.map +0 -1
- package/dist/value-inputs-C0o70p-U.js +0 -980
- package/dist/value-inputs-C0o70p-U.js.map +0 -1
- package/dist/value-typography-ClupF0Gz.js.map +0 -1
- package/dist/workspace-9EFVXUyk.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"value-inputs-C0o70p-U.js","names":["React","record","baseui.Select","baseui.SelectTrigger","baseui.SelectValue","React","React","SliderPrimitive","React","useTypographyConfig","useDensityConfig","cn","TextButton","Text","textSizes","focusRecipes","Stack","sliderTrackThickness","collectionRowClasses","collectionRecipes","CollectionLabel","Badge","fieldStateRecipes","fieldAffordanceRecipes","selectToggleRecipes","FieldClearGlyph","editableTextSizeClasses","formControlSizeClasses","formControlMinHeightClasses","formControlHorizontalPaddingClasses","formFieldTriggerClasses","resolveFormControlSize","Input","DatePicker","Popover","PopoverContent","SelectTrigger","SelectPopupContent","SelectPopupGroup","Select","SelectPopupItem","SelectValue","React$1","defaultTagsInputStrings","current","max","tag","entries","isTrue","value","TagsInput","forwardedInputRef","ariaLabel","ariaLabelledBy","ariaDescribedBy","ariaInvalid","ariaRequired","stringsProp","size","defaultScale","placeholderStrings","useStrings","placeholder","strings","isControlled","internalValue","setInternalValue","useState","defaultValue","tags","draft","setDraft","rejectedDraft","setRejectedDraft","announcement","setAnnouncement","open","setOpen","selectedIndex","setSelectedIndex","refocusPosition","setRefocusPosition","inputRef","useRef","shellRef","listId","countId","atLimit","maxTags","hasRecommendations","recommendations","getDisplayValue","useCallback","field","candidate","createTagFromString","input","normalizeText","caseSensitive","text","isDuplicate","list","normalizedRecommendations","useMemo","rec","entry","index","label","filteredRecommendations","search","existingValues","display","allowDuplicates","popupOpen","disabled","activeIndex","sortList","a","b","commit","next","onValueChange","addMany","rejected","raw","candidates","isText","minLength","maxLength","validate","sortTags","submit","rest","delimiter","seen","occurrence","displayEntries","removeTag","i","removeAndRefocus","buttons","handleInputChange","nextDraft","handleKeyDown","prev","handlePaste","start","end","parts","handleBlur","addOnBlur","onBlur","event","clearAll","removeLabel","badgeSize","defaultRenderTag","onRemove","inputInvalid","invalid","overLimit","countMax","showMaxTags","showCount","showClear","showClearAll","describedBy","className","name","details","renderTag","node","isPicked","idx","defaultTextSize","Check","defaultPhoneInputStrings","COUNTRY_PREFIX_MAP","DEFAULT_COUNTRY_PREFIXES","normalizePrefixInput","normalizePrefixes","inputs","p","normalizePhone","normalized","selectedPrefix","resolvePrefixToDialCode","prefix","normalizedPrefixes","PhoneInputImpl","controlledPrefix","sizeProp","props","isDisabled","loading","isLocked","readOnly","basePrefixes","prefixes","resolvedDefaultPrefix","defaultPrefix","internalPrefix","setInternalPrefix","selectedIso","setSelectedIso","initial","option","isPrefixControlled","known","currentPrefixOption","handlePrefixChange","newPrefix","item","onPrefixChange","handleChange","stripped","national","syntheticEvent","onChange","normalizeOnBlur","nextValue","disablePrefixSelector","staticPrefix","forwardedRef","prefixWidth","prefixPlaceholder","prefixOption","showPrefixInDropdown","showCountryName","PhoneInput","memo","defaultColorInputStrings","pickerSizeClasses","normalizeHexColor","part","roundColorChannel","rounded","precision","hexColorToOklch","red","green","blue","offset","channel","lRoot","mRoot","sRoot","lightness","chroma","hue","renderedColorToHex","computedColor","element","directHex","fallback","canvas","context","alpha","ColorInput","pickerDisabled","resolvedValue","resolvedPreview","previewValue","initialPickerValue","pickerValue","setPickerValue","swatchRef","publishChange","pickerAriaLabel","inputStrings","defaultSliderStrings","SliderFieldImpl","generatedId","useId","resolvedId","id","resolvedName","resolvedAriaLabel","uncontrolledValue","setUncontrolledValue","min","handleValueChange","singleValue","newValue","handleValueCommitted","onValueCommitted","displayValue","showValue","currentValue","formatValue","unit","sliderValue","sliderDefaultValue","Slider","SliderField","DateTimeInput","forwardRef","dateValue","output","stepMinutes"],"sources":["../src/components/base/value-inputs/tags-input.tsx","../src/components/base/value-inputs/phone-input.tsx","../src/components/base/value-inputs/color-input.tsx","../src/components/base/value-inputs/slider.tsx","../src/components/base/value-inputs/date-time-input.tsx"],"sourcesContent":["/**\n * TagsInput — generic typed tag picker. Chips and the entry field share one\n * field shell; typed or pasted text splits on `delimiter`, and an optional\n * recommendation list suggests values. Validation, duplicate and `maxTags`\n * refusals keep the rejected text in the draft, mark the field invalid until it\n * is edited, and are announced. Supports both string tags and complex objects\n * (via the `field` prop pointing at the display key). Works controlled\n * (`value`) or uncontrolled (`defaultValue`); `name` serialises one hidden\n * `name[]` input per tag for plain forms. Strings overridable via `strings`.\n *\n * Ref note: `TagsInput` is generic over `T` and does not use `forwardRef`\n * (generic-+-forwardRef is awkward in TS). Consumers wire RHF via `value` /\n * `onValueChange` props directly. To focus the inner input from a parent, render\n * a wrapping element with `data-tags-input` and call `.querySelector('input').focus()`.\n */\nimport { Check } from 'lucide-react';\nimport * as React from 'react';\nimport { useState, useRef, useCallback, useMemo } from 'react';\nimport { TextButton } from '../buttons';\nimport { Badge } from '../badge';\nimport { Stack } from '../structure';\nimport { Text } from '../../typography';\nimport { textSizes } from '../../typography/text.styles';\nimport { useDensityConfig, useTypographyConfig } from '../../../lib/ui-provider';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\nimport { editableTextSizeClasses } from '../../../lib/editable-text-recipe';\nimport { focusRecipes } from '../../../lib/focus-recipes';\nimport { Popover, PopoverContent } from '../popover';\nimport { collectionRecipes, collectionRowClasses } from '../popover/popover.recipes';\nimport { CollectionLabel } from '../popover/collection-content';\nimport { FieldClearGlyph, fieldAffordanceRecipes } from '../../../lib/field-affordance-recipes';\nimport {\n\tformControlHorizontalPaddingClasses,\n\tformControlMinHeightClasses,\n\tresolveFormControlSize,\n} from '../forms/form-sizing';\n\nexport interface TagsInputStrings {\n\tplaceholder: string;\n\temptyRecommendations: string;\n\tclearAll: string;\n\t/** Summary line shown when `maxTags` + `showMaxTags` are set. Receives\n\t * `current` (number of tags entered) and `max` (the limit). The\n\t * default is English `\"{current} / {max} tags\"` — override for i18n. */\n\tsummary: (current: number, max: number) => string;\n\t/** Accessible name of a tag's remove action. Defaults to `\"Remove {tag}\"`. */\n\tremoveTag?: (tag: string) => string;\n\t/**\n\t * Announced when a commit leaves entries it could not add (too short or\n\t * long, duplicate, refused by `validate`, or over `maxTags`). Receives the\n\t * rejected entries joined with commas. Defaults to `\"Not added: {entries}.\"`.\n\t */\n\tnotAdded?: (entries: string) => string;\n\t/** Accessible name of the recommendation list. Defaults to `\"Suggested tags\"`. */\n\trecommendationsLabel?: string;\n}\n\nexport const defaultTagsInputStrings: TagsInputStrings = {\n\tplaceholder: 'Add a tag…',\n\temptyRecommendations: 'No recommendations found.',\n\tclearAll: 'Clear all',\n\tsummary: (current, max) => `${current} / ${max} tags`,\n\tremoveTag: (tag) => `Remove ${tag}`,\n\tnotAdded: (entries) => `Not added: ${entries}.`,\n\trecommendationsLabel: 'Suggested tags',\n};\n\nexport interface TagsInputProps<T = string> {\n\t/** Ref to the editable input, for focus and form registration. */\n\tinputRef?: React.Ref<HTMLInputElement>;\n\t/** Native blur callback, emitted even when there is no draft to commit. */\n\tonBlur?: React.FocusEventHandler<HTMLInputElement>;\n\t/** ID of the editable input, for an external field label. */\n\tid?: string;\n\t/** Names the editable input when no visible label points at it. */\n\t'aria-label'?: string;\n\t/** IDs of the elements that label the editable input. */\n\t'aria-labelledby'?: string;\n\t/** Additional supporting/error descriptions associated with the editable control. */\n\t'aria-describedby'?: string;\n\t/** Marks the field invalid, like `invalid`; a FormField or form library may inject it. */\n\t'aria-invalid'?: boolean | 'true' | 'false';\n\t/** Marks the editable input as required for assistive tech. */\n\t'aria-required'?: boolean | 'true' | 'false';\n\n\t\t/** Current value (array of T). Pass it to control the field. */\n\t\tvalue?: T[];\n\n\t\t/** Initial value when uncontrolled. Ignored when `value` is set. */\n\t\tdefaultValue?: T[];\n\n\t\t/** Callback when value changes */\n\t\tonValueChange?: (value: T[]) => void;\n\n\t\t/** Form field name. Each tag is serialised as a hidden `name[]` input (its display value), disabled with the field. */\n\t\tname?: string;\n\n\t\t/** Placeholder text for the input, shown while there are no tags. */\n\t\tplaceholder?: string;\n\n\t\t/** Array of recommendations to suggest */\n\t\trecommendations?: Array<T | { value: T; label: string }>;\n\n\t\t/** Maximum number of tags allowed. Entry is refused and announced once it is reached; the input stays focusable. */\n\t\tmaxTags?: number;\n\n\t\t/** Shows the `strings.summary` count under the field. Requires `maxTags`. */\n\t\tshowMaxTags?: boolean;\n\n\t\t/** Whether duplicate tags are allowed */\n\t\tallowDuplicates?: boolean;\n\n\t\t/** Custom validation function. Runs after the length, limit and duplicate checks. */\n\t\tvalidate?: (value: T) => boolean;\n\n\t\t/** Whether the input is disabled */\n\t\tdisabled?: boolean;\n\n\t\t/** Shows a clear-all action under the field while there are tags. */\n\t\tshowClearAll?: boolean;\n\n\t\t/**\n\t\t * Custom tag component. `index` is the tag's position in the value, and\n\t\t * `onRemove(index)` removes it and moves focus to the neighbouring remove\n\t\t * action (an element with `data-tag-remove`), else the input.\n\t\t */\n\t\trenderTag?: (tag: T, index: number, onRemove: (index: number) => void) => React.ReactNode;\n\n\t\t/** Splits typed and pasted text into several tags. Defaults to a comma or a newline. */\n\t\tdelimiter?: string | RegExp;\n\n\t\t/** Whether to trigger add on blur */\n\t\taddOnBlur?: boolean;\n\n\t\t/** Minimum length for a tag */\n\t\tminLength?: number;\n\n\t\t/** Maximum length for a tag. Longer entries are refused and announced, never truncated. */\n\t\tmaxLength?: number;\n\n\t\t/** Override default English strings (placeholder, empty list, clear-all, announcements). */\n\t\tstrings?: StringsProp<TagsInputStrings>;\n\n\t\t/** Keeps the value sorted by display text as tags are added. */\n\t\tsortTags?: boolean;\n\n\t\t/** Case sensitivity for duplicate checking */\n\t\tcaseSensitive?: boolean;\n\n\t\t/** Field to extract display value from an object (required when T is not string) */\n\t\tfield?: T extends string ? never : keyof T;\n\n\t\t/** Error state for styling (passed from FormField) */\n\t\tinvalid?: boolean;\n\n\t\t/** Additional class names */\n\t\tclassName?: string;\n}\n\ntype NormalizedRecommendation<T> = { key: string; value: T; label: string };\n\nfunction isTrue(value: boolean | 'true' | 'false' | undefined): boolean {\n\treturn value === true || value === 'true';\n}\n\nexport function TagsInput<T = string>({\n\t\tid,\n\t\tinputRef: forwardedInputRef,\n\t\tonBlur,\n\t\t'aria-label': ariaLabel,\n\t\t'aria-labelledby': ariaLabelledBy,\n\t\t'aria-describedby': ariaDescribedBy,\n\t\t'aria-invalid': ariaInvalid,\n\t\t'aria-required': ariaRequired,\n\t\tvalue,\n\t\tdefaultValue,\n\t\tonValueChange,\n\t\tname,\n\t\tplaceholder,\n\t\trecommendations,\n\t\tmaxTags,\n\t\tshowMaxTags = false,\n\t\tallowDuplicates = false,\n\t\tvalidate,\n\t\tdisabled = false,\n\t\tshowClearAll = false,\n\t\trenderTag,\n\t\tdelimiter = /[\\n,]/,\n\t\taddOnBlur = true,\n\t\tminLength = 1,\n\t\tmaxLength,\n\t\tsortTags = false,\n\t\tcaseSensitive = false,\n\t\tfield,\n\t\tinvalid,\n\t\tclassName,\n\t\tstrings: stringsProp,\n}: TagsInputProps<T>) {\n\t\tconst { defaultTextSize } = useTypographyConfig();\n\t\tconst { defaultScale } = useDensityConfig();\n\t\tconst size = resolveFormControlSize(undefined, defaultScale);\n\t\tconst placeholderStrings = useStrings(\n\t\t\t\tdefaultTagsInputStrings,\n\t\t\t\tplaceholder !== undefined ? { placeholder } : undefined,\n\t\t);\n\t\tconst strings = useStrings(placeholderStrings, stringsProp);\n\t\tconst isControlled = value !== undefined;\n\t\tconst [internalValue, setInternalValue] = useState<T[]>(() => defaultValue ?? []);\n\t\tconst tags = value ?? internalValue;\n\t\tconst [draft, setDraft] = useState('');\n\t\t// What a commit could not add stays in the draft, marks the field invalid\n\t\t// until it is edited, and is announced through the polite status region.\n\t\tconst [rejectedDraft, setRejectedDraft] = useState<string | null>(null);\n\t\tconst [announcement, setAnnouncement] = useState('');\n\t\tconst [open, setOpen] = useState(false);\n\t\tconst [selectedIndex, setSelectedIndex] = useState(-1);\n\t\t// Display position of a chip removed through its remove action; focus\n\t\t// moves once the removal has rendered.\n\t\tconst [refocusPosition, setRefocusPosition] = useState<number | null>(null);\n\t\tconst inputRef = useRef<HTMLInputElement>(null);\n\t\tconst shellRef = useRef<HTMLDivElement>(null);\n\t\tconst listId = React.useId();\n\t\tconst countId = React.useId();\n\t\tconst atLimit = maxTags !== undefined && tags.length >= maxTags;\n\t\tconst hasRecommendations = Boolean(recommendations?.length);\n\n\t\t// Helper function to get display value from tag\n\t\tconst getDisplayValue = useCallback(\n\t\t\t\t(tag: T): string => {\n\t\t\t\t\t\tif (typeof tag === 'string') {\n\t\t\t\t\t\t\t\treturn tag;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (field && typeof tag === 'object' && tag !== null) {\n\t\t\t\t\t\t\t\tconst record = tag as Record<string | number | symbol, unknown>;\n\t\t\t\t\t\t\t\tconst candidate = record[field];\n\t\t\t\t\t\t\t\tif (typeof candidate === 'string') {\n\t\t\t\t\t\t\t\t\t\treturn candidate;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (candidate === undefined || candidate === null) {\n\t\t\t\t\t\t\t\t\t\treturn '';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn String(candidate);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn String(tag);\n\t\t\t\t},\n\t\t\t\t[field]\n\t\t);\n\n\t\t// Typed text becomes an object tag whenever `field` names its display key,\n\t\t// so the first tag of an empty object list is an object too.\n\t\tconst createTagFromString = useCallback(\n\t\t\t\t(input: string): T => (field ? ({ [field]: input } as T) : (input as T)),\n\t\t\t\t[field]\n\t\t);\n\n\t\tconst normalizeText = useCallback(\n\t\t\t\t(text: string) => (caseSensitive ? text : text.toLowerCase()),\n\t\t\t\t[caseSensitive]\n\t\t);\n\n\t\tconst isDuplicate = useCallback(\n\t\t\t\t(text: string, list: T[]) => {\n\t\t\t\t\t\tconst candidate = normalizeText(text);\n\t\t\t\t\t\treturn list.some((tag) => normalizeText(getDisplayValue(tag)) === candidate);\n\t\t\t\t},\n\t\t\t\t[normalizeText, getDisplayValue]\n\t\t);\n\n\t\t// Normalize recommendations to always be objects, with keys that stay\n\t\t// unique even when two recommendations share a label.\n\t\tconst normalizedRecommendations = useMemo((): NormalizedRecommendation<T>[] => {\n\t\t\t\tif (!recommendations) return [];\n\t\t\t\treturn recommendations.map((rec, index) => {\n\t\t\t\t\t\tif (rec && typeof rec === 'object' && 'value' in rec && 'label' in rec) {\n\t\t\t\t\t\t\t\tconst entry = rec as { value: T; label: string };\n\t\t\t\t\t\t\t\treturn { key: `${index}:${entry.label}`, value: entry.value, label: entry.label };\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst label = getDisplayValue(rec as T);\n\t\t\t\t\t\treturn { key: `${index}:${label}`, value: rec as T, label };\n\t\t\t\t});\n\t\t}, [recommendations, getDisplayValue]);\n\n\t\t// Picked recommendations leave the list (unless duplicates are allowed),\n\t\t// with or without a search term, so choosing one always adds a tag.\n\t\tconst filteredRecommendations = useMemo(() => {\n\t\t\t\tif (!normalizedRecommendations.length) return normalizedRecommendations;\n\t\t\t\tconst search = normalizeText(draft.trim());\n\t\t\t\tconst existingValues = new Set(tags.map((tag) => normalizeText(getDisplayValue(tag))));\n\n\t\t\t\treturn normalizedRecommendations.filter((rec) => {\n\t\t\t\t\t\tconst display = normalizeText(getDisplayValue(rec.value));\n\t\t\t\t\t\tif (!allowDuplicates && existingValues.has(display)) return false;\n\t\t\t\t\t\tif (!search) return true;\n\t\t\t\t\t\treturn normalizeText(rec.label).includes(search) || display.includes(search);\n\t\t\t\t});\n\t\t}, [normalizedRecommendations, draft, tags, allowDuplicates, normalizeText, getDisplayValue]);\n\n\t\tconst popupOpen = open && !disabled && hasRecommendations && !atLimit;\n\t\tconst activeIndex = popupOpen && selectedIndex >= 0 && selectedIndex < filteredRecommendations.length ? selectedIndex : -1;\n\n\t\tconst sortList = useCallback(\n\t\t\t\t(list: T[]) => [...list].sort((a, b) => getDisplayValue(a).localeCompare(getDisplayValue(b))),\n\t\t\t\t[getDisplayValue]\n\t\t);\n\n\t\tconst commit = useCallback(\n\t\t\t\t(next: T[]) => {\n\t\t\t\t\t\tif (!isControlled) setInternalValue(next);\n\t\t\t\t\t\tonValueChange?.(next);\n\t\t\t\t},\n\t\t\t\t[isControlled, onValueChange]\n\t\t);\n\n\t\t/**\n\t\t * Adds every acceptable candidate in one commit. Each check runs against the\n\t\t * list as it accumulates, so a paste cannot slip duplicates or extra tags\n\t\t * past `maxTags`. Returns the rejected entries, trimmed.\n\t\t */\n\t\tconst addMany = useCallback(\n\t\t\t\t(candidates: Array<string | T>): string[] => {\n\t\t\t\t\t\tlet next = [...tags];\n\t\t\t\t\t\tconst rejected: string[] = [];\n\t\t\t\t\t\tfor (const raw of candidates) {\n\t\t\t\t\t\t\t\tconst isText = typeof raw === 'string';\n\t\t\t\t\t\t\t\tconst text = (isText ? raw : getDisplayValue(raw)).trim();\n\t\t\t\t\t\t\t\tif (!text) continue;\n\t\t\t\t\t\t\t\tconst tag = isText ? createTagFromString(text) : raw;\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\ttext.length < minLength ||\n\t\t\t\t\t\t\t\t\t\t(maxLength !== undefined && text.length > maxLength) ||\n\t\t\t\t\t\t\t\t\t\t(maxTags !== undefined && next.length >= maxTags) ||\n\t\t\t\t\t\t\t\t\t\t(!allowDuplicates && isDuplicate(text, next)) ||\n\t\t\t\t\t\t\t\t\t\t(validate && !validate(tag))\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\trejected.push(text);\n\t\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tnext.push(tag);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (next.length !== tags.length) {\n\t\t\t\t\t\t\t\tif (sortTags) next = sortList(next);\n\t\t\t\t\t\t\t\tcommit(next);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn rejected;\n\t\t\t\t},\n\t\t\t\t[tags, getDisplayValue, createTagFromString, minLength, maxLength, maxTags, allowDuplicates, isDuplicate, validate, sortTags, sortList, commit]\n\t\t);\n\n\t\tconst submit = useCallback(\n\t\t\t\t(candidates: Array<string | T>) => {\n\t\t\t\t\t\tconst rejected = addMany(candidates);\n\t\t\t\t\t\tconst rest = rejected.join(typeof delimiter === 'string' ? delimiter : ', ');\n\t\t\t\t\t\tsetDraft(rest);\n\t\t\t\t\t\tsetRejectedDraft(rest || null);\n\t\t\t\t\t\tsetAnnouncement(rejected.length ? (strings.notAdded ?? defaultTagsInputStrings.notAdded!)(rejected.join(', ')) : '');\n\t\t\t\t\t\tsetOpen(false);\n\t\t\t\t\t\tsetSelectedIndex(-1);\n\t\t\t\t},\n\t\t\t\t[addMany, delimiter, strings]\n\t\t);\n\n\t\t// Keys count earlier tags with the same text, so a chip keeps its identity\n\t\t// when another chip is removed.\n\t\tconst entries = useMemo(() => {\n\t\t\t\tconst seen = new Map<string, number>();\n\t\t\t\treturn tags.map((tag, index) => {\n\t\t\t\t\t\tconst display = getDisplayValue(tag);\n\t\t\t\t\t\tconst occurrence = seen.get(display) ?? 0;\n\t\t\t\t\t\tseen.set(display, occurrence + 1);\n\t\t\t\t\t\treturn { tag, index, display, key: `${display}::${occurrence}` };\n\t\t\t\t});\n\t\t}, [tags, getDisplayValue]);\n\n\t\t// Chips follow the stored order. A sorted field already stores sorted\n\t\t// tags; a controlled value supplied unsorted still displays sorted, and\n\t\t// each chip keeps its stored index so removal targets the right tag.\n\t\tconst displayEntries = useMemo(\n\t\t\t\t() => (sortTags ? [...entries].sort((a, b) => a.display.localeCompare(b.display)) : entries),\n\t\t\t\t[entries, sortTags]\n\t\t);\n\n\t\tconst removeTag = useCallback(\n\t\t\t\t(index: number) => {\n\t\t\t\t\t\tcommit(tags.filter((_, i) => i !== index));\n\t\t\t\t},\n\t\t\t\t[tags, commit]\n\t\t);\n\n\t\t// After a remove, focus goes to the remove action now in the removed\n\t\t// chip's place, else the one before it, else the input. It moves in the\n\t\t// commit that renders the removal, so it never lands after the user has\n\t\t// moved on.\n\t\tconst removeAndRefocus = useCallback(\n\t\t\t\t(index: number) => {\n\t\t\t\t\t\tsetRefocusPosition(Math.max(0, displayEntries.findIndex((entry) => entry.index === index)));\n\t\t\t\t\t\tremoveTag(index);\n\t\t\t\t},\n\t\t\t\t[displayEntries, removeTag]\n\t\t);\n\n\t\tReact.useLayoutEffect(() => {\n\t\t\t\tif (refocusPosition === null) return;\n\t\t\t\tsetRefocusPosition(null);\n\t\t\t\tconst buttons = shellRef.current?.querySelectorAll<HTMLElement>('[data-tag-remove]:not(:disabled)');\n\t\t\t\tconst next = buttons && buttons.length > 0 ? buttons[Math.min(refocusPosition, buttons.length - 1)] : undefined;\n\t\t\t\t(next ?? inputRef.current)?.focus();\n\t\t}, [refocusPosition]);\n\n\t\tconst handleInputChange = useCallback(\n\t\t\t\t(e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\t\t\t\tconst nextDraft = e.target.value;\n\t\t\t\t\t\t// A typed delimiter commits, as a pasted one does.\n\t\t\t\t\t\tif (nextDraft.split(delimiter).length > 1) {\n\t\t\t\t\t\t\t\tsubmit(nextDraft.split(delimiter));\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetDraft(nextDraft);\n\t\t\t\t\t\tsetRejectedDraft(null);\n\t\t\t\t\t\tsetSelectedIndex(-1);\n\n\t\t\t\t\t\tif (hasRecommendations) {\n\t\t\t\t\t\t\t\tsetOpen(true);\n\t\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t[delimiter, submit, hasRecommendations]\n\t\t);\n\n\t\tconst handleKeyDown = useCallback(\n\t\t\t\t(e: React.KeyboardEvent<HTMLInputElement>) => {\n\t\t\t\t\t\tif (disabled) return;\n\t\t\t\t\t\t// Enter that confirms an IME composition is not a commit.\n\t\t\t\t\t\tif (e.nativeEvent.isComposing || e.keyCode === 229) return;\n\n\t\t\t\t\t\tif (e.key === 'Enter') {\n\t\t\t\t\t\t\t\t// The field usually sits in a form; Enter here means \"commit this tag\".\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\tif (activeIndex >= 0) {\n\t\t\t\t\t\t\t\t\t\tsubmit([filteredRecommendations[activeIndex].value]);\n\t\t\t\t\t\t\t\t} else if (draft.trim()) {\n\t\t\t\t\t\t\t\t\t\tsubmit(draft.split(delimiter));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (e.key === 'ArrowDown') {\n\t\t\t\t\t\t\t\tif (popupOpen) {\n\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\tsetSelectedIndex((prev) => (prev < filteredRecommendations.length - 1 ? prev + 1 : prev));\n\t\t\t\t\t\t\t\t} else if (hasRecommendations && !atLimit && filteredRecommendations.length > 0) {\n\t\t\t\t\t\t\t\t\t\tsetOpen(true);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (e.key === 'ArrowUp') {\n\t\t\t\t\t\t\t\tif (popupOpen) {\n\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\tsetSelectedIndex((prev) => (prev > 0 ? prev - 1 : 0));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (e.key === 'Escape') {\n\t\t\t\t\t\t\t\tsetOpen(false);\n\t\t\t\t\t\t\t\tsetSelectedIndex(-1);\n\t\t\t\t\t\t} else if (e.key === 'Backspace' && draft === '' && displayEntries.length > 0) {\n\t\t\t\t\t\t\t\t// Backspace on an empty draft removes the last chip shown.\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\tremoveTag(displayEntries[displayEntries.length - 1].index);\n\t\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t[disabled, activeIndex, filteredRecommendations, submit, draft, delimiter, popupOpen, hasRecommendations, atLimit, displayEntries, removeTag]\n\t\t);\n\n\t\tconst handlePaste = useCallback(\n\t\t\t\t(e: React.ClipboardEvent<HTMLInputElement>) => {\n\t\t\t\t\t\tif (disabled) return;\n\t\t\t\t\t\tconst text = e.clipboardData.getData('text');\n\t\t\t\t\t\tif (!text) return;\n\t\t\t\t\t\tconst start = e.currentTarget.selectionStart ?? draft.length;\n\t\t\t\t\t\tconst end = e.currentTarget.selectionEnd ?? start;\n\t\t\t\t\t\tconst parts = `${draft.slice(0, start)}${text}${draft.slice(end)}`.split(delimiter);\n\t\t\t\t\t\t// A single token pastes natively into the draft, at the caret.\n\t\t\t\t\t\tif (parts.length <= 1) return;\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tsubmit(parts);\n\t\t\t\t},\n\t\t\t\t[disabled, draft, delimiter, submit]\n\t\t);\n\n\t\tconst handleBlur = useCallback((event: React.FocusEvent<HTMLInputElement>) => {\n\t\t\t\tsetOpen(false);\n\t\t\t\tsetSelectedIndex(-1);\n\t\t\t\t// Commit before blur observers validate the field's current array.\n\t\t\t\t// An unchanged rejected draft is not re-submitted (or re-announced).\n\t\t\t\tif (addOnBlur && !disabled && draft.trim() && draft !== rejectedDraft) {\n\t\t\t\t\tsubmit(draft.split(delimiter));\n\t\t\t\t}\n\t\t\t\tonBlur?.(event);\n\t\t}, [addOnBlur, disabled, draft, rejectedDraft, delimiter, submit, onBlur]);\n\n\t\tconst clearAll = useCallback(() => {\n\t\t\t\tcommit([]);\n\t\t\t\tsetDraft('');\n\t\t\t\tsetRejectedDraft(null);\n\t\t\t\tsetAnnouncement('');\n\t\t\t\tinputRef.current?.focus();\n\t\t}, [commit]);\n\n\t\tconst removeLabel = strings.removeTag ?? defaultTagsInputStrings.removeTag!;\n\t\tconst badgeSize = size === 'sm' ? 'sm' : 'md';\n\n\t\tconst defaultRenderTag = (tag: T, index: number, onRemove: (index: number) => void) => {\n\t\t\t\tconst display = getDisplayValue(tag);\n\t\t\t\treturn (\n\t\t\t\t\t\t<Badge tone=\"secondary\" size={badgeSize} className={cn('tags-input--component tags-input--tag', 'max-w-full gap-space-xs pe-space-xs')}>\n\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" weight=\"normal\" lineHeight=\"none\" className=\"min-w-0 truncate text-inherit\">\n\t\t\t\t\t\t\t\t\t\t{display}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t{/* The chip owns its chrome, so its remove action is the shared\n\t\t\t\t\t\t\t\t content-sized affordance and never inflates the chip; the\n\t\t\t\t\t\t\t\t pseudo-element extends its hit area past the glyph. */}\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tdata-tag-remove=\"\"\n\t\t\t\t\t\t\t\t\t\taria-label={removeLabel(display)}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t'tags-input--tag-remove relative after:absolute after:-inset-space-xs',\n\t\t\t\t\t\t\t\t\t\t\t\tfieldAffordanceRecipes.inline,\n\t\t\t\t\t\t\t\t\t\t\t\tfocusRecipes.edge,\n\t\t\t\t\t\t\t\t\t\t\t\tfieldAffordanceRecipes.clear,\n\t\t\t\t\t\t\t\t\t\t\t\t'disabled:pointer-events-none disabled:cursor-not-allowed',\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\tonClick={() => onRemove(index)}\n\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<FieldClearGlyph className={fieldAffordanceRecipes.icon} aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</Badge>\n\t\t\t\t);\n\t\t};\n\n\t\tconst fieldInvalid = Boolean(invalid) || isTrue(ariaInvalid);\n\t\tconst inputInvalid = fieldInvalid || rejectedDraft !== null;\n\t\tconst overLimit = maxTags !== undefined && tags.length > maxTags;\n\t\tconst countMax = showMaxTags ? maxTags : undefined;\n\t\tconst showCount = countMax !== undefined;\n\t\tconst showClear = showClearAll && tags.length > 0;\n\t\tconst describedBy = [ariaDescribedBy, showCount ? countId : undefined].filter(Boolean).join(' ') || undefined;\n\n\t\treturn (\n\t\t\t\t<Stack gap=\"xs\" className={cn('tags-input--root w-full relative', className)}>\n\t\t\t\t\t\t<span role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" className=\"tags-input--status sr-only\">\n\t\t\t\t\t\t\t\t{announcement}\n\t\t\t\t\t\t</span>\n\n\t\t\t\t\t\t{/* One hidden input per tag (`name[]`), so a plain form serialises the list. */}\n\t\t\t\t\t\t{!!name && entries.map((entry) => (\n\t\t\t\t\t\t\t\t<input key={entry.key} type=\"hidden\" name={`${name}[]`} value={entry.display} disabled={disabled} />\n\t\t\t\t\t\t))}\n\n\t\t\t\t\t\t<Popover open={popupOpen} onOpenChange={(next, details) => {\n\t\t\t\t\t\t\t// The field shell, including its editable anchor, keeps the\n\t\t\t\t\t\t\t// suggestions open while the user works inside it.\n\t\t\t\t\t\t\tif (!next && details.reason === 'outside-press' && details.event.target instanceof Node && shellRef.current?.contains(details.event.target)) return;\n\t\t\t\t\t\t\tsetOpen(next);\n\t\t\t\t\t\t\tif (!next) setSelectedIndex(-1);\n\t\t\t\t\t\t}}>\n\t\t\t\t\t\t\t{/* The chips occupy most of the field; clicking a gap still types. */}\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tref={shellRef}\n\t\t\t\t\t\t\t\t\tdata-slot=\"tags-input-field\"\n\t\t\t\t\t\t\t\t\tdata-disabled={disabled || undefined}\n\t\t\t\t\t\t\t\t\taria-invalid={inputInvalid || undefined}\n\t\t\t\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\t\t\t\t\tif (event.target instanceof Element && event.target.closest('button, a, input')) return;\n\t\t\t\t\t\t\t\t\t\t\tinputRef.current?.focus();\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t'tags-input--field',\n\t\t\t\t\t\t\t\t\t\t\t'box-border flex w-full min-w-0 cursor-text flex-wrap items-center rounded-inner border border-input bg-transparent font-sans text-foreground shadow-none outline-none transition-[color,box-shadow]',\n\t\t\t\t\t\t\t\t\t\t\tformControlMinHeightClasses[size],\n\t\t\t\t\t\t\t\t\t\t\tformControlHorizontalPaddingClasses[size],\n\t\t\t\t\t\t\t\t\t\t\t// The block inset follows density only: --space-scale never changes a control's height.\n\t\t\t\t\t\t\t\t\t\t\tsize === 'lg' ? 'gap-space-sm' : 'gap-space-xs',\n\t\t\t\t\t\t\t\t\t\t\t'py-[calc(0.25rem*var(--density-scale))]',\n\t\t\t\t\t\t\t\t\t\t\t'has-[input:focus-visible]:border-ring has-[input:focus-visible]:ring-3 has-[input:focus-visible]:ring-ring/50',\n\t\t\t\t\t\t\t\t\t\t\t'aria-invalid:border-destructive aria-invalid:has-[input:focus-visible]:border-destructive aria-invalid:has-[input:focus-visible]:ring-destructive/30 dark:aria-invalid:has-[input:focus-visible]:ring-destructive/50',\n\t\t\t\t\t\t\t\t\t\t\t'data-disabled:cursor-not-allowed data-disabled:opacity-50',\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{displayEntries.map((entry) => (\n\t\t\t\t\t\t\t\t\t\t\t<React.Fragment key={entry.key}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{renderTag\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? renderTag(entry.tag, entry.index, removeAndRefocus)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: defaultRenderTag(entry.tag, entry.index, removeAndRefocus)}\n\t\t\t\t\t\t\t\t\t\t\t</React.Fragment>\n\t\t\t\t\t\t\t\t\t))}\n\n\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\t\tref={(node) => {\n\t\t\t\t\t\t\t\t\t\t\t\tinputRef.current = node;\n\t\t\t\t\t\t\t\t\t\t\t\tif (typeof forwardedInputRef === 'function') forwardedInputRef(node);\n\t\t\t\t\t\t\t\t\t\t\t\telse if (forwardedInputRef) forwardedInputRef.current = node;\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tid={id}\n\t\t\t\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t\t\t\tdata-slot=\"tags-input-control\"\n\t\t\t\t\t\t\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\t\t\t\t\t\t\taria-labelledby={ariaLabelledBy}\n\t\t\t\t\t\t\t\t\t\t\taria-describedby={describedBy}\n\t\t\t\t\t\t\t\t\t\t\taria-invalid={inputInvalid || undefined}\n\t\t\t\t\t\t\t\t\t\t\taria-required={ariaRequired}\n\t\t\t\t\t\t\t\t\t\t\trole={recommendations ? 'combobox' : undefined}\n\t\t\t\t\t\t\t\t\t\t\taria-autocomplete={recommendations ? 'list' : undefined}\n\t\t\t\t\t\t\t\t\t\t\taria-expanded={recommendations ? popupOpen : undefined}\n\t\t\t\t\t\t\t\t\t\t\taria-controls={popupOpen ? listId : undefined}\n\t\t\t\t\t\t\t\t\t\t\taria-activedescendant={activeIndex >= 0 ? `${listId}-${activeIndex}` : undefined}\n\t\t\t\t\t\t\t\t\t\t\tplaceholder={tags.length === 0 ? strings.placeholder : undefined}\n\t\t\t\t\t\t\t\t\t\t\tvalue={draft}\n\t\t\t\t\t\t\t\t\t\t\tonChange={handleInputChange}\n\t\t\t\t\t\t\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t\t\t\t\t\t\tonPaste={handlePaste}\n\t\t\t\t\t\t\t\t\t\t\tonBlur={handleBlur}\n\t\t\t\t\t\t\t\t\t\t\tonFocus={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (hasRecommendations && !atLimit && filteredRecommendations.length > 0) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetOpen(true);\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'tags-input--input',\n\t\t\t\t\t\t\t\t\t\t\t\t\t'box-border min-w-20 flex-1 border-0 bg-transparent p-0 font-sans text-foreground outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed',\n\t\t\t\t\t\t\t\t\t\t\t\t\teditableTextSizeClasses[size],\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t{/* Shared collection presentation keeps the input-owned\n\t\t\t\t\t\t\t\t\t\tkeyboard handler (selectedIndex, arrow navigation). */}\n\t\t\t\t\t\t\t\t{!!recommendations && (\n\t\t\t\t\t\t\t\t\t\t<PopoverContent\n\t\t\t\t\t\t\t\t\t\t\tanchor={shellRef}\n\t\t\t\t\t\t\t\t\t\t\talign=\"start\"\n\t\t\t\t\t\t\t\t\t\t\ttype=\"menu\"\n\t\t\t\t\t\t\t\t\t\t\tinitialFocus={false}\n\t\t\t\t\t\t\t\t\t\t\tfinalFocus={false}\n\t\t\t\t\t\t\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\t\t\t\t\t\t\tid={listId}\n\t\t\t\t\t\t\t\t\t\t\taria-label={strings.recommendationsLabel ?? defaultTagsInputStrings.recommendationsLabel}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"tags-input--recommendations w-(--anchor-width) max-h-[200px]\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t\t\t{filteredRecommendations.length > 0 ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tfilteredRecommendations.map((rec, idx) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst isPicked = tags.some(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(tag) => getDisplayValue(tag) === getDisplayValue(rec.value),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={rec.key}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tid={`${listId}-${idx}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-selected={activeIndex === idx}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonPointerDown={(e) => e.preventDefault()}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsubmit([rec.value]);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tinputRef.current?.focus();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonMouseEnter={() => setSelectedIndex(idx)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\tcollectionRecipes.interactive,\n\t\t\t\t\t\t\t\t\t\t\tcollectionRowClasses(),\n\t\t\t\t\t\t\t\t\t\t\ttextSizes[defaultTextSize ?? 'sm'],\n\t\t\t\t\t\t\t\t\t\t\t'box-border w-full cursor-pointer justify-between border-0 bg-transparent font-sans text-foreground',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'hover:bg-accent hover:text-accent-foreground',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'focus-visible:outline-none',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tactiveIndex === idx && 'bg-accent text-accent-foreground',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<CollectionLabel>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{rec.label}\n\t\t\t\t\t\t\t\t\t\t</CollectionLabel>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Check\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'ml-auto size-icon-sm',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisPicked ? 'opacity-100' : 'opacity-0',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"div\" size=\"xs\" type=\"secondary\" className=\"px-row-x py-row-y\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{strings.emptyRecommendations}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</PopoverContent>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Popover>\n\n\t\t\t\t\t\t{(showCount || showClear) && (\n\t\t\t\t\t\t\t\t<div className=\"tags-input--footer flex items-center justify-between gap-space-sm\">\n\t\t\t\t\t\t\t\t\t\t{countMax !== undefined && (\n\t\t\t\t\t\t\t\t\t\t\t\t<Text id={countId} tag=\"span\" size=\"xs\" type={overLimit ? 'error' : 'secondary'} className=\"tags-input--count tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{strings.summary(tags.length, countMax)}\n\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{!!showClear && (\n\t\t\t\t\t\t\t\t\t\t\t\t<TextButton\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={clearAll}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"tags-input--clear ms-auto\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{strings.clearAll}\n\t\t\t\t\t\t\t\t\t\t\t\t</TextButton>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t);\n}\n\nTagsInput.displayName = 'TagsInput';\n","import * as React from 'react';\nimport { useState, useCallback, useMemo, memo } from 'react';\nimport * as baseui from '../../ui/select';\nimport { Text } from '../../typography';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { useDensityConfig } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\nimport { fieldStateRecipes } from '../../../lib/field-state-recipes';\nimport { editableTextSizeClasses } from '../../../lib/editable-text-recipe';\nimport { formControlHorizontalPaddingClasses, formControlSizeClasses, formFieldTriggerClasses, resolveFormControlSize } from '../forms/form-sizing';\nimport { selectToggleRecipes } from '../../../lib/field-affordance-recipes';\nimport { Input, type InputProps } from '../text-inputs';\nimport { SelectPopupContent, SelectPopupGroup, SelectPopupItem } from '../choice-inputs';\n\nexport interface PhoneInputStrings {\n\t\tprefixPlaceholder: string;\n\t\t/** Accessible name for the country-prefix selector. */\n\t\tprefixAriaLabel: string;\n}\n\nexport const defaultPhoneInputStrings: PhoneInputStrings = {\n\t\tprefixPlaceholder: 'Prefix',\n\t\tprefixAriaLabel: 'Country prefix',\n};\n\nexport interface CountryPrefixOption {\n\t\t/** Country code value (e.g., '+1') */\n\t\tvalue: string;\n\n\t\t/** Display label (e.g., 'Bulgaria') */\n\t\tlabel: string;\n\n\t\t/** ISO country code (e.g., 'US') */\n\t\tiso: string;\n}\n\n/** Country data mapped by ISO code */\nexport const COUNTRY_PREFIX_MAP: Record<string, CountryPrefixOption> = {\n\t\tUS: { value: '+1', label: 'United States', iso: 'US' },\n\t\tCA: { value: '+1', label: 'Canada', iso: 'CA' },\n\t\tAU: { value: '+61', label: 'Australia', iso: 'AU' },\n\t\tBG: { value: '+359', label: 'Bulgaria', iso: 'BG' },\n\t\tGR: { value: '+30', label: 'Greece', iso: 'GR' },\n\t\tGB: { value: '+44', label: 'United Kingdom', iso: 'GB' },\n\t\tDE: { value: '+49', label: 'Germany', iso: 'DE' },\n\t\tFR: { value: '+33', label: 'France', iso: 'FR' },\n\t\tIT: { value: '+39', label: 'Italy', iso: 'IT' },\n\t\tES: { value: '+34', label: 'Spain', iso: 'ES' },\n\t\tNL: { value: '+31', label: 'Netherlands', iso: 'NL' },\n\t\tBE: { value: '+32', label: 'Belgium', iso: 'BE' },\n\t\tAT: { value: '+43', label: 'Austria', iso: 'AT' },\n\t\tCH: { value: '+41', label: 'Switzerland', iso: 'CH' },\n\t\tPL: { value: '+48', label: 'Poland', iso: 'PL' },\n\t\tRO: { value: '+40', label: 'Romania', iso: 'RO' },\n\t\tRS: { value: '+381', label: 'Serbia', iso: 'RS' },\n\t\tHR: { value: '+385', label: 'Croatia', iso: 'HR' },\n\t\tSI: { value: '+386', label: 'Slovenia', iso: 'SI' },\n\t\tMK: { value: '+389', label: 'North Macedonia', iso: 'MK' },\n\t\tTR: { value: '+90', label: 'Turkey', iso: 'TR' },\n\t\tRU: { value: '+7', label: 'Russia', iso: 'RU' },\n\t\tUA: { value: '+380', label: 'Ukraine', iso: 'UA' },\n\t\tSK: { value: '+421', label: 'Slovakia', iso: 'SK' },\n\t\tCZ: { value: '+420', label: 'Czech Republic', iso: 'CZ' },\n\t\tHU: { value: '+36', label: 'Hungary', iso: 'HU' },\n\t\tPT: { value: '+351', label: 'Portugal', iso: 'PT' },\n\t\tIE: { value: '+353', label: 'Ireland', iso: 'IE' },\n\t\tSE: { value: '+46', label: 'Sweden', iso: 'SE' },\n\t\tNO: { value: '+47', label: 'Norway', iso: 'NO' },\n\t\tDK: { value: '+45', label: 'Denmark', iso: 'DK' },\n\t\tFI: { value: '+358', label: 'Finland', iso: 'FI' },\n\t\tCY: { value: '+357', label: 'Cyprus', iso: 'CY' },\n\t\tAL: { value: '+355', label: 'Albania', iso: 'AL' },\n\t\tME: { value: '+382', label: 'Montenegro', iso: 'ME' },\n\t\tBA: { value: '+387', label: 'Bosnia and Herzegovina', iso: 'BA' },\n\t\tXK: { value: '+383', label: 'Kosovo', iso: 'XK' },\n\t\tMD: { value: '+373', label: 'Moldova', iso: 'MD' },\n\t\tBY: { value: '+375', label: 'Belarus', iso: 'BY' },\n\t\tLT: { value: '+370', label: 'Lithuania', iso: 'LT' },\n\t\tLV: { value: '+371', label: 'Latvia', iso: 'LV' },\n\t\tEE: { value: '+372', label: 'Estonia', iso: 'EE' },\n};\n\n/** Type for prefix input - either ISO code string or full option object */\nexport type CountryPrefixInput = string | CountryPrefixOption;\n\n/** Default country prefixes - commonly used codes */\nexport const DEFAULT_COUNTRY_PREFIXES: CountryPrefixInput[] = ['US', 'CA', 'GB', 'DE', 'FR', 'IT', 'ES', 'AU'];\n\n/**\n * Normalize prefix input to CountryPrefixOption\n * Accepts either ISO code ('US') or full object ({ value: '+1', label: 'United States', iso: 'US' })\n */\nconst normalizePrefixInput = (input: CountryPrefixInput): CountryPrefixOption | null => {\n\t\tif (typeof input === 'string') {\n\t\t\t\t// It's an ISO code - look it up\n\t\t\t\tconst upperInput = input.toUpperCase();\n\t\t\t\treturn COUNTRY_PREFIX_MAP[upperInput] ?? null;\n\t\t}\n\t\t// It's already a full object\n\t\treturn input;\n};\n\n/**\n * Normalize array of prefix inputs to CountryPrefixOption[]\n */\nconst normalizePrefixes = (inputs: CountryPrefixInput[]): CountryPrefixOption[] => {\n\t\treturn inputs.map(normalizePrefixInput).filter((p): p is CountryPrefixOption => p !== null);\n};\n\nexport interface PhoneInputProps extends Omit<InputProps, 'type' | 'startAddon' | 'strings'> {\n\t\t/** Normalize phone number on blur. Defaults to true */\n\t\tnormalizeOnBlur?: boolean;\n\n\t\t/** Current country prefix value (dial code like '+1' or ISO code like 'US') */\n\t\tprefix?: string;\n\n\t\t/** Default prefix if uncontrolled (dial code like '+1' or ISO code like 'US') */\n\t\tdefaultPrefix?: string;\n\n\t\t/** List of available country prefixes - ISO codes ('US', 'GR') or full objects */\n\t\tprefixes?: CountryPrefixInput[];\n\n\t\t/** Callback when prefix changes - returns dial code (e.g., '+1') */\n\t\tonPrefixChange?: (prefix: string) => void;\n\n\t\t/** Disable prefix selection */\n\t\tdisablePrefixSelector?: boolean;\n\n\t\t/** Placeholder for prefix dropdown */\n\t\tprefixPlaceholder?: string;\n\n\t\t/** Width of the prefix dropdown */\n\t\tprefixWidth?: string;\n\n\t\t/** Show country name in dropdown. Defaults to true */\n\t\tshowCountryName?: boolean;\n\n\t\t/** Show prefix in dropdown items. Defaults to true */\n\t\tshowPrefixInDropdown?: boolean;\n\n\t\t/** String overrides (e.g. prefix dropdown placeholder). */\n\t\tstrings?: StringsProp<PhoneInputStrings>;\n}\n\nconst normalizePhone = (value: string, selectedPrefix?: string): string => {\n\t\tlet normalized = value\n\t\t\t\t.trim()\n\t\t\t\t.replace(/\\s+/g, ' ')\n\t\t\t\t.replace(/[^\\d ()+-]/g, '');\n\n\t\t// Strip the selected prefix from the input if the user typed it redundantly\n\t\tif (selectedPrefix && normalized.startsWith(selectedPrefix)) {\n\t\t\t\tnormalized = normalized.slice(selectedPrefix.length).replace(/^[\\s-]+/, '');\n\t\t}\n\n\t\t// Strip leading zero from national numbers when a prefix is selected (e.g., 0877... → 877...)\n\t\tif (selectedPrefix && normalized.startsWith('0')) {\n\t\t\t\tnormalized = normalized.slice(1);\n\t\t}\n\n\t\treturn normalized;\n};\n\n/**\n * Resolve a prefix string (ISO code or dial code) to dial code\n */\nconst resolvePrefixToDialCode = (prefix: string | undefined, normalizedPrefixes: CountryPrefixOption[]): string => {\n\t\tif (!prefix) return normalizedPrefixes[0]?.value ?? '';\n\n\t\t// Check if it's already a dial code (starts with +)\n\t\tif (prefix.startsWith('+')) {\n\t\t\t\treturn prefix;\n\t\t}\n\n\t\t// It's an ISO code - look it up\n\t\tconst upperPrefix = prefix.toUpperCase();\n\t\tconst found = COUNTRY_PREFIX_MAP[upperPrefix];\n\t\treturn found?.value ?? prefix;\n};\n\nfunction PhoneInputImpl(\n\t\t{\n\t\t\t\tnormalizeOnBlur = true,\n\t\t\t\tonBlur,\n\t\t\t\tonChange,\n\t\t\t\tonValueChange,\n\t\t\t\tprefix: controlledPrefix,\n\t\t\t\tdefaultPrefix,\n\t\t\t\tprefixes = DEFAULT_COUNTRY_PREFIXES,\n\t\t\t\tonPrefixChange,\n\t\t\t\tdisablePrefixSelector = false,\n\t\t\t\tprefixPlaceholder,\n\t\t\t\tprefixWidth = 'w-30',\n\t\t\t\tshowCountryName = true,\n\t\t\t\tshowPrefixInDropdown = true,\n\t\t\t\tinvalid,\n\t\t\t\tdisabled,\n\t\t\t\treadOnly,\n\t\t\t\tloading,\n\t\t\t\tclassName,\n\t\t\t\tsize: sizeProp,\n\t\t\t\tstrings: stringsProp,\n\t\t\t\t...props\n\t\t}: PhoneInputProps,\n\t\tforwardedRef: React.ForwardedRef<HTMLInputElement>,\n) {\n\t\tconst { defaultScale } = useDensityConfig();\n\t\tconst size = resolveFormControlSize(sizeProp, defaultScale);\n\t\tconst isDisabled = disabled || loading;\n\t\tconst isLocked = isDisabled || readOnly;\n\t\tconst strings = useStrings(defaultPhoneInputStrings, stringsProp);\n\t\t// Normalize prefix options from mixed input (ISO codes or full objects)\n\t\tconst basePrefixes = useMemo(() => normalizePrefixes(prefixes), [prefixes]);\n\n\t\t// Resolve controlled/default prefix to dial code\n\t\tconst resolvedDefaultPrefix = useMemo(\n\t\t\t\t() => resolvePrefixToDialCode(defaultPrefix, basePrefixes),\n\t\t\t\t[defaultPrefix, basePrefixes]\n\t\t);\n\n\t\t// Internal state for uncontrolled prefix (always stores dial code)\n\t\tconst [internalPrefix, setInternalPrefix] = useState(resolvedDefaultPrefix);\n\t\t// Country identity is distinct from its dial code (US and CA both use +1).\n\t\tconst [selectedIso, setSelectedIso] = useState(() => {\n\t\t\t\tconst initial = controlledPrefix ?? defaultPrefix;\n\t\t\t\treturn initial && !initial.startsWith('+') ? initial.toUpperCase() : basePrefixes.find((option) => option.value === resolvedDefaultPrefix)?.iso;\n\t\t});\n\n\t\t// Determine if prefix is controlled\n\t\tconst isPrefixControlled = controlledPrefix !== undefined;\n\t\tconst selectedPrefix = isPrefixControlled\n\t\t\t\t? resolvePrefixToDialCode(controlledPrefix, basePrefixes)\n\t\t\t\t: internalPrefix;\n\n\t\t/*\n\t\t * The selected dial code has to be representable in the menu, or the\n\t\t * trigger renders blank.\n\t\t *\n\t\t * `DEFAULT_COUNTRY_PREFIXES` is eight countries, while `COUNTRY_PREFIX_MAP`\n\t\t * knows many more. So `defaultPrefix=\"BG\"` resolved to `+359` — correctly —\n\t\t * and then found no option to display, leaving an empty control with no\n\t\t * error. Naming a country the component itself knows about is a reasonable\n\t\t * thing to do, so the option is carried in rather than dropped.\n\t\t */\n\t\tconst normalizedPrefixes = useMemo(() => {\n\t\t\t\tif (!selectedPrefix || basePrefixes.some((option) => option.value === selectedPrefix)) {\n\t\t\t\t\t\treturn basePrefixes;\n\t\t\t\t}\n\t\t\t\tconst known = Object.values(COUNTRY_PREFIX_MAP).find((option) => option.value === selectedPrefix);\n\t\t\t\treturn known ? [known, ...basePrefixes] : basePrefixes;\n\t\t}, [basePrefixes, selectedPrefix]);\n\n\t\t// Find current prefix option for display\n\t\tconst currentPrefixOption = useMemo(\n\t\t\t\t() => normalizedPrefixes.find((p) => p.iso === (controlledPrefix && !controlledPrefix.startsWith('+') ? controlledPrefix.toUpperCase() : selectedIso) && p.value === selectedPrefix)\n\t\t\t\t\t\t?? normalizedPrefixes.find((p) => p.value === selectedPrefix),\n\t\t\t\t[normalizedPrefixes, selectedPrefix, selectedIso, controlledPrefix]\n\t\t);\n\n\t\t// Handle prefix change\n\t\tconst handlePrefixChange = useCallback(\n\t\t\t\t(newPrefix: string | null) => {\n\t\t\t\t\t\tif (newPrefix === null || isLocked) return;\n\t\t\t\t\t\tconst option = normalizedPrefixes.find((item) => item.iso === newPrefix);\n\t\t\t\t\t\tif (!option) return;\n\t\t\t\t\t\tsetSelectedIso(option.iso);\n\t\t\t\t\t\tif (!isPrefixControlled) {\n\t\t\t\t\t\t\t\tsetInternalPrefix(option.value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonPrefixChange?.(option.value);\n\t\t\t\t},\n\t\t\t\t[isPrefixControlled, onPrefixChange, normalizedPrefixes, isLocked]\n\t\t);\n\n\t\t// Handle phone change — strip redundant prefix on every keystroke/autofill\n\t\tconst handleChange: React.ChangeEventHandler<HTMLInputElement> = useCallback(\n\t\t\t\t(event) => {\n\t\t\t\t\t\tif (isLocked) return;\n\n\t\t\t\t\t\tconst raw = event.target.value;\n\n\t\t\t\t\t\t// Strip the selected prefix if the value starts with it (autofill, paste, manual typing)\n\t\t\t\t\t\tif (selectedPrefix && raw.startsWith(selectedPrefix)) {\n\t\t\t\t\t\t\t\tconst stripped = raw.slice(selectedPrefix.length).replace(/^[\\s-]+/, '');\n\t\t\t\t\t\t\t\t// Also strip leading zero from national part\n\t\t\t\t\t\t\t\tconst national = stripped.startsWith('0') ? stripped.slice(1) : stripped;\n\t\t\t\t\t\t\t\tif (national !== raw) {\n\t\t\t\t\t\t\t\t\t\tconst syntheticEvent = {\n\t\t\t\t\t\t\t\t\t\t\t\t...event,\n\t\t\t\t\t\t\t\t\t\t\t\ttarget: { ...event.target, value: national },\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentTarget: { ...event.currentTarget, value: national },\n\t\t\t\t\t\t\t\t\t\t} as unknown as React.ChangeEvent<HTMLInputElement>;\n\t\t\t\t\t\t\t\t\t\tonValueChange?.(national);\n\t\t\t\t\t\t\t\t\t\tonChange?.(syntheticEvent);\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tonValueChange?.(raw);\n\t\t\t\t\t\tonChange?.(event);\n\t\t\t\t},\n\t\t\t\t[isLocked, onChange, onValueChange, selectedPrefix]\n\t\t);\n\n\t\t// Handle phone blur with normalization\n\t\tconst handleBlur: React.FocusEventHandler<HTMLInputElement> = useCallback(\n\t\t\t\t(event) => {\n\t\t\t\t\t\tif (!isLocked && normalizeOnBlur && (onChange || onValueChange)) {\n\t\t\t\t\t\t\t\tconst nextValue = normalizePhone(event.target.value, selectedPrefix);\n\t\t\t\t\t\t\t\tif (nextValue !== event.target.value) {\n\t\t\t\t\t\t\t\t\t\tconst syntheticEvent = {\n\t\t\t\t\t\t\t\t\t\t\t\t...event,\n\t\t\t\t\t\t\t\t\t\t\t\ttarget: { ...event.target, value: nextValue },\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentTarget: { ...event.currentTarget, value: nextValue },\n\t\t\t\t\t\t\t\t\t\t} as unknown as React.ChangeEvent<HTMLInputElement>;\n\n\t\t\t\t\t\t\t\t\t\tonValueChange?.(nextValue);\n\t\t\t\t\t\t\t\t\t\tonChange?.(syntheticEvent);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tonBlur?.(event);\n\t\t\t\t},\n\t\t\t\t[isLocked, normalizeOnBlur, onChange, onValueChange, onBlur, selectedPrefix]\n\t\t);\n\n\t\t// If no prefixes or disabled, render simple input with prefix display\n\t\tif (normalizedPrefixes.length === 0 || disablePrefixSelector) {\n\t\t\t\tconst staticPrefix = selectedPrefix || defaultPrefix;\n\n\t\t\t\tif (!staticPrefix) {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\t\tref={forwardedRef}\n\t\t\t\t\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\t\t\t\t\ttype=\"tel\"\n\t\t\t\t\t\t\t\t\t\tautoComplete=\"tel\"\n\t\t\t\t\t\t\t\t\t\tinputMode=\"tel\"\n\t\t\t\t\t\t\t\t\t\tonChange={handleChange}\n\t\t\t\t\t\t\t\t\t\tonBlur={handleBlur}\n\t\t\t\t\t\t\t\t\t\tinvalid={invalid}\n\t\t\t\t\t\t\t\t\t\tdisabled={isDisabled}\n\t\t\t\t\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\t\t\t\t\tloading={loading}\n\t\t\t\t\t\t\t\t\t\tclassName={cn('phone-input--component', className)}\n\t\t\t\t\t\t\t\t\t\t{...props}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn (\n\t\t\t\t\t\t<div className=\"flex items-start gap-space-md\">\n\t\t\t\t\t\t\t\t{/* A fixed prefix reads like Input's read-only fill and keeps the\n\t\t\t\t\t\t\t\t adjoining value's size, including the coarse-pointer size. */}\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\taria-invalid={invalid || undefined}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t'phone-input--prefix flex shrink-0 items-center justify-center rounded-inner border border-input bg-muted',\n\t\t\t\t\t\t\t\t\t\t\t\tformControlSizeClasses[size],\n\t\t\t\t\t\t\t\t\t\t\t\teditableTextSizeClasses[size],\n\t\t\t\t\t\t\t\t\t\t\t\tformControlHorizontalPaddingClasses[size],\n\t\t\t\t\t\t\t\t\t\t\t\tisDisabled && 'opacity-50',\n\t\t\t\t\t\t\t\t\t\t\t\tfieldStateRecipes.invalid,\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" type=\"secondary\" lineHeight=\"tight\">\n\t\t\t\t\t\t\t\t\t\t\t\t{staticPrefix}\n\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div className=\"flex-1\">\n\t\t\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\t\t\t\tref={forwardedRef}\n\t\t\t\t\t\t\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"tel\"\n\t\t\t\t\t\t\t\t\t\t\t\tautoComplete=\"tel\"\n\t\t\t\t\t\t\t\t\t\t\t\tinputMode=\"tel\"\n\t\t\t\t\t\t\t\t\t\t\t\tonChange={handleChange}\n\t\t\t\t\t\t\t\t\t\t\t\tonBlur={handleBlur}\n\t\t\t\t\t\t\t\t\t\t\t\tinvalid={invalid}\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={isDisabled}\n\t\t\t\t\t\t\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\t\t\t\t\t\t\tloading={loading}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t\t\t\t\t\t\t\t{...props}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t}\n\n\t\t// Render with prefix selector\n\t\treturn (\n\t\t\t\t<div className=\"flex items-start gap-space-md\">\n\t\t\t\t\t\t{/* Prefix selector */}\n\t\t\t\t\t\t<baseui.Select\n\t\t\t\t\t\t\t\tvalue={currentPrefixOption?.iso ?? null}\n\t\t\t\t\t\t\t\tonValueChange={(value) => handlePrefixChange(value)}\n\t\t\t\t\t\t\t\tdisabled={isLocked}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t<baseui.SelectTrigger\n\t\t\t\t\t\t\t\taria-label={strings.prefixAriaLabel}\n\t\t\t\t\t\t\t\taria-invalid={invalid || undefined}\n\t\t\t\t\t\t\t\ticonClassName={selectToggleRecipes.icon[size]}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t'phone-input--prefix-trigger',\n\t\t\t\t\t\t\t\t\t\t\t\tformFieldTriggerClasses(size),\n\t\t\t\t\t\t\t\t\t\t\t\t'shrink-0',\n\t\t\t\t\t\t\t\t\t\t\t\tprefixWidth,\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<baseui.SelectValue\n\t\t\t\t\t\t\t\t\t\t\t\tplaceholder={(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" type=\"secondary\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{prefixPlaceholder ?? strings.prefixPlaceholder}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{!!currentPrefixOption && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{currentPrefixOption.value}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</baseui.SelectValue>\n\t\t\t\t\t\t\t\t</baseui.SelectTrigger>\n\t\t\t\t\t\t\t\t<SelectPopupContent>\n\t\t\t\t\t\t\t\t\t\t<SelectPopupGroup>\n\t\t\t\t\t\t\t\t\t\t\t\t{normalizedPrefixes.map((prefixOption) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<SelectPopupItem key={prefixOption.iso} value={prefixOption.iso} size={size}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-space-md\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{!!showPrefixInDropdown && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className=\"min-w-13 tabular-nums text-inherit\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{prefixOption.value}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{!!showCountryName && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{prefixOption.label}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</SelectPopupItem>\n\t\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t</SelectPopupGroup>\n\t\t\t\t\t\t\t\t</SelectPopupContent>\n\t\t\t\t\t\t</baseui.Select>\n\n\t\t\t\t\t\t{/* Phone number input */}\n\t\t\t\t\t\t<div className=\"flex-1\">\n\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\t\tref={forwardedRef}\n\t\t\t\t\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\t\t\t\t\ttype=\"tel\"\n\t\t\t\t\t\t\t\t\t\tautoComplete=\"tel\"\n\t\t\t\t\t\t\t\t\t\tinputMode=\"tel\"\n\t\t\t\t\t\t\t\t\t\tonChange={handleChange}\n\t\t\t\t\t\t\t\t\t\tonBlur={handleBlur}\n\t\t\t\t\t\t\t\t\t\tinvalid={invalid}\n\t\t\t\t\t\t\t\t\t\tdisabled={isDisabled}\n\t\t\t\t\t\t\t\t\t\treadOnly={readOnly}\n\t\t\t\t\t\t\t\t\t\tloading={loading}\n\t\t\t\t\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t\t\t\t\t\t{...props}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t);\n}\n\n// forwardRef + memo: forward to the underlying phone input so consumers can\n// focus/measure programmatically (RHF Controller, parent imperative refs).\nexport const PhoneInput = memo(React.forwardRef<HTMLInputElement, PhoneInputProps>(PhoneInputImpl));\nPhoneInput.displayName = 'PhoneInput';\n","import * as React from 'react';\n\nimport { Stack } from '../structure';\nimport { useDensityConfig, type FormControlSize } from '../../../lib/ui-provider';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\nimport { fieldStateRecipes } from '../../../lib/field-state-recipes';\n\nimport { resolveFormControlSize } from '../forms/form-sizing';\nimport { Input, type InputProps, type InputStrings } from '../text-inputs';\n\nexport interface ColorInputStrings {\n\t/** Accessible label for the native color-picker trigger. */\n\tchooseColor: string;\n}\n\nexport const defaultColorInputStrings: ColorInputStrings = {\n\tchooseColor: 'Choose color',\n};\n\nexport interface ColorInputProps extends Omit<InputProps, 'type' | 'strings'> {\n\t/** CSS color expression shown by the swatch. Defaults to the current value. */\n\tpreviewValue?: string;\n\t/** CSS-color callback. Text entry is preserved verbatim; native picker values are normalized to OKLCH. */\n\tonValueChange?: (value: string) => void;\n\t/** Accessible label for the native color picker. Defaults to the component strings. */\n\tpickerAriaLabel?: string;\n\t/** ColorInput-owned accessible copy. */\n\tstrings?: StringsProp<ColorInputStrings>;\n\t/** Copy overrides forwarded to the underlying text Input. */\n\tinputStrings?: StringsProp<InputStrings>;\n}\n\nconst pickerSizeClasses: Record<FormControlSize, string> = {\n\tsm: 'size-control-sm',\n\tmd: 'size-control',\n\tlg: 'size-control-lg',\n};\n\nfunction normalizeHexColor(value: string): string | null {\n\tconst normalized = value.trim().toLowerCase();\n\tif (/^#[0-9a-f]{6}$/.test(normalized)) return normalized;\n\tif (/^#[0-9a-f]{3}$/.test(normalized)) {\n\t\treturn `#${normalized.slice(1).split('').map((part) => `${part}${part}`).join('')}`;\n\t}\n\treturn null;\n}\n\nfunction roundColorChannel(value: number, precision: number): number {\n\tconst rounded = Number(value.toFixed(precision));\n\treturn Object.is(rounded, -0) ? 0 : rounded;\n}\n\nfunction hexColorToOklch(value: string): string {\n\tconst normalized = normalizeHexColor(value);\n\tif (!normalized) return value;\n\n\tconst channels = [1, 3, 5].map((offset) => Number.parseInt(normalized.slice(offset, offset + 2), 16) / 255);\n\tconst [red, green, blue] = channels.map((channel) =>\n\t\tchannel <= 0.04045\n\t\t\t? channel / 12.92\n\t\t\t: ((channel + 0.055) / 1.055) ** 2.4,\n\t);\n\tconst lRoot = Math.cbrt(0.4122214708 * red + 0.5363325363 * green + 0.0514459929 * blue);\n\tconst mRoot = Math.cbrt(0.2119034982 * red + 0.6806995451 * green + 0.1073969566 * blue);\n\tconst sRoot = Math.cbrt(0.0883024619 * red + 0.2817188376 * green + 0.6299787005 * blue);\n\tconst lightness = 0.2104542553 * lRoot + 0.793617785 * mRoot - 0.0040720468 * sRoot;\n\tconst a = 1.9779984951 * lRoot - 2.428592205 * mRoot + 0.4505937099 * sRoot;\n\tconst b = 0.0259040371 * lRoot + 0.7827717662 * mRoot - 0.808675766 * sRoot;\n\tconst chroma = Math.hypot(a, b);\n\tconst hue = chroma < 0.00005\n\t\t? 0\n\t\t: (Math.atan2(b, a) * 180) / Math.PI + (b < 0 ? 360 : 0);\n\n\treturn `oklch(${roundColorChannel(lightness, 4)} ${roundColorChannel(chroma, 4)} ${roundColorChannel(hue, 2)})`;\n}\n\nfunction renderedColorToHex(element: HTMLElement, fallback: string): string {\n\tconst computedColor = window.getComputedStyle(element).backgroundColor;\n\tconst directHex = normalizeHexColor(computedColor);\n\tif (directHex) return directHex;\n\tif (typeof CanvasRenderingContext2D === 'undefined') return fallback;\n\n\ttry {\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = 1;\n\t\tcanvas.height = 1;\n\t\tconst context = canvas.getContext('2d', { willReadFrequently: true });\n\t\tif (!context) return fallback;\n\t\tcontext.clearRect(0, 0, 1, 1);\n\t\tcontext.fillStyle = computedColor;\n\t\tcontext.fillRect(0, 0, 1, 1);\n\t\tconst [red, green, blue, alpha] = context.getImageData(0, 0, 1, 1).data;\n\t\tif (alpha === 0) return fallback;\n\t\treturn `#${[red, green, blue]\n\t\t\t.map((channel) => channel.toString(16).padStart(2, '0'))\n\t\t\t.join('')}`;\n\t} catch {\n\t\treturn fallback;\n\t}\n}\n\n/**\n * CSS-color editor that pairs exact text entry with a native visual picker.\n * The swatch accepts modern CSS colors and inherited `var(...)` expressions;\n * the picker commits OKLCH values without narrowing text input.\n */\nexport const ColorInput = React.forwardRef<HTMLInputElement, ColorInputProps>(function ColorInput({\n\tclassName,\n\tvalue,\n\tdefaultValue,\n\tonChange,\n\tonValueChange,\n\tpreviewValue,\n\tpickerAriaLabel,\n\tsize: sizeProp,\n\tdisabled,\n\treadOnly,\n\tloading,\n\tinvalid,\n\tstrings: stringsProp,\n\tinputStrings,\n\t...props\n}, forwardedRef) {\n\tconst strings = useStrings(defaultColorInputStrings, stringsProp);\n\tconst { defaultScale } = useDensityConfig();\n\tconst size = resolveFormControlSize(sizeProp, defaultScale);\n\tconst pickerDisabled = disabled || readOnly || loading;\n\tconst [internalValue, setInternalValue] = React.useState(defaultValue ?? '');\n\tconst resolvedValue = value ?? internalValue;\n\tconst resolvedPreview = previewValue ?? resolvedValue;\n\tconst initialPickerValue = normalizeHexColor(resolvedValue) ?? '#000000';\n\tconst [pickerValue, setPickerValue] = React.useState(initialPickerValue);\n\tconst swatchRef = React.useRef<HTMLSpanElement>(null);\n\n\tReact.useLayoutEffect(() => {\n\t\tconst directHex = normalizeHexColor(resolvedPreview);\n\t\tif (directHex) {\n\t\t\tsetPickerValue(directHex);\n\t\t\treturn;\n\t\t}\n\t\tif (!swatchRef.current || typeof window === 'undefined') return;\n\t\tsetPickerValue((current) => renderedColorToHex(swatchRef.current as HTMLElement, current));\n\t}, [resolvedPreview]);\n\n\tconst publishChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n\t\tif (value === undefined) setInternalValue(event.target.value);\n\t\tonChange?.(event);\n\t\tonValueChange?.(event.target.value);\n\t};\n\tconst publishPickerInput = (event: React.FormEvent<HTMLInputElement>) => {\n\t\tif (pickerDisabled) return;\n\t\tconst nextValue = hexColorToOklch(event.currentTarget.value);\n\t\tif (value === undefined) setInternalValue(nextValue);\n\t\tif (onChange) {\n\t\t\tconst normalizedEvent = {\n\t\t\t\t...event,\n\t\t\t\ttarget: { ...event.currentTarget, value: nextValue },\n\t\t\t\tcurrentTarget: { ...event.currentTarget, value: nextValue },\n\t\t\t} as unknown as React.ChangeEvent<HTMLInputElement>;\n\t\t\tonChange(normalizedEvent);\n\t\t}\n\t\tonValueChange?.(nextValue);\n\t};\n\n\treturn (\n\t\t<Stack\n\t\t\tdirection=\"horizontal\"\n\t\t\tgap=\"sm\"\n\t\t\talign=\"center\"\n\t\t\twrap={false}\n\t\t\tclassName={cn(\n\t\t\t\t'color-input--component min-w-0 [&>.input--component]:min-w-0 [&>.input--component]:flex-1',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{/* The picker is the second frame of one compound field: it takes the\n\t\t\t same keyboard focus ring, validation and disabled treatment as the\n\t\t\t text field beside it. */}\n\t\t\t<label\n\t\t\t\taria-invalid={invalid || undefined}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'color-input--picker box-border relative shrink-0 cursor-pointer overflow-hidden rounded-inner border border-input bg-background shadow-none outline-none transition-[color,box-shadow]',\n\t\t\t\t\t'has-[input:focus-visible]:border-ring has-[input:focus-visible]:ring-3 has-[input:focus-visible]:ring-ring/50',\n\t\t\t\t\tfieldStateRecipes.invalid,\n\t\t\t\t\t'aria-invalid:has-[input:focus-visible]:border-destructive aria-invalid:has-[input:focus-visible]:ring-destructive/30 dark:aria-invalid:has-[input:focus-visible]:ring-destructive/50',\n\t\t\t\t\t'data-disabled:pointer-events-none data-disabled:cursor-not-allowed data-disabled:opacity-50',\n\t\t\t\t\tpickerSizeClasses[size],\n\t\t\t\t)}\n\t\t\t\tdata-disabled={pickerDisabled || undefined}\n\t\t\t>\n\t\t\t\t{/* A nested body inside the control frame takes the compact inner corner. */}\n\t\t\t\t<span\n\t\t\t\t\tref={swatchRef}\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\tdata-user-color\n\t\t\t\t\tclassName=\"color-input--swatch absolute inset-1 rounded-radius-xs\"\n\t\t\t\t\tstyle={{ background: resolvedPreview || 'transparent' }}\n\t\t\t\t/>\n\t\t\t\t<input\n\t\t\t\t\ttype=\"color\"\n\t\t\t\t\tvalue={pickerValue}\n\t\t\t\t\tdisabled={pickerDisabled}\n\t\t\t\t\taria-label={pickerAriaLabel ?? strings.chooseColor}\n\t\t\t\t\tonInput={publishPickerInput}\n\t\t\t\t\tclassName=\"color-input--native absolute inset-0 size-full cursor-pointer opacity-0\"\n\t\t\t\t/>\n\t\t\t</label>\n\t\t\t{/*\n\t\t\t * `font-mono` keeps the hex value column-aligned; the size is left to\n\t\t\t * `Input` so the value matches every other control instead of\n\t\t\t * rendering a step smaller than its own label.\n\t\t\t */}\n\t\t\t<Input\n\t\t\t\t{...props}\n\t\t\t\tref={forwardedRef}\n\t\t\t\tsize={size}\n\t\t\t\tvalue={resolvedValue}\n\t\t\t\tdisabled={disabled}\n\t\t\t\treadOnly={readOnly}\n\t\t\t\tloading={loading}\n\t\t\t\tinvalid={invalid}\n\t\t\t\tonChange={publishChange}\n\t\t\t\tstrings={inputStrings}\n\t\t\t\tclassName=\"min-w-0 flex-1 font-mono\"\n\t\t\t/>\n\t\t</Stack>\n\t);\n});\n\nColorInput.displayName = 'ColorInput';\n","import { sliderTrackThickness } from '../../../lib/track-recipes';\nimport * as React from 'react';\nimport { useCallback, useId, useMemo, useState, type ElementRef } from 'react';\nimport { Slider as SliderPrimitive } from '@base-ui/react/slider';\nimport { Text } from '../../typography';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nexport interface SliderStrings {\n\t/** Accessible fallback name for the native range input. */\n\tariaLabel: string;\n}\n\nexport const defaultSliderStrings: SliderStrings = {\n\tariaLabel: 'Value',\n};\n\nexport interface SliderImitationEvent {\n\ttarget: {\n\t\tname: string;\n\t\tvalue: number;\n\t};\n}\n\nexport interface SliderProps {\n\t/** Native range input ref; the forwarded ref continues to name the slider root. */\n\tinputRef?: React.Ref<HTMLInputElement>;\n\t/** Blur callback from the native range input. */\n\tonBlur?: React.FocusEventHandler<HTMLInputElement>;\n\t/** Field name for form integration */\n\tname?: string;\n\n\t/** Slider group id; use aria-labelledby to associate visible copy with its native range input. */\n\tid?: string;\n\n\t/** Accessible name when a visible label is not associated with the slider. */\n\t'aria-label'?: string;\n\t/** Id of the visible label associated with the slider. */\n\t'aria-labelledby'?: string;\n\t/** Id of supporting or validation copy associated with the slider. */\n\t'aria-describedby'?: string;\n\t/** Localizes the fallback native-range name. */\n\tstrings?: StringsProp<SliderStrings>;\n\n\t/** Current value (single thumb) */\n\tvalue?: number;\n\n\t/** Default value when uncontrolled */\n\tdefaultValue?: number;\n\n\t/** Minimum value. Defaults to 0 */\n\tmin?: number;\n\n\t/** Maximum value. Defaults to 100 */\n\tmax?: number;\n\n\t/** Step increment. Defaults to 1 */\n\tstep?: number;\n\n\t/** Whether the slider is disabled */\n\tdisabled?: boolean;\n\n\t/** Error state for styling (passed from FormField) */\n\tinvalid?: boolean;\n\n\t/** Event-style change handler for react-hook-form compatibility */\n\tonChange?: (event: SliderImitationEvent) => void;\n\n\t/** Raw value change handler (alternative to onChange) */\n\tonValueChange?: (value: number) => void;\n\n\t/** Fires on pointer up / keyboard commit */\n\tonValueCommitted?: (value: number) => void;\n\n\t/** Show the current value next to the slider */\n\tshowValue?: boolean;\n\n\t/** Format the displayed value */\n\tformatValue?: (value: number) => string;\n\n\t/** Unit suffix displayed after the value (e.g. \"px\", \"%\", \"mm\") */\n\tunit?: string;\n\n\t/** Additional class name for the root wrapper */\n\tclassName?: string;\n\n\t/** Orientation */\n\torientation?: 'horizontal' | 'vertical';\n}\n\ntype SliderElement = ElementRef<typeof SliderPrimitive.Root>;\n\nfunction SliderFieldImpl(\n\t{\n\t\tname,\n\t\tinputRef,\n\t\tonBlur,\n\t\tid,\n\t\t'aria-label': ariaLabel,\n\t\t'aria-labelledby': ariaLabelledBy,\n\t\t'aria-describedby': ariaDescribedBy,\n\t\tstrings: stringsProp,\n\t\tvalue,\n\t\tdefaultValue,\n\t\tmin = 0,\n\t\tmax = 100,\n\t\tstep = 1,\n\t\tdisabled = false,\n\t\tinvalid = false,\n\t\tonChange,\n\t\tonValueChange,\n\t\tonValueCommitted,\n\t\tshowValue = false,\n\t\tformatValue,\n\t\tunit,\n\t\tclassName,\n\t\torientation = 'horizontal',\n\t}: SliderProps,\n\tref: React.ForwardedRef<SliderElement>,\n) {\n\tconst generatedId = useId();\n\tconst strings = useStrings(defaultSliderStrings, stringsProp);\n\tconst resolvedId = id ?? `slider-${generatedId}`;\n\tconst resolvedName = name ?? resolvedId;\n\tconst resolvedAriaLabel = ariaLabel ?? (ariaLabelledBy ? undefined : strings.ariaLabel);\n\tconst isControlled = value !== undefined;\n\t// Base UI owns interaction. Keep the optional scalar readout in step with its\n\t// uncontrolled changes; defaultValue is an initial value, not a live prop.\n\tconst [uncontrolledValue, setUncontrolledValue] = useState(() => defaultValue ?? min);\n\n\tconst handleValueChange = useCallback(\n\t\t(newValue: number | readonly number[]) => {\n\t\t\tconst singleValue = Array.isArray(newValue) ? newValue[0] : newValue;\n\t\t\tif (!isControlled) setUncontrolledValue(singleValue);\n\n\t\t\tonValueChange?.(singleValue);\n\n\t\t\tonChange?.({\n\t\t\t\ttarget: { name: resolvedName, value: singleValue },\n\t\t\t});\n\t\t},\n\t\t[isControlled, resolvedName, onChange, onValueChange]\n\t);\n\n\tconst handleValueCommitted = useCallback(\n\t\t(newValue: number | readonly number[]) => {\n\t\t\tconst singleValue = Array.isArray(newValue) ? newValue[0] : newValue;\n\t\t\tonValueCommitted?.(singleValue);\n\t\t},\n\t\t[onValueCommitted]\n\t);\n\n\tconst displayValue = useMemo(() => {\n\t\tif (!showValue) return null;\n\n\t\tconst currentValue = Math.min(max, Math.max(min, value ?? uncontrolledValue));\n\n\t\tif (formatValue) return formatValue(currentValue);\n\n\t\treturn unit ? `${currentValue}${unit}` : String(currentValue);\n\t}, [showValue, value, uncontrolledValue, min, max, formatValue, unit]);\n\n\t// Wrap single value in array for the primitive\n\tconst sliderValue = value !== undefined ? [value] : undefined;\n\tconst sliderDefaultValue = defaultValue !== undefined ? [defaultValue] : [min];\n\n\treturn (\n\t\t<div className={cn('slider--component', 'flex items-center gap-space-lg', className)}>\n\t\t\t<SliderPrimitive.Root\n\t\t\t\tref={ref}\n\t\t\t\tdata-slot=\"slider\"\n\t\t\t\tid={resolvedId}\n\t\t\t\taria-label={resolvedAriaLabel}\n\t\t\t\taria-labelledby={ariaLabelledBy}\n\t\t\t\taria-describedby={ariaDescribedBy}\n\t\t\t\tvalue={sliderValue}\n\t\t\t\tdefaultValue={sliderDefaultValue}\n\t\t\t\tmin={min}\n\t\t\t\tmax={max}\n\t\t\t\tstep={step}\n\t\t\t\tdisabled={disabled}\n\t\t\t\torientation={orientation}\n\t\t\t\tonValueChange={handleValueChange}\n\t\t\t\tonValueCommitted={handleValueCommitted}\n\t\t\t\taria-invalid={invalid || undefined}\n\t\t\t\t// Inset by half the thumb: at min and max the thumb's outer edge meets the\n\t\t\t\t// field column's edge, lining up with the label and neighbouring frames\n\t\t\t\t// instead of overhanging them or sitting a control inset inside them.\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'box-border data-[orientation=horizontal]:w-full data-[orientation=horizontal]:px-[calc(var(--icon)/2)] data-[orientation=vertical]:h-full',\n\t\t\t\t\t'min-w-0 flex-1',\n\t\t\t\t\tinvalid && '[&_[data-slot=slider-range]]:bg-destructive',\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<SliderPrimitive.Control className=\"relative flex w-full touch-none items-center select-none data-disabled:opacity-50 data-[orientation=horizontal]:min-h-control data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-40 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col\">\n\t\t\t\t\t<SliderPrimitive.Track\n\t\t\t\t\t\tdata-slot=\"slider-track\"\n\t\t\t\t\t\tclassName={cn('relative grow overflow-hidden rounded-full bg-muted select-none data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full', sliderTrackThickness)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<SliderPrimitive.Indicator\n\t\t\t\t\t\t\tdata-slot=\"slider-range\"\n\t\t\t\t\t\t\tclassName=\"absolute bg-primary select-none data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</SliderPrimitive.Track>\n\t\t\t\t\t{/* Keyboard focus draws the shared halo around the thumb's primary edge; hover adds\n\t\t\t\t\t none, so a pointer over the thumb is never mistaken for focus.\n\t\t\t\t\t The control already dims when disabled, so the thumb does not again. */}\n\t\t\t\t\t<SliderPrimitive.Thumb\n\t\t\t\t\t\tindex={0}\n\t\t\t\t\t\tinputRef={inputRef}\n\t\t\t\t\t\tonBlur={onBlur}\n\t\t\t\t\t\tdata-slot=\"slider-thumb\"\n\t\t\t\t\t\tgetAriaLabel={resolvedAriaLabel === undefined ? undefined : () => resolvedAriaLabel}\n\t\t\t\t\t\taria-labelledby={ariaLabelledBy}\n\t\t\t\t\t\taria-describedby={ariaDescribedBy}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'block size-icon shrink-0 rounded-full border border-primary bg-background shadow-sm transition-[color,box-shadow] select-none',\n\t\t\t\t\t\t\t'has-[:focus-visible]:outline-hidden has-[:focus-visible]:ring-3 has-[:focus-visible]:ring-ring/50 data-disabled:pointer-events-none',\n\t\t\t\t\t\t\tinvalid && 'border-destructive has-[:focus-visible]:ring-destructive/30 dark:has-[:focus-visible]:ring-destructive/50',\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t</SliderPrimitive.Control>\n\t\t\t</SliderPrimitive.Root>\n\n\t\t\t{!!showValue && displayValue !== null && (\n\t\t\t\t<Text\n\t\t\t\t\ttag=\"span\"\n\t\t\t\t\ttype={invalid ? 'error' : 'secondary'}\n\t\t\t\t\tclassName=\"min-w-8 shrink-0 text-right tabular-nums\"\n\t\t\t\t>\n\t\t\t\t\t{displayValue}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nconst SliderField = React.forwardRef<SliderElement, SliderProps>(SliderFieldImpl);\nSliderField.displayName = 'SliderField';\n\nexport { SliderField };\n","import { forwardRef, useCallback } from 'react';\nimport { DatePicker } from '../date-pickers/date-picker';\nimport type { DateOutput, DatePickerBaseProps } from '../date-pickers/datepicker.types';\n\nexport interface DateTimeInputProps extends Pick<DatePickerBaseProps, 'triggerRef' | 'onBlur' | 'aria-describedby' | 'aria-invalid'> {\n\t/** Controlled value (ISO string) */\n\tvalue?: string;\n\n\t/** Change handler */\n\tonValueChange?: (value: string | undefined) => void;\n\n\t/** Placeholder text */\n\tplaceholder?: string;\n\n\t/** Display format for the date */\n\treadableFormat?: string;\n\n\t/** Step for time selection, in minutes. Default `30`. */\n\tstepMinutes?: number;\n\n\t/** Use modal for picker */\n\tmodal?: boolean;\n\n\t/** Error state for styling (passed from FormField). Validation copy stays with FormField. */\n\tinvalid?: boolean;\n\n\t/** Disabled state */\n\tdisabled?: boolean;\n\n\t/** Id of the trigger, so an external `<FormField label>` names it. Defaults to a generated id. */\n\tid?: string;\n}\n\nexport const DateTimeInput = forwardRef<HTMLDivElement, DateTimeInputProps>(function DateTimeInput({\n\tvalue,\n\tonValueChange,\n\tplaceholder,\n\treadableFormat = 'dd-MM-yyyy HH:mm',\n\tstepMinutes = 30,\n\tmodal = true,\n\tinvalid,\n\tdisabled,\n\tid,\n\ttriggerRef,\n\tonBlur,\n\t'aria-describedby': ariaDescribedBy,\n\t'aria-invalid': ariaInvalid,\n}: DateTimeInputProps, ref) {\n\tconst dateValue = value ? new Date(value) : undefined;\n\n\tconst handleChange = useCallback(\n\t\t(output: DateOutput) => {\n\t\t\tonValueChange?.(output.date ? output.date.toISOString() : undefined);\n\t\t},\n\t\t[onValueChange]\n\t);\n\n\treturn (\n\t\t<DatePicker ref={ref} className=\"date-time-input--component\"\n\t\t\tid={id}\n\t\t\ttriggerRef={triggerRef}\n\t\t\tonBlur={onBlur}\n\t\t\taria-describedby={ariaDescribedBy}\n\t\t\taria-invalid={ariaInvalid}\n\t\t\tmode=\"single\"\n\t\t\tdisabled={disabled}\n\t\t\t// Marks the trigger invalid without rendering a second, empty message\n\t\t\t// line: the surrounding FormField owns the validation copy.\n\t\t\tinvalid={invalid}\n\t\t\tplaceholder={placeholder}\n\t\t\tvalue={dateValue}\n\t\t\tonValueChange={handleChange}\n\t\t\treadableFormat={readableFormat}\n\t\t\t// The time field's step is in seconds; this component's is in minutes.\n\t\t\twithTime={{ enabled: true, format: '24', step: stepMinutes * 60 }}\n\t\t\tmodal={modal}\n\t\t/>\n\t);\n});\n\nDateTimeInput.displayName = 'DateTimeInput';\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"value-typography-ClupF0Gz.js","names":["useInRunningText","formatWithMinusSign","formatter","value","part","formatNumber","options","locale","formatPercentage","ratio","scaled","DURATION_FACTORS","DURATION_INPUT_FACTORS","formatDuration","maximumFractionDigits","minimumFractionDigits","safeMaxParts","maxParts","negative","totalMilliseconds","from","zeroUnit","unitProbe","populatedUnitIndexes","index","factor","amount","roundingIncrement","remaining","startIndex","milliseconds","parts","isLastPart","signedAmount","useValueTypography","inText","props","role","emptyValueTypography","resolved","explicitWeight"],"sources":["../src/lib/format.ts","../src/components/primitives/value-typography.ts"],"sourcesContent":["/**\n * Shared formatting constants and helpers for display components.\n *\n * `EMPTY` — em-dash used as the canonical placeholder for missing/null values\n * across Money and the package's display primitives. Keeping it\n * centralised lets the library swap to \"—\" / \"N/A\" / locale-specific glyphs in\n * one place if needed.\n *\n * `formatCurrency` / `formatNumber` / `formatPercentage` / `formatDuration`\n * are thin wrappers around `Intl.NumberFormat` plus a duration helper. They\n * default to the user's resolved locale (`undefined` → system default) but\n * accept a `locale` override so callers can pin output for tests or\n * dual-currency UIs.\n */\nexport const EMPTY = '—';\n\n/** U+2212 MINUS SIGN. Intl emits U+002D HYPHEN-MINUS for negatives in most locales. */\nexport const MINUS_SIGN = '\\u2212';\n\n/**\n * Formats with Intl and draws a negative sign as U+2212, the typographic minus\n * commerce surfaces already use: it has the width of a digit, so signed values\n * align in tabular columns. Only the hyphen-minus inside the `minusSign` part\n * changes, so locale minus forms and bidi marks (fa, he, ar) survive.\n */\nexport function formatWithMinusSign(formatter: Intl.NumberFormat, value: number): string {\n\treturn formatter\n\t\t.formatToParts(value)\n\t\t.map((part) => (part.type === 'minusSign' ? part.value.replace('-', MINUS_SIGN) : part.value))\n\t\t.join('');\n}\n\nexport interface FormatNumberOptions {\n\tlocale?: string;\n\tminimumFractionDigits?: number;\n\tmaximumFractionDigits?: number;\n\tnotation?: Intl.NumberFormatOptions['notation'];\n}\n\nexport function formatNumber(value: number, options: FormatNumberOptions = {}): string {\n\tif (!Number.isFinite(value)) return EMPTY;\n\tconst {\n\t\tlocale,\n\t\tminimumFractionDigits,\n\t\tmaximumFractionDigits,\n\t\tnotation,\n\t} = options;\n\treturn formatWithMinusSign(new Intl.NumberFormat(locale, {\n\t\tminimumFractionDigits,\n\t\tmaximumFractionDigits,\n\t\tnotation,\n\t}), value);\n}\n\nexport interface FormatCurrencyOptions extends FormatNumberOptions {\n\tcurrency?: string;\n\tcurrencyDisplay?: 'symbol' | 'narrowSymbol' | 'code' | 'name';\n}\n\nexport function formatCurrency(value: number, options: FormatCurrencyOptions = {}): string {\n\tif (!Number.isFinite(value)) return EMPTY;\n\tconst {\n\t\tlocale,\n\t\tcurrency = 'EUR',\n\t\tcurrencyDisplay = 'symbol',\n\t\tminimumFractionDigits,\n\t\tmaximumFractionDigits,\n\t\tnotation,\n\t} = options;\n\ttry {\n\t\treturn formatWithMinusSign(new Intl.NumberFormat(locale, {\n\t\t\tstyle: 'currency',\n\t\t\tcurrency,\n\t\t\tcurrencyDisplay,\n\t\t\tminimumFractionDigits,\n\t\t\tmaximumFractionDigits,\n\t\t\tnotation,\n\t\t}), value);\n\t} catch {\n\t\t// Unknown / unsupported currency code — fall back to plain number + code suffix.\n\t\treturn `${formatNumber(value, options)} ${currency}`;\n\t}\n}\n\nexport interface FormatPercentageOptions extends FormatNumberOptions {\n\t/** When true, treat `value` as already a percentage (e.g. 12.5 → \"12.5%\"). Default: false (0.125 → \"12.5%\"). */\n\tscaled?: boolean;\n}\n\nexport function formatPercentage(value: number, options: FormatPercentageOptions = {}): string {\n\tif (!Number.isFinite(value)) return EMPTY;\n\tconst { locale, minimumFractionDigits, maximumFractionDigits = 1, scaled = false } = options;\n\tconst ratio = scaled ? value / 100 : value;\n\treturn formatWithMinusSign(new Intl.NumberFormat(locale, {\n\t\tstyle: 'percent',\n\t\tminimumFractionDigits,\n\t\tmaximumFractionDigits,\n\t}), ratio);\n}\n\n/** Input and display options for localized duration formatting. Seconds and\n * narrow units are the calibrated defaults. */\nexport type DurationUnit = 'milliseconds' | 'seconds' | 'minutes' | 'hours' | 'days';\nexport type DurationUnitDisplay = 'narrow' | 'short' | 'long';\n\nexport interface FormatDurationOptions {\n\t/** Unit used by the incoming value. Defaults to seconds. */\n\tfrom?: DurationUnit;\n\t/** BCP-47 locale passed to Intl.NumberFormat. */\n\tlocale?: string;\n\t/** Number of non-zero units to show. Defaults to all five units. */\n\tmaxParts?: number;\n\t/** Intl unit-label style. `narrow` provides the compact `1h 5m` default. */\n\tunitDisplay?: DurationUnitDisplay;\n\tminimumFractionDigits?: number;\n\tmaximumFractionDigits?: number;\n}\n\nconst DURATION_FACTORS = [\n\t{ unit: 'day', milliseconds: 86_400_000 },\n\t{ unit: 'hour', milliseconds: 3_600_000 },\n\t{ unit: 'minute', milliseconds: 60_000 },\n\t{ unit: 'second', milliseconds: 1_000 },\n\t{ unit: 'millisecond', milliseconds: 1 },\n] as const;\n\nconst DURATION_INPUT_FACTORS: Record<DurationUnit, number> = {\n\tmilliseconds: 1,\n\tseconds: 1_000,\n\tminutes: 60_000,\n\thours: 3_600_000,\n\tdays: 86_400_000,\n};\n\n/**\n * Format a duration into localized unit parts. Values use seconds and compact\n * unit labels by default; pass `from` to select another input unit.\n */\nexport function formatDuration(value: number, options: FormatDurationOptions = {}): string {\n\tif (!Number.isFinite(value)) return EMPTY;\n\n\tconst {\n\t\tfrom = 'seconds',\n\t\tlocale,\n\t\tmaxParts = DURATION_FACTORS.length,\n\t\tunitDisplay = 'narrow',\n\t\tminimumFractionDigits,\n\t} = options;\n\tconst maximumFractionDigits = Math.max(\n\t\tminimumFractionDigits ?? 0,\n\t\toptions.maximumFractionDigits ?? 0,\n\t);\n\tconst safeMaxParts = Math.max(1, Math.floor(maxParts));\n\tconst negative = value < 0;\n\tlet totalMilliseconds = Math.abs(value) * DURATION_INPUT_FACTORS[from];\n\n\t// The calibrated seconds default rounds to the nearest whole second unless\n\t// fractional precision is explicitly requested, including below one second.\n\tif (\n\t\tfrom === 'seconds'\n\t\t&& options.minimumFractionDigits === undefined\n\t\t&& options.maximumFractionDigits === undefined\n\t) {\n\t\ttotalMilliseconds = Math.round(totalMilliseconds / 1_000) * 1_000;\n\t}\n\n\tif (totalMilliseconds === 0) {\n\t\tconst zeroUnit = from === 'milliseconds' ? 'millisecond' : 'second';\n\t\treturn new Intl.NumberFormat(locale, {\n\t\t\tstyle: 'unit',\n\t\t\tunit: zeroUnit,\n\t\t\tunitDisplay,\n\t\t\tminimumFractionDigits,\n\t\t\tmaximumFractionDigits,\n\t\t}).format(0);\n\t}\n\n\t// Round at the smallest unit that will be displayed before decomposing the\n\t// value. This lets carries propagate normally instead of producing invalid\n\t// output such as `59m 60s` or `23h 60m` at a max-parts boundary.\n\tlet unitProbe = totalMilliseconds;\n\tconst populatedUnitIndexes: number[] = [];\n\tfor (let index = 0; index < DURATION_FACTORS.length; index += 1) {\n\t\tconst factor = DURATION_FACTORS[index];\n\t\tconst amount = Math.floor(unitProbe / factor.milliseconds);\n\t\tif (amount > 0) populatedUnitIndexes.push(index);\n\t\tunitProbe -= amount * factor.milliseconds;\n\t}\n\tconst roundingUnitIndex = populatedUnitIndexes[\n\t\tMath.min(safeMaxParts, populatedUnitIndexes.length) - 1\n\t] ?? DURATION_FACTORS.length - 1;\n\tconst roundingUnit = DURATION_FACTORS[roundingUnitIndex];\n\tconst roundingIncrement = roundingUnit.milliseconds / (10 ** maximumFractionDigits);\n\ttotalMilliseconds = Math.round(totalMilliseconds / roundingIncrement) * roundingIncrement;\n\n\tif (totalMilliseconds === 0) {\n\t\tconst zeroUnit = from === 'milliseconds' ? 'millisecond' : 'second';\n\t\treturn new Intl.NumberFormat(locale, {\n\t\t\tstyle: 'unit',\n\t\t\tunit: zeroUnit,\n\t\t\tunitDisplay,\n\t\t\tminimumFractionDigits,\n\t\t\tmaximumFractionDigits,\n\t\t}).format(0);\n\t}\n\n\tlet remaining = totalMilliseconds;\n\n\tconst startIndex = Math.max(\n\t\t0,\n\t\tDURATION_FACTORS.findIndex(({ milliseconds }) => remaining >= milliseconds),\n\t);\n\tconst parts: string[] = [];\n\n\tfor (let index = startIndex; index < DURATION_FACTORS.length && parts.length < safeMaxParts; index += 1) {\n\t\tconst factor = DURATION_FACTORS[index];\n\t\tconst isLastPart = parts.length === safeMaxParts - 1 || index === DURATION_FACTORS.length - 1;\n\t\tconst amount = isLastPart ? remaining / factor.milliseconds : Math.floor(remaining / factor.milliseconds);\n\t\tconst visibleAmount = isLastPart\n\t\t\t? Math.round(amount * (10 ** maximumFractionDigits)) / (10 ** maximumFractionDigits)\n\t\t\t: amount;\n\t\tif (visibleAmount <= 0) continue;\n\n\t\tconst signedAmount = negative && parts.length === 0 ? -amount : amount;\n\t\tparts.push(formatWithMinusSign(new Intl.NumberFormat(locale, {\n\t\t\tstyle: 'unit',\n\t\t\tunit: factor.unit,\n\t\t\tunitDisplay,\n\t\t\tminimumFractionDigits: isLastPart ? minimumFractionDigits : 0,\n\t\t\tmaximumFractionDigits: isLastPart ? maximumFractionDigits : 0,\n\t\t}), signedAmount));\n\t\tremaining -= Math.floor(amount) * factor.milliseconds;\n\t}\n\n\treturn parts.join(' ');\n}\n","import type { TextSize } from '../../lib/ui-provider';\nimport { useInRunningText } from '../typography/running-text';\nimport type { TextProps } from '../typography/text';\n\ntype TextType = NonNullable<TextProps['type']>;\ntype TextWeight = NonNullable<TextProps['weight']>;\ntype TextLineHeight = NonNullable<TextProps['lineHeight']>;\n\n/** Typography props a value primitive accepts and passes to `Text`. */\nexport interface ValueTypographyProps {\n\tsize?: TextSize;\n\ttype?: TextProps['type'];\n\tweight?: TextProps['weight'];\n\tlineHeight?: TextProps['lineHeight'];\n}\n\n/** Resolved typography; `undefined` size means the provider default. */\nexport interface ValueTypography {\n\tsize: TextSize | undefined;\n\ttype: TextType;\n\tweight: TextWeight;\n\tlineHeight: TextLineHeight | undefined;\n}\n\n/** Standalone role of a value primitive. */\nexport interface ValueTypographyRole {\n\t/** Colour role outside running text. */\n\ttype: TextType;\n\t/** Weight outside running text. */\n\tweight: TextWeight;\n\t/** Size outside running text; the provider default when omitted. */\n\tsize?: TextSize;\n\t/**\n\t * Keep the colour role inside running text. Secondary, muted and empty values\n\t * stay recessive in a sentence; ordinary values take the sentence colour.\n\t */\n\tkeepType?: boolean;\n\t/**\n\t * Leading inside running text. Defaults to the surrounding leading. A span in\n\t * another font family (monospace) uses `none` so its own ascent and descent\n\t * never grow the sentence's line box; the line keeps the sentence leading.\n\t */\n\tinTextLineHeight?: TextLineHeight;\n}\n\n/**\n * Resolves what a value primitive passes to `Text`. Explicit props always win.\n * Inside running text (a `Text`, `Heading`, label, link or value parent) unset\n * size, colour, weight and leading inherit the surrounding text, so an SKU or an\n * amount in a sentence matches the words around it. A standalone value keeps\n * its role defaults and the provider text size.\n */\nexport function useValueTypography(props: ValueTypographyProps, role: ValueTypographyRole): ValueTypography {\n\tconst inText = useInRunningText();\n\treturn {\n\t\tsize: props.size ?? (inText ? 'inherit' : role.size),\n\t\ttype: props.type ?? (inText && !role.keepType ? 'inherit' : role.type),\n\t\tweight: props.weight ?? (inText ? 'inherit' : role.weight),\n\t\tlineHeight: props.lineHeight ?? (inText ? role.inTextLineHeight ?? 'inherit' : undefined),\n\t};\n}\n\n/**\n * The shared missing-value treatment (`EmptyValue`): secondary colour and a\n * regular weight at the value's size. An explicit weight is kept; inside\n * running text the weight follows the sentence.\n */\nexport function emptyValueTypography(resolved: ValueTypography, explicitWeight: TextProps['weight']): ValueTypography {\n\treturn {\n\t\t...resolved,\n\t\ttype: 'secondary',\n\t\tweight: explicitWeight ?? (resolved.weight === 'inherit' ? 'inherit' : 'regular'),\n\t};\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-9EFVXUyk.js","names":["Icon","React","_Fragment","Text","DisplayLabel","Heading","headingRoleSizes","copyRoleProps","focusRecipes","Stack","toneRecipes","Progress","compositionRhythm","compositionClasses","interactionRecipes","Value","Badge","ItemMedia","ItemDescription","ItemActions","ItemGroup","ItemContent","Item","ItemTitle","hasPageHeaderCommands","PageHeaderCommands","useLayoutLinkRenderer","React$1","Fragment$1","defaultWorkspaceRecordHeaderStrings","defaultWorkspaceNavStrings","value","defaultWorkspaceLocaleStripStrings","CONTENT_WIDTH_CLASS","STATUS_ICON","Check","Circle","CircleAlert","STATUS_CLASS","clampPercent","DynamicWorkspaceIcon","icon","getStatus","item","active","WorkspaceLayout","props","hasSidebar","sidebar","hasRail","rail","ariaLabel","cn","contentWidth","className","header","headerClassName","bodyClassName","sidebarClassName","mainClassName","contentClassName","railClassName","isCommandList","WorkspaceRecordHeader","stringsProp","strings","useStrings","resolvedRenderLink","hasMetadata","metadata","secondaryCommands","secondaryActions","secondaryNodes","hasCommands","primaryAction","textGap","media","titleSlot","title","badges","status","description","index","actions","headerEnd","WorkspaceNav","groups","group","activeId","StatusIcon","completion","handleSelect","context","renderItem","rowContent","SecondaryValue","itemClassName","linkNode","footerSlot","WorkspaceLocaleStrip","handleLocaleClick","locale","onLocaleChange","locales","activeLocale","Button"],"sources":["../src/components/layout/workspace/workspace.strings.ts","../src/components/layout/workspace/workspace.tsx"],"sourcesContent":["export interface WorkspaceRecordHeaderStrings {\n\tmetadataLabel: string;\n\tactionsLabel: string;\n\tsecondaryActionsLabel: string;\n}\n\nexport const defaultWorkspaceRecordHeaderStrings: WorkspaceRecordHeaderStrings = {\n\tmetadataLabel: 'Record metadata',\n\tactionsLabel: 'Record actions',\n\tsecondaryActionsLabel: 'Secondary actions',\n};\n\nexport interface WorkspaceNavStrings {\n\tariaLabel: string;\n\tcompletionLabel: (value: number) => string;\n\tcurrentLabel: string;\n}\n\nexport const defaultWorkspaceNavStrings: WorkspaceNavStrings = {\n\tariaLabel: 'Workspace navigation',\n\tcompletionLabel: (value) => `${value}% complete`,\n\tcurrentLabel: 'Current',\n};\n\nexport interface WorkspaceLocaleStripStrings {\n\tariaLabel: string;\n\tactiveLabel: string;\n\tcompletionLabel: (value: number) => string;\n}\n\nexport const defaultWorkspaceLocaleStripStrings: WorkspaceLocaleStripStrings = {\n\tariaLabel: 'Workspace locales',\n\tactiveLabel: 'Active',\n\tcompletionLabel: (value) => `${value}% complete`,\n};\n","import * as React from 'react';\nimport {\n\tCheck,\n\tCircle,\n\tCircleAlert,\n\ttype LucideIcon,\n\t} from 'lucide-react';\n\nimport { Badge } from '../../base/badge';\nimport { Button } from '../../base/buttons';\nimport { Progress } from '../../base/feedback';\nimport {\n\tItem,\n\tItemActions,\n\tItemContent,\n\tItemDescription,\n\tItemGroup,\n\tItemMedia,\n\tItemTitle,\n} from '../../base/item';\nimport { Stack } from '../../base/structure';\nimport {compositionClasses, compositionRhythm} from '../../base/structure/composition.recipes';\nimport { SecondaryValue, Value } from '../../primitives';\nimport { DisplayLabel, Heading, Text } from '../../typography';\nimport {copyRoleProps, headingRoleSizes} from '../../typography/text.styles';\nimport { useStrings } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport { hasPageHeaderCommands, PageHeaderCommands, type PageHeaderAction } from '../../base/navigation/page-header/page-header-commands';\nimport { useLayoutLinkRenderer } from '../hooks';\nimport type { LayoutIconComponent } from '../layout.types';\nimport {\n\tdefaultWorkspaceLocaleStripStrings,\n\tdefaultWorkspaceNavStrings,\n\tdefaultWorkspaceRecordHeaderStrings,\n} from './workspace.strings';\nimport type {\n\tWorkspaceContentWidth,\n\tWorkspaceLayoutProps,\n\tWorkspaceLocaleItem,\n\tWorkspaceLocaleStripProps,\n\tWorkspaceNavItem,\n\tWorkspaceNavItemStatus,\n\tWorkspaceNavProps,\n\tWorkspaceRecordHeaderProps,\n} from './workspace.types';\nimport { focusRecipes } from '../../../lib/focus-recipes';\nimport { interactionRecipes } from '../../../lib/interaction-recipes';\nimport { toneRecipes } from '../../../lib/tone-recipes';\n\nconst CONTENT_WIDTH_CLASS: Record<WorkspaceContentWidth, string> = {\n\tdefault: '[--workspace-content-max-width:58rem]',\n\twide: '[--workspace-content-max-width:86rem]',\n\tfull: '[--workspace-content-max-width:none]',\n};\n\nconst STATUS_ICON: Record<WorkspaceNavItemStatus, LucideIcon> = {\n\tcomplete: Check,\n\tcurrent: Circle,\n\tattention: CircleAlert,\n\tdisabled: Circle,\n\tidle: Circle,\n};\n\nconst STATUS_CLASS: Record<WorkspaceNavItemStatus, string> = {\n\tcomplete: 'text-success',\n\tcurrent: 'text-primary-accent',\n\tattention: 'text-warning-accent',\n\t// Disabled dims like every disabled control rather than adding a fainter text tier.\n\tdisabled: 'text-muted-foreground opacity-50',\n\tidle: 'text-muted-foreground',\n};\n\nfunction clampPercent(value: number): number {\n\tif (!Number.isFinite(value)) return 0;\n\treturn Math.min(100, Math.max(0, Math.round(value)));\n}\n\nfunction DynamicWorkspaceIcon({\n\ticon,\n\tclassName,\n}: {\n\t/** Leading glyph. */\n\ticon?: LayoutIconComponent;\n\tclassName?: string;\n}) {\n\tif (!icon) return null;\n\tconst Icon = icon;\n\treturn <Icon className={className} aria-hidden=\"true\" />;\n}\n\nfunction getStatus(item: WorkspaceNavItem, active: boolean): WorkspaceNavItemStatus {\n\tif (item.disabled) return 'disabled';\n\tif (item.status) return item.status;\n\tif (item.warning) return 'attention';\n\tif (active) return 'current';\n\tif (item.completion !== undefined && clampPercent(item.completion) >= 100) return 'complete';\n\treturn 'idle';\n}\n\nexport const WorkspaceLayout = React.forwardRef<HTMLDivElement, WorkspaceLayoutProps>(function WorkspaceLayout({\n\theader,\n\tsidebar,\n\trail,\n\tchildren,\n\tcontentWidth = 'wide',\n\tclassName,\n\theaderClassName,\n\tbodyClassName,\n\tsidebarClassName,\n\tmainClassName,\n\tcontentClassName,\n\trailClassName,\n\tariaLabel,\n\tstyle,\n\t...props\n}, ref) {\n\tconst hasSidebar = !!sidebar;\n\tconst hasRail = !!rail;\n\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\taria-label={ariaLabel}\n\t\t\tclassName={cn(\n\t\t\t\t'workspace-layout--component @container/workspace-layout box-border flex h-full min-h-0 w-full flex-col overflow-y-auto overscroll-contain rounded-radius border border-border bg-background text-foreground',\n\t\t\t\t'[--workspace-sidebar-width:var(--shell-sidebar-width)] [--workspace-rail-width:20rem]',\n\t\t\t\tCONTENT_WIDTH_CLASS[contentWidth],\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tstyle={style}\n\t\t\t{...props}\n\t\t>\n\t\t\t{!!header && (\n\t\t\t\t<header className={cn('workspace-layout--header shrink-0 border-b border-border bg-background', headerClassName)}>\n\t\t\t\t\t{header}\n\t\t\t\t</header>\n\t\t\t)}\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'workspace-layout--body grid min-h-0 flex-none grid-cols-1 bg-muted/30 @min-[80rem]/workspace-layout:flex-1',\n\t\t\t\t\thasSidebar && !hasRail && '@min-[80rem]/workspace-layout:grid-cols-[var(--workspace-sidebar-width)_minmax(0,1fr)]',\n\t\t\t\t\thasSidebar && hasRail && '@min-[80rem]/workspace-layout:grid-cols-[var(--workspace-sidebar-width)_minmax(0,1fr)] @min-[96rem]/workspace-layout:grid-cols-[var(--workspace-sidebar-width)_minmax(0,1fr)_var(--workspace-rail-width)]',\n\t\t\t\t\t!hasSidebar && hasRail && '@min-[96rem]/workspace-layout:grid-cols-[minmax(0,1fr)_var(--workspace-rail-width)]',\n\t\t\t\t\tbodyClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{!!hasSidebar && (\n\t\t\t\t\t<aside\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'workspace-layout--sidebar hidden min-h-0 border-r border-border bg-background @min-[80rem]/workspace-layout:block',\n\t\t\t\t\t\t\tsidebarClassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"h-full overflow-y-auto overscroll-contain p-space-lg\">\n\t\t\t\t\t\t\t{sidebar}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</aside>\n\t\t\t\t)}\n\t\t\t\t<main\n\t\t\t\t\ttabIndex={0}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t`workspace-layout--main min-h-0 min-w-0 overflow-visible @min-[80rem]/workspace-layout:overflow-y-auto overscroll-contain focus-visible:outline-none ${focusRecipes.inset}`,\n\t\t\t\t\t\tmainClassName,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'workspace-layout--content box-border mx-auto flex min-h-full w-full max-w-[var(--workspace-content-max-width)] flex-col p-surface-lg', compositionClasses.subjects,\n\t\t\t\t\t\t\tcontentWidth === 'full' && 'max-w-none',\n\t\t\t\t\t\t\tcontentClassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</div>\n\t\t\t\t</main>\n\t\t\t\t{!!hasRail && (\n\t\t\t\t\t<aside\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'workspace-layout--rail hidden min-h-0 border-l border-border bg-background @min-[96rem]/workspace-layout:block',\n\t\t\t\t\t\t\trailClassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"h-full overflow-y-auto overscroll-contain p-space-lg\">\n\t\t\t\t\t\t\t{rail}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</aside>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n});\n\nWorkspaceLayout.displayName = 'WorkspaceLayout';\n\n/** Role-based command objects rather than rendered elements. */\nfunction isCommandList(value: unknown): value is readonly PageHeaderAction[] {\n\treturn Array.isArray(value) && value.every((item) =>\n\t\titem !== null && typeof item === 'object' && !React.isValidElement(item) && 'label' in item);\n}\n\nexport const WorkspaceRecordHeader = React.forwardRef<HTMLDivElement, WorkspaceRecordHeaderProps>(function WorkspaceRecordHeader({\n\ttitle,\n\tdescription,\n\ttextGap = 'dense',\n\tbadges,\n\tmetadata,\n\tactions,\n\tprimaryAction,\n\tsecondaryActions,\n\tmoreActionsLabel = 'More actions',\n\trenderLink,\n\tstatus,\n\tmedia,\n\theaderEnd,\n\ttitleSlot,\n\tclassName,\n\tstrings: stringsProp,\n\t...props\n}, ref) {\n\tconst strings = useStrings(defaultWorkspaceRecordHeaderStrings, stringsProp);\n\tconst resolvedRenderLink = useLayoutLinkRenderer({ renderLink });\n\tconst hasMetadata = !!metadata?.length;\n\t// Command objects take the shared role-based row; elements keep the\n\t// previous free-form cluster.\n\tconst secondaryCommands = isCommandList(secondaryActions) ? secondaryActions : undefined;\n\tconst secondaryNodes = secondaryCommands ? undefined : (secondaryActions as React.ReactNode);\n\tconst hasCommands = hasPageHeaderCommands(primaryAction, secondaryCommands);\n\n\treturn (\n\t\t<Stack\n\t\t\tref={ref}\n\t\t\tdirection=\"horizontal\"\n\t\t\tgap=\"xl\"\n\t\t\talign=\"start\"\n\t\t\tjustify=\"between\"\n\t\t\twrap\n\t\t\tclassName={cn(\n\t\t\t\t'workspace-record-header--component p-surface-lg',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t\t<Stack gap={textGap} className=\"workspace-record-header--identity min-w-0 max-w-full flex-1 basis-64\">\n\t\t\t\t\t<Stack direction=\"horizontal\" gap=\"lg\" align=\"center\" wrap={false}>\n\t\t\t\t{!!media && (\n\t\t\t\t\t<div className=\"workspace-record-header--media flex size-12 shrink-0 items-center justify-center overflow-hidden rounded-inner border border-border bg-muted/30\">\n\t\t\t\t\t\t{media}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t\t\t<Stack direction=\"horizontal\" gap=\"md\" className=\"workspace-record-header--title-row min-w-0 flex-1\">\n\t\t\t\t\t\t{titleSlot ?? (\n\t\t\t\t\t\t\t<Heading tag=\"h4\" size={headingRoleSizes.subject} className=\"[overflow-wrap:anywhere]\">\n\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t</Heading>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{!!badges && <Stack direction=\"horizontal\" wrap align=\"center\" gap=\"sm\" className=\"workspace-record-header--badges\">{badges}</Stack>}\n\t\t\t\t\t\t\t{!!status && <div className=\"workspace-record-header--status\">{status}</div>}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t</Stack>\n\t\t\t\t\t{!!description && (\n\t\t\t\t\t\t<Text {...copyRoleProps.structuralDescription} lineHeight=\"relaxed\" className=\"workspace-record-header--description max-w-4xl\">\n\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t)}\n\t\t\t\t\t{!!hasMetadata && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\taria-label={strings.metadataLabel}\n\t\t\t\t\t\t\tclassName=\"workspace-record-header--metadata flex flex-wrap items-center gap-x-space-xl gap-y-space-xs\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{metadata.map((item, index) => (\n\t\t\t\t\t\t\t\t<div key={item.id ?? index} className=\"flex items-baseline gap-space-sm\">\n\t\t\t\t\t\t\t\t\t<DisplayLabel>\n\t\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t\t\t\t\t<Value className=\"tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t{item.value}\n\t\t\t\t\t\t\t\t\t</Value>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t{!!(actions || secondaryNodes || hasCommands || headerEnd) && (\n\t\t\t\t<div className={cn('workspace-record-header--actions flex max-w-full shrink-0 flex-wrap items-center justify-end', compositionClasses.commands)}>\n\t\t\t\t\t{!!secondaryNodes && (\n\t\t\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap={compositionRhythm.commands} aria-label={strings.secondaryActionsLabel}>\n\t\t\t\t\t\t\t{secondaryNodes}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t)}\n\t\t\t\t\t{!!actions && (\n\t\t\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap={compositionRhythm.commands} aria-label={strings.actionsLabel}>\n\t\t\t\t\t\t\t{actions}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t)}\n\t\t\t\t\t{hasCommands && (\n\t\t\t\t\t\t<PageHeaderCommands\n\t\t\t\t\t\t\tprimaryAction={primaryAction}\n\t\t\t\t\t\t\tsecondaryActions={secondaryCommands}\n\t\t\t\t\t\t\tmoreActionsLabel={moreActionsLabel}\n\t\t\t\t\t\t\trenderLink={resolvedRenderLink}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t{!!headerEnd && <div className=\"workspace-record-header--end\">{headerEnd}</div>}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</Stack>\n\t);\n});\n\nWorkspaceRecordHeader.displayName = 'WorkspaceRecordHeader';\n\nexport const WorkspaceNav = React.forwardRef<HTMLElement, WorkspaceNavProps>(function WorkspaceNav({\n\tgroups,\n\tactiveId,\n\tonSelect,\n\trenderItem,\n\tfooterSlot,\n\trenderLink,\n\tclassName,\n\tstrings: stringsProp,\n\t...props\n}, ref) {\n\tconst strings = useStrings(defaultWorkspaceNavStrings, stringsProp);\n\tconst resolvedRenderLink = useLayoutLinkRenderer({ renderLink });\n\n\treturn (\n\t\t<Stack\n\t\t\trender={(\n\t\t\t\t<nav\n\t\t\t\t\tref={ref}\n\t\t\t\t\taria-label={props['aria-label'] ?? strings.ariaLabel}\n\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\tgap=\"xl\"\n\t\t\tclassName={cn('workspace-nav--component h-full', className)}\n\t\t>\n\t\t\t<Stack gap=\"xl\" className=\"workspace-nav--groups min-h-0 flex-1\">\n\t\t\t\t{groups.map((group) => (\n\t\t\t\t\t<Stack key={group.id} gap=\"md\" className=\"workspace-nav--group\">\n\t\t\t\t\t\t{!!group.label && (\n\t\t\t\t\t\t\t<Stack gap=\"dense\" className=\"workspace-nav--group-header px-space-xs\">\n\t\t\t\t\t\t\t\t<DisplayLabel>\n\t\t\t\t\t\t\t\t\t{group.label}\n\t\t\t\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t\t\t\t{!!group.description && (\n\t\t\t\t\t\t\t\t\t<Text size=\"xs\" type=\"secondary\">\n\t\t\t\t\t\t\t\t\t\t{group.description}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<ItemGroup className=\"workspace-nav--items gap-space-xs\">\n\t\t\t\t\t\t\t{group.items.map((item, index) => {\n\t\t\t\t\t\t\t\tconst active = item.id === activeId;\n\t\t\t\t\t\t\t\tconst status = getStatus(item, active);\n\t\t\t\t\t\t\t\tconst StatusIcon = STATUS_ICON[status];\n\t\t\t\t\t\t\t\tconst completion = item.completion === undefined ? undefined : clampPercent(item.completion);\n\t\t\t\t\t\t\t\tconst handleSelect = (event: React.MouseEvent<HTMLElement>) => {\n\t\t\t\t\t\t\t\t\tif (item.disabled) {\n\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tonSelect?.(item);\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tconst context = { active, group, index, onSelect: handleSelect };\n\n\t\t\t\t\t\t\t\tif (renderItem) {\n\t\t\t\t\t\t\t\t\treturn <React.Fragment key={item.id}>{renderItem(item, context)}</React.Fragment>;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst rowContent = (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t<ItemMedia variant=\"icon\" className={cn(active && 'text-accent-foreground')}>\n\t\t\t\t\t\t\t\t\t\t\t{item.icon ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<DynamicWorkspaceIcon icon={item.icon} className=\"size-icon\" />\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t<StatusIcon className={cn('size-icon-md', STATUS_CLASS[status])} aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</ItemMedia>\n\t\t\t\t\t\t\t\t\t\t<ItemContent>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-space-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t<ItemTitle>{item.label}</ItemTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t{active && (\n\t\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" className=\"sr-only\">{strings.currentLabel}</Text>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t{!!item.description && <ItemDescription clamp={2}>{item.description}</ItemDescription>}\n\t\t\t\t\t\t\t\t\t\t\t{completion !== undefined && (\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"mt-1.5 flex items-center gap-space-md\">\n\t\t\t\t\t\t\t\t\t\t\t<Progress\n\t\t\t\t\t\t\t\t\t\t\t\tvalue={completion}\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-label={strings.completionLabel(completion)}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex-1\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<SecondaryValue size=\"xs\" className=\"tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{strings.completionLabel(completion)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</SecondaryValue>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</ItemContent>\n\t\t\t\t\t\t\t\t\t\t{!!item.badge && <ItemActions>{item.badge}</ItemActions>}\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tconst itemClassName = cn(\n\t\t\t\t\t\t\t\t\t'workspace-nav--item w-full border border-transparent px-row-x py-row-y text-left transition-colors',\n\t\t\t\t\t\t\t\t\tactive && interactionRecipes.rowCurrent,\n\t\t\t\t\t\t\t\t\titem.warning && !active && cn(toneRecipes.warning.edge, toneRecipes.warning.wash),\n\t\t\t\t\t\t\t\t\titem.disabled && 'pointer-events-none opacity-50',\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tif (item.href) {\n\t\t\t\t\t\t\t\t\tconst linkNode = resolvedRenderLink({\n\t\t\t\t\t\t\t\t\t\thref: item.href,\n\t\t\t\t\t\t\t\t\t\tchildren: rowContent,\n\t\t\t\t\t\t\t\t\t\tclassName: 'block',\n\t\t\t\t\t\t\t\t\t\tactive,\n\t\t\t\t\t\t\t\t\t\tdisabled: item.disabled,\n\t\t\t\t\t\t\t\t\t\texternal: item.external,\n\t\t\t\t\t\t\t\t\t\ttarget: item.target,\n\t\t\t\t\t\t\t\t\t\trel: item.rel,\n\t\t\t\t\t\t\t\t\t\tonClick: handleSelect as React.MouseEventHandler<HTMLAnchorElement>,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<Item key={item.id} size=\"md\" render={linkNode as React.ReactElement} className={itemClassName}>\n\t\t\t\t\t\t\t\t\t\t\t{rowContent}\n\t\t\t\t\t\t\t\t\t\t</Item>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<Item\n\t\t\t\t\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\t\t\t\t\tsize=\"md\"\n\t\t\t\t\t\t\t\t\t\trender={<button type=\"button\" onClick={handleSelect} disabled={item.disabled} />}\n\t\t\t\t\t\t\t\t\t\tclassName={itemClassName}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{rowContent}\n\t\t\t\t\t\t\t\t\t</Item>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</ItemGroup>\n\t\t\t\t\t</Stack>\n\t\t\t\t))}\n\t\t\t</Stack>\n\t\t\t{!!footerSlot && <div className=\"workspace-nav--footer shrink-0 border-t border-border pt-space-lg\">{footerSlot}</div>}\n\t\t</Stack>\n\t);\n});\n\nWorkspaceNav.displayName = 'WorkspaceNav';\n\nexport const WorkspaceLocaleStrip = React.forwardRef<HTMLDivElement, WorkspaceLocaleStripProps>(function WorkspaceLocaleStrip({\n\tlocales,\n\tactiveLocale,\n\tonLocaleChange,\n\tactions,\n\tstatus,\n\tclassName,\n\tstrings: stringsProp,\n\t...props\n}, ref) {\n\tconst strings = useStrings(defaultWorkspaceLocaleStripStrings, stringsProp);\n\n\tconst handleLocaleClick = (locale: WorkspaceLocaleItem) => {\n\t\tif (locale.disabled) return;\n\t\tonLocaleChange?.(locale);\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\tclassName={cn('workspace-locale-strip--component flex flex-col gap-space-lg border-t border-border bg-muted/50 px-surface-lg py-surface min-[64rem]:flex-row min-[64rem]:items-center min-[64rem]:justify-between', className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap=\"md\" className=\"workspace-locale-strip--locales min-w-0\" role=\"group\" aria-label={strings.ariaLabel}>\n\t\t\t\t{locales.map((locale) => {\n\t\t\t\t\tconst active = locale.id === activeLocale;\n\t\t\t\t\tconst completion = locale.completion === undefined ? undefined : clampPercent(locale.completion);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tkey={locale.id}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\ttone={active ? 'primary' : 'secondary'}\n\t\t\t\t\t\t\tbuttonStyle={active ? 'solid' : 'ghost'}\n\t\t\t\t\t\t\tonClick={() => handleLocaleClick(locale)}\n\t\t\t\t\t\t\tdisabled={locale.disabled}\n\t\t\t\t\t\t\taria-pressed={active}\n\t\t\t\t\t\t\tclassName={cn('workspace-locale-strip--item justify-start')}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Stack direction=\"horizontal\" align=\"center\" gap=\"md\" render={<span />} className=\"min-w-0\">\n\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" className=\"truncate text-inherit\">{locale.label}</Text>\n\t\t\t\t\t\t\t{active && <Text tag=\"span\" size=\"inherit\" className=\"sr-only\">{strings.activeLabel}</Text>}\n\t\t\t\t\t\t\t\t{completion !== undefined && (\n\t\t\t\t\t\t\t\t\t/* On an active pill the button surface is solid, so the tonal\n\t\t\t\t\t\t\t\t\t badge variants land coloured-on-coloured. Derive the nested\n\t\t\t\t\t\t\t\t\t badge from the primary foreground pair so it remains legible\n\t\t\t\t\t\t\t\t\t when dark themes intentionally lighten `--primary`. */\n\t\t\t\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\t\t\t\ttone={completion >= 100 ? 'success' : 'secondary'}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t'shrink-0',\n\t\t\t\t\t\t\t\t\t\t\tactive && 'border-primary-foreground/20 bg-primary-foreground/10 text-primary-foreground',\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{strings.completionLabel(completion)}\n\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{!!locale.status && <span className=\"shrink-0\">{locale.status}</span>}\n\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</Stack>\n\t\t\t{!!(status || actions) && (\n\t\t\t\t<Stack direction=\"horizontal\" wrap align=\"center\" gap={compositionRhythm.commands} className=\"workspace-locale-strip--actions shrink-0\">\n\t\t\t\t\t{!!status && <div className=\"workspace-locale-strip--status\">{status}</div>}\n\t\t\t\t\t{!!actions && <Stack direction=\"horizontal\" wrap align=\"center\" gap={compositionRhythm.commands}>{actions}</Stack>}\n\t\t\t\t</Stack>\n\t\t\t)}\n\t\t</div>\n\t);\n});\n\nWorkspaceLocaleStrip.displayName = 'WorkspaceLocaleStrip';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAMA,IAAa6B,IAAoE;CAChF,eAAe;CACf,cAAc;CACd,uBAAuB;AACxB,GAQaC,IAAkD;CAC9D,WAAW;CACX,kBAAkB,MAAU,GAAGC,EAAM;CACrC,cAAc;AACf,GAQaC,IAAkE;CAC9E,WAAW;CACX,aAAa;CACb,kBAAkB,MAAU,GAAGD,EAAM;AACtC,GCgBME,IAA6D;CAClE,SAAS;CACT,MAAM;CACN,MAAM;AACP,GAEMC,IAA0D;CAC/D,UAAUC;CACV,SAASC;CACT,WAAWC;CACX,UAAUD;CACV,MAAMA;AACP,GAEME,IAAuD;CAC5D,UAAU;CACV,SAAS;CACT,WAAW;CAEX,UAAU;CACV,MAAM;AACP;AAEA,SAASC,EAAa,GAAuB;CAE5C,OADK,OAAO,SAASR,CAAK,IACnB,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,MAAMA,CAAK,CAAC,CAAC,IADf;AAErC;AAEA,SAASS,EAAqB,EAC7B,SACA,gBAKE;CAGF,OAFKC,IAEE,kBAACzC,GAAD;EAAiB;EAAW,eAAY;CAAQ,CAAA,IAFrC;AAGnB;AAEA,SAAS0C,EAAU,GAAwB,GAAyC;CAMnF,OALIC,EAAK,WAAiB,aACtBA,EAAK,SAAeA,EAAK,SACzBA,EAAK,UAAgB,cACrBC,IAAe,YACfD,EAAK,eAAe,KAAA,KAAaJ,EAAaI,EAAK,UAAU,KAAK,MAAY,aAC3E;AACR;AAEA,IAAaE,IAAkB5C,EAAM,WAAiD,SAAyB,EAC9G,WACA,YACA,SACA,aACA,kBAAe,QACf,cACA,oBACA,kBACA,qBACA,kBACA,qBACA,kBACA,cACA,UACA,GAAG6C,KACD,GAAK;CACP,IAAMC,IAAa,CAAC,CAACC,GACfC,IAAU,CAAC,CAACC;CAElB,OACC,kBAAC,OAAD;EACM;EACL,cAAYC;EACZ,WAAWC,EACV,+MACA,yFACAnB,EAAoBoB,IACpBC,CACD;EACO;EACP,GAAIR;EAVL,UAAA,CAYE,CAAC,CAACS,KACF,kBAAC,UAAD;GAAQ,WAAWH,EAAG,0EAA0EI,CAAe;GAC7G,UAAAD;EACM,CAAA,GAET,kBAAC,OAAD;GACC,WAAWH,EACV,8GACAL,KAAc,CAACE,KAAW,0FAC1BF,KAAcE,KAAW,6MACzB,CAACF,KAAcE,KAAW,uFAC1BQ,CACD;GAPD,UAAA;IASE,CAAC,CAACV,KACF,kBAAC,SAAD;KACC,WAAWK,EACV,qHACAM,CACD;KAEA,UAAA,kBAAC,OAAD;MAAK,WAAU;MACb,UAAAV;KACG,CAAA;IACC,CAAA;IAER,kBAAC,QAAD;KACC,UAAU;KACV,WAAWI,EACT,uJAAuJ5C,EAAa,SACrKmD,CACD;KAEA,UAAA,kBAAC,OAAD;MACC,WAAWP,EACV,wIAAwIvC,EAAmB,UAC3JwC,MAAiB,UAAU,cAC3BO,CACD;MAEC;KACG,CAAA;IACA,CAAA;IACL,CAAC,CAACX,KACF,kBAAC,SAAD;KACC,WAAWG,EACV,kHACAS,CACD;KAEA,UAAA,kBAAC,OAAD;MAAK,WAAU;MACb,UAAAX;KACG,CAAA;IACC,CAAA;GAEJ;EACD,CAAA,CAAA;;AAEP,CAAC;AAED,EAAgB,cAAc;AAG9B,SAASY,EAAc,GAAsD;CAC5E,OAAO,MAAM,QAAQ/B,CAAK,KAAKA,EAAM,OAAO,MAC1B,OAAOY,KAAS,cAAjCA,KAA6C,CAAC1C,EAAM,eAAe0C,CAAI,KAAK,WAAWA,CAAI;AAC7F;AAEA,IAAaoB,IAAwB9D,EAAM,WAAuD,SAA+B,EAChI,UACA,gBACA,aAAU,SACV,WACA,aACA,YACA,kBACA,qBACA,sBAAmB,gBACnB,eACA,WACA,UACA,cACA,cACA,cACA,SAAS+D,GACT,GAAGlB,KACD,GAAK;CACP,IAAMmB,IAAUC,EAAWrC,GAAqCmC,CAAW,GACrEG,IAAqBzC,EAAsB,EAAE,cAAW,CAAC,GACzD0C,IAAc,CAAC,CAACC,GAAU,QAG1BC,IAAoBR,EAAcS,CAAgB,IAAIA,IAAmB,KAAA,GACzEC,IAAiBF,IAAoB,KAAA,IAAaC,GAClDE,IAAcjD,EAAsBkD,GAAeJ,CAAiB;CAE1E,OACC,kBAAC7D,GAAD;EACM;EACL,WAAU;EACV,KAAI;EACJ,OAAM;EACN,SAAQ;EACR,MAAA;EACA,WAAW2C,EACV,mDACAE,CACD;EACA,GAAIR;EAXL,UAAA,CAaE,kBAACrC,GAAD;GAAO,KAAKkE;GAAS,WAAU;GAA/B,UAAA;IACC,kBAAClE,GAAD;KAAO,WAAU;KAAa,KAAI;KAAK,OAAM;KAAS,MAAM;KAA5D,UAAA,CACA,CAAC,CAACmE,KACF,kBAAC,OAAD;MAAK,WAAU;MACb,UAAAA;KACG,CAAA,GAEJ,kBAACnE,GAAD;MAAO,WAAU;MAAa,KAAI;MAAK,WAAU;MAAjD,UAAA;OACCoE,KACA,kBAACxE,GAAD;QAAS,KAAI;QAAK,MAAMC,EAAiB;QAAS,WAAU;QAC1D,UAAAwE;OACO,CAAA;OAER,CAAC,CAACC,KAAU,kBAACtE,GAAD;QAAO,WAAU;QAAa,MAAA;QAAK,OAAM;QAAS,KAAI;QAAK,WAAU;QAAmC,UAAAsE;OAAc,CAAA;OAClI,CAAC,CAACC,KAAU,kBAAC,OAAD;QAAK,WAAU;QAAmC,UAAAA;OAAY,CAAA;MACrE;KACD,CAAA,CAAA;;IACN,CAAC,CAACC,KACF,kBAAC9E,GAAD;KAAM,GAAII,EAAc;KAAuB,YAAW;KAAU,WAAU;KAC5E,UAAA0E;IACI,CAAA;IAEN,CAAC,CAACb,KACF,kBAAC,OAAD;KACC,cAAYH,EAAQ;KACpB,WAAU;KAET,UAAAI,EAAS,KAAK,GAAM,MACpB,kBAAC,OAAD;MAA4B,WAAU;MAAtC,UAAA,CACC,kBAACjE,GAAD,EAAA,UACEuC,EAAK,MACO,CAAA,GACd,kBAAC5B,GAAD;OAAO,WAAU;OACf,UAAA4B,EAAK;MACA,CAAA,CACF;KAPI,GAAAA,EAAK,MAAMuC,CAOf,CACL;IACG,CAAA;GAED;EACP,CAAA,GAAA,CAAC,EAAEC,KAAWX,KAAkBC,KAAeW,MAC/C,kBAAC,OAAD;GAAK,WAAWhC,EAAG,gGAAgGvC,EAAmB,QAAQ;GAA9I,UAAA;IACE,CAAC,CAAC2D,KACF,kBAAC/D,GAAD;KAAO,WAAU;KAAa,MAAA;KAAK,OAAM;KAAS,KAAKG,EAAkB;KAAU,cAAYqD,EAAQ;KACrG,UAAAO;IACK,CAAA;IAEP,CAAC,CAACW,KACF,kBAAC1E,GAAD;KAAO,WAAU;KAAa,MAAA;KAAK,OAAM;KAAS,KAAKG,EAAkB;KAAU,cAAYqD,EAAQ;KACrG,UAAAkB;IACK,CAAA;IAEPV,KACA,kBAAChD,GAAD;KACgB;KACf,kBAAkB6C;KACA;KAClB,YAAYH;IACZ,CAAA;IAED,CAAC,CAACiB,KAAa,kBAAC,OAAD;KAAK,WAAU;KAAgC,UAAAA;IAAe,CAAA;GAC1E;EAEA,CAAA,CAAA;;AAET,CAAC;AAED,EAAsB,cAAc;AAEpC,IAAaC,IAAepF,EAAM,WAA2C,SAAsB,EAClG,WACA,aACA,aACA,eACA,eACA,eACA,cACA,SAAS+D,GACT,GAAGlB,KACD,GAAK;CACP,IAAMmB,IAAUC,EAAWpC,GAA4BkC,CAAW,GAC5DG,IAAqBzC,EAAsB,EAAE,cAAW,CAAC;CAE/D,OACC,kBAACjB,GAAD;EACC,QACC,kBAAC,OAAD;GACM;GACL,cAAYqC,EAAM,iBAAiBmB,EAAQ;GAC3C,GAAInB;EACJ,CAAA;EAEF,KAAI;EACJ,WAAWM,EAAG,mCAAmCE,CAAS;EAT3D,UAAA,CAWC,kBAAC7C,GAAD;GAAO,KAAI;GAAK,WAAU;GACxB,UAAA6E,EAAO,KAAK,MACZ,kBAAC7E,GAAD;IAAsB,KAAI;IAAK,WAAU;IAAzC,UAAA,CACE,CAAC,CAAC8E,EAAM,SACR,kBAAC9E,GAAD;KAAO,KAAI;KAAQ,WAAU;KAA7B,UAAA,CACC,kBAACL,GAAD,EAAA,UACEmF,EAAM,MACM,CAAA,GACb,CAAC,CAACA,EAAM,eACR,kBAACpF,GAAD;MAAM,MAAK;MAAK,MAAK;MACnB,UAAAoF,EAAM;KACF,CAAA,CAED;IAER,CAAA,GAAA,kBAACnE,GAAD;KAAW,WAAU;KACnB,UAAAmE,EAAM,MAAM,KAAK,GAAM,MAAU;MACjC,IAAM3C,IAASD,EAAK,OAAO6C,GACrBR,IAAStC,EAAUC,GAAMC,CAAM,GAC/B6C,IAAavD,EAAY8C,IACzBU,IAAa/C,EAAK,eAAe,KAAA,IAAY,KAAA,IAAYJ,EAAaI,EAAK,UAAU,GACrFgD,KAAgB,MAAyC;OAC9D,IAAIhD,EAAK,UAAU;QAClB,EAAM,eAAe;QACrB;OACD;OACA,IAAWA,CAAI;MAChB,GACMiD,IAAU;OAAE;OAAQ;OAAO;OAAO,UAAUD;MAAa;MAE/D,IAAIE,GACH,OAAO,kBAAC5F,EAAM,UAAP,EAAA,UAA+B4F,EAAWlD,GAAMiD,CAAO,EAAkB,GAApDjD,EAAK,EAA+C;MAGjF,IAAMmD,IACL,kBAAA5F,GAAA,EAAA,UAAA;OACC,kBAACe,GAAD;QAAW,SAAQ;QAAO,WAAWmC,EAAGR,KAAU,wBAAwB;QACxE,UAAAD,EAAK,OACL,kBAACH,GAAD;SAAsB,MAAMG,EAAK;SAAM,WAAU;QAAa,CAAA,IAE9D,kBAAC8C,GAAD;SAAY,WAAWrC,EAAG,gBAAgBd,EAAa0C,EAAO;SAAG,eAAY;QAAQ,CAAA;OAE5E,CAAA;OACX,kBAAC3D,GAAD,EAAA,UAAA;QACC,kBAAC,OAAD;SAAK,WAAU;SAAf,UAAA,CACC,kBAACE,GAAD,EAAA,UAAYoB,EAAK,MAAiB,CAAA,GACjCC,KACF,kBAACzC,GAAD;UAAM,KAAI;UAAO,MAAK;UAAU,WAAU;UAAW,UAAA8D,EAAQ;SAAmB,CAAA,CAE3E;;QACJ,CAAC,CAACtB,EAAK,eAAe,kBAACzB,GAAD;SAAiB,OAAO;SAAI,UAAAyB,EAAK;QAA6B,CAAA;QACpF+C,MAAe,KAAA,KACf,kBAAC,OAAD;SAAK,WAAU;SAAf,UAAA,CACD,kBAAC/E,GAAD;UACC,OAAO+E;UACP,MAAK;UACL,cAAYzB,EAAQ,gBAAgByB,CAAU;UAC9C,WAAU;SACV,CAAA,GACC,kBAACK,GAAD;UAAgB,MAAK;UAAK,WAAU;UAClC,UAAA9B,EAAQ,gBAAgByB,CAAU;SACpB,CAAA,CACZ;;OAEM,EAAA,CAAA;OACZ,CAAC,CAAC/C,EAAK,SAAS,kBAACxB,GAAD,EAAA,UAAcwB,EAAK,MAAmB,CAAA;MACtD,EAAA,CAAA,GAGGqD,IAAgB5C,EACrB,sGACAR,KAAU9B,EAAmB,YAC7B6B,EAAK,WAAW,CAACC,KAAUQ,EAAG1C,EAAY,QAAQ,MAAMA,EAAY,QAAQ,IAAI,GAChFiC,EAAK,YAAY,gCAClB;MAEA,IAAIA,EAAK,MAAM;OACd,IAAMsD,IAAW9B,EAAmB;QACnC,MAAMxB,EAAK;QACX,UAAUmD;QACV,WAAW;QACX;QACA,UAAUnD,EAAK;QACf,UAAUA,EAAK;QACf,QAAQA,EAAK;QACb,KAAKA,EAAK;QACV,SAASgD;OACV,CAAC;OACD,OACC,kBAACrE,GAAD;QAAoB,MAAK;QAAK,QAAQ2E;QAAgC,WAAWD;QAC/E,UAAAF;OACI,GAFKnD,EAAK,EAEV;MAER;MAEA,OACC,kBAACrB,GAAD;OAEC,MAAK;OACL,QAAQ,kBAAC,UAAD;QAAQ,MAAK;QAAS,SAASqE;QAAc,UAAUhD,EAAK;OAAW,CAAA;OAC/E,WAAWqD;OAEV,UAAAF;MACI,GANAnD,EAAK,EAML;KAER,CAAC;IACS,CAAA,CACL;GAzGK,GAAA4C,EAAM,EAyGX,CACP;EACK,CAAA,GACN,CAAC,CAACW,KAAc,kBAAC,OAAD;GAAK,WAAU;GAAqE,UAAAA;EAAgB,CAAA,CAC/G;;AAET,CAAC;AAED,EAAa,cAAc;AAE3B,IAAaC,IAAuBlG,EAAM,WAAsD,SAA8B,EAC7H,YACA,iBACA,mBACA,YACA,WACA,cACA,SAAS+D,GACT,GAAGlB,KACD,GAAK;CACP,IAAMmB,IAAUC,EAAWlC,GAAoCgC,CAAW,GAEpEoC,KAAqB,MAAgC;EAC1D,AAAIC,EAAO,YACXC,IAAiBD,CAAM;CACxB;CAEA,OACC,kBAAC,OAAD;EACM;EACL,WAAWjD,EAAG,sMAAsME,CAAS;EAC7N,GAAIR;EAHL,UAAA,CAKC,kBAACrC,GAAD;GAAO,WAAU;GAAa,MAAA;GAAK,OAAM;GAAS,KAAI;GAAK,WAAU;GAA0C,MAAK;GAAQ,cAAYwD,EAAQ;GAC9I,UAAAsC,EAAQ,KAAK,MAAW;IACxB,IAAM3D,IAASyD,EAAO,OAAOG,GACvBd,IAAaW,EAAO,eAAe,KAAA,IAAY,KAAA,IAAY9D,EAAa8D,EAAO,UAAU;IAC/F,OACC,kBAACI,GAAD;KAEC,MAAK;KACL,MAAM7D,IAAS,YAAY;KAC3B,aAAaA,IAAS,UAAU;KAChC,eAAewD,EAAkBC,CAAM;KACvC,UAAUA,EAAO;KACjB,gBAAczD;KACd,WAAWQ,EAAG,4CAA4C;KAE1D,UAAA,kBAAC3C,GAAD;MAAO,WAAU;MAAa,OAAM;MAAS,KAAI;MAAK,QAAQ,kBAAC,QAAD,CAAO,CAAA;MAAG,WAAU;MAAlF,UAAA;OACA,kBAACN,GAAD;QAAM,KAAI;QAAO,MAAK;QAAU,WAAU;QAAyB,UAAAkG,EAAO;OAAY,CAAA;OACrFzD,KAAU,kBAACzC,GAAD;QAAM,KAAI;QAAO,MAAK;QAAU,WAAU;QAAW,UAAA8D,EAAQ;OAAkB,CAAA;OACxFyB,MAAe,KAAA,KAKf,kBAAC1E,GAAD;QACC,MAAM0E,KAAc,MAAM,YAAY;QACtC,WAAWtC,EACV,YACAR,KAAU,+EACX;QAEC,UAAAqB,EAAQ,gBAAgByB,CAAU;OAC7B,CAAA;OAEP,CAAC,CAACW,EAAO,UAAU,kBAAC,QAAD;QAAM,WAAU;QAAY,UAAAA,EAAO;OAAa,CAAA;MAC9D;;IACA,GA7BFA,EAAO,EA6BL;GAEV,CAAC;EACK,CAAA,GACN,CAAC,EAAErB,KAAUG,MACb,kBAAC1E,GAAD;GAAO,WAAU;GAAa,MAAA;GAAK,OAAM;GAAS,KAAKG,EAAkB;GAAU,WAAU;GAA7F,UAAA,CACE,CAAC,CAACoE,KAAU,kBAAC,OAAD;IAAK,WAAU;IAAkC,UAAAA;GAAY,CAAA,GACzE,CAAC,CAACG,KAAW,kBAAC1E,GAAD;IAAO,WAAU;IAAa,MAAA;IAAK,OAAM;IAAS,KAAKG,EAAkB;IAAW,UAAAuE;GAAe,CAAA,CAC3G;EAEJ,CAAA,CAAA;;AAEP,CAAC;AAED,EAAqB,cAAc"}
|