themelia-react-ui 1.0.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (542) hide show
  1. package/CHANGELOG.md +281 -1
  2. package/README.md +10 -5
  3. package/dist/{accordion-BRTcsp8J.js → accordion-CQXVcd7Q.js} +13 -13
  4. package/dist/accordion-CQXVcd7Q.js.map +1 -0
  5. package/dist/action-menu-BTpyPWJ2.js +264 -0
  6. package/dist/action-menu-BTpyPWJ2.js.map +1 -0
  7. package/dist/{affordance-geometry.generated-CL84ZN9A.js → affordance-geometry.generated-CCIXb2A1.js} +7 -2
  8. package/dist/affordance-geometry.generated-CCIXb2A1.js.map +1 -0
  9. package/dist/{ai-artifact-DLVdK0Py.js → ai-artifact-2PQ2fItc.js} +171 -176
  10. package/dist/ai-artifact-2PQ2fItc.js.map +1 -0
  11. package/dist/{app-shell-C_fKpljx.js → app-shell-BE_j8-AT.js} +4 -4
  12. package/dist/{app-shell-C_fKpljx.js.map → app-shell-BE_j8-AT.js.map} +1 -1
  13. package/dist/{attachment-DbjUWsP0.js → attachment-q69dlt5Y.js} +9 -9
  14. package/dist/{attachment-DbjUWsP0.js.map → attachment-q69dlt5Y.js.map} +1 -1
  15. package/dist/{auth-CAQcasMV.js → auth-M3vGMgDR.js} +42 -42
  16. package/dist/{auth-CAQcasMV.js.map → auth-M3vGMgDR.js.map} +1 -1
  17. package/dist/{avatar-Bu2HhitA.js → avatar-djdaaQ_s.js} +14 -12
  18. package/dist/avatar-djdaaQ_s.js.map +1 -0
  19. package/dist/{badge-CzId1Wlm.js → badge-0tATj-tW.js} +9 -9
  20. package/dist/badge-0tATj-tW.js.map +1 -0
  21. package/dist/base/accordion.js +1 -1
  22. package/dist/base/action-menu.js +1 -1
  23. package/dist/base/attachment.js +1 -1
  24. package/dist/base/avatar.js +1 -1
  25. package/dist/base/badge.js +1 -1
  26. package/dist/base/buttons.js +2 -2
  27. package/dist/base/cards.js +2 -2
  28. package/dist/base/carousel.js +11 -11
  29. package/dist/base/carousel.js.map +1 -1
  30. package/dist/base/cascader.js +244 -222
  31. package/dist/base/cascader.js.map +1 -1
  32. package/dist/base/chart.js +1 -1
  33. package/dist/base/choice-inputs.js +2 -2
  34. package/dist/base/code-block.js +1 -1
  35. package/dist/base/combobox.js +1 -1
  36. package/dist/base/command.js +1 -1
  37. package/dist/base/copyable.js +1 -1
  38. package/dist/base/date-pickers.js +2 -2
  39. package/dist/base/display.js +6 -6
  40. package/dist/base/feedback.js +3 -3
  41. package/dist/base/forms-numeric.js +1 -1
  42. package/dist/base/forms.js +2 -2
  43. package/dist/base/inline-edit.js +81 -76
  44. package/dist/base/inline-edit.js.map +1 -1
  45. package/dist/base/item.js +1 -1
  46. package/dist/base/media-gallery.js +1 -1
  47. package/dist/base/navigation.js +6 -6
  48. package/dist/base/popover-menu.js +1 -1
  49. package/dist/base/popover.js +1 -1
  50. package/dist/base/qr-code.js +7 -4
  51. package/dist/base/qr-code.js.map +1 -1
  52. package/dist/base/repeaters.js +42 -42
  53. package/dist/base/repeaters.js.map +1 -1
  54. package/dist/base/sheet.js +1 -1
  55. package/dist/base/sidebar.js +1 -1
  56. package/dist/base/signature-pad.js +9 -9
  57. package/dist/base/signature-pad.js.map +1 -1
  58. package/dist/base/skeleton.js +1 -1
  59. package/dist/base/spinner.js +1 -1
  60. package/dist/base/structure.js +1 -1
  61. package/dist/base/table.js +1 -1
  62. package/dist/base/text-inputs.js +2 -2
  63. package/dist/base/toaster.js +4 -4
  64. package/dist/base/toaster.js.map +1 -1
  65. package/dist/base/tree.js +1 -1
  66. package/dist/base/upload-queue.js +1 -1
  67. package/dist/base/upload.js +3 -3
  68. package/dist/base/value-inputs.js +1 -1
  69. package/dist/blocks/admin.js +229 -220
  70. package/dist/blocks/admin.js.map +1 -1
  71. package/dist/blocks/ai.js +147 -180
  72. package/dist/blocks/ai.js.map +1 -1
  73. package/dist/blocks/analytics/usage-card.js +1 -1
  74. package/dist/blocks/analytics.js +530 -523
  75. package/dist/blocks/analytics.js.map +1 -1
  76. package/dist/blocks/collaboration.js +1 -1
  77. package/dist/blocks/commerce/receipt.js +1 -1
  78. package/dist/blocks/commerce.js +1390 -1516
  79. package/dist/blocks/commerce.js.map +1 -1
  80. package/dist/blocks/data-display.js +1 -1
  81. package/dist/blocks/onboarding.js +5 -5
  82. package/dist/blocks/planning.js +82 -91
  83. package/dist/blocks/planning.js.map +1 -1
  84. package/dist/blocks/timelines.js +1 -1
  85. package/dist/{breadcrumbs-BuYz5SDU.js → breadcrumbs-BG_FfMK4.js} +5 -5
  86. package/dist/{breadcrumbs-BuYz5SDU.js.map → breadcrumbs-BG_FfMK4.js.map} +1 -1
  87. package/dist/{button-BZDasD04.js → button-BS3KDg00.js} +185 -162
  88. package/dist/button-BS3KDg00.js.map +1 -0
  89. package/dist/{button-BZyfTvwm.js → button-R9CCoH7A.js} +2 -2
  90. package/dist/{button-BZyfTvwm.js.map → button-R9CCoH7A.js.map} +1 -1
  91. package/dist/{buttons-D_6KJvEE.js → buttons-DS0ZIwJ_.js} +11 -11
  92. package/dist/buttons-DS0ZIwJ_.js.map +1 -0
  93. package/dist/{cards-qGSErLw_.js → cards-QoJ4syG9.js} +7 -7
  94. package/dist/{cards-qGSErLw_.js.map → cards-QoJ4syG9.js.map} +1 -1
  95. package/dist/{chart-Bsc5BICK.js → chart-DwYRKKc-.js} +17 -15
  96. package/dist/chart-DwYRKKc-.js.map +1 -0
  97. package/dist/checkbox-B7ygNTYp.js +35 -0
  98. package/dist/checkbox-B7ygNTYp.js.map +1 -0
  99. package/dist/choice-inputs-DrJ17tpL.js +752 -0
  100. package/dist/choice-inputs-DrJ17tpL.js.map +1 -0
  101. package/dist/{code-block-DzHKRybS.js → code-block-CD0B7M93.js} +19 -19
  102. package/dist/{code-block-DzHKRybS.js.map → code-block-CD0B7M93.js.map} +1 -1
  103. package/dist/{collapsible-ClvC7Bj3.js → collapsible-oMUGM4tr.js} +3 -3
  104. package/dist/{collapsible-ClvC7Bj3.js.map → collapsible-oMUGM4tr.js.map} +1 -1
  105. package/dist/{collection-content-D6S8cv_n.js → collection-content-Ys-OZOkY.js} +3 -3
  106. package/dist/{collection-content-D6S8cv_n.js.map → collection-content-Ys-OZOkY.js.map} +1 -1
  107. package/dist/{combobox-BFnbJJp3.js → combobox-6dvVny2q.js} +96 -97
  108. package/dist/combobox-6dvVny2q.js.map +1 -0
  109. package/dist/{combobox-hozNwUcc.js → combobox-CB7039j7.js} +326 -308
  110. package/dist/combobox-CB7039j7.js.map +1 -0
  111. package/dist/{command-BnmSchli.js → command-kPMPjIxJ.js} +34 -30
  112. package/dist/command-kPMPjIxJ.js.map +1 -0
  113. package/dist/{comments-u5L0OGip.js → comments-You0Bzbr.js} +349 -348
  114. package/dist/comments-You0Bzbr.js.map +1 -0
  115. package/dist/components/base/accordion/accordion-variants.d.ts +3 -3
  116. package/dist/components/base/action-menu/action-menu.d.ts +7 -2
  117. package/dist/components/base/avatar/stacked-avatars.d.ts +5 -4
  118. package/dist/components/base/badge/badge.d.ts +1 -1
  119. package/dist/components/base/badge/badge.recipes.d.ts +4 -4
  120. package/dist/components/base/buttons/base-button.d.ts +7 -0
  121. package/dist/components/base/buttons/button-group.recipes.d.ts +2 -2
  122. package/dist/components/base/buttons/button.variants.d.ts +1 -0
  123. package/dist/components/base/buttons/loader-button.d.ts +3 -1
  124. package/dist/components/base/buttons/text-button.d.ts +2 -2
  125. package/dist/components/base/carousel/carousel.d.ts +3 -1
  126. package/dist/components/base/chart/chart.d.ts +7 -7
  127. package/dist/components/base/choice-inputs/checkbox.d.ts +6 -7
  128. package/dist/components/base/choice-inputs/choice-types.d.ts +10 -1
  129. package/dist/components/base/choice-inputs/pill-radio-group.d.ts +9 -0
  130. package/dist/components/base/choice-inputs/select-popup.d.ts +9 -1
  131. package/dist/components/base/choice-inputs/switch-card.d.ts +1 -1
  132. package/dist/components/base/date-pickers/date-picker-field.d.ts +23 -0
  133. package/dist/components/base/date-pickers/datepicker.types.d.ts +13 -3
  134. package/dist/components/base/display/alert-dialog.d.ts +8 -2
  135. package/dist/components/base/display/content-block.d.ts +4 -2
  136. package/dist/components/base/display/date-block.d.ts +1 -1
  137. package/dist/components/base/display/dialog.d.ts +12 -5
  138. package/dist/components/base/display/surface-title.d.ts +6 -1
  139. package/dist/components/base/feedback/alert.d.ts +1 -1
  140. package/dist/components/base/feedback/state-display.d.ts +5 -4
  141. package/dist/components/base/forms/form-sizing.d.ts +32 -0
  142. package/dist/components/base/forms/workflow.d.ts +2 -0
  143. package/dist/components/base/forms-numeric/coordinates-input.d.ts +3 -0
  144. package/dist/components/base/forms-numeric/rounding-mode-select.d.ts +4 -1
  145. package/dist/components/base/navigation/dropdown-menu.d.ts +2 -2
  146. package/dist/components/base/navigation/language-switcher.d.ts +4 -1
  147. package/dist/components/base/navigation/overflow-tab-bar.d.ts +7 -0
  148. package/dist/components/base/navigation/page-header/page-header.d.ts +4 -1
  149. package/dist/components/base/qr-code/qr-code.d.ts +2 -0
  150. package/dist/components/base/sheet/index.d.ts +29 -1
  151. package/dist/components/base/sheet/sheet.d.ts +14 -5
  152. package/dist/components/base/spinner/spinner.d.ts +3 -2
  153. package/dist/components/base/structure/structure.types.d.ts +1 -1
  154. package/dist/components/base/text-inputs/input-group.d.ts +2 -2
  155. package/dist/components/base/upload/upload.recipes.d.ts +11 -0
  156. package/dist/components/base/value-inputs/date-time-input.d.ts +4 -2
  157. package/dist/components/base/value-inputs/tags-input.d.ts +2 -0
  158. package/dist/components/blocks/admin/api-key-list/api-key-list.types.d.ts +1 -1
  159. package/dist/components/blocks/analytics/format-metric-value.d.ts +11 -1
  160. package/dist/components/blocks/analytics/index.d.ts +1 -1
  161. package/dist/components/blocks/analytics/use-metric-format-options.d.ts +3 -0
  162. package/dist/components/blocks/commerce/address-card/address-card.d.ts +1 -1
  163. package/dist/components/blocks/commerce/address-card/types.d.ts +3 -1
  164. package/dist/components/blocks/commerce/booking-calendar-event-card/booking-calendar-event-card.d.ts +4 -0
  165. package/dist/components/blocks/commerce/booking-calendar-event-card/booking-calendar-event-card.types.d.ts +2 -2
  166. package/dist/components/blocks/commerce/discount-stack/types.d.ts +1 -1
  167. package/dist/components/blocks/commerce/inventory-section/types.d.ts +4 -1
  168. package/dist/components/blocks/commerce/loyalty-points/types.d.ts +1 -1
  169. package/dist/components/blocks/commerce/order-status/types.d.ts +4 -0
  170. package/dist/components/blocks/commerce/payment-method/payment-method.d.ts +1 -1
  171. package/dist/components/blocks/commerce/payment-method/types.d.ts +3 -1
  172. package/dist/components/blocks/commerce/seo-listing/seo-listing-card.d.ts +1 -1
  173. package/dist/components/blocks/commerce/seo-listing/types.d.ts +3 -1
  174. package/dist/components/blocks/commerce/vendor-profile/types.d.ts +4 -1
  175. package/dist/components/blocks/data-display/dense-info-card/dense-info.strings.d.ts +4 -1
  176. package/dist/components/blocks/data-display/inline-stat/inline-stat.d.ts +4 -1
  177. package/dist/components/features/global-search/partials/global-search-idle-state.d.ts +1 -1
  178. package/dist/components/features/overlays/alert-dialog.d.ts +1 -1
  179. package/dist/components/features/overlays/drawer.d.ts +1 -1
  180. package/dist/components/features/overlays/hooks/use-overlay-actions.d.ts +2 -2
  181. package/dist/components/features/overlays/hooks/use-overlay-visibility.d.ts +11 -4
  182. package/dist/components/features/overlays/overlay-tone-icon.d.ts +37 -0
  183. package/dist/components/features/overlays/overlays.types.d.ts +42 -19
  184. package/dist/components/features/products/components/product-variants-manager.d.ts +1 -1
  185. package/dist/components/features/products/partials/index.d.ts +1 -1
  186. package/dist/components/features/products/partials/product-metric-tile.d.ts +6 -0
  187. package/dist/components/features/products/partials/product-tone.d.ts +11 -1
  188. package/dist/components/features/products/products.types.d.ts +2 -1
  189. package/dist/components/features/table/partials/cell-renderers.d.ts +1 -1
  190. package/dist/components/layout/page/index.d.ts +1 -1
  191. package/dist/components/layout/page/page.types.d.ts +53 -3
  192. package/dist/components/layout/page/partials/page-header-commands.d.ts +13 -0
  193. package/dist/components/layout/page/partials/page-header.d.ts +1 -1
  194. package/dist/components/primitives/date.d.ts +16 -3
  195. package/dist/components/primitives/dimensions.d.ts +6 -0
  196. package/dist/components/primitives/duration.d.ts +6 -0
  197. package/dist/components/primitives/file-size.d.ts +6 -0
  198. package/dist/components/primitives/index.d.ts +1 -1
  199. package/dist/components/primitives/initials.d.ts +11 -2
  200. package/dist/components/primitives/link.d.ts +7 -0
  201. package/dist/components/primitives/money.d.ts +29 -7
  202. package/dist/components/primitives/number.d.ts +17 -0
  203. package/dist/components/primitives/value-typography.d.ts +54 -0
  204. package/dist/components/primitives/value.d.ts +31 -6
  205. package/dist/components/typography/heading.d.ts +9 -1
  206. package/dist/components/typography/label.d.ts +3 -0
  207. package/dist/components/typography/running-text.d.ts +12 -0
  208. package/dist/components/typography/text-link.d.ts +23 -1
  209. package/dist/components/typography/text.d.ts +12 -0
  210. package/dist/components/typography/text.styles.d.ts +35 -13
  211. package/dist/components/ui/button.d.ts +1 -1
  212. package/dist/components/ui/checkbox.d.ts +5 -0
  213. package/dist/components/ui/overlay.recipes.d.ts +15 -2
  214. package/dist/components/ui/select.d.ts +3 -1
  215. package/dist/components/ui/switch.d.ts +5 -0
  216. package/dist/{containers-DqB-bSYE.js → containers-D_L4mTVb.js} +3 -3
  217. package/dist/{containers-DqB-bSYE.js.map → containers-D_L4mTVb.js.map} +1 -1
  218. package/dist/{copyable-BTSByfmq.js → copyable-DDjTeW_j.js} +4 -4
  219. package/dist/{copyable-BTSByfmq.js.map → copyable-DDjTeW_j.js.map} +1 -1
  220. package/dist/{data-display-Bihs9Ven.js → data-display-3xWQUnMA.js} +471 -478
  221. package/dist/data-display-3xWQUnMA.js.map +1 -0
  222. package/dist/date-picker-DrDFj8Lo.js +1527 -0
  223. package/dist/date-picker-DrDFj8Lo.js.map +1 -0
  224. package/dist/date-pickers-CnFCb0n2.js +174 -0
  225. package/dist/date-pickers-CnFCb0n2.js.map +1 -0
  226. package/dist/date-uf3z37Nm.js +144 -0
  227. package/dist/date-uf3z37Nm.js.map +1 -0
  228. package/dist/{display-CS6Hbk18.js → display-DrdvPwF0.js} +25 -25
  229. package/dist/display-DrdvPwF0.js.map +1 -0
  230. package/dist/{dropdown-menu-D-boNgGO.js → dropdown-menu-CURh59jb.js} +22 -15
  231. package/dist/dropdown-menu-CURh59jb.js.map +1 -0
  232. package/dist/features/activities.js +38 -35
  233. package/dist/features/activities.js.map +1 -1
  234. package/dist/features/ai-chat.js +36 -35
  235. package/dist/features/ai-chat.js.map +1 -1
  236. package/dist/features/async-preview.js +8 -8
  237. package/dist/features/combobox.js +1 -1
  238. package/dist/features/comments.js +1 -1
  239. package/dist/features/data-view.js +10 -10
  240. package/dist/features/email-composer.js +325 -326
  241. package/dist/features/email-composer.js.map +1 -1
  242. package/dist/features/event-calendar.js +190 -200
  243. package/dist/features/event-calendar.js.map +1 -1
  244. package/dist/features/filters.js +1 -1
  245. package/dist/features/global-search.js +77 -77
  246. package/dist/features/global-search.js.map +1 -1
  247. package/dist/features/kanban.js +4 -4
  248. package/dist/features/map.js +8 -8
  249. package/dist/features/media-library.js +499 -502
  250. package/dist/features/media-library.js.map +1 -1
  251. package/dist/features/mentions.js +1 -1
  252. package/dist/features/overlays.js +1 -1
  253. package/dist/features/products.js +1216 -1248
  254. package/dist/features/products.js.map +1 -1
  255. package/dist/features/questionnaire.js +46 -44
  256. package/dist/features/questionnaire.js.map +1 -1
  257. package/dist/features/resource-assignment.js +96 -88
  258. package/dist/features/resource-assignment.js.map +1 -1
  259. package/dist/features/resource.js +11 -11
  260. package/dist/features/rich-text-editor.js +2 -2
  261. package/dist/features/schema-form.js +188 -184
  262. package/dist/features/schema-form.js.map +1 -1
  263. package/dist/features/suggestions.js +3 -3
  264. package/dist/features/sync.js +7 -7
  265. package/dist/features/sync.js.map +1 -1
  266. package/dist/features/table.js +1 -1
  267. package/dist/features/theme-tweaker.js +469 -470
  268. package/dist/features/theme-tweaker.js.map +1 -1
  269. package/dist/{feedback-CJkUAapr.js → feedback-C7nR0UtT.js} +9 -10
  270. package/dist/feedback-C7nR0UtT.js.map +1 -0
  271. package/dist/field-affordance-recipes-CkOCdE2y.js +46 -0
  272. package/dist/field-affordance-recipes-CkOCdE2y.js.map +1 -0
  273. package/dist/{field-state-recipes-DQQpiLWC.js → field-state-recipes-C-MFBX_8.js} +3 -3
  274. package/dist/field-state-recipes-C-MFBX_8.js.map +1 -0
  275. package/dist/{filters-D6FF8L6s.js → filters-Da-gNPsE.js} +467 -467
  276. package/dist/filters-Da-gNPsE.js.map +1 -0
  277. package/dist/{form-field-CZwrkP7m.js → form-field-VZRULhUK.js} +7 -7
  278. package/dist/{form-field-CZwrkP7m.js.map → form-field-VZRULhUK.js.map} +1 -1
  279. package/dist/form-sizing-uWP4lzVh.js +126 -0
  280. package/dist/form-sizing-uWP4lzVh.js.map +1 -0
  281. package/dist/{forms-B5NCbkSC.js → forms-DDeEnXSY.js} +11 -11
  282. package/dist/forms-DDeEnXSY.js.map +1 -0
  283. package/dist/forms-numeric-D3CO60IF.js +905 -0
  284. package/dist/forms-numeric-D3CO60IF.js.map +1 -0
  285. package/dist/{header-kxruN3RM.js → header-2ycNqGOR.js} +43 -42
  286. package/dist/header-2ycNqGOR.js.map +1 -0
  287. package/dist/{hooks-BrlnCwQd.js → hooks-DQ5SPwZw.js} +2 -2
  288. package/dist/{hooks-BrlnCwQd.js.map → hooks-DQ5SPwZw.js.map} +1 -1
  289. package/dist/{icon-badge-Btc6pQrp.js → icon-badge-DKlaKXoo.js} +3 -3
  290. package/dist/{icon-badge-Btc6pQrp.js.map → icon-badge-DKlaKXoo.js.map} +1 -1
  291. package/dist/index.js +2 -2
  292. package/dist/{input-vxcaNCYC.js → input-BoLm9Hks.js} +3 -3
  293. package/dist/{input-vxcaNCYC.js.map → input-BoLm9Hks.js.map} +1 -1
  294. package/dist/input-DhQdBnV3.js +255 -0
  295. package/dist/{input-SX9V0AL3.js.map → input-DhQdBnV3.js.map} +1 -1
  296. package/dist/item-xzh8Df65.js +264 -0
  297. package/dist/item-xzh8Df65.js.map +1 -0
  298. package/dist/layout/app-shell.js +1 -1
  299. package/dist/layout/auth.js +1 -1
  300. package/dist/layout/containers.js +1 -1
  301. package/dist/layout/header.js +1 -1
  302. package/dist/layout/hooks.js +1 -1
  303. package/dist/layout/navigation.js +1 -1
  304. package/dist/layout/page.js +1 -1
  305. package/dist/layout/settings.js +1 -1
  306. package/dist/layout/sidebar.js +2 -2
  307. package/dist/layout/workspace.js +1 -1
  308. package/dist/layout.js +10 -10
  309. package/dist/lib/affordance-geometry.generated.d.ts +6 -1
  310. package/dist/lib/field-affordance-recipes.d.ts +35 -0
  311. package/dist/lib/field-state-recipes.d.ts +4 -2
  312. package/dist/lib/format.d.ts +9 -0
  313. package/dist/lib/money-format.d.ts +30 -0
  314. package/dist/lib/overlay-anatomy-recipes.d.ts +1 -1
  315. package/dist/lib/surface-recipes.d.ts +8 -6
  316. package/dist/lib/token-merge.generated.d.ts +11 -11
  317. package/dist/lib/track-recipes.d.ts +1 -1
  318. package/dist/lib/ui-provider/provider.d.ts +7 -2
  319. package/dist/lib/ui-provider/store.d.ts +6 -2
  320. package/dist/lib/ui-provider/types.d.ts +5 -2
  321. package/dist/lib/utils.js +1 -1
  322. package/dist/{media-gallery-DLp3HAz0.js → media-gallery-DQUQ0m3O.js} +8 -8
  323. package/dist/media-gallery-DQUQ0m3O.js.map +1 -0
  324. package/dist/{mentions-Cl0Kt_Pd.js → mentions-DwnO1hh4.js} +34 -35
  325. package/dist/{mentions-Cl0Kt_Pd.js.map → mentions-DwnO1hh4.js.map} +1 -1
  326. package/dist/{message-SZUNB1eX.js → message-YfFmbXNP.js} +5 -5
  327. package/dist/{message-SZUNB1eX.js.map → message-YfFmbXNP.js.map} +1 -1
  328. package/dist/{navigation-DyytsLRB.js → navigation-Cbp5V8gG.js} +33 -34
  329. package/dist/navigation-Cbp5V8gG.js.map +1 -0
  330. package/dist/{navigation-DnQSNMT0.js → navigation-Cs1npsPm.js} +111 -87
  331. package/dist/navigation-Cs1npsPm.js.map +1 -0
  332. package/dist/{navigation-row-recipes-DQEXQcqY.js → navigation-row-recipes-DlU-4QYO.js} +2 -2
  333. package/dist/{navigation-row-recipes-DQEXQcqY.js.map → navigation-row-recipes-DlU-4QYO.js.map} +1 -1
  334. package/dist/number-CKRBYmZK.js +352 -0
  335. package/dist/number-CKRBYmZK.js.map +1 -0
  336. package/dist/overlay.recipes-CNO2S9V6.js +34 -0
  337. package/dist/overlay.recipes-CNO2S9V6.js.map +1 -0
  338. package/dist/overlays-DhZO7N-I.js +994 -0
  339. package/dist/overlays-DhZO7N-I.js.map +1 -0
  340. package/dist/page-C6R_8jFt.js +325 -0
  341. package/dist/page-C6R_8jFt.js.map +1 -0
  342. package/dist/{page-header-D8nERkn5.js → page-header-hUTzcRZX.js} +9 -9
  343. package/dist/page-header-hUTzcRZX.js.map +1 -0
  344. package/dist/{pagination-NLGqRirf.js → pagination-Cm0jqa3I.js} +8 -8
  345. package/dist/{pagination-NLGqRirf.js.map → pagination-Cm0jqa3I.js.map} +1 -1
  346. package/dist/{popover-CghIYdQf.js → popover-Dcv_9jxr.js} +6 -6
  347. package/dist/{popover-CghIYdQf.js.map → popover-Dcv_9jxr.js.map} +1 -1
  348. package/dist/{popover-menu-B4PoWhRl.js → popover-menu-DnRFKnHP.js} +6 -6
  349. package/dist/{popover-menu-B4PoWhRl.js.map → popover-menu-DnRFKnHP.js.map} +1 -1
  350. package/dist/{popover.recipes-QlD4JenO.js → popover.recipes-wmbvL8Ah.js} +2 -2
  351. package/dist/{popover.recipes-QlD4JenO.js.map → popover.recipes-wmbvL8Ah.js.map} +1 -1
  352. package/dist/primitives-BHrwQXFC.js +379 -0
  353. package/dist/primitives-BHrwQXFC.js.map +1 -0
  354. package/dist/primitives.js +5 -5
  355. package/dist/{progress-BroqrAyV.js → progress-Br9WTFya.js} +7 -7
  356. package/dist/progress-Br9WTFya.js.map +1 -0
  357. package/dist/{receipt-BuJynLgf.js → receipt-CV89q1fs.js} +6 -6
  358. package/dist/{receipt-BuJynLgf.js.map → receipt-CV89q1fs.js.map} +1 -1
  359. package/dist/{rich-text-editor-BKyG7rWz.js → rich-text-editor-CF8QYt5p.js} +6 -6
  360. package/dist/{rich-text-editor-BKyG7rWz.js.map → rich-text-editor-CF8QYt5p.js.map} +1 -1
  361. package/dist/{rich-text-editor.recipes-B72Nfuze.js → rich-text-editor.recipes-CnrbmTS1.js} +4 -4
  362. package/dist/{rich-text-editor.recipes-B72Nfuze.js.map → rich-text-editor.recipes-CnrbmTS1.js.map} +1 -1
  363. package/dist/{rich-text-DlxDOtf4.js → rich-text-j-FGAeZW.js} +4 -4
  364. package/dist/{rich-text-DlxDOtf4.js.map → rich-text-j-FGAeZW.js.map} +1 -1
  365. package/dist/{scroll-area-D-pIhEKl.js → scroll-area-DRdr16Pt.js} +3 -3
  366. package/dist/scroll-area-DRdr16Pt.js.map +1 -0
  367. package/dist/{separator-BhtFyo4x.js → separator-BMEvwnSX.js} +2 -2
  368. package/dist/{separator-BhtFyo4x.js.map → separator-BMEvwnSX.js.map} +1 -1
  369. package/dist/{separator-BNIgG3au.js → separator-Do5GWDYi.js} +4 -4
  370. package/dist/separator-Do5GWDYi.js.map +1 -0
  371. package/dist/services/actions/action-adapters.d.ts +4 -0
  372. package/dist/services/actions.js +8 -3
  373. package/dist/services/actions.js.map +1 -1
  374. package/dist/{settings-DOTOzeZ2.js → settings-DHk0L2MF.js} +17 -17
  375. package/dist/settings-DHk0L2MF.js.map +1 -0
  376. package/dist/sheet-DRFNY1_D.js +207 -0
  377. package/dist/sheet-DRFNY1_D.js.map +1 -0
  378. package/dist/sidebar-Cb8WzOvE.js +511 -0
  379. package/dist/sidebar-Cb8WzOvE.js.map +1 -0
  380. package/dist/{sidebar-CyR4XKwR.js → sidebar-Crc9M9JV.js} +18 -18
  381. package/dist/sidebar-Crc9M9JV.js.map +1 -0
  382. package/dist/{skeleton-3F0uhYn3.js → skeleton-DVMXr15h.js} +4 -4
  383. package/dist/{skeleton-3F0uhYn3.js.map → skeleton-DVMXr15h.js.map} +1 -1
  384. package/dist/{smart-card-DjGVV2xr.js → smart-card-Bek-TwUp.js} +222 -207
  385. package/dist/smart-card-Bek-TwUp.js.map +1 -0
  386. package/dist/{spinner-Cpf7oRkF.js → spinner-CmTAbEp0.js} +8 -6
  387. package/dist/spinner-CmTAbEp0.js.map +1 -0
  388. package/dist/{structure-CRdqVawd.js → structure-hzCW-XsV.js} +3 -3
  389. package/dist/{structure-CRdqVawd.js.map → structure-hzCW-XsV.js.map} +1 -1
  390. package/dist/{structure.recipes-Bqhf9oIh.js → structure.recipes-EPz60cU8.js} +37 -19
  391. package/dist/structure.recipes-EPz60cU8.js.map +1 -0
  392. package/dist/style.css +1 -1
  393. package/dist/surface-recipes-DOdoBXGm.js +28 -0
  394. package/dist/surface-recipes-DOdoBXGm.js.map +1 -0
  395. package/dist/table-D6zKeYQX.js +162 -0
  396. package/dist/table-D6zKeYQX.js.map +1 -0
  397. package/dist/{table-CcRDZiLP.js → table-Dn4XSrSB.js} +348 -348
  398. package/dist/table-Dn4XSrSB.js.map +1 -0
  399. package/dist/{tabs-BNgu7g0u.js → tabs-Dk8E_knt.js} +14 -13
  400. package/dist/tabs-Dk8E_knt.js.map +1 -0
  401. package/dist/{text-inputs-DsR56TR-.js → text-inputs-BFpku0Qd.js} +150 -149
  402. package/dist/text-inputs-BFpku0Qd.js.map +1 -0
  403. package/dist/{text.styles-Q4sGAIgA.js → text.styles-g4He6UIW.js} +17 -14
  404. package/dist/text.styles-g4He6UIW.js.map +1 -0
  405. package/dist/theme.css +16 -12
  406. package/dist/themes/green.css +24 -0
  407. package/dist/{timelines-D1pkt3se.js → timelines-CxuAFIc2.js} +25 -38
  408. package/dist/timelines-CxuAFIc2.js.map +1 -0
  409. package/dist/track-recipes-CDcKmndW.js +10 -0
  410. package/dist/track-recipes-CDcKmndW.js.map +1 -0
  411. package/dist/{tree-BtmYyMZV.js → tree-BotPlyiD.js} +13 -13
  412. package/dist/{tree-BtmYyMZV.js.map → tree-BotPlyiD.js.map} +1 -1
  413. package/dist/typography/rich-text.js +1 -1
  414. package/dist/typography-CAr3dQhX.js +116 -0
  415. package/dist/typography-CAr3dQhX.js.map +1 -0
  416. package/dist/typography.js +2 -2
  417. package/dist/{ui-provider-DRPn3qNl.js → ui-provider-D2_TeLqw.js} +20 -21
  418. package/dist/ui-provider-D2_TeLqw.js.map +1 -0
  419. package/dist/ui-provider.js +1 -1
  420. package/dist/{upload-CDbYw1WN.js → upload-B0WHW7ak.js} +221 -220
  421. package/dist/upload-B0WHW7ak.js.map +1 -0
  422. package/dist/{upload-queue-CNd_hH_a.js → upload-queue-BHZ_wBfd.js} +59 -62
  423. package/dist/upload-queue-BHZ_wBfd.js.map +1 -0
  424. package/dist/{usage-card-VyJLUwRr.js → usage-card-U0YBLTNT.js} +42 -43
  425. package/dist/{usage-card-VyJLUwRr.js.map → usage-card-U0YBLTNT.js.map} +1 -1
  426. package/dist/{utils-BvH9PSmq.js → utils-Cospvlj1.js} +221 -51
  427. package/dist/utils-Cospvlj1.js.map +1 -0
  428. package/dist/value-inputs-CjfzGMsN.js +854 -0
  429. package/dist/value-inputs-CjfzGMsN.js.map +1 -0
  430. package/dist/value-typography-Deb3yQZg.js +116 -0
  431. package/dist/value-typography-Deb3yQZg.js.map +1 -0
  432. package/dist/{workspace-CcR8r-Nt.js → workspace-YoFjXi6i.js} +44 -45
  433. package/dist/workspace-YoFjXi6i.js.map +1 -0
  434. package/docs/consumer-skill/SKILL.md +51 -38
  435. package/docs/consumer-skill/examples/app-layout.tsx +2 -4
  436. package/docs/consumer-skill/examples/detail.tsx +3 -4
  437. package/docs/consumer-skill/examples/edit.tsx +1 -1
  438. package/docs/consumer-skill/examples/layout-blocks.tsx +20 -0
  439. package/docs/consumer-skill/examples/manifest.json +28 -6
  440. package/docs/consumer-skill/examples/scoped-directory.tsx +2 -2
  441. package/docs/consumer-skill/references/composition.md +89 -17
  442. package/docs/consumer-skill/references/discovery.md +4 -0
  443. package/docs/consumer-skill/references/installation.md +22 -0
  444. package/docs/consumer-skill/references/integration.md +32 -1
  445. package/docs/consumer-skill/references/public-api.json +111 -70
  446. package/docs/consumer-skill/references/review.md +20 -4
  447. package/docs/consumer-skill/references/theming.md +7 -1
  448. package/docs/consumer-skill/references/tokens.json +5 -2
  449. package/docs/consumer-skill/references/workflows.md +4 -2
  450. package/docs/consumer-skill/scripts/composition-policy.mjs +93 -2
  451. package/docs/consumer-skill/scripts/discovery.mjs +11 -3
  452. package/docs/consumer-skill/scripts/pin-button-defaults.mjs +95 -0
  453. package/package.json +5 -3
  454. package/dist/accordion-BRTcsp8J.js.map +0 -1
  455. package/dist/action-menu-Drxw_vJk.js +0 -265
  456. package/dist/action-menu-Drxw_vJk.js.map +0 -1
  457. package/dist/affordance-geometry.generated-CL84ZN9A.js.map +0 -1
  458. package/dist/ai-artifact-DLVdK0Py.js.map +0 -1
  459. package/dist/avatar-Bu2HhitA.js.map +0 -1
  460. package/dist/badge-CzId1Wlm.js.map +0 -1
  461. package/dist/button-BZDasD04.js.map +0 -1
  462. package/dist/buttons-D_6KJvEE.js.map +0 -1
  463. package/dist/chart-Bsc5BICK.js.map +0 -1
  464. package/dist/checkbox-BQNDjUCh.js +0 -34
  465. package/dist/checkbox-BQNDjUCh.js.map +0 -1
  466. package/dist/choice-inputs-Mk3iWbhr.js +0 -725
  467. package/dist/choice-inputs-Mk3iWbhr.js.map +0 -1
  468. package/dist/combobox-BFnbJJp3.js.map +0 -1
  469. package/dist/combobox-hozNwUcc.js.map +0 -1
  470. package/dist/command-BnmSchli.js.map +0 -1
  471. package/dist/comments-u5L0OGip.js.map +0 -1
  472. package/dist/data-display-Bihs9Ven.js.map +0 -1
  473. package/dist/date-DOKhJPu7.js +0 -140
  474. package/dist/date-DOKhJPu7.js.map +0 -1
  475. package/dist/date-picker-DzP5HQq7.js +0 -1541
  476. package/dist/date-picker-DzP5HQq7.js.map +0 -1
  477. package/dist/date-pickers-BpgGz7S-.js +0 -196
  478. package/dist/date-pickers-BpgGz7S-.js.map +0 -1
  479. package/dist/display-CS6Hbk18.js.map +0 -1
  480. package/dist/dropdown-menu-D-boNgGO.js.map +0 -1
  481. package/dist/feedback-CJkUAapr.js.map +0 -1
  482. package/dist/field-affordance-recipes-uKY4MsZ_.js +0 -25
  483. package/dist/field-affordance-recipes-uKY4MsZ_.js.map +0 -1
  484. package/dist/field-state-recipes-DQQpiLWC.js.map +0 -1
  485. package/dist/filters-D6FF8L6s.js.map +0 -1
  486. package/dist/form-sizing-QP8aIRaW.js +0 -103
  487. package/dist/form-sizing-QP8aIRaW.js.map +0 -1
  488. package/dist/format-iamDSqs2.js +0 -110
  489. package/dist/format-iamDSqs2.js.map +0 -1
  490. package/dist/forms-B5NCbkSC.js.map +0 -1
  491. package/dist/forms-numeric-Crrm80Lm.js +0 -867
  492. package/dist/forms-numeric-Crrm80Lm.js.map +0 -1
  493. package/dist/header-kxruN3RM.js.map +0 -1
  494. package/dist/input-SX9V0AL3.js +0 -255
  495. package/dist/item-DE4YnuJx.js +0 -258
  496. package/dist/item-DE4YnuJx.js.map +0 -1
  497. package/dist/media-gallery-DLp3HAz0.js.map +0 -1
  498. package/dist/navigation-DnQSNMT0.js.map +0 -1
  499. package/dist/navigation-DyytsLRB.js.map +0 -1
  500. package/dist/number-DasMFWEG.js +0 -269
  501. package/dist/number-DasMFWEG.js.map +0 -1
  502. package/dist/overlay.recipes-BxW5FIfK.js +0 -6
  503. package/dist/overlay.recipes-BxW5FIfK.js.map +0 -1
  504. package/dist/overlays-DUbs1KEi.js +0 -1011
  505. package/dist/overlays-DUbs1KEi.js.map +0 -1
  506. package/dist/page-hGmT4nWK.js +0 -213
  507. package/dist/page-hGmT4nWK.js.map +0 -1
  508. package/dist/page-header-D8nERkn5.js.map +0 -1
  509. package/dist/primitives-C7ff0QaI.js +0 -337
  510. package/dist/primitives-C7ff0QaI.js.map +0 -1
  511. package/dist/progress-BroqrAyV.js.map +0 -1
  512. package/dist/scroll-area-D-pIhEKl.js.map +0 -1
  513. package/dist/separator-BNIgG3au.js.map +0 -1
  514. package/dist/settings-DOTOzeZ2.js.map +0 -1
  515. package/dist/sheet-BFhrNehm.js +0 -205
  516. package/dist/sheet-BFhrNehm.js.map +0 -1
  517. package/dist/sidebar-CyR4XKwR.js.map +0 -1
  518. package/dist/sidebar-SvGJ0Zwi.js +0 -506
  519. package/dist/sidebar-SvGJ0Zwi.js.map +0 -1
  520. package/dist/smart-card-DjGVV2xr.js.map +0 -1
  521. package/dist/spinner-Cpf7oRkF.js.map +0 -1
  522. package/dist/structure.recipes-Bqhf9oIh.js.map +0 -1
  523. package/dist/surface-recipes-Dd__PD-w.js +0 -28
  524. package/dist/surface-recipes-Dd__PD-w.js.map +0 -1
  525. package/dist/table-CLtJTxoR.js +0 -147
  526. package/dist/table-CLtJTxoR.js.map +0 -1
  527. package/dist/table-CcRDZiLP.js.map +0 -1
  528. package/dist/tabs-BNgu7g0u.js.map +0 -1
  529. package/dist/text-inputs-DsR56TR-.js.map +0 -1
  530. package/dist/text.styles-Q4sGAIgA.js.map +0 -1
  531. package/dist/timelines-D1pkt3se.js.map +0 -1
  532. package/dist/track-recipes-LLPNVwFg.js +0 -10
  533. package/dist/track-recipes-LLPNVwFg.js.map +0 -1
  534. package/dist/typography-BxQgiZyw.js +0 -96
  535. package/dist/typography-BxQgiZyw.js.map +0 -1
  536. package/dist/ui-provider-DRPn3qNl.js.map +0 -1
  537. package/dist/upload-CDbYw1WN.js.map +0 -1
  538. package/dist/upload-queue-CNd_hH_a.js.map +0 -1
  539. package/dist/utils-BvH9PSmq.js.map +0 -1
  540. package/dist/value-inputs-D0KCrfVC.js +0 -840
  541. package/dist/value-inputs-D0KCrfVC.js.map +0 -1
  542. package/dist/workspace-CcR8r-Nt.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"global-search.js","names":["React","_Fragment","React","useDensityConfig","cn","TextButton","DisplayLabel","Stack","ActionDialog","Value","SecondaryValue","AvatarFallback","Avatar","AvatarImage","Badge","fieldAffordanceRecipes","editableTextSizeClasses","resolveFormControlSize","formControlSizeClasses","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","KBD_CLASS","GlobalSearchFooter","className","Text","navigateLabel","openLabel","closeLabel","trailing","GlobalSearchIdleState","sections","HeadingIcon","section","fallbackIcons","Clock","Sparkles","ItemIcon","GlobalSearchInput","innerRef","size","defaultScale","ref","autoFocus","onValueChange","placeholder","loading","Loader2","value","clearLabel","X","DEFAULT_TONE_BG","DEFAULT_TONE_AVATAR","highlightMatch","q","text","lower","ql","GlobalSearchResultRow","ThumbIcon","result","bg","av","onSelect","active","pieces","Icon","m","tag","p","ArrowRight","GlobalSearchTabs","tabs","isActive","count","GlobalSearch","stringsProp","strings","useStrings","search","isEmpty","isIdle","resolvedTabs","groupKeys","key","groupLabels","slots","onQueryChange","idleSections","interpolateString","groupKey","items","gi","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-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 */\nimport { Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nconst KBD_CLASS =\n\t'rounded border border-border bg-muted/40 px-1.5 py-0.5 font-mono text-xs leading-none text-muted-foreground';\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\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 flex flex-col items-stretch gap-space-xs border-t border-border/60 px-surface py-row-y @sm/global-search:flex-row @sm/global-search:items-center @sm/global-search:justify-between',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<span className=\"global-search-footer--shortcuts flex items-center gap-space-md\">\n\t\t\t\t<kbd className={KBD_CLASS}>↑↓</kbd>\n\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\">\n\t\t\t\t\t{navigateLabel}\n\t\t\t\t</Text>\n\t\t\t\t<kbd className={KBD_CLASS}>↵</kbd>\n\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\">\n\t\t\t\t\t{openLabel}\n\t\t\t\t</Text>\n\t\t\t\t<kbd className={KBD_CLASS}>esc</kbd>\n\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\">\n\t\t\t\t\t{closeLabel}\n\t\t\t\t</Text>\n\t\t\t</span>\n\t\t\t{trailing ? (\n\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{trailing}\n\t\t\t\t</span>\n\t\t\t) : null}\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.\n */\nimport { Clock, Search, Sparkles } from 'lucide-react';\nimport * as React from 'react';\n\nimport { Stack } from '../../../base/structure';\nimport { DisplayLabel, Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nimport type { GlobalSearchIdleSection } from '../global-search.types';\n\nexport interface GlobalSearchIdleStateProps {\n\t/** Sections to render, in display order. */\n\tsections: ReadonlyArray<GlobalSearchIdleSection>;\n\t/** Optional override for the heading icon when missing on a section. */\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=\"global-search-idle-state--component p-surface\">\n\t\t<Stack gap=\"xl\">\n\t\t\t{sections.map((section, idx) => {\n\t\t\t\tconst HeadingIcon =\n\t\t\t\t\tsection.icon ??\n\t\t\t\t\t(idx === 0\n\t\t\t\t\t\t? fallbackIcons?.recent ?? Clock\n\t\t\t\t\t\t: fallbackIcons?.suggestions ?? Sparkles);\n\t\t\t\treturn (\n\t\t\t\t\t<div key={section.id}>\n\t\t\t\t\t\t<div className=\"flex items-center gap-space-md px-space-lg pb-space-sm\">\n\t\t\t\t\t\t\t<HeadingIcon\n\t\t\t\t\t\t\t\tclassName=\"size-icon-md text-muted-foreground\"\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<DisplayLabel>\n\t\t\t\t\t\t\t\t{section.label}\n\t\t\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<Stack render={<ul />} gap=\"2xs\" className=\"m-0 list-none p-0\">\n\t\t\t\t\t\t\t{section.items.map((item) => {\n\t\t\t\t\t\t\t\tconst ItemIcon = item.icon ?? Search;\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<li key={item.id}>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={item.onSelect}\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t'box-border m-0 flex w-full cursor-pointer items-center justify-start border-0 bg-transparent font-sans text-foreground outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset gap-space-lg rounded-inner px-row-x py-row-y-sm text-left transition-colors',\n\t\t\t\t\t\t\t\t\t\t\t\t'hover:bg-muted/50 focus-visible:bg-muted/50',\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\t\t<ItemIcon\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"size-icon-md text-muted-foreground\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t<Text className=\"flex-1 truncate\">\n\t\t\t\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t})}\n\t\t</Stack>\n\t\t</div>\n\t);\n}\n","/**\n * GlobalSearchInput — search row at the top of the popover.\n *\n * Just the input + clear button + optional loading spinner. Keyboard\n * navigation is handled by the consumer wiring `useGlobalSearch`'s\n * `onKeyDown` handler.\n */\nimport { Loader2, Search, X } from 'lucide-react';\nimport * as React from 'react';\n\nimport { formControlSizeClasses, resolveFormControlSize } from '../../../base/forms/form-sizing';\nimport { Stack } from '../../../base/structure';\nimport { editableTextSizeClasses } from '../../../../lib/editable-text-recipe';\nimport { fieldAffordanceRecipes } from '../../../../lib/field-affordance-recipes';\nimport { useDensityConfig } from '../../../../lib/ui-provider';\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\tconst { defaultScale } = useDensityConfig();\n\tconst size = resolveFormControlSize(undefined, defaultScale);\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 border-b border-border px-surface py-row-y\"\n\t\t>\n\t\t\t<Stack direction=\"horizontal\" gap=\"md\" wrap={false}>\n\t\t\t\t<Search className=\"size-icon shrink-0 text-muted-foreground\" aria-hidden=\"true\" />\n\t\t\t\t<div className=\"min-w-0 flex-1\">\n\t\t\t\t\t<input\n\t\t\t\t\t\tref={innerRef}\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\tonChange={(e) => onValueChange(e.target.value)}\n\t\t\t\t\t\tonKeyDown={onKeyDown}\n\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\taria-label={placeholder}\n\t\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\t\tspellCheck={false}\n\t\t\t\t\t\t\tclassName={cn(formControlSizeClasses[size], editableTextSizeClasses[size], 'box-border m-0 block w-full min-w-0 border-0 bg-transparent p-0 outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset rounded-inner')}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t{loading && <Loader2 className=\"size-icon shrink-0 animate-spin text-muted-foreground\" aria-hidden=\"true\" />}\n\t\t\t\t{!loading && !!value && (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tonValueChange('');\n\t\t\t\t\t\t\t\tinnerRef.current?.focus();\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\taria-label={clearLabel}\n\t\t\t\t\t\t\tclassName={cn(fieldAffordanceRecipes.target, fieldAffordanceRecipes.focus, fieldAffordanceRecipes.clear)}\n\t\t\t\t\t>\n\t\t\t\t\t\t\t<X className={fieldAffordanceRecipes.icon} />\n\t\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t</div>\n\t);\n});\n","/**\n * Default tone palettes for thumbnails and avatars.\n *\n * Consumers can override per-call via `slots.toneBg` / `slots.toneAvatar`.\n */\nimport type { GlobalSearchTone } from '../global-search.types';\n\nexport const DEFAULT_TONE_BG: Record<GlobalSearchTone, string> = {\n\tneutral: 'bg-muted text-muted-foreground',\n\tprimary: 'bg-primary/5 text-primary-accent',\n\tsuccess: 'bg-success/10 text-success',\n\twarning: 'bg-warning/10 text-warning-accent',\n\tinfo: 'bg-info/10 text-info',\n\tdestructive: 'bg-destructive/10 text-destructive',\n};\n\nexport const DEFAULT_TONE_AVATAR: Record<GlobalSearchTone, string> = {\n\tneutral: 'bg-muted text-muted-foreground',\n\tprimary: 'bg-primary/10 text-primary-accent',\n\tsuccess: 'bg-success/10 text-success',\n\twarning: 'bg-warning/10 text-warning-accent',\n\tinfo: 'bg-info/10 text-info',\n\tdestructive: 'bg-destructive/10 text-destructive',\n};\n","/**\n * GlobalSearchResultRow — single rich result card.\n *\n * Layout: [thumbnail] [title + status pill / muted secondary line / meta] [right-value column] [chevron].\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';\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=\"rounded-radius-sm bg-warning/40 px-0.5 text-foreground\">\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'group/row relative box-border m-0 flex w-full cursor-pointer items-center justify-start border-0 bg-transparent font-sans text-foreground outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset gap-space-lg rounded-inner px-row-x py-row-y text-left transition-colors',\n\t\t\t\t'global-search-result-row--component',\n\t\t\t\tactive ? 'bg-muted/60' : 'hover:bg-muted/40',\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-radius',\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\" 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 items-center gap-space-sm leading-tight\">\n\t\t\t\t\t<Text tag=\"span\" weight=\"semibold\" 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 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 opacity-60\"\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 border-l border-border/60 pl-row-x @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\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<span\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'inline-flex size-action-sm shrink-0 items-center justify-center rounded-inner transition-all',\n\t\t\t\t\tactive\n\t\t\t\t\t\t? 'bg-foreground text-background 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\t\t<ArrowRight className=\"size-icon-md\" />\n\t\t\t</span>\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 a\n * subtle count pill next to each label.\n */\nimport { Tabs, TabsList, TabsTrigger } from '../../../base/navigation/tabs';\nimport { Text } from '../../../typography';\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=\"global-search-tabs--component border-b border-border/60 px-surface py-row-y\">\n\t\t\t<div className=\"global-search-tabs--scroller overflow-x-auto p-space-xs [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 isActive = value === tab.value;\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<Text\n\t\t\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\t\tweight=\"medium\"\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t'global-search-tabs--count rounded px-1 py-0 tabular-nums',\n\t\t\t\t\t\t\t\t\t\t\tisActive\n\t\t\t\t\t\t\t\t\t\t\t\t? 'bg-muted text-foreground'\n\t\t\t\t\t\t\t\t\t\t\t\t: 'bg-transparent text-foreground',\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{count}\n\t\t\t\t\t\t\t\t\t</Text>\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 { Stack } from '../../base/structure';\nimport { DisplayLabel, 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';\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 shadow-2xl',\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<div className=\"max-h-[520px] 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 p-surface\" 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=\"global-search--results p-surface\">\n\t\t\t\t\t\t{Object.entries(search.visibleGrouped).map(\n\t\t\t\t\t\t\t([groupKey, items], gi) => (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={groupKey}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t'pb-space-xs last:pb-0',\n\t\t\t\t\t\t\t\t\t\tgi > 0 && 'mt-space-md pt-space-xs',\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<div className=\"flex items-center justify-between px-row-x pb-space-2xs\">\n\t\t\t\t\t\t\t\t\t\t<DisplayLabel>\n\t\t\t\t\t\t\t\t\t\t\t{groupLabels?.[groupKey as TGroup] ?? groupKey}\n\t\t\t\t\t\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t\t\t\t\t\t{search.activeTab === 'all' && items.length > 0 && (\n\t\t\t\t\t\t\t\t\t\t\t<TextButton\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\t\t\t\tsearch.setActiveTab(groupKey as TGroup)\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\tclassName=\"text-primary-accent\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-primary-accent\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{strings.seeAll}\n\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t</TextButton>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<Stack render={<ul />} gap=\"2xs\" className=\"m-0 list-none p-0\">\n\t\t\t\t\t\t\t\t\t\t{items.map((item) => {\n\t\t\t\t\t\t\t\t\t\t\tconst isActive =\n\t\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\t\tconst ctx = {\n\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t\tquery,\n\t\t\t\t\t\t\t\t\t\t\t\tonSelect: () => onResultSelect?.(item),\n\t\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t\tconst node = slots?.renderResult ? (\n\t\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\t) : (\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\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/>\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\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\t})}\n\t\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t),\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,IAAayB,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;;;ACnBA,IAAMC,IACL;AAeD,SAAgBC,EAAmB,EAClC,kBACA,cACA,eACA,aACA,gBAC2B;CAC3B,OACC,kBAAC,OAAD;EACC,WAAWvD,EACV,sNACAwD,CACD;EAJD,UAAA,CAMC,kBAAC,QAAD;GAAM,WAAU;GAAhB,UAAA;IACC,kBAAC,OAAD;KAAK,WAAWF;KAAW,UAAA;IAAO,CAAA;IAClC,kBAACG,GAAD;KAAM,KAAI;KAAO,MAAK;KAAK,MAAK;KAC9B,UAAAC;IACI,CAAA;IACN,kBAAC,OAAD;KAAK,WAAWJ;KAAW,UAAA;IAAM,CAAA;IACjC,kBAACG,GAAD;KAAM,KAAI;KAAO,MAAK;KAAK,MAAK;KAC9B,UAAAE;IACI,CAAA;IACN,kBAAC,OAAD;KAAK,WAAWL;KAAW,UAAA;IAAQ,CAAA;IACnC,kBAACG,GAAD;KAAM,KAAI;KAAO,MAAK;KAAK,MAAK;KAC9B,UAAAG;IACI,CAAA;GACD;EACL,CAAA,GAAAC,IACA,kBAAC,QAAD;GAAM,WAAU;GACd,UAAAA;EACI,CAAA,IACH,IACA;;AAEP;;;ACtCA,SAAgBC,EAAsB,EACrC,aACA,oBAC8B;CAC9B,OACC,kBAAC,OAAD;EAAK,WAAU;EACf,UAAA,kBAAC3D,GAAD;GAAO,KAAI;GACT,UAAA4D,EAAS,KAAK,GAAS,MAAQ;IAC/B,IAAMC,IACLC,EAAQ,SACPpB,MAAQ,IACNqB,GAAe,UAAUC,IACzBD,GAAe,eAAeE;IAClC,OACC,kBAAC,OAAD,EAAA,UAAA,CACC,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACC,kBAACJ,GAAD;MACC,WAAU;MACV,eAAY;KACZ,CAAA,GACD,kBAAC9D,GAAD,EAAA,UACE+D,EAAQ,MACI,CAAA,CACV;IACL,CAAA,GAAA,kBAAC9D,GAAD;KAAO,QAAQ,kBAAC,MAAD,CAAK,CAAA;KAAG,KAAI;KAAM,WAAU;KACzC,UAAA8D,EAAQ,MAAM,KAAK,MAAS;MAC5B,IAAMI,IAAWrB,EAAK,QAAQK;MAC9B,OACC,kBAAC,MAAD,EAAA,UACC,kBAAC,UAAD;OACC,MAAK;OACL,SAASL,EAAK;OACd,WAAWhD,EACV,yRACA,6CACD;OAND,UAAA,CAQC,kBAACqE,GAAD;QACC,WAAU;QACV,eAAY;OACZ,CAAA,GACD,kBAACZ,GAAD;QAAM,WAAU;QACd,UAAAT,EAAK;OACD,CAAA,CACC;MACL,CAAA,EAAA,GAjBKA,EAAK,EAiBV;KAEN,CAAC;IACK,CAAA,CACH,EAAA,GAnCKiB,EAAQ,EAmCb;GAEP,CAAC;EACK,CAAA;CACF,CAAA;AAEP;;;AC1CA,IAAaK,IAAoB1E,EAAM,WAAqD,SAC3F,EAAE,UAAO,kBAAe,cAAW,gBAAa,gBAAa,gBAAgB,aAAU,IAAO,eAAY,MAC1G,GACC;CACD,IAAM2E,IAAW3E,EAAM,OAAgC,IAAI,GACrD,EAAE,oBAAiBG,EAAiB,GACpCyE,IAAO3D,EAAuB,KAAA,GAAW4D,CAAY;CAO3D,OANAtD,EAAM,oBAAoBuD,SAAWH,EAAS,OAA2B,GAEzEpD,EAAM,gBAAgB;EACrB,AAAIwD,KAAWJ,EAAS,SAAS,MAAM;CACxC,GAAG,CAACI,CAAS,CAAC,GAGb,kBAAC,OAAD;EACC,kBAAe;EACf,aAAU;EACV,WAAU;EAEV,UAAA,kBAACxE,GAAD;GAAO,WAAU;GAAa,KAAI;GAAK,MAAM;GAA7C,UAAA;IACC,kBAACkD,GAAD;KAAQ,WAAU;KAA2C,eAAY;IAAQ,CAAA;IACjF,kBAAC,OAAD;KAAK,WAAU;KACd,UAAA,kBAAC,SAAD;MACC,KAAKkB;MACL,MAAK;MACE;MACP,WAAW,MAAMK,EAAc,EAAE,OAAO,KAAK;MAClC;MACE;MACb,cAAYC;MACZ,cAAa;MACb,YAAY;MACX,WAAW7E,EAAGc,EAAuB0D,IAAO5D,EAAwB4D,IAAO,kKAAkK;KAC9O,CAAA;IACG,CAAA;IACJM,KAAW,kBAACC,GAAD;KAAS,WAAU;KAAwD,eAAY;IAAQ,CAAA;IAC1G,CAACD,KAAW,CAAC,CAACE,KACb,kBAAC,UAAD;KACA,MAAK;KACJ,eAAe;MAEd,AADAJ,EAAc,EAAE,GAChBL,EAAS,SAAS,MAAM;KACzB;KACD,cAAYU;KACX,WAAWjF,EAAGW,EAAuB,QAAQA,EAAuB,OAAOA,EAAuB,KAAK;KAEvG,UAAA,kBAACuE,GAAD,EAAG,WAAWvE,EAAuB,KAAO,CAAA;IACrC,CAAA;GAEJ;;CACH,CAAA;AAEP,CAAC,GC9EYwE,IAAoD;CAChE,SAAS;CACT,SAAS;CACT,SAAS;CACT,SAAS;CACT,MAAM;CACN,aAAa;AACd,GAEaC,IAAwD;CACpE,SAAS;CACT,SAAS;CACT,SAAS;CACT,SAAS;CACT,MAAM;CACN,aAAa;AACd;;;ACgBA,SAASC,EAAe,GAAc,GAA4C;CACjF,IAAMC,KAAK1D,KAAS,GAAA,CAAI,KAAK;CAC7B,IAAI,CAAC0D,GAAG,OAAOC;CACf,IAAMC,IAAQD,EAAK,YAAY,GACzBE,IAAKH,EAAE,YAAY,GACnBvC,IAAIyC,EAAM,QAAQC,CAAE;CAE1B,OADI1C,IAAI,IAAUwC,IAEjB,kBAAA1F,GAAA,EAAA,UAAA;EACE0F,EAAK,MAAM,GAAGxC,CAAC;EAChB,kBAAC,QAAD;GAAM,WAAU;GACd,UAAAwC,EAAK,MAAMxC,GAAGA,IAAIuC,EAAE,MAAM;EACtB,CAAA;EACLC,EAAK,MAAMxC,IAAIuC,EAAE,MAAM;CACvB,EAAA,CAAA;AAEJ;AAEA,SAAgBI,EAAsD,EACrE,WACA,YAAS,IACT,WAAQ,IACR,aACA,iBACA,gBACsC;CACtC,IAAMC,IAAYC,EAAO,WAAW,MAC9BC,IAAKV,GACLW,IAAKV;CAEX,OACC,kBAAC,UAAD;EACC,MAAK;EACL,kBAAe;EACf,aAAU;EACI;EACd,SAASW;EACT,WAAW/F,EACV,ySACA,uCACAgG,IAAS,gBAAgB,qBACzBxC,CACD;EAXD,UAAA;GAcC,kBAAC,OAAD;IAAK,WAAU;IACb,UAAAoC,EAAO,SACP,kBAACpF,GAAD;KAAQ,WAAWR,EAAG,kBAAkB8F,EAAGF,EAAO,OAAO,QAAQ,UAAU;KAA3E,UAAA,CACEA,EAAO,OAAO,OACd,kBAACnF,GAAD;MAAa,KAAKmF,EAAO,OAAO;MAAK,KAAKA,EAAO;KAAQ,CAAA,GAE1D,kBAACrF,GAAD;MACC,WAAWP,EAAG,yBAAyB8F,EAAGF,EAAO,OAAO,QAAQ,UAAU;MAEzE,UAAAA,EAAO,OAAO;KACA,CAAA,CACT;IACL,CAAA,IAAAD,IACH,kBAAC,QAAD;KACC,WAAW3F,EACV,yEACA6F,EAAGD,EAAO,WAAW,QAAQ,UAC9B;KAEA,UAAA,kBAACD,GAAD;MAAW,WAAU;MAAY,eAAY;KAAQ,CAAA;IAChD,CAAA,IACH;GACA,CAAA;GAGL,kBAACxF,GAAD;IAAO,KAAI;IAAQ,WAAU;IAA7B,UAAA,CACC,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACC,kBAACsD,GAAD;MAAM,KAAI;MAAO,QAAO;MAAW,WAAU;MAC3C,UAAA4B,EAAeO,EAAO,OAAOhE,CAAK;KAC9B,CAAA,GACL,CAAC,CAACgE,EAAO,SACT,kBAAClF,GAAD;MACC,MACCkF,EAAO,MAAM,SAAS,gBACnB,gBACAA,EAAO,MAAM;MAGhB,UAAAA,EAAO,MAAM;KACR,CAAA,CAEJ;IACG,CAAA,UAAA;KACP,IAAMK,IAAwD,CAAC;KA8D/D,OA7DIL,EAAO,YACVK,EAAO,KAAK;MACX,KAAK;MACL,MACC,kBAACxC,GAAD;OAAM,KAAI;OAAO,MAAK;OAAK,MAAK;OAAY,WAAU;OACpD,UAAA4B,EAAeO,EAAO,UAAUhE,CAAK;MACjC,CAAA;KAER,CAAC,GACFgE,EAAO,MAAM,SAAS,GAAG,MAAM;MAC9B,IAAMM,IAAOC,EAAE;MACf,EAAO,KAAK;OACX,KAAK,KAAKpD;OACV,MACC,kBAACU,GAAD;QACC,KAAI;QACJ,MAAK;QACL,MAAK;QACL,WAAWzD,EACV,6DACAmG,EAAE,QAAQ,wBACX;QAPD,UAAA,CASE,CAAC,CAACD,KAAQ,kBAACA,GAAD;SAAM,WAAU;SAAwB,eAAY;QAAQ,CAAA,GACtEC,EAAE,KACE;;MAER,CAAC;KACF,CAAC,GACGP,EAAO,aACVK,EAAO,KAAK;MACX,KAAK;MACL,MAAM,kBAAC3F,GAAD;OAAgB,MAAK;OAAK,WAAU;OAAgB,UAAAsF,EAAO;MAA0B,CAAA;KAC5F,CAAC,GACFA,EAAO,MAAM,SAAS,MACrBK,EAAO,KAAK;MACX,KAAK,KAAKG;MACT,MAAM,kBAAC3C,GAAD;OAAM,KAAI;OAAO,MAAK;OAAK,MAAK;OAAY,WAAU;OAAuB,UAAA2C;MAAU,CAAA;KAC/F,CAAC,CACF,GACIR,EAAO,cACVK,EAAO,KAAK;MACX,KAAK;MACL,MACE,kBAAC5F,GAAD;OAAO,QAAO;OAAS,WAAU;OAAjC,UAAA,CACCuF,EAAO,YACP,CAAC,CAACA,EAAO,cACT,kBAACnC,GAAD;QACC,KAAI;QACJ,MAAK;QACL,MAAK;QAGJ,UAAAmC,EAAO,WAAW,YAAY;OAC1B,CAAA,CAED;;KAET,CAAC,GAEEK,EAAO,WAAW,IAAU,OAE/B,kBAAC,OAAD;MAAK,WAAU;MACb,UAAAA,EAAO,KAAK,GAAG,MACf,kBAAC,QAAD;OAAkB,WAAWjG,EAAG,8DAA8DqG,EAAE,QAAQ,QAAQ,0BAA0B;OAA1I,UAAA,CACEtD,IAAI,KACJ,kBAACU,GAAD;QACC,KAAI;QACJ,MAAK;QACL,MAAK;QACL,eAAY;QACb,WAAU;QACT,UAAA;OAEK,CAAA,GAEN4C,EAAE,IACE;MAbK,GAAAA,EAAE,GAaP,CACN;KACG,CAAA;IAEP,EAAA,CAAG,CACG;;GAGN,CAAC,EAAET,EAAO,cAAcA,EAAO,eAC/B,kBAAC,OAAD;IAAK,WAAU;IACd,UAAA,kBAACzF,GAAD;KAAO,KAAI;KAAQ,OAAM;KAAM,WAAU;KAAzC,UAAA,CACE,CAAC,CAACyF,EAAO,cACT,kBAACvF,GAAD;MACC,QAAO;MACP,WAAU;MAET,UAAAuF,EAAO;KACF,CAAA,GAEP,CAAC,CAACA,EAAO,cACT,kBAACnC,GAAD;MACC,KAAI;MACJ,MAAK;MACL,MAAK;MACL,WAAU;MAET,UAAAmC,EAAO;KACH,CAAA,CAED;;GACH,CAAA;GAIN,kBAAC,QAAD;IACC,eAAY;IACZ,WAAW5F,EACV,gGACAgG,IACG,8CACA,6DACJ;IAEA,UAAA,kBAACM,GAAD,EAAY,WAAU,eAAgB,CAAA;GACjC,CAAA;EACC;;AAEV;;;ACxOA,SAAgBC,EAAiD,EAChE,UACA,kBACA,SACA,aACiC;CACjC,OACC,kBAAC,OAAD;EAAK,WAAU;EACd,UAAA,kBAAC,OAAD;GAAK,WAAU;GACd,UAAA,kBAACtF,GAAD;IACQ;IACP,gBAAgB,MAAM2D,EAAcvC,CAAmB;IACvD,WAAU;IAEV,UAAA,kBAACrB,GAAD;KAAU,WAAU;KAClB,UAAAwF,EAAK,KAAK,MAAQ;MAClB,IAAMC,IAAWzB,MAAUpC,EAAI,OACzB8D,IAAQvE,EAAOS,EAAI,UAAoB;MAC7C,OACC,kBAAC7B,GAAD;OAEC,OAAO6B,EAAI;OACX,WAAU;OAHX,UAAA,CAKC,kBAACa,GAAD;QAAM,KAAI;QACR,UAAAb,EAAI;OACA,CAAA,GACN,kBAACa,GAAD;QACC,KAAI;QACJ,MAAK;QACL,QAAO;QACP,WAAWzD,EACV,4DACAyG,IACG,6BACA,gCACJ;QAEC,UAAAC;OACI,CAAA,CACM;MApBP,GAAA9D,EAAI,KAoBG;KAEf,CAAC;IACQ,CAAA;GACL,CAAA;EACF,CAAA;CACD,CAAA;AAEP;;;ACQA,SAAgB+D,EAA6C,EAC5D,aAAU,CAAC,GACX,UACA,kBACA,mBACA,YACA,aAAU,IACV,iBACA,gBACA,eAAY,IACZ,SAASC,GACT,UACA,SACA,gBAC6B;CAC7B,IAAMC,IAAUC,EAAWzF,GAA4BuF,CAAW,GAE5DG,IAASzF,EAAwB;EACtC;EACA;EACA;EACA;CACD,CAAC,GAEK0F,IACL,CAAClC,KAAWlD,EAAM,KAAK,CAAC,CAAC,SAAS,KAAKK,EAAQ,WAAW,GACrDgF,IAAS,CAACnC,KAAWlD,EAAM,KAAK,CAAC,CAAC,UAAU,GAE5CsF,IAAepH,EAAM,cAEnB;EACP,IAAI0G,GAAM,OAAOA;EACjB,IAAMW,IAAY,OAAO,KAAKJ,EAAO,OAAO;EAC5C,OAAO,CACN;GAAE,OAAO;GAAO,OAAOF,EAAQ;EAAO,GACtC,GAAGM,EAAU,KAAK,OAAS;GAC1B,OAAOC;GACP,OAAOC,IAAcD,MAAQA;EAC9B,EAAE,CACH;CACD,GAAG;EAACZ;EAAMO,EAAO;EAASF,EAAQ;EAAQQ;CAAW,CAAC;CAEtD,OACC,kBAAC,OAAD;EACC,kBAAe;EACf,aAAU;EACV,WAAWrH,EAAG,4BACb,mGACAwD,CACD;EAND,UAAA;GAQE8D,GAAO,SACP,kBAAChD,GAAD;IACC,OAAO1C;IACP,eAAe2F;IACf,WAAWR,EAAO;IAClB,aAAaF,EAAQ;IACrB,YAAYA,EAAQ;IACX;IACE;GACX,CAAA;GAGD,CAAC/B,KAAW7C,EAAQ,SAAS,MAC7BqF,GAAO,QACN,kBAACf,GAAD;IACC,OAAOQ,EAAO;IACd,eAAeA,EAAO;IACtB,MAAMG;IACN,QAAQH,EAAO;GACf,CAAA;GAIH,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,CAAC,CAACE,MAAWK,GAAO,SACpBE,KAAgBA,EAAa,SAAS,IACrC,kBAAC1D,GAAD,EAAuB,UAAU0D,EAAe,CAAA,IAC7C;KAGJ,CAAC,CAAC1C,MAAYwC,GAAO,WACrB,kBAAC,OAAD;MAAK,WAAU;MAAoE,MAAK;MACvF,UAAA,kBAAC7D,GAAD;OAAM,MAAK;OACT,UAAAoD,EAAQ;MACJ,CAAA;KACF,CAAA;KAGL,CAAC,CAACG,MAAYM,GAAO,SACrB,kBAACnE,GAAD;MACC,OAAOsE,EAAkBZ,EAAQ,YAAY,EAAE,SAAM,CAAC;MACtD,MAAMA,EAAQ;KACd,CAAA;KAGD,CAAC/B,KAAW7C,EAAQ,SAAS,KAC7B,kBAAC,OAAD;MAAK,WAAU;MACb,UAAA,OAAO,QAAQ8E,EAAO,cAAc,CAAC,CAAC,KACrC,CAACW,GAAUC,IAAQ,MACnB,kBAAC,OAAD;OAEC,WAAW3H,EACV,yBACA4H,IAAK,KAAK,yBACX;OALD,UAAA,CAOC,kBAAC,OAAD;QAAK,WAAU;QAAf,UAAA,CACC,kBAAC1H,GAAD,EAAA,UACEmH,IAAcK,MAAuBA,EACzB,CAAA,GACbX,EAAO,cAAc,SAASY,EAAM,SAAS,KAC7C,kBAAC1H,GAAD;SACC,MAAK;SACL,MAAK;SACL,eACC8G,EAAO,aAAaW,CAAkB;SAEvC,WAAU;SAEV,UAAA,kBAACjE,GAAD;UACC,KAAI;UACJ,MAAK;UACL,WAAU;UAET,UAAAoD,EAAQ;SACJ,CAAA;QACK,CAAA,CAET;OACL,CAAA,GAAA,kBAAC1G,GAAD;QAAO,QAAQ,kBAAC,MAAD,CAAK,CAAA;QAAG,KAAI;QAAM,WAAU;QACzC,UAAAwH,EAAM,KAAK,MAAS;SACpB,IAAMlB,IACLM,EAAO,KAAKA,EAAO,UAAU,EAAE,OAAO/D,EAAK,IACtC6E,IAAM;UACX;UACA;UACA,gBAAgB5E,IAAiBD,CAAI;SACtC,GACM8E,IAAOR,GAAO,eACnBA,EAAM,aAAatE,GAAM6E,CAAG,IAE5B,kBAACnC,GAAD;UACC,QAAQ1C;UACV,QAAQyD;UACC;UACP,UAAUoB,EAAI;UACd,oBACCd,EAAO,cAAc/D,EAAK,EAAE;SAE7B,CAAA;SAEF,OAAO,kBAAC,MAAD,EAAA,UAAmB8E,EAAS,GAAnB9E,EAAK,EAAc;QACpC,CAAC;OACK,CAAA,CACH;MAtDC,GAAA0E,CAsDD,CAEP;KACI,CAAA;IAEF;;GAEJJ,GAAO,UACP,kBAAC/D,GAAD;IACC,eAAesD,EAAQ;IACvB,WAAWA,EAAQ;IACnB,YAAYA,EAAQ;IACpB,UACC,CAACI,KAAU,CAACD,KAAW/E,EAAQ,SAAS,IACvC,kBAACwB,GAAD;KACC,KAAI;KACJ,MAAK;KACL,MAAK;KACL,WAAU;KAET,UAAAgE,EAAkBZ,EAAQ,cAAc,EACxC,OAAO5E,EAAQ,OAChB,CAAC;IACI,CAAA,IACH,KAAA;GAEL,CAAA;EAEE;;AAEP;;;AC7NA,SAAgB8F,EAAmD,EAClE,SACA,iBACA,qBACA,cACA,SAASnB,GACT,eAAY,IACZ,GAAGoB,KACgC;CACnC,IAAMnB,IAAUC,EAAWzF,GAA4BuF,CAAW,GAC5DqB,IAAQnG,cAAoBoG,EAAa,EAAK,GAAG,CAACA,CAAY,CAAC;CAErE,OACC,kBAAC9H,GAAD;EACO;EACQ;EACd,OAAOyG,EAAQ;EACf,oBAAA;EACA,iBAAiB;EACjB,YAAY;EACZ,aAAa;EACb,WAAW7G,EACV,mCAGA,0FAEA,wBACAmI,CACD;EACA,kBAAiB;EAEjB,UAAA,kBAACxB,GAAD;GACC,GAAKqB;GACL,SAASpB;GACE;GACX,SAASqB;GACE;EACX,CAAA;CACY,CAAA;AAEhB;AAEA,EAAmB,cAAc"}
1
+ {"version":3,"file":"global-search.js","names":["React","_Fragment","React","useDensityConfig","cn","TextButton","Text","Stack","ActionDialog","Value","SecondaryValue","AvatarFallback","Avatar","AvatarImage","Badge","fieldAffordanceRecipes","editableTextSizeClasses","resolveFormControlSize","formControlSizeClasses","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","KBD_CLASS","GlobalSearchFooter","className","navigateLabel","openLabel","closeLabel","trailing","GlobalSearchIdleState","sections","HeadingIcon","section","fallbackIcons","DisplayLabel","ItemIcon","GlobalSearchInput","innerRef","size","defaultScale","ref","autoFocus","onValueChange","placeholder","loading","Loader2","value","clearLabel","X","DEFAULT_TONE_BG","DEFAULT_TONE_AVATAR","highlightMatch","q","text","lower","ql","GlobalSearchResultRow","ThumbIcon","result","bg","av","onSelect","active","pieces","Icon","m","tag","p","ArrowRight","GlobalSearchTabs","tabs","isActive","count","GlobalSearch","stringsProp","strings","useStrings","search","isEmpty","isIdle","resolvedTabs","groupKeys","key","groupLabels","slots","onQueryChange","idleSections","interpolateString","groupKey","items","gi","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-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 */\nimport { Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nconst KBD_CLASS =\n\t'rounded border border-border bg-muted/40 px-1.5 py-0.5 font-mono text-xs leading-none text-muted-foreground';\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\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 flex flex-col items-stretch gap-space-xs border-t border-border/60 px-surface py-row-y @sm/global-search:flex-row @sm/global-search:items-center @sm/global-search:justify-between',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<span className=\"global-search-footer--shortcuts flex items-center gap-space-md\">\n\t\t\t\t<kbd className={KBD_CLASS}>↑↓</kbd>\n\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\">\n\t\t\t\t\t{navigateLabel}\n\t\t\t\t</Text>\n\t\t\t\t<kbd className={KBD_CLASS}>↵</kbd>\n\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\">\n\t\t\t\t\t{openLabel}\n\t\t\t\t</Text>\n\t\t\t\t<kbd className={KBD_CLASS}>esc</kbd>\n\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\">\n\t\t\t\t\t{closeLabel}\n\t\t\t\t</Text>\n\t\t\t</span>\n\t\t\t{trailing ? (\n\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{trailing}\n\t\t\t\t</span>\n\t\t\t) : null}\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.\n */\nimport { Search } from 'lucide-react';\nimport * as React from 'react';\n\nimport { Stack } from '../../../base/structure';\nimport { DisplayLabel, Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nimport type { GlobalSearchIdleSection } from '../global-search.types';\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=\"global-search-idle-state--component p-surface\">\n\t\t<Stack gap=\"xl\">\n\t\t\t{sections.map((section, idx) => {\n\t\t\t\tconst HeadingIcon =\n\t\t\t\t\tsection.icon ??\n\t\t\t\t\t(idx === 0 ? fallbackIcons?.recent : fallbackIcons?.suggestions);\n\t\t\t\treturn (\n\t\t\t\t\t<div key={section.id}>\n\t\t\t\t\t\t<div className=\"flex items-center gap-space-md px-row-x pb-space-sm\">\n\t\t\t\t\t\t\t{!!HeadingIcon && (\n\t\t\t\t\t\t\t\t<HeadingIcon\n\t\t\t\t\t\t\t\t\tclassName=\"size-icon-md text-muted-foreground\"\n\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t<DisplayLabel>\n\t\t\t\t\t\t\t\t{section.label}\n\t\t\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<Stack render={<ul />} gap=\"2xs\" className=\"m-0 list-none p-0\">\n\t\t\t\t\t\t\t{section.items.map((item) => {\n\t\t\t\t\t\t\t\tconst ItemIcon = item.icon ?? Search;\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<li key={item.id}>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={item.onSelect}\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t'box-border m-0 flex w-full cursor-pointer items-center justify-start border-0 bg-transparent font-sans text-foreground outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset gap-space-lg rounded-inner px-row-x py-row-y-sm text-left transition-colors',\n\t\t\t\t\t\t\t\t\t\t\t\t'hover:bg-muted/50 focus-visible:bg-muted/50',\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\t\t<ItemIcon\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"size-icon-md text-muted-foreground\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t<Text className=\"flex-1 truncate\">\n\t\t\t\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</Stack>\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t})}\n\t\t</Stack>\n\t\t</div>\n\t);\n}\n","/**\n * GlobalSearchInput — search row at the top of the popover.\n *\n * Just the input + clear button + optional loading spinner. Keyboard\n * navigation is handled by the consumer wiring `useGlobalSearch`'s\n * `onKeyDown` handler.\n */\nimport { Loader2, Search, X } from 'lucide-react';\nimport * as React from 'react';\n\nimport { formControlSizeClasses, resolveFormControlSize } from '../../../base/forms/form-sizing';\nimport { Stack } from '../../../base/structure';\nimport { editableTextSizeClasses } from '../../../../lib/editable-text-recipe';\nimport { fieldAffordanceRecipes } from '../../../../lib/field-affordance-recipes';\nimport { useDensityConfig } from '../../../../lib/ui-provider';\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\tconst { defaultScale } = useDensityConfig();\n\tconst size = resolveFormControlSize(undefined, defaultScale);\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 border-b border-border px-surface py-row-y\"\n\t\t>\n\t\t\t<Stack direction=\"horizontal\" gap=\"md\" wrap={false}>\n\t\t\t\t<Search className=\"size-icon shrink-0 text-muted-foreground\" aria-hidden=\"true\" />\n\t\t\t\t<div className=\"min-w-0 flex-1\">\n\t\t\t\t\t<input\n\t\t\t\t\t\tref={innerRef}\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\tonChange={(e) => onValueChange(e.target.value)}\n\t\t\t\t\t\tonKeyDown={onKeyDown}\n\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\taria-label={placeholder}\n\t\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\t\tspellCheck={false}\n\t\t\t\t\t\t\tclassName={cn(formControlSizeClasses[size], editableTextSizeClasses[size], 'box-border m-0 block w-full min-w-0 border-0 bg-transparent p-0 outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset rounded-inner')}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t{loading && <Loader2 className=\"size-icon shrink-0 animate-spin text-muted-foreground\" aria-hidden=\"true\" />}\n\t\t\t\t{!loading && !!value && (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tonValueChange('');\n\t\t\t\t\t\t\t\tinnerRef.current?.focus();\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\taria-label={clearLabel}\n\t\t\t\t\t\t\tclassName={cn(fieldAffordanceRecipes.target, fieldAffordanceRecipes.focus, fieldAffordanceRecipes.clear)}\n\t\t\t\t\t>\n\t\t\t\t\t\t\t<X className={fieldAffordanceRecipes.icon} />\n\t\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t</div>\n\t);\n});\n","/**\n * Default tone palettes for thumbnails and avatars.\n *\n * Consumers can override per-call via `slots.toneBg` / `slots.toneAvatar`.\n */\nimport type { GlobalSearchTone } from '../global-search.types';\n\nexport const DEFAULT_TONE_BG: Record<GlobalSearchTone, string> = {\n\tneutral: 'bg-muted text-muted-foreground',\n\tprimary: 'bg-primary/5 text-primary-accent',\n\tsuccess: 'bg-success/10 text-success',\n\twarning: 'bg-warning/10 text-warning-accent',\n\tinfo: 'bg-info/10 text-info',\n\tdestructive: 'bg-destructive/10 text-destructive',\n};\n\nexport const DEFAULT_TONE_AVATAR: Record<GlobalSearchTone, string> = {\n\tneutral: 'bg-muted text-muted-foreground',\n\tprimary: 'bg-primary/10 text-primary-accent',\n\tsuccess: 'bg-success/10 text-success',\n\twarning: 'bg-warning/10 text-warning-accent',\n\tinfo: 'bg-info/10 text-info',\n\tdestructive: 'bg-destructive/10 text-destructive',\n};\n","/**\n * GlobalSearchResultRow — single rich result card.\n *\n * Layout: [thumbnail] [title + status pill / muted secondary line / meta] [right-value column] [chevron].\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';\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=\"rounded-radius-sm bg-warning/40 px-0.5 text-foreground\">\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'group/row relative box-border m-0 flex w-full cursor-pointer items-center justify-start border-0 bg-transparent font-sans text-foreground outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset gap-space-lg rounded-inner px-row-x py-row-y text-left transition-colors',\n\t\t\t\t'global-search-result-row--component',\n\t\t\t\tactive ? 'bg-muted/60' : 'hover:bg-muted/40',\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-radius',\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\" 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 items-center gap-space-sm leading-tight\">\n\t\t\t\t\t<Text tag=\"span\" weight=\"semibold\" 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 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 opacity-60\"\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\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<span\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'inline-flex size-action-sm shrink-0 items-center justify-center rounded-inner transition-all',\n\t\t\t\t\tactive\n\t\t\t\t\t\t? 'text-foreground 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\t\t<ArrowRight className=\"size-icon-md\" />\n\t\t\t</span>\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 a\n * subtle count pill next to each label.\n */\nimport { Tabs, TabsList, TabsTrigger } from '../../../base/navigation/tabs';\nimport { Text } from '../../../typography';\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=\"global-search-tabs--component border-b border-border/60 px-surface py-row-y\">\n\t\t\t<div className=\"global-search-tabs--scroller overflow-x-auto p-space-xs [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 isActive = value === tab.value;\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<Text\n\t\t\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\t\tweight=\"medium\"\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t'global-search-tabs--count rounded px-1 py-0 tabular-nums',\n\t\t\t\t\t\t\t\t\t\t\tisActive\n\t\t\t\t\t\t\t\t\t\t\t\t? 'bg-muted text-foreground'\n\t\t\t\t\t\t\t\t\t\t\t\t: 'bg-transparent text-foreground',\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{count}\n\t\t\t\t\t\t\t\t\t</Text>\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 { Stack } from '../../base/structure';\nimport { DisplayLabel, 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';\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 shadow-2xl',\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<div className=\"max-h-[520px] 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 p-surface\" 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=\"global-search--results p-surface\">\n\t\t\t\t\t\t{Object.entries(search.visibleGrouped).map(\n\t\t\t\t\t\t\t([groupKey, items], gi) => (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={groupKey}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t'pb-space-xs last:pb-0',\n\t\t\t\t\t\t\t\t\t\tgi > 0 && 'mt-space-md pt-space-xs',\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<div className=\"flex items-center justify-between px-row-x pb-space-2xs\">\n\t\t\t\t\t\t\t\t\t\t<DisplayLabel>\n\t\t\t\t\t\t\t\t\t\t\t{groupLabels?.[groupKey as TGroup] ?? groupKey}\n\t\t\t\t\t\t\t\t\t\t</DisplayLabel>\n\t\t\t\t\t\t\t\t\t\t{search.activeTab === 'all' && items.length > 0 && (\n\t\t\t\t\t\t\t\t\t\t\t<TextButton\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\t\t\t\tsearch.setActiveTab(groupKey as TGroup)\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\tclassName=\"text-primary-accent\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-primary-accent\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{strings.seeAll}\n\t\t\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t\t\t</TextButton>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<Stack render={<ul />} gap=\"2xs\" className=\"m-0 list-none p-0\">\n\t\t\t\t\t\t\t\t\t\t{items.map((item) => {\n\t\t\t\t\t\t\t\t\t\t\tconst isActive =\n\t\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\t\tconst ctx = {\n\t\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\t\tquery,\n\t\t\t\t\t\t\t\t\t\t\t\tonSelect: () => onResultSelect?.(item),\n\t\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t\tconst node = slots?.renderResult ? (\n\t\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\t) : (\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\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/>\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\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\t})}\n\t\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t),\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,IAAayB,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;;;ACnBA,IAAMC,IACL;AAeD,SAAgBC,EAAmB,EAClC,kBACA,cACA,eACA,aACA,gBAC2B;CAC3B,OACC,kBAAC,OAAD;EACC,WAAWvD,EACV,sNACAwD,CACD;EAJD,UAAA,CAMC,kBAAC,QAAD;GAAM,WAAU;GAAhB,UAAA;IACC,kBAAC,OAAD;KAAK,WAAWF;KAAW,UAAA;IAAO,CAAA;IAClC,kBAACpD,GAAD;KAAM,KAAI;KAAO,MAAK;KAAK,MAAK;KAC9B,UAAAuD;IACI,CAAA;IACN,kBAAC,OAAD;KAAK,WAAWH;KAAW,UAAA;IAAM,CAAA;IACjC,kBAACpD,GAAD;KAAM,KAAI;KAAO,MAAK;KAAK,MAAK;KAC9B,UAAAwD;IACI,CAAA;IACN,kBAAC,OAAD;KAAK,WAAWJ;KAAW,UAAA;IAAQ,CAAA;IACnC,kBAACpD,GAAD;KAAM,KAAI;KAAO,MAAK;KAAK,MAAK;KAC9B,UAAAyD;IACI,CAAA;GACD;EACL,CAAA,GAAAC,IACA,kBAAC,QAAD;GAAM,WAAU;GACd,UAAAA;EACI,CAAA,IACH,IACA;;AAEP;;;ACtCA,SAAgBC,EAAsB,EACrC,aACA,oBAC8B;CAC9B,OACC,kBAAC,OAAD;EAAK,WAAU;EACf,UAAA,kBAAC1D,GAAD;GAAO,KAAI;GACT,UAAA2D,EAAS,KAAK,GAAS,MAAQ;IAC/B,IAAMC,IACLC,EAAQ,SACPnB,MAAQ,IAAIoB,GAAe,SAASA,GAAe;IACrD,OACC,kBAAC,OAAD,EAAA,UAAA,CACC,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,CAAC,CAACF,KACF,kBAACA,GAAD;MACC,WAAU;MACV,eAAY;KACZ,CAAA,GAEF,kBAACG,GAAD,EAAA,UACEF,EAAQ,MACI,CAAA,CACV;IACL,CAAA,GAAA,kBAAC7D,GAAD;KAAO,QAAQ,kBAAC,MAAD,CAAK,CAAA;KAAG,KAAI;KAAM,WAAU;KACzC,UAAA6D,EAAQ,MAAM,KAAK,MAAS;MAC5B,IAAMG,IAAWnB,EAAK,QAAQK;MAC9B,OACC,kBAAC,MAAD,EAAA,UACC,kBAAC,UAAD;OACC,MAAK;OACL,SAASL,EAAK;OACd,WAAWhD,EACV,yRACA,6CACD;OAND,UAAA,CAQC,kBAACmE,GAAD;QACC,WAAU;QACV,eAAY;OACZ,CAAA,GACD,kBAACjE,GAAD;QAAM,WAAU;QACd,UAAA8C,EAAK;OACD,CAAA,CACC;MACL,CAAA,EAAA,GAjBKA,EAAK,EAiBV;KAEN,CAAC;IACK,CAAA,CACH,EAAA,GArCKgB,EAAQ,EAqCb;GAEP,CAAC;EACK,CAAA;CACF,CAAA;AAEP;;;AC1CA,IAAaI,IAAoBxE,EAAM,WAAqD,SAC3F,EAAE,UAAO,kBAAe,cAAW,gBAAa,gBAAa,gBAAgB,aAAU,IAAO,eAAY,MAC1G,GACC;CACD,IAAMyE,IAAWzE,EAAM,OAAgC,IAAI,GACrD,EAAE,oBAAiBG,EAAiB,GACpCuE,IAAOzD,EAAuB,KAAA,GAAW0D,CAAY;CAO3D,OANApD,EAAM,oBAAoBqD,SAAWH,EAAS,OAA2B,GAEzElD,EAAM,gBAAgB;EACrB,AAAIsD,KAAWJ,EAAS,SAAS,MAAM;CACxC,GAAG,CAACI,CAAS,CAAC,GAGb,kBAAC,OAAD;EACC,kBAAe;EACf,aAAU;EACV,WAAU;EAEV,UAAA,kBAACtE,GAAD;GAAO,WAAU;GAAa,KAAI;GAAK,MAAM;GAA7C,UAAA;IACC,kBAACkD,GAAD;KAAQ,WAAU;KAA2C,eAAY;IAAQ,CAAA;IACjF,kBAAC,OAAD;KAAK,WAAU;KACd,UAAA,kBAAC,SAAD;MACC,KAAKgB;MACL,MAAK;MACE;MACP,WAAW,MAAMK,EAAc,EAAE,OAAO,KAAK;MAClC;MACE;MACb,cAAYC;MACZ,cAAa;MACb,YAAY;MACX,WAAW3E,EAAGc,EAAuBwD,IAAO1D,EAAwB0D,IAAO,kKAAkK;KAC9O,CAAA;IACG,CAAA;IACJM,KAAW,kBAACC,GAAD;KAAS,WAAU;KAAwD,eAAY;IAAQ,CAAA;IAC1G,CAACD,KAAW,CAAC,CAACE,KACb,kBAAC,UAAD;KACA,MAAK;KACJ,eAAe;MAEd,AADAJ,EAAc,EAAE,GAChBL,EAAS,SAAS,MAAM;KACzB;KACD,cAAYU;KACX,WAAW/E,EAAGW,EAAuB,QAAQA,EAAuB,OAAOA,EAAuB,KAAK;KAEvG,UAAA,kBAACqE,GAAD,EAAG,WAAWrE,EAAuB,KAAO,CAAA;IACrC,CAAA;GAEJ;;CACH,CAAA;AAEP,CAAC,GC9EYsE,IAAoD;CAChE,SAAS;CACT,SAAS;CACT,SAAS;CACT,SAAS;CACT,MAAM;CACN,aAAa;AACd,GAEaC,IAAwD;CACpE,SAAS;CACT,SAAS;CACT,SAAS;CACT,SAAS;CACT,MAAM;CACN,aAAa;AACd;;;ACgBA,SAASC,EAAe,GAAc,GAA4C;CACjF,IAAMC,KAAKxD,KAAS,GAAA,CAAI,KAAK;CAC7B,IAAI,CAACwD,GAAG,OAAOC;CACf,IAAMC,IAAQD,EAAK,YAAY,GACzBE,IAAKH,EAAE,YAAY,GACnBrC,IAAIuC,EAAM,QAAQC,CAAE;CAE1B,OADIxC,IAAI,IAAUsC,IAEjB,kBAAAxF,GAAA,EAAA,UAAA;EACEwF,EAAK,MAAM,GAAGtC,CAAC;EAChB,kBAAC,QAAD;GAAM,WAAU;GACd,UAAAsC,EAAK,MAAMtC,GAAGA,IAAIqC,EAAE,MAAM;EACtB,CAAA;EACLC,EAAK,MAAMtC,IAAIqC,EAAE,MAAM;CACvB,EAAA,CAAA;AAEJ;AAEA,SAAgBI,EAAsD,EACrE,WACA,YAAS,IACT,WAAQ,IACR,aACA,iBACA,gBACsC;CACtC,IAAMC,IAAYC,EAAO,WAAW,MAC9BC,IAAKV,GACLW,IAAKV;CAEX,OACC,kBAAC,UAAD;EACC,MAAK;EACL,kBAAe;EACf,aAAU;EACI;EACd,SAASW;EACT,WAAW7F,EACV,ySACA,uCACA8F,IAAS,gBAAgB,qBACzBtC,CACD;EAXD,UAAA;GAcC,kBAAC,OAAD;IAAK,WAAU;IACb,UAAAkC,EAAO,SACP,kBAAClF,GAAD;KAAQ,WAAWR,EAAG,kBAAkB4F,EAAGF,EAAO,OAAO,QAAQ,UAAU;KAA3E,UAAA,CACEA,EAAO,OAAO,OACd,kBAACjF,GAAD;MAAa,KAAKiF,EAAO,OAAO;MAAK,KAAKA,EAAO;KAAQ,CAAA,GAE1D,kBAACnF,GAAD;MACC,WAAWP,EAAG,yBAAyB4F,EAAGF,EAAO,OAAO,QAAQ,UAAU;MAEzE,UAAAA,EAAO,OAAO;KACA,CAAA,CACT;IACL,CAAA,IAAAD,IACH,kBAAC,QAAD;KACC,WAAWzF,EACV,yEACA2F,EAAGD,EAAO,WAAW,QAAQ,UAC9B;KAEA,UAAA,kBAACD,GAAD;MAAW,WAAU;MAAY,eAAY;KAAQ,CAAA;IAChD,CAAA,IACH;GACA,CAAA;GAGL,kBAACtF,GAAD;IAAO,KAAI;IAAQ,WAAU;IAA7B,UAAA,CACC,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACC,kBAACD,GAAD;MAAM,KAAI;MAAO,QAAO;MAAW,WAAU;MAC3C,UAAAiF,EAAeO,EAAO,OAAO9D,CAAK;KAC9B,CAAA,GACL,CAAC,CAAC8D,EAAO,SACT,kBAAChF,GAAD;MACC,MACCgF,EAAO,MAAM,SAAS,gBACnB,gBACAA,EAAO,MAAM;MAGhB,UAAAA,EAAO,MAAM;KACR,CAAA,CAEJ;IACG,CAAA,UAAA;KACP,IAAMK,IAAwD,CAAC;KA8D/D,OA7DIL,EAAO,YACVK,EAAO,KAAK;MACX,KAAK;MACL,MACC,kBAAC7F,GAAD;OAAM,KAAI;OAAO,MAAK;OAAK,MAAK;OAAY,WAAU;OACpD,UAAAiF,EAAeO,EAAO,UAAU9D,CAAK;MACjC,CAAA;KAER,CAAC,GACF8D,EAAO,MAAM,SAAS,GAAG,MAAM;MAC9B,IAAMM,IAAOC,EAAE;MACf,EAAO,KAAK;OACX,KAAK,KAAKlD;OACV,MACC,kBAAC7C,GAAD;QACC,KAAI;QACJ,MAAK;QACL,MAAK;QACL,WAAWF,EACV,6DACAiG,EAAE,QAAQ,wBACX;QAPD,UAAA,CASE,CAAC,CAACD,KAAQ,kBAACA,GAAD;SAAM,WAAU;SAAwB,eAAY;QAAQ,CAAA,GACtEC,EAAE,KACE;;MAER,CAAC;KACF,CAAC,GACGP,EAAO,aACVK,EAAO,KAAK;MACX,KAAK;MACL,MAAM,kBAACzF,GAAD;OAAgB,MAAK;OAAK,WAAU;OAAgB,UAAAoF,EAAO;MAA0B,CAAA;KAC5F,CAAC,GACFA,EAAO,MAAM,SAAS,MACrBK,EAAO,KAAK;MACX,KAAK,KAAKG;MACT,MAAM,kBAAChG,GAAD;OAAM,KAAI;OAAO,MAAK;OAAK,MAAK;OAAY,WAAU;OAAuB,UAAAgG;MAAU,CAAA;KAC/F,CAAC,CACF,GACIR,EAAO,cACVK,EAAO,KAAK;MACX,KAAK;MACL,MACE,kBAAC1F,GAAD;OAAO,QAAO;OAAS,WAAU;OAAjC,UAAA,CACCqF,EAAO,YACP,CAAC,CAACA,EAAO,cACT,kBAACxF,GAAD;QACC,KAAI;QACJ,MAAK;QACL,MAAK;QAGJ,UAAAwF,EAAO,WAAW,YAAY;OAC1B,CAAA,CAED;;KAET,CAAC,GAEEK,EAAO,WAAW,IAAU,OAE/B,kBAAC,OAAD;MAAK,WAAU;MACb,UAAAA,EAAO,KAAK,GAAG,MACf,kBAAC,QAAD;OAAkB,WAAW/F,EAAG,8DAA8DmG,EAAE,QAAQ,QAAQ,0BAA0B;OAA1I,UAAA,CACEpD,IAAI,KACJ,kBAAC7C,GAAD;QACC,KAAI;QACJ,MAAK;QACL,MAAK;QACL,eAAY;QACb,WAAU;QACT,UAAA;OAEK,CAAA,GAENiG,EAAE,IACE;MAbK,GAAAA,EAAE,GAaP,CACN;KACG,CAAA;IAEP,EAAA,CAAG,CACG;;GAGN,CAAC,EAAET,EAAO,cAAcA,EAAO,eAC/B,kBAAC,OAAD;IAAK,WAAU;IACd,UAAA,kBAACvF,GAAD;KAAO,KAAI;KAAQ,OAAM;KAAM,WAAU;KAAzC,UAAA,CACE,CAAC,CAACuF,EAAO,cACT,kBAACrF,GAAD;MACC,QAAO;MACP,WAAU;MAET,UAAAqF,EAAO;KACF,CAAA,GAEP,CAAC,CAACA,EAAO,cACT,kBAACxF,GAAD;MACC,KAAI;MACJ,MAAK;MACL,MAAK;MACL,WAAU;MAET,UAAAwF,EAAO;KACH,CAAA,CAED;;GACH,CAAA;GAIN,kBAAC,QAAD;IACC,eAAY;IACZ,WAAW1F,EACV,gGACA8F,IACG,gCACA,6DACJ;IAEA,UAAA,kBAACM,GAAD,EAAY,WAAU,eAAgB,CAAA;GACjC,CAAA;EACC;;AAEV;;;ACxOA,SAAgBC,EAAiD,EAChE,UACA,kBACA,SACA,aACiC;CACjC,OACC,kBAAC,OAAD;EAAK,WAAU;EACd,UAAA,kBAAC,OAAD;GAAK,WAAU;GACd,UAAA,kBAACpF,GAAD;IACQ;IACP,gBAAgB,MAAMyD,EAAcrC,CAAmB;IACvD,WAAU;IAEV,UAAA,kBAACrB,GAAD;KAAU,WAAU;KAClB,UAAAsF,EAAK,KAAK,MAAQ;MAClB,IAAMC,IAAWzB,MAAUlC,EAAI,OACzB4D,IAAQrE,EAAOS,EAAI,UAAoB;MAC7C,OACC,kBAAC7B,GAAD;OAEC,OAAO6B,EAAI;OACX,WAAU;OAHX,UAAA,CAKC,kBAAC1C,GAAD;QAAM,KAAI;QACR,UAAA0C,EAAI;OACA,CAAA,GACN,kBAAC1C,GAAD;QACC,KAAI;QACJ,MAAK;QACL,QAAO;QACP,WAAWF,EACV,4DACAuG,IACG,6BACA,gCACJ;QAEC,UAAAC;OACI,CAAA,CACM;MApBP,GAAA5D,EAAI,KAoBG;KAEf,CAAC;IACQ,CAAA;GACL,CAAA;EACF,CAAA;CACD,CAAA;AAEP;;;ACQA,SAAgB6D,EAA6C,EAC5D,aAAU,CAAC,GACX,UACA,kBACA,mBACA,YACA,aAAU,IACV,iBACA,gBACA,eAAY,IACZ,SAASC,GACT,UACA,SACA,gBAC6B;CAC7B,IAAMC,IAAUC,EAAWvF,GAA4BqF,CAAW,GAE5DG,IAASvF,EAAwB;EACtC;EACA;EACA;EACA;CACD,CAAC,GAEKwF,IACL,CAAClC,KAAWhD,EAAM,KAAK,CAAC,CAAC,SAAS,KAAKK,EAAQ,WAAW,GACrD8E,IAAS,CAACnC,KAAWhD,EAAM,KAAK,CAAC,CAAC,UAAU,GAE5CoF,IAAelH,EAAM,cAEnB;EACP,IAAIwG,GAAM,OAAOA;EACjB,IAAMW,IAAY,OAAO,KAAKJ,EAAO,OAAO;EAC5C,OAAO,CACN;GAAE,OAAO;GAAO,OAAOF,EAAQ;EAAO,GACtC,GAAGM,EAAU,KAAK,OAAS;GAC1B,OAAOC;GACP,OAAOC,IAAcD,MAAQA;EAC9B,EAAE,CACH;CACD,GAAG;EAACZ;EAAMO,EAAO;EAASF,EAAQ;EAAQQ;CAAW,CAAC;CAEtD,OACC,kBAAC,OAAD;EACC,kBAAe;EACf,aAAU;EACV,WAAWnH,EAAG,4BACb,mGACAwD,CACD;EAND,UAAA;GAQE4D,GAAO,SACP,kBAAChD,GAAD;IACC,OAAOxC;IACP,eAAeyF;IACf,WAAWR,EAAO;IAClB,aAAaF,EAAQ;IACrB,YAAYA,EAAQ;IACX;IACE;GACX,CAAA;GAGD,CAAC/B,KAAW3C,EAAQ,SAAS,MAC7BmF,GAAO,QACN,kBAACf,GAAD;IACC,OAAOQ,EAAO;IACd,eAAeA,EAAO;IACtB,MAAMG;IACN,QAAQH,EAAO;GACf,CAAA;GAIH,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,CAAC,CAACE,MAAWK,GAAO,SACpBE,KAAgBA,EAAa,SAAS,IACrC,kBAACzD,GAAD,EAAuB,UAAUyD,EAAe,CAAA,IAC7C;KAGJ,CAAC,CAAC1C,MAAYwC,GAAO,WACrB,kBAAC,OAAD;MAAK,WAAU;MAAoE,MAAK;MACvF,UAAA,kBAAClH,GAAD;OAAM,MAAK;OACT,UAAAyG,EAAQ;MACJ,CAAA;KACF,CAAA;KAGL,CAAC,CAACG,MAAYM,GAAO,SACrB,kBAACjE,GAAD;MACC,OAAOoE,EAAkBZ,EAAQ,YAAY,EAAE,SAAM,CAAC;MACtD,MAAMA,EAAQ;KACd,CAAA;KAGD,CAAC/B,KAAW3C,EAAQ,SAAS,KAC7B,kBAAC,OAAD;MAAK,WAAU;MACb,UAAA,OAAO,QAAQ4E,EAAO,cAAc,CAAC,CAAC,KACrC,CAACW,GAAUC,IAAQ,MACnB,kBAAC,OAAD;OAEC,WAAWzH,EACV,yBACA0H,IAAK,KAAK,yBACX;OALD,UAAA,CAOC,kBAAC,OAAD;QAAK,WAAU;QAAf,UAAA,CACC,kBAACxD,GAAD,EAAA,UACEiD,IAAcK,MAAuBA,EACzB,CAAA,GACbX,EAAO,cAAc,SAASY,EAAM,SAAS,KAC7C,kBAACxH,GAAD;SACC,MAAK;SACL,MAAK;SACL,eACC4G,EAAO,aAAaW,CAAkB;SAEvC,WAAU;SAEV,UAAA,kBAACtH,GAAD;UACC,KAAI;UACJ,MAAK;UACL,WAAU;UAET,UAAAyG,EAAQ;SACJ,CAAA;QACK,CAAA,CAET;OACL,CAAA,GAAA,kBAACxG,GAAD;QAAO,QAAQ,kBAAC,MAAD,CAAK,CAAA;QAAG,KAAI;QAAM,WAAU;QACzC,UAAAsH,EAAM,KAAK,MAAS;SACpB,IAAMlB,IACLM,EAAO,KAAKA,EAAO,UAAU,EAAE,OAAO7D,EAAK,IACtC2E,IAAM;UACX;UACA;UACA,gBAAgB1E,IAAiBD,CAAI;SACtC,GACM4E,IAAOR,GAAO,eACnBA,EAAM,aAAapE,GAAM2E,CAAG,IAE5B,kBAACnC,GAAD;UACC,QAAQxC;UACV,QAAQuD;UACC;UACP,UAAUoB,EAAI;UACd,oBACCd,EAAO,cAAc7D,EAAK,EAAE;SAE7B,CAAA;SAEF,OAAO,kBAAC,MAAD,EAAA,UAAmB4E,EAAS,GAAnB5E,EAAK,EAAc;QACpC,CAAC;OACK,CAAA,CACH;MAtDC,GAAAwE,CAsDD,CAEP;KACI,CAAA;IAEF;;GAEJJ,GAAO,UACP,kBAAC7D,GAAD;IACC,eAAeoD,EAAQ;IACvB,WAAWA,EAAQ;IACnB,YAAYA,EAAQ;IACpB,UACC,CAACI,KAAU,CAACD,KAAW7E,EAAQ,SAAS,IACvC,kBAAC/B,GAAD;KACC,KAAI;KACJ,MAAK;KACL,MAAK;KACL,WAAU;KAET,UAAAqH,EAAkBZ,EAAQ,cAAc,EACxC,OAAO1E,EAAQ,OAChB,CAAC;IACI,CAAA,IACH,KAAA;GAEL,CAAA;EAEE;;AAEP;;;AC7NA,SAAgB4F,EAAmD,EAClE,SACA,iBACA,qBACA,cACA,SAASnB,GACT,eAAY,IACZ,GAAGoB,KACgC;CACnC,IAAMnB,IAAUC,EAAWvF,GAA4BqF,CAAW,GAC5DqB,IAAQjG,cAAoBkG,EAAa,EAAK,GAAG,CAACA,CAAY,CAAC;CAErE,OACC,kBAAC5H,GAAD;EACO;EACQ;EACd,OAAOuG,EAAQ;EACf,oBAAA;EACA,iBAAiB;EACjB,YAAY;EACZ,aAAa;EACb,WAAW3G,EACV,mCAGA,0FAEA,wBACAiI,CACD;EACA,kBAAiB;EAEjB,UAAA,kBAACxB,GAAD;GACC,GAAKqB;GACL,SAASpB;GACE;GACX,SAASqB;GACE;EACX,CAAA;CACY,CAAA;AAEhB;AAEA,EAAmB,cAAc"}
@@ -1,9 +1,9 @@
1
1
  "use client";
2
2
  import { useStrings as e } from "../lib/strings.js";
3
- import { t } from "../utils-BvH9PSmq.js";
4
- import { a as n } from "../typography-BxQgiZyw.js";
5
- import { t as r } from "../button-BZDasD04.js";
6
- import { n as i } from "../action-menu-Drxw_vJk.js";
3
+ import { t } from "../utils-Cospvlj1.js";
4
+ import { s as n } from "../typography-CAr3dQhX.js";
5
+ import { t as r } from "../button-BS3KDg00.js";
6
+ import { n as i } from "../action-menu-BTpyPWJ2.js";
7
7
  import { createContext as a, forwardRef as o, useCallback as s, useContext as c, useEffect as l, useLayoutEffect as u, useMemo as d, useRef as f, useState as p } from "react";
8
8
  import { jsx as m, jsxs as h } from "react/jsx-runtime";
9
9
  import { MoreHorizontal as g } from "lucide-react";
@@ -1,13 +1,13 @@
1
1
  "use client";
2
2
  import { useStrings as e } from "../lib/strings.js";
3
- import { t } from "../utils-BvH9PSmq.js";
4
- import { n } from "../buttons-D_6KJvEE.js";
5
- import { a as r } from "../typography-BxQgiZyw.js";
6
- import { t as i } from "../button-BZDasD04.js";
7
- import { d as a, g as o, i as s, l as c, n as l, o as u, r as d, t as f, u as p } from "../dropdown-menu-D-boNgGO.js";
8
- import { a as m, n as h, o as g, r as _, t as v } from "../command-BnmSchli.js";
9
- import { c as y, o as b, t as x } from "../popover-CghIYdQf.js";
10
- import { a as S, c as C, o as ee } from "../text-inputs-DsR56TR-.js";
3
+ import { t } from "../utils-Cospvlj1.js";
4
+ import { n } from "../buttons-DS0ZIwJ_.js";
5
+ import { s as r } from "../typography-CAr3dQhX.js";
6
+ import { t as i } from "../button-BS3KDg00.js";
7
+ import { d as a, g as o, i as s, l as c, n as l, o as u, r as d, t as f, u as p } from "../dropdown-menu-CURh59jb.js";
8
+ import { a as m, n as h, o as g, r as _, t as v } from "../command-kPMPjIxJ.js";
9
+ import { c as y, o as b, t as x } from "../popover-Dcv_9jxr.js";
10
+ import { a as S, c as C, o as ee } from "../text-inputs-BFpku0Qd.js";
11
11
  import { t as w } from "../use-debounce-DZ_1ZBPa.js";
12
12
  import * as T from "react";
13
13
  import { Suspense as te, createContext as E, lazy as D, useCallback as O, useContext as k, useEffect as A, useRef as j, useState as M, useSyncExternalStore as N } from "react";