themelia-react-ui 2.0.5 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (968) hide show
  1. package/CHANGELOG.md +326 -0
  2. package/MIGRATION.md +858 -0
  3. package/README.md +35 -24
  4. package/dist/{accordion-B9MHG0cT.js → accordion-DNVqwEIC.js} +37 -37
  5. package/dist/accordion-DNVqwEIC.js.map +1 -0
  6. package/dist/action-menu-D5343RwT.js +286 -0
  7. package/dist/action-menu-D5343RwT.js.map +1 -0
  8. package/dist/ai-artifact-otrz9ZwS.js +1214 -0
  9. package/dist/ai-artifact-otrz9ZwS.js.map +1 -0
  10. package/dist/anchored-positioning-1U_eBFNx.js +9 -0
  11. package/dist/anchored-positioning-1U_eBFNx.js.map +1 -0
  12. package/dist/app-shell-CPN30Nb1.js +372 -0
  13. package/dist/app-shell-CPN30Nb1.js.map +1 -0
  14. package/dist/{attachment-Dg_69lPS.js → attachment-D2-fpfmv.js} +15 -15
  15. package/dist/{attachment-Dg_69lPS.js.map → attachment-D2-fpfmv.js.map} +1 -1
  16. package/dist/{auth-DTkkshS8.js → auth-g_oUTDDC.js} +236 -243
  17. package/dist/auth-g_oUTDDC.js.map +1 -0
  18. package/dist/{avatar-CeZaFmNH.js → avatar-Ca3Ihrq4.js} +4 -4
  19. package/dist/{avatar-CeZaFmNH.js.map → avatar-Ca3Ihrq4.js.map} +1 -1
  20. package/dist/{badge-xIiV_E7f.js → badge-oGiXblW7.js} +8 -9
  21. package/dist/badge-oGiXblW7.js.map +1 -0
  22. package/dist/base/accordion.js +1 -1
  23. package/dist/base/action-menu.js +1 -1
  24. package/dist/base/attachment.js +1 -1
  25. package/dist/base/avatar.js +1 -1
  26. package/dist/base/badge.js +1 -1
  27. package/dist/base/batch-action-bar.js +1 -1
  28. package/dist/base/buttons.js +2 -2
  29. package/dist/base/cards.js +3 -3
  30. package/dist/base/carousel.js +11 -11
  31. package/dist/base/carousel.js.map +1 -1
  32. package/dist/base/cascader.js +1 -1
  33. package/dist/base/chart.js +1 -1
  34. package/dist/base/choice-inputs.js +2 -2
  35. package/dist/base/code-block.js +1 -1
  36. package/dist/base/combobox.js +1 -1
  37. package/dist/base/command.js +1 -1
  38. package/dist/base/copyable.js +1 -1
  39. package/dist/base/date-pickers.js +2 -2
  40. package/dist/base/display.js +7 -7
  41. package/dist/base/feedback.js +4 -4
  42. package/dist/base/forms-numeric.js +2 -2
  43. package/dist/base/forms.js +2 -2
  44. package/dist/base/inline-edit.js +13 -13
  45. package/dist/base/inline-edit.js.map +1 -1
  46. package/dist/base/item.js +1 -1
  47. package/dist/base/media-gallery.js +203 -2
  48. package/dist/base/media-gallery.js.map +1 -0
  49. package/dist/base/metadata-list.js +1 -1
  50. package/dist/base/navigation.js +7 -7
  51. package/dist/base/popover-menu.js +1 -1
  52. package/dist/base/popover.js +1 -1
  53. package/dist/base/qr-code.js +32 -22
  54. package/dist/base/qr-code.js.map +1 -1
  55. package/dist/base/repeaters.js +208 -198
  56. package/dist/base/repeaters.js.map +1 -1
  57. package/dist/base/sidebar.js +2 -2
  58. package/dist/base/signature-pad.js +14 -14
  59. package/dist/base/signature-pad.js.map +1 -1
  60. package/dist/base/skeleton.js +1 -1
  61. package/dist/base/spinner.js +8 -14
  62. package/dist/base/spinner.js.map +1 -1
  63. package/dist/base/structure.js +1 -1
  64. package/dist/base/table.js +1 -1
  65. package/dist/base/text-inputs.js +3 -3
  66. package/dist/base/toaster.js +2 -2
  67. package/dist/base/tree.js +2 -2
  68. package/dist/base/upload-queue.js +303 -2
  69. package/dist/base/upload-queue.js.map +1 -0
  70. package/dist/base/upload.js +3 -4
  71. package/dist/base/value-inputs.js +1 -1
  72. package/dist/{batch-action-bar-Cb8cuvyy.js → batch-action-bar-D6MZQNnC.js} +10 -10
  73. package/dist/{batch-action-bar-Cb8cuvyy.js.map → batch-action-bar-D6MZQNnC.js.map} +1 -1
  74. package/dist/blocks/admin.js +242 -228
  75. package/dist/blocks/admin.js.map +1 -1
  76. package/dist/blocks/ai.js +398 -354
  77. package/dist/blocks/ai.js.map +1 -1
  78. package/dist/blocks/analytics/charts.js +1022 -0
  79. package/dist/blocks/analytics/charts.js.map +1 -0
  80. package/dist/blocks/analytics/usage-card.js +1 -1
  81. package/dist/blocks/analytics.js +173 -1392
  82. package/dist/blocks/analytics.js.map +1 -1
  83. package/dist/blocks/collaboration.js +1 -1
  84. package/dist/blocks/commerce/receipt.js +1 -1
  85. package/dist/blocks/commerce.js +1533 -1399
  86. package/dist/blocks/commerce.js.map +1 -1
  87. package/dist/blocks/data-display.js +2 -3
  88. package/dist/blocks/onboarding.js +91 -82
  89. package/dist/blocks/onboarding.js.map +1 -1
  90. package/dist/blocks/planning.js +25 -25
  91. package/dist/blocks/planning.js.map +1 -1
  92. package/dist/blocks/timelines.js +2 -2
  93. package/dist/breadcrumbs-CQ9JSlez.js +136 -0
  94. package/dist/breadcrumbs-CQ9JSlez.js.map +1 -0
  95. package/dist/{button-S2Cubiiz.js → button-rd6FiHfQ.js} +12 -8
  96. package/dist/button-rd6FiHfQ.js.map +1 -0
  97. package/dist/{buttons-BedGfygC.js → buttons-pZVgPTZn.js} +230 -246
  98. package/dist/buttons-pZVgPTZn.js.map +1 -0
  99. package/dist/{cards-rNX1M4Xn.js → cards-CgWyqvgZ.js} +25 -22
  100. package/dist/{cards-rNX1M4Xn.js.map → cards-CgWyqvgZ.js.map} +1 -1
  101. package/dist/cascader-Cf05pwaq.js +444 -0
  102. package/dist/cascader-Cf05pwaq.js.map +1 -0
  103. package/dist/{chart-Darg_0Kv.js → chart-CygRCyIZ.js} +5 -5
  104. package/dist/{chart-Darg_0Kv.js.map → chart-CygRCyIZ.js.map} +1 -1
  105. package/dist/{checkbox-fflqmODR.js → checkbox-Dy5_XBMZ.js} +4 -4
  106. package/dist/{checkbox-fflqmODR.js.map → checkbox-Dy5_XBMZ.js.map} +1 -1
  107. package/dist/{choice-inputs-zUgBZfE4.js → choice-inputs-oJEsrb5Y.js} +195 -184
  108. package/dist/choice-inputs-oJEsrb5Y.js.map +1 -0
  109. package/dist/{code-block-BzmM9Eig.js → code-block-BrLD7mCi.js} +44 -60
  110. package/dist/code-block-BrLD7mCi.js.map +1 -0
  111. package/dist/collapsible-CRCCg_bO.js +80 -0
  112. package/dist/collapsible-CRCCg_bO.js.map +1 -0
  113. package/dist/{collection-content-gDh1v6O4.js → collection-content-D7SoDlYd.js} +3 -3
  114. package/dist/{collection-content-gDh1v6O4.js.map → collection-content-D7SoDlYd.js.map} +1 -1
  115. package/dist/combobox-Dl6f6kHz.js +362 -0
  116. package/dist/combobox-Dl6f6kHz.js.map +1 -0
  117. package/dist/combobox-DrDXtSSt.js +929 -0
  118. package/dist/combobox-DrDXtSSt.js.map +1 -0
  119. package/dist/command-CjZ2VzKC.js +432 -0
  120. package/dist/command-CjZ2VzKC.js.map +1 -0
  121. package/dist/comments-C2MZyRmh.js +1214 -0
  122. package/dist/comments-C2MZyRmh.js.map +1 -0
  123. package/dist/components/base/accordion/accordion.d.ts +11 -3
  124. package/dist/components/base/action-menu/action-menu.d.ts +11 -3
  125. package/dist/components/base/buttons/button.d.ts +2 -2
  126. package/dist/components/base/buttons/index.d.ts +1 -1
  127. package/dist/components/base/buttons/loader-button.d.ts +6 -15
  128. package/dist/components/base/cards/index.d.ts +1 -1
  129. package/dist/components/base/cards/partials/card-body-context.d.ts +6 -0
  130. package/dist/components/base/cards/smart-card.d.ts +0 -2
  131. package/dist/components/base/cards/smart-card.types.d.ts +12 -10
  132. package/dist/components/base/cascader/cascader.d.ts +8 -2
  133. package/dist/components/base/cascader/cascader.types.d.ts +24 -2
  134. package/dist/components/base/cascader/index.d.ts +1 -1
  135. package/dist/components/base/choice-inputs/choice-types.d.ts +4 -0
  136. package/dist/components/base/choice-inputs/pill-radio-group.d.ts +7 -6
  137. package/dist/components/base/choice-inputs/switch.d.ts +1 -1
  138. package/dist/components/base/code-block/use-code-copy.d.ts +2 -6
  139. package/dist/components/base/combobox/combobox-field.d.ts +2 -2
  140. package/dist/components/base/command/command.d.ts +1 -1
  141. package/dist/components/base/date-pickers/date-picker-internals.d.ts +3 -1
  142. package/dist/components/base/date-pickers/datepicker.types.d.ts +11 -7
  143. package/dist/components/base/date-pickers/time-picker.d.ts +17 -3
  144. package/dist/components/base/display/dialog.d.ts +3 -9
  145. package/dist/components/base/display/index.d.ts +2 -3
  146. package/dist/components/base/display/separator.d.ts +1 -1
  147. package/dist/components/base/feedback/alert.d.ts +2 -1
  148. package/dist/components/base/feedback/empty.d.ts +10 -2
  149. package/dist/components/base/feedback/state-display.d.ts +5 -1
  150. package/dist/components/base/feedback/state-display.strings.d.ts +9 -0
  151. package/dist/components/base/forms/form-field.d.ts +7 -2
  152. package/dist/components/base/forms/workflow.d.ts +2 -2
  153. package/dist/components/base/forms-numeric/coordinates-input.d.ts +4 -1
  154. package/dist/components/base/forms-numeric/decimal-input.d.ts +2 -2
  155. package/dist/components/base/forms-numeric/dimensions-input.d.ts +13 -18
  156. package/dist/components/base/forms-numeric/index.d.ts +3 -3
  157. package/dist/components/base/forms-numeric/numeric-composite-field.d.ts +12 -0
  158. package/dist/components/base/forms-numeric/weight-input.d.ts +6 -1
  159. package/dist/components/base/item/item.types.d.ts +6 -2
  160. package/dist/components/base/metadata-list/index.d.ts +1 -3
  161. package/dist/components/base/metadata-list/metadata-list.d.ts +4 -1
  162. package/dist/components/base/navigation/index.d.ts +2 -2
  163. package/dist/components/base/navigation/language-switcher.d.ts +17 -8
  164. package/dist/components/base/navigation/navigation-tabs.d.ts +8 -1
  165. package/dist/components/base/navigation/page-header/index.d.ts +1 -1
  166. package/dist/components/base/navigation/page-header/page-header.d.ts +13 -17
  167. package/dist/components/base/navigation/pagination.d.ts +5 -5
  168. package/dist/components/base/popover/popover.recipes.d.ts +0 -1
  169. package/dist/components/base/qr-code/qr-code.d.ts +4 -0
  170. package/dist/components/base/repeaters/index.d.ts +1 -1
  171. package/dist/components/base/repeaters/key-value-editor.d.ts +6 -1
  172. package/dist/components/base/sheet/sheet.d.ts +6 -15
  173. package/dist/components/base/sidebar/index.d.ts +1 -6
  174. package/dist/components/base/sidebar/sidebar.d.ts +40 -10
  175. package/dist/components/base/skeleton/skeleton.d.ts +1 -1
  176. package/dist/components/base/structure/structure.types.d.ts +11 -2
  177. package/dist/components/base/text-inputs/index.d.ts +1 -1
  178. package/dist/components/base/tree/index.d.ts +1 -0
  179. package/dist/components/base/tree/tree.d.ts +2 -2
  180. package/dist/components/base/tree/tree.types.d.ts +7 -1
  181. package/dist/components/base/upload/avatar-upload.d.ts +2 -1
  182. package/dist/components/base/upload/file-upload.validation.d.ts +37 -1
  183. package/dist/components/base/upload/image-upload.d.ts +4 -1
  184. package/dist/components/base/upload/index.d.ts +3 -9
  185. package/dist/components/base/value-inputs/date-time-input.d.ts +4 -0
  186. package/dist/components/base/value-inputs/slider.d.ts +5 -2
  187. package/dist/components/blocks/admin/action-surfaces/index.d.ts +17 -4
  188. package/dist/components/blocks/admin/api-key-list/api-key-list.types.d.ts +9 -3
  189. package/dist/components/blocks/admin/index.d.ts +1 -1
  190. package/dist/components/blocks/ai/ai-artifact/ai-artifact.d.ts +1 -1
  191. package/dist/components/blocks/ai/ai-artifact/types.d.ts +9 -4
  192. package/dist/components/blocks/ai/ai-chain-of-thought/ai-chain-of-thought.d.ts +1 -1
  193. package/dist/components/blocks/ai/ai-chain-of-thought/types.d.ts +11 -1
  194. package/dist/components/blocks/ai/ai-citation/ai-citation.d.ts +1 -1
  195. package/dist/components/blocks/ai/ai-citation/types.d.ts +8 -0
  196. package/dist/components/blocks/ai/ai-confirmation/ai-confirmation.d.ts +1 -1
  197. package/dist/components/blocks/ai/ai-confirmation/types.d.ts +21 -5
  198. package/dist/components/blocks/ai/ai-feedback/types.d.ts +7 -2
  199. package/dist/components/blocks/ai/ai-inline-citation/types.d.ts +9 -3
  200. package/dist/components/blocks/ai/ai-package-info/ai-package-info.d.ts +1 -1
  201. package/dist/components/blocks/ai/ai-package-info/types.d.ts +6 -0
  202. package/dist/components/blocks/ai/ai-reasoning/types.d.ts +2 -0
  203. package/dist/components/blocks/ai/ai-sources/ai-sources.d.ts +1 -1
  204. package/dist/components/blocks/ai/ai-sources/types.d.ts +10 -2
  205. package/dist/components/blocks/ai/ai-task/ai-task.d.ts +1 -1
  206. package/dist/components/blocks/ai/ai-task/types.d.ts +10 -1
  207. package/dist/components/blocks/ai/ai-tool-call/ai-tool-call.d.ts +1 -1
  208. package/dist/components/blocks/ai/ai-tool-call/types.d.ts +8 -0
  209. package/dist/components/blocks/ai/ai.strings.d.ts +2 -0
  210. package/dist/components/blocks/analytics/activity-heatmap/types.d.ts +1 -1
  211. package/dist/components/blocks/analytics/analytics.strings.d.ts +2 -0
  212. package/dist/components/blocks/analytics/atoms/metric-trend-chip.d.ts +11 -1
  213. package/dist/components/blocks/analytics/chart-card/chart-card.d.ts +7 -5
  214. package/dist/components/blocks/analytics/charts/index.d.ts +27 -0
  215. package/dist/components/blocks/analytics/index.d.ts +17 -24
  216. package/dist/components/blocks/analytics/metric/metric.d.ts +7 -3
  217. package/dist/components/blocks/analytics/metric-comparison/metric-comparison.d.ts +2 -0
  218. package/dist/components/blocks/analytics/metric-grid/metric-grid.d.ts +4 -5
  219. package/dist/components/blocks/analytics/types.d.ts +13 -4
  220. package/dist/components/blocks/analytics/usage-card/usage-card.strings.d.ts +2 -0
  221. package/dist/components/blocks/commerce/address-card/address-card.d.ts +1 -1
  222. package/dist/components/blocks/commerce/address-card/types.d.ts +5 -16
  223. package/dist/components/blocks/commerce/booking-calendar-event-card/booking-calendar-event-card.d.ts +2 -2
  224. package/dist/components/blocks/commerce/booking-calendar-event-card/booking-calendar-event-card.types.d.ts +6 -4
  225. package/dist/components/blocks/commerce/cart-summary/cart-summary.d.ts +0 -2
  226. package/dist/components/blocks/commerce/cart-summary/index.d.ts +2 -2
  227. package/dist/components/blocks/commerce/cart-summary/types.d.ts +9 -11
  228. package/dist/components/blocks/commerce/coupon-input/coupon-input.d.ts +1 -1
  229. package/dist/components/blocks/commerce/coupon-input/types.d.ts +7 -3
  230. package/dist/components/blocks/commerce/discount-stack/discount-stack.d.ts +0 -2
  231. package/dist/components/blocks/commerce/discount-stack/index.d.ts +2 -2
  232. package/dist/components/blocks/commerce/discount-stack/types.d.ts +4 -6
  233. package/dist/components/blocks/commerce/fulfillment-group/fulfillment-group.d.ts +1 -1
  234. package/dist/components/blocks/commerce/fulfillment-group/types.d.ts +2 -0
  235. package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-balance.d.ts +18 -0
  236. package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-compact.d.ts +1 -1
  237. package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-copy-button.d.ts +0 -1
  238. package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-dark.d.ts +1 -1
  239. package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-full.d.ts +1 -1
  240. package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-illustrated.d.ts +1 -1
  241. package/dist/components/blocks/commerce/giftcard-card/partials/giftcard-minimal.d.ts +1 -1
  242. package/dist/components/blocks/commerce/giftcard-card/types.d.ts +16 -5
  243. package/dist/components/blocks/commerce/index.d.ts +8 -8
  244. package/dist/components/blocks/commerce/inventory-level/inventory-level.strings.d.ts +2 -0
  245. package/dist/components/blocks/commerce/inventory-level/types.d.ts +1 -1
  246. package/dist/components/blocks/commerce/inventory-section/types.d.ts +0 -5
  247. package/dist/components/blocks/commerce/invoice-line-items/types.d.ts +6 -3
  248. package/dist/components/blocks/commerce/loyalty-points/loyalty-points.d.ts +1 -1
  249. package/dist/components/blocks/commerce/loyalty-points/types.d.ts +11 -5
  250. package/dist/components/blocks/commerce/order-status/order-status.d.ts +1 -1
  251. package/dist/components/blocks/commerce/order-status/types.d.ts +12 -8
  252. package/dist/components/blocks/commerce/order-timeline/order-timeline.d.ts +1 -1
  253. package/dist/components/blocks/commerce/order-timeline/types.d.ts +3 -1
  254. package/dist/components/blocks/commerce/payment-method/index.d.ts +2 -2
  255. package/dist/components/blocks/commerce/payment-method/payment-method.d.ts +0 -8
  256. package/dist/components/blocks/commerce/payment-method/types.d.ts +0 -2
  257. package/dist/components/blocks/commerce/receipt/index.d.ts +1 -1
  258. package/dist/components/blocks/commerce/receipt/receipt-items.d.ts +1 -1
  259. package/dist/components/blocks/commerce/receipt/types.d.ts +10 -0
  260. package/dist/components/blocks/commerce/refund-status/index.d.ts +2 -2
  261. package/dist/components/blocks/commerce/refund-status/refund-status.d.ts +0 -2
  262. package/dist/components/blocks/commerce/refund-status/types.d.ts +0 -2
  263. package/dist/components/blocks/commerce/seo-listing/types.d.ts +7 -0
  264. package/dist/components/blocks/commerce/shared/code-entry.d.ts +39 -0
  265. package/dist/components/blocks/commerce/shared/order-status.d.ts +1 -1
  266. package/dist/components/blocks/commerce/subscription-summary/subscription-summary.d.ts +1 -1
  267. package/dist/components/blocks/commerce/subscription-summary/types.d.ts +10 -1
  268. package/dist/components/blocks/commerce/upcoming-booking/index.d.ts +2 -1
  269. package/dist/components/blocks/commerce/upcoming-booking/types.d.ts +8 -0
  270. package/dist/components/blocks/commerce/upcoming-booking/upcoming-booking.d.ts +2 -2
  271. package/dist/components/blocks/commerce/vendor-profile/types.d.ts +4 -5
  272. package/dist/components/blocks/commerce/voucher-entry/types.d.ts +6 -3
  273. package/dist/components/blocks/commerce/voucher-entry/voucher-entry.d.ts +1 -1
  274. package/dist/components/blocks/content-block-hooks.d.ts +22 -0
  275. package/dist/components/blocks/data-display/dense-info-card/dense-info.strings.d.ts +5 -1
  276. package/dist/components/blocks/data-display/dense-info-card/helpers.d.ts +3 -1
  277. package/dist/components/blocks/data-display/dense-info-card/index.d.ts +1 -1
  278. package/dist/components/blocks/data-display/dense-info-card/partials/dense-info-classification.d.ts +1 -1
  279. package/dist/components/blocks/data-display/dense-info-card/partials/dense-info-dashboard.d.ts +1 -1
  280. package/dist/components/blocks/data-display/dense-info-card/partials/dense-info-financial.d.ts +1 -1
  281. package/dist/components/blocks/data-display/dense-info-card/partials/dense-info-project.d.ts +1 -1
  282. package/dist/components/blocks/data-display/dense-info-card/partials/dense-info-score.d.ts +1 -1
  283. package/dist/components/blocks/data-display/dense-info-card/types.d.ts +12 -5
  284. package/dist/components/blocks/data-display/empty-state/empty-state.types.d.ts +10 -3
  285. package/dist/components/blocks/data-display/index.d.ts +0 -1
  286. package/dist/components/blocks/data-display/relationship-card-frame.d.ts +1 -1
  287. package/dist/components/blocks/onboarding/checklist/checklist.types.d.ts +5 -3
  288. package/dist/components/blocks/planning/task-card.types.d.ts +7 -3
  289. package/dist/components/blocks/timelines/changelog/types.d.ts +2 -2
  290. package/dist/components/blocks/timelines/index.d.ts +2 -2
  291. package/dist/components/blocks/timelines/milestones/types.d.ts +2 -2
  292. package/dist/components/blocks/timelines/shared/timeline.d.ts +6 -0
  293. package/dist/components/blocks/timelines/steps-card/index.d.ts +2 -1
  294. package/dist/components/blocks/timelines/steps-card/steps-card.d.ts +2 -2
  295. package/dist/components/blocks/timelines/steps-card/types.d.ts +13 -1
  296. package/dist/components/features/activities/activities.strings.d.ts +5 -3
  297. package/dist/components/features/activities/activities.types.d.ts +46 -22
  298. package/dist/components/features/activities/hooks/use-activity-feed.d.ts +6 -0
  299. package/dist/components/features/activities/hooks/use-activity-resources.d.ts +2 -1
  300. package/dist/components/features/activities/index.d.ts +1 -1
  301. package/dist/components/features/activities/partials/activity-headline.d.ts +5 -0
  302. package/dist/components/features/activities/partials/activity-row.d.ts +12 -13
  303. package/dist/components/features/activities/partials/row-layers.d.ts +7 -0
  304. package/dist/components/features/activities/relative-time.d.ts +18 -0
  305. package/dist/components/features/ai-chat/ai-chat.d.ts +6 -2
  306. package/dist/components/features/ai-chat/ai-chat.strings.d.ts +41 -2
  307. package/dist/components/features/ai-chat/ai-chat.types.d.ts +6 -0
  308. package/dist/components/features/ai-chat/hooks/use-ai-chat-scroll.d.ts +1 -1
  309. package/dist/components/features/ai-chat/partials/ai-chat-attachments-strip.d.ts +5 -1
  310. package/dist/components/features/ai-chat/partials/ai-chat-prompt-input.d.ts +2 -2
  311. package/dist/components/features/ai-chat/partials/ai-chat-queue.d.ts +3 -1
  312. package/dist/components/features/ai-chat/partials/ai-chat-suggestions-row.d.ts +6 -1
  313. package/dist/components/features/appointment-calendar/appointment-calendar.d.ts +1 -1
  314. package/dist/components/features/appointment-calendar/appointment-calendar.types.d.ts +20 -4
  315. package/dist/components/features/appointment-calendar/index.d.ts +1 -1
  316. package/dist/components/features/appointment-calendar/partials/appointment-agenda.d.ts +18 -10
  317. package/dist/components/features/async-preview/async-preview.d.ts +2 -2
  318. package/dist/components/features/async-preview/async-preview.types.d.ts +30 -1
  319. package/dist/components/features/async-preview/preview-trigger-cell.d.ts +7 -2
  320. package/dist/components/features/combobox/async-resource-combobox.d.ts +2 -2
  321. package/dist/components/features/combobox/combobox.d.ts +12 -3
  322. package/dist/components/features/combobox/components/error-message.d.ts +3 -1
  323. package/dist/components/features/combobox/hooks/use-combobox-core.d.ts +4 -3
  324. package/dist/components/features/combobox/hooks/use-combobox-state.d.ts +1 -0
  325. package/dist/components/features/combobox/hooks/use-load-more.d.ts +1 -0
  326. package/dist/components/features/combobox/index.d.ts +1 -1
  327. package/dist/components/features/combobox/types.d.ts +68 -37
  328. package/dist/components/features/comments/comments.strings.d.ts +6 -5
  329. package/dist/components/features/comments/comments.types.d.ts +40 -26
  330. package/dist/components/features/comments/hooks/use-attachment-upload.d.ts +5 -1
  331. package/dist/components/features/comments/hooks/use-comments.d.ts +8 -1
  332. package/dist/components/features/data-view/data-view.strings.d.ts +9 -2
  333. package/dist/components/features/data-view/data-view.types.d.ts +15 -2
  334. package/dist/components/features/email-composer/email-html.d.ts +5 -0
  335. package/dist/components/features/email-composer/http.d.ts +2 -0
  336. package/dist/components/features/email-composer/strings.d.ts +17 -2
  337. package/dist/components/features/email-composer/types.d.ts +19 -2
  338. package/dist/components/features/email-composer/use-composer.d.ts +2 -78
  339. package/dist/components/features/event-calendar/event-calendar-day-cell.d.ts +1 -1
  340. package/dist/components/features/event-calendar/event-calendar-event-badge.d.ts +1 -1
  341. package/dist/components/features/event-calendar/event-calendar-header.d.ts +1 -1
  342. package/dist/components/features/event-calendar/event-calendar-legend.d.ts +2 -2
  343. package/dist/components/features/event-calendar/event-calendar.d.ts +1 -1
  344. package/dist/components/features/event-calendar/event-calendar.types.d.ts +126 -21
  345. package/dist/components/features/filters/facets/date-facet.d.ts +4 -2
  346. package/dist/components/features/filters/facets/range-facet.d.ts +24 -7
  347. package/dist/components/features/filters/filter-context.d.ts +9 -0
  348. package/dist/components/features/filters/filters.strings.d.ts +36 -3
  349. package/dist/components/features/filters/filters.types.d.ts +75 -8
  350. package/dist/components/features/filters/hooks/use-filter-draft.d.ts +1 -0
  351. package/dist/components/features/filters/index.d.ts +2 -2
  352. package/dist/components/features/filters/operator-options.d.ts +25 -2
  353. package/dist/components/features/filters/partials/active-filter-item.d.ts +0 -13
  354. package/dist/components/features/filters/partials/async-options-status.d.ts +32 -0
  355. package/dist/components/features/filters/partials/date-filter-content.d.ts +3 -2
  356. package/dist/components/features/filters/partials/filter-draft-footer.d.ts +11 -0
  357. package/dist/components/features/filters/partials/filter-operator-select.d.ts +4 -2
  358. package/dist/components/features/filters/partials/filter-pill.d.ts +5 -1
  359. package/dist/components/features/filters/partials/filter-popover-content.d.ts +4 -2
  360. package/dist/components/features/filters/partials/filter-tabs.d.ts +2 -1
  361. package/dist/components/features/filters/partials/range-filter-content.d.ts +12 -0
  362. package/dist/components/features/filters/partials/regular-filter-content.d.ts +1 -1
  363. package/dist/components/features/filters/utils/filter-utils.d.ts +34 -5
  364. package/dist/components/features/global-search/global-search-dialog.d.ts +7 -1
  365. package/dist/components/features/global-search/global-search.d.ts +7 -1
  366. package/dist/components/features/global-search/global-search.strings.d.ts +19 -3
  367. package/dist/components/features/global-search/global-search.types.d.ts +30 -6
  368. package/dist/components/features/global-search/index.d.ts +1 -1
  369. package/dist/components/features/global-search/partials/global-search-idle-state.d.ts +6 -1
  370. package/dist/components/features/global-search/partials/global-search-input.d.ts +2 -0
  371. package/dist/components/features/kanban/index.d.ts +2 -2
  372. package/dist/components/features/kanban/kanban-context.d.ts +4 -0
  373. package/dist/components/features/kanban/kanban-keyboard.d.ts +7 -2
  374. package/dist/components/features/kanban/kanban.d.ts +10 -1
  375. package/dist/components/features/kanban/kanban.strings.d.ts +11 -2
  376. package/dist/components/features/kanban/kanban.types.d.ts +26 -0
  377. package/dist/components/features/map/map.d.ts +4 -0
  378. package/dist/components/features/map/place-autocomplete.d.ts +10 -1
  379. package/dist/components/features/media-library/hooks/use-media-library.d.ts +3 -1
  380. package/dist/components/features/media-library/media-library.d.ts +1 -1
  381. package/dist/components/features/media-library/media-library.strings.d.ts +39 -3
  382. package/dist/components/features/media-library/media-library.types.d.ts +82 -9
  383. package/dist/components/features/media-library/partials/media-library-partials.d.ts +3 -3
  384. package/dist/components/features/mentions/hooks/use-mentions-search.d.ts +7 -0
  385. package/dist/components/features/mentions/hooks/use-mentions.d.ts +16 -1
  386. package/dist/components/features/mentions/index.d.ts +1 -1
  387. package/dist/components/features/mentions/mentions.strings.d.ts +10 -2
  388. package/dist/components/features/mentions/partials/mention-chip.d.ts +1 -0
  389. package/dist/components/features/mentions/partials/mention-inline-suggestions.d.ts +12 -1
  390. package/dist/components/features/mentions/partials/mention-picker.d.ts +8 -1
  391. package/dist/components/features/mentions/partials/mention-search-error.d.ts +6 -0
  392. package/dist/components/features/mentions/utils/index.d.ts +0 -1
  393. package/dist/components/features/overlays/alert-dialog.d.ts +1 -1
  394. package/dist/components/features/overlays/dialog.d.ts +1 -1
  395. package/dist/components/features/overlays/drawer.d.ts +1 -1
  396. package/dist/components/features/overlays/hooks/use-overlay-visibility.d.ts +2 -2
  397. package/dist/components/features/overlays/index.d.ts +2 -2
  398. package/dist/components/features/overlays/overlays.strings.d.ts +2 -1
  399. package/dist/components/features/overlays/overlays.types.d.ts +27 -10
  400. package/dist/components/features/products/components/index.d.ts +0 -10
  401. package/dist/components/features/products/components/product-contract-overview.d.ts +1 -1
  402. package/dist/components/features/products/components/product-details-card.d.ts +1 -1
  403. package/dist/components/features/products/components/product-operations-card.d.ts +1 -1
  404. package/dist/components/features/products/components/product-option-action-menu.d.ts +1 -1
  405. package/dist/components/features/products/components/product-options-summary.d.ts +1 -1
  406. package/dist/components/features/products/components/product-policies-card.d.ts +1 -1
  407. package/dist/components/features/products/components/product-quote-preview-card.d.ts +1 -1
  408. package/dist/components/features/products/components/product-readiness-card.d.ts +1 -1
  409. package/dist/components/features/products/components/product-structure-card.d.ts +1 -1
  410. package/dist/components/features/products/components/product-variant-action-menu.d.ts +1 -1
  411. package/dist/components/features/products/components/product-variants-manager.d.ts +1 -1
  412. package/dist/components/features/products/components/product-variants-table.d.ts +1 -1
  413. package/dist/components/features/products/partials/product-surface.d.ts +15 -0
  414. package/dist/components/features/products/products.strings.d.ts +8 -0
  415. package/dist/components/features/products/products.types.d.ts +26 -8
  416. package/dist/components/features/questionnaire/questionnaire.types.d.ts +7 -2
  417. package/dist/components/features/resource/index.d.ts +2 -3
  418. package/dist/components/features/resource/resource.d.ts +2 -10
  419. package/dist/components/features/resource/resource.types.d.ts +7 -147
  420. package/dist/components/features/resource-assignment/partials/assignment-surface.d.ts +15 -0
  421. package/dist/components/features/resource-assignment/resource-assignment.strings.d.ts +6 -1
  422. package/dist/components/features/resource-assignment/resource-assignment.types.d.ts +6 -0
  423. package/dist/components/features/rich-text-editor/form-rich-text-editor.d.ts +1 -1
  424. package/dist/components/features/rich-text-editor/partials/caret-helpers.d.ts +5 -7
  425. package/dist/components/features/rich-text-editor/partials/editor-field-aria.d.ts +14 -0
  426. package/dist/components/features/rich-text-editor/partials/html-helpers.d.ts +2 -3
  427. package/dist/components/features/rich-text-editor/partials/image-uploads.d.ts +6 -2
  428. package/dist/components/features/rich-text-editor/partials/index.d.ts +2 -3
  429. package/dist/components/features/rich-text-editor/partials/rich-text-editor-tiptap.d.ts +0 -1
  430. package/dist/components/features/rich-text-editor/partials/rich-text-editor-toolbar.d.ts +5 -4
  431. package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +1 -1
  432. package/dist/components/features/rich-text-editor/rich-text-editor.types.d.ts +30 -4
  433. package/dist/components/features/schema-form/hooks/use-schema-form.d.ts +10 -1
  434. package/dist/components/features/schema-form/partials/schema-form-field.d.ts +3 -1
  435. package/dist/components/features/schema-form/schema-form.d.ts +1 -1
  436. package/dist/components/features/schema-form/schema-form.types.d.ts +13 -5
  437. package/dist/components/features/schema-form/schema-form.utils.d.ts +1 -1
  438. package/dist/components/features/suggestions/suggestions.strings.d.ts +14 -0
  439. package/dist/components/features/suggestions/suggestions.types.d.ts +13 -5
  440. package/dist/components/features/table/data-table.d.ts +1 -1
  441. package/dist/components/features/table/filter-bar.d.ts +1 -1
  442. package/dist/components/features/table/index.d.ts +1 -0
  443. package/dist/components/features/table/pagination.d.ts +1 -1
  444. package/dist/components/features/table/partials/cell-value.d.ts +1 -1
  445. package/dist/components/features/table/table-body.d.ts +1 -1
  446. package/dist/components/features/table/table-header.d.ts +1 -1
  447. package/dist/components/features/table/table-helpers.d.ts +37 -12
  448. package/dist/components/features/table/table-region.recipes.d.ts +11 -0
  449. package/dist/components/features/table/table-toolbar.d.ts +1 -1
  450. package/dist/components/features/table/table.strings.d.ts +4 -0
  451. package/dist/components/features/table/table.types.d.ts +91 -49
  452. package/dist/components/features/theme-tweaker/theme-provider-settings.d.ts +4 -0
  453. package/dist/components/features/theme-tweaker/theme-tweaker.strings.d.ts +10 -7
  454. package/dist/components/features/theme-tweaker/theme-tweaker.utils.d.ts +17 -0
  455. package/dist/components/layout/app-shell/app-shell.types.d.ts +46 -49
  456. package/dist/components/layout/app-shell/index.d.ts +2 -2
  457. package/dist/components/layout/app-shell/shell-regions.d.ts +9 -0
  458. package/dist/components/layout/app-shell/shell-skip-link.d.ts +9 -0
  459. package/dist/components/layout/app-shell/sidebar-inset-layout.d.ts +1 -1
  460. package/dist/components/layout/app-shell/stacked-layout.d.ts +1 -1
  461. package/dist/components/layout/app-shell/topbar-sidebar-layout.d.ts +1 -1
  462. package/dist/components/layout/auth/auth-shell.d.ts +1 -1
  463. package/dist/components/layout/auth/auth.types.d.ts +0 -5
  464. package/dist/components/layout/containers/inline-gutter-context.d.ts +7 -0
  465. package/dist/components/layout/containers/main-landmark-context.d.ts +6 -0
  466. package/dist/components/layout/header/header.types.d.ts +19 -8
  467. package/dist/components/layout/header/partials/header-global-search-trigger.d.ts +1 -1
  468. package/dist/components/layout/header/partials/header-notifications.d.ts +1 -1
  469. package/dist/components/layout/header/partials/header-search.d.ts +1 -1
  470. package/dist/components/layout/hooks/use-command-shortcut.d.ts +10 -1
  471. package/dist/components/layout/layout.types.d.ts +6 -4
  472. package/dist/components/layout/navigation/breadcrumb-progress/breadcrumb-progress.d.ts +1 -1
  473. package/dist/components/layout/navigation/breadcrumb-progress/types.d.ts +9 -0
  474. package/dist/components/layout/navigation/section-nav/section-nav.d.ts +8 -1
  475. package/dist/components/layout/navigation/side-nav.d.ts +3 -2
  476. package/dist/components/layout/normalize-layout-path.d.ts +1 -0
  477. package/dist/components/layout/page/index.d.ts +2 -3
  478. package/dist/components/layout/page/page.strings.d.ts +12 -0
  479. package/dist/components/layout/page/page.types.d.ts +7 -110
  480. package/dist/components/layout/page/partials/page-header.d.ts +1 -1
  481. package/dist/components/layout/settings/index.d.ts +1 -1
  482. package/dist/components/layout/settings/settings.d.ts +4 -6
  483. package/dist/components/layout/sidebar/app-sidebar.d.ts +1 -1
  484. package/dist/components/layout/sidebar/components/sidebar-grouped-navigation.d.ts +1 -1
  485. package/dist/components/layout/sidebar/components/sidebar-navigation-footer.d.ts +1 -1
  486. package/dist/components/layout/sidebar/components/sidebar-navigation.d.ts +1 -1
  487. package/dist/components/layout/sidebar/index.d.ts +1 -1
  488. package/dist/components/layout/sidebar/sidebar-navigation-rail.d.ts +17 -7
  489. package/dist/components/layout/sidebar/sidebar.context.d.ts +1 -0
  490. package/dist/components/layout/sidebar/sidebar.types.d.ts +12 -12
  491. package/dist/components/layout/sidebar/sidebar.utils.d.ts +4 -0
  492. package/dist/components/layout/workspace/workspace.strings.d.ts +2 -2
  493. package/dist/components/layout/workspace/workspace.types.d.ts +13 -7
  494. package/dist/components/primitives/date.d.ts +22 -3
  495. package/dist/components/primitives/file-size.d.ts +8 -2
  496. package/dist/components/primitives/index.d.ts +1 -1
  497. package/dist/components/primitives/initials.d.ts +3 -1
  498. package/dist/components/primitives/link.d.ts +11 -3
  499. package/dist/components/primitives/money.d.ts +2 -2
  500. package/dist/components/primitives/number.d.ts +3 -2
  501. package/dist/components/typography/heading.d.ts +9 -3
  502. package/dist/components/typography/index.d.ts +1 -1
  503. package/dist/components/typography/rich-text/rich-text-tree.d.ts +7 -5
  504. package/dist/components/typography/text-link.d.ts +10 -3
  505. package/dist/components/ui/badge.d.ts +2 -4
  506. package/dist/components/ui/breadcrumb.d.ts +2 -3
  507. package/dist/components/ui/button.d.ts +8 -2
  508. package/dist/components/ui/collapsible.d.ts +1 -4
  509. package/dist/components/ui/command.d.ts +20 -18
  510. package/dist/components/ui/dialog.d.ts +3 -9
  511. package/dist/components/ui/empty.d.ts +2 -2
  512. package/dist/components/ui/input-group.d.ts +3 -3
  513. package/dist/components/ui/item.d.ts +3 -3
  514. package/dist/components/ui/popover.d.ts +3 -7
  515. package/dist/components/ui/sheet.d.ts +4 -12
  516. package/dist/components/ui/sidebar-state.d.ts +6 -1
  517. package/dist/components/ui/sidebar.d.ts +7 -4
  518. package/dist/components/ui/tabs.d.ts +2 -2
  519. package/dist/components/ui/toggle-group.d.ts +3 -3
  520. package/dist/components/ui/toggle.d.ts +2 -2
  521. package/dist/components/ui/tooltip.d.ts +1 -3
  522. package/dist/{containers-CIxwbZt5.js → containers-BdfLTP4w.js} +37 -32
  523. package/dist/containers-BdfLTP4w.js.map +1 -0
  524. package/dist/content-block-hooks-Z3iKjqd1.js +17 -0
  525. package/dist/content-block-hooks-Z3iKjqd1.js.map +1 -0
  526. package/dist/{copyable-DIznBqiT.js → copyable-Bmr14W0d.js} +6 -6
  527. package/dist/{copyable-DIznBqiT.js.map → copyable-Bmr14W0d.js.map} +1 -1
  528. package/dist/{data-display-BdgCAw8T.js → data-display-CWe9SOYh.js} +264 -250
  529. package/dist/data-display-CWe9SOYh.js.map +1 -0
  530. package/dist/date-3qsCE1ID.js +209 -0
  531. package/dist/date-3qsCE1ID.js.map +1 -0
  532. package/dist/date-picker-D1keJQIG.js +1617 -0
  533. package/dist/date-picker-D1keJQIG.js.map +1 -0
  534. package/dist/date-pickers-D8aJoeHc.js +185 -0
  535. package/dist/date-pickers-D8aJoeHc.js.map +1 -0
  536. package/dist/disclosure-panel-B0HFNZ9x.js.map +1 -1
  537. package/dist/{display-KsZLw9Ov.js → display-VlmP1I0i.js} +23 -46
  538. package/dist/display-VlmP1I0i.js.map +1 -0
  539. package/dist/{dropdown-menu-CLs8Lihj.js → dropdown-menu-B8hjvbkS.js} +9 -9
  540. package/dist/{dropdown-menu-CLs8Lihj.js.map → dropdown-menu-B8hjvbkS.js.map} +1 -1
  541. package/dist/dropzone-CHBNK3de.js +116 -0
  542. package/dist/dropzone-CHBNK3de.js.map +1 -0
  543. package/dist/features/activities.js +767 -700
  544. package/dist/features/activities.js.map +1 -1
  545. package/dist/features/ai-chat.js +280 -235
  546. package/dist/features/ai-chat.js.map +1 -1
  547. package/dist/features/appointment-calendar.js +430 -334
  548. package/dist/features/appointment-calendar.js.map +1 -1
  549. package/dist/features/async-preview.js +351 -265
  550. package/dist/features/async-preview.js.map +1 -1
  551. package/dist/features/combobox.js +2 -2
  552. package/dist/features/comments.js +1 -1
  553. package/dist/features/data-view.js +212 -151
  554. package/dist/features/data-view.js.map +1 -1
  555. package/dist/features/email-composer/engine.js +1 -1
  556. package/dist/features/email-composer.js +347 -313
  557. package/dist/features/email-composer.js.map +1 -1
  558. package/dist/features/event-calendar.js +501 -348
  559. package/dist/features/event-calendar.js.map +1 -1
  560. package/dist/features/filters.js +2 -2
  561. package/dist/features/global-search.js +250 -210
  562. package/dist/features/global-search.js.map +1 -1
  563. package/dist/features/kanban.js +280 -210
  564. package/dist/features/kanban.js.map +1 -1
  565. package/dist/features/map/style.css +15 -0
  566. package/dist/features/map.js +435 -404
  567. package/dist/features/map.js.map +1 -1
  568. package/dist/features/media-library.js +1745 -1195
  569. package/dist/features/media-library.js.map +1 -1
  570. package/dist/features/mentions.js +2 -2
  571. package/dist/features/overlays.js +2 -2
  572. package/dist/features/products.js +1862 -1759
  573. package/dist/features/products.js.map +1 -1
  574. package/dist/features/questionnaire.js +188 -168
  575. package/dist/features/questionnaire.js.map +1 -1
  576. package/dist/features/resource-assignment.js +223 -191
  577. package/dist/features/resource-assignment.js.map +1 -1
  578. package/dist/features/resource.js +55 -217
  579. package/dist/features/resource.js.map +1 -1
  580. package/dist/features/rich-text-editor.js +28 -19
  581. package/dist/features/rich-text-editor.js.map +1 -1
  582. package/dist/features/schema-form.js +380 -287
  583. package/dist/features/schema-form.js.map +1 -1
  584. package/dist/features/suggestions.js +90 -74
  585. package/dist/features/suggestions.js.map +1 -1
  586. package/dist/features/table.js +2 -2
  587. package/dist/features/theme-tweaker.js +718 -627
  588. package/dist/features/theme-tweaker.js.map +1 -1
  589. package/dist/feedback-DmqmXKLn.js +254 -0
  590. package/dist/feedback-DmqmXKLn.js.map +1 -0
  591. package/dist/{field-affordance-recipes-DWcNcOjh.js → field-affordance-recipes-DfbMadot.js} +13 -9
  592. package/dist/field-affordance-recipes-DfbMadot.js.map +1 -0
  593. package/dist/field-control-attributes-B6i335wr.js +18 -0
  594. package/dist/field-control-attributes-B6i335wr.js.map +1 -0
  595. package/dist/field-state-recipes-EtCxpEy3.js +18 -0
  596. package/dist/field-state-recipes-EtCxpEy3.js.map +1 -0
  597. package/dist/filters-BviMRMLS.js +2692 -0
  598. package/dist/filters-BviMRMLS.js.map +1 -0
  599. package/dist/{focus-recipes-B653VaLq.js → focus-recipes-DSkiUvUp.js} +3 -3
  600. package/dist/focus-recipes-DSkiUvUp.js.map +1 -0
  601. package/dist/form-field-BdfCwSoQ.js +74 -0
  602. package/dist/form-field-BdfCwSoQ.js.map +1 -0
  603. package/dist/{form-sizing-Bs2qFUeE.js → form-sizing-DE_dZw32.js} +3 -3
  604. package/dist/{form-sizing-Bs2qFUeE.js.map → form-sizing-DE_dZw32.js.map} +1 -1
  605. package/dist/{forms-C0RGnJTe.js → forms-B8DzJnBN.js} +35 -35
  606. package/dist/forms-B8DzJnBN.js.map +1 -0
  607. package/dist/forms-numeric-DOBswjKj.js +992 -0
  608. package/dist/forms-numeric-DOBswjKj.js.map +1 -0
  609. package/dist/{header-DMMxG__r.js → header-Cq3G0ZRP.js} +163 -158
  610. package/dist/header-Cq3G0ZRP.js.map +1 -0
  611. package/dist/hooks/use-files.d.ts +2 -0
  612. package/dist/{hooks-DB6CJ4MR.js → hooks-DHfeSMAO.js} +34 -14
  613. package/dist/hooks-DHfeSMAO.js.map +1 -0
  614. package/dist/{http-D_6rOnzU.js → http-Cu-GPpss.js} +61 -35
  615. package/dist/http-Cu-GPpss.js.map +1 -0
  616. package/dist/{icon-badge-DZF-YjQp.js → icon-badge-B0Kq7wom.js} +3 -3
  617. package/dist/{icon-badge-DZF-YjQp.js.map → icon-badge-B0Kq7wom.js.map} +1 -1
  618. package/dist/index.js +6 -6
  619. package/dist/inline-gutter-context-CSqmrMFZ.js +11 -0
  620. package/dist/inline-gutter-context-CSqmrMFZ.js.map +1 -0
  621. package/dist/{input-DMBwAZmr.js → input-2YrgTUrz.js} +3 -3
  622. package/dist/{input-DMBwAZmr.js.map → input-2YrgTUrz.js.map} +1 -1
  623. package/dist/{input-CvyDQlY7.js → input-DfJyrjoR.js} +7 -7
  624. package/dist/{input-CvyDQlY7.js.map → input-DfJyrjoR.js.map} +1 -1
  625. package/dist/{interaction-recipes-XR9ZpVYL.js → interaction-recipes-DmuS1ase.js} +2 -2
  626. package/dist/{interaction-recipes-XR9ZpVYL.js.map → interaction-recipes-DmuS1ase.js.map} +1 -1
  627. package/dist/item-GJ9mvCcg.js +279 -0
  628. package/dist/item-GJ9mvCcg.js.map +1 -0
  629. package/dist/layout/app-shell.js +1 -1
  630. package/dist/layout/auth.js +1 -1
  631. package/dist/layout/containers.js +1 -1
  632. package/dist/layout/header.js +1 -1
  633. package/dist/layout/hooks.js +1 -1
  634. package/dist/layout/navigation.js +1 -1
  635. package/dist/layout/page.js +2 -2
  636. package/dist/layout/settings.js +2 -2
  637. package/dist/layout/sidebar.js +3 -3
  638. package/dist/layout/workspace.js +1 -1
  639. package/dist/layout.js +12 -12
  640. package/dist/layout.types-DbtnyAtd.js +33 -0
  641. package/dist/layout.types-DbtnyAtd.js.map +1 -0
  642. package/dist/lib/anchored-positioning.d.ts +11 -0
  643. package/dist/lib/field-affordance-recipes.d.ts +10 -0
  644. package/dist/lib/field-control-attributes.d.ts +11 -0
  645. package/dist/lib/field-state-recipes.d.ts +8 -0
  646. package/dist/lib/focus-recipes.d.ts +7 -0
  647. package/dist/lib/format.d.ts +26 -0
  648. package/dist/lib/money-format.d.ts +6 -0
  649. package/dist/lib/motion-recipes.d.ts +6 -0
  650. package/dist/lib/surface-recipes.d.ts +33 -3
  651. package/dist/lib/theme-scope.d.ts +17 -1
  652. package/dist/lib/token-merge.generated.d.ts +19 -25
  653. package/dist/lib/ui-provider/index.d.ts +1 -1
  654. package/dist/lib/ui-provider/types.d.ts +5 -0
  655. package/dist/lib/use-controllable-state.d.ts +16 -0
  656. package/dist/lib/use-copy-feedback.d.ts +15 -0
  657. package/dist/lib/utils.js +1 -1
  658. package/dist/lib/variant-props.d.ts +9 -0
  659. package/dist/main-landmark-context-BAsyqp2I.js +11 -0
  660. package/dist/main-landmark-context-BAsyqp2I.js.map +1 -0
  661. package/dist/mentions-zz0ewNIq.js +670 -0
  662. package/dist/mentions-zz0ewNIq.js.map +1 -0
  663. package/dist/message-BiiVrRrm.js +138 -0
  664. package/dist/message-BiiVrRrm.js.map +1 -0
  665. package/dist/{metadata-list-C3MkU-Om.js → metadata-list-G85roWjS.js} +13 -12
  666. package/dist/metadata-list-G85roWjS.js.map +1 -0
  667. package/dist/{motion-recipes-DitYv6P2.js → motion-recipes-CUc_aHuG.js} +7 -4
  668. package/dist/motion-recipes-CUc_aHuG.js.map +1 -0
  669. package/dist/navigation-C0Be5C3i.js +304 -0
  670. package/dist/navigation-C0Be5C3i.js.map +1 -0
  671. package/dist/navigation-CmqaQR_G.js +257 -0
  672. package/dist/navigation-CmqaQR_G.js.map +1 -0
  673. package/dist/normalize-layout-path-BmEgg6fu.js +14 -0
  674. package/dist/normalize-layout-path-BmEgg6fu.js.map +1 -0
  675. package/dist/number-NFWKIoiK.js +340 -0
  676. package/dist/number-NFWKIoiK.js.map +1 -0
  677. package/dist/{overflow-tab-bar-IVFVQFV6.js → overflow-tab-bar-DV7HE_3t.js} +8 -8
  678. package/dist/{overflow-tab-bar-IVFVQFV6.js.map → overflow-tab-bar-DV7HE_3t.js.map} +1 -1
  679. package/dist/{overlays-BSgCtM2v.js → overlays-D-gAIfPF.js} +369 -364
  680. package/dist/overlays-D-gAIfPF.js.map +1 -0
  681. package/dist/page-D4pQhgSq.js +216 -0
  682. package/dist/page-D4pQhgSq.js.map +1 -0
  683. package/dist/{page-header-commands-7P3sfE9u.js → page-header-commands-elelNOfd.js} +29 -29
  684. package/dist/{page-header-commands-7P3sfE9u.js.map → page-header-commands-elelNOfd.js.map} +1 -1
  685. package/dist/{pagination-CgCjElfu.js → pagination-BuSWw1US.js} +22 -23
  686. package/dist/pagination-BuSWw1US.js.map +1 -0
  687. package/dist/popover-BpMxbqEK.js +205 -0
  688. package/dist/popover-BpMxbqEK.js.map +1 -0
  689. package/dist/{popover-menu-DlnQ2zlR.js → popover-menu-CO-_iiuz.js} +7 -7
  690. package/dist/{popover-menu-DlnQ2zlR.js.map → popover-menu-CO-_iiuz.js.map} +1 -1
  691. package/dist/{popover.recipes-DdiEp0rd.js → popover.recipes-BqkdvlZn.js} +3 -4
  692. package/dist/{popover.recipes-DdiEp0rd.js.map → popover.recipes-BqkdvlZn.js.map} +1 -1
  693. package/dist/{portal-recipes-BpsV_iRw.js → portal-recipes-BPeS4rGB.js} +2 -2
  694. package/dist/{portal-recipes-BpsV_iRw.js.map → portal-recipes-BPeS4rGB.js.map} +1 -1
  695. package/dist/primitives-BlC1lXBr.js +447 -0
  696. package/dist/primitives-BlC1lXBr.js.map +1 -0
  697. package/dist/primitives.js +4 -4
  698. package/dist/{progress-BJhQP9WX.js → progress-RARK8AjB.js} +5 -5
  699. package/dist/{progress-BJhQP9WX.js.map → progress-RARK8AjB.js.map} +1 -1
  700. package/dist/receipt-CUf2Vegp.js +114 -0
  701. package/dist/receipt-CUf2Vegp.js.map +1 -0
  702. package/dist/rich-text-Cypm9__d.js +44 -0
  703. package/dist/rich-text-Cypm9__d.js.map +1 -0
  704. package/dist/rich-text-editor-Z6cQepsA.js +919 -0
  705. package/dist/rich-text-editor-Z6cQepsA.js.map +1 -0
  706. package/dist/rich-text-editor-toolbar-DYbRJARB.js +100 -0
  707. package/dist/rich-text-editor-toolbar-DYbRJARB.js.map +1 -0
  708. package/dist/rich-text-tree-DdKHIJx4.js +154 -0
  709. package/dist/rich-text-tree-DdKHIJx4.js.map +1 -0
  710. package/dist/{scroll-area-B0dB2cBi.js → scroll-area-B9HKbji0.js} +3 -3
  711. package/dist/{scroll-area-B0dB2cBi.js.map → scroll-area-B9HKbji0.js.map} +1 -1
  712. package/dist/{separator-Ct_WSWTJ.js → separator-DaDe26sf.js} +3 -3
  713. package/dist/separator-DaDe26sf.js.map +1 -0
  714. package/dist/{separator-Bb17I4pu.js → separator-KGsNXt2J.js} +2 -2
  715. package/dist/{separator-Bb17I4pu.js.map → separator-KGsNXt2J.js.map} +1 -1
  716. package/dist/services/actions/action-adapters.d.ts +5 -2
  717. package/dist/services/actions/index.d.ts +1 -1
  718. package/dist/services/actions.js +2 -2
  719. package/dist/services/actions.js.map +1 -1
  720. package/dist/settings-D5j_RJvT.js +160 -0
  721. package/dist/settings-D5j_RJvT.js.map +1 -0
  722. package/dist/sheet-B6j_BE9O.js +241 -0
  723. package/dist/sheet-B6j_BE9O.js.map +1 -0
  724. package/dist/{sidebar-f9gRWXIR.js → sidebar-C-iQ_TJP.js} +379 -350
  725. package/dist/sidebar-C-iQ_TJP.js.map +1 -0
  726. package/dist/sidebar-D5VO2W8S.js +715 -0
  727. package/dist/sidebar-D5VO2W8S.js.map +1 -0
  728. package/dist/{skeleton-BapcJd9C.js → skeleton-Cab_KgVo.js} +13 -13
  729. package/dist/skeleton-Cab_KgVo.js.map +1 -0
  730. package/dist/{smart-card-CW0hjetE.js → smart-card-C59z6KFO.js} +217 -210
  731. package/dist/smart-card-C59z6KFO.js.map +1 -0
  732. package/dist/{structure-DuxKl954.js → structure-DElaQwwN.js} +2 -2
  733. package/dist/{structure-DuxKl954.js.map → structure-DElaQwwN.js.map} +1 -1
  734. package/dist/style.css +1 -1
  735. package/dist/{surface-recipes-BKRVW8Os.js → surface-recipes-DV6rrOFq.js} +11 -3
  736. package/dist/surface-recipes-DV6rrOFq.js.map +1 -0
  737. package/dist/table-CSRUgpdK.js +180 -0
  738. package/dist/table-CSRUgpdK.js.map +1 -0
  739. package/dist/table-DdXDBsR_.js +1657 -0
  740. package/dist/table-DdXDBsR_.js.map +1 -0
  741. package/dist/tabs-WnHfV2pM.js +192 -0
  742. package/dist/tabs-WnHfV2pM.js.map +1 -0
  743. package/dist/{text-inputs-B1culiSK.js → text-inputs-ljyBYaCd.js} +112 -112
  744. package/dist/text-inputs-ljyBYaCd.js.map +1 -0
  745. package/dist/theme.css +21 -5
  746. package/dist/timelines-mOmS9Eh3.js +479 -0
  747. package/dist/timelines-mOmS9Eh3.js.map +1 -0
  748. package/dist/tooltip-yjX-Uv-p.js +112 -0
  749. package/dist/tooltip-yjX-Uv-p.js.map +1 -0
  750. package/dist/{tree-CzUJHnFs.js → tree-YpkxUG2Z.js} +80 -72
  751. package/dist/tree-YpkxUG2Z.js.map +1 -0
  752. package/dist/typography/rich-text.js +1 -1
  753. package/dist/{typography-BQnine1k.js → typography-C0dELqYV.js} +46 -40
  754. package/dist/typography-C0dELqYV.js.map +1 -0
  755. package/dist/typography.js +1 -1
  756. package/dist/{ui-provider-C-74NVLc.js → ui-provider-Bu1S-o96.js} +4 -3
  757. package/dist/ui-provider-Bu1S-o96.js.map +1 -0
  758. package/dist/ui-provider.js +2 -2
  759. package/dist/upload-DMuMYJFT.js +875 -0
  760. package/dist/upload-DMuMYJFT.js.map +1 -0
  761. package/dist/{usage-card-BeSLY0i0.js → usage-card-DDPki5P1.js} +57 -54
  762. package/dist/usage-card-DDPki5P1.js.map +1 -0
  763. package/dist/use-controllable-state-BlP8SyBI.js +13 -0
  764. package/dist/use-controllable-state-BlP8SyBI.js.map +1 -0
  765. package/dist/use-copy-feedback-CzcaqlLf.js +28 -0
  766. package/dist/use-copy-feedback-CzcaqlLf.js.map +1 -0
  767. package/dist/use-metric-format-options-Dk4rC1NO.js +251 -0
  768. package/dist/use-metric-format-options-Dk4rC1NO.js.map +1 -0
  769. package/dist/{utils-B6kKb8jB.js → utils-BVbAG2J6.js} +128 -112
  770. package/dist/utils-BVbAG2J6.js.map +1 -0
  771. package/dist/value-inputs-h5MwjGCo.js +982 -0
  772. package/dist/value-inputs-h5MwjGCo.js.map +1 -0
  773. package/dist/value-typography-D15uwfj-.js +154 -0
  774. package/dist/value-typography-D15uwfj-.js.map +1 -0
  775. package/dist/workspace-DIryPqBt.js +400 -0
  776. package/dist/workspace-DIryPqBt.js.map +1 -0
  777. package/docs/consumer-skill/SKILL.md +7 -0
  778. package/docs/consumer-skill/agents/themelia-ui-designer.md +11 -2
  779. package/docs/consumer-skill/examples/analytics.tsx +1 -1
  780. package/docs/consumer-skill/examples/app-layout.tsx +3 -3
  781. package/docs/consumer-skill/examples/commerce-lines.tsx +7 -5
  782. package/docs/consumer-skill/examples/detail.tsx +3 -2
  783. package/docs/consumer-skill/examples/edit.tsx +3 -3
  784. package/docs/consumer-skill/examples/email-composer.tsx +1 -1
  785. package/docs/consumer-skill/examples/index-table.tsx +2 -2
  786. package/docs/consumer-skill/examples/scoped-directory.tsx +7 -6
  787. package/docs/consumer-skill/references/agents-md.md +27 -23
  788. package/docs/consumer-skill/references/analytics.md +33 -4
  789. package/docs/consumer-skill/references/building-views.md +213 -0
  790. package/docs/consumer-skill/references/catalogue.md +617 -0
  791. package/docs/consumer-skill/references/component-contracts.json +25852 -32067
  792. package/docs/consumer-skill/references/composition.md +42 -21
  793. package/docs/consumer-skill/references/design-contract.md +1 -0
  794. package/docs/consumer-skill/references/discovery.md +8 -5
  795. package/docs/consumer-skill/references/installation.md +59 -10
  796. package/docs/consumer-skill/references/integration.md +28 -5
  797. package/docs/consumer-skill/references/product-composition.md +2 -2
  798. package/docs/consumer-skill/references/public-api.json +726 -641
  799. package/docs/consumer-skill/references/review.md +57 -15
  800. package/docs/consumer-skill/references/rhf-workflows.md +72 -0
  801. package/docs/consumer-skill/references/screen-archetypes.md +2 -2
  802. package/docs/consumer-skill/references/theming.md +8 -3
  803. package/docs/consumer-skill/references/tokens.json +4 -4
  804. package/docs/consumer-skill/references/workflows.md +7 -7
  805. package/docs/consumer-skill/scripts/composition-policy.mjs +178 -44
  806. package/docs/consumer-skill/scripts/composition.mjs +4 -1
  807. package/docs/consumer-skill/scripts/discovery.mjs +3 -1
  808. package/docs/consumer-skill/scripts/setup-skills.mjs +74 -10
  809. package/docs/consumer-skills/themelia-components/SKILL.md +8 -4
  810. package/docs/consumer-skills/themelia-composition/SKILL.md +7 -3
  811. package/docs/consumer-skills/themelia-design/SKILL.md +7 -1
  812. package/docs/consumer-skills/themelia-tokenization/SKILL.md +1 -1
  813. package/package.json +12 -13
  814. package/templates/README.md +3 -2
  815. package/templates/admin-shell-template.tsx +50 -11
  816. package/templates/analytics-operations-template.tsx +20 -24
  817. package/templates/customers-template.tsx +30 -25
  818. package/templates/index.ts +2 -8
  819. package/templates/orders-template.tsx +28 -24
  820. package/templates/products-template.tsx +14 -4
  821. package/templates/user-permissions-template.tsx +11 -14
  822. package/dist/accordion-B9MHG0cT.js.map +0 -1
  823. package/dist/action-menu-Dr8K-ghE.js +0 -284
  824. package/dist/action-menu-Dr8K-ghE.js.map +0 -1
  825. package/dist/ai-artifact-C58tQcBy.js +0 -1185
  826. package/dist/ai-artifact-C58tQcBy.js.map +0 -1
  827. package/dist/anchored-positioning-DPnKTvNs.js +0 -6
  828. package/dist/anchored-positioning-DPnKTvNs.js.map +0 -1
  829. package/dist/app-shell-B_IuNWOo.js +0 -321
  830. package/dist/app-shell-B_IuNWOo.js.map +0 -1
  831. package/dist/auth-DTkkshS8.js.map +0 -1
  832. package/dist/badge-xIiV_E7f.js.map +0 -1
  833. package/dist/base/sheet.js +0 -3
  834. package/dist/breadcrumbs-J-K2kl4c.js +0 -129
  835. package/dist/breadcrumbs-J-K2kl4c.js.map +0 -1
  836. package/dist/button-S2Cubiiz.js.map +0 -1
  837. package/dist/buttons-BedGfygC.js.map +0 -1
  838. package/dist/cascader-B1MiqkBq.js +0 -439
  839. package/dist/cascader-B1MiqkBq.js.map +0 -1
  840. package/dist/choice-inputs-zUgBZfE4.js.map +0 -1
  841. package/dist/code-block-BzmM9Eig.js.map +0 -1
  842. package/dist/collapsible-BkAI_XD4.js +0 -81
  843. package/dist/collapsible-BkAI_XD4.js.map +0 -1
  844. package/dist/combobox-BEx0vJgF.js +0 -362
  845. package/dist/combobox-BEx0vJgF.js.map +0 -1
  846. package/dist/combobox-BwzoXFSG.js +0 -884
  847. package/dist/combobox-BwzoXFSG.js.map +0 -1
  848. package/dist/command-CrlPIL6m.js +0 -425
  849. package/dist/command-CrlPIL6m.js.map +0 -1
  850. package/dist/comments-Dmpp0YIc.js +0 -1169
  851. package/dist/comments-Dmpp0YIc.js.map +0 -1
  852. package/dist/components/base/buttons/tooltip-button.d.ts +0 -7
  853. package/dist/components/base/display/content-block.d.ts +0 -75
  854. package/dist/components/base/display/content-block.strings.d.ts +0 -5
  855. package/dist/components/base/sheet/index.d.ts +0 -29
  856. package/dist/components/blocks/ai/use-copy-feedback.d.ts +0 -6
  857. package/dist/components/blocks/data-display/metadata/index.d.ts +0 -30
  858. package/dist/components/features/mentions/utils/split-html-by-mentions.d.ts +0 -16
  859. package/dist/components/features/resource/resource.strings.d.ts +0 -12
  860. package/dist/components/features/rich-text-editor/partials/rich-text-editor-fallback.d.ts +0 -8
  861. package/dist/components/features/sync/index.d.ts +0 -26
  862. package/dist/components/features/sync/sync-range-dialog-form.d.ts +0 -5
  863. package/dist/components/features/sync/sync.strings.d.ts +0 -18
  864. package/dist/components/features/sync/sync.types.d.ts +0 -44
  865. package/dist/components/layout/page/partials/page-actions.d.ts +0 -3
  866. package/dist/components/ui/slot.d.ts +0 -6
  867. package/dist/containers-CIxwbZt5.js.map +0 -1
  868. package/dist/data-display-BdgCAw8T.js.map +0 -1
  869. package/dist/date-Cq8ioE4o.js +0 -144
  870. package/dist/date-Cq8ioE4o.js.map +0 -1
  871. package/dist/date-picker-RlIzKom_.js +0 -1551
  872. package/dist/date-picker-RlIzKom_.js.map +0 -1
  873. package/dist/date-pickers-DY-CpXS1.js +0 -179
  874. package/dist/date-pickers-DY-CpXS1.js.map +0 -1
  875. package/dist/display-KsZLw9Ov.js.map +0 -1
  876. package/dist/features/sync.js +0 -142
  877. package/dist/features/sync.js.map +0 -1
  878. package/dist/feedback-Dm4izqFn.js +0 -240
  879. package/dist/feedback-Dm4izqFn.js.map +0 -1
  880. package/dist/field-affordance-recipes-DWcNcOjh.js.map +0 -1
  881. package/dist/field-state-recipes-BVA2CWHo.js +0 -12
  882. package/dist/field-state-recipes-BVA2CWHo.js.map +0 -1
  883. package/dist/filters-DzgSJpMK.js +0 -2257
  884. package/dist/filters-DzgSJpMK.js.map +0 -1
  885. package/dist/focus-recipes-B653VaLq.js.map +0 -1
  886. package/dist/form-field-BriWAXyg.js +0 -63
  887. package/dist/form-field-BriWAXyg.js.map +0 -1
  888. package/dist/forms-C0RGnJTe.js.map +0 -1
  889. package/dist/forms-numeric-DIhghX1Q.js +0 -910
  890. package/dist/forms-numeric-DIhghX1Q.js.map +0 -1
  891. package/dist/header-DMMxG__r.js.map +0 -1
  892. package/dist/hooks-DB6CJ4MR.js.map +0 -1
  893. package/dist/http-D_6rOnzU.js.map +0 -1
  894. package/dist/item-DjCcM18E.js +0 -277
  895. package/dist/item-DjCcM18E.js.map +0 -1
  896. package/dist/layout.types-Cn7aUzJp.js +0 -20
  897. package/dist/layout.types-Cn7aUzJp.js.map +0 -1
  898. package/dist/media-gallery-C-vChPmE.js +0 -203
  899. package/dist/media-gallery-C-vChPmE.js.map +0 -1
  900. package/dist/mentions-0_4nWuI-.js +0 -570
  901. package/dist/mentions-0_4nWuI-.js.map +0 -1
  902. package/dist/message-g8p7eVtN.js +0 -128
  903. package/dist/message-g8p7eVtN.js.map +0 -1
  904. package/dist/metadata-list-C3MkU-Om.js.map +0 -1
  905. package/dist/motion-recipes-DitYv6P2.js.map +0 -1
  906. package/dist/navigation-C90-oQFq.js +0 -255
  907. package/dist/navigation-C90-oQFq.js.map +0 -1
  908. package/dist/navigation-DaRjthVk.js +0 -288
  909. package/dist/navigation-DaRjthVk.js.map +0 -1
  910. package/dist/number-CRU3kGuk.js +0 -354
  911. package/dist/number-CRU3kGuk.js.map +0 -1
  912. package/dist/overlays-BSgCtM2v.js.map +0 -1
  913. package/dist/page-DUUKDAjo.js +0 -331
  914. package/dist/page-DUUKDAjo.js.map +0 -1
  915. package/dist/pagination-CgCjElfu.js.map +0 -1
  916. package/dist/popover-B85RenIl.js +0 -201
  917. package/dist/popover-B85RenIl.js.map +0 -1
  918. package/dist/primitives-ByWgGUgt.js +0 -380
  919. package/dist/primitives-ByWgGUgt.js.map +0 -1
  920. package/dist/receipt-tOc7B3hw.js +0 -116
  921. package/dist/receipt-tOc7B3hw.js.map +0 -1
  922. package/dist/rich-text-Dth5E882.js +0 -78
  923. package/dist/rich-text-Dth5E882.js.map +0 -1
  924. package/dist/rich-text-editor-C1fOjBTd.js +0 -1195
  925. package/dist/rich-text-editor-C1fOjBTd.js.map +0 -1
  926. package/dist/rich-text-editor-toolbar-laT3tpBT.js +0 -98
  927. package/dist/rich-text-editor-toolbar-laT3tpBT.js.map +0 -1
  928. package/dist/sanitize-html-DsQmI48u.js +0 -92
  929. package/dist/sanitize-html-DsQmI48u.js.map +0 -1
  930. package/dist/separator-Ct_WSWTJ.js.map +0 -1
  931. package/dist/settings-Bar5wiSo.js +0 -167
  932. package/dist/settings-Bar5wiSo.js.map +0 -1
  933. package/dist/sheet-BGPERY55.js +0 -250
  934. package/dist/sheet-BGPERY55.js.map +0 -1
  935. package/dist/sidebar-D-JYMMbY.js +0 -686
  936. package/dist/sidebar-D-JYMMbY.js.map +0 -1
  937. package/dist/sidebar-f9gRWXIR.js.map +0 -1
  938. package/dist/skeleton-BapcJd9C.js.map +0 -1
  939. package/dist/slot-CLF9kLrS.js +0 -16
  940. package/dist/slot-CLF9kLrS.js.map +0 -1
  941. package/dist/smart-card-CW0hjetE.js.map +0 -1
  942. package/dist/surface-recipes-BKRVW8Os.js.map +0 -1
  943. package/dist/table-B4TE7iOV.js +0 -175
  944. package/dist/table-B4TE7iOV.js.map +0 -1
  945. package/dist/table-CFOWY9pQ.js +0 -1536
  946. package/dist/table-CFOWY9pQ.js.map +0 -1
  947. package/dist/tabs-e7ko9S2o.js +0 -191
  948. package/dist/tabs-e7ko9S2o.js.map +0 -1
  949. package/dist/text-inputs-B1culiSK.js.map +0 -1
  950. package/dist/timelines-D3Sl9ueq.js +0 -458
  951. package/dist/timelines-D3Sl9ueq.js.map +0 -1
  952. package/dist/tooltip-8wz5S_Zr.js +0 -113
  953. package/dist/tooltip-8wz5S_Zr.js.map +0 -1
  954. package/dist/tree-CzUJHnFs.js.map +0 -1
  955. package/dist/typography-BQnine1k.js.map +0 -1
  956. package/dist/ui-provider-C-74NVLc.js.map +0 -1
  957. package/dist/upload-BOW6U2tI.js +0 -855
  958. package/dist/upload-BOW6U2tI.js.map +0 -1
  959. package/dist/upload-queue-qUXn1ykN.js +0 -409
  960. package/dist/upload-queue-qUXn1ykN.js.map +0 -1
  961. package/dist/usage-card-BeSLY0i0.js.map +0 -1
  962. package/dist/utils-B6kKb8jB.js.map +0 -1
  963. package/dist/value-inputs-skdVB2zh.js +0 -980
  964. package/dist/value-inputs-skdVB2zh.js.map +0 -1
  965. package/dist/value-typography-uAmWUAL1.js +0 -116
  966. package/dist/value-typography-uAmWUAL1.js.map +0 -1
  967. package/dist/workspace-DHeHv0qw.js +0 -411
  968. package/dist/workspace-DHeHv0qw.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","Text","focusRecipes","TextButton","Stack","toneRecipes","markRecipes","kbdRecipe","surfaceDividerRecipes","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","formatGlobalSearchResultsCount","strings","count","useGlobalSearch","activeTab","setActiveTabState","useState","storedActiveIdx","setActiveIdx","query","grouped","useMemo","buckets","r","results","tabCounts","counts","k","v","visibleGrouped","sub","flat","activeIdx","activeIdxRef","useRef","flatRef","tab","idx","id","item","onResultSelect","onClose","GlobalSearchEmptyState","hint","Search","Shortcut","keys","label","GlobalSearchFooter","className","navigateLabel","openLabel","closeLabel","trailing","GlobalSearchGroupHeading","Icon","action","GlobalSearchIdleState","sections","section","fallbackLabels","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","i","GlobalSearchResultRow","ThumbIcon","result","bg","av","liftNeutralTile","active","optionId","onSelect","pieces","m","tag","p","ArrowRight","GlobalSearchTabs","tabs","GlobalSearch","stringsProp","useStrings","search","typedLength","isEmpty","minQueryLength","isIdle","listboxBaseId","showResults","flatIndexById","index","optionIdFor","groupKeys","listboxIdFor","groupIndex","activeOptionId","listboxIds","resultsCountText","keyboardMoves","setKeyboardMoves","pendingKeyboardMove","handleKeyDown","event","option","resolvedTabs","key","groupLabels","slots","onQueryChange","idleSections","interpolateString","groupKey","items","isActive","ctx","GlobalSearchDialog","searchProps","selectResult","useCallback","closeOnSelect","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/** Heading for the first idle section when it supplies no `label`. */\n\tidleRecent: string;\n\t/** Heading for every later idle section that supplies no `label`. */\n\tidleSuggestions: string;\n\t/**\n\t * Shown when something was typed but the query is still shorter than\n\t * `minQueryLength` and there is no idle content. `{{count}}` is the threshold.\n\t */\n\tidleHint?: 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, as a `{{count}}` template. */\n\tresultsCount: string;\n\t/**\n\t * Builds the results count from the number, for languages whose plural forms\n\t * a single template cannot express. Wins over `resultsCount` when supplied.\n\t */\n\tformatResultsCount?: (count: number) => 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\tidleHint: 'Type at least {{count}} characters to search.',\n\ttabAll: 'All',\n\tfooterNavigate: 'navigate',\n\tfooterOpen: 'open',\n\tfooterClose: 'close',\n\tresultsCount: '{{count}} results',\n\tseeAll: 'See all',\n};\n\n/**\n * Count copy for the footer and the status announcement. The untouched English\n * template reads \"1 result\" for a single hit; an overridden template is used\n * as written, and `formatResultsCount` takes over entirely.\n */\nexport function formatGlobalSearchResultsCount(strings: GlobalSearchStrings, count: number): string {\n\tif (strings.formatResultsCount) return strings.formatResultsCount(count);\n\tconst template = count === 1 && strings.resultsCount === defaultGlobalSearchStrings.resultsCount\n\t\t? '{{count}} result'\n\t\t: strings.resultsCount;\n\treturn template.replace(/\\{\\{\\s*count\\s*\\}\\}/g, String(count));\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 [storedActiveIdx, 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\t// The stored index can outlive the list it pointed into: an arrow key\n\t// pressed before results arrive, or a list that shrinks. Reading it clamped\n\t// keeps the highlight on a real row without another render.\n\tconst activeIdx = Math.min(Math.max(storedActiveIdx, 0), Math.max(flat.length - 1, 0));\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(Math.min(activeIdxRef.current + 1, Math.max(flatRef.current.length - 1, 0)));\n\t\t} else if (e.key === 'ArrowUp') {\n\t\t\te.preventDefault();\n\t\t\tsetActiveIdx(Math.max(activeIdxRef.current - 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\t/** Headings for sections that supply no `label`: `recent` for the first section, `suggestions` for the rest. */\n\tfallbackLabels?: { recent?: string; suggestions?: string };\n}\n\nexport function GlobalSearchIdleState({\n\tsections,\n\tfallbackIcons,\n\tfallbackLabels,\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 ?? (idx === 0 ? fallbackLabels?.recent : fallbackLabels?.suggestions)}\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\t/** Merged onto the outermost node. */\n\tclassName?: 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, className },\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, className)}\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(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\tformatGlobalSearchResultsCount,\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/**\n\t * Characters (without surrounding whitespace) a query needs before an empty\n\t * result list reads as \"no results\". Shorter queries show the idle content,\n\t * or a hint when there is none. Default: `2`.\n\t */\n\tminQueryLength?: number;\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\tminQueryLength = 2,\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 typedLength = query.trim().length;\n\tconst isEmpty = !loading && typedLength >= minQueryLength && results.length === 0;\n\tconst isIdle = !loading && typedLength < minQueryLength;\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\tconst listboxIds = groupKeys.map((_, groupIndex) => listboxIdFor(groupIndex)).join(' ');\n\tconst resultsCountText = showResults ? formatGlobalSearchResultsCount(strings, results.length) : '';\n\n\t// `aria-activedescendant` moves the highlight without moving focus, so the\n\t// browser never scrolls to it. Arrow keys bring the row into view; pointer\n\t// hover does not, because scrolling under the pointer would move the rows.\n\tconst [keyboardMoves, setKeyboardMoves] = React.useState(0);\n\tconst pendingKeyboardMove = React.useRef(false);\n\tconst handleKeyDown = (event: React.KeyboardEvent) => {\n\t\tif (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n\t\t\tpendingKeyboardMove.current = true;\n\t\t\tsetKeyboardMoves((count) => count + 1);\n\t\t}\n\t\tsearch.onKeyDown(event);\n\t};\n\tReact.useEffect(() => {\n\t\tif (!pendingKeyboardMove.current) return;\n\t\tpendingKeyboardMove.current = false;\n\t\tconst option = activeOptionId ? document.getElementById(activeOptionId) : null;\n\t\tif (typeof option?.scrollIntoView === 'function') option.scrollIntoView({ block: 'nearest' });\n\t}, [keyboardMoves, activeOptionId]);\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{typeof slots?.input === 'function' ? slots.input({\n\t\t\t\tquery,\n\t\t\t\tonQueryChange,\n\t\t\t\tonKeyDown: handleKeyDown,\n\t\t\t\texpanded: showResults,\n\t\t\t\tcontrols: listboxIds,\n\t\t\t\tactiveDescendant: activeOptionId,\n\t\t\t\tloading,\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={handleKeyDown}\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={listboxIds}\n\t\t\t\t\tactiveDescendant={activeOptionId}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{/* One region that stays mounted, so loading and then the number of\n\t\t\t results are announced; a region that mounts with its text is not. */}\n\t\t\t<span role=\"status\" aria-live=\"polite\" className=\"global-search--status sr-only\">\n\t\t\t\t{loading ? strings.loading : resultsCountText}\n\t\t\t</span>\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\n\t\t\t\t\t\t\tsections={idleSections}\n\t\t\t\t\t\t\tfallbackLabels={{ recent: strings.idleRecent, suggestions: strings.idleSuggestions }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : typedLength > 0 && results.length === 0 && strings.idleHint ? (\n\t\t\t\t\t\t<div className=\"global-search--hint flex items-center justify-center px-row-x py-space-xl\">\n\t\t\t\t\t\t\t<Text type=\"secondary\">\n\t\t\t\t\t\t\t\t{interpolateString(strings.idleHint, { count: minQueryLength })}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t</div>\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\">\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{resultsCountText}\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 { useCallback } 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';\nimport type { GlobalSearchResult } from './global-search.types';\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/**\n\t * Closes the palette after a result is chosen, once `onResultSelect` has run.\n\t * Default: `true`. Set `false` to keep it open, for example to pick several\n\t * results in a row.\n\t */\n\tcloseOnSelect?: boolean;\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\tcloseOnSelect = true,\n\tonResultSelect,\n\t...searchProps\n}: GlobalSearchDialogProps<TGroup>) {\n\tconst strings = useStrings(defaultGlobalSearchStrings, stringsProp);\n\tconst selectResult = useCallback((result: GlobalSearchResult<TGroup>) => {\n\t\tonResultSelect?.(result);\n\t\tif (closeOnSelect) onOpenChange(false);\n\t}, [closeOnSelect, onOpenChange, onResultSelect]);\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\t// No `onClose`: the dialog owns Escape, so one press reports one close.\n\t\t\t\tonResultSelect={selectResult}\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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"}