@alfadocs/ui-kit-debug 1.90.1 → 1.91.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 (380) hide show
  1. package/dist/_chunks/address-autocomplete-DR4Xn23Z.js +519 -0
  2. package/dist/_chunks/address-autocomplete-DR4Xn23Z.js.map +1 -0
  3. package/dist/_chunks/{address-fields-CfnXK8RT.js → address-fields-qxQkGwPf.js} +5 -5
  4. package/dist/_chunks/{address-fields-CfnXK8RT.js.map → address-fields-qxQkGwPf.js.map} +1 -1
  5. package/dist/_chunks/{agenda-card-BDuvreCe.js → agenda-card-BhY342MA.js} +2 -2
  6. package/dist/_chunks/{agenda-card-BDuvreCe.js.map → agenda-card-BhY342MA.js.map} +1 -1
  7. package/dist/_chunks/{agenda-tray-D-jvptdo.js → agenda-tray-BmxBGEci.js} +2 -2
  8. package/dist/_chunks/{agenda-tray-D-jvptdo.js.map → agenda-tray-BmxBGEci.js.map} +1 -1
  9. package/dist/_chunks/{ai-permission-notice-CoW22jx1.js → ai-permission-notice-VNh3W57L.js} +2 -2
  10. package/dist/_chunks/{ai-permission-notice-CoW22jx1.js.map → ai-permission-notice-VNh3W57L.js.map} +1 -1
  11. package/dist/_chunks/{alia-sidebar-CsTRAxC8.js → alia-sidebar-ovRX_oti.js} +3 -3
  12. package/dist/_chunks/{alia-sidebar-CsTRAxC8.js.map → alia-sidebar-ovRX_oti.js.map} +1 -1
  13. package/dist/_chunks/{anamnesis-summary-rows-fbEQwcuW.js → anamnesis-summary-rows-EKPfVCmh.js} +2 -2
  14. package/dist/_chunks/{anamnesis-summary-rows-fbEQwcuW.js.map → anamnesis-summary-rows-EKPfVCmh.js.map} +1 -1
  15. package/dist/_chunks/{appointment-card-5JMWi9_f.js → appointment-card-Bstc1p7a.js} +2 -2
  16. package/dist/_chunks/{appointment-card-5JMWi9_f.js.map → appointment-card-Bstc1p7a.js.map} +1 -1
  17. package/dist/_chunks/{appointment-peek-39BwVMUf.js → appointment-peek-C0kKqnFk.js} +2 -2
  18. package/dist/_chunks/{appointment-peek-39BwVMUf.js.map → appointment-peek-C0kKqnFk.js.map} +1 -1
  19. package/dist/_chunks/{appointment-timeline-1-Za2miy.js → appointment-timeline-rbt9AwHO.js} +2 -2
  20. package/dist/_chunks/{appointment-timeline-1-Za2miy.js.map → appointment-timeline-rbt9AwHO.js.map} +1 -1
  21. package/dist/_chunks/{appointment-tray-Dwc8MSIQ.js → appointment-tray-6zd8RLIL.js} +2 -2
  22. package/dist/_chunks/{appointment-tray-Dwc8MSIQ.js.map → appointment-tray-6zd8RLIL.js.map} +1 -1
  23. package/dist/_chunks/autocomplete-BXMcNoa3.js +562 -0
  24. package/dist/_chunks/autocomplete-BXMcNoa3.js.map +1 -0
  25. package/dist/_chunks/{avatar-BPiPL7ND.js → avatar-a6042Ox2.js} +52 -52
  26. package/dist/_chunks/avatar-a6042Ox2.js.map +1 -0
  27. package/dist/_chunks/{balance-badge-cell-C4FYwmrZ.js → balance-badge-cell-BtJvre1-.js} +3 -3
  28. package/dist/_chunks/{balance-badge-cell-C4FYwmrZ.js.map → balance-badge-cell-BtJvre1-.js.map} +1 -1
  29. package/dist/_chunks/booking-opt_h7Uc.js +4590 -0
  30. package/dist/_chunks/booking-opt_h7Uc.js.map +1 -0
  31. package/dist/_chunks/{calendar-ClB-jWH1.js → calendar-CmiMS4FJ.js} +2 -2
  32. package/dist/_chunks/{calendar-ClB-jWH1.js.map → calendar-CmiMS4FJ.js.map} +1 -1
  33. package/dist/_chunks/{calendar-appointment-editor-dialog-C1v2MNE4.js → calendar-appointment-editor-dialog-sJKLoVJ2.js} +11 -11
  34. package/dist/_chunks/{calendar-appointment-editor-dialog-C1v2MNE4.js.map → calendar-appointment-editor-dialog-sJKLoVJ2.js.map} +1 -1
  35. package/dist/_chunks/{care-plan-card-BYCPNDvA.js → care-plan-card-DD9rEWYN.js} +2 -2
  36. package/dist/_chunks/{care-plan-card-BYCPNDvA.js.map → care-plan-card-DD9rEWYN.js.map} +1 -1
  37. package/dist/_chunks/{care-plan-header-BzsAg6oY.js → care-plan-header-CXUJQt8Q.js} +2 -2
  38. package/dist/_chunks/{care-plan-header-BzsAg6oY.js.map → care-plan-header-CXUJQt8Q.js.map} +1 -1
  39. package/dist/_chunks/{chat-message-CmFJdEre.js → chat-message-LRO_6Ee3.js} +2 -2
  40. package/dist/_chunks/{chat-message-CmFJdEre.js.map → chat-message-LRO_6Ee3.js.map} +1 -1
  41. package/dist/_chunks/{checkbox-BjDv-r3o.js → checkbox-a7Sh-dXb.js} +32 -31
  42. package/dist/_chunks/checkbox-a7Sh-dXb.js.map +1 -0
  43. package/dist/_chunks/{checkbox-group-Cw2H5qaq.js → checkbox-group-eGdv9fZc.js} +2 -2
  44. package/dist/_chunks/{checkbox-group-Cw2H5qaq.js.map → checkbox-group-eGdv9fZc.js.map} +1 -1
  45. package/dist/_chunks/{city-input-CJVGswxp.js → city-input-CA59CjnV.js} +2 -2
  46. package/dist/_chunks/{city-input-CJVGswxp.js.map → city-input-CA59CjnV.js.map} +1 -1
  47. package/dist/_chunks/{clinical-note-card-Caidqcwa.js → clinical-note-card-Cut2lNmu.js} +3 -3
  48. package/dist/_chunks/{clinical-note-card-Caidqcwa.js.map → clinical-note-card-Cut2lNmu.js.map} +1 -1
  49. package/dist/_chunks/{combobox-CDPm_n0p.js → combobox-D-gpgEDy.js} +314 -294
  50. package/dist/_chunks/combobox-D-gpgEDy.js.map +1 -0
  51. package/dist/_chunks/{contact-card-Czu60UvU.js → contact-card-ClvEDM9e.js} +2 -2
  52. package/dist/_chunks/{contact-card-Czu60UvU.js.map → contact-card-ClvEDM9e.js.map} +1 -1
  53. package/dist/_chunks/{contact-profile-card-Da1vmJQI.js → contact-profile-card-CX45mZA3.js} +106 -95
  54. package/dist/_chunks/contact-profile-card-CX45mZA3.js.map +1 -0
  55. package/dist/_chunks/{country-select-DQ8q7ypA.js → country-select-BfmX9y5i.js} +2 -2
  56. package/dist/_chunks/{country-select-DQ8q7ypA.js.map → country-select-BfmX9y5i.js.map} +1 -1
  57. package/dist/_chunks/{data-table-B_IcS0Ke.js → data-table-CqQgoNsU.js} +2 -2
  58. package/dist/_chunks/{data-table-B_IcS0Ke.js.map → data-table-CqQgoNsU.js.map} +1 -1
  59. package/dist/_chunks/{dependent-selector-C4kOgO8b.js → dependent-selector-CyNi7M_f.js} +2 -2
  60. package/dist/_chunks/{dependent-selector-C4kOgO8b.js.map → dependent-selector-CyNi7M_f.js.map} +1 -1
  61. package/dist/_chunks/{entity-summary-BLxzSSXK.js → entity-summary-B_bOloqP.js} +3 -3
  62. package/dist/_chunks/{entity-summary-BLxzSSXK.js.map → entity-summary-B_bOloqP.js.map} +1 -1
  63. package/dist/_chunks/error-page-B0fGNTRB.js +419 -0
  64. package/dist/_chunks/error-page-B0fGNTRB.js.map +1 -0
  65. package/dist/_chunks/{face-scheme-BgJGFDTa.js → face-scheme-BKSE98bo.js} +2 -2
  66. package/dist/_chunks/{face-scheme-BgJGFDTa.js.map → face-scheme-BKSE98bo.js.map} +1 -1
  67. package/dist/_chunks/{file-manager-C9YOT-Dn.js → file-manager-BnI1ZWZu.js} +2 -2
  68. package/dist/_chunks/{file-manager-C9YOT-Dn.js.map → file-manager-BnI1ZWZu.js.map} +1 -1
  69. package/dist/_chunks/{header-settings-BVhjndtV.js → header-settings-BeA2fnol.js} +24 -23
  70. package/dist/_chunks/header-settings-BeA2fnol.js.map +1 -0
  71. package/dist/_chunks/{heatmap-HTz3Jvzy.js → heatmap-fCxwNz2o.js} +2 -2
  72. package/dist/_chunks/{heatmap-HTz3Jvzy.js.map → heatmap-fCxwNz2o.js.map} +1 -1
  73. package/dist/_chunks/{languages-CZqBaPwI.js → languages-CGLX6Qpe.js} +3 -15
  74. package/dist/_chunks/languages-CGLX6Qpe.js.map +1 -0
  75. package/dist/_chunks/link-DtCfnLnF.js +332 -0
  76. package/dist/_chunks/link-DtCfnLnF.js.map +1 -0
  77. package/dist/_chunks/{link-cell-renderer-C0ynDik7.js → link-cell-renderer-BS3V4LA6.js} +4 -4
  78. package/dist/_chunks/{link-cell-renderer-C0ynDik7.js.map → link-cell-renderer-BS3V4LA6.js.map} +1 -1
  79. package/dist/_chunks/{login-dev-card-DYwbL5sD.js → login-dev-card-BZBR58mu.js} +2 -2
  80. package/dist/_chunks/{login-dev-card-DYwbL5sD.js.map → login-dev-card-BZBR58mu.js.map} +1 -1
  81. package/dist/_chunks/{map-view-Bvi06RVh.js → map-view-UrNgxBy3.js} +260 -237
  82. package/dist/_chunks/map-view-UrNgxBy3.js.map +1 -0
  83. package/dist/_chunks/{index.modern-BeRXQVdc.js → maps-core-gate-DkNqGkm3.js} +360 -319
  84. package/dist/_chunks/maps-core-gate-DkNqGkm3.js.map +1 -0
  85. package/dist/_chunks/{marketplace-app-shell-x_abo_ye.js → marketplace-app-shell-CJQtx3sv.js} +3 -3
  86. package/dist/_chunks/{marketplace-app-shell-x_abo_ye.js.map → marketplace-app-shell-CJQtx3sv.js.map} +1 -1
  87. package/dist/_chunks/{message-card-CvCnCssc.js → message-card-B6SduXJv.js} +2 -2
  88. package/dist/_chunks/{message-card-CvCnCssc.js.map → message-card-B6SduXJv.js.map} +1 -1
  89. package/dist/_chunks/{message-tray-IJYvy6Cf.js → message-tray-Cllf-v0G.js} +2 -2
  90. package/dist/_chunks/{message-tray-IJYvy6Cf.js.map → message-tray-Cllf-v0G.js.map} +1 -1
  91. package/dist/_chunks/{nav-grid-Oc4aCPrg.js → nav-grid-D2xVcHTO.js} +2 -2
  92. package/dist/_chunks/{nav-grid-Oc4aCPrg.js.map → nav-grid-D2xVcHTO.js.map} +1 -1
  93. package/dist/_chunks/{note-attachment-DIlIQ7JF.js → note-attachment-cnj2JRrg.js} +2 -2
  94. package/dist/_chunks/{note-attachment-DIlIQ7JF.js.map → note-attachment-cnj2JRrg.js.map} +1 -1
  95. package/dist/_chunks/{note-timeline-KzL52MmB.js → note-timeline-BrjHBQfx.js} +2 -2
  96. package/dist/_chunks/{note-timeline-KzL52MmB.js.map → note-timeline-BrjHBQfx.js.map} +1 -1
  97. package/dist/_chunks/{notes-panel-CZO1qsD-.js → notes-panel-ib7I3aNf.js} +3 -3
  98. package/dist/_chunks/{notes-panel-CZO1qsD-.js.map → notes-panel-ib7I3aNf.js.map} +1 -1
  99. package/dist/_chunks/{operator-hero-6aAIQaFZ.js → operator-hero-C_5B-8Qp.js} +43 -41
  100. package/dist/_chunks/operator-hero-C_5B-8Qp.js.map +1 -0
  101. package/dist/_chunks/{patient-details-D0P5eog5.js → patient-details-BjcUpD9S.js} +3 -3
  102. package/dist/_chunks/{patient-details-D0P5eog5.js.map → patient-details-BjcUpD9S.js.map} +1 -1
  103. package/dist/_chunks/{patient-field-row-R73dZJY6.js → patient-field-row-B0tdiaWi.js} +6 -6
  104. package/dist/_chunks/{patient-field-row-R73dZJY6.js.map → patient-field-row-B0tdiaWi.js.map} +1 -1
  105. package/dist/_chunks/patient-search-Ca9j5cWb.js +1306 -0
  106. package/dist/_chunks/patient-search-Ca9j5cWb.js.map +1 -0
  107. package/dist/_chunks/{patient-summary-card-6U74-ivO.js → patient-summary-card-Cvv6_Ugk.js} +4 -4
  108. package/dist/_chunks/{patient-summary-card-6U74-ivO.js.map → patient-summary-card-Cvv6_Ugk.js.map} +1 -1
  109. package/dist/_chunks/{payment-request-card-MndSlVoK.js → payment-request-card-BfGauFY0.js} +2 -2
  110. package/dist/_chunks/{payment-request-card-MndSlVoK.js.map → payment-request-card-BfGauFY0.js.map} +1 -1
  111. package/dist/_chunks/{periodontal-diagnosis-B9YmmVmM.js → periodontal-diagnosis-DD3hrg9X.js} +2 -2
  112. package/dist/_chunks/{periodontal-diagnosis-B9YmmVmM.js.map → periodontal-diagnosis-DD3hrg9X.js.map} +1 -1
  113. package/dist/_chunks/{permission-matrix-BoQjENGV.js → permission-matrix-BJ6sg3Zp.js} +3 -3
  114. package/dist/_chunks/{permission-matrix-BoQjENGV.js.map → permission-matrix-BJ6sg3Zp.js.map} +1 -1
  115. package/dist/_chunks/{practice-profile-hero-qfrsFQI_.js → practice-profile-hero-ClzE-4CB.js} +76 -73
  116. package/dist/_chunks/practice-profile-hero-ClzE-4CB.js.map +1 -0
  117. package/dist/_chunks/{practice-results-B61krlwu.js → practice-results-CQ_KvEXK.js} +517 -514
  118. package/dist/_chunks/practice-results-CQ_KvEXK.js.map +1 -0
  119. package/dist/_chunks/{product-hub-panel-Blag8t8f.js → product-hub-panel-bHi7lkVD.js} +2 -2
  120. package/dist/_chunks/{product-hub-panel-Blag8t8f.js.map → product-hub-panel-bHi7lkVD.js.map} +1 -1
  121. package/dist/_chunks/{province-select-CPdTwEob.js → province-select-D64whw0m.js} +2 -2
  122. package/dist/_chunks/{province-select-CPdTwEob.js.map → province-select-D64whw0m.js.map} +1 -1
  123. package/dist/_chunks/public-footer-IoRWoAMz.js +596 -0
  124. package/dist/_chunks/public-footer-IoRWoAMz.js.map +1 -0
  125. package/dist/_chunks/{registration-form-DmP3YUfp.js → registration-form-CRm6DaB9.js} +2 -2
  126. package/dist/_chunks/{registration-form-DmP3YUfp.js.map → registration-form-CRm6DaB9.js.map} +1 -1
  127. package/dist/_chunks/{reviews-panel-UzQQLb-z.js → reviews-panel-B7InBORU.js} +42 -41
  128. package/dist/_chunks/reviews-panel-B7InBORU.js.map +1 -0
  129. package/dist/_chunks/{rich-text-editor-BZTyxQBd.js → rich-text-editor-BfEu57dk.js} +3 -3
  130. package/dist/_chunks/{rich-text-editor-BZTyxQBd.js.map → rich-text-editor-BfEu57dk.js.map} +1 -1
  131. package/dist/_chunks/{signature-request-DjY-X62H.js → signature-request-DvhyrRpn.js} +3 -3
  132. package/dist/_chunks/{signature-request-DjY-X62H.js.map → signature-request-DvhyrRpn.js.map} +1 -1
  133. package/dist/_chunks/{signed-out-frame-G-3ATOdu.js → signed-out-frame-CgRXOUzi.js} +2 -2
  134. package/dist/_chunks/{signed-out-frame-G-3ATOdu.js.map → signed-out-frame-CgRXOUzi.js.map} +1 -1
  135. package/dist/_chunks/{slot-grid-Bb13H9Rl.js → slot-grid-B-IAFX3C.js} +183 -170
  136. package/dist/_chunks/slot-grid-B-IAFX3C.js.map +1 -0
  137. package/dist/_chunks/{task-editor-BOETWbjU.js → task-editor-CI1SKUNc.js} +2 -2
  138. package/dist/_chunks/{task-editor-BOETWbjU.js.map → task-editor-CI1SKUNc.js.map} +1 -1
  139. package/dist/_chunks/{timeline-wUuTDFY_.js → timeline-BcYHdP56.js} +2 -2
  140. package/dist/_chunks/{timeline-wUuTDFY_.js.map → timeline-BcYHdP56.js.map} +1 -1
  141. package/dist/_chunks/{use-appointment-details-read-CWN-nJCZ.js → use-appointment-details-read-D8vDg0sg.js} +5 -5
  142. package/dist/_chunks/{use-appointment-details-read-CWN-nJCZ.js.map → use-appointment-details-read-D8vDg0sg.js.map} +1 -1
  143. package/dist/_chunks/{voice-control-panel-BziKE-KK.js → voice-control-panel-BP0otrID.js} +2 -2
  144. package/dist/_chunks/{voice-control-panel-BziKE-KK.js.map → voice-control-panel-BP0otrID.js.map} +1 -1
  145. package/dist/_chunks/{workflow-webhook-action-DulCpCRz.js → workflow-webhook-action-B_nBJ_ht.js} +2 -2
  146. package/dist/_chunks/{workflow-webhook-action-DulCpCRz.js.map → workflow-webhook-action-B_nBJ_ht.js.map} +1 -1
  147. package/dist/agent-catalog.json +3 -3
  148. package/dist/agent-i18n/en.json +1 -1
  149. package/dist/components/_shared/maps-core-gate.d.ts +18 -0
  150. package/dist/components/_shared/maps-core-gate.d.ts.map +1 -0
  151. package/dist/components/_shared/social-brand-icons.d.ts +29 -0
  152. package/dist/components/_shared/social-brand-icons.d.ts.map +1 -0
  153. package/dist/components/address-autocomplete/address-autocomplete.d.ts.map +1 -1
  154. package/dist/components/address-autocomplete/index.js +1 -1
  155. package/dist/components/address-fields/index.js +1 -1
  156. package/dist/components/agenda-card/index.js +1 -1
  157. package/dist/components/agenda-tray/index.js +1 -1
  158. package/dist/components/ai-permission-notice/index.js +1 -1
  159. package/dist/components/appointment-card/index.js +2 -2
  160. package/dist/components/appointment-details-panel/index.js +1 -1
  161. package/dist/components/appointment-peek/index.js +1 -1
  162. package/dist/components/appointment-timeline/index.js +1 -1
  163. package/dist/components/autocomplete/autocomplete.agent.d.ts.map +1 -1
  164. package/dist/components/autocomplete/autocomplete.d.ts.map +1 -1
  165. package/dist/components/autocomplete/index.js +1 -1
  166. package/dist/components/avatar/avatar.d.ts +14 -0
  167. package/dist/components/avatar/avatar.d.ts.map +1 -1
  168. package/dist/components/avatar/index.js +1 -1
  169. package/dist/components/booking/booking-types.d.ts +26 -0
  170. package/dist/components/booking/booking-types.d.ts.map +1 -1
  171. package/dist/components/booking/booking.d.ts.map +1 -1
  172. package/dist/components/booking/details-form.d.ts.map +1 -1
  173. package/dist/components/booking/index.js +1 -1
  174. package/dist/components/booking/slot-load-state.d.ts +11 -0
  175. package/dist/components/booking/slot-load-state.d.ts.map +1 -0
  176. package/dist/components/calendar/index.js +1 -1
  177. package/dist/components/care-plan-card/index.js +1 -1
  178. package/dist/components/care-plan-header/index.js +1 -1
  179. package/dist/components/chat-message/index.js +1 -1
  180. package/dist/components/checkbox/checkbox.d.ts.map +1 -1
  181. package/dist/components/checkbox/index.js +1 -1
  182. package/dist/components/checkbox-group/index.js +1 -1
  183. package/dist/components/city-input/index.js +1 -1
  184. package/dist/components/clinical-note-card/index.js +1 -1
  185. package/dist/components/combobox/combobox.d.ts.map +1 -1
  186. package/dist/components/combobox/index.js +1 -1
  187. package/dist/components/contact-card/index.js +1 -1
  188. package/dist/components/contact-profile-card/index.js +1 -1
  189. package/dist/components/country-select/index.js +1 -1
  190. package/dist/components/data-table/index.js +2 -2
  191. package/dist/components/dependent-selector/index.js +1 -1
  192. package/dist/components/entity-summary/index.js +1 -1
  193. package/dist/components/face-scheme/index.js +1 -1
  194. package/dist/components/file-manager/index.js +1 -1
  195. package/dist/components/header-settings/header-settings.d.ts +2 -1
  196. package/dist/components/header-settings/header-settings.d.ts.map +1 -1
  197. package/dist/components/header-settings/index.js +1 -1
  198. package/dist/components/heatmap/index.js +1 -1
  199. package/dist/components/link/index.js +1 -1
  200. package/dist/components/link/link.d.ts +10 -1
  201. package/dist/components/link/link.d.ts.map +1 -1
  202. package/dist/components/link/social-url.d.ts +71 -0
  203. package/dist/components/link/social-url.d.ts.map +1 -0
  204. package/dist/components/map-view/index.js +1 -1
  205. package/dist/components/map-view/map-view.d.ts.map +1 -1
  206. package/dist/components/message-card/index.js +1 -1
  207. package/dist/components/message-tray/index.js +1 -1
  208. package/dist/components/nav-grid/index.js +1 -1
  209. package/dist/components/note-timeline/index.js +1 -1
  210. package/dist/components/notes-panel/index.js +1 -1
  211. package/dist/components/operator-hero/index.js +1 -1
  212. package/dist/components/operator-hero/operator-hero.d.ts +6 -0
  213. package/dist/components/operator-hero/operator-hero.d.ts.map +1 -1
  214. package/dist/components/patient-details/index.js +1 -1
  215. package/dist/components/patient-search/index.js +1 -1
  216. package/dist/components/patient-search/patient-search.d.ts.map +1 -1
  217. package/dist/components/patient-summary-card/index.js +1 -1
  218. package/dist/components/patient-table/index.js +1 -1
  219. package/dist/components/payment-card/index.js +1 -1
  220. package/dist/components/periodontal-diagnosis/index.js +1 -1
  221. package/dist/components/permission-matrix/index.js +1 -1
  222. package/dist/components/practice-profile-hero/index.js +1 -1
  223. package/dist/components/practice-profile-hero/practice-profile-hero.d.ts +6 -0
  224. package/dist/components/practice-profile-hero/practice-profile-hero.d.ts.map +1 -1
  225. package/dist/components/practice-results/index.js +1 -1
  226. package/dist/components/practice-results/practice-results.d.ts +8 -2
  227. package/dist/components/practice-results/practice-results.d.ts.map +1 -1
  228. package/dist/components/product-hub-tray/index.js +1 -1
  229. package/dist/components/province-select/index.js +1 -1
  230. package/dist/components/public-footer/index.js +1 -1
  231. package/dist/components/public-footer/public-footer.d.ts +13 -1
  232. package/dist/components/public-footer/public-footer.d.ts.map +1 -1
  233. package/dist/components/public-footer/socials.d.ts +6 -5
  234. package/dist/components/public-footer/socials.d.ts.map +1 -1
  235. package/dist/components/reviews-panel/index.js +1 -1
  236. package/dist/components/reviews-panel/reviews-panel.d.ts.map +1 -1
  237. package/dist/components/rich-text-editor/index.js +1 -1
  238. package/dist/components/slot-grid/index.js +1 -1
  239. package/dist/components/slot-grid/slot-grid.d.ts +2 -0
  240. package/dist/components/slot-grid/slot-grid.d.ts.map +1 -1
  241. package/dist/components/task-editor/index.js +1 -1
  242. package/dist/components/timeline/index.js +1 -1
  243. package/dist/components/voice-control-panel/index.js +1 -1
  244. package/dist/host-compat.css +1 -10
  245. package/dist/i18n/config.d.ts.map +1 -1
  246. package/dist/i18n/config.js +224 -96
  247. package/dist/i18n/config.js.map +1 -1
  248. package/dist/i18n/locales/ar.d.ts +3 -0
  249. package/dist/i18n/locales/ar.d.ts.map +1 -1
  250. package/dist/i18n/locales/ar.js +4 -1
  251. package/dist/i18n/locales/ar.js.map +1 -1
  252. package/dist/i18n/locales/de.d.ts +3 -0
  253. package/dist/i18n/locales/de.d.ts.map +1 -1
  254. package/dist/i18n/locales/de.js +4 -1
  255. package/dist/i18n/locales/de.js.map +1 -1
  256. package/dist/i18n/locales/el.d.ts +3 -0
  257. package/dist/i18n/locales/el.d.ts.map +1 -1
  258. package/dist/i18n/locales/el.js +4 -1
  259. package/dist/i18n/locales/el.js.map +1 -1
  260. package/dist/i18n/locales/en.d.ts +3 -0
  261. package/dist/i18n/locales/en.d.ts.map +1 -1
  262. package/dist/i18n/locales/en.js +3 -0
  263. package/dist/i18n/locales/en.js.map +1 -1
  264. package/dist/i18n/locales/es.d.ts +3 -0
  265. package/dist/i18n/locales/es.d.ts.map +1 -1
  266. package/dist/i18n/locales/es.js +4 -1
  267. package/dist/i18n/locales/es.js.map +1 -1
  268. package/dist/i18n/locales/fr.d.ts +3 -0
  269. package/dist/i18n/locales/fr.d.ts.map +1 -1
  270. package/dist/i18n/locales/fr.js +4 -1
  271. package/dist/i18n/locales/fr.js.map +1 -1
  272. package/dist/i18n/locales/hi.d.ts +3 -0
  273. package/dist/i18n/locales/hi.d.ts.map +1 -1
  274. package/dist/i18n/locales/hi.js +4 -1
  275. package/dist/i18n/locales/hi.js.map +1 -1
  276. package/dist/i18n/locales/it.d.ts +3 -0
  277. package/dist/i18n/locales/it.d.ts.map +1 -1
  278. package/dist/i18n/locales/it.js +4 -1
  279. package/dist/i18n/locales/it.js.map +1 -1
  280. package/dist/i18n/locales/ja.d.ts +3 -0
  281. package/dist/i18n/locales/ja.d.ts.map +1 -1
  282. package/dist/i18n/locales/ja.js +4 -1
  283. package/dist/i18n/locales/ja.js.map +1 -1
  284. package/dist/i18n/locales/nl.d.ts +3 -0
  285. package/dist/i18n/locales/nl.d.ts.map +1 -1
  286. package/dist/i18n/locales/nl.js +4 -1
  287. package/dist/i18n/locales/nl.js.map +1 -1
  288. package/dist/i18n/locales/pl.d.ts +3 -0
  289. package/dist/i18n/locales/pl.d.ts.map +1 -1
  290. package/dist/i18n/locales/pl.js +4 -1
  291. package/dist/i18n/locales/pl.js.map +1 -1
  292. package/dist/i18n/locales/pt.d.ts +3 -0
  293. package/dist/i18n/locales/pt.d.ts.map +1 -1
  294. package/dist/i18n/locales/pt.js +4 -1
  295. package/dist/i18n/locales/pt.js.map +1 -1
  296. package/dist/i18n/locales/ro.d.ts +3 -0
  297. package/dist/i18n/locales/ro.d.ts.map +1 -1
  298. package/dist/i18n/locales/ro.js +4 -1
  299. package/dist/i18n/locales/ro.js.map +1 -1
  300. package/dist/i18n/locales/ru.d.ts +3 -0
  301. package/dist/i18n/locales/ru.d.ts.map +1 -1
  302. package/dist/i18n/locales/ru.js +4 -1
  303. package/dist/i18n/locales/ru.js.map +1 -1
  304. package/dist/i18n/locales/sq.d.ts +3 -0
  305. package/dist/i18n/locales/sq.d.ts.map +1 -1
  306. package/dist/i18n/locales/sq.js +4 -1
  307. package/dist/i18n/locales/sq.js.map +1 -1
  308. package/dist/i18n/locales/sv.d.ts +3 -0
  309. package/dist/i18n/locales/sv.d.ts.map +1 -1
  310. package/dist/i18n/locales/sv.js +4 -1
  311. package/dist/i18n/locales/sv.js.map +1 -1
  312. package/dist/i18n/locales/tr.d.ts +3 -0
  313. package/dist/i18n/locales/tr.d.ts.map +1 -1
  314. package/dist/i18n/locales/tr.js +4 -1
  315. package/dist/i18n/locales/tr.js.map +1 -1
  316. package/dist/i18n/locales/zh.d.ts +3 -0
  317. package/dist/i18n/locales/zh.d.ts.map +1 -1
  318. package/dist/i18n/locales/zh.js +4 -1
  319. package/dist/i18n/locales/zh.js.map +1 -1
  320. package/dist/index.js +68 -68
  321. package/dist/locales/ar.json +4 -1
  322. package/dist/locales/de.json +4 -1
  323. package/dist/locales/el.json +4 -1
  324. package/dist/locales/en.json +3 -0
  325. package/dist/locales/es.json +4 -1
  326. package/dist/locales/fr.json +4 -1
  327. package/dist/locales/hi.json +4 -1
  328. package/dist/locales/it.json +4 -1
  329. package/dist/locales/ja.json +4 -1
  330. package/dist/locales/nl.json +4 -1
  331. package/dist/locales/pl.json +4 -1
  332. package/dist/locales/pt.json +4 -1
  333. package/dist/locales/ro.json +4 -1
  334. package/dist/locales/ru.json +4 -1
  335. package/dist/locales/sq.json +4 -1
  336. package/dist/locales/sv.json +4 -1
  337. package/dist/locales/tr.json +4 -1
  338. package/dist/locales/zh.json +4 -1
  339. package/dist/patterns/alia-assistant/index.js +1 -1
  340. package/dist/patterns/anamnesis/index.js +1 -1
  341. package/dist/patterns/calendar/index.js +1 -1
  342. package/dist/patterns/error-page/error-page-english.d.ts +71 -0
  343. package/dist/patterns/error-page/error-page-english.d.ts.map +1 -0
  344. package/dist/patterns/error-page/error-page.d.ts.map +1 -1
  345. package/dist/patterns/error-page/index.js +1 -1
  346. package/dist/patterns/login-form/index.js +1 -1
  347. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  348. package/dist/patterns/registration-form/index.js +1 -1
  349. package/dist/patterns/signature-request/index.js +1 -1
  350. package/dist/patterns/signed-out-frame/index.js +1 -1
  351. package/dist/patterns/workflow-webhook-action/index.js +1 -1
  352. package/dist/tokens.css +1 -1
  353. package/package.json +1 -1
  354. package/dist/_chunks/address-autocomplete-bPR2mNBt.js +0 -498
  355. package/dist/_chunks/address-autocomplete-bPR2mNBt.js.map +0 -1
  356. package/dist/_chunks/autocomplete-CnB1mHGc.js +0 -539
  357. package/dist/_chunks/autocomplete-CnB1mHGc.js.map +0 -1
  358. package/dist/_chunks/avatar-BPiPL7ND.js.map +0 -1
  359. package/dist/_chunks/booking-C0FoW8Yx.js +0 -4336
  360. package/dist/_chunks/booking-C0FoW8Yx.js.map +0 -1
  361. package/dist/_chunks/checkbox-BjDv-r3o.js.map +0 -1
  362. package/dist/_chunks/combobox-CDPm_n0p.js.map +0 -1
  363. package/dist/_chunks/contact-profile-card-Da1vmJQI.js.map +0 -1
  364. package/dist/_chunks/error-page-Bhai-spN.js +0 -344
  365. package/dist/_chunks/error-page-Bhai-spN.js.map +0 -1
  366. package/dist/_chunks/header-settings-BVhjndtV.js.map +0 -1
  367. package/dist/_chunks/index.modern-BeRXQVdc.js.map +0 -1
  368. package/dist/_chunks/languages-CZqBaPwI.js.map +0 -1
  369. package/dist/_chunks/link-N5_YpLtm.js +0 -138
  370. package/dist/_chunks/link-N5_YpLtm.js.map +0 -1
  371. package/dist/_chunks/map-view-Bvi06RVh.js.map +0 -1
  372. package/dist/_chunks/operator-hero-6aAIQaFZ.js.map +0 -1
  373. package/dist/_chunks/patient-search-CCOUZABE.js +0 -1196
  374. package/dist/_chunks/patient-search-CCOUZABE.js.map +0 -1
  375. package/dist/_chunks/practice-profile-hero-qfrsFQI_.js.map +0 -1
  376. package/dist/_chunks/practice-results-B61krlwu.js.map +0 -1
  377. package/dist/_chunks/public-footer-CXOrdAaS.js +0 -568
  378. package/dist/_chunks/public-footer-CXOrdAaS.js.map +0 -1
  379. package/dist/_chunks/reviews-panel-UzQQLb-z.js.map +0 -1
  380. package/dist/_chunks/slot-grid-Bb13H9Rl.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"periodontal-diagnosis-B9YmmVmM.js","sources":["../../src/components/periodontal-diagnosis/periodontal-diagnosis.agent.ts","../../src/components/periodontal-diagnosis/periodontal-diagnosis-data.ts","../../src/components/periodontal-diagnosis/periodontal-diagnosis.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { PeriodontalDiagnosisHandle } from './periodontal-diagnosis';\nimport type {\n PeriodontitisExtent,\n PeriodontitisGrade,\n PeriodontitisStage,\n} from './periodontal-diagnosis-data';\n\n/* -------------------------------------------------------------------- */\n/* PeriodontalDiagnosis — agent adapter */\n/* */\n/* Agents can read the recorded stage / grade / extent / factors and the */\n/* worded summary, and can set each field. The free-text clinician note */\n/* (PHI) is never exposed — getDiagnosis() strips it. */\n/* -------------------------------------------------------------------- */\n\nconst STAGE_SCHEMA = {\n enum: [1, 2, 3, 4],\n description: 'Periodontitis stage I–IV, as the integers 1–4.',\n} as const;\nconst GRADE_SCHEMA = {\n enum: ['A', 'B', 'C'],\n description: 'Periodontitis grade A–C (rate of progression).',\n} as const;\nconst EXTENT_SCHEMA = {\n enum: ['localised', 'generalised', 'molarIncisor'],\n description:\n 'Distribution: localised (<30%), generalised (≥30%), or molar-incisor.',\n} as const;\n\nexport const periodontalDiagnosisAgent: AgentAdapter<PeriodontalDiagnosisHandle> =\n {\n id: 'periodontal-diagnosis',\n // set_value — set stage / grade / extent / a factor. Each set_* action's\n // enum argsSchema already conveys that the field is a closed choice.\n capabilities: ['set_value'],\n state: {\n diagnosis: {\n type: 'object',\n descriptionKey: 'ui.agent.periodontalDiagnosis.state.diagnosis',\n description:\n 'Recorded stage (1–4), grade (A–C), extent, and ticked contributing-factor ids. The free-text note is never included.',\n read: (handle) => handle.getDiagnosis(),\n },\n summary: {\n type: 'string',\n descriptionKey: 'ui.agent.periodontalDiagnosis.state.summary',\n description:\n 'The composed, localised diagnosis sentence (e.g. \"Periodontitis — Stage III · Grade B · generalised\").',\n read: (handle) => handle.getSummary(),\n },\n complete: {\n type: 'boolean',\n descriptionKey: 'ui.agent.periodontalDiagnosis.state.complete',\n description: 'True once both a stage and a grade are recorded.',\n read: (handle) => handle.isComplete(),\n },\n },\n actions: {\n get_diagnosis: {\n safety: 'read',\n argsType: '{}',\n argsSchema: { type: 'object', properties: {} },\n returns: 'object',\n returnsSchema: { type: 'object' },\n idempotent: true,\n descriptionKey: 'ui.agent.periodontalDiagnosis.actions.getDiagnosis',\n description:\n 'Read the recorded stage / grade / extent / factors. The note is never returned.',\n invoke: (handle) => handle.getDiagnosis(),\n },\n set_stage: {\n safety: 'write',\n argsType: '{ stage: 1 | 2 | 3 | 4 }',\n argsSchema: {\n type: 'object',\n properties: { stage: STAGE_SCHEMA },\n required: ['stage'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.periodontalDiagnosis.actions.setStage',\n description: 'Record the periodontitis stage (I–IV).',\n invoke: (handle, args: { stage: PeriodontitisStage }) => {\n handle.setStage(args.stage);\n },\n },\n set_grade: {\n safety: 'write',\n argsType: \"{ grade: 'A' | 'B' | 'C' }\",\n argsSchema: {\n type: 'object',\n properties: { grade: GRADE_SCHEMA },\n required: ['grade'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.periodontalDiagnosis.actions.setGrade',\n description: 'Record the periodontitis grade (A–C).',\n invoke: (handle, args: { grade: PeriodontitisGrade }) => {\n handle.setGrade(args.grade);\n },\n },\n set_extent: {\n safety: 'write',\n argsType: \"{ extent: 'localised' | 'generalised' | 'molarIncisor' }\",\n argsSchema: {\n type: 'object',\n properties: { extent: EXTENT_SCHEMA },\n required: ['extent'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.periodontalDiagnosis.actions.setExtent',\n description: 'Record the distribution / extent.',\n invoke: (handle, args: { extent: PeriodontitisExtent }) => {\n handle.setExtent(args.extent);\n },\n },\n toggle_factor: {\n safety: 'write',\n argsType: '{ id: string; value: boolean }',\n argsSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Contributing-factor id.' },\n value: { type: 'boolean' },\n },\n required: ['id', 'value'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.periodontalDiagnosis.actions.toggleFactor',\n description: 'Tick or clear a contributing factor.',\n invoke: (handle, args: { id: string; value: boolean }) => {\n handle.toggleFactor(args.id, args.value);\n },\n },\n clear_diagnosis: {\n safety: 'destructive',\n argsType: '{}',\n argsSchema: { type: 'object', properties: {} },\n idempotent: true,\n descriptionKey: 'ui.agent.periodontalDiagnosis.actions.clearDiagnosis',\n description: 'Reset the whole diagnosis to empty.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'periodontal-diagnosis',\n description: 'Marks the PeriodontalDiagnosis root group.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n };\n","/* -------------------------------------------------------------------- */\n/* PeriodontalDiagnosis — data model */\n/* */\n/* The 2017 World Workshop / EFP periodontitis classification: a stage */\n/* (I–IV, severity + complexity), a grade (A–C, rate of progression) and */\n/* an extent (localised / generalised / molar-incisor). The jurisdiction- */\n/* specific *algorithm* that derives stage & grade from clinical findings */\n/* stays in the consumer; this component is the reusable, controllable */\n/* form + summary. A curated checklist of contributing factors gives the */\n/* clinician context without baking one country's logic into the kit. */\n/* -------------------------------------------------------------------- */\n\nexport type PeriodontitisStage = 1 | 2 | 3 | 4;\nexport type PeriodontitisGrade = 'A' | 'B' | 'C';\nexport type PeriodontitisExtent = 'localised' | 'generalised' | 'molarIncisor';\n\nexport const PERIODONTITIS_STAGES: readonly PeriodontitisStage[] = [1, 2, 3, 4];\nexport const PERIODONTITIS_GRADES: readonly PeriodontitisGrade[] = [\n 'A',\n 'B',\n 'C',\n];\nexport const PERIODONTITIS_EXTENTS: readonly PeriodontitisExtent[] = [\n 'localised',\n 'generalised',\n 'molarIncisor',\n];\n\n/** Roman numeral for a stage — matches the WHO / EFP notation. */\nexport const STAGE_ROMAN: Record<PeriodontitisStage, string> = {\n 1: 'I',\n 2: 'II',\n 3: 'III',\n 4: 'IV',\n};\n\n/**\n * The default contributing-factor checklist — the staging (severity) and\n * grading (progression) drivers of the 2017 classification. Consumers can\n * pass their own list of ids to localise the questionnaire.\n */\nexport const DEFAULT_DIAGNOSIS_FACTORS = [\n 'interdentalCal',\n 'radiographicBoneLoss',\n 'toothLossPerio',\n 'probingDepth6',\n 'boneLossAgeOver1',\n 'smoker',\n 'diabetes',\n] as const;\n\nexport type PeriodontalDiagnosisFactor =\n (typeof DEFAULT_DIAGNOSIS_FACTORS)[number];\n\n/** The recorded diagnosis. `note` is free-text PHI and never leaves the UI. */\nexport interface PeriodontalDiagnosisValue {\n stage?: PeriodontitisStage;\n grade?: PeriodontitisGrade;\n extent?: PeriodontitisExtent;\n /** Ids of the ticked contributing factors. */\n factors?: string[];\n /** Free-text clinician note — PHI; excluded from the agent adapter. */\n note?: string;\n}\n\n/** A diagnosis needs at least a stage and a grade to read as complete. */\nexport function isDiagnosisComplete(value: PeriodontalDiagnosisValue): boolean {\n return value.stage != null && value.grade != null;\n}\n\n/** A fresh, empty diagnosis. */\nexport function emptyDiagnosis(): PeriodontalDiagnosisValue {\n return {};\n}\n","import {\n forwardRef,\n useId,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Badge } from '../badge/badge';\nimport { Card } from '../card/card';\nimport { Checkbox } from '../checkbox/checkbox';\nimport { Radio } from '../radio-group/radio';\nimport { RadioGroup } from '../radio-group/radio-group';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { periodontalDiagnosisAgent } from './periodontal-diagnosis.agent';\nimport {\n DEFAULT_DIAGNOSIS_FACTORS,\n emptyDiagnosis,\n isDiagnosisComplete,\n PERIODONTITIS_EXTENTS,\n PERIODONTITIS_GRADES,\n PERIODONTITIS_STAGES,\n STAGE_ROMAN,\n type PeriodontalDiagnosisValue,\n type PeriodontitisExtent,\n type PeriodontitisGrade,\n type PeriodontitisStage,\n} from './periodontal-diagnosis-data';\n\n/* -------------------------------------------------------------------- */\n/* PeriodontalDiagnosis */\n/* */\n/* The 2017 World Workshop / EFP periodontitis classification form: */\n/* stage (I–IV), grade (A–C), extent, and a curated checklist of the */\n/* staging/grading contributing factors. Controlled or uncontrolled. */\n/* The composed summary (\"Periodontitis — Stage III · Grade B · */\n/* generalised\") is the worded, non-colour source of truth. */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva('ds:w-full ds:text-[color:var(--foreground)]', {\n variants: {\n surface: { flat: '', elevated: '' },\n },\n defaultVariants: { surface: 'elevated' },\n});\n\n/* -------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------- */\n\nexport interface PeriodontalDiagnosisHandle {\n /** The recorded stage / grade / extent / factors — never the free-text note. */\n getDiagnosis: () => Omit<PeriodontalDiagnosisValue, 'note'>;\n /** The composed, localised summary sentence. */\n getSummary: () => string;\n /** True once both a stage and a grade are recorded. */\n isComplete: () => boolean;\n setStage: (stage: PeriodontitisStage) => void;\n setGrade: (grade: PeriodontitisGrade) => void;\n setExtent: (extent: PeriodontitisExtent) => void;\n toggleFactor: (id: string, on?: boolean) => void;\n /** Reset to an empty diagnosis. */\n clear: () => void;\n}\n\nexport interface PeriodontalDiagnosisProps extends Omit<\n ComponentPropsWithoutRef<'div'>,\n 'aria-label' | 'children' | 'onChange' | 'defaultValue'\n> {\n /** Controlled value. */\n value?: PeriodontalDiagnosisValue;\n /** Uncontrolled initial value. */\n defaultValue?: PeriodontalDiagnosisValue;\n /** Fires with the next diagnosis whenever the clinician changes a field. */\n onChange?: (value: PeriodontalDiagnosisValue) => void;\n /** `'interactive'` (default) renders the form; `'display'` is read-only. */\n mode?: 'interactive' | 'display';\n /** Disable every control. */\n disabled?: boolean;\n /** Contributing-factor ids for the checklist. Defaults to the WHO-2017 set. */\n factors?: readonly string[];\n /** `'elevated'` (default) wraps in a Card; `'flat'` drops the chrome. */\n surface?: 'flat' | 'elevated';\n /** Override the default region aria-label. */\n 'aria-label'?: string;\n /** Agent-readiness consumer id, surfaced as `data-component-id`. */\n id?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const PeriodontalDiagnosis = forwardRef<\n HTMLDivElement,\n PeriodontalDiagnosisProps\n>(\n (\n {\n value,\n defaultValue,\n onChange,\n mode = 'interactive',\n disabled = false,\n factors = DEFAULT_DIAGNOSIS_FACTORS,\n surface = 'elevated',\n 'aria-label': ariaLabel,\n id,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n const headingId = useId();\n\n const isControlled = value !== undefined;\n const [internal, setInternal] = useState<PeriodontalDiagnosisValue>(\n defaultValue ?? emptyDiagnosis(),\n );\n const current = isControlled ? value : internal;\n\n // Latest committed value — so an agent making several edits in one tick\n // always builds on the previous edit, not a stale render snapshot.\n const valueRef = useRef(current);\n valueRef.current = current;\n\n const commit = (next: PeriodontalDiagnosisValue) => {\n valueRef.current = next;\n if (!isControlled) setInternal(next);\n onChange?.(next);\n };\n\n const setStage = (stage: PeriodontitisStage) =>\n commit({ ...valueRef.current, stage });\n const setGrade = (grade: PeriodontitisGrade) =>\n commit({ ...valueRef.current, grade });\n const setExtent = (extent: PeriodontitisExtent) =>\n commit({ ...valueRef.current, extent });\n const toggleFactor = (factorId: string, on?: boolean) => {\n const set = new Set(valueRef.current.factors ?? []);\n const next = on ?? !set.has(factorId);\n if (next) set.add(factorId);\n else set.delete(factorId);\n commit({ ...valueRef.current, factors: [...set] });\n };\n const clear = () => commit(emptyDiagnosis());\n\n const complete = isDiagnosisComplete(current);\n const activeFactors = current.factors ?? [];\n\n const stageLabel = (s: PeriodontitisStage) =>\n t(`periodontalDiagnosis.stage.option`, {\n roman: STAGE_ROMAN[s],\n defaultValue: `Stage ${STAGE_ROMAN[s]}`,\n });\n const gradeLabel = (g: PeriodontitisGrade) =>\n t(`periodontalDiagnosis.grade.option`, {\n grade: g,\n defaultValue: `Grade ${g}`,\n });\n const extentLabel = (e: PeriodontitisExtent) =>\n t(`periodontalDiagnosis.extent.${e}`, {\n defaultValue:\n e === 'localised'\n ? 'Localised'\n : e === 'generalised'\n ? 'Generalised'\n : 'Molar-incisor',\n });\n const factorLabel = (fid: string) =>\n t(`periodontalDiagnosis.factor.${fid}`, { defaultValue: fid });\n\n // Worded summary sentence — the accessible source of truth.\n const chips: string[] = [];\n if (current.stage != null)\n chips.push(\n t('periodontalDiagnosis.summary.stage', {\n roman: STAGE_ROMAN[current.stage],\n defaultValue: `Stage ${STAGE_ROMAN[current.stage]}`,\n }),\n );\n if (current.grade != null)\n chips.push(\n t('periodontalDiagnosis.summary.grade', {\n grade: current.grade,\n defaultValue: `Grade ${current.grade}`,\n }),\n );\n if (current.extent != null) chips.push(extentLabel(current.extent));\n const summary = chips.length\n ? `${t('periodontalDiagnosis.term', 'Periodontitis')} — ${chips.join(' · ')}`\n : t('periodontalDiagnosis.summary.none', 'No diagnosis recorded yet');\n\n useAgentRegistration(\n periodontalDiagnosisAgent,\n {\n getDiagnosis: () => {\n const { note: _note, ...rest2 } = valueRef.current;\n return rest2;\n },\n getSummary: () => summary,\n isComplete: () => isDiagnosisComplete(valueRef.current),\n setStage,\n setGrade,\n setExtent,\n toggleFactor,\n clear,\n },\n id,\n );\n\n const heading = t('periodontalDiagnosis.heading', 'Periodontal diagnosis');\n const resolvedAriaLabel = ariaLabel ?? heading;\n\n const readonlyView = (\n <dl className=\"type-body-sm ds:grid ds:grid-cols-[auto_1fr] ds:gap-x-[var(--spacing-md)] ds:gap-y-[var(--spacing-2xs)] ds:m-0\">\n <dt className=\"ds:text-[color:var(--muted-foreground)]\">\n {t('periodontalDiagnosis.stage.label', 'Staging')}\n </dt>\n <dd className=\"ds:m-0\">\n {current.stage != null\n ? stageLabel(current.stage)\n : t('periodontalDiagnosis.unset', '—')}\n </dd>\n <dt className=\"ds:text-[color:var(--muted-foreground)]\">\n {t('periodontalDiagnosis.grade.label', 'Grading')}\n </dt>\n <dd className=\"ds:m-0\">\n {current.grade != null\n ? gradeLabel(current.grade)\n : t('periodontalDiagnosis.unset', '—')}\n </dd>\n <dt className=\"ds:text-[color:var(--muted-foreground)]\">\n {t('periodontalDiagnosis.extent.label', 'Extent')}\n </dt>\n <dd className=\"ds:m-0\">\n {current.extent != null\n ? extentLabel(current.extent)\n : t('periodontalDiagnosis.unset', '—')}\n </dd>\n <dt className=\"ds:text-[color:var(--muted-foreground)]\">\n {t('periodontalDiagnosis.factors.label', 'Contributing factors')}\n </dt>\n <dd className=\"ds:m-0\">\n {activeFactors.length\n ? activeFactors.map((fid) => factorLabel(fid)).join(', ')\n : t('periodontalDiagnosis.unset', '—')}\n </dd>\n </dl>\n );\n\n const formView = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]\">\n <RadioGroup\n variant=\"horizontal\"\n label={t('periodontalDiagnosis.stage.label', 'Staging')}\n description={t(\n 'periodontalDiagnosis.stage.description',\n 'Severity and complexity of management.',\n )}\n value={current.stage != null ? String(current.stage) : ''}\n onValueChange={(v) => setStage(Number(v) as PeriodontitisStage)}\n disabled={disabled}\n >\n {PERIODONTITIS_STAGES.map((s) => (\n <Radio key={s} value={String(s)} label={stageLabel(s)} />\n ))}\n </RadioGroup>\n\n <RadioGroup\n variant=\"horizontal\"\n label={t('periodontalDiagnosis.grade.label', 'Grading')}\n description={t(\n 'periodontalDiagnosis.grade.description',\n 'Rate of progression.',\n )}\n value={current.grade ?? ''}\n onValueChange={(v) => setGrade(v as PeriodontitisGrade)}\n disabled={disabled}\n >\n {PERIODONTITIS_GRADES.map((g) => (\n <Radio key={g} value={g} label={gradeLabel(g)} />\n ))}\n </RadioGroup>\n\n <RadioGroup\n variant=\"horizontal\"\n label={t('periodontalDiagnosis.extent.label', 'Extent')}\n value={current.extent ?? ''}\n onValueChange={(v) => setExtent(v as PeriodontitisExtent)}\n disabled={disabled}\n >\n {PERIODONTITIS_EXTENTS.map((e) => (\n <Radio key={e} value={e} label={extentLabel(e)} />\n ))}\n </RadioGroup>\n\n <fieldset className=\"ds:m-0 ds:border-0 ds:p-0\">\n <legend className=\"type-label ds:mb-[var(--spacing-xs)] ds:p-0 ds:text-[color:var(--foreground)]\">\n {t('periodontalDiagnosis.factors.label', 'Contributing factors')}\n </legend>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n {factors.map((fid) => (\n <Checkbox\n key={fid}\n label={factorLabel(fid)}\n checked={activeFactors.includes(fid)}\n onCheckedChange={(c) => toggleFactor(fid, c === true)}\n disabled={disabled}\n />\n ))}\n </div>\n </fieldset>\n </div>\n );\n\n const inner = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]\">\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <h2\n id={headingId}\n className=\"type-title-card ds:m-0 ds:text-[color:var(--foreground)]\"\n >\n {heading}\n </h2>\n <Badge variant={complete ? 'brand' : 'neutral'} size=\"md\">\n {complete\n ? t('periodontalDiagnosis.status.complete', 'Complete')\n : t('periodontalDiagnosis.status.incomplete', 'Incomplete')}\n </Badge>\n </div>\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--foreground)]\">\n {summary}\n </p>\n {mode === 'display' ? readonlyView : formView}\n </div>\n );\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label={resolvedAriaLabel}\n data-component=\"periodontal-diagnosis\"\n data-component-id={id}\n id={id}\n className={rootVariants({ surface, className })}\n {...rest}\n >\n {surface === 'elevated' ? (\n <Card variant=\"elevated\">\n <Card.Body>{inner}</Card.Body>\n </Card>\n ) : (\n inner\n )}\n </div>\n );\n },\n);\n\nPeriodontalDiagnosis.displayName = 'PeriodontalDiagnosis';\n\nexport type PeriodontalDiagnosisSurface = NonNullable<\n VariantProps<typeof rootVariants>['surface']\n>;\n"],"names":["STAGE_SCHEMA","GRADE_SCHEMA","EXTENT_SCHEMA","periodontalDiagnosisAgent","handle","args","PERIODONTITIS_STAGES","PERIODONTITIS_GRADES","PERIODONTITIS_EXTENTS","STAGE_ROMAN","DEFAULT_DIAGNOSIS_FACTORS","isDiagnosisComplete","value","emptyDiagnosis","rootVariants","cva","PeriodontalDiagnosis","forwardRef","defaultValue","onChange","mode","disabled","factors","surface","ariaLabel","id","className","rest","ref","useTranslation","headingId","useId","isControlled","internal","setInternal","useState","current","valueRef","useRef","commit","next","setStage","stage","setGrade","grade","setExtent","extent","toggleFactor","factorId","on","set","clear","complete","activeFactors","stageLabel","s","gradeLabel","g","extentLabel","factorLabel","fid","chips","summary","useAgentRegistration","_note","rest2","heading","resolvedAriaLabel","readonlyView","jsxs","jsx","formView","RadioGroup","v","Radio","Checkbox","c","inner","Badge","Card"],"mappings":"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"}
1
+ {"version":3,"file":"periodontal-diagnosis-DD3hrg9X.js","sources":["../../src/components/periodontal-diagnosis/periodontal-diagnosis.agent.ts","../../src/components/periodontal-diagnosis/periodontal-diagnosis-data.ts","../../src/components/periodontal-diagnosis/periodontal-diagnosis.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { PeriodontalDiagnosisHandle } from './periodontal-diagnosis';\nimport type {\n PeriodontitisExtent,\n PeriodontitisGrade,\n PeriodontitisStage,\n} from './periodontal-diagnosis-data';\n\n/* -------------------------------------------------------------------- */\n/* PeriodontalDiagnosis — agent adapter */\n/* */\n/* Agents can read the recorded stage / grade / extent / factors and the */\n/* worded summary, and can set each field. The free-text clinician note */\n/* (PHI) is never exposed — getDiagnosis() strips it. */\n/* -------------------------------------------------------------------- */\n\nconst STAGE_SCHEMA = {\n enum: [1, 2, 3, 4],\n description: 'Periodontitis stage I–IV, as the integers 1–4.',\n} as const;\nconst GRADE_SCHEMA = {\n enum: ['A', 'B', 'C'],\n description: 'Periodontitis grade A–C (rate of progression).',\n} as const;\nconst EXTENT_SCHEMA = {\n enum: ['localised', 'generalised', 'molarIncisor'],\n description:\n 'Distribution: localised (<30%), generalised (≥30%), or molar-incisor.',\n} as const;\n\nexport const periodontalDiagnosisAgent: AgentAdapter<PeriodontalDiagnosisHandle> =\n {\n id: 'periodontal-diagnosis',\n // set_value — set stage / grade / extent / a factor. Each set_* action's\n // enum argsSchema already conveys that the field is a closed choice.\n capabilities: ['set_value'],\n state: {\n diagnosis: {\n type: 'object',\n descriptionKey: 'ui.agent.periodontalDiagnosis.state.diagnosis',\n description:\n 'Recorded stage (1–4), grade (A–C), extent, and ticked contributing-factor ids. The free-text note is never included.',\n read: (handle) => handle.getDiagnosis(),\n },\n summary: {\n type: 'string',\n descriptionKey: 'ui.agent.periodontalDiagnosis.state.summary',\n description:\n 'The composed, localised diagnosis sentence (e.g. \"Periodontitis — Stage III · Grade B · generalised\").',\n read: (handle) => handle.getSummary(),\n },\n complete: {\n type: 'boolean',\n descriptionKey: 'ui.agent.periodontalDiagnosis.state.complete',\n description: 'True once both a stage and a grade are recorded.',\n read: (handle) => handle.isComplete(),\n },\n },\n actions: {\n get_diagnosis: {\n safety: 'read',\n argsType: '{}',\n argsSchema: { type: 'object', properties: {} },\n returns: 'object',\n returnsSchema: { type: 'object' },\n idempotent: true,\n descriptionKey: 'ui.agent.periodontalDiagnosis.actions.getDiagnosis',\n description:\n 'Read the recorded stage / grade / extent / factors. The note is never returned.',\n invoke: (handle) => handle.getDiagnosis(),\n },\n set_stage: {\n safety: 'write',\n argsType: '{ stage: 1 | 2 | 3 | 4 }',\n argsSchema: {\n type: 'object',\n properties: { stage: STAGE_SCHEMA },\n required: ['stage'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.periodontalDiagnosis.actions.setStage',\n description: 'Record the periodontitis stage (I–IV).',\n invoke: (handle, args: { stage: PeriodontitisStage }) => {\n handle.setStage(args.stage);\n },\n },\n set_grade: {\n safety: 'write',\n argsType: \"{ grade: 'A' | 'B' | 'C' }\",\n argsSchema: {\n type: 'object',\n properties: { grade: GRADE_SCHEMA },\n required: ['grade'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.periodontalDiagnosis.actions.setGrade',\n description: 'Record the periodontitis grade (A–C).',\n invoke: (handle, args: { grade: PeriodontitisGrade }) => {\n handle.setGrade(args.grade);\n },\n },\n set_extent: {\n safety: 'write',\n argsType: \"{ extent: 'localised' | 'generalised' | 'molarIncisor' }\",\n argsSchema: {\n type: 'object',\n properties: { extent: EXTENT_SCHEMA },\n required: ['extent'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.periodontalDiagnosis.actions.setExtent',\n description: 'Record the distribution / extent.',\n invoke: (handle, args: { extent: PeriodontitisExtent }) => {\n handle.setExtent(args.extent);\n },\n },\n toggle_factor: {\n safety: 'write',\n argsType: '{ id: string; value: boolean }',\n argsSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Contributing-factor id.' },\n value: { type: 'boolean' },\n },\n required: ['id', 'value'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.periodontalDiagnosis.actions.toggleFactor',\n description: 'Tick or clear a contributing factor.',\n invoke: (handle, args: { id: string; value: boolean }) => {\n handle.toggleFactor(args.id, args.value);\n },\n },\n clear_diagnosis: {\n safety: 'destructive',\n argsType: '{}',\n argsSchema: { type: 'object', properties: {} },\n idempotent: true,\n descriptionKey: 'ui.agent.periodontalDiagnosis.actions.clearDiagnosis',\n description: 'Reset the whole diagnosis to empty.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'periodontal-diagnosis',\n description: 'Marks the PeriodontalDiagnosis root group.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n };\n","/* -------------------------------------------------------------------- */\n/* PeriodontalDiagnosis — data model */\n/* */\n/* The 2017 World Workshop / EFP periodontitis classification: a stage */\n/* (I–IV, severity + complexity), a grade (A–C, rate of progression) and */\n/* an extent (localised / generalised / molar-incisor). The jurisdiction- */\n/* specific *algorithm* that derives stage & grade from clinical findings */\n/* stays in the consumer; this component is the reusable, controllable */\n/* form + summary. A curated checklist of contributing factors gives the */\n/* clinician context without baking one country's logic into the kit. */\n/* -------------------------------------------------------------------- */\n\nexport type PeriodontitisStage = 1 | 2 | 3 | 4;\nexport type PeriodontitisGrade = 'A' | 'B' | 'C';\nexport type PeriodontitisExtent = 'localised' | 'generalised' | 'molarIncisor';\n\nexport const PERIODONTITIS_STAGES: readonly PeriodontitisStage[] = [1, 2, 3, 4];\nexport const PERIODONTITIS_GRADES: readonly PeriodontitisGrade[] = [\n 'A',\n 'B',\n 'C',\n];\nexport const PERIODONTITIS_EXTENTS: readonly PeriodontitisExtent[] = [\n 'localised',\n 'generalised',\n 'molarIncisor',\n];\n\n/** Roman numeral for a stage — matches the WHO / EFP notation. */\nexport const STAGE_ROMAN: Record<PeriodontitisStage, string> = {\n 1: 'I',\n 2: 'II',\n 3: 'III',\n 4: 'IV',\n};\n\n/**\n * The default contributing-factor checklist — the staging (severity) and\n * grading (progression) drivers of the 2017 classification. Consumers can\n * pass their own list of ids to localise the questionnaire.\n */\nexport const DEFAULT_DIAGNOSIS_FACTORS = [\n 'interdentalCal',\n 'radiographicBoneLoss',\n 'toothLossPerio',\n 'probingDepth6',\n 'boneLossAgeOver1',\n 'smoker',\n 'diabetes',\n] as const;\n\nexport type PeriodontalDiagnosisFactor =\n (typeof DEFAULT_DIAGNOSIS_FACTORS)[number];\n\n/** The recorded diagnosis. `note` is free-text PHI and never leaves the UI. */\nexport interface PeriodontalDiagnosisValue {\n stage?: PeriodontitisStage;\n grade?: PeriodontitisGrade;\n extent?: PeriodontitisExtent;\n /** Ids of the ticked contributing factors. */\n factors?: string[];\n /** Free-text clinician note — PHI; excluded from the agent adapter. */\n note?: string;\n}\n\n/** A diagnosis needs at least a stage and a grade to read as complete. */\nexport function isDiagnosisComplete(value: PeriodontalDiagnosisValue): boolean {\n return value.stage != null && value.grade != null;\n}\n\n/** A fresh, empty diagnosis. */\nexport function emptyDiagnosis(): PeriodontalDiagnosisValue {\n return {};\n}\n","import {\n forwardRef,\n useId,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Badge } from '../badge/badge';\nimport { Card } from '../card/card';\nimport { Checkbox } from '../checkbox/checkbox';\nimport { Radio } from '../radio-group/radio';\nimport { RadioGroup } from '../radio-group/radio-group';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { periodontalDiagnosisAgent } from './periodontal-diagnosis.agent';\nimport {\n DEFAULT_DIAGNOSIS_FACTORS,\n emptyDiagnosis,\n isDiagnosisComplete,\n PERIODONTITIS_EXTENTS,\n PERIODONTITIS_GRADES,\n PERIODONTITIS_STAGES,\n STAGE_ROMAN,\n type PeriodontalDiagnosisValue,\n type PeriodontitisExtent,\n type PeriodontitisGrade,\n type PeriodontitisStage,\n} from './periodontal-diagnosis-data';\n\n/* -------------------------------------------------------------------- */\n/* PeriodontalDiagnosis */\n/* */\n/* The 2017 World Workshop / EFP periodontitis classification form: */\n/* stage (I–IV), grade (A–C), extent, and a curated checklist of the */\n/* staging/grading contributing factors. Controlled or uncontrolled. */\n/* The composed summary (\"Periodontitis — Stage III · Grade B · */\n/* generalised\") is the worded, non-colour source of truth. */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva('ds:w-full ds:text-[color:var(--foreground)]', {\n variants: {\n surface: { flat: '', elevated: '' },\n },\n defaultVariants: { surface: 'elevated' },\n});\n\n/* -------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------- */\n\nexport interface PeriodontalDiagnosisHandle {\n /** The recorded stage / grade / extent / factors — never the free-text note. */\n getDiagnosis: () => Omit<PeriodontalDiagnosisValue, 'note'>;\n /** The composed, localised summary sentence. */\n getSummary: () => string;\n /** True once both a stage and a grade are recorded. */\n isComplete: () => boolean;\n setStage: (stage: PeriodontitisStage) => void;\n setGrade: (grade: PeriodontitisGrade) => void;\n setExtent: (extent: PeriodontitisExtent) => void;\n toggleFactor: (id: string, on?: boolean) => void;\n /** Reset to an empty diagnosis. */\n clear: () => void;\n}\n\nexport interface PeriodontalDiagnosisProps extends Omit<\n ComponentPropsWithoutRef<'div'>,\n 'aria-label' | 'children' | 'onChange' | 'defaultValue'\n> {\n /** Controlled value. */\n value?: PeriodontalDiagnosisValue;\n /** Uncontrolled initial value. */\n defaultValue?: PeriodontalDiagnosisValue;\n /** Fires with the next diagnosis whenever the clinician changes a field. */\n onChange?: (value: PeriodontalDiagnosisValue) => void;\n /** `'interactive'` (default) renders the form; `'display'` is read-only. */\n mode?: 'interactive' | 'display';\n /** Disable every control. */\n disabled?: boolean;\n /** Contributing-factor ids for the checklist. Defaults to the WHO-2017 set. */\n factors?: readonly string[];\n /** `'elevated'` (default) wraps in a Card; `'flat'` drops the chrome. */\n surface?: 'flat' | 'elevated';\n /** Override the default region aria-label. */\n 'aria-label'?: string;\n /** Agent-readiness consumer id, surfaced as `data-component-id`. */\n id?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const PeriodontalDiagnosis = forwardRef<\n HTMLDivElement,\n PeriodontalDiagnosisProps\n>(\n (\n {\n value,\n defaultValue,\n onChange,\n mode = 'interactive',\n disabled = false,\n factors = DEFAULT_DIAGNOSIS_FACTORS,\n surface = 'elevated',\n 'aria-label': ariaLabel,\n id,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n const headingId = useId();\n\n const isControlled = value !== undefined;\n const [internal, setInternal] = useState<PeriodontalDiagnosisValue>(\n defaultValue ?? emptyDiagnosis(),\n );\n const current = isControlled ? value : internal;\n\n // Latest committed value — so an agent making several edits in one tick\n // always builds on the previous edit, not a stale render snapshot.\n const valueRef = useRef(current);\n valueRef.current = current;\n\n const commit = (next: PeriodontalDiagnosisValue) => {\n valueRef.current = next;\n if (!isControlled) setInternal(next);\n onChange?.(next);\n };\n\n const setStage = (stage: PeriodontitisStage) =>\n commit({ ...valueRef.current, stage });\n const setGrade = (grade: PeriodontitisGrade) =>\n commit({ ...valueRef.current, grade });\n const setExtent = (extent: PeriodontitisExtent) =>\n commit({ ...valueRef.current, extent });\n const toggleFactor = (factorId: string, on?: boolean) => {\n const set = new Set(valueRef.current.factors ?? []);\n const next = on ?? !set.has(factorId);\n if (next) set.add(factorId);\n else set.delete(factorId);\n commit({ ...valueRef.current, factors: [...set] });\n };\n const clear = () => commit(emptyDiagnosis());\n\n const complete = isDiagnosisComplete(current);\n const activeFactors = current.factors ?? [];\n\n const stageLabel = (s: PeriodontitisStage) =>\n t(`periodontalDiagnosis.stage.option`, {\n roman: STAGE_ROMAN[s],\n defaultValue: `Stage ${STAGE_ROMAN[s]}`,\n });\n const gradeLabel = (g: PeriodontitisGrade) =>\n t(`periodontalDiagnosis.grade.option`, {\n grade: g,\n defaultValue: `Grade ${g}`,\n });\n const extentLabel = (e: PeriodontitisExtent) =>\n t(`periodontalDiagnosis.extent.${e}`, {\n defaultValue:\n e === 'localised'\n ? 'Localised'\n : e === 'generalised'\n ? 'Generalised'\n : 'Molar-incisor',\n });\n const factorLabel = (fid: string) =>\n t(`periodontalDiagnosis.factor.${fid}`, { defaultValue: fid });\n\n // Worded summary sentence — the accessible source of truth.\n const chips: string[] = [];\n if (current.stage != null)\n chips.push(\n t('periodontalDiagnosis.summary.stage', {\n roman: STAGE_ROMAN[current.stage],\n defaultValue: `Stage ${STAGE_ROMAN[current.stage]}`,\n }),\n );\n if (current.grade != null)\n chips.push(\n t('periodontalDiagnosis.summary.grade', {\n grade: current.grade,\n defaultValue: `Grade ${current.grade}`,\n }),\n );\n if (current.extent != null) chips.push(extentLabel(current.extent));\n const summary = chips.length\n ? `${t('periodontalDiagnosis.term', 'Periodontitis')} — ${chips.join(' · ')}`\n : t('periodontalDiagnosis.summary.none', 'No diagnosis recorded yet');\n\n useAgentRegistration(\n periodontalDiagnosisAgent,\n {\n getDiagnosis: () => {\n const { note: _note, ...rest2 } = valueRef.current;\n return rest2;\n },\n getSummary: () => summary,\n isComplete: () => isDiagnosisComplete(valueRef.current),\n setStage,\n setGrade,\n setExtent,\n toggleFactor,\n clear,\n },\n id,\n );\n\n const heading = t('periodontalDiagnosis.heading', 'Periodontal diagnosis');\n const resolvedAriaLabel = ariaLabel ?? heading;\n\n const readonlyView = (\n <dl className=\"type-body-sm ds:grid ds:grid-cols-[auto_1fr] ds:gap-x-[var(--spacing-md)] ds:gap-y-[var(--spacing-2xs)] ds:m-0\">\n <dt className=\"ds:text-[color:var(--muted-foreground)]\">\n {t('periodontalDiagnosis.stage.label', 'Staging')}\n </dt>\n <dd className=\"ds:m-0\">\n {current.stage != null\n ? stageLabel(current.stage)\n : t('periodontalDiagnosis.unset', '—')}\n </dd>\n <dt className=\"ds:text-[color:var(--muted-foreground)]\">\n {t('periodontalDiagnosis.grade.label', 'Grading')}\n </dt>\n <dd className=\"ds:m-0\">\n {current.grade != null\n ? gradeLabel(current.grade)\n : t('periodontalDiagnosis.unset', '—')}\n </dd>\n <dt className=\"ds:text-[color:var(--muted-foreground)]\">\n {t('periodontalDiagnosis.extent.label', 'Extent')}\n </dt>\n <dd className=\"ds:m-0\">\n {current.extent != null\n ? extentLabel(current.extent)\n : t('periodontalDiagnosis.unset', '—')}\n </dd>\n <dt className=\"ds:text-[color:var(--muted-foreground)]\">\n {t('periodontalDiagnosis.factors.label', 'Contributing factors')}\n </dt>\n <dd className=\"ds:m-0\">\n {activeFactors.length\n ? activeFactors.map((fid) => factorLabel(fid)).join(', ')\n : t('periodontalDiagnosis.unset', '—')}\n </dd>\n </dl>\n );\n\n const formView = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]\">\n <RadioGroup\n variant=\"horizontal\"\n label={t('periodontalDiagnosis.stage.label', 'Staging')}\n description={t(\n 'periodontalDiagnosis.stage.description',\n 'Severity and complexity of management.',\n )}\n value={current.stage != null ? String(current.stage) : ''}\n onValueChange={(v) => setStage(Number(v) as PeriodontitisStage)}\n disabled={disabled}\n >\n {PERIODONTITIS_STAGES.map((s) => (\n <Radio key={s} value={String(s)} label={stageLabel(s)} />\n ))}\n </RadioGroup>\n\n <RadioGroup\n variant=\"horizontal\"\n label={t('periodontalDiagnosis.grade.label', 'Grading')}\n description={t(\n 'periodontalDiagnosis.grade.description',\n 'Rate of progression.',\n )}\n value={current.grade ?? ''}\n onValueChange={(v) => setGrade(v as PeriodontitisGrade)}\n disabled={disabled}\n >\n {PERIODONTITIS_GRADES.map((g) => (\n <Radio key={g} value={g} label={gradeLabel(g)} />\n ))}\n </RadioGroup>\n\n <RadioGroup\n variant=\"horizontal\"\n label={t('periodontalDiagnosis.extent.label', 'Extent')}\n value={current.extent ?? ''}\n onValueChange={(v) => setExtent(v as PeriodontitisExtent)}\n disabled={disabled}\n >\n {PERIODONTITIS_EXTENTS.map((e) => (\n <Radio key={e} value={e} label={extentLabel(e)} />\n ))}\n </RadioGroup>\n\n <fieldset className=\"ds:m-0 ds:border-0 ds:p-0\">\n <legend className=\"type-label ds:mb-[var(--spacing-xs)] ds:p-0 ds:text-[color:var(--foreground)]\">\n {t('periodontalDiagnosis.factors.label', 'Contributing factors')}\n </legend>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n {factors.map((fid) => (\n <Checkbox\n key={fid}\n label={factorLabel(fid)}\n checked={activeFactors.includes(fid)}\n onCheckedChange={(c) => toggleFactor(fid, c === true)}\n disabled={disabled}\n />\n ))}\n </div>\n </fieldset>\n </div>\n );\n\n const inner = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]\">\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <h2\n id={headingId}\n className=\"type-title-card ds:m-0 ds:text-[color:var(--foreground)]\"\n >\n {heading}\n </h2>\n <Badge variant={complete ? 'brand' : 'neutral'} size=\"md\">\n {complete\n ? t('periodontalDiagnosis.status.complete', 'Complete')\n : t('periodontalDiagnosis.status.incomplete', 'Incomplete')}\n </Badge>\n </div>\n <p className=\"type-body-sm ds:m-0 ds:text-[color:var(--foreground)]\">\n {summary}\n </p>\n {mode === 'display' ? readonlyView : formView}\n </div>\n );\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label={resolvedAriaLabel}\n data-component=\"periodontal-diagnosis\"\n data-component-id={id}\n id={id}\n className={rootVariants({ surface, className })}\n {...rest}\n >\n {surface === 'elevated' ? (\n <Card variant=\"elevated\">\n <Card.Body>{inner}</Card.Body>\n </Card>\n ) : (\n inner\n )}\n </div>\n );\n },\n);\n\nPeriodontalDiagnosis.displayName = 'PeriodontalDiagnosis';\n\nexport type PeriodontalDiagnosisSurface = NonNullable<\n VariantProps<typeof rootVariants>['surface']\n>;\n"],"names":["STAGE_SCHEMA","GRADE_SCHEMA","EXTENT_SCHEMA","periodontalDiagnosisAgent","handle","args","PERIODONTITIS_STAGES","PERIODONTITIS_GRADES","PERIODONTITIS_EXTENTS","STAGE_ROMAN","DEFAULT_DIAGNOSIS_FACTORS","isDiagnosisComplete","value","emptyDiagnosis","rootVariants","cva","PeriodontalDiagnosis","forwardRef","defaultValue","onChange","mode","disabled","factors","surface","ariaLabel","id","className","rest","ref","useTranslation","headingId","useId","isControlled","internal","setInternal","useState","current","valueRef","useRef","commit","next","setStage","stage","setGrade","grade","setExtent","extent","toggleFactor","factorId","on","set","clear","complete","activeFactors","stageLabel","s","gradeLabel","g","extentLabel","factorLabel","fid","chips","summary","useAgentRegistration","_note","rest2","heading","resolvedAriaLabel","readonlyView","jsxs","jsx","formView","RadioGroup","v","Radio","Checkbox","c","inner","Badge","Card"],"mappings":"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"}
@@ -2,8 +2,8 @@ import { jsx as a, jsxs as K } from "react/jsx-runtime";
2
2
  import { forwardRef as U, useMemo as h, useRef as d } from "react";
3
3
  import { c as V } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as A } from "react-i18next";
5
- import { C as H } from "./checkbox-group-Cw2H5qaq.js";
6
- import { C as T } from "./checkbox-BjDv-r3o.js";
5
+ import { C as H } from "./checkbox-group-eGdv9fZc.js";
6
+ import { C as T } from "./checkbox-a7Sh-dXb.js";
7
7
  import { u as _ } from "./registry-DvAUVLHh.js";
8
8
  import { L as q } from "./lock-ClAFG1gy.js";
9
9
  const z = {
@@ -171,4 +171,4 @@ export {
171
171
  I as a,
172
172
  z as p
173
173
  };
174
- //# sourceMappingURL=permission-matrix-BoQjENGV.js.map
174
+ //# sourceMappingURL=permission-matrix-BJ6sg3Zp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"permission-matrix-BoQjENGV.js","sources":["../../src/components/permission-matrix/permission-matrix.agent.ts","../../src/components/permission-matrix/permission-matrix.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — PermissionMatrix. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { PermissionMatrixHandle } from './permission-matrix';\n\nexport const permissionMatrixAgent: AgentAdapter<PermissionMatrixHandle> = {\n id: 'permission-matrix',\n capabilities: ['select_multiple'],\n state: {\n selection: {\n type: 'string[]',\n descriptionKey: 'ui.agent.permissionMatrix.state.selection',\n description:\n 'Ids of currently-granted editable permissions. Locked owner permissions are excluded.',\n read: (handle) => handle.getSelection(),\n },\n },\n actions: {\n set_selection: {\n safety: 'write',\n argsType: '{ values: string[] }',\n argsSchema: {\n type: 'object',\n properties: { values: { type: 'array', items: { type: 'string' } } },\n required: ['values'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.permissionMatrix.actions.setSelection',\n description:\n 'Replace the granted permissions with the given ids. Locked and unknown ids are ignored.',\n examples: [\n {\n args: { values: ['patients.view', 'billing.view'] },\n note: 'Grant exactly the view permissions for patients and billing.',\n },\n ],\n invoke: (handle, args: { values: string[] }) => {\n handle.setSelection(args.values);\n },\n },\n clear: {\n safety: 'destructive',\n idempotent: true,\n descriptionKey: 'ui.agent.permissionMatrix.actions.clear',\n description:\n 'Revoke every editable permission. Locked owner permissions are unaffected.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'permission-matrix',\n description: 'Marks the PermissionMatrix root group.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import { forwardRef, useMemo, useRef, type ReactNode } from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Lock } from 'lucide-react';\nimport { CheckboxGroup } from '../checkbox-group/checkbox-group';\nimport { Checkbox } from '../checkbox/checkbox';\nimport { useAgentRegistration } from '../../agent';\nimport { permissionMatrixAgent } from './permission-matrix.agent';\n\n/** A single togglable permission within a group. Labels are pre-localised. */\nexport interface PermissionMatrixPermission {\n id: string;\n label: string;\n}\n\n/** One category of permissions, rendered as a labelled group. */\nexport interface PermissionMatrixGroup {\n id: string;\n label: string;\n permissions: PermissionMatrixPermission[];\n}\n\n/** Agent-readiness curated handle for PermissionMatrix. */\nexport interface PermissionMatrixHandle {\n /** Ids of currently-granted editable permissions (locked items excluded). */\n getSelection: () => string[];\n /** Replace the granted set. Locked and unknown ids are ignored. */\n setSelection: (values: string[]) => void;\n /** Revoke every editable permission. Locked items are untouched. */\n clear: () => void;\n}\n\nexport interface PermissionMatrixProps {\n /** Categories of permissions. All labels are already localised by the consumer. */\n groups: PermissionMatrixGroup[];\n /** Ids of granted permissions (controlled). Locked ids belong in `lockedItems`, not here. */\n value: string[];\n /** Fires with the next full granted-id array whenever an editable toggle changes. */\n onChange: (next: string[]) => void;\n /**\n * Permission ids that render checked + disabled with a lock affordance — the\n * owner always holds them. They never appear in `onChange` payloads.\n */\n lockedItems?: string[];\n /** Disable every toggle in the matrix. */\n disabled?: boolean;\n /** Accessible suffix announced on locked rows. Defaults to the kit's \"Locked\" string. */\n lockedLabel?: string;\n /** Stable id — addresses this instance from the agent runtime. */\n id?: string;\n className?: string;\n 'aria-label'?: string;\n}\n\nconst permissionMatrixVariants = cva(\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-lg)] ds:min-w-0',\n {\n variants: {\n disabled: {\n true: 'ds:cursor-not-allowed',\n false: '',\n },\n },\n defaultVariants: { disabled: false },\n },\n);\n\nconst lockedLabelClasses =\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]';\n\nexport const PermissionMatrix = forwardRef<\n HTMLDivElement,\n PermissionMatrixProps\n>(function PermissionMatrix(\n {\n groups,\n value,\n onChange,\n lockedItems,\n disabled = false,\n lockedLabel,\n id,\n className,\n 'aria-label': ariaLabel,\n },\n ref,\n) {\n const { t } = useTranslation('ui');\n\n const lockedSet = useMemo(() => new Set(lockedItems ?? []), [lockedItems]);\n const allPermIds = useMemo(\n () => groups.flatMap((group) => group.permissions.map((p) => p.id)),\n [groups],\n );\n\n const resolvedLockedLabel =\n lockedLabel ?? t('inputs.permissionMatrix.locked', 'Locked');\n\n // Stable agent handle — reads/writes the latest controlled value via refs\n // so the handle identity never changes (mirrors CheckboxGroup).\n const valueRef = useRef<string[]>(value);\n valueRef.current = value;\n const lockedRef = useRef<Set<string>>(lockedSet);\n lockedRef.current = lockedSet;\n const allPermIdsRef = useRef<string[]>(allPermIds);\n allPermIdsRef.current = allPermIds;\n const onChangeRef = useRef<(next: string[]) => void>(onChange);\n onChangeRef.current = onChange;\n\n const agentHandle = useMemo<PermissionMatrixHandle>(\n () => ({\n getSelection: () =>\n valueRef.current.filter((permId) => !lockedRef.current.has(permId)),\n setSelection: (values) => {\n const allowed = new Set(allPermIdsRef.current);\n onChangeRef.current(\n values.filter(\n (permId) => allowed.has(permId) && !lockedRef.current.has(permId),\n ),\n );\n },\n clear: () => onChangeRef.current([]),\n }),\n [],\n );\n useAgentRegistration(permissionMatrixAgent, agentHandle, id);\n\n const handleGroupChange =\n (group: PermissionMatrixGroup) =>\n (nextGroupValue: string[]): void => {\n const nextSet = new Set(nextGroupValue);\n const groupUnlockedIds = group.permissions\n .map((p) => p.id)\n .filter((permId) => !lockedSet.has(permId));\n const groupUnlockedSet = new Set(groupUnlockedIds);\n // The next selection for THIS group's editable permissions.\n const selectedUnlocked = groupUnlockedIds.filter((permId) =>\n nextSet.has(permId),\n );\n // Everything outside this group, with any locked id stripped so the\n // emitted array only ever carries editable grants.\n const remaining = value.filter(\n (permId) => !groupUnlockedSet.has(permId) && !lockedSet.has(permId),\n );\n onChange([...remaining, ...selectedUnlocked]);\n };\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label={ariaLabel}\n data-component=\"permission-matrix\"\n data-component-id={id}\n className={permissionMatrixVariants({ disabled, className })}\n >\n {groups.map((group) => {\n // Locked ids are forced into the group's checked set so they render\n // checked; being disabled, they can never be toggled back off.\n const groupCheckedValue = group.permissions\n .map((p) => p.id)\n .filter((permId) => lockedSet.has(permId) || value.includes(permId));\n\n return (\n <CheckboxGroup\n key={group.id}\n label={group.label}\n value={groupCheckedValue}\n onChange={handleGroupChange(group)}\n disabled={disabled}\n >\n {group.permissions.map((permission) => {\n const isLocked = lockedSet.has(permission.id);\n const label: ReactNode = isLocked ? (\n <span className={lockedLabelClasses}>\n <span>{permission.label}</span>\n <Lock\n aria-hidden=\"true\"\n className=\"ds:size-3.5 ds:shrink-0 ds:text-muted-foreground\"\n />\n <span className=\"ds:sr-only\">{resolvedLockedLabel}</span>\n </span>\n ) : (\n permission.label\n );\n\n return (\n <Checkbox\n key={permission.id}\n value={permission.id}\n label={label}\n disabled={disabled || isLocked}\n />\n );\n })}\n </CheckboxGroup>\n );\n })}\n </div>\n );\n});\n\nPermissionMatrix.displayName = 'PermissionMatrix';\n\nexport { permissionMatrixVariants };\n"],"names":["permissionMatrixAgent","handle","args","permissionMatrixVariants","cva","lockedLabelClasses","PermissionMatrix","forwardRef","groups","value","onChange","lockedItems","disabled","lockedLabel","id","className","ariaLabel","ref","t","useTranslation","lockedSet","useMemo","allPermIds","group","p","resolvedLockedLabel","valueRef","useRef","lockedRef","allPermIdsRef","onChangeRef","agentHandle","permId","values","allowed","useAgentRegistration","handleGroupChange","nextGroupValue","nextSet","groupUnlockedIds","groupUnlockedSet","selectedUnlocked","remaining","jsx","groupCheckedValue","CheckboxGroup","permission","isLocked","label","jsxs","Lock","Checkbox"],"mappings":"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"}
1
+ {"version":3,"file":"permission-matrix-BJ6sg3Zp.js","sources":["../../src/components/permission-matrix/permission-matrix.agent.ts","../../src/components/permission-matrix/permission-matrix.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — PermissionMatrix. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { PermissionMatrixHandle } from './permission-matrix';\n\nexport const permissionMatrixAgent: AgentAdapter<PermissionMatrixHandle> = {\n id: 'permission-matrix',\n capabilities: ['select_multiple'],\n state: {\n selection: {\n type: 'string[]',\n descriptionKey: 'ui.agent.permissionMatrix.state.selection',\n description:\n 'Ids of currently-granted editable permissions. Locked owner permissions are excluded.',\n read: (handle) => handle.getSelection(),\n },\n },\n actions: {\n set_selection: {\n safety: 'write',\n argsType: '{ values: string[] }',\n argsSchema: {\n type: 'object',\n properties: { values: { type: 'array', items: { type: 'string' } } },\n required: ['values'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.permissionMatrix.actions.setSelection',\n description:\n 'Replace the granted permissions with the given ids. Locked and unknown ids are ignored.',\n examples: [\n {\n args: { values: ['patients.view', 'billing.view'] },\n note: 'Grant exactly the view permissions for patients and billing.',\n },\n ],\n invoke: (handle, args: { values: string[] }) => {\n handle.setSelection(args.values);\n },\n },\n clear: {\n safety: 'destructive',\n idempotent: true,\n descriptionKey: 'ui.agent.permissionMatrix.actions.clear',\n description:\n 'Revoke every editable permission. Locked owner permissions are unaffected.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'permission-matrix',\n description: 'Marks the PermissionMatrix root group.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import { forwardRef, useMemo, useRef, type ReactNode } from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Lock } from 'lucide-react';\nimport { CheckboxGroup } from '../checkbox-group/checkbox-group';\nimport { Checkbox } from '../checkbox/checkbox';\nimport { useAgentRegistration } from '../../agent';\nimport { permissionMatrixAgent } from './permission-matrix.agent';\n\n/** A single togglable permission within a group. Labels are pre-localised. */\nexport interface PermissionMatrixPermission {\n id: string;\n label: string;\n}\n\n/** One category of permissions, rendered as a labelled group. */\nexport interface PermissionMatrixGroup {\n id: string;\n label: string;\n permissions: PermissionMatrixPermission[];\n}\n\n/** Agent-readiness curated handle for PermissionMatrix. */\nexport interface PermissionMatrixHandle {\n /** Ids of currently-granted editable permissions (locked items excluded). */\n getSelection: () => string[];\n /** Replace the granted set. Locked and unknown ids are ignored. */\n setSelection: (values: string[]) => void;\n /** Revoke every editable permission. Locked items are untouched. */\n clear: () => void;\n}\n\nexport interface PermissionMatrixProps {\n /** Categories of permissions. All labels are already localised by the consumer. */\n groups: PermissionMatrixGroup[];\n /** Ids of granted permissions (controlled). Locked ids belong in `lockedItems`, not here. */\n value: string[];\n /** Fires with the next full granted-id array whenever an editable toggle changes. */\n onChange: (next: string[]) => void;\n /**\n * Permission ids that render checked + disabled with a lock affordance — the\n * owner always holds them. They never appear in `onChange` payloads.\n */\n lockedItems?: string[];\n /** Disable every toggle in the matrix. */\n disabled?: boolean;\n /** Accessible suffix announced on locked rows. Defaults to the kit's \"Locked\" string. */\n lockedLabel?: string;\n /** Stable id — addresses this instance from the agent runtime. */\n id?: string;\n className?: string;\n 'aria-label'?: string;\n}\n\nconst permissionMatrixVariants = cva(\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-lg)] ds:min-w-0',\n {\n variants: {\n disabled: {\n true: 'ds:cursor-not-allowed',\n false: '',\n },\n },\n defaultVariants: { disabled: false },\n },\n);\n\nconst lockedLabelClasses =\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]';\n\nexport const PermissionMatrix = forwardRef<\n HTMLDivElement,\n PermissionMatrixProps\n>(function PermissionMatrix(\n {\n groups,\n value,\n onChange,\n lockedItems,\n disabled = false,\n lockedLabel,\n id,\n className,\n 'aria-label': ariaLabel,\n },\n ref,\n) {\n const { t } = useTranslation('ui');\n\n const lockedSet = useMemo(() => new Set(lockedItems ?? []), [lockedItems]);\n const allPermIds = useMemo(\n () => groups.flatMap((group) => group.permissions.map((p) => p.id)),\n [groups],\n );\n\n const resolvedLockedLabel =\n lockedLabel ?? t('inputs.permissionMatrix.locked', 'Locked');\n\n // Stable agent handle — reads/writes the latest controlled value via refs\n // so the handle identity never changes (mirrors CheckboxGroup).\n const valueRef = useRef<string[]>(value);\n valueRef.current = value;\n const lockedRef = useRef<Set<string>>(lockedSet);\n lockedRef.current = lockedSet;\n const allPermIdsRef = useRef<string[]>(allPermIds);\n allPermIdsRef.current = allPermIds;\n const onChangeRef = useRef<(next: string[]) => void>(onChange);\n onChangeRef.current = onChange;\n\n const agentHandle = useMemo<PermissionMatrixHandle>(\n () => ({\n getSelection: () =>\n valueRef.current.filter((permId) => !lockedRef.current.has(permId)),\n setSelection: (values) => {\n const allowed = new Set(allPermIdsRef.current);\n onChangeRef.current(\n values.filter(\n (permId) => allowed.has(permId) && !lockedRef.current.has(permId),\n ),\n );\n },\n clear: () => onChangeRef.current([]),\n }),\n [],\n );\n useAgentRegistration(permissionMatrixAgent, agentHandle, id);\n\n const handleGroupChange =\n (group: PermissionMatrixGroup) =>\n (nextGroupValue: string[]): void => {\n const nextSet = new Set(nextGroupValue);\n const groupUnlockedIds = group.permissions\n .map((p) => p.id)\n .filter((permId) => !lockedSet.has(permId));\n const groupUnlockedSet = new Set(groupUnlockedIds);\n // The next selection for THIS group's editable permissions.\n const selectedUnlocked = groupUnlockedIds.filter((permId) =>\n nextSet.has(permId),\n );\n // Everything outside this group, with any locked id stripped so the\n // emitted array only ever carries editable grants.\n const remaining = value.filter(\n (permId) => !groupUnlockedSet.has(permId) && !lockedSet.has(permId),\n );\n onChange([...remaining, ...selectedUnlocked]);\n };\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label={ariaLabel}\n data-component=\"permission-matrix\"\n data-component-id={id}\n className={permissionMatrixVariants({ disabled, className })}\n >\n {groups.map((group) => {\n // Locked ids are forced into the group's checked set so they render\n // checked; being disabled, they can never be toggled back off.\n const groupCheckedValue = group.permissions\n .map((p) => p.id)\n .filter((permId) => lockedSet.has(permId) || value.includes(permId));\n\n return (\n <CheckboxGroup\n key={group.id}\n label={group.label}\n value={groupCheckedValue}\n onChange={handleGroupChange(group)}\n disabled={disabled}\n >\n {group.permissions.map((permission) => {\n const isLocked = lockedSet.has(permission.id);\n const label: ReactNode = isLocked ? (\n <span className={lockedLabelClasses}>\n <span>{permission.label}</span>\n <Lock\n aria-hidden=\"true\"\n className=\"ds:size-3.5 ds:shrink-0 ds:text-muted-foreground\"\n />\n <span className=\"ds:sr-only\">{resolvedLockedLabel}</span>\n </span>\n ) : (\n permission.label\n );\n\n return (\n <Checkbox\n key={permission.id}\n value={permission.id}\n label={label}\n disabled={disabled || isLocked}\n />\n );\n })}\n </CheckboxGroup>\n );\n })}\n </div>\n );\n});\n\nPermissionMatrix.displayName = 'PermissionMatrix';\n\nexport { permissionMatrixVariants };\n"],"names":["permissionMatrixAgent","handle","args","permissionMatrixVariants","cva","lockedLabelClasses","PermissionMatrix","forwardRef","groups","value","onChange","lockedItems","disabled","lockedLabel","id","className","ariaLabel","ref","t","useTranslation","lockedSet","useMemo","allPermIds","group","p","resolvedLockedLabel","valueRef","useRef","lockedRef","allPermIdsRef","onChangeRef","agentHandle","permId","values","allowed","useAgentRegistration","handleGroupChange","nextGroupValue","nextSet","groupUnlockedIds","groupUnlockedSet","selectedUnlocked","remaining","jsx","groupCheckedValue","CheckboxGroup","permission","isLocked","label","jsxs","Lock","Checkbox"],"mappings":"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"}
@@ -1,13 +1,13 @@
1
- import { jsxs as i, jsx as e, Fragment as j } from "react/jsx-runtime";
2
- import { forwardRef as A, useId as B, useState as z, useEffect as S, useMemo as E, useRef as K } from "react";
3
- import { c as M } from "./index-D2ZczOXr.js";
4
- import { A as b } from "./avatar-BPiPL7ND.js";
5
- import { B as V } from "./badge-BUk4RjTS.js";
6
- import { C as w } from "./card-BA4Ig_kn.js";
7
- import { R as F } from "./rating-CGYpg5dj.js";
8
- import { u as L } from "./use-isomorphic-layout-effect-BGfaCOP1.js";
9
- import { u as W } from "./registry-DvAUVLHh.js";
10
- const $ = {
1
+ import { jsxs as d, jsx as e, Fragment as z } from "react/jsx-runtime";
2
+ import { forwardRef as S, useId as A, useState as E, useEffect as K, useMemo as M, useRef as V } from "react";
3
+ import { c as F } from "./index-D2ZczOXr.js";
4
+ import { A as w } from "./avatar-a6042Ox2.js";
5
+ import { B as L } from "./badge-BUk4RjTS.js";
6
+ import { C } from "./card-BA4Ig_kn.js";
7
+ import { R as W } from "./rating-CGYpg5dj.js";
8
+ import { u as $ } from "./use-isomorphic-layout-effect-BGfaCOP1.js";
9
+ import { u as q } from "./registry-DvAUVLHh.js";
10
+ const D = {
11
11
  id: "practice-profile-hero",
12
12
  // Purely observable hero region — no interactive affordances and no
13
13
  // imperative actions on the handle (getName / getHasCover are read-only
@@ -40,7 +40,7 @@ const $ = {
40
40
  description: "Sourced from the id prop."
41
41
  }
42
42
  }
43
- }, q = M("ds:w-full ds:text-[color:var(--foreground)]", {
43
+ }, G = F("ds:w-full ds:text-[color:var(--foreground)]", {
44
44
  variants: {
45
45
  // Matches the kit's other `surface` props (Booking, ReviewsPanel,
46
46
  // OperatorHero). `'elevated'` wraps in `<Card>`.
@@ -52,54 +52,55 @@ const $ = {
52
52
  defaultVariants: {
53
53
  surface: "elevated"
54
54
  }
55
- }), D = A(
55
+ }), J = S(
56
56
  ({
57
57
  name: a,
58
- tagline: p,
59
- imageUrl: u,
58
+ tagline: f,
59
+ imageUrl: n,
60
+ imageAlt: l,
60
61
  coverImageUrl: r,
61
- rating: n,
62
- badges: l,
63
- actionSlot: f,
64
- surface: m = "elevated",
65
- "aria-label": v,
66
- id: c,
67
- className: H,
68
- ...C
69
- }, k) => {
70
- const h = B(), [d, g] = z(null), x = r && (d == null ? void 0 : d.url) === r ? d.status : "loading";
71
- S(() => {
62
+ rating: c,
63
+ badges: p,
64
+ actionSlot: m,
65
+ surface: v = "elevated",
66
+ "aria-label": h,
67
+ id: u,
68
+ className: k,
69
+ ...R
70
+ }, j) => {
71
+ const g = A(), [i, x] = E(null), y = r && (i == null ? void 0 : i.url) === r ? i.status : "loading";
72
+ K(() => {
72
73
  if (!r || typeof Image > "u") return;
73
74
  let s = !0;
74
75
  const o = new Image();
75
76
  return o.onload = () => {
76
- s && g({ url: r, status: "loaded" });
77
+ s && x({ url: r, status: "loaded" });
77
78
  }, o.onerror = () => {
78
- s && g({ url: r, status: "error" });
79
+ s && x({ url: r, status: "error" });
79
80
  }, o.src = r, () => {
80
81
  s = !1, o.onload = null, o.onerror = null;
81
82
  };
82
83
  }, [r]);
83
- const t = !!r && x !== "error", R = E(
84
+ const t = !!r && y !== "error", B = M(
84
85
  () => ({ getName: () => a, getHasCover: () => t }),
85
86
  [a, t]
86
87
  );
87
- W($, R, c);
88
- const y = K(null);
89
- L(() => {
90
- const s = y.current;
88
+ q(D, B, u);
89
+ const N = V(null);
90
+ $(() => {
91
+ const s = N.current;
91
92
  s && (r ? s.style.setProperty(
92
93
  "--practice-profile-hero-cover",
93
94
  `url("${r.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}")`
94
95
  ) : s.style.removeProperty("--practice-profile-hero-cover"));
95
96
  }, [r, t]);
96
- const N = t ? /* @__PURE__ */ e(
97
+ const P = t ? /* @__PURE__ */ e(
97
98
  "div",
98
99
  {
99
- ref: y,
100
+ ref: N,
100
101
  "aria-hidden": "true",
101
102
  "data-slot": "cover",
102
- "data-state": x,
103
+ "data-state": y,
103
104
  className: [
104
105
  "ds:h-32 ds:sm:h-40 ds:w-full",
105
106
  // Cover image layered over the brand gradient — the gradient is
@@ -111,7 +112,7 @@ const $ = {
111
112
  "ds:bg-cover ds:bg-center"
112
113
  ].join(" ")
113
114
  }
114
- ) : null, P = /* @__PURE__ */ i(
115
+ ) : null, H = !(n && l), b = /* @__PURE__ */ d(
115
116
  "div",
116
117
  {
117
118
  className: [
@@ -123,74 +124,76 @@ const $ = {
123
124
  ].join(" "),
124
125
  children: [
125
126
  /* @__PURE__ */ e("div", { className: "ds:shrink-0 ds:sm:hidden", children: /* @__PURE__ */ e(
126
- b,
127
+ w,
127
128
  {
128
129
  size: "xl",
129
130
  shape: "rounded",
130
131
  ratio: "4:3",
131
132
  name: a,
132
- src: u,
133
- "aria-hidden": "true"
133
+ src: n,
134
+ alt: l,
135
+ "aria-hidden": H ? "true" : void 0
134
136
  }
135
137
  ) }),
136
138
  /* @__PURE__ */ e("div", { className: "ds:hidden ds:shrink-0 ds:sm:block", children: /* @__PURE__ */ e(
137
- b,
139
+ w,
138
140
  {
139
141
  size: "3xl",
140
142
  shape: "rounded",
141
143
  ratio: "4:3",
142
144
  name: a,
143
- src: u,
144
- "aria-hidden": "true"
145
+ src: n,
146
+ alt: l,
147
+ "aria-hidden": H ? "true" : void 0
145
148
  }
146
149
  ) }),
147
- /* @__PURE__ */ i("div", { className: "ds:flex ds:w-full ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-xs)]", children: [
148
- /* @__PURE__ */ i("div", { className: "ds:flex ds:flex-wrap ds:items-start ds:gap-[var(--spacing-md)]", children: [
150
+ /* @__PURE__ */ d("div", { className: "ds:flex ds:w-full ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-xs)]", children: [
151
+ /* @__PURE__ */ d("div", { className: "ds:flex ds:flex-wrap ds:items-start ds:gap-[var(--spacing-md)]", children: [
149
152
  /* @__PURE__ */ e(
150
153
  "h1",
151
154
  {
152
- id: h,
155
+ id: g,
153
156
  dir: "auto",
154
157
  className: "type-title-page ds:m-0 ds:text-[color:var(--foreground)]",
155
158
  children: a
156
159
  }
157
160
  ),
158
- f ? (
161
+ m ? (
159
162
  // `ms-auto` + `shrink-0` are the desktop contract, and both are
160
163
  // wrong once the row wraps on a phone: they stranded the action
161
164
  // at the inline-end of a start-aligned stack and stopped a wide
162
165
  // control fitting the column. Hence `sm:` and up only.
163
- /* @__PURE__ */ e("div", { className: "ds:flex ds:min-w-0 ds:items-center ds:gap-[var(--spacing-xs)] ds:sm:ms-auto ds:sm:shrink-0", children: f })
166
+ /* @__PURE__ */ e("div", { className: "ds:flex ds:min-w-0 ds:items-center ds:gap-[var(--spacing-xs)] ds:sm:ms-auto ds:sm:shrink-0", children: m })
164
167
  ) : null
165
168
  ] }),
166
- p ? /* @__PURE__ */ e(
169
+ f ? /* @__PURE__ */ e(
167
170
  "p",
168
171
  {
169
172
  dir: "auto",
170
173
  className: "type-body ds:m-0 ds:text-[color:var(--foreground)]",
171
- children: p
174
+ children: f
172
175
  }
173
176
  ) : null,
174
- n ? (
177
+ c ? (
175
178
  // Rating owns the whole line: locale-formatted value, plural-
176
179
  // aware review count, and a single role="img" announcement.
177
180
  /* @__PURE__ */ e(
178
- F,
181
+ W,
179
182
  {
180
- value: n.value,
183
+ value: c.value,
181
184
  max: 5,
182
185
  size: "md",
183
- reviews: { count: n.count }
186
+ reviews: { count: c.count }
184
187
  }
185
188
  )
186
189
  ) : null,
187
- l && l.length > 0 ? /* @__PURE__ */ e(
190
+ p && p.length > 0 ? /* @__PURE__ */ e(
188
191
  "div",
189
192
  {
190
193
  role: "list",
191
194
  className: "ds:mt-[var(--spacing-2xs)] ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-2xs)]",
192
- children: l.map((s) => /* @__PURE__ */ e(
193
- V,
195
+ children: p.map((s) => /* @__PURE__ */ e(
196
+ L,
194
197
  {
195
198
  variant: s.variant ?? "neutral",
196
199
  role: "listitem",
@@ -207,30 +210,30 @@ const $ = {
207
210
  return /* @__PURE__ */ e(
208
211
  "div",
209
212
  {
210
- ref: k,
213
+ ref: j,
211
214
  role: "region",
212
- "aria-label": v,
213
- "aria-labelledby": v ? void 0 : h,
215
+ "aria-label": h,
216
+ "aria-labelledby": h ? void 0 : g,
214
217
  "data-component": "practice-profile-hero",
215
- "data-component-id": c,
218
+ "data-component-id": u,
216
219
  "data-has-cover": t ? "true" : "false",
217
- id: c,
218
- className: q({ surface: m, className: H }),
219
- ...C,
220
- children: m === "elevated" ? /* @__PURE__ */ i(w, { variant: "elevated", children: [
221
- N,
222
- /* @__PURE__ */ e(w.Body, { children: P })
223
- ] }) : /* @__PURE__ */ i(j, { children: [
224
- N,
225
- /* @__PURE__ */ e("div", { className: "ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]", children: P })
220
+ id: u,
221
+ className: G({ surface: v, className: k }),
222
+ ...R,
223
+ children: v === "elevated" ? /* @__PURE__ */ d(C, { variant: "elevated", children: [
224
+ P,
225
+ /* @__PURE__ */ e(C.Body, { children: b })
226
+ ] }) : /* @__PURE__ */ d(z, { children: [
227
+ P,
228
+ /* @__PURE__ */ e("div", { className: "ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]", children: b })
226
229
  ] })
227
230
  }
228
231
  );
229
232
  }
230
233
  );
231
- D.displayName = "PracticeProfileHero";
234
+ J.displayName = "PracticeProfileHero";
232
235
  export {
233
- D as P,
234
- $ as p
236
+ J as P,
237
+ D as p
235
238
  };
236
- //# sourceMappingURL=practice-profile-hero-qfrsFQI_.js.map
239
+ //# sourceMappingURL=practice-profile-hero-ClzE-4CB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"practice-profile-hero-ClzE-4CB.js","sources":["../../src/components/practice-profile-hero/practice-profile-hero.agent.ts","../../src/components/practice-profile-hero/practice-profile-hero.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { PracticeProfileHeroHandle } from './practice-profile-hero';\n\nexport const practiceProfileHeroAgent: AgentAdapter<PracticeProfileHeroHandle> =\n {\n id: 'practice-profile-hero',\n // Purely observable hero region — no interactive affordances and no\n // imperative actions on the handle (getName / getHasCover are read-only\n // projections).\n capabilities: [],\n state: {\n name: {\n type: 'string',\n descriptionKey: 'ui.agent.practiceProfileHero.state.name',\n description: 'Practice display name currently rendered.',\n read: (handle) => handle.getName(),\n },\n hasCover: {\n type: 'boolean',\n descriptionKey: 'ui.agent.practiceProfileHero.state.hasCover',\n description:\n 'Whether a cover-image strip is rendered. Structural flag only — never the image URL or any PHI.',\n read: (handle) => handle.getHasCover(),\n },\n },\n actions: {},\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'practice-profile-hero',\n description: 'Marks the PracticeProfileHero root region.',\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 useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { Avatar } from '../avatar/avatar';\nimport { Badge } from '../badge/badge';\nimport { Card } from '../card/card';\nimport { Rating } from '../rating/rating';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { practiceProfileHeroAgent } from './practice-profile-hero.agent';\n\n/* -------------------------------------------------------------------- */\n/* PracticeProfileHero */\n/* */\n/* The practice-page counterpart to `<OperatorHero>` — the top-of-page */\n/* hero for a practice profile (booking site `/p/<seoUrl>`, marketplace */\n/* practice views). Differences from the operator hero: */\n/* */\n/* - Optional cover strip: renders ONLY when `coverImageUrl` is set. */\n/* A practice without a configured cover image gets no strip at all */\n/* — never an empty brand-gradient band eating page space. */\n/* - Larger avatar at desktop widths (3xl), stepped down to xl and */\n/* stacked above the text on small viewports so the practice name, */\n/* tagline and rating keep the full line width on phones. */\n/* -------------------------------------------------------------------- */\n\n/* -------------------------------------------------------------------- */\n/* CVA */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva('ds:w-full ds:text-[color:var(--foreground)]', {\n variants: {\n // Matches the kit's other `surface` props (Booking, ReviewsPanel,\n // OperatorHero). `'elevated'` wraps in `<Card>`.\n surface: {\n flat: '',\n elevated: '',\n },\n },\n defaultVariants: {\n surface: 'elevated',\n },\n});\n\n/* -------------------------------------------------------------------- */\n/* Public types */\n/* -------------------------------------------------------------------- */\n\nexport interface PracticeProfileHeroBadge {\n /** Display key — i18n is up to the consumer. */\n key: string;\n /** Display label. */\n label: string;\n /** Badge variant — falls back to `neutral`. */\n variant?: 'neutral' | 'info' | 'success' | 'warning' | 'error';\n}\n\nexport interface PracticeProfileHeroRating {\n /** Mean rating, 0–5. */\n value: number;\n /** Total number of reviews. */\n count: number;\n}\n\nexport interface PracticeProfileHeroHandle {\n getName: () => string;\n /** Structural flag — whether a cover strip is rendered. No PHI. */\n getHasCover: () => boolean;\n}\n\nexport interface PracticeProfileHeroProps extends Omit<\n ComponentPropsWithoutRef<'div'>,\n 'aria-label' | 'children'\n> {\n /** Practice display name. Rendered as the H1 heading. */\n name: string;\n /** Slogan / tagline subtitle (e.g. \"15 anni di esperienza nel cuore di Brera\"). */\n tagline?: string;\n /**\n * Optional practice photo / logo URL. The kit always renders an\n * `<Avatar>` — when `imageUrl` is missing the avatar falls back to\n * initials.\n */\n imageUrl?: string;\n /**\n * Text alternative for the photo's `<img>`, for image search and crawlers.\n * Pass the practice name. Leave it out and the photo stays decorative\n * (`alt=\"\"`), as before. Added in 1.91.0.\n */\n imageAlt?: string;\n /**\n * Optional cover image painted as a full-width strip above the body.\n * The strip renders ONLY when this is set — a practice without a cover\n * image gets no strip (and no empty gradient band). While the image\n * loads, the brand gradient shows in the strip. If it fails to load\n * (404, 401, not an image), the strip goes, as if no cover had been\n * passed, and `data-has-cover` reads `\"false\"`. A different URL tries\n * again.\n */\n coverImageUrl?: string;\n /** Rating summary — when present, renders a Rating + numeric breakdown line. */\n rating?: PracticeProfileHeroRating;\n /**\n * Optional badge row beneath the rating. Use sparingly — 1–3 chips\n * suit the hero's density; longer lists belong in `<ContactProfileCard>`.\n */\n badges?: PracticeProfileHeroBadge[];\n\n /* ----- Slots ----- */\n\n /**\n * Rendered at the inline-end of the heading row (right side on LTR)\n * from `sm` up. The heading row wraps, so on a phone the action drops\n * onto its own line, starts flush with the practice name, and is free\n * to shrink into the column rather than overflow it.\n *\n * Use for a \"Book an appointment\" `<Button>` or a share action.\n */\n actionSlot?: ReactNode;\n\n /* ----- Styling ----- */\n\n /**\n * `elevated` (default) wraps in `<Card variant=\"elevated\">`. `flat`\n * drops the Card — use inside another card / sheet.\n */\n surface?: 'flat' | 'elevated';\n\n /* ----- a11y ----- */\n\n 'aria-label'?: string;\n id?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const PracticeProfileHero = forwardRef<\n HTMLDivElement,\n PracticeProfileHeroProps\n>(\n (\n {\n name,\n tagline,\n imageUrl,\n imageAlt,\n coverImageUrl,\n rating,\n badges,\n actionSlot,\n surface = 'elevated',\n 'aria-label': ariaLabel,\n id,\n className,\n ...rest\n },\n ref,\n ) => {\n const headingId = useId();\n\n // HTP-6708. A CSS background cannot report a failed load, so the URL\n // is probed with an Image (the browser serves both from one request).\n // The strip reserves its height while the image loads, with the brand\n // gradient showing: a cover that loads causes no layout shift, and one\n // that fails removes the strip in a single step. The outcome is kept\n // per URL, so a new URL starts loading again and is retried.\n const [coverOutcome, setCoverOutcome] = useState<{\n url: string;\n status: 'loaded' | 'error';\n } | null>(null);\n const coverStatus =\n coverImageUrl && coverOutcome?.url === coverImageUrl\n ? coverOutcome.status\n : 'loading';\n useEffect(() => {\n if (!coverImageUrl || typeof Image === 'undefined') return undefined;\n let current = true;\n const probe = new Image();\n probe.onload = () => {\n if (current) setCoverOutcome({ url: coverImageUrl, status: 'loaded' });\n };\n probe.onerror = () => {\n if (current) setCoverOutcome({ url: coverImageUrl, status: 'error' });\n };\n probe.src = coverImageUrl;\n return () => {\n current = false;\n probe.onload = null;\n probe.onerror = null;\n };\n }, [coverImageUrl]);\n const hasCover = Boolean(coverImageUrl) && coverStatus !== 'error';\n\n // Memoised so the registry doesn't see a fresh handle identity (and\n // fire unregister+register) on every render — mirrors Booking.\n const agentHandle = useMemo(\n () => ({ getName: () => name, getHasCover: () => hasCover }),\n [name, hasCover],\n );\n useAgentRegistration(practiceProfileHeroAgent, agentHandle, id);\n\n // Cover image URL lands as a component-scoped CSS custom property set\n // imperatively on a ref — mirrors the Avatar `--avatar-color-override`\n // idiom so no `style={{…}}` attribute lands on the JSX (constraint §4).\n const coverRef = useRef<HTMLDivElement>(null);\n useIsomorphicLayoutEffect(() => {\n const el = coverRef.current;\n if (!el) return;\n if (coverImageUrl) {\n el.style.setProperty(\n '--practice-profile-hero-cover',\n `url(\"${coverImageUrl.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\")`,\n );\n } else {\n el.style.removeProperty('--practice-profile-hero-cover');\n }\n // `hasCover`: the strip can come back (a new URL after a failure),\n // and the new element needs the property too.\n }, [coverImageUrl, hasCover]);\n\n const cover = hasCover ? (\n <div\n ref={coverRef}\n aria-hidden=\"true\"\n data-slot=\"cover\"\n data-state={coverStatus}\n className={[\n 'ds:h-32 ds:sm:h-40 ds:w-full',\n // Cover image layered over the brand gradient — the gradient is\n // the visible underlay while the image streams in. A failed image\n // removes the strip (see above). The `none` fallback keeps the\n // declaration valid before the layout effect sets the custom\n // property (SSR / first paint).\n 'ds:bg-[image:var(--practice-profile-hero-cover,none),var(--gradient-hero-brand)]',\n 'ds:bg-cover ds:bg-center',\n ].join(' ')}\n />\n ) : null;\n\n // Decorative unless the caller wrote alt text for a photo that shows.\n const photoHidden = !(imageUrl && imageAlt);\n\n const body = (\n <div\n className={[\n // Phones: stacked column, smaller avatar — the practice name,\n // tagline and rating keep the full line width instead of being\n // squeezed beside a 3xl avatar. sm+: classic row layout.\n 'ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-md)]',\n 'ds:sm:flex-row ds:sm:gap-[var(--spacing-lg)]',\n ].join(' ')}\n >\n {/* Responsive avatar — `ds:hidden` removes the inactive size from\n both the layout and the accessibility tree. Without `imageAlt`\n both renders are aria-hidden: the H1 right beside them already\n carries the practice name, so the avatar is decorative. With\n `imageAlt` (and a photo) the photo is reachable and its alt is\n what a screen reader reads (HTP-7074). */}\n {/* HTP-6712: the practice photo is a 4:3 rounded rectangle, filled\n and cropped from the centre. It keeps the old circle's height\n (64px on phones, 192px from sm), so the hero does not grow. */}\n <div className=\"ds:shrink-0 ds:sm:hidden\">\n <Avatar\n size=\"xl\"\n shape=\"rounded\"\n ratio=\"4:3\"\n name={name}\n src={imageUrl}\n alt={imageAlt}\n aria-hidden={photoHidden ? 'true' : undefined}\n />\n </div>\n <div className=\"ds:hidden ds:shrink-0 ds:sm:block\">\n <Avatar\n size=\"3xl\"\n shape=\"rounded\"\n ratio=\"4:3\"\n name={name}\n src={imageUrl}\n alt={imageAlt}\n aria-hidden={photoHidden ? 'true' : undefined}\n />\n </div>\n <div className=\"ds:flex ds:w-full ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <div className=\"ds:flex ds:flex-wrap ds:items-start ds:gap-[var(--spacing-md)]\">\n {/* The practice's own words (name, tagline) keep the direction\n they were typed in, not the page's: `dir=\"auto\"`. */}\n <h1\n id={headingId}\n dir=\"auto\"\n className=\"type-title-page ds:m-0 ds:text-[color:var(--foreground)]\"\n >\n {name}\n </h1>\n {actionSlot ? (\n // `ms-auto` + `shrink-0` are the desktop contract, and both are\n // wrong once the row wraps on a phone: they stranded the action\n // at the inline-end of a start-aligned stack and stopped a wide\n // control fitting the column. Hence `sm:` and up only.\n <div className=\"ds:flex ds:min-w-0 ds:items-center ds:gap-[var(--spacing-xs)] ds:sm:ms-auto ds:sm:shrink-0\">\n {actionSlot}\n </div>\n ) : null}\n </div>\n {tagline ? (\n <p\n dir=\"auto\"\n className=\"type-body ds:m-0 ds:text-[color:var(--foreground)]\"\n >\n {tagline}\n </p>\n ) : null}\n {rating ? (\n // Rating owns the whole line: locale-formatted value, plural-\n // aware review count, and a single role=\"img\" announcement.\n <Rating\n value={rating.value}\n max={5}\n size=\"md\"\n reviews={{ count: rating.count }}\n />\n ) : null}\n {badges && badges.length > 0 ? (\n <div\n role=\"list\"\n className=\"ds:mt-[var(--spacing-2xs)] ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-2xs)]\"\n >\n {badges.map((badge) => (\n <Badge\n key={badge.key}\n variant={badge.variant ?? 'neutral'}\n role=\"listitem\"\n >\n {badge.label}\n </Badge>\n ))}\n </div>\n ) : null}\n </div>\n </div>\n );\n\n return (\n <div\n ref={ref}\n role=\"region\"\n // A consumer-supplied aria-label wins; otherwise the region is\n // named by the practice-name H1 via aria-labelledby.\n aria-label={ariaLabel}\n aria-labelledby={ariaLabel ? undefined : headingId}\n data-component=\"practice-profile-hero\"\n data-component-id={id}\n data-has-cover={hasCover ? 'true' : 'false'}\n id={id}\n className={rootVariants({ surface, className })}\n {...rest}\n >\n {surface === 'elevated' ? (\n <Card variant=\"elevated\">\n {cover}\n <Card.Body>{body}</Card.Body>\n </Card>\n ) : (\n <>\n {cover}\n <div className=\"ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]\">\n {body}\n </div>\n </>\n )}\n </div>\n );\n },\n);\n\nPracticeProfileHero.displayName = 'PracticeProfileHero';\n"],"names":["practiceProfileHeroAgent","handle","rootVariants","cva","PracticeProfileHero","forwardRef","name","tagline","imageUrl","imageAlt","coverImageUrl","rating","badges","actionSlot","surface","ariaLabel","id","className","rest","ref","headingId","useId","coverOutcome","setCoverOutcome","useState","coverStatus","useEffect","current","probe","hasCover","agentHandle","useMemo","useAgentRegistration","coverRef","useRef","useIsomorphicLayoutEffect","el","cover","jsx","photoHidden","body","jsxs","Avatar","Rating","badge","Badge","Card","Fragment"],"mappings":"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"}