@alfadocs/ui-kit-debug 1.130.1 → 1.131.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 (225) hide show
  1. package/dist/_chunks/{actions-cell-renderer-DTaIQKp9.js → actions-cell-renderer-C-l_ppP6.js} +3 -3
  2. package/dist/_chunks/{actions-cell-renderer-DTaIQKp9.js.map → actions-cell-renderer-C-l_ppP6.js.map} +1 -1
  3. package/dist/_chunks/{alia-sidebar-BBxbMRmX.js → alia-sidebar-CK1zw_Bc.js} +2 -2
  4. package/dist/_chunks/{alia-sidebar-BBxbMRmX.js.map → alia-sidebar-CK1zw_Bc.js.map} +1 -1
  5. package/dist/_chunks/{anamnesis-summary-rows-CtcULkvc.js → anamnesis-summary-rows-CCNmkq55.js} +5 -5
  6. package/dist/_chunks/{anamnesis-summary-rows-CtcULkvc.js.map → anamnesis-summary-rows-CCNmkq55.js.map} +1 -1
  7. package/dist/_chunks/{appointment-card-vbUsDh70.js → appointment-card-OAOur8lH.js} +2 -2
  8. package/dist/_chunks/{appointment-card-vbUsDh70.js.map → appointment-card-OAOur8lH.js.map} +1 -1
  9. package/dist/_chunks/{appointment-peek-DdUhqfEi.js → appointment-peek-DZa6xyUb.js} +2 -2
  10. package/dist/_chunks/{appointment-peek-DdUhqfEi.js.map → appointment-peek-DZa6xyUb.js.map} +1 -1
  11. package/dist/_chunks/{appointment-timeline-B5pfBl-b.js → appointment-timeline-DQePqpyH.js} +3 -3
  12. package/dist/_chunks/{appointment-timeline-B5pfBl-b.js.map → appointment-timeline-DQePqpyH.js.map} +1 -1
  13. package/dist/_chunks/{appointment-tray-BhiXetjs.js → appointment-tray-DSFqO5Rm.js} +2 -2
  14. package/dist/_chunks/{appointment-tray-BhiXetjs.js.map → appointment-tray-DSFqO5Rm.js.map} +1 -1
  15. package/dist/_chunks/{balance-badge-cell-BtFge7Y6.js → balance-badge-cell-DTiMdnCZ.js} +4 -4
  16. package/dist/_chunks/{balance-badge-cell-BtFge7Y6.js.map → balance-badge-cell-DTiMdnCZ.js.map} +1 -1
  17. package/dist/_chunks/bill-line-table-DHKb_O7c.js +2000 -0
  18. package/dist/_chunks/bill-line-table-DHKb_O7c.js.map +1 -0
  19. package/dist/_chunks/body-pointer-lock-CsOEDm1I.js +15 -0
  20. package/dist/_chunks/body-pointer-lock-CsOEDm1I.js.map +1 -0
  21. package/dist/_chunks/{button-group-B2MJo0Se.js → button-group-DuQuuulC.js} +2 -2
  22. package/dist/_chunks/{button-group-B2MJo0Se.js.map → button-group-DuQuuulC.js.map} +1 -1
  23. package/dist/_chunks/{calculator-dialog-BGX5XQCM.js → calculator-dialog-Cg3GjaRf.js} +2 -2
  24. package/dist/_chunks/{calculator-dialog-BGX5XQCM.js.map → calculator-dialog-Cg3GjaRf.js.map} +1 -1
  25. package/dist/_chunks/{calendar-DzR-vdJ5.js → calendar-BIoOeBTT.js} +103 -103
  26. package/dist/_chunks/{calendar-DzR-vdJ5.js.map → calendar-BIoOeBTT.js.map} +1 -1
  27. package/dist/_chunks/{calendar-appointment-editor-dialog-CXch4Pmu.js → calendar-appointment-editor-dialog-WW6V1SGh.js} +15 -15
  28. package/dist/_chunks/{calendar-appointment-editor-dialog-CXch4Pmu.js.map → calendar-appointment-editor-dialog-WW6V1SGh.js.map} +1 -1
  29. package/dist/_chunks/{care-plan-card-CwgkImOD.js → care-plan-card-DKScH9Ss.js} +2 -2
  30. package/dist/_chunks/{care-plan-card-CwgkImOD.js.map → care-plan-card-DKScH9Ss.js.map} +1 -1
  31. package/dist/_chunks/{care-plan-entry-card-cdojypxu.js → care-plan-entry-card-AG1y3nyW.js} +2 -2
  32. package/dist/_chunks/{care-plan-entry-card-cdojypxu.js.map → care-plan-entry-card-AG1y3nyW.js.map} +1 -1
  33. package/dist/_chunks/{chart-Aue_2dMb.js → chart-D0EeFWst.js} +2 -2
  34. package/dist/_chunks/{chart-Aue_2dMb.js.map → chart-D0EeFWst.js.map} +1 -1
  35. package/dist/_chunks/{dashboard-grid-CaxgaEgI.js → dashboard-grid-2uVXEe9e.js} +2 -2
  36. package/dist/_chunks/{dashboard-grid-CaxgaEgI.js.map → dashboard-grid-2uVXEe9e.js.map} +1 -1
  37. package/dist/_chunks/{data-grid-C9xlUMLt.js → data-grid-B2oaI7Lt.js} +2345 -2328
  38. package/dist/_chunks/data-grid-B2oaI7Lt.js.map +1 -0
  39. package/dist/_chunks/{data-table-BCfkcPti.js → data-table-FTV3uRjX.js} +3 -3
  40. package/dist/_chunks/{data-table-BCfkcPti.js.map → data-table-FTV3uRjX.js.map} +1 -1
  41. package/dist/_chunks/{default-tabs-BnB6FUEW.js → default-tabs-DbebYO04.js} +5 -5
  42. package/dist/_chunks/{default-tabs-BnB6FUEW.js.map → default-tabs-DbebYO04.js.map} +1 -1
  43. package/dist/_chunks/{dialog-CIUn5oLb.js → dialog-CVTxyR0v.js} +48 -47
  44. package/dist/_chunks/dialog-CVTxyR0v.js.map +1 -0
  45. package/dist/_chunks/{document-preview-BWDTCEHI.js → document-preview-_kQ9QvZV.js} +2 -2
  46. package/dist/_chunks/{document-preview-BWDTCEHI.js.map → document-preview-_kQ9QvZV.js.map} +1 -1
  47. package/dist/_chunks/{dropdown-menu-Dw6sgQwJ.js → dropdown-menu-DBWaW4pq.js} +92 -88
  48. package/dist/_chunks/dropdown-menu-DBWaW4pq.js.map +1 -0
  49. package/dist/_chunks/{editable-currency-cell-renderer-BlK-8A7b.js → editable-currency-cell-renderer-CZMQ5xRT.js} +2 -2
  50. package/dist/_chunks/{editable-currency-cell-renderer-BlK-8A7b.js.map → editable-currency-cell-renderer-CZMQ5xRT.js.map} +1 -1
  51. package/dist/_chunks/{face-scheme-Bt07zQJU.js → face-scheme-D_Y1StPl.js} +3 -3
  52. package/dist/_chunks/{face-scheme-Bt07zQJU.js.map → face-scheme-D_Y1StPl.js.map} +1 -1
  53. package/dist/_chunks/{file-manager-Dpwv0qs-.js → file-manager-Bzr5NK1t.js} +5 -5
  54. package/dist/_chunks/{file-manager-Dpwv0qs-.js.map → file-manager-Bzr5NK1t.js.map} +1 -1
  55. package/dist/_chunks/{header-settings-ZGvYAuKF.js → header-settings-Cu-MKOsO.js} +2 -2
  56. package/dist/_chunks/{header-settings-ZGvYAuKF.js.map → header-settings-Cu-MKOsO.js.map} +1 -1
  57. package/dist/_chunks/{heatmap-Ds5DJBUL.js → heatmap-C5gJin_F.js} +3 -3
  58. package/dist/_chunks/{heatmap-Ds5DJBUL.js.map → heatmap-C5gJin_F.js.map} +1 -1
  59. package/dist/_chunks/{help-me-write-templates-C28E_rOt.js → help-me-write-templates-DO6vJeP4.js} +2 -2
  60. package/dist/_chunks/{help-me-write-templates-C28E_rOt.js.map → help-me-write-templates-DO6vJeP4.js.map} +1 -1
  61. package/dist/_chunks/{icon-button-group-BKtkVZ1W.js → icon-button-group-SmkdVCNx.js} +2 -2
  62. package/dist/_chunks/{icon-button-group-BKtkVZ1W.js.map → icon-button-group-SmkdVCNx.js.map} +1 -1
  63. package/dist/_chunks/{invoice-upload-list-tJY7W1g_.js → invoice-upload-list-B5aMffTy.js} +22 -22
  64. package/dist/_chunks/{invoice-upload-list-tJY7W1g_.js.map → invoice-upload-list-B5aMffTy.js.map} +1 -1
  65. package/dist/_chunks/{link-cell-renderer-CC9VHU68.js → link-cell-renderer-D3JLPURZ.js} +2 -2
  66. package/dist/_chunks/{link-cell-renderer-CC9VHU68.js.map → link-cell-renderer-D3JLPURZ.js.map} +1 -1
  67. package/dist/_chunks/{marketplace-app-shell-D_HA8CKx.js → marketplace-app-shell-dMmxI6MT.js} +4 -4
  68. package/dist/_chunks/{marketplace-app-shell-D_HA8CKx.js.map → marketplace-app-shell-dMmxI6MT.js.map} +1 -1
  69. package/dist/_chunks/{muscle-scheme-DdIdm8Gw.js → muscle-scheme-BGJD62op.js} +2 -2
  70. package/dist/_chunks/{muscle-scheme-DdIdm8Gw.js.map → muscle-scheme-BGJD62op.js.map} +1 -1
  71. package/dist/_chunks/{notes-panel-DIY7eNsq.js → notes-panel-Cm-_pCRJ.js} +3 -3
  72. package/dist/_chunks/{notes-panel-DIY7eNsq.js.map → notes-panel-Cm-_pCRJ.js.map} +1 -1
  73. package/dist/_chunks/{parts-tGzYz0uG.js → parts-BOnDDU3E.js} +2 -2
  74. package/dist/_chunks/{parts-tGzYz0uG.js.map → parts-BOnDDU3E.js.map} +1 -1
  75. package/dist/_chunks/{patient-search-OAwFgOW3.js → patient-search-DBvLFArV.js} +2 -2
  76. package/dist/_chunks/{patient-search-OAwFgOW3.js.map → patient-search-DBvLFArV.js.map} +1 -1
  77. package/dist/_chunks/{practice-results-BDnZtbDM.js → practice-results-M5A9-X9y.js} +3 -3
  78. package/dist/_chunks/{practice-results-BDnZtbDM.js.map → practice-results-M5A9-X9y.js.map} +1 -1
  79. package/dist/_chunks/{public-header.agent-Db4wm6_S.js → public-header.agent-DaeDfLfy.js} +2 -2
  80. package/dist/_chunks/{public-header.agent-Db4wm6_S.js.map → public-header.agent-DaeDfLfy.js.map} +1 -1
  81. package/dist/_chunks/{radiograph-panel.agent-B-r3BoqU.js → radiograph-panel.agent-88VjqlG7.js} +2 -2
  82. package/dist/_chunks/{radiograph-panel.agent-B-r3BoqU.js.map → radiograph-panel.agent-88VjqlG7.js.map} +1 -1
  83. package/dist/_chunks/{rich-text-editor-TnX0SYdq.js → rich-text-editor-DjHL1b3E.js} +3 -3
  84. package/dist/_chunks/{rich-text-editor-TnX0SYdq.js.map → rich-text-editor-DjHL1b3E.js.map} +1 -1
  85. package/dist/_chunks/{row-actions-Dpf9CrCP.js → row-actions-BF2-uizV.js} +3 -3
  86. package/dist/_chunks/{row-actions-Dpf9CrCP.js.map → row-actions-BF2-uizV.js.map} +1 -1
  87. package/dist/_chunks/{sheet-uZZXaO_S.js → sheet-BdhYeQQT.js} +84 -72
  88. package/dist/_chunks/sheet-BdhYeQQT.js.map +1 -0
  89. package/dist/_chunks/{signature-request-DW2PSp66.js → signature-request-4pGq3YBe.js} +3 -3
  90. package/dist/_chunks/{signature-request-DW2PSp66.js.map → signature-request-4pGq3YBe.js.map} +1 -1
  91. package/dist/_chunks/{tab-bar-CF8R38Og.js → tab-bar-CeC2QOwB.js} +2 -2
  92. package/dist/_chunks/{tab-bar-CF8R38Og.js.map → tab-bar-CeC2QOwB.js.map} +1 -1
  93. package/dist/_chunks/{tabs-P4qFmxk5.js → tabs-CRIDBLP7.js} +2 -2
  94. package/dist/_chunks/{tabs-P4qFmxk5.js.map → tabs-CRIDBLP7.js.map} +1 -1
  95. package/dist/_chunks/{task-editor-CVRrDqpe.js → task-editor-BL2hHxNz.js} +3 -3
  96. package/dist/_chunks/{task-editor-CVRrDqpe.js.map → task-editor-BL2hHxNz.js.map} +1 -1
  97. package/dist/_chunks/{tasks-panel-DBSm3WjK.js → tasks-panel-BE3zaayj.js} +2 -2
  98. package/dist/_chunks/{tasks-panel-DBSm3WjK.js.map → tasks-panel-BE3zaayj.js.map} +1 -1
  99. package/dist/_chunks/{theme-toggle-CeKl8f_f.js → theme-toggle-BQDFxvVS.js} +3 -3
  100. package/dist/_chunks/{theme-toggle-CeKl8f_f.js.map → theme-toggle-BQDFxvVS.js.map} +1 -1
  101. package/dist/_chunks/{token-insert-menu-BrK5NQIq.js → token-insert-menu-BLtfMTJd.js} +2 -2
  102. package/dist/_chunks/{token-insert-menu-BrK5NQIq.js.map → token-insert-menu-BLtfMTJd.js.map} +1 -1
  103. package/dist/_chunks/{toolbar-CC-Ls_eC.js → toolbar-CfdoJzMV.js} +3 -3
  104. package/dist/_chunks/{toolbar-CC-Ls_eC.js.map → toolbar-CfdoJzMV.js.map} +1 -1
  105. package/dist/_chunks/{tooth-scheme-DHRxV2sE.js → tooth-scheme-BtnFgugP.js} +2 -2
  106. package/dist/_chunks/{tooth-scheme-DHRxV2sE.js.map → tooth-scheme-BtnFgugP.js.map} +1 -1
  107. package/dist/_chunks/{use-appointment-details-read-BrykoTOR.js → use-appointment-details-read-_b7FRB1x.js} +4 -4
  108. package/dist/_chunks/{use-appointment-details-read-BrykoTOR.js.map → use-appointment-details-read-_b7FRB1x.js.map} +1 -1
  109. package/dist/_chunks/{verify-identity-types-D_LdByCp.js → verify-identity-types-CxtrBXsZ.js} +2 -2
  110. package/dist/_chunks/{verify-identity-types-D_LdByCp.js.map → verify-identity-types-CxtrBXsZ.js.map} +1 -1
  111. package/dist/_chunks/{warehouse-load-summary-DkAKXcw0.js → warehouse-load-summary-CMMYzTDv.js} +75 -66
  112. package/dist/_chunks/warehouse-load-summary-CMMYzTDv.js.map +1 -0
  113. package/dist/_chunks/{widget-picker-DrxJjEkv.js → widget-picker-D3T7e8a4.js} +2 -2
  114. package/dist/_chunks/{widget-picker-DrxJjEkv.js.map → widget-picker-D3T7e8a4.js.map} +1 -1
  115. package/dist/_chunks/{workflow-map-DCjkRuS_.js → workflow-map-DaZFP9SJ.js} +2 -2
  116. package/dist/_chunks/{workflow-map-DCjkRuS_.js.map → workflow-map-DaZFP9SJ.js.map} +1 -1
  117. package/dist/_chunks/{workflow-status-D0avpoeS.js → workflow-status-D1WgGVTP.js} +2 -2
  118. package/dist/_chunks/{workflow-status-D0avpoeS.js.map → workflow-status-D1WgGVTP.js.map} +1 -1
  119. package/dist/_chunks/{workflow-webhook-action-Cae02r_4.js → workflow-webhook-action-BsGSh3h9.js} +2 -2
  120. package/dist/_chunks/{workflow-webhook-action-Cae02r_4.js.map → workflow-webhook-action-BsGSh3h9.js.map} +1 -1
  121. package/dist/agent-catalog.json +10 -10
  122. package/dist/agent-i18n/en.json +3 -3
  123. package/dist/browser-support.js +1 -1
  124. package/dist/components/_shared/body-pointer-lock.d.ts +2 -0
  125. package/dist/components/_shared/body-pointer-lock.d.ts.map +1 -0
  126. package/dist/components/_shared/decimal.d.ts +2 -0
  127. package/dist/components/_shared/decimal.d.ts.map +1 -1
  128. package/dist/components/appointment-card/index.js +2 -2
  129. package/dist/components/appointment-details-panel/index.js +1 -1
  130. package/dist/components/appointment-peek/index.js +1 -1
  131. package/dist/components/appointment-timeline/index.js +1 -1
  132. package/dist/components/bill-line-table/bill-line-table.agent.d.ts.map +1 -1
  133. package/dist/components/bill-line-table/bill-line-table.columns.d.ts +4 -0
  134. package/dist/components/bill-line-table/bill-line-table.columns.d.ts.map +1 -1
  135. package/dist/components/bill-line-table/bill-line-table.d.ts.map +1 -1
  136. package/dist/components/bill-line-table/bill-line-table.header.d.ts +6 -0
  137. package/dist/components/bill-line-table/bill-line-table.header.d.ts.map +1 -1
  138. package/dist/components/bill-line-table/bill-line-table.invoice-cell.d.ts +6 -0
  139. package/dist/components/bill-line-table/bill-line-table.invoice-cell.d.ts.map +1 -0
  140. package/dist/components/bill-line-table/bill-line-table.model.d.ts +23 -10
  141. package/dist/components/bill-line-table/bill-line-table.model.d.ts.map +1 -1
  142. package/dist/components/bill-line-table/bill-line-table.scope.d.ts +56 -0
  143. package/dist/components/bill-line-table/bill-line-table.scope.d.ts.map +1 -0
  144. package/dist/components/bill-line-table/bill-line-table.types.d.ts +90 -10
  145. package/dist/components/bill-line-table/bill-line-table.types.d.ts.map +1 -1
  146. package/dist/components/bill-line-table/bill-line-table.variants.d.ts +2 -0
  147. package/dist/components/bill-line-table/bill-line-table.variants.d.ts.map +1 -1
  148. package/dist/components/bill-line-table/index.d.ts +3 -2
  149. package/dist/components/bill-line-table/index.d.ts.map +1 -1
  150. package/dist/components/bill-line-table/index.js +20 -18
  151. package/dist/components/bill-table/index.js +1 -1
  152. package/dist/components/button-group/index.js +1 -1
  153. package/dist/components/calculator-dialog/index.js +1 -1
  154. package/dist/components/calendar/calendar.d.ts.map +1 -1
  155. package/dist/components/calendar/index.js +1 -1
  156. package/dist/components/care-plan-card/index.js +1 -1
  157. package/dist/components/care-plan-entry-card/index.js +1 -1
  158. package/dist/components/chart/index.js +1 -1
  159. package/dist/components/dashboard-grid/index.js +1 -1
  160. package/dist/components/data-grid/body.d.ts.map +1 -1
  161. package/dist/components/data-grid/data-grid.d.ts.map +1 -1
  162. package/dist/components/data-grid/data-grid.variants.d.ts.map +1 -1
  163. package/dist/components/data-grid/index.js +2 -2
  164. package/dist/components/data-grid/types.d.ts +6 -0
  165. package/dist/components/data-grid/types.d.ts.map +1 -1
  166. package/dist/components/data-grid/use-data-grid-engine.d.ts.map +1 -1
  167. package/dist/components/data-table/index.js +4 -4
  168. package/dist/components/dialog/dialog.d.ts.map +1 -1
  169. package/dist/components/dialog/index.js +1 -1
  170. package/dist/components/document-preview/index.js +1 -1
  171. package/dist/components/dropdown-menu/dropdown-menu.d.ts.map +1 -1
  172. package/dist/components/dropdown-menu/index.js +1 -1
  173. package/dist/components/face-scheme/index.js +1 -1
  174. package/dist/components/file-manager/index.js +1 -1
  175. package/dist/components/header-settings/index.js +1 -1
  176. package/dist/components/heatmap/index.js +1 -1
  177. package/dist/components/icon-button-group/index.js +1 -1
  178. package/dist/components/invoice-upload-list/index.js +1 -1
  179. package/dist/components/invoice-upload-list/invoice-upload-list.d.ts.map +1 -1
  180. package/dist/components/muscle-scheme/index.js +1 -1
  181. package/dist/components/notes-panel/index.js +1 -1
  182. package/dist/components/patient-search/index.js +1 -1
  183. package/dist/components/patient-table/index.js +1 -1
  184. package/dist/components/practice-results/index.js +1 -1
  185. package/dist/components/public-header/index.js +1 -1
  186. package/dist/components/radiograph-panel/index.js +1 -1
  187. package/dist/components/rich-text-editor/index.js +1 -1
  188. package/dist/components/row-actions/index.js +1 -1
  189. package/dist/components/sheet/index.js +1 -1
  190. package/dist/components/sheet/sheet.d.ts.map +1 -1
  191. package/dist/components/skeleton-scheme/index.js +1 -1
  192. package/dist/components/tab-bar/index.js +1 -1
  193. package/dist/components/tabs/index.js +1 -1
  194. package/dist/components/task-editor/index.js +1 -1
  195. package/dist/components/tasks-panel/index.js +1 -1
  196. package/dist/components/theme-toggle/index.js +1 -1
  197. package/dist/components/token-insert-menu/index.js +1 -1
  198. package/dist/components/tooth-scheme/index.js +1 -1
  199. package/dist/components/warehouse-load-summary/index.js +1 -1
  200. package/dist/components/warehouse-load-summary/warehouse-load-summary.d.ts.map +1 -1
  201. package/dist/components/widget-picker/index.js +1 -1
  202. package/dist/components/workflow/index.js +1 -1
  203. package/dist/components/workflow-status/index.js +1 -1
  204. package/dist/core.css +1 -1
  205. package/dist/decimal/index.js +32 -28
  206. package/dist/decimal/index.js.map +1 -1
  207. package/dist/host-compat.css +4 -1
  208. package/dist/index.js +1063 -1061
  209. package/dist/patterns/alia-assistant/index.js +1 -1
  210. package/dist/patterns/anamnesis/index.js +1 -1
  211. package/dist/patterns/calendar/index.js +1 -1
  212. package/dist/patterns/help-me-write-templates/index.js +1 -1
  213. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  214. package/dist/patterns/signature-request/index.js +1 -1
  215. package/dist/patterns/verify-identity/index.js +1 -1
  216. package/dist/patterns/workflow-webhook-action/index.js +1 -1
  217. package/dist/tokens.css +1 -1
  218. package/package.json +1 -1
  219. package/dist/_chunks/bill-line-table-CzYzg-Qh.js +0 -1757
  220. package/dist/_chunks/bill-line-table-CzYzg-Qh.js.map +0 -1
  221. package/dist/_chunks/data-grid-C9xlUMLt.js.map +0 -1
  222. package/dist/_chunks/dialog-CIUn5oLb.js.map +0 -1
  223. package/dist/_chunks/dropdown-menu-Dw6sgQwJ.js.map +0 -1
  224. package/dist/_chunks/sheet-uZZXaO_S.js.map +0 -1
  225. package/dist/_chunks/warehouse-load-summary-DkAKXcw0.js.map +0 -1
@@ -1,5 +1,5 @@
1
- import { jsx as t, jsxs as l, Fragment as _ } from "react/jsx-runtime";
2
- import { useId as W, useRef as C, useEffect as j, useMemo as I } from "react";
1
+ import { jsx as r, jsxs as i, Fragment as _ } from "react/jsx-runtime";
2
+ import { useId as W, useRef as C, useEffect as j, useMemo as N } from "react";
3
3
  import { useTranslation as R } from "react-i18next";
4
4
  import { u as U } from "./registry-DvAUVLHh.js";
5
5
  import { A as m } from "./alert-C4WKViaS.js";
@@ -13,23 +13,23 @@ const V = /* @__PURE__ */ new Set([
13
13
  "invoicesLoaded",
14
14
  "filesWithErrors"
15
15
  ]);
16
- function L(a) {
16
+ function w(a) {
17
17
  return typeof a == "number" && Number.isFinite(a) && a >= 0;
18
18
  }
19
19
  function B(a, s) {
20
20
  const o = [];
21
- for (const r of $) {
22
- if (s === "invoice" && O.has(r)) continue;
23
- const d = a[r];
24
- if (!L(d)) continue;
21
+ for (const t of $) {
22
+ if (s === "invoice" && O.has(t)) continue;
23
+ const d = a[t];
24
+ if (!w(d)) continue;
25
25
  const n = Math.trunc(d);
26
- n === 0 && V.has(r) || o.push({ key: r, count: n });
26
+ n === 0 && V.has(t) || o.push({ key: t, count: n });
27
27
  }
28
28
  return o;
29
29
  }
30
30
  function Y(a, s, o) {
31
31
  if (a) return a;
32
- const d = (s.filesWithErrors ?? 0) > 0 || o.length > 0, n = L(s.invoicesLoaded) && s.invoicesLoaded >= 1 || L(s.linesLoaded) && s.linesLoaded >= 1;
32
+ const d = (s.filesWithErrors ?? 0) > 0 || o.length > 0, n = w(s.invoicesLoaded) && s.invoicesLoaded >= 1 || w(s.linesLoaded) && s.linesLoaded >= 1;
33
33
  return d ? n ? "partial" : "error" : n ? "success" : "unchanged";
34
34
  }
35
35
  const z = {
@@ -64,7 +64,7 @@ const z = {
64
64
  description: "Each failed file row emits its id as data-file-id."
65
65
  }
66
66
  }
67
- }, N = {
67
+ }, I = {
68
68
  success: "success",
69
69
  partial: "warning",
70
70
  error: "error",
@@ -72,103 +72,112 @@ const z = {
72
72
  }, G = [], S = {
73
73
  filesWithErrors: "destructive"
74
74
  };
75
- function re({
75
+ function te({
76
76
  counts: a,
77
77
  scope: s = "batch",
78
78
  outcome: o,
79
- failedFiles: r = G,
79
+ failedFiles: t = G,
80
80
  headingLevel: d = 2,
81
81
  focusOnMount: n = !0,
82
- actions: f,
82
+ actions: p,
83
83
  variant: E = "full",
84
84
  id: h,
85
- className: b
85
+ className: x
86
86
  }) {
87
- const { t: c, i18n: T } = R("ui"), g = T.language, w = W(), v = C(null);
87
+ const { t: c, i18n: T } = R("ui"), g = T.language, L = W(), v = C(null);
88
88
  j(() => {
89
89
  var e;
90
90
  n && ((e = v.current) == null || e.focus({ preventScroll: !0 }));
91
91
  }, [n]);
92
- const u = I(() => B(a, s), [a, s]), i = Y(o, a, r), A = I(
92
+ const u = N(() => B(a, s), [a, s]), l = Y(o, a, t), A = N(
93
93
  () => ({
94
94
  getCounts: () => Object.fromEntries(u.map((e) => [e.key, e.count])),
95
- getFailedFileIds: () => r.map((e) => e.id)
95
+ getFailedFileIds: () => t.map((e) => e.id)
96
96
  }),
97
- [u, r]
97
+ [u, t]
98
98
  );
99
99
  U(z, A, h);
100
- const y = c(`warehouseLoadSummary.title.${s}.${i}`, {
101
- defaultValue: K[s][i]
102
- }), F = u.filter((e) => e.count > 0).map((e) => D(c, g, e.key, e.count)), p = P(F, g);
103
- return E === "banner" ? /* @__PURE__ */ t(
100
+ const b = c(`warehouseLoadSummary.title.${s}.${l}`, {
101
+ defaultValue: K[s][l]
102
+ }), F = u.filter((e) => e.count > 0).map((e) => D(c, g, e.key, e.count)), f = P(F, g);
103
+ return E === "banner" ? /* @__PURE__ */ r(
104
104
  "div",
105
105
  {
106
106
  "data-component": "warehouse-load-summary",
107
107
  "data-component-id": h,
108
- "data-outcome": i,
108
+ "data-outcome": l,
109
109
  "data-variant": "banner",
110
- className: b,
111
- children: /* @__PURE__ */ t(
110
+ className: x,
111
+ children: /* @__PURE__ */ r(
112
112
  m,
113
113
  {
114
- variant: N[i],
114
+ variant: I[l],
115
115
  announce: n ? "off" : "polite",
116
- children: /* @__PURE__ */ l("div", { className: "ds:flex ds:flex-wrap ds:items-center ds:gap-x-[var(--spacing-xs)] ds:gap-y-[var(--spacing-xs)]", children: [
117
- /* @__PURE__ */ t(
118
- m.Title,
119
- {
120
- ref: v,
121
- tabIndex: -1,
122
- className: "ds:outline-none",
123
- as: `h${d}`,
124
- children: y
125
- }
126
- ),
127
- p ? /* @__PURE__ */ l(_, { children: [
128
- /* @__PURE__ */ t("span", { "aria-hidden": "true", children: "·" }),
129
- /* @__PURE__ */ t("p", { className: "type-body-sm ds:m-0", children: p })
130
- ] }) : null,
131
- f ? /* @__PURE__ */ t("div", { className: "ds:ms-auto ds:flex ds:flex-wrap ds:justify-end ds:gap-[var(--spacing-sm)]", children: f }) : null
116
+ children: /* @__PURE__ */ i("div", { className: "ds:flex ds:flex-wrap ds:items-center ds:gap-x-[var(--spacing-xs)] ds:gap-y-[var(--spacing-xs)]", children: [
117
+ /* @__PURE__ */ i("div", { className: "ds:min-w-0", children: [
118
+ /* @__PURE__ */ r(
119
+ m.Title,
120
+ {
121
+ ref: v,
122
+ tabIndex: -1,
123
+ className: "ds:inline ds:outline-none",
124
+ as: `h${d}`,
125
+ children: b
126
+ }
127
+ ),
128
+ f ? /* @__PURE__ */ i(_, { children: [
129
+ /* @__PURE__ */ r(
130
+ "span",
131
+ {
132
+ "aria-hidden": "true",
133
+ className: "ds:mx-[var(--spacing-xs)]",
134
+ children: "·"
135
+ }
136
+ ),
137
+ /* @__PURE__ */ r("p", { className: "type-body-sm ds:m-0 ds:inline", children: f })
138
+ ] }) : null
139
+ ] }),
140
+ p ? /* @__PURE__ */ r("div", { className: "ds:ms-auto ds:flex ds:flex-wrap ds:justify-end ds:gap-[var(--spacing-sm)]", children: p }) : null
132
141
  ] })
133
142
  }
134
143
  )
135
144
  }
136
- ) : /* @__PURE__ */ l(
145
+ ) : /* @__PURE__ */ i(
137
146
  "div",
138
147
  {
139
148
  "data-component": "warehouse-load-summary",
140
149
  "data-component-id": h,
141
- "data-outcome": i,
142
- className: ["ds:flex ds:flex-col ds:gap-[var(--spacing-md)]", b].filter(Boolean).join(" "),
150
+ "data-outcome": l,
151
+ className: ["ds:flex ds:flex-col ds:gap-[var(--spacing-md)]", x].filter(Boolean).join(" "),
143
152
  children: [
144
- /* @__PURE__ */ l(
153
+ /* @__PURE__ */ i(
145
154
  m,
146
155
  {
147
- variant: N[i],
156
+ variant: I[l],
148
157
  announce: n ? "off" : "polite",
149
158
  children: [
150
- /* @__PURE__ */ t(
159
+ /* @__PURE__ */ r(
151
160
  m.Title,
152
161
  {
153
162
  ref: v,
154
163
  tabIndex: -1,
155
164
  className: "ds:outline-none",
156
165
  as: `h${d}`,
157
- children: y
166
+ children: b
158
167
  }
159
168
  ),
160
- p ? /* @__PURE__ */ t(m.Description, { children: p }) : null
169
+ f ? /* @__PURE__ */ r(m.Description, { children: f }) : null
161
170
  ]
162
171
  }
163
172
  ),
164
- u.length > 0 ? /* @__PURE__ */ t(
173
+ u.length > 0 ? /* @__PURE__ */ r(
165
174
  H,
166
175
  {
167
176
  "aria-label": c("warehouseLoadSummary.counts", {
168
177
  defaultValue: "Load counts"
169
178
  }),
170
179
  maxColumns: 4,
171
- children: u.map(({ key: e, count: x }) => /* @__PURE__ */ t(
180
+ children: u.map(({ key: e, count: y }) => /* @__PURE__ */ r(
172
181
  k,
173
182
  {
174
183
  variant: "outlined",
@@ -176,43 +185,43 @@ function re({
176
185
  label: c(`warehouseLoadSummary.stat.${e}`, {
177
186
  defaultValue: M[e]
178
187
  }),
179
- value: x,
188
+ value: y,
180
189
  locale: g,
181
- intent: x > 0 && e in S ? S[e] : "foreground"
190
+ intent: y > 0 && e in S ? S[e] : "foreground"
182
191
  },
183
192
  e
184
193
  ))
185
194
  }
186
195
  ) : null,
187
- r.length > 0 ? /* @__PURE__ */ l(
196
+ t.length > 0 ? /* @__PURE__ */ i(
188
197
  "div",
189
198
  {
190
199
  role: "group",
191
- "aria-labelledby": w,
200
+ "aria-labelledby": L,
192
201
  className: "ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]",
193
202
  children: [
194
- /* @__PURE__ */ t(
203
+ /* @__PURE__ */ r(
195
204
  Z,
196
205
  {
197
206
  as: `h${Math.min(d + 1, 6)}`,
198
- id: w,
207
+ id: L,
199
208
  children: c("warehouseLoadSummary.failedFiles", {
200
209
  defaultValue: "Files that could not be loaded"
201
210
  })
202
211
  }
203
212
  ),
204
- /* @__PURE__ */ t(
213
+ /* @__PURE__ */ r(
205
214
  "ul",
206
215
  {
207
216
  role: "list",
208
217
  className: "ds:m-0 ds:flex ds:list-none ds:flex-col ds:gap-[var(--spacing-xs)] ds:p-0",
209
- children: r.map((e) => /* @__PURE__ */ l(
218
+ children: t.map((e) => /* @__PURE__ */ i(
210
219
  "li",
211
220
  {
212
221
  "data-file-id": e.id,
213
222
  className: "ds:flex ds:flex-col ds:break-words ds:border-s-[length:var(--border-width-md)] ds:border-s-[color:var(--destructive)] ds:ps-[var(--spacing-sm)]",
214
223
  children: [
215
- /* @__PURE__ */ t(
224
+ /* @__PURE__ */ r(
216
225
  "span",
217
226
  {
218
227
  dir: "auto",
@@ -220,7 +229,7 @@ function re({
220
229
  children: e.fileName
221
230
  }
222
231
  ),
223
- /* @__PURE__ */ t(
232
+ /* @__PURE__ */ r(
224
233
  "span",
225
234
  {
226
235
  dir: "auto",
@@ -237,7 +246,7 @@ function re({
237
246
  ]
238
247
  }
239
248
  ) : null,
240
- f ? /* @__PURE__ */ t("div", { className: "ds:flex ds:flex-wrap ds:justify-end ds:gap-[var(--spacing-sm)]", children: f }) : null
249
+ p ? /* @__PURE__ */ r("div", { className: "ds:flex ds:flex-wrap ds:justify-end ds:gap-[var(--spacing-sm)]", children: p }) : null
241
250
  ]
242
251
  }
243
252
  );
@@ -280,10 +289,10 @@ function Z({
280
289
  id: s,
281
290
  children: o
282
291
  }) {
283
- return /* @__PURE__ */ t(a, { id: s, className: "type-label ds:m-0 ds:text-[var(--foreground)]", children: o });
292
+ return /* @__PURE__ */ r(a, { id: s, className: "type-label ds:m-0 ds:text-[var(--foreground)]", children: o });
284
293
  }
285
294
  export {
286
- re as W,
295
+ te as W,
287
296
  z as w
288
297
  };
289
- //# sourceMappingURL=warehouse-load-summary-DkAKXcw0.js.map
298
+ //# sourceMappingURL=warehouse-load-summary-CMMYzTDv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warehouse-load-summary-CMMYzTDv.js","sources":["../../src/components/warehouse-load-summary/model.ts","../../src/components/warehouse-load-summary/warehouse-load-summary.agent.ts","../../src/components/warehouse-load-summary/warehouse-load-summary.tsx"],"sourcesContent":["import { WAREHOUSE_COUNT_KEYS } from '../_shared/warehouse-load';\nimport type {\n WarehouseCountKey,\n WarehouseLoadCounts,\n WarehouseLoadFailedFile,\n WarehouseLoadOutcome,\n WarehouseLoadScope,\n} from './types';\n\n/** Counts that hide at zero (nothing to report). */\nconst HIDE_AT_ZERO: ReadonlySet<WarehouseCountKey> = new Set([\n 'itemsUpdated',\n 'filesWithErrors',\n]);\n/** Counts a single-invoice summary leaves out. */\nconst BATCH_ONLY: ReadonlySet<WarehouseCountKey> = new Set([\n 'invoicesLoaded',\n 'filesWithErrors',\n]);\n\nfunction usable(value: number | undefined): value is number {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0;\n}\n\n/** The counts to show, in vocabulary order. */\nexport function visibleCounts(\n counts: WarehouseLoadCounts,\n scope: WarehouseLoadScope,\n): Array<{ key: WarehouseCountKey; count: number }> {\n const out: Array<{ key: WarehouseCountKey; count: number }> = [];\n for (const key of WAREHOUSE_COUNT_KEYS) {\n if (scope === 'invoice' && BATCH_ONLY.has(key)) continue;\n const value = counts[key];\n if (!usable(value)) continue;\n const count = Math.trunc(value);\n if (count === 0 && HIDE_AT_ZERO.has(key)) continue;\n out.push({ key, count });\n }\n return out;\n}\n\nexport function resolveOutcome(\n outcome: WarehouseLoadOutcome | undefined,\n counts: WarehouseLoadCounts,\n failedFiles: ReadonlyArray<WarehouseLoadFailedFile>,\n): WarehouseLoadOutcome {\n if (outcome) return outcome;\n const errors = counts.filesWithErrors ?? 0;\n const failed = errors > 0 || failedFiles.length > 0;\n const loaded =\n (usable(counts.invoicesLoaded) && counts.invoicesLoaded >= 1) ||\n (usable(counts.linesLoaded) && counts.linesLoaded >= 1);\n if (failed) return loaded ? 'partial' : 'error';\n return loaded ? 'success' : 'unchanged';\n}\n","/* -------------------------------------------------------------------- */\n/* Agent adapter: WarehouseLoadSummary. */\n/* Read-only display. State is counts and ids; no actions, because the */\n/* host's `actions` slot owns every button. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { WarehouseLoadSummaryHandle } from './types';\n\nexport const warehouseLoadSummaryAgent: AgentAdapter<WarehouseLoadSummaryHandle> =\n {\n id: 'warehouse-load-summary',\n capabilities: [],\n state: {\n counts: {\n type: 'Record<string, number>',\n description:\n 'The counts shown, by key (invoicesLoaded, itemsCreated, itemsUpdated, linesLoaded, linesAlreadyLoaded, linesSkipped, filesWithErrors). Hidden counts are absent.',\n read: (handle) => handle.getCounts(),\n },\n failedFileIds: {\n type: 'string[]',\n description:\n 'Ids of the failed files listed. File names and error texts are not read.',\n read: (handle) => handle.getFailedFileIds(),\n },\n },\n actions: {},\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'warehouse-load-summary',\n description: 'Marks the summary root.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n item: {\n attr: 'data-file-id',\n description: 'Each failed file row emits its id as data-file-id.',\n },\n },\n };\n","import { useEffect, useId, useMemo, useRef, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useAgentRegistration } from '../../agent';\nimport { Alert } from '../alert';\nimport { Stat } from '../stat';\nimport { StatGroup } from '../stat-group';\nimport { warehouseCountLabel } from '../_shared/warehouse-load';\nimport { visibleCounts, resolveOutcome } from './model';\nimport { warehouseLoadSummaryAgent } from './warehouse-load-summary.agent';\nimport type {\n WarehouseCountKey,\n WarehouseLoadFailedFile,\n WarehouseLoadOutcome,\n WarehouseLoadSummaryHandle,\n WarehouseLoadSummaryProps,\n} from './types';\n\nconst ALERT_VARIANT = {\n success: 'success',\n partial: 'warning',\n error: 'error',\n unchanged: 'info',\n} as const satisfies Record<WarehouseLoadOutcome, string>;\n\nconst NO_FAILED_FILES: ReadonlyArray<WarehouseLoadFailedFile> = [];\n\nconst STAT_INTENT = {\n filesWithErrors: 'destructive',\n} as const satisfies Partial<Record<WarehouseCountKey, string>>;\n\n/**\n * What a warehouse load produced: a heading by outcome, one tile per count\n * and the files that failed. Displays only; the platform counts.\n */\nexport function WarehouseLoadSummary({\n counts,\n scope = 'batch',\n outcome,\n failedFiles = NO_FAILED_FILES,\n headingLevel = 2,\n focusOnMount = true,\n actions,\n variant = 'full',\n id,\n className,\n}: WarehouseLoadSummaryProps) {\n const { t, i18n } = useTranslation('ui');\n const language = i18n.language;\n const headingId = useId();\n const titleRef = useRef<HTMLHeadingElement>(null);\n\n // The summary replaces the review step, so focus would drop to <body>.\n // Focusing the heading makes screen readers read the result (WCAG 2.4.3,\n // 4.1.3); the Alert then stays silent so it is not read twice.\n useEffect(() => {\n if (focusOnMount) titleRef.current?.focus({ preventScroll: true });\n }, [focusOnMount]);\n\n const shown = useMemo(() => visibleCounts(counts, scope), [counts, scope]);\n const resolved = resolveOutcome(outcome, counts, failedFiles);\n\n const handle = useMemo<WarehouseLoadSummaryHandle>(\n () => ({\n getCounts: () => Object.fromEntries(shown.map((c) => [c.key, c.count])),\n getFailedFileIds: () => failedFiles.map((f) => f.id),\n }),\n [shown, failedFiles],\n );\n useAgentRegistration(warehouseLoadSummaryAgent, handle, id);\n\n const title = t(`warehouseLoadSummary.title.${scope}.${resolved}`, {\n defaultValue: DEFAULT_TITLES[scope][resolved],\n });\n const sentence = shown\n .filter((c) => c.count > 0)\n .map((c) => warehouseCountLabel(t, language, c.key, c.count));\n const description = formatList(sentence, language);\n\n if (variant === 'banner') {\n // One line above a table: heading, a neutral dot, the sentence, then the\n // host actions. No cards, no failed-files list. The dot is punctuation\n // that reads the same in every language, so no new string is needed.\n return (\n <div\n data-component=\"warehouse-load-summary\"\n data-component-id={id}\n data-outcome={resolved}\n data-variant=\"banner\"\n className={className}\n >\n <Alert\n variant={ALERT_VARIANT[resolved]}\n announce={focusOnMount ? 'off' : 'polite'}\n >\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-x-[var(--spacing-xs)] ds:gap-y-[var(--spacing-xs)]\">\n {/* One run of text: when it is too long for the line it wraps\n like a sentence, and the dot never ends a line on its own. */}\n <div className=\"ds:min-w-0\">\n <Alert.Title\n ref={titleRef}\n tabIndex={-1}\n className=\"ds:inline ds:outline-none\"\n as={`h${headingLevel}` as const}\n >\n {title}\n </Alert.Title>\n {description ? (\n <>\n <span\n aria-hidden=\"true\"\n className=\"ds:mx-[var(--spacing-xs)]\"\n >\n ·\n </span>\n <p className=\"type-body-sm ds:m-0 ds:inline\">{description}</p>\n </>\n ) : null}\n </div>\n {actions ? (\n <div className=\"ds:ms-auto ds:flex ds:flex-wrap ds:justify-end ds:gap-[var(--spacing-sm)]\">\n {actions}\n </div>\n ) : null}\n </div>\n </Alert>\n </div>\n );\n }\n\n return (\n <div\n data-component=\"warehouse-load-summary\"\n data-component-id={id}\n data-outcome={resolved}\n className={['ds:flex ds:flex-col ds:gap-[var(--spacing-md)]', className]\n .filter(Boolean)\n .join(' ')}\n >\n <Alert\n variant={ALERT_VARIANT[resolved]}\n announce={focusOnMount ? 'off' : 'polite'}\n >\n <Alert.Title\n ref={titleRef}\n tabIndex={-1}\n className=\"ds:outline-none\"\n as={`h${headingLevel}` as const}\n >\n {title}\n </Alert.Title>\n {description ? (\n <Alert.Description>{description}</Alert.Description>\n ) : null}\n </Alert>\n\n {shown.length > 0 ? (\n <StatGroup\n aria-label={t('warehouseLoadSummary.counts', {\n defaultValue: 'Load counts',\n })}\n maxColumns={4}\n >\n {shown.map(({ key, count }) => (\n <Stat\n key={key}\n variant=\"outlined\"\n size=\"sm\"\n label={t(`warehouseLoadSummary.stat.${key}`, {\n defaultValue: DEFAULT_STAT_LABELS[key],\n })}\n value={count}\n locale={language}\n intent={\n count > 0 && key in STAT_INTENT\n ? STAT_INTENT[key as keyof typeof STAT_INTENT]\n : 'foreground'\n }\n />\n ))}\n </StatGroup>\n ) : null}\n\n {failedFiles.length > 0 ? (\n <div\n role=\"group\"\n aria-labelledby={headingId}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n >\n <SubHeading\n as={`h${Math.min(headingLevel + 1, 6)}` as 'h3'}\n id={headingId}\n >\n {t('warehouseLoadSummary.failedFiles', {\n defaultValue: 'Files that could not be loaded',\n })}\n </SubHeading>\n {/* eslint-disable-next-line jsx-a11y/no-redundant-roles -- Safari drops list semantics under list-none */}\n <ul\n role=\"list\"\n className=\"ds:m-0 ds:flex ds:list-none ds:flex-col ds:gap-[var(--spacing-xs)] ds:p-0\"\n >\n {failedFiles.map((file) => (\n <li\n key={file.id}\n data-file-id={file.id}\n className=\"ds:flex ds:flex-col ds:break-words ds:border-s-[length:var(--border-width-md)] ds:border-s-[color:var(--destructive)] ds:ps-[var(--spacing-sm)]\"\n >\n <span\n dir=\"auto\"\n className=\"type-label ds:text-[var(--foreground)]\"\n >\n {file.fileName}\n </span>\n <span\n dir=\"auto\"\n className=\"type-meta ds:text-[var(--muted-foreground)]\"\n >\n {file.error}\n </span>\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n\n {actions ? (\n <div className=\"ds:flex ds:flex-wrap ds:justify-end ds:gap-[var(--spacing-sm)]\">\n {actions}\n </div>\n ) : null}\n </div>\n );\n}\n\nconst DEFAULT_TITLES = {\n invoice: {\n success: 'Invoice loaded',\n partial: 'Invoice loaded with warnings',\n error: 'The invoice could not be loaded',\n unchanged: 'Nothing new to load',\n },\n batch: {\n success: 'Invoices loaded',\n partial: 'Invoices loaded, some files failed',\n error: 'No invoices were loaded',\n unchanged: 'Nothing new to load',\n },\n} as const;\n\nconst DEFAULT_STAT_LABELS = {\n invoicesLoaded: 'Invoices loaded',\n itemsCreated: 'Items created',\n itemsUpdated: 'Items updated',\n linesLoaded: 'Lines loaded',\n linesAlreadyLoaded: 'Lines already loaded',\n linesSkipped: 'Lines skipped',\n filesWithErrors: 'Files with errors',\n} as const satisfies Record<WarehouseCountKey, string>;\n\nfunction formatList(parts: string[], language: string | undefined): string {\n if (parts.length === 0) return '';\n try {\n return new Intl.ListFormat(language, {\n style: 'long',\n type: 'conjunction',\n }).format(parts);\n } catch {\n return parts.join(', ');\n }\n}\n\nfunction SubHeading({\n as: Tag,\n id,\n children,\n}: {\n as: 'h3' | 'h4' | 'h5' | 'h6';\n id: string;\n children: ReactNode;\n}) {\n return (\n <Tag id={id} className=\"type-label ds:m-0 ds:text-[var(--foreground)]\">\n {children}\n </Tag>\n );\n}\n"],"names":["HIDE_AT_ZERO","BATCH_ONLY","usable","value","visibleCounts","counts","scope","out","key","WAREHOUSE_COUNT_KEYS","count","resolveOutcome","outcome","failedFiles","failed","loaded","warehouseLoadSummaryAgent","handle","ALERT_VARIANT","NO_FAILED_FILES","STAT_INTENT","WarehouseLoadSummary","headingLevel","focusOnMount","actions","variant","id","className","t","i18n","useTranslation","language","headingId","useId","titleRef","useRef","useEffect","_a","shown","useMemo","resolved","c","f","useAgentRegistration","title","DEFAULT_TITLES","sentence","warehouseCountLabel","description","formatList","jsx","Alert","jsxs","Fragment","StatGroup","Stat","DEFAULT_STAT_LABELS","SubHeading","file","parts","Tag","children"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { jsx as t, jsxs as l } from "react/jsx-runtime";
2
2
  import { forwardRef as _, useState as p, useEffect as N, useMemo as v, useCallback as j, useImperativeHandle as B } from "react";
3
3
  import { c as C } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as H } from "react-i18next";
5
- import { D as u } from "./dialog-CIUn5oLb.js";
5
+ import { D as u } from "./dialog-CVTxyR0v.js";
6
6
  import { S as A } from "./state-backed-text-input-DVETOhSS.js";
7
7
  import { B as I } from "./badge-BUk4RjTS.js";
8
8
  import { u as D } from "./registry-DvAUVLHh.js";
@@ -213,4 +213,4 @@ export {
213
213
  E as W,
214
214
  K as w
215
215
  };
216
- //# sourceMappingURL=widget-picker-DrxJjEkv.js.map
216
+ //# sourceMappingURL=widget-picker-D3T7e8a4.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"widget-picker-DrxJjEkv.js","sources":["../../src/components/widget-picker/widget-picker.agent.ts","../../src/components/widget-picker/widget-picker.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { WidgetPickerHandle } from './widget-picker';\n\nexport const widgetPickerAgent: AgentAdapter<WidgetPickerHandle> = {\n id: 'widget-picker',\n capabilities: ['pick'],\n state: {\n open: {\n type: 'boolean',\n descriptionKey: 'ui.agent.widgetPicker.state.open',\n description: 'Whether the picker dialog is currently open.',\n read: (handle) => handle.getPickerState().open,\n },\n items: {\n type: '{ id: string, disabled: boolean }[]',\n descriptionKey: 'ui.agent.widgetPicker.state.items',\n description:\n 'Widget-type ids on offer and whether each is pickable. Ids only — titles are host-app strings.',\n read: (handle) => handle.getPickerState().items,\n },\n },\n actions: {\n pick_widget: {\n // Picking adds a widget to the host dashboard — a write, reversible\n // by removing the widget again.\n safety: 'write',\n argsType: 'id',\n argsSchema: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n description: 'Widget-type id (see items state).',\n },\n },\n required: ['id'],\n },\n returns: 'boolean (accepted)',\n returnsSchema: {\n type: 'boolean',\n description:\n 'True when the pick was applied; false when the picker is closed, the id is unknown, or the item is disabled.',\n },\n idempotent: false,\n descriptionKey: 'ui.agent.widgetPicker.actions.pickWidget',\n description:\n 'Pick a widget type from the open catalogue. The picker closes and the host adds the widget. Refused while the dialog is closed and for disabled items.',\n invoke: (handle, args: { id: string }) => handle.pick(args.id),\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'widget-picker' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n item: {\n attr: 'data-widget-type-id',\n description: 'Each option tile carries its widget-type id.',\n },\n },\n};\n","/* ------------------------------------------------------------------ */\n/* WidgetPicker — \"add a widget\" modal for configurable dashboards. */\n/* */\n/* A Dialog-composed catalogue picker: the consumer supplies the */\n/* available widget types (title/description/icon/category, all */\n/* pre-translated app strings), the kit renders a searchable, grouped */\n/* grid of option tiles and reports the pick. Designed as the add flow */\n/* for `DashboardGrid` (`onRequestAdd` opens it) but generic to any */\n/* pick-one-catalogue surface. Disabled items stay visible with an */\n/* optional badge (e.g. \"Requires reconnect\") so users can discover */\n/* locked capabilities. */\n/* ------------------------------------------------------------------ */\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useState,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Search } from 'lucide-react';\nimport { Dialog } from '../dialog';\nimport { StateBackedTextInput } from '../_shared/state-backed-text-input';\nimport { Badge } from '../badge';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { widgetPickerAgent } from './widget-picker.agent';\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport interface WidgetPickerItem {\n /** Stable widget-type id reported via `onPick`. */\n id: string;\n /** Visible name (consumer-translated). */\n title: string;\n /** One-line explanation (consumer-translated). */\n description?: string;\n /** Small illustrative icon. */\n icon?: ReactNode;\n /** Group heading (consumer-translated). Ungrouped items render first. */\n category?: string;\n /** Visible but not pickable. */\n disabled?: boolean;\n /** Short annotation rendered as a badge (e.g. \"Requires reconnect\"). */\n badge?: string;\n}\n\nexport interface WidgetPickerProps {\n /** Controlled visibility. */\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** The catalogue. */\n items: WidgetPickerItem[];\n /**\n * Called with the picked item id; the picker then closes itself via\n * `onOpenChange(false)`.\n */\n onPick: (id: string) => void;\n /** Dialog title. Defaults to the kit's translated \"Add a widget\". */\n title?: string;\n /** Opaque instance id — emitted as `data-component-id` for the agent registry. */\n id?: string;\n}\n\nexport interface WidgetPickerHandle {\n /**\n * Pick an item programmatically. False when the picker is closed, the id\n * is unknown, or the item is disabled.\n */\n pick: (id: string) => boolean;\n getPickerState: () => {\n open: boolean;\n items: Array<{ id: string; disabled: boolean }>;\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst tileVariants = cva(\n [\n 'ds:flex ds:w-full ds:min-h-[var(--min-target-size)] ds:items-start ds:gap-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-border ds:bg-[var(--card)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:py-[var(--spacing-md)]',\n 'ds:text-start ds:transition-colors',\n 'ds:hover:bg-muted/10',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:opacity-50 ds:disabled:cursor-not-allowed ds:disabled:hover:bg-transparent',\n ].join(' '),\n { variants: {}, defaultVariants: {} },\n);\n\n/* ------------------------------------------------------------------ */\n/* WidgetPicker */\n/* ------------------------------------------------------------------ */\n\nexport const WidgetPicker = forwardRef<WidgetPickerHandle, WidgetPickerProps>(\n ({ open, onOpenChange, items, onPick, title, id }, ref) => {\n const { t } = useTranslation('ui');\n const [query, setQuery] = useState('');\n\n // Clear the search when the picker closes, so the next open starts fresh\n // without a post-open reflow flash.\n useEffect(() => {\n if (!open) setQuery('');\n }, [open]);\n\n const filtered = useMemo(() => {\n const needle = query.trim().toLowerCase();\n if (!needle) return items;\n return items.filter(\n (item) =>\n item.title.toLowerCase().includes(needle) ||\n (item.description ?? '').toLowerCase().includes(needle),\n );\n }, [items, query]);\n\n /* Group by category, preserving first-seen order; ungrouped first. */\n const groups = useMemo(() => {\n const order: Array<{\n category: string | null;\n entries: WidgetPickerItem[];\n }> = [];\n for (const item of filtered) {\n // Treat an empty-string category the same as no category.\n const key = item.category || null;\n let group = order.find((g) => g.category === key);\n if (!group) {\n group = { category: key, entries: [] };\n if (key === null) order.unshift(group);\n else order.push(group);\n }\n group.entries.push(item);\n }\n return order;\n }, [filtered]);\n\n // The list is a tab stop only while it overflows. A callback ref, since\n // the dialog mounts the node on open and unmounts it on close.\n const [listNode, setListNode] = useState<HTMLDivElement | null>(null);\n const [scrollable, setScrollable] = useState(false);\n const [listFocused, setListFocused] = useState(false);\n useEffect(() => {\n if (!listNode) {\n setScrollable(false);\n return undefined;\n }\n const measure = () =>\n setScrollable(listNode.scrollHeight > listNode.clientHeight + 1);\n measure();\n if (typeof ResizeObserver === 'undefined') return undefined;\n const observer = new ResizeObserver(measure);\n observer.observe(listNode);\n for (const child of Array.from(listNode.children)) {\n observer.observe(child);\n }\n return () => observer.disconnect();\n }, [listNode, groups]);\n\n const handlePick = useCallback(\n (itemId: string) => {\n onPick(itemId);\n onOpenChange(false);\n },\n [onPick, onOpenChange],\n );\n\n const agentHandle = useMemo<WidgetPickerHandle>(\n () => ({\n pick(itemId) {\n if (!open) return false;\n const item = items.find((entry) => entry.id === itemId);\n if (!item || item.disabled) return false;\n handlePick(itemId);\n return true;\n },\n getPickerState() {\n return {\n open,\n items: items.map((item) => ({\n id: item.id,\n disabled: Boolean(item.disabled),\n })),\n };\n },\n }),\n [open, items, handlePick],\n );\n useImperativeHandle(ref, () => agentHandle, [agentHandle]);\n useAgentRegistration(widgetPickerAgent, agentHandle, id);\n\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Content size=\"lg\">\n <div data-component=\"widget-picker\" data-component-id={id}>\n <Dialog.Title>{title ?? t('widgetPicker.title')}</Dialog.Title>\n <Dialog.Description className=\"ds:sr-only\">\n {t('widgetPicker.description')}\n </Dialog.Description>\n <div className=\"ds:mt-[var(--spacing-sm)]\">\n <StateBackedTextInput\n aria-label={t('widgetPicker.searchLabel')}\n placeholder={t('widgetPicker.searchPlaceholder')}\n startAdornment={<Search aria-hidden=\"true\" />}\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n />\n </div>\n <div\n ref={setListNode}\n role=\"group\"\n aria-label={t('widgetPicker.listLabel')}\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- a tab stop while the list scrolls (an all-disabled list must stay scrollable, axe scrollable-region-focusable) and while focused, so focus never drops to <body>\n tabIndex={scrollable || listFocused ? 0 : undefined}\n onFocus={(event) => {\n if (event.target === event.currentTarget) setListFocused(true);\n }}\n onBlur={(event) => {\n if (event.target === event.currentTarget) setListFocused(false);\n }}\n className=\"ds:mt-[var(--spacing-md)] ds:flex ds:max-h-[60vh] ds:flex-col ds:gap-[var(--spacing-md)] ds:overflow-y-auto ds:pe-[var(--spacing-xs)] ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]\"\n >\n {groups.length === 0 ? (\n <p\n role=\"status\"\n className=\"ds:py-[var(--spacing-lg)] ds:text-center ds:text-sm ds:text-muted-foreground\"\n >\n {items.length === 0\n ? t('widgetPicker.none')\n : t('widgetPicker.empty')}\n </p>\n ) : (\n groups.map((group) => (\n <section\n key={group.category ?? '__ungrouped__'}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\"\n >\n {group.category ? (\n <h3 className=\"ds:text-xs ds:font-semibold ds:uppercase ds:tracking-wide ds:text-muted-foreground\">\n {group.category}\n </h3>\n ) : null}\n <div className=\"ds:grid ds:gap-[var(--spacing-sm)] ds:sm:grid-cols-2\">\n {group.entries.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n disabled={item.disabled}\n onClick={() => handlePick(item.id)}\n className={tileVariants()}\n data-widget-type-id={item.id}\n >\n {item.icon ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:mt-[var(--spacing-2xs)] ds:inline-flex ds:size-5 ds:shrink-0 ds:items-center ds:justify-center ds:text-muted-foreground ds:[&_svg]:size-5\"\n >\n {item.icon}\n </span>\n ) : null}\n <span className=\"ds:flex ds:min-w-0 ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <span className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <span className=\"ds:truncate ds:text-sm ds:font-medium\">\n {item.title}\n </span>\n {item.badge ? (\n <Badge variant=\"info\" size=\"sm\">\n {item.badge}\n </Badge>\n ) : null}\n </span>\n {item.description ? (\n <span className=\"ds:text-xs ds:text-muted-foreground\">\n {item.description}\n </span>\n ) : null}\n </span>\n </button>\n ))}\n </div>\n </section>\n ))\n )}\n </div>\n </div>\n </Dialog.Content>\n </Dialog.Root>\n );\n },\n);\n\nWidgetPicker.displayName = 'WidgetPicker';\n"],"names":["widgetPickerAgent","handle","args","tileVariants","cva","WidgetPicker","forwardRef","open","onOpenChange","items","onPick","title","id","ref","t","useTranslation","query","setQuery","useState","useEffect","filtered","useMemo","needle","item","groups","order","key","group","g","listNode","setListNode","scrollable","setScrollable","listFocused","setListFocused","measure","observer","child","handlePick","useCallback","itemId","agentHandle","entry","useImperativeHandle","useAgentRegistration","Dialog","jsx","jsxs","StateBackedTextInput","Search","event","Badge"],"mappings":"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"}
1
+ {"version":3,"file":"widget-picker-D3T7e8a4.js","sources":["../../src/components/widget-picker/widget-picker.agent.ts","../../src/components/widget-picker/widget-picker.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { WidgetPickerHandle } from './widget-picker';\n\nexport const widgetPickerAgent: AgentAdapter<WidgetPickerHandle> = {\n id: 'widget-picker',\n capabilities: ['pick'],\n state: {\n open: {\n type: 'boolean',\n descriptionKey: 'ui.agent.widgetPicker.state.open',\n description: 'Whether the picker dialog is currently open.',\n read: (handle) => handle.getPickerState().open,\n },\n items: {\n type: '{ id: string, disabled: boolean }[]',\n descriptionKey: 'ui.agent.widgetPicker.state.items',\n description:\n 'Widget-type ids on offer and whether each is pickable. Ids only — titles are host-app strings.',\n read: (handle) => handle.getPickerState().items,\n },\n },\n actions: {\n pick_widget: {\n // Picking adds a widget to the host dashboard — a write, reversible\n // by removing the widget again.\n safety: 'write',\n argsType: 'id',\n argsSchema: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n description: 'Widget-type id (see items state).',\n },\n },\n required: ['id'],\n },\n returns: 'boolean (accepted)',\n returnsSchema: {\n type: 'boolean',\n description:\n 'True when the pick was applied; false when the picker is closed, the id is unknown, or the item is disabled.',\n },\n idempotent: false,\n descriptionKey: 'ui.agent.widgetPicker.actions.pickWidget',\n description:\n 'Pick a widget type from the open catalogue. The picker closes and the host adds the widget. Refused while the dialog is closed and for disabled items.',\n invoke: (handle, args: { id: string }) => handle.pick(args.id),\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'widget-picker' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n item: {\n attr: 'data-widget-type-id',\n description: 'Each option tile carries its widget-type id.',\n },\n },\n};\n","/* ------------------------------------------------------------------ */\n/* WidgetPicker — \"add a widget\" modal for configurable dashboards. */\n/* */\n/* A Dialog-composed catalogue picker: the consumer supplies the */\n/* available widget types (title/description/icon/category, all */\n/* pre-translated app strings), the kit renders a searchable, grouped */\n/* grid of option tiles and reports the pick. Designed as the add flow */\n/* for `DashboardGrid` (`onRequestAdd` opens it) but generic to any */\n/* pick-one-catalogue surface. Disabled items stay visible with an */\n/* optional badge (e.g. \"Requires reconnect\") so users can discover */\n/* locked capabilities. */\n/* ------------------------------------------------------------------ */\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useState,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Search } from 'lucide-react';\nimport { Dialog } from '../dialog';\nimport { StateBackedTextInput } from '../_shared/state-backed-text-input';\nimport { Badge } from '../badge';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { widgetPickerAgent } from './widget-picker.agent';\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport interface WidgetPickerItem {\n /** Stable widget-type id reported via `onPick`. */\n id: string;\n /** Visible name (consumer-translated). */\n title: string;\n /** One-line explanation (consumer-translated). */\n description?: string;\n /** Small illustrative icon. */\n icon?: ReactNode;\n /** Group heading (consumer-translated). Ungrouped items render first. */\n category?: string;\n /** Visible but not pickable. */\n disabled?: boolean;\n /** Short annotation rendered as a badge (e.g. \"Requires reconnect\"). */\n badge?: string;\n}\n\nexport interface WidgetPickerProps {\n /** Controlled visibility. */\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** The catalogue. */\n items: WidgetPickerItem[];\n /**\n * Called with the picked item id; the picker then closes itself via\n * `onOpenChange(false)`.\n */\n onPick: (id: string) => void;\n /** Dialog title. Defaults to the kit's translated \"Add a widget\". */\n title?: string;\n /** Opaque instance id — emitted as `data-component-id` for the agent registry. */\n id?: string;\n}\n\nexport interface WidgetPickerHandle {\n /**\n * Pick an item programmatically. False when the picker is closed, the id\n * is unknown, or the item is disabled.\n */\n pick: (id: string) => boolean;\n getPickerState: () => {\n open: boolean;\n items: Array<{ id: string; disabled: boolean }>;\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst tileVariants = cva(\n [\n 'ds:flex ds:w-full ds:min-h-[var(--min-target-size)] ds:items-start ds:gap-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-border ds:bg-[var(--card)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:py-[var(--spacing-md)]',\n 'ds:text-start ds:transition-colors',\n 'ds:hover:bg-muted/10',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:opacity-50 ds:disabled:cursor-not-allowed ds:disabled:hover:bg-transparent',\n ].join(' '),\n { variants: {}, defaultVariants: {} },\n);\n\n/* ------------------------------------------------------------------ */\n/* WidgetPicker */\n/* ------------------------------------------------------------------ */\n\nexport const WidgetPicker = forwardRef<WidgetPickerHandle, WidgetPickerProps>(\n ({ open, onOpenChange, items, onPick, title, id }, ref) => {\n const { t } = useTranslation('ui');\n const [query, setQuery] = useState('');\n\n // Clear the search when the picker closes, so the next open starts fresh\n // without a post-open reflow flash.\n useEffect(() => {\n if (!open) setQuery('');\n }, [open]);\n\n const filtered = useMemo(() => {\n const needle = query.trim().toLowerCase();\n if (!needle) return items;\n return items.filter(\n (item) =>\n item.title.toLowerCase().includes(needle) ||\n (item.description ?? '').toLowerCase().includes(needle),\n );\n }, [items, query]);\n\n /* Group by category, preserving first-seen order; ungrouped first. */\n const groups = useMemo(() => {\n const order: Array<{\n category: string | null;\n entries: WidgetPickerItem[];\n }> = [];\n for (const item of filtered) {\n // Treat an empty-string category the same as no category.\n const key = item.category || null;\n let group = order.find((g) => g.category === key);\n if (!group) {\n group = { category: key, entries: [] };\n if (key === null) order.unshift(group);\n else order.push(group);\n }\n group.entries.push(item);\n }\n return order;\n }, [filtered]);\n\n // The list is a tab stop only while it overflows. A callback ref, since\n // the dialog mounts the node on open and unmounts it on close.\n const [listNode, setListNode] = useState<HTMLDivElement | null>(null);\n const [scrollable, setScrollable] = useState(false);\n const [listFocused, setListFocused] = useState(false);\n useEffect(() => {\n if (!listNode) {\n setScrollable(false);\n return undefined;\n }\n const measure = () =>\n setScrollable(listNode.scrollHeight > listNode.clientHeight + 1);\n measure();\n if (typeof ResizeObserver === 'undefined') return undefined;\n const observer = new ResizeObserver(measure);\n observer.observe(listNode);\n for (const child of Array.from(listNode.children)) {\n observer.observe(child);\n }\n return () => observer.disconnect();\n }, [listNode, groups]);\n\n const handlePick = useCallback(\n (itemId: string) => {\n onPick(itemId);\n onOpenChange(false);\n },\n [onPick, onOpenChange],\n );\n\n const agentHandle = useMemo<WidgetPickerHandle>(\n () => ({\n pick(itemId) {\n if (!open) return false;\n const item = items.find((entry) => entry.id === itemId);\n if (!item || item.disabled) return false;\n handlePick(itemId);\n return true;\n },\n getPickerState() {\n return {\n open,\n items: items.map((item) => ({\n id: item.id,\n disabled: Boolean(item.disabled),\n })),\n };\n },\n }),\n [open, items, handlePick],\n );\n useImperativeHandle(ref, () => agentHandle, [agentHandle]);\n useAgentRegistration(widgetPickerAgent, agentHandle, id);\n\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Dialog.Content size=\"lg\">\n <div data-component=\"widget-picker\" data-component-id={id}>\n <Dialog.Title>{title ?? t('widgetPicker.title')}</Dialog.Title>\n <Dialog.Description className=\"ds:sr-only\">\n {t('widgetPicker.description')}\n </Dialog.Description>\n <div className=\"ds:mt-[var(--spacing-sm)]\">\n <StateBackedTextInput\n aria-label={t('widgetPicker.searchLabel')}\n placeholder={t('widgetPicker.searchPlaceholder')}\n startAdornment={<Search aria-hidden=\"true\" />}\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n />\n </div>\n <div\n ref={setListNode}\n role=\"group\"\n aria-label={t('widgetPicker.listLabel')}\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- a tab stop while the list scrolls (an all-disabled list must stay scrollable, axe scrollable-region-focusable) and while focused, so focus never drops to <body>\n tabIndex={scrollable || listFocused ? 0 : undefined}\n onFocus={(event) => {\n if (event.target === event.currentTarget) setListFocused(true);\n }}\n onBlur={(event) => {\n if (event.target === event.currentTarget) setListFocused(false);\n }}\n className=\"ds:mt-[var(--spacing-md)] ds:flex ds:max-h-[60vh] ds:flex-col ds:gap-[var(--spacing-md)] ds:overflow-y-auto ds:pe-[var(--spacing-xs)] ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]\"\n >\n {groups.length === 0 ? (\n <p\n role=\"status\"\n className=\"ds:py-[var(--spacing-lg)] ds:text-center ds:text-sm ds:text-muted-foreground\"\n >\n {items.length === 0\n ? t('widgetPicker.none')\n : t('widgetPicker.empty')}\n </p>\n ) : (\n groups.map((group) => (\n <section\n key={group.category ?? '__ungrouped__'}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\"\n >\n {group.category ? (\n <h3 className=\"ds:text-xs ds:font-semibold ds:uppercase ds:tracking-wide ds:text-muted-foreground\">\n {group.category}\n </h3>\n ) : null}\n <div className=\"ds:grid ds:gap-[var(--spacing-sm)] ds:sm:grid-cols-2\">\n {group.entries.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n disabled={item.disabled}\n onClick={() => handlePick(item.id)}\n className={tileVariants()}\n data-widget-type-id={item.id}\n >\n {item.icon ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:mt-[var(--spacing-2xs)] ds:inline-flex ds:size-5 ds:shrink-0 ds:items-center ds:justify-center ds:text-muted-foreground ds:[&_svg]:size-5\"\n >\n {item.icon}\n </span>\n ) : null}\n <span className=\"ds:flex ds:min-w-0 ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <span className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <span className=\"ds:truncate ds:text-sm ds:font-medium\">\n {item.title}\n </span>\n {item.badge ? (\n <Badge variant=\"info\" size=\"sm\">\n {item.badge}\n </Badge>\n ) : null}\n </span>\n {item.description ? (\n <span className=\"ds:text-xs ds:text-muted-foreground\">\n {item.description}\n </span>\n ) : null}\n </span>\n </button>\n ))}\n </div>\n </section>\n ))\n )}\n </div>\n </div>\n </Dialog.Content>\n </Dialog.Root>\n );\n },\n);\n\nWidgetPicker.displayName = 'WidgetPicker';\n"],"names":["widgetPickerAgent","handle","args","tileVariants","cva","WidgetPicker","forwardRef","open","onOpenChange","items","onPick","title","id","ref","t","useTranslation","query","setQuery","useState","useEffect","filtered","useMemo","needle","item","groups","order","key","group","g","listNode","setListNode","scrollable","setScrollable","listFocused","setListFocused","measure","observer","child","handlePick","useCallback","itemId","agentHandle","entry","useImperativeHandle","useAgentRegistration","Dialog","jsx","jsxs","StateBackedTextInput","Search","event","Badge"],"mappings":"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"}
@@ -15,7 +15,7 @@ import { C as Ce } from "./circle-j7oZoouK.js";
15
15
  import { u as _e } from "./registry-DvAUVLHh.js";
16
16
  import { A as V } from "./alert-C4WKViaS.js";
17
17
  import { B as Se } from "./button-DohK_Ak_.js";
18
- import { D as N } from "./dropdown-menu-Dw6sgQwJ.js";
18
+ import { D as N } from "./dropdown-menu-DBWaW4pq.js";
19
19
  import { E } from "./empty-state-DwJ5YNzz.js";
20
20
  import { P as ne } from "./plus-DzMQ_c6b.js";
21
21
  import { G as ie } from "./globe-sHBW1JN5.js";
@@ -1321,4 +1321,4 @@ export {
1321
1321
  ee as r,
1322
1322
  D as w
1323
1323
  };
1324
- //# sourceMappingURL=workflow-map-DCjkRuS_.js.map
1324
+ //# sourceMappingURL=workflow-map-DaZFP9SJ.js.map