themelia-react-ui 2.0.5 → 2.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (489) hide show
  1. package/CHANGELOG.md +76 -0
  2. package/MIGRATION.md +119 -0
  3. package/README.md +13 -6
  4. package/dist/{accordion-B9MHG0cT.js → accordion-0tQUZ20r.js} +7 -7
  5. package/dist/accordion-0tQUZ20r.js.map +1 -0
  6. package/dist/{action-menu-Dr8K-ghE.js → action-menu-C0gjzLyE.js} +7 -7
  7. package/dist/{action-menu-Dr8K-ghE.js.map → action-menu-C0gjzLyE.js.map} +1 -1
  8. package/dist/{ai-artifact-C58tQcBy.js → ai-artifact-CGGpQryR.js} +172 -157
  9. package/dist/ai-artifact-CGGpQryR.js.map +1 -0
  10. package/dist/{app-shell-B_IuNWOo.js → app-shell-EHuuRDGy.js} +5 -5
  11. package/dist/{app-shell-B_IuNWOo.js.map → app-shell-EHuuRDGy.js.map} +1 -1
  12. package/dist/{attachment-Dg_69lPS.js → attachment-BCpA4e7i.js} +8 -8
  13. package/dist/{attachment-Dg_69lPS.js.map → attachment-BCpA4e7i.js.map} +1 -1
  14. package/dist/{auth-DTkkshS8.js → auth-B0girIk_.js} +15 -15
  15. package/dist/auth-B0girIk_.js.map +1 -0
  16. package/dist/{avatar-CeZaFmNH.js → avatar-B9Jnp-T-.js} +3 -3
  17. package/dist/{avatar-CeZaFmNH.js.map → avatar-B9Jnp-T-.js.map} +1 -1
  18. package/dist/{badge-xIiV_E7f.js → badge-wWauMgAt.js} +3 -3
  19. package/dist/{badge-xIiV_E7f.js.map → badge-wWauMgAt.js.map} +1 -1
  20. package/dist/base/accordion.js +1 -1
  21. package/dist/base/action-menu.js +1 -1
  22. package/dist/base/attachment.js +1 -1
  23. package/dist/base/avatar.js +1 -1
  24. package/dist/base/badge.js +1 -1
  25. package/dist/base/batch-action-bar.js +1 -1
  26. package/dist/base/buttons.js +1 -1
  27. package/dist/base/cards.js +2 -2
  28. package/dist/base/carousel.js +3 -3
  29. package/dist/base/cascader.js +1 -1
  30. package/dist/base/chart.js +1 -1
  31. package/dist/base/choice-inputs.js +2 -2
  32. package/dist/base/code-block.js +1 -1
  33. package/dist/base/combobox.js +1 -1
  34. package/dist/base/command.js +1 -1
  35. package/dist/base/copyable.js +1 -1
  36. package/dist/base/date-pickers.js +2 -2
  37. package/dist/base/display.js +6 -6
  38. package/dist/base/feedback.js +4 -4
  39. package/dist/base/forms-numeric.js +1 -1
  40. package/dist/base/forms.js +2 -2
  41. package/dist/base/inline-edit.js +8 -8
  42. package/dist/base/item.js +1 -1
  43. package/dist/base/media-gallery.js +1 -1
  44. package/dist/base/metadata-list.js +1 -1
  45. package/dist/base/navigation.js +6 -6
  46. package/dist/base/popover-menu.js +1 -1
  47. package/dist/base/popover.js +1 -1
  48. package/dist/base/qr-code.js +1 -1
  49. package/dist/base/repeaters.js +195 -188
  50. package/dist/base/repeaters.js.map +1 -1
  51. package/dist/base/sheet.js +1 -1
  52. package/dist/base/sidebar.js +2 -2
  53. package/dist/base/signature-pad.js +7 -7
  54. package/dist/base/skeleton.js +1 -1
  55. package/dist/base/spinner.js +5 -5
  56. package/dist/base/spinner.js.map +1 -1
  57. package/dist/base/structure.js +1 -1
  58. package/dist/base/table.js +1 -1
  59. package/dist/base/text-inputs.js +2 -2
  60. package/dist/base/toaster.js +1 -1
  61. package/dist/base/tree.js +1 -1
  62. package/dist/base/upload-queue.js +1 -1
  63. package/dist/base/upload.js +3 -3
  64. package/dist/base/value-inputs.js +1 -1
  65. package/dist/{batch-action-bar-Cb8cuvyy.js → batch-action-bar-BoqWIIpV.js} +5 -5
  66. package/dist/{batch-action-bar-Cb8cuvyy.js.map → batch-action-bar-BoqWIIpV.js.map} +1 -1
  67. package/dist/blocks/admin.js +17 -17
  68. package/dist/blocks/ai.js +227 -221
  69. package/dist/blocks/ai.js.map +1 -1
  70. package/dist/blocks/analytics/usage-card.js +1 -1
  71. package/dist/blocks/analytics.js +424 -449
  72. package/dist/blocks/analytics.js.map +1 -1
  73. package/dist/blocks/collaboration.js +1 -1
  74. package/dist/blocks/commerce/receipt.js +1 -1
  75. package/dist/blocks/commerce.js +225 -220
  76. package/dist/blocks/commerce.js.map +1 -1
  77. package/dist/blocks/data-display.js +2 -2
  78. package/dist/blocks/onboarding.js +5 -5
  79. package/dist/blocks/planning.js +11 -11
  80. package/dist/blocks/timelines.js +1 -1
  81. package/dist/{breadcrumbs-J-K2kl4c.js → breadcrumbs-Bp9Ke7kd.js} +4 -4
  82. package/dist/breadcrumbs-Bp9Ke7kd.js.map +1 -0
  83. package/dist/{button-S2Cubiiz.js → button-ChBovTx0.js} +2 -2
  84. package/dist/{button-S2Cubiiz.js.map → button-ChBovTx0.js.map} +1 -1
  85. package/dist/{buttons-BedGfygC.js → buttons-DeW0bQeK.js} +6 -6
  86. package/dist/{buttons-BedGfygC.js.map → buttons-DeW0bQeK.js.map} +1 -1
  87. package/dist/{cards-rNX1M4Xn.js → cards-CNXnmvV5.js} +8 -8
  88. package/dist/{cards-rNX1M4Xn.js.map → cards-CNXnmvV5.js.map} +1 -1
  89. package/dist/{cascader-B1MiqkBq.js → cascader-CrAl9zD5.js} +15 -15
  90. package/dist/{cascader-B1MiqkBq.js.map → cascader-CrAl9zD5.js.map} +1 -1
  91. package/dist/{chart-Darg_0Kv.js → chart-I7ROnsl8.js} +5 -5
  92. package/dist/{chart-Darg_0Kv.js.map → chart-I7ROnsl8.js.map} +1 -1
  93. package/dist/{checkbox-fflqmODR.js → checkbox-MoyHIAPs.js} +3 -3
  94. package/dist/{checkbox-fflqmODR.js.map → checkbox-MoyHIAPs.js.map} +1 -1
  95. package/dist/{choice-inputs-zUgBZfE4.js → choice-inputs-DHGtx0QV.js} +122 -110
  96. package/dist/choice-inputs-DHGtx0QV.js.map +1 -0
  97. package/dist/{code-block-BzmM9Eig.js → code-block-BSJyq9e-.js} +7 -7
  98. package/dist/{code-block-BzmM9Eig.js.map → code-block-BSJyq9e-.js.map} +1 -1
  99. package/dist/{collapsible-BkAI_XD4.js → collapsible-BzJ91LUG.js} +3 -3
  100. package/dist/{collapsible-BkAI_XD4.js.map → collapsible-BzJ91LUG.js.map} +1 -1
  101. package/dist/{collection-content-gDh1v6O4.js → collection-content-CSnwtOTH.js} +3 -3
  102. package/dist/{collection-content-gDh1v6O4.js.map → collection-content-CSnwtOTH.js.map} +1 -1
  103. package/dist/{combobox-BEx0vJgF.js → combobox-Bcvu5J8O.js} +11 -10
  104. package/dist/{combobox-BEx0vJgF.js.map → combobox-Bcvu5J8O.js.map} +1 -1
  105. package/dist/combobox-C2JiSQPc.js +915 -0
  106. package/dist/combobox-C2JiSQPc.js.map +1 -0
  107. package/dist/{command-CrlPIL6m.js → command-9e52NPgK.js} +6 -6
  108. package/dist/{command-CrlPIL6m.js.map → command-9e52NPgK.js.map} +1 -1
  109. package/dist/{comments-Dmpp0YIc.js → comments-BsgErEqd.js} +33 -28
  110. package/dist/comments-BsgErEqd.js.map +1 -0
  111. package/dist/components/base/choice-inputs/choice-types.d.ts +4 -0
  112. package/dist/components/base/choice-inputs/pill-radio-group.d.ts +7 -6
  113. package/dist/components/base/combobox/combobox-field.d.ts +2 -2
  114. package/dist/components/base/date-pickers/date-picker-internals.d.ts +3 -1
  115. package/dist/components/base/date-pickers/datepicker.types.d.ts +10 -4
  116. package/dist/components/base/date-pickers/time-picker.d.ts +17 -3
  117. package/dist/components/base/feedback/state-display.d.ts +5 -1
  118. package/dist/components/base/feedback/state-display.strings.d.ts +9 -0
  119. package/dist/components/base/forms/form-field.d.ts +7 -2
  120. package/dist/components/base/forms-numeric/coordinates-input.d.ts +4 -1
  121. package/dist/components/base/forms-numeric/decimal-input.d.ts +2 -2
  122. package/dist/components/base/forms-numeric/dimensions-input.d.ts +4 -1
  123. package/dist/components/base/forms-numeric/numeric-composite-field.d.ts +12 -0
  124. package/dist/components/base/forms-numeric/weight-input.d.ts +6 -1
  125. package/dist/components/base/navigation/language-switcher.d.ts +12 -4
  126. package/dist/components/base/repeaters/key-value-editor.d.ts +2 -1
  127. package/dist/components/base/sidebar/sidebar.d.ts +2 -0
  128. package/dist/components/base/upload/avatar-upload.d.ts +2 -1
  129. package/dist/components/base/upload/image-upload.d.ts +2 -1
  130. package/dist/components/blocks/ai/ai-citation/types.d.ts +2 -0
  131. package/dist/components/blocks/ai/ai-reasoning/types.d.ts +2 -0
  132. package/dist/components/blocks/ai/ai-sources/types.d.ts +2 -0
  133. package/dist/components/blocks/ai/ai-tool-call/types.d.ts +2 -0
  134. package/dist/components/blocks/analytics/metric/metric.d.ts +4 -0
  135. package/dist/components/blocks/analytics/metric-comparison/metric-comparison.d.ts +2 -0
  136. package/dist/components/blocks/analytics/metric-grid/metric-grid.d.ts +4 -5
  137. package/dist/components/blocks/analytics/types.d.ts +2 -2
  138. package/dist/components/blocks/commerce/order-status/types.d.ts +4 -0
  139. package/dist/components/blocks/data-display/empty-state/empty-state.types.d.ts +4 -3
  140. package/dist/components/features/activities/activities.types.d.ts +18 -11
  141. package/dist/components/features/activities/hooks/use-activity-resources.d.ts +2 -1
  142. package/dist/components/features/ai-chat/hooks/use-ai-chat-scroll.d.ts +1 -1
  143. package/dist/components/features/appointment-calendar/appointment-calendar.d.ts +1 -1
  144. package/dist/components/features/appointment-calendar/appointment-calendar.types.d.ts +4 -2
  145. package/dist/components/features/combobox/async-resource-combobox.d.ts +2 -2
  146. package/dist/components/features/combobox/combobox.d.ts +2 -2
  147. package/dist/components/features/combobox/hooks/use-combobox-core.d.ts +2 -1
  148. package/dist/components/features/combobox/hooks/use-combobox-state.d.ts +1 -0
  149. package/dist/components/features/combobox/hooks/use-load-more.d.ts +1 -0
  150. package/dist/components/features/combobox/types.d.ts +37 -8
  151. package/dist/components/features/email-composer/types.d.ts +3 -1
  152. package/dist/components/features/filters/facets/date-facet.d.ts +4 -2
  153. package/dist/components/features/filters/facets/range-facet.d.ts +12 -0
  154. package/dist/components/features/filters/filters.types.d.ts +3 -3
  155. package/dist/components/features/filters/partials/date-filter-content.d.ts +3 -2
  156. package/dist/components/features/filters/partials/filter-popover-content.d.ts +4 -2
  157. package/dist/components/features/filters/partials/range-filter-content.d.ts +12 -0
  158. package/dist/components/features/filters/utils/filter-utils.d.ts +5 -1
  159. package/dist/components/features/media-library/hooks/use-media-library.d.ts +1 -1
  160. package/dist/components/features/media-library/media-library.d.ts +1 -1
  161. package/dist/components/features/media-library/media-library.strings.d.ts +6 -0
  162. package/dist/components/features/media-library/media-library.types.d.ts +36 -8
  163. package/dist/components/features/media-library/partials/media-library-partials.d.ts +3 -3
  164. package/dist/components/features/mentions/hooks/use-mentions.d.ts +16 -1
  165. package/dist/components/features/mentions/partials/mention-inline-suggestions.d.ts +5 -1
  166. package/dist/components/features/mentions/utils/split-html-by-mentions.d.ts +1 -7
  167. package/dist/components/features/overlays/hooks/use-overlay-visibility.d.ts +2 -2
  168. package/dist/components/features/products/products.types.d.ts +2 -2
  169. package/dist/components/features/questionnaire/questionnaire.types.d.ts +3 -0
  170. package/dist/components/features/resource/resource.d.ts +1 -1
  171. package/dist/components/features/resource/resource.types.d.ts +2 -0
  172. package/dist/components/features/rich-text-editor/form-rich-text-editor.d.ts +1 -1
  173. package/dist/components/features/rich-text-editor/partials/caret-helpers.d.ts +1 -1
  174. package/dist/components/features/rich-text-editor/partials/editor-field-aria.d.ts +14 -0
  175. package/dist/components/features/rich-text-editor/partials/rich-text-editor-toolbar.d.ts +3 -1
  176. package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +1 -1
  177. package/dist/components/features/rich-text-editor/rich-text-editor.types.d.ts +17 -3
  178. package/dist/components/features/schema-form/hooks/use-schema-form.d.ts +5 -1
  179. package/dist/components/features/schema-form/partials/schema-form-field.d.ts +3 -1
  180. package/dist/components/features/schema-form/schema-form.utils.d.ts +1 -1
  181. package/dist/components/features/suggestions/suggestions.types.d.ts +1 -1
  182. package/dist/components/features/table/data-table.d.ts +1 -1
  183. package/dist/components/features/table/index.d.ts +1 -0
  184. package/dist/components/features/table/table-body.d.ts +1 -1
  185. package/dist/components/features/table/table-helpers.d.ts +6 -3
  186. package/dist/components/features/table/table.strings.d.ts +3 -0
  187. package/dist/components/features/table/table.types.d.ts +17 -1
  188. package/dist/components/layout/header/header.types.d.ts +3 -2
  189. package/dist/components/layout/layout.types.d.ts +5 -3
  190. package/dist/components/layout/navigation/side-nav.d.ts +3 -2
  191. package/dist/components/layout/normalize-layout-path.d.ts +1 -0
  192. package/dist/components/layout/settings/settings.d.ts +1 -1
  193. package/dist/components/layout/sidebar/app-sidebar.d.ts +1 -1
  194. package/dist/components/layout/sidebar/sidebar-navigation-rail.d.ts +3 -1
  195. package/dist/components/layout/sidebar/sidebar.context.d.ts +1 -0
  196. package/dist/components/layout/sidebar/sidebar.types.d.ts +2 -0
  197. package/dist/components/primitives/link.d.ts +3 -2
  198. package/dist/components/primitives/money.d.ts +1 -1
  199. package/dist/components/primitives/number.d.ts +1 -1
  200. package/dist/components/typography/rich-text/rich-text-tree.d.ts +7 -5
  201. package/dist/{containers-CIxwbZt5.js → containers-CSdc32h9.js} +2 -2
  202. package/dist/{containers-CIxwbZt5.js.map → containers-CSdc32h9.js.map} +1 -1
  203. package/dist/{copyable-DIznBqiT.js → copyable-3fdHfMR3.js} +4 -4
  204. package/dist/{copyable-DIznBqiT.js.map → copyable-3fdHfMR3.js.map} +1 -1
  205. package/dist/{data-display-BdgCAw8T.js → data-display-Cmj-xZYl.js} +16 -15
  206. package/dist/data-display-Cmj-xZYl.js.map +1 -0
  207. package/dist/{date-Cq8ioE4o.js → date-Br0FicVv.js} +4 -4
  208. package/dist/{date-Cq8ioE4o.js.map → date-Br0FicVv.js.map} +1 -1
  209. package/dist/date-picker-CyQlFYsP.js +1617 -0
  210. package/dist/date-picker-CyQlFYsP.js.map +1 -0
  211. package/dist/date-pickers-tj2MXmXd.js +185 -0
  212. package/dist/date-pickers-tj2MXmXd.js.map +1 -0
  213. package/dist/{display-KsZLw9Ov.js → display-CT_N2a3w.js} +7 -7
  214. package/dist/{display-KsZLw9Ov.js.map → display-CT_N2a3w.js.map} +1 -1
  215. package/dist/{dropdown-menu-CLs8Lihj.js → dropdown-menu-C08iIugv.js} +6 -6
  216. package/dist/{dropdown-menu-CLs8Lihj.js.map → dropdown-menu-C08iIugv.js.map} +1 -1
  217. package/dist/features/activities.js +283 -270
  218. package/dist/features/activities.js.map +1 -1
  219. package/dist/features/ai-chat.js +40 -27
  220. package/dist/features/ai-chat.js.map +1 -1
  221. package/dist/features/appointment-calendar.js +126 -126
  222. package/dist/features/appointment-calendar.js.map +1 -1
  223. package/dist/features/async-preview.js +9 -9
  224. package/dist/features/combobox.js +1 -1
  225. package/dist/features/comments.js +1 -1
  226. package/dist/features/data-view.js +10 -10
  227. package/dist/features/email-composer.js +24 -19
  228. package/dist/features/email-composer.js.map +1 -1
  229. package/dist/features/event-calendar.js +129 -125
  230. package/dist/features/event-calendar.js.map +1 -1
  231. package/dist/features/filters.js +2 -2
  232. package/dist/features/global-search.js +16 -20
  233. package/dist/features/global-search.js.map +1 -1
  234. package/dist/features/kanban.js +18 -28
  235. package/dist/features/kanban.js.map +1 -1
  236. package/dist/features/map/style.css +15 -0
  237. package/dist/features/map.js +331 -314
  238. package/dist/features/map.js.map +1 -1
  239. package/dist/features/media-library.js +1044 -866
  240. package/dist/features/media-library.js.map +1 -1
  241. package/dist/features/mentions.js +2 -2
  242. package/dist/features/overlays.js +1 -1
  243. package/dist/features/products.js +978 -964
  244. package/dist/features/products.js.map +1 -1
  245. package/dist/features/questionnaire.js +159 -152
  246. package/dist/features/questionnaire.js.map +1 -1
  247. package/dist/features/resource-assignment.js +8 -8
  248. package/dist/features/resource.js +74 -71
  249. package/dist/features/resource.js.map +1 -1
  250. package/dist/features/rich-text-editor.js +28 -19
  251. package/dist/features/rich-text-editor.js.map +1 -1
  252. package/dist/features/schema-form.js +297 -256
  253. package/dist/features/schema-form.js.map +1 -1
  254. package/dist/features/suggestions.js +57 -50
  255. package/dist/features/suggestions.js.map +1 -1
  256. package/dist/features/sync.js +3 -3
  257. package/dist/features/table.js +1 -1
  258. package/dist/features/theme-tweaker.js +400 -399
  259. package/dist/features/theme-tweaker.js.map +1 -1
  260. package/dist/feedback-Dzo1xtAU.js +246 -0
  261. package/dist/feedback-Dzo1xtAU.js.map +1 -0
  262. package/dist/{field-affordance-recipes-DWcNcOjh.js → field-affordance-recipes-D6H7tVJi.js} +2 -2
  263. package/dist/{field-affordance-recipes-DWcNcOjh.js.map → field-affordance-recipes-D6H7tVJi.js.map} +1 -1
  264. package/dist/field-control-attributes-B6i335wr.js +18 -0
  265. package/dist/field-control-attributes-B6i335wr.js.map +1 -0
  266. package/dist/{field-state-recipes-BVA2CWHo.js → field-state-recipes-7sza8QbC.js} +4 -2
  267. package/dist/{field-state-recipes-BVA2CWHo.js.map → field-state-recipes-7sza8QbC.js.map} +1 -1
  268. package/dist/{filters-DzgSJpMK.js → filters-Dl80yYtN.js} +763 -605
  269. package/dist/filters-Dl80yYtN.js.map +1 -0
  270. package/dist/form-field-CAPdwdnZ.js +74 -0
  271. package/dist/form-field-CAPdwdnZ.js.map +1 -0
  272. package/dist/{form-sizing-Bs2qFUeE.js → form-sizing-CgcrUbLU.js} +2 -2
  273. package/dist/{form-sizing-Bs2qFUeE.js.map → form-sizing-CgcrUbLU.js.map} +1 -1
  274. package/dist/{forms-C0RGnJTe.js → forms-B3W8CH7-.js} +8 -8
  275. package/dist/{forms-C0RGnJTe.js.map → forms-B3W8CH7-.js.map} +1 -1
  276. package/dist/forms-numeric-CwjQJe-O.js +991 -0
  277. package/dist/forms-numeric-CwjQJe-O.js.map +1 -0
  278. package/dist/{header-DMMxG__r.js → header-ZIIsRKxP.js} +113 -113
  279. package/dist/header-ZIIsRKxP.js.map +1 -0
  280. package/dist/hooks/use-files.d.ts +2 -0
  281. package/dist/{hooks-DB6CJ4MR.js → hooks-BitHSh-Y.js} +3 -3
  282. package/dist/{hooks-DB6CJ4MR.js.map → hooks-BitHSh-Y.js.map} +1 -1
  283. package/dist/{icon-badge-DZF-YjQp.js → icon-badge-npxF1SLX.js} +2 -2
  284. package/dist/{icon-badge-DZF-YjQp.js.map → icon-badge-npxF1SLX.js.map} +1 -1
  285. package/dist/index.js +1 -1
  286. package/dist/{input-CvyDQlY7.js → input-7KAc7XQL.js} +6 -6
  287. package/dist/{input-CvyDQlY7.js.map → input-7KAc7XQL.js.map} +1 -1
  288. package/dist/{input-DMBwAZmr.js → input-DIREVYHs.js} +3 -3
  289. package/dist/{input-DMBwAZmr.js.map → input-DIREVYHs.js.map} +1 -1
  290. package/dist/{interaction-recipes-XR9ZpVYL.js → interaction-recipes-4wZ2tvfb.js} +2 -2
  291. package/dist/{interaction-recipes-XR9ZpVYL.js.map → interaction-recipes-4wZ2tvfb.js.map} +1 -1
  292. package/dist/{item-DjCcM18E.js → item-FfWnaYST.js} +99 -98
  293. package/dist/item-FfWnaYST.js.map +1 -0
  294. package/dist/layout/app-shell.js +1 -1
  295. package/dist/layout/auth.js +1 -1
  296. package/dist/layout/containers.js +1 -1
  297. package/dist/layout/header.js +1 -1
  298. package/dist/layout/hooks.js +1 -1
  299. package/dist/layout/navigation.js +1 -1
  300. package/dist/layout/page.js +1 -1
  301. package/dist/layout/settings.js +1 -1
  302. package/dist/layout/sidebar.js +2 -2
  303. package/dist/layout/workspace.js +1 -1
  304. package/dist/layout.js +11 -11
  305. package/dist/layout.types-E_GAApzO.js +30 -0
  306. package/dist/layout.types-E_GAApzO.js.map +1 -0
  307. package/dist/lib/field-control-attributes.d.ts +11 -0
  308. package/dist/lib/field-state-recipes.d.ts +2 -0
  309. package/dist/lib/format.d.ts +1 -0
  310. package/dist/lib/surface-recipes.d.ts +1 -1
  311. package/dist/lib/token-merge.generated.d.ts +6 -6
  312. package/dist/lib/utils.js +1 -1
  313. package/dist/{media-gallery-C-vChPmE.js → media-gallery-C81DAnKI.js} +6 -6
  314. package/dist/{media-gallery-C-vChPmE.js.map → media-gallery-C81DAnKI.js.map} +1 -1
  315. package/dist/{mentions-0_4nWuI-.js → mentions-qOnedSt4.js} +236 -167
  316. package/dist/mentions-qOnedSt4.js.map +1 -0
  317. package/dist/message-BJHnn43M.js +135 -0
  318. package/dist/message-BJHnn43M.js.map +1 -0
  319. package/dist/{metadata-list-C3MkU-Om.js → metadata-list-XkqZ_UXH.js} +11 -11
  320. package/dist/{metadata-list-C3MkU-Om.js.map → metadata-list-XkqZ_UXH.js.map} +1 -1
  321. package/dist/{navigation-DaRjthVk.js → navigation-BgtPJAhi.js} +119 -119
  322. package/dist/navigation-BgtPJAhi.js.map +1 -0
  323. package/dist/{navigation-C90-oQFq.js → navigation-Bt-v7rWP.js} +52 -46
  324. package/dist/navigation-Bt-v7rWP.js.map +1 -0
  325. package/dist/normalize-layout-path-BmEgg6fu.js +14 -0
  326. package/dist/normalize-layout-path-BmEgg6fu.js.map +1 -0
  327. package/dist/{number-CRU3kGuk.js → number-CYqBcrSj.js} +78 -86
  328. package/dist/number-CYqBcrSj.js.map +1 -0
  329. package/dist/{overflow-tab-bar-IVFVQFV6.js → overflow-tab-bar-BQCA2Zn2.js} +7 -7
  330. package/dist/{overflow-tab-bar-IVFVQFV6.js.map → overflow-tab-bar-BQCA2Zn2.js.map} +1 -1
  331. package/dist/{overlays-BSgCtM2v.js → overlays-CC8zI3Du.js} +264 -260
  332. package/dist/overlays-CC8zI3Du.js.map +1 -0
  333. package/dist/{page-DUUKDAjo.js → page-BoQ1VaFJ.js} +13 -13
  334. package/dist/{page-DUUKDAjo.js.map → page-BoQ1VaFJ.js.map} +1 -1
  335. package/dist/{page-header-commands-7P3sfE9u.js → page-header-commands-DIKspJfx.js} +4 -4
  336. package/dist/{page-header-commands-7P3sfE9u.js.map → page-header-commands-DIKspJfx.js.map} +1 -1
  337. package/dist/{pagination-CgCjElfu.js → pagination-Br8TdV9A.js} +4 -4
  338. package/dist/{pagination-CgCjElfu.js.map → pagination-Br8TdV9A.js.map} +1 -1
  339. package/dist/{popover-B85RenIl.js → popover-k8TdUcAt.js} +10 -10
  340. package/dist/popover-k8TdUcAt.js.map +1 -0
  341. package/dist/{popover-menu-DlnQ2zlR.js → popover-menu-yn-o0kyA.js} +7 -7
  342. package/dist/{popover-menu-DlnQ2zlR.js.map → popover-menu-yn-o0kyA.js.map} +1 -1
  343. package/dist/{popover.recipes-DdiEp0rd.js → popover.recipes-DJ0AkUan.js} +2 -2
  344. package/dist/{popover.recipes-DdiEp0rd.js.map → popover.recipes-DJ0AkUan.js.map} +1 -1
  345. package/dist/{portal-recipes-BpsV_iRw.js → portal-recipes-DyUXqUtD.js} +2 -2
  346. package/dist/{portal-recipes-BpsV_iRw.js.map → portal-recipes-DyUXqUtD.js.map} +1 -1
  347. package/dist/{primitives-ByWgGUgt.js → primitives-BkkQjYl7.js} +22 -17
  348. package/dist/primitives-BkkQjYl7.js.map +1 -0
  349. package/dist/primitives.js +4 -4
  350. package/dist/{progress-BJhQP9WX.js → progress-DZFXXzPs.js} +4 -4
  351. package/dist/{progress-BJhQP9WX.js.map → progress-DZFXXzPs.js.map} +1 -1
  352. package/dist/{receipt-tOc7B3hw.js → receipt-C7LhOg7Q.js} +6 -6
  353. package/dist/{receipt-tOc7B3hw.js.map → receipt-C7LhOg7Q.js.map} +1 -1
  354. package/dist/rich-text-BnTzZjIo.js +45 -0
  355. package/dist/rich-text-BnTzZjIo.js.map +1 -0
  356. package/dist/rich-text-editor-CAurDwT5.js +1273 -0
  357. package/dist/rich-text-editor-CAurDwT5.js.map +1 -0
  358. package/dist/{rich-text-editor-toolbar-laT3tpBT.js → rich-text-editor-toolbar-DbXig7Jk.js} +36 -35
  359. package/dist/rich-text-editor-toolbar-DbXig7Jk.js.map +1 -0
  360. package/dist/rich-text-tree-BqyQ_7-R.js +66 -0
  361. package/dist/rich-text-tree-BqyQ_7-R.js.map +1 -0
  362. package/dist/{sanitize-html-DsQmI48u.js → sanitize-html-BWkH4dLM.js} +29 -16
  363. package/dist/sanitize-html-BWkH4dLM.js.map +1 -0
  364. package/dist/{scroll-area-B0dB2cBi.js → scroll-area-Bj6CRUif.js} +2 -2
  365. package/dist/{scroll-area-B0dB2cBi.js.map → scroll-area-Bj6CRUif.js.map} +1 -1
  366. package/dist/{separator-Bb17I4pu.js → separator-B9ewiCGO.js} +2 -2
  367. package/dist/{separator-Bb17I4pu.js.map → separator-B9ewiCGO.js.map} +1 -1
  368. package/dist/{separator-Ct_WSWTJ.js → separator-DM6gs2vu.js} +3 -3
  369. package/dist/{separator-Ct_WSWTJ.js.map → separator-DM6gs2vu.js.map} +1 -1
  370. package/dist/services/actions.js +1 -1
  371. package/dist/settings-DZPHgpx4.js +155 -0
  372. package/dist/settings-DZPHgpx4.js.map +1 -0
  373. package/dist/{sheet-BGPERY55.js → sheet-C4DHsgLk.js} +6 -6
  374. package/dist/{sheet-BGPERY55.js.map → sheet-C4DHsgLk.js.map} +1 -1
  375. package/dist/sidebar-C8BnDwTH.js +709 -0
  376. package/dist/sidebar-C8BnDwTH.js.map +1 -0
  377. package/dist/{sidebar-f9gRWXIR.js → sidebar-CmD6a-HK.js} +16 -13
  378. package/dist/sidebar-CmD6a-HK.js.map +1 -0
  379. package/dist/{skeleton-BapcJd9C.js → skeleton-DDgdhmu9.js} +5 -5
  380. package/dist/{skeleton-BapcJd9C.js.map → skeleton-DDgdhmu9.js.map} +1 -1
  381. package/dist/{smart-card-CW0hjetE.js → smart-card-B6vLxqa_.js} +8 -8
  382. package/dist/{smart-card-CW0hjetE.js.map → smart-card-B6vLxqa_.js.map} +1 -1
  383. package/dist/{structure-DuxKl954.js → structure-DZJ2wbAU.js} +2 -2
  384. package/dist/{structure-DuxKl954.js.map → structure-DZJ2wbAU.js.map} +1 -1
  385. package/dist/style.css +1 -1
  386. package/dist/{surface-recipes-BKRVW8Os.js → surface-recipes-C8mNycaY.js} +2 -2
  387. package/dist/{surface-recipes-BKRVW8Os.js.map → surface-recipes-C8mNycaY.js.map} +1 -1
  388. package/dist/{table-CFOWY9pQ.js → table-CBonSdTp.js} +534 -486
  389. package/dist/table-CBonSdTp.js.map +1 -0
  390. package/dist/{table-B4TE7iOV.js → table-CXSPHH25.js} +75 -71
  391. package/dist/table-CXSPHH25.js.map +1 -0
  392. package/dist/{tabs-e7ko9S2o.js → tabs-C4Kr_hCr.js} +50 -49
  393. package/dist/tabs-C4Kr_hCr.js.map +1 -0
  394. package/dist/{text-inputs-B1culiSK.js → text-inputs-jdkS3ReG.js} +9 -9
  395. package/dist/{text-inputs-B1culiSK.js.map → text-inputs-jdkS3ReG.js.map} +1 -1
  396. package/dist/{timelines-D3Sl9ueq.js → timelines-CoPwdJP0.js} +10 -10
  397. package/dist/{timelines-D3Sl9ueq.js.map → timelines-CoPwdJP0.js.map} +1 -1
  398. package/dist/{tooltip-8wz5S_Zr.js → tooltip-31NwIpTo.js} +4 -4
  399. package/dist/{tooltip-8wz5S_Zr.js.map → tooltip-31NwIpTo.js.map} +1 -1
  400. package/dist/{tree-CzUJHnFs.js → tree-CeYVzdFE.js} +6 -6
  401. package/dist/{tree-CzUJHnFs.js.map → tree-CeYVzdFE.js.map} +1 -1
  402. package/dist/typography/rich-text.js +1 -1
  403. package/dist/{typography-BQnine1k.js → typography-C7-YMW1S.js} +2 -2
  404. package/dist/{typography-BQnine1k.js.map → typography-C7-YMW1S.js.map} +1 -1
  405. package/dist/typography.js +1 -1
  406. package/dist/{upload-BOW6U2tI.js → upload-Hdm5gObf.js} +303 -291
  407. package/dist/upload-Hdm5gObf.js.map +1 -0
  408. package/dist/{upload-queue-qUXn1ykN.js → upload-queue-D0sYPuqo.js} +8 -8
  409. package/dist/{upload-queue-qUXn1ykN.js.map → upload-queue-D0sYPuqo.js.map} +1 -1
  410. package/dist/{usage-card-BeSLY0i0.js → usage-card-9s8hLDfn.js} +9 -9
  411. package/dist/{usage-card-BeSLY0i0.js.map → usage-card-9s8hLDfn.js.map} +1 -1
  412. package/dist/{utils-B6kKb8jB.js → utils-DhuoqFy4.js} +31 -37
  413. package/dist/utils-DhuoqFy4.js.map +1 -0
  414. package/dist/{value-inputs-skdVB2zh.js → value-inputs-D3aPgq9H.js} +15 -15
  415. package/dist/{value-inputs-skdVB2zh.js.map → value-inputs-D3aPgq9H.js.map} +1 -1
  416. package/dist/{value-typography-uAmWUAL1.js → value-typography-uSzzG9Gf.js} +32 -26
  417. package/dist/value-typography-uSzzG9Gf.js.map +1 -0
  418. package/dist/{workspace-DHeHv0qw.js → workspace-CC8Vchiu.js} +12 -12
  419. package/dist/{workspace-DHeHv0qw.js.map → workspace-CC8Vchiu.js.map} +1 -1
  420. package/docs/consumer-skill/examples/edit.tsx +3 -3
  421. package/docs/consumer-skill/references/agents-md.md +19 -19
  422. package/docs/consumer-skill/references/analytics.md +15 -0
  423. package/docs/consumer-skill/references/component-contracts.json +14724 -13057
  424. package/docs/consumer-skill/references/composition.md +21 -4
  425. package/docs/consumer-skill/references/design-contract.md +1 -0
  426. package/docs/consumer-skill/references/installation.md +51 -8
  427. package/docs/consumer-skill/references/integration.md +24 -1
  428. package/docs/consumer-skill/references/public-api.json +172 -34
  429. package/docs/consumer-skill/references/review.md +51 -11
  430. package/docs/consumer-skill/references/rhf-workflows.md +72 -0
  431. package/docs/consumer-skill/references/theming.md +7 -2
  432. package/docs/consumer-skill/references/tokens.json +1 -1
  433. package/docs/consumer-skill/scripts/composition-policy.mjs +144 -30
  434. package/docs/consumer-skill/scripts/setup-skills.mjs +46 -9
  435. package/package.json +4 -2
  436. package/templates/admin-shell-template.tsx +1 -2
  437. package/templates/customers-template.tsx +18 -16
  438. package/dist/accordion-B9MHG0cT.js.map +0 -1
  439. package/dist/ai-artifact-C58tQcBy.js.map +0 -1
  440. package/dist/auth-DTkkshS8.js.map +0 -1
  441. package/dist/breadcrumbs-J-K2kl4c.js.map +0 -1
  442. package/dist/choice-inputs-zUgBZfE4.js.map +0 -1
  443. package/dist/combobox-BwzoXFSG.js +0 -884
  444. package/dist/combobox-BwzoXFSG.js.map +0 -1
  445. package/dist/comments-Dmpp0YIc.js.map +0 -1
  446. package/dist/data-display-BdgCAw8T.js.map +0 -1
  447. package/dist/date-picker-RlIzKom_.js +0 -1551
  448. package/dist/date-picker-RlIzKom_.js.map +0 -1
  449. package/dist/date-pickers-DY-CpXS1.js +0 -179
  450. package/dist/date-pickers-DY-CpXS1.js.map +0 -1
  451. package/dist/feedback-Dm4izqFn.js +0 -240
  452. package/dist/feedback-Dm4izqFn.js.map +0 -1
  453. package/dist/filters-DzgSJpMK.js.map +0 -1
  454. package/dist/form-field-BriWAXyg.js +0 -63
  455. package/dist/form-field-BriWAXyg.js.map +0 -1
  456. package/dist/forms-numeric-DIhghX1Q.js +0 -910
  457. package/dist/forms-numeric-DIhghX1Q.js.map +0 -1
  458. package/dist/header-DMMxG__r.js.map +0 -1
  459. package/dist/item-DjCcM18E.js.map +0 -1
  460. package/dist/layout.types-Cn7aUzJp.js +0 -20
  461. package/dist/layout.types-Cn7aUzJp.js.map +0 -1
  462. package/dist/mentions-0_4nWuI-.js.map +0 -1
  463. package/dist/message-g8p7eVtN.js +0 -128
  464. package/dist/message-g8p7eVtN.js.map +0 -1
  465. package/dist/navigation-C90-oQFq.js.map +0 -1
  466. package/dist/navigation-DaRjthVk.js.map +0 -1
  467. package/dist/number-CRU3kGuk.js.map +0 -1
  468. package/dist/overlays-BSgCtM2v.js.map +0 -1
  469. package/dist/popover-B85RenIl.js.map +0 -1
  470. package/dist/primitives-ByWgGUgt.js.map +0 -1
  471. package/dist/rich-text-Dth5E882.js +0 -78
  472. package/dist/rich-text-Dth5E882.js.map +0 -1
  473. package/dist/rich-text-editor-C1fOjBTd.js +0 -1195
  474. package/dist/rich-text-editor-C1fOjBTd.js.map +0 -1
  475. package/dist/rich-text-editor-toolbar-laT3tpBT.js.map +0 -1
  476. package/dist/safe-image-src-C6kQSMBZ.js +0 -17
  477. package/dist/safe-image-src-C6kQSMBZ.js.map +0 -1
  478. package/dist/sanitize-html-DsQmI48u.js.map +0 -1
  479. package/dist/settings-Bar5wiSo.js +0 -167
  480. package/dist/settings-Bar5wiSo.js.map +0 -1
  481. package/dist/sidebar-D-JYMMbY.js +0 -686
  482. package/dist/sidebar-D-JYMMbY.js.map +0 -1
  483. package/dist/sidebar-f9gRWXIR.js.map +0 -1
  484. package/dist/table-B4TE7iOV.js.map +0 -1
  485. package/dist/table-CFOWY9pQ.js.map +0 -1
  486. package/dist/tabs-e7ko9S2o.js.map +0 -1
  487. package/dist/upload-BOW6U2tI.js.map +0 -1
  488. package/dist/utils-B6kKb8jB.js.map +0 -1
  489. package/dist/value-typography-uAmWUAL1.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"global-search.js","names":["React","_Fragment","React","cn","TextButton","Text","focusRecipes","Stack","toneRecipes","markRecipes","surfaceDividerRecipes","kbdRecipe","surfaceInsetClasses","collectionRowClasses","popoverRecipes","ActionDialog","interactionRecipes","Value","SecondaryValue","AvatarFallback","Avatar","AvatarImage","Badge","fieldAffordanceRecipes","FieldClearGlyph","InputGroup","InputGroupInput","InputGroupAddon","TabsTrigger","TabsList","Tabs","EmptyState","React$1","Fragment$1","defaultGlobalSearchStrings","useGlobalSearch","activeTab","setActiveTabState","useState","activeIdx","setActiveIdx","query","grouped","useMemo","buckets","r","results","tabCounts","counts","k","v","visibleGrouped","sub","flat","activeIdxRef","useRef","flatRef","tab","idx","id","i","item","onResultSelect","onClose","GlobalSearchEmptyState","hint","Search","Shortcut","keys","label","GlobalSearchFooter","className","navigateLabel","openLabel","closeLabel","trailing","GlobalSearchGroupHeading","Icon","action","GlobalSearchIdleState","sections","section","fallbackIcons","ItemIcon","GlobalSearchInput","innerRef","ref","autoFocus","onValueChange","placeholder","expanded","controls","activeDescendant","loading","value","Loader2","clearLabel","toned","tone","DEFAULT_TONE_BG","DEFAULT_TONE_AVATAR","highlightMatch","q","text","lower","ql","GlobalSearchResultRow","ThumbIcon","result","bg","av","liftNeutralTile","active","optionId","onSelect","pieces","m","tag","p","ArrowRight","GlobalSearchTabs","tabs","count","GlobalSearch","stringsProp","strings","useStrings","search","isEmpty","isIdle","listboxBaseId","showResults","flatIndexById","index","optionIdFor","groupKeys","listboxIdFor","groupIndex","activeOptionId","resolvedTabs","key","groupLabels","slots","onQueryChange","idleSections","interpolateString","groupKey","items","isActive","ctx","GlobalSearchDialog","searchProps","close","onOpenChange","contentClassName"],"sources":["../../src/components/features/global-search/global-search.strings.ts","../../src/components/features/global-search/hooks/use-global-search.ts","../../src/components/features/global-search/partials/global-search-empty-state.tsx","../../src/components/features/global-search/partials/global-search-footer.tsx","../../src/components/features/global-search/partials/global-search-group-heading.tsx","../../src/components/features/global-search/partials/global-search-idle-state.tsx","../../src/components/features/global-search/partials/global-search-input.tsx","../../src/components/features/global-search/partials/tone-palettes.ts","../../src/components/features/global-search/partials/global-search-result-row.tsx","../../src/components/features/global-search/partials/global-search-tabs.tsx","../../src/components/features/global-search/global-search.tsx","../../src/components/features/global-search/global-search-dialog.tsx"],"sourcesContent":["/**\n * Strings for `GlobalSearch` and its partials. Consumers override via the\n * `strings` prop on `<GlobalSearch />`; values are deep-merged over these\n * defaults so partial overrides are safe.\n */\nexport interface GlobalSearchStrings {\n\t/** Placeholder copy for the search input. */\n\t/** Names the modal presentation for assistive technology. */\n\tdialogTitle: string;\n\tplaceholder: string;\n\t/** aria-label for the clear-search icon button. */\n\tclear: string;\n\t/** Loading-state copy. */\n\tloading: string;\n\t/** Empty-state title — uses {{query}} as a placeholder. */\n\temptyTitle: string;\n\t/** Empty-state body copy. */\n\temptyHint: string;\n\t/** Idle-state heading for \"Recent\" suggestions. */\n\tidleRecent: string;\n\t/** Idle-state heading for curated \"Suggestions\". */\n\tidleSuggestions: string;\n\t/** Tab label for the \"All\" tab. */\n\ttabAll: string;\n\t/** Footer \"navigate\" hint. */\n\tfooterNavigate: string;\n\t/** Footer \"open\" hint. */\n\tfooterOpen: string;\n\t/** Footer \"close\" hint. */\n\tfooterClose: string;\n\t/** Trailing N results count. */\n\tresultsCount: string;\n\t/** \"See all\" group action — jumps to that tab. */\n\tseeAll: string;\n}\n\nexport const defaultGlobalSearchStrings: GlobalSearchStrings = {\n\tdialogTitle: 'Search',\n\tplaceholder: 'Search…',\n\tclear: 'Clear search',\n\tloading: 'Searching…',\n\temptyTitle: 'No results for \"{{query}}\"',\n\temptyHint: 'Try a shorter keyword or check the spelling.',\n\tidleRecent: 'Recent',\n\tidleSuggestions: 'Suggestions',\n\ttabAll: 'All',\n\tfooterNavigate: 'navigate',\n\tfooterOpen: 'open',\n\tfooterClose: 'close',\n\tresultsCount: '{{count}} results',\n\tseeAll: 'See all',\n};\n","/**\n * useGlobalSearch — headless state machine for `<GlobalSearch />`.\n *\n * Owns the active-row index, active tab, and the keyboard-navigation\n * handler. Returns the derived flat list (results filtered by tab) so\n * consumers can render entirely custom UIs against the same state.\n *\n * Usage:\n * const search = useGlobalSearch({ results, query });\n * <input onKeyDown={search.onKeyDown} />\n * {search.flat.map((r, i) => <Row active={i === search.activeIdx} … />)}\n */\nimport { useEffect, useMemo, useRef, useState } from 'react';\n\nimport type { GlobalSearchResult } from '../global-search.types';\n\nexport interface UseGlobalSearchOptions<TGroup extends string = string> {\n\tresults: ReadonlyArray<GlobalSearchResult<TGroup>>;\n\tquery: string;\n\t/** Fires when the user activates a row (Enter or click). */\n\tonResultSelect?: (result: GlobalSearchResult<TGroup>) => void;\n\t/** Fires when the user presses Escape. */\n\tonClose?: () => void;\n}\n\nexport interface UseGlobalSearchReturn<TGroup extends string = string> {\n\t/** Results bucketed by group, in insertion order. */\n\tgrouped: Record<string, GlobalSearchResult<TGroup>[]>;\n\t/** Result count per tab (`all` plus each group key). */\n\ttabCounts: Record<string, number>;\n\t/** Currently-selected tab. */\n\tactiveTab: 'all' | TGroup;\n\t/** Set the active tab — also resets the active index. */\n\tsetActiveTab: (tab: 'all' | TGroup) => void;\n\t/** Filtered grouped map respecting the active tab. */\n\tvisibleGrouped: Record<string, GlobalSearchResult<TGroup>[]>;\n\t/** Flat ordered list matching what is currently rendered. */\n\tflat: GlobalSearchResult<TGroup>[];\n\t/** Index into `flat` of the currently-highlighted row. */\n\tactiveIdx: number;\n\tsetActiveIdx: (i: number) => void;\n\t/** Programmatically activate a result by id. */\n\tsetActiveById: (id: string) => void;\n\t/** Bind to the search input's `onKeyDown` for arrow / enter / escape support. */\n\tonKeyDown: (e: React.KeyboardEvent) => void;\n\t/** Activate the row at `activeIdx`. */\n\tselectActive: () => void;\n}\n\nexport function useGlobalSearch<TGroup extends string = string>({\n\tresults,\n\tquery,\n\tonResultSelect,\n\tonClose,\n}: UseGlobalSearchOptions<TGroup>): UseGlobalSearchReturn<TGroup> {\n\tconst [activeTab, setActiveTabState] =\n\t\tuseState<'all' | TGroup>('all');\n\tconst [activeIdx, setActiveIdx] = useState(0);\n\n\t// Reset both the active row and the active tab when the query changes\n\t// (so a fresh query never inherits a stale highlight or filter).\n\tuseEffect(() => {\n\t\tsetActiveTabState('all');\n\t\tsetActiveIdx(0);\n\t}, [query]);\n\n\tconst grouped = useMemo(() => {\n\t\tconst buckets: Record<string, GlobalSearchResult<TGroup>[]> = {};\n\t\tfor (const r of results) {\n\t\t\t(buckets[r.group] ??= []).push(r);\n\t\t}\n\t\treturn buckets;\n\t}, [results]);\n\n\tconst tabCounts = useMemo(() => {\n\t\tconst counts: Record<string, number> = { all: results.length };\n\t\tfor (const [k, v] of Object.entries(grouped)) counts[k] = v.length;\n\t\treturn counts;\n\t}, [results.length, grouped]);\n\n\tconst visibleGrouped = useMemo(() => {\n\t\tif (activeTab === 'all') return grouped;\n\t\tconst sub = grouped[activeTab as string];\n\t\treturn sub ? ({ [activeTab as string]: sub } as Record<string, GlobalSearchResult<TGroup>[]>) : {};\n\t}, [grouped, activeTab]);\n\n\tconst flat = useMemo(() => {\n\t\tif (activeTab === 'all') return results.slice();\n\t\treturn grouped[activeTab as string] ?? [];\n\t}, [activeTab, grouped, results]);\n\n\tconst activeIdxRef = useRef(activeIdx);\n\tactiveIdxRef.current = activeIdx;\n\tconst flatRef = useRef(flat);\n\tflatRef.current = flat;\n\n\tconst setActiveTab = (tab: 'all' | TGroup) => {\n\t\tsetActiveTabState(tab);\n\t\tsetActiveIdx(0);\n\t};\n\n\tconst setActiveById = (id: string) => {\n\t\tconst idx = flatRef.current.findIndex((r) => r.id === id);\n\t\tif (idx >= 0) setActiveIdx(idx);\n\t};\n\n\tconst selectActive = () => {\n\t\tconst item = flatRef.current[activeIdxRef.current];\n\t\tif (item) onResultSelect?.(item);\n\t};\n\n\tconst onKeyDown = (e: React.KeyboardEvent) => {\n\t\tif (e.key === 'ArrowDown') {\n\t\t\te.preventDefault();\n\t\t\tsetActiveIdx((i) => Math.min(i + 1, flatRef.current.length - 1));\n\t\t} else if (e.key === 'ArrowUp') {\n\t\t\te.preventDefault();\n\t\t\tsetActiveIdx((i) => Math.max(i - 1, 0));\n\t\t} else if (e.key === 'Enter') {\n\t\t\tconst item = flatRef.current[activeIdxRef.current];\n\t\t\tif (item) {\n\t\t\t\te.preventDefault();\n\t\t\t\tonResultSelect?.(item);\n\t\t\t}\n\t\t} else if (e.key === 'Escape') {\n\t\t\tonClose?.();\n\t\t}\n\t};\n\n\treturn {\n\t\tgrouped,\n\t\ttabCounts,\n\t\tactiveTab,\n\t\tsetActiveTab,\n\t\tvisibleGrouped,\n\t\tflat,\n\t\tactiveIdx,\n\t\tsetActiveIdx,\n\t\tsetActiveById,\n\t\tonKeyDown,\n\t\tselectActive,\n\t};\n}\n","/**\n * Default empty-state body — shown when the query yields no results.\n * Override entirely via `slots.empty`.\n */\nimport { Search } from 'lucide-react';\n\nimport { EmptyState } from '../../../blocks/data-display';\n\nexport interface GlobalSearchEmptyStateProps {\n\t/** Surface title. */\n\ttitle: string;\n\t/** Short guidance shown beneath the control. */\n\thint: string;\n}\n\nexport function GlobalSearchEmptyState({ title, hint }: GlobalSearchEmptyStateProps) {\n\treturn (\n\t\t<EmptyState\n\t\t\ttitle={title}\n\t\t\tdescription={hint}\n\t\t\tmedia={<Search className=\"size-icon\" aria-hidden=\"true\" />}\n\t\t\tmediaVariant=\"icon-soft\"\n\t\t\tpadding=\"md\"\n\t\t\tclassName=\"global-search-empty-state--component\"\n\t\t/>\n\t);\n}\n","/**\n * GlobalSearchFooter — keyboard-hint strip below the result list.\n * Override entirely via `slots.footer`.\n *\n * It is the anchored collection footer band: one region inset and a quiet top\n * rule, with copy aligned to the row text above it. Each key sits tight against\n * its own hint, and the hint pairs are spaced apart from one another.\n */\nimport { Text } from '../../../typography';\nimport { popoverRecipes } from '../../../base/popover/popover.recipes';\nimport { cn } from '../../../../lib/utils';\nimport { kbdRecipe, surfaceDividerRecipes } from '../../../../lib/surface-recipes';\n\nexport interface GlobalSearchFooterProps {\n\t/** Footer hint for the arrow keys. */\n\tnavigateLabel: string;\n\t/** Footer hint for the enter key. */\n\topenLabel: string;\n\t/** Footer hint for the escape key. */\n\tcloseLabel: string;\n\t/** Trailing right-aligned content (e.g. \"3 results\"). */\n\ttrailing?: React.ReactNode;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nfunction Shortcut({ keys, label }: { keys: string; label: string }) {\n\treturn (\n\t\t<span className=\"global-search-footer--shortcut inline-flex items-center gap-space-xs\">\n\t\t\t<kbd className={kbdRecipe}>{keys}</kbd>\n\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\">\n\t\t\t\t{label}\n\t\t\t</Text>\n\t\t</span>\n\t);\n}\n\nexport function GlobalSearchFooter({\n\tnavigateLabel,\n\topenLabel,\n\tcloseLabel,\n\ttrailing,\n\tclassName,\n}: GlobalSearchFooterProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'global-search-footer--component',\n\t\t\t\tpopoverRecipes.menuRegion,\n\t\t\t\tsurfaceDividerRecipes.anchored.footer,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<div className={cn('global-search-footer--body flex flex-col items-stretch gap-space-xs', popoverRecipes.menuCopyInset, '@sm/global-search:flex-row @sm/global-search:items-center @sm/global-search:justify-between')}>\n\t\t\t\t<span className=\"global-search-footer--shortcuts flex flex-wrap items-center gap-x-space-lg gap-y-space-xs\">\n\t\t\t\t\t<Shortcut keys=\"↑↓\" label={navigateLabel} />\n\t\t\t\t\t<Shortcut keys=\"↵\" label={openLabel} />\n\t\t\t\t\t<Shortcut keys=\"esc\" label={closeLabel} />\n\t\t\t\t</span>\n\t\t\t\t{trailing ? (\n\t\t\t\t\t<span className=\"global-search-footer--trailing shrink-0 self-end whitespace-nowrap @sm/global-search:self-auto\">\n\t\t\t\t\t\t{trailing}\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * Group caption shared by result groups and idle sections. It uses the compact\n * secondary role and inset of a Command group heading, so a caption never reads\n * as another row and both lists keep one rhythm.\n */\nimport type * as React from 'react';\n\nimport { Text } from '../../../typography';\n\nexport interface GlobalSearchGroupHeadingProps {\n\t/** Caption copy. */\n\tlabel: React.ReactNode;\n\t/** Optional leading glyph supplied by the section. */\n\ticon?: React.ElementType;\n\t/** Trailing action, such as \"See all\". */\n\taction?: React.ReactNode;\n}\n\nexport function GlobalSearchGroupHeading({ label, icon: Icon, action }: GlobalSearchGroupHeadingProps) {\n\treturn (\n\t\t<div className=\"global-search-group--heading flex items-center justify-between gap-space-sm px-row-x pt-space-md pb-space-xs\">\n\t\t\t<span className=\"inline-flex min-w-0 items-center gap-space-sm\">\n\t\t\t\t{!!Icon && <Icon className=\"size-icon-sm shrink-0 text-muted-foreground\" aria-hidden=\"true\" />}\n\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" weight=\"medium\" lineHeight=\"tight\" className=\"truncate\">\n\t\t\t\t\t{label}\n\t\t\t\t</Text>\n\t\t\t</span>\n\t\t\t{action}\n\t\t</div>\n\t);\n}\n","/**\n * Default idle-state body — shown when the query is too short.\n * Renders consumer-supplied \"Recent\" + \"Suggestions\" sections with the same\n * compact collection inset, group captions and rows as the result list.\n */\nimport { Search } from 'lucide-react';\nimport * as React from 'react';\n\nimport { collectionRowClasses, surfaceInsetClasses } from '../../../base/popover/popover.recipes';\nimport { Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nimport type { GlobalSearchIdleSection } from '../global-search.types';\nimport { focusRecipes } from '../../../../lib/focus-recipes';\nimport { interactionRecipes } from '../../../../lib/interaction-recipes';\nimport { GlobalSearchGroupHeading } from './global-search-group-heading';\n\nexport interface GlobalSearchIdleStateProps {\n\t/** Sections to render, in display order. */\n\tsections: ReadonlyArray<GlobalSearchIdleSection>;\n\t/** Optional heading icon used when a section supplies none. Headings carry no icon by default. */\n\tfallbackIcons?: { recent?: React.ElementType; suggestions?: React.ElementType };\n}\n\nexport function GlobalSearchIdleState({\n\tsections,\n\tfallbackIcons,\n}: GlobalSearchIdleStateProps) {\n\treturn (\n\t\t<div className={cn('global-search-idle-state--component', surfaceInsetClasses.compact)}>\n\t\t\t{sections.map((section, idx) => (\n\t\t\t\t<div key={section.id} className=\"global-search-idle-state--section\">\n\t\t\t\t\t<GlobalSearchGroupHeading\n\t\t\t\t\t\tlabel={section.label}\n\t\t\t\t\t\ticon={section.icon ?? (idx === 0 ? fallbackIcons?.recent : fallbackIcons?.suggestions)}\n\t\t\t\t\t/>\n\t\t\t\t\t<ul className=\"m-0 flex list-none flex-col p-0\">\n\t\t\t\t\t\t{section.items.map((item) => {\n\t\t\t\t\t\t\tconst ItemIcon = item.icon ?? Search;\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<li key={item.id}>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={item.onSelect}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t`${interactionRecipes.nativeButtonReset} flex w-full cursor-pointer items-center justify-start text-inherit outline-none ${focusRecipes.inset} text-left transition-colors`,\n\t\t\t\t\t\t\t\t\t\t\tcollectionRowClasses(),\n\t\t\t\t\t\t\t\t\t\t\tinteractionRecipes.rowHover,\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<ItemIcon\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"size-icon shrink-0 text-muted-foreground\"\n\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" type=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className=\"flex-1 truncate\">\n\t\t\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n","/**\n * GlobalSearchInput — search region at the top of the panel.\n *\n * The public `InputGroup` frame owns the field: its control height, padding,\n * radius, `--input` border and shared focus ring are the ones Command search\n * uses, so the spotlight never draws a field of its own. The region owns only\n * its outer collection inset. A busy indicator replaces the clear action while\n * results load, and the field stays editable throughout so typing is never\n * interrupted. Keyboard navigation is handled by the consumer wiring\n * `useGlobalSearch`'s `onKeyDown` handler; `expanded`, `controls` and\n * `activeDescendant` expose that navigation as a combobox.\n */\nimport { Loader2, Search } from 'lucide-react';\nimport * as React from 'react';\n\nimport { InputGroup, InputGroupAddon, InputGroupInput } from '../../../base/text-inputs';\nimport { popoverRecipes } from '../../../base/popover/popover.recipes';\nimport { FieldClearGlyph, fieldAffordanceRecipes } from '../../../../lib/field-affordance-recipes';\nimport { cn } from '../../../../lib/utils';\n\nexport interface GlobalSearchInputProps {\n\t/** Current value. */\n\tvalue: string;\n\t/** Fired with the next value. */\n\tonValueChange: (value: string) => void;\n\tonKeyDown?: (e: React.KeyboardEvent) => void;\n\t/** Shown while the value is empty. */\n\tplaceholder?: string;\n\t/** Accessible name for the clear control. */\n\tclearLabel?: string;\n\t/** Shows the pending indicator. */\n\tloading?: boolean;\n\t/** Focuses the control on mount. */\n\tautoFocus?: boolean;\n\t/**\n\t * Whether the results list is showing. Setting it makes the field a\n\t * combobox (`role=\"combobox\"`, `aria-expanded`), the pattern for a search\n\t * whose results are navigated with the arrow keys while focus stays here.\n\t */\n\texpanded?: boolean;\n\t/** Id(s) of the results listbox(es) the combobox controls, while expanded. */\n\tcontrols?: string;\n\t/** Id of the highlighted result, announced as the active option. */\n\tactiveDescendant?: string;\n}\n\nexport const GlobalSearchInput = React.forwardRef<HTMLInputElement, GlobalSearchInputProps>(function GlobalSearchInput(\n\t{ value, onValueChange, onKeyDown, placeholder, clearLabel = 'Clear search', loading = false, autoFocus = false, expanded, controls, activeDescendant },\n\tref,\n) {\n\tconst innerRef = React.useRef<HTMLInputElement | null>(null);\n\tReact.useImperativeHandle(ref, () => innerRef.current as HTMLInputElement);\n\n\tReact.useEffect(() => {\n\t\tif (autoFocus) innerRef.current?.focus();\n\t}, [autoFocus]);\n\n\treturn (\n\t\t<div\n\t\t\tdata-component=\"global-search-input\"\n\t\t\tdata-slot=\"global-search-input\"\n\t\t\tclassName={cn('global-search-input--component pt-surface-xs pb-space-xs', popoverRecipes.menuInline)}\n\t\t>\n\t\t\t<InputGroup>\n\t\t\t\t<InputGroupAddon>\n\t\t\t\t\t<Search aria-hidden=\"true\" />\n\t\t\t\t</InputGroupAddon>\n\t\t\t\t<InputGroupInput\n\t\t\t\t\tref={innerRef}\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tonChange={(e) => onValueChange(e.target.value)}\n\t\t\t\t\tonKeyDown={onKeyDown}\n\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\taria-label={placeholder}\n\t\t\t\t\t{...(expanded === undefined ? {} : {\n\t\t\t\t\t\trole: 'combobox',\n\t\t\t\t\t\t'aria-autocomplete': 'list' as const,\n\t\t\t\t\t\t'aria-expanded': expanded,\n\t\t\t\t\t\t'aria-controls': expanded ? controls : undefined,\n\t\t\t\t\t\t'aria-activedescendant': expanded ? activeDescendant : undefined,\n\t\t\t\t\t})}\n\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\tspellCheck={false}\n\t\t\t\t/>\n\t\t\t\t{(loading || !!value) && (\n\t\t\t\t\t<InputGroupAddon align=\"inline-end\">\n\t\t\t\t\t\t{loading ? (\n\t\t\t\t\t\t\t<Loader2 className=\"animate-spin\" aria-hidden=\"true\" />\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\tonValueChange('');\n\t\t\t\t\t\t\t\t\tinnerRef.current?.focus();\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\taria-label={clearLabel}\n\t\t\t\t\t\t\t\tclassName={cn(fieldAffordanceRecipes.target, fieldAffordanceRecipes.focus, fieldAffordanceRecipes.clear)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<FieldClearGlyph className={fieldAffordanceRecipes.icon} aria-hidden=\"true\" />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</InputGroupAddon>\n\t\t\t\t)}\n\t\t\t</InputGroup>\n\t\t</div>\n\t);\n});\n","/**\n * Default tone palettes for thumbnails and avatars: the shared tint and ink of\n * each status tone, so a search result's tile matches every other toned chip.\n *\n * Consumers can override per-call via `slots.toneBg` / `slots.toneAvatar`.\n */\nimport { toneRecipes, type ToneRecipeName } from '../../../../lib/tone-recipes';\nimport type { GlobalSearchTone } from '../global-search.types';\n\nconst toned = (tone: ToneRecipeName) => `${toneRecipes[tone].tint} ${toneRecipes[tone].ink}`;\n\nexport const DEFAULT_TONE_BG: Record<GlobalSearchTone, string> = {\n\tneutral: 'bg-muted text-muted-foreground',\n\tprimary: toned('primary'),\n\tsuccess: toned('success'),\n\twarning: toned('warning'),\n\tinfo: toned('info'),\n\tdestructive: toned('destructive'),\n};\n\nexport const DEFAULT_TONE_AVATAR: Record<GlobalSearchTone, string> = { ...DEFAULT_TONE_BG };\n","/**\n * GlobalSearchResultRow — single rich result card.\n *\n * Layout: [thumbnail] [title + status pill / muted secondary line / meta] [right-value column] [chevron].\n * The row is a collection row: Command's inset, height floor, gap and medium\n * label weight, so a populated search reads at the same density as any menu.\n *\n * Exported as a partial so consumers can:\n * 1. Override an individual row via `slots.renderResult` and reuse this component for the others.\n * 2. Use it standalone in custom search UIs that don't need the full GlobalSearch shell.\n */\nimport { ArrowRight } from 'lucide-react';\nimport * as React from 'react';\n\nimport { Avatar, AvatarFallback, AvatarImage } from '../../../base/avatar';\nimport { Badge } from '../../../base/badge';\nimport { Stack } from '../../../base/structure';\nimport { SecondaryValue, Value } from '../../../primitives';\nimport { Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nimport type { GlobalSearchResult } from '../global-search.types';\nimport {\n\tDEFAULT_TONE_AVATAR,\n\tDEFAULT_TONE_BG,\n} from './tone-palettes';\nimport { collectionRowClasses } from '../../../base/popover/popover.recipes';\nimport { focusRecipes } from '../../../../lib/focus-recipes';\nimport { interactionRecipes } from '../../../../lib/interaction-recipes';\nimport { markRecipes } from '../../../../lib/tone-recipes';\n\nexport interface GlobalSearchResultRowProps<TGroup extends string = string> {\n\t/** The result this row represents. */\n\tresult: GlobalSearchResult<TGroup>;\n\t/** Highlighted via keyboard nav. */\n\tactive?: boolean;\n\t/** Current search text. */\n\tquery?: string;\n\t/** Fired when an entry is activated. */\n\tonSelect?: () => void;\n\tonMouseEnter?: () => void;\n\t/**\n\t * Id of this row as an option of a results listbox. When set, the row is a\n\t * `role=\"option\"` reached through the search field's active descendant\n\t * rather than by Tab; standalone rows stay plain buttons.\n\t */\n\toptionId?: string;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nfunction highlightMatch(text: string, query: string | undefined): React.ReactNode {\n\tconst q = (query ?? '').trim();\n\tif (!q) return text;\n\tconst lower = text.toLowerCase();\n\tconst ql = q.toLowerCase();\n\tconst i = lower.indexOf(ql);\n\tif (i < 0) return text;\n\treturn (\n\t\t<>\n\t\t\t{text.slice(0, i)}\n\t\t\t<mark className={markRecipes.match}>\n\t\t\t\t{text.slice(i, i + q.length)}\n\t\t\t</mark>\n\t\t\t{text.slice(i + q.length)}\n\t\t</>\n\t);\n}\n\nexport function GlobalSearchResultRow<TGroup extends string = string>({\n\tresult,\n\tactive = false,\n\tquery = '',\n\tonSelect,\n\tonMouseEnter,\n\toptionId,\n\tclassName,\n}: GlobalSearchResultRowProps<TGroup>) {\n\tconst ThumbIcon = result.thumbnail?.icon;\n\tconst bg = DEFAULT_TONE_BG;\n\tconst av = DEFAULT_TONE_AVATAR;\n\t// A neutral tile shares its muted fill with the row highlight; on a\n\t// highlighted row it lifts to the card surface so it stays distinct.\n\tconst liftNeutralTile = (tone: string | undefined) =>\n\t\t(tone ?? 'neutral') === 'neutral' && (active ? 'bg-card' : 'group-hover/row:bg-card');\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tdata-component=\"global-search-result-row\"\n\t\t\tdata-slot=\"global-search-result-row\"\n\t\t\t{...(optionId ? { id: optionId, role: 'option', 'aria-selected': active, tabIndex: -1 } : {})}\n\t\t\tonMouseEnter={onMouseEnter}\n\t\t\tonClick={onSelect}\n\t\t\tclassName={cn(\n\t\t\t\t`${interactionRecipes.nativeButtonReset} group/row relative flex w-full cursor-pointer items-center justify-start text-inherit outline-none ${focusRecipes.inset} text-left transition-colors`,\n\t\t\t\tcollectionRowClasses(),\n\t\t\t\t'global-search-result-row--component',\n\t\t\t\tactive ? interactionRecipes.rowSelected : interactionRecipes.rowHover,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{/* Thumbnail / Avatar */}\n\t\t\t<div className=\"flex shrink-0 items-center\">\n\t\t\t\t{result.avatar ? (\n\t\t\t\t\t<Avatar className={cn('size-avatar-sm', av[result.avatar.tone ?? 'neutral'], liftNeutralTile(result.avatar.tone))}>\n\t\t\t\t\t\t{result.avatar.src && (\n\t\t\t\t\t\t\t<AvatarImage src={result.avatar.src} alt={result.title} />\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<AvatarFallback\n\t\t\t\t\t\t\tclassName={cn('text-xs font-semibold', av[result.avatar.tone ?? 'neutral'], liftNeutralTile(result.avatar.tone))}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{result.avatar.initials}\n\t\t\t\t\t\t</AvatarFallback>\n\t\t\t\t\t</Avatar>\n\t\t\t\t) : ThumbIcon ? (\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'inline-flex size-avatar-sm items-center justify-center rounded-radius',\n\t\t\t\t\t\t\tbg[result.thumbnail?.tone ?? 'neutral'],\n\t\t\t\t\t\t\tliftNeutralTile(result.thumbnail?.tone),\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ThumbIcon className=\"size-icon-sm\" aria-hidden=\"true\" />\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t</div>\n\n\t\t\t{/* Body */}\n\t\t\t<Stack gap=\"dense\" className=\"min-w-0 flex-1\">\n\t\t\t\t<div className=\"flex min-w-0 items-center gap-space-sm\">\n\t\t\t\t\t<Text tag=\"span\" type=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className=\"truncate\">\n\t\t\t\t\t\t{highlightMatch(result.title, query)}\n\t\t\t\t\t</Text>\n\t\t\t\t\t{!!result.badge && (\n\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\ttone={\n\t\t\t\t\t\t\t\tresult.badge.tone === 'destructive'\n\t\t\t\t\t\t\t\t\t? 'destructive'\n\t\t\t\t\t\t\t\t\t: result.badge.tone\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{result.badge.label}\n\t\t\t\t\t\t</Badge>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t{(() => {\n\t\t\t\t\tconst pieces: Array<{ key: string; node: React.ReactNode }> = [];\n\t\t\t\t\tif (result.subtitle)\n\t\t\t\t\t\tpieces.push({\n\t\t\t\t\t\t\tkey: 'subtitle',\n\t\t\t\t\t\t\tnode: (\n\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" className=\"min-w-0 break-words\">\n\t\t\t\t\t\t\t\t\t{highlightMatch(result.subtitle, query)}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t});\n\t\t\t\t\tresult.meta?.forEach((m, i) => {\n\t\t\t\t\t\tconst Icon = m.icon;\n\t\t\t\t\t\tpieces.push({\n\t\t\t\t\t\t\tkey: `m-${i}`,\n\t\t\t\t\t\t\tnode: (\n\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t'inline-flex min-w-0 items-center gap-space-xs break-words',\n\t\t\t\t\t\t\t\t\t\tm.mono && 'font-mono tabular-nums',\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{!!Icon && <Icon className=\"size-icon-sm shrink-0\" aria-hidden=\"true\" />}\n\t\t\t\t\t\t\t\t\t{m.label}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t\tif (result.timestamp)\n\t\t\t\t\t\tpieces.push({\n\t\t\t\t\t\t\tkey: 'ts',\n\t\t\t\t\t\t\tnode: <SecondaryValue size=\"xs\" className=\"tabular-nums\">{result.timestamp}</SecondaryValue>,\n\t\t\t\t\t\t});\n\t\t\t\t\tresult.tags?.forEach((tag) =>\n\t\t\t\t\t\tpieces.push({\n\t\t\t\t\t\t\tkey: `t-${tag}`,\n\t\t\t\t\t\t\t\tnode: <Text tag=\"span\" size=\"xs\" type=\"secondary\" className=\"min-w-0 break-words\">{tag}</Text>,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tif (result.rightValue) {\n\t\t\t\t\t\tpieces.push({\n\t\t\t\t\t\t\tkey: 'rv',\n\t\t\t\t\t\t\tnode: (\n\t\t\t\t\t\t\t\t\t<Value type=\"inherit\" weight=\"medium\" className=\"inline-flex flex-wrap items-baseline gap-space-xs tabular-nums\">\n\t\t\t\t\t\t\t\t\t{result.rightValue}\n\t\t\t\t\t\t\t\t\t{!!result.rightLabel && (\n\t\t\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\t\t\t\t\t\t\ttype=\"secondary\"\n\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{result.rightLabel.toLowerCase()}\n\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</Value>\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (pieces.length === 0) return null;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div className=\"flex min-w-0 flex-wrap items-baseline gap-x-space-sm gap-y-dense break-words\">\n\t\t\t\t\t\t\t{pieces.map((p, i) => (\n\t\t\t\t\t\t\t\t<span key={p.key} className={cn('inline-flex min-w-0 max-w-full items-baseline gap-space-sm', p.key === 'rv' && '@xl/global-search:hidden')}>\n\t\t\t\t\t\t\t\t\t{i > 0 && (\n\t\t\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t·\n\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{p.node}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})()}\n\t\t\t</Stack>\n\n\t\t\t{/* Right value column — only when value/label set */}\n\t\t\t{!!(result.rightValue || result.rightLabel) && (\n\t\t\t\t<div className=\"hidden shrink-0 items-center self-stretch @xl/global-search:flex\">\n\t\t\t\t\t<Stack gap=\"dense\" align=\"end\" className=\"text-right leading-tight\">\n\t\t\t\t\t\t{!!result.rightValue && (\n\t\t\t\t\t\t\t<Value\n\t\t\t\t\t\t\t\ttype=\"inherit\"\n\t\t\t\t\t\t\t\tweight=\"semibold\"\n\t\t\t\t\t\t\t\tclassName=\"whitespace-nowrap tabular-nums\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{result.rightValue}\n\t\t\t\t\t\t\t</Value>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{!!result.rightLabel && (\n\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\tclassName=\"whitespace-nowrap\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{result.rightLabel}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Stack>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Trailing chevron */}\n\t\t\t<ArrowRight\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'size-icon shrink-0 transition-opacity',\n\t\t\t\t\tactive\n\t\t\t\t\t\t? 'text-inherit opacity-100'\n\t\t\t\t\t\t: 'text-muted-foreground opacity-0 group-hover/row:opacity-100',\n\t\t\t\t)}\n\t\t\t/>\n\t\t</button>\n\t);\n}\n","/**\n * GlobalSearchTabs — segmented filter strip above the result list.\n *\n * Wraps `base/navigation/tabs` for app-consistent styling and adds the\n * shared count badge (as NavigationTabs draws it) next to each label. The\n * strip is a header band: its scroller owns the collection inset (which also\n * keeps the focus halo clear of the overflow clip) and a quiet rule separates\n * it from the result list.\n */\nimport { Badge } from '../../../base/badge';\nimport { Tabs, TabsList, TabsTrigger } from '../../../base/navigation/tabs';\nimport { Text } from '../../../typography';\nimport { popoverRecipes } from '../../../base/popover/popover.recipes';\nimport { surfaceDividerRecipes } from '../../../../lib/surface-recipes';\nimport { cn } from '../../../../lib/utils';\n\nexport interface GlobalSearchTabsProps<TGroup extends string = string> {\n\t/** Currently-selected tab. */\n\tvalue: 'all' | TGroup;\n\tonValueChange: (value: 'all' | TGroup) => void;\n\t/** Tabs to offer, in display order. */\n\ttabs: ReadonlyArray<{ value: 'all' | TGroup; label: string }>;\n\t/** Result counts shown beside each group. */\n\tcounts: Record<string, number>;\n}\n\nexport function GlobalSearchTabs<TGroup extends string = string>({\n\tvalue,\n\tonValueChange,\n\ttabs,\n\tcounts,\n}: GlobalSearchTabsProps<TGroup>) {\n\treturn (\n\t\t<div className={cn('global-search-tabs--component', surfaceDividerRecipes.anchored.header)}>\n\t\t\t<div className={cn('global-search-tabs--scroller overflow-x-auto pt-space-xs pb-space-md [scrollbar-width:none] [&::-webkit-scrollbar]:hidden', popoverRecipes.menuInline)}>\n\t\t\t\t<Tabs\n\t\t\t\t\tvalue={value as string}\n\t\t\t\t\tonValueChange={(v) => onValueChange(v as 'all' | TGroup)}\n\t\t\t\t\tclassName=\"min-w-max\"\n\t\t\t\t>\n\t\t\t\t\t<TabsList className=\"global-search-tabs--list h-action-sm w-max min-w-max\">\n\t\t\t\t\t\t{tabs.map((tab) => {\n\t\t\t\t\t\t\tconst count = counts[tab.value as string] ?? 0;\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<TabsTrigger\n\t\t\t\t\t\t\t\t\tkey={tab.value as string}\n\t\t\t\t\t\t\t\t\tvalue={tab.value as string}\n\t\t\t\t\t\t\t\t\tclassName=\"global-search-tabs--trigger shrink-0 gap-space-sm px-control-sm text-foreground\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Text tag=\"span\">\n\t\t\t\t\t\t\t\t\t\t{tab.label}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t<Badge size=\"sm\" tone=\"secondary\" className=\"global-search-tabs--count tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t{count}\n\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t</TabsTrigger>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</TabsList>\n\t\t\t\t</Tabs>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * GlobalSearch — framework-agnostic spotlight overlay for app-wide search.\n *\n * Composition seams:\n * - `strings` — deep-partial override of the default copy\n * - `slots` — replace any region (input, tabs, idle, empty, loading, footer)\n * - `slots.renderResult` — full per-row override\n *\n * Headless usage:\n * - Call `useGlobalSearch({ results, query })` directly to drive a\n * completely custom UI against the same selection state machine.\n *\n * Framework-agnostic:\n * - No router import, no i18n SDK import. Routing is up to the consumer\n * via `onResultSelect`. Strings live in the `strings` prop.\n * - The library no longer ships `adapters/$framework/`. Consumers map\n * their router (Inertia, Tanstack Router, RR7, Next, …) to\n * `onResultSelect(result)` directly at the call site.\n */\nimport * as React from 'react';\n\nimport { TextButton } from '../../base/buttons';\nimport { surfaceInsetClasses } from '../../base/popover/popover.recipes';\nimport { Text } from '../../typography';\nimport { interpolateString, useStrings, type StringsProp } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport {\n\tdefaultGlobalSearchStrings,\n\ttype GlobalSearchStrings,\n} from './global-search.strings';\nimport type {\n\tGlobalSearchIdleSection,\n\tGlobalSearchResult,\n\tGlobalSearchSlots,\n\tGlobalSearchTab,\n} from './global-search.types';\nimport { useGlobalSearch } from './hooks/use-global-search';\nimport {\n\tGlobalSearchEmptyState,\n\tGlobalSearchFooter,\n\tGlobalSearchIdleState,\n\tGlobalSearchInput,\n\tGlobalSearchResultRow,\n\tGlobalSearchTabs,\n} from './partials';\nimport { GlobalSearchGroupHeading } from './partials/global-search-group-heading';\n\nexport interface GlobalSearchProps<TGroup extends string = string> {\n\t/** Result list. The component renders these grouped by `result.group`. */\n\tresults?: ReadonlyArray<GlobalSearchResult<TGroup>>;\n\t/** Current query value (controlled). */\n\tquery: string;\n\t/** Query change callback. */\n\tonQueryChange: (q: string) => void;\n\t/** Activation callback — fires on row click or Enter. */\n\tonResultSelect?: (result: GlobalSearchResult<TGroup>) => void;\n\t/** Escape-key callback. */\n\tonClose?: () => void;\n\t/** Loading flag — switches the input spinner and renders the loading slot. */\n\tloading?: boolean;\n\t/** Idle-state sections (Recent / Suggestions / …). */\n\tidleSections?: ReadonlyArray<GlobalSearchIdleSection>;\n\t/** Override default group labels in the tab strip. */\n\tgroupLabels?: Partial<Record<TGroup, string>>;\n\t/** Auto-focus the input on mount. */\n\tautoFocus?: boolean;\n\t/** Replace any portion of the default copy. */\n\tstrings?: StringsProp<GlobalSearchStrings>;\n\t/** Replace any portion of the layout. */\n\tslots?: GlobalSearchSlots<TGroup>;\n\t/** Custom tab list — overrides the auto-generated `All + groups`. */\n\ttabs?: ReadonlyArray<GlobalSearchTab<TGroup>>;\n\t/** Wrapper className. */\n\tclassName?: string;\n}\n\nexport function GlobalSearch<TGroup extends string = string>({\n\tresults = [],\n\tquery,\n\tonQueryChange,\n\tonResultSelect,\n\tonClose,\n\tloading = false,\n\tidleSections,\n\tgroupLabels,\n\tautoFocus = false,\n\tstrings: stringsProp,\n\tslots,\n\ttabs,\n\tclassName,\n}: GlobalSearchProps<TGroup>) {\n\tconst strings = useStrings(defaultGlobalSearchStrings, stringsProp);\n\n\tconst search = useGlobalSearch<TGroup>({\n\t\tresults,\n\t\tquery,\n\t\tonResultSelect,\n\t\tonClose,\n\t});\n\n\tconst isEmpty =\n\t\t!loading && query.trim().length > 1 && results.length === 0;\n\tconst isIdle = !loading && query.trim().length <= 1;\n\n\t// Combobox semantics: focus stays in the field while the arrow keys move the\n\t// highlight, so each group is a listbox and the field names the active option.\n\tconst listboxBaseId = React.useId();\n\tconst showResults = !loading && results.length > 0;\n\tconst flatIndexById = new Map(search.flat.map((item, index) => [item.id, index]));\n\tconst optionIdFor = (index: number) => `${listboxBaseId}-option-${index}`;\n\tconst groupKeys = Object.keys(search.visibleGrouped);\n\tconst listboxIdFor = (groupIndex: number) => `${listboxBaseId}-group-${groupIndex}`;\n\tconst activeOptionId = showResults && search.flat[search.activeIdx] ? optionIdFor(search.activeIdx) : undefined;\n\n\tconst resolvedTabs = React.useMemo<\n\t\tReadonlyArray<GlobalSearchTab<TGroup>>\n\t>(() => {\n\t\tif (tabs) return tabs;\n\t\tconst groupKeys = Object.keys(search.grouped) as TGroup[];\n\t\treturn [\n\t\t\t{ value: 'all', label: strings.tabAll },\n\t\t\t...groupKeys.map((key) => ({\n\t\t\t\tvalue: key,\n\t\t\t\tlabel: groupLabels?.[key] ?? key,\n\t\t\t})),\n\t\t];\n\t}, [tabs, search.grouped, strings.tabAll, groupLabels]);\n\n\treturn (\n\t\t<div\n\t\t\tdata-component=\"global-search\"\n\t\t\tdata-slot=\"global-search\"\n\t\t\tclassName={cn('global-search--component',\n\t\t\t\t'@container/global-search overflow-hidden rounded-surface border border-border bg-card text-card-foreground shadow-xl',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{slots?.input ?? (\n\t\t\t\t<GlobalSearchInput\n\t\t\t\t\tvalue={query}\n\t\t\t\t\tonValueChange={onQueryChange}\n\t\t\t\t\tonKeyDown={search.onKeyDown}\n\t\t\t\t\tplaceholder={strings.placeholder}\n\t\t\t\t\tclearLabel={strings.clear}\n\t\t\t\t\tloading={loading}\n\t\t\t\t\tautoFocus={autoFocus}\n\t\t\t\t\texpanded={showResults}\n\t\t\t\t\tcontrols={groupKeys.map((_, groupIndex) => listboxIdFor(groupIndex)).join(' ')}\n\t\t\t\t\tactiveDescendant={activeOptionId}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{!loading && results.length > 0 && (\n\t\t\t\tslots?.tabs ?? (\n\t\t\t\t\t<GlobalSearchTabs<TGroup>\n\t\t\t\t\t\tvalue={search.activeTab}\n\t\t\t\t\t\tonValueChange={search.setActiveTab}\n\t\t\t\t\t\ttabs={resolvedTabs}\n\t\t\t\t\t\tcounts={search.tabCounts}\n\t\t\t\t\t/>\n\t\t\t\t)\n\t\t\t)}\n\n\t\t\t{/* A rem-based results viewport (32.5rem), so it follows the root text size. */}\n\t\t\t<div className=\"global-search--viewport max-h-130 overflow-y-auto\">\n\t\t\t\t{!!isIdle && (slots?.idle ?? (\n\t\t\t\t\tidleSections && idleSections.length > 0 ? (\n\t\t\t\t\t\t<GlobalSearchIdleState sections={idleSections} />\n\t\t\t\t\t) : null\n\t\t\t\t))}\n\n\t\t\t\t{!!loading && (slots?.loading ?? (\n\t\t\t\t\t<div className=\"global-search--loading flex items-center justify-center px-row-x py-space-xl\" role=\"status\">\n\t\t\t\t\t\t<Text type=\"secondary\">\n\t\t\t\t\t\t\t{strings.loading}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\n\t\t\t\t{!!isEmpty && (slots?.empty ?? (\n\t\t\t\t\t<GlobalSearchEmptyState\n\t\t\t\t\t\ttitle={interpolateString(strings.emptyTitle, { query })}\n\t\t\t\t\t\thint={strings.emptyHint}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\n\t\t\t\t{!loading && results.length > 0 && (\n\t\t\t\t\t<div className={cn('global-search--results', surfaceInsetClasses.compact)}>\n\t\t\t\t\t\t{Object.entries(search.visibleGrouped).map(([groupKey, items], groupIndex) => (\n\t\t\t\t\t\t\t<div key={groupKey} className=\"global-search--group\">\n\t\t\t\t\t\t\t\t<GlobalSearchGroupHeading\n\t\t\t\t\t\t\t\t\tlabel={groupLabels?.[groupKey as TGroup] ?? groupKey}\n\t\t\t\t\t\t\t\t\taction={search.activeTab === 'all' && items.length > 0 ? (\n\t\t\t\t\t\t\t\t\t\t<TextButton\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => search.setActiveTab(groupKey as TGroup)}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{strings.seeAll}\n\t\t\t\t\t\t\t\t\t\t</TextButton>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<ul\n\t\t\t\t\t\t\t\t\tid={listboxIdFor(groupIndex)}\n\t\t\t\t\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\t\t\t\t\taria-label={groupLabels?.[groupKey as TGroup] ?? groupKey}\n\t\t\t\t\t\t\t\t\tclassName=\"m-0 flex list-none flex-col p-0\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{items.map((item) => {\n\t\t\t\t\t\t\t\t\t\tconst isActive =\n\t\t\t\t\t\t\t\t\t\t\tsearch.flat[search.activeIdx]?.id === item.id;\n\t\t\t\t\t\t\t\t\t\tconst optionId = optionIdFor(flatIndexById.get(item.id) ?? -1);\n\t\t\t\t\t\t\t\t\t\tconst ctx = {\n\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\tquery,\n\t\t\t\t\t\t\t\t\t\t\tonSelect: () => onResultSelect?.(item),\n\t\t\t\t\t\t\t\t\t\t\toptionId,\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t// A custom row is wrapped as the option; the default row is one.\n\t\t\t\t\t\t\t\t\t\tif (slots?.renderResult) {\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<li key={item.id} id={optionId} role=\"option\" aria-selected={isActive}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{slots.renderResult(item, ctx)}\n\t\t\t\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<li key={item.id} role=\"none\">\n\t\t\t\t\t\t\t\t\t\t\t\t<GlobalSearchResultRow<TGroup>\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult={item}\n\t\t\t\t\t\t\t\t\t\t\t\t\tactive={isActive}\n\t\t\t\t\t\t\t\t\t\t\t\t\tquery={query}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={ctx.onSelect}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonMouseEnter={() =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsearch.setActiveById(item.id)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\toptionId={optionId}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{slots?.footer ?? (\n\t\t\t\t<GlobalSearchFooter\n\t\t\t\t\tnavigateLabel={strings.footerNavigate}\n\t\t\t\t\topenLabel={strings.footerOpen}\n\t\t\t\t\tcloseLabel={strings.footerClose}\n\t\t\t\t\ttrailing={\n\t\t\t\t\t\t!isIdle && !isEmpty && results.length > 0 ? (\n\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\tclassName=\"tabular-nums\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{interpolateString(strings.resultsCount, {\n\t\t\t\t\t\t\t\t\tcount: results.length,\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t) : undefined\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","/**\n * GlobalSearchDialog — the command-palette presentation of `GlobalSearch`.\n *\n * `GlobalSearch` is a panel: it renders its own card chrome and expects to be\n * placed somewhere. The palette pattern it was clearly built for — `onClose`,\n * `autoFocus`, Escape handling — had no supported presentation, so every call\n * site hand-rolled the modal around it: a `fixed inset-0` backdrop and a\n * mousedown-outside handler, with no focus trap, no portal, no scroll lock and\n * no dialog role.\n *\n * It presents through `ActionDialog` rather than a raw `Dialog`, because\n * `features/overlays` is the package's single overlay surface and everything\n * modal is expected to come from it. Three of its seams carry the palette\n * shape: `visuallyHideHeader` keeps the accessible name without drawing a\n * heading, `showCloseButton={false}` drops the corner X that would otherwise\n * land on the search field, and the two action flags remove the footer.\n *\n * The surface itself is neutralised because `GlobalSearch` already draws the\n * card, and it anchors near the top rather than centring, which is where a\n * palette belongs.\n */\nimport { useMemo } from 'react';\n\nimport { ActionDialog } from '../overlays';\nimport { useStrings } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport { GlobalSearch, type GlobalSearchProps } from './global-search';\nimport { defaultGlobalSearchStrings } from './global-search.strings';\n\nexport interface GlobalSearchDialogProps<TGroup extends string = string>\n\textends Omit<GlobalSearchProps<TGroup>, 'onClose'> {\n\t/** Whether the palette is showing. */\n\topen: boolean;\n\t/** Open-state callback. Fires on Escape, backdrop click, and result selection. */\n\tonOpenChange: (open: boolean) => void;\n\t/** Classes for the dialog surface that positions the palette. */\n\tcontentClassName?: string;\n}\n\nexport function GlobalSearchDialog<TGroup extends string = string>({\n\topen,\n\tonOpenChange,\n\tcontentClassName,\n\tclassName,\n\tstrings: stringsProp,\n\tautoFocus = true,\n\t...searchProps\n}: GlobalSearchDialogProps<TGroup>) {\n\tconst strings = useStrings(defaultGlobalSearchStrings, stringsProp);\n\tconst close = useMemo(() => () => onOpenChange(false), [onOpenChange]);\n\n\treturn (\n\t\t<ActionDialog\n\t\t\topen={open}\n\t\t\tonOpenChange={onOpenChange}\n\t\t\ttitle={strings.dialogTitle}\n\t\t\tvisuallyHideHeader\n\t\t\tshowCloseButton={false}\n\t\t\tshowCancel={false}\n\t\t\tshowConfirm={false}\n\t\t\tclassName={cn(\n\t\t\t\t'global-search-dialog--component',\n\t\t\t\t// GlobalSearch draws the card, so the dialog surface carries none:\n\t\t\t\t// stacking both produced a border inside a border.\n\t\t\t\t'w-full max-w-2xl overflow-visible border-0 bg-transparent p-0 shadow-none sm:max-w-2xl',\n\t\t\t\t// A palette belongs near the top of the viewport, not centred in it.\n\t\t\t\t'top-24 translate-y-0',\n\t\t\t\tcontentClassName,\n\t\t\t)}\n\t\t\tcontentClassName=\"p-0\"\n\t\t>\n\t\t\t<GlobalSearch<TGroup>\n\t\t\t\t{...(searchProps as GlobalSearchProps<TGroup>)}\n\t\t\t\tstrings={stringsProp}\n\t\t\t\tautoFocus={autoFocus}\n\t\t\t\tonClose={close}\n\t\t\t\tclassName={className}\n\t\t\t/>\n\t\t</ActionDialog>\n\t);\n}\n\nGlobalSearchDialog.displayName = 'GlobalSearchDialog';\n"],"mappings":"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"}
1
+ {"version":3,"file":"global-search.js","names":["React","_Fragment","React","cn","TextButton","Text","focusRecipes","Stack","toneRecipes","markRecipes","surfaceDividerRecipes","kbdRecipe","surfaceInsetClasses","collectionRowClasses","popoverRecipes","ActionDialog","interactionRecipes","Value","SecondaryValue","AvatarFallback","Avatar","AvatarImage","Badge","fieldAffordanceRecipes","FieldClearGlyph","InputGroup","InputGroupInput","InputGroupAddon","TabsTrigger","TabsList","Tabs","EmptyState","React$1","Fragment$1","defaultGlobalSearchStrings","useGlobalSearch","activeTab","setActiveTabState","useState","activeIdx","setActiveIdx","query","grouped","useMemo","buckets","r","results","tabCounts","counts","k","v","visibleGrouped","sub","flat","activeIdxRef","useRef","flatRef","tab","idx","id","i","item","onResultSelect","onClose","GlobalSearchEmptyState","hint","Search","Shortcut","keys","label","GlobalSearchFooter","className","navigateLabel","openLabel","closeLabel","trailing","GlobalSearchGroupHeading","Icon","action","GlobalSearchIdleState","sections","section","fallbackIcons","ItemIcon","GlobalSearchInput","innerRef","ref","autoFocus","onValueChange","placeholder","expanded","controls","activeDescendant","loading","value","Loader2","clearLabel","toned","tone","DEFAULT_TONE_BG","DEFAULT_TONE_AVATAR","highlightMatch","q","text","lower","ql","GlobalSearchResultRow","ThumbIcon","result","bg","av","liftNeutralTile","active","optionId","onSelect","pieces","m","tag","p","ArrowRight","GlobalSearchTabs","tabs","count","GlobalSearch","stringsProp","strings","useStrings","search","isEmpty","isIdle","listboxBaseId","showResults","flatIndexById","index","optionIdFor","groupKeys","listboxIdFor","groupIndex","activeOptionId","resolvedTabs","key","groupLabels","slots","onQueryChange","idleSections","interpolateString","groupKey","items","isActive","ctx","GlobalSearchDialog","searchProps","close","onOpenChange","contentClassName"],"sources":["../../src/components/features/global-search/global-search.strings.ts","../../src/components/features/global-search/hooks/use-global-search.ts","../../src/components/features/global-search/partials/global-search-empty-state.tsx","../../src/components/features/global-search/partials/global-search-footer.tsx","../../src/components/features/global-search/partials/global-search-group-heading.tsx","../../src/components/features/global-search/partials/global-search-idle-state.tsx","../../src/components/features/global-search/partials/global-search-input.tsx","../../src/components/features/global-search/partials/tone-palettes.ts","../../src/components/features/global-search/partials/global-search-result-row.tsx","../../src/components/features/global-search/partials/global-search-tabs.tsx","../../src/components/features/global-search/global-search.tsx","../../src/components/features/global-search/global-search-dialog.tsx"],"sourcesContent":["/**\n * Strings for `GlobalSearch` and its partials. Consumers override via the\n * `strings` prop on `<GlobalSearch />`; values are deep-merged over these\n * defaults so partial overrides are safe.\n */\nexport interface GlobalSearchStrings {\n\t/** Placeholder copy for the search input. */\n\t/** Names the modal presentation for assistive technology. */\n\tdialogTitle: string;\n\tplaceholder: string;\n\t/** aria-label for the clear-search icon button. */\n\tclear: string;\n\t/** Loading-state copy. */\n\tloading: string;\n\t/** Empty-state title — uses {{query}} as a placeholder. */\n\temptyTitle: string;\n\t/** Empty-state body copy. */\n\temptyHint: string;\n\t/** Idle-state heading for \"Recent\" suggestions. */\n\tidleRecent: string;\n\t/** Idle-state heading for curated \"Suggestions\". */\n\tidleSuggestions: string;\n\t/** Tab label for the \"All\" tab. */\n\ttabAll: string;\n\t/** Footer \"navigate\" hint. */\n\tfooterNavigate: string;\n\t/** Footer \"open\" hint. */\n\tfooterOpen: string;\n\t/** Footer \"close\" hint. */\n\tfooterClose: string;\n\t/** Trailing N results count. */\n\tresultsCount: string;\n\t/** \"See all\" group action — jumps to that tab. */\n\tseeAll: string;\n}\n\nexport const defaultGlobalSearchStrings: GlobalSearchStrings = {\n\tdialogTitle: 'Search',\n\tplaceholder: 'Search…',\n\tclear: 'Clear search',\n\tloading: 'Searching…',\n\temptyTitle: 'No results for \"{{query}}\"',\n\temptyHint: 'Try a shorter keyword or check the spelling.',\n\tidleRecent: 'Recent',\n\tidleSuggestions: 'Suggestions',\n\ttabAll: 'All',\n\tfooterNavigate: 'navigate',\n\tfooterOpen: 'open',\n\tfooterClose: 'close',\n\tresultsCount: '{{count}} results',\n\tseeAll: 'See all',\n};\n","/**\n * useGlobalSearch — headless state machine for `<GlobalSearch />`.\n *\n * Owns the active-row index, active tab, and the keyboard-navigation\n * handler. Returns the derived flat list (results filtered by tab) so\n * consumers can render entirely custom UIs against the same state.\n *\n * Usage:\n * const search = useGlobalSearch({ results, query });\n * <input onKeyDown={search.onKeyDown} />\n * {search.flat.map((r, i) => <Row active={i === search.activeIdx} … />)}\n */\nimport { useEffect, useMemo, useRef, useState } from 'react';\n\nimport type { GlobalSearchResult } from '../global-search.types';\n\nexport interface UseGlobalSearchOptions<TGroup extends string = string> {\n\tresults: ReadonlyArray<GlobalSearchResult<TGroup>>;\n\tquery: string;\n\t/** Fires when the user activates a row (Enter or click). */\n\tonResultSelect?: (result: GlobalSearchResult<TGroup>) => void;\n\t/** Fires when the user presses Escape. */\n\tonClose?: () => void;\n}\n\nexport interface UseGlobalSearchReturn<TGroup extends string = string> {\n\t/** Results bucketed by group, in insertion order. */\n\tgrouped: Record<string, GlobalSearchResult<TGroup>[]>;\n\t/** Result count per tab (`all` plus each group key). */\n\ttabCounts: Record<string, number>;\n\t/** Currently-selected tab. */\n\tactiveTab: 'all' | TGroup;\n\t/** Set the active tab — also resets the active index. */\n\tsetActiveTab: (tab: 'all' | TGroup) => void;\n\t/** Filtered grouped map respecting the active tab. */\n\tvisibleGrouped: Record<string, GlobalSearchResult<TGroup>[]>;\n\t/** Flat ordered list matching what is currently rendered. */\n\tflat: GlobalSearchResult<TGroup>[];\n\t/** Index into `flat` of the currently-highlighted row. */\n\tactiveIdx: number;\n\tsetActiveIdx: (i: number) => void;\n\t/** Programmatically activate a result by id. */\n\tsetActiveById: (id: string) => void;\n\t/** Bind to the search input's `onKeyDown` for arrow / enter / escape support. */\n\tonKeyDown: (e: React.KeyboardEvent) => void;\n\t/** Activate the row at `activeIdx`. */\n\tselectActive: () => void;\n}\n\nexport function useGlobalSearch<TGroup extends string = string>({\n\tresults,\n\tquery,\n\tonResultSelect,\n\tonClose,\n}: UseGlobalSearchOptions<TGroup>): UseGlobalSearchReturn<TGroup> {\n\tconst [activeTab, setActiveTabState] =\n\t\tuseState<'all' | TGroup>('all');\n\tconst [activeIdx, setActiveIdx] = useState(0);\n\n\t// Reset both the active row and the active tab when the query changes\n\t// (so a fresh query never inherits a stale highlight or filter).\n\tuseEffect(() => {\n\t\tsetActiveTabState('all');\n\t\tsetActiveIdx(0);\n\t}, [query]);\n\n\tconst grouped = useMemo(() => {\n\t\tconst buckets: Record<string, GlobalSearchResult<TGroup>[]> = {};\n\t\tfor (const r of results) {\n\t\t\t(buckets[r.group] ??= []).push(r);\n\t\t}\n\t\treturn buckets;\n\t}, [results]);\n\n\tconst tabCounts = useMemo(() => {\n\t\tconst counts: Record<string, number> = { all: results.length };\n\t\tfor (const [k, v] of Object.entries(grouped)) counts[k] = v.length;\n\t\treturn counts;\n\t}, [results.length, grouped]);\n\n\tconst visibleGrouped = useMemo(() => {\n\t\tif (activeTab === 'all') return grouped;\n\t\tconst sub = grouped[activeTab as string];\n\t\treturn sub ? ({ [activeTab as string]: sub } as Record<string, GlobalSearchResult<TGroup>[]>) : {};\n\t}, [grouped, activeTab]);\n\n\tconst flat = useMemo(() => Object.values(visibleGrouped).flat(), [visibleGrouped]);\n\n\tconst activeIdxRef = useRef(activeIdx);\n\tactiveIdxRef.current = activeIdx;\n\tconst flatRef = useRef(flat);\n\tflatRef.current = flat;\n\n\tconst setActiveTab = (tab: 'all' | TGroup) => {\n\t\tsetActiveTabState(tab);\n\t\tsetActiveIdx(0);\n\t};\n\n\tconst setActiveById = (id: string) => {\n\t\tconst idx = flatRef.current.findIndex((r) => r.id === id);\n\t\tif (idx >= 0) setActiveIdx(idx);\n\t};\n\n\tconst selectActive = () => {\n\t\tconst item = flatRef.current[activeIdxRef.current];\n\t\tif (item) onResultSelect?.(item);\n\t};\n\n\tconst onKeyDown = (e: React.KeyboardEvent) => {\n\t\tif (e.key === 'ArrowDown') {\n\t\t\te.preventDefault();\n\t\t\tsetActiveIdx((i) => Math.min(i + 1, flatRef.current.length - 1));\n\t\t} else if (e.key === 'ArrowUp') {\n\t\t\te.preventDefault();\n\t\t\tsetActiveIdx((i) => Math.max(i - 1, 0));\n\t\t} else if (e.key === 'Enter') {\n\t\t\tconst item = flatRef.current[activeIdxRef.current];\n\t\t\tif (item) {\n\t\t\t\te.preventDefault();\n\t\t\t\tonResultSelect?.(item);\n\t\t\t}\n\t\t} else if (e.key === 'Escape') {\n\t\t\tonClose?.();\n\t\t}\n\t};\n\n\treturn {\n\t\tgrouped,\n\t\ttabCounts,\n\t\tactiveTab,\n\t\tsetActiveTab,\n\t\tvisibleGrouped,\n\t\tflat,\n\t\tactiveIdx,\n\t\tsetActiveIdx,\n\t\tsetActiveById,\n\t\tonKeyDown,\n\t\tselectActive,\n\t};\n}\n","/**\n * Default empty-state body — shown when the query yields no results.\n * Override entirely via `slots.empty`.\n */\nimport { Search } from 'lucide-react';\n\nimport { EmptyState } from '../../../blocks/data-display';\n\nexport interface GlobalSearchEmptyStateProps {\n\t/** Surface title. */\n\ttitle: string;\n\t/** Short guidance shown beneath the control. */\n\thint: string;\n}\n\nexport function GlobalSearchEmptyState({ title, hint }: GlobalSearchEmptyStateProps) {\n\treturn (\n\t\t<EmptyState\n\t\t\ttitle={title}\n\t\t\tdescription={hint}\n\t\t\tmedia={<Search className=\"size-icon\" aria-hidden=\"true\" />}\n\t\t\tmediaVariant=\"icon-soft\"\n\t\t\tpadding=\"md\"\n\t\t\tclassName=\"global-search-empty-state--component\"\n\t\t/>\n\t);\n}\n","/**\n * GlobalSearchFooter — keyboard-hint strip below the result list.\n * Override entirely via `slots.footer`.\n *\n * It is the anchored collection footer band: one region inset and a quiet top\n * rule, with copy aligned to the row text above it. Each key sits tight against\n * its own hint, and the hint pairs are spaced apart from one another.\n */\nimport { Text } from '../../../typography';\nimport { popoverRecipes } from '../../../base/popover/popover.recipes';\nimport { cn } from '../../../../lib/utils';\nimport { kbdRecipe, surfaceDividerRecipes } from '../../../../lib/surface-recipes';\n\nexport interface GlobalSearchFooterProps {\n\t/** Footer hint for the arrow keys. */\n\tnavigateLabel: string;\n\t/** Footer hint for the enter key. */\n\topenLabel: string;\n\t/** Footer hint for the escape key. */\n\tcloseLabel: string;\n\t/** Trailing right-aligned content (e.g. \"3 results\"). */\n\ttrailing?: React.ReactNode;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nfunction Shortcut({ keys, label }: { keys: string; label: string }) {\n\treturn (\n\t\t<span className=\"global-search-footer--shortcut inline-flex items-center gap-space-xs\">\n\t\t\t<kbd className={kbdRecipe}>{keys}</kbd>\n\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\">\n\t\t\t\t{label}\n\t\t\t</Text>\n\t\t</span>\n\t);\n}\n\nexport function GlobalSearchFooter({\n\tnavigateLabel,\n\topenLabel,\n\tcloseLabel,\n\ttrailing,\n\tclassName,\n}: GlobalSearchFooterProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'global-search-footer--component',\n\t\t\t\tpopoverRecipes.menuRegion,\n\t\t\t\tsurfaceDividerRecipes.anchored.footer,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<div className={cn('global-search-footer--body flex flex-col items-stretch gap-space-xs', popoverRecipes.menuCopyInset, '@sm/global-search:flex-row @sm/global-search:items-center @sm/global-search:justify-between')}>\n\t\t\t\t<span className=\"global-search-footer--shortcuts flex flex-wrap items-center gap-x-space-lg gap-y-space-xs\">\n\t\t\t\t\t<Shortcut keys=\"↑↓\" label={navigateLabel} />\n\t\t\t\t\t<Shortcut keys=\"↵\" label={openLabel} />\n\t\t\t\t\t<Shortcut keys=\"esc\" label={closeLabel} />\n\t\t\t\t</span>\n\t\t\t\t{trailing ? (\n\t\t\t\t\t<span className=\"global-search-footer--trailing shrink-0 self-end whitespace-nowrap @sm/global-search:self-auto\">\n\t\t\t\t\t\t{trailing}\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * Group caption shared by result groups and idle sections. It uses the compact\n * secondary role and inset of a Command group heading, so a caption never reads\n * as another row and both lists keep one rhythm.\n */\nimport type * as React from 'react';\n\nimport { Text } from '../../../typography';\n\nexport interface GlobalSearchGroupHeadingProps {\n\t/** Caption copy. */\n\tlabel: React.ReactNode;\n\t/** Optional leading glyph supplied by the section. */\n\ticon?: React.ElementType;\n\t/** Trailing action, such as \"See all\". */\n\taction?: React.ReactNode;\n}\n\nexport function GlobalSearchGroupHeading({ label, icon: Icon, action }: GlobalSearchGroupHeadingProps) {\n\treturn (\n\t\t<div className=\"global-search-group--heading flex items-center justify-between gap-space-sm px-row-x pt-space-md pb-space-xs\">\n\t\t\t<span className=\"inline-flex min-w-0 items-center gap-space-sm\">\n\t\t\t\t{!!Icon && <Icon className=\"size-icon-sm shrink-0 text-muted-foreground\" aria-hidden=\"true\" />}\n\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" weight=\"medium\" lineHeight=\"tight\" className=\"truncate\">\n\t\t\t\t\t{label}\n\t\t\t\t</Text>\n\t\t\t</span>\n\t\t\t{action}\n\t\t</div>\n\t);\n}\n","/**\n * Default idle-state body — shown when the query is too short.\n * Renders consumer-supplied \"Recent\" + \"Suggestions\" sections with the same\n * compact collection inset, group captions and rows as the result list.\n */\nimport { Search } from 'lucide-react';\nimport * as React from 'react';\n\nimport { collectionRowClasses, surfaceInsetClasses } from '../../../base/popover/popover.recipes';\nimport { Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nimport type { GlobalSearchIdleSection } from '../global-search.types';\nimport { focusRecipes } from '../../../../lib/focus-recipes';\nimport { interactionRecipes } from '../../../../lib/interaction-recipes';\nimport { GlobalSearchGroupHeading } from './global-search-group-heading';\n\nexport interface GlobalSearchIdleStateProps {\n\t/** Sections to render, in display order. */\n\tsections: ReadonlyArray<GlobalSearchIdleSection>;\n\t/** Optional heading icon used when a section supplies none. Headings carry no icon by default. */\n\tfallbackIcons?: { recent?: React.ElementType; suggestions?: React.ElementType };\n}\n\nexport function GlobalSearchIdleState({\n\tsections,\n\tfallbackIcons,\n}: GlobalSearchIdleStateProps) {\n\treturn (\n\t\t<div className={cn('global-search-idle-state--component', surfaceInsetClasses.compact)}>\n\t\t\t{sections.map((section, idx) => (\n\t\t\t\t<div key={section.id} className=\"global-search-idle-state--section\">\n\t\t\t\t\t<GlobalSearchGroupHeading\n\t\t\t\t\t\tlabel={section.label}\n\t\t\t\t\t\ticon={section.icon ?? (idx === 0 ? fallbackIcons?.recent : fallbackIcons?.suggestions)}\n\t\t\t\t\t/>\n\t\t\t\t\t<ul className=\"m-0 flex list-none flex-col p-0\">\n\t\t\t\t\t\t{section.items.map((item) => {\n\t\t\t\t\t\t\tconst ItemIcon = item.icon ?? Search;\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<li key={item.id}>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={item.onSelect}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t`${interactionRecipes.nativeButtonReset} flex w-full cursor-pointer items-center justify-start text-inherit outline-none ${focusRecipes.inset} text-left transition-colors`,\n\t\t\t\t\t\t\t\t\t\t\tcollectionRowClasses(),\n\t\t\t\t\t\t\t\t\t\t\tinteractionRecipes.rowHover,\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<ItemIcon\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"size-icon shrink-0 text-muted-foreground\"\n\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" type=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className=\"flex-1 truncate\">\n\t\t\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n","/**\n * GlobalSearchInput — search region at the top of the panel.\n *\n * The public `InputGroup` frame owns the field: its control height, padding,\n * radius, `--input` border and shared focus ring are the ones Command search\n * uses, so the spotlight never draws a field of its own. The region owns only\n * its outer collection inset. A busy indicator replaces the clear action while\n * results load, and the field stays editable throughout so typing is never\n * interrupted. Keyboard navigation is handled by the consumer wiring\n * `useGlobalSearch`'s `onKeyDown` handler; `expanded`, `controls` and\n * `activeDescendant` expose that navigation as a combobox.\n */\nimport { Loader2, Search } from 'lucide-react';\nimport * as React from 'react';\n\nimport { InputGroup, InputGroupAddon, InputGroupInput } from '../../../base/text-inputs';\nimport { popoverRecipes } from '../../../base/popover/popover.recipes';\nimport { FieldClearGlyph, fieldAffordanceRecipes } from '../../../../lib/field-affordance-recipes';\nimport { cn } from '../../../../lib/utils';\n\nexport interface GlobalSearchInputProps {\n\t/** Current value. */\n\tvalue: string;\n\t/** Fired with the next value. */\n\tonValueChange: (value: string) => void;\n\tonKeyDown?: (e: React.KeyboardEvent) => void;\n\t/** Shown while the value is empty. */\n\tplaceholder?: string;\n\t/** Accessible name for the clear control. */\n\tclearLabel?: string;\n\t/** Shows the pending indicator. */\n\tloading?: boolean;\n\t/** Focuses the control on mount. */\n\tautoFocus?: boolean;\n\t/**\n\t * Whether the results list is showing. Setting it makes the field a\n\t * combobox (`role=\"combobox\"`, `aria-expanded`), the pattern for a search\n\t * whose results are navigated with the arrow keys while focus stays here.\n\t */\n\texpanded?: boolean;\n\t/** Id(s) of the results listbox(es) the combobox controls, while expanded. */\n\tcontrols?: string;\n\t/** Id of the highlighted result, announced as the active option. */\n\tactiveDescendant?: string;\n}\n\nexport const GlobalSearchInput = React.forwardRef<HTMLInputElement, GlobalSearchInputProps>(function GlobalSearchInput(\n\t{ value, onValueChange, onKeyDown, placeholder, clearLabel = 'Clear search', loading = false, autoFocus = false, expanded, controls, activeDescendant },\n\tref,\n) {\n\tconst innerRef = React.useRef<HTMLInputElement | null>(null);\n\tReact.useImperativeHandle(ref, () => innerRef.current as HTMLInputElement);\n\n\tReact.useEffect(() => {\n\t\tif (autoFocus) innerRef.current?.focus();\n\t}, [autoFocus]);\n\n\treturn (\n\t\t<div\n\t\t\tdata-component=\"global-search-input\"\n\t\t\tdata-slot=\"global-search-input\"\n\t\t\tclassName={cn('global-search-input--component pt-surface-xs pb-space-xs', popoverRecipes.menuInline)}\n\t\t>\n\t\t\t<InputGroup>\n\t\t\t\t<InputGroupAddon>\n\t\t\t\t\t<Search aria-hidden=\"true\" />\n\t\t\t\t</InputGroupAddon>\n\t\t\t\t<InputGroupInput\n\t\t\t\t\tref={innerRef}\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tonChange={(e) => onValueChange(e.target.value)}\n\t\t\t\t\tonKeyDown={onKeyDown}\n\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\taria-label={placeholder}\n\t\t\t\t\t{...(expanded === undefined ? {} : {\n\t\t\t\t\t\trole: 'combobox',\n\t\t\t\t\t\t'aria-autocomplete': 'list' as const,\n\t\t\t\t\t\t'aria-expanded': expanded,\n\t\t\t\t\t\t'aria-controls': expanded ? controls : undefined,\n\t\t\t\t\t\t'aria-activedescendant': expanded ? activeDescendant : undefined,\n\t\t\t\t\t})}\n\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\tspellCheck={false}\n\t\t\t\t/>\n\t\t\t\t{(loading || !!value) && (\n\t\t\t\t\t<InputGroupAddon align=\"inline-end\">\n\t\t\t\t\t\t{loading ? (\n\t\t\t\t\t\t\t<Loader2 className=\"animate-spin\" aria-hidden=\"true\" />\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\tonValueChange('');\n\t\t\t\t\t\t\t\t\tinnerRef.current?.focus();\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\taria-label={clearLabel}\n\t\t\t\t\t\t\t\tclassName={cn(fieldAffordanceRecipes.target, fieldAffordanceRecipes.focus, fieldAffordanceRecipes.clear)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<FieldClearGlyph className={fieldAffordanceRecipes.icon} aria-hidden=\"true\" />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</InputGroupAddon>\n\t\t\t\t)}\n\t\t\t</InputGroup>\n\t\t</div>\n\t);\n});\n","/**\n * Default tone palettes for thumbnails and avatars: the shared tint and ink of\n * each status tone, so a search result's tile matches every other toned chip.\n *\n * Consumers can override per-call via `slots.toneBg` / `slots.toneAvatar`.\n */\nimport { toneRecipes, type ToneRecipeName } from '../../../../lib/tone-recipes';\nimport type { GlobalSearchTone } from '../global-search.types';\n\nconst toned = (tone: ToneRecipeName) => `${toneRecipes[tone].tint} ${toneRecipes[tone].ink}`;\n\nexport const DEFAULT_TONE_BG: Record<GlobalSearchTone, string> = {\n\tneutral: 'bg-muted text-muted-foreground',\n\tprimary: toned('primary'),\n\tsuccess: toned('success'),\n\twarning: toned('warning'),\n\tinfo: toned('info'),\n\tdestructive: toned('destructive'),\n};\n\nexport const DEFAULT_TONE_AVATAR: Record<GlobalSearchTone, string> = { ...DEFAULT_TONE_BG };\n","/**\n * GlobalSearchResultRow — single rich result card.\n *\n * Layout: [thumbnail] [title + status pill / muted secondary line / meta] [right-value column] [chevron].\n * The row is a collection row: Command's inset, height floor, gap and medium\n * label weight, so a populated search reads at the same density as any menu.\n *\n * Exported as a partial so consumers can:\n * 1. Override an individual row via `slots.renderResult` and reuse this component for the others.\n * 2. Use it standalone in custom search UIs that don't need the full GlobalSearch shell.\n */\nimport { ArrowRight } from 'lucide-react';\nimport * as React from 'react';\n\nimport { Avatar, AvatarFallback, AvatarImage } from '../../../base/avatar';\nimport { Badge } from '../../../base/badge';\nimport { Stack } from '../../../base/structure';\nimport { SecondaryValue, Value } from '../../../primitives';\nimport { Text } from '../../../typography';\nimport { cn } from '../../../../lib/utils';\n\nimport type { GlobalSearchResult } from '../global-search.types';\nimport {\n\tDEFAULT_TONE_AVATAR,\n\tDEFAULT_TONE_BG,\n} from './tone-palettes';\nimport { collectionRowClasses } from '../../../base/popover/popover.recipes';\nimport { focusRecipes } from '../../../../lib/focus-recipes';\nimport { interactionRecipes } from '../../../../lib/interaction-recipes';\nimport { markRecipes } from '../../../../lib/tone-recipes';\n\nexport interface GlobalSearchResultRowProps<TGroup extends string = string> {\n\t/** The result this row represents. */\n\tresult: GlobalSearchResult<TGroup>;\n\t/** Highlighted via keyboard nav. */\n\tactive?: boolean;\n\t/** Current search text. */\n\tquery?: string;\n\t/** Fired when an entry is activated. */\n\tonSelect?: () => void;\n\tonMouseEnter?: () => void;\n\t/**\n\t * Id of this row as an option of a results listbox. When set, the row is a\n\t * `role=\"option\"` reached through the search field's active descendant\n\t * rather than by Tab; standalone rows stay plain buttons.\n\t */\n\toptionId?: string;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nfunction highlightMatch(text: string, query: string | undefined): React.ReactNode {\n\tconst q = (query ?? '').trim();\n\tif (!q) return text;\n\tconst lower = text.toLowerCase();\n\tconst ql = q.toLowerCase();\n\tconst i = lower.indexOf(ql);\n\tif (i < 0) return text;\n\treturn (\n\t\t<>\n\t\t\t{text.slice(0, i)}\n\t\t\t<mark className={markRecipes.match}>\n\t\t\t\t{text.slice(i, i + q.length)}\n\t\t\t</mark>\n\t\t\t{text.slice(i + q.length)}\n\t\t</>\n\t);\n}\n\nexport function GlobalSearchResultRow<TGroup extends string = string>({\n\tresult,\n\tactive = false,\n\tquery = '',\n\tonSelect,\n\tonMouseEnter,\n\toptionId,\n\tclassName,\n}: GlobalSearchResultRowProps<TGroup>) {\n\tconst ThumbIcon = result.thumbnail?.icon;\n\tconst bg = DEFAULT_TONE_BG;\n\tconst av = DEFAULT_TONE_AVATAR;\n\t// A neutral tile shares its muted fill with the row highlight; on a\n\t// highlighted row it lifts to the card surface so it stays distinct.\n\tconst liftNeutralTile = (tone: string | undefined) =>\n\t\t(tone ?? 'neutral') === 'neutral' && (active ? 'bg-card' : 'group-hover/row:bg-card');\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tdata-component=\"global-search-result-row\"\n\t\t\tdata-slot=\"global-search-result-row\"\n\t\t\t{...(optionId ? { id: optionId, role: 'option', 'aria-selected': active, tabIndex: -1 } : {})}\n\t\t\tonMouseEnter={onMouseEnter}\n\t\t\tonClick={onSelect}\n\t\t\tclassName={cn(\n\t\t\t\t`${interactionRecipes.nativeButtonReset} group/row relative flex w-full cursor-pointer items-center justify-start text-inherit outline-none ${focusRecipes.inset} text-left transition-colors`,\n\t\t\t\tcollectionRowClasses(),\n\t\t\t\t'global-search-result-row--component',\n\t\t\t\tactive ? interactionRecipes.rowSelected : interactionRecipes.rowHover,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{/* Thumbnail / Avatar */}\n\t\t\t<div className=\"flex shrink-0 items-center\">\n\t\t\t\t{result.avatar ? (\n\t\t\t\t\t<Avatar className={cn('size-avatar-sm', av[result.avatar.tone ?? 'neutral'], liftNeutralTile(result.avatar.tone))}>\n\t\t\t\t\t\t{result.avatar.src && (\n\t\t\t\t\t\t\t<AvatarImage src={result.avatar.src} alt={result.title} />\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<AvatarFallback\n\t\t\t\t\t\t\tclassName={cn('text-xs font-semibold', av[result.avatar.tone ?? 'neutral'], liftNeutralTile(result.avatar.tone))}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{result.avatar.initials}\n\t\t\t\t\t\t</AvatarFallback>\n\t\t\t\t\t</Avatar>\n\t\t\t\t) : ThumbIcon ? (\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'inline-flex size-avatar-sm items-center justify-center rounded-radius',\n\t\t\t\t\t\t\tbg[result.thumbnail?.tone ?? 'neutral'],\n\t\t\t\t\t\t\tliftNeutralTile(result.thumbnail?.tone),\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ThumbIcon className=\"size-icon-sm\" aria-hidden=\"true\" />\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t</div>\n\n\t\t\t{/* Body */}\n\t\t\t<Stack gap=\"dense\" className=\"min-w-0 flex-1\">\n\t\t\t\t<div className=\"flex min-w-0 items-center gap-space-sm\">\n\t\t\t\t\t<Text tag=\"span\" type=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className=\"truncate\">\n\t\t\t\t\t\t{highlightMatch(result.title, query)}\n\t\t\t\t\t</Text>\n\t\t\t\t\t{!!result.badge && (\n\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\ttone={\n\t\t\t\t\t\t\t\tresult.badge.tone === 'destructive'\n\t\t\t\t\t\t\t\t\t? 'destructive'\n\t\t\t\t\t\t\t\t\t: result.badge.tone\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{result.badge.label}\n\t\t\t\t\t\t</Badge>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t{(() => {\n\t\t\t\t\tconst pieces: Array<{ key: string; node: React.ReactNode }> = [];\n\t\t\t\t\tif (result.subtitle)\n\t\t\t\t\t\tpieces.push({\n\t\t\t\t\t\t\tkey: 'subtitle',\n\t\t\t\t\t\t\tnode: (\n\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type=\"secondary\" className=\"min-w-0 break-words\">\n\t\t\t\t\t\t\t\t\t{highlightMatch(result.subtitle, query)}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t});\n\t\t\t\t\tresult.meta?.forEach((m, i) => {\n\t\t\t\t\t\tconst Icon = m.icon;\n\t\t\t\t\t\tpieces.push({\n\t\t\t\t\t\t\tkey: `m-${i}`,\n\t\t\t\t\t\t\tnode: (\n\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t'inline-flex min-w-0 items-center gap-space-xs break-words',\n\t\t\t\t\t\t\t\t\t\tm.mono && 'font-mono tabular-nums',\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{!!Icon && <Icon className=\"size-icon-sm shrink-0\" aria-hidden=\"true\" />}\n\t\t\t\t\t\t\t\t\t{m.label}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t\tif (result.timestamp)\n\t\t\t\t\t\tpieces.push({\n\t\t\t\t\t\t\tkey: 'ts',\n\t\t\t\t\t\t\tnode: <SecondaryValue size=\"xs\" className=\"tabular-nums\">{result.timestamp}</SecondaryValue>,\n\t\t\t\t\t\t});\n\t\t\t\t\tresult.tags?.forEach((tag) =>\n\t\t\t\t\t\tpieces.push({\n\t\t\t\t\t\t\tkey: `t-${tag}`,\n\t\t\t\t\t\t\t\tnode: <Text tag=\"span\" size=\"xs\" type=\"secondary\" className=\"min-w-0 break-words\">{tag}</Text>,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tif (result.rightValue) {\n\t\t\t\t\t\tpieces.push({\n\t\t\t\t\t\t\tkey: 'rv',\n\t\t\t\t\t\t\tnode: (\n\t\t\t\t\t\t\t\t\t<Value type=\"inherit\" weight=\"medium\" className=\"inline-flex flex-wrap items-baseline gap-space-xs tabular-nums\">\n\t\t\t\t\t\t\t\t\t{result.rightValue}\n\t\t\t\t\t\t\t\t\t{!!result.rightLabel && (\n\t\t\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\t\t\t\t\t\t\ttype=\"secondary\"\n\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{result.rightLabel.toLowerCase()}\n\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</Value>\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (pieces.length === 0) return null;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div className=\"flex min-w-0 flex-wrap items-baseline gap-x-space-sm gap-y-dense break-words\">\n\t\t\t\t\t\t\t{pieces.map((p, i) => (\n\t\t\t\t\t\t\t\t<span key={p.key} className={cn('inline-flex min-w-0 max-w-full items-baseline gap-space-sm', p.key === 'rv' && '@xl/global-search:hidden')}>\n\t\t\t\t\t\t\t\t\t{i > 0 && (\n\t\t\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t·\n\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{p.node}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})()}\n\t\t\t</Stack>\n\n\t\t\t{/* Right value column — only when value/label set */}\n\t\t\t{!!(result.rightValue || result.rightLabel) && (\n\t\t\t\t<div className=\"hidden shrink-0 items-center self-stretch @xl/global-search:flex\">\n\t\t\t\t\t<Stack gap=\"dense\" align=\"end\" className=\"text-right leading-tight\">\n\t\t\t\t\t\t{!!result.rightValue && (\n\t\t\t\t\t\t\t<Value\n\t\t\t\t\t\t\t\ttype=\"inherit\"\n\t\t\t\t\t\t\t\tweight=\"semibold\"\n\t\t\t\t\t\t\t\tclassName=\"whitespace-nowrap tabular-nums\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{result.rightValue}\n\t\t\t\t\t\t\t</Value>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{!!result.rightLabel && (\n\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\tclassName=\"whitespace-nowrap\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{result.rightLabel}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Stack>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Trailing chevron */}\n\t\t\t<ArrowRight\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'size-icon shrink-0 transition-opacity',\n\t\t\t\t\tactive\n\t\t\t\t\t\t? 'text-inherit opacity-100'\n\t\t\t\t\t\t: 'text-muted-foreground opacity-0 group-hover/row:opacity-100',\n\t\t\t\t)}\n\t\t\t/>\n\t\t</button>\n\t);\n}\n","/**\n * GlobalSearchTabs — segmented filter strip above the result list.\n *\n * Wraps `base/navigation/tabs` for app-consistent styling and adds the\n * shared count badge (as NavigationTabs draws it) next to each label. The\n * strip is a header band: its scroller owns the collection inset (which also\n * keeps the focus halo clear of the overflow clip) and a quiet rule separates\n * it from the result list.\n */\nimport { Badge } from '../../../base/badge';\nimport { Tabs, TabsList, TabsTrigger } from '../../../base/navigation/tabs';\nimport { Text } from '../../../typography';\nimport { popoverRecipes } from '../../../base/popover/popover.recipes';\nimport { surfaceDividerRecipes } from '../../../../lib/surface-recipes';\nimport { cn } from '../../../../lib/utils';\n\nexport interface GlobalSearchTabsProps<TGroup extends string = string> {\n\t/** Currently-selected tab. */\n\tvalue: 'all' | TGroup;\n\tonValueChange: (value: 'all' | TGroup) => void;\n\t/** Tabs to offer, in display order. */\n\ttabs: ReadonlyArray<{ value: 'all' | TGroup; label: string }>;\n\t/** Result counts shown beside each group. */\n\tcounts: Record<string, number>;\n}\n\nexport function GlobalSearchTabs<TGroup extends string = string>({\n\tvalue,\n\tonValueChange,\n\ttabs,\n\tcounts,\n}: GlobalSearchTabsProps<TGroup>) {\n\treturn (\n\t\t<div className={cn('global-search-tabs--component', surfaceDividerRecipes.anchored.header)}>\n\t\t\t<div className={cn('global-search-tabs--scroller overflow-x-auto pt-space-xs pb-space-md [scrollbar-width:none] [&::-webkit-scrollbar]:hidden', popoverRecipes.menuInline)}>\n\t\t\t\t<Tabs\n\t\t\t\t\tvalue={value as string}\n\t\t\t\t\tonValueChange={(v) => onValueChange(v as 'all' | TGroup)}\n\t\t\t\t\tclassName=\"min-w-max\"\n\t\t\t\t>\n\t\t\t\t\t<TabsList className=\"global-search-tabs--list h-action-sm w-max min-w-max\">\n\t\t\t\t\t\t{tabs.map((tab) => {\n\t\t\t\t\t\t\tconst count = counts[tab.value as string] ?? 0;\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<TabsTrigger\n\t\t\t\t\t\t\t\t\tkey={tab.value as string}\n\t\t\t\t\t\t\t\t\tvalue={tab.value as string}\n\t\t\t\t\t\t\t\t\tclassName=\"global-search-tabs--trigger shrink-0 gap-space-sm px-control-sm text-foreground\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Text tag=\"span\">\n\t\t\t\t\t\t\t\t\t\t{tab.label}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t<Badge size=\"sm\" tone=\"secondary\" className=\"global-search-tabs--count tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t{count}\n\t\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t\t</TabsTrigger>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</TabsList>\n\t\t\t\t</Tabs>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * GlobalSearch — framework-agnostic spotlight overlay for app-wide search.\n *\n * Composition seams:\n * - `strings` — deep-partial override of the default copy\n * - `slots` — replace any region (input, tabs, idle, empty, loading, footer)\n * - `slots.renderResult` — full per-row override\n *\n * Headless usage:\n * - Call `useGlobalSearch({ results, query })` directly to drive a\n * completely custom UI against the same selection state machine.\n *\n * Framework-agnostic:\n * - No router import, no i18n SDK import. Routing is up to the consumer\n * via `onResultSelect`. Strings live in the `strings` prop.\n * - The library no longer ships `adapters/$framework/`. Consumers map\n * their router (Inertia, Tanstack Router, RR7, Next, …) to\n * `onResultSelect(result)` directly at the call site.\n */\nimport * as React from 'react';\n\nimport { TextButton } from '../../base/buttons';\nimport { surfaceInsetClasses } from '../../base/popover/popover.recipes';\nimport { Text } from '../../typography';\nimport { interpolateString, useStrings, type StringsProp } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport {\n\tdefaultGlobalSearchStrings,\n\ttype GlobalSearchStrings,\n} from './global-search.strings';\nimport type {\n\tGlobalSearchIdleSection,\n\tGlobalSearchResult,\n\tGlobalSearchSlots,\n\tGlobalSearchTab,\n} from './global-search.types';\nimport { useGlobalSearch } from './hooks/use-global-search';\nimport {\n\tGlobalSearchEmptyState,\n\tGlobalSearchFooter,\n\tGlobalSearchIdleState,\n\tGlobalSearchInput,\n\tGlobalSearchResultRow,\n\tGlobalSearchTabs,\n} from './partials';\nimport { GlobalSearchGroupHeading } from './partials/global-search-group-heading';\n\nexport interface GlobalSearchProps<TGroup extends string = string> {\n\t/** Result list. The component renders these grouped by `result.group`. */\n\tresults?: ReadonlyArray<GlobalSearchResult<TGroup>>;\n\t/** Current query value (controlled). */\n\tquery: string;\n\t/** Query change callback. */\n\tonQueryChange: (q: string) => void;\n\t/** Activation callback — fires on row click or Enter. */\n\tonResultSelect?: (result: GlobalSearchResult<TGroup>) => void;\n\t/** Escape-key callback. */\n\tonClose?: () => void;\n\t/** Loading flag — switches the input spinner and renders the loading slot. */\n\tloading?: boolean;\n\t/** Idle-state sections (Recent / Suggestions / …). */\n\tidleSections?: ReadonlyArray<GlobalSearchIdleSection>;\n\t/** Override default group labels in the tab strip. */\n\tgroupLabels?: Partial<Record<TGroup, string>>;\n\t/** Auto-focus the input on mount. */\n\tautoFocus?: boolean;\n\t/** Replace any portion of the default copy. */\n\tstrings?: StringsProp<GlobalSearchStrings>;\n\t/** Replace any portion of the layout. */\n\tslots?: GlobalSearchSlots<TGroup>;\n\t/** Custom tab list — overrides the auto-generated `All + groups`. */\n\ttabs?: ReadonlyArray<GlobalSearchTab<TGroup>>;\n\t/** Wrapper className. */\n\tclassName?: string;\n}\n\nexport function GlobalSearch<TGroup extends string = string>({\n\tresults = [],\n\tquery,\n\tonQueryChange,\n\tonResultSelect,\n\tonClose,\n\tloading = false,\n\tidleSections,\n\tgroupLabels,\n\tautoFocus = false,\n\tstrings: stringsProp,\n\tslots,\n\ttabs,\n\tclassName,\n}: GlobalSearchProps<TGroup>) {\n\tconst strings = useStrings(defaultGlobalSearchStrings, stringsProp);\n\n\tconst search = useGlobalSearch<TGroup>({\n\t\tresults,\n\t\tquery,\n\t\tonResultSelect,\n\t\tonClose,\n\t});\n\n\tconst isEmpty =\n\t\t!loading && query.trim().length > 1 && results.length === 0;\n\tconst isIdle = !loading && query.trim().length <= 1;\n\n\t// Combobox semantics: focus stays in the field while the arrow keys move the\n\t// highlight, so each group is a listbox and the field names the active option.\n\tconst listboxBaseId = React.useId();\n\tconst showResults = !loading && results.length > 0;\n\tconst flatIndexById = new Map(search.flat.map((item, index) => [item.id, index]));\n\tconst optionIdFor = (index: number) => `${listboxBaseId}-option-${index}`;\n\tconst groupKeys = Object.keys(search.visibleGrouped);\n\tconst listboxIdFor = (groupIndex: number) => `${listboxBaseId}-group-${groupIndex}`;\n\tconst activeOptionId = showResults && search.flat[search.activeIdx] ? optionIdFor(search.activeIdx) : undefined;\n\n\tconst resolvedTabs = React.useMemo<\n\t\tReadonlyArray<GlobalSearchTab<TGroup>>\n\t>(() => {\n\t\tif (tabs) return tabs;\n\t\tconst groupKeys = Object.keys(search.grouped) as TGroup[];\n\t\treturn [\n\t\t\t{ value: 'all', label: strings.tabAll },\n\t\t\t...groupKeys.map((key) => ({\n\t\t\t\tvalue: key,\n\t\t\t\tlabel: groupLabels?.[key] ?? key,\n\t\t\t})),\n\t\t];\n\t}, [tabs, search.grouped, strings.tabAll, groupLabels]);\n\n\treturn (\n\t\t<div\n\t\t\tdata-component=\"global-search\"\n\t\t\tdata-slot=\"global-search\"\n\t\t\tclassName={cn('global-search--component',\n\t\t\t\t'@container/global-search overflow-hidden rounded-surface border border-border bg-card text-card-foreground shadow-xl',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{slots?.input ?? (\n\t\t\t\t<GlobalSearchInput\n\t\t\t\t\tvalue={query}\n\t\t\t\t\tonValueChange={onQueryChange}\n\t\t\t\t\tonKeyDown={search.onKeyDown}\n\t\t\t\t\tplaceholder={strings.placeholder}\n\t\t\t\t\tclearLabel={strings.clear}\n\t\t\t\t\tloading={loading}\n\t\t\t\t\tautoFocus={autoFocus}\n\t\t\t\t\texpanded={showResults}\n\t\t\t\t\tcontrols={groupKeys.map((_, groupIndex) => listboxIdFor(groupIndex)).join(' ')}\n\t\t\t\t\tactiveDescendant={activeOptionId}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{!loading && results.length > 0 && (\n\t\t\t\tslots?.tabs ?? (\n\t\t\t\t\t<GlobalSearchTabs<TGroup>\n\t\t\t\t\t\tvalue={search.activeTab}\n\t\t\t\t\t\tonValueChange={search.setActiveTab}\n\t\t\t\t\t\ttabs={resolvedTabs}\n\t\t\t\t\t\tcounts={search.tabCounts}\n\t\t\t\t\t/>\n\t\t\t\t)\n\t\t\t)}\n\n\t\t\t{/* A rem-based results viewport (32.5rem), so it follows the root text size. */}\n\t\t\t<div className=\"global-search--viewport max-h-130 overflow-y-auto\">\n\t\t\t\t{!!isIdle && (slots?.idle ?? (\n\t\t\t\t\tidleSections && idleSections.length > 0 ? (\n\t\t\t\t\t\t<GlobalSearchIdleState sections={idleSections} />\n\t\t\t\t\t) : null\n\t\t\t\t))}\n\n\t\t\t\t{!!loading && (slots?.loading ?? (\n\t\t\t\t\t<div className=\"global-search--loading flex items-center justify-center px-row-x py-space-xl\" role=\"status\">\n\t\t\t\t\t\t<Text type=\"secondary\">\n\t\t\t\t\t\t\t{strings.loading}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\n\t\t\t\t{!!isEmpty && (slots?.empty ?? (\n\t\t\t\t\t<GlobalSearchEmptyState\n\t\t\t\t\t\ttitle={interpolateString(strings.emptyTitle, { query })}\n\t\t\t\t\t\thint={strings.emptyHint}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\n\t\t\t\t{!loading && results.length > 0 && (\n\t\t\t\t\t<div className={cn('global-search--results', surfaceInsetClasses.compact)}>\n\t\t\t\t\t\t{Object.entries(search.visibleGrouped).map(([groupKey, items], groupIndex) => (\n\t\t\t\t\t\t\t<div key={groupKey} className=\"global-search--group\">\n\t\t\t\t\t\t\t\t<GlobalSearchGroupHeading\n\t\t\t\t\t\t\t\t\tlabel={groupLabels?.[groupKey as TGroup] ?? groupKey}\n\t\t\t\t\t\t\t\t\taction={search.activeTab === 'all' && items.length > 0 ? (\n\t\t\t\t\t\t\t\t\t\t<TextButton\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => search.setActiveTab(groupKey as TGroup)}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"shrink-0\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{strings.seeAll}\n\t\t\t\t\t\t\t\t\t\t</TextButton>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<ul\n\t\t\t\t\t\t\t\t\tid={listboxIdFor(groupIndex)}\n\t\t\t\t\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\t\t\t\t\taria-label={groupLabels?.[groupKey as TGroup] ?? groupKey}\n\t\t\t\t\t\t\t\t\tclassName=\"m-0 flex list-none flex-col p-0\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{items.map((item) => {\n\t\t\t\t\t\t\t\t\t\tconst isActive =\n\t\t\t\t\t\t\t\t\t\t\tsearch.flat[search.activeIdx]?.id === item.id;\n\t\t\t\t\t\t\t\t\t\tconst optionId = optionIdFor(flatIndexById.get(item.id) ?? -1);\n\t\t\t\t\t\t\t\t\t\tconst ctx = {\n\t\t\t\t\t\t\t\t\t\t\tisActive,\n\t\t\t\t\t\t\t\t\t\t\tquery,\n\t\t\t\t\t\t\t\t\t\t\tonSelect: () => onResultSelect?.(item),\n\t\t\t\t\t\t\t\t\t\t\toptionId,\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t// A custom row is wrapped as the option; the default row is one.\n\t\t\t\t\t\t\t\t\t\tif (slots?.renderResult) {\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<li key={item.id} id={optionId} role=\"option\" aria-selected={isActive}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{slots.renderResult(item, ctx)}\n\t\t\t\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<li key={item.id} role=\"none\">\n\t\t\t\t\t\t\t\t\t\t\t\t<GlobalSearchResultRow<TGroup>\n\t\t\t\t\t\t\t\t\t\t\t\t\tresult={item}\n\t\t\t\t\t\t\t\t\t\t\t\t\tactive={isActive}\n\t\t\t\t\t\t\t\t\t\t\t\t\tquery={query}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={ctx.onSelect}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonMouseEnter={() =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsearch.setActiveById(item.id)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\toptionId={optionId}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{slots?.footer ?? (\n\t\t\t\t<GlobalSearchFooter\n\t\t\t\t\tnavigateLabel={strings.footerNavigate}\n\t\t\t\t\topenLabel={strings.footerOpen}\n\t\t\t\t\tcloseLabel={strings.footerClose}\n\t\t\t\t\ttrailing={\n\t\t\t\t\t\t!isIdle && !isEmpty && results.length > 0 ? (\n\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\tclassName=\"tabular-nums\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{interpolateString(strings.resultsCount, {\n\t\t\t\t\t\t\t\t\tcount: results.length,\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t) : undefined\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","/**\n * GlobalSearchDialog — the command-palette presentation of `GlobalSearch`.\n *\n * `GlobalSearch` is a panel: it renders its own card chrome and expects to be\n * placed somewhere. The palette pattern it was clearly built for — `onClose`,\n * `autoFocus`, Escape handling — had no supported presentation, so every call\n * site hand-rolled the modal around it: a `fixed inset-0` backdrop and a\n * mousedown-outside handler, with no focus trap, no portal, no scroll lock and\n * no dialog role.\n *\n * It presents through `ActionDialog` rather than a raw `Dialog`, because\n * `features/overlays` is the package's single overlay surface and everything\n * modal is expected to come from it. Three of its seams carry the palette\n * shape: `visuallyHideHeader` keeps the accessible name without drawing a\n * heading, `showCloseButton={false}` drops the corner X that would otherwise\n * land on the search field, and the two action flags remove the footer.\n *\n * The surface itself is neutralised because `GlobalSearch` already draws the\n * card, and it anchors near the top rather than centring, which is where a\n * palette belongs.\n */\nimport { useMemo } from 'react';\n\nimport { ActionDialog } from '../overlays';\nimport { useStrings } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport { GlobalSearch, type GlobalSearchProps } from './global-search';\nimport { defaultGlobalSearchStrings } from './global-search.strings';\n\nexport interface GlobalSearchDialogProps<TGroup extends string = string>\n\textends Omit<GlobalSearchProps<TGroup>, 'onClose'> {\n\t/** Whether the palette is showing. */\n\topen: boolean;\n\t/** Open-state callback. Fires on Escape, backdrop click, and result selection. */\n\tonOpenChange: (open: boolean) => void;\n\t/** Classes for the dialog surface that positions the palette. */\n\tcontentClassName?: string;\n}\n\nexport function GlobalSearchDialog<TGroup extends string = string>({\n\topen,\n\tonOpenChange,\n\tcontentClassName,\n\tclassName,\n\tstrings: stringsProp,\n\tautoFocus = true,\n\t...searchProps\n}: GlobalSearchDialogProps<TGroup>) {\n\tconst strings = useStrings(defaultGlobalSearchStrings, stringsProp);\n\tconst close = useMemo(() => () => onOpenChange(false), [onOpenChange]);\n\n\treturn (\n\t\t<ActionDialog\n\t\t\topen={open}\n\t\t\tonOpenChange={onOpenChange}\n\t\t\ttitle={strings.dialogTitle}\n\t\t\tvisuallyHideHeader\n\t\t\tshowCloseButton={false}\n\t\t\tshowCancel={false}\n\t\t\tshowConfirm={false}\n\t\t\tclassName={cn(\n\t\t\t\t'global-search-dialog--component',\n\t\t\t\t// GlobalSearch draws the card, so the dialog surface carries none:\n\t\t\t\t// stacking both produced a border inside a border.\n\t\t\t\t'w-full max-w-2xl overflow-visible border-0 bg-transparent p-0 shadow-none sm:max-w-2xl',\n\t\t\t\t// A palette belongs near the top of the viewport, not centred in it.\n\t\t\t\t'top-24 translate-y-0',\n\t\t\t\tcontentClassName,\n\t\t\t)}\n\t\t\tcontentClassName=\"p-0\"\n\t\t>\n\t\t\t<GlobalSearch<TGroup>\n\t\t\t\t{...(searchProps as GlobalSearchProps<TGroup>)}\n\t\t\t\tstrings={stringsProp}\n\t\t\t\tautoFocus={autoFocus}\n\t\t\t\tonClose={close}\n\t\t\t\tclassName={className}\n\t\t\t/>\n\t\t</ActionDialog>\n\t);\n}\n\nGlobalSearchDialog.displayName = 'GlobalSearchDialog';\n"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  "use client";
2
2
  import { useStrings as e } from "../lib/strings.js";
3
- import { t } from "../utils-B6kKb8jB.js";
4
- import { n } from "../buttons-BedGfygC.js";
5
- import { c as r } from "../typography-BQnine1k.js";
3
+ import { t } from "../utils-DhuoqFy4.js";
4
+ import { n } from "../buttons-DeW0bQeK.js";
5
+ import { c as r } from "../typography-C7-YMW1S.js";
6
6
  import { i } from "../tone-recipes-BPsRAvhu.js";
7
- import { i as a } from "../popover.recipes-DdiEp0rd.js";
8
- import { n as o } from "../action-menu-Dr8K-ghE.js";
7
+ import { i as a } from "../popover.recipes-DJ0AkUan.js";
8
+ import { n as o } from "../action-menu-C0gjzLyE.js";
9
9
  import { createContext as s, forwardRef as c, useCallback as l, useContext as u, useEffect as d, useLayoutEffect as f, useMemo as p, useRef as m, useState as h } from "react";
10
10
  import { jsx as g, jsxs as _ } from "react/jsx-runtime";
11
11
  import { DndContext as v, DragOverlay as y, KeyboardSensor as b, PointerSensor as x, useDroppable as S, useSensor as C, useSensors as w } from "@dnd-kit/core";
@@ -63,12 +63,12 @@ function j({ value: e, onValueChange: t, getItemValue: n, onItemMove: r }) {
63
63
  }, [e, n]), a = l(({ itemId: n, toColumnId: a, toIndex: o }) => {
64
64
  let s = i(n);
65
65
  if (!s || !Object.prototype.hasOwnProperty.call(e, a)) return;
66
- let { columnId: c, index: l, item: u } = s, d = e[a], f = o === void 0 ? d.length : Math.max(0, Math.min(o, d.length));
67
- if (c === a && l === f) return;
68
- let p = { ...e }, m = [...p[c]];
69
- m.splice(l, 1), p[c] = m;
70
- let h = [...c === a ? m : p[a]], g = f;
71
- c === a && l < f && (g = Math.max(0, f - 1)), h.splice(g, 0, u), p[a] = h, t(p), r?.({
66
+ let { columnId: c, index: l, item: u } = s, d = e[a], f = c === a, p = o === void 0 ? d.length : Math.max(0, Math.min(o, d.length)), m = f && l < p ? p - 1 : p;
67
+ if (f && l === m) return;
68
+ let h = { ...e }, g = [...h[c]];
69
+ g.splice(l, 1), h[c] = g;
70
+ let _ = f ? g : [...h[a]];
71
+ _.splice(m, 0, u), h[a] = _, t(h), r?.({
72
72
  item: u,
73
73
  itemId: n,
74
74
  from: {
@@ -77,7 +77,7 @@ function j({ value: e, onValueChange: t, getItemValue: n, onItemMove: r }) {
77
77
  },
78
78
  to: {
79
79
  columnId: a,
80
- index: g
80
+ index: m
81
81
  }
82
82
  });
83
83
  }, [
@@ -147,24 +147,14 @@ function B({ value: n, onValueChange: i, getItemValue: a, getItemLabel: o, getCo
147
147
  }, [D, o]), q = l((e) => {
148
148
  M(null), V(null);
149
149
  let { active: t, over: r } = e, i = H.current;
150
- if (L.current = i, H.current = null, i) {
151
- let e = D(String(t.id)), n = e?.columnId === i.columnId && e.index < i.index ? i.index + 1 : i.index;
152
- O({
153
- itemId: String(t.id),
154
- toColumnId: i.columnId,
155
- toIndex: n
156
- });
157
- return;
158
- }
159
- if (!r) return;
160
- t.data.current;
161
- let a = r.data.current, o = String(r.id), s = a?.columnId ?? (Object.prototype.hasOwnProperty.call(n, o) ? o : void 0);
162
- if (!s) return;
163
- let c = a?.columnId === void 0 ? n[s].length : a.index;
150
+ L.current = i, H.current = null;
151
+ let a = r?.data.current, o = r ? String(r.id) : void 0, s = i?.columnId ?? a?.columnId ?? (o !== void 0 && Object.hasOwn(n, o) ? o : void 0);
152
+ if (s === void 0) return;
153
+ let c = String(t.id), l = D(c), u = i?.index ?? a?.index, d = u !== void 0 && l?.columnId === s && l.index < u ? u + 1 : u;
164
154
  O({
165
- itemId: String(t.id),
155
+ itemId: c,
166
156
  toColumnId: s,
167
- toIndex: c
157
+ toIndex: d
168
158
  });
169
159
  }, [
170
160
  O,