@alfadocs/ui-kit-debug 1.57.0 → 1.58.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 (277) hide show
  1. package/dist/_chunks/{address-fields-BfjxS05Z.js → address-fields-CJtu7LQU.js} +2 -2
  2. package/dist/_chunks/{address-fields-BfjxS05Z.js.map → address-fields-CJtu7LQU.js.map} +1 -1
  3. package/dist/_chunks/{alia-sidebar-BBKBJCv6.js → alia-sidebar-dybRpWml.js} +2 -2
  4. package/dist/_chunks/{alia-sidebar-BBKBJCv6.js.map → alia-sidebar-dybRpWml.js.map} +1 -1
  5. package/dist/_chunks/{anamnesis-summary-rows-CCQ62mMN.js → anamnesis-summary-rows-M-FUkw9p.js} +3 -3
  6. package/dist/_chunks/{anamnesis-summary-rows-CCQ62mMN.js.map → anamnesis-summary-rows-M-FUkw9p.js.map} +1 -1
  7. package/dist/_chunks/{app-frame-B-0O9CrU.js → app-frame-CqmDh2v5.js} +2 -2
  8. package/dist/_chunks/{app-frame-B-0O9CrU.js.map → app-frame-CqmDh2v5.js.map} +1 -1
  9. package/dist/_chunks/{balance-badge-cell-CII3SDmR.js → balance-badge-cell-CGoJZlKf.js} +3 -3
  10. package/dist/_chunks/{balance-badge-cell-CII3SDmR.js.map → balance-badge-cell-CGoJZlKf.js.map} +1 -1
  11. package/dist/_chunks/{booking-81WnKDsH.js → booking-CiFSAMR-.js} +2 -2
  12. package/dist/_chunks/{booking-81WnKDsH.js.map → booking-CiFSAMR-.js.map} +1 -1
  13. package/dist/_chunks/{calendar-workspace-D5-k_9zE.js → calendar-workspace-DNHzjG7O.js} +12 -12
  14. package/dist/_chunks/calendar-workspace-DNHzjG7O.js.map +1 -0
  15. package/dist/_chunks/{chart-DQ5GxqgT.js → chart-ZMkX-Gqy.js} +28 -28
  16. package/dist/_chunks/{chart-DQ5GxqgT.js.map → chart-ZMkX-Gqy.js.map} +1 -1
  17. package/dist/_chunks/{city-input-BC_nYINn.js → city-input-3J3bz9EO.js} +2 -2
  18. package/dist/_chunks/{city-input-BC_nYINn.js.map → city-input-3J3bz9EO.js.map} +1 -1
  19. package/dist/_chunks/{control-room-rail-Tx2jW250.js → control-room-rail-CJ85HkS2.js} +2 -2
  20. package/dist/_chunks/{control-room-rail-Tx2jW250.js.map → control-room-rail-CJ85HkS2.js.map} +1 -1
  21. package/dist/_chunks/dashboard-grid-Cs7cJAsA.js +933 -0
  22. package/dist/_chunks/dashboard-grid-Cs7cJAsA.js.map +1 -0
  23. package/dist/_chunks/{data-table-fAMTeAjM.js → data-table-Yn5xiGzs.js} +2 -2
  24. package/dist/_chunks/{data-table-fAMTeAjM.js.map → data-table-Yn5xiGzs.js.map} +1 -1
  25. package/dist/_chunks/{face-scheme-BicuUA2K.js → face-scheme-DSKDdIsb.js} +2 -2
  26. package/dist/_chunks/{face-scheme-BicuUA2K.js.map → face-scheme-DSKDdIsb.js.map} +1 -1
  27. package/dist/_chunks/{file-manager-CFsL1KVt.js → file-manager-DEtkQR1F.js} +3 -3
  28. package/dist/_chunks/{file-manager-CFsL1KVt.js.map → file-manager-DEtkQR1F.js.map} +1 -1
  29. package/dist/_chunks/{forgot-password-form-DEx-M_QR.js → forgot-password-form-CEqOmNuX.js} +2 -2
  30. package/dist/_chunks/{forgot-password-form-DEx-M_QR.js.map → forgot-password-form-CEqOmNuX.js.map} +1 -1
  31. package/dist/_chunks/{heatmap-BEeOThkW.js → heatmap-DiyOSQk9.js} +2 -2
  32. package/dist/_chunks/{heatmap-BEeOThkW.js.map → heatmap-DiyOSQk9.js.map} +1 -1
  33. package/dist/_chunks/{help-me-write-templates-BUoYGo6f.js → help-me-write-templates-CM1p6qkm.js} +2 -2
  34. package/dist/_chunks/{help-me-write-templates-BUoYGo6f.js.map → help-me-write-templates-CM1p6qkm.js.map} +1 -1
  35. package/dist/_chunks/{icon-picker-C86lQTIA.js → icon-picker-rOFTawXk.js} +2 -2
  36. package/dist/_chunks/{icon-picker-C86lQTIA.js.map → icon-picker-rOFTawXk.js.map} +1 -1
  37. package/dist/_chunks/{link-cell-renderer-CxW_oLa5.js → link-cell-renderer-C1wOyxDF.js} +2 -2
  38. package/dist/_chunks/{link-cell-renderer-CxW_oLa5.js.map → link-cell-renderer-C1wOyxDF.js.map} +1 -1
  39. package/dist/_chunks/{list-RRN2TJ_7.js → list-CNnn7DOD.js} +75 -73
  40. package/dist/_chunks/list-CNnn7DOD.js.map +1 -0
  41. package/dist/_chunks/{login-dev-card-DmZ1B0lB.js → login-dev-card-CIim81VB.js} +2 -2
  42. package/dist/_chunks/{login-dev-card-DmZ1B0lB.js.map → login-dev-card-CIim81VB.js.map} +1 -1
  43. package/dist/_chunks/marketplace-app-shell-CSDmGLPW.js +613 -0
  44. package/dist/_chunks/marketplace-app-shell-CSDmGLPW.js.map +1 -0
  45. package/dist/_chunks/{message-tray-QKQutwxj.js → message-tray-DmU0poD7.js} +2 -2
  46. package/dist/_chunks/{message-tray-QKQutwxj.js.map → message-tray-DmU0poD7.js.map} +1 -1
  47. package/dist/_chunks/navigation-dismiss-B1mcW1CT.js +9 -0
  48. package/dist/_chunks/navigation-dismiss-B1mcW1CT.js.map +1 -0
  49. package/dist/_chunks/{notes-panel-Cm4pttpl.js → notes-panel-DHLHsxpW.js} +2 -2
  50. package/dist/_chunks/{notes-panel-Cm4pttpl.js.map → notes-panel-DHLHsxpW.js.map} +1 -1
  51. package/dist/_chunks/{notification-tray-C5VtbGjd.js → notification-tray-DPU-Xg0i.js} +2 -2
  52. package/dist/_chunks/{notification-tray-C5VtbGjd.js.map → notification-tray-DPU-Xg0i.js.map} +1 -1
  53. package/dist/_chunks/{panel-subview-BT-Apwgb.js → panel-subview-D4o6ar6_.js} +61 -47
  54. package/dist/_chunks/panel-subview-D4o6ar6_.js.map +1 -0
  55. package/dist/_chunks/{patient-details-99kEdtc5.js → patient-details-BCaVuaXz.js} +2 -2
  56. package/dist/_chunks/{patient-details-99kEdtc5.js.map → patient-details-BCaVuaXz.js.map} +1 -1
  57. package/dist/_chunks/{patient-field-row-DkxY13T6.js → patient-field-row-jcRSTrp4.js} +3 -3
  58. package/dist/_chunks/{patient-field-row-DkxY13T6.js.map → patient-field-row-jcRSTrp4.js.map} +1 -1
  59. package/dist/_chunks/{patient-summary-card-opdyfeW2.js → patient-summary-card-kQIfPQOE.js} +2 -2
  60. package/dist/_chunks/{patient-summary-card-opdyfeW2.js.map → patient-summary-card-kQIfPQOE.js.map} +1 -1
  61. package/dist/_chunks/{payment-automation-upsell-DiHovmUL.js → payment-automation-upsell-C4wHOxsp.js} +2 -2
  62. package/dist/_chunks/{payment-automation-upsell-DiHovmUL.js.map → payment-automation-upsell-C4wHOxsp.js.map} +1 -1
  63. package/dist/_chunks/{practice-results-CfRkjzsI.js → practice-results-D07wgCqV.js} +2 -2
  64. package/dist/_chunks/{practice-results-CfRkjzsI.js.map → practice-results-D07wgCqV.js.map} +1 -1
  65. package/dist/_chunks/{product-hub-panel-DlVRK7Ue.js → product-hub-panel-DCYX0rPG.js} +2 -2
  66. package/dist/_chunks/{product-hub-panel-DlVRK7Ue.js.map → product-hub-panel-DCYX0rPG.js.map} +1 -1
  67. package/dist/_chunks/{public-header.agent-BctevbuY.js → public-header.agent-C1SlVSYt.js} +2 -2
  68. package/dist/_chunks/{public-header.agent-BctevbuY.js.map → public-header.agent-C1SlVSYt.js.map} +1 -1
  69. package/dist/_chunks/{registration-form-BlTzYywa.js → registration-form-DrSR9Sjk.js} +3 -3
  70. package/dist/_chunks/{registration-form-BlTzYywa.js.map → registration-form-DrSR9Sjk.js.map} +1 -1
  71. package/dist/_chunks/{rich-text-editor-DTnNZ4Ff.js → rich-text-editor-UgXri8h6.js} +2 -2
  72. package/dist/_chunks/{rich-text-editor-DTnNZ4Ff.js.map → rich-text-editor-UgXri8h6.js.map} +1 -1
  73. package/dist/_chunks/{scroll-area-ZtFCv9K7.js → scroll-area-CY5SLYNw.js} +104 -74
  74. package/dist/_chunks/scroll-area-CY5SLYNw.js.map +1 -0
  75. package/dist/_chunks/{search-bar-DQJS0wJN.js → search-bar-mA4bPe3t.js} +294 -255
  76. package/dist/_chunks/search-bar-mA4bPe3t.js.map +1 -0
  77. package/dist/_chunks/{sheet-8qsiMoUI.js → sheet-Dtjk0CVv.js} +2 -2
  78. package/dist/_chunks/{sheet-8qsiMoUI.js.map → sheet-Dtjk0CVv.js.map} +1 -1
  79. package/dist/_chunks/sidebar-D4Wllqfz.js +2029 -0
  80. package/dist/_chunks/sidebar-D4Wllqfz.js.map +1 -0
  81. package/dist/_chunks/{signature-request-DRuYAG5I.js → signature-request-dAVgE0_5.js} +2 -2
  82. package/dist/_chunks/{signature-request-DRuYAG5I.js.map → signature-request-dAVgE0_5.js.map} +1 -1
  83. package/dist/_chunks/{signed-out-frame-AhMsNW1r.js → signed-out-frame-DOJpobp8.js} +2 -2
  84. package/dist/_chunks/{signed-out-frame-AhMsNW1r.js.map → signed-out-frame-DOJpobp8.js.map} +1 -1
  85. package/dist/_chunks/{state-backed-text-input-DECQy5aA.js → state-backed-text-input-Cgh4ms3p.js} +2 -2
  86. package/dist/_chunks/{state-backed-text-input-DECQy5aA.js.map → state-backed-text-input-Cgh4ms3p.js.map} +1 -1
  87. package/dist/_chunks/{task-editor-NkcopDna.js → task-editor-BflEZmcF.js} +5 -4
  88. package/dist/_chunks/task-editor-BflEZmcF.js.map +1 -0
  89. package/dist/_chunks/{tool-rail-Bwyuw_Ot.js → tool-rail-CTq1KwxW.js} +115 -114
  90. package/dist/_chunks/{tool-rail-Bwyuw_Ot.js.map → tool-rail-CTq1KwxW.js.map} +1 -1
  91. package/dist/_chunks/{use-appointment-details-read-CfFQNOF_.js → use-appointment-details-read-izwoXh-G.js} +6 -6
  92. package/dist/_chunks/{use-appointment-details-read-CfFQNOF_.js.map → use-appointment-details-read-izwoXh-G.js.map} +1 -1
  93. package/dist/_chunks/use-state-backed-input-DhRQo6gM.js +57 -0
  94. package/dist/_chunks/use-state-backed-input-DhRQo6gM.js.map +1 -0
  95. package/dist/_chunks/{voice-control-panel-BKbgb7FM.js → voice-control-panel-an-bpQfF.js} +2 -2
  96. package/dist/_chunks/{voice-control-panel-BKbgb7FM.js.map → voice-control-panel-an-bpQfF.js.map} +1 -1
  97. package/dist/_chunks/{widget-picker-rBA7MR5P.js → widget-picker-DlJOgYrZ.js} +80 -57
  98. package/dist/_chunks/widget-picker-DlJOgYrZ.js.map +1 -0
  99. package/dist/agent-catalog.json +2 -2
  100. package/dist/agent-i18n/en.json +1 -1
  101. package/dist/components/_shared/navigation-dismiss.d.ts +8 -0
  102. package/dist/components/_shared/navigation-dismiss.d.ts.map +1 -0
  103. package/dist/components/_shared/use-state-backed-input.d.ts +3 -2
  104. package/dist/components/_shared/use-state-backed-input.d.ts.map +1 -1
  105. package/dist/components/address-fields/index.js +1 -1
  106. package/dist/components/app-frame/index.js +1 -1
  107. package/dist/components/appointment-details-panel/index.js +1 -1
  108. package/dist/components/booking/index.js +1 -1
  109. package/dist/components/chart/chart.d.ts.map +1 -1
  110. package/dist/components/chart/index.js +1 -1
  111. package/dist/components/city-input/index.js +1 -1
  112. package/dist/components/control-room-rail/index.js +1 -1
  113. package/dist/components/dashboard-grid/dashboard-grid.d.ts +33 -8
  114. package/dist/components/dashboard-grid/dashboard-grid.d.ts.map +1 -1
  115. package/dist/components/dashboard-grid/index.js +1 -1
  116. package/dist/components/data-table/index.js +2 -2
  117. package/dist/components/face-scheme/index.js +1 -1
  118. package/dist/components/file-manager/index.js +1 -1
  119. package/dist/components/heatmap/index.js +1 -1
  120. package/dist/components/icon-picker/index.js +1 -1
  121. package/dist/components/list/index.js +1 -1
  122. package/dist/components/list/list.d.ts.map +1 -1
  123. package/dist/components/message-tray/index.js +1 -1
  124. package/dist/components/notes-panel/index.js +1 -1
  125. package/dist/components/notification-tray/index.js +1 -1
  126. package/dist/components/panel-subview/index.js +1 -1
  127. package/dist/components/panel-subview/panel-subview.d.ts.map +1 -1
  128. package/dist/components/patient-details/index.js +1 -1
  129. package/dist/components/patient-summary-card/index.js +1 -1
  130. package/dist/components/patient-table/index.js +1 -1
  131. package/dist/components/practice-results/index.js +1 -1
  132. package/dist/components/product-hub-tray/index.js +1 -1
  133. package/dist/components/public-header/index.js +1 -1
  134. package/dist/components/rich-text-editor/index.js +1 -1
  135. package/dist/components/scroll-area/index.js +1 -1
  136. package/dist/components/scroll-area/scroll-area.d.ts +6 -5
  137. package/dist/components/scroll-area/scroll-area.d.ts.map +1 -1
  138. package/dist/components/search-bar/index.js +1 -1
  139. package/dist/components/search-bar/search-bar.d.ts +1 -1
  140. package/dist/components/search-bar/search-bar.d.ts.map +1 -1
  141. package/dist/components/sheet/index.js +1 -1
  142. package/dist/components/sidebar/index.d.ts +1 -1
  143. package/dist/components/sidebar/index.d.ts.map +1 -1
  144. package/dist/components/sidebar/index.js +1 -1
  145. package/dist/components/sidebar/sidebar-move.d.ts +88 -0
  146. package/dist/components/sidebar/sidebar-move.d.ts.map +1 -0
  147. package/dist/components/sidebar/sidebar.d.ts +26 -1
  148. package/dist/components/sidebar/sidebar.d.ts.map +1 -1
  149. package/dist/components/task-editor/index.js +1 -1
  150. package/dist/components/task-editor/task-editor.d.ts.map +1 -1
  151. package/dist/components/tool-rail/index.js +1 -1
  152. package/dist/components/tool-rail/tool-rail.d.ts.map +1 -1
  153. package/dist/components/voice-control-panel/index.js +1 -1
  154. package/dist/components/widget-picker/index.js +1 -1
  155. package/dist/components/widget-picker/widget-picker.d.ts.map +1 -1
  156. package/dist/host-compat.css +2 -1
  157. package/dist/i18n/locales/ar.d.ts +10 -0
  158. package/dist/i18n/locales/ar.d.ts.map +1 -1
  159. package/dist/i18n/locales/ar.js +11 -1
  160. package/dist/i18n/locales/ar.js.map +1 -1
  161. package/dist/i18n/locales/de.d.ts +10 -0
  162. package/dist/i18n/locales/de.d.ts.map +1 -1
  163. package/dist/i18n/locales/de.js +11 -1
  164. package/dist/i18n/locales/de.js.map +1 -1
  165. package/dist/i18n/locales/el.d.ts +10 -0
  166. package/dist/i18n/locales/el.d.ts.map +1 -1
  167. package/dist/i18n/locales/el.js +11 -1
  168. package/dist/i18n/locales/el.js.map +1 -1
  169. package/dist/i18n/locales/en.d.ts +10 -0
  170. package/dist/i18n/locales/en.d.ts.map +1 -1
  171. package/dist/i18n/locales/en.js +11 -1
  172. package/dist/i18n/locales/en.js.map +1 -1
  173. package/dist/i18n/locales/es.d.ts +10 -0
  174. package/dist/i18n/locales/es.d.ts.map +1 -1
  175. package/dist/i18n/locales/es.js +11 -1
  176. package/dist/i18n/locales/es.js.map +1 -1
  177. package/dist/i18n/locales/fr.d.ts +10 -0
  178. package/dist/i18n/locales/fr.d.ts.map +1 -1
  179. package/dist/i18n/locales/fr.js +11 -1
  180. package/dist/i18n/locales/fr.js.map +1 -1
  181. package/dist/i18n/locales/hi.d.ts +10 -0
  182. package/dist/i18n/locales/hi.d.ts.map +1 -1
  183. package/dist/i18n/locales/hi.js +11 -1
  184. package/dist/i18n/locales/hi.js.map +1 -1
  185. package/dist/i18n/locales/it.d.ts +10 -0
  186. package/dist/i18n/locales/it.d.ts.map +1 -1
  187. package/dist/i18n/locales/it.js +11 -1
  188. package/dist/i18n/locales/it.js.map +1 -1
  189. package/dist/i18n/locales/ja.d.ts +10 -0
  190. package/dist/i18n/locales/ja.d.ts.map +1 -1
  191. package/dist/i18n/locales/ja.js +11 -1
  192. package/dist/i18n/locales/ja.js.map +1 -1
  193. package/dist/i18n/locales/nl.d.ts +10 -0
  194. package/dist/i18n/locales/nl.d.ts.map +1 -1
  195. package/dist/i18n/locales/nl.js +11 -1
  196. package/dist/i18n/locales/nl.js.map +1 -1
  197. package/dist/i18n/locales/pl.d.ts +10 -0
  198. package/dist/i18n/locales/pl.d.ts.map +1 -1
  199. package/dist/i18n/locales/pl.js +11 -1
  200. package/dist/i18n/locales/pl.js.map +1 -1
  201. package/dist/i18n/locales/pt.d.ts +10 -0
  202. package/dist/i18n/locales/pt.d.ts.map +1 -1
  203. package/dist/i18n/locales/pt.js +11 -1
  204. package/dist/i18n/locales/pt.js.map +1 -1
  205. package/dist/i18n/locales/ro.d.ts +10 -0
  206. package/dist/i18n/locales/ro.d.ts.map +1 -1
  207. package/dist/i18n/locales/ro.js +11 -1
  208. package/dist/i18n/locales/ro.js.map +1 -1
  209. package/dist/i18n/locales/ru.d.ts +10 -0
  210. package/dist/i18n/locales/ru.d.ts.map +1 -1
  211. package/dist/i18n/locales/ru.js +11 -1
  212. package/dist/i18n/locales/ru.js.map +1 -1
  213. package/dist/i18n/locales/sq.d.ts +10 -0
  214. package/dist/i18n/locales/sq.d.ts.map +1 -1
  215. package/dist/i18n/locales/sq.js +11 -1
  216. package/dist/i18n/locales/sq.js.map +1 -1
  217. package/dist/i18n/locales/sv.d.ts +10 -0
  218. package/dist/i18n/locales/sv.d.ts.map +1 -1
  219. package/dist/i18n/locales/sv.js +11 -1
  220. package/dist/i18n/locales/sv.js.map +1 -1
  221. package/dist/i18n/locales/tr.d.ts +10 -0
  222. package/dist/i18n/locales/tr.d.ts.map +1 -1
  223. package/dist/i18n/locales/tr.js +11 -1
  224. package/dist/i18n/locales/tr.js.map +1 -1
  225. package/dist/i18n/locales/zh.d.ts +10 -0
  226. package/dist/i18n/locales/zh.d.ts.map +1 -1
  227. package/dist/i18n/locales/zh.js +11 -1
  228. package/dist/i18n/locales/zh.js.map +1 -1
  229. package/dist/index.js +44 -44
  230. package/dist/locales/ar.json +11 -1
  231. package/dist/locales/de.json +11 -1
  232. package/dist/locales/el.json +11 -1
  233. package/dist/locales/en.json +11 -1
  234. package/dist/locales/es.json +11 -1
  235. package/dist/locales/fr.json +11 -1
  236. package/dist/locales/hi.json +11 -1
  237. package/dist/locales/it.json +11 -1
  238. package/dist/locales/ja.json +11 -1
  239. package/dist/locales/nl.json +11 -1
  240. package/dist/locales/pl.json +11 -1
  241. package/dist/locales/pt.json +11 -1
  242. package/dist/locales/ro.json +11 -1
  243. package/dist/locales/ru.json +11 -1
  244. package/dist/locales/sq.json +11 -1
  245. package/dist/locales/sv.json +11 -1
  246. package/dist/locales/tr.json +11 -1
  247. package/dist/locales/zh.json +11 -1
  248. package/dist/patterns/alia-assistant/index.js +1 -1
  249. package/dist/patterns/anamnesis/index.js +1 -1
  250. package/dist/patterns/calendar/index.js +1 -1
  251. package/dist/patterns/forgot-password-form/index.js +1 -1
  252. package/dist/patterns/help-me-write-templates/index.js +1 -1
  253. package/dist/patterns/login-form/index.js +1 -1
  254. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  255. package/dist/patterns/marketplace-app-shell/marketplace-app-shell.d.ts +34 -9
  256. package/dist/patterns/marketplace-app-shell/marketplace-app-shell.d.ts.map +1 -1
  257. package/dist/patterns/payment-automation-upsell/index.js +1 -1
  258. package/dist/patterns/registration-form/index.js +1 -1
  259. package/dist/patterns/signature-request/index.js +1 -1
  260. package/dist/patterns/signed-out-frame/index.js +1 -1
  261. package/dist/tokens.css +1 -1
  262. package/package.json +1 -1
  263. package/dist/_chunks/calendar-workspace-D5-k_9zE.js.map +0 -1
  264. package/dist/_chunks/dashboard-grid-DfEY2qci.js +0 -844
  265. package/dist/_chunks/dashboard-grid-DfEY2qci.js.map +0 -1
  266. package/dist/_chunks/list-RRN2TJ_7.js.map +0 -1
  267. package/dist/_chunks/marketplace-app-shell-BZcA9Z06.js +0 -555
  268. package/dist/_chunks/marketplace-app-shell-BZcA9Z06.js.map +0 -1
  269. package/dist/_chunks/panel-subview-BT-Apwgb.js.map +0 -1
  270. package/dist/_chunks/scroll-area-ZtFCv9K7.js.map +0 -1
  271. package/dist/_chunks/search-bar-DQJS0wJN.js.map +0 -1
  272. package/dist/_chunks/sidebar-DLsG2AIk.js +0 -1349
  273. package/dist/_chunks/sidebar-DLsG2AIk.js.map +0 -1
  274. package/dist/_chunks/task-editor-NkcopDna.js.map +0 -1
  275. package/dist/_chunks/use-state-backed-input-C7ESmxKB.js +0 -59
  276. package/dist/_chunks/use-state-backed-input-C7ESmxKB.js.map +0 -1
  277. package/dist/_chunks/widget-picker-rBA7MR5P.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"marketplace-app-shell-BZcA9Z06.js","sources":["../../src/brand/product-lockup/product-lockup.tsx","../../src/patterns/marketplace-app-shell/marketplace-app-shell.tsx"],"sourcesContent":["import { forwardRef, type ComponentPropsWithoutRef } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Trans, useTranslation } from 'react-i18next';\nimport { Logo } from '../../components/logo/logo';\nimport { AlfadocsLogoMark, AlfadocsLogoNeg } from '../logo-asset';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\n// Outer lockup row. ~4px logical gap between the wordmark and the product\n// name (`--spacing-xs`), centre-aligned so the name's cap height sits\n// against the wordmark's letterforms.\nconst lockup = cva('ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]');\n\n// The product name. Marketing serif (Fraunces, `--font-serif`) — permitted\n// here because this file lives under `src/brand/`, never in `src/components/`\n// or `src/patterns/` (constraint 10). Sized to ~95% of the wordmark height so\n// its cap height matches the logo letterforms across every size and theme\n// (the `--logo-size-*` tokens shift up in the accessible themes; the calc\n// keeps the name proportional for free).\nconst productName = cva(\n [\n 'ds:[font-family:var(--font-serif)]',\n 'ds:font-semibold',\n 'ds:leading-none',\n 'ds:tracking-[0.01em]',\n 'ds:whitespace-nowrap',\n // Forced-colors: drop the transparent text-fill and paint the label\n // as solid CanvasText so it never disappears under Windows HCM —\n // a gradient/transparent fill has no meaning there.\n 'ds:forced-colors:text-[CanvasText]',\n 'ds:forced-colors:[-webkit-text-fill-color:CanvasText]',\n ],\n {\n variants: {\n size: {\n sm: 'ds:text-[calc(var(--logo-size-sm)*0.95)]',\n md: 'ds:text-[calc(var(--logo-size-md)*0.95)]',\n lg: 'ds:text-[calc(var(--logo-size-lg)*0.95)]',\n xl: 'ds:text-[calc(var(--logo-size-xl)*0.95)]',\n },\n tone: {\n // Brand gradient filled into the glyphs via background-clip:text.\n // `--gradient-wordmark` rides the theme aliases, so it stays\n // AA-safe and adapts per theme on its own (and flattens to a solid\n // ink in the accessible / forced-colors blocks — see tokens).\n gradient: [\n 'ds:italic',\n 'ds:bg-[image:var(--gradient-wordmark)]',\n 'ds:bg-clip-text',\n 'ds:text-transparent',\n 'ds:[-webkit-text-fill-color:transparent]',\n ],\n // Monochrome: solid currentColor ink, upright, no gradient — for\n // print, single-colour work, and coloured chrome (e.g. app-shell\n // headers) where the lockup must ride the surrounding ink.\n solid: 'ds:text-current',\n },\n },\n defaultVariants: { size: 'md', tone: 'gradient' },\n },\n);\n\n// Maker lockup root. Sets a single `--lockup-unit` custom property to the\n// matching `--logo-size-*` token; every maker sub-element (mark, name, the\n// \"by Alfadocs\" tag) sizes off `var(--lockup-unit)`, so there's one per-size\n// source of truth that shifts up with the accessible themes for free.\n// `whitespace-nowrap` keeps \"[mark] Name by Alfadocs\" on one line.\nconst makerRoot = cva('ds:whitespace-nowrap', {\n variants: {\n size: {\n sm: 'ds:[--lockup-unit:var(--logo-size-sm)]',\n md: 'ds:[--lockup-unit:var(--logo-size-md)]',\n lg: 'ds:[--lockup-unit:var(--logo-size-lg)]',\n xl: 'ds:[--lockup-unit:var(--logo-size-xl)]',\n },\n },\n defaultVariants: { size: 'md' },\n});\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\ntype LockupSize = NonNullable<VariantProps<typeof productName>['size']>;\n\nexport type ProductLockupProps = {\n /**\n * The product name. Passed verbatim (product names are not translated).\n *\n * - `variant=\"standard\"` (default): renders as \"Alfadocs <name>\" with the\n * wordmark; accessible name is `Alfadocs <name>`.\n * - `variant=\"maker\"`: renders as \"[mark] <name> by Alfadocs\"; accessible\n * name is `<name> by Alfadocs`.\n */\n name: string;\n /**\n * Which lockup composition to use.\n *\n * - `'standard'` (default) — Alfadocs wordmark + product name (\"Alfadocs\n * Builders\"). Use for **internal** Alfadocs products (Alfadocs Builders,\n * Alfadocs API) where the product is part of the Alfadocs family.\n * - `'maker'` — \"<name> by Alfadocs\" with the four-pillar mark and the name\n * as the prominent element. Use for **external** marketplace extensions\n * (\"Scribe by Alfadocs\") where the extension's own name leads and\n * \"by Alfadocs\" is the maker attribution.\n */\n variant?: 'standard' | 'maker';\n /**\n * Render the name as a solid `--foreground` ink, upright (no gradient, no\n * italic), and pair it with the monochrome wordmark. Use for print,\n * single-colour reproductions, or any constrained context where the\n * gradient/serif treatment is inappropriate.\n */\n monochrome?: boolean;\n /**\n * Ink resolution. `'auto'` (default) uses the lockup's intended ink\n * (`--foreground` for monochrome). `'inherit'` makes the whole lockup ride\n * `currentColor` — use it with `monochrome` on a coloured brand surface (a\n * tinted header or split-login panel) so the wordmark + name both take the\n * surface's text colour rather than clashing with a fixed `--foreground`.\n */\n tone?: 'auto' | 'inherit';\n /** Lockup size. Drives both the wordmark and the name's cap height. */\n size?: LockupSize;\n className?: string;\n} & Omit<\n ComponentPropsWithoutRef<'span'>,\n 'role' | 'aria-label' | 'aria-hidden' | 'children' | 'className'\n>;\n\n/* ------------------------------------------------------------------ */\n/* ProductLockup */\n/* ------------------------------------------------------------------ */\n\n/**\n * Pairs a product name with the Alfadocs brand. Two compositions:\n *\n * - `variant=\"standard\"` (default) — the Alfadocs wordmark + product name\n * (\"Alfadocs Builders\"). For internal Alfadocs products. Exposed to\n * assistive tech as a single `img` named `Alfadocs <name>`.\n * - `variant=\"maker\"` — \"[mark] <name> by Alfadocs\". For external marketplace\n * extensions where the extension's name leads. Exposed as a single `img`\n * named `<name> by Alfadocs`.\n *\n * In both cases the inner wordmark/mark and the visible name are decorative so\n * the brand isn't announced twice. Every marketplace app should use this\n * rather than hand-rolling a wordmark + typed span.\n */\nexport const ProductLockup = forwardRef<HTMLSpanElement, ProductLockupProps>(\n (\n {\n name,\n variant = 'standard',\n monochrome = false,\n tone = 'auto',\n size = 'md',\n className,\n ...props\n },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n if (import.meta.env.DEV && !name.trim()) {\n console.warn(\n '[ProductLockup] `name` is empty — the lockup will render the bare wordmark with no product name. Pass the product name (e.g. \"Builders\").',\n );\n }\n\n if (variant === 'maker') {\n // Ink matrix mirrors the standard variant's tone/monochrome model:\n // - tone=\"inherit\": every element rides currentColor (no explicit ink),\n // for coloured surfaces.\n // - monochrome (tone auto): foreground ink, with the attribution muted.\n // - default (colour, tone auto): the name + mark take --primary; the\n // wordmark lettering stays --foreground; the attribution is muted.\n const inherit = tone === 'inherit';\n const markInk = inherit\n ? ''\n : monochrome\n ? 'ds:text-[color:var(--foreground)]'\n : 'ds:text-[color:var(--primary)]';\n const nameInk = inherit\n ? ''\n : monochrome\n ? 'ds:text-[color:var(--foreground)]'\n : 'ds:text-[color:var(--primary)]';\n const byInk = inherit ? '' : 'ds:text-[color:var(--muted-foreground)]';\n const letteringInk = inherit ? '' : 'ds:text-[color:var(--foreground)]';\n\n return (\n <span\n ref={ref}\n role=\"img\"\n aria-label={t('productLockup.makerLabel', { name: name.trim() })}\n className={makerRoot({ size, className })}\n data-component=\"product-lockup\"\n {...props}\n >\n {/* Pillar mark sized close to the app name (≈0.88 of the serif em),\n vertically centred on it. Inline (not flex) so the maker tag can\n use vertical-align. */}\n <AlfadocsLogoMark\n aria-hidden\n className={`ds:inline-block ds:align-middle ds:me-[var(--spacing-sm)] ds:h-[calc(var(--lockup-unit)*0.88)] ds:w-auto ds:forced-colors:text-[CanvasText] ${markInk}`}\n />\n <span\n aria-hidden\n className={`ds:align-middle ds:[font-family:var(--font-serif)] ds:font-semibold ds:italic ds:leading-none ds:tracking-[0.01em] ${nameInk} ds:text-[calc(var(--lockup-unit)*0.95)]`}\n >\n {name}\n </span>\n {/* Maker tag — superscript style, its top aligned to the app name's\n cap-height via vertical-align: text-top. */}\n <span\n aria-hidden\n className={`ds:align-text-top ds:ms-[var(--spacing-sm)] ds:inline-flex ds:items-baseline ds:gap-[var(--spacing-2xs)] ${byInk}`}\n >\n <Trans\n ns=\"ui\"\n t={t}\n i18nKey=\"productLockup.attribution\"\n components={{\n text: (\n <span className=\"ds:text-[calc(var(--lockup-unit)*0.4)] ds:leading-none\" />\n ),\n brand: (\n <AlfadocsLogoNeg\n aria-hidden\n viewBox=\"168 0 637 125\"\n className={`ds:h-[calc(var(--lockup-unit)*0.45)] ds:w-auto ds:forced-colors:text-[CanvasText] ${letteringInk}`}\n />\n ),\n }}\n />\n </span>\n </span>\n );\n }\n\n return (\n <span\n ref={ref}\n role=\"img\"\n aria-label={`Alfadocs ${name}`.trim()}\n className={lockup({ className })}\n data-component=\"product-lockup\"\n {...props}\n >\n <Logo\n variant={monochrome ? 'monochrome' : 'wordmark'}\n tone={tone}\n size={size}\n decorative\n />\n <span\n aria-hidden\n className={productName({\n size,\n tone: monochrome ? 'solid' : 'gradient',\n })}\n >\n {name}\n </span>\n </span>\n );\n },\n);\nProductLockup.displayName = 'ProductLockup';\n","/**\n * Marketplace App Shell — the standard chrome for an app built on top of\n * AlfaDocs (the kind a partner scaffolds with Claude Code, Lovable, etc.).\n *\n * It is a thin, opinionated composition of kit primitives: an `AppFrame` with\n * a branded `Header` (the maker `ProductLockup` — \"<Product> by Alfadocs\" —\n * rendered `monochrome` so it rides the header's ink; maker is the lockup\n * style for external marketplace extensions), a `Sidebar` for app\n * navigation, `HeaderSettings` (theme/locale/accessibility), and a bare-avatar\n * account menu (fullscreen + sign-out) matching the main app shell. An\n * optional `endSidebar` docks a tool rail (for example Alia) on the inline-end.\n * `ConnectWithAlfadocs` is the matching pre-auth screen, with the full-colour\n * maker lockup and `SignInWithAlfadocsButton`.\n *\n * Like `AliaSidebar`, this pattern ships a RUNTIME component (surfaced via\n * `src/patterns/index.ts` and the library bundle) because consuming apps mount\n * it in production rather than copying the source.\n *\n * Auth is intentionally decoupled: the shell takes the signed-in `user` and an\n * `onSignOut` callback as props, and `ConnectWithAlfadocs` takes a `status` +\n * `onConnect`. Wire them to `@alfadocs/auth/react`'s `useAlfadocsAuth()` in the\n * consuming app — the kit never touches OAuth or secrets (those live in the\n * server-side `@alfadocs/auth` BFF).\n *\n * All user-visible copy is consumer-provided (props) so each app localises in\n * its own i18n; the only kit-owned strings reuse existing translated `ui.*`\n * keys (sidebar label, skip link, menu button).\n */\nimport { forwardRef, useState, type MouseEvent, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { cva } from 'class-variance-authority';\nimport { LogOut, Maximize2 } from 'lucide-react';\n\nimport { AppFrame } from '../../components/app-frame';\nimport { Avatar } from '../../components/avatar';\nimport { Alert } from '../../components/alert';\nimport { Card } from '../../components/card';\nimport { DropdownMenu } from '../../components/dropdown-menu';\nimport { TabBar } from '../../components/tab-bar';\nimport {\n Header,\n HeaderBrand,\n HeaderCenter,\n HeaderEnd,\n HeaderMenuButton,\n HeaderSkipLink,\n HeaderStart,\n} from '../../components/header';\nimport { HeaderSettings } from '../../components/header-settings';\nimport { ProductLockup } from '../../brand/product-lockup';\nimport { SignInWithAlfadocsButton } from '../../components/sign-in-with-alfadocs-button';\nimport {\n Sidebar,\n SidebarBody,\n SidebarCollapseTrigger,\n SidebarHeader,\n SidebarItem,\n SidebarItemBadge,\n SidebarItemIcon,\n SidebarItemLabel,\n type SidebarMode,\n} from '../../components/sidebar';\nimport { ThemeRoot } from '../../components/theme-root';\nimport { TooltipProvider } from '../../components/tooltip';\nimport { useTheme } from '../../hooks/use-theme';\n\n/* ------------------------------------------------------------------ */\n/* Public API */\n/* ------------------------------------------------------------------ */\n\nexport interface MarketplaceNavItem {\n id: string;\n /** Pre-translated label — apps localise their own nav copy. */\n label: string;\n href: string;\n /** Optional leading icon (a lucide-react element or equivalent). */\n icon?: ReactNode;\n /** Optional unseen-item count rendered as a pill badge. */\n badgeCount?: number;\n /** Mark the item as the current page (`aria-current='page'`). */\n isActive?: boolean;\n /**\n * Optional click handler threaded onto the nav link's `<a>`. The lightweight\n * alternative to `renderLink`: intercept a same-origin click (call\n * `event.preventDefault()`) and route client-side without a full page load —\n * no router `<Link>` needed. Applies to both the standalone sidebar item and\n * the embedded tab. When `renderLink` is supplied it's handed through to the\n * consumer's link element instead.\n */\n onClick?: (event: MouseEvent<HTMLAnchorElement>) => void;\n}\n\n/**\n * Props the shell hands to `renderLink` for each nav item. The consumer returns\n * their router's `<Link to={href}>` carrying the same `className` (the kit's\n * active styling) and `aria-current` (`'page'` on the active item) so a tab /\n * sidebar-item click is a client-side route change, not a full page reload.\n */\nexport interface MarketplaceRenderLinkProps {\n /** The item's destination — feed it to your router's `to` / `href`. */\n href: string;\n /** The kit's classes — apply verbatim to the link element. */\n className?: string;\n /** Icon + label + badge — render as the link's children. */\n children: ReactNode;\n /** `'page'` on the active item, otherwise omitted — forward to the link. */\n 'aria-current'?: 'page';\n /**\n * The item's stable id, as the agent / automation DOM hook. Spread it onto\n * your router link so the item stays addressable by `[data-tab-id]` — see\n * PRS §26 §6. Only supplied on the bottom-tab-bar path.\n */\n 'data-tab-id'?: string;\n}\n\n/**\n * Render a nav item through the consumer's router instead of the kit's own\n * `<a>`. Returned by the consumer; the shell forwards `href`, the kit's\n * `className`, the item children, and `aria-current` so the active styling and\n * the `aria-current=\"page\"` marker survive a client-side route change.\n */\nexport type MarketplaceRenderLink = (\n props: MarketplaceRenderLinkProps,\n) => ReactNode;\n\nexport interface MarketplaceAppUser {\n /** Display name — drives the avatar initials + the account-menu header. */\n name: string;\n /** Optional email shown under the name in the account menu. */\n email?: string;\n /** Optional avatar image URL. */\n avatarSrc?: string;\n}\n\nexport interface MarketplaceAppShellLabels {\n /** Accessible name for the account-menu trigger, e.g. \"Account menu\". */\n accountMenu: string;\n /** The sign-out menu item, e.g. \"Sign out\". */\n signOut: string;\n /**\n * Optional fullscreen menu item label, e.g. \"Toggle fullscreen\". The item\n * renders whenever `onToggleFullscreen` is supplied; when this label is\n * omitted it falls back to the translated `ui.*` \"Toggle fullscreen\" string.\n */\n fullscreen?: string;\n}\n\nexport interface MarketplaceAppShellProps {\n /** Extension name — renders as the maker lockup \"<productName> by Alfadocs\". */\n productName: string;\n /** Link target for the brand lockup. Default `'/'`. */\n productHref?: string;\n /** Sidebar nav items, in order. */\n nav: MarketplaceNavItem[];\n /**\n * Render nav items (and the brand lockup) through the consumer's router so a\n * tab / item click is a client-side route change with **no full-page reload\n * or session flash**. Wire it to your router's `<Link>`:\n *\n * ```tsx\n * import { Link } from '@tanstack/react-router';\n * <MarketplaceAppShell\n * nav={nav}\n * renderLink={({ href, className, children, ...rest }) => (\n * <Link to={href} className={className} {...rest}>{children}</Link>\n * )}\n * />\n * ```\n *\n * Threaded to the standalone sidebar items, the embedded top tab strip, and\n * the brand lockup. The kit forwards the same `className` + `aria-current` so\n * the active styling and the `aria-current=\"page\"` marker survive in both\n * modes. Omit it to render the plain `<a href>` exactly as before — non-routed\n * consumers are byte-for-byte unaffected. A per-item `onClick` (a\n * click-interceptor shim) is the lighter alternative when you don't want to\n * thread a router `<Link>`.\n */\n renderLink?: MarketplaceRenderLink;\n /** The signed-in user shown in the account menu. */\n user: MarketplaceAppUser;\n /** Consumer-localised chrome labels owned by the shell. */\n labels: MarketplaceAppShellLabels;\n /** Fires when the user picks \"Sign out\". Wire to `useAlfadocsAuth().signOut`. */\n onSignOut?: () => void;\n /** Fires when the user toggles fullscreen. Omit to hide the fullscreen item. */\n onToggleFullscreen?: () => void;\n /**\n * Force the sidebar into a specific mode. Apps typically flip to `'overlay'`\n * on narrow viewports and leave this undefined elsewhere (defaults to\n * `'expanded'`).\n */\n sidebarState?: SidebarMode;\n /**\n * Render a collapse/expand toggle in the sidebar header, letting the user\n * shrink the standalone sidebar to an icon rail. The chosen mode persists\n * per-user (the underlying `Sidebar` stores it) and survives reloads. Opt-in\n * so existing consumers are unaffected; ignored when `sidebarState` forces a\n * mode or in the `'embedded'` variant (no sidebar). @default false\n */\n collapsibleSidebar?: boolean;\n /** Override the accessible name of the `<main>` landmark. */\n mainAriaLabel?: string;\n /**\n * Chrome variant. `'standalone'` (default) renders the full shell — branded\n * Header, Sidebar, and account menu. `'embedded'` is for apps running INSIDE\n * the AlfaDocs platform iframe (consumers detect this with\n * `window !== window.top`): it drops the Header, Sidebar, account menu, and\n * product lockup — the platform already brands and identifies the session\n * around the iframe — and renders the `nav` items as a single slim top tab\n * strip. `onSignOut`, `onToggleFullscreen`, `productName`, `productHref`, and\n * `sidebarState` are ignored in `'embedded'`; the `<main>` landmark,\n * `mainAriaLabel`, the skip link and `endSidebar` are kept.\n */\n variant?: 'standalone' | 'embedded';\n /** Inline-end panel (e.g. a `ControlRoomRail`) forwarded to `AppFrame` in both variants.\n * Hidden below `md`: keep it mounted and add `AliaPopout` there. In `'embedded'` it\n * pins the tab strip and scrolls `<main>` beside it; omitted, embedded is unchanged. */\n endSidebar?: ReactNode;\n /** Children render inside the main content region. */\n children: ReactNode;\n}\n\n/* ------------------------------------------------------------------ */\n/* Internals */\n/* ------------------------------------------------------------------ */\n\nfunction formatBadgeCount(count: number): string {\n return count > 99 ? '99+' : String(count);\n}\n\nfunction AccountMenu({\n user,\n labels,\n onSignOut,\n onToggleFullscreen,\n}: {\n user: MarketplaceAppUser;\n labels: MarketplaceAppShellLabels;\n onSignOut?: () => void;\n onToggleFullscreen?: () => void;\n}) {\n const { t } = useTranslation('ui');\n // Default to the translated `ui.*` label so a consumer that wires\n // `onToggleFullscreen` but omits the label still gets a localised item.\n const fullscreenLabel =\n labels.fullscreen ?? t('marketplaceAppShell.settings.fullscreen');\n return (\n // Non-modal: an account menu shouldn't inert/aria-hide the whole shell\n // behind it (which leaves the still-focusable chrome inside an\n // aria-hidden region — an `aria-hidden-focus` violation).\n <DropdownMenu.Root modal={false}>\n <DropdownMenu.Trigger asChild>\n {/* Bare avatar circle — matches the main app shell's account\n trigger. The name lives inside the menu, not beside the avatar. */}\n <button\n type=\"button\"\n aria-label={labels.accountMenu}\n data-testid=\"marketplace-account-trigger\"\n className=\"ds:inline-flex ds:items-center ds:justify-center ds:shrink-0 ds:size-10 ds:rounded-[var(--radius-full)] ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)] ds:forced-colors:focus-visible:outline-[CanvasText]\"\n >\n <span aria-hidden=\"true\">\n <Avatar name={user.name} src={user.avatarSrc} size=\"md\" />\n </span>\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\" collisionPadding={16}>\n {/* GitHub-style identity header — small avatar + name + secondary\n line, matching the main app shell's account menu. */}\n <DropdownMenu.Label>\n <span className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <span aria-hidden=\"true\">\n <Avatar name={user.name} src={user.avatarSrc} size=\"sm\" />\n </span>\n <span className=\"ds:flex ds:flex-col ds:min-w-0\">\n <span className=\"type-label ds:text-[color:var(--foreground)] ds:truncate\">\n {user.name}\n </span>\n {user.email ? (\n <span className=\"type-meta ds:truncate\">{user.email}</span>\n ) : null}\n </span>\n </span>\n </DropdownMenu.Label>\n {onToggleFullscreen ? (\n <>\n <DropdownMenu.Separator />\n <DropdownMenu.Item\n startIcon={<Maximize2 aria-hidden />}\n onSelect={onToggleFullscreen}\n data-testid=\"marketplace-fullscreen\"\n >\n {fullscreenLabel}\n </DropdownMenu.Item>\n </>\n ) : null}\n <DropdownMenu.Separator />\n <DropdownMenu.Item\n startIcon={<LogOut aria-hidden />}\n onSelect={onSignOut}\n data-testid=\"marketplace-sign-out\"\n >\n {labels.signOut}\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n );\n}\n\nfunction MarketplaceSidebarNav({\n nav,\n renderLink,\n}: {\n nav: MarketplaceNavItem[];\n renderLink?: MarketplaceRenderLink;\n}) {\n return (\n <SidebarBody>\n {nav.map((item) => {\n const badge =\n typeof item.badgeCount === 'number' && item.badgeCount > 0\n ? item.badgeCount\n : undefined;\n const inner = (\n <>\n {item.icon ? <SidebarItemIcon>{item.icon}</SidebarItemIcon> : null}\n <SidebarItemLabel>{item.label}</SidebarItemLabel>\n {badge !== undefined ? (\n <SidebarItemBadge>{formatBadgeCount(badge)}</SidebarItemBadge>\n ) : null}\n </>\n );\n\n // Consumer-router mode: render the item through Radix `Slot`\n // (`SidebarItem asChild`) so the consumer's `<Link>` takes over the\n // anchor while keeping the kit's item styling + `aria-current=\"page\"`.\n // Clicking routes client-side — no full-page reload.\n if (renderLink) {\n return (\n <SidebarItem key={item.id} asChild isActive={item.isActive}>\n {renderLink({\n href: item.href,\n children: inner,\n 'aria-current': item.isActive ? 'page' : undefined,\n })}\n </SidebarItem>\n );\n }\n\n // Default: plain anchor — byte-identical to before when no per-item\n // `onClick` is supplied (it's omitted entirely, not passed as\n // undefined, so the rendered `<a>` is unchanged).\n return (\n <SidebarItem\n key={item.id}\n href={item.href}\n aria-label={item.label}\n isActive={item.isActive}\n {...(item.onClick ? { onClick: item.onClick } : {})}\n >\n {inner}\n </SidebarItem>\n );\n })}\n </SidebarBody>\n );\n}\n\n/* CVA for the chrome variant — drives the `<main>` surface; the structural\n header/sidebar-vs-tab-strip difference is conditional in the render.\n\n The `standalone` `<main>` gets its content inset from AppFrame's own\n `mainVariants({ padded: true })` (`--spacing-md` on every logical side), so\n this variant only carries the canvas colour there. The `embedded` `<main>`\n is a plain element (no AppFrame), so it has to supply its own inset:\n `--spacing-md` inline + block-end to match the standalone inset, and a\n larger `--spacing-lg` block-start so content clears the floating tab strip's\n pill instead of butting up against it. All logical — RTL mirrors for free. */\nconst EMBEDDED_CONTENT_INSET = [\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-lg)] ds:pb-[var(--spacing-md)]',\n].join(' ');\n\nconst shellMainVariants = cva('ds:bg-[color:var(--app-shell-background)]', {\n variants: {\n variant: {\n standalone: '',\n embedded: `ds:flex-1 ${EMBEDDED_CONTENT_INSET}`,\n },\n },\n defaultVariants: { variant: 'standalone' },\n});\n\n// Embedded with an end panel: the strip sits in AppFrame's header slot, so it\n// carries the shell canvas itself rather than AppFrame's `--background`.\nconst EMBEDDED_DOCKED_CHROME =\n 'ds:shrink-0 ds:bg-[color:var(--app-shell-background)]';\n\n/**\n * Embedded chrome: the slim floating tab strip (no Header / Sidebar / account\n * menu) for apps running inside the AlfaDocs platform iframe. It's the shared\n * {@link TabBar} fed the shell's nav items — the platform brands and identifies\n * the session around the iframe, so the strip is the only chrome. The\n * `MarketplaceNavItem` shape is structurally a `TabBarItem`, so the nav passes\n * straight through.\n */\nfunction EmbeddedTabStrip({\n nav,\n ariaLabel,\n renderLink,\n}: {\n nav: MarketplaceNavItem[];\n ariaLabel: string;\n renderLink?: MarketplaceRenderLink;\n}) {\n // Adapt the shell's `renderLink` to TabBar's `renderLink` signature — TabBar\n // also offers the per-item `onClick`, but in consumer-router mode the\n // `<Link>` owns navigation (matching the standalone sidebar), so we forward\n // only `href` / `className` / `children` / `aria-current`. With `renderLink`\n // omitted, TabBar renders its own plain `<a href>` exactly as before, and a\n // per-item `onClick` rides through `nav` → `TabBarItem` untouched.\n const tabRenderLink = renderLink\n ? ({\n href,\n className,\n children,\n 'aria-current': ariaCurrent,\n 'data-tab-id': tabId,\n }: {\n href: string;\n className: string;\n children: ReactNode;\n 'aria-current'?: 'page';\n 'data-tab-id'?: string;\n }) =>\n renderLink({\n href,\n className,\n children,\n 'aria-current': ariaCurrent,\n // Forward the agent DOM hook — without it a consumer-router tab is\n // invisible to `[data-tab-id]` lookups (PRS §26 §6).\n 'data-tab-id': tabId,\n })\n : undefined;\n\n return (\n <TabBar\n items={nav}\n ariaLabel={ariaLabel}\n {...(tabRenderLink ? { renderLink: tabRenderLink } : {})}\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* MarketplaceAppShell */\n/* ------------------------------------------------------------------ */\n\nexport const MarketplaceAppShell = forwardRef<\n HTMLDivElement,\n MarketplaceAppShellProps\n>(\n (\n {\n productName,\n productHref = '/',\n nav,\n renderLink,\n user,\n labels,\n onSignOut,\n onToggleFullscreen,\n sidebarState,\n collapsibleSidebar = false,\n mainAriaLabel,\n variant = 'standalone',\n endSidebar,\n children,\n },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n\n // The brand lockup as a consumer-router link: when `renderLink` is\n // supplied, the brand anchor routes client-side too (no session flash when\n // jumping home). The maker lockup's \"<productName> by Alfadocs\" supplies\n // the link's accessible name, matching the default `HeaderBrand` anchor.\n const headerBrand = renderLink ? (\n <HeaderBrand asChild>\n {renderLink({\n href: productHref,\n children: (\n <ProductLockup\n name={productName}\n size=\"md\"\n monochrome\n variant=\"maker\"\n />\n ),\n })}\n </HeaderBrand>\n ) : (\n <HeaderBrand\n href={productHref}\n logo={\n <ProductLockup\n name={productName}\n size=\"md\"\n monochrome\n variant=\"maker\"\n />\n }\n />\n );\n\n // Only wrap in a nested ThemeRoot when the user has an\n // explicit theme/accessibility override, so we don't clobber the consuming\n // app's (or Storybook's) outer theme cascade.\n const { theme: themePref, accessibility, resolvedTheme } = useTheme();\n const hasExplicitOverride =\n themePref !== 'system' || accessibility !== 'system';\n const themeBase = resolvedTheme.startsWith('dark') ? 'dark' : 'light';\n const themeAccessible = resolvedTheme.endsWith('-accessible');\n\n // Narrow-viewport overlay: HeaderMenuButton only renders below `md`.\n const [sidebarOpen, setSidebarOpen] = useState(false);\n\n const shell = (\n <TooltipProvider>\n <AppFrame\n mainAriaLabel={mainAriaLabel}\n mainClassName={shellMainVariants({ variant: 'standalone' })}\n header={\n <Header>\n <HeaderStart>\n <HeaderSkipLink href=\"#main-content\" />\n <HeaderMenuButton onMenuOpen={() => setSidebarOpen(true)} />\n {headerBrand}\n </HeaderStart>\n <HeaderCenter />\n <HeaderEnd>\n <HeaderSettings size=\"sm\" />\n <AccountMenu\n user={user}\n labels={labels}\n onSignOut={onSignOut}\n onToggleFullscreen={onToggleFullscreen}\n />\n </HeaderEnd>\n </Header>\n }\n sidebar={\n <Sidebar\n {...(sidebarState !== undefined\n ? { state: sidebarState }\n : { defaultState: 'expanded' as const })}\n open={sidebarOpen}\n onOpenChange={setSidebarOpen}\n aria-label={t('navigation.sidebar.label')}\n data-testid=\"marketplace-app-shell-sidebar\"\n >\n {collapsibleSidebar && sidebarState === undefined ? (\n // No justify override: SidebarHeader centres its child in the\n // icon rail (`justify-center`) and left-aligns it when expanded,\n // matching the nav icons below. `justify-end` here would win over\n // the icon-mode centring and offset the toggle in the rail.\n <SidebarHeader>\n <SidebarCollapseTrigger />\n </SidebarHeader>\n ) : null}\n <MarketplaceSidebarNav nav={nav} renderLink={renderLink} />\n </Sidebar>\n }\n endSidebar={endSidebar}\n >\n {children}\n </AppFrame>\n </TooltipProvider>\n );\n\n const embeddedChrome = (\n <>\n <HeaderSkipLink href=\"#main-content\" />\n <EmbeddedTabStrip\n nav={nav}\n ariaLabel={t('navigation.sidebar.label')}\n renderLink={renderLink}\n />\n </>\n );\n\n // An end panel needs a height-bounded row to dock in, which AppFrame owns.\n // The inset moves inside its scroll area, so `<main>` reads as it does\n // without the panel. No sidebar: the tab strip stays the only nav.\n const embeddedDocked = (\n <TooltipProvider>\n <AppFrame\n mainAriaLabel={mainAriaLabel}\n mainClassName={shellMainVariants({ variant: 'standalone' })}\n padded={false}\n header={\n <div className={EMBEDDED_DOCKED_CHROME}>{embeddedChrome}</div>\n }\n sidebar={null}\n endSidebar={endSidebar}\n >\n <div className={EMBEDDED_CONTENT_INSET}>{children}</div>\n </AppFrame>\n </TooltipProvider>\n );\n\n const embedded = (\n // The shell owns the warm-grey canvas; TabBar's strip is transparent and\n // floats its pill on it, and `<main>` continues the same surface.\n <div className=\"ds:flex ds:min-h-dvh ds:flex-col ds:bg-[color:var(--app-shell-background)]\">\n {embeddedChrome}\n <main\n id=\"main-content\"\n tabIndex={-1}\n aria-label={\n mainAriaLabel ?? t('navigation.main.label', 'Main content')\n }\n className={shellMainVariants({ variant: 'embedded' })}\n >\n {children}\n </main>\n </div>\n );\n\n const content =\n variant === 'embedded' ? (endSidebar ? embeddedDocked : embedded) : shell;\n\n if (!hasExplicitOverride) {\n return (\n <div\n ref={ref}\n className=\"ds:contents\"\n data-component=\"marketplace-app-shell\"\n >\n {content}\n </div>\n );\n }\n\n return (\n <ThemeRoot\n ref={ref}\n theme={themeBase}\n accessible={themeAccessible}\n className=\"ds:contents\"\n data-component=\"marketplace-app-shell\"\n >\n {content}\n </ThemeRoot>\n );\n },\n);\n\nMarketplaceAppShell.displayName = 'MarketplaceAppShell';\n\n/* ------------------------------------------------------------------ */\n/* ConnectWithAlfadocs */\n/* ------------------------------------------------------------------ */\n\nexport type ConnectStatus = 'idle' | 'connecting' | 'error';\n\nexport interface ConnectWithAlfadocsProps {\n /** Product name shown next to the wordmark at the top of the card. */\n productName: string;\n /** Heading, e.g. \"Connect your AlfaDocs account\". */\n title: string;\n /** Supporting copy below the heading. */\n description: ReactNode;\n /** The connect button label, e.g. \"Connect with AlfaDocs\". */\n connectLabel: string;\n /** Connection lifecycle. `connecting` shows a loading button; `error` shows the alert. */\n status?: ConnectStatus;\n /** Error message shown (as an alert) when `status === 'error'`. */\n error?: ReactNode;\n /** Fires when the connect button is pressed. Wire to `useAlfadocsAuth().connect`. */\n onConnect?: () => void;\n /** Optional footer content below the button (e.g. a \"what's this?\" link). */\n footer?: ReactNode;\n /**\n * Visual layout. `'card'` (default) is the centred card on the warm-grey\n * canvas — unchanged. `'split'` adds, at `lg:` and up, a two-panel desktop\n * layout: a brand panel on the inline-start and the connect card on the\n * inline-end. Below `lg:`, `'split'` collapses to exactly the card layout —\n * so it falls back gracefully inside iframes / embeds that never reach\n * desktop width. Use `'split'` for full-page desktop logins.\n */\n layout?: 'card' | 'split';\n /**\n * Optional content shown under the lockup in the `'split'` brand panel (a\n * tagline, value props, an illustration). Ignored in `'card'` and below `lg:`.\n */\n brandPanel?: ReactNode;\n className?: string;\n}\n\n/* Split-layout CVAs (lg+ two-panel; collapses to the centred card below lg). */\nconst connectRootVariants = cva(\n 'ds:flex ds:min-h-dvh ds:bg-[color:var(--app-shell-background)]',\n {\n variants: {\n layout: {\n card: '',\n split: 'ds:flex-col ds:lg:flex-row',\n },\n },\n defaultVariants: { layout: 'card' },\n },\n);\n\nconst connectCardWidthVariants = cva('ds:w-full', {\n variants: {\n layout: {\n card: 'ds:max-w-[400px]',\n split: 'ds:max-w-[400px] ds:lg:max-w-[480px]',\n },\n },\n defaultVariants: { layout: 'card' },\n});\n\n// The card's own lockup hides at lg+ in `split` (the brand panel shows it there).\nconst connectCardLockupVariants = cva('', {\n variants: {\n layout: { card: '', split: 'ds:lg:hidden' },\n },\n defaultVariants: { layout: 'card' },\n});\n\n/**\n * The pre-auth \"Connect with AlfaDocs\" screen. Centred white card on the\n * warm-grey canvas with the AlfaDocs wordmark + product name, copy, an error\n * slot, and the primary connect CTA. An opt-in `layout=\"split\"` adds a desktop\n * two-panel brand layout (lg+). Presentational — `onConnect` should call\n * `useAlfadocsAuth().connect()`, which redirects the browser to the server-side\n * BFF that runs the real OAuth2 + PKCE flow.\n */\nexport const ConnectWithAlfadocs = forwardRef<\n HTMLDivElement,\n ConnectWithAlfadocsProps\n>(\n (\n {\n productName,\n title,\n description,\n connectLabel,\n status = 'idle',\n error,\n onConnect,\n footer,\n layout = 'card',\n brandPanel,\n className,\n },\n ref,\n ) => {\n return (\n <div\n ref={ref}\n data-component=\"connect-with-alfadocs\"\n className={`${connectRootVariants({ layout })} ${className ?? ''}`}\n >\n {layout === 'split' ? (\n // Desktop brand panel (lg+ only): a bold `--primary` surface with the\n // monochrome lockup riding the `--primary-foreground` ink, plus an\n // optional `brandPanel` slot. Decorative — the card carries the real\n // heading + CTA, and shows its own lockup below `lg:`.\n <div className=\"ds:hidden ds:lg:flex ds:lg:w-[55%] ds:flex-col ds:items-center ds:justify-center ds:gap-[var(--spacing-lg)] ds:bg-[color:var(--primary)] ds:text-[color:var(--primary-foreground)] ds:ps-[var(--spacing-2xl)] ds:pe-[var(--spacing-2xl)] ds:pt-[var(--spacing-2xl)] ds:pb-[var(--spacing-2xl)] ds:text-start\">\n <ProductLockup\n name={productName}\n size=\"lg\"\n monochrome\n tone=\"inherit\"\n variant=\"maker\"\n />\n {brandPanel ? (\n <div className=\"type-body ds:max-w-[28rem] ds:text-start\">\n {brandPanel}\n </div>\n ) : null}\n </div>\n ) : null}\n <div className=\"ds:flex ds:flex-1 ds:items-center ds:justify-center ds:p-[var(--spacing-lg)]\">\n <Card className={connectCardWidthVariants({ layout })}>\n <Card.Body className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-lg)] ds:text-center\">\n <ProductLockup\n name={productName}\n size=\"lg\"\n variant=\"maker\"\n className={connectCardLockupVariants({ layout })}\n />\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <h1 className=\"type-title-card\">{title}</h1>\n <p className=\"type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {description}\n </p>\n </div>\n {status === 'error' && error ? (\n <Alert variant=\"error\" className=\"ds:w-full ds:text-start\">\n {error}\n </Alert>\n ) : null}\n <SignInWithAlfadocsButton\n intent=\"primary\"\n className=\"ds:w-full\"\n loading={status === 'connecting'}\n onClick={onConnect}\n label={connectLabel}\n data-testid=\"connect-with-alfadocs-button\"\n />\n {footer ? (\n <div className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {footer}\n </div>\n ) : null}\n </Card.Body>\n </Card>\n </div>\n </div>\n );\n },\n);\n\nConnectWithAlfadocs.displayName = 'ConnectWithAlfadocs';\n"],"names":["lockup","cva","productName","makerRoot","ProductLockup","forwardRef","name","variant","monochrome","tone","size","className","props","ref","t","useTranslation","inherit","markInk","nameInk","byInk","letteringInk","jsxs","jsx","AlfadocsLogoMark","Trans","AlfadocsLogoNeg","Logo","formatBadgeCount","count","AccountMenu","user","labels","onSignOut","onToggleFullscreen","fullscreenLabel","DropdownMenu","Avatar","Fragment","Maximize2","LogOut","MarketplaceSidebarNav","nav","renderLink","SidebarBody","item","badge","inner","SidebarItemIcon","SidebarItemLabel","SidebarItemBadge","SidebarItem","EMBEDDED_CONTENT_INSET","shellMainVariants","EMBEDDED_DOCKED_CHROME","EmbeddedTabStrip","ariaLabel","tabRenderLink","href","children","ariaCurrent","tabId","TabBar","MarketplaceAppShell","productHref","sidebarState","collapsibleSidebar","mainAriaLabel","endSidebar","headerBrand","HeaderBrand","themePref","accessibility","resolvedTheme","useTheme","hasExplicitOverride","themeBase","themeAccessible","sidebarOpen","setSidebarOpen","useState","shell","TooltipProvider","AppFrame","Header","HeaderStart","HeaderSkipLink","HeaderMenuButton","HeaderCenter","HeaderEnd","HeaderSettings","Sidebar","SidebarHeader","SidebarCollapseTrigger","embeddedChrome","embeddedDocked","embedded","content","ThemeRoot","connectRootVariants","connectCardWidthVariants","connectCardLockupVariants","ConnectWithAlfadocs","title","description","connectLabel","status","error","onConnect","footer","layout","brandPanel","Card","Alert","SignInWithAlfadocsButton"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"panel-subview-BT-Apwgb.js","sources":["../../src/components/panel-subview/panel-subview.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useRef,\n type HTMLAttributes,\n type ReactNode,\n type RefObject,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { ArrowLeft } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { PanelHeader } from '../panel-header/panel-header';\nimport { ScrollArea } from '../scroll-area/scroll-area';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { usePresenceTransition } from '../../hooks/use-presence-transition';\n\n/* -------------------------------------------------------------------- */\n/* PanelSubview */\n/* */\n/* A panel inside a panel: a second view that slides over a rail panel's */\n/* own body and hands it back. An edit form, a history, a detail drilled */\n/* into from a list. The panel underneath stays mounted, so its scroll */\n/* position and state are there when the reader comes back. */\n/* */\n/* Use it instead of a Dialog when the task belongs to the panel. A modal */\n/* blanks out the calendar the rail sits beside, and the list the item */\n/* came from; a subview covers only the panel. */\n/* */\n/* It exists because the shape was being hand-built per tool: a view */\n/* flag, a PanelHeader with a back arrow, a scroll body, a pinned footer, */\n/* and focus moved by hand. Hand-built, none of them animated and each */\n/* forgot a different part of the focus contract. */\n/* */\n/* The host must be a positioned, clipped box. Wrap the panel in */\n/* `PanelSubview.Host` and render the subview as its LAST child. */\n/* -------------------------------------------------------------------- */\n\nconst hostVariants = cva(\n [\n 'ds:relative ds:flex ds:h-full ds:min-h-0 ds:flex-col ds:overflow-hidden',\n // Focus lands on the host itself, from script, only when the panel it\n // uncovers has no control. The ring sits inside: the host is clipped.\n 'ds:outline-none ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:calc(var(--focus-ring-width)*-1)]',\n ].join(' '),\n);\n\n/* Where Tab would go next inside a host, for a return with no opener. */\nconst TABBABLE = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled]):not([type=\"hidden\"])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[contenteditable=\"true\"]',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(', ');\n\n/* Whether an element can show, and so take focus: not closed off by an\n ancestor, and not display:none or visibility:hidden. */\nfunction canShow(el: HTMLElement): boolean {\n return (\n !el.closest('[inert],[hidden],[aria-hidden=\"true\"]') &&\n (typeof el.checkVisibility !== 'function' ||\n el.checkVisibility({ visibilityProperty: true }))\n );\n}\n\n/* With no opener to go back to, focus stays in the Host: a control of the\n panel the subview uncovered, one already in view first so the panel does\n not scroll away, else the Host itself, focusable only while it has focus.\n A Host that is closed off itself (a rail collapsing) is left alone. */\nfunction focusInHost(host: HTMLElement, subview: HTMLElement | null): void {\n if (!canShow(host)) return;\n const controls = Array.from(\n host.querySelectorAll<HTMLElement>(TABBABLE),\n ).filter((el) => !subview?.contains(el) && canShow(el));\n const box = host.getBoundingClientRect();\n const target =\n controls.find((el) => {\n const rect = el.getBoundingClientRect();\n return rect.bottom > box.top && rect.top < box.bottom;\n }) ?? controls[0];\n if (target) {\n target.focus();\n return;\n }\n const added = !host.hasAttribute('tabindex');\n if (added) host.setAttribute('tabindex', '-1');\n host.focus();\n if (!added) return;\n if (document.activeElement === host) {\n host.addEventListener('blur', () => host.removeAttribute('tabindex'), {\n once: true,\n });\n } else host.removeAttribute('tabindex');\n}\n\nconst subviewVariants = cva(\n [\n 'ds:absolute ds:inset-0 ds:z-[2] ds:flex ds:min-h-0 ds:flex-col',\n 'ds:bg-[var(--background)] ds:focus-visible:outline-none',\n // Slides in from the inline end, and back out the same way. Declared at\n // rest so both directions have a value to move from.\n 'ds:transition-[opacity,translate] ds:duration-[var(--animation-duration)]',\n 'ds:ease-[var(--ease-out)] ds:motion-reduce:transition-none',\n 'ds:data-[presence=entering]:opacity-0 ds:data-[presence=leaving]:opacity-0',\n 'ds:data-[presence=entering]:translate-x-full ds:data-[presence=leaving]:translate-x-full',\n 'ds:rtl:data-[presence=entering]:-translate-x-full ds:rtl:data-[presence=leaving]:-translate-x-full',\n 'ds:data-[presence=leaving]:pointer-events-none',\n ].join(' '),\n);\n\n/* A control inside the subview whose popup is showing right now. */\nconst OPEN_POPUP =\n '[role=\"combobox\"][aria-expanded=\"true\"], [aria-haspopup][aria-expanded=\"true\"]';\n\nconst footerVariants = cva(\n [\n 'ds:flex ds:shrink-0 ds:items-center',\n 'ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-md)]',\n 'ds:border-t ds:border-[color:var(--border)]',\n ].join(' '),\n {\n variants: {\n /** `'end'` (default): a single trailing action cluster, as most\n * footers use. `'between'` splits the row — a leading destructive\n * action (Remove, say) at the start and the Cancel/Save cluster at\n * the end — for a footer with two sides instead of one. */\n align: {\n end: 'ds:justify-end',\n between: 'ds:justify-between',\n },\n },\n defaultVariants: { align: 'end' },\n },\n);\n\n/* -------------------------------------------------------------------- */\n/* Host */\n/* -------------------------------------------------------------------- */\n\nexport type PanelSubviewHostProps = HTMLAttributes<HTMLDivElement>;\n\n/** The positioned, clipped box a subview slides inside. Fills its parent. */\nconst PanelSubviewHost = forwardRef<HTMLDivElement, PanelSubviewHostProps>(\n ({ className, children, ...rest }, ref) => (\n <div\n ref={ref}\n data-component=\"panel-subview-host\"\n className={[hostVariants(), className].filter(Boolean).join(' ')}\n {...rest}\n >\n {children}\n </div>\n ),\n);\nPanelSubviewHost.displayName = 'PanelSubview.Host';\n\n/* -------------------------------------------------------------------- */\n/* Subview */\n/* -------------------------------------------------------------------- */\n\nexport interface PanelSubviewProps extends Omit<\n HTMLAttributes<HTMLElement>,\n 'title'\n> {\n /** Whether the subview is showing. It animates in and out around this. */\n open: boolean;\n /** Fires from the back button and from Escape. Set `open` false in reply. */\n onBack: () => void;\n /** The subview's heading. Already translated upstream. */\n title: ReactNode;\n /** Accessible name and tooltip of the back button. Already translated. */\n backLabel: string;\n /** Optional leading glyph for the heading. */\n icon?: ReactNode;\n /** Heading level. Default `2`; pass `3` to read as subordinate to the host. */\n headingLevel?: 2 | 3;\n /** Extra header actions, rendered after the back button. */\n headerActions?: ReactNode;\n /** Pinned below the scroll body: the form's cancel and save, typically. */\n footer?: ReactNode;\n /** How `footer`'s row is justified. `'end'` (default) keeps the single\n * trailing cluster every other subview uses; `'between'` splits the\n * row — render `footer` as two children (a leading destructive action,\n * a trailing Cancel/Save cluster) and the container puts one at each\n * end, the same shape as the appointment editor's ACTION FOOTER. */\n footerAlign?: 'end' | 'between';\n /** Fires once the exit has played and the subview has unmounted. */\n onExited?: () => void;\n /**\n * Focus this on open instead of the subview itself: a form's first field,\n * say. The subview is still announced through its heading.\n */\n initialFocusRef?: RefObject<HTMLElement | null>;\n children: ReactNode;\n}\n\nconst PanelSubviewRoot = forwardRef<HTMLElement, PanelSubviewProps>(\n (\n {\n open,\n onBack,\n title,\n backLabel,\n icon,\n headingLevel,\n headerActions,\n footer,\n footerAlign = 'end',\n onExited,\n initialFocusRef,\n className,\n children,\n ...rest\n },\n ref,\n ) => {\n const headingId = useId();\n const presence = usePresenceTransition<HTMLElement>(open, { onExited });\n const nodeRef = useRef<HTMLElement | null>(null);\n const returnFocusRef = useRef<HTMLElement | null>(null);\n const onBackRef = useRef(onBack);\n onBackRef.current = onBack;\n\n const { ref: presenceRef } = presence;\n const setNode = useCallback(\n (node: HTMLElement | null) => {\n nodeRef.current = node;\n presenceRef(node);\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n },\n [presenceRef, ref],\n );\n\n // Remember where focus was BEFORE the subview takes it, during render of\n // the opening pass, so the trigger is still the active element. `null`\n // marks the first render: a subview mounted already open records its\n // opener too, but only hands focus back to one inside its own Host.\n const wasOpenRef = useRef<boolean | null>(null);\n const openedOnMountRef = useRef(false);\n const openRef = useRef(open);\n openRef.current = open;\n if (\n open &&\n wasOpenRef.current !== true &&\n typeof document !== 'undefined'\n ) {\n returnFocusRef.current =\n document.activeElement instanceof HTMLElement\n ? document.activeElement\n : null;\n openedOnMountRef.current = wasOpenRef.current === null;\n }\n wasOpenRef.current = open;\n\n /* The panel underneath is covered, so it leaves the tab order and the\n accessibility tree for as long as the subview is open. */\n useIsomorphicLayoutEffect(() => {\n const node = nodeRef.current;\n const parent = node?.parentElement;\n if (!open || !node || !parent) return undefined;\n const covered = Array.from(parent.children).filter(\n (child) => child !== node && !child.hasAttribute('inert'),\n );\n covered.forEach((child) => child.setAttribute('inert', ''));\n // `preventScroll`: the subview is still off to the side at this point,\n // and a clipped Host would otherwise scroll sideways to reveal it.\n (initialFocusRef?.current ?? node).focus({ preventScroll: true });\n return () => {\n covered.forEach((child) => child.removeAttribute('inert'));\n };\n }, [open, presence.mounted, initialFocusRef]);\n\n /* A leaving subview is already closed to the user: `aria-hidden` alone\n would leave its controls focusable, so it goes `inert` while it fades.\n Set on the node, not as a prop: React 18 has no boolean for it. */\n const leaving = !open;\n useIsomorphicLayoutEffect(() => {\n const node = nodeRef.current;\n if (!node) return;\n // Blur first: nothing focused may sit inside a hidden subtree, even for\n // the moment before the passive effect below hands focus back.\n const active = document.activeElement;\n if (leaving && active instanceof HTMLElement && node.contains(active)) {\n active.blur();\n }\n node.toggleAttribute('inert', leaving);\n }, [leaving, presence.mounted]);\n\n /* Hand focus back to whatever opened the subview. A PASSIVE effect: React\n restores the pre-commit focus at the end of a commit, so a return made\n from a layout cleanup is overwritten by the closing subview itself. */\n useEffect(() => {\n if (!open) return undefined;\n const node = nodeRef.current;\n const host = node?.parentElement ?? null;\n return () => {\n // StrictMode replays this cleanup on mount while the subview is still\n // open and in the page. Keep the opener for the real close.\n if (openRef.current && node?.isConnected) return;\n const target = returnFocusRef.current;\n returnFocusRef.current = null;\n // Mounted open, the opener may be anywhere on the page (the rail's\n // own tool button, say). Only a control in this Host gets it back.\n const opener =\n target?.isConnected &&\n (!openedOnMountRef.current || host?.contains(target))\n ? target\n : null;\n if (opener) {\n opener.focus();\n return;\n }\n // No opener to go back to (outside the Host, or gone). Keep focus in\n // the Host rather than the page, unless it has already moved on.\n // After this flush, so an owner's own rescue (TaskEditor's) goes first.\n queueMicrotask(() => {\n const active = document.activeElement;\n if (host?.isConnected && (!active || active === document.body)) {\n focusInHost(host, node ?? null);\n }\n });\n };\n }, [open]);\n\n /* Escape goes back one level. A NATIVE listener: the rail collapses on\n Escape through its own native listener further up, and only a native\n stopPropagation here keeps one key press from doing both. */\n useEffect(() => {\n const node = nodeRef.current;\n if (!open || !node) return undefined;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return;\n // Spent here either way: a key pressed inside never collapses the rail.\n event.stopPropagation();\n /* An OPEN popup inside took the key to close itself. A closed,\n force-mounted one (Combobox) prevents default too, so ask the DOM. */\n if (event.defaultPrevented && node.querySelector(OPEN_POPUP)) return;\n event.preventDefault();\n onBackRef.current();\n };\n node.addEventListener('keydown', onKeyDown);\n return () => node.removeEventListener('keydown', onKeyDown);\n }, [open, presence.mounted]);\n\n if (!presence.mounted) return null;\n\n return (\n <section\n {...rest}\n ref={setNode}\n tabIndex={-1}\n aria-labelledby={headingId}\n aria-hidden={leaving || undefined}\n data-component=\"panel-subview\"\n data-presence={presence.phase}\n className={[subviewVariants(), className].filter(Boolean).join(' ')}\n >\n <PanelHeader\n icon={icon}\n title={title}\n headingId={headingId}\n headingLevel={headingLevel}\n sticky\n divider\n actions={\n <>\n <IconButton\n icon={<ArrowLeft aria-hidden=\"true\" />}\n intent=\"ghost\"\n size=\"sm\"\n flipIconInRtl\n aria-label={backLabel}\n tooltip={backLabel}\n data-panel-subview-back=\"\"\n onClick={onBack}\n />\n {headerActions}\n </>\n }\n />\n <ScrollArea orientation=\"vertical\" className=\"ds:min-h-0 ds:flex-1\">\n {children}\n </ScrollArea>\n {footer ? (\n <div\n data-panel-subview-footer=\"\"\n className={footerVariants({ align: footerAlign })}\n >\n {footer}\n </div>\n ) : null}\n </section>\n );\n },\n);\nPanelSubviewRoot.displayName = 'PanelSubview';\n\nexport const PanelSubview = Object.assign(PanelSubviewRoot, {\n Host: PanelSubviewHost,\n});\n"],"names":["hostVariants","cva","TABBABLE","canShow","el","focusInHost","host","subview","controls","box","target","rect","added","subviewVariants","OPEN_POPUP","footerVariants","PanelSubviewHost","forwardRef","className","children","rest","ref","jsx","PanelSubviewRoot","open","onBack","title","backLabel","icon","headingLevel","headerActions","footer","footerAlign","onExited","initialFocusRef","headingId","useId","presence","usePresenceTransition","nodeRef","useRef","returnFocusRef","onBackRef","presenceRef","setNode","useCallback","node","wasOpenRef","openedOnMountRef","openRef","useIsomorphicLayoutEffect","parent","covered","child","leaving","active","useEffect","opener","onKeyDown","event","jsxs","PanelHeader","Fragment","IconButton","ArrowLeft","ScrollArea","PanelSubview"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"scroll-area-ZtFCv9K7.js","sources":["../../src/components/scroll-area/scroll-area.tsx"],"sourcesContent":["import {\n forwardRef,\n useRef,\n type AriaRole,\n type ComponentPropsWithoutRef,\n} from 'react';\nimport * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useDirection } from '../_shared/use-direction';\n\nconst scrollbarVariants = cva(\n [\n 'ds:flex ds:touch-none ds:select-none',\n // Fade in/out based on Radix data-state (requires forceMount on Scrollbar).\n // Default opacity is 1 because ScrollAreaScrollbarVisible (type='always')\n // never sets data-state at all — only hover/scroll/auto set data-state=\"hidden\".\n 'ds:transition-opacity ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:data-[state=hidden]:opacity-0',\n // Orientation-specific sizing + padding so thumb floats away from the frame edge\n 'ds:data-[orientation=vertical]:w-[var(--scrollbar-size)] ds:data-[orientation=vertical]:p-[var(--scrollbar-padding)]',\n 'ds:data-[orientation=horizontal]:h-[var(--scrollbar-size)] ds:data-[orientation=horizontal]:flex-col ds:data-[orientation=horizontal]:p-[var(--scrollbar-padding)]',\n 'ds:bg-[var(--scrollbar-track)]',\n // forced-colors: 1px border keeps the track visible when background flattens\n 'ds:forced-colors:border ds:forced-colors:border-[ButtonText]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:[--scrollbar-size:var(--scrollbar-size-sm)]',\n md: 'ds:[--scrollbar-size:var(--scrollbar-size-md)]',\n lg: 'ds:[--scrollbar-size:var(--scrollbar-size-lg)]',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\nconst thumbVariants = cva(\n [\n 'ds:relative ds:flex-1',\n 'ds:rounded-[var(--radius-full)]',\n 'ds:bg-[var(--scrollbar-thumb)]',\n 'ds:hover:bg-[var(--scrollbar-thumb-hover)]',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n // forced-color-adjust: auto so forced-colors paint ButtonFace/ButtonText\n 'ds:[forced-color-adjust:auto]',\n // hit area extension via ::before for touch pointers (must be absolute)\n 'ds:before:absolute ds:before:content-[\"\"] ds:before:inset-x-[calc((var(--min-target-size)-100%)/-2)]',\n 'ds:before:inset-y-[calc((var(--min-target-size)-100%)/-2)]',\n ].join(' '),\n);\n\nexport interface ScrollAreaProps\n extends\n Omit<ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>, 'type'>,\n VariantProps<typeof scrollbarVariants> {\n orientation?: 'vertical' | 'horizontal' | 'both';\n size?: 'sm' | 'md' | 'lg';\n /**\n * `auto` — scrollbar fades in on pointer-enter, fades out after `--scrollbar-fade-delay` (default).\n * `always` — scrollbar always visible; use for data tables.\n * `scroll` — scrollbar visible only while scrolling.\n * `hover` — alias for `auto` (Radix hover mode).\n * `native` — skips the custom scrollbar entirely; the OS renders its own.\n * Use for virtualised lists (AG Grid, @tanstack/react-virtual).\n */\n type?: 'auto' | 'always' | 'scroll' | 'hover' | 'native';\n /**\n * Names the scroll container. Its viewport is a tab stop, so keyboard\n * users can scroll it with the arrow keys, and a tab stop needs a name.\n * Given `aria-label` or `aria-labelledby`, the viewport (not the outer\n * wrapper) carries the name and becomes a `region`. Prefer\n * `aria-labelledby` pointing at a heading or landmark already on screen.\n */\n 'aria-label'?: string;\n /** The id of an element whose text names the scroll container. See `aria-label`. */\n 'aria-labelledby'?: string;\n /**\n * The tab stop's role. Default `region` when the scroll area is named, none\n * otherwise. Pass `group` when the content may hold an `<aside>` or other\n * landmark: a region is a landmark, and axe rejects an aside nested in one.\n */\n role?: AriaRole;\n className?: string;\n children: React.ReactNode;\n}\n\n/* The tab stop's role: a named scroll container is a region (the usual\n pattern for a keyboard-scrollable pane); an unnamed one keeps no role,\n as before, because a region with no name is not a landmark. */\nconst viewportRole = (\n role: AriaRole | undefined,\n ariaLabel: string | undefined,\n ariaLabelledBy: string | undefined,\n): AriaRole | undefined =>\n role ?? (ariaLabel || ariaLabelledBy ? 'region' : undefined);\n\nconst radixType = (\n type: ScrollAreaProps['type'],\n): ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>['type'] => {\n if (type === 'auto' || type === undefined) return 'hover';\n return type as Exclude<\n ScrollAreaProps['type'],\n 'auto' | 'native' | undefined\n >;\n};\n\nconst nativeOverflow: Record<\n NonNullable<ScrollAreaProps['orientation']>,\n string\n> = {\n vertical: 'ds:overflow-y-auto',\n horizontal: 'ds:overflow-x-auto',\n both: 'ds:overflow-auto',\n};\n\nconst RadixScrollArea = forwardRef<HTMLDivElement, ScrollAreaProps>(\n (\n {\n orientation = 'vertical',\n size = 'md',\n type = 'auto',\n className,\n children,\n scrollHideDelay,\n // The name and role belong on the viewport, the element that takes\n // focus, not on the Root wrapper around it.\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n role,\n ...props\n },\n ref,\n ) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const dir = useDirection(rootRef);\n return (\n <ScrollAreaPrimitive.Root\n ref={rootRef}\n type={radixType(type)}\n dir={dir}\n scrollHideDelay={scrollHideDelay}\n data-component=\"scroll-area\"\n className={[\n 'ds:relative ds:overflow-hidden',\n 'ds:min-w-0 ds:min-h-0',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n ref={ref}\n // axe's `scrollable-region-focusable` rule requires any element\n // with overflow to be reachable via keyboard. Radix's Viewport\n // is the scroll container; mark it focusable (tabIndex=0) so\n // arrow / Home / End keys can drive it.\n tabIndex={0}\n role={viewportRole(role, ariaLabel, ariaLabelledBy)}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n className={[\n 'ds:h-full ds:w-full ds:rounded-[inherit]',\n // Radix wraps the viewport content in an inline\n // `display:table; min-width:100%` div that grows to the content's\n // MAX-content width. In a vertical-only scroll area the Root's\n // overflow-x is hidden, so anything wider than the viewport is\n // silently CLIPPED — not scrollable (seen in the ToolRail inbox\n // panel once accessible-mode type pushed content past the panel\n // width). Forcing that wrapper to `block` makes content wrap to the\n // viewport width instead. Horizontal / both keep the table wrapper\n // so they can still scroll on the x-axis.\n orientation === 'vertical' ? 'ds:[&>div]:!block' : '',\n // keyboard focus ring on the scroll container\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[Highlight]',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n\n {(orientation === 'vertical' || orientation === 'both') && (\n // forceMount keeps the element in the DOM so CSS opacity transition\n // can animate the show/hide instead of mount/unmount snapping.\n <ScrollAreaPrimitive.Scrollbar\n forceMount\n orientation=\"vertical\"\n className={scrollbarVariants({ size })}\n >\n <ScrollAreaPrimitive.Thumb className={thumbVariants()} />\n </ScrollAreaPrimitive.Scrollbar>\n )}\n\n {(orientation === 'horizontal' || orientation === 'both') && (\n <ScrollAreaPrimitive.Scrollbar\n forceMount\n orientation=\"horizontal\"\n className={scrollbarVariants({ size })}\n >\n <ScrollAreaPrimitive.Thumb className={thumbVariants()} />\n </ScrollAreaPrimitive.Scrollbar>\n )}\n\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n );\n },\n);\n\nRadixScrollArea.displayName = 'RadixScrollArea';\n\nexport const ScrollArea = forwardRef<HTMLDivElement, ScrollAreaProps>(\n (props, ref) => {\n const {\n orientation = 'vertical',\n type = 'auto',\n className,\n children,\n scrollHideDelay: _scrollHideDelay,\n size: _size,\n role,\n ...rest\n } = props;\n if (type === 'native') {\n return (\n <div\n ref={ref}\n role={viewportRole(role, rest['aria-label'], rest['aria-labelledby'])}\n data-component=\"scroll-area\"\n // Native scroll containers are not focusable by default — axe's\n // scrollable-region-focusable rule fires unless the user marks them\n // explicitly tabbable so keyboard users can scroll with arrows.\n tabIndex={0}\n className={[\n nativeOverflow[orientation],\n 'ds:min-w-0 ds:min-h-0',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[Highlight]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {children}\n </div>\n );\n }\n return <RadixScrollArea ref={ref} {...props} />;\n },\n);\n\nScrollArea.displayName = 'ScrollArea';\n\n// Re-export Radix parts for advanced composition\nexport const ScrollAreaRoot = ScrollAreaPrimitive.Root;\nexport const ScrollAreaViewport = ScrollAreaPrimitive.Viewport;\nexport const ScrollAreaScrollbar = ScrollAreaPrimitive.Scrollbar;\nexport const ScrollAreaThumb = ScrollAreaPrimitive.Thumb;\nexport const ScrollAreaCorner = ScrollAreaPrimitive.Corner;\n"],"names":["scrollbarVariants","cva","thumbVariants","viewportRole","role","ariaLabel","ariaLabelledBy","radixType","type","nativeOverflow","RadixScrollArea","forwardRef","orientation","size","className","children","scrollHideDelay","props","ref","rootRef","useRef","dir","useDirection","jsxs","ScrollAreaPrimitive","jsx","ScrollArea","_scrollHideDelay","_size","rest","ScrollAreaRoot","ScrollAreaViewport","ScrollAreaScrollbar","ScrollAreaThumb","ScrollAreaCorner"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"search-bar-DQJS0wJN.js","sources":["../../src/components/search-bar/search-bar.agent.ts","../../src/components/search-bar/search-bar.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — SearchBar. */\n/* */\n/* SearchBar is the kit's saved-search / global-search surface. In */\n/* `inline` mode it filters + opens a result popover; in `launcher` */\n/* mode it opens the CommandPalette. The adapter exposes the query, */\n/* a submit action, and an apply_saved_search hook so future MCP */\n/* tooling can drive the SearchBar by saved-search id. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { SearchBarHandle } from './search-bar';\n\nexport const searchBarAgent: AgentAdapter<SearchBarHandle> = {\n id: 'search-bar',\n // The query is a transient filter (set_query/clear), not inline content\n // editing — `filter` covers it. `submit` opens the palette / commits a hit.\n capabilities: ['filter', 'submit'],\n state: {\n query: {\n type: 'string',\n descriptionKey: 'ui.agent.searchBar.state.query',\n description:\n 'Current raw query string (inline mode). Empty in launcher mode.',\n read: (handle) => handle.getQuery(),\n },\n isEmpty: {\n type: 'boolean',\n descriptionKey: 'ui.agent.searchBar.state.isEmpty',\n description: 'True when the query is empty.',\n read: (handle) => handle.getQuery().length === 0,\n },\n },\n actions: {\n set_query: {\n // Pure ephemeral filter text — narrows the result popover, no persisted change.\n safety: 'read',\n argsType: '{ query: string }',\n argsSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Filter text for the search.' },\n },\n required: ['query'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.searchBar.actions.setQuery',\n description:\n 'Replace the current query (inline mode only). No-op in launcher mode.',\n invoke: (handle, args: { query: string }) => {\n handle.setQuery(args.query);\n },\n },\n clear: {\n // Clears transient search state — no user content lost.\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.searchBar.actions.clear',\n description: 'Clear the query and close the result popover.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n submit: {\n // Opens the palette / commits the highlighted option — ephemeral UI navigation.\n safety: 'read',\n descriptionKey: 'ui.agent.searchBar.actions.submit',\n description:\n 'In launcher mode opens the CommandPalette; in inline mode commits the highlighted option.',\n invoke: (handle) => {\n handle.submit();\n },\n },\n focus: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.searchBar.actions.focus',\n description: 'Move keyboard focus to the SearchBar.',\n invoke: (handle) => {\n handle.focus();\n },\n },\n apply_saved_search: {\n // Selects a stored search by id — pure UI routing into the existing handler.\n safety: 'read',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n description: 'Saved-search id resolved by the host handler.',\n },\n },\n required: ['id'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.searchBar.actions.applySavedSearch',\n description:\n 'Apply a saved-search by id. The host wires the actual query lookup; the adapter routes the id to its onApplySavedSearch handler. No-op when no handler is wired.',\n invoke: (handle, args: { id: string }) => {\n handle.applySavedSearch(args.id);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'search-bar',\n description: 'Marks the SearchBar root.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Search } from 'lucide-react';\nimport * as RadixPopover from '@radix-ui/react-popover';\nimport {\n SearchInput,\n type SearchInputRefValue,\n} from '../search-input/search-input';\nimport { useDebouncedCallback, normalizeDiacritics } from '../_shared';\nimport { MENU_ROW_HIGHLIGHT } from '../_shared/menu-row';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { searchBarAgent } from './search-bar.agent';\n\n/* ------------------------------------------------------------------ */\n/* Shortcut detection */\n/* ------------------------------------------------------------------ */\n\nfunction isMacLike(): boolean {\n if (typeof navigator === 'undefined') return false;\n // Prefer `userAgentData.platform` where supported; fall back to the\n // deprecated `navigator.platform`. Both are strings; we just look for\n // `mac`.\n const uaData = (\n navigator as unknown as {\n userAgentData?: { platform?: string };\n }\n ).userAgentData;\n const platformString = uaData?.platform ?? navigator.platform ?? '';\n return /mac/i.test(platformString);\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst launcherVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n // Same visual language as <SearchInput> so the launcher truly looks\n // like an input. --muted-foreground over --background meets AA 4.5:1\n // in every theme; --muted is a mid-tone not suitable as a surface.\n 'ds:bg-[var(--background)] ds:border ds:border-[color:var(--control-border)]',\n 'ds:text-[color:var(--muted-foreground)]',\n // Opaque hover — mix 20% muted into --background so the launcher stays a\n // solid surface even when placed over a brand-tinted parent (e.g. the\n // Header's `brand` variant).\n 'ds:hover:bg-[color-mix(in_srgb,var(--muted)_20%,var(--background))]',\n 'ds:transition-colors ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)]',\n 'ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:disabled:opacity-50 ds:disabled:cursor-not-allowed',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:text-[length:var(--font-size-sm)]',\n md: 'ds:text-[length:var(--font-size-base)]',\n lg: 'ds:text-[length:var(--font-size-lg)]',\n },\n density: {\n default: '',\n compact: 'ds:min-h-0 ds:h-8',\n },\n },\n defaultVariants: {\n size: 'md',\n density: 'default',\n },\n },\n);\n\nconst inlineWrapperVariants = cva(\n ['ds:inline-flex ds:flex-col', 'ds:w-full'].join(' '),\n {\n variants: {\n size: {\n sm: '',\n md: '',\n lg: '',\n },\n density: {\n default: '',\n compact: '',\n },\n },\n defaultVariants: {\n size: 'md',\n density: 'default',\n },\n },\n);\n\nconst shortcutPillVariants = cva(\n [\n 'ds:hidden ds:md:inline-flex ds:items-center ds:gap-[calc(var(--spacing-xs)/2)]',\n 'ds:ms-auto',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:border ds:border-[color:var(--border)]',\n 'ds:bg-[var(--background)]',\n 'ds:ps-[calc(var(--spacing-xs)/1.2)] ds:pe-[calc(var(--spacing-xs)/1.2)]',\n 'ds:py-[calc(var(--spacing-xs)/2)]',\n // Use full --foreground (not --muted-foreground) so axe's contrast\n // check clears 4.5:1 even against the 1px --border edge region.\n 'ds:text-[length:var(--font-size-xs)] ds:text-[color:var(--foreground)]',\n 'ds:font-[family-name:var(--font-mono)]',\n ].join(' '),\n);\n\nconst popoverContentVariants = cva(\n [\n 'ds:z-[var(--z-dropdown)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:border ds:border-[color:var(--border)]',\n 'ds:bg-[var(--popover)] ds:text-[color:var(--popover-foreground)]',\n 'ds:shadow-[var(--shadow-lg)]',\n 'ds:p-[var(--spacing-xs)]',\n // Motion gates — reduced-motion honoured via .theme-accessible's 0ms\n // animation-duration token.\n 'ds:data-[state=open]:animate-in ds:data-[state=closed]:animate-out',\n 'ds:data-[state=open]:fade-in ds:data-[state=closed]:fade-out',\n 'ds:motion-reduce:animate-none',\n ].join(' '),\n);\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport interface SearchBarResultItem {\n id: string;\n /** Display label. */\n label: string;\n /** Optional icon rendered on inline-start (aria-hidden). */\n icon?: ReactNode;\n /** Optional right-aligned meta text (tag, count, section label). */\n meta?: string;\n /** Optional href — the list renders anchors when present. */\n href?: string;\n}\n\nexport interface SearchBarResultGroup {\n /** Heading displayed above the items (aria-hidden=\"true\" — visual only). */\n heading?: string;\n items: SearchBarResultItem[];\n}\n\ntype SharedProps = {\n size?: 'sm' | 'md' | 'lg';\n density?: 'default' | 'compact';\n /** `true` wraps in <search role=\"search\"> when this is the page's primary search. */\n topLevel?: boolean;\n placeholder?: string;\n /** Platform-aware shortcut pill — default `true` (hidden below `md` breakpoint). */\n shortcutHint?: boolean;\n className?: string;\n /**\n * Consumer-supplied instance id, surfaced as `data-component-id` so an\n * agent / UI bridge can address this instance.\n */\n id?: string;\n /**\n * Called when an external driver (agent adapter) asks the host to apply\n * a saved search by id. The host is responsible for resolving the saved\n * search and feeding the resulting query back through `value` /\n * `onQueryChange`. No-op when not provided.\n */\n onApplySavedSearch?: (id: string) => void;\n};\n\n/**\n * Imperative handle for agent-readiness + programmatic control. Replaces\n * the previously-forwarded `HTMLDivElement` ref. Consumers who needed the\n * DOM element for layout queries should wrap the SearchBar in their own\n * div with a ref attached.\n */\nexport interface SearchBarHandle {\n getQuery: () => string;\n setQuery: (query: string) => void;\n clear: () => void;\n submit: () => void;\n focus: () => void;\n applySavedSearch: (id: string) => void;\n}\n\ntype LauncherProps = SharedProps & {\n mode?: 'launcher';\n /** Called on click / Enter / global Cmd/Ctrl+K. */\n onOpenCommandPalette: () => void;\n // Not used in launcher mode.\n value?: never;\n defaultValue?: never;\n onQueryChange?: never;\n results?: never;\n onSelect?: never;\n debounceMs?: never;\n};\n\ntype InlineProps = SharedProps & {\n mode: 'inline';\n value?: string;\n defaultValue?: string;\n onQueryChange?: (query: string) => void;\n /** Groups of results rendered in the popover. */\n results?: SearchBarResultGroup[];\n onSelect?: (item: SearchBarResultItem) => void;\n debounceMs?: number;\n // Not used in inline mode.\n onOpenCommandPalette?: never;\n};\n\nexport type SearchBarProps = (LauncherProps | InlineProps) &\n Omit<\n HTMLAttributes<HTMLDivElement>,\n 'role' | 'onChange' | 'children' | 'defaultValue' | 'results'\n > &\n VariantProps<typeof launcherVariants>;\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nexport function filterSearchResults(\n query: string,\n groups: SearchBarResultGroup[],\n): SearchBarResultGroup[] {\n const needle = normalizeDiacritics(query.trim());\n if (needle === '') return groups;\n return groups\n .map((g) => ({\n ...g,\n items: g.items.filter((item) =>\n normalizeDiacritics(item.label).includes(needle),\n ),\n }))\n .filter((g) => g.items.length > 0);\n}\n\n/* ------------------------------------------------------------------ */\n/* SearchBar */\n/* ------------------------------------------------------------------ */\n\nexport const SearchBar = forwardRef<HTMLDivElement, SearchBarProps>(\n (props, ref) => {\n // Strip every API prop from `...rest` so nothing leaks to the DOM as\n // an unknown attribute (React warns in DEV and some become invalid\n // HTML in production).\n const {\n mode = 'launcher',\n size = 'md',\n density = 'default',\n topLevel = false,\n placeholder,\n shortcutHint = true,\n className,\n onOpenCommandPalette,\n id,\n onApplySavedSearch,\n value: _value,\n defaultValue: _defaultValue,\n onQueryChange: _onQueryChange,\n results: _results,\n onSelect: _onSelect,\n debounceMs: _debounceMs,\n ...rest\n } = props as SearchBarProps & { className?: string };\n // silence unused-var warnings for the destructured siblings we only\n // needed to peel off the spread target.\n void _value;\n void _defaultValue;\n void _onQueryChange;\n void _results;\n void _onSelect;\n void _debounceMs;\n\n const { t } = useTranslation('ui');\n const [isMac, setIsMac] = useState(false);\n useEffect(() => {\n setIsMac(isMacLike());\n }, []);\n\n const shortcutLabel = isMac ? '\\u2318K' : 'Ctrl+K';\n // Advertise the shortcut on the launcher button. The binding itself\n // lives in `useCommandPalette()` (CommandPalette owns its open state);\n // duplicating the listener here would cause a double-fire.\n const ariaKeyshortcuts = 'Meta+K Control+K';\n\n /* ---- Landmark role --------------------------------------------- */\n const landmarkProps = topLevel\n ? { role: 'search' as const }\n : { role: undefined };\n\n /* ---- LAUNCHER MODE -------------------------------------------- */\n if (mode === 'launcher') {\n const resolvedPlaceholder =\n placeholder ?? t('search.placeholder', 'Search\\u2026');\n return (\n <LauncherSearchBar\n forwardedRef={ref}\n id={id}\n landmarkProps={landmarkProps}\n className={className}\n onOpenCommandPalette={onOpenCommandPalette}\n onApplySavedSearch={onApplySavedSearch}\n resolvedPlaceholder={resolvedPlaceholder}\n openLabel={t('search.open', 'Open search')}\n ariaKeyshortcuts={ariaKeyshortcuts}\n launcherClass={launcherVariants({ size, density })}\n shortcutHint={shortcutHint}\n shortcutLabel={shortcutLabel}\n rest={rest as HTMLAttributes<HTMLButtonElement>}\n />\n );\n }\n\n /* ---- INLINE MODE ---------------------------------------------- */\n const inlineProps = props as InlineProps;\n return (\n <InlineSearchBar\n forwardedRef={ref}\n size={size}\n density={density}\n landmarkProps={landmarkProps}\n placeholder={placeholder}\n shortcutHint={shortcutHint}\n shortcutLabel={shortcutLabel}\n ariaKeyshortcuts={ariaKeyshortcuts}\n className={className}\n id={id}\n onApplySavedSearch={onApplySavedSearch}\n {...inlineProps}\n />\n );\n },\n);\n\nSearchBar.displayName = 'SearchBar';\n\n/* ------------------------------------------------------------------ */\n/* LauncherSearchBar \\u2014 internal */\n/* ------------------------------------------------------------------ */\n\ninterface LauncherInternalProps {\n forwardedRef: React.ForwardedRef<HTMLDivElement>;\n id?: string;\n landmarkProps: { role?: 'search' };\n className?: string;\n onOpenCommandPalette?: () => void;\n onApplySavedSearch?: (id: string) => void;\n resolvedPlaceholder: string;\n openLabel: string;\n ariaKeyshortcuts: string;\n launcherClass: string;\n shortcutHint: boolean;\n shortcutLabel: string;\n rest: HTMLAttributes<HTMLButtonElement>;\n}\n\nfunction LauncherSearchBar(props: LauncherInternalProps): ReactNode {\n const {\n forwardedRef,\n id,\n landmarkProps,\n className,\n onOpenCommandPalette,\n onApplySavedSearch,\n resolvedPlaceholder,\n openLabel,\n ariaKeyshortcuts,\n launcherClass,\n shortcutHint,\n shortcutLabel,\n rest,\n } = props;\n const buttonRef = useRef<HTMLButtonElement>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n\n const handle = useMemo<SearchBarHandle>(\n () => ({\n getQuery: () => '',\n // Launcher mode is stateless \\u2014 it delegates to CommandPalette.\n setQuery: () => {},\n clear: () => {},\n submit: () => onOpenCommandPalette?.(),\n focus: () => buttonRef.current?.focus(),\n applySavedSearch: (savedId: string) => onApplySavedSearch?.(savedId),\n }),\n [onOpenCommandPalette, onApplySavedSearch],\n );\n useImperativeHandle(\n forwardedRef,\n () => rootRef.current as HTMLDivElement,\n [],\n );\n useAgentRegistration(searchBarAgent, handle, id);\n\n return (\n <div\n ref={rootRef}\n {...landmarkProps}\n data-component=\"search-bar\"\n data-component-id={id}\n id={id}\n className={className}\n >\n <button\n ref={buttonRef}\n type=\"button\"\n onClick={onOpenCommandPalette}\n aria-haspopup=\"dialog\"\n aria-label={openLabel}\n aria-keyshortcuts={ariaKeyshortcuts}\n className={launcherClass}\n {...rest}\n >\n <Search\n aria-hidden\n className=\"ds:size-4 ds:shrink-0\"\n focusable=\"false\"\n />\n <span aria-hidden=\"true\" className=\"ds:truncate ds:text-start\">\n {resolvedPlaceholder}\n </span>\n {shortcutHint ? (\n <kbd className={shortcutPillVariants()}>{shortcutLabel}</kbd>\n ) : null}\n </button>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* InlineSearchBar — internal */\n/* ------------------------------------------------------------------ */\n\ninterface InlineInternalProps extends InlineProps {\n forwardedRef: React.ForwardedRef<HTMLDivElement>;\n size: 'sm' | 'md' | 'lg';\n density: 'default' | 'compact';\n landmarkProps: { role?: 'search' };\n shortcutHint: boolean;\n shortcutLabel: string;\n ariaKeyshortcuts: string;\n className?: string;\n id?: string;\n onApplySavedSearch?: (id: string) => void;\n}\n\nfunction InlineSearchBar(props: InlineInternalProps): ReactNode {\n const {\n forwardedRef,\n size,\n density,\n landmarkProps,\n placeholder,\n shortcutHint,\n shortcutLabel,\n ariaKeyshortcuts,\n className,\n id,\n onApplySavedSearch,\n value,\n defaultValue,\n onQueryChange,\n results,\n onSelect,\n debounceMs = 150,\n } = props;\n\n const { t } = useTranslation('ui');\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState(defaultValue ?? '');\n const query = isControlled ? (value ?? '') : internalValue;\n\n const [open, setOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState(0);\n // SearchInput forwards an `HTMLInputElement` with the curated handle\n // methods grafted on — for our purposes we just need `.focus()`.\n const inputRef = useRef<HTMLInputElement | null>(null);\n const listboxId = useId();\n\n const debouncedQueryChange = useDebouncedCallback((next: string) => {\n onQueryChange?.(next);\n }, debounceMs);\n\n // Uncontrolled, SearchInput is left uncontrolled too. (A controlled\n // TextInput would also keep the query out of the `value` attribute,\n // through useDomValue; this path predates that.) A change made here rather\n // than typed goes in through SearchInput's own handle; handleInput ignores\n // the echo.\n const writingRef = useRef(false);\n const writeQuery = useCallback((next: string) => {\n const node = inputRef.current as SearchInputRefValue | null;\n if (!node || typeof node.setQuery !== 'function') return;\n writingRef.current = true;\n try {\n node.setQuery(next);\n } finally {\n writingRef.current = false;\n }\n }, []);\n\n const flatResults = useMemo<SearchBarResultItem[]>(() => {\n if (!results) return [];\n return results.flatMap((g) => g.items);\n }, [results]);\n\n // Reset active index whenever the result count changes.\n useEffect(() => {\n if (activeIndex > flatResults.length - 1) setActiveIndex(0);\n }, [flatResults.length, activeIndex]);\n\n const handleInput = useCallback(\n (raw: string) => {\n if (writingRef.current) return;\n if (!isControlled) setInternalValue(raw);\n debouncedQueryChange(raw);\n setOpen(raw.trim().length > 0);\n },\n [debouncedQueryChange, isControlled],\n );\n\n const commit = useCallback(\n (item: SearchBarResultItem) => {\n onSelect?.(item);\n setOpen(false);\n if (!isControlled) {\n setInternalValue('');\n writeQuery('');\n }\n },\n [onSelect, isControlled, writeQuery],\n );\n\n const handleKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (event.nativeEvent.isComposing || event.keyCode === 229) return;\n if (!open && event.key === 'ArrowDown' && flatResults.length > 0) {\n event.preventDefault();\n setOpen(true);\n return;\n }\n if (!open) return;\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n setActiveIndex((i) => (i + 1) % Math.max(flatResults.length, 1));\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n setActiveIndex(\n (i) =>\n (i - 1 + Math.max(flatResults.length, 1)) %\n Math.max(flatResults.length, 1),\n );\n } else if (event.key === 'Enter') {\n const item = flatResults[activeIndex];\n if (item) {\n event.preventDefault();\n commit(item);\n }\n } else if (event.key === 'Escape') {\n event.preventDefault();\n setOpen(false);\n }\n },\n [open, flatResults, activeIndex, commit],\n );\n\n const resolvedPlaceholder =\n placeholder ?? t('search.placeholder', 'Search\\u2026');\n\n const hasResults = flatResults.length > 0;\n // aria-activedescendant may only reference an element that actually exists\n // in the DOM — so only set it when the popover is open AND there are\n // results to land on. Referencing a non-existent option is an a11y\n // violation (aria-valid-attr-value).\n const activeDescendantId =\n open && hasResults ? `${listboxId}-option-${activeIndex}` : undefined;\n\n const setQueryProgrammatic = useCallback(\n (next: string) => {\n if (!isControlled) {\n setInternalValue(next);\n writeQuery(next);\n }\n onQueryChange?.(next);\n setOpen(next.trim().length > 0);\n },\n [isControlled, onQueryChange, writeQuery],\n );\n\n const rootRef = useRef<HTMLDivElement>(null);\n useImperativeHandle(\n forwardedRef,\n () => rootRef.current as HTMLDivElement,\n [],\n );\n\n const agentHandle = useMemo<SearchBarHandle>(\n () => ({\n getQuery: () => query,\n setQuery: setQueryProgrammatic,\n clear: () => {\n setQueryProgrammatic('');\n },\n submit: () => {\n const item = flatResults[activeIndex];\n if (item) commit(item);\n },\n focus: () => inputRef.current?.focus(),\n applySavedSearch: (savedId: string) => onApplySavedSearch?.(savedId),\n }),\n [\n query,\n setQueryProgrammatic,\n flatResults,\n activeIndex,\n commit,\n onApplySavedSearch,\n ],\n );\n useAgentRegistration(searchBarAgent, agentHandle, id);\n\n return (\n <RadixPopover.Root open={open && hasResults} onOpenChange={setOpen}>\n <div\n ref={rootRef}\n {...landmarkProps}\n id={id}\n data-component=\"search-bar\"\n data-component-id={id}\n className={[inlineWrapperVariants({ size, density }), className]\n .filter(Boolean)\n .join(' ')}\n >\n <RadixPopover.Anchor asChild>\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions -- keyboard handling propagates to the inner SearchInput; this wrapper captures combobox/listbox keys */}\n <div\n className=\"ds:relative ds:flex ds:items-center\"\n onKeyDown={handleKeyDown}\n >\n <SearchInput\n ref={inputRef}\n size={size}\n {...(isControlled ? { value: query } : { defaultValue })}\n onInput={handleInput}\n placeholder={resolvedPlaceholder}\n aria-label={t('search.label', 'Search')}\n aria-keyshortcuts={ariaKeyshortcuts}\n role=\"combobox\"\n aria-expanded={open && hasResults}\n aria-controls={listboxId}\n aria-activedescendant={activeDescendantId}\n />\n {shortcutHint ? (\n <kbd\n className={[\n shortcutPillVariants(),\n 'ds:absolute ds:end-[var(--spacing-sm)] ds:top-1/2 ds:-translate-y-1/2',\n 'ds:pointer-events-none',\n ].join(' ')}\n >\n {shortcutLabel}\n </kbd>\n ) : null}\n </div>\n </RadixPopover.Anchor>\n <RadixPopover.Portal>\n <RadixPopover.Content\n side=\"bottom\"\n align=\"start\"\n sideOffset={4}\n aria-label={t('search.resultsLabel', 'Search results')}\n onOpenAutoFocus={(e) => e.preventDefault()}\n // Width matches the anchor via Radix's CSS variable. Applied\n // as a Tailwind arbitrary-value class so no inline style is\n // needed (23-constraints §4).\n className={[\n popoverContentVariants(),\n 'ds:w-[var(--radix-popover-trigger-width)]',\n ].join(' ')}\n >\n {/* listbox uses <div> rather than <ul> so the option role\n children don't trip the `<ul> must only contain <li>` axe\n rule. Options are direct descendants of the listbox root\n per the WAI-ARIA listbox pattern. */}\n <div\n id={listboxId}\n role=\"listbox\"\n aria-label={t('search.resultsLabel', 'Search results')}\n className=\"ds:flex ds:flex-col ds:gap-[calc(var(--spacing-xs)/2)]\"\n >\n {results && results.length > 0 ? (\n renderGroups(\n results,\n activeIndex,\n listboxId,\n commit,\n setActiveIndex,\n )\n ) : (\n <div\n role=\"presentation\"\n className=\"ds:p-[var(--spacing-sm)] type-body-sm ds:text-[color:var(--foreground)]\"\n >\n {t(\n 'search.noResults',\n 'No results for \\u201C{{query}}\\u201D',\n {\n query,\n },\n )}\n </div>\n )}\n </div>\n </RadixPopover.Content>\n </RadixPopover.Portal>\n </div>\n </RadixPopover.Root>\n );\n}\n\nfunction renderGroups(\n groups: SearchBarResultGroup[],\n activeIndex: number,\n listboxId: string,\n onCommit: (item: SearchBarResultItem) => void,\n setActive: (index: number) => void,\n): ReactNode {\n let flatIndex = 0;\n // Flatten groups + headings into a single-level sequence of divs at the\n // listbox root. `role=\"group\"` wrappers keep the visual grouping while\n // keeping options as direct descendants of the listbox.\n return groups.map((group, gi) => {\n const headingId = group.heading\n ? `${listboxId}-group-${gi}-heading`\n : undefined;\n return (\n <div\n key={`g-${gi}`}\n role={group.heading ? 'group' : 'presentation'}\n aria-labelledby={headingId}\n >\n {group.heading ? (\n <div\n id={headingId}\n aria-hidden=\"true\"\n className=\"ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)] type-eyebrow ds:text-[color:var(--foreground)]\"\n >\n {group.heading}\n </div>\n ) : null}\n {group.items.map((item) => {\n const myIndex = flatIndex;\n flatIndex += 1;\n const isActive = myIndex === activeIndex;\n const optionId = `${listboxId}-option-${myIndex}`;\n const safeHref = safeNavigationHref(item.href);\n const commonClass = [\n 'ds:flex ds:items-center ds:gap-[var(--spacing-sm)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n 'ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:cursor-pointer',\n 'ds:no-underline ds:text-[color:var(--foreground)]',\n 'ds:min-h-[var(--min-target-size)]',\n MENU_ROW_HIGHLIGHT.active,\n ].join(' ');\n const body = (\n <>\n {item.icon ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:inline-flex ds:size-4 ds:shrink-0 ds:items-center ds:justify-center\"\n >\n {item.icon}\n </span>\n ) : null}\n <span className=\"ds:flex-1 ds:text-[length:var(--font-size-sm)]\">\n {item.label}\n </span>\n {item.meta ? (\n <span className=\"ds:ms-auto type-meta ds:text-[color:var(--foreground)]\">\n {item.meta}\n </span>\n ) : null}\n </>\n );\n const shared = {\n id: optionId,\n role: 'option' as const,\n 'aria-selected': isActive,\n 'data-active': isActive || undefined,\n // onMouseDown rather than onClick so we trigger before the\n // input loses focus to the pointer-down on the popover.\n onMouseDown: (e: React.MouseEvent) => {\n e.preventDefault();\n onCommit(item);\n },\n onMouseEnter: () => setActive(myIndex),\n className: commonClass,\n };\n if (safeHref) {\n return (\n <a key={item.id} href={safeHref} {...shared}>\n {body}\n </a>\n );\n }\n return (\n <div key={item.id} {...shared}>\n {body}\n </div>\n );\n })}\n </div>\n );\n });\n}\n\n/**\n * Allow-list for result-item `href` strings. Same allow-list as the\n * chat-message token renderer: http(s) + mailto + tel + same-origin\n * relative paths. Anything else (including `javascript:` and `data:`)\n * returns `undefined`, causing the renderer to fall back to a <div>.\n */\nfunction safeNavigationHref(href: string | undefined): string | undefined {\n if (!href) return undefined;\n const trimmed = href.trim();\n if (trimmed === '') return undefined;\n if (/^(https?:|mailto:|tel:)/i.test(trimmed)) return trimmed;\n // Same-origin relative paths are safe because the browser resolves\n // against `window.location`. Leading `/` or `./` or `../` qualify.\n if (/^(\\/|\\.\\/|\\.\\.\\/)/.test(trimmed)) return trimmed;\n return undefined;\n}\n"],"names":["searchBarAgent","handle","args","isMacLike","uaData","platformString","launcherVariants","cva","inlineWrapperVariants","shortcutPillVariants","popoverContentVariants","filterSearchResults","query","groups","needle","normalizeDiacritics","g","item","SearchBar","forwardRef","props","ref","mode","size","density","topLevel","placeholder","shortcutHint","className","onOpenCommandPalette","id","onApplySavedSearch","_value","_defaultValue","_onQueryChange","_results","_onSelect","_debounceMs","rest","t","useTranslation","isMac","setIsMac","useState","useEffect","shortcutLabel","ariaKeyshortcuts","landmarkProps","resolvedPlaceholder","jsx","LauncherSearchBar","InlineSearchBar","forwardedRef","openLabel","launcherClass","buttonRef","useRef","rootRef","useMemo","_a","savedId","useImperativeHandle","useAgentRegistration","jsxs","Search","value","defaultValue","onQueryChange","results","onSelect","debounceMs","isControlled","internalValue","setInternalValue","open","setOpen","activeIndex","setActiveIndex","inputRef","listboxId","useId","debouncedQueryChange","useDebouncedCallback","next","writingRef","writeQuery","useCallback","node","flatResults","handleInput","raw","commit","handleKeyDown","event","i","hasResults","activeDescendantId","setQueryProgrammatic","agentHandle","RadixPopover","SearchInput","renderGroups","onCommit","setActive","flatIndex","group","gi","headingId","myIndex","isActive","optionId","safeHref","safeNavigationHref","commonClass","MENU_ROW_HIGHLIGHT","body","Fragment","shared","e","href","trimmed"],"mappings":"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"}