themelia-react-ui 2.0.4 → 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 +135 -0
- package/README.md +113 -18
- package/dist/{accordion-96o0pN62.js → accordion-B9MHG0cT.js} +11 -11
- package/dist/accordion-B9MHG0cT.js.map +1 -0
- package/dist/{action-menu-CHgs8vmj.js → action-menu-Dr8K-ghE.js} +48 -45
- package/dist/action-menu-Dr8K-ghE.js.map +1 -0
- package/dist/{affordance-geometry.generated-B8yGOr8-.js → affordance-geometry.generated-P-aVJisu.js} +36 -36
- package/dist/affordance-geometry.generated-P-aVJisu.js.map +1 -0
- package/dist/{ai-artifact-BZUGwBq6.js → ai-artifact-C58tQcBy.js} +210 -174
- 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-DkoqHPPl.js → attachment-Dg_69lPS.js} +9 -9
- package/dist/{attachment-DkoqHPPl.js.map → attachment-Dg_69lPS.js.map} +1 -1
- package/dist/{auth-D2FVZ1MH.js → auth-DTkkshS8.js} +43 -46
- package/dist/auth-DTkkshS8.js.map +1 -0
- package/dist/{avatar-DWO_HHhB.js → avatar-CeZaFmNH.js} +8 -8
- package/dist/avatar-CeZaFmNH.js.map +1 -0
- package/dist/{badge-DErMA7ul.js → badge-xIiV_E7f.js} +5 -5
- package/dist/{badge-DErMA7ul.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 +2 -2
- package/dist/base/inline-edit.js +10 -10
- package/dist/base/item.js +1 -1
- package/dist/base/media-gallery.js +1 -1
- package/dist/base/metadata-list.js +1 -1
- package/dist/base/navigation.js +7 -7
- package/dist/base/popover-menu.js +1 -1
- package/dist/base/popover.js +1 -1
- package/dist/base/qr-code.js +1 -1
- package/dist/base/repeaters.js +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-CdfIkCsV.js → batch-action-bar-Cb8cuvyy.js} +6 -6
- package/dist/batch-action-bar-Cb8cuvyy.js.map +1 -0
- package/dist/blocks/admin.js +21 -21
- 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 +325 -306
- 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 +1259 -1184
- package/dist/blocks/commerce.js.map +1 -1
- package/dist/blocks/data-display.js +2 -2
- package/dist/blocks/onboarding.js +6 -6
- package/dist/blocks/onboarding.js.map +1 -1
- package/dist/blocks/planning.js +11 -11
- package/dist/blocks/timelines.js +1 -1
- package/dist/{breadcrumbs-B-WFKecD.js → breadcrumbs-J-K2kl4c.js} +6 -6
- package/dist/{breadcrumbs-B-WFKecD.js.map → breadcrumbs-J-K2kl4c.js.map} +1 -1
- package/dist/{button-DkmK-z8E.js → button-S2Cubiiz.js} +3 -3
- package/dist/button-S2Cubiiz.js.map +1 -0
- package/dist/{buttons-BbfzgczK.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-CzYUTPeJ.js → checkbox-fflqmODR.js} +2 -2
- package/dist/{checkbox-CzYUTPeJ.js.map → checkbox-fflqmODR.js.map} +1 -1
- package/dist/{choice-inputs-JLtij2y4.js → choice-inputs-zUgBZfE4.js} +258 -257
- package/dist/choice-inputs-zUgBZfE4.js.map +1 -0
- package/dist/{code-block-CGNaUtAE.js → code-block-BzmM9Eig.js} +8 -8
- package/dist/code-block-BzmM9Eig.js.map +1 -0
- package/dist/{collapsible-Do4G0zcC.js → collapsible-BkAI_XD4.js} +5 -5
- package/dist/{collapsible-Do4G0zcC.js.map → collapsible-BkAI_XD4.js.map} +1 -1
- package/dist/{collection-content-C0e8SsTm.js → collection-content-gDh1v6O4.js} +3 -3
- package/dist/{collection-content-C0e8SsTm.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-CBJDs6w_.js → combobox-BwzoXFSG.js} +254 -247
- package/dist/combobox-BwzoXFSG.js.map +1 -0
- package/dist/{command-D8NrBj-b.js → command-CrlPIL6m.js} +11 -11
- package/dist/command-CrlPIL6m.js.map +1 -0
- package/dist/{comments-Di4w0H_S.js → comments-Dmpp0YIc.js} +29 -29
- package/dist/{comments-Di4w0H_S.js.map → comments-Dmpp0YIc.js.map} +1 -1
- package/dist/components/base/action-menu/action-menu.d.ts +7 -1
- package/dist/components/base/buttons/button-group.recipes.d.ts +2 -2
- package/dist/components/base/cards/card.recipes.d.ts +6 -4
- package/dist/components/base/cards/partials/card-primitives.d.ts +9 -2
- package/dist/components/base/cards/partials/smart-card-header-row.d.ts +3 -1
- package/dist/components/base/cards/smart-card.types.d.ts +3 -4
- package/dist/components/base/cascader/cascader-panel.d.ts +76 -0
- package/dist/components/base/chart/chart.d.ts +6 -1
- package/dist/components/base/choice-inputs/choice-types.d.ts +1 -1
- package/dist/components/base/combobox/index.d.ts +4 -2
- package/dist/components/base/feedback/alert.d.ts +1 -1
- package/dist/components/base/forms/form-sizing.d.ts +7 -7
- package/dist/components/base/forms/workflow.d.ts +7 -1
- package/dist/components/base/forms-numeric/coordinates-input.d.ts +4 -0
- package/dist/components/base/metadata-list/metadata-list.d.ts +1 -1
- package/dist/components/base/navigation/dropdown-menu.d.ts +1 -1
- package/dist/components/base/navigation/page-header/page-header-commands.d.ts +14 -7
- package/dist/components/base/navigation/page-header/page-header.d.ts +10 -3
- package/dist/components/base/popover/popover.d.ts +3 -3
- package/dist/components/base/popover/popover.recipes.d.ts +10 -6
- package/dist/components/base/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/toaster/index.d.ts +1 -0
- 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/ui/alert-dialog.d.ts +2 -2
- package/dist/components/ui/combobox.d.ts +1 -1
- package/dist/components/ui/dialog.d.ts +2 -2
- package/dist/components/ui/overlay-layer.d.ts +18 -0
- package/dist/components/ui/sheet.d.ts +5 -1
- package/dist/components/ui/sidebar-state.d.ts +82 -0
- package/dist/components/ui/sidebar.d.ts +5 -17
- package/dist/{containers-CRmHf7GP.js → containers-CIxwbZt5.js} +26 -18
- 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-CnGCZdX4.js → copyable-DIznBqiT.js} +7 -7
- package/dist/{copyable-CnGCZdX4.js.map → copyable-DIznBqiT.js.map} +1 -1
- package/dist/{data-display-D4oujtx0.js → data-display-BdgCAw8T.js} +268 -277
- package/dist/data-display-BdgCAw8T.js.map +1 -0
- package/dist/{date-Q7jnXxpk.js → date-Cq8ioE4o.js} +5 -5
- package/dist/{date-Q7jnXxpk.js.map → date-Cq8ioE4o.js.map} +1 -1
- package/dist/{date-picker-zOt1oNss.js → date-picker-RlIzKom_.js} +446 -437
- package/dist/date-picker-RlIzKom_.js.map +1 -0
- package/dist/{date-pickers-cj8IXbDC.js → date-pickers-DY-CpXS1.js} +12 -12
- package/dist/{date-pickers-cj8IXbDC.js.map → date-pickers-DY-CpXS1.js.map} +1 -1
- package/dist/{display-BB4BL_-K.js → display-KsZLw9Ov.js} +9 -9
- package/dist/{display-BB4BL_-K.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 +22 -22
- 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 +237 -238
- package/dist/features/email-composer.js.map +1 -1
- package/dist/features/event-calendar.js +140 -146
- 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 +375 -326
- 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 +1266 -1193
- 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 +69 -66
- package/dist/features/resource.js.map +1 -1
- package/dist/features/rich-text-editor.js +2 -2
- package/dist/features/schema-form.js +13 -13
- 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 +94 -95
- package/dist/features/theme-tweaker.js.map +1 -1
- package/dist/{feedback-DZNL5Lg1.js → feedback-Dm4izqFn.js} +80 -79
- package/dist/feedback-Dm4izqFn.js.map +1 -0
- package/dist/{field-affordance-recipes-DjwGx8eM.js → field-affordance-recipes-DWcNcOjh.js} +4 -4
- package/dist/field-affordance-recipes-DWcNcOjh.js.map +1 -0
- package/dist/{filters-BcT-uoFy.js → filters-DzgSJpMK.js} +693 -645
- package/dist/filters-DzgSJpMK.js.map +1 -0
- package/dist/{form-field-CsgRmdit.js → form-field-BriWAXyg.js} +6 -6
- package/dist/{form-field-CsgRmdit.js.map → form-field-BriWAXyg.js.map} +1 -1
- package/dist/{form-sizing-NXgjkmBG.js → form-sizing-Bs2qFUeE.js} +4 -4
- package/dist/form-sizing-Bs2qFUeE.js.map +1 -0
- package/dist/{forms-BV5m5aQF.js → forms-C0RGnJTe.js} +17 -13
- package/dist/forms-C0RGnJTe.js.map +1 -0
- package/dist/{forms-numeric-Cd33AKbD.js → forms-numeric-DIhghX1Q.js} +86 -82
- package/dist/forms-numeric-DIhghX1Q.js.map +1 -0
- package/dist/{header-BA697l4a.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-BQ-L7Uu2.js → hooks-DB6CJ4MR.js} +26 -14
- package/dist/hooks-DB6CJ4MR.js.map +1 -0
- package/dist/{icon-badge-COWbCCWu.js → icon-badge-DZF-YjQp.js} +4 -4
- package/dist/{icon-badge-COWbCCWu.js.map → icon-badge-DZF-YjQp.js.map} +1 -1
- package/dist/index.js +4 -5
- package/dist/{input-Cdw4k0fb.js → input-CvyDQlY7.js} +8 -8
- package/dist/{input-Cdw4k0fb.js.map → input-CvyDQlY7.js.map} +1 -1
- package/dist/input-DMBwAZmr.js +21 -0
- package/dist/input-DMBwAZmr.js.map +1 -0
- package/dist/{item-BvZ2DR_x.js → item-DjCcM18E.js} +16 -16
- 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 +35 -35
- package/dist/lib/control-group-recipes.d.ts +5 -5
- package/dist/lib/field-affordance-recipes.d.ts +2 -2
- package/dist/lib/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/utils.js +1 -1
- package/dist/map-demo-tile.svg +1 -1
- package/dist/{media-gallery-CSl5W1Fy.js → media-gallery-C-vChPmE.js} +6 -6
- package/dist/{media-gallery-CSl5W1Fy.js.map → media-gallery-C-vChPmE.js.map} +1 -1
- package/dist/{mentions-RKOQaaIB.js → mentions-0_4nWuI-.js} +10 -10
- package/dist/{mentions-RKOQaaIB.js.map → mentions-0_4nWuI-.js.map} +1 -1
- package/dist/{message-INU2xsxu.js → message-g8p7eVtN.js} +7 -7
- package/dist/message-g8p7eVtN.js.map +1 -0
- package/dist/{metadata-list-qVV7AVxa.js → metadata-list-C3MkU-Om.js} +64 -64
- 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-BQNcg1jT.js → navigation-DaRjthVk.js} +101 -82
- package/dist/navigation-DaRjthVk.js.map +1 -0
- package/dist/{navigation-row-recipes-WZEs-hYo.js → navigation-row-recipes-BGVLvU_O.js} +9 -9
- package/dist/navigation-row-recipes-BGVLvU_O.js.map +1 -0
- package/dist/{number-E_OiIfJz.js → number-CRU3kGuk.js} +5 -5
- package/dist/{number-E_OiIfJz.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-Ch8X_47u.js → pagination-CgCjElfu.js} +7 -7
- package/dist/{pagination-Ch8X_47u.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-BYaCdFhf.js → popover-menu-DlnQ2zlR.js} +7 -7
- package/dist/{popover-menu-BYaCdFhf.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-Du64iDbb.js → primitives-ByWgGUgt.js} +5 -5
- package/dist/{primitives-Du64iDbb.js.map → primitives-ByWgGUgt.js.map} +1 -1
- package/dist/primitives.js +4 -4
- package/dist/{progress-BvF2oCdV.js → progress-BJhQP9WX.js} +9 -9
- package/dist/{progress-BvF2oCdV.js.map → progress-BJhQP9WX.js.map} +1 -1
- package/dist/{receipt-D789Jwyy.js → receipt-tOc7B3hw.js} +7 -7
- package/dist/receipt-tOc7B3hw.js.map +1 -0
- package/dist/{rich-text-CLJEf76s.js → rich-text-Dth5E882.js} +3 -3
- package/dist/{rich-text-CLJEf76s.js.map → rich-text-Dth5E882.js.map} +1 -1
- package/dist/{rich-text-editor-Cm1dpUpQ.js → rich-text-editor-C1fOjBTd.js} +429 -430
- package/dist/rich-text-editor-C1fOjBTd.js.map +1 -0
- package/dist/{rich-text-editor-toolbar-L__e4x47.js → rich-text-editor-toolbar-laT3tpBT.js} +32 -28
- package/dist/rich-text-editor-toolbar-laT3tpBT.js.map +1 -0
- package/dist/{scroll-area-La5RXsEk.js → scroll-area-B0dB2cBi.js} +2 -2
- package/dist/{scroll-area-La5RXsEk.js.map → scroll-area-B0dB2cBi.js.map} +1 -1
- package/dist/{separator-DAEV0w65.js → separator-Bb17I4pu.js} +2 -2
- package/dist/{separator-DAEV0w65.js.map → separator-Bb17I4pu.js.map} +1 -1
- package/dist/{separator-GNfPG-90.js → separator-Ct_WSWTJ.js} +3 -3
- package/dist/{separator-GNfPG-90.js.map → separator-Ct_WSWTJ.js.map} +1 -1
- package/dist/services/actions.js +1 -1
- package/dist/{settings-BA2iboic.js → settings-Bar5wiSo.js} +31 -38
- 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-C0V0_Fyf.js → structure-DuxKl954.js} +2 -2
- package/dist/{structure-C0V0_Fyf.js.map → structure-DuxKl954.js.map} +1 -1
- package/dist/style.css +1 -1
- package/dist/{table-CpvnzJn9.js → table-B4TE7iOV.js} +3 -3
- package/dist/{table-CpvnzJn9.js.map → table-B4TE7iOV.js.map} +1 -1
- package/dist/{table-DH7rozUv.js → table-CFOWY9pQ.js} +394 -388
- package/dist/table-CFOWY9pQ.js.map +1 -0
- package/dist/{tabs-eqVsJZWO.js → tabs-e7ko9S2o.js} +11 -11
- package/dist/tabs-e7ko9S2o.js.map +1 -0
- package/dist/{text-inputs-DXItiR0O.js → text-inputs-B1culiSK.js} +17 -17
- package/dist/text-inputs-B1culiSK.js.map +1 -0
- package/dist/theme.css +40 -37
- package/dist/{timelines-DmtztAY_.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-CV11PURP.js → tree-CzUJHnFs.js} +8 -8
- package/dist/{tree-CV11PURP.js.map → tree-CzUJHnFs.js.map} +1 -1
- package/dist/typography/rich-text.js +1 -1
- package/dist/{typography-CSyJrh28.js → typography-BQnine1k.js} +12 -12
- package/dist/{typography-CSyJrh28.js.map → typography-BQnine1k.js.map} +1 -1
- package/dist/typography.js +1 -1
- package/dist/ui-provider-C-74NVLc.js +178 -0
- package/dist/ui-provider-C-74NVLc.js.map +1 -0
- package/dist/ui-provider.js +2 -3
- package/dist/{upload-C9SA0X-8.js → upload-BOW6U2tI.js} +25 -24
- package/dist/upload-BOW6U2tI.js.map +1 -0
- package/dist/{upload-queue-DhQJiSRc.js → upload-queue-qUXn1ykN.js} +16 -14
- package/dist/upload-queue-qUXn1ykN.js.map +1 -0
- package/dist/{usage-card-DVTRDmGz.js → usage-card-BeSLY0i0.js} +24 -17
- package/dist/usage-card-BeSLY0i0.js.map +1 -0
- package/dist/{utils-CF3c95Io.js → utils-B6kKb8jB.js} +237 -141
- 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-ClupF0Gz.js → value-typography-uAmWUAL1.js} +2 -2
- package/dist/{value-typography-ClupF0Gz.js.map → value-typography-uAmWUAL1.js.map} +1 -1
- package/dist/{workspace-9EFVXUyk.js → workspace-DHeHv0qw.js} +50 -49
- package/dist/workspace-DHeHv0qw.js.map +1 -0
- package/docs/consumer-skill/SKILL.md +4 -3
- package/docs/consumer-skill/agents/themelia-ui-designer.md +96 -0
- package/docs/consumer-skill/examples/app-layout.tsx +52 -1
- package/docs/consumer-skill/examples/commerce-lines.tsx +271 -0
- package/docs/consumer-skill/examples/custom-composition.tsx +21 -0
- package/docs/consumer-skill/examples/detail.tsx +5 -4
- package/docs/consumer-skill/examples/editable-sections.tsx +38 -0
- package/docs/consumer-skill/examples/index-table.tsx +4 -4
- package/docs/consumer-skill/examples/manifest.json +38 -1
- package/docs/consumer-skill/examples/product-media.tsx +41 -0
- package/docs/consumer-skill/examples/product-parts.tsx +81 -0
- package/docs/consumer-skill/examples/rhf-edit-page.tsx +1 -1
- package/docs/consumer-skill/examples/rhf-overlay-form.tsx +24 -11
- package/docs/consumer-skill/examples/token-domain-structure.tsx +68 -0
- package/docs/consumer-skill/references/agents-md.md +19 -17
- package/docs/consumer-skill/references/analytics.md +18 -1
- package/docs/consumer-skill/references/commerce-composition.md +97 -0
- package/docs/consumer-skill/references/component-contracts.json +7131 -1754
- package/docs/consumer-skill/references/composition-mapping.md +17 -3
- package/docs/consumer-skill/references/composition.md +159 -31
- 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 +11 -9
- package/docs/consumer-skill/references/discovery.md +27 -3
- package/docs/consumer-skill/references/domain-structures.md +124 -0
- package/docs/consumer-skill/references/installation.md +15 -4
- package/docs/consumer-skill/references/integration.md +35 -0
- package/docs/consumer-skill/references/product-composition.md +94 -0
- package/docs/consumer-skill/references/public-api.json +2881 -420
- package/docs/consumer-skill/references/review.md +39 -2
- package/docs/consumer-skill/references/rhf-workflows.md +7 -0
- package/docs/consumer-skill/references/screen-archetypes.md +19 -7
- package/docs/consumer-skill/references/screen-decisions.md +126 -0
- package/docs/consumer-skill/references/theming.md +17 -18
- package/docs/consumer-skill/references/tokens.json +9 -9
- package/docs/consumer-skill/references/view-craft.md +153 -0
- package/docs/consumer-skill/references/view-spec.md +73 -0
- package/docs/consumer-skill/references/workflows.md +7 -1
- package/docs/consumer-skill/scripts/composition-policy.mjs +39 -3
- package/docs/consumer-skill/scripts/composition-schema.mjs +1 -1
- package/docs/consumer-skill/scripts/composition.mjs +61 -5
- package/docs/consumer-skill/scripts/discovery.mjs +54 -0
- package/docs/consumer-skill/scripts/inspect-component.mjs +1 -1
- package/docs/consumer-skill/scripts/inspection.mjs +73 -18
- package/docs/consumer-skill/scripts/setup-skills.mjs +41 -6
- package/docs/consumer-skill/scripts/surface-policy.mjs +5 -5
- package/docs/consumer-skills/themelia-components/SKILL.md +14 -13
- package/docs/consumer-skills/themelia-composition/SKILL.md +16 -17
- package/docs/consumer-skills/themelia-design/SKILL.md +55 -0
- package/docs/consumer-skills/themelia-foundation/SKILL.md +2 -1
- package/docs/consumer-skills/themelia-tokenization/SKILL.md +24 -17
- package/package.json +1 -1
- package/dist/accordion-96o0pN62.js.map +0 -1
- package/dist/action-menu-CHgs8vmj.js.map +0 -1
- package/dist/affordance-geometry.generated-B8yGOr8-.js.map +0 -1
- package/dist/ai-artifact-BZUGwBq6.js.map +0 -1
- package/dist/app-shell-D63ATkIK.js +0 -237
- package/dist/app-shell-D63ATkIK.js.map +0 -1
- package/dist/auth-D2FVZ1MH.js.map +0 -1
- package/dist/avatar-DWO_HHhB.js.map +0 -1
- package/dist/base/cascader.js.map +0 -1
- package/dist/batch-action-bar-CdfIkCsV.js.map +0 -1
- package/dist/button-DkmK-z8E.js.map +0 -1
- package/dist/buttons-BbfzgczK.js.map +0 -1
- package/dist/cards-4JTWqvVe.js +0 -68
- package/dist/cards-4JTWqvVe.js.map +0 -1
- package/dist/chart-C19flDQb.js +0 -155
- package/dist/chart-C19flDQb.js.map +0 -1
- package/dist/choice-inputs-JLtij2y4.js.map +0 -1
- package/dist/code-block-CGNaUtAE.js.map +0 -1
- package/dist/combobox-CBJDs6w_.js.map +0 -1
- package/dist/combobox-hbhSS18O.js +0 -355
- package/dist/combobox-hbhSS18O.js.map +0 -1
- package/dist/command-D8NrBj-b.js.map +0 -1
- package/dist/containers-CRmHf7GP.js.map +0 -1
- package/dist/control-group-recipes-DBXmfh2E.js.map +0 -1
- package/dist/data-display-D4oujtx0.js.map +0 -1
- package/dist/date-picker-zOt1oNss.js.map +0 -1
- package/dist/dropdown-menu-CjY8Vt7W.js +0 -193
- package/dist/dropdown-menu-CjY8Vt7W.js.map +0 -1
- package/dist/feedback-DZNL5Lg1.js.map +0 -1
- package/dist/field-affordance-recipes-DjwGx8eM.js.map +0 -1
- package/dist/filters-BcT-uoFy.js.map +0 -1
- package/dist/form-sizing-NXgjkmBG.js.map +0 -1
- package/dist/forms-BV5m5aQF.js.map +0 -1
- package/dist/forms-numeric-Cd33AKbD.js.map +0 -1
- package/dist/header-BA697l4a.js.map +0 -1
- package/dist/hooks-BQ-L7Uu2.js.map +0 -1
- package/dist/input-DOPL5_QE.js +0 -21
- package/dist/input-DOPL5_QE.js.map +0 -1
- package/dist/item-BvZ2DR_x.js.map +0 -1
- package/dist/message-INU2xsxu.js.map +0 -1
- package/dist/metadata-list-qVV7AVxa.js.map +0 -1
- package/dist/motion-recipes-ChBg4HBq.js.map +0 -1
- package/dist/navigation-BQNcg1jT.js.map +0 -1
- package/dist/navigation-DLF3E1IC.js +0 -145
- package/dist/navigation-DLF3E1IC.js.map +0 -1
- package/dist/navigation-row-recipes-WZEs-hYo.js.map +0 -1
- package/dist/overflow-tab-bar-CrbqMteP.js +0 -284
- package/dist/overflow-tab-bar-CrbqMteP.js.map +0 -1
- package/dist/overlays-BlKynmde.js +0 -1004
- package/dist/overlays-BlKynmde.js.map +0 -1
- package/dist/page-CIwNUtGr.js +0 -227
- package/dist/page-CIwNUtGr.js.map +0 -1
- package/dist/page-header-commands-DFMlNYzN.js +0 -128
- package/dist/page-header-commands-DFMlNYzN.js.map +0 -1
- package/dist/popover-uwzX2vo7.js +0 -198
- package/dist/popover-uwzX2vo7.js.map +0 -1
- package/dist/popover.recipes-D3j8R8Yp.js.map +0 -1
- package/dist/receipt-D789Jwyy.js.map +0 -1
- package/dist/rich-text-editor-Cm1dpUpQ.js.map +0 -1
- package/dist/rich-text-editor-toolbar-L__e4x47.js.map +0 -1
- package/dist/settings-BA2iboic.js.map +0 -1
- package/dist/sheet-DoAxTb2J.js +0 -213
- package/dist/sheet-DoAxTb2J.js.map +0 -1
- package/dist/sidebar-ByqKR_W5.js +0 -512
- package/dist/sidebar-ByqKR_W5.js.map +0 -1
- package/dist/sidebar-D2iSnGJ7.js +0 -619
- package/dist/sidebar-D2iSnGJ7.js.map +0 -1
- package/dist/skeleton-CUj8O5Bd.js +0 -264
- package/dist/skeleton-CUj8O5Bd.js.map +0 -1
- package/dist/smart-card-CqkzQsK-.js +0 -614
- package/dist/smart-card-CqkzQsK-.js.map +0 -1
- package/dist/table-DH7rozUv.js.map +0 -1
- package/dist/tabs-eqVsJZWO.js.map +0 -1
- package/dist/text-inputs-DXItiR0O.js.map +0 -1
- package/dist/theme-scope-BJ6eE2xt.js +0 -50
- package/dist/theme-scope-BJ6eE2xt.js.map +0 -1
- package/dist/timelines-DmtztAY_.js.map +0 -1
- package/dist/tooltip-B4hjKtoV.js +0 -111
- package/dist/tooltip-B4hjKtoV.js.map +0 -1
- package/dist/ui-provider-CQCuCBcy.js +0 -136
- package/dist/ui-provider-CQCuCBcy.js.map +0 -1
- package/dist/upload-C9SA0X-8.js.map +0 -1
- package/dist/upload-queue-DhQJiSRc.js.map +0 -1
- package/dist/usage-card-DVTRDmGz.js.map +0 -1
- package/dist/use-mobile-vaLKwgyf.js +0 -15
- package/dist/use-mobile-vaLKwgyf.js.map +0 -1
- package/dist/utils-CF3c95Io.js.map +0 -1
- package/dist/value-inputs-C0o70p-U.js +0 -980
- package/dist/value-inputs-C0o70p-U.js.map +0 -1
- package/dist/workspace-9EFVXUyk.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-search.js","names":["React","_Fragment","React","cn","TextButton","Text","focusRecipes","Stack","toneRecipes","markRecipes","surfaceDividerRecipes","kbdRecipe","surfaceInsetClasses","collectionRowClasses","popoverRecipes","ActionDialog","interactionRecipes","Value","SecondaryValue","AvatarFallback","Avatar","AvatarImage","Badge","fieldAffordanceRecipes","FieldClearGlyph","InputGroup","InputGroupInput","InputGroupAddon","TabsTrigger","TabsList","Tabs","EmptyState","React$1","Fragment$1","defaultGlobalSearchStrings","useGlobalSearch","activeTab","setActiveTabState","useState","activeIdx","setActiveIdx","query","grouped","useMemo","buckets","r","results","tabCounts","counts","k","v","visibleGrouped","sub","flat","activeIdxRef","useRef","flatRef","tab","idx","id","i","item","onResultSelect","onClose","GlobalSearchEmptyState","hint","Search","Shortcut","keys","label","GlobalSearchFooter","className","navigateLabel","openLabel","closeLabel","trailing","GlobalSearchGroupHeading","Icon","action","GlobalSearchIdleState","sections","section","fallbackIcons","ItemIcon","GlobalSearchInput","innerRef","ref","autoFocus","onValueChange","placeholder","loading","value","Loader2","clearLabel","toned","tone","DEFAULT_TONE_BG","DEFAULT_TONE_AVATAR","highlightMatch","q","text","lower","ql","GlobalSearchResultRow","ThumbIcon","result","bg","av","onSelect","active","pieces","m","tag","p","ArrowRight","GlobalSearchTabs","tabs","count","GlobalSearch","stringsProp","strings","useStrings","search","isEmpty","isIdle","resolvedTabs","groupKeys","key","groupLabels","slots","onQueryChange","idleSections","interpolateString","groupKey","items","isActive","ctx","node","GlobalSearchDialog","searchProps","close","onOpenChange","contentClassName"],"sources":["../../src/components/features/global-search/global-search.strings.ts","../../src/components/features/global-search/hooks/use-global-search.ts","../../src/components/features/global-search/partials/global-search-empty-state.tsx","../../src/components/features/global-search/partials/global-search-footer.tsx","../../src/components/features/global-search/partials/global-search-group-heading.tsx","../../src/components/features/global-search/partials/global-search-idle-state.tsx","../../src/components/features/global-search/partials/global-search-input.tsx","../../src/components/features/global-search/partials/tone-palettes.ts","../../src/components/features/global-search/partials/global-search-result-row.tsx","../../src/components/features/global-search/partials/global-search-tabs.tsx","../../src/components/features/global-search/global-search.tsx","../../src/components/features/global-search/global-search-dialog.tsx"],"sourcesContent":["/**\n * Strings for `GlobalSearch` and its partials. Consumers override via the\n * `strings` prop on `<GlobalSearch />`; values are deep-merged over these\n * defaults so partial overrides are safe.\n */\nexport interface GlobalSearchStrings {\n\t/** Placeholder copy for the search input. */\n\t/** Names the modal presentation for assistive technology. */\n\tdialogTitle: string;\n\tplaceholder: string;\n\t/** aria-label for the clear-search icon button. */\n\tclear: string;\n\t/** Loading-state copy. */\n\tloading: string;\n\t/** Empty-state title — uses {{query}} as a placeholder. */\n\temptyTitle: string;\n\t/** Empty-state body copy. */\n\temptyHint: string;\n\t/** Idle-state heading for \"Recent\" suggestions. */\n\tidleRecent: string;\n\t/** Idle-state heading for curated \"Suggestions\". */\n\tidleSuggestions: string;\n\t/** Tab label for the \"All\" tab. */\n\ttabAll: string;\n\t/** Footer \"navigate\" hint. */\n\tfooterNavigate: string;\n\t/** Footer \"open\" hint. */\n\tfooterOpen: string;\n\t/** Footer \"close\" hint. */\n\tfooterClose: string;\n\t/** Trailing N results count. */\n\tresultsCount: string;\n\t/** \"See all\" group action — jumps to that tab. */\n\tseeAll: string;\n}\n\nexport const defaultGlobalSearchStrings: GlobalSearchStrings = {\n\tdialogTitle: 'Search',\n\tplaceholder: 'Search…',\n\tclear: 'Clear search',\n\tloading: 'Searching…',\n\temptyTitle: 'No results for \"{{query}}\"',\n\temptyHint: 'Try a shorter keyword or check the spelling.',\n\tidleRecent: 'Recent',\n\tidleSuggestions: 'Suggestions',\n\ttabAll: 'All',\n\tfooterNavigate: 'navigate',\n\tfooterOpen: 'open',\n\tfooterClose: 'close',\n\tresultsCount: '{{count}} results',\n\tseeAll: 'See all',\n};\n","/**\n * useGlobalSearch — headless state machine for `<GlobalSearch />`.\n *\n * Owns the active-row index, active tab, and the keyboard-navigation\n * handler. Returns the derived flat list (results filtered by tab) so\n * consumers can render entirely custom UIs against the same state.\n *\n * Usage:\n * const search = useGlobalSearch({ results, query });\n * <input onKeyDown={search.onKeyDown} />\n * {search.flat.map((r, i) => <Row active={i === search.activeIdx} … />)}\n */\nimport { useEffect, useMemo, useRef, useState } from 'react';\n\nimport type { GlobalSearchResult } from '../global-search.types';\n\nexport interface UseGlobalSearchOptions<TGroup extends string = string> {\n\tresults: ReadonlyArray<GlobalSearchResult<TGroup>>;\n\tquery: string;\n\t/** Fires when the user activates a row (Enter or click). */\n\tonResultSelect?: (result: GlobalSearchResult<TGroup>) => void;\n\t/** Fires when the user presses Escape. */\n\tonClose?: () => void;\n}\n\nexport interface UseGlobalSearchReturn<TGroup extends string = string> {\n\t/** Results bucketed by group, in insertion order. */\n\tgrouped: Record<string, GlobalSearchResult<TGroup>[]>;\n\t/** Result count per tab (`all` plus each group key). */\n\ttabCounts: Record<string, number>;\n\t/** Currently-selected tab. */\n\tactiveTab: 'all' | TGroup;\n\t/** Set the active tab — also resets the active index. */\n\tsetActiveTab: (tab: 'all' | TGroup) => void;\n\t/** Filtered grouped map respecting the active tab. */\n\tvisibleGrouped: Record<string, GlobalSearchResult<TGroup>[]>;\n\t/** Flat ordered list matching what is currently rendered. */\n\tflat: GlobalSearchResult<TGroup>[];\n\t/** Index into `flat` of the currently-highlighted row. */\n\tactiveIdx: number;\n\tsetActiveIdx: (i: number) => void;\n\t/** Programmatically activate a result by id. */\n\tsetActiveById: (id: string) => void;\n\t/** Bind to the search input's `onKeyDown` for arrow / enter / escape support. */\n\tonKeyDown: (e: React.KeyboardEvent) => void;\n\t/** Activate the row at `activeIdx`. */\n\tselectActive: () => void;\n}\n\nexport function useGlobalSearch<TGroup extends string = string>({\n\tresults,\n\tquery,\n\tonResultSelect,\n\tonClose,\n}: UseGlobalSearchOptions<TGroup>): UseGlobalSearchReturn<TGroup> {\n\tconst [activeTab, setActiveTabState] =\n\t\tuseState<'all' | TGroup>('all');\n\tconst [activeIdx, setActiveIdx] = useState(0);\n\n\t// Reset both the active row and the active tab when the query changes\n\t// (so a fresh query never inherits a stale highlight or filter).\n\tuseEffect(() => {\n\t\tsetActiveTabState('all');\n\t\tsetActiveIdx(0);\n\t}, [query]);\n\n\tconst grouped = useMemo(() => {\n\t\tconst buckets: Record<string, GlobalSearchResult<TGroup>[]> = {};\n\t\tfor (const r of results) {\n\t\t\t(buckets[r.group] ??= []).push(r);\n\t\t}\n\t\treturn buckets;\n\t}, [results]);\n\n\tconst tabCounts = useMemo(() => {\n\t\tconst counts: Record<string, number> = { all: results.length };\n\t\tfor (const [k, v] of Object.entries(grouped)) counts[k] = v.length;\n\t\treturn counts;\n\t}, [results.length, grouped]);\n\n\tconst visibleGrouped = useMemo(() => {\n\t\tif (activeTab === 'all') return grouped;\n\t\tconst sub = grouped[activeTab as string];\n\t\treturn sub ? ({ [activeTab as string]: sub } as Record<string, GlobalSearchResult<TGroup>[]>) : {};\n\t}, [grouped, activeTab]);\n\n\tconst flat = useMemo(() => {\n\t\tif (activeTab === 'all') return results.slice();\n\t\treturn grouped[activeTab as string] ?? [];\n\t}, [activeTab, grouped, results]);\n\n\tconst activeIdxRef = useRef(activeIdx);\n\tactiveIdxRef.current = activeIdx;\n\tconst flatRef = useRef(flat);\n\tflatRef.current = flat;\n\n\tconst setActiveTab = (tab: 'all' | TGroup) => {\n\t\tsetActiveTabState(tab);\n\t\tsetActiveIdx(0);\n\t};\n\n\tconst setActiveById = (id: string) => {\n\t\tconst idx = flatRef.current.findIndex((r) => r.id === id);\n\t\tif (idx >= 0) setActiveIdx(idx);\n\t};\n\n\tconst selectActive = () => {\n\t\tconst item = flatRef.current[activeIdxRef.current];\n\t\tif (item) onResultSelect?.(item);\n\t};\n\n\tconst onKeyDown = (e: React.KeyboardEvent) => {\n\t\tif (e.key === 'ArrowDown') {\n\t\t\te.preventDefault();\n\t\t\tsetActiveIdx((i) => Math.min(i + 1, flatRef.current.length - 1));\n\t\t} else if (e.key === 'ArrowUp') {\n\t\t\te.preventDefault();\n\t\t\tsetActiveIdx((i) => Math.max(i - 1, 0));\n\t\t} else if (e.key === 'Enter') {\n\t\t\tconst item = flatRef.current[activeIdxRef.current];\n\t\t\tif (item) {\n\t\t\t\te.preventDefault();\n\t\t\t\tonResultSelect?.(item);\n\t\t\t}\n\t\t} else if (e.key === 'Escape') {\n\t\t\tonClose?.();\n\t\t}\n\t};\n\n\treturn {\n\t\tgrouped,\n\t\ttabCounts,\n\t\tactiveTab,\n\t\tsetActiveTab,\n\t\tvisibleGrouped,\n\t\tflat,\n\t\tactiveIdx,\n\t\tsetActiveIdx,\n\t\tsetActiveById,\n\t\tonKeyDown,\n\t\tselectActive,\n\t};\n}\n","/**\n * Default empty-state body — shown when the query yields no results.\n * Override entirely via `slots.empty`.\n */\nimport { Search } from 'lucide-react';\n\nimport { EmptyState } from '../../../blocks/data-display';\n\nexport interface GlobalSearchEmptyStateProps {\n\t/** Surface title. */\n\ttitle: string;\n\t/** Short guidance shown beneath the control. */\n\thint: string;\n}\n\nexport function GlobalSearchEmptyState({ title, hint }: GlobalSearchEmptyStateProps) {\n\treturn (\n\t\t<EmptyState\n\t\t\ttitle={title}\n\t\t\tdescription={hint}\n\t\t\tmedia={<Search className=\"size-icon\" aria-hidden=\"true\" />}\n\t\t\tmediaVariant=\"icon-soft\"\n\t\t\tpadding=\"md\"\n\t\t\tclassName=\"global-search-empty-state--component\"\n\t\t/>\n\t);\n}\n","/**\n * GlobalSearchFooter — keyboard-hint strip below the result list.\n * Override entirely via `slots.footer`.\n *\n * It is the anchored collection footer band: one region inset and a quiet top\n * rule, with copy aligned to the row text above it. Each key sits tight against\n * its own hint, and the hint pairs are spaced apart from one another.\n */\nimport { Text } from '../../../typography';\nimport { popoverRecipes } from '../../../base/popover/popover.recipes';\nimport { cn } from '../../../../lib/utils';\nimport { kbdRecipe, surfaceDividerRecipes } from '../../../../lib/surface-recipes';\n\nexport interface GlobalSearchFooterProps {\n\t/** Footer hint for the arrow keys. */\n\tnavigateLabel: string;\n\t/** Footer hint for the enter key. */\n\topenLabel: string;\n\t/** Footer hint for the escape key. */\n\tcloseLabel: string;\n\t/** Trailing right-aligned content (e.g. \"3 results\"). */\n\ttrailing?: React.ReactNode;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nfunction Shortcut({ keys, label }: { keys: string; label: string }) {\n\treturn (\n\t\t<span className=\"global-search-footer--shortcut inline-flex items-center gap-space-xs\">\n\t\t\t<kbd className={kbdRecipe}>{keys}</kbd>\n\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\">\n\t\t\t\t{label}\n\t\t\t</Text>\n\t\t</span>\n\t);\n}\n\nexport function GlobalSearchFooter({\n\tnavigateLabel,\n\topenLabel,\n\tcloseLabel,\n\ttrailing,\n\tclassName,\n}: GlobalSearchFooterProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'global-search-footer--component',\n\t\t\t\tpopoverRecipes.menuRegion,\n\t\t\t\tsurfaceDividerRecipes.anchored.footer,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<div className=\"global-search-footer--body flex flex-col items-stretch gap-space-xs px-row-x @sm/global-search:flex-row @sm/global-search:items-center @sm/global-search:justify-between\">\n\t\t\t\t<span className=\"global-search-footer--shortcuts flex flex-wrap items-center gap-x-space-lg gap-y-space-xs\">\n\t\t\t\t\t<Shortcut keys=\"↑↓\" label={navigateLabel} />\n\t\t\t\t\t<Shortcut keys=\"↵\" label={openLabel} />\n\t\t\t\t\t<Shortcut keys=\"esc\" label={closeLabel} />\n\t\t\t\t</span>\n\t\t\t\t{trailing ? (\n\t\t\t\t\t<span className=\"global-search-footer--trailing shrink-0 self-end whitespace-nowrap @sm/global-search:self-auto\">\n\t\t\t\t\t\t{trailing}\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * Group caption shared by result groups and idle sections. It uses the compact\n * secondary role and inset of a Command group heading, so a caption never reads\n * as another row and both lists keep one rhythm.\n */\nimport type * as React from 'react';\n\nimport { Text } from '../../../typography';\n\nexport interface GlobalSearchGroupHeadingProps {\n\t/** Caption copy. */\n\tlabel: React.ReactNode;\n\t/** Optional leading glyph supplied by the section. */\n\ticon?: React.ElementType;\n\t/** Trailing action, such as \"See all\". */\n\taction?: React.ReactNode;\n}\n\nexport function GlobalSearchGroupHeading({ label, icon: Icon, action }: GlobalSearchGroupHeadingProps) {\n\treturn (\n\t\t<div className=\"global-search-group--heading flex items-center justify-between gap-space-sm px-row-x pt-space-md pb-space-xs\">\n\t\t\t<span className=\"inline-flex min-w-0 items-center gap-space-sm\">\n\t\t\t\t{!!Icon && <Icon className=\"size-icon-sm shrink-0 text-muted-foreground\" aria-hidden=\"true\" />}\n\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" weight=\"medium\" lineHeight=\"tight\" className=\"truncate\">\n\t\t\t\t\t{label}\n\t\t\t\t</Text>\n\t\t\t</span>\n\t\t\t{action}\n\t\t</div>\n\t);\n}\n","/**\n * Default idle-state body — shown when the query is too short.\n * Renders consumer-supplied \"Recent\" + \"Suggestions\" sections with the same\n * compact collection inset, group captions and rows as the result list.\n */\nimport { Search } from 'lucide-react';\nimport * as React from 'react';\n\nimport { collectionRowClasses, surfaceInsetClasses } from '../../../base/popover/popover.recipes';\nimport { Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nimport type { GlobalSearchIdleSection } from '../global-search.types';\nimport { focusRecipes } from '../../../../lib/focus-recipes';\nimport { interactionRecipes } from '../../../../lib/interaction-recipes';\nimport { GlobalSearchGroupHeading } from './global-search-group-heading';\n\nexport interface GlobalSearchIdleStateProps {\n\t/** Sections to render, in display order. */\n\tsections: ReadonlyArray<GlobalSearchIdleSection>;\n\t/** Optional heading icon used when a section supplies none. Headings carry no icon by default. */\n\tfallbackIcons?: { recent?: React.ElementType; suggestions?: React.ElementType };\n}\n\nexport function GlobalSearchIdleState({\n\tsections,\n\tfallbackIcons,\n}: GlobalSearchIdleStateProps) {\n\treturn (\n\t\t<div className={cn('global-search-idle-state--component', surfaceInsetClasses.compact)}>\n\t\t\t{sections.map((section, idx) => (\n\t\t\t\t<div key={section.id} className=\"global-search-idle-state--section\">\n\t\t\t\t\t<GlobalSearchGroupHeading\n\t\t\t\t\t\tlabel={section.label}\n\t\t\t\t\t\ticon={section.icon ?? (idx === 0 ? fallbackIcons?.recent : fallbackIcons?.suggestions)}\n\t\t\t\t\t/>\n\t\t\t\t\t<ul className=\"m-0 flex list-none flex-col p-0\">\n\t\t\t\t\t\t{section.items.map((item) => {\n\t\t\t\t\t\t\tconst ItemIcon = item.icon ?? Search;\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<li key={item.id}>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={item.onSelect}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t`${interactionRecipes.nativeButtonReset} flex w-full cursor-pointer items-center justify-start text-inherit outline-none ${focusRecipes.inset} text-left transition-colors`,\n\t\t\t\t\t\t\t\t\t\t\tcollectionRowClasses(),\n\t\t\t\t\t\t\t\t\t\t\tinteractionRecipes.rowHover,\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<ItemIcon\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"size-icon shrink-0 text-muted-foreground\"\n\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" type=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className=\"flex-1 truncate\">\n\t\t\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n","/**\n * GlobalSearchInput — search region at the top of the panel.\n *\n * The public `InputGroup` frame owns the field: its control height, padding,\n * radius, `--input` border and shared focus ring are the ones Command search\n * uses, so the spotlight never draws a field of its own. The region owns only\n * its outer collection inset. A busy indicator replaces the clear action while\n * results load, and the field stays editable throughout so typing is never\n * interrupted. Keyboard navigation is handled by the consumer wiring\n * `useGlobalSearch`'s `onKeyDown` handler.\n */\nimport { Loader2, Search } from 'lucide-react';\nimport * as React from 'react';\n\nimport { InputGroup, InputGroupAddon, InputGroupInput } from '../../../base/text-inputs';\nimport { FieldClearGlyph, fieldAffordanceRecipes } from '../../../../lib/field-affordance-recipes';\nimport { cn } from '../../../../lib/utils';\n\nexport interface GlobalSearchInputProps {\n\t/** Current value. */\n\tvalue: string;\n\t/** Fired with the next value. */\n\tonValueChange: (value: string) => void;\n\tonKeyDown?: (e: React.KeyboardEvent) => void;\n\t/** Shown while the value is empty. */\n\tplaceholder?: string;\n\t/** Accessible name for the clear control. */\n\tclearLabel?: string;\n\t/** Shows the pending indicator. */\n\tloading?: boolean;\n\t/** Focuses the control on mount. */\n\tautoFocus?: boolean;\n}\n\nexport const GlobalSearchInput = React.forwardRef<HTMLInputElement, GlobalSearchInputProps>(function GlobalSearchInput(\n\t{ value, onValueChange, onKeyDown, placeholder, clearLabel = 'Clear search', loading = false, autoFocus = false },\n\tref,\n) {\n\tconst innerRef = React.useRef<HTMLInputElement | null>(null);\n\tReact.useImperativeHandle(ref, () => innerRef.current as HTMLInputElement);\n\n\tReact.useEffect(() => {\n\t\tif (autoFocus) innerRef.current?.focus();\n\t}, [autoFocus]);\n\n\treturn (\n\t\t<div\n\t\t\tdata-component=\"global-search-input\"\n\t\t\tdata-slot=\"global-search-input\"\n\t\t\tclassName=\"global-search-input--component px-surface-xs pt-surface-xs pb-space-xs\"\n\t\t>\n\t\t\t<InputGroup>\n\t\t\t\t<InputGroupAddon>\n\t\t\t\t\t<Search aria-hidden=\"true\" />\n\t\t\t\t</InputGroupAddon>\n\t\t\t\t<InputGroupInput\n\t\t\t\t\tref={innerRef}\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tonChange={(e) => onValueChange(e.target.value)}\n\t\t\t\t\tonKeyDown={onKeyDown}\n\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\taria-label={placeholder}\n\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\tspellCheck={false}\n\t\t\t\t/>\n\t\t\t\t{(loading || !!value) && (\n\t\t\t\t\t<InputGroupAddon align=\"inline-end\">\n\t\t\t\t\t\t{loading ? (\n\t\t\t\t\t\t\t<Loader2 className=\"animate-spin\" aria-hidden=\"true\" />\n\t\t\t\t\t\t) : (\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\tonClick={() => {\n\t\t\t\t\t\t\t\t\tonValueChange('');\n\t\t\t\t\t\t\t\t\tinnerRef.current?.focus();\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\taria-label={clearLabel}\n\t\t\t\t\t\t\t\tclassName={cn(fieldAffordanceRecipes.target, fieldAffordanceRecipes.focus, fieldAffordanceRecipes.clear)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<FieldClearGlyph 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</InputGroupAddon>\n\t\t\t\t)}\n\t\t\t</InputGroup>\n\t\t</div>\n\t);\n});\n","/**\n * Default tone palettes for thumbnails and avatars: the shared tint and ink of\n * each status tone, so a search result's tile matches every other toned chip.\n *\n * Consumers can override per-call via `slots.toneBg` / `slots.toneAvatar`.\n */\nimport { toneRecipes, type ToneRecipeName } from '../../../../lib/tone-recipes';\nimport type { GlobalSearchTone } from '../global-search.types';\n\nconst toned = (tone: ToneRecipeName) => `${toneRecipes[tone].tint} ${toneRecipes[tone].ink}`;\n\nexport const DEFAULT_TONE_BG: Record<GlobalSearchTone, string> = {\n\tneutral: 'bg-muted text-muted-foreground',\n\tprimary: toned('primary'),\n\tsuccess: toned('success'),\n\twarning: toned('warning'),\n\tinfo: toned('info'),\n\tdestructive: toned('destructive'),\n};\n\nexport const DEFAULT_TONE_AVATAR: Record<GlobalSearchTone, string> = { ...DEFAULT_TONE_BG };\n","/**\n * GlobalSearchResultRow — single rich result card.\n *\n * Layout: [thumbnail] [title + status pill / muted secondary line / meta] [right-value column] [chevron].\n * The row is a collection row: Command's inset, height floor, gap and medium\n * label weight, so a populated search reads at the same density as any menu.\n *\n * Exported as a partial so consumers can:\n * 1. Override an individual row via `slots.renderResult` and reuse this component for the others.\n * 2. Use it standalone in custom search UIs that don't need the full GlobalSearch shell.\n */\nimport { ArrowRight } from 'lucide-react';\nimport * as React from 'react';\n\nimport { Avatar, AvatarFallback, AvatarImage } from '../../../base/avatar';\nimport { Badge } from '../../../base/badge';\nimport { Stack } from '../../../base/structure';\nimport { SecondaryValue, Value } from '../../../primitives';\nimport { Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nimport type { GlobalSearchResult } from '../global-search.types';\nimport {\n\tDEFAULT_TONE_AVATAR,\n\tDEFAULT_TONE_BG,\n} from './tone-palettes';\nimport { collectionRowClasses } from '../../../base/popover/popover.recipes';\nimport { focusRecipes } from '../../../../lib/focus-recipes';\nimport { interactionRecipes } from '../../../../lib/interaction-recipes';\nimport { markRecipes } from '../../../../lib/tone-recipes';\n\nexport interface GlobalSearchResultRowProps<TGroup extends string = string> {\n\t/** The result this row represents. */\n\tresult: GlobalSearchResult<TGroup>;\n\t/** Highlighted via keyboard nav. */\n\tactive?: boolean;\n\t/** Current search text. */\n\tquery?: string;\n\t/** Fired when an entry is activated. */\n\tonSelect?: () => void;\n\tonMouseEnter?: () => void;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nfunction highlightMatch(text: string, query: string | undefined): React.ReactNode {\n\tconst q = (query ?? '').trim();\n\tif (!q) return text;\n\tconst lower = text.toLowerCase();\n\tconst ql = q.toLowerCase();\n\tconst i = lower.indexOf(ql);\n\tif (i < 0) return text;\n\treturn (\n\t\t<>\n\t\t\t{text.slice(0, i)}\n\t\t\t<mark className={markRecipes.match}>\n\t\t\t\t{text.slice(i, i + q.length)}\n\t\t\t</mark>\n\t\t\t{text.slice(i + q.length)}\n\t\t</>\n\t);\n}\n\nexport function GlobalSearchResultRow<TGroup extends string = string>({\n\tresult,\n\tactive = false,\n\tquery = '',\n\tonSelect,\n\tonMouseEnter,\n\tclassName,\n}: GlobalSearchResultRowProps<TGroup>) {\n\tconst ThumbIcon = result.thumbnail?.icon;\n\tconst bg = DEFAULT_TONE_BG;\n\tconst av = DEFAULT_TONE_AVATAR;\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tdata-component=\"global-search-result-row\"\n\t\t\tdata-slot=\"global-search-result-row\"\n\t\t\tonMouseEnter={onMouseEnter}\n\t\t\tonClick={onSelect}\n\t\t\tclassName={cn(\n\t\t\t\t`${interactionRecipes.nativeButtonReset} group/row relative flex w-full cursor-pointer items-center justify-start text-inherit outline-none ${focusRecipes.inset} text-left transition-colors`,\n\t\t\t\tcollectionRowClasses(),\n\t\t\t\t'global-search-result-row--component',\n\t\t\t\tactive ? interactionRecipes.rowSelected : interactionRecipes.rowHover,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{/* Thumbnail / Avatar */}\n\t\t\t<div className=\"flex shrink-0 items-center\">\n\t\t\t\t{result.avatar ? (\n\t\t\t\t\t<Avatar className={cn('size-avatar-sm', av[result.avatar.tone ?? 'neutral'])}>\n\t\t\t\t\t\t{result.avatar.src && (\n\t\t\t\t\t\t\t<AvatarImage src={result.avatar.src} alt={result.title} />\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<AvatarFallback\n\t\t\t\t\t\t\tclassName={cn('text-xs font-semibold', av[result.avatar.tone ?? 'neutral'])}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{result.avatar.initials}\n\t\t\t\t\t\t</AvatarFallback>\n\t\t\t\t\t</Avatar>\n\t\t\t\t) : ThumbIcon ? (\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'inline-flex size-avatar-sm items-center justify-center rounded-inner',\n\t\t\t\t\t\t\tbg[result.thumbnail?.tone ?? 'neutral'],\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ThumbIcon className=\"size-icon-sm\" aria-hidden=\"true\" />\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t</div>\n\n\t\t\t{/* Body */}\n\t\t\t<Stack gap=\"dense\" className=\"min-w-0 flex-1\">\n\t\t\t\t<div className=\"flex min-w-0 items-center gap-space-sm\">\n\t\t\t\t\t<Text tag=\"span\" type=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className=\"truncate\">\n\t\t\t\t\t\t{highlightMatch(result.title, query)}\n\t\t\t\t\t</Text>\n\t\t\t\t\t{!!result.badge && (\n\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\ttone={\n\t\t\t\t\t\t\t\tresult.badge.tone === 'destructive'\n\t\t\t\t\t\t\t\t\t? 'destructive'\n\t\t\t\t\t\t\t\t\t: result.badge.tone\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{result.badge.label}\n\t\t\t\t\t\t</Badge>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t{(() => {\n\t\t\t\t\tconst pieces: Array<{ key: string; node: React.ReactNode }> = [];\n\t\t\t\t\tif (result.subtitle)\n\t\t\t\t\t\tpieces.push({\n\t\t\t\t\t\t\tkey: 'subtitle',\n\t\t\t\t\t\t\tnode: (\n\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" className=\"min-w-0 break-words\">\n\t\t\t\t\t\t\t\t\t{highlightMatch(result.subtitle, query)}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t});\n\t\t\t\t\tresult.meta?.forEach((m, i) => {\n\t\t\t\t\t\tconst Icon = m.icon;\n\t\t\t\t\t\tpieces.push({\n\t\t\t\t\t\t\tkey: `m-${i}`,\n\t\t\t\t\t\t\tnode: (\n\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t'inline-flex min-w-0 items-center gap-space-xs break-words',\n\t\t\t\t\t\t\t\t\t\tm.mono && 'font-mono tabular-nums',\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{!!Icon && <Icon className=\"size-icon-sm shrink-0\" aria-hidden=\"true\" />}\n\t\t\t\t\t\t\t\t\t{m.label}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t\tif (result.timestamp)\n\t\t\t\t\t\tpieces.push({\n\t\t\t\t\t\t\tkey: 'ts',\n\t\t\t\t\t\t\tnode: <SecondaryValue size=\"xs\" className=\"tabular-nums\">{result.timestamp}</SecondaryValue>,\n\t\t\t\t\t\t});\n\t\t\t\t\tresult.tags?.forEach((tag) =>\n\t\t\t\t\t\tpieces.push({\n\t\t\t\t\t\t\tkey: `t-${tag}`,\n\t\t\t\t\t\t\t\tnode: <Text tag=\"span\" size=\"xs\" type=\"secondary\" className=\"min-w-0 break-words\">{tag}</Text>,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tif (result.rightValue) {\n\t\t\t\t\t\tpieces.push({\n\t\t\t\t\t\t\tkey: 'rv',\n\t\t\t\t\t\t\tnode: (\n\t\t\t\t\t\t\t\t\t<Value type=\"inherit\" weight=\"medium\" className=\"inline-flex flex-wrap items-baseline gap-space-xs tabular-nums\">\n\t\t\t\t\t\t\t\t\t{result.rightValue}\n\t\t\t\t\t\t\t\t\t{!!result.rightLabel && (\n\t\t\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\t\t\t\t\t\t\ttype=\"secondary\"\n\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{result.rightLabel.toLowerCase()}\n\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</Value>\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (pieces.length === 0) return null;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div className=\"flex min-w-0 flex-wrap items-baseline gap-x-space-sm gap-y-dense break-words\">\n\t\t\t\t\t\t\t{pieces.map((p, i) => (\n\t\t\t\t\t\t\t\t<span key={p.key} className={cn('inline-flex min-w-0 max-w-full items-baseline gap-space-sm', p.key === 'rv' && '@xl/global-search:hidden')}>\n\t\t\t\t\t\t\t\t\t{i > 0 && (\n\t\t\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t·\n\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{p.node}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})()}\n\t\t\t</Stack>\n\n\t\t\t{/* Right value column — only when value/label set */}\n\t\t\t{!!(result.rightValue || result.rightLabel) && (\n\t\t\t\t<div className=\"hidden shrink-0 items-center self-stretch @xl/global-search:flex\">\n\t\t\t\t\t<Stack gap=\"dense\" align=\"end\" className=\"text-right leading-tight\">\n\t\t\t\t\t\t{!!result.rightValue && (\n\t\t\t\t\t\t\t<Value\n\t\t\t\t\t\t\t\ttype=\"inherit\"\n\t\t\t\t\t\t\t\tweight=\"semibold\"\n\t\t\t\t\t\t\t\tclassName=\"whitespace-nowrap tabular-nums\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{result.rightValue}\n\t\t\t\t\t\t\t</Value>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{!!result.rightLabel && (\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=\"xs\"\n\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\tclassName=\"whitespace-nowrap\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{result.rightLabel}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Stack>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Trailing chevron */}\n\t\t\t<ArrowRight\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'size-icon shrink-0 transition-opacity',\n\t\t\t\t\tactive\n\t\t\t\t\t\t? 'text-inherit opacity-100'\n\t\t\t\t\t\t: 'text-muted-foreground opacity-0 group-hover/row:opacity-100',\n\t\t\t\t)}\n\t\t\t/>\n\t\t</button>\n\t);\n}\n","/**\n * GlobalSearchTabs — segmented filter strip above the result list.\n *\n * Wraps `base/navigation/tabs` for app-consistent styling and adds the\n * shared count badge (as NavigationTabs draws it) next to each label. The\n * strip is a header band: its scroller owns the collection inset (which also\n * keeps the focus halo clear of the overflow clip) and a quiet rule separates\n * it from the result list.\n */\nimport { Badge } from '../../../base/badge';\nimport { Tabs, TabsList, TabsTrigger } from '../../../base/navigation/tabs';\nimport { Text } from '../../../typography';\nimport { surfaceDividerRecipes } from '../../../../lib/surface-recipes';\nimport { cn } from '../../../../lib/utils';\n\nexport interface GlobalSearchTabsProps<TGroup extends string = string> {\n\t/** Currently-selected tab. */\n\tvalue: 'all' | TGroup;\n\tonValueChange: (value: 'all' | TGroup) => void;\n\t/** Tabs to offer, in display order. */\n\ttabs: ReadonlyArray<{ value: 'all' | TGroup; label: string }>;\n\t/** Result counts shown beside each group. */\n\tcounts: Record<string, number>;\n}\n\nexport function GlobalSearchTabs<TGroup extends string = string>({\n\tvalue,\n\tonValueChange,\n\ttabs,\n\tcounts,\n}: GlobalSearchTabsProps<TGroup>) {\n\treturn (\n\t\t<div className={cn('global-search-tabs--component', surfaceDividerRecipes.anchored.header)}>\n\t\t\t<div className=\"global-search-tabs--scroller overflow-x-auto px-surface-xs pt-space-xs pb-space-md [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\">\n\t\t\t\t<Tabs\n\t\t\t\t\tvalue={value as string}\n\t\t\t\t\tonValueChange={(v) => onValueChange(v as 'all' | TGroup)}\n\t\t\t\t\tclassName=\"min-w-max\"\n\t\t\t\t>\n\t\t\t\t\t<TabsList className=\"global-search-tabs--list h-action-sm w-max min-w-max\">\n\t\t\t\t\t\t{tabs.map((tab) => {\n\t\t\t\t\t\t\tconst count = counts[tab.value as string] ?? 0;\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<TabsTrigger\n\t\t\t\t\t\t\t\t\tkey={tab.value as string}\n\t\t\t\t\t\t\t\t\tvalue={tab.value as string}\n\t\t\t\t\t\t\t\t\tclassName=\"global-search-tabs--trigger shrink-0 gap-space-sm px-control-sm text-foreground\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Text tag=\"span\">\n\t\t\t\t\t\t\t\t\t\t{tab.label}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t<Badge size=\"sm\" tone=\"secondary\" className=\"global-search-tabs--count tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t{count}\n\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t</TabsTrigger>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</TabsList>\n\t\t\t\t</Tabs>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * GlobalSearch — framework-agnostic spotlight overlay for app-wide search.\n *\n * Composition seams:\n * - `strings` — deep-partial override of the default copy\n * - `slots` — replace any region (input, tabs, idle, empty, loading, footer)\n * - `slots.renderResult` — full per-row override\n *\n * Headless usage:\n * - Call `useGlobalSearch({ results, query })` directly to drive a\n * completely custom UI against the same selection state machine.\n *\n * Framework-agnostic:\n * - No router import, no i18n SDK import. Routing is up to the consumer\n * via `onResultSelect`. Strings live in the `strings` prop.\n * - The library no longer ships `adapters/$framework/`. Consumers map\n * their router (Inertia, Tanstack Router, RR7, Next, …) to\n * `onResultSelect(result)` directly at the call site.\n */\nimport * as React from 'react';\n\nimport { TextButton } from '../../base/buttons';\nimport { surfaceInsetClasses } from '../../base/popover/popover.recipes';\nimport { Text } from '../../typography';\nimport { interpolateString, useStrings, type StringsProp } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport {\n\tdefaultGlobalSearchStrings,\n\ttype GlobalSearchStrings,\n} from './global-search.strings';\nimport type {\n\tGlobalSearchIdleSection,\n\tGlobalSearchResult,\n\tGlobalSearchSlots,\n\tGlobalSearchTab,\n} from './global-search.types';\nimport { useGlobalSearch } from './hooks/use-global-search';\nimport {\n\tGlobalSearchEmptyState,\n\tGlobalSearchFooter,\n\tGlobalSearchIdleState,\n\tGlobalSearchInput,\n\tGlobalSearchResultRow,\n\tGlobalSearchTabs,\n} from './partials';\nimport { GlobalSearchGroupHeading } from './partials/global-search-group-heading';\n\nexport interface GlobalSearchProps<TGroup extends string = string> {\n\t/** Result list. The component renders these grouped by `result.group`. */\n\tresults?: ReadonlyArray<GlobalSearchResult<TGroup>>;\n\t/** Current query value (controlled). */\n\tquery: string;\n\t/** Query change callback. */\n\tonQueryChange: (q: string) => void;\n\t/** Activation callback — fires on row click or Enter. */\n\tonResultSelect?: (result: GlobalSearchResult<TGroup>) => void;\n\t/** Escape-key callback. */\n\tonClose?: () => void;\n\t/** Loading flag — switches the input spinner and renders the loading slot. */\n\tloading?: boolean;\n\t/** Idle-state sections (Recent / Suggestions / …). */\n\tidleSections?: ReadonlyArray<GlobalSearchIdleSection>;\n\t/** Override default group labels in the tab strip. */\n\tgroupLabels?: Partial<Record<TGroup, string>>;\n\t/** Auto-focus the input on mount. */\n\tautoFocus?: boolean;\n\t/** Replace any portion of the default copy. */\n\tstrings?: StringsProp<GlobalSearchStrings>;\n\t/** Replace any portion of the layout. */\n\tslots?: GlobalSearchSlots<TGroup>;\n\t/** Custom tab list — overrides the auto-generated `All + groups`. */\n\ttabs?: ReadonlyArray<GlobalSearchTab<TGroup>>;\n\t/** Wrapper className. */\n\tclassName?: string;\n}\n\nexport function GlobalSearch<TGroup extends string = string>({\n\tresults = [],\n\tquery,\n\tonQueryChange,\n\tonResultSelect,\n\tonClose,\n\tloading = false,\n\tidleSections,\n\tgroupLabels,\n\tautoFocus = false,\n\tstrings: stringsProp,\n\tslots,\n\ttabs,\n\tclassName,\n}: GlobalSearchProps<TGroup>) {\n\tconst strings = useStrings(defaultGlobalSearchStrings, stringsProp);\n\n\tconst search = useGlobalSearch<TGroup>({\n\t\tresults,\n\t\tquery,\n\t\tonResultSelect,\n\t\tonClose,\n\t});\n\n\tconst isEmpty =\n\t\t!loading && query.trim().length > 1 && results.length === 0;\n\tconst isIdle = !loading && query.trim().length <= 1;\n\n\tconst resolvedTabs = React.useMemo<\n\t\tReadonlyArray<GlobalSearchTab<TGroup>>\n\t>(() => {\n\t\tif (tabs) return tabs;\n\t\tconst groupKeys = Object.keys(search.grouped) as TGroup[];\n\t\treturn [\n\t\t\t{ value: 'all', label: strings.tabAll },\n\t\t\t...groupKeys.map((key) => ({\n\t\t\t\tvalue: key,\n\t\t\t\tlabel: groupLabels?.[key] ?? key,\n\t\t\t})),\n\t\t];\n\t}, [tabs, search.grouped, strings.tabAll, groupLabels]);\n\n\treturn (\n\t\t<div\n\t\t\tdata-component=\"global-search\"\n\t\t\tdata-slot=\"global-search\"\n\t\t\tclassName={cn('global-search--component',\n\t\t\t\t'@container/global-search overflow-hidden rounded-radius border border-border bg-card text-card-foreground shadow-xl',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{slots?.input ?? (\n\t\t\t\t<GlobalSearchInput\n\t\t\t\t\tvalue={query}\n\t\t\t\t\tonValueChange={onQueryChange}\n\t\t\t\t\tonKeyDown={search.onKeyDown}\n\t\t\t\t\tplaceholder={strings.placeholder}\n\t\t\t\t\tclearLabel={strings.clear}\n\t\t\t\t\tloading={loading}\n\t\t\t\t\tautoFocus={autoFocus}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{!loading && results.length > 0 && (\n\t\t\t\tslots?.tabs ?? (\n\t\t\t\t\t<GlobalSearchTabs<TGroup>\n\t\t\t\t\t\tvalue={search.activeTab}\n\t\t\t\t\t\tonValueChange={search.setActiveTab}\n\t\t\t\t\t\ttabs={resolvedTabs}\n\t\t\t\t\t\tcounts={search.tabCounts}\n\t\t\t\t\t/>\n\t\t\t\t)\n\t\t\t)}\n\n\t\t\t{/* A rem-based results viewport (32.5rem), so it follows the root text size. */}\n\t\t\t<div className=\"global-search--viewport max-h-130 overflow-y-auto\">\n\t\t\t\t{!!isIdle && (slots?.idle ?? (\n\t\t\t\t\tidleSections && idleSections.length > 0 ? (\n\t\t\t\t\t\t<GlobalSearchIdleState sections={idleSections} />\n\t\t\t\t\t) : null\n\t\t\t\t))}\n\n\t\t\t\t{!!loading && (slots?.loading ?? (\n\t\t\t\t\t<div className=\"global-search--loading flex items-center justify-center px-row-x py-space-xl\" role=\"status\">\n\t\t\t\t\t\t<Text type=\"secondary\">\n\t\t\t\t\t\t\t{strings.loading}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\n\t\t\t\t{!!isEmpty && (slots?.empty ?? (\n\t\t\t\t\t<GlobalSearchEmptyState\n\t\t\t\t\t\ttitle={interpolateString(strings.emptyTitle, { query })}\n\t\t\t\t\t\thint={strings.emptyHint}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\n\t\t\t\t{!loading && results.length > 0 && (\n\t\t\t\t\t<div className={cn('global-search--results', surfaceInsetClasses.compact)}>\n\t\t\t\t\t\t{Object.entries(search.visibleGrouped).map(([groupKey, items]) => (\n\t\t\t\t\t\t\t<div key={groupKey} className=\"global-search--group\">\n\t\t\t\t\t\t\t\t<GlobalSearchGroupHeading\n\t\t\t\t\t\t\t\t\tlabel={groupLabels?.[groupKey as TGroup] ?? groupKey}\n\t\t\t\t\t\t\t\t\taction={search.activeTab === 'all' && items.length > 0 ? (\n\t\t\t\t\t\t\t\t\t\t<TextButton\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => search.setActiveTab(groupKey as TGroup)}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{strings.seeAll}\n\t\t\t\t\t\t\t\t\t\t</TextButton>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<ul className=\"m-0 flex list-none flex-col p-0\">\n\t\t\t\t\t\t\t\t\t{items.map((item) => {\n\t\t\t\t\t\t\t\t\t\tconst isActive =\n\t\t\t\t\t\t\t\t\t\t\tsearch.flat[search.activeIdx]?.id === item.id;\n\t\t\t\t\t\t\t\t\t\tconst ctx = {\n\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\tquery,\n\t\t\t\t\t\t\t\t\t\t\tonSelect: () => onResultSelect?.(item),\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\tconst node = slots?.renderResult ? (\n\t\t\t\t\t\t\t\t\t\t\tslots.renderResult(item, ctx)\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<GlobalSearchResultRow<TGroup>\n\t\t\t\t\t\t\t\t\t\t\t\tresult={item}\n\t\t\t\t\t\t\t\t\t\t\t\tactive={isActive}\n\t\t\t\t\t\t\t\t\t\t\t\tquery={query}\n\t\t\t\t\t\t\t\t\t\t\t\tonSelect={ctx.onSelect}\n\t\t\t\t\t\t\t\t\t\t\t\tonMouseEnter={() =>\n\t\t\t\t\t\t\t\t\t\t\t\t\tsearch.setActiveById(item.id)\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/>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\treturn <li key={item.id}>{node}</li>;\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{slots?.footer ?? (\n\t\t\t\t<GlobalSearchFooter\n\t\t\t\t\tnavigateLabel={strings.footerNavigate}\n\t\t\t\t\topenLabel={strings.footerOpen}\n\t\t\t\t\tcloseLabel={strings.footerClose}\n\t\t\t\t\ttrailing={\n\t\t\t\t\t\t!isIdle && !isEmpty && results.length > 0 ? (\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=\"xs\"\n\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\tclassName=\"tabular-nums\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{interpolateString(strings.resultsCount, {\n\t\t\t\t\t\t\t\t\tcount: results.length,\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t) : undefined\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","/**\n * GlobalSearchDialog — the command-palette presentation of `GlobalSearch`.\n *\n * `GlobalSearch` is a panel: it renders its own card chrome and expects to be\n * placed somewhere. The palette pattern it was clearly built for — `onClose`,\n * `autoFocus`, Escape handling — had no supported presentation, so every call\n * site hand-rolled the modal around it: a `fixed inset-0` backdrop and a\n * mousedown-outside handler, with no focus trap, no portal, no scroll lock and\n * no dialog role.\n *\n * It presents through `ActionDialog` rather than a raw `Dialog`, because\n * `features/overlays` is the package's single overlay surface and everything\n * modal is expected to come from it. Three of its seams carry the palette\n * shape: `visuallyHideHeader` keeps the accessible name without drawing a\n * heading, `showCloseButton={false}` drops the corner X that would otherwise\n * land on the search field, and the two action flags remove the footer.\n *\n * The surface itself is neutralised because `GlobalSearch` already draws the\n * card, and it anchors near the top rather than centring, which is where a\n * palette belongs.\n */\nimport { useMemo } from 'react';\n\nimport { ActionDialog } from '../overlays';\nimport { useStrings } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport { GlobalSearch, type GlobalSearchProps } from './global-search';\nimport { defaultGlobalSearchStrings } from './global-search.strings';\n\nexport interface GlobalSearchDialogProps<TGroup extends string = string>\n\textends Omit<GlobalSearchProps<TGroup>, 'onClose'> {\n\t/** Whether the palette is showing. */\n\topen: boolean;\n\t/** Open-state callback. Fires on Escape, backdrop click, and result selection. */\n\tonOpenChange: (open: boolean) => void;\n\t/** Classes for the dialog surface that positions the palette. */\n\tcontentClassName?: string;\n}\n\nexport function GlobalSearchDialog<TGroup extends string = string>({\n\topen,\n\tonOpenChange,\n\tcontentClassName,\n\tclassName,\n\tstrings: stringsProp,\n\tautoFocus = true,\n\t...searchProps\n}: GlobalSearchDialogProps<TGroup>) {\n\tconst strings = useStrings(defaultGlobalSearchStrings, stringsProp);\n\tconst close = useMemo(() => () => onOpenChange(false), [onOpenChange]);\n\n\treturn (\n\t\t<ActionDialog\n\t\t\topen={open}\n\t\t\tonOpenChange={onOpenChange}\n\t\t\ttitle={strings.dialogTitle}\n\t\t\tvisuallyHideHeader\n\t\t\tshowCloseButton={false}\n\t\t\tshowCancel={false}\n\t\t\tshowConfirm={false}\n\t\t\tclassName={cn(\n\t\t\t\t'global-search-dialog--component',\n\t\t\t\t// GlobalSearch draws the card, so the dialog surface carries none:\n\t\t\t\t// stacking both produced a border inside a border.\n\t\t\t\t'w-full max-w-2xl overflow-visible border-0 bg-transparent p-0 shadow-none sm:max-w-2xl',\n\t\t\t\t// A palette belongs near the top of the viewport, not centred in it.\n\t\t\t\t'top-24 translate-y-0',\n\t\t\t\tcontentClassName,\n\t\t\t)}\n\t\t\tcontentClassName=\"p-0\"\n\t\t>\n\t\t\t<GlobalSearch<TGroup>\n\t\t\t\t{...(searchProps as GlobalSearchProps<TGroup>)}\n\t\t\t\tstrings={stringsProp}\n\t\t\t\tautoFocus={autoFocus}\n\t\t\t\tonClose={close}\n\t\t\t\tclassName={className}\n\t\t\t/>\n\t\t</ActionDialog>\n\t);\n}\n\nGlobalSearchDialog.displayName = 'GlobalSearchDialog';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"global-search.js","names":["React","_Fragment","React","cn","TextButton","Text","focusRecipes","Stack","toneRecipes","markRecipes","surfaceDividerRecipes","kbdRecipe","surfaceInsetClasses","collectionRowClasses","popoverRecipes","ActionDialog","interactionRecipes","Value","SecondaryValue","AvatarFallback","Avatar","AvatarImage","Badge","fieldAffordanceRecipes","FieldClearGlyph","InputGroup","InputGroupInput","InputGroupAddon","TabsTrigger","TabsList","Tabs","EmptyState","React$1","Fragment$1","defaultGlobalSearchStrings","useGlobalSearch","activeTab","setActiveTabState","useState","activeIdx","setActiveIdx","query","grouped","useMemo","buckets","r","results","tabCounts","counts","k","v","visibleGrouped","sub","flat","activeIdxRef","useRef","flatRef","tab","idx","id","i","item","onResultSelect","onClose","GlobalSearchEmptyState","hint","Search","Shortcut","keys","label","GlobalSearchFooter","className","navigateLabel","openLabel","closeLabel","trailing","GlobalSearchGroupHeading","Icon","action","GlobalSearchIdleState","sections","section","fallbackIcons","ItemIcon","GlobalSearchInput","innerRef","ref","autoFocus","onValueChange","placeholder","expanded","controls","activeDescendant","loading","value","Loader2","clearLabel","toned","tone","DEFAULT_TONE_BG","DEFAULT_TONE_AVATAR","highlightMatch","q","text","lower","ql","GlobalSearchResultRow","ThumbIcon","result","bg","av","liftNeutralTile","active","optionId","onSelect","pieces","m","tag","p","ArrowRight","GlobalSearchTabs","tabs","count","GlobalSearch","stringsProp","strings","useStrings","search","isEmpty","isIdle","listboxBaseId","showResults","flatIndexById","index","optionIdFor","groupKeys","listboxIdFor","groupIndex","activeOptionId","resolvedTabs","key","groupLabels","slots","onQueryChange","idleSections","interpolateString","groupKey","items","isActive","ctx","GlobalSearchDialog","searchProps","close","onOpenChange","contentClassName"],"sources":["../../src/components/features/global-search/global-search.strings.ts","../../src/components/features/global-search/hooks/use-global-search.ts","../../src/components/features/global-search/partials/global-search-empty-state.tsx","../../src/components/features/global-search/partials/global-search-footer.tsx","../../src/components/features/global-search/partials/global-search-group-heading.tsx","../../src/components/features/global-search/partials/global-search-idle-state.tsx","../../src/components/features/global-search/partials/global-search-input.tsx","../../src/components/features/global-search/partials/tone-palettes.ts","../../src/components/features/global-search/partials/global-search-result-row.tsx","../../src/components/features/global-search/partials/global-search-tabs.tsx","../../src/components/features/global-search/global-search.tsx","../../src/components/features/global-search/global-search-dialog.tsx"],"sourcesContent":["/**\n * Strings for `GlobalSearch` and its partials. Consumers override via the\n * `strings` prop on `<GlobalSearch />`; values are deep-merged over these\n * defaults so partial overrides are safe.\n */\nexport interface GlobalSearchStrings {\n\t/** Placeholder copy for the search input. */\n\t/** Names the modal presentation for assistive technology. */\n\tdialogTitle: string;\n\tplaceholder: string;\n\t/** aria-label for the clear-search icon button. */\n\tclear: string;\n\t/** Loading-state copy. */\n\tloading: string;\n\t/** Empty-state title — uses {{query}} as a placeholder. */\n\temptyTitle: string;\n\t/** Empty-state body copy. */\n\temptyHint: string;\n\t/** Idle-state heading for \"Recent\" suggestions. */\n\tidleRecent: string;\n\t/** Idle-state heading for curated \"Suggestions\". */\n\tidleSuggestions: string;\n\t/** Tab label for the \"All\" tab. */\n\ttabAll: string;\n\t/** Footer \"navigate\" hint. */\n\tfooterNavigate: string;\n\t/** Footer \"open\" hint. */\n\tfooterOpen: string;\n\t/** Footer \"close\" hint. */\n\tfooterClose: string;\n\t/** Trailing N results count. */\n\tresultsCount: string;\n\t/** \"See all\" group action — jumps to that tab. */\n\tseeAll: string;\n}\n\nexport const defaultGlobalSearchStrings: GlobalSearchStrings = {\n\tdialogTitle: 'Search',\n\tplaceholder: 'Search…',\n\tclear: 'Clear search',\n\tloading: 'Searching…',\n\temptyTitle: 'No results for \"{{query}}\"',\n\temptyHint: 'Try a shorter keyword or check the spelling.',\n\tidleRecent: 'Recent',\n\tidleSuggestions: 'Suggestions',\n\ttabAll: 'All',\n\tfooterNavigate: 'navigate',\n\tfooterOpen: 'open',\n\tfooterClose: 'close',\n\tresultsCount: '{{count}} results',\n\tseeAll: 'See all',\n};\n","/**\n * useGlobalSearch — headless state machine for `<GlobalSearch />`.\n *\n * Owns the active-row index, active tab, and the keyboard-navigation\n * handler. Returns the derived flat list (results filtered by tab) so\n * consumers can render entirely custom UIs against the same state.\n *\n * Usage:\n * const search = useGlobalSearch({ results, query });\n * <input onKeyDown={search.onKeyDown} />\n * {search.flat.map((r, i) => <Row active={i === search.activeIdx} … />)}\n */\nimport { useEffect, useMemo, useRef, useState } from 'react';\n\nimport type { GlobalSearchResult } from '../global-search.types';\n\nexport interface UseGlobalSearchOptions<TGroup extends string = string> {\n\tresults: ReadonlyArray<GlobalSearchResult<TGroup>>;\n\tquery: string;\n\t/** Fires when the user activates a row (Enter or click). */\n\tonResultSelect?: (result: GlobalSearchResult<TGroup>) => void;\n\t/** Fires when the user presses Escape. */\n\tonClose?: () => void;\n}\n\nexport interface UseGlobalSearchReturn<TGroup extends string = string> {\n\t/** Results bucketed by group, in insertion order. */\n\tgrouped: Record<string, GlobalSearchResult<TGroup>[]>;\n\t/** Result count per tab (`all` plus each group key). */\n\ttabCounts: Record<string, number>;\n\t/** Currently-selected tab. */\n\tactiveTab: 'all' | TGroup;\n\t/** Set the active tab — also resets the active index. */\n\tsetActiveTab: (tab: 'all' | TGroup) => void;\n\t/** Filtered grouped map respecting the active tab. */\n\tvisibleGrouped: Record<string, GlobalSearchResult<TGroup>[]>;\n\t/** Flat ordered list matching what is currently rendered. */\n\tflat: GlobalSearchResult<TGroup>[];\n\t/** Index into `flat` of the currently-highlighted row. */\n\tactiveIdx: number;\n\tsetActiveIdx: (i: number) => void;\n\t/** Programmatically activate a result by id. */\n\tsetActiveById: (id: string) => void;\n\t/** Bind to the search input's `onKeyDown` for arrow / enter / escape support. */\n\tonKeyDown: (e: React.KeyboardEvent) => void;\n\t/** Activate the row at `activeIdx`. */\n\tselectActive: () => void;\n}\n\nexport function useGlobalSearch<TGroup extends string = string>({\n\tresults,\n\tquery,\n\tonResultSelect,\n\tonClose,\n}: UseGlobalSearchOptions<TGroup>): UseGlobalSearchReturn<TGroup> {\n\tconst [activeTab, setActiveTabState] =\n\t\tuseState<'all' | TGroup>('all');\n\tconst [activeIdx, setActiveIdx] = useState(0);\n\n\t// Reset both the active row and the active tab when the query changes\n\t// (so a fresh query never inherits a stale highlight or filter).\n\tuseEffect(() => {\n\t\tsetActiveTabState('all');\n\t\tsetActiveIdx(0);\n\t}, [query]);\n\n\tconst grouped = useMemo(() => {\n\t\tconst buckets: Record<string, GlobalSearchResult<TGroup>[]> = {};\n\t\tfor (const r of results) {\n\t\t\t(buckets[r.group] ??= []).push(r);\n\t\t}\n\t\treturn buckets;\n\t}, [results]);\n\n\tconst tabCounts = useMemo(() => {\n\t\tconst counts: Record<string, number> = { all: results.length };\n\t\tfor (const [k, v] of Object.entries(grouped)) counts[k] = v.length;\n\t\treturn counts;\n\t}, [results.length, grouped]);\n\n\tconst visibleGrouped = useMemo(() => {\n\t\tif (activeTab === 'all') return grouped;\n\t\tconst sub = grouped[activeTab as string];\n\t\treturn sub ? ({ [activeTab as string]: sub } as Record<string, GlobalSearchResult<TGroup>[]>) : {};\n\t}, [grouped, activeTab]);\n\n\tconst flat = useMemo(() => {\n\t\tif (activeTab === 'all') return results.slice();\n\t\treturn grouped[activeTab as string] ?? [];\n\t}, [activeTab, grouped, results]);\n\n\tconst activeIdxRef = useRef(activeIdx);\n\tactiveIdxRef.current = activeIdx;\n\tconst flatRef = useRef(flat);\n\tflatRef.current = flat;\n\n\tconst setActiveTab = (tab: 'all' | TGroup) => {\n\t\tsetActiveTabState(tab);\n\t\tsetActiveIdx(0);\n\t};\n\n\tconst setActiveById = (id: string) => {\n\t\tconst idx = flatRef.current.findIndex((r) => r.id === id);\n\t\tif (idx >= 0) setActiveIdx(idx);\n\t};\n\n\tconst selectActive = () => {\n\t\tconst item = flatRef.current[activeIdxRef.current];\n\t\tif (item) onResultSelect?.(item);\n\t};\n\n\tconst onKeyDown = (e: React.KeyboardEvent) => {\n\t\tif (e.key === 'ArrowDown') {\n\t\t\te.preventDefault();\n\t\t\tsetActiveIdx((i) => Math.min(i + 1, flatRef.current.length - 1));\n\t\t} else if (e.key === 'ArrowUp') {\n\t\t\te.preventDefault();\n\t\t\tsetActiveIdx((i) => Math.max(i - 1, 0));\n\t\t} else if (e.key === 'Enter') {\n\t\t\tconst item = flatRef.current[activeIdxRef.current];\n\t\t\tif (item) {\n\t\t\t\te.preventDefault();\n\t\t\t\tonResultSelect?.(item);\n\t\t\t}\n\t\t} else if (e.key === 'Escape') {\n\t\t\tonClose?.();\n\t\t}\n\t};\n\n\treturn {\n\t\tgrouped,\n\t\ttabCounts,\n\t\tactiveTab,\n\t\tsetActiveTab,\n\t\tvisibleGrouped,\n\t\tflat,\n\t\tactiveIdx,\n\t\tsetActiveIdx,\n\t\tsetActiveById,\n\t\tonKeyDown,\n\t\tselectActive,\n\t};\n}\n","/**\n * Default empty-state body — shown when the query yields no results.\n * Override entirely via `slots.empty`.\n */\nimport { Search } from 'lucide-react';\n\nimport { EmptyState } from '../../../blocks/data-display';\n\nexport interface GlobalSearchEmptyStateProps {\n\t/** Surface title. */\n\ttitle: string;\n\t/** Short guidance shown beneath the control. */\n\thint: string;\n}\n\nexport function GlobalSearchEmptyState({ title, hint }: GlobalSearchEmptyStateProps) {\n\treturn (\n\t\t<EmptyState\n\t\t\ttitle={title}\n\t\t\tdescription={hint}\n\t\t\tmedia={<Search className=\"size-icon\" aria-hidden=\"true\" />}\n\t\t\tmediaVariant=\"icon-soft\"\n\t\t\tpadding=\"md\"\n\t\t\tclassName=\"global-search-empty-state--component\"\n\t\t/>\n\t);\n}\n","/**\n * GlobalSearchFooter — keyboard-hint strip below the result list.\n * Override entirely via `slots.footer`.\n *\n * It is the anchored collection footer band: one region inset and a quiet top\n * rule, with copy aligned to the row text above it. Each key sits tight against\n * its own hint, and the hint pairs are spaced apart from one another.\n */\nimport { Text } from '../../../typography';\nimport { popoverRecipes } from '../../../base/popover/popover.recipes';\nimport { cn } from '../../../../lib/utils';\nimport { kbdRecipe, surfaceDividerRecipes } from '../../../../lib/surface-recipes';\n\nexport interface GlobalSearchFooterProps {\n\t/** Footer hint for the arrow keys. */\n\tnavigateLabel: string;\n\t/** Footer hint for the enter key. */\n\topenLabel: string;\n\t/** Footer hint for the escape key. */\n\tcloseLabel: string;\n\t/** Trailing right-aligned content (e.g. \"3 results\"). */\n\ttrailing?: React.ReactNode;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nfunction Shortcut({ keys, label }: { keys: string; label: string }) {\n\treturn (\n\t\t<span className=\"global-search-footer--shortcut inline-flex items-center gap-space-xs\">\n\t\t\t<kbd className={kbdRecipe}>{keys}</kbd>\n\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\">\n\t\t\t\t{label}\n\t\t\t</Text>\n\t\t</span>\n\t);\n}\n\nexport function GlobalSearchFooter({\n\tnavigateLabel,\n\topenLabel,\n\tcloseLabel,\n\ttrailing,\n\tclassName,\n}: GlobalSearchFooterProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'global-search-footer--component',\n\t\t\t\tpopoverRecipes.menuRegion,\n\t\t\t\tsurfaceDividerRecipes.anchored.footer,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<div className={cn('global-search-footer--body flex flex-col items-stretch gap-space-xs', popoverRecipes.menuCopyInset, '@sm/global-search:flex-row @sm/global-search:items-center @sm/global-search:justify-between')}>\n\t\t\t\t<span className=\"global-search-footer--shortcuts flex flex-wrap items-center gap-x-space-lg gap-y-space-xs\">\n\t\t\t\t\t<Shortcut keys=\"↑↓\" label={navigateLabel} />\n\t\t\t\t\t<Shortcut keys=\"↵\" label={openLabel} />\n\t\t\t\t\t<Shortcut keys=\"esc\" label={closeLabel} />\n\t\t\t\t</span>\n\t\t\t\t{trailing ? (\n\t\t\t\t\t<span className=\"global-search-footer--trailing shrink-0 self-end whitespace-nowrap @sm/global-search:self-auto\">\n\t\t\t\t\t\t{trailing}\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * Group caption shared by result groups and idle sections. It uses the compact\n * secondary role and inset of a Command group heading, so a caption never reads\n * as another row and both lists keep one rhythm.\n */\nimport type * as React from 'react';\n\nimport { Text } from '../../../typography';\n\nexport interface GlobalSearchGroupHeadingProps {\n\t/** Caption copy. */\n\tlabel: React.ReactNode;\n\t/** Optional leading glyph supplied by the section. */\n\ticon?: React.ElementType;\n\t/** Trailing action, such as \"See all\". */\n\taction?: React.ReactNode;\n}\n\nexport function GlobalSearchGroupHeading({ label, icon: Icon, action }: GlobalSearchGroupHeadingProps) {\n\treturn (\n\t\t<div className=\"global-search-group--heading flex items-center justify-between gap-space-sm px-row-x pt-space-md pb-space-xs\">\n\t\t\t<span className=\"inline-flex min-w-0 items-center gap-space-sm\">\n\t\t\t\t{!!Icon && <Icon className=\"size-icon-sm shrink-0 text-muted-foreground\" aria-hidden=\"true\" />}\n\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" weight=\"medium\" lineHeight=\"tight\" className=\"truncate\">\n\t\t\t\t\t{label}\n\t\t\t\t</Text>\n\t\t\t</span>\n\t\t\t{action}\n\t\t</div>\n\t);\n}\n","/**\n * Default idle-state body — shown when the query is too short.\n * Renders consumer-supplied \"Recent\" + \"Suggestions\" sections with the same\n * compact collection inset, group captions and rows as the result list.\n */\nimport { Search } from 'lucide-react';\nimport * as React from 'react';\n\nimport { collectionRowClasses, surfaceInsetClasses } from '../../../base/popover/popover.recipes';\nimport { Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nimport type { GlobalSearchIdleSection } from '../global-search.types';\nimport { focusRecipes } from '../../../../lib/focus-recipes';\nimport { interactionRecipes } from '../../../../lib/interaction-recipes';\nimport { GlobalSearchGroupHeading } from './global-search-group-heading';\n\nexport interface GlobalSearchIdleStateProps {\n\t/** Sections to render, in display order. */\n\tsections: ReadonlyArray<GlobalSearchIdleSection>;\n\t/** Optional heading icon used when a section supplies none. Headings carry no icon by default. */\n\tfallbackIcons?: { recent?: React.ElementType; suggestions?: React.ElementType };\n}\n\nexport function GlobalSearchIdleState({\n\tsections,\n\tfallbackIcons,\n}: GlobalSearchIdleStateProps) {\n\treturn (\n\t\t<div className={cn('global-search-idle-state--component', surfaceInsetClasses.compact)}>\n\t\t\t{sections.map((section, idx) => (\n\t\t\t\t<div key={section.id} className=\"global-search-idle-state--section\">\n\t\t\t\t\t<GlobalSearchGroupHeading\n\t\t\t\t\t\tlabel={section.label}\n\t\t\t\t\t\ticon={section.icon ?? (idx === 0 ? fallbackIcons?.recent : fallbackIcons?.suggestions)}\n\t\t\t\t\t/>\n\t\t\t\t\t<ul className=\"m-0 flex list-none flex-col p-0\">\n\t\t\t\t\t\t{section.items.map((item) => {\n\t\t\t\t\t\t\tconst ItemIcon = item.icon ?? Search;\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<li key={item.id}>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={item.onSelect}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t`${interactionRecipes.nativeButtonReset} flex w-full cursor-pointer items-center justify-start text-inherit outline-none ${focusRecipes.inset} text-left transition-colors`,\n\t\t\t\t\t\t\t\t\t\t\tcollectionRowClasses(),\n\t\t\t\t\t\t\t\t\t\t\tinteractionRecipes.rowHover,\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<ItemIcon\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"size-icon shrink-0 text-muted-foreground\"\n\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" type=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className=\"flex-1 truncate\">\n\t\t\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n","/**\n * GlobalSearchInput — search region at the top of the panel.\n *\n * The public `InputGroup` frame owns the field: its control height, padding,\n * radius, `--input` border and shared focus ring are the ones Command search\n * uses, so the spotlight never draws a field of its own. The region owns only\n * its outer collection inset. A busy indicator replaces the clear action while\n * results load, and the field stays editable throughout so typing is never\n * interrupted. Keyboard navigation is handled by the consumer wiring\n * `useGlobalSearch`'s `onKeyDown` handler; `expanded`, `controls` and\n * `activeDescendant` expose that navigation as a combobox.\n */\nimport { Loader2, Search } from 'lucide-react';\nimport * as React from 'react';\n\nimport { InputGroup, InputGroupAddon, InputGroupInput } from '../../../base/text-inputs';\nimport { popoverRecipes } from '../../../base/popover/popover.recipes';\nimport { FieldClearGlyph, fieldAffordanceRecipes } from '../../../../lib/field-affordance-recipes';\nimport { cn } from '../../../../lib/utils';\n\nexport interface GlobalSearchInputProps {\n\t/** Current value. */\n\tvalue: string;\n\t/** Fired with the next value. */\n\tonValueChange: (value: string) => void;\n\tonKeyDown?: (e: React.KeyboardEvent) => void;\n\t/** Shown while the value is empty. */\n\tplaceholder?: string;\n\t/** Accessible name for the clear control. */\n\tclearLabel?: string;\n\t/** Shows the pending indicator. */\n\tloading?: boolean;\n\t/** Focuses the control on mount. */\n\tautoFocus?: boolean;\n\t/**\n\t * Whether the results list is showing. Setting it makes the field a\n\t * combobox (`role=\"combobox\"`, `aria-expanded`), the pattern for a search\n\t * whose results are navigated with the arrow keys while focus stays here.\n\t */\n\texpanded?: boolean;\n\t/** Id(s) of the results listbox(es) the combobox controls, while expanded. */\n\tcontrols?: string;\n\t/** Id of the highlighted result, announced as the active option. */\n\tactiveDescendant?: string;\n}\n\nexport const GlobalSearchInput = React.forwardRef<HTMLInputElement, GlobalSearchInputProps>(function GlobalSearchInput(\n\t{ value, onValueChange, onKeyDown, placeholder, clearLabel = 'Clear search', loading = false, autoFocus = false, expanded, controls, activeDescendant },\n\tref,\n) {\n\tconst innerRef = React.useRef<HTMLInputElement | null>(null);\n\tReact.useImperativeHandle(ref, () => innerRef.current as HTMLInputElement);\n\n\tReact.useEffect(() => {\n\t\tif (autoFocus) innerRef.current?.focus();\n\t}, [autoFocus]);\n\n\treturn (\n\t\t<div\n\t\t\tdata-component=\"global-search-input\"\n\t\t\tdata-slot=\"global-search-input\"\n\t\t\tclassName={cn('global-search-input--component pt-surface-xs pb-space-xs', popoverRecipes.menuInline)}\n\t\t>\n\t\t\t<InputGroup>\n\t\t\t\t<InputGroupAddon>\n\t\t\t\t\t<Search aria-hidden=\"true\" />\n\t\t\t\t</InputGroupAddon>\n\t\t\t\t<InputGroupInput\n\t\t\t\t\tref={innerRef}\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tonChange={(e) => onValueChange(e.target.value)}\n\t\t\t\t\tonKeyDown={onKeyDown}\n\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\taria-label={placeholder}\n\t\t\t\t\t{...(expanded === undefined ? {} : {\n\t\t\t\t\t\trole: 'combobox',\n\t\t\t\t\t\t'aria-autocomplete': 'list' as const,\n\t\t\t\t\t\t'aria-expanded': expanded,\n\t\t\t\t\t\t'aria-controls': expanded ? controls : undefined,\n\t\t\t\t\t\t'aria-activedescendant': expanded ? activeDescendant : undefined,\n\t\t\t\t\t})}\n\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\tspellCheck={false}\n\t\t\t\t/>\n\t\t\t\t{(loading || !!value) && (\n\t\t\t\t\t<InputGroupAddon align=\"inline-end\">\n\t\t\t\t\t\t{loading ? (\n\t\t\t\t\t\t\t<Loader2 className=\"animate-spin\" aria-hidden=\"true\" />\n\t\t\t\t\t\t) : (\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\tonClick={() => {\n\t\t\t\t\t\t\t\t\tonValueChange('');\n\t\t\t\t\t\t\t\t\tinnerRef.current?.focus();\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\taria-label={clearLabel}\n\t\t\t\t\t\t\t\tclassName={cn(fieldAffordanceRecipes.target, fieldAffordanceRecipes.focus, fieldAffordanceRecipes.clear)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<FieldClearGlyph 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</InputGroupAddon>\n\t\t\t\t)}\n\t\t\t</InputGroup>\n\t\t</div>\n\t);\n});\n","/**\n * Default tone palettes for thumbnails and avatars: the shared tint and ink of\n * each status tone, so a search result's tile matches every other toned chip.\n *\n * Consumers can override per-call via `slots.toneBg` / `slots.toneAvatar`.\n */\nimport { toneRecipes, type ToneRecipeName } from '../../../../lib/tone-recipes';\nimport type { GlobalSearchTone } from '../global-search.types';\n\nconst toned = (tone: ToneRecipeName) => `${toneRecipes[tone].tint} ${toneRecipes[tone].ink}`;\n\nexport const DEFAULT_TONE_BG: Record<GlobalSearchTone, string> = {\n\tneutral: 'bg-muted text-muted-foreground',\n\tprimary: toned('primary'),\n\tsuccess: toned('success'),\n\twarning: toned('warning'),\n\tinfo: toned('info'),\n\tdestructive: toned('destructive'),\n};\n\nexport const DEFAULT_TONE_AVATAR: Record<GlobalSearchTone, string> = { ...DEFAULT_TONE_BG };\n","/**\n * GlobalSearchResultRow — single rich result card.\n *\n * Layout: [thumbnail] [title + status pill / muted secondary line / meta] [right-value column] [chevron].\n * The row is a collection row: Command's inset, height floor, gap and medium\n * label weight, so a populated search reads at the same density as any menu.\n *\n * Exported as a partial so consumers can:\n * 1. Override an individual row via `slots.renderResult` and reuse this component for the others.\n * 2. Use it standalone in custom search UIs that don't need the full GlobalSearch shell.\n */\nimport { ArrowRight } from 'lucide-react';\nimport * as React from 'react';\n\nimport { Avatar, AvatarFallback, AvatarImage } from '../../../base/avatar';\nimport { Badge } from '../../../base/badge';\nimport { Stack } from '../../../base/structure';\nimport { SecondaryValue, Value } from '../../../primitives';\nimport { Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nimport type { GlobalSearchResult } from '../global-search.types';\nimport {\n\tDEFAULT_TONE_AVATAR,\n\tDEFAULT_TONE_BG,\n} from './tone-palettes';\nimport { collectionRowClasses } from '../../../base/popover/popover.recipes';\nimport { focusRecipes } from '../../../../lib/focus-recipes';\nimport { interactionRecipes } from '../../../../lib/interaction-recipes';\nimport { markRecipes } from '../../../../lib/tone-recipes';\n\nexport interface GlobalSearchResultRowProps<TGroup extends string = string> {\n\t/** The result this row represents. */\n\tresult: GlobalSearchResult<TGroup>;\n\t/** Highlighted via keyboard nav. */\n\tactive?: boolean;\n\t/** Current search text. */\n\tquery?: string;\n\t/** Fired when an entry is activated. */\n\tonSelect?: () => void;\n\tonMouseEnter?: () => void;\n\t/**\n\t * Id of this row as an option of a results listbox. When set, the row is a\n\t * `role=\"option\"` reached through the search field's active descendant\n\t * rather than by Tab; standalone rows stay plain buttons.\n\t */\n\toptionId?: string;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nfunction highlightMatch(text: string, query: string | undefined): React.ReactNode {\n\tconst q = (query ?? '').trim();\n\tif (!q) return text;\n\tconst lower = text.toLowerCase();\n\tconst ql = q.toLowerCase();\n\tconst i = lower.indexOf(ql);\n\tif (i < 0) return text;\n\treturn (\n\t\t<>\n\t\t\t{text.slice(0, i)}\n\t\t\t<mark className={markRecipes.match}>\n\t\t\t\t{text.slice(i, i + q.length)}\n\t\t\t</mark>\n\t\t\t{text.slice(i + q.length)}\n\t\t</>\n\t);\n}\n\nexport function GlobalSearchResultRow<TGroup extends string = string>({\n\tresult,\n\tactive = false,\n\tquery = '',\n\tonSelect,\n\tonMouseEnter,\n\toptionId,\n\tclassName,\n}: GlobalSearchResultRowProps<TGroup>) {\n\tconst ThumbIcon = result.thumbnail?.icon;\n\tconst bg = DEFAULT_TONE_BG;\n\tconst av = DEFAULT_TONE_AVATAR;\n\t// A neutral tile shares its muted fill with the row highlight; on a\n\t// highlighted row it lifts to the card surface so it stays distinct.\n\tconst liftNeutralTile = (tone: string | undefined) =>\n\t\t(tone ?? 'neutral') === 'neutral' && (active ? 'bg-card' : 'group-hover/row:bg-card');\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tdata-component=\"global-search-result-row\"\n\t\t\tdata-slot=\"global-search-result-row\"\n\t\t\t{...(optionId ? { id: optionId, role: 'option', 'aria-selected': active, tabIndex: -1 } : {})}\n\t\t\tonMouseEnter={onMouseEnter}\n\t\t\tonClick={onSelect}\n\t\t\tclassName={cn(\n\t\t\t\t`${interactionRecipes.nativeButtonReset} group/row relative flex w-full cursor-pointer items-center justify-start text-inherit outline-none ${focusRecipes.inset} text-left transition-colors`,\n\t\t\t\tcollectionRowClasses(),\n\t\t\t\t'global-search-result-row--component',\n\t\t\t\tactive ? interactionRecipes.rowSelected : interactionRecipes.rowHover,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{/* Thumbnail / Avatar */}\n\t\t\t<div className=\"flex shrink-0 items-center\">\n\t\t\t\t{result.avatar ? (\n\t\t\t\t\t<Avatar className={cn('size-avatar-sm', av[result.avatar.tone ?? 'neutral'], liftNeutralTile(result.avatar.tone))}>\n\t\t\t\t\t\t{result.avatar.src && (\n\t\t\t\t\t\t\t<AvatarImage src={result.avatar.src} alt={result.title} />\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<AvatarFallback\n\t\t\t\t\t\t\tclassName={cn('text-xs font-semibold', av[result.avatar.tone ?? 'neutral'], liftNeutralTile(result.avatar.tone))}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{result.avatar.initials}\n\t\t\t\t\t\t</AvatarFallback>\n\t\t\t\t\t</Avatar>\n\t\t\t\t) : ThumbIcon ? (\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'inline-flex size-avatar-sm items-center justify-center rounded-radius',\n\t\t\t\t\t\t\tbg[result.thumbnail?.tone ?? 'neutral'],\n\t\t\t\t\t\t\tliftNeutralTile(result.thumbnail?.tone),\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ThumbIcon className=\"size-icon-sm\" aria-hidden=\"true\" />\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t</div>\n\n\t\t\t{/* Body */}\n\t\t\t<Stack gap=\"dense\" className=\"min-w-0 flex-1\">\n\t\t\t\t<div className=\"flex min-w-0 items-center gap-space-sm\">\n\t\t\t\t\t<Text tag=\"span\" type=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className=\"truncate\">\n\t\t\t\t\t\t{highlightMatch(result.title, query)}\n\t\t\t\t\t</Text>\n\t\t\t\t\t{!!result.badge && (\n\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\ttone={\n\t\t\t\t\t\t\t\tresult.badge.tone === 'destructive'\n\t\t\t\t\t\t\t\t\t? 'destructive'\n\t\t\t\t\t\t\t\t\t: result.badge.tone\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{result.badge.label}\n\t\t\t\t\t\t</Badge>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t{(() => {\n\t\t\t\t\tconst pieces: Array<{ key: string; node: React.ReactNode }> = [];\n\t\t\t\t\tif (result.subtitle)\n\t\t\t\t\t\tpieces.push({\n\t\t\t\t\t\t\tkey: 'subtitle',\n\t\t\t\t\t\t\tnode: (\n\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" className=\"min-w-0 break-words\">\n\t\t\t\t\t\t\t\t\t{highlightMatch(result.subtitle, query)}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t});\n\t\t\t\t\tresult.meta?.forEach((m, i) => {\n\t\t\t\t\t\tconst Icon = m.icon;\n\t\t\t\t\t\tpieces.push({\n\t\t\t\t\t\t\tkey: `m-${i}`,\n\t\t\t\t\t\t\tnode: (\n\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t'inline-flex min-w-0 items-center gap-space-xs break-words',\n\t\t\t\t\t\t\t\t\t\tm.mono && 'font-mono tabular-nums',\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{!!Icon && <Icon className=\"size-icon-sm shrink-0\" aria-hidden=\"true\" />}\n\t\t\t\t\t\t\t\t\t{m.label}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t\tif (result.timestamp)\n\t\t\t\t\t\tpieces.push({\n\t\t\t\t\t\t\tkey: 'ts',\n\t\t\t\t\t\t\tnode: <SecondaryValue size=\"xs\" className=\"tabular-nums\">{result.timestamp}</SecondaryValue>,\n\t\t\t\t\t\t});\n\t\t\t\t\tresult.tags?.forEach((tag) =>\n\t\t\t\t\t\tpieces.push({\n\t\t\t\t\t\t\tkey: `t-${tag}`,\n\t\t\t\t\t\t\t\tnode: <Text tag=\"span\" size=\"xs\" type=\"secondary\" className=\"min-w-0 break-words\">{tag}</Text>,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tif (result.rightValue) {\n\t\t\t\t\t\tpieces.push({\n\t\t\t\t\t\t\tkey: 'rv',\n\t\t\t\t\t\t\tnode: (\n\t\t\t\t\t\t\t\t\t<Value type=\"inherit\" weight=\"medium\" className=\"inline-flex flex-wrap items-baseline gap-space-xs tabular-nums\">\n\t\t\t\t\t\t\t\t\t{result.rightValue}\n\t\t\t\t\t\t\t\t\t{!!result.rightLabel && (\n\t\t\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\t\t\t\t\t\t\ttype=\"secondary\"\n\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{result.rightLabel.toLowerCase()}\n\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</Value>\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (pieces.length === 0) return null;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div className=\"flex min-w-0 flex-wrap items-baseline gap-x-space-sm gap-y-dense break-words\">\n\t\t\t\t\t\t\t{pieces.map((p, i) => (\n\t\t\t\t\t\t\t\t<span key={p.key} className={cn('inline-flex min-w-0 max-w-full items-baseline gap-space-sm', p.key === 'rv' && '@xl/global-search:hidden')}>\n\t\t\t\t\t\t\t\t\t{i > 0 && (\n\t\t\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t·\n\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{p.node}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})()}\n\t\t\t</Stack>\n\n\t\t\t{/* Right value column — only when value/label set */}\n\t\t\t{!!(result.rightValue || result.rightLabel) && (\n\t\t\t\t<div className=\"hidden shrink-0 items-center self-stretch @xl/global-search:flex\">\n\t\t\t\t\t<Stack gap=\"dense\" align=\"end\" className=\"text-right leading-tight\">\n\t\t\t\t\t\t{!!result.rightValue && (\n\t\t\t\t\t\t\t<Value\n\t\t\t\t\t\t\t\ttype=\"inherit\"\n\t\t\t\t\t\t\t\tweight=\"semibold\"\n\t\t\t\t\t\t\t\tclassName=\"whitespace-nowrap tabular-nums\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{result.rightValue}\n\t\t\t\t\t\t\t</Value>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{!!result.rightLabel && (\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=\"xs\"\n\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\tclassName=\"whitespace-nowrap\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{result.rightLabel}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Stack>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Trailing chevron */}\n\t\t\t<ArrowRight\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'size-icon shrink-0 transition-opacity',\n\t\t\t\t\tactive\n\t\t\t\t\t\t? 'text-inherit opacity-100'\n\t\t\t\t\t\t: 'text-muted-foreground opacity-0 group-hover/row:opacity-100',\n\t\t\t\t)}\n\t\t\t/>\n\t\t</button>\n\t);\n}\n","/**\n * GlobalSearchTabs — segmented filter strip above the result list.\n *\n * Wraps `base/navigation/tabs` for app-consistent styling and adds the\n * shared count badge (as NavigationTabs draws it) next to each label. The\n * strip is a header band: its scroller owns the collection inset (which also\n * keeps the focus halo clear of the overflow clip) and a quiet rule separates\n * it from the result list.\n */\nimport { Badge } from '../../../base/badge';\nimport { Tabs, TabsList, TabsTrigger } from '../../../base/navigation/tabs';\nimport { Text } from '../../../typography';\nimport { popoverRecipes } from '../../../base/popover/popover.recipes';\nimport { surfaceDividerRecipes } from '../../../../lib/surface-recipes';\nimport { cn } from '../../../../lib/utils';\n\nexport interface GlobalSearchTabsProps<TGroup extends string = string> {\n\t/** Currently-selected tab. */\n\tvalue: 'all' | TGroup;\n\tonValueChange: (value: 'all' | TGroup) => void;\n\t/** Tabs to offer, in display order. */\n\ttabs: ReadonlyArray<{ value: 'all' | TGroup; label: string }>;\n\t/** Result counts shown beside each group. */\n\tcounts: Record<string, number>;\n}\n\nexport function GlobalSearchTabs<TGroup extends string = string>({\n\tvalue,\n\tonValueChange,\n\ttabs,\n\tcounts,\n}: GlobalSearchTabsProps<TGroup>) {\n\treturn (\n\t\t<div className={cn('global-search-tabs--component', surfaceDividerRecipes.anchored.header)}>\n\t\t\t<div className={cn('global-search-tabs--scroller overflow-x-auto pt-space-xs pb-space-md [scrollbar-width:none] [&::-webkit-scrollbar]:hidden', popoverRecipes.menuInline)}>\n\t\t\t\t<Tabs\n\t\t\t\t\tvalue={value as string}\n\t\t\t\t\tonValueChange={(v) => onValueChange(v as 'all' | TGroup)}\n\t\t\t\t\tclassName=\"min-w-max\"\n\t\t\t\t>\n\t\t\t\t\t<TabsList className=\"global-search-tabs--list h-action-sm w-max min-w-max\">\n\t\t\t\t\t\t{tabs.map((tab) => {\n\t\t\t\t\t\t\tconst count = counts[tab.value as string] ?? 0;\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<TabsTrigger\n\t\t\t\t\t\t\t\t\tkey={tab.value as string}\n\t\t\t\t\t\t\t\t\tvalue={tab.value as string}\n\t\t\t\t\t\t\t\t\tclassName=\"global-search-tabs--trigger shrink-0 gap-space-sm px-control-sm text-foreground\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Text tag=\"span\">\n\t\t\t\t\t\t\t\t\t\t{tab.label}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t<Badge size=\"sm\" tone=\"secondary\" className=\"global-search-tabs--count tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t{count}\n\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t</TabsTrigger>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</TabsList>\n\t\t\t\t</Tabs>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * GlobalSearch — framework-agnostic spotlight overlay for app-wide search.\n *\n * Composition seams:\n * - `strings` — deep-partial override of the default copy\n * - `slots` — replace any region (input, tabs, idle, empty, loading, footer)\n * - `slots.renderResult` — full per-row override\n *\n * Headless usage:\n * - Call `useGlobalSearch({ results, query })` directly to drive a\n * completely custom UI against the same selection state machine.\n *\n * Framework-agnostic:\n * - No router import, no i18n SDK import. Routing is up to the consumer\n * via `onResultSelect`. Strings live in the `strings` prop.\n * - The library no longer ships `adapters/$framework/`. Consumers map\n * their router (Inertia, Tanstack Router, RR7, Next, …) to\n * `onResultSelect(result)` directly at the call site.\n */\nimport * as React from 'react';\n\nimport { TextButton } from '../../base/buttons';\nimport { surfaceInsetClasses } from '../../base/popover/popover.recipes';\nimport { Text } from '../../typography';\nimport { interpolateString, useStrings, type StringsProp } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport {\n\tdefaultGlobalSearchStrings,\n\ttype GlobalSearchStrings,\n} from './global-search.strings';\nimport type {\n\tGlobalSearchIdleSection,\n\tGlobalSearchResult,\n\tGlobalSearchSlots,\n\tGlobalSearchTab,\n} from './global-search.types';\nimport { useGlobalSearch } from './hooks/use-global-search';\nimport {\n\tGlobalSearchEmptyState,\n\tGlobalSearchFooter,\n\tGlobalSearchIdleState,\n\tGlobalSearchInput,\n\tGlobalSearchResultRow,\n\tGlobalSearchTabs,\n} from './partials';\nimport { GlobalSearchGroupHeading } from './partials/global-search-group-heading';\n\nexport interface GlobalSearchProps<TGroup extends string = string> {\n\t/** Result list. The component renders these grouped by `result.group`. */\n\tresults?: ReadonlyArray<GlobalSearchResult<TGroup>>;\n\t/** Current query value (controlled). */\n\tquery: string;\n\t/** Query change callback. */\n\tonQueryChange: (q: string) => void;\n\t/** Activation callback — fires on row click or Enter. */\n\tonResultSelect?: (result: GlobalSearchResult<TGroup>) => void;\n\t/** Escape-key callback. */\n\tonClose?: () => void;\n\t/** Loading flag — switches the input spinner and renders the loading slot. */\n\tloading?: boolean;\n\t/** Idle-state sections (Recent / Suggestions / …). */\n\tidleSections?: ReadonlyArray<GlobalSearchIdleSection>;\n\t/** Override default group labels in the tab strip. */\n\tgroupLabels?: Partial<Record<TGroup, string>>;\n\t/** Auto-focus the input on mount. */\n\tautoFocus?: boolean;\n\t/** Replace any portion of the default copy. */\n\tstrings?: StringsProp<GlobalSearchStrings>;\n\t/** Replace any portion of the layout. */\n\tslots?: GlobalSearchSlots<TGroup>;\n\t/** Custom tab list — overrides the auto-generated `All + groups`. */\n\ttabs?: ReadonlyArray<GlobalSearchTab<TGroup>>;\n\t/** Wrapper className. */\n\tclassName?: string;\n}\n\nexport function GlobalSearch<TGroup extends string = string>({\n\tresults = [],\n\tquery,\n\tonQueryChange,\n\tonResultSelect,\n\tonClose,\n\tloading = false,\n\tidleSections,\n\tgroupLabels,\n\tautoFocus = false,\n\tstrings: stringsProp,\n\tslots,\n\ttabs,\n\tclassName,\n}: GlobalSearchProps<TGroup>) {\n\tconst strings = useStrings(defaultGlobalSearchStrings, stringsProp);\n\n\tconst search = useGlobalSearch<TGroup>({\n\t\tresults,\n\t\tquery,\n\t\tonResultSelect,\n\t\tonClose,\n\t});\n\n\tconst isEmpty =\n\t\t!loading && query.trim().length > 1 && results.length === 0;\n\tconst isIdle = !loading && query.trim().length <= 1;\n\n\t// Combobox semantics: focus stays in the field while the arrow keys move the\n\t// highlight, so each group is a listbox and the field names the active option.\n\tconst listboxBaseId = React.useId();\n\tconst showResults = !loading && results.length > 0;\n\tconst flatIndexById = new Map(search.flat.map((item, index) => [item.id, index]));\n\tconst optionIdFor = (index: number) => `${listboxBaseId}-option-${index}`;\n\tconst groupKeys = Object.keys(search.visibleGrouped);\n\tconst listboxIdFor = (groupIndex: number) => `${listboxBaseId}-group-${groupIndex}`;\n\tconst activeOptionId = showResults && search.flat[search.activeIdx] ? optionIdFor(search.activeIdx) : undefined;\n\n\tconst resolvedTabs = React.useMemo<\n\t\tReadonlyArray<GlobalSearchTab<TGroup>>\n\t>(() => {\n\t\tif (tabs) return tabs;\n\t\tconst groupKeys = Object.keys(search.grouped) as TGroup[];\n\t\treturn [\n\t\t\t{ value: 'all', label: strings.tabAll },\n\t\t\t...groupKeys.map((key) => ({\n\t\t\t\tvalue: key,\n\t\t\t\tlabel: groupLabels?.[key] ?? key,\n\t\t\t})),\n\t\t];\n\t}, [tabs, search.grouped, strings.tabAll, groupLabels]);\n\n\treturn (\n\t\t<div\n\t\t\tdata-component=\"global-search\"\n\t\t\tdata-slot=\"global-search\"\n\t\t\tclassName={cn('global-search--component',\n\t\t\t\t'@container/global-search overflow-hidden rounded-surface border border-border bg-card text-card-foreground shadow-xl',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{slots?.input ?? (\n\t\t\t\t<GlobalSearchInput\n\t\t\t\t\tvalue={query}\n\t\t\t\t\tonValueChange={onQueryChange}\n\t\t\t\t\tonKeyDown={search.onKeyDown}\n\t\t\t\t\tplaceholder={strings.placeholder}\n\t\t\t\t\tclearLabel={strings.clear}\n\t\t\t\t\tloading={loading}\n\t\t\t\t\tautoFocus={autoFocus}\n\t\t\t\t\texpanded={showResults}\n\t\t\t\t\tcontrols={groupKeys.map((_, groupIndex) => listboxIdFor(groupIndex)).join(' ')}\n\t\t\t\t\tactiveDescendant={activeOptionId}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{!loading && results.length > 0 && (\n\t\t\t\tslots?.tabs ?? (\n\t\t\t\t\t<GlobalSearchTabs<TGroup>\n\t\t\t\t\t\tvalue={search.activeTab}\n\t\t\t\t\t\tonValueChange={search.setActiveTab}\n\t\t\t\t\t\ttabs={resolvedTabs}\n\t\t\t\t\t\tcounts={search.tabCounts}\n\t\t\t\t\t/>\n\t\t\t\t)\n\t\t\t)}\n\n\t\t\t{/* A rem-based results viewport (32.5rem), so it follows the root text size. */}\n\t\t\t<div className=\"global-search--viewport max-h-130 overflow-y-auto\">\n\t\t\t\t{!!isIdle && (slots?.idle ?? (\n\t\t\t\t\tidleSections && idleSections.length > 0 ? (\n\t\t\t\t\t\t<GlobalSearchIdleState sections={idleSections} />\n\t\t\t\t\t) : null\n\t\t\t\t))}\n\n\t\t\t\t{!!loading && (slots?.loading ?? (\n\t\t\t\t\t<div className=\"global-search--loading flex items-center justify-center px-row-x py-space-xl\" role=\"status\">\n\t\t\t\t\t\t<Text type=\"secondary\">\n\t\t\t\t\t\t\t{strings.loading}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\n\t\t\t\t{!!isEmpty && (slots?.empty ?? (\n\t\t\t\t\t<GlobalSearchEmptyState\n\t\t\t\t\t\ttitle={interpolateString(strings.emptyTitle, { query })}\n\t\t\t\t\t\thint={strings.emptyHint}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\n\t\t\t\t{!loading && results.length > 0 && (\n\t\t\t\t\t<div className={cn('global-search--results', surfaceInsetClasses.compact)}>\n\t\t\t\t\t\t{Object.entries(search.visibleGrouped).map(([groupKey, items], groupIndex) => (\n\t\t\t\t\t\t\t<div key={groupKey} className=\"global-search--group\">\n\t\t\t\t\t\t\t\t<GlobalSearchGroupHeading\n\t\t\t\t\t\t\t\t\tlabel={groupLabels?.[groupKey as TGroup] ?? groupKey}\n\t\t\t\t\t\t\t\t\taction={search.activeTab === 'all' && items.length > 0 ? (\n\t\t\t\t\t\t\t\t\t\t<TextButton\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => search.setActiveTab(groupKey as TGroup)}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{strings.seeAll}\n\t\t\t\t\t\t\t\t\t\t</TextButton>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<ul\n\t\t\t\t\t\t\t\t\tid={listboxIdFor(groupIndex)}\n\t\t\t\t\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\t\t\t\t\taria-label={groupLabels?.[groupKey as TGroup] ?? groupKey}\n\t\t\t\t\t\t\t\t\tclassName=\"m-0 flex list-none flex-col p-0\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{items.map((item) => {\n\t\t\t\t\t\t\t\t\t\tconst isActive =\n\t\t\t\t\t\t\t\t\t\t\tsearch.flat[search.activeIdx]?.id === item.id;\n\t\t\t\t\t\t\t\t\t\tconst optionId = optionIdFor(flatIndexById.get(item.id) ?? -1);\n\t\t\t\t\t\t\t\t\t\tconst ctx = {\n\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\tquery,\n\t\t\t\t\t\t\t\t\t\t\tonSelect: () => onResultSelect?.(item),\n\t\t\t\t\t\t\t\t\t\t\toptionId,\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t// A custom row is wrapped as the option; the default row is one.\n\t\t\t\t\t\t\t\t\t\tif (slots?.renderResult) {\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<li key={item.id} id={optionId} role=\"option\" aria-selected={isActive}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{slots.renderResult(item, ctx)}\n\t\t\t\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<li key={item.id} role=\"none\">\n\t\t\t\t\t\t\t\t\t\t\t\t<GlobalSearchResultRow<TGroup>\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult={item}\n\t\t\t\t\t\t\t\t\t\t\t\t\tactive={isActive}\n\t\t\t\t\t\t\t\t\t\t\t\t\tquery={query}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={ctx.onSelect}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonMouseEnter={() =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsearch.setActiveById(item.id)\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\toptionId={optionId}\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</li>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{slots?.footer ?? (\n\t\t\t\t<GlobalSearchFooter\n\t\t\t\t\tnavigateLabel={strings.footerNavigate}\n\t\t\t\t\topenLabel={strings.footerOpen}\n\t\t\t\t\tcloseLabel={strings.footerClose}\n\t\t\t\t\ttrailing={\n\t\t\t\t\t\t!isIdle && !isEmpty && results.length > 0 ? (\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=\"xs\"\n\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\tclassName=\"tabular-nums\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{interpolateString(strings.resultsCount, {\n\t\t\t\t\t\t\t\t\tcount: results.length,\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t) : undefined\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","/**\n * GlobalSearchDialog — the command-palette presentation of `GlobalSearch`.\n *\n * `GlobalSearch` is a panel: it renders its own card chrome and expects to be\n * placed somewhere. The palette pattern it was clearly built for — `onClose`,\n * `autoFocus`, Escape handling — had no supported presentation, so every call\n * site hand-rolled the modal around it: a `fixed inset-0` backdrop and a\n * mousedown-outside handler, with no focus trap, no portal, no scroll lock and\n * no dialog role.\n *\n * It presents through `ActionDialog` rather than a raw `Dialog`, because\n * `features/overlays` is the package's single overlay surface and everything\n * modal is expected to come from it. Three of its seams carry the palette\n * shape: `visuallyHideHeader` keeps the accessible name without drawing a\n * heading, `showCloseButton={false}` drops the corner X that would otherwise\n * land on the search field, and the two action flags remove the footer.\n *\n * The surface itself is neutralised because `GlobalSearch` already draws the\n * card, and it anchors near the top rather than centring, which is where a\n * palette belongs.\n */\nimport { useMemo } from 'react';\n\nimport { ActionDialog } from '../overlays';\nimport { useStrings } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport { GlobalSearch, type GlobalSearchProps } from './global-search';\nimport { defaultGlobalSearchStrings } from './global-search.strings';\n\nexport interface GlobalSearchDialogProps<TGroup extends string = string>\n\textends Omit<GlobalSearchProps<TGroup>, 'onClose'> {\n\t/** Whether the palette is showing. */\n\topen: boolean;\n\t/** Open-state callback. Fires on Escape, backdrop click, and result selection. */\n\tonOpenChange: (open: boolean) => void;\n\t/** Classes for the dialog surface that positions the palette. */\n\tcontentClassName?: string;\n}\n\nexport function GlobalSearchDialog<TGroup extends string = string>({\n\topen,\n\tonOpenChange,\n\tcontentClassName,\n\tclassName,\n\tstrings: stringsProp,\n\tautoFocus = true,\n\t...searchProps\n}: GlobalSearchDialogProps<TGroup>) {\n\tconst strings = useStrings(defaultGlobalSearchStrings, stringsProp);\n\tconst close = useMemo(() => () => onOpenChange(false), [onOpenChange]);\n\n\treturn (\n\t\t<ActionDialog\n\t\t\topen={open}\n\t\t\tonOpenChange={onOpenChange}\n\t\t\ttitle={strings.dialogTitle}\n\t\t\tvisuallyHideHeader\n\t\t\tshowCloseButton={false}\n\t\t\tshowCancel={false}\n\t\t\tshowConfirm={false}\n\t\t\tclassName={cn(\n\t\t\t\t'global-search-dialog--component',\n\t\t\t\t// GlobalSearch draws the card, so the dialog surface carries none:\n\t\t\t\t// stacking both produced a border inside a border.\n\t\t\t\t'w-full max-w-2xl overflow-visible border-0 bg-transparent p-0 shadow-none sm:max-w-2xl',\n\t\t\t\t// A palette belongs near the top of the viewport, not centred in it.\n\t\t\t\t'top-24 translate-y-0',\n\t\t\t\tcontentClassName,\n\t\t\t)}\n\t\t\tcontentClassName=\"p-0\"\n\t\t>\n\t\t\t<GlobalSearch<TGroup>\n\t\t\t\t{...(searchProps as GlobalSearchProps<TGroup>)}\n\t\t\t\tstrings={stringsProp}\n\t\t\t\tautoFocus={autoFocus}\n\t\t\t\tonClose={close}\n\t\t\t\tclassName={className}\n\t\t\t/>\n\t\t</ActionDialog>\n\t);\n}\n\nGlobalSearchDialog.displayName = 'GlobalSearchDialog';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAoCA,IAAakC,IAAkD;CAC9D,aAAa;CACb,aAAa;CACb,OAAO;CACP,SAAS;CACT,YAAY;CACZ,WAAW;CACX,YAAY;CACZ,iBAAiB;CACjB,QAAQ;CACR,gBAAgB;CAChB,YAAY;CACZ,aAAa;CACb,cAAc;CACd,QAAQ;AACT;;;ACFA,SAAgBC,EAAgD,EAC/D,YACA,UACA,mBACA,cACiE;CACjE,IAAM,CAACC,GAAWC,KACjBC,EAAyB,KAAK,GACzB,CAACC,GAAWC,KAAgBF,EAAS,CAAC;CAI5C,QAAgB;EAEf,AADAD,EAAkB,KAAK,GACvBG,EAAa,CAAC;CACf,GAAG,CAACC,CAAK,CAAC;CAEV,IAAMC,IAAUC,QAAc;EAC7B,IAAMC,IAAwD,CAAC;EAC/D,KAAK,IAAMC,KAAKC,GACf,CAAC,EAAQD,EAAE,WAAW,CAAC,EAAA,CAAG,KAAKA,CAAC;EAEjC,OAAOD;CACR,GAAG,CAACE,CAAO,CAAC,GAENC,IAAYJ,QAAc;EAC/B,IAAMK,IAAiC,EAAE,KAAKF,EAAQ,OAAO;EAC7D,KAAK,IAAM,CAACG,GAAGC,MAAM,OAAO,QAAQR,CAAO,GAAG,EAAOO,KAAKC,EAAE;EAC5D,OAAOF;CACR,GAAG,CAACF,EAAQ,QAAQJ,CAAO,CAAC,GAEtBS,IAAiBR,QAAc;EACpC,IAAIP,MAAc,OAAO,OAAOM;EAChC,IAAMU,IAAMV,EAAQN;EACpB,OAAOgB,IAAO,GAAGhB,IAAsBgB,EAAI,IAAqD,CAAC;CAClG,GAAG,CAACV,GAASN,CAAS,CAAC,GAEjBiB,IAAOV,QACRP,MAAc,QAAcU,EAAQ,MAAM,IACvCJ,EAAQN,MAAwB,CAAC,GACtC;EAACA;EAAWM;EAASI;CAAO,CAAC,GAE1BQ,IAAeC,EAAOhB,CAAS;CACrC,EAAa,UAAUA;CACvB,IAAMiB,IAAUD,EAAOF,CAAI;CAoC3B,OAnCA,EAAQ,UAAUA,GAmCX;EACN;EACA;EACA;EACA,eArCqB,MAAwB;GAE7C,AADAhB,EAAkBoB,CAAG,GACrBjB,EAAa,CAAC;EACf;EAmCC;EACA;EACA;EACA;EACA,gBArCsB,MAAe;GACrC,IAAMkB,IAAMF,EAAQ,QAAQ,WAAW,MAAMX,EAAE,OAAOc,CAAE;GACxD,AAAID,KAAO,KAAGlB,EAAakB,CAAG;EAC/B;EAmCC,YA5BkB,MAA2B;GAC7C,IAAI,EAAE,QAAQ,aAEb,AADA,EAAE,eAAe,GACjBlB,GAAc,MAAM,KAAK,IAAIoB,IAAI,GAAGJ,EAAQ,QAAQ,SAAS,CAAC,CAAC;QACzD,IAAI,EAAE,QAAQ,WAEpB,AADA,EAAE,eAAe,GACjBhB,GAAc,MAAM,KAAK,IAAIoB,IAAI,GAAG,CAAC,CAAC;QAChC,IAAI,EAAE,QAAQ,SAAS;IAC7B,IAAMC,IAAOL,EAAQ,QAAQF,EAAa;IAC1C,AAAIO,MACH,EAAE,eAAe,GACjBC,IAAiBD,CAAI;GAEvB,OAAO,AAAI,EAAE,QAAQ,YACpBE,IAAU;EAEZ;EAaC,oBAlC0B;GAC1B,IAAMF,IAAOL,EAAQ,QAAQF,EAAa;GAC1C,AAAIO,KAAMC,IAAiBD,CAAI;EAChC;CAgCA;AACD;;;AC/HA,SAAgBG,EAAuB,EAAE,UAAO,WAAqC;CACpF,OACC,kBAACjC,GAAD;EACQ;EACP,aAAakC;EACb,OAAO,kBAACC,GAAD;GAAQ,WAAU;GAAY,eAAY;EAAQ,CAAA;EACzD,cAAa;EACb,SAAQ;EACR,WAAU;CACV,CAAA;AAEH;;;ACAA,SAASC,EAAS,EAAE,SAAM,YAA0C;CACnE,OACC,kBAAC,QAAD;EAAM,WAAU;EAAhB,UAAA,CACC,kBAAC,OAAD;GAAK,WAAWxD;GAAY,UAAAyD;EAAU,CAAA,GACtC,kBAAC/D,GAAD;GAAM,KAAI;GAAO,MAAK;GAAK,MAAK;GAC9B,UAAAgE;EACI,CAAA,CACD;;AAER;AAEA,SAAgBC,EAAmB,EAClC,kBACA,cACA,eACA,aACA,gBAC2B;CAC3B,OACC,kBAAC,OAAD;EACC,WAAWnE,EACV,mCACAW,EAAe,YACfJ,EAAsB,SAAS,QAC/B6D,CACD;EAEA,UAAA,kBAAC,OAAD;GAAK,WAAWpE,EAAG,uEAAuEW,EAAe,eAAe,6FAA6F;GAArN,UAAA,CACC,kBAAC,QAAD;IAAM,WAAU;IAAhB,UAAA;KACC,kBAACqD,GAAD;MAAU,MAAK;MAAK,OAAOK;KAAgB,CAAA;KAC3C,kBAACL,GAAD;MAAU,MAAK;MAAI,OAAOM;KAAY,CAAA;KACtC,kBAACN,GAAD;MAAU,MAAK;MAAM,OAAOO;KAAa,CAAA;IACpC;GACL,CAAA,GAAAC,IACA,kBAAC,QAAD;IAAM,WAAU;IACd,UAAAA;GACI,CAAA,IACH,IACA;;CACD,CAAA;AAEP;;;ACjDA,SAAgBC,EAAyB,EAAE,UAAO,MAAMC,GAAM,aAAyC;CACtG,OACC,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACC,kBAAC,QAAD;GAAM,WAAU;GAAhB,UAAA,CACE,CAAC,CAACA,KAAQ,kBAACA,GAAD;IAAM,WAAU;IAA8C,eAAY;GAAQ,CAAA,GAC7F,kBAACxE,GAAD;IAAM,KAAI;IAAO,MAAK;IAAK,MAAK;IAAY,QAAO;IAAS,YAAW;IAAQ,WAAU;IACvF,UAAAgE;GACI,CAAA,CACD;EACL,CAAA,GAAAS,CACG;;AAEP;;;ACNA,SAAgBC,EAAsB,EACrC,aACA,oBAC8B;CAC9B,OACC,kBAAC,OAAD;EAAK,WAAW5E,EAAG,uCAAuCS,EAAoB,OAAO;EACnF,UAAAoE,EAAS,KAAK,GAAS,MACvB,kBAAC,OAAD;GAAsB,WAAU;GAAhC,UAAA,CACC,kBAACJ,GAAD;IACC,OAAOK,EAAQ;IACf,MAAMA,EAAQ,SAASvB,MAAQ,IAAIwB,GAAe,SAASA,GAAe;GAC1E,CAAA,GACD,kBAAC,MAAD;IAAI,WAAU;IACZ,UAAAD,EAAQ,MAAM,KAAK,MAAS;KAC5B,IAAME,IAAWtB,EAAK,QAAQK;KAC9B,OACC,kBAAC,MAAD,EAAA,UACC,kBAAC,UAAD;MACC,MAAK;MACL,SAASL,EAAK;MACd,WAAW1D,EACV,GAAGa,EAAmB,kBAAkB,mFAAmFV,EAAa,MAAM,+BAC9IO,EAAqB,GACrBG,EAAmB,QACpB;MAPD,UAAA,CASC,kBAACmE,GAAD;OACC,WAAU;OACV,eAAY;MACZ,CAAA,GACD,kBAAC9E,GAAD;OAAM,KAAI;OAAO,MAAK;OAAU,QAAO;OAAS,YAAW;OAAQ,WAAU;OAC3E,UAAAwD,EAAK;MACD,CAAA,CACC;KACL,CAAA,EAAA,GAlBKA,EAAK,EAkBV;IAEN,CAAC;GACE,CAAA,CACA;EA/BK,GAAAoB,EAAQ,EA+Bb,CACL;CACG,CAAA;AAEP;;;ACpBA,IAAaG,IAAoBpF,EAAM,WAAqD,SAC3F,EAAE,UAAO,kBAAe,cAAW,gBAAa,gBAAa,gBAAgB,aAAU,IAAO,eAAY,IAAO,aAAU,aAAU,uBACrI,GACC;CACD,IAAMqF,IAAWrF,EAAM,OAAgC,IAAI;CAO3D,OANAgC,EAAM,oBAAoBsD,SAAWD,EAAS,OAA2B,GAEzErD,EAAM,gBAAgB;EACrB,AAAIuD,KAAWF,EAAS,SAAS,MAAM;CACxC,GAAG,CAACE,CAAS,CAAC,GAGb,kBAAC,OAAD;EACC,kBAAe;EACf,aAAU;EACV,WAAWpF,EAAG,4DAA4DW,EAAe,UAAU;EAEnG,UAAA,kBAACW,GAAD,EAAA,UAAA;GACC,kBAACE,GAAD,EAAA,UACC,kBAACuC,GAAD,EAAQ,eAAY,OAAQ,CAAA,EACZ,CAAA;GACjB,kBAACxC,GAAD;IACC,KAAK2D;IACL,MAAK;IACE;IACP,WAAW,MAAMG,EAAc,EAAE,OAAO,KAAK;IAClC;IACE;IACb,cAAYC;IACZ,GAAKC,MAAa,KAAA,IAAY,CAAC,IAAI;KAClC,MAAM;KACN,qBAAqB;KACrB,iBAAiBA;KACjB,iBAAiBA,IAAWC,IAAW,KAAA;KACvC,yBAAyBD,IAAWE,IAAmB,KAAA;IACxD;IACA,cAAa;IACb,YAAY;GACZ,CAAA;IACCC,KAAW,CAAC,CAACC,MACd,kBAACnE,GAAD;IAAiB,OAAM;IACrB,UAAAkE,IACA,kBAACE,IAAD;KAAS,WAAU;KAAe,eAAY;IAAQ,CAAA,IAEtD,kBAAC,UAAD;KACC,MAAK;KACL,eAAe;MAEd,AADAP,EAAc,EAAE,GAChBH,EAAS,SAAS,MAAM;KACzB;KACA,cAAYW;KACZ,WAAW7F,EAAGoB,EAAuB,QAAQA,EAAuB,OAAOA,EAAuB,KAAK;KAEvG,UAAA,kBAACC,GAAD;MAAiB,WAAWD,EAAuB;MAAM,eAAY;KAAQ,CAAA;IACtE,CAAA;GAEO,CAAA;EAEP,EAAA,CAAA;CACR,CAAA;AAEP,CAAC,GClGK0E,KAAS,MAAyB,GAAGzF,EAAY0F,EAAK,CAAC,KAAK,GAAG1F,EAAY0F,EAAK,CAAC,OAE1EC,IAAoD;CAChE,SAAS;CACT,SAASF,EAAM,SAAS;CACxB,SAASA,EAAM,SAAS;CACxB,SAASA,EAAM,SAAS;CACxB,MAAMA,EAAM,MAAM;CAClB,aAAaA,EAAM,aAAa;AACjC,GAEaG,KAAwD,EAAE,GAAGD,EAAgB;;;AC+B1F,SAASE,EAAe,GAAc,GAA4C;CACjF,IAAMC,KAAK7D,KAAS,GAAA,CAAI,KAAK;CAC7B,IAAI,CAAC6D,GAAG,OAAOC;CACf,IAAMC,IAAQD,EAAK,YAAY,GACzBE,IAAKH,EAAE,YAAY,GACnB1C,IAAI4C,EAAM,QAAQC,CAAE;CAE1B,OADI7C,IAAI,IAAU2C,IAEjB,kBAAAtG,IAAA,EAAA,UAAA;EACEsG,EAAK,MAAM,GAAG3C,CAAC;EAChB,kBAAC,QAAD;GAAM,WAAWnD,EAAY;GAC3B,UAAA8F,EAAK,MAAM3C,GAAGA,IAAI0C,EAAE,MAAM;EACtB,CAAA;EACLC,EAAK,MAAM3C,IAAI0C,EAAE,MAAM;CACvB,EAAA,CAAA;AAEJ;AAEA,SAAgBI,EAAsD,EACrE,WACA,YAAS,IACT,WAAQ,IACR,aACA,iBACA,aACA,gBACsC;CACtC,IAAMC,IAAYC,EAAO,WAAW,MAC9BC,IAAKV,GACLW,IAAKV,IAGLW,KAAmB,OACvBb,KAAQ,eAAe,cAAcc,IAAS,YAAY;CAE5D,OACC,kBAAC,UAAD;EACC,MAAK;EACL,kBAAe;EACf,aAAU;EACV,GAAKC,IAAW;GAAE,IAAIA;GAAU,MAAM;GAAU,iBAAiBD;GAAQ,UAAU;EAAG,IAAI,CAAC;EAC7E;EACd,SAASE;EACT,WAAW/G,EACV,GAAGa,EAAmB,kBAAkB,sGAAsGV,EAAa,MAAM,+BACjKO,EAAqB,GACrB,uCACAmG,IAAShG,EAAmB,cAAcA,EAAmB,UAC7DuD,CACD;EAbD,UAAA;GAgBC,kBAAC,OAAD;IAAK,WAAU;IACb,UAAAqC,EAAO,SACP,kBAACxF,GAAD;KAAQ,WAAWjB,EAAG,kBAAkB2G,EAAGF,EAAO,OAAO,QAAQ,YAAYG,EAAgBH,EAAO,OAAO,IAAI,CAAC;KAAhH,UAAA,CACEA,EAAO,OAAO,OACd,kBAACvF,GAAD;MAAa,KAAKuF,EAAO,OAAO;MAAK,KAAKA,EAAO;KAAQ,CAAA,GAE1D,kBAACzF,GAAD;MACC,WAAWhB,EAAG,yBAAyB2G,EAAGF,EAAO,OAAO,QAAQ,YAAYG,EAAgBH,EAAO,OAAO,IAAI,CAAC;MAE9G,UAAAA,EAAO,OAAO;KACA,CAAA,CACT;IACL,CAAA,IAAAD,IACH,kBAAC,QAAD;KACC,WAAWxG,EACV,yEACA0G,EAAGD,EAAO,WAAW,QAAQ,YAC7BG,EAAgBH,EAAO,WAAW,IAAI,CACvC;KAEA,UAAA,kBAACD,GAAD;MAAW,WAAU;MAAe,eAAY;KAAQ,CAAA;IACnD,CAAA,IACH;GACA,CAAA;GAGL,kBAACpG,GAAD;IAAO,KAAI;IAAQ,WAAU;IAA7B,UAAA,CACC,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACC,kBAACF,GAAD;MAAM,KAAI;MAAO,MAAK;MAAU,QAAO;MAAS,YAAW;MAAQ,WAAU;MAC3E,UAAAgG,EAAeO,EAAO,OAAOnE,CAAK;KAC9B,CAAA,GACL,CAAC,CAACmE,EAAO,SACT,kBAACtF,GAAD;MACC,MACCsF,EAAO,MAAM,SAAS,gBACnB,gBACAA,EAAO,MAAM;MAGhB,UAAAA,EAAO,MAAM;KACR,CAAA,CAEJ;IACG,CAAA,UAAA;KACP,IAAMO,IAAwD,CAAC;KA8D/D,OA7DIP,EAAO,YACVO,EAAO,KAAK;MACX,KAAK;MACL,MACC,kBAAC9G,GAAD;OAAM,KAAI;OAAO,MAAK;OAAK,MAAK;OAAY,WAAU;OACpD,UAAAgG,EAAeO,EAAO,UAAUnE,CAAK;MACjC,CAAA;KAER,CAAC,GACFmE,EAAO,MAAM,SAAS,GAAG,MAAM;MAC9B,IAAM/B,IAAOuC,EAAE;MACf,EAAO,KAAK;OACX,KAAK,KAAKxD;OACV,MACC,kBAACvD,GAAD;QACC,KAAI;QACJ,MAAK;QACL,MAAK;QACL,WAAWF,EACV,6DACAiH,EAAE,QAAQ,wBACX;QAPD,UAAA,CASE,CAAC,CAACvC,KAAQ,kBAACA,GAAD;SAAM,WAAU;SAAwB,eAAY;QAAQ,CAAA,GACtEuC,EAAE,KACE;;MAER,CAAC;KACF,CAAC,GACGR,EAAO,aACVO,EAAO,KAAK;MACX,KAAK;MACL,MAAM,kBAACjG,GAAD;OAAgB,MAAK;OAAK,WAAU;OAAgB,UAAA0F,EAAO;MAA0B,CAAA;KAC5F,CAAC,GACFA,EAAO,MAAM,SAAS,MACrBO,EAAO,KAAK;MACX,KAAK,KAAKE;MACT,MAAM,kBAAChH,GAAD;OAAM,KAAI;OAAO,MAAK;OAAK,MAAK;OAAY,WAAU;OAAuB,UAAAgH;MAAU,CAAA;KAC/F,CAAC,CACF,GACIT,EAAO,cACVO,EAAO,KAAK;MACX,KAAK;MACL,MACE,kBAAClG,GAAD;OAAO,MAAK;OAAU,QAAO;OAAS,WAAU;OAAhD,UAAA,CACC2F,EAAO,YACP,CAAC,CAACA,EAAO,cACT,kBAACvG,GAAD;QACC,KAAI;QACJ,MAAK;QACL,MAAK;QAGJ,UAAAuG,EAAO,WAAW,YAAY;OAC1B,CAAA,CAED;;KAET,CAAC,GAEEO,EAAO,WAAW,IAAU,OAE/B,kBAAC,OAAD;MAAK,WAAU;MACb,UAAAA,EAAO,KAAK,GAAG,MACf,kBAAC,QAAD;OAAkB,WAAWhH,EAAG,8DAA8DmH,EAAE,QAAQ,QAAQ,0BAA0B;OAA1I,UAAA,CACE1D,IAAI,KACJ,kBAACvD,GAAD;QACC,KAAI;QACJ,MAAK;QACL,MAAK;QACL,eAAY;QACb,WAAU;QACT,UAAA;OAEK,CAAA,GAENiH,EAAE,IACE;MAbK,GAAAA,EAAE,GAaP,CACN;KACG,CAAA;IAEP,EAAA,CAAG,CACG;;GAGN,CAAC,EAAEV,EAAO,cAAcA,EAAO,eAC/B,kBAAC,OAAD;IAAK,WAAU;IACd,UAAA,kBAACrG,GAAD;KAAO,KAAI;KAAQ,OAAM;KAAM,WAAU;KAAzC,UAAA,CACE,CAAC,CAACqG,EAAO,cACT,kBAAC3F,GAAD;MACC,MAAK;MACL,QAAO;MACP,WAAU;MAET,UAAA2F,EAAO;KACF,CAAA,GAEP,CAAC,CAACA,EAAO,cACT,kBAACvG,GAAD;MACC,KAAI;MACJ,MAAK;MACL,MAAK;MACL,WAAU;MAET,UAAAuG,EAAO;KACH,CAAA,CAED;;GACH,CAAA;GAIN,kBAACW,IAAD;IACC,eAAY;IACZ,WAAWpH,EACV,yCACA6G,IACG,6BACA,6DACJ;GACA,CAAA;EACM;;AAEV;;;ACrPA,SAAgBQ,EAAiD,EAChE,UACA,kBACA,SACA,aACiC;CACjC,OACC,kBAAC,OAAD;EAAK,WAAWrH,EAAG,iCAAiCO,EAAsB,SAAS,MAAM;EACxF,UAAA,kBAAC,OAAD;GAAK,WAAWP,EAAG,6HAA6HW,EAAe,UAAU;GACxK,UAAA,kBAACgB,GAAD;IACQ;IACP,gBAAgB,MAAM0D,EAActC,CAAmB;IACvD,WAAU;IAEV,UAAA,kBAACrB,GAAD;KAAU,WAAU;KAClB,UAAA4F,EAAK,KAAK,MAAQ;MAClB,IAAMC,IAAQ1E,EAAOS,EAAI,UAAoB;MAC7C,OACC,kBAAC7B,GAAD;OAEC,OAAO6B,EAAI;OACX,WAAU;OAHX,UAAA,CAKC,kBAACpD,GAAD;QAAM,KAAI;QACR,UAAAoD,EAAI;OACA,CAAA,GACN,kBAACnC,GAAD;QAAO,MAAK;QAAK,MAAK;QAAY,WAAU;QAC1C,UAAAoG;OACK,CAAA,CACK;MAVP,GAAAjE,EAAI,KAUG;KAEf,CAAC;IACQ,CAAA;GACL,CAAA;EACF,CAAA;CACD,CAAA;AAEP;;;ACcA,SAAgBkE,EAA6C,EAC5D,aAAU,CAAC,GACX,UACA,kBACA,mBACA,YACA,aAAU,IACV,iBACA,gBACA,eAAY,IACZ,SAASC,GACT,UACA,SACA,gBAC6B;CAC7B,IAAMC,IAAUC,EAAW5F,GAA4B0F,CAAW,GAE5DG,IAAS5F,EAAwB;EACtC;EACA;EACA;EACA;CACD,CAAC,GAEK6F,IACL,CAACnC,KAAWpD,EAAM,KAAK,CAAC,CAAC,SAAS,KAAKK,EAAQ,WAAW,GACrDmF,IAAS,CAACpC,KAAWpD,EAAM,KAAK,CAAC,CAAC,UAAU,GAI5CyF,IAAgBhI,EAAM,MAAM,GAC5BiI,IAAc,CAACtC,KAAW/C,EAAQ,SAAS,GAC3CsF,IAAgB,IAAI,IAAIL,EAAO,KAAK,KAAK,GAAM,MAAU,CAAClE,EAAK,IAAIwE,CAAK,CAAC,CAAC,GAC1EC,KAAe,MAAkB,GAAGJ,EAAc,UAAUG,KAC5DE,IAAY,OAAO,KAAKR,EAAO,cAAc,GAC7CS,KAAgB,MAAuB,GAAGN,EAAc,SAASO,KACjEC,IAAiBP,KAAeJ,EAAO,KAAKA,EAAO,aAAaO,EAAYP,EAAO,SAAS,IAAI,KAAA,GAEhGY,IAAezI,EAAM,cAEnB;EACP,IAAIuH,GAAM,OAAOA;EACjB,IAAMc,IAAY,OAAO,KAAKR,EAAO,OAAO;EAC5C,OAAO,CACN;GAAE,OAAO;GAAO,OAAOF,EAAQ;EAAO,GACtC,GAAGU,EAAU,KAAK,OAAS;GAC1B,OAAOK;GACP,OAAOC,IAAcD,MAAQA;EAC9B,EAAE,CACH;CACD,GAAG;EAACnB;EAAMM,EAAO;EAASF,EAAQ;EAAQgB;CAAW,CAAC;CAEtD,OACC,kBAAC,OAAD;EACC,kBAAe;EACf,aAAU;EACV,WAAW1I,EAAG,4BACb,wHACAoE,CACD;EAND,UAAA;GAQEuE,GAAO,SACP,kBAAC1D,GAAD;IACC,OAAO3C;IACP,eAAesG;IACf,WAAWhB,EAAO;IAClB,aAAaF,EAAQ;IACrB,YAAYA,EAAQ;IACX;IACE;IACX,UAAUM;IACV,UAAUI,EAAU,KAAK,GAAG,MAAeC,EAAaC,CAAU,CAAC,CAAC,CAAC,KAAK,GAAG;IAC7E,kBAAkBC;GAClB,CAAA;GAGD,CAAC7C,KAAW/C,EAAQ,SAAS,MAC7BgG,GAAO,QACN,kBAACtB,GAAD;IACC,OAAOO,EAAO;IACd,eAAeA,EAAO;IACtB,MAAMY;IACN,QAAQZ,EAAO;GACf,CAAA;GAKH,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,CAAC,CAACE,MAAWa,GAAO,SACpBE,KAAgBA,EAAa,SAAS,IACrC,kBAACjE,GAAD,EAAuB,UAAUiE,EAAe,CAAA,IAC7C;KAGJ,CAAC,CAACnD,MAAYiD,GAAO,WACrB,kBAAC,OAAD;MAAK,WAAU;MAA+E,MAAK;MAClG,UAAA,kBAACzI,GAAD;OAAM,MAAK;OACT,UAAAwH,EAAQ;MACJ,CAAA;KACF,CAAA;KAGL,CAAC,CAACG,MAAYc,GAAO,SACrB,kBAAC9E,GAAD;MACC,OAAOiF,EAAkBpB,EAAQ,YAAY,EAAE,SAAM,CAAC;MACtD,MAAMA,EAAQ;KACd,CAAA;KAGD,CAAChC,KAAW/C,EAAQ,SAAS,KAC7B,kBAAC,OAAD;MAAK,WAAW3C,EAAG,0BAA0BS,EAAoB,OAAO;MACtE,UAAA,OAAO,QAAQmH,EAAO,cAAc,CAAC,CAAC,KAAK,CAACmB,GAAUC,IAAQ,MAC9D,kBAAC,OAAD;OAAoB,WAAU;OAA9B,UAAA,CACC,kBAACvE,GAAD;QACC,OAAOiE,IAAcK,MAAuBA;QAC5C,QAAQnB,EAAO,cAAc,SAASoB,EAAM,SAAS,IACpD,kBAAC/I,GAAD;SACC,MAAK;SACL,MAAK;SACL,eAAe2H,EAAO,aAAamB,CAAkB;SACrD,WAAU;SAET,UAAArB,EAAQ;QACE,CAAA,IACT;OACJ,CAAA,GACD,kBAAC,MAAD;QACC,IAAIW,EAAaC,CAAU;QAC3B,MAAK;QACL,cAAYI,IAAcK,MAAuBA;QACjD,WAAU;QAET,UAAAC,EAAM,KAAK,MAAS;SACpB,IAAMC,IACLrB,EAAO,KAAKA,EAAO,UAAU,EAAE,OAAOlE,EAAK,IACtCoD,IAAWqB,EAAYF,EAAc,IAAIvE,EAAK,EAAE,KAAK,EAAE,GACvDwF,IAAM;UACX;UACA;UACA,gBAAgBvF,IAAiBD,CAAI;UACrC;SACD;SASA,OAPIiF,GAAO,eAET,kBAAC,MAAD;UAAkB,IAAI7B;UAAU,MAAK;UAAS,iBAAemC;UAC3D,UAAAN,EAAM,aAAajF,GAAMwF,CAAG;SAC1B,GAFKxF,EAAK,EAEV,IAIL,kBAAC,MAAD;UAAkB,MAAK;UACtB,UAAA,kBAAC6C,GAAD;WACC,QAAQ7C;WACR,QAAQuF;WACD;WACP,UAAUC,EAAI;WACd,oBACCtB,EAAO,cAAclE,EAAK,EAAE;WAEnB;UACV,CAAA;SACE,GAXKA,EAAK,EAWV;QAEN,CAAC;OACE,CAAA,CACA;MAtDK,GAAAqF,CAsDL,CACL;KACG,CAAA;IAEF;;GAEJJ,GAAO,UACP,kBAACxE,GAAD;IACC,eAAeuD,EAAQ;IACvB,WAAWA,EAAQ;IACnB,YAAYA,EAAQ;IACpB,UACC,CAACI,KAAU,CAACD,KAAWlF,EAAQ,SAAS,IACvC,kBAACzC,GAAD;KACC,KAAI;KACJ,MAAK;KACL,MAAK;KACL,WAAU;KAET,UAAA4I,EAAkBpB,EAAQ,cAAc,EACxC,OAAO/E,EAAQ,OAChB,CAAC;IACI,CAAA,IACH,KAAA;GAEL,CAAA;EAEE;;AAEP;;;ACzOA,SAAgBwG,EAAmD,EAClE,SACA,iBACA,qBACA,cACA,SAAS1B,GACT,eAAY,IACZ,GAAG2B,KACgC;CACnC,IAAM1B,IAAUC,EAAW5F,GAA4B0F,CAAW,GAC5D4B,IAAQ7G,cAAoB8G,EAAa,EAAK,GAAG,CAACA,CAAY,CAAC;CAErE,OACC,kBAAC1I,GAAD;EACO;EACQ;EACd,OAAO8G,EAAQ;EACf,oBAAA;EACA,iBAAiB;EACjB,YAAY;EACZ,aAAa;EACb,WAAW1H,EACV,mCAGA,0FAEA,wBACAuJ,CACD;EACA,kBAAiB;EAEjB,UAAA,kBAAC/B,GAAD;GACC,GAAK4B;GACL,SAAS3B;GACE;GACX,SAAS4B;GACE;EACX,CAAA;CACY,CAAA;AAEhB;AAEA,EAAmB,cAAc"}
|
package/dist/features/kanban.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useStrings as e } from "../lib/strings.js";
|
|
3
|
-
import { t } from "../utils-
|
|
4
|
-
import { n } from "../buttons-
|
|
5
|
-
import { c as r } from "../typography-
|
|
3
|
+
import { t } from "../utils-B6kKb8jB.js";
|
|
4
|
+
import { n } from "../buttons-BedGfygC.js";
|
|
5
|
+
import { c as r } from "../typography-BQnine1k.js";
|
|
6
6
|
import { i } from "../tone-recipes-BPsRAvhu.js";
|
|
7
|
-
import { i as a } from "../popover.recipes-
|
|
8
|
-
import { n as o } from "../action-menu-
|
|
7
|
+
import { i as a } from "../popover.recipes-DdiEp0rd.js";
|
|
8
|
+
import { n as o } from "../action-menu-Dr8K-ghE.js";
|
|
9
9
|
import { createContext as s, forwardRef as c, useCallback as l, useContext as u, useEffect as d, useLayoutEffect as f, useMemo as p, useRef as m, useState as h } from "react";
|
|
10
10
|
import { jsx as g, jsxs as _ } from "react/jsx-runtime";
|
|
11
11
|
import { DndContext as v, DragOverlay as y, KeyboardSensor as b, PointerSensor as x, useDroppable as S, useSensor as C, useSensors as w } from "@dnd-kit/core";
|
|
@@ -390,7 +390,6 @@ function K({ className: t, icon: n, ariaLabel: r }) {
|
|
|
390
390
|
srText: r ?? c.itemActionsAria,
|
|
391
391
|
width: a.xs,
|
|
392
392
|
align: "end",
|
|
393
|
-
density: "table",
|
|
394
393
|
buttonProps: {
|
|
395
394
|
className: t,
|
|
396
395
|
"data-slot": "kanban-item-actions-trigger",
|
|
@@ -407,7 +406,7 @@ function q({ className: e, render: n }) {
|
|
|
407
406
|
item: a,
|
|
408
407
|
columnId: s(o)?.columnId ?? null
|
|
409
408
|
}) : /* @__PURE__ */ g("div", {
|
|
410
|
-
className: t("kanban-overlay--component pointer-events-none rounded-
|
|
409
|
+
className: t("kanban-overlay--component pointer-events-none rounded-surface border-2 border-dashed p-surface shadow-lg", i.primary.edge, i.primary.wash, e),
|
|
411
410
|
children: /* @__PURE__ */ g(r, {
|
|
412
411
|
tag: "span",
|
|
413
412
|
size: "xs",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kanban.js","names":["Text","popoverWidthRecipes","ActionMenu","getKanbanKeyboardPosition","ids","columns","columnIndex","position","key","nextId","createKanbanKeyboardCoordinates","event","active","context","destination","findItem","next","value","onPositionChange","item","id","getItemValue","rect","activeRect","currentCoordinates","useKanban","useCallback","columnId","items","index","move","found","itemId","toColumnId","fromColumnId","fromIndex","targetItems","resolvedToIndex","toIndex","sourceCopy","targetCopy","landingIndex","onValueChange","onItemMove","useMemo","KanbanContext","createContext","KanbanContextProvider","useKanbanContext","ctx","useContext","KanbanItemContext","KanbanItemContextProvider","useKanbanItemContext","defaultKanbanStrings","interpolateKanbanString","params","acc","template","Kanban","stringsProp","strings","useStrings","activeId","setActiveId","useState","boardRef","useRef","keyboardFocusId","node","handle","dragOrigin","completedDestination","keyboardPosition","setKeyboardPosition","keyboardDestination","keyboardCoordinates","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","activeItem","handleDragStart","getItemLabel","handleDragEnd","source","over","overData","overId","targetColumnId","ctxValue","itemActions","onItemClick","announcementParams","origin","columnName","getColumnLabel","DndContext","cn","className","children","KanbanBoard","KanbanColumn","useDroppable","setNodeRef","isOver","KanbanColumnContent","SortableContext","verticalListSortingStrategy","KanbanItem","useSortable","style","CSS","transform","isDragging","handleCount","setHandleCount","hasHandle","registerHandle","count","itemCtx","listeners","attributes","setActivatorNodeRef","rootClick","handleClick","onClick","isClickable","KanbanItemHandle","forwardRef","setMergedRef","forwardedRef","Button","KanbanItemActions","rawActions","actions","visible","action","disabled","menuActions","icon","ariaLabel","KanbanOverlay","DragOverlay","render","toneRecipes"],"sources":["../../src/components/features/kanban/kanban-keyboard.ts","../../src/components/features/kanban/hooks/use-kanban.ts","../../src/components/features/kanban/kanban-context.tsx","../../src/components/features/kanban/kanban.strings.ts","../../src/components/features/kanban/kanban.tsx"],"sourcesContent":["import type { KeyboardCoordinateGetter } from '@dnd-kit/core';\n\nexport interface KanbanKeyboardPosition { columnId: string; index: number }\n\n/** Resolve arrow movement from board order, including columns with no cards. */\nexport function getKanbanKeyboardPosition(\n\tcolumns: Record<string, unknown[]>,\n\tposition: KanbanKeyboardPosition,\n\tkey: string,\n): KanbanKeyboardPosition {\n\tconst ids = Object.keys(columns);\n\tconst columnIndex = ids.indexOf(position.columnId);\n\tif (key === 'ArrowLeft' || key === 'ArrowRight') {\n\t\tconst nextId = ids[columnIndex + (key === 'ArrowRight' ? 1 : -1)];\n\t\treturn nextId ? { columnId: nextId, index: Math.min(position.index, columns[nextId].length) } : position;\n\t}\n\tif (key === 'ArrowUp' || key === 'ArrowDown') {\n\t\treturn { columnId: position.columnId, index: Math.max(0, Math.min(columns[position.columnId].length - 1, position.index + (key === 'ArrowDown' ? 1 : -1))) };\n\t}\n\treturn position;\n}\n\nexport function createKanbanKeyboardCoordinates(\n\tvalue: Record<string, unknown[]>,\n\tgetItemValue: (item: unknown) => string,\n\tfindItem: (id: string) => KanbanKeyboardPosition | undefined,\n\tdestination: { current: KanbanKeyboardPosition | null },\n\tonPositionChange?: (position: KanbanKeyboardPosition) => void,\n): KeyboardCoordinateGetter {\n\treturn (event, { currentCoordinates, context }) => {\n\t\tif (!['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.code)) return undefined;\n\t\tconst active = context.active;\n\t\tif (!active) return undefined;\n\t\tconst position = destination.current ?? findItem(String(active.id));\n\t\tif (!position) return undefined;\n\t\tevent.preventDefault();\n\t\tconst next = getKanbanKeyboardPosition(value, position, event.code);\n\t\tdestination.current = next;\n\t\tonPositionChange?.(next);\n\t\tconst item = value[next.columnId][next.index];\n\t\tconst id = item === undefined ? next.columnId : getItemValue(item);\n\t\tconst rect = context.droppableRects.get(id);\n\t\tconst activeRect = context.collisionRect;\n\t\tif (!rect || !activeRect) return currentCoordinates;\n\t\treturn {\n\t\t\tx: currentCoordinates.x + rect.left - activeRect.left,\n\t\t\ty: currentCoordinates.y + rect.top - activeRect.top,\n\t\t};\n\t};\n}\n","import { useCallback, useMemo } from 'react';\n\nimport type { KanbanItemMoveEvent, KanbanValue } from '../kanban.types';\n\n/**\n * Headless hook — exposes the same state machine `<Kanban>` uses\n * internally so consumers can build a fully custom UI against it.\n *\n * const { findItem, move } = useKanban({ value, onValueChange,\n * getItemValue });\n * move({ itemId: 'card-1', toColumnId: 'shipped', toIndex: 0 });\n */\nexport interface UseKanbanOptions<T> {\n\tvalue: KanbanValue<T>;\n\tonValueChange: (next: KanbanValue<T>) => void;\n\tgetItemValue: (item: T) => string;\n\tonItemMove?: (event: KanbanItemMoveEvent<T>) => void;\n}\n\nexport interface UseKanbanResult<T> {\n\tfindItem: (id: string) => { columnId: string; index: number; item: T } | undefined;\n\t/**\n\t * Move an item between columns / within the same column. Idempotent:\n\t * a no-op move is safe.\n\t */\n\tmove: (input: { itemId: string; toColumnId: string; toIndex?: number }) => void;\n}\n\nexport function useKanban<T>({\n\tvalue,\n\tonValueChange,\n\tgetItemValue,\n\tonItemMove,\n}: UseKanbanOptions<T>): UseKanbanResult<T> {\n\tconst findItem = useCallback(\n\t\t(id: string) => {\n\t\t\tfor (const [columnId, items] of Object.entries(value)) {\n\t\t\t\tconst index = items.findIndex((item) => getItemValue(item) === id);\n\t\t\t\tif (index >= 0) return { columnId, index, item: items[index] };\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t\t[value, getItemValue],\n\t);\n\n\tconst move = useCallback(\n\t\t({ itemId, toColumnId, toIndex }: { itemId: string; toColumnId: string; toIndex?: number }) => {\n\t\t\tconst found = findItem(itemId);\n\t\t\tif (!found) return;\n\t\t\tif (!Object.prototype.hasOwnProperty.call(value, toColumnId)) return;\n\n\t\t\tconst { columnId: fromColumnId, index: fromIndex, item } = found;\n\n\t\t\t// Same column, same slot — nothing to do.\n\t\t\tconst targetItems = value[toColumnId];\n\t\t\tconst resolvedToIndex =\n\t\t\t\ttoIndex === undefined\n\t\t\t\t\t? targetItems.length\n\t\t\t\t\t: Math.max(0, Math.min(toIndex, targetItems.length));\n\n\t\t\tif (fromColumnId === toColumnId && fromIndex === resolvedToIndex) return;\n\n\t\t\tconst next: KanbanValue<T> = { ...value };\n\t\t\tconst sourceCopy = [...next[fromColumnId]];\n\t\t\tsourceCopy.splice(fromIndex, 1);\n\t\t\tnext[fromColumnId] = sourceCopy;\n\n\t\t\tconst targetCopy = [...(fromColumnId === toColumnId ? sourceCopy : next[toColumnId])];\n\t\t\t// When moving within the same column to a later index, the splice\n\t\t\t// above shifted everything left — re-resolve the destination.\n\t\t\tlet landingIndex = resolvedToIndex;\n\t\t\tif (fromColumnId === toColumnId && fromIndex < resolvedToIndex) {\n\t\t\t\tlandingIndex = Math.max(0, resolvedToIndex - 1);\n\t\t\t}\n\t\t\ttargetCopy.splice(landingIndex, 0, item);\n\t\t\tnext[toColumnId] = targetCopy;\n\n\t\t\tonValueChange(next);\n\t\t\tonItemMove?.({\n\t\t\t\titem,\n\t\t\t\titemId,\n\t\t\t\tfrom: { columnId: fromColumnId, index: fromIndex },\n\t\t\t\tto: { columnId: toColumnId, index: landingIndex },\n\t\t\t});\n\t\t},\n\t\t[value, findItem, onValueChange, onItemMove],\n\t);\n\n\treturn useMemo(() => ({ findItem, move }), [findItem, move]);\n}\n","import { createContext, useContext } from 'react';\n\nimport type { KanbanContextShape } from './kanban.types';\n\n/**\n * Internal context for the Kanban — the parts use this to read\n * shared state (current value, getItemValue, active drag id).\n */\nconst KanbanContext = createContext<KanbanContextShape | null>(null);\n\nexport const KanbanContextProvider = KanbanContext.Provider;\n\nexport function useKanbanContext<T = unknown>(): KanbanContextShape<T> {\n\tconst ctx = useContext(KanbanContext);\n\tif (!ctx) {\n\t\tthrow new Error(\n\t\t\t'Kanban subcomponents must be rendered inside a <Kanban> root.',\n\t\t);\n\t}\n\treturn ctx as unknown as KanbanContextShape<T>;\n}\n\n/**\n * Internal context exposed by `<KanbanItem>` so the optional\n * `<KanbanItemHandle>` knows which listeners + accessibility props to\n * wire to the dedicated drag handle. Also carries the resolved\n * domain item so `<KanbanItemActions>` (and any other item-aware\n * subcomponent) can render per-item content without prop drilling.\n *\n * The dnd-kit shapes are widened to `unknown` so consumers can spread\n * them onto any HTMLElement.\n */\nexport interface KanbanItemContextShape<T = unknown> {\n\tlisteners: unknown;\n\tattributes: unknown;\n\tsetActivatorNodeRef: (node: HTMLElement | null) => void;\n\tregisterHandle: () => () => void;\n\t/** Stable id (the value returned by `getItemValue`). */\n\titemId: string;\n\t/** The domain item itself — null if it can't be resolved. */\n\titem: T | null;\n}\n\nconst KanbanItemContext = createContext<KanbanItemContextShape | null>(null);\n\nexport const KanbanItemContextProvider = KanbanItemContext.Provider;\n\nexport function useKanbanItemContext<T = unknown>(): KanbanItemContextShape<T> {\n\tconst ctx = useContext(KanbanItemContext);\n\tif (!ctx) {\n\t\tthrow new Error(\n\t\t\t'<KanbanItemHandle> / <KanbanItemActions> must be rendered inside a <KanbanItem>.',\n\t\t);\n\t}\n\treturn ctx as KanbanItemContextShape<T>;\n}\n","/**\n * Strings for the Kanban — drag-and-drop screen-reader announcements\n * + accessibility labels. The library never renders user-visible copy\n * that the consumer hasn't already supplied via column headers / item\n * children, so the strings here are exclusively for assistive tech.\n */\nexport interface KanbanStrings {\n\t/** Read by screen readers when a drag begins. `{name}` = item label (or ID). */\n\tannounceDragStart: string;\n\t/** Read when an item moves over a column. `{from}` / `{to}` are column labels; `{position}` is one-based. */\n\tannounceDragMove: string;\n\t/** Read when an item is dropped into a column. */\n\tannounceDragEnd: string;\n\t/** Read when the user cancels a drag with Escape. */\n\tannounceDragCancel: string;\n\t/** Aria label on the drag handle. */\n\tdragHandleAria: string;\n\t/** Aria label on the board landmark. */\n\tboardAria: string;\n\t/** Aria label on the per-item actions trigger (`⋯`). */\n\titemActionsAria: string;\n}\n\nexport const defaultKanbanStrings: KanbanStrings = {\n\tannounceDragStart: 'Picked up item {name}.',\n\tannounceDragMove: 'Moving {name} from {from} to {to}, position {position}.',\n\tannounceDragEnd: 'Dropped {name} into {to}, position {position}.',\n\tannounceDragCancel: 'Cancelled drag of {name}.',\n\tdragHandleAria: 'Drag handle',\n\tboardAria: 'Kanban board',\n\titemActionsAria: 'Item actions',\n};\n\nexport function interpolateKanbanString(\n\ttemplate: string,\n\tparams: Record<string, string>,\n): string {\n\treturn Object.entries(params).reduce(\n\t\t(acc, [key, value]) => acc.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), value),\n\t\ttemplate,\n\t);\n}\n","/**\n * Kanban — drag-and-drop board with multi-column item sorting and\n * cross-column moves. Headless behavior comes from `@dnd-kit/core` +\n * `@dnd-kit/sortable`; the library wires it into a callback-driven,\n * generic-T API:\n *\n * <Kanban\n * value={columns}\n * onValueChange={setColumns}\n * getItemValue={(c) => c.id}\n * onItemMove={(e) => api.persistMove(e)}\n * >\n * <KanbanBoard className=\"grid grid-cols-3 gap-3\">\n * {Object.entries(columns).map(([colId, items]) => (\n * <KanbanColumn key={colId} value={colId}>\n * <header>{COLUMNS[colId].title}</header>\n * <KanbanColumnContent value={colId}>\n * {items.map((card) => (\n * <KanbanItem key={card.id} value={card.id}>\n * …card body…\n * </KanbanItem>\n * ))}\n * </KanbanColumnContent>\n * </KanbanColumn>\n * ))}\n * </KanbanBoard>\n * <KanbanOverlay />\n * </Kanban>\n *\n * The library never reaches into a router, never persists state — your\n * `onValueChange` is the source of truth. Use `onItemMove` for\n * analytics / optimistic-update plumbing.\n */\nimport {\n\tDndContext,\n\tDragOverlay,\n\tPointerSensor,\n\tKeyboardSensor,\n\tuseDroppable,\n\tuseSensor,\n\tuseSensors,\n\ttype DragEndEvent,\n\ttype DragStartEvent,\n} from '@dnd-kit/core';\nimport {\n\tSortableContext,\n\tuseSortable,\n\tverticalListSortingStrategy,\n} from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { forwardRef, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, type MouseEvent } from 'react';\n\nimport { Button } from '../../base/buttons';\nimport { ActionMenu, type ActionMenuAction } from '../../base/action-menu';\nimport { Text } from '../../typography';\nimport { useStrings } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport { createKanbanKeyboardCoordinates, type KanbanKeyboardPosition } from './kanban-keyboard';\nimport { useKanban } from './hooks/use-kanban';\nimport {\n\tKanbanContextProvider,\n\tKanbanItemContextProvider,\n\tuseKanbanContext,\n\tuseKanbanItemContext,\n} from './kanban-context';\nimport { defaultKanbanStrings, interpolateKanbanString } from './kanban.strings';\nimport type {\n\tKanbanBoardProps,\n\tKanbanColumnContentProps,\n\tKanbanColumnProps,\n\tKanbanItemAction,\n\tKanbanItemActionsConfig,\n\tKanbanItemActionsProps,\n\tKanbanItemHandleProps,\n\tKanbanItemProps,\n\tKanbanOverlayProps,\n\tKanbanProps,\n} from './kanban.types';\nimport { toneRecipes } from '../../../lib/tone-recipes';\nimport { popoverWidthRecipes } from '../../base/popover/popover.recipes';\n\nexport function Kanban<T>({\n\tvalue,\n\tonValueChange,\n\tgetItemValue,\n\tgetItemLabel,\n\tgetColumnLabel,\n\tonItemMove,\n\titemActions,\n\tonItemClick,\n\tstrings: stringsProp,\n\tclassName,\n\tchildren,\n}: KanbanProps<T>) {\n\tconst strings = useStrings(defaultKanbanStrings, stringsProp);\n\tconst { findItem, move } = useKanban({\n\t\tvalue,\n\t\tonValueChange,\n\t\tgetItemValue,\n\t\tonItemMove,\n\t});\n\tconst [activeId, setActiveId] = useState<string | null>(null);\n\n\tconst boardRef = useRef<HTMLDivElement | null>(null);\n\tconst keyboardFocusId = useRef<string | null>(null);\n\tuseLayoutEffect(() => {\n\t\tif (activeId || !keyboardFocusId.current) return;\n\t\tconst item = Array.from(boardRef.current?.querySelectorAll<HTMLElement>('[data-kanban-item-id]') ?? []).find(node => node.dataset.kanbanItemId === keyboardFocusId.current);\n\t\tconst handle = item?.querySelector<HTMLElement>('[data-slot=\"kanban-item-handle\"]') ?? item;\n\t\tif (handle) { handle.focus(); keyboardFocusId.current = null; }\n\t}, [activeId, value]);\n\tconst dragOrigin = useRef<{ columnId: string; index: number; name: string } | null>(null);\n\tconst completedDestination = useRef<KanbanKeyboardPosition | null>(null);\n\tconst [keyboardPosition, setKeyboardPosition] = useState<KanbanKeyboardPosition | null>(null);\n\tconst keyboardDestination = useRef<KanbanKeyboardPosition | null>(null);\n\tconst keyboardCoordinates = useMemo(() => createKanbanKeyboardCoordinates(\n\t\tvalue, getItemValue as (item: unknown) => string, findItem, keyboardDestination, setKeyboardPosition,\n\t), [value, getItemValue, findItem]);\n\tconst sensors = useSensors(\n\t\tuseSensor(PointerSensor, { activationConstraint: { distance: 6 } }),\n\t\tuseSensor(KeyboardSensor, { coordinateGetter: keyboardCoordinates }),\n\t);\n\n\tconst activeItem = useMemo(\n\t\t() => (activeId ? findItem(activeId)?.item ?? null : null),\n\t\t[activeId, findItem],\n\t);\n\n\tconst handleDragStart = useCallback(\n\t\t(event: DragStartEvent) => {\n\t\t\tconst item = findItem(String(event.active.id));\n\t\t\tdragOrigin.current = item ? { columnId: item.columnId, index: item.index, name: getItemLabel?.(item.item) ?? String(event.active.id) } : null;\n\t\t\tcompletedDestination.current = null;\n\t\t\tsetKeyboardPosition(null);\n\t\t\tkeyboardDestination.current = null;\n\t\t\tkeyboardFocusId.current = event.activatorEvent instanceof KeyboardEvent ? String(event.active.id) : null;\n\t\t\tsetActiveId(String(event.active.id));\n\t\t},\n\t\t[findItem, getItemLabel],\n\t);\n\n\tconst handleDragEnd = useCallback(\n\t\t(event: DragEndEvent) => {\n\t\t\tsetActiveId(null);\n\t\t\tsetKeyboardPosition(null);\n\t\t\tconst { active, over } = event;\n\t\t\tconst destination = keyboardDestination.current;\n\t\t\tcompletedDestination.current = destination;\n\t\t\tkeyboardDestination.current = null;\n\t\t\tif (destination) {\n\t\t\t\tconst source = findItem(String(active.id));\n\t\t\t\tconst toIndex = source?.columnId === destination.columnId && source.index < destination.index ? destination.index + 1 : destination.index;\n\t\t\t\tmove({ itemId: String(active.id), toColumnId: destination.columnId, toIndex });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!over) return;\n\t\t\tconst activeData = active.data.current as\n\t\t\t\t| { columnId?: string; index?: number }\n\t\t\t\t| undefined;\n\t\t\tconst overData = over.data.current as\n\t\t\t\t| { columnId?: string; index?: number }\n\t\t\t\t| undefined;\n\t\t\tconst overId = String(over.id);\n\n\t\t\t// Dropping on a column container (not a sortable item) → append.\n\t\t\tconst targetColumnId =\n\t\t\t\toverData?.columnId ?? (Object.prototype.hasOwnProperty.call(value, overId) ? overId : undefined);\n\t\t\tif (!targetColumnId) return;\n\n\t\t\tconst toIndex =\n\t\t\t\toverData?.columnId !== undefined ? overData.index : value[targetColumnId].length;\n\n\t\t\tmove({\n\t\t\t\titemId: String(active.id),\n\t\t\t\ttoColumnId: targetColumnId,\n\t\t\t\ttoIndex,\n\t\t\t});\n\t\t\tvoid activeData;\n\t\t},\n\t\t[move, value, findItem],\n\t);\n\n\tconst ctxValue = useMemo(\n\t\t() => ({\n\t\t\tvalue: value as Record<string, unknown[]>,\n\t\t\tonValueChange: onValueChange as (next: Record<string, unknown[]>) => void,\n\t\t\tgetItemValue: getItemValue as (item: unknown) => string,\n\t\t\tactiveId,\n\t\t\tactiveItem: activeItem as unknown,\n\t\t\tfindItem: findItem as (id: string) => { columnId: string; index: number; item: unknown } | undefined,\n\t\t\titemActions: itemActions as KanbanItemActionsConfig<unknown> | undefined,\n\t\t\tonItemClick: onItemClick as ((item: unknown) => void) | undefined,\n\t\t}),\n\t\t[value, onValueChange, getItemValue, activeId, activeItem, findItem, itemActions, onItemClick],\n\t);\n\n\tconst announcementParams = (itemId: string, overId?: string) => {\n\t\tconst item = findItem(itemId);\n\t\tconst origin = dragOrigin.current;\n\t\tconst over = overId ? findItem(overId) : undefined;\n\t\tconst position = keyboardDestination.current ?? completedDestination.current ?? over ?? (overId && value[overId] ? { columnId: overId, index: value[overId].length } : origin);\n\t\tconst columnName = (id?: string) => id ? getColumnLabel?.(id) ?? id : '';\n\t\treturn {\n\t\t\tname: origin?.name ?? (item ? getItemLabel?.(item.item) ?? itemId : itemId),\n\t\t\tfrom: columnName(origin?.columnId),\n\t\t\tto: columnName(position?.columnId),\n\t\t\tposition: String((position?.index ?? 0) + 1),\n\t\t};\n\t};\n\treturn (\n\t\t<KanbanContextProvider value={ctxValue}>\n\t\t\t<DndContext\n\t\t\t\tsensors={sensors}\n\t\t\t\tonDragStart={handleDragStart}\n\t\t\t\tonDragEnd={handleDragEnd}\n\t\t\t\tonDragCancel={() => { keyboardDestination.current = null; setKeyboardPosition(null); setActiveId(null); }}\n\t\t\t\taccessibility={{\n\t\t\t\t\tannouncements: {\n\t\t\t\t\t\tonDragStart({ active }) {\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragStart, announcementParams(String(active.id)));\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonDragMove({ active, over }) {\n\t\t\t\t\t\t\tif (keyboardFocusId.current) return undefined;\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragMove, announcementParams(String(active.id), over ? String(over.id) : undefined));\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonDragOver({ active, over }) {\n\t\t\t\t\t\t\tif (keyboardFocusId.current) return undefined;\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragMove, announcementParams(String(active.id), over ? String(over.id) : undefined));\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonDragEnd({ active, over }) {\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragEnd, announcementParams(String(active.id), over ? String(over.id) : undefined));\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonDragCancel({ active }) {\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragCancel, announcementParams(String(active.id)));\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tref={boardRef}\n\t\t\t\t\trole=\"application\"\n\t\t\t\t\taria-label={strings.boardAria}\n\t\t\t\t\tclassName={cn('kanban--component', 'w-full', className)}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t\t<div className=\"kanban--keyboard-announcement sr-only\" role=\"status\" aria-live=\"assertive\" aria-atomic=\"true\">\n\t\t\t\t\t\t<Text tag=\"span\">{activeId && keyboardPosition ? interpolateKanbanString(strings.announceDragMove, announcementParams(activeId)) : ''}</Text>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</DndContext>\n\t\t</KanbanContextProvider>\n\t);\n}\n\nKanban.displayName = 'Kanban';\n\nexport function KanbanBoard({ className, style, children }: KanbanBoardProps) {\n\treturn (\n\t\t<div className={cn('grid w-full gap-space-lg', className)} style={style}>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nKanbanBoard.displayName = 'KanbanBoard';\n\nexport function KanbanColumn({ value, className, children }: KanbanColumnProps) {\n\tconst { setNodeRef, isOver } = useDroppable({ id: value });\n\treturn (\n\t\t<div\n\t\t\tref={setNodeRef}\n\t\t\tdata-slot=\"kanban-column\"\n\t\t\tdata-column-id={value}\n\t\t\tdata-over={isOver ? 'true' : undefined}\n\t\t\tclassName={cn('flex min-w-0 flex-col', className)}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nKanbanColumn.displayName = 'KanbanColumn';\n\nexport function KanbanColumnContent({\n\tvalue,\n\tclassName,\n\tchildren,\n}: KanbanColumnContentProps) {\n\tconst ctx = useKanbanContext();\n\tconst items = ctx.value[value] ?? [];\n\tconst ids = items.map((item) => ctx.getItemValue(item));\n\treturn (\n\t\t<SortableContext items={ids} strategy={verticalListSortingStrategy}>\n\t\t\t<div\n\t\t\t\tdata-slot=\"kanban-column-content\"\n\t\t\t\tclassName={cn('flex flex-col gap-space-md', className)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</SortableContext>\n\t);\n}\n\nKanbanColumnContent.displayName = 'KanbanColumnContent';\n\nexport function KanbanItem({\n\tvalue,\n\tclassName,\n\tdisabled = false,\n\tonClick,\n\tchildren,\n}: KanbanItemProps) {\n\tconst ctx = useKanbanContext();\n\tconst found = ctx.findItem(value);\n\tconst {\n\t\tattributes,\n\t\tlisteners,\n\t\tsetNodeRef,\n\t\tsetActivatorNodeRef,\n\t\ttransform,\n\t\ttransition,\n\t\tisDragging,\n\t} = useSortable({\n\t\tid: value,\n\t\tdisabled,\n\t\tdata: { columnId: found?.columnId, index: found?.index },\n\t});\n\n\tconst style = {\n\t\ttransform: CSS.Transform.toString(transform),\n\t\ttransition,\n\t\topacity: isDragging ? 0.4 : undefined,\n\t};\n\tconst [handleCount, setHandleCount] = useState(0);\n\tconst hasHandle = handleCount > 0;\n\tconst registerHandle = useCallback(() => {\n\t\tsetHandleCount((count) => count + 1);\n\t\treturn () => setHandleCount((count) => Math.max(0, count - 1));\n\t}, []);\n\n\tconst itemCtx = useMemo(\n\t\t() => ({\n\t\t\tlisteners,\n\t\t\tattributes,\n\t\t\tsetActivatorNodeRef,\n\t\t\tregisterHandle,\n\t\t\titemId: value,\n\t\t\titem: found?.item ?? null,\n\t\t}),\n\t\t[listeners, attributes, setActivatorNodeRef, registerHandle, value, found?.item],\n\t);\n\n\tconst rootClick = ctx.onItemClick;\n\tconst handleClick = useCallback(\n\t\t(event: MouseEvent<HTMLDivElement>) => {\n\t\t\t// `<KanbanItemHandle>` and `<KanbanItemActions>` mark themselves\n\t\t\t// with `data-stop-item-click` so a click on the drag handle or\n\t\t\t// the actions menu doesn't bubble up as a card click.\n\t\t\tconst target = event.target as HTMLElement | null;\n\t\t\tif (target?.closest('[data-stop-item-click]')) return;\n\t\t\tif (onClick) {\n\t\t\t\tonClick();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (rootClick && found?.item !== undefined) {\n\t\t\t\trootClick(found.item);\n\t\t\t}\n\t\t},\n\t\t[onClick, rootClick, found?.item],\n\t);\n\n\tconst isClickable = Boolean(onClick || rootClick);\n\n\t// When no <KanbanItemHandle> is used, the whole row is the activator.\n\t// We attach listeners + attributes here as the default — KanbanItemHandle\n\t// can then override by wiring them to a more specific element.\n\treturn (\n\t\t<KanbanItemContextProvider value={itemCtx}>\n\t\t\t<div\n\t\t\t\tref={setNodeRef}\n\t\t\t\tstyle={style}\n\t\t\t\tdata-slot=\"kanban-item\"\n\t\t\t\tdata-kanban-item-id={value}\n\t\t\t\tdata-dragging={isDragging ? 'true' : undefined}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'touch-none select-none',\n\t\t\t\t\tisClickable && 'cursor-pointer',\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tonClick={isClickable ? handleClick : undefined}\n\t\t\t\t{...(!hasHandle ? attributes : {})}\n\t\t\t\t{...(!hasHandle ? listeners : {})}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</KanbanItemContextProvider>\n\t);\n}\n\nKanbanItem.displayName = 'KanbanItem';\n\nexport const KanbanItemHandle = forwardRef<HTMLButtonElement, KanbanItemHandleProps>(function KanbanItemHandle({ className, children }, forwardedRef) {\n\tconst { setActivatorNodeRef, listeners, attributes, registerHandle } = useKanbanItemContext();\n\tuseEffect(() => registerHandle(), [registerHandle]);\n\t// Merge dnd-kit's activator ref with the consumer's forwarded ref so a\n\t// `<Tooltip><KanbanItemHandle ref={…}/></Tooltip>` wiring still gets a\n\t// real ref to the button element.\n\tconst setMergedRef = useCallback(\n\t\t(node: HTMLButtonElement | null) => {\n\t\t\tsetActivatorNodeRef(node);\n\t\t\tif (typeof forwardedRef === 'function') {\n\t\t\t\tforwardedRef(node);\n\t\t\t} else if (forwardedRef) {\n\t\t\t\tforwardedRef.current = node;\n\t\t\t}\n\t\t},\n\t\t[setActivatorNodeRef, forwardedRef],\n\t);\n\treturn (\n\t\t<Button\n\t\t\ttype=\"button\"\n\t\t\ttone=\"secondary\"\n\t\t\tbuttonStyle=\"ghost\"\n\t\t\tsize=\"sm\" iconOnly\n\t\t\tref={setMergedRef}\n\t\t\tdata-slot=\"kanban-item-handle\"\n\t\t\tdata-stop-item-click\n\t\t\tonClick={(event) => event.stopPropagation()}\n\t\t\tclassName={cn(\n\t\t\t\t'cursor-grab shadow-none active:cursor-grabbing',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...(attributes as Record<string, unknown>)}\n\t\t\t{...(listeners as Record<string, unknown>)}\n\t\t>\n\t\t\t{children}\n\t\t</Button>\n\t);\n});\n\nKanbanItemHandle.displayName = 'KanbanItemHandle';\n\n/**\n * Per-item actions menu (`⋯` trigger → popover with the actions\n * registered at the `<Kanban itemActions>` root). Place inside any\n * `<KanbanItem>` — typically in the card's top-right corner.\n *\n * The trigger marks itself with `data-stop-item-click` so opening the\n * menu doesn't fire the parent `onItemClick` callback.\n */\nexport function KanbanItemActions<T = unknown>({\n\tclassName,\n\ticon,\n\tariaLabel,\n}: KanbanItemActionsProps) {\n\tconst ctx = useKanbanContext<T>();\n\tconst itemCtx = useKanbanItemContext<T>();\n\tconst strings = useStrings(defaultKanbanStrings, undefined);\n\n\tconst item = itemCtx.item;\n\tconst rawActions = ctx.itemActions;\n\tconst actions = useMemo<ReadonlyArray<\n\t\tOmit<KanbanItemAction<T>, 'visible' | 'disabled'> & {\n\t\t\tvisible: boolean;\n\t\t\tdisabled: boolean;\n\t\t}\n\t>>(() => {\n\t\tif (!rawActions || item === null || item === undefined) return [];\n\t\tconst list = typeof rawActions === 'function' ? rawActions(item) : rawActions;\n\t\treturn list.flatMap((action) => {\n\t\t\tconst visible = typeof action.visible === 'function'\n\t\t\t\t? action.visible(item)\n\t\t\t\t: action.visible ?? true;\n\t\t\tif (!visible) return [];\n\t\t\tconst disabled = typeof action.disabled === 'function'\n\t\t\t\t? action.disabled(item)\n\t\t\t\t: action.disabled ?? false;\n\t\t\treturn [{ ...action, visible, disabled }];\n\t\t});\n\t}, [rawActions, item]);\n\n\tif (item === null || actions.length === 0) return null;\n\n\tconst menuActions: ActionMenuAction[] = actions.map((action) => ({\n\t\tid: action.id,\n\t\tlabel: action.label,\n\t\ticon: action.icon,\n\t\tdisabled: action.disabled,\n\t\ttone: action.tone,\n\t\tbuttonStyle: action.buttonStyle,\n\t\tonClick: () => action.onClick(item),\n\t}));\n\n\treturn (\n\t\t<span\n\t\t\tclassName=\"kanban-item-actions--component inline-flex\"\n\t\t\tdata-stop-item-click\n\t\t\tonClick={(event) => event.stopPropagation()}\n\t\t\tonPointerDown={(event) => event.stopPropagation()}\n\t\t>\n\t\t\t<ActionMenu\n\t\t\t\tactions={menuActions}\n\t\t\t\ticon={icon ?? undefined}\n\t\t\t\tsrText={ariaLabel ?? strings.itemActionsAria}\n\t\t\t\twidth={popoverWidthRecipes.xs}\n\t\t\t\talign=\"end\"\n\t\t\t\tdensity=\"table\"\n\t\t\t\tbuttonProps={{\n\t\t\t\t\tclassName,\n\t\t\t\t\t'data-slot': 'kanban-item-actions-trigger',\n\t\t\t\t\t'data-stop-item-click': true,\n\t\t\t\t\t'aria-label': ariaLabel ?? strings.itemActionsAria,\n\t\t\t\t}}\n\t\t\t/>\n\t\t</span>\n\t);\n}\n\nKanbanItemActions.displayName = 'KanbanItemActions';\n\nexport function KanbanOverlay<T = unknown>({ className, render }: KanbanOverlayProps<T>) {\n\tconst { activeItem, activeId, findItem } = useKanbanContext<T>();\n\treturn (\n\t\t<DragOverlay>\n\t\t\t{activeId\n\t\t\t\t? render\n\t\t\t\t\t? render({\n\t\t\t\t\t\t\titem: activeItem,\n\t\t\t\t\t\t\tcolumnId: findItem(activeId)?.columnId ?? null,\n\t\t\t\t\t\t})\n\t\t\t\t\t: (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'kanban-overlay--component pointer-events-none rounded-radius border-2 border-dashed p-surface shadow-lg',\n\t\t\t\t\t\t\t\ttoneRecipes.primary.edge,\n\t\t\t\t\t\t\t\ttoneRecipes.primary.wash,\n\t\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" weight=\"medium\" className=\"text-primary-accent\">{activeId}</Text>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)\n\t\t\t\t: null}\n\t\t</DragOverlay>\n\t);\n}\n\nKanbanOverlay.displayName = 'KanbanOverlay';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"kanban.js","names":["Text","popoverWidthRecipes","ActionMenu","getKanbanKeyboardPosition","ids","columns","columnIndex","position","key","nextId","createKanbanKeyboardCoordinates","event","active","context","destination","findItem","next","value","onPositionChange","item","id","getItemValue","rect","activeRect","currentCoordinates","useKanban","useCallback","columnId","items","index","move","found","itemId","toColumnId","fromColumnId","fromIndex","targetItems","resolvedToIndex","toIndex","sourceCopy","targetCopy","landingIndex","onValueChange","onItemMove","useMemo","KanbanContext","createContext","KanbanContextProvider","useKanbanContext","ctx","useContext","KanbanItemContext","KanbanItemContextProvider","useKanbanItemContext","defaultKanbanStrings","interpolateKanbanString","params","acc","template","Kanban","stringsProp","strings","useStrings","activeId","setActiveId","useState","boardRef","useRef","keyboardFocusId","node","handle","dragOrigin","completedDestination","keyboardPosition","setKeyboardPosition","keyboardDestination","keyboardCoordinates","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","activeItem","handleDragStart","getItemLabel","handleDragEnd","source","over","overData","overId","targetColumnId","ctxValue","itemActions","onItemClick","announcementParams","origin","columnName","getColumnLabel","DndContext","cn","className","children","KanbanBoard","KanbanColumn","useDroppable","setNodeRef","isOver","KanbanColumnContent","SortableContext","verticalListSortingStrategy","KanbanItem","useSortable","style","CSS","transform","isDragging","handleCount","setHandleCount","hasHandle","registerHandle","count","itemCtx","listeners","attributes","setActivatorNodeRef","rootClick","handleClick","onClick","isClickable","KanbanItemHandle","forwardRef","setMergedRef","forwardedRef","Button","KanbanItemActions","rawActions","actions","visible","action","disabled","menuActions","icon","ariaLabel","KanbanOverlay","DragOverlay","render","toneRecipes"],"sources":["../../src/components/features/kanban/kanban-keyboard.ts","../../src/components/features/kanban/hooks/use-kanban.ts","../../src/components/features/kanban/kanban-context.tsx","../../src/components/features/kanban/kanban.strings.ts","../../src/components/features/kanban/kanban.tsx"],"sourcesContent":["import type { KeyboardCoordinateGetter } from '@dnd-kit/core';\n\nexport interface KanbanKeyboardPosition { columnId: string; index: number }\n\n/** Resolve arrow movement from board order, including columns with no cards. */\nexport function getKanbanKeyboardPosition(\n\tcolumns: Record<string, unknown[]>,\n\tposition: KanbanKeyboardPosition,\n\tkey: string,\n): KanbanKeyboardPosition {\n\tconst ids = Object.keys(columns);\n\tconst columnIndex = ids.indexOf(position.columnId);\n\tif (key === 'ArrowLeft' || key === 'ArrowRight') {\n\t\tconst nextId = ids[columnIndex + (key === 'ArrowRight' ? 1 : -1)];\n\t\treturn nextId ? { columnId: nextId, index: Math.min(position.index, columns[nextId].length) } : position;\n\t}\n\tif (key === 'ArrowUp' || key === 'ArrowDown') {\n\t\treturn { columnId: position.columnId, index: Math.max(0, Math.min(columns[position.columnId].length - 1, position.index + (key === 'ArrowDown' ? 1 : -1))) };\n\t}\n\treturn position;\n}\n\nexport function createKanbanKeyboardCoordinates(\n\tvalue: Record<string, unknown[]>,\n\tgetItemValue: (item: unknown) => string,\n\tfindItem: (id: string) => KanbanKeyboardPosition | undefined,\n\tdestination: { current: KanbanKeyboardPosition | null },\n\tonPositionChange?: (position: KanbanKeyboardPosition) => void,\n): KeyboardCoordinateGetter {\n\treturn (event, { currentCoordinates, context }) => {\n\t\tif (!['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.code)) return undefined;\n\t\tconst active = context.active;\n\t\tif (!active) return undefined;\n\t\tconst position = destination.current ?? findItem(String(active.id));\n\t\tif (!position) return undefined;\n\t\tevent.preventDefault();\n\t\tconst next = getKanbanKeyboardPosition(value, position, event.code);\n\t\tdestination.current = next;\n\t\tonPositionChange?.(next);\n\t\tconst item = value[next.columnId][next.index];\n\t\tconst id = item === undefined ? next.columnId : getItemValue(item);\n\t\tconst rect = context.droppableRects.get(id);\n\t\tconst activeRect = context.collisionRect;\n\t\tif (!rect || !activeRect) return currentCoordinates;\n\t\treturn {\n\t\t\tx: currentCoordinates.x + rect.left - activeRect.left,\n\t\t\ty: currentCoordinates.y + rect.top - activeRect.top,\n\t\t};\n\t};\n}\n","import { useCallback, useMemo } from 'react';\n\nimport type { KanbanItemMoveEvent, KanbanValue } from '../kanban.types';\n\n/**\n * Headless hook — exposes the same state machine `<Kanban>` uses\n * internally so consumers can build a fully custom UI against it.\n *\n * const { findItem, move } = useKanban({ value, onValueChange,\n * getItemValue });\n * move({ itemId: 'card-1', toColumnId: 'shipped', toIndex: 0 });\n */\nexport interface UseKanbanOptions<T> {\n\tvalue: KanbanValue<T>;\n\tonValueChange: (next: KanbanValue<T>) => void;\n\tgetItemValue: (item: T) => string;\n\tonItemMove?: (event: KanbanItemMoveEvent<T>) => void;\n}\n\nexport interface UseKanbanResult<T> {\n\tfindItem: (id: string) => { columnId: string; index: number; item: T } | undefined;\n\t/**\n\t * Move an item between columns / within the same column. Idempotent:\n\t * a no-op move is safe.\n\t */\n\tmove: (input: { itemId: string; toColumnId: string; toIndex?: number }) => void;\n}\n\nexport function useKanban<T>({\n\tvalue,\n\tonValueChange,\n\tgetItemValue,\n\tonItemMove,\n}: UseKanbanOptions<T>): UseKanbanResult<T> {\n\tconst findItem = useCallback(\n\t\t(id: string) => {\n\t\t\tfor (const [columnId, items] of Object.entries(value)) {\n\t\t\t\tconst index = items.findIndex((item) => getItemValue(item) === id);\n\t\t\t\tif (index >= 0) return { columnId, index, item: items[index] };\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t\t[value, getItemValue],\n\t);\n\n\tconst move = useCallback(\n\t\t({ itemId, toColumnId, toIndex }: { itemId: string; toColumnId: string; toIndex?: number }) => {\n\t\t\tconst found = findItem(itemId);\n\t\t\tif (!found) return;\n\t\t\tif (!Object.prototype.hasOwnProperty.call(value, toColumnId)) return;\n\n\t\t\tconst { columnId: fromColumnId, index: fromIndex, item } = found;\n\n\t\t\t// Same column, same slot — nothing to do.\n\t\t\tconst targetItems = value[toColumnId];\n\t\t\tconst resolvedToIndex =\n\t\t\t\ttoIndex === undefined\n\t\t\t\t\t? targetItems.length\n\t\t\t\t\t: Math.max(0, Math.min(toIndex, targetItems.length));\n\n\t\t\tif (fromColumnId === toColumnId && fromIndex === resolvedToIndex) return;\n\n\t\t\tconst next: KanbanValue<T> = { ...value };\n\t\t\tconst sourceCopy = [...next[fromColumnId]];\n\t\t\tsourceCopy.splice(fromIndex, 1);\n\t\t\tnext[fromColumnId] = sourceCopy;\n\n\t\t\tconst targetCopy = [...(fromColumnId === toColumnId ? sourceCopy : next[toColumnId])];\n\t\t\t// When moving within the same column to a later index, the splice\n\t\t\t// above shifted everything left — re-resolve the destination.\n\t\t\tlet landingIndex = resolvedToIndex;\n\t\t\tif (fromColumnId === toColumnId && fromIndex < resolvedToIndex) {\n\t\t\t\tlandingIndex = Math.max(0, resolvedToIndex - 1);\n\t\t\t}\n\t\t\ttargetCopy.splice(landingIndex, 0, item);\n\t\t\tnext[toColumnId] = targetCopy;\n\n\t\t\tonValueChange(next);\n\t\t\tonItemMove?.({\n\t\t\t\titem,\n\t\t\t\titemId,\n\t\t\t\tfrom: { columnId: fromColumnId, index: fromIndex },\n\t\t\t\tto: { columnId: toColumnId, index: landingIndex },\n\t\t\t});\n\t\t},\n\t\t[value, findItem, onValueChange, onItemMove],\n\t);\n\n\treturn useMemo(() => ({ findItem, move }), [findItem, move]);\n}\n","import { createContext, useContext } from 'react';\n\nimport type { KanbanContextShape } from './kanban.types';\n\n/**\n * Internal context for the Kanban — the parts use this to read\n * shared state (current value, getItemValue, active drag id).\n */\nconst KanbanContext = createContext<KanbanContextShape | null>(null);\n\nexport const KanbanContextProvider = KanbanContext.Provider;\n\nexport function useKanbanContext<T = unknown>(): KanbanContextShape<T> {\n\tconst ctx = useContext(KanbanContext);\n\tif (!ctx) {\n\t\tthrow new Error(\n\t\t\t'Kanban subcomponents must be rendered inside a <Kanban> root.',\n\t\t);\n\t}\n\treturn ctx as unknown as KanbanContextShape<T>;\n}\n\n/**\n * Internal context exposed by `<KanbanItem>` so the optional\n * `<KanbanItemHandle>` knows which listeners + accessibility props to\n * wire to the dedicated drag handle. Also carries the resolved\n * domain item so `<KanbanItemActions>` (and any other item-aware\n * subcomponent) can render per-item content without prop drilling.\n *\n * The dnd-kit shapes are widened to `unknown` so consumers can spread\n * them onto any HTMLElement.\n */\nexport interface KanbanItemContextShape<T = unknown> {\n\tlisteners: unknown;\n\tattributes: unknown;\n\tsetActivatorNodeRef: (node: HTMLElement | null) => void;\n\tregisterHandle: () => () => void;\n\t/** Stable id (the value returned by `getItemValue`). */\n\titemId: string;\n\t/** The domain item itself — null if it can't be resolved. */\n\titem: T | null;\n}\n\nconst KanbanItemContext = createContext<KanbanItemContextShape | null>(null);\n\nexport const KanbanItemContextProvider = KanbanItemContext.Provider;\n\nexport function useKanbanItemContext<T = unknown>(): KanbanItemContextShape<T> {\n\tconst ctx = useContext(KanbanItemContext);\n\tif (!ctx) {\n\t\tthrow new Error(\n\t\t\t'<KanbanItemHandle> / <KanbanItemActions> must be rendered inside a <KanbanItem>.',\n\t\t);\n\t}\n\treturn ctx as KanbanItemContextShape<T>;\n}\n","/**\n * Strings for the Kanban — drag-and-drop screen-reader announcements\n * + accessibility labels. The library never renders user-visible copy\n * that the consumer hasn't already supplied via column headers / item\n * children, so the strings here are exclusively for assistive tech.\n */\nexport interface KanbanStrings {\n\t/** Read by screen readers when a drag begins. `{name}` = item label (or ID). */\n\tannounceDragStart: string;\n\t/** Read when an item moves over a column. `{from}` / `{to}` are column labels; `{position}` is one-based. */\n\tannounceDragMove: string;\n\t/** Read when an item is dropped into a column. */\n\tannounceDragEnd: string;\n\t/** Read when the user cancels a drag with Escape. */\n\tannounceDragCancel: string;\n\t/** Aria label on the drag handle. */\n\tdragHandleAria: string;\n\t/** Aria label on the board landmark. */\n\tboardAria: string;\n\t/** Aria label on the per-item actions trigger (`⋯`). */\n\titemActionsAria: string;\n}\n\nexport const defaultKanbanStrings: KanbanStrings = {\n\tannounceDragStart: 'Picked up item {name}.',\n\tannounceDragMove: 'Moving {name} from {from} to {to}, position {position}.',\n\tannounceDragEnd: 'Dropped {name} into {to}, position {position}.',\n\tannounceDragCancel: 'Cancelled drag of {name}.',\n\tdragHandleAria: 'Drag handle',\n\tboardAria: 'Kanban board',\n\titemActionsAria: 'Item actions',\n};\n\nexport function interpolateKanbanString(\n\ttemplate: string,\n\tparams: Record<string, string>,\n): string {\n\treturn Object.entries(params).reduce(\n\t\t(acc, [key, value]) => acc.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), value),\n\t\ttemplate,\n\t);\n}\n","/**\n * Kanban — drag-and-drop board with multi-column item sorting and\n * cross-column moves. Headless behavior comes from `@dnd-kit/core` +\n * `@dnd-kit/sortable`; the library wires it into a callback-driven,\n * generic-T API:\n *\n * <Kanban\n * value={columns}\n * onValueChange={setColumns}\n * getItemValue={(c) => c.id}\n * onItemMove={(e) => api.persistMove(e)}\n * >\n * <KanbanBoard className=\"grid grid-cols-3 gap-3\">\n * {Object.entries(columns).map(([colId, items]) => (\n * <KanbanColumn key={colId} value={colId}>\n * <header>{COLUMNS[colId].title}</header>\n * <KanbanColumnContent value={colId}>\n * {items.map((card) => (\n * <KanbanItem key={card.id} value={card.id}>\n * …card body…\n * </KanbanItem>\n * ))}\n * </KanbanColumnContent>\n * </KanbanColumn>\n * ))}\n * </KanbanBoard>\n * <KanbanOverlay />\n * </Kanban>\n *\n * The library never reaches into a router, never persists state — your\n * `onValueChange` is the source of truth. Use `onItemMove` for\n * analytics / optimistic-update plumbing.\n */\nimport {\n\tDndContext,\n\tDragOverlay,\n\tPointerSensor,\n\tKeyboardSensor,\n\tuseDroppable,\n\tuseSensor,\n\tuseSensors,\n\ttype DragEndEvent,\n\ttype DragStartEvent,\n} from '@dnd-kit/core';\nimport {\n\tSortableContext,\n\tuseSortable,\n\tverticalListSortingStrategy,\n} from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { forwardRef, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, type MouseEvent } from 'react';\n\nimport { Button } from '../../base/buttons';\nimport { ActionMenu, type ActionMenuAction } from '../../base/action-menu';\nimport { Text } from '../../typography';\nimport { useStrings } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport { createKanbanKeyboardCoordinates, type KanbanKeyboardPosition } from './kanban-keyboard';\nimport { useKanban } from './hooks/use-kanban';\nimport {\n\tKanbanContextProvider,\n\tKanbanItemContextProvider,\n\tuseKanbanContext,\n\tuseKanbanItemContext,\n} from './kanban-context';\nimport { defaultKanbanStrings, interpolateKanbanString } from './kanban.strings';\nimport type {\n\tKanbanBoardProps,\n\tKanbanColumnContentProps,\n\tKanbanColumnProps,\n\tKanbanItemAction,\n\tKanbanItemActionsConfig,\n\tKanbanItemActionsProps,\n\tKanbanItemHandleProps,\n\tKanbanItemProps,\n\tKanbanOverlayProps,\n\tKanbanProps,\n} from './kanban.types';\nimport { toneRecipes } from '../../../lib/tone-recipes';\nimport { popoverWidthRecipes } from '../../base/popover/popover.recipes';\n\nexport function Kanban<T>({\n\tvalue,\n\tonValueChange,\n\tgetItemValue,\n\tgetItemLabel,\n\tgetColumnLabel,\n\tonItemMove,\n\titemActions,\n\tonItemClick,\n\tstrings: stringsProp,\n\tclassName,\n\tchildren,\n}: KanbanProps<T>) {\n\tconst strings = useStrings(defaultKanbanStrings, stringsProp);\n\tconst { findItem, move } = useKanban({\n\t\tvalue,\n\t\tonValueChange,\n\t\tgetItemValue,\n\t\tonItemMove,\n\t});\n\tconst [activeId, setActiveId] = useState<string | null>(null);\n\n\tconst boardRef = useRef<HTMLDivElement | null>(null);\n\tconst keyboardFocusId = useRef<string | null>(null);\n\tuseLayoutEffect(() => {\n\t\tif (activeId || !keyboardFocusId.current) return;\n\t\tconst item = Array.from(boardRef.current?.querySelectorAll<HTMLElement>('[data-kanban-item-id]') ?? []).find(node => node.dataset.kanbanItemId === keyboardFocusId.current);\n\t\tconst handle = item?.querySelector<HTMLElement>('[data-slot=\"kanban-item-handle\"]') ?? item;\n\t\tif (handle) { handle.focus(); keyboardFocusId.current = null; }\n\t}, [activeId, value]);\n\tconst dragOrigin = useRef<{ columnId: string; index: number; name: string } | null>(null);\n\tconst completedDestination = useRef<KanbanKeyboardPosition | null>(null);\n\tconst [keyboardPosition, setKeyboardPosition] = useState<KanbanKeyboardPosition | null>(null);\n\tconst keyboardDestination = useRef<KanbanKeyboardPosition | null>(null);\n\tconst keyboardCoordinates = useMemo(() => createKanbanKeyboardCoordinates(\n\t\tvalue, getItemValue as (item: unknown) => string, findItem, keyboardDestination, setKeyboardPosition,\n\t), [value, getItemValue, findItem]);\n\tconst sensors = useSensors(\n\t\tuseSensor(PointerSensor, { activationConstraint: { distance: 6 } }),\n\t\tuseSensor(KeyboardSensor, { coordinateGetter: keyboardCoordinates }),\n\t);\n\n\tconst activeItem = useMemo(\n\t\t() => (activeId ? findItem(activeId)?.item ?? null : null),\n\t\t[activeId, findItem],\n\t);\n\n\tconst handleDragStart = useCallback(\n\t\t(event: DragStartEvent) => {\n\t\t\tconst item = findItem(String(event.active.id));\n\t\t\tdragOrigin.current = item ? { columnId: item.columnId, index: item.index, name: getItemLabel?.(item.item) ?? String(event.active.id) } : null;\n\t\t\tcompletedDestination.current = null;\n\t\t\tsetKeyboardPosition(null);\n\t\t\tkeyboardDestination.current = null;\n\t\t\tkeyboardFocusId.current = event.activatorEvent instanceof KeyboardEvent ? String(event.active.id) : null;\n\t\t\tsetActiveId(String(event.active.id));\n\t\t},\n\t\t[findItem, getItemLabel],\n\t);\n\n\tconst handleDragEnd = useCallback(\n\t\t(event: DragEndEvent) => {\n\t\t\tsetActiveId(null);\n\t\t\tsetKeyboardPosition(null);\n\t\t\tconst { active, over } = event;\n\t\t\tconst destination = keyboardDestination.current;\n\t\t\tcompletedDestination.current = destination;\n\t\t\tkeyboardDestination.current = null;\n\t\t\tif (destination) {\n\t\t\t\tconst source = findItem(String(active.id));\n\t\t\t\tconst toIndex = source?.columnId === destination.columnId && source.index < destination.index ? destination.index + 1 : destination.index;\n\t\t\t\tmove({ itemId: String(active.id), toColumnId: destination.columnId, toIndex });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!over) return;\n\t\t\tconst activeData = active.data.current as\n\t\t\t\t| { columnId?: string; index?: number }\n\t\t\t\t| undefined;\n\t\t\tconst overData = over.data.current as\n\t\t\t\t| { columnId?: string; index?: number }\n\t\t\t\t| undefined;\n\t\t\tconst overId = String(over.id);\n\n\t\t\t// Dropping on a column container (not a sortable item) → append.\n\t\t\tconst targetColumnId =\n\t\t\t\toverData?.columnId ?? (Object.prototype.hasOwnProperty.call(value, overId) ? overId : undefined);\n\t\t\tif (!targetColumnId) return;\n\n\t\t\tconst toIndex =\n\t\t\t\toverData?.columnId !== undefined ? overData.index : value[targetColumnId].length;\n\n\t\t\tmove({\n\t\t\t\titemId: String(active.id),\n\t\t\t\ttoColumnId: targetColumnId,\n\t\t\t\ttoIndex,\n\t\t\t});\n\t\t\tvoid activeData;\n\t\t},\n\t\t[move, value, findItem],\n\t);\n\n\tconst ctxValue = useMemo(\n\t\t() => ({\n\t\t\tvalue: value as Record<string, unknown[]>,\n\t\t\tonValueChange: onValueChange as (next: Record<string, unknown[]>) => void,\n\t\t\tgetItemValue: getItemValue as (item: unknown) => string,\n\t\t\tactiveId,\n\t\t\tactiveItem: activeItem as unknown,\n\t\t\tfindItem: findItem as (id: string) => { columnId: string; index: number; item: unknown } | undefined,\n\t\t\titemActions: itemActions as KanbanItemActionsConfig<unknown> | undefined,\n\t\t\tonItemClick: onItemClick as ((item: unknown) => void) | undefined,\n\t\t}),\n\t\t[value, onValueChange, getItemValue, activeId, activeItem, findItem, itemActions, onItemClick],\n\t);\n\n\tconst announcementParams = (itemId: string, overId?: string) => {\n\t\tconst item = findItem(itemId);\n\t\tconst origin = dragOrigin.current;\n\t\tconst over = overId ? findItem(overId) : undefined;\n\t\tconst position = keyboardDestination.current ?? completedDestination.current ?? over ?? (overId && value[overId] ? { columnId: overId, index: value[overId].length } : origin);\n\t\tconst columnName = (id?: string) => id ? getColumnLabel?.(id) ?? id : '';\n\t\treturn {\n\t\t\tname: origin?.name ?? (item ? getItemLabel?.(item.item) ?? itemId : itemId),\n\t\t\tfrom: columnName(origin?.columnId),\n\t\t\tto: columnName(position?.columnId),\n\t\t\tposition: String((position?.index ?? 0) + 1),\n\t\t};\n\t};\n\treturn (\n\t\t<KanbanContextProvider value={ctxValue}>\n\t\t\t<DndContext\n\t\t\t\tsensors={sensors}\n\t\t\t\tonDragStart={handleDragStart}\n\t\t\t\tonDragEnd={handleDragEnd}\n\t\t\t\tonDragCancel={() => { keyboardDestination.current = null; setKeyboardPosition(null); setActiveId(null); }}\n\t\t\t\taccessibility={{\n\t\t\t\t\tannouncements: {\n\t\t\t\t\t\tonDragStart({ active }) {\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragStart, announcementParams(String(active.id)));\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonDragMove({ active, over }) {\n\t\t\t\t\t\t\tif (keyboardFocusId.current) return undefined;\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragMove, announcementParams(String(active.id), over ? String(over.id) : undefined));\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonDragOver({ active, over }) {\n\t\t\t\t\t\t\tif (keyboardFocusId.current) return undefined;\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragMove, announcementParams(String(active.id), over ? String(over.id) : undefined));\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonDragEnd({ active, over }) {\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragEnd, announcementParams(String(active.id), over ? String(over.id) : undefined));\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonDragCancel({ active }) {\n\t\t\t\t\t\t\treturn interpolateKanbanString(strings.announceDragCancel, announcementParams(String(active.id)));\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tref={boardRef}\n\t\t\t\t\trole=\"application\"\n\t\t\t\t\taria-label={strings.boardAria}\n\t\t\t\t\tclassName={cn('kanban--component', 'w-full', className)}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t\t<div className=\"kanban--keyboard-announcement sr-only\" role=\"status\" aria-live=\"assertive\" aria-atomic=\"true\">\n\t\t\t\t\t\t<Text tag=\"span\">{activeId && keyboardPosition ? interpolateKanbanString(strings.announceDragMove, announcementParams(activeId)) : ''}</Text>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</DndContext>\n\t\t</KanbanContextProvider>\n\t);\n}\n\nKanban.displayName = 'Kanban';\n\nexport function KanbanBoard({ className, style, children }: KanbanBoardProps) {\n\treturn (\n\t\t<div className={cn('grid w-full gap-space-lg', className)} style={style}>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nKanbanBoard.displayName = 'KanbanBoard';\n\nexport function KanbanColumn({ value, className, children }: KanbanColumnProps) {\n\tconst { setNodeRef, isOver } = useDroppable({ id: value });\n\treturn (\n\t\t<div\n\t\t\tref={setNodeRef}\n\t\t\tdata-slot=\"kanban-column\"\n\t\t\tdata-column-id={value}\n\t\t\tdata-over={isOver ? 'true' : undefined}\n\t\t\tclassName={cn('flex min-w-0 flex-col', className)}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\nKanbanColumn.displayName = 'KanbanColumn';\n\nexport function KanbanColumnContent({\n\tvalue,\n\tclassName,\n\tchildren,\n}: KanbanColumnContentProps) {\n\tconst ctx = useKanbanContext();\n\tconst items = ctx.value[value] ?? [];\n\tconst ids = items.map((item) => ctx.getItemValue(item));\n\treturn (\n\t\t<SortableContext items={ids} strategy={verticalListSortingStrategy}>\n\t\t\t<div\n\t\t\t\tdata-slot=\"kanban-column-content\"\n\t\t\t\tclassName={cn('flex flex-col gap-space-md', className)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</SortableContext>\n\t);\n}\n\nKanbanColumnContent.displayName = 'KanbanColumnContent';\n\nexport function KanbanItem({\n\tvalue,\n\tclassName,\n\tdisabled = false,\n\tonClick,\n\tchildren,\n}: KanbanItemProps) {\n\tconst ctx = useKanbanContext();\n\tconst found = ctx.findItem(value);\n\tconst {\n\t\tattributes,\n\t\tlisteners,\n\t\tsetNodeRef,\n\t\tsetActivatorNodeRef,\n\t\ttransform,\n\t\ttransition,\n\t\tisDragging,\n\t} = useSortable({\n\t\tid: value,\n\t\tdisabled,\n\t\tdata: { columnId: found?.columnId, index: found?.index },\n\t});\n\n\tconst style = {\n\t\ttransform: CSS.Transform.toString(transform),\n\t\ttransition,\n\t\topacity: isDragging ? 0.4 : undefined,\n\t};\n\tconst [handleCount, setHandleCount] = useState(0);\n\tconst hasHandle = handleCount > 0;\n\tconst registerHandle = useCallback(() => {\n\t\tsetHandleCount((count) => count + 1);\n\t\treturn () => setHandleCount((count) => Math.max(0, count - 1));\n\t}, []);\n\n\tconst itemCtx = useMemo(\n\t\t() => ({\n\t\t\tlisteners,\n\t\t\tattributes,\n\t\t\tsetActivatorNodeRef,\n\t\t\tregisterHandle,\n\t\t\titemId: value,\n\t\t\titem: found?.item ?? null,\n\t\t}),\n\t\t[listeners, attributes, setActivatorNodeRef, registerHandle, value, found?.item],\n\t);\n\n\tconst rootClick = ctx.onItemClick;\n\tconst handleClick = useCallback(\n\t\t(event: MouseEvent<HTMLDivElement>) => {\n\t\t\t// `<KanbanItemHandle>` and `<KanbanItemActions>` mark themselves\n\t\t\t// with `data-stop-item-click` so a click on the drag handle or\n\t\t\t// the actions menu doesn't bubble up as a card click.\n\t\t\tconst target = event.target as HTMLElement | null;\n\t\t\tif (target?.closest('[data-stop-item-click]')) return;\n\t\t\tif (onClick) {\n\t\t\t\tonClick();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (rootClick && found?.item !== undefined) {\n\t\t\t\trootClick(found.item);\n\t\t\t}\n\t\t},\n\t\t[onClick, rootClick, found?.item],\n\t);\n\n\tconst isClickable = Boolean(onClick || rootClick);\n\n\t// When no <KanbanItemHandle> is used, the whole row is the activator.\n\t// We attach listeners + attributes here as the default — KanbanItemHandle\n\t// can then override by wiring them to a more specific element.\n\treturn (\n\t\t<KanbanItemContextProvider value={itemCtx}>\n\t\t\t<div\n\t\t\t\tref={setNodeRef}\n\t\t\t\tstyle={style}\n\t\t\t\tdata-slot=\"kanban-item\"\n\t\t\t\tdata-kanban-item-id={value}\n\t\t\t\tdata-dragging={isDragging ? 'true' : undefined}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'touch-none select-none',\n\t\t\t\t\tisClickable && 'cursor-pointer',\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tonClick={isClickable ? handleClick : undefined}\n\t\t\t\t{...(!hasHandle ? attributes : {})}\n\t\t\t\t{...(!hasHandle ? listeners : {})}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</KanbanItemContextProvider>\n\t);\n}\n\nKanbanItem.displayName = 'KanbanItem';\n\nexport const KanbanItemHandle = forwardRef<HTMLButtonElement, KanbanItemHandleProps>(function KanbanItemHandle({ className, children }, forwardedRef) {\n\tconst { setActivatorNodeRef, listeners, attributes, registerHandle } = useKanbanItemContext();\n\tuseEffect(() => registerHandle(), [registerHandle]);\n\t// Merge dnd-kit's activator ref with the consumer's forwarded ref so a\n\t// `<Tooltip><KanbanItemHandle ref={…}/></Tooltip>` wiring still gets a\n\t// real ref to the button element.\n\tconst setMergedRef = useCallback(\n\t\t(node: HTMLButtonElement | null) => {\n\t\t\tsetActivatorNodeRef(node);\n\t\t\tif (typeof forwardedRef === 'function') {\n\t\t\t\tforwardedRef(node);\n\t\t\t} else if (forwardedRef) {\n\t\t\t\tforwardedRef.current = node;\n\t\t\t}\n\t\t},\n\t\t[setActivatorNodeRef, forwardedRef],\n\t);\n\treturn (\n\t\t<Button\n\t\t\ttype=\"button\"\n\t\t\ttone=\"secondary\"\n\t\t\tbuttonStyle=\"ghost\"\n\t\t\tsize=\"sm\" iconOnly\n\t\t\tref={setMergedRef}\n\t\t\tdata-slot=\"kanban-item-handle\"\n\t\t\tdata-stop-item-click\n\t\t\tonClick={(event) => event.stopPropagation()}\n\t\t\tclassName={cn(\n\t\t\t\t'cursor-grab shadow-none active:cursor-grabbing',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...(attributes as Record<string, unknown>)}\n\t\t\t{...(listeners as Record<string, unknown>)}\n\t\t>\n\t\t\t{children}\n\t\t</Button>\n\t);\n});\n\nKanbanItemHandle.displayName = 'KanbanItemHandle';\n\n/**\n * Per-item actions menu (`⋯` trigger → popover with the actions\n * registered at the `<Kanban itemActions>` root). Place inside any\n * `<KanbanItem>` — typically in the card's top-right corner.\n *\n * The trigger marks itself with `data-stop-item-click` so opening the\n * menu doesn't fire the parent `onItemClick` callback.\n */\nexport function KanbanItemActions<T = unknown>({\n\tclassName,\n\ticon,\n\tariaLabel,\n}: KanbanItemActionsProps) {\n\tconst ctx = useKanbanContext<T>();\n\tconst itemCtx = useKanbanItemContext<T>();\n\tconst strings = useStrings(defaultKanbanStrings, undefined);\n\n\tconst item = itemCtx.item;\n\tconst rawActions = ctx.itemActions;\n\tconst actions = useMemo<ReadonlyArray<\n\t\tOmit<KanbanItemAction<T>, 'visible' | 'disabled'> & {\n\t\t\tvisible: boolean;\n\t\t\tdisabled: boolean;\n\t\t}\n\t>>(() => {\n\t\tif (!rawActions || item === null || item === undefined) return [];\n\t\tconst list = typeof rawActions === 'function' ? rawActions(item) : rawActions;\n\t\treturn list.flatMap((action) => {\n\t\t\tconst visible = typeof action.visible === 'function'\n\t\t\t\t? action.visible(item)\n\t\t\t\t: action.visible ?? true;\n\t\t\tif (!visible) return [];\n\t\t\tconst disabled = typeof action.disabled === 'function'\n\t\t\t\t? action.disabled(item)\n\t\t\t\t: action.disabled ?? false;\n\t\t\treturn [{ ...action, visible, disabled }];\n\t\t});\n\t}, [rawActions, item]);\n\n\tif (item === null || actions.length === 0) return null;\n\n\tconst menuActions: ActionMenuAction[] = actions.map((action) => ({\n\t\tid: action.id,\n\t\tlabel: action.label,\n\t\ticon: action.icon,\n\t\tdisabled: action.disabled,\n\t\ttone: action.tone,\n\t\tbuttonStyle: action.buttonStyle,\n\t\tonClick: () => action.onClick(item),\n\t}));\n\n\treturn (\n\t\t<span\n\t\t\tclassName=\"kanban-item-actions--component inline-flex\"\n\t\t\tdata-stop-item-click\n\t\t\tonClick={(event) => event.stopPropagation()}\n\t\t\tonPointerDown={(event) => event.stopPropagation()}\n\t\t>\n\t\t\t<ActionMenu\n\t\t\t\tactions={menuActions}\n\t\t\t\ticon={icon ?? undefined}\n\t\t\t\tsrText={ariaLabel ?? strings.itemActionsAria}\n\t\t\t\twidth={popoverWidthRecipes.xs}\n\t\t\t\talign=\"end\"\n\t\t\t\tbuttonProps={{\n\t\t\t\t\tclassName,\n\t\t\t\t\t'data-slot': 'kanban-item-actions-trigger',\n\t\t\t\t\t'data-stop-item-click': true,\n\t\t\t\t\t'aria-label': ariaLabel ?? strings.itemActionsAria,\n\t\t\t\t}}\n\t\t\t/>\n\t\t</span>\n\t);\n}\n\nKanbanItemActions.displayName = 'KanbanItemActions';\n\nexport function KanbanOverlay<T = unknown>({ className, render }: KanbanOverlayProps<T>) {\n\tconst { activeItem, activeId, findItem } = useKanbanContext<T>();\n\treturn (\n\t\t<DragOverlay>\n\t\t\t{activeId\n\t\t\t\t? render\n\t\t\t\t\t? render({\n\t\t\t\t\t\t\titem: activeItem,\n\t\t\t\t\t\t\tcolumnId: findItem(activeId)?.columnId ?? null,\n\t\t\t\t\t\t})\n\t\t\t\t\t: (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'kanban-overlay--component pointer-events-none rounded-surface border-2 border-dashed p-surface shadow-lg',\n\t\t\t\t\t\t\t\ttoneRecipes.primary.edge,\n\t\t\t\t\t\t\t\ttoneRecipes.primary.wash,\n\t\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" weight=\"medium\" className=\"text-primary-accent\">{activeId}</Text>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)\n\t\t\t\t: null}\n\t\t</DragOverlay>\n\t);\n}\n\nKanbanOverlay.displayName = 'KanbanOverlay';\n"],"mappings":"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"}
|