@alfadocs/ui-kit 0.63.0 → 0.65.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 (265) hide show
  1. package/dist/_chunks/{agenda-tray-DA6qj8BL.js → agenda-tray-Bh1KfEOG.js} +2 -2
  2. package/dist/_chunks/{ai-consent-banner-DBKV27je.js → ai-consent-banner-Btzmk8OH.js} +3 -2
  3. package/dist/_chunks/{ai-prompt-input-C6sCr1Vi.js → ai-prompt-input-BwEACCPm.js} +3 -3
  4. package/dist/_chunks/{ai-tools-rail-7tC3GT4h.js → ai-tools-rail-JnlTqfS4.js} +2 -2
  5. package/dist/_chunks/{alia-sidebar-DlvyXgVC.js → alia-sidebar-CN8pA6c-.js} +7 -7
  6. package/dist/_chunks/{anamnesis-card-CmkBVAln.js → anamnesis-card-qeLYRG79.js} +2 -2
  7. package/dist/_chunks/{antenatal-schedule-timeline-CdiqkF05.js → antenatal-schedule-timeline-BfzFjEyb.js} +3 -3
  8. package/dist/_chunks/{appointment-tray-BwDHhWWC.js → appointment-tray-BQnJEora.js} +2 -2
  9. package/dist/_chunks/{ar-C68WKG5a.js → ar-Cn5Fq48Z.js} +2 -2
  10. package/dist/_chunks/{audio-recorder-D6OVfNiZ.js → audio-recorder-DjXLP4aF.js} +3 -3
  11. package/dist/_chunks/{autocomplete-CDqxB68B.js → autocomplete-CcCFlVf-.js} +4 -4
  12. package/dist/_chunks/{bishop-score-B9tvgoIq.js → bishop-score-x2fNqbuZ.js} +3 -3
  13. package/dist/_chunks/{bmi-calculator-DA2NGmVK.js → bmi-calculator-C3roxbqD.js} +2 -2
  14. package/dist/_chunks/{booking-BUV9fspj.js → booking-L8-YP8BJ.js} +149 -149
  15. package/dist/_chunks/calendar-B6soK1Yb.js +17 -0
  16. package/dist/_chunks/{calendar-CkuJIg3s.js → calendar-oYWOCrnf.js} +1 -1
  17. package/dist/_chunks/{care-plan-card-QmNpGggC.js → care-plan-card-D42WD4-T.js} +2 -2
  18. package/dist/_chunks/{care-plan-entry-card-Cnra7vUc.js → care-plan-entry-card-BukNI7Uy.js} +2 -2
  19. package/dist/_chunks/{carousel.agent-DrX96W-1.js → carousel.agent-vt21A_el.js} +2 -2
  20. package/dist/_chunks/{chat-input-CFwc7JxL.js → chat-input-B5zjNEUN.js} +2 -2
  21. package/dist/_chunks/{chat-message-Dm8U2RY1.js → chat-message-3V54YipB.js} +2 -2
  22. package/dist/_chunks/{code-block-HoddNOKJ.js → code-block-BBWHhIc8.js} +2 -2
  23. package/dist/_chunks/{contact-profile-card-DvvVfAA2.js → contact-profile-card-CCeJmjbd.js} +2 -2
  24. package/dist/_chunks/{cycle-calculator-C_t1Hs8V.js → cycle-calculator-DrVXbIB4.js} +4 -4
  25. package/dist/_chunks/{date-picker-BfHblqwA.js → date-picker-oGg5BnXL.js} +12 -11
  26. package/dist/_chunks/{date-picker-variants-CXEAx3O_.js → date-picker-variants-DAcSLTua.js} +358 -372
  27. package/dist/_chunks/{date-range-picker-hcAMs1wO.js → date-range-picker-C5BWfH_T.js} +34 -25
  28. package/dist/_chunks/{date-time-picker-H-3Pwqlb.js → date-time-picker-Ze1My59T.js} +18 -17
  29. package/dist/_chunks/{de-DK4A9_a8.js → de-CrJs4ZsX.js} +2 -2
  30. package/dist/_chunks/{description-list-BEbK2g93.js → description-list-gkNGWk5G.js} +2 -2
  31. package/dist/_chunks/{due-date-calculator-Q8MIwEVV.js → due-date-calculator-D4K1BnE2.js} +4 -4
  32. package/dist/_chunks/{editable-currency-cell-renderer-D5C5tCfu.js → editable-currency-cell-renderer-CFqQc56y.js} +305 -295
  33. package/dist/_chunks/editor-overlay-wYm22wZK.js +88 -0
  34. package/dist/_chunks/{el-B29HXhG5.js → el-DHdMOIhL.js} +6 -6
  35. package/dist/_chunks/{es-BOwPVwWn.js → es-DCATCfqo.js} +2 -2
  36. package/dist/_chunks/{fetal-weight-D1a6BmM-.js → fetal-weight-B_pBjlO7.js} +2 -2
  37. package/dist/_chunks/{fiscal-code-input-BZ0FxwUl.js → fiscal-code-input-DPtqluVb.js} +2 -2
  38. package/dist/_chunks/{fr-DoDBtn0T.js → fr-BfGEMshF.js} +2 -2
  39. package/dist/_chunks/{freemium-paywall-gHGA44dW.js → freemium-paywall-CkWjv3o6.js} +2 -2
  40. package/dist/_chunks/{gestational-age-calculator-AkNFfZYs.js → gestational-age-calculator-BETQAVkA.js} +7 -7
  41. package/dist/_chunks/{hcg-doubling-Dg0Hr7ey.js → hcg-doubling-8zXCJgAQ.js} +3 -3
  42. package/dist/_chunks/{header-Ce1Br27u.js → header-CNszv2WQ.js} +2 -2
  43. package/dist/_chunks/{header-settings-D5Z2B_Yz.js → header-settings-CNOqIhoW.js} +3 -3
  44. package/dist/_chunks/{hi-DGByrKby.js → hi-CBFRXEIm.js} +2 -2
  45. package/dist/_chunks/icon-button-LqoiKcUN.js +78 -0
  46. package/dist/_chunks/{insert-result-C1SYdueh.js → insert-result-DIAG3ltJ.js} +115 -136
  47. package/dist/_chunks/{isSameWeek-B1odL2vR.js → isSameWeek-I3DfXUp1.js} +2 -2
  48. package/dist/_chunks/{it-B16rEecm.js → it-nz6vAKwG.js} +7 -7
  49. package/dist/_chunks/{ja-B0viOgft.js → ja-DQcqdAEJ.js} +2 -2
  50. package/dist/_chunks/{key-value-pair-CkQIb9EG.js → key-value-pair-BrgbMfbF.js} +2 -2
  51. package/dist/_chunks/{locale-picker-D99UyZVJ.js → locale-picker-C9JmBht3.js} +3 -3
  52. package/dist/_chunks/{marketplace-app-shell-C4OYAC22.js → marketplace-app-shell-BXfRMiRk.js} +4 -4
  53. package/dist/_chunks/{message-card-Dvl1TgaN.js → message-card-Bgcvfj6-.js} +2 -2
  54. package/dist/_chunks/{message-tray-Dl6GQaaV.js → message-tray-saAVMeHP.js} +3 -3
  55. package/dist/_chunks/{multi-select-DOLO3K_z.js → multi-select-BcPylvHR.js} +100 -90
  56. package/dist/_chunks/{nl-cBxEX2QU.js → nl-L5SuDjyl.js} +2 -2
  57. package/dist/_chunks/{notification-card-CObnGdJu.js → notification-card-BiESdm8q.js} +2 -2
  58. package/dist/_chunks/{notification-tray-BWHDIjgd.js → notification-tray-DlgenTEe.js} +3 -3
  59. package/dist/_chunks/{patient-search-CArmRKeg.js → patient-search-Bw9ONucF.js} +2 -2
  60. package/dist/_chunks/{patient-shell-Coarf346.js → patient-shell-CF_qon7C.js} +3 -3
  61. package/dist/_chunks/{patient-summary-card-BnTqxcTr.js → patient-summary-card-Bgso0p_l.js} +2 -2
  62. package/dist/_chunks/{payment-form-DJ9vnzrT.js → payment-form-nXocS_MX.js} +11 -4
  63. package/dist/_chunks/{payment-request-card-B_lyobd0.js → payment-request-card-DBz3hVDz.js} +3 -3
  64. package/dist/_chunks/{pdf-viewer-chMpwpA4.js → pdf-viewer-GsfNqeeT.js} +3 -3
  65. package/dist/_chunks/{periodontal-chart-card-BYs9hax1.js → periodontal-chart-card-AYyHtU9K.js} +2 -2
  66. package/dist/_chunks/phone-input-DVXhNlIl.js +563 -0
  67. package/dist/_chunks/{pl-DtS08ioY.js → pl-YAn5z2wR.js} +3 -3
  68. package/dist/_chunks/{popover-Devce-tT.js → popover-DTbfAuR0.js} +2 -2
  69. package/dist/_chunks/{practice-results-CtfciF2v.js → practice-results-CVAgY2RZ.js} +3 -3
  70. package/dist/_chunks/{pregnancy-dating-Dg6dTe1p.js → pregnancy-dating-BuzLTwjy.js} +7 -7
  71. package/dist/_chunks/{pregnancy-weight-gain-DI7X-0JX.js → pregnancy-weight-gain-aicn7qs7.js} +2 -2
  72. package/dist/_chunks/{privacy-lock-BN3L-alb.js → privacy-lock-C7JyMf0y.js} +2 -2
  73. package/dist/_chunks/{product-hub-panel-CkfZBA3t.js → product-hub-panel-CAXDFeGP.js} +2 -2
  74. package/dist/_chunks/{pt-yFXs1VvH.js → pt-D9xdT5KQ.js} +6 -6
  75. package/dist/_chunks/{public-header.agent-CYQK6T6F.js → public-header.agent-BOhJgZEU.js} +3 -3
  76. package/dist/_chunks/{reviews-panel-CPrXu5TX.js → reviews-panel-DBktKm7i.js} +2 -2
  77. package/dist/_chunks/rich-text-editor-u36FqSWz.js +1190 -0
  78. package/dist/_chunks/{ro-DsCzSrzR.js → ro-Cp--52bT.js} +2 -2
  79. package/dist/_chunks/{ru-DgDxL0pc.js → ru-BM8eX_Zz.js} +3 -3
  80. package/dist/_chunks/{search-bar-CvN_S0jW.js → search-bar-SY2BcV2N.js} +2 -2
  81. package/dist/_chunks/{search-input-D3aMvi4l.js → search-input-DbxrnHkW.js} +3 -3
  82. package/dist/_chunks/{select-hsCaJSX3.js → select-CEtRcon5.js} +46 -45
  83. package/dist/_chunks/{sheet-xbzu4YiY.js → sheet-taJer-Ha.js} +2 -2
  84. package/dist/_chunks/{sign-document--nr5cxsB.js → sign-document-CdAiHiCh.js} +2 -2
  85. package/dist/_chunks/{sign-in-with-alfadocs-button-BpAjVmsI.js → sign-in-with-alfadocs-button-LppxjlFt.js} +2 -2
  86. package/dist/_chunks/{signature-field-DbhbpLha.js → signature-field-Dy1JRjzE.js} +10 -3
  87. package/dist/_chunks/{slot-grid-BlHHP9Qy.js → slot-grid-FsqumOaS.js} +2 -2
  88. package/dist/_chunks/smart-date-CWikAqZx.js +114 -0
  89. package/dist/_chunks/{social-sign-in-button-uJYLM366.js → social-sign-in-button-dlpPI5l7.js} +2 -2
  90. package/dist/_chunks/{spinner-OjQNn8oN.js → spinner-hbwuKwMf.js} +10 -10
  91. package/dist/_chunks/{sq-DHlCYN67.js → sq-XRpr0r49.js} +6 -6
  92. package/dist/_chunks/{streaming-text-CfhDqtIT.js → streaming-text-BB9mvK4m.js} +2 -2
  93. package/dist/_chunks/subDays-BcYv1Lxi.js +8 -0
  94. package/dist/_chunks/{sv-O0QaQs_s.js → sv-Z3APomE8.js} +2 -2
  95. package/dist/_chunks/{tabs-BpPYVme_.js → tabs-BIQ0ew1T.js} +2 -2
  96. package/dist/_chunks/{task-tray-Cb_hK4yb.js → task-tray-CAncV-QQ.js} +2 -2
  97. package/dist/_chunks/{theme-toggle-DAW7uC0B.js → theme-toggle-DETmSu_h.js} +2 -2
  98. package/dist/_chunks/{toast.agent-B0MCsvdZ.js → toast.agent-vuLRRn2a.js} +2 -2
  99. package/dist/_chunks/tooth-scheme-BIx1O2aJ.js +1257 -0
  100. package/dist/_chunks/{tr-BmNDRuio.js → tr-e0-P4FON.js} +2 -2
  101. package/dist/_chunks/{transcript-panel-B4HiC7ed.js → transcript-panel-CLHmv83g.js} +2 -2
  102. package/dist/_chunks/type-DZ5OMRA2.js +28 -0
  103. package/dist/_chunks/{unit-converter-3sINXO3m.js → unit-converter-CHN2cZ4b.js} +3 -3
  104. package/dist/_chunks/{wallet-pay-button-DuDPBlCO.js → wallet-pay-button--dnR6NfJ.js} +2 -2
  105. package/dist/_chunks/{workflow-map-BJDUNYlX.js → workflow-map-BX3JY1Bu.js} +3 -3
  106. package/dist/_chunks/{zh-CN-CgVJZEzz.js → zh-CN-B-igM5gY.js} +3 -3
  107. package/dist/agent-catalog.json +72 -4
  108. package/dist/components/agenda-tray/index.js +1 -1
  109. package/dist/components/ai-consent-banner/index.js +1 -1
  110. package/dist/components/ai-prompt-input/index.js +1 -1
  111. package/dist/components/ai-tools-rail/index.js +1 -1
  112. package/dist/components/anamnesis-card/index.js +1 -1
  113. package/dist/components/appointment-card/index.js +1 -1
  114. package/dist/components/audio-recorder/index.js +1 -1
  115. package/dist/components/autocomplete/index.js +1 -1
  116. package/dist/components/bishop-score/index.js +1 -1
  117. package/dist/components/bmi-calculator/index.js +1 -1
  118. package/dist/components/booking/index.js +1 -1
  119. package/dist/components/button/index.js +1 -1
  120. package/dist/components/calendar/index.js +1 -1
  121. package/dist/components/care-plan-card/index.js +1 -1
  122. package/dist/components/care-plan-entry-card/index.js +1 -1
  123. package/dist/components/carousel/index.js +1 -1
  124. package/dist/components/chat-input/index.js +1 -1
  125. package/dist/components/chat-message/index.js +1 -1
  126. package/dist/components/contact-profile-card/index.js +1 -1
  127. package/dist/components/cycle-calculator/index.js +1 -1
  128. package/dist/components/data-table/index.js +1 -1
  129. package/dist/components/date-picker/index.js +1 -1
  130. package/dist/components/date-range-picker/index.js +1 -1
  131. package/dist/components/date-time-picker/index.js +1 -1
  132. package/dist/components/description-list/index.js +1 -1
  133. package/dist/components/due-date-calculator/index.js +2 -2
  134. package/dist/components/editor-overlay/editor-overlay.d.ts +19 -0
  135. package/dist/components/editor-overlay/index.d.ts +3 -0
  136. package/dist/components/editor-overlay/index.js +5 -0
  137. package/dist/components/fetal-weight/index.js +1 -1
  138. package/dist/components/fiscal-code-input/index.js +1 -1
  139. package/dist/components/freemium-paywall/index.js +1 -1
  140. package/dist/components/gestational-age-calculator/index.js +1 -1
  141. package/dist/components/hcg-doubling/index.js +1 -1
  142. package/dist/components/header/index.js +1 -1
  143. package/dist/components/header-settings/index.js +1 -1
  144. package/dist/components/icon-button/index.js +1 -1
  145. package/dist/components/index.d.ts +2 -0
  146. package/dist/components/key-value-pair/index.js +1 -1
  147. package/dist/components/locale-picker/index.js +1 -1
  148. package/dist/components/message-card/index.js +1 -1
  149. package/dist/components/message-tray/index.js +1 -1
  150. package/dist/components/multi-select/index.js +1 -1
  151. package/dist/components/notification-card/index.js +1 -1
  152. package/dist/components/notification-tray/index.js +1 -1
  153. package/dist/components/patient-search/index.js +1 -1
  154. package/dist/components/patient-summary-card/index.js +1 -1
  155. package/dist/components/payment-card/index.js +1 -1
  156. package/dist/components/payment-form/index.js +1 -1
  157. package/dist/components/pdf-viewer/index.js +1 -1
  158. package/dist/components/periodontal-chart-card/index.js +1 -1
  159. package/dist/components/phone-input/index.js +1 -1
  160. package/dist/components/phone-input/phone-input.d.ts +9 -0
  161. package/dist/components/popover/index.js +1 -1
  162. package/dist/components/practice-results/index.js +1 -1
  163. package/dist/components/pregnancy-dating/index.js +1 -1
  164. package/dist/components/pregnancy-weight-gain/index.js +1 -1
  165. package/dist/components/privacy-lock/index.js +1 -1
  166. package/dist/components/product-hub-tray/index.js +1 -1
  167. package/dist/components/public-header/index.js +1 -1
  168. package/dist/components/reviews-panel/index.js +1 -1
  169. package/dist/components/rich-text-editor/editor-toolbar.d.ts +16 -0
  170. package/dist/components/rich-text-editor/help-me-write-overlay.d.ts +25 -0
  171. package/dist/components/rich-text-editor/index.js +1 -1
  172. package/dist/components/rich-text-editor/rich-text-editor.d.ts +43 -0
  173. package/dist/components/search-bar/index.js +1 -1
  174. package/dist/components/search-input/index.js +1 -1
  175. package/dist/components/select/index.js +1 -1
  176. package/dist/components/select/select.d.ts +8 -0
  177. package/dist/components/sheet/index.js +1 -1
  178. package/dist/components/sign-document/index.js +1 -1
  179. package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
  180. package/dist/components/signature-field/index.js +1 -1
  181. package/dist/components/slot-grid/index.js +1 -1
  182. package/dist/components/smart-date/index.d.ts +3 -0
  183. package/dist/components/smart-date/index.js +5 -0
  184. package/dist/components/smart-date/smart-date.d.ts +32 -0
  185. package/dist/components/social-sign-in-button/index.js +1 -1
  186. package/dist/components/spinner/index.js +1 -1
  187. package/dist/components/streaming-text/index.js +1 -1
  188. package/dist/components/tabs/index.js +1 -1
  189. package/dist/components/task-tray/index.js +1 -1
  190. package/dist/components/theme-toggle/index.js +1 -1
  191. package/dist/components/toast/index.js +1 -1
  192. package/dist/components/tooth-scheme/index.d.ts +2 -2
  193. package/dist/components/tooth-scheme/index.js +22 -15
  194. package/dist/components/tooth-scheme/tooth-data.d.ts +79 -18
  195. package/dist/components/tooth-scheme/tooth-scheme.agent.d.ts +2 -0
  196. package/dist/components/tooth-scheme/tooth-scheme.d.ts +48 -1
  197. package/dist/components/transcript-panel/index.js +1 -1
  198. package/dist/components/unit-converter/index.js +1 -1
  199. package/dist/components/wallet-pay-button/index.js +1 -1
  200. package/dist/components/workflow/index.js +1 -1
  201. package/dist/i18n/locales/ar.d.ts +61 -0
  202. package/dist/i18n/locales/ar.js +63 -2
  203. package/dist/i18n/locales/de.d.ts +61 -0
  204. package/dist/i18n/locales/de.js +63 -2
  205. package/dist/i18n/locales/el.d.ts +61 -0
  206. package/dist/i18n/locales/el.js +63 -2
  207. package/dist/i18n/locales/en.d.ts +61 -0
  208. package/dist/i18n/locales/en.js +67 -2
  209. package/dist/i18n/locales/es.d.ts +61 -0
  210. package/dist/i18n/locales/es.js +63 -2
  211. package/dist/i18n/locales/fr.d.ts +61 -0
  212. package/dist/i18n/locales/fr.js +63 -2
  213. package/dist/i18n/locales/hi.d.ts +61 -0
  214. package/dist/i18n/locales/hi.js +63 -2
  215. package/dist/i18n/locales/it.d.ts +61 -0
  216. package/dist/i18n/locales/it.js +63 -2
  217. package/dist/i18n/locales/ja.d.ts +61 -0
  218. package/dist/i18n/locales/ja.js +63 -2
  219. package/dist/i18n/locales/nl.d.ts +61 -0
  220. package/dist/i18n/locales/nl.js +63 -2
  221. package/dist/i18n/locales/pl.d.ts +61 -0
  222. package/dist/i18n/locales/pl.js +63 -2
  223. package/dist/i18n/locales/pt.d.ts +61 -0
  224. package/dist/i18n/locales/pt.js +63 -2
  225. package/dist/i18n/locales/ro.d.ts +61 -0
  226. package/dist/i18n/locales/ro.js +63 -2
  227. package/dist/i18n/locales/ru.d.ts +61 -0
  228. package/dist/i18n/locales/ru.js +63 -2
  229. package/dist/i18n/locales/sq.d.ts +61 -0
  230. package/dist/i18n/locales/sq.js +63 -2
  231. package/dist/i18n/locales/sv.d.ts +61 -0
  232. package/dist/i18n/locales/sv.js +63 -2
  233. package/dist/i18n/locales/tr.d.ts +61 -0
  234. package/dist/i18n/locales/tr.js +63 -2
  235. package/dist/i18n/locales/zh.d.ts +61 -0
  236. package/dist/i18n/locales/zh.js +63 -2
  237. package/dist/index.js +511 -500
  238. package/dist/locales/ar.json +63 -2
  239. package/dist/locales/de.json +63 -2
  240. package/dist/locales/el.json +63 -2
  241. package/dist/locales/en.json +63 -2
  242. package/dist/locales/es.json +63 -2
  243. package/dist/locales/fr.json +63 -2
  244. package/dist/locales/hi.json +63 -2
  245. package/dist/locales/it.json +63 -2
  246. package/dist/locales/ja.json +63 -2
  247. package/dist/locales/nl.json +63 -2
  248. package/dist/locales/pl.json +63 -2
  249. package/dist/locales/pt.json +63 -2
  250. package/dist/locales/ro.json +63 -2
  251. package/dist/locales/ru.json +63 -2
  252. package/dist/locales/sq.json +63 -2
  253. package/dist/locales/sv.json +63 -2
  254. package/dist/locales/tr.json +63 -2
  255. package/dist/locales/zh.json +63 -2
  256. package/dist/patterns/alia-assistant/index.js +1 -1
  257. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  258. package/dist/patterns/patient-shell/index.js +1 -1
  259. package/dist/tokens.css +36 -22
  260. package/package.json +10 -1
  261. package/dist/_chunks/icon-button-CKEOrN37.js +0 -70
  262. package/dist/_chunks/phone-input-DfZbPPvh.js +0 -525
  263. package/dist/_chunks/rich-text-editor-B03qM22-.js +0 -334
  264. package/dist/_chunks/subDays-Bs00akhK.js +0 -8
  265. package/dist/_chunks/tooth-scheme-CxlsLjfN.js +0 -753
@@ -0,0 +1,1257 @@
1
+ import { jsx as u, jsxs as j } from "react/jsx-runtime";
2
+ import { forwardRef as Tt, useState as H, useRef as de, useEffect as ne, useMemo as Te, useCallback as E, useImperativeHandle as St } from "react";
3
+ import * as K from "@radix-ui/react-tooltip";
4
+ import { c as Y } from "./index-D2ZczOXr.js";
5
+ import { useTranslation as nt } from "react-i18next";
6
+ import { u as Lt } from "./registry-nPAVE19X.js";
7
+ import { I as It } from "./icon-button-LqoiKcUN.js";
8
+ import { P as Se } from "./popover-DTbfAuR0.js";
9
+ import { S as kt } from "./select-CEtRcon5.js";
10
+ import { S as Ot } from "./switch-BJ6HD3Mn.js";
11
+ import { S as At } from "./settings-ca2Yi9R8.js";
12
+ const Ct = {
13
+ id: "tooth-scheme",
14
+ // pick — focus/select a tooth; edit_inline — record/clear findings;
15
+ // view_change — the side/plan projection + dentition are view props.
16
+ capabilities: ["pick", "edit_inline", "view_change"],
17
+ state: {
18
+ chart: {
19
+ type: "object",
20
+ description: "Current dental chart — findings (and marked surfaces) keyed by FDI id.",
21
+ read: (t) => t.getChart()
22
+ },
23
+ chartedTeeth: {
24
+ type: "string[]",
25
+ description: "FDI ids of every tooth carrying at least one finding.",
26
+ read: (t) => Object.keys(t.getChart())
27
+ }
28
+ },
29
+ actions: {
30
+ focus_tooth: {
31
+ safety: "read",
32
+ argsType: "{ id: FdiId }",
33
+ description: "Move focus to a specific tooth by FDI id.",
34
+ invoke: (t, n) => {
35
+ t.focusTooth(n.id);
36
+ }
37
+ },
38
+ get_tooth: {
39
+ safety: "read",
40
+ argsType: "{ id: FdiId }",
41
+ description: "Read the findings recorded on one tooth (FDI id).",
42
+ invoke: (t, n) => t.getTooth(n.id)
43
+ },
44
+ teeth_with: {
45
+ safety: "read",
46
+ argsType: "{ condition: ToothCondition }",
47
+ description: "List the FDI ids of every tooth carrying a given finding (e.g. all teeth with caries).",
48
+ invoke: (t, n) => t.teethWith(n.condition)
49
+ },
50
+ set_finding: {
51
+ safety: "write",
52
+ argsType: "{ id: FdiId; condition: ToothCondition; surfaces?: Surface[] }",
53
+ description: "Record a finding on a tooth (crown, implant, root canal, caries, …). Optionally mark the affected surfaces for a surface finding.",
54
+ invoke: (t, n) => {
55
+ t.setFinding(n.id, n.condition, n.surfaces);
56
+ }
57
+ },
58
+ remove_finding: {
59
+ safety: "write",
60
+ argsType: "{ id: FdiId; condition: ToothCondition }",
61
+ description: "Remove a single finding from a tooth.",
62
+ invoke: (t, n) => {
63
+ t.removeFinding(n.id, n.condition);
64
+ }
65
+ },
66
+ clear_tooth: {
67
+ safety: "destructive",
68
+ argsType: "{ id: FdiId }",
69
+ description: "Clear every finding from a tooth.",
70
+ invoke: (t, n) => {
71
+ t.clearTooth(n.id);
72
+ }
73
+ }
74
+ },
75
+ domHooks: {
76
+ root: { attr: "data-component", value: "tooth-scheme" },
77
+ instanceId: {
78
+ attr: "data-component-id",
79
+ sourceProp: "id",
80
+ description: "Sourced from the id prop."
81
+ },
82
+ item: {
83
+ attr: "data-fdi",
84
+ description: "Each rendered tooth `<g>` carries its FDI id as `data-fdi`. The `data-projection` attribute on the root exposes the side/plan view."
85
+ }
86
+ }
87
+ }, Ae = [
88
+ // upper
89
+ "18",
90
+ "17",
91
+ "16",
92
+ "15",
93
+ "14",
94
+ "13",
95
+ "12",
96
+ "11",
97
+ "21",
98
+ "22",
99
+ "23",
100
+ "24",
101
+ "25",
102
+ "26",
103
+ "27",
104
+ "28",
105
+ // lower
106
+ "48",
107
+ "47",
108
+ "46",
109
+ "45",
110
+ "44",
111
+ "43",
112
+ "42",
113
+ "41",
114
+ "31",
115
+ "32",
116
+ "33",
117
+ "34",
118
+ "35",
119
+ "36",
120
+ "37",
121
+ "38"
122
+ ], Ce = [
123
+ // upper
124
+ "55",
125
+ "54",
126
+ "53",
127
+ "52",
128
+ "51",
129
+ "61",
130
+ "62",
131
+ "63",
132
+ "64",
133
+ "65",
134
+ // lower
135
+ "85",
136
+ "84",
137
+ "83",
138
+ "82",
139
+ "81",
140
+ "71",
141
+ "72",
142
+ "73",
143
+ "74",
144
+ "75"
145
+ ];
146
+ function Dt(t) {
147
+ return t <= 2 ? "incisor" : t === 3 ? "canine" : t <= 5 ? "premolar" : "molar";
148
+ }
149
+ function Mt(t) {
150
+ return t <= 2 ? "incisor" : t === 3 ? "canine" : "molar";
151
+ }
152
+ function Nt(t, n) {
153
+ const i = (t - 1) % 4 + 1;
154
+ return `${i === 1 ? "UR" : i === 2 ? "UL" : i === 3 ? "LL" : "LR"}${n}`;
155
+ }
156
+ function Rt(t, n) {
157
+ switch (t) {
158
+ case 1:
159
+ return String(1 + (8 - n));
160
+ case 2:
161
+ return String(8 + n);
162
+ case 3:
163
+ return String(17 + (8 - n));
164
+ case 4:
165
+ return String(24 + n);
166
+ default:
167
+ return "";
168
+ }
169
+ }
170
+ function _t(t, n) {
171
+ const i = "ABCDEFGHIJKLMNOPQRST";
172
+ let r = -1;
173
+ switch (t) {
174
+ case 5:
175
+ r = 0 + (5 - n);
176
+ break;
177
+ case 6:
178
+ r = 5 + (n - 1);
179
+ break;
180
+ case 7:
181
+ r = 10 + (5 - n);
182
+ break;
183
+ case 8:
184
+ r = 15 + (n - 1);
185
+ break;
186
+ default:
187
+ r = -1;
188
+ }
189
+ return r >= 0 ? i[r] : "";
190
+ }
191
+ function Et(t) {
192
+ const n = Number(t[0]), i = Number(t[1]), r = n >= 5, l = r ? Mt(i) : Dt(i), m = n === 1 || n === 2 || n === 5 || n === 6 ? "upper" : "lower", $ = n === 1 || n === 4 || n === 5 || n === 8 ? "right" : "left", v = r ? _t(n, i) : Rt(n, i), f = Nt(n, i);
193
+ return {
194
+ fdi: t,
195
+ universal: v,
196
+ palmer: f,
197
+ quadrant: n,
198
+ positionInQuadrant: i,
199
+ anatomy: l,
200
+ arch: m,
201
+ side: $,
202
+ dentition: r ? "primary" : "permanent"
203
+ };
204
+ }
205
+ const F = [
206
+ ...Ae,
207
+ ...Ce
208
+ ].reduce((t, n) => (t[n] = Et(n), t), {}), jt = Object.fromEntries(
209
+ Object.entries(F).map(([t, n]) => [t, n.universal])
210
+ ), Ft = Object.fromEntries(
211
+ Object.entries(F).map(([t, n]) => [t, n.palmer])
212
+ );
213
+ function Me(t) {
214
+ return t.dentition !== "primary" ? t.fdi : `${t.quadrant - 4}${t.positionInQuadrant}`;
215
+ }
216
+ const Ht = 0.72, hn = {
217
+ caries: "--destructive",
218
+ filled: "--info",
219
+ crowned: "--warning",
220
+ temporaryCrown: "--warning",
221
+ bridge: "--primary",
222
+ missing: "--muted-foreground",
223
+ implant: "--accent",
224
+ implantExtraction: "--accent",
225
+ stub: "--muted-foreground",
226
+ destroyed: "--destructive",
227
+ rootCanal: "--primary"
228
+ }, ue = {
229
+ caries: "var(--destructive)",
230
+ filled: "var(--info)",
231
+ crowned: "var(--warning)",
232
+ temporaryCrown: "var(--warning)",
233
+ bridge: "var(--primary)",
234
+ missing: "var(--muted-foreground)",
235
+ implant: "var(--accent)",
236
+ implantExtraction: "var(--accent)",
237
+ stub: "var(--muted-foreground)",
238
+ destroyed: "var(--destructive)",
239
+ rootCanal: "var(--primary)"
240
+ }, De = {
241
+ crowned: { folder: "crown", resolve: "per-fdi" },
242
+ temporaryCrown: { folder: "temporaryCrown", resolve: "per-fdi" },
243
+ bridge: { folder: "replacement", resolve: "per-fdi" },
244
+ destroyed: { folder: "destroyed", resolve: "per-fdi" },
245
+ implant: { folder: "implant", resolve: "general" },
246
+ implantExtraction: { folder: "implantExtraction", resolve: "general" },
247
+ stub: { folder: "stub", resolve: "general" },
248
+ rootCanal: { folder: "rootTreatment", resolve: "rct" }
249
+ };
250
+ function rt(t, n, i) {
251
+ const r = t.arch === "upper" ? "top" : "bottom", l = `${n}/side/${i.folder}/${r}`;
252
+ if (i.resolve === "general") return `${l}/general.webp`;
253
+ const m = Me(t);
254
+ return i.resolve === "rct" ? `${l}/${m}/full.webp` : `${l}/${m}.webp`;
255
+ }
256
+ const qt = {
257
+ mesial: "mesial",
258
+ distal: "distal",
259
+ occlusal: "occlusal",
260
+ buccal: "vestibular",
261
+ lingual: "oral"
262
+ }, Wt = {
263
+ caries: "caries",
264
+ filled: "filling"
265
+ };
266
+ function Pt(t, n, i, r) {
267
+ const l = t.arch === "upper" ? "top" : "bottom";
268
+ return `${n}/plan/${i}/${l}/${Me(t)}-${qt[r]}.webp`;
269
+ }
270
+ function Le(t) {
271
+ return t.anatomy === "molar" || t.anatomy === "premolar" ? ["top", "bottom", "left", "right", "center"] : ["top", "bottom", "left", "right"];
272
+ }
273
+ function Ge(t, n) {
274
+ if (n === "center") return "occlusal";
275
+ if (n === "top") return t.arch === "upper" ? "buccal" : "lingual";
276
+ if (n === "bottom") return t.arch === "upper" ? "lingual" : "buccal";
277
+ const i = t.quadrant <= 4 ? t.quadrant : t.quadrant - 4, r = i === 1 || i === 4;
278
+ return n === "left" ? r ? "distal" : "mesial" : r ? "mesial" : "distal";
279
+ }
280
+ const Qe = (t) => Math.round(t * 100) / 100;
281
+ function Ut(t, n, i) {
282
+ const { x: r, y: l, w: m, h: $ } = n, v = r + m, f = l + $, a = (O, M) => `${Qe(O)} ${Qe(M)}`;
283
+ if (!i) {
284
+ const O = r + m / 2, M = l + $ / 2;
285
+ switch (t) {
286
+ case "top":
287
+ return `M ${a(r, l)} L ${a(v, l)} L ${a(O, M)} Z`;
288
+ case "bottom":
289
+ return `M ${a(r, f)} L ${a(v, f)} L ${a(O, M)} Z`;
290
+ case "left":
291
+ return `M ${a(r, l)} L ${a(O, M)} L ${a(r, f)} Z`;
292
+ case "right":
293
+ return `M ${a(v, l)} L ${a(O, M)} L ${a(v, f)} Z`;
294
+ default:
295
+ return "";
296
+ }
297
+ }
298
+ const w = r + m * 0.3, S = l + $ * 0.3, k = r + m * 0.7, g = l + $ * 0.7;
299
+ switch (t) {
300
+ case "center":
301
+ return `M ${a(w, S)} L ${a(k, S)} L ${a(k, g)} L ${a(w, g)} Z`;
302
+ case "top":
303
+ return `M ${a(r, l)} L ${a(v, l)} L ${a(k, S)} L ${a(w, S)} Z`;
304
+ case "bottom":
305
+ return `M ${a(r, f)} L ${a(v, f)} L ${a(k, g)} L ${a(w, g)} Z`;
306
+ case "left":
307
+ return `M ${a(r, l)} L ${a(w, S)} L ${a(w, g)} L ${a(r, f)} Z`;
308
+ case "right":
309
+ return `M ${a(v, l)} L ${a(k, S)} L ${a(k, g)} L ${a(v, f)} Z`;
310
+ default:
311
+ return "";
312
+ }
313
+ }
314
+ const Ie = 5, Xe = 40, U = 4, q = 36, ot = 62;
315
+ function it(t, n, i = "default", r = "side") {
316
+ const l = t.arch === "upper" ? "top" : "bottom";
317
+ return `${n}/${r}/${i}/${l}/${Me(t)}.webp`;
318
+ }
319
+ function Zt(t, n = ot) {
320
+ const i = t === "primary" ? Ce : t === "mixed" ? [...Ae, ...Ce] : Ae, r = [], l = [];
321
+ for (const g of i)
322
+ F[g].arch === "upper" ? r.push(g) : l.push(g);
323
+ const m = q + Ie, $ = Math.max(r.length, l.length), v = $ > 0 ? $ * m - Ie : 0;
324
+ function f(g, O) {
325
+ const M = g.length > 0 ? g.length * m - Ie : 0, fe = (v - M) / 2;
326
+ return g.map((d, he) => {
327
+ const re = F[d];
328
+ return {
329
+ fdi: d,
330
+ meta: re,
331
+ x: fe + he * m,
332
+ y: O
333
+ };
334
+ });
335
+ }
336
+ const a = f(r, 0), w = f(l, n + Xe), S = v > 0 ? v : $ * m, k = n * 2 + Xe;
337
+ return { teeth: [...a, ...w], width: S, height: k };
338
+ }
339
+ function Je(t, n) {
340
+ switch (n) {
341
+ case "universal":
342
+ return jt[t] ?? t;
343
+ case "palmer":
344
+ return Ft[t] ?? t;
345
+ case "fdi":
346
+ default:
347
+ return t;
348
+ }
349
+ }
350
+ function mn() {
351
+ return {};
352
+ }
353
+ function et(t) {
354
+ const n = {};
355
+ for (const [i, r] of Object.entries(t))
356
+ !r || r.length === 0 || (n[i] = { conditions: r, surfaces: [] });
357
+ return n;
358
+ }
359
+ const Vt = Y(
360
+ [
361
+ "ds:tooth-scheme-alfadocs",
362
+ "ds:flex ds:flex-col",
363
+ "ds:gap-[var(--spacing-sm)]",
364
+ "ds:bg-[var(--background)] ds:text-[var(--foreground)]",
365
+ // Block-level flex column so the SVG's w-full can grow to fill the frame.
366
+ // min-w-fit on the SVG floors it at natural size, so narrow frames scroll
367
+ // here rather than shrinking the per-tooth hit target below the 44px floor.
368
+ "ds:max-w-full ds:overflow-x-auto",
369
+ // When the scroll container itself is the tab stop (display mode, see
370
+ // scrollTabIndex) it needs a focus ring. Use an outline (not box-shadow):
371
+ // forced-colors / high-contrast mode zeroes box-shadow, which would leave
372
+ // HCM keyboard users with no visible focus. outline survives, and the
373
+ // CanvasText fallback repaints it in the system palette.
374
+ "ds:outline-none",
375
+ "ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid",
376
+ "ds:focus-visible:outline-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]",
377
+ "ds:forced-colors:focus-visible:outline-[CanvasText]"
378
+ ].join(" ")
379
+ ), Yt = Y(
380
+ [
381
+ "ds:block",
382
+ "ds:w-full ds:min-w-fit ds:h-auto",
383
+ "ds:text-[var(--foreground)]"
384
+ ].join(" ")
385
+ ), zt = Y(
386
+ [
387
+ "ds:group ds:cursor-pointer",
388
+ "ds:focus:outline-none",
389
+ "ds:transition-[fill,stroke,opacity] ds:duration-[var(--animation-duration)]",
390
+ "ds:motion-reduce:transition-none"
391
+ ].join(" ")
392
+ ), Bt = Y(
393
+ [
394
+ "ds:flex ds:flex-wrap ds:items-center",
395
+ "ds:gap-[var(--spacing-sm)]",
396
+ "type-meta ds:text-[var(--muted-foreground)]"
397
+ ].join(" ")
398
+ ), Kt = Y(
399
+ ["ds:inline-flex ds:items-center", "ds:gap-[var(--spacing-xs)]"].join(" ")
400
+ ), Gt = Y(["ds:sr-only"].join(" ")), Qt = Y(
401
+ [
402
+ "ds:cursor-pointer ds:outline-none",
403
+ "ds:fill-transparent ds:stroke-transparent",
404
+ "ds:transition-[fill] ds:duration-[var(--animation-duration)]",
405
+ "ds:motion-reduce:transition-none",
406
+ "ds:hover:fill-[color-mix(in_srgb,var(--accent)_18%,transparent)]",
407
+ "ds:focus-visible:fill-[color-mix(in_srgb,var(--accent)_22%,transparent)]",
408
+ "ds:focus-visible:stroke-[var(--ring)]",
409
+ "ds:forced-colors:focus-visible:stroke-[CanvasText]"
410
+ ].join(" ")
411
+ );
412
+ function ke(t) {
413
+ return t.value !== void 0;
414
+ }
415
+ function le() {
416
+ return { conditions: [], surfaces: [] };
417
+ }
418
+ function tt(t, n) {
419
+ const i = t ?? [];
420
+ return n ? i.includes(n) ? i.filter((r) => r !== n) : [...i, n] : i.length === 0 ? ["caries"] : [];
421
+ }
422
+ function Xt(t, n, i) {
423
+ var l;
424
+ return i ? ((l = {
425
+ top: { ArrowDown: "center" },
426
+ bottom: { ArrowUp: "center" },
427
+ left: { ArrowRight: "center" },
428
+ right: { ArrowLeft: "center" },
429
+ center: {
430
+ ArrowUp: "top",
431
+ ArrowDown: "bottom",
432
+ ArrowLeft: "left",
433
+ ArrowRight: "right"
434
+ }
435
+ }[t]) == null ? void 0 : l[n]) ?? t : n === "ArrowUp" ? "top" : n === "ArrowDown" ? "bottom" : n === "ArrowLeft" ? "left" : n === "ArrowRight" ? "right" : t;
436
+ }
437
+ const Jt = [
438
+ "caries",
439
+ "filled",
440
+ "crowned",
441
+ "temporaryCrown",
442
+ "bridge",
443
+ "rootCanal",
444
+ "implant",
445
+ "implantExtraction",
446
+ "stub",
447
+ "destroyed",
448
+ "missing"
449
+ ];
450
+ function en({
451
+ condition: t,
452
+ assetBaseUrl: n
453
+ }) {
454
+ const i = F[16], r = De[t], l = t === "missing", m = t === "caries" || t === "filled", $ = 36 * 0.9, v = 62 * 0.9, f = (36 - $) / 2, a = (62 - v) / 2;
455
+ return /* @__PURE__ */ j(
456
+ "svg",
457
+ {
458
+ width: "22",
459
+ height: "38",
460
+ viewBox: "0 0 36 62",
461
+ "aria-hidden": "true",
462
+ className: "ds:block ds:shrink-0",
463
+ children: [
464
+ /* @__PURE__ */ u(
465
+ "image",
466
+ {
467
+ href: it(i, n),
468
+ x: f,
469
+ y: a,
470
+ width: $,
471
+ height: v,
472
+ preserveAspectRatio: "xMidYMid meet",
473
+ opacity: l ? 0.25 : 1
474
+ }
475
+ ),
476
+ r ? /* @__PURE__ */ u(
477
+ "image",
478
+ {
479
+ href: rt(i, n, r),
480
+ x: f,
481
+ y: a,
482
+ width: $,
483
+ height: v,
484
+ preserveAspectRatio: "xMidYMid meet"
485
+ }
486
+ ) : null,
487
+ m ? /* @__PURE__ */ u(
488
+ "rect",
489
+ {
490
+ x: 3,
491
+ y: 2,
492
+ width: 30,
493
+ height: 58,
494
+ fill: "none",
495
+ stroke: ue[t],
496
+ strokeWidth: 2,
497
+ strokeDasharray: t === "filled" ? "4 2" : void 0,
498
+ rx: 6
499
+ }
500
+ ) : null,
501
+ l ? /* @__PURE__ */ u(
502
+ "path",
503
+ {
504
+ d: "M7 9 L29 53 M29 9 L7 53",
505
+ stroke: ue.missing,
506
+ strokeWidth: 2,
507
+ fill: "none"
508
+ }
509
+ ) : null
510
+ ]
511
+ }
512
+ );
513
+ }
514
+ function tn({ assetBaseUrl: t }) {
515
+ const { t: n } = nt();
516
+ return /* @__PURE__ */ j(
517
+ "section",
518
+ {
519
+ "aria-label": n("toothScheme.legendLabel"),
520
+ "data-testid": "tooth-scheme-legend",
521
+ className: "ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:rounded-[var(--radius-md)] ds:bg-[var(--card)] ds:border ds:border-[color:var(--card-border)] ds:p-[var(--spacing-sm)] ds:shadow-[var(--shadow-card)] ds:[.theme-accessible_&]:border-2",
522
+ children: [
523
+ /* @__PURE__ */ u("span", { className: "type-eyebrow ds:text-[color:var(--muted-foreground)]", children: n("toothScheme.legendLabel") }),
524
+ /* @__PURE__ */ u("ul", { className: Bt(), children: Jt.map((i) => /* @__PURE__ */ j(
525
+ "li",
526
+ {
527
+ className: Kt(),
528
+ "data-condition": i,
529
+ "data-testid": `tooth-scheme-legend-item-${i}`,
530
+ children: [
531
+ /* @__PURE__ */ u(en, { condition: i, assetBaseUrl: t }),
532
+ /* @__PURE__ */ u("span", { children: n(`toothScheme.condition.${i}`) })
533
+ ]
534
+ },
535
+ i
536
+ )) })
537
+ ]
538
+ }
539
+ );
540
+ }
541
+ function Oe({
542
+ label: t,
543
+ value: n,
544
+ options: i,
545
+ onValueChange: r,
546
+ container: l
547
+ }) {
548
+ return /* @__PURE__ */ j("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]", children: [
549
+ /* @__PURE__ */ u(
550
+ "span",
551
+ {
552
+ "aria-hidden": "true",
553
+ className: "type-label ds:text-[color:var(--muted-foreground)]",
554
+ children: t
555
+ }
556
+ ),
557
+ /* @__PURE__ */ u(
558
+ kt,
559
+ {
560
+ size: "md",
561
+ "aria-label": t,
562
+ value: n,
563
+ options: i,
564
+ onValueChange: r,
565
+ container: l
566
+ }
567
+ )
568
+ ] });
569
+ }
570
+ const st = Tt(
571
+ ({
572
+ id: t,
573
+ dentition: n = "permanent",
574
+ numbering: i = "fdi",
575
+ mode: r = "interactive",
576
+ projection: l = "side",
577
+ value: m,
578
+ defaultValue: $,
579
+ onChange: v,
580
+ onSelect: f,
581
+ conditions: a,
582
+ activeCondition: w,
583
+ assetBaseUrl: S = "/toothscheme/teeth",
584
+ legend: k = !1,
585
+ controls: g = !1,
586
+ ariaLabel: O,
587
+ className: M
588
+ }, fe) => {
589
+ const { t: d } = nt(), [he, re] = H(n), [at, Ne] = H(i), [ct, Re] = H(l), [dt, _e] = H(k), [me, lt] = H(null), G = g ? he : n, Q = g ? at : i, Ee = g ? dt : k, oe = g ? ct : l, W = oe === "plan" ? "plan" : "side", je = oe === "both", Fe = de(g);
590
+ ne(() => {
591
+ g && !Fe.current && (re(n), Ne(i), Re(l), _e(k)), Fe.current = g;
592
+ }, [g, n, i, l, k]);
593
+ const [ut, He] = H(() => m !== void 0 ? m : $ !== void 0 ? $ : a ? et(a) : {}), p = ke({ value: m }) ? m : ut;
594
+ ne(() => {
595
+ ke({ value: m }) || a !== void 0 && He(et(a));
596
+ }, [a, m]);
597
+ const N = W === "plan" ? 44 : ot, X = Te(
598
+ () => Zt(G, N),
599
+ [G, N]
600
+ ), Z = Te(() => X.teeth.map((e) => e.fdi), [X]), pe = Z[0], [ie, z] = H(pe);
601
+ ne(() => {
602
+ (!ie || !Z.includes(ie)) && z(pe);
603
+ }, [pe, ie, Z]);
604
+ const [ft, B] = H(""), ge = de(null), A = E(
605
+ (e) => {
606
+ ke({ value: m }) || He(e), v == null || v(e);
607
+ },
608
+ [v, m]
609
+ ), R = E((e) => {
610
+ const o = ge.current;
611
+ if (!o) return;
612
+ const s = o.querySelector(`g[data-fdi="${e}"]`);
613
+ s && (s.focus(), z(e));
614
+ }, []), _ = W === "plan" && r === "interactive" && (w === "caries" || w === "filled"), [T, J] = H(null);
615
+ ne(() => {
616
+ (!_ || T && !Z.includes(T.fdi)) && J(null);
617
+ }, [_, T, Z]);
618
+ const qe = E((e, o) => {
619
+ var c;
620
+ const s = (c = ge.current) == null ? void 0 : c.querySelector(
621
+ `path[data-fdi="${e}"][data-zone="${o}"]`
622
+ );
623
+ s == null || s.focus();
624
+ }, []), ve = de(null);
625
+ ne(() => {
626
+ T ? qe(T.fdi, T.zone) : ve.current && R(ve.current.fdi), ve.current = T;
627
+ }, [T, qe, R]);
628
+ const ht = E(
629
+ (e, o) => {
630
+ const s = p[e];
631
+ return !!(s && s.surfaces.includes(o) && s.conditions.includes(w));
632
+ },
633
+ [p, w]
634
+ ), We = E(
635
+ (e, o) => {
636
+ o && o.conditions.length > 0 ? B(
637
+ d("toothScheme.selected", {
638
+ id: e,
639
+ conditions: o.conditions.map((s) => d(`toothScheme.condition.${s}`)).join(", ")
640
+ })
641
+ ) : B(d("toothScheme.deselected", { id: e }));
642
+ },
643
+ [d]
644
+ ), be = E(
645
+ (e, o) => {
646
+ if (!_) return;
647
+ const s = w, c = p[e] ?? le(), x = c.surfaces.includes(o), L = c.conditions.includes(s);
648
+ let b, y;
649
+ x && L ? (b = c.surfaces.filter((V) => V !== o), y = b.length === 0 ? c.conditions.filter((V) => V !== s) : c.conditions) : (b = x ? c.surfaces : [...c.surfaces, o], y = L ? c.conditions : [...c.conditions, s]);
650
+ const I = { ...p };
651
+ y.length === 0 && b.length === 0 ? delete I[e] : I[e] = { ...c, conditions: y, surfaces: b }, A(I), We(e, I[e]), f == null || f(e);
652
+ },
653
+ [
654
+ _,
655
+ w,
656
+ p,
657
+ A,
658
+ We,
659
+ f
660
+ ]
661
+ ), we = E((e) => {
662
+ const o = F[e];
663
+ o && (z(e), J({ fdi: e, zone: Le(o)[0] }));
664
+ }, []), mt = E(
665
+ (e, o, s) => {
666
+ const c = F[o];
667
+ if (c)
668
+ switch (e.key) {
669
+ case "ArrowUp":
670
+ case "ArrowDown":
671
+ case "ArrowLeft":
672
+ case "ArrowRight": {
673
+ e.preventDefault(), e.stopPropagation();
674
+ const x = Le(c).includes("center"), L = Xt(s, e.key, x);
675
+ L !== s && J({ fdi: o, zone: L });
676
+ return;
677
+ }
678
+ case " ":
679
+ case "Enter": {
680
+ e.preventDefault(), e.stopPropagation(), be(o, Ge(c, s));
681
+ return;
682
+ }
683
+ case "Escape": {
684
+ e.preventDefault(), e.stopPropagation(), J(null);
685
+ return;
686
+ }
687
+ default:
688
+ return;
689
+ }
690
+ },
691
+ [be]
692
+ ), pt = de(null), ye = Te(
693
+ () => ({
694
+ focusTooth: (e) => {
695
+ R(e);
696
+ },
697
+ getChart: () => p,
698
+ getTooth: (e) => {
699
+ var o;
700
+ return ((o = p[e]) == null ? void 0 : o.conditions) ?? [];
701
+ },
702
+ teethWith: (e) => Object.entries(p).filter(([, o]) => o.conditions.includes(e)).map(([o]) => o),
703
+ setFinding: (e, o, s) => {
704
+ const c = p[e] ?? le();
705
+ if (c.conditions.includes(o) && !s) return;
706
+ const x = {
707
+ ...p,
708
+ [e]: {
709
+ ...c,
710
+ conditions: c.conditions.includes(o) ? c.conditions : [...c.conditions, o],
711
+ surfaces: s ?? c.surfaces
712
+ }
713
+ };
714
+ A(x);
715
+ },
716
+ removeFinding: (e, o) => {
717
+ const s = p[e];
718
+ if (!s || !s.conditions.includes(o)) return;
719
+ const c = s.conditions.filter((L) => L !== o), x = { ...p };
720
+ c.length === 0 ? delete x[e] : x[e] = { ...s, conditions: c }, A(x);
721
+ },
722
+ clearTooth: (e) => {
723
+ if (!p[e]) return;
724
+ const o = { ...p };
725
+ delete o[e], A(o);
726
+ }
727
+ }),
728
+ [p, A, R]
729
+ );
730
+ St(fe, () => ye, [ye]), Lt(Ct, ye, t);
731
+ const gt = E(
732
+ (e, o) => {
733
+ var L;
734
+ if (r !== "interactive") return;
735
+ const s = F[o];
736
+ if (!s) return;
737
+ const c = Z, x = c.indexOf(o);
738
+ switch (e.key) {
739
+ case "ArrowRight": {
740
+ e.preventDefault();
741
+ const b = Math.min(c.length - 1, x + 1);
742
+ R(c[b]);
743
+ return;
744
+ }
745
+ case "ArrowLeft": {
746
+ e.preventDefault();
747
+ const b = Math.max(0, x - 1);
748
+ R(c[b]);
749
+ return;
750
+ }
751
+ case "ArrowUp":
752
+ case "ArrowDown": {
753
+ e.preventDefault();
754
+ const y = {
755
+ 1: 4,
756
+ 4: 1,
757
+ 2: 3,
758
+ 3: 2,
759
+ 5: 8,
760
+ 8: 5,
761
+ 6: 7,
762
+ 7: 6
763
+ }[s.quadrant];
764
+ if (!y) return;
765
+ const I = `${y}${s.positionInQuadrant}`;
766
+ c.includes(I) && R(I);
767
+ return;
768
+ }
769
+ case "Home": {
770
+ e.preventDefault();
771
+ const b = c.filter(
772
+ (y) => F[y].quadrant === s.quadrant
773
+ );
774
+ b.length > 0 && R(b[0]);
775
+ return;
776
+ }
777
+ case "End": {
778
+ e.preventDefault();
779
+ const b = c.filter(
780
+ (y) => F[y].quadrant === s.quadrant
781
+ );
782
+ b.length > 0 && R(b[b.length - 1]);
783
+ return;
784
+ }
785
+ case " ":
786
+ case "Enter": {
787
+ if (e.preventDefault(), _) {
788
+ we(o);
789
+ return;
790
+ }
791
+ const b = (L = p[o]) == null ? void 0 : L.conditions, y = tt(b, w), I = { ...p };
792
+ y.length === 0 ? (delete I[o], B(d("toothScheme.deselected", { id: o }))) : (I[o] = {
793
+ ...p[o] ?? le(),
794
+ conditions: y
795
+ }, B(
796
+ d("toothScheme.selected", {
797
+ id: o,
798
+ conditions: y.map((V) => d(`toothScheme.condition.${V}`)).join(", ")
799
+ })
800
+ )), A(I), f == null || f(o);
801
+ return;
802
+ }
803
+ default:
804
+ return;
805
+ }
806
+ },
807
+ [
808
+ w,
809
+ p,
810
+ A,
811
+ we,
812
+ R,
813
+ r,
814
+ f,
815
+ _,
816
+ d,
817
+ Z
818
+ ]
819
+ ), vt = E(
820
+ (e) => {
821
+ var x;
822
+ if (r !== "interactive") return;
823
+ z(e);
824
+ const o = (x = p[e]) == null ? void 0 : x.conditions, s = tt(o, w), c = { ...p };
825
+ s.length === 0 ? (delete c[e], B(d("toothScheme.deselected", { id: e }))) : (c[e] = {
826
+ ...p[e] ?? le(),
827
+ conditions: s
828
+ }, B(
829
+ d("toothScheme.selected", {
830
+ id: e,
831
+ conditions: s.map((L) => d(`toothScheme.condition.${L}`)).join(", ")
832
+ })
833
+ )), A(c), f == null || f(e);
834
+ },
835
+ [w, p, A, r, f, d]
836
+ ), Pe = X.width + 4, Ue = X.height + 4, xe = O ?? d("toothScheme.ariaLabel"), Ze = je ? `${xe} — ${d("toothScheme.view.side")}` : xe, bt = r === "interactive" ? void 0 : 0;
837
+ return /* @__PURE__ */ u(K.Provider, { delayDuration: 200, children: /* @__PURE__ */ j(
838
+ "div",
839
+ {
840
+ ref: pt,
841
+ role: "region",
842
+ "aria-label": Ze,
843
+ tabIndex: bt,
844
+ className: [Vt(), M].filter(Boolean).join(" "),
845
+ "data-component": "tooth-scheme",
846
+ "data-component-id": t,
847
+ "data-testid": "tooth-scheme-root",
848
+ "data-dentition": G,
849
+ "data-numbering": Q,
850
+ "data-mode": r,
851
+ "data-projection": W,
852
+ "data-view-mode": oe,
853
+ children: [
854
+ g ? /* @__PURE__ */ u(
855
+ "div",
856
+ {
857
+ className: "ds:flex ds:w-full ds:justify-end",
858
+ "data-testid": "tooth-scheme-controls",
859
+ children: /* @__PURE__ */ j(Se.Root, { children: [
860
+ /* @__PURE__ */ u(Se.Trigger, { asChild: !0, children: /* @__PURE__ */ u(
861
+ It,
862
+ {
863
+ size: "sm",
864
+ intent: "outline",
865
+ icon: /* @__PURE__ */ u(At, { "aria-hidden": "true" }),
866
+ "aria-label": d("toothScheme.options.label"),
867
+ tooltip: d("toothScheme.options.label")
868
+ }
869
+ ) }),
870
+ /* @__PURE__ */ u(
871
+ Se.Content,
872
+ {
873
+ ref: lt,
874
+ align: "end",
875
+ size: "md",
876
+ "aria-label": d("toothScheme.options.label"),
877
+ children: /* @__PURE__ */ j("div", { className: "ds:flex ds:w-[var(--popover-size-sm)] ds:max-w-full ds:flex-col ds:gap-[var(--spacing-md)]", children: [
878
+ /* @__PURE__ */ u("div", { className: "ds:flex ds:border-b ds:border-[color:var(--border)] ds:pb-[var(--spacing-sm)] ds:[&>*]:w-full ds:[&>*]:justify-between", children: /* @__PURE__ */ u(
879
+ Ot,
880
+ {
881
+ label: d("toothScheme.options.legend"),
882
+ labelSide: "start",
883
+ checked: Ee,
884
+ onCheckedChange: _e
885
+ }
886
+ ) }),
887
+ /* @__PURE__ */ u(
888
+ Oe,
889
+ {
890
+ container: me,
891
+ label: d("toothScheme.options.dentition"),
892
+ value: G,
893
+ onValueChange: (e) => re(e),
894
+ options: [
895
+ {
896
+ value: "permanent",
897
+ label: d("toothScheme.dentition.permanent")
898
+ },
899
+ {
900
+ value: "primary",
901
+ label: d("toothScheme.dentition.primary")
902
+ },
903
+ {
904
+ value: "mixed",
905
+ label: d("toothScheme.dentition.mixed")
906
+ }
907
+ ]
908
+ }
909
+ ),
910
+ /* @__PURE__ */ u(
911
+ Oe,
912
+ {
913
+ container: me,
914
+ label: d("toothScheme.options.numbering"),
915
+ value: Q,
916
+ onValueChange: (e) => Ne(e),
917
+ options: [
918
+ {
919
+ value: "fdi",
920
+ label: d("toothScheme.numbering.fdi")
921
+ },
922
+ {
923
+ value: "universal",
924
+ label: d("toothScheme.numbering.universal")
925
+ },
926
+ {
927
+ value: "palmer",
928
+ label: d("toothScheme.numbering.palmer")
929
+ }
930
+ ]
931
+ }
932
+ ),
933
+ /* @__PURE__ */ u(
934
+ Oe,
935
+ {
936
+ container: me,
937
+ label: d("toothScheme.options.view"),
938
+ value: oe,
939
+ onValueChange: (e) => Re(e),
940
+ options: [
941
+ {
942
+ value: "side",
943
+ label: d("toothScheme.view.side")
944
+ },
945
+ {
946
+ value: "plan",
947
+ label: d("toothScheme.view.occlusal")
948
+ },
949
+ {
950
+ value: "both",
951
+ label: d("toothScheme.view.both")
952
+ }
953
+ ]
954
+ }
955
+ )
956
+ ] })
957
+ }
958
+ )
959
+ ] })
960
+ }
961
+ ) : null,
962
+ /* @__PURE__ */ u(
963
+ "svg",
964
+ {
965
+ ref: ge,
966
+ viewBox: `0 0 ${Pe} ${Ue}`,
967
+ width: Pe,
968
+ height: Ue,
969
+ className: Yt(),
970
+ role: "group",
971
+ "aria-label": Ze,
972
+ focusable: "false",
973
+ "data-testid": "tooth-scheme-svg",
974
+ xmlns: "http://www.w3.org/2000/svg",
975
+ children: X.teeth.map((e) => {
976
+ var Ke;
977
+ const o = p[e.fdi], s = (Ke = o == null ? void 0 : o.conditions) == null ? void 0 : Ke[0], c = d(
978
+ `toothScheme.anatomy.${e.meta.anatomy}`
979
+ ), x = s ? `, ${d(`toothScheme.condition.${s}`)}` : "", L = d("toothScheme.toothLabel", {
980
+ id: Je(e.fdi, Q),
981
+ anatomy: c,
982
+ conditionSuffix: x
983
+ }), b = r === "interactive" ? T ? -1 : e.fdi === ie ? 0 : -1 : void 0, y = (o == null ? void 0 : o.conditions) ?? [], I = y.includes("missing"), V = y.map((h) => ({
984
+ condition: h,
985
+ spec: De[h]
986
+ })).filter(
987
+ (h) => !!h.spec
988
+ ), $e = y.find(
989
+ (h) => h !== "missing" && !De[h]
990
+ ), Ve = $e ? ue[$e] : void 0, wt = s ? `${c} · ${d(`toothScheme.condition.${s}`)}` : c, Ye = Je(e.fdi, Q), yt = it(
991
+ e.meta,
992
+ S,
993
+ "default",
994
+ W
995
+ ), xt = W === "plan" ? y.flatMap((h) => {
996
+ const D = Wt[h];
997
+ return D ? ((o == null ? void 0 : o.surfaces) ?? []).map((ce) => ({
998
+ key: `${h}-${ce}`,
999
+ url: Pt(
1000
+ e.meta,
1001
+ S,
1002
+ D,
1003
+ ce
1004
+ )
1005
+ })) : [];
1006
+ }) : [], ze = (e.meta.dentition === "primary" ? Ht : 1) * 0.9, ee = q * ze, te = N * ze, se = (q - ee) / 2, ae = (N - te) / 2, C = _ && (T == null ? void 0 : T.fdi) === e.fdi, Be = _ ? Le(e.meta) : [], $t = Be.includes("center");
1007
+ return /* @__PURE__ */ j(K.Root, { children: [
1008
+ /* @__PURE__ */ u(K.Trigger, { asChild: !0, children: /* @__PURE__ */ j(
1009
+ "g",
1010
+ {
1011
+ "data-fdi": e.fdi,
1012
+ "data-anatomy": e.meta.anatomy,
1013
+ "data-arch": e.meta.arch,
1014
+ "data-side": e.meta.side,
1015
+ "data-quadrant": e.meta.quadrant,
1016
+ "data-condition": s ?? "none",
1017
+ "data-testid": `tooth-${e.fdi}`,
1018
+ transform: `translate(${e.x}, ${e.y})`,
1019
+ tabIndex: b,
1020
+ role: C ? "group" : r === "interactive" ? "button" : "img",
1021
+ "aria-label": L,
1022
+ "aria-pressed": C ? void 0 : r === "interactive" ? s !== void 0 : void 0,
1023
+ className: zt(),
1024
+ onClick: C ? void 0 : r === "interactive" ? _ ? () => we(e.fdi) : () => vt(e.fdi) : void 0,
1025
+ onFocus: () => z(e.fdi),
1026
+ onKeyDown: C ? void 0 : (h) => gt(h, e.fdi),
1027
+ children: [
1028
+ /* @__PURE__ */ u(
1029
+ "rect",
1030
+ {
1031
+ x: -U,
1032
+ y: -U,
1033
+ width: q + U * 2,
1034
+ height: N + U * 2,
1035
+ fill: "transparent"
1036
+ }
1037
+ ),
1038
+ /* @__PURE__ */ u(
1039
+ "image",
1040
+ {
1041
+ href: yt,
1042
+ x: se,
1043
+ y: ae,
1044
+ width: ee,
1045
+ height: te,
1046
+ preserveAspectRatio: "xMidYMid meet",
1047
+ opacity: I ? 0.25 : 1,
1048
+ "aria-hidden": "true"
1049
+ }
1050
+ ),
1051
+ W === "side" ? V.map(({ condition: h, spec: D }) => /* @__PURE__ */ u(
1052
+ "image",
1053
+ {
1054
+ href: rt(
1055
+ e.meta,
1056
+ S,
1057
+ D
1058
+ ),
1059
+ x: se,
1060
+ y: ae,
1061
+ width: ee,
1062
+ height: te,
1063
+ preserveAspectRatio: "xMidYMid meet",
1064
+ "aria-hidden": "true",
1065
+ pointerEvents: "none"
1066
+ },
1067
+ h
1068
+ )) : null,
1069
+ W === "plan" ? xt.map(({ key: h, url: D }) => /* @__PURE__ */ u(
1070
+ "image",
1071
+ {
1072
+ href: D,
1073
+ x: se,
1074
+ y: ae,
1075
+ width: ee,
1076
+ height: te,
1077
+ preserveAspectRatio: "xMidYMid meet",
1078
+ "aria-hidden": "true",
1079
+ pointerEvents: "none"
1080
+ },
1081
+ h
1082
+ )) : null,
1083
+ _ ? Be.map((h) => {
1084
+ const D = Ge(e.meta, h), ce = ht(e.fdi, D);
1085
+ return /* @__PURE__ */ u(
1086
+ "path",
1087
+ {
1088
+ d: Ut(
1089
+ h,
1090
+ { x: se, y: ae, w: ee, h: te },
1091
+ $t
1092
+ ),
1093
+ "data-fdi": e.fdi,
1094
+ "data-zone": h,
1095
+ "data-surface": D,
1096
+ "data-testid": `tooth-${e.fdi}-zone-${h}`,
1097
+ role: C ? "button" : void 0,
1098
+ tabIndex: C ? (T == null ? void 0 : T.zone) === h ? 0 : -1 : void 0,
1099
+ "aria-label": C ? d("toothScheme.toothLabel", {
1100
+ id: Ye,
1101
+ anatomy: d(
1102
+ `toothScheme.surface.${D}`
1103
+ ),
1104
+ conditionSuffix: ""
1105
+ }) : void 0,
1106
+ "aria-pressed": C ? ce : void 0,
1107
+ strokeWidth: "var(--focus-ring-width)",
1108
+ className: Qt(),
1109
+ onClick: (P) => {
1110
+ P.stopPropagation(), C || z(e.fdi), be(e.fdi, D);
1111
+ },
1112
+ onKeyDown: C ? (P) => mt(
1113
+ P,
1114
+ e.fdi,
1115
+ h
1116
+ ) : void 0,
1117
+ onFocus: C ? () => J(
1118
+ (P) => P && P.fdi === e.fdi && P.zone === h ? P : { fdi: e.fdi, zone: h }
1119
+ ) : void 0
1120
+ },
1121
+ h
1122
+ );
1123
+ }) : null,
1124
+ W === "side" && Ve ? /* @__PURE__ */ u(
1125
+ "rect",
1126
+ {
1127
+ x: 3,
1128
+ y: 2,
1129
+ width: q - 6,
1130
+ height: N - 4,
1131
+ fill: "none",
1132
+ stroke: Ve,
1133
+ strokeWidth: "2",
1134
+ strokeDasharray: $e === "filled" ? "4 2" : void 0,
1135
+ rx: "6",
1136
+ pointerEvents: "none"
1137
+ }
1138
+ ) : null,
1139
+ I ? /* @__PURE__ */ u(
1140
+ "path",
1141
+ {
1142
+ d: `M7 9 L${q - 7} ${N - 9} M${q - 7} 9 L7 ${N - 9}`,
1143
+ stroke: ue.missing,
1144
+ strokeWidth: "2",
1145
+ fill: "none",
1146
+ pointerEvents: "none"
1147
+ }
1148
+ ) : null,
1149
+ /* @__PURE__ */ u(
1150
+ "rect",
1151
+ {
1152
+ x: -U,
1153
+ y: -U,
1154
+ width: q + U * 2,
1155
+ height: N + U * 2,
1156
+ fill: "none",
1157
+ stroke: "var(--ring)",
1158
+ strokeWidth: "var(--focus-ring-width)",
1159
+ className: [
1160
+ "ds:opacity-0",
1161
+ "ds:group-focus-visible:opacity-100",
1162
+ "ds:forced-colors:stroke-[CanvasText]"
1163
+ ].join(" "),
1164
+ "data-testid": `tooth-${e.fdi}-focus-ring`,
1165
+ pointerEvents: "none",
1166
+ rx: "4"
1167
+ }
1168
+ ),
1169
+ /* @__PURE__ */ u(
1170
+ "text",
1171
+ {
1172
+ x: q / 2,
1173
+ y: e.meta.arch === "upper" ? N + 12 : -4,
1174
+ textAnchor: "middle",
1175
+ fontSize: "10",
1176
+ fill: "var(--muted-foreground)",
1177
+ className: "ds:select-none",
1178
+ "aria-hidden": "true",
1179
+ children: Ye
1180
+ }
1181
+ )
1182
+ ]
1183
+ }
1184
+ ) }),
1185
+ /* @__PURE__ */ u(K.Portal, { children: /* @__PURE__ */ j(
1186
+ K.Content,
1187
+ {
1188
+ side: "top",
1189
+ sideOffset: 6,
1190
+ className: "ds:z-[var(--z-tooltip)] ds:rounded-[var(--radius-sm)] ds:bg-[var(--foreground)] ds:text-[var(--background)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds:pt-[calc(var(--spacing-xs)/2)] ds:pb-[calc(var(--spacing-xs)/2)] ds:text-[length:var(--font-size-xs)]",
1191
+ children: [
1192
+ wt,
1193
+ /* @__PURE__ */ u(K.Arrow, { className: "ds:fill-[var(--foreground)]" })
1194
+ ]
1195
+ }
1196
+ ) })
1197
+ ] }, e.fdi);
1198
+ })
1199
+ }
1200
+ ),
1201
+ je ? /* @__PURE__ */ u(
1202
+ st,
1203
+ {
1204
+ projection: "plan",
1205
+ dentition: G,
1206
+ numbering: Q,
1207
+ mode: r,
1208
+ value: p,
1209
+ onChange: A,
1210
+ activeCondition: w,
1211
+ assetBaseUrl: S,
1212
+ ariaLabel: `${xe} — ${d("toothScheme.view.occlusal")}`
1213
+ }
1214
+ ) : null,
1215
+ Ee ? /* @__PURE__ */ u(tn, { assetBaseUrl: S }) : null,
1216
+ /* @__PURE__ */ u(
1217
+ "div",
1218
+ {
1219
+ className: Gt(),
1220
+ "aria-live": "polite",
1221
+ "aria-atomic": "true",
1222
+ "data-testid": "tooth-scheme-live",
1223
+ children: ft
1224
+ }
1225
+ )
1226
+ ]
1227
+ }
1228
+ ) });
1229
+ }
1230
+ );
1231
+ st.displayName = "ToothScheme";
1232
+ export {
1233
+ ue as C,
1234
+ F,
1235
+ Ae as P,
1236
+ qt as S,
1237
+ st as T,
1238
+ Wt as a,
1239
+ De as b,
1240
+ hn as c,
1241
+ Ft as d,
1242
+ jt as e,
1243
+ Ce as f,
1244
+ et as g,
1245
+ rt as h,
1246
+ mn as i,
1247
+ Zt as j,
1248
+ Ct as k,
1249
+ Je as l,
1250
+ Ge as m,
1251
+ Le as n,
1252
+ Vt as r,
1253
+ Pt as s,
1254
+ it as t,
1255
+ Ut as z
1256
+ };
1257
+ //# sourceMappingURL=tooth-scheme-BIx1O2aJ.js.map