themelia-react-ui 2.0.3 → 2.0.5
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 +185 -0
- package/README.md +168 -36
- package/dist/{accordion-Cjb6sx0G.js → accordion-B9MHG0cT.js} +11 -11
- package/dist/accordion-B9MHG0cT.js.map +1 -0
- package/dist/action-menu-Dr8K-ghE.js +284 -0
- package/dist/action-menu-Dr8K-ghE.js.map +1 -0
- package/dist/{affordance-geometry.generated-tF36bREk.js → affordance-geometry.generated-P-aVJisu.js} +42 -36
- package/dist/affordance-geometry.generated-P-aVJisu.js.map +1 -0
- package/dist/{ai-artifact-DvTwDVyL.js → ai-artifact-C58tQcBy.js} +387 -350
- package/dist/ai-artifact-C58tQcBy.js.map +1 -0
- package/dist/app-shell-B_IuNWOo.js +321 -0
- package/dist/app-shell-B_IuNWOo.js.map +1 -0
- package/dist/{attachment-BxDfL2mw.js → attachment-Dg_69lPS.js} +9 -9
- package/dist/{attachment-BxDfL2mw.js.map → attachment-Dg_69lPS.js.map} +1 -1
- package/dist/{auth-BGua8ouh.js → auth-DTkkshS8.js} +44 -47
- package/dist/auth-DTkkshS8.js.map +1 -0
- package/dist/{avatar-DAPlDvhJ.js → avatar-CeZaFmNH.js} +8 -8
- package/dist/avatar-CeZaFmNH.js.map +1 -0
- package/dist/{badge-HpFqoqSY.js → badge-xIiV_E7f.js} +5 -5
- package/dist/{badge-HpFqoqSY.js.map → badge-xIiV_E7f.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 +3 -3
- package/dist/base/forms-numeric.js +1 -1
- package/dist/base/forms.js +3 -3
- 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 +12 -12
- 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 +7 -7
- package/dist/base/signature-pad.js.map +1 -1
- package/dist/base/skeleton.js +1 -1
- package/dist/base/spinner.js +4 -4
- 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-DnUJ21NQ.js → batch-action-bar-Cb8cuvyy.js} +6 -6
- package/dist/batch-action-bar-Cb8cuvyy.js.map +1 -0
- package/dist/blocks/admin.js +23 -23
- package/dist/blocks/admin.js.map +1 -1
- package/dist/blocks/ai.js +230 -216
- package/dist/blocks/ai.js.map +1 -1
- package/dist/blocks/analytics/usage-card.js +1 -1
- package/dist/blocks/analytics.js +326 -307
- 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 +1247 -1169
- 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-C-oqs1sQ.js → breadcrumbs-J-K2kl4c.js} +6 -6
- package/dist/{breadcrumbs-C-oqs1sQ.js.map → breadcrumbs-J-K2kl4c.js.map} +1 -1
- package/dist/{button-DVzspB_G.js → button-S2Cubiiz.js} +3 -3
- package/dist/button-S2Cubiiz.js.map +1 -0
- package/dist/{buttons-DPZekJFu.js → buttons-BedGfygC.js} +16 -16
- package/dist/buttons-BedGfygC.js.map +1 -0
- package/dist/cards-rNX1M4Xn.js +69 -0
- package/dist/cards-rNX1M4Xn.js.map +1 -0
- package/dist/cascader-B1MiqkBq.js +439 -0
- package/dist/cascader-B1MiqkBq.js.map +1 -0
- package/dist/chart-Darg_0Kv.js +162 -0
- package/dist/chart-Darg_0Kv.js.map +1 -0
- package/dist/{checkbox-AWIhNhmo.js → checkbox-fflqmODR.js} +9 -5
- package/dist/checkbox-fflqmODR.js.map +1 -0
- package/dist/choice-inputs-zUgBZfE4.js +777 -0
- package/dist/choice-inputs-zUgBZfE4.js.map +1 -0
- package/dist/{code-block-DeneBJR_.js → code-block-BzmM9Eig.js} +9 -9
- package/dist/code-block-BzmM9Eig.js.map +1 -0
- package/dist/{collapsible-C-_l4hpy.js → collapsible-BkAI_XD4.js} +5 -5
- package/dist/{collapsible-C-_l4hpy.js.map → collapsible-BkAI_XD4.js.map} +1 -1
- package/dist/{collection-content-By56pLog.js → collection-content-gDh1v6O4.js} +3 -3
- package/dist/{collection-content-By56pLog.js.map → collection-content-gDh1v6O4.js.map} +1 -1
- package/dist/combobox-BEx0vJgF.js +362 -0
- package/dist/combobox-BEx0vJgF.js.map +1 -0
- package/dist/{combobox-Dxo2fAYQ.js → combobox-BwzoXFSG.js} +254 -247
- package/dist/combobox-BwzoXFSG.js.map +1 -0
- package/dist/{command-C25VMRII.js → command-CrlPIL6m.js} +12 -12
- package/dist/command-CrlPIL6m.js.map +1 -0
- package/dist/{comments-DD0DUPwJ.js → comments-Dmpp0YIc.js} +380 -379
- package/dist/comments-Dmpp0YIc.js.map +1 -0
- package/dist/components/base/action-menu/action-menu.d.ts +9 -1
- package/dist/components/base/buttons/button-group.recipes.d.ts +2 -2
- package/dist/components/base/cards/card.recipes.d.ts +16 -7
- 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 +11 -7
- 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/checkbox.d.ts +7 -2
- package/dist/components/base/choice-inputs/choice-types.d.ts +1 -1
- package/dist/components/base/choice-inputs/switch-card.d.ts +7 -0
- package/dist/components/base/choice-inputs/toggle-field.d.ts +7 -0
- package/dist/components/base/combobox/index.d.ts +4 -2
- package/dist/components/base/date-pickers/datepicker.types.d.ts +7 -0
- package/dist/components/base/feedback/alert.d.ts +1 -1
- package/dist/components/base/forms/controlled-form-field.d.ts +6 -6
- package/dist/components/base/forms/form-field.d.ts +5 -3
- package/dist/components/base/forms/form-sizing.d.ts +7 -7
- package/dist/components/base/forms/index.d.ts +1 -0
- package/dist/components/base/forms/server-errors.d.ts +16 -0
- package/dist/components/base/forms/workflow.d.ts +11 -2
- package/dist/components/base/forms-numeric/coordinates-input.d.ts +4 -0
- package/dist/components/base/metadata-list/metadata-list.d.ts +3 -1
- package/dist/components/base/navigation/dropdown-menu.d.ts +1 -1
- 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 +13 -4
- 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/sheet/sheet.d.ts +2 -0
- package/dist/components/base/sidebar/index.d.ts +1 -1
- package/dist/components/base/sidebar/sidebar.d.ts +27 -5
- package/dist/components/base/structure/composition.recipes.d.ts +17 -0
- package/dist/components/base/text-inputs/hooks/use-form-field-state.d.ts +7 -2
- package/dist/components/base/text-inputs/input.d.ts +4 -2
- package/dist/components/base/text-inputs/textarea.d.ts +4 -2
- package/dist/components/base/toaster/index.d.ts +1 -0
- package/dist/components/base/value-inputs/date-time-input.d.ts +2 -1
- package/dist/components/base/value-inputs/slider.d.ts +5 -1
- package/dist/components/base/value-inputs/tags-input.d.ts +5 -1
- package/dist/components/blocks/ai/ai-file-tree/types.d.ts +1 -1
- package/dist/components/blocks/ai/ai-tool-call/types.d.ts +3 -1
- package/dist/components/blocks/ai/ai.strings.d.ts +2 -0
- package/dist/components/blocks/analytics/metric-comparison/metric-comparison.d.ts +2 -0
- 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/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/features/activities/activities.types.d.ts +8 -2
- 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/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/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 +3 -0
- package/dist/components/features/filters/partials/filter-editor-header.d.ts +16 -0
- package/dist/components/features/filters/partials/filter-popover-content.d.ts +1 -1
- package/dist/components/features/filters/partials/nested-filter-options.d.ts +21 -0
- package/dist/components/features/filters/partials/regular-filter-content.d.ts +2 -1
- package/dist/components/features/filters/utils/filter-utils.d.ts +21 -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/media-library.strings.d.ts +2 -0
- package/dist/components/features/media-library/media-library.types.d.ts +14 -4
- package/dist/components/features/media-library/partials/media-library-partials.d.ts +1 -1
- 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 +43 -6
- package/dist/components/features/resource/resource.d.ts +5 -1
- package/dist/components/features/resource/resource.types.d.ts +12 -1
- package/dist/components/features/rich-text-editor/partials/image-uploads.d.ts +1 -1
- package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +12 -2
- package/dist/components/features/table/partials/resource-cell.d.ts +22 -5
- package/dist/components/features/table/table.types.d.ts +1 -1
- 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 +6 -6
- package/dist/components/layout/navigation/section-nav/section-nav.d.ts +5 -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 +9 -2
- 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 +36 -0
- package/dist/components/layout/sidebar/sidebar.context.d.ts +5 -7
- package/dist/components/layout/sidebar/sidebar.types.d.ts +48 -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/typography/text.styles.d.ts +26 -1
- 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/composition.recipes-COdiFhxB.js +19 -0
- package/dist/composition.recipes-COdiFhxB.js.map +1 -0
- package/dist/containers-CIxwbZt5.js +112 -0
- package/dist/containers-CIxwbZt5.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-ClBuk_UK.js → copyable-DIznBqiT.js} +7 -7
- package/dist/{copyable-ClBuk_UK.js.map → copyable-DIznBqiT.js.map} +1 -1
- package/dist/{data-display-DT_khPl_.js → data-display-BdgCAw8T.js} +277 -285
- package/dist/data-display-BdgCAw8T.js.map +1 -0
- package/dist/{date-DCrsDTZc.js → date-Cq8ioE4o.js} +5 -5
- package/dist/{date-DCrsDTZc.js.map → date-Cq8ioE4o.js.map} +1 -1
- package/dist/{date-picker-B2K3ucWn.js → date-picker-RlIzKom_.js} +501 -480
- package/dist/date-picker-RlIzKom_.js.map +1 -0
- package/dist/date-pickers-DY-CpXS1.js +179 -0
- package/dist/date-pickers-DY-CpXS1.js.map +1 -0
- package/dist/{display-hAc1HjpI.js → display-KsZLw9Ov.js} +9 -9
- package/dist/{display-hAc1HjpI.js.map → display-KsZLw9Ov.js.map} +1 -1
- package/dist/dropdown-menu-CLs8Lihj.js +194 -0
- package/dist/dropdown-menu-CLs8Lihj.js.map +1 -0
- package/dist/features/activities.js +302 -253
- package/dist/features/activities.js.map +1 -1
- package/dist/features/ai-chat.js +15 -14
- package/dist/features/ai-chat.js.map +1 -1
- package/dist/features/appointment-calendar.js +222 -220
- 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 +249 -249
- package/dist/features/email-composer.js.map +1 -1
- package/dist/features/event-calendar.js +264 -269
- package/dist/features/event-calendar.js.map +1 -1
- package/dist/features/filters.js +1 -1
- package/dist/features/global-search.js +167 -138
- package/dist/features/global-search.js.map +1 -1
- package/dist/features/kanban.js +6 -7
- package/dist/features/kanban.js.map +1 -1
- package/dist/features/map.js +269 -260
- package/dist/features/map.js.map +1 -1
- package/dist/features/media-library.js +827 -777
- package/dist/features/media-library.js.map +1 -1
- package/dist/features/mentions.js +1 -1
- package/dist/features/overlays.js +1 -1
- package/dist/features/products.js +1246 -1169
- package/dist/features/products.js.map +1 -1
- package/dist/features/questionnaire.js +13 -13
- package/dist/features/questionnaire.js.map +1 -1
- package/dist/features/resource-assignment.js +8 -8
- package/dist/features/resource.js +127 -123
- package/dist/features/resource.js.map +1 -1
- package/dist/features/rich-text-editor.js +2 -2
- package/dist/features/schema-form.js +254 -253
- package/dist/features/schema-form.js.map +1 -1
- package/dist/features/suggestions.js +3 -3
- package/dist/features/sync.js +3 -3
- package/dist/features/table.js +1 -1
- package/dist/features/theme-tweaker.js +95 -96
- package/dist/features/theme-tweaker.js.map +1 -1
- package/dist/{feedback-BYIhtitP.js → feedback-Dm4izqFn.js} +81 -80
- package/dist/feedback-Dm4izqFn.js.map +1 -0
- package/dist/{field-affordance-recipes-DZhnIL_Y.js → field-affordance-recipes-DWcNcOjh.js} +4 -4
- package/dist/field-affordance-recipes-DWcNcOjh.js.map +1 -0
- package/dist/{filters-DJVAveHA.js → filters-DzgSJpMK.js} +693 -645
- package/dist/filters-DzgSJpMK.js.map +1 -0
- package/dist/{form-field-CwH9y77i.js → form-field-BriWAXyg.js} +14 -8
- package/dist/form-field-BriWAXyg.js.map +1 -0
- package/dist/{form-sizing-BdP_Mf5p.js → form-sizing-Bs2qFUeE.js} +4 -4
- package/dist/form-sizing-Bs2qFUeE.js.map +1 -0
- package/dist/forms-C0RGnJTe.js +216 -0
- package/dist/forms-C0RGnJTe.js.map +1 -0
- package/dist/{forms-numeric-B_jraJaQ.js → forms-numeric-DIhghX1Q.js} +295 -291
- package/dist/forms-numeric-DIhghX1Q.js.map +1 -0
- package/dist/{header-BSfIEWbI.js → header-DMMxG__r.js} +67 -63
- package/dist/header-DMMxG__r.js.map +1 -0
- package/dist/header.recipes-BigdJjw1.js +6 -0
- package/dist/header.recipes-BigdJjw1.js.map +1 -0
- package/dist/hooks/useFormErrors.d.ts +1 -1
- package/dist/{hooks-ClH9thn4.js → hooks-DB6CJ4MR.js} +26 -14
- package/dist/hooks-DB6CJ4MR.js.map +1 -0
- package/dist/{icon-badge-DYKIwvOV.js → icon-badge-DZF-YjQp.js} +4 -4
- package/dist/{icon-badge-DYKIwvOV.js.map → icon-badge-DZF-YjQp.js.map} +1 -1
- package/dist/index.js +4 -5
- package/dist/input-CvyDQlY7.js +289 -0
- package/dist/input-CvyDQlY7.js.map +1 -0
- package/dist/input-DMBwAZmr.js +21 -0
- package/dist/input-DMBwAZmr.js.map +1 -0
- package/dist/item-DjCcM18E.js +277 -0
- package/dist/item-DjCcM18E.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 +11 -11
- package/dist/lib/affordance-geometry.generated.d.ts +41 -35
- package/dist/lib/control-group-recipes.d.ts +5 -5
- package/dist/lib/field-affordance-recipes.d.ts +2 -2
- 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/token-merge.generated.d.ts +13 -10
- package/dist/lib/ui-provider/types.d.ts +1 -1
- package/dist/lib/utils.js +1 -1
- package/dist/map-demo-tile.svg +1 -1
- package/dist/{media-gallery-3zIVLMWH.js → media-gallery-C-vChPmE.js} +6 -6
- package/dist/{media-gallery-3zIVLMWH.js.map → media-gallery-C-vChPmE.js.map} +1 -1
- package/dist/{mentions-CGlEJ15c.js → mentions-0_4nWuI-.js} +10 -10
- package/dist/{mentions-CGlEJ15c.js.map → mentions-0_4nWuI-.js.map} +1 -1
- package/dist/{message-DZ_ruyUV.js → message-g8p7eVtN.js} +7 -7
- package/dist/message-g8p7eVtN.js.map +1 -0
- package/dist/metadata-list-C3MkU-Om.js +443 -0
- package/dist/metadata-list-C3MkU-Om.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-C90-oQFq.js +255 -0
- package/dist/navigation-C90-oQFq.js.map +1 -0
- package/dist/{navigation-BzhHI3lo.js → navigation-DaRjthVk.js} +101 -82
- package/dist/navigation-DaRjthVk.js.map +1 -0
- package/dist/{navigation-row-recipes-BFLCk_Aq.js → navigation-row-recipes-BGVLvU_O.js} +9 -9
- package/dist/navigation-row-recipes-BGVLvU_O.js.map +1 -0
- package/dist/{number-DbV1Dija.js → number-CRU3kGuk.js} +5 -5
- package/dist/{number-DbV1Dija.js.map → number-CRU3kGuk.js.map} +1 -1
- package/dist/overflow-tab-bar-IVFVQFV6.js +172 -0
- package/dist/overflow-tab-bar-IVFVQFV6.js.map +1 -0
- package/dist/overlays-BSgCtM2v.js +1013 -0
- package/dist/overlays-BSgCtM2v.js.map +1 -0
- package/dist/page-DUUKDAjo.js +331 -0
- package/dist/page-DUUKDAjo.js.map +1 -0
- package/dist/page-header-commands-7P3sfE9u.js +193 -0
- package/dist/page-header-commands-7P3sfE9u.js.map +1 -0
- package/dist/{pagination-BL25hu2s.js → pagination-CgCjElfu.js} +7 -7
- package/dist/{pagination-BL25hu2s.js.map → pagination-CgCjElfu.js.map} +1 -1
- package/dist/popover-B85RenIl.js +201 -0
- package/dist/popover-B85RenIl.js.map +1 -0
- package/dist/{popover-menu-Cn9rUkdc.js → popover-menu-DlnQ2zlR.js} +7 -7
- package/dist/{popover-menu-Cn9rUkdc.js.map → popover-menu-DlnQ2zlR.js.map} +1 -1
- package/dist/{popover.recipes-D3j8R8Yp.js → popover.recipes-DdiEp0rd.js} +18 -11
- package/dist/popover.recipes-DdiEp0rd.js.map +1 -0
- package/dist/portal-recipes-BpsV_iRw.js +9 -0
- package/dist/portal-recipes-BpsV_iRw.js.map +1 -0
- package/dist/{primitives-BFK08r9M.js → primitives-ByWgGUgt.js} +6 -6
- package/dist/{primitives-BFK08r9M.js.map → primitives-ByWgGUgt.js.map} +1 -1
- package/dist/primitives.js +4 -4
- package/dist/{progress-B1VnCT0K.js → progress-BJhQP9WX.js} +9 -9
- package/dist/{progress-B1VnCT0K.js.map → progress-BJhQP9WX.js.map} +1 -1
- package/dist/{receipt-BVSOH3Xo.js → receipt-tOc7B3hw.js} +7 -7
- package/dist/receipt-tOc7B3hw.js.map +1 -0
- package/dist/{rich-text-GOUyKQ-s.js → rich-text-Dth5E882.js} +4 -4
- package/dist/{rich-text-GOUyKQ-s.js.map → rich-text-Dth5E882.js.map} +1 -1
- package/dist/{rich-text-editor-cRLC-eBK.js → rich-text-editor-C1fOjBTd.js} +429 -430
- package/dist/rich-text-editor-C1fOjBTd.js.map +1 -0
- package/dist/{rich-text-editor-toolbar-DfXg0-VC.js → rich-text-editor-toolbar-laT3tpBT.js} +33 -29
- package/dist/rich-text-editor-toolbar-laT3tpBT.js.map +1 -0
- package/dist/{scroll-area-DcI-M1UT.js → scroll-area-B0dB2cBi.js} +2 -2
- package/dist/{scroll-area-DcI-M1UT.js.map → scroll-area-B0dB2cBi.js.map} +1 -1
- package/dist/{separator-Bom7NsGO.js → separator-Bb17I4pu.js} +2 -2
- package/dist/{separator-Bom7NsGO.js.map → separator-Bb17I4pu.js.map} +1 -1
- package/dist/{separator-BDV-Y648.js → separator-Ct_WSWTJ.js} +3 -3
- package/dist/{separator-BDV-Y648.js.map → separator-Ct_WSWTJ.js.map} +1 -1
- package/dist/services/actions.js +1 -1
- package/dist/settings-Bar5wiSo.js +167 -0
- package/dist/settings-Bar5wiSo.js.map +1 -0
- package/dist/sheet-BGPERY55.js +250 -0
- package/dist/sheet-BGPERY55.js.map +1 -0
- package/dist/sidebar-D-JYMMbY.js +686 -0
- package/dist/sidebar-D-JYMMbY.js.map +1 -0
- package/dist/sidebar-f9gRWXIR.js +1001 -0
- package/dist/sidebar-f9gRWXIR.js.map +1 -0
- package/dist/skeleton-BapcJd9C.js +265 -0
- package/dist/skeleton-BapcJd9C.js.map +1 -0
- package/dist/smart-card-CW0hjetE.js +617 -0
- package/dist/smart-card-CW0hjetE.js.map +1 -0
- package/dist/{structure-BmisBK-3.js → structure-DuxKl954.js} +3 -3
- package/dist/{structure-BmisBK-3.js.map → structure-DuxKl954.js.map} +1 -1
- package/dist/{structure.recipes-EPz60cU8.js → structure.recipes-BB4-n58V.js} +2 -2
- package/dist/{structure.recipes-EPz60cU8.js.map → structure.recipes-BB4-n58V.js.map} +1 -1
- package/dist/style.css +1 -1
- package/dist/{table-DsfzoUia.js → table-B4TE7iOV.js} +3 -3
- package/dist/{table-DsfzoUia.js.map → table-B4TE7iOV.js.map} +1 -1
- package/dist/{table-BweFy_P9.js → table-CFOWY9pQ.js} +394 -388
- package/dist/table-CFOWY9pQ.js.map +1 -0
- package/dist/{tabs-CDocW5D1.js → tabs-e7ko9S2o.js} +11 -11
- package/dist/tabs-e7ko9S2o.js.map +1 -0
- package/dist/{text-inputs-f9Ia-aCi.js → text-inputs-B1culiSK.js} +107 -104
- package/dist/text-inputs-B1culiSK.js.map +1 -0
- package/dist/{text.styles-g4He6UIW.js → text.styles-B64My8RZ.js} +25 -10
- package/dist/text.styles-B64My8RZ.js.map +1 -0
- package/dist/theme.css +192 -149
- package/dist/{timelines-CwM_9IhD.js → timelines-D3Sl9ueq.js} +13 -12
- package/dist/timelines-D3Sl9ueq.js.map +1 -0
- package/dist/tooltip-8wz5S_Zr.js +113 -0
- package/dist/tooltip-8wz5S_Zr.js.map +1 -0
- package/dist/{tree-WnKQzwbq.js → tree-CzUJHnFs.js} +9 -9
- package/dist/{tree-WnKQzwbq.js.map → tree-CzUJHnFs.js.map} +1 -1
- package/dist/typography/rich-text.js +1 -1
- package/dist/typography-BQnine1k.js +117 -0
- package/dist/typography-BQnine1k.js.map +1 -0
- 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-CXyxmQBP.js → upload-BOW6U2tI.js} +25 -24
- package/dist/upload-BOW6U2tI.js.map +1 -0
- package/dist/{upload-queue-Boscubn9.js → upload-queue-qUXn1ykN.js} +16 -14
- package/dist/upload-queue-qUXn1ykN.js.map +1 -0
- package/dist/{usage-card-BhO5eqkX.js → usage-card-BeSLY0i0.js} +145 -137
- package/dist/usage-card-BeSLY0i0.js.map +1 -0
- package/dist/{utils-BRhFDwuU.js → utils-B6kKb8jB.js} +303 -144
- package/dist/utils-B6kKb8jB.js.map +1 -0
- package/dist/value-inputs-skdVB2zh.js +980 -0
- package/dist/value-inputs-skdVB2zh.js.map +1 -0
- package/dist/{value-typography-BP8OG6h5.js → value-typography-uAmWUAL1.js} +2 -2
- package/dist/{value-typography-BP8OG6h5.js.map → value-typography-uAmWUAL1.js.map} +1 -1
- package/dist/workspace-DHeHv0qw.js +411 -0
- package/dist/workspace-DHeHv0qw.js.map +1 -0
- package/docs/consumer-skill/SKILL.md +15 -129
- package/docs/consumer-skill/agents/themelia-ui-designer.md +96 -0
- package/docs/consumer-skill/examples/app-layout.tsx +74 -13
- package/docs/consumer-skill/examples/authentication.tsx +77 -0
- 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 +30 -38
- 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 +88 -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-bindings.tsx +86 -0
- package/docs/consumer-skill/examples/rhf-edit-page.tsx +141 -0
- package/docs/consumer-skill/examples/rhf-overlay-form.tsx +105 -0
- package/docs/consumer-skill/examples/rhf-transport.tsx +28 -0
- package/docs/consumer-skill/examples/token-domain-structure.tsx +68 -0
- package/docs/consumer-skill/references/agents-md.md +23 -11
- package/docs/consumer-skill/references/analytics.md +18 -1
- package/docs/consumer-skill/references/authentication.md +42 -0
- package/docs/consumer-skill/references/commerce-composition.md +97 -0
- package/docs/consumer-skill/references/component-contracts.json +325201 -0
- package/docs/consumer-skill/references/composition-mapping.md +106 -0
- package/docs/consumer-skill/references/composition.md +198 -46
- 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 +43 -9
- package/docs/consumer-skill/references/discovery.md +109 -8
- package/docs/consumer-skill/references/domain-structures.md +124 -0
- package/docs/consumer-skill/references/installation.md +51 -36
- package/docs/consumer-skill/references/integration.md +41 -2
- package/docs/consumer-skill/references/product-composition.md +94 -0
- package/docs/consumer-skill/references/public-api.json +4390 -475
- package/docs/consumer-skill/references/review.md +47 -5
- package/docs/consumer-skill/references/rhf-workflows.md +93 -0
- package/docs/consumer-skill/references/screen-archetypes.md +34 -0
- package/docs/consumer-skill/references/screen-decisions.md +126 -0
- package/docs/consumer-skill/references/theming.md +25 -27
- package/docs/consumer-skill/references/tokens.json +20 -11
- 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 +9 -2
- package/docs/consumer-skill/scripts/composition-policy.mjs +39 -3
- package/docs/consumer-skill/scripts/composition-schema.d.mts +2 -0
- package/docs/consumer-skill/scripts/composition-schema.mjs +32 -0
- package/docs/consumer-skill/scripts/composition.mjs +254 -0
- package/docs/consumer-skill/scripts/discovery.mjs +96 -10
- package/docs/consumer-skill/scripts/inspect-component.mjs +11 -0
- package/docs/consumer-skill/scripts/inspect-tokens.mjs +11 -0
- package/docs/consumer-skill/scripts/inspection.mjs +193 -0
- package/docs/consumer-skill/scripts/map-composition.mjs +12 -0
- package/docs/consumer-skill/scripts/setup-skills.mjs +111 -0
- package/docs/consumer-skill/scripts/surface-policy.mjs +5 -5
- package/docs/consumer-skills/themelia-components/SKILL.md +31 -0
- package/docs/consumer-skills/themelia-composition/SKILL.md +34 -0
- package/docs/consumer-skills/themelia-design/SKILL.md +55 -0
- package/docs/consumer-skills/themelia-forms/SKILL.md +12 -0
- package/docs/consumer-skills/themelia-foundation/SKILL.md +15 -0
- package/docs/consumer-skills/themelia-tokenization/SKILL.md +42 -0
- package/package.json +4 -2
- package/templates/README.md +39 -0
- package/templates/admin-shell-template.tsx +382 -0
- package/templates/analytics-operations-template.tsx +376 -0
- package/templates/customers-template.tsx +509 -0
- package/templates/index.ts +29 -0
- package/templates/orders-template.tsx +1102 -0
- package/templates/products-template.tsx +834 -0
- package/templates/user-permissions-template.tsx +450 -0
- package/dist/accordion-Cjb6sx0G.js.map +0 -1
- package/dist/action-menu-CllU52Mm.js +0 -280
- package/dist/action-menu-CllU52Mm.js.map +0 -1
- package/dist/affordance-geometry.generated-tF36bREk.js.map +0 -1
- package/dist/ai-artifact-DvTwDVyL.js.map +0 -1
- package/dist/app-shell-C4FhvCqF.js +0 -236
- package/dist/app-shell-C4FhvCqF.js.map +0 -1
- package/dist/auth-BGua8ouh.js.map +0 -1
- package/dist/avatar-DAPlDvhJ.js.map +0 -1
- package/dist/base/cascader.js.map +0 -1
- package/dist/batch-action-bar-DnUJ21NQ.js.map +0 -1
- package/dist/button-DVzspB_G.js.map +0 -1
- package/dist/buttons-DPZekJFu.js.map +0 -1
- package/dist/cards-BaBZR-AU.js +0 -68
- package/dist/cards-BaBZR-AU.js.map +0 -1
- package/dist/chart-ZOYyK2xG.js +0 -155
- package/dist/chart-ZOYyK2xG.js.map +0 -1
- package/dist/checkbox-AWIhNhmo.js.map +0 -1
- package/dist/choice-inputs-CNHvARCJ.js +0 -770
- package/dist/choice-inputs-CNHvARCJ.js.map +0 -1
- package/dist/code-block-DeneBJR_.js.map +0 -1
- package/dist/combobox-DaHESuiL.js +0 -355
- package/dist/combobox-DaHESuiL.js.map +0 -1
- package/dist/combobox-Dxo2fAYQ.js.map +0 -1
- package/dist/command-C25VMRII.js.map +0 -1
- package/dist/comments-DD0DUPwJ.js.map +0 -1
- package/dist/containers-Mu1LMGV1.js +0 -103
- package/dist/containers-Mu1LMGV1.js.map +0 -1
- package/dist/control-group-recipes-DBXmfh2E.js.map +0 -1
- package/dist/data-display-DT_khPl_.js.map +0 -1
- package/dist/date-picker-B2K3ucWn.js.map +0 -1
- package/dist/date-pickers-Ds8gLaoP.js +0 -175
- package/dist/date-pickers-Ds8gLaoP.js.map +0 -1
- package/dist/dropdown-menu-Cl4X7L5S.js +0 -193
- package/dist/dropdown-menu-Cl4X7L5S.js.map +0 -1
- package/dist/feedback-BYIhtitP.js.map +0 -1
- package/dist/field-affordance-recipes-DZhnIL_Y.js.map +0 -1
- package/dist/filters-DJVAveHA.js.map +0 -1
- package/dist/form-field-CwH9y77i.js.map +0 -1
- package/dist/form-sizing-BdP_Mf5p.js.map +0 -1
- package/dist/forms-B9G_xwzi.js +0 -194
- package/dist/forms-B9G_xwzi.js.map +0 -1
- package/dist/forms-numeric-B_jraJaQ.js.map +0 -1
- package/dist/header-BSfIEWbI.js.map +0 -1
- package/dist/hooks-ClH9thn4.js.map +0 -1
- package/dist/input-CZw8iU99.js +0 -21
- package/dist/input-CZw8iU99.js.map +0 -1
- package/dist/input-DQdEd0YD.js +0 -263
- package/dist/input-DQdEd0YD.js.map +0 -1
- package/dist/item-K5_ghvze.js +0 -275
- package/dist/item-K5_ghvze.js.map +0 -1
- package/dist/message-DZ_ruyUV.js.map +0 -1
- package/dist/metadata-list-8N16ZMW_.js +0 -405
- package/dist/metadata-list-8N16ZMW_.js.map +0 -1
- package/dist/motion-recipes-ChBg4HBq.js.map +0 -1
- package/dist/navigation-Bnotn4AQ.js +0 -145
- package/dist/navigation-Bnotn4AQ.js.map +0 -1
- package/dist/navigation-BzhHI3lo.js.map +0 -1
- package/dist/navigation-row-recipes-BFLCk_Aq.js.map +0 -1
- package/dist/overflow-tab-bar-CWY7Nogn.js +0 -282
- package/dist/overflow-tab-bar-CWY7Nogn.js.map +0 -1
- package/dist/overlays-tMkF-VAN.js +0 -1003
- package/dist/overlays-tMkF-VAN.js.map +0 -1
- package/dist/page-CL9YeH_V.js +0 -224
- package/dist/page-CL9YeH_V.js.map +0 -1
- package/dist/page-header-commands-DOb6WsfD.js +0 -126
- package/dist/page-header-commands-DOb6WsfD.js.map +0 -1
- package/dist/popover-gnTOhbFM.js +0 -198
- package/dist/popover-gnTOhbFM.js.map +0 -1
- package/dist/popover.recipes-D3j8R8Yp.js.map +0 -1
- package/dist/receipt-BVSOH3Xo.js.map +0 -1
- package/dist/rich-text-editor-cRLC-eBK.js.map +0 -1
- package/dist/rich-text-editor-toolbar-DfXg0-VC.js.map +0 -1
- package/dist/settings-ybnjVwbd.js +0 -171
- package/dist/settings-ybnjVwbd.js.map +0 -1
- package/dist/sheet-ijlsjq-n.js +0 -213
- package/dist/sheet-ijlsjq-n.js.map +0 -1
- package/dist/sidebar-Db6gkh3U.js +0 -619
- package/dist/sidebar-Db6gkh3U.js.map +0 -1
- package/dist/sidebar-DkTO4VTO.js +0 -512
- package/dist/sidebar-DkTO4VTO.js.map +0 -1
- package/dist/skeleton-Byjnt7qr.js +0 -264
- package/dist/skeleton-Byjnt7qr.js.map +0 -1
- package/dist/smart-card-DiC5aac3.js +0 -604
- package/dist/smart-card-DiC5aac3.js.map +0 -1
- package/dist/table-BweFy_P9.js.map +0 -1
- package/dist/tabs-CDocW5D1.js.map +0 -1
- package/dist/text-inputs-f9Ia-aCi.js.map +0 -1
- package/dist/text.styles-g4He6UIW.js.map +0 -1
- package/dist/theme-scope-BJ6eE2xt.js +0 -50
- package/dist/theme-scope-BJ6eE2xt.js.map +0 -1
- package/dist/timelines-CwM_9IhD.js.map +0 -1
- package/dist/tooltip-yiRJUFjp.js +0 -111
- package/dist/tooltip-yiRJUFjp.js.map +0 -1
- package/dist/typography-UTnveOEy.js +0 -117
- package/dist/typography-UTnveOEy.js.map +0 -1
- package/dist/ui-provider-C_U0Xma4.js +0 -136
- package/dist/ui-provider-C_U0Xma4.js.map +0 -1
- package/dist/upload-CXyxmQBP.js.map +0 -1
- package/dist/upload-queue-Boscubn9.js.map +0 -1
- package/dist/usage-card-BhO5eqkX.js.map +0 -1
- package/dist/use-mobile-vaLKwgyf.js +0 -15
- package/dist/use-mobile-vaLKwgyf.js.map +0 -1
- package/dist/utils-BRhFDwuU.js.map +0 -1
- package/dist/value-inputs-TaX4OjNk.js +0 -963
- package/dist/value-inputs-TaX4OjNk.js.map +0 -1
- package/dist/workspace-B-OEm3Kf.js +0 -408
- package/dist/workspace-B-OEm3Kf.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"combobox-BwzoXFSG.js","names":["ComboboxPrimitive","_Fragment","_Fragment","React","Combobox","BaseCombobox","Combobox","resolveComponentScale","useDensityConfig","cn","Button","Text","Stack","markRecipes","ErrorState","layerRecipes","fieldAffordanceRecipes","selectToggleRecipes","ComboboxPositioner","ComboboxPortal","ComboboxEmpty","ComboboxItem","Combobox$2","ComboboxCollection","ComboboxChipsInput","ComboboxChips","ComboboxList","ComboboxPopup","ComboboxChip","ComboboxGroup","ComboboxNativeInput","ComboboxGroupLabel","formControlMinHeightClasses","formControlPaddingClasses","Input","ScrollArea","useDebouncedCallback","React$1","Fragment$1","ComboboxInputField","error","clearable","size","className","required","Combobox","clearLabel","XIcon","toggleLabel","ChevronDownIcon","defaultComboboxStrings","itemLabel","CREATE_OPTION_SYMBOL","isCreateOption","item","getCreateOptionValue","createCreateOption","inputValue","LoadingMore","loading","Loader2","text","StatusText","StatusContent","trimmed","searchValue","strings","minSearchLength","remaining","primitiveSizeByComboboxSize","emptyClassByComboboxSize","ComboboxDropdown","positionerClassName","portalContainer","primitiveSize","showStatus","showEmpty","items","loadingMore","applyFooter","content","ComboboxStatus","listRef","groupedItems","group","groupItems","groupLabel","renderGroupLabel","getItemDisabled","renderItemContent","getItemReactKey","createOptionItem","ErrorMessage","_size","escapeRegExp","str","HighlightedText","highlight","regex","parts","cursor","isMatch","index","key","part","highlightClassName","useDebouncedSearch","emitSearch","value","debounceMs","useGroupedItems","useMemo","getItemGroup","groups","groupKey","existing","useLoadMore","isLoadingRef","useRef","cooldownRef","requestLoadMore","onLoadMore","useEffect","useCallback","hasMore","event","scrollTop","clientHeight","scrollHeight","useComboboxStrings","useStrings","custom","hasExactMatch","normalizedSearch","getItemLabel","useComboboxCore","stringsProp","getKey","getItemKey","trimmedSearch","showListContent","listEl","handleScroll","baseItems","ensuredItems","merged","itemKey","ensured","showCreateOption","creatable","onCreate","PlusIcon","renderItem","label","highlightMatch","resolveComboboxSize","sizeProp","defaultScale","primitiveComboboxSizeBySize","getComboboxFormSize","Combobox$1","formSize","hasError","invalid","core","selectedValue","isOpen","setIsOpen","useState","handleOpenChange","nextOpen","clearSearchOnClose","onSearchValueChange","onOpenChange","displayInputValue","handleValueChange","onSelectedValueChange","details","reason","MultiCombobox","primitiveComboboxSize","containerRef","draftValues","setDraftValues","selectedValues","internalOpen","setInternalOpen","isOpenControlled","open","resolvedOpen","applyButton","setOpen","next","regularValues","createValue","values","onSelectedValuesChange","closeOnSelect","handleApply","onApply","handleCancel","onCancel","visibleValues","chipsPlaceholder","defaultAsyncResourceComboboxStrings","isSimpleText","AsyncResourceCombobox","props","isControlled","internalValue","setInternalValue","defaultValue","setSearchValue","setItems","isLoading","setIsLoading","fetchError","setFetchError","retryCount","setRetryCount","requestIdRef","nextValue","onValueChange","runFetch","fetcher","context","requestId","nextItems","onAfterFetch","nextError","onError","disabled","preload","controller","limit","retry","count","renderOption","description","getDescription","meta","getMeta","getLabel","resolvedError","errorMessage","hasFetchError","errorNode","renderError"],"sources":["../src/components/base/combobox/combobox-field.tsx","../src/components/features/combobox/combobox.strings.ts","../src/components/features/combobox/constants.ts","../src/components/features/combobox/components/loading-more.tsx","../src/components/features/combobox/components/status-content.tsx","../src/components/features/combobox/components/combobox-dropdown.tsx","../src/components/features/combobox/components/error-message.tsx","../src/components/features/combobox/components/highlighted-text.tsx","../src/components/features/combobox/hooks/use-debounced-search.ts","../src/components/features/combobox/hooks/use-grouped-items.ts","../src/components/features/combobox/hooks/use-load-more.ts","../src/components/features/combobox/hooks/use-combobox-core.tsx","../src/components/features/combobox/combobox.tsx","../src/components/features/combobox/async-resource-combobox.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Combobox as ComboboxPrimitive } from '@base-ui/react/combobox';\nimport { ChevronDownIcon, XIcon } from 'lucide-react';\nimport { ComboboxNativeInput } from '../../ui/combobox';\nimport { Button } from '../buttons';\nimport { Input } from '../text-inputs';\nimport { type FormControlSize } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\nimport { fieldAffordanceRecipes, selectToggleRecipes } from '../../../lib/field-affordance-recipes';\n\n// Private shared input composition. The feature supplies state and strings;\n// this base owner keeps the native input/frame and all affordance geometry.\ninterface ComboboxInputFieldProps {\n\tplaceholder: string;\n\tclearLabel: string;\n\ttoggleLabel: string;\n\tsize: FormControlSize;\n\terror?: boolean;\n\trequired?: boolean;\n\tdisabled?: boolean;\n\tclearable?: boolean;\n\tclassName?: string;\n\tonBlur?: () => void;\n}\n\nexport function ComboboxInputField({\n\tplaceholder,\n\tclearLabel,\n\ttoggleLabel,\n\tsize,\n\terror,\n\trequired,\n\tdisabled,\n\tclearable = true,\n\tclassName,\n\tonBlur,\n}: ComboboxInputFieldProps): React.ReactElement {\n\treturn (\n\t\t<div className=\"relative\">\n\t\t\t<ComboboxNativeInput\n\t\t\t\trender={\n\t\t\t\t\t<Input\n\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\tinvalid={error}\n\t\t\t\t\t\tclassName={cn(clearable ? selectToggleRecipes.clearPadding[size] : selectToggleRecipes.padding[size], className)}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t\tplaceholder={placeholder}\n\t\t\t\taria-invalid={error || undefined}\n\t\t\t\taria-required={required}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tonBlur={onBlur}\n\t\t\t/>\n\t\t\t<div className={cn('absolute inset-y-0 flex items-center gap-space-xs text-muted-foreground', selectToggleRecipes.track[size])}>\n\t\t\t\t{clearable ? (\n\t\t\t\t\t<ComboboxPrimitive.Clear\n\t\t\t\t\t\trender={\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\t\tclassName={cn(fieldAffordanceRecipes.target,fieldAffordanceRecipes.focus,fieldAffordanceRecipes.clear)}\n\t\t\t\t\t\t\t\taria-label={clearLabel}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<XIcon className={fieldAffordanceRecipes.icon} aria-hidden=\"true\" />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t\t<ComboboxPrimitive.Trigger\n\t\t\t\t\trender={\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\tsize=\"sm\" iconOnly\n\t\t\t\t\t\t\t\tclassName={cn(fieldAffordanceRecipes.target,fieldAffordanceRecipes.focus,fieldAffordanceRecipes.toggle)}\n\t\t\t\t\t\t\taria-label={toggleLabel}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t<ChevronDownIcon className={cn('shrink-0', selectToggleRecipes.icon[size])} aria-hidden=\"true\" />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * Default user-facing strings for `<Combobox>`.\n *\n * Consumers wire backend i18n at the call site:\n *\n * <Combobox strings={{ noResults: t('search.empty') }} … />\n *\n * Templates use `{placeholder}` tokens — the component substitutes them at\n * render time. Function-valued strings would also work; we keep templates\n * here for the constants file.\n */\nimport type { ComboboxStrings } from './types';\n\nexport const defaultComboboxStrings = {\n\tplaceholder: 'Search...',\n\tclear: 'Clear selection',\n\ttoggle: 'Open options',\n\tdismiss: 'Dismiss',\n\tremoveSelection: (itemLabel: string) => `Remove ${itemLabel}`,\n\tsearching: 'Loading...',\n\tnoResults: 'No results found.',\n\ttypeToSearch: 'Type at least {min} characters to search...',\n\ttypeMore: 'Type {remaining} more character{s} to search...',\n\tcreateNew: 'Create {value}',\n\tloadingMore: 'Loading...',\n\tapply: 'Apply',\n\tcancel: 'Cancel',\n} satisfies ComboboxStrings;\n\nexport type { ComboboxStrings };\n","/**\n * Constants and default values for the Combobox component.\n *\n * Default strings live in `./combobox.strings.ts` per rule 19.\n */\n\nexport { defaultComboboxStrings } from './combobox.strings';\n\n// ============================================================================\n// Default Values\n// ============================================================================\n\nexport const DEFAULT_MIN_SEARCH_LENGTH = 3;\n/** Re-exported so the combobox shares the library-wide debounce window. */\nexport { DEFAULT_DEBOUNCE_MS } from '../../../hooks/use-debounced-callback';\nexport const DEFAULT_SIZE = 'md';\nexport const LOAD_MORE_THRESHOLD = 0.8;\nexport const LOAD_MORE_DEBOUNCE_MS = 100;\nexport const LOAD_MORE_COOLDOWN_MS = 500;\n\n// ============================================================================\n// Symbols\n// ============================================================================\n\nexport const CREATE_OPTION_SYMBOL = Symbol('combobox-create-option');\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\nexport function isCreateOption<T>(item: T): item is T & { [CREATE_OPTION_SYMBOL]: string } {\n\treturn (\n\t\ttypeof item === 'object' &&\n\t\titem !== null &&\n\t\tCREATE_OPTION_SYMBOL in (item as object)\n\t);\n}\n\nexport function getCreateOptionValue<T>(item: T): string {\n\tif (!isCreateOption(item)) {\n\t\tthrow new Error('Item is not a create option');\n\t}\n\treturn (item as { [CREATE_OPTION_SYMBOL]: string })[CREATE_OPTION_SYMBOL];\n}\n\nexport function createCreateOption<T>(inputValue: string): T {\n\treturn { [CREATE_OPTION_SYMBOL]: inputValue } as unknown as T;\n}\n","/**\n * LoadingMore Component\n */\n\nimport { Loader2 } from 'lucide-react';\nimport * as React from 'react';\nimport { Stack } from '../../../base/structure';\nimport { Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nexport interface LoadingMoreProps {\n\t/** Shows the pending indicator. */\n\tloading: boolean;\n\t/** Visible label. */\n\ttext: string;\n\tclassName?: string;\n}\n\nexport function LoadingMore({\n\tloading,\n\ttext,\n\tclassName,\n}: LoadingMoreProps): React.ReactElement | null {\n\tif (!loading) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<Stack\n\t\t\tdirection=\"horizontal\"\n\t\t\tgap=\"sm\"\n\t\t\tjustify=\"center\"\n\t\t\twrap={false}\n\t\t\tclassName={cn('loading-more--component', \n\t\t\t\t'px-control py-space-xs text-xs text-muted-foreground',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\trole=\"status\"\n\t\t\taria-live=\"polite\"\n\t\t>\n\t\t\t<Loader2 className=\"size-icon-sm animate-spin\" aria-hidden=\"true\" />\n\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" className=\"text-inherit\">\n\t\t\t\t{text}\n\t\t\t</Text>\n\t\t</Stack>\n\t);\n}\n\nLoadingMore.displayName = 'LoadingMore';\n","/**\n * StatusContent Component\n */\n\nimport { Loader2 } from 'lucide-react';\nimport * as React from 'react';\nimport { Text } from '../../../typography';\nimport type { ComboboxStrings } from '../types';\n\nfunction StatusText({ children }: { children: string }) {\n\treturn (\n\t\t<Text tag=\"span\" size=\"inherit\" type=\"secondary\" className=\"text-inherit\">\n\t\t\t{children}\n\t\t</Text>\n\t);\n}\n\nexport interface StatusContentProps {\n\t/** Whether results are being fetched. */\n\tloading?: boolean;\n\t/** Current search text. */\n\tsearchValue: string;\n\t/** Characters required before the list becomes active. */\n\tminSearchLength: number;\n\t/** How many options matched, deciding between the empty and results copy. */\n\titemCount: number;\n\t/** Resolved copy for the status rows. */\n\tstrings: ComboboxStrings;\n}\n\nexport function StatusContent({\n\tloading,\n\tsearchValue,\n\tminSearchLength,\n\titemCount,\n\tstrings,\n}: StatusContentProps): React.ReactNode {\n\tconst trimmed = searchValue.trim();\n\n\tif (loading) {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<Loader2 className=\"size-icon-sm animate-spin\" />\n\t\t\t\t<StatusText>{strings.searching}</StatusText>\n\t\t\t</>\n\t\t);\n\t}\n\n\tif (trimmed === '') {\n\t\tif (strings.typeToSearch.includes('{min}')) {\n\t\t\treturn (\n\t\t\t\t<StatusText>\n\t\t\t\t\t{strings.typeToSearch.replace('{min}', String(minSearchLength))}\n\t\t\t\t</StatusText>\n\t\t\t);\n\t\t}\n\t\treturn <StatusText>{strings.typeToSearch}</StatusText>;\n\t}\n\n\tif (trimmed.length < minSearchLength) {\n\t\tconst remaining = minSearchLength - trimmed.length;\n\t\tif (strings.typeMore.includes('{remaining}') || strings.typeMore.includes('{s}')) {\n\t\t\treturn (\n\t\t\t\t<StatusText>\n\t\t\t\t\t{strings.typeMore\n\t\t\t\t\t\t.replace('{remaining}', String(remaining))\n\t\t\t\t\t\t.replace('{s}', remaining !== 1 ? 's' : '')}\n\t\t\t\t</StatusText>\n\t\t\t);\n\t\t}\n\t\treturn <StatusText>{strings.typeMore}</StatusText>;\n\t}\n\n\tif (itemCount === 0) {\n\t\treturn null;\n\t}\n\n\treturn null;\n}\n\nStatusContent.displayName = 'StatusContent';\n","/**\n * Shared ComboboxDropdown Component\n *\n * Renders the dropdown content for both single and multiple selection variants.\n * Extracts shared rendering logic to reduce duplication.\n */\n\nimport * as React from 'react';\n\nimport {\n\tComboboxPortal,\n\tComboboxPositioner,\n\tComboboxPopup,\n\tComboboxEmpty,\n\tComboboxList,\n\tComboboxItem,\n\tComboboxStatus,\n\tComboboxGroup,\n\tComboboxGroupLabel,\n\tComboboxCollection,\n} from '../../../base/combobox';\nimport { Button } from '../../../base/buttons';\nimport { ScrollArea } from '../../../base/display/scroll-area';\nimport { Stack } from '../../../base/structure';\nimport { Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nimport { DEFAULT_SIZE } from '../constants';\nimport type { ComboboxStrings, ComboboxSize } from '../types';\nimport { LoadingMore } from './loading-more';\nimport { StatusContent } from './status-content';\nimport { layerRecipes } from '../../../../lib/layer-recipes';\n\nconst primitiveSizeByComboboxSize: Record<ComboboxSize, 'sm' | 'md' | 'lg'> = {\n\tsm: 'sm',\n\tmd: 'md',\n\tlg: 'lg',\n};\n\nconst emptyClassByComboboxSize: Record<ComboboxSize, string> = {\n\tsm: 'flex min-h-control-sm items-center justify-center px-row-x py-row-y text-center text-pxs leading-tight text-muted-foreground',\n\tmd: 'flex min-h-control items-center justify-center px-row-x py-row-y text-center text-sm leading-tight text-muted-foreground',\n\tlg: 'flex min-h-control-lg items-center justify-center px-row-x py-row-y-lg text-center text-sm leading-tight text-muted-foreground',\n};\n\nexport interface ComboboxDropdownProps<T> {\n\t// Display state\n\t/** Whether results are being fetched. */\n\tloading: boolean;\n\t/** Whether the status row replaces the list — while loading, or below `minSearchLength`. */\n\tshowStatus: boolean;\n\t/** Whether the no-results row shows. */\n\tshowEmpty: boolean;\n\n\t// Search\n\t/** Current search text, used to highlight matches. */\n\tsearchValue: string;\n\t/** Characters required before the list becomes active. */\n\tminSearchLength: number;\n\n\t// Items\n\t/** Options to render, including the create row when offered. */\n\titems: T[];\n\t/** Options bucketed by group name, or `null` when grouping is off. */\n\tgroupedItems: Map<string, T[]> | null;\n\t/** The synthetic create row, or `null` when it is not offered. */\n\tcreateOptionItem: T | null;\n\n\t// Rendering\n\t/** Renders one option's content. */\n\trenderItemContent: (item: T) => React.ReactNode;\n\t/** Returns the React key for an option. */\n\tgetItemReactKey: (item: T) => string;\n\t/** Marks individual options unselectable while still rendering them. */\n\tgetItemDisabled?: (item: T) => boolean;\n\t/** Renders a group heading. */\n\trenderGroupLabel?: (group: string) => React.ReactNode;\n\n\t// Load more\n\t/** Whether the next page is being fetched. */\n\tloadingMore?: boolean;\n\n\t// Strings\n\t/** Resolved copy for the status, empty, and create rows. */\n\tstrings: ComboboxStrings;\n\n\t// Size\n\t/** Row density, matching the trigger's size. */\n\tsize?: ComboboxSize;\n\n\t// Portal\n\t/** Mounts the dropdown inside this element instead of the default portal root. */\n\tportalContainer?: React.RefObject<HTMLElement | null>;\n\n\t// Refs\n\t/** Ref to the scrollable list, used for scroll-triggered pagination. */\n\tlistRef: React.RefObject<HTMLDivElement | null>;\n\n\t// Multiple selection anchor\n\t/** Element the dropdown positions against. */\n\tanchor?: React.RefObject<HTMLElement | null>;\n\n\t/** Optional apply / cancel footer for the apply-button workflow. */\n\tapplyFooter?: {\n\t\tapplyLabel: string;\n\t\tcancelLabel: string;\n\t\tonApply: () => void;\n\t\tonCancel: () => void;\n\t};\n}\n\nexport function ComboboxDropdown<T>({\n\tloading,\n\tshowStatus,\n\tshowEmpty,\n\tsearchValue,\n\tminSearchLength,\n\titems,\n\tgroupedItems,\n\tcreateOptionItem,\n\trenderItemContent,\n\tgetItemReactKey,\n\tgetItemDisabled,\n\trenderGroupLabel,\n\tloadingMore,\n\tstrings,\n\tsize = DEFAULT_SIZE,\n\tportalContainer,\n\tlistRef,\n\tanchor,\n\tapplyFooter,\n}: ComboboxDropdownProps<T>): React.ReactElement | null {\n\tconst positionerClassName = portalContainer != null ? layerRecipes.nestedOverlay : undefined;\n\tconst primitiveSize = primitiveSizeByComboboxSize[size];\n\tconst hasPopupContent =\n\t\tshowStatus ||\n\t\tshowEmpty ||\n\t\titems.length > 0 ||\n\t\tBoolean(loadingMore) ||\n\t\tBoolean(applyFooter);\n\t// An exclusive inline error has no dropdown rows. Mounting a zero-height\n\t// popup still starts Base UI focus management and hides its Retry sibling.\n\tif (!hasPopupContent) return null;\n\n\tconst content = (\n\t\t<ComboboxPositioner\n\t\t\tanchor={anchor}\n\t\t\tclassName={positionerClassName}\n\t\t>\n\t\t\t<ComboboxPopup\n\t\t\t\taria-busy={loading || undefined}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'combobox-dropdown--popup',\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{/* Status message */}\n\t\t\t\t{!!showStatus && (\n\t\t\t\t\t<ComboboxStatus className=\"gap-space-sm px-control py-space-xs text-xs text-muted-foreground\">\n\t\t\t\t\t\t<StatusContent\n\t\t\t\t\t\t\tloading={loading}\n\t\t\t\t\t\t\tsearchValue={searchValue}\n\t\t\t\t\t\t\tminSearchLength={minSearchLength}\n\t\t\t\t\t\t\titemCount={items.length}\n\t\t\t\t\t\t\tstrings={strings}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</ComboboxStatus>\n\t\t\t\t)}\n\n\t\t\t\t{/* Empty state */}\n\t\t\t\t{!!showEmpty && (\n\t\t\t\t\t<ComboboxEmpty className={emptyClassByComboboxSize[size]}>\n\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" type=\"secondary\" className=\"text-inherit\">\n\t\t\t\t\t\t\t{strings.noResults}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</ComboboxEmpty>\n\t\t\t\t)}\n\n\t\t\t\t{/* Items list */}\n\t\t\t\t<ScrollArea\n\t\t\t\t\tviewportRef={listRef}\n\t\t\t\t\tclassName=\"max-h-[min(20rem,var(--available-height))]\"\n\t\t\t\t>\n\t\t\t\t\t<ComboboxList className=\"combobox-dropdown--list max-h-none overflow-visible\">\n\t\t\t\t\t\t{groupedItems ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t{Array.from(groupedItems.entries()).map(([group, groupItems]) => {\n\t\t\t\t\t\t\t\t\tconst groupLabel =\n\t\t\t\t\t\t\t\t\t\ttypeof renderGroupLabel === 'function'\n\t\t\t\t\t\t\t\t\t\t\t? renderGroupLabel(group)\n\t\t\t\t\t\t\t\t\t\t\t: group;\n\t\t\t\t\t\t\t\t\tconst groupLabelContent =\n\t\t\t\t\t\t\t\t\t\ttypeof groupLabel === 'string' || typeof groupLabel === 'number' || typeof groupLabel === 'bigint'\n\t\t\t\t\t\t\t\t\t\t\t// A group caption is supporting copy, not another option: the\n\t\t\t\t\t\t\t\t\t\t\t// compact secondary role Command and menu captions use.\n\t\t\t\t\t\t\t\t\t\t\t? <Text tag=\"span\" size=\"xs\" type=\"secondary\" weight=\"medium\" lineHeight=\"tight\">{groupLabel}</Text>\n\t\t\t\t\t\t\t\t\t\t\t: groupLabel;\n\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<ComboboxGroup className=\"combobox-dropdown--group p-0\" key={group} items={groupItems}>\n\t\t\t\t\t\t\t\t\t\t\t<ComboboxGroupLabel>{groupLabelContent}</ComboboxGroupLabel>\n\t\t\t\t\t\t\t\t\t\t\t<ComboboxCollection>\n\t\t\t\t\t\t\t\t\t\t\t\t{(item: T) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ComboboxItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={getItemReactKey(item)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={item}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize={primitiveSize}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={getItemDisabled?.(item)}\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\t\t\t{renderItemContent(item)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</ComboboxItem>\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</ComboboxCollection>\n\t\t\t\t\t\t\t\t\t\t</ComboboxGroup>\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\t{createOptionItem != null && (\n\t\t\t\t\t\t\t\t\t<ComboboxItem\n\t\t\t\t\t\t\t\t\t\tkey={getItemReactKey(createOptionItem)}\n\t\t\t\t\t\t\t\t\t\tvalue={createOptionItem}\n\t\t\t\t\t\t\t\t\t\tsize={primitiveSize}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{renderItemContent(createOptionItem)}\n\t\t\t\t\t\t\t\t\t</ComboboxItem>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<ComboboxCollection>\n\t\t\t\t\t\t\t\t{(item: T) => (\n\t\t\t\t\t\t\t\t\t<ComboboxItem\n\t\t\t\t\t\t\t\t\t\tkey={getItemReactKey(item)}\n\t\t\t\t\t\t\t\t\t\tvalue={item}\n\t\t\t\t\t\t\t\t\t\tsize={primitiveSize}\n\t\t\t\t\t\t\t\t\t\tdisabled={getItemDisabled?.(item)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{renderItemContent(item)}\n\t\t\t\t\t\t\t\t\t</ComboboxItem>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</ComboboxCollection>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</ComboboxList>\n\t\t\t\t</ScrollArea>\n\n\t\t\t\t{/* Loading more indicator */}\n\t\t\t\t<LoadingMore\n\t\t\t\t\tloading={!!loadingMore}\n\t\t\t\t\ttext={strings.loadingMore}\n\t\t\t\t/>\n\n\t\t\t\t{/* Apply / cancel footer (multi-select with applyButton). */}\n\t\t\t\t{!!applyFooter && (\n\t\t\t\t\t<Stack direction=\"horizontal\" gap=\"md\" justify=\"end\" wrap={false} className=\"border-t border-border/60 px-control py-space-xs\">\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\tapplyFooter.onCancel();\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{applyFooter.cancelLabel}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\ttone=\"primary\"\n\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\tapplyFooter.onApply();\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{applyFooter.applyLabel}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</Stack>\n\t\t\t\t)}\n\t\t\t</ComboboxPopup>\n\t\t</ComboboxPositioner>\n\t);\n\n\tif (portalContainer) {\n\t\treturn <ComboboxPortal container={portalContainer}>{content}</ComboboxPortal>;\n\t}\n\n\treturn <ComboboxPortal>{content}</ComboboxPortal>;\n}\n\nComboboxDropdown.displayName = 'ComboboxDropdown';\n","/**\n * ErrorMessage Component\n */\n\nimport * as React from 'react';\nimport { Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\nimport type { ComboboxSize } from '../types';\n\nexport interface ErrorMessageProps {\n\terror?: string;\n\t/** Size preset. */\n\tsize: ComboboxSize;\n\tclassName?: string;\n}\n\nexport function ErrorMessage({\n\terror,\n\tsize: _size,\n\tclassName,\n}: ErrorMessageProps): React.ReactElement | null {\n\tif (!error) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t// `xs` at every control size, matching `FormField` and the date pickers.\n\t\t// Leaving the default size unpinned resolved to `sm`, which made the\n\t\t// combobox the one control whose error text grew as the control grew.\n\t\t<Text\n\t\t\ttag=\"p\"\n\t\t\tsize=\"xs\"\n\t\t\ttype=\"error\"\n\t\t\tclassName={cn('error-message--component', className)}\n\t\t\trole=\"alert\"\n\t\t\taria-live=\"polite\"\n\t\t>\n\t\t\t{error}\n\t\t</Text>\n\t);\n}\n\nErrorMessage.displayName = 'ErrorMessage';\n","/**\n * HighlightedText Component\n */\n\nimport * as React from 'react';\nimport { Text } from '../../../typography';\nimport { markRecipes } from '../../../../lib/tone-recipes';\n\nexport interface HighlightedTextProps {\n\t/** Visible label. */\n\ttext: string;\n\thighlight: string;\n\thighlightClassName?: string;\n}\n\nfunction escapeRegExp(str: string): string {\n\treturn str.replace(/[$()*+.?[\\\\\\]^{|}]/g, '\\\\$&');\n}\n\nexport function HighlightedText({\n\ttext,\n\thighlight,\n\thighlightClassName = markRecipes.match,\n}: HighlightedTextProps): React.ReactNode {\n\tif (!highlight.trim()) {\n\t\treturn (\n\t\t\t<Text tag=\"span\" size=\"inherit\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t{text}\n\t\t\t</Text>\n\t\t);\n\t}\n\n\tconst regex = new RegExp(`(${escapeRegExp(highlight)})`, 'gi');\n\tconst parts = text.split(regex);\n\tlet cursor = 0;\n\n\treturn (\n\t\t<Text tag=\"span\" size=\"inherit\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t{parts.map((part, index) => {\n\t\t\t\tconst isMatch = index % 2 === 1;\n\t\t\t\tconst key = String(cursor);\n\t\t\t\tcursor += part.length;\n\n\t\t\t\tif (isMatch) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<mark key={key} className={highlightClassName}>\n\t\t\t\t\t\t\t{part}\n\t\t\t\t\t\t</mark>\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn <React.Fragment key={key}>{part}</React.Fragment>;\n\t\t\t})}\n\t\t</Text>\n\t);\n}\n\nHighlightedText.displayName = 'HighlightedText';\n","/**\n * Hook for debounced search functionality\n */\n\nimport { useEffect } from 'react';\nimport { useDebouncedCallback } from '../../../../hooks/use-debounced-callback';\nimport { DEFAULT_DEBOUNCE_MS, DEFAULT_MIN_SEARCH_LENGTH } from '../constants';\n\nexport interface UseDebouncedSearchOptions {\n\tsearchValue: string;\n\tonSearch: ((value: string) => void) | undefined;\n\tdebounceMs?: number;\n\tminSearchLength?: number;\n}\n\nexport function useDebouncedSearch({\n\tsearchValue,\n\tonSearch,\n\tdebounceMs = DEFAULT_DEBOUNCE_MS,\n\tminSearchLength = DEFAULT_MIN_SEARCH_LENGTH,\n}: UseDebouncedSearchOptions): void {\n\t// `useDebouncedCallback` holds `onSearch` in a ref, so `emitSearch` keeps a\n\t// stable identity even though consumers pass a new inline callback every\n\t// render. Depending on the raw `onSearch` here re-ran the effect on every\n\t// render and — when it triggered a state update — caused an infinite fetch\n\t// loop.\n\tconst emitSearch = useDebouncedCallback((value: string) => {\n\t\tonSearch?.(value);\n\t}, debounceMs);\n\n\tuseEffect(() => {\n\t\tconst trimmed = searchValue.trim();\n\t\tif (trimmed.length < minSearchLength) return;\n\n\t\temitSearch(trimmed);\n\t\treturn emitSearch.cancel;\n\t}, [searchValue, minSearchLength, emitSearch]);\n}\n","/**\n * Hook for grouping items by category\n */\n\nimport { useMemo } from 'react';\n\nexport interface UseGroupedItemsOptions<T> {\n\titems: T[];\n\tgetItemGroup: ((item: T) => string) | undefined;\n}\n\nexport type GroupedItemsResult<T> = Map<string, T[]> | null;\n\nexport function useGroupedItems<T>({\n\titems,\n\tgetItemGroup,\n}: UseGroupedItemsOptions<T>): GroupedItemsResult<T> {\n\treturn useMemo(() => {\n\t\tif (!getItemGroup) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst groups = new Map<string, T[]>();\n\n\t\tfor (const item of items) {\n\t\t\tconst groupKey = getItemGroup(item);\n\t\t\tconst existing = groups.get(groupKey);\n\n\t\t\tif (existing) {\n\t\t\t\texisting.push(item);\n\t\t\t} else {\n\t\t\t\tgroups.set(groupKey, [item]);\n\t\t\t}\n\t\t}\n\n\t\treturn groups;\n\t}, [items, getItemGroup]);\n}\n","/**\n * Hook for infinite scroll / load more functionality\n */\n\nimport { useCallback, useEffect, useRef } from 'react';\nimport { useDebouncedCallback } from '../../../../hooks/use-debounced-callback';\nimport {\n\tLOAD_MORE_THRESHOLD,\n\tLOAD_MORE_DEBOUNCE_MS,\n\tLOAD_MORE_COOLDOWN_MS,\n} from '../constants';\n\nexport interface UseLoadMoreOptions {\n\thasMore: boolean | undefined;\n\tonLoadMore: (() => void) | undefined;\n\tloadingMore: boolean | undefined;\n}\n\nexport interface UseLoadMoreReturn {\n\thandleScroll: (event: Event) => void;\n}\n\nexport function useLoadMore({\n\thasMore,\n\tonLoadMore,\n\tloadingMore,\n}: UseLoadMoreOptions): UseLoadMoreReturn {\n\tconst isLoadingRef = useRef(false);\n\tconst cooldownRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n\tconst requestLoadMore = useDebouncedCallback(() => {\n\t\tisLoadingRef.current = true;\n\t\tonLoadMore?.();\n\n\t\t// Cooldown, not a debounce: it keeps a second page from being requested\n\t\t// while the first is still in flight.\n\t\tif (cooldownRef.current) clearTimeout(cooldownRef.current);\n\t\tcooldownRef.current = setTimeout(() => {\n\t\t\tisLoadingRef.current = false;\n\t\t\tcooldownRef.current = null;\n\t\t}, LOAD_MORE_COOLDOWN_MS);\n\t}, LOAD_MORE_DEBOUNCE_MS);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (cooldownRef.current) clearTimeout(cooldownRef.current);\n\t\t};\n\t}, []);\n\n\tconst handleScroll = useCallback(\n\t\t(event: Event) => {\n\t\t\tif (!hasMore || !onLoadMore || loadingMore || isLoadingRef.current) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst target = event.target as HTMLElement;\n\t\t\tconst { scrollHeight, scrollTop, clientHeight } = target;\n\t\t\tconst scrollPercentage = (scrollTop + clientHeight) / scrollHeight;\n\n\t\t\tif (scrollPercentage >= LOAD_MORE_THRESHOLD) {\n\t\t\t\trequestLoadMore();\n\t\t\t}\n\t\t},\n\t\t[hasMore, onLoadMore, loadingMore, requestLoadMore]\n\t);\n\n\treturn { handleScroll };\n}\n","/**\n * Headless state and rendering contract shared by the canonical comboboxes.\n *\n * Extracts shared logic between single and multiple selection variants\n * to reduce duplication and ensure consistent behavior.\n */\n\nimport { PlusIcon } from 'lucide-react';\nimport * as React from 'react';\nimport { useRef, useMemo, useEffect, useCallback } from 'react';\nimport { Text } from '../../../typography';\nimport { useStrings, type StringsProp } from '../../../../lib/strings';\n\nimport { HighlightedText } from '../components/highlighted-text';\nimport { defaultComboboxStrings } from '../combobox.strings';\nimport {\n\tDEFAULT_MIN_SEARCH_LENGTH,\n\tDEFAULT_DEBOUNCE_MS,\n\tisCreateOption,\n\tgetCreateOptionValue,\n\tcreateCreateOption,\n} from '../constants';\nimport type { ComboboxStrings, ComboboxSharedProps } from '../types';\nimport { useDebouncedSearch } from './use-debounced-search';\nimport { useGroupedItems } from './use-grouped-items';\nimport { useLoadMore } from './use-load-more';\n\nimport { cn } from '../../../../lib/utils';\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface UseComboboxCoreOptions<T> extends ComboboxSharedProps<T> {\n\t/** Items that should always be included (selected items) */\n\tensuredItems?: T[];\n}\n\nexport interface UseComboboxCoreReturn<T> {\n\t// Resolved values\n\tstrings: ComboboxStrings;\n\tgetKey: (item: T) => string;\n\ttrimmedSearch: string;\n\n\t// Refs\n\tlistRef: React.RefObject<HTMLDivElement | null>;\n\n\t// Items\n\tbaseItems: T[];\n\tallItems: T[];\n\tgroupedItems: Map<string, T[]> | null;\n\tcreateOptionItem: T | null;\n\n\t// Display state\n\tshowStatus: boolean;\n\tshowEmpty: boolean;\n\tshowCreateOption: boolean;\n\n\t// Handlers\n\trenderItemContent: (item: T) => React.ReactNode;\n\titemToStringLabel: (item: T) => string;\n\tgetItemReactKey: (item: T) => string;\n\n\t// Scroll handling\n\thandleScroll: (event: Event) => void;\n}\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\nfunction useComboboxStrings(custom?: StringsProp<ComboboxStrings>): ComboboxStrings {\n\treturn useStrings(defaultComboboxStrings, custom);\n}\n\nfunction hasExactMatch<T>(\n\titems: T[],\n\tsearchValue: string,\n\tgetItemLabel: (item: T) => string\n): boolean {\n\tconst normalizedSearch = searchValue.toLowerCase();\n\treturn items.some(\n\t\t(item) => getItemLabel(item).toLowerCase() === normalizedSearch\n\t);\n}\n\nexport function useComboboxCore<T>({\n\t// Core props\n\titems,\n\tsearchValue,\n\tgetItemLabel,\n\tgetItemKey,\n\tloading = false,\n\tshowListContent = true,\n\tminSearchLength = DEFAULT_MIN_SEARCH_LENGTH,\n\tstrings: stringsProp,\n\trenderItem,\n\n\t// Debounced Search\n\tonSearch,\n\tdebounceMs = DEFAULT_DEBOUNCE_MS,\n\n\t// Creatable\n\tcreatable,\n\tonCreate,\n\n\t// Grouped Items\n\tgetItemGroup,\n\n\t// Load More\n\thasMore,\n\tonLoadMore,\n\tloadingMore,\n\n\t// Highlight Match\n\thighlightMatch,\n\n\t\t// Ensured items (selected items that should always be included)\n\tensuredItems = [],\n}: UseComboboxCoreOptions<T>): UseComboboxCoreReturn<T> {\n\t// -------------------------------------------------------------------------\n\t// Setup\n\t// -------------------------------------------------------------------------\n\n\tconst strings = useComboboxStrings(stringsProp);\n\tconst getKey = getItemKey ?? getItemLabel;\n\tconst listRef = useRef<HTMLDivElement | null>(null);\n\tconst trimmedSearch = searchValue.trim();\n\tconst showStatus = showListContent && (loading || trimmedSearch.length < minSearchLength);\n\n\t// -------------------------------------------------------------------------\n\t// Hooks\n\t// -------------------------------------------------------------------------\n\n\tuseDebouncedSearch({\n\t\tsearchValue,\n\t\tonSearch,\n\t\tdebounceMs,\n\t\tminSearchLength,\n\t});\n\n\tconst { handleScroll } = useLoadMore({\n\t\thasMore: showListContent && !showStatus ? hasMore : false,\n\t\tonLoadMore,\n\t\tloadingMore,\n\t});\n\n\t// Attach scroll listener\n\tuseEffect(() => {\n\t\tconst listEl = listRef.current;\n\t\tif (!showListContent || showStatus || !listEl || !hasMore || !onLoadMore) return;\n\n\t\tlistEl.addEventListener('scroll', handleScroll);\n\t\treturn () => listEl.removeEventListener('scroll', handleScroll);\n\t}, [handleScroll, hasMore, onLoadMore, showListContent, showStatus]);\n\n\t// -------------------------------------------------------------------------\n\t// Computed Values\n\t// -------------------------------------------------------------------------\n\n\t// Merge ensured items with fetched items\n\tconst baseItems = useMemo(() => {\n\t\tif (!showListContent || showStatus) return [];\n\t\tif (ensuredItems.length === 0) return items;\n\n\t\tconst merged = [...ensuredItems];\n\t\titems.forEach((item) => {\n\t\t\tconst itemKey = getKey(item);\n\t\t\tif (!ensuredItems.some((ensured) => getKey(ensured) === itemKey)) {\n\t\t\t\tmerged.push(item);\n\t\t\t}\n\t\t});\n\t\treturn merged;\n\t}, [items, ensuredItems, getKey, showListContent, showStatus]);\n\n\t// Group items if grouping is enabled\n\tconst groupedItems = useGroupedItems({\n\t\titems: baseItems,\n\t\tgetItemGroup,\n\t});\n\n\t// Determine if create option should be shown\n\tconst showCreateOption = useMemo(() => {\n\t\tif (!showListContent || showStatus) return false;\n\t\tif (!creatable || !onCreate) return false;\n\t\tif (trimmedSearch.length < minSearchLength) return false;\n\t\treturn !hasExactMatch(baseItems, trimmedSearch, getItemLabel);\n\t}, [creatable, onCreate, trimmedSearch, minSearchLength, baseItems, getItemLabel, showListContent, showStatus]);\n\n\tconst createOptionItem = useMemo(() => {\n\t\tif (!showCreateOption) return null;\n\t\treturn createCreateOption<T>(trimmedSearch);\n\t}, [showCreateOption, trimmedSearch]);\n\n\t// Build final items array with create option\n\tconst allItems = useMemo(() => {\n\t\tif (createOptionItem) return [...baseItems, createOptionItem];\n\t\treturn baseItems;\n\t}, [baseItems, createOptionItem]);\n\n\t// Status display conditions\n\tconst showEmpty =\n\t\tshowListContent &&\n\t\t!loading &&\n\t\ttrimmedSearch.length >= minSearchLength &&\n\t\titems.length === 0 &&\n\t\t!showCreateOption;\n\n\t// -------------------------------------------------------------------------\n\t// Handlers\n\t// -------------------------------------------------------------------------\n\n\tconst renderItemContent = useCallback(\n\t\t(item: T): React.ReactNode => {\n\t\t\t// Handle create option\n\t\t\tif (isCreateOption(item)) {\n\t\t\t\tconst value = getCreateOptionValue(item);\n\t\t\t\treturn (\n\t\t\t\t\t<span className={cn('combobox-core--component', 'flex items-center gap-space-sm')}>\n\t\t\t\t\t\t<PlusIcon className=\"size-icon-sm\" />\n\t\t\t\t\t\t{strings.createNew.includes('{value}') ? (\n\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t\t\t\t{strings.createNew.replace('{value}', value)}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span className=\"inline-flex items-center gap-space-sm\">\n\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t\t\t\t\t{strings.createNew}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t\t\t\t\t{value}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Custom renderer takes precedence\n\t\t\tif (renderItem) {\n\t\t\t\treturn renderItem(item);\n\t\t\t}\n\n\t\t\t// Default rendering with optional highlighting\n\t\t\tconst label = getItemLabel(item);\n\t\t\tif (highlightMatch && trimmedSearch) {\n\t\t\t\treturn <HighlightedText text={label} highlight={trimmedSearch} />;\n\t\t\t}\n\t\t\treturn (\n\t\t\t\t<Text tag=\"span\" size=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t{label}\n\t\t\t\t</Text>\n\t\t\t);\n\t\t},\n\t\t[strings.createNew, renderItem, getItemLabel, highlightMatch, trimmedSearch]\n\t);\n\n\tconst itemToStringLabel = useCallback(\n\t\t(item: T): string => {\n\t\t\tif (isCreateOption(item)) {\n\t\t\t\treturn getCreateOptionValue(item);\n\t\t\t}\n\t\t\treturn getItemLabel(item);\n\t\t},\n\t\t[getItemLabel]\n\t);\n\n\tconst getItemReactKey = useCallback(\n\t\t(item: T): string => {\n\t\t\tif (isCreateOption(item)) return `__create__:${getCreateOptionValue(item)}`;\n\t\t\treturn String(getKey(item));\n\t\t},\n\t\t[getKey]\n\t);\n\n\treturn {\n\t\tstrings,\n\t\tgetKey,\n\t\ttrimmedSearch,\n\t\tlistRef,\n\t\tbaseItems,\n\t\tallItems,\n\t\tgroupedItems,\n\t\tcreateOptionItem,\n\t\tshowStatus,\n\t\tshowEmpty,\n\t\tshowCreateOption,\n\t\trenderItemContent,\n\t\titemToStringLabel,\n\t\tgetItemReactKey,\n\t\thandleScroll,\n\t};\n}\n","import { Stack } from '../../base/structure';\n/**\n * Combobox Components\n *\n * A feature-rich, API-driven combobox built on Base UI with shadcn styling.\n * Supports single and multiple selection, form integration, debounced search,\n * grouping, pagination, and more.\n *\n * This version uses shared hooks and components to eliminate duplication\n * between single and multiple selection variants.\n */\n\nimport * as React from 'react';\nimport { useRef, useCallback, useEffect, useState } from 'react';\n\nimport {\n\tComboboxRoot as BaseCombobox,\n\tComboboxChips,\n\tComboboxChip,\n\tComboboxChipsInput,\n} from '../../base/combobox';\nimport { Text } from '../../typography';\nimport { ComboboxInputField } from '../../base/combobox/combobox-field';\nimport { useDensityConfig, type FormControlSize } from '../../../lib/ui-provider';\nimport { resolveComponentScale } from '../../../lib/ui-provider/scale';\nimport { cn } from '../../../lib/utils';\n\nimport { ComboboxDropdown } from './components/combobox-dropdown';\nimport { ErrorMessage } from './components/error-message';\nimport {\n\tformControlMinHeightClasses,\n\tformControlPaddingClasses,\n} from '../../base/forms/form-sizing';\nimport {\n\tDEFAULT_MIN_SEARCH_LENGTH,\n\tDEFAULT_SIZE,\n\tisCreateOption,\n\tgetCreateOptionValue,\n} from './constants';\n\nimport { useComboboxCore } from './hooks/use-combobox-core';\nimport { defaultComboboxStrings } from './combobox.strings';\nimport type {\n\tComboboxProps,\n\tMultiComboboxProps,\n\tComboboxSize,\n} from './types';\n\nfunction resolveComboboxSize(\n\tsizeProp: ComboboxSize | undefined,\n\tdefaultScale: FormControlSize | undefined,\n): ComboboxSize {\n\treturn resolveComponentScale(sizeProp, defaultScale, DEFAULT_SIZE);\n};\n\n\nconst primitiveComboboxSizeBySize: Record<ComboboxSize, 'sm' | 'md' | 'lg'> = {\n\tsm: 'sm',\n\tmd: 'md',\n\tlg: 'lg',\n};\n\nfunction getComboboxFormSize(size: ComboboxSize): FormControlSize {\n\treturn size;\n}\n\n// ============================================================================\n// Single Selection Component\n// ============================================================================\n\nexport function Combobox<T>({\n\t// Core props\n\titems,\n\tselectedValue,\n\tonSelectedValueChange,\n\tclearSearchOnClose = true,\n\tsearchValue,\n\tonSearchValueChange,\n\tgetItemLabel,\n\tgetItemKey,\n\tloading = false,\n\tshowListContent = true,\n\tminSearchLength = DEFAULT_MIN_SEARCH_LENGTH,\n\tstrings: stringsProp,\n\tdisabled = false,\n\tclassName,\n\tclearable = true,\n\trenderItem,\n\tportalContainer,\n\n\t// Form Integration\n\tname,\n\tinvalid,\n\terror,\n\trequired,\n\tonBlur,\n\n\t// Debounced Search\n\tonSearch,\n\tdebounceMs,\n\n\t// Creatable\n\tcreatable,\n\tonCreate,\n\n\t// Grouped Items\n\tgetItemGroup,\n\trenderGroupLabel,\n\n\t// Load More\n\thasMore,\n\tonLoadMore,\n\tloadingMore,\n\n\t// Disable individual items\n\tgetItemDisabled,\n\n\t// Highlight Match\n\thighlightMatch,\n\n\t// Size\n\tsize: sizeProp,\n\n\t// Controlled Open\n\topen,\n\tonOpenChange,\n}: ComboboxProps<T>): React.ReactElement {\n\tconst { defaultScale } = useDensityConfig();\n\tconst size = resolveComboboxSize(sizeProp, defaultScale);\n\tconst formSize = getComboboxFormSize(size);\n\tconst hasError = invalid || Boolean(error);\n\n\t// Use shared core hook\n\tconst core = useComboboxCore({\n\t\titems,\n\t\tsearchValue,\n\t\tonSearchValueChange,\n\t\tgetItemLabel,\n\t\tgetItemKey,\n\t\tloading,\n\t\tshowListContent,\n\t\tminSearchLength,\n\t\tstrings: stringsProp,\n\t\trenderItem,\n\t\tonSearch,\n\t\tdebounceMs,\n\t\tcreatable,\n\t\tonCreate,\n\t\tgetItemGroup,\n\t\thasMore,\n\t\tonLoadMore,\n\t\tloadingMore,\n\t\thighlightMatch,\n\t\tsize,\n\t\t// Include selected value in items list\n\t\tensuredItems: selectedValue ? [selectedValue] : [],\n\t});\n\n\t// Track open state so we can show the selected label when closed\n\tconst [isOpen, setIsOpen] = useState(false);\n\tconst handleOpenChange = useCallback(\n\t\t(nextOpen: boolean) => {\n\t\t\tsetIsOpen(nextOpen);\n\t\t\tif (!nextOpen && clearSearchOnClose) {\n\t\t\t\t// Clear search when closing so next open starts fresh\n\t\t\t\tonSearchValueChange('');\n\t\t\t}\n\t\t\tonOpenChange?.(nextOpen);\n\t\t},\n\t\t[clearSearchOnClose, onOpenChange, onSearchValueChange],\n\t);\n\n\t// When closed with a selected value, show the label; when open, show search text\n\tconst displayInputValue = isOpen\n\t\t? searchValue\n\t\t: (selectedValue ? core.itemToStringLabel(selectedValue) : '');\n\n\t// Handle value change, including create option\n\tconst handleValueChange = useCallback(\n\t\t(value: T | null): void => {\n\t\t\tif (value && isCreateOption(value)) {\n\t\t\t\tconst inputValue = getCreateOptionValue(value);\n\t\t\t\tonCreate?.(inputValue);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tonSelectedValueChange(value);\n\t\t},\n\t\t[onSelectedValueChange, onCreate]\n\t);\n\n\treturn (\n\t\t<Stack gap=\"dense\" className=\"combobox--component\">\n\t\t\t<BaseCombobox\n\t\t\t\tdismissLabel={core.strings.dismiss}\n\t\t\t\titems={core.allItems}\n\t\t\t\tvalue={selectedValue}\n\t\t\t\tonValueChange={(value, details) => {\n\t\t\t\t\t// Escape on a closed field must not erase the chosen value; let the\n\t\t\t\t\t// surrounding dialog or drawer handle the key instead.\n\t\t\t\t\tif (details.reason === 'escape-key') { details.allowPropagation(); return; }\n\t\t\t\t\thandleValueChange(value);\n\t\t\t\t}}\n\t\t\t\tinputValue={displayInputValue}\n\t\t\t\tonInputValueChange={(value, details) => {\n\t\t\t\t\tconst { reason } = details;\n\t\t\t\t\tif (reason === 'escape-key') { details.allowPropagation(); return; }\n\t\t\t\t\tif (reason === 'item-press') {\n\t\t\t\t\t\tonSearchValueChange('');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tonSearchValueChange(value);\n\t\t\t\t}}\n\t\t\t\titemToStringLabel={core.itemToStringLabel}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tfilter={null}\n\t\t\t\tname={name}\n\t\t\t\trequired={required}\n\t\t\t\topen={open}\n\t\t\t\tonOpenChange={handleOpenChange}\n\t\t\t>\n\t\t\t\t<ComboboxInputField\n\t\t\t\t\tplaceholder={core.strings.placeholder}\n\t\t\t\t\tclearLabel={core.strings.clear}\n\t\t\t\t\ttoggleLabel={core.strings.toggle}\n\t\t\t\t\tclassName={className}\n\t\t\t\t\tsize={formSize}\n\t\t\t\t\terror={hasError}\n\t\t\t\t\trequired={required}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tclearable={clearable}\n\t\t\t\t\tonBlur={onBlur}\n\t\t\t\t/>\n\n\t\t\t\t<ComboboxDropdown\n\t\t\t\t\tloading={loading}\n\t\t\t\t\tshowStatus={core.showStatus}\n\t\t\t\t\tshowEmpty={core.showEmpty}\n\t\t\t\t\tsearchValue={searchValue}\n\t\t\t\t\tminSearchLength={minSearchLength}\n\t\t\t\t\titems={core.allItems}\n\t\t\t\t\tgroupedItems={core.groupedItems}\n\t\t\t\t\tcreateOptionItem={core.createOptionItem}\n\t\t\t\t\trenderItemContent={core.renderItemContent}\n\t\t\t\t\tgetItemReactKey={core.getItemReactKey}\n\t\t\t\t\tgetItemDisabled={getItemDisabled}\n\t\t\t\t\trenderGroupLabel={renderGroupLabel}\n\t\t\t\t\tloadingMore={showListContent && !core.showStatus ? loadingMore : false}\n\t\t\t\t\tstrings={core.strings}\n\t\t\t\t\tsize={size}\n\t\t\t\t\tportalContainer={portalContainer}\n\t\t\t\t\tlistRef={core.listRef}\n\t\t\t\t/>\n\t\t\t</BaseCombobox>\n\n\t\t\t<ErrorMessage error={error} size={size} />\n\t\t</Stack>\n\t);\n}\n\n// ============================================================================\n// Multiple Selection Component\n// ============================================================================\n\nexport function MultiCombobox<T>({\n\t// Core props\n\titems,\n\tselectedValues,\n\tonSelectedValuesChange,\n\tsearchValue,\n\tonSearchValueChange,\n\tgetItemLabel,\n\tgetItemKey,\n\tloading = false,\n\tshowListContent = true,\n\tminSearchLength = DEFAULT_MIN_SEARCH_LENGTH,\n\tstrings: stringsProp,\n\tdisabled = false,\n\tclassName,\n\trenderItem,\n\tportalContainer,\n\n\t// Form Integration\n\tname,\n\tinvalid,\n\terror,\n\trequired,\n\tonBlur,\n\n\t// Debounced Search\n\tonSearch,\n\tdebounceMs,\n\n\t// Creatable\n\tcreatable,\n\tonCreate,\n\n\t// Grouped Items\n\tgetItemGroup,\n\trenderGroupLabel,\n\n\t// Load More\n\thasMore,\n\tonLoadMore,\n\tloadingMore,\n\n\t// Disable individual items\n\tgetItemDisabled,\n\n\t// Highlight Match\n\thighlightMatch,\n\n\t// Size\n\tsize: sizeProp,\n\n\t// Controlled Open\n\topen,\n\tonOpenChange,\n\n\t// Behaviour\n\tcloseOnSelect = false,\n\tapplyButton = false,\n\tonApply,\n\tonCancel,\n}: MultiComboboxProps<T>): React.ReactElement {\n\tconst { defaultScale } = useDensityConfig();\n\tconst size = resolveComboboxSize(sizeProp, defaultScale);\n\tconst formSize = getComboboxFormSize(size);\n\tconst primitiveComboboxSize = primitiveComboboxSizeBySize[size];\n\tconst hasError = invalid || Boolean(error);\n\tconst containerRef = useRef<HTMLDivElement | null>(null);\n\tconst getKey = getItemKey ?? getItemLabel;\n\n\t// Draft state — only used in `applyButton` mode. Tracks the user's\n\t// in-progress selection so we can commit it on Apply or revert on\n\t// Cancel. When apply mode is OFF, we pass selections through immediately.\n\tconst [draftValues, setDraftValues] = useState<T[]>(selectedValues);\n\tconst [internalOpen, setInternalOpen] = useState(false);\n\tconst isOpenControlled = open !== undefined;\n\tconst resolvedOpen = isOpenControlled ? open : internalOpen;\n\n\tuseEffect(() => {\n\t\tif (applyButton) setDraftValues(selectedValues);\n\t}, [applyButton, selectedValues]);\n\n\tconst setOpen = useCallback(\n\t\t(next: boolean) => {\n\t\t\tif (!isOpenControlled) setInternalOpen(next);\n\t\t\tonOpenChange?.(next);\n\t\t},\n\t\t[isOpenControlled, onOpenChange],\n\t);\n\n\t// Use shared core hook\n\tconst core = useComboboxCore({\n\t\titems,\n\t\tsearchValue,\n\t\tonSearchValueChange,\n\t\tgetItemLabel,\n\t\tgetItemKey,\n\t\tloading,\n\t\tshowListContent,\n\t\tminSearchLength,\n\t\tstrings: stringsProp,\n\t\trenderItem,\n\t\tonSearch,\n\t\tdebounceMs,\n\t\tcreatable,\n\t\tonCreate,\n\t\tgetItemGroup,\n\t\thasMore,\n\t\tonLoadMore,\n\t\tloadingMore,\n\t\thighlightMatch,\n\t\tsize,\n\t\t// Include selected values in items list\n\t\tensuredItems: selectedValues,\n\t});\n\n\t// Handle value change, filtering out create options\n\tconst handleValueChange = useCallback(\n\t\t(values: T[]): void => {\n\t\t\tconst regularValues: T[] = [];\n\t\t\tlet createValue: string | null = null;\n\n\t\t\tfor (const value of values) {\n\t\t\t\tif (isCreateOption(value)) {\n\t\t\t\t\tcreateValue = getCreateOptionValue(value);\n\t\t\t\t} else {\n\t\t\t\t\tregularValues.push(value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (createValue) {\n\t\t\t\tonCreate?.(createValue);\n\t\t\t}\n\n\t\t\tconst next = (regularValues.length !== values.length || !createValue) ? regularValues : null;\n\t\t\tif (next) {\n\t\t\t\tif (applyButton) {\n\t\t\t\t\tsetDraftValues(next);\n\t\t\t\t} else {\n\t\t\t\t\tonSelectedValuesChange(next);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (closeOnSelect) {\n\t\t\t\tsetOpen(false);\n\t\t\t}\n\t\t},\n\t\t[onSelectedValuesChange, onCreate, applyButton, closeOnSelect, setOpen],\n\t);\n\n\tconst handleApply = useCallback(() => {\n\t\tif (applyButton) onSelectedValuesChange(draftValues);\n\t\tonApply?.();\n\t\tsetOpen(false);\n\t}, [applyButton, draftValues, onApply, onSelectedValuesChange, setOpen]);\n\n\tconst handleCancel = useCallback(() => {\n\t\tif (applyButton) setDraftValues(selectedValues);\n\t\tonCancel?.();\n\t\tsetOpen(false);\n\t}, [applyButton, selectedValues, onCancel, setOpen]);\n\n\tconst visibleValues = applyButton ? draftValues : selectedValues;\n\tconst chipsPlaceholder = visibleValues.length > 0 ? undefined : core.strings.placeholder;\n\n\treturn (\n\t\t<Stack gap=\"dense\" className=\"combobox--component\">\n\t\t\t<BaseCombobox\n\t\t\t\tdismissLabel={core.strings.dismiss}\n\t\t\t\titems={core.allItems}\n\t\t\t\tmultiple\n\t\t\t\tvalue={visibleValues}\n\t\t\t\tonValueChange={(value, details) => {\n\t\t\t\t\t// Escape on a closed field must not erase the chosen value; let the\n\t\t\t\t\t// surrounding dialog or drawer handle the key instead.\n\t\t\t\t\tif (details.reason === 'escape-key') { details.allowPropagation(); return; }\n\t\t\t\t\thandleValueChange(value);\n\t\t\t\t}}\n\t\t\t\tinputValue={searchValue}\n\t\t\t\tonInputValueChange={(value, details) => {\n\t\t\t\t\tconst { reason } = details;\n\t\t\t\t\tif (reason === 'escape-key') { details.allowPropagation(); return; }\n\t\t\t\t\tif (reason === 'item-press') {\n\t\t\t\t\t\tonSearchValueChange('');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tonSearchValueChange(value);\n\t\t\t\t}}\n\t\t\t\titemToStringLabel={core.itemToStringLabel}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tfilter={null}\n\t\t\t\tname={name}\n\t\t\t\trequired={required}\n\t\t\t\topen={resolvedOpen}\n\t\t\t\tonOpenChange={(next) => {\n\t\t\t\t\t// In apply-button mode, closing without committing should\n\t\t\t\t\t// revert the draft so the next open starts clean.\n\t\t\t\t\tif (!next && applyButton) setDraftValues(selectedValues);\n\t\t\t\t\tsetOpen(next);\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<ComboboxChips\n\t\t\t\t\tref={containerRef}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\tformControlMinHeightClasses[formSize],\n\t\t\t\t\t\tformControlPaddingClasses[formSize],\n\t\t\t\t\t\tformSize === 'sm' ? 'text-pxs' : 'text-sm',\n\t\t\t\t\t\t'bg-transparent !shadow-none',\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\tsize={primitiveComboboxSize}\n\t\t\t\t\terror={hasError}\n\t\t\t\t>\n\t\t\t\t\t{visibleValues.map((item) => (\n\t\t\t\t\t\t<ComboboxChip key={getKey(item)} strings={{ remove: (core.strings.removeSelection ?? defaultComboboxStrings.removeSelection)(getItemLabel(item)) }}>\n\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\t\t\t\tweight=\"medium\"\n\t\t\t\t\t\t\t\tlineHeight=\"tight\"\n\t\t\t\t\t\t\t\tclassName=\"combobox--chip-label text-inherit\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{getItemLabel(item)}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t</ComboboxChip>\n\t\t\t\t\t))}\n\t\t\t\t\t<ComboboxChipsInput\n\t\t\t\t\t\tplaceholder={chipsPlaceholder}\n\t\t\t\t\t\taria-invalid={hasError || undefined}\n\t\t\t\t\t\taria-required={required}\n\t\t\t\t\t\tonBlur={onBlur}\n\t\t\t\t\t/>\n\t\t\t\t</ComboboxChips>\n\n\t\t\t\t<ComboboxDropdown\n\t\t\t\t\tloading={loading}\n\t\t\t\t\tshowStatus={core.showStatus}\n\t\t\t\t\tshowEmpty={core.showEmpty}\n\t\t\t\t\tsearchValue={searchValue}\n\t\t\t\t\tminSearchLength={minSearchLength}\n\t\t\t\t\titems={core.allItems}\n\t\t\t\t\tgroupedItems={core.groupedItems}\n\t\t\t\t\tcreateOptionItem={core.createOptionItem}\n\t\t\t\t\trenderItemContent={core.renderItemContent}\n\t\t\t\t\tgetItemReactKey={core.getItemReactKey}\n\t\t\t\t\tgetItemDisabled={getItemDisabled}\n\t\t\t\t\trenderGroupLabel={renderGroupLabel}\n\t\t\t\t\tloadingMore={showListContent && !core.showStatus ? loadingMore : false}\n\t\t\t\t\tstrings={core.strings}\n\t\t\t\t\tsize={size}\n\t\t\t\t\tportalContainer={portalContainer}\n\t\t\t\t\tlistRef={core.listRef}\n\t\t\t\t\tanchor={containerRef}\n\t\t\t\t\tapplyFooter={showListContent && applyButton ? {\n\t\t\t\t\t\tapplyLabel: core.strings.apply,\n\t\t\t\t\t\tcancelLabel: core.strings.cancel,\n\t\t\t\t\t\tonApply: handleApply,\n\t\t\t\t\t\tonCancel: handleCancel,\n\t\t\t\t\t} : undefined}\n\t\t\t\t/>\n\t\t\t</BaseCombobox>\n\n\t\t\t<ErrorMessage error={error} size={size} />\n\t\t</Stack>\n\t);\n}\n\nCombobox.displayName = 'Combobox';\nMultiCombobox.displayName = 'MultiCombobox';\n","import { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\n\nimport { ErrorState } from '../../base/feedback';\nimport { Stack } from '../../base/structure';\nimport { Text } from '../../typography';\nimport { useDebouncedCallback } from '../../../hooks/use-debounced-callback';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport { Combobox } from './combobox';\nimport { defaultComboboxStrings } from './combobox.strings';\nimport { DEFAULT_DEBOUNCE_MS } from './constants';\nimport type { ComboboxSize, ComboboxStrings, ComboboxProps } from './types';\n\nexport interface AsyncResourceComboboxFetcherArgs {\n\tquery: string;\n\tlimit: number;\n\tsignal?: AbortSignal;\n}\n\nexport type AsyncResourceComboboxFetcher<T> = (\n\targs: AsyncResourceComboboxFetcherArgs,\n) => Promise<T[]>;\n\nexport interface AsyncResourceComboboxStrings extends ComboboxStrings {\n\terror: string;\n\tretry: string;\n}\n\nexport const defaultAsyncResourceComboboxStrings: AsyncResourceComboboxStrings = {\n\t...defaultComboboxStrings,\n\terror: 'Unable to load options.',\n\tretry: 'Retry',\n};\n\nexport interface AsyncResourceComboboxRenderOptionContext {\n\tquery: string;\n\tisSelected: boolean;\n}\n\nexport interface AsyncResourceComboboxRenderErrorContext {\n\terror: unknown;\n\tquery: string;\n\tretry: () => void;\n}\n\nexport interface AsyncResourceComboboxProps<T>\n\textends Omit<\n\t\tComboboxProps<T>,\n\t\t| 'items'\n\t\t| 'selectedValue'\n\t\t| 'onSelectedValueChange'\n\t\t| 'clearSearchOnClose'\n\t\t| 'searchValue'\n\t\t| 'onSearchValueChange'\n\t\t| 'getItemLabel'\n\t\t| 'getItemKey'\n\t\t| 'loading'\n\t\t| 'showListContent'\n\t\t| 'renderItem'\n\t\t| 'strings'\n\t\t| 'error'\n\t\t| 'debounceMs'\n\t> {\n\t/**\n\t * Loads options for the current query. This component owns the request\n\t * lifecycle: calls are debounced by `debounceMs`, the previous request is\n\t * aborted through `args.signal`, and out-of-order responses are discarded, so\n\t * the fetcher only needs to resolve or reject.\n\t *\n\t * A rejection clears the fetched list and presents the localized error as an\n\t * exclusive state, suppressing the ordinary no-results row. Honour\n\t * `args.signal` so aborts do not surface as errors.\n\t */\n\tfetcher: AsyncResourceComboboxFetcher<T>;\n\t/** Selected item, for controlled use. Omit entirely to let the component own selection. */\n\tvalue?: T | null;\n\t/** Initial selection for uncontrolled use. Ignored once `value` is passed. */\n\tdefaultValue?: T | null;\n\t/** Fired with the new selection in both controlled and uncontrolled modes. */\n\tonValueChange?: (value: T | null) => void;\n\t/** Fired after a successful fetch with the items received and the request that produced them. */\n\tonAfterFetch?: (items: T[], context: AsyncResourceComboboxFetcherArgs) => void;\n\t/** Fired when the fetcher rejects. Aborted and superseded requests never reach this. */\n\tonError?: (error: unknown, context: AsyncResourceComboboxFetcherArgs) => void;\n\t/** Stable identity for an item. Also decides which option reads as selected. */\n\tgetKey: (item: T) => string;\n\t/** Primary display label for an item. */\n\tgetLabel: (item: T) => string;\n\t/** Secondary text beside the label in the default option row. */\n\tgetDescription?: (item: T) => ReactNode;\n\t/** Tertiary, dimmed text after the description in the default option row. */\n\tgetMeta?: (item: T) => ReactNode;\n\t/**\n\t * Replaces the entire default option row, including the label. When set,\n\t * `getLabel`, `getDescription`, and `getMeta` no longer affect rendering\n\t * (`getLabel` is still used for the input's text value).\n\t */\n\trenderOption?: (item: T, context: AsyncResourceComboboxRenderOptionContext) => ReactNode;\n\t/**\n\t * Page size passed to the fetcher as `args.limit`. Default: `10`.\n\t *\n\t * Advisory only — the component does not truncate the returned array, so the\n\t * fetcher is responsible for honouring it.\n\t */\n\tlimit?: number;\n\t/** Quiet period before a query is issued, in milliseconds. Default: `300`. */\n\tdebounceMs?: number;\n\t/**\n\t * Characters required before a query is issued. Default: `0` here, rather\n\t * than the `3` used by the synchronous comboboxes — resource lookup is\n\t * expected to be browsable from the first keystroke alongside `preload`.\n\t *\n\t * An empty input is governed by `preload`, not by this threshold.\n\t */\n\tminSearchLength?: number;\n\t/**\n\t * Fetches with an empty query so options are available before typing.\n\t * Default: `true`. Set `false` to require a query first.\n\t */\n\tpreload?: boolean;\n\t/** Replaces the default error copy shown when the fetcher rejects. */\n\terrorMessage?: ReactNode;\n\t/** Replaces the package error state while retaining the failed query and retry action. */\n\trenderError?: (context: AsyncResourceComboboxRenderErrorContext) => ReactNode;\n\t/** Overrides the combobox copy, including the async-only `error` message. */\n\tstrings?: StringsProp<AsyncResourceComboboxStrings>;\n\t/** Trigger density. Falls back to `UIProvider.density.defaultScale`, then `md`. */\n\tsize?: ComboboxSize;\n}\n\nfunction isSimpleText(value: ReactNode): value is string | number | bigint {\n\treturn typeof value === 'string' || typeof value === 'number' || typeof value === 'bigint';\n}\n\nexport function AsyncResourceCombobox<T>({\n\tfetcher,\n\tvalue,\n\tdefaultValue = null,\n\tonValueChange,\n\tonAfterFetch,\n\tonError,\n\tgetKey,\n\tgetLabel,\n\tgetDescription,\n\tgetMeta,\n\trenderOption,\n\tlimit = 10,\n\tdebounceMs = DEFAULT_DEBOUNCE_MS,\n\tpreload = true,\n\tminSearchLength = 0,\n\terrorMessage,\n\trenderError,\n\tstrings: stringsProp,\n\tdisabled,\n\tsize,\n\t...props\n}: AsyncResourceComboboxProps<T>) {\n\tconst strings = useStrings(defaultAsyncResourceComboboxStrings, stringsProp);\n\tconst isControlled = value !== undefined;\n\tconst [internalValue, setInternalValue] = useState<T | null>(defaultValue);\n\tconst selectedValue = isControlled ? value : internalValue;\n\tconst [searchValue, setSearchValue] = useState('');\n\tconst [items, setItems] = useState<T[]>([]);\n\tconst [isLoading, setIsLoading] = useState(false);\n\tconst [fetchError, setFetchError] = useState<{ error: unknown; query: string } | null>(null);\n\tconst [retryCount, setRetryCount] = useState(0);\n\tconst requestIdRef = useRef(0);\n\tconst trimmedSearch = searchValue.trim();\n\n\tconst handleValueChange = useCallback(\n\t\t(nextValue: T | null) => {\n\t\t\tif (!isControlled) {\n\t\t\t\tsetInternalValue(nextValue);\n\t\t\t}\n\t\t\tonValueChange?.(nextValue);\n\t\t},\n\t\t[isControlled, onValueChange],\n\t);\n\n\t// `fetcher`, `onAfterFetch` and `onError` are almost always inline, so their\n\t// identities change on every render. Listing them in the effect below re-ran\n\t// it every render, and because the fetch sets state that re-render was\n\t// self-sustaining — an unbounded request loop. `useDebouncedCallback` holds\n\t// them in a ref and returns a stable function, so the effect only re-runs on\n\t// a real query change.\n\tconst runFetch = useDebouncedCallback(\n\t\t(requestId: number, context: AsyncResourceComboboxFetcherArgs) => {\n\t\t\tsetIsLoading(true);\n\t\t\tsetFetchError(null);\n\n\t\t\tfetcher(context)\n\t\t\t\t.then((nextItems) => {\n\t\t\t\t\tif (context.signal?.aborted || requestIdRef.current !== requestId) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tsetItems(nextItems);\n\t\t\t\t\tonAfterFetch?.(nextItems, context);\n\t\t\t\t})\n\t\t\t\t.catch((nextError: unknown) => {\n\t\t\t\t\tif (context.signal?.aborted || requestIdRef.current !== requestId) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tsetItems([]);\n\t\t\t\t\tsetFetchError({ error: nextError, query: context.query });\n\t\t\t\t\tonError?.(nextError, context);\n\t\t\t\t})\n\t\t\t\t.finally(() => {\n\t\t\t\t\tif (!context.signal?.aborted && requestIdRef.current === requestId) {\n\t\t\t\t\t\tsetIsLoading(false);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t},\n\t\tdebounceMs,\n\t);\n\n\tuseEffect(() => {\n\t\tif (disabled) return;\n\n\t\tconst shouldFetch =\n\t\t\ttrimmedSearch.length > 0\n\t\t\t\t? trimmedSearch.length >= minSearchLength\n\t\t\t\t: preload;\n\n\t\tif (!shouldFetch) {\n\t\t\tsetItems([]);\n\t\t\tsetIsLoading(false);\n\t\t\tsetFetchError(null);\n\t\t\treturn;\n\t\t}\n\n\t\tconst requestId = requestIdRef.current + 1;\n\t\trequestIdRef.current = requestId;\n\t\tconst controller = new AbortController();\n\n\t\trunFetch(requestId, {\n\t\t\tquery: trimmedSearch,\n\t\t\tlimit,\n\t\t\tsignal: controller.signal,\n\t\t});\n\n\t\treturn () => {\n\t\t\trunFetch.cancel();\n\t\t\tcontroller.abort();\n\t\t};\n\t}, [\n\t\tdisabled,\n\t\tlimit,\n\t\tminSearchLength,\n\t\tpreload,\n\t\tretryCount,\n\t\trunFetch,\n\t\ttrimmedSearch,\n\t]);\n\n\tconst retry = useCallback(() => {\n\t\tif (!fetchError) return;\n\t\tsetSearchValue(fetchError.query);\n\t\tsetRetryCount((count) => count + 1);\n\t}, [fetchError]);\n\n\tconst renderItem = useCallback(\n\t\t(item: T) => {\n\t\t\tif (renderOption) {\n\t\t\t\treturn renderOption(item, {\n\t\t\t\t\tquery: trimmedSearch,\n\t\t\t\t\tisSelected: selectedValue ? getKey(selectedValue) === getKey(item) : false,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst description = getDescription?.(item);\n\t\t\tconst meta = getMeta?.(item);\n\n\t\t\treturn (\n\t\t\t\t<Stack\n\t\t\t\t\trender={<span />}\n\t\t\t\t\tdirection=\"horizontal\"\n\t\t\t\t\tgap=\"md\"\n\t\t\t\t\twrap={false}\n\t\t\t\t\tclassName=\"async-resource-combobox--option leading-tight\"\n\t\t\t\t>\n\t\t\t\t\t<Text type=\"inherit\"\n\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\tsize={size === 'sm' ? 'pxs' : undefined}\n\t\t\t\t\t\tweight=\"medium\"\n\t\t\t\t\t\tclassName=\"min-w-0 shrink truncate\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{getLabel(item)}\n\t\t\t\t\t</Text>\n\t\t\t\t\t{(!!description || !!meta) && (\n\t\t\t\t\t\t<span className=\"inline-flex min-w-0 flex-1 items-center gap-space-sm overflow-hidden text-muted-foreground\">\n\t\t\t\t\t\t\t{!!description && (isSimpleText(description) ? (\n\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" className=\"min-w-0 truncate\">\n\t\t\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t) : description)}\n\t\t\t\t\t\t\t{!!meta && (isSimpleText(meta) ? (\n\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" className=\"min-w-0 truncate\">\n\t\t\t\t\t\t\t\t\t{meta}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t) : meta)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t);\n\t\t},\n\t\t[getDescription, getKey, getLabel, getMeta, renderOption, selectedValue, size, trimmedSearch],\n\t);\n\n\tconst resolvedError = useMemo(() => {\n\t\tif (!fetchError) return undefined;\n\t\treturn errorMessage ?? strings.error;\n\t}, [errorMessage, fetchError, strings.error]);\n\tconst hasFetchError = fetchError !== null;\n\tconst errorNode = fetchError\n\t\t? renderError?.({ error: fetchError.error, query: fetchError.query, retry }) ?? (\n\t\t\t<ErrorState\n\t\t\t\tvariant=\"inline\"\n\t\t\t\ttitle={resolvedError}\n\t\t\t\tonRetry={retry}\n\t\t\t\tretryLabel={strings.retry}\n\t\t\t\tclassName=\"async-resource-combobox--error mt-space-sm\"\n\t\t\t/>\n\t\t)\n\t\t: null;\n\n\treturn (\n\t\t<div\n\t\t\tdata-component=\"async-resource-combobox\"\n\t\t\tdata-slot=\"async-resource-combobox\"\n\t\t\tclassName={cn('async-resource-combobox--component', props.className)}\n\t\t>\n\t\t\t<Combobox\n\t\t\t\t{...props}\n\t\t\t\tclassName={undefined}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tsize={size}\n\t\t\t\titems={items}\n\t\t\t\tselectedValue={selectedValue ?? null}\n\t\t\t\tonSelectedValueChange={handleValueChange}\n\t\t\t\tclearSearchOnClose={false}\n\t\t\t\tsearchValue={searchValue}\n\t\t\t\tonSearchValueChange={setSearchValue}\n\t\t\t\tgetItemLabel={getLabel}\n\t\t\t\tgetItemKey={getKey}\n\t\t\t\tloading={!hasFetchError && isLoading}\n\t\t\t\tshowListContent={!hasFetchError}\n\t\t\t\tminSearchLength={minSearchLength}\n\t\t\t\tstrings={strings}\n\t\t\t\trenderItem={renderItem}\n\t\t\t/>\n\t\t\t{errorNode}\n\t\t</div>\n\t);\n}\n\nAsyncResourceCombobox.displayName = 'AsyncResourceCombobox';\n"],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
3
|
-
import { t } from "./utils-
|
|
4
|
-
import { c as n } from "./typography-
|
|
5
|
-
import {
|
|
6
|
-
import { a as i, n as a, r as o, t as s } from "./popover.recipes-
|
|
7
|
-
import { n as c } from "./collection-content-
|
|
8
|
-
import { t as l } from "./input-
|
|
2
|
+
import { v as e } from "./ui-provider-C-74NVLc.js";
|
|
3
|
+
import { t } from "./utils-B6kKb8jB.js";
|
|
4
|
+
import { c as n } from "./typography-BQnine1k.js";
|
|
5
|
+
import { s as r } from "./text.styles-B64My8RZ.js";
|
|
6
|
+
import { a as i, n as a, r as o, t as s } from "./popover.recipes-DdiEp0rd.js";
|
|
7
|
+
import { n as c } from "./collection-content-gDh1v6O4.js";
|
|
8
|
+
import { t as l } from "./input-CvyDQlY7.js";
|
|
9
9
|
import * as u from "react";
|
|
10
10
|
import { Fragment as d, jsx as f, jsxs as p } from "react/jsx-runtime";
|
|
11
11
|
import { Check as m } from "lucide-react";
|
|
@@ -139,7 +139,7 @@ function w({ children: e, className: n, asChild: r, label: i, shouldFilter: a =
|
|
|
139
139
|
...w,
|
|
140
140
|
"aria-label": w["aria-label"] ?? i,
|
|
141
141
|
"data-slot": "command",
|
|
142
|
-
className: t("flex size-full flex-col overflow-hidden rounded-
|
|
142
|
+
className: t("flex size-full flex-col overflow-hidden rounded-surface bg-popover text-popover-foreground", n),
|
|
143
143
|
...r ? {} : { children: e },
|
|
144
144
|
onKeyDownCapture(e) {
|
|
145
145
|
if (x?.(e), !e.defaultPrevented && F) {
|
|
@@ -288,7 +288,7 @@ function k({ className: e, children: n, value: r, keywords: i = [], forceMount:
|
|
|
288
288
|
"aria-selected": C.active === w,
|
|
289
289
|
"data-selected": C.active === w ? "true" : "false",
|
|
290
290
|
"data-disabled": o ? "true" : void 0,
|
|
291
|
-
className: t("relative flex min-h-action-sm cursor-default items-center gap-space-sm rounded-
|
|
291
|
+
className: t("relative flex min-h-action-sm cursor-default items-center gap-space-sm rounded-radius px-control-sm py-row-y text-sm outline-none select-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-disabled:cursor-not-allowed", e),
|
|
292
292
|
render: l && u.isValidElement(n) ? u.cloneElement(n, { id: m }) : /* @__PURE__ */ f("div", { id: m }),
|
|
293
293
|
onClick: (e) => {
|
|
294
294
|
c?.(e), !e.defaultPrevented && !o && s?.(w);
|
|
@@ -324,13 +324,13 @@ function j({ className: e, ...n }) {
|
|
|
324
324
|
var M = {
|
|
325
325
|
default: i.default,
|
|
326
326
|
compact: i.compact,
|
|
327
|
-
flush:
|
|
327
|
+
flush: `${i.flush} ${o.menuSearch}`
|
|
328
328
|
}, N = u.createContext("compact");
|
|
329
329
|
function P({ className: e, inset: n = "compact", ...r }) {
|
|
330
330
|
return /* @__PURE__ */ f(N.Provider, {
|
|
331
331
|
value: n,
|
|
332
332
|
children: /* @__PURE__ */ f(w, {
|
|
333
|
-
className: t("command--component", "gap-0 rounded-
|
|
333
|
+
className: t("command--component", "gap-0 rounded-surface bg-popover text-popover-foreground", M[n], e),
|
|
334
334
|
...r
|
|
335
335
|
})
|
|
336
336
|
});
|
|
@@ -422,4 +422,4 @@ P.displayName = "Command", F.displayName = "CommandInput", I.displayName = "Comm
|
|
|
422
422
|
//#endregion
|
|
423
423
|
export { z as a, H as c, F as i, _ as l, B as n, I as o, R as r, V as s, P as t };
|
|
424
424
|
|
|
425
|
-
//# sourceMappingURL=command-
|
|
425
|
+
//# sourceMappingURL=command-CrlPIL6m.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-CrlPIL6m.js","names":["React","Command","defaultFilter","CommandInput","CommandList","CommandEmpty","CommandGroup","CommandItem","CommandSeparator","CommandShortcut","React","CommandPrimitive","CommandInputPrimitive","CommandListPrimitive","CommandGroupPrimitive","_Fragment","CommandItemPrimitive","CommandEmptyPrimitive","CommandSeparatorPrimitive","CommandShortcutPrimitive","useTypographyConfig","Text","textSizes","surfaceInsetClasses","collectionRowClasses","popoverRecipes","collectionRecipes","CollectionLabel","Input","React$1","Fragment$1","commandFilter","haystack","value","keywords","needle","search","position","char","CommandContext","GroupContext","useCommand","textValue","children","child","visible","item","context","rankRecords","candidates","records","scores","compare","b","a","loose","groups","group","sortedGroups","items","Command$1","props","searchState","setSearchState","input","setInput","activeState","setActiveState","defaultValue","setRecords","active","managedHighlight","rootRef","sourceOrder","nextSourceOrder","register","current","record","registerInput","next","setSearch","setActive","onValueChange","shouldFilter","filter","rankedRecords","sourceLayout","previouslyRanked","root","liveIds","id","parent","key","element","owned","parents","ranks","index","rank","ranking","source","recordedKey","desired","sorted","left","right","previousSearch","searchChanged","useRender","asChild","ref","label","cn","className","onKeyDownCapture","event","delta","loop","onKeyDown","vimBindings","Autocomplete","disablePointerSelection","details","CommandInput$1","CommandList$1","CommandEmpty$1","CommandGroup$1","_value","groupItems","hidden","forceMount","headingElement","heading","renderedGroup","CommandItem$1","valueProp","groupContext","effectiveForceMount","keywordsKey","disabled","onClick","onSelect","CommandSeparator$1","alwaysRender","CommandShortcut$1","commandInsetClasses","CommandInsetContext","Command","inset","CommandInput","CommandList","CommandGroupHeading","CommandGroup","resolvedHeading","CommandItem","indicator","Check","content","density","defaultTextSize","CommandEmpty","CommandSeparator","CommandShortcut"],"sources":["../src/lib/command-filter.ts","../src/components/ui/command.tsx","../src/components/base/command/command.tsx"],"sourcesContent":["// Subsequence matching preserves fuzzy searches and keyword aliases without cmdk.\nexport function commandFilter(value: string, search: string, keywords: string[] = []) {\n const haystack = [value, ...keywords].join(' ').toLocaleLowerCase();\n const needle = search.trim().toLocaleLowerCase();\n if (!needle) return 1;\n if (haystack.includes(needle)) return 1;\n let position = 0;\n for (const char of needle) {\n position = haystack.indexOf(char, position);\n if (position === -1) return 0;\n position += 1;\n }\n return 0.5;\n}\n","import { commandFilter as defaultFilter } from '../../lib/command-filter';\nimport * as React from 'react';\nimport { Autocomplete } from '@base-ui/react/autocomplete';\nimport { useRender } from '@base-ui/react/use-render';\nimport { cn } from '../../lib/utils';\n\nexport type CommandFilter = (value: string, search: string, keywords?: string[]) => number;\ntype ItemRecord = { id: string; value: string; keywords: string[]; forceMount: boolean; disabled?: boolean; group?: string };\ntype InputState = { value?: string; onValueChange?: (value: string) => void };\ntype CommandContextValue = {\n managedHighlight: boolean; search: string; setSearch: (value: string) => void;\n active: string; setActive: (value: string) => void;\n shouldFilter: boolean; filter: CommandFilter;\n records: ItemRecord[]; register: (item: ItemRecord) => () => void;\n registerInput: (input: InputState) => () => void;\n};\nconst CommandContext = React.createContext<CommandContextValue | null>(null);\nconst GroupContext = React.createContext<{ id?: string; forceMount: boolean }>({ forceMount: false });\nfunction useCommand() {\n const value = React.useContext(CommandContext);\n if (!value) throw new Error('Command parts must be rendered inside Command.');\n return value;\n}\nfunction textValue(children: React.ReactNode): string {\n return React.Children.toArray(children).map(child => {\n if (typeof child === 'string' || typeof child === 'number') return String(child);\n if (React.isValidElement<{ children?: React.ReactNode }>(child)) return textValue(child.props.children);\n return '';\n }).join(' ').trim();\n}\n\nfunction visible(item: ItemRecord, context: Pick<CommandContextValue, 'search' | 'shouldFilter' | 'filter'>) {\n return item.forceMount || !context.shouldFilter || !context.search || context.filter(item.value, context.search, item.keywords) > 0;\n}\n/** cmdk ranks loose items first, then groups by their best matching item. */\nfunction rankRecords(records: ItemRecord[], context: Pick<CommandContextValue, 'search' | 'shouldFilter' | 'filter'>) {\n const candidates = records.filter(item => visible(item, context));\n if (!context.search || !context.shouldFilter) return candidates;\n const scores = new Map(candidates.map(item => [item.id, context.filter(item.value, context.search, item.keywords)]));\n const compare = (a: ItemRecord, b: ItemRecord) => (scores.get(b.id) ?? 0) - (scores.get(a.id) ?? 0);\n const loose: ItemRecord[] = [];\n const groups = new Map<string, ItemRecord[]>();\n for (const item of candidates) {\n if (!item.group) loose.push(item);\n else { const group = groups.get(item.group) ?? []; group.push(item); groups.set(item.group, group); }\n }\n const sortedGroups = Array.from(groups.values()).map(items => items.sort(compare))\n .sort((a, b) => (scores.get(b[0].id) ?? 0) - (scores.get(a[0].id) ?? 0));\n return [...loose.sort(compare), ...sortedGroups.flat()];\n}\nexport type CommandProps = React.ComponentPropsWithRef<'div'> & {\n asChild?: boolean; label?: string; shouldFilter?: boolean; filter?: CommandFilter;\n defaultValue?: string; value?: string; onValueChange?: (value: string) => void;\n loop?: boolean; disablePointerSelection?: boolean; vimBindings?: boolean;\n};\nfunction Command({ children, className, asChild, label, shouldFilter = true, filter = defaultFilter,\n value, defaultValue = '', onValueChange, loop = false, disablePointerSelection = false,\n vimBindings = true, ref, onKeyDown, onKeyDownCapture, ...props }: CommandProps) {\n const [searchState, setSearchState] = React.useState('');\n const [input, setInput] = React.useState<InputState>({});\n const [activeState, setActiveState] = React.useState(defaultValue);\n const [records, setRecords] = React.useState<ItemRecord[]>([]);\n const search = input.value ?? searchState;\n const active = value ?? activeState;\n const managedHighlight = value !== undefined || defaultValue !== '';\n const rootRef = React.useRef<HTMLDivElement>(null);\n const sourceOrder = React.useRef(new Map<string, number>());\n const nextSourceOrder = React.useRef(0);\n const register = React.useCallback((item: ItemRecord) => {\n if (!sourceOrder.current.has(item.id)) sourceOrder.current.set(item.id, nextSourceOrder.current++);\n setRecords(current => [...current.filter(record => record.id !== item.id), item]\n .sort((a, b) => (sourceOrder.current.get(a.id) ?? 0) - (sourceOrder.current.get(b.id) ?? 0)));\n return () => setRecords(current => current.filter(record => record.id !== item.id));\n }, []);\n const registerInput = React.useCallback((next: InputState) => {\n setInput(next);\n return () => setInput({});\n }, []);\n const setSearch = React.useCallback((next: string) => {\n setSearchState(next);\n input.onValueChange?.(next);\n }, [input.onValueChange]);\n const setActive = React.useCallback((next: string) => {\n setActiveState(next);\n if (next !== active) onValueChange?.(next);\n }, [onValueChange, active]);\n const context = React.useMemo(() => ({ managedHighlight, search, setSearch, active, setActive, shouldFilter, filter, records, register, registerInput }),\n [managedHighlight, search, setSearch, active, setActive, shouldFilter, filter, records, register, registerInput]);\n const rankedRecords = React.useMemo(() => rankRecords(records, { search, shouldFilter, filter }), [records, search, shouldFilter, filter]);\n const sourceLayout = React.useRef(new Map<HTMLElement, Map<string | HTMLElement, number>>());\n const previouslyRanked = React.useRef(false);\n React.useLayoutEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n const liveIds = new Set(records.map(item => item.id));\n if (records.length) for (const id of sourceOrder.current.keys()) if (!liveIds.has(id)) sourceOrder.current.delete(id);\n for (const parent of sourceLayout.current.keys()) if (!root.contains(parent)) sourceLayout.current.delete(parent);\n const key = (element: HTMLElement): string | HTMLElement => element.dataset.commandId\n ? `item:${element.dataset.commandId}` : element.dataset.commandGroupId\n ? `group:${element.dataset.commandGroupId}` : element.dataset.commandSeparatorId\n ? `separator:${element.dataset.commandSeparatorId}` : element;\n const owned = (element: HTMLElement) => !!element.dataset.commandId || !!element.dataset.commandGroupId;\n const parents = new Set<HTMLElement>();\n for (const element of root.querySelectorAll<HTMLElement>('[data-command-id], [data-command-group-id]')) {\n if (element.parentElement) parents.add(element.parentElement);\n }\n const ranks = new Map(rankedRecords.map((item, index) => [item.id, index]));\n const rank = (element: HTMLElement) => element.dataset.commandId\n ? ranks.get(element.dataset.commandId) ?? Infinity\n : rankedRecords.findIndex(item => item.group === element.dataset.commandGroupId);\n const ranking = !!search && shouldFilter;\n for (const parent of parents) {\n const current = Array.from(parent.children) as HTMLElement[];\n let source = sourceLayout.current.get(parent);\n if (!source || (!ranking && !previouslyRanked.current)) {\n source = new Map(current.map((element, index) => [key(element), index]));\n sourceLayout.current.set(parent, source);\n }\n for (const recordedKey of source.keys()) {\n if (typeof recordedKey === 'string' && recordedKey.startsWith('item:') && !liveIds.has(recordedKey.slice(5))) source.delete(recordedKey);\n }\n for (const element of current) if (!source.has(key(element))) source.set(key(element), Math.max(-1, ...source.values()) + 1);\n let desired: HTMLElement[];\n if (ranking) {\n const sorted = current.filter(owned).sort((a, b) => {\n const left = rank(a); const right = rank(b);\n return (left < 0 ? Infinity : left) - (right < 0 ? Infinity : right);\n });\n let index = 0;\n desired = current.map(element => owned(element) ? sorted[index++] : element);\n } else if (previouslyRanked.current) {\n desired = current.slice().sort((a, b) => source.get(key(a))! - source.get(key(b))!);\n } else continue;\n // Reorder owned DOM nodes without rebuilding children or losing their identity.\n for (let index = 0; index < desired.length; index++) {\n if (parent.children[index] !== desired[index]) parent.insertBefore(desired[index], parent.children[index] ?? null);\n }\n }\n previouslyRanked.current = ranking;\n }, [rankedRecords, search, shouldFilter]);\n const previousSearch = React.useRef(search);\n React.useEffect(() => {\n const searchChanged = previousSearch.current !== search;\n previousSearch.current = search;\n if (!managedHighlight || value !== undefined || !records.length) return;\n const candidates = rankedRecords.filter(item => !item.disabled);\n if (searchChanged || !candidates.some(item => item.value === active)) setActive(candidates[0]?.value ?? '');\n }, [managedHighlight, value, records, rankedRecords, active, search, setActive]);\n const element = useRender({ defaultTagName: 'div', render: asChild && React.isValidElement(children) ? children : undefined, ref: [ref ?? null, rootRef],\n props: { ...props, 'aria-label': props['aria-label'] ?? label, 'data-slot': 'command',\n className: cn('flex size-full flex-col overflow-hidden rounded-surface bg-popover text-popover-foreground', className),\n ...(asChild ? {} : { children }), onKeyDownCapture(event: React.KeyboardEvent<HTMLDivElement>) {\n onKeyDownCapture?.(event);\n if (event.defaultPrevented || !managedHighlight) return;\n if (event.key === 'Enter') {\n const item = records.find(record => record.value === active && !record.disabled && visible(record, context));\n if (!item) return;\n event.preventDefault(); event.stopPropagation();\n Array.from(rootRef.current?.querySelectorAll<HTMLElement>('[data-command-id]') ?? []).find(element => element.dataset.commandId === item.id)?.click();\n } else if (event.key === 'ArrowDown' || event.key === 'ArrowUp' || event.key === 'Home' || event.key === 'End') {\n const candidates = rankedRecords.filter(record => !record.disabled);\n if (!candidates.length) return;\n event.preventDefault(); event.stopPropagation();\n const current = candidates.findIndex(record => record.value === active);\n const delta = event.key === 'ArrowDown' ? 1 : -1;\n let next = current === -1 ? (delta > 0 ? 0 : candidates.length - 1) : current + delta;\n if (event.key === 'Home') next = 0;\n if (event.key === 'End') next = candidates.length - 1;\n next = loop ? (next + candidates.length) % candidates.length : Math.max(0, Math.min(candidates.length - 1, next));\n setActive(candidates[next].value);\n }\n }, onKeyDown(event: React.KeyboardEvent<HTMLDivElement>) {\n onKeyDown?.(event);\n if (event.defaultPrevented || !vimBindings || !event.ctrlKey) return;\n const key = { n: 'ArrowDown', j: 'ArrowDown', p: 'ArrowUp', k: 'ArrowUp' }[event.key];\n if (!key) return;\n event.preventDefault();\n event.target.dispatchEvent(new KeyboardEvent('keydown', { key, bubbles: true, cancelable: true }));\n } } });\n return <CommandContext.Provider value={context}>\n <Autocomplete.Root inline open value={search} filter={null} autoHighlight={managedHighlight ? false : 'always'} keepHighlight\n loopFocus={loop} highlightItemOnHover={!disablePointerSelection}\n onValueChange={(next, details) => { if (details.reason !== 'item-press') setSearch(next); }}\n onItemHighlighted={next => setActive(typeof next === 'string' ? next : '')}>\n {element}\n </Autocomplete.Root>\n </CommandContext.Provider>;\n}\ntype CommandInputProps = Omit<React.ComponentPropsWithRef<'input'>, 'value' | 'onChange' | 'type'> & {\n value?: string; onValueChange?: (value: string) => void; asChild?: boolean;\n};\nfunction CommandInput({ className, value, onValueChange, asChild, children, ...props }: CommandInputProps) {\n const context = useCommand();\n React.useLayoutEffect(() => context.registerInput({ value, onValueChange }), [context.registerInput, value, onValueChange]);\n return <div data-slot=\"command-input-wrapper\" className=\"pb-space-xs\">\n <Autocomplete.Input data-slot=\"command-input\" aria-activedescendant={context.records.find(item => item.value === context.active)?.id}\n render={asChild && React.isValidElement(children) ? children : undefined} className={className} {...props} />\n </div>;\n}\nfunction CommandList({ className, label, asChild, children, ...props }: React.ComponentPropsWithRef<'div'> & { label?: string; asChild?: boolean }) {\n const context = useCommand();\n return <Autocomplete.List data-slot=\"command-list\" aria-label={label} aria-activedescendant={context.records.find(item => item.value === context.active)?.id}\n className={cn('max-h-72 overflow-x-hidden overflow-y-auto outline-none', className)}\n render={asChild && React.isValidElement(children) ? children : undefined} {...props}>{asChild ? undefined : children}</Autocomplete.List>;\n}\nfunction CommandEmpty({ className, ...props }: React.ComponentPropsWithRef<'div'>) {\n const context = useCommand();\n if (context.records.some(item => visible(item, context))) return null;\n return <div data-slot=\"command-empty\" role=\"status\" className={cn('py-space-xl text-center text-sm', className)} {...props} />;\n}\nfunction CommandGroup({ className, heading, value: _value, forceMount = false, children, asChild, ...props }:\n React.ComponentPropsWithRef<'div'> & { heading?: React.ReactNode; value?: string; forceMount?: boolean; asChild?: boolean }) {\n const id = React.useId();\n const context = useCommand();\n const groupItems = context.records.filter(item => item.group === id);\n const hidden = !forceMount && !!context.search && !groupItems.some(item => visible(item, context));\n void _value;\n const headingElement = heading != null ? <Autocomplete.GroupLabel cmdk-group-heading=\"\" className=\"text-xs font-medium text-muted-foreground\">{heading}</Autocomplete.GroupLabel> : null;\n const renderedGroup = asChild && React.isValidElement<{ children?: React.ReactNode }>(children)\n ? React.cloneElement(children, {}, headingElement, children.props.children) : undefined;\n return <GroupContext.Provider value={{ id, forceMount }}>\n <Autocomplete.Group data-slot=\"command-group\" data-command-group-id={id} cmdk-group=\"\" hidden={hidden}\n className={cn('overflow-hidden text-foreground', className)} render={renderedGroup} {...props}>\n {!asChild && headingElement}\n {asChild ? undefined : children}\n </Autocomplete.Group>\n </GroupContext.Provider>;\n}\ntype CommandItemProps = Omit<React.ComponentPropsWithRef<'div'>, 'onSelect' | 'children'> & {\n children?: React.ReactNode | ((state: { isHighlighted: boolean }) => React.ReactNode);\n value?: string; onSelect?: (value: string) => void; keywords?: string[]; forceMount?: boolean;\n disabled?: boolean; asChild?: boolean;\n};\nfunction CommandItem({ className, children, value: valueProp, keywords = [], forceMount = false,\n disabled, onSelect, onClick, asChild, ref, ...props }: CommandItemProps) {\n const id = React.useId();\n const groupContext = React.useContext(GroupContext);\n const group = groupContext.id;\n const effectiveForceMount = forceMount || groupContext.forceMount;\n const context = useCommand();\n const value = valueProp ?? (typeof children === 'function' ? '' : textValue(children));\n const keywordsKey = JSON.stringify(keywords);\n React.useLayoutEffect(() => context.register({ id, value, keywords: JSON.parse(keywordsKey), forceMount: effectiveForceMount, disabled, group }),\n [context.register, id, value, keywordsKey, effectiveForceMount, disabled, group]);\n const record = { id, value, keywords, forceMount: effectiveForceMount, group };\n if (!visible(record, context)) return null;\n return <Autocomplete.Item value={value} disabled={disabled} ref={ref} data-slot=\"command-item\" data-command-id={id} aria-selected={context.active === value}\n data-selected={context.active === value ? 'true' : 'false'} data-disabled={disabled ? 'true' : undefined}\n className={cn('relative flex min-h-action-sm cursor-default items-center gap-space-sm rounded-radius px-control-sm py-row-y text-sm outline-none select-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-disabled:cursor-not-allowed', className)}\n render={asChild && React.isValidElement(children) ? React.cloneElement(children, { id } as React.HTMLAttributes<HTMLElement>) : <div id={id} />}\n onClick={event => { onClick?.(event); if (!event.defaultPrevented && !disabled) onSelect?.(value); }} {...props}>\n {asChild ? undefined : typeof children === 'function' ? children({ isHighlighted: context.active === value }) : children}\n </Autocomplete.Item>;\n}\nfunction CommandSeparator({ className, alwaysRender = false, asChild, children, ...props }:\n React.ComponentPropsWithRef<'div'> & { alwaysRender?: boolean; asChild?: boolean }) {\n const { search } = useCommand();\n const id = React.useId();\n return useRender({ enabled: !search || alwaysRender, render: asChild && React.isValidElement(children) ? children : undefined, props: { ...props, 'data-slot': 'command-separator', 'data-command-separator-id': id, role: props.role ?? 'separator', className: cn('h-px bg-border', className), ...(asChild ? {} : { children }) } });\n}\nfunction CommandShortcut({ className, ...props }: React.ComponentPropsWithRef<'span'>) {\n return <span data-slot=\"command-shortcut\" className={cn('ms-auto text-xs text-muted-foreground', className)} {...props} />;\n}\nexport { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem, CommandSeparator, CommandShortcut };\n","/**\n * Command — base wrapper around the internal Base UI command primitive.\n *\n * What this layer adds on top of the primitive:\n * - One standard, tokenized surface inset across the root, groups, and rows.\n * - Design-system typography and density-aware row sizing for admin commands.\n * - Stable BEM hooks on the wrapped root, input, list, group, item, separator,\n * and empty regions while retaining each primitive part's original props.\n * - Preserves the compound-component pattern: consumers compose\n * `<Command><CommandList><CommandGroup><CommandItem/></CommandGroup></CommandList></Command>`.\n *\n * For the recurring \"popover-with-command-list\" pattern, prefer\n * `base/popover-menu/` which composes both wrappers and adds slots.\n */\nimport * as React from 'react';\nimport { Check } from 'lucide-react';\n\nimport {\n\tCommand as CommandPrimitive,\n\tCommandEmpty as CommandEmptyPrimitive,\n\tCommandGroup as CommandGroupPrimitive,\n\tCommandInput as CommandInputPrimitive,\n\tCommandItem as CommandItemPrimitive,\n\tCommandList as CommandListPrimitive,\n\tCommandSeparator as CommandSeparatorPrimitive,\n\tCommandShortcut as CommandShortcutPrimitive,\n} from '../../ui/command';\nimport { Text } from '../../typography';\nimport { cn } from '../../../lib/utils';\nimport { collectionRecipes, collectionRowClasses, popoverRecipes, surfaceInsetClasses, type CollectionDensity } from '../popover/popover.recipes';\nimport { Input } from '../text-inputs/input';\nimport { CollectionLabel } from '../popover/collection-content';\nimport { useTypographyConfig } from '../../../lib/ui-provider';\nimport { textSizes } from '../../typography/text.styles';\n\ntype CommandRootProps = React.ComponentProps<typeof CommandPrimitive>;\n\nexport type CommandInset = 'default' | 'compact' | 'flush';\n\nexport type CommandProps = CommandRootProps & {\n\t/**\n\t * Surface inset role. Defaults to the compact collection shell.\n\t * Use `default` explicitly for substantive content, or `flush` when regions own their insets.\n\t */\n\tinset?: CommandInset;\n};\n\nconst commandInsetClasses: Record<CommandInset, string> = {\n\tdefault: surfaceInsetClasses.default,\n\tcompact: surfaceInsetClasses.compact,\n\t// The root is flush; search and list regions each own one collection inset.\n\tflush: `${surfaceInsetClasses.flush} ${popoverRecipes.menuSearch}`,\n};\n\nconst CommandInsetContext = React.createContext<CommandInset>('compact');\n\n/** Tokenized command surface with semantic default, compact, and flush inset roles. */\nfunction Command({ className, inset = 'compact', ...props }: CommandProps) {\n\treturn (\n <CommandInsetContext.Provider value={inset}>\n\t\t<CommandPrimitive\n\t\t\tclassName={cn(\n\t\t\t\t'command--component',\n\t\t\t\t// One standard surface inset keeps search controls, headings, row\n\t\t\t\t// highlights, and separators on the same surface grid.\n\t\t\t\t'gap-0 rounded-surface bg-popover text-popover-foreground',\n\t\t\t\tcommandInsetClasses[inset],\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n </CommandInsetContext.Provider>\n\t);\n}\n\ntype CommandListProps = React.ComponentProps<typeof CommandListPrimitive>;\n\ntype CommandInputProps = React.ComponentProps<typeof CommandInputPrimitive>;\n\nfunction CommandInput({ className, asChild, children, ...props }: CommandInputProps) {\n\treturn (\n\t\t<CommandInputPrimitive\n\t\t\tclassName={cn('command-input--component', className)}\n\t\t\t{...props}\n\t\t\tasChild\n\t\t>\n {asChild ? children : <Input />}\n </CommandInputPrimitive>\n\t);\n}\n\nfunction CommandList({ className, ...props }: CommandListProps) {\n const inset = React.useContext(CommandInsetContext);\n return (\n\t\t<CommandListPrimitive\n\t\t\tclassName={cn('command-list--component max-h-72', inset === 'flush' ? surfaceInsetClasses.compact : 'p-0', className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\ntype CommandGroupProps = React.ComponentProps<typeof CommandGroupPrimitive>;\n\nfunction CommandGroupHeading({ children }: { children: React.ReactNode }) {\n\tif (\n\t\ttypeof children !== 'string' &&\n\t\ttypeof children !== 'number' &&\n\t\ttypeof children !== 'bigint'\n\t) {\n\t\treturn children;\n\t}\n\n\t// A group caption is supporting copy, not another row: the compact secondary\n\t// role matches menu and listbox captions and keeps it from reading as an item.\n\treturn (\n\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" weight=\"medium\" lineHeight=\"tight\" className=\"command-group--heading\">\n\t\t\t{children}\n\t\t</Text>\n\t);\n}\n\nfunction CommandGroup({ className, heading, ...props }: CommandGroupProps) {\n\tconst resolvedHeading = heading == null\n\t\t? heading\n\t\t: <CommandGroupHeading>{heading}</CommandGroupHeading>;\n\n\treturn (\n\t\t<CommandGroupPrimitive\n\t\t\tclassName={cn(\n\t\t\t\t'command-group--component p-0 [&_[cmdk-group-heading]]:px-row-x [&_[cmdk-group-heading]]:pt-space-md [&_[cmdk-group-heading]]:pb-space-xs',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\theading={resolvedHeading}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\ntype CommandItemProps = React.ComponentProps<typeof CommandItemPrimitive> & {\n\t/** Vertical row rhythm, independent from label typography. */\n\tdensity?: CollectionDensity;\n\t/** Persistent selection, distinct from the keyboard-highlight state. */\n\t'data-checked'?: boolean | 'true' | 'false';\n};\n\nfunction CommandItem({ children, className, density = 'default', ...props }: CommandItemProps) {\n\tconst {defaultTextSize}=useTypographyConfig();\n\tconst checked = props['data-checked'] === true || props['data-checked'] === 'true';\n\t// Same selection ink as Select and Combobox options: the row's own foreground.\n\tconst indicator = checked ? <Check aria-hidden=\"true\" data-slot=\"command-item-indicator\" className=\"ms-auto size-icon shrink-0 self-center\" /> : null;\n\tconst content: CommandItemProps['children'] = props.asChild ? children : typeof children === 'function'\n\t\t? context => <>{children(context)}{indicator}</>\n\t\t: <>{typeof children === 'string' || typeof children === 'number' || typeof children === 'bigint'\n\t\t\t? <CollectionLabel className=\"command-item--text min-w-0 flex-1\">{children}</CollectionLabel>\n\t\t\t: children}{indicator}</>;\n\treturn <CommandItemPrimitive\n\t\tclassName={cn('command-item--component [&>svg]:size-icon [&>svg]:shrink-0 [&>svg]:text-muted-foreground', collectionRowClasses(density), collectionRecipes.disabled, textSizes[defaultTextSize??'sm'],className)}\n\t\t{...props}\n\t\tchildren={content}\n\t/>;\n}\n\ntype CommandEmptyProps = React.ComponentProps<typeof CommandEmptyPrimitive>;\n\nfunction CommandEmpty({ children, className, ...props }: CommandEmptyProps) {\n\treturn (\n\t\t<CommandEmptyPrimitive\n\t\t\tclassName={cn('command-empty--component px-row-x py-space-xl text-center', className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<Text tag=\"span\" type=\"secondary\" className=\"command-empty--text\">\n\t\t\t\t{children}\n\t\t\t</Text>\n\t\t</CommandEmptyPrimitive>\n\t);\n}\n\ntype CommandShortcutProps = React.ComponentProps<typeof CommandShortcutPrimitive>;\n\ntype CommandSeparatorProps = React.ComponentProps<typeof CommandSeparatorPrimitive>;\n\n/** Presentational divider that remains hidden from the Command listbox tree. */\nfunction CommandSeparator({ className, ...props }: CommandSeparatorProps) {\n return <CommandSeparatorPrimitive\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn('command-separator--component command-separator--line', popoverRecipes.separator, className)}\n {...props}\n />;\n}\n\nCommandSeparator.displayName = 'CommandSeparator';\n\nfunction CommandShortcut({ children, className, ...props }: CommandShortcutProps) {\n\treturn (\n\t\t<CommandShortcutPrimitive\n\t\t\tclassName={cn('command-shortcut--component', className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" className=\"command-shortcut--text\">\n\t\t\t\t{children}\n\t\t\t</Text>\n\t\t</CommandShortcutPrimitive>\n\t);\n}\n\nCommand.displayName = 'Command';\nCommandInput.displayName = 'CommandInput';\nCommandList.displayName = 'CommandList';\nCommandGroup.displayName = 'CommandGroup';\nCommandItem.displayName = 'CommandItem';\nCommandEmpty.displayName = 'CommandEmpty';\nCommandShortcut.displayName = 'CommandShortcut';\n\nexport {\n\tCommand,\n\tCommandEmpty,\n\tCommandGroup,\n\tCommandInput,\n\tCommandItem,\n\tCommandList,\n\tCommandSeparator,\n\tCommandShortcut,\n};\n"],"mappings":"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"}
|