@alfadocs/ui-kit-debug 1.4.13 → 1.4.14

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 (201) hide show
  1. package/dist/_chunks/{address-fields-D-8akw2m.js → address-fields-CZP4Wncx.js} +2 -2
  2. package/dist/_chunks/{address-fields-D-8akw2m.js.map → address-fields-CZP4Wncx.js.map} +1 -1
  3. package/dist/_chunks/{agenda-card-BQDs2ZMp.js → agenda-card-pdN49pMu.js} +2 -2
  4. package/dist/_chunks/{agenda-card-BQDs2ZMp.js.map → agenda-card-pdN49pMu.js.map} +1 -1
  5. package/dist/_chunks/{agenda-tray-BTyWsVwT.js → agenda-tray-CYR-znfE.js} +2 -2
  6. package/dist/_chunks/{agenda-tray-BTyWsVwT.js.map → agenda-tray-CYR-znfE.js.map} +1 -1
  7. package/dist/_chunks/{ai-consent-banner-gVcoiXxv.js → ai-consent-banner-DLF6FNXv.js} +2 -2
  8. package/dist/_chunks/{ai-consent-banner-gVcoiXxv.js.map → ai-consent-banner-DLF6FNXv.js.map} +1 -1
  9. package/dist/_chunks/{anamnesis-card-Bt0twrML.js → anamnesis-card-BylMLHYj.js} +2 -2
  10. package/dist/_chunks/{anamnesis-card-Bt0twrML.js.map → anamnesis-card-BylMLHYj.js.map} +1 -1
  11. package/dist/_chunks/{anamnesis-summary-card-BKGVcwny.js → anamnesis-summary-card-DGVKBQoq.js} +134 -116
  12. package/dist/_chunks/anamnesis-summary-card-DGVKBQoq.js.map +1 -0
  13. package/dist/_chunks/{anamnesis-summary-rows-B5MAYkJ-.js → anamnesis-summary-rows-C73SWVy3.js} +3034 -2954
  14. package/dist/_chunks/anamnesis-summary-rows-C73SWVy3.js.map +1 -0
  15. package/dist/_chunks/{antenatal-schedule-timeline-BSLrOQ3S.js → antenatal-schedule-timeline-BjlF2rTz.js} +2 -2
  16. package/dist/_chunks/{antenatal-schedule-timeline-BSLrOQ3S.js.map → antenatal-schedule-timeline-BjlF2rTz.js.map} +1 -1
  17. package/dist/_chunks/{appointment-card-kcUC7vWR.js → appointment-card-BhcPJpXh.js} +2 -2
  18. package/dist/_chunks/{appointment-card-kcUC7vWR.js.map → appointment-card-BhcPJpXh.js.map} +1 -1
  19. package/dist/_chunks/{appointment-timeline-BC3dlZu5.js → appointment-timeline-DT1uFp8z.js} +2 -2
  20. package/dist/_chunks/{appointment-timeline-BC3dlZu5.js.map → appointment-timeline-DT1uFp8z.js.map} +1 -1
  21. package/dist/_chunks/{appointment-tray-BPY5rATW.js → appointment-tray-DvyVK7um.js} +2 -2
  22. package/dist/_chunks/{appointment-tray-BPY5rATW.js.map → appointment-tray-DvyVK7um.js.map} +1 -1
  23. package/dist/_chunks/{badge-CIt-UFEx.js → badge-sTusUqZD.js} +23 -18
  24. package/dist/_chunks/{badge-CIt-UFEx.js.map → badge-sTusUqZD.js.map} +1 -1
  25. package/dist/_chunks/{bishop-score-B6iYYO0c.js → bishop-score-BV1JAEMV.js} +3 -3
  26. package/dist/_chunks/{bishop-score-B6iYYO0c.js.map → bishop-score-BV1JAEMV.js.map} +1 -1
  27. package/dist/_chunks/{bmi-calculator-DC5SaqXT.js → bmi-calculator-CdR-RLFj.js} +5 -5
  28. package/dist/_chunks/{bmi-calculator-DC5SaqXT.js.map → bmi-calculator-CdR-RLFj.js.map} +1 -1
  29. package/dist/_chunks/{booking-CmHX15dh.js → booking-CGKof8QU.js} +2 -2
  30. package/dist/_chunks/{booking-CmHX15dh.js.map → booking-CGKof8QU.js.map} +1 -1
  31. package/dist/_chunks/{care-plan-card-9tLgsDYY.js → care-plan-card-C83Hb9EE.js} +3 -3
  32. package/dist/_chunks/{care-plan-card-9tLgsDYY.js.map → care-plan-card-C83Hb9EE.js.map} +1 -1
  33. package/dist/_chunks/{care-plan-entry-card-CSan4h7A.js → care-plan-entry-card-CHMPSTCz.js} +2 -2
  34. package/dist/_chunks/{care-plan-entry-card-CSan4h7A.js.map → care-plan-entry-card-CHMPSTCz.js.map} +1 -1
  35. package/dist/_chunks/{care-plan-header-D_BTi77b.js → care-plan-header-_B0TTWT1.js} +2 -2
  36. package/dist/_chunks/{care-plan-header-D_BTi77b.js.map → care-plan-header-_B0TTWT1.js.map} +1 -1
  37. package/dist/_chunks/{clinical-note-card-ByzQ86uz.js → clinical-note-card-BBgFd2nB.js} +2 -2
  38. package/dist/_chunks/{clinical-note-card-ByzQ86uz.js.map → clinical-note-card-BBgFd2nB.js.map} +1 -1
  39. package/dist/_chunks/{connection-status-D8mZ4klk.js → connection-status-NT8hUtYl.js} +2 -2
  40. package/dist/_chunks/{connection-status-D8mZ4klk.js.map → connection-status-NT8hUtYl.js.map} +1 -1
  41. package/dist/_chunks/{contact-profile-card-DuW6VpzY.js → contact-profile-card-BxHiG8e6.js} +2 -2
  42. package/dist/_chunks/{contact-profile-card-DuW6VpzY.js.map → contact-profile-card-BxHiG8e6.js.map} +1 -1
  43. package/dist/_chunks/{cycle-calculator-B_NlctlQ.js → cycle-calculator-DJZYvNhw.js} +4 -4
  44. package/dist/_chunks/{cycle-calculator-B_NlctlQ.js.map → cycle-calculator-DJZYvNhw.js.map} +1 -1
  45. package/dist/_chunks/{dependent-selector-BUvrZRi0.js → dependent-selector-cJlJFAKD.js} +2 -2
  46. package/dist/_chunks/{dependent-selector-BUvrZRi0.js.map → dependent-selector-cJlJFAKD.js.map} +1 -1
  47. package/dist/_chunks/{document-preview-Di15VrpQ.js → document-preview-Aae2yKvY.js} +2 -2
  48. package/dist/_chunks/{document-preview-Di15VrpQ.js.map → document-preview-Aae2yKvY.js.map} +1 -1
  49. package/dist/_chunks/{due-date-calculator-le1z3KpW.js → due-date-calculator-ajaQ4ya5.js} +6 -6
  50. package/dist/_chunks/{due-date-calculator-le1z3KpW.js.map → due-date-calculator-ajaQ4ya5.js.map} +1 -1
  51. package/dist/_chunks/{fetal-weight-DXA6ZpMq.js → fetal-weight-jon6GIfQ.js} +4 -4
  52. package/dist/_chunks/{fetal-weight-DXA6ZpMq.js.map → fetal-weight-jon6GIfQ.js.map} +1 -1
  53. package/dist/_chunks/{field-value-BCFLVBmu.js → field-value-BbiDRyNh.js} +2 -2
  54. package/dist/_chunks/{field-value-BCFLVBmu.js.map → field-value-BbiDRyNh.js.map} +1 -1
  55. package/dist/_chunks/{file-manager-BjCM2fZB.js → file-manager-CML_C6_h.js} +2 -2
  56. package/dist/_chunks/{file-manager-BjCM2fZB.js.map → file-manager-CML_C6_h.js.map} +1 -1
  57. package/dist/_chunks/form-field-CahJzTxp.js +131 -0
  58. package/dist/_chunks/form-field-CahJzTxp.js.map +1 -0
  59. package/dist/_chunks/{gestational-age-calculator-Ch8vmJAl.js → gestational-age-calculator-dEpQDWcb.js} +5 -5
  60. package/dist/_chunks/{gestational-age-calculator-Ch8vmJAl.js.map → gestational-age-calculator-dEpQDWcb.js.map} +1 -1
  61. package/dist/_chunks/{hcg-doubling-BT6lki_i.js → hcg-doubling-CC6TLtHd.js} +4 -4
  62. package/dist/_chunks/{hcg-doubling-BT6lki_i.js.map → hcg-doubling-CC6TLtHd.js.map} +1 -1
  63. package/dist/_chunks/{link-cell-renderer-C7GvyK66.js → link-cell-renderer-D3IsW_2R.js} +3 -3
  64. package/dist/_chunks/{link-cell-renderer-C7GvyK66.js.map → link-cell-renderer-D3IsW_2R.js.map} +1 -1
  65. package/dist/_chunks/{marketplace-app-shell-BhRH7Zi4.js → marketplace-app-shell-b5hN-Q0m.js} +2 -2
  66. package/dist/_chunks/{marketplace-app-shell-BhRH7Zi4.js.map → marketplace-app-shell-b5hN-Q0m.js.map} +1 -1
  67. package/dist/_chunks/{notes-panel-Bz83SO4-.js → notes-panel-D6HKLLS-.js} +2 -2
  68. package/dist/_chunks/{notes-panel-Bz83SO4-.js.map → notes-panel-D6HKLLS-.js.map} +1 -1
  69. package/dist/_chunks/{number-input-CM1q9zvH.js → number-input-Cgu2TtA8.js} +30 -21
  70. package/dist/_chunks/number-input-Cgu2TtA8.js.map +1 -0
  71. package/dist/_chunks/{operator-hero-CpJkDNAM.js → operator-hero-CCDnIa1S.js} +2 -2
  72. package/dist/_chunks/{operator-hero-CpJkDNAM.js.map → operator-hero-CCDnIa1S.js.map} +1 -1
  73. package/dist/_chunks/{optical-prescription-CQR_WJiS.js → optical-prescription-DtzEqFQm.js} +2 -2
  74. package/dist/_chunks/{optical-prescription-CQR_WJiS.js.map → optical-prescription-DtzEqFQm.js.map} +1 -1
  75. package/dist/_chunks/{patient-details-CnFgF3MU.js → patient-details-rENrE_qY.js} +3 -3
  76. package/dist/_chunks/{patient-details-CnFgF3MU.js.map → patient-details-rENrE_qY.js.map} +1 -1
  77. package/dist/_chunks/{patient-summary-card-DfbOtOV6.js → patient-summary-card-DQJgOOrA.js} +3 -3
  78. package/dist/_chunks/{patient-summary-card-DfbOtOV6.js.map → patient-summary-card-DQJgOOrA.js.map} +1 -1
  79. package/dist/_chunks/{patient-table-BXzcrC79.js → patient-table-BubxfOWL.js} +3 -3
  80. package/dist/_chunks/{patient-table-BXzcrC79.js.map → patient-table-BubxfOWL.js.map} +1 -1
  81. package/dist/_chunks/{payment-automation-upsell-Ckh3b7Xx.js → payment-automation-upsell-CnaBPt5e.js} +2 -2
  82. package/dist/_chunks/{payment-automation-upsell-Ckh3b7Xx.js.map → payment-automation-upsell-CnaBPt5e.js.map} +1 -1
  83. package/dist/_chunks/{payment-request-card-Dn6-tH-D.js → payment-request-card-CvhDzDNk.js} +2 -2
  84. package/dist/_chunks/{payment-request-card-Dn6-tH-D.js.map → payment-request-card-CvhDzDNk.js.map} +1 -1
  85. package/dist/_chunks/{periodontal-chart-B0yko9Xm.js → periodontal-chart-brakjj0s.js} +2 -2
  86. package/dist/_chunks/{periodontal-chart-B0yko9Xm.js.map → periodontal-chart-brakjj0s.js.map} +1 -1
  87. package/dist/_chunks/{periodontal-chart-card-HbYTmWlo.js → periodontal-chart-card-Bz-ebteE.js} +2 -2
  88. package/dist/_chunks/{periodontal-chart-card-HbYTmWlo.js.map → periodontal-chart-card-Bz-ebteE.js.map} +1 -1
  89. package/dist/_chunks/{periodontal-diagnosis-Qk4F3Wc_.js → periodontal-diagnosis-HrFsVi-C.js} +3 -3
  90. package/dist/_chunks/{periodontal-diagnosis-Qk4F3Wc_.js.map → periodontal-diagnosis-HrFsVi-C.js.map} +1 -1
  91. package/dist/_chunks/{periodontal-risk-chart-ByKuM4cF.js → periodontal-risk-chart-0x7KVZjL.js} +2 -2
  92. package/dist/_chunks/{periodontal-risk-chart-ByKuM4cF.js.map → periodontal-risk-chart-0x7KVZjL.js.map} +1 -1
  93. package/dist/_chunks/{practice-results-C5exrEn0.js → practice-results-DWUZRm2x.js} +2 -2
  94. package/dist/_chunks/{practice-results-C5exrEn0.js.map → practice-results-DWUZRm2x.js.map} +1 -1
  95. package/dist/_chunks/{pregnancy-dating-4tPV_Yko.js → pregnancy-dating-DQVpFs_f.js} +6 -6
  96. package/dist/_chunks/{pregnancy-dating-4tPV_Yko.js.map → pregnancy-dating-DQVpFs_f.js.map} +1 -1
  97. package/dist/_chunks/{pregnancy-weight-gain-BBgbWBGe.js → pregnancy-weight-gain-hm3QJALe.js} +5 -5
  98. package/dist/_chunks/{pregnancy-weight-gain-BBgbWBGe.js.map → pregnancy-weight-gain-hm3QJALe.js.map} +1 -1
  99. package/dist/_chunks/radio-group-rXDJADzW.js +175 -0
  100. package/dist/_chunks/radio-group-rXDJADzW.js.map +1 -0
  101. package/dist/_chunks/{radiograph-panel.agent-Drj0hYVV.js → radiograph-panel.agent-CAXFgCyn.js} +3 -3
  102. package/dist/_chunks/{radiograph-panel.agent-Drj0hYVV.js.map → radiograph-panel.agent-CAXFgCyn.js.map} +1 -1
  103. package/dist/_chunks/{signature-status-chip-DlLJk1VA.js → signature-status-chip-DqrPIJtH.js} +2 -2
  104. package/dist/_chunks/{signature-status-chip-DlLJk1VA.js.map → signature-status-chip-DqrPIJtH.js.map} +1 -1
  105. package/dist/_chunks/{tab-bar-Ddp_ZbnL.js → tab-bar-DvFJIQfL.js} +2 -2
  106. package/dist/_chunks/{tab-bar-Ddp_ZbnL.js.map → tab-bar-DvFJIQfL.js.map} +1 -1
  107. package/dist/_chunks/{tasks-panel-T7vaKJcA.js → tasks-panel-BBkZuejF.js} +2 -2
  108. package/dist/_chunks/{tasks-panel-T7vaKJcA.js.map → tasks-panel-BBkZuejF.js.map} +1 -1
  109. package/dist/_chunks/{unit-converter-Dsk__pjA.js → unit-converter-iDxlxKmm.js} +3 -3
  110. package/dist/_chunks/{unit-converter-Dsk__pjA.js.map → unit-converter-iDxlxKmm.js.map} +1 -1
  111. package/dist/_chunks/{widget-picker-DqMbjQy_.js → widget-picker-em4xGgv0.js} +2 -2
  112. package/dist/_chunks/{widget-picker-DqMbjQy_.js.map → widget-picker-em4xGgv0.js.map} +1 -1
  113. package/dist/_chunks/{workflow-map-BNBeG2zn.js → workflow-map-BVofnDYh.js} +2 -2
  114. package/dist/_chunks/{workflow-map-BNBeG2zn.js.map → workflow-map-BVofnDYh.js.map} +1 -1
  115. package/dist/agent-catalog.json +1 -1
  116. package/dist/components/address-fields/index.js +1 -1
  117. package/dist/components/agenda-card/index.js +1 -1
  118. package/dist/components/agenda-tray/index.js +1 -1
  119. package/dist/components/ai-consent-banner/index.js +1 -1
  120. package/dist/components/anamnesis-card/index.js +1 -1
  121. package/dist/components/anamnesis-summary-card/anamnesis-summary-card.d.ts +2 -2
  122. package/dist/components/anamnesis-summary-card/anamnesis-summary-card.d.ts.map +1 -1
  123. package/dist/components/anamnesis-summary-card/index.js +1 -1
  124. package/dist/components/appointment-card/index.js +2 -2
  125. package/dist/components/appointment-timeline/index.js +1 -1
  126. package/dist/components/badge/badge.d.ts.map +1 -1
  127. package/dist/components/badge/index.js +1 -1
  128. package/dist/components/bishop-score/index.js +1 -1
  129. package/dist/components/bmi-calculator/index.js +1 -1
  130. package/dist/components/booking/index.js +1 -1
  131. package/dist/components/care-plan-card/index.js +1 -1
  132. package/dist/components/care-plan-entry-card/index.js +1 -1
  133. package/dist/components/care-plan-header/index.js +1 -1
  134. package/dist/components/clinical-note-card/index.js +1 -1
  135. package/dist/components/connection-status/index.js +1 -1
  136. package/dist/components/contact-profile-card/index.js +1 -1
  137. package/dist/components/cycle-calculator/index.js +1 -1
  138. package/dist/components/data-table/index.js +1 -1
  139. package/dist/components/dependent-selector/index.js +1 -1
  140. package/dist/components/document-preview/index.js +1 -1
  141. package/dist/components/due-date-calculator/index.js +2 -2
  142. package/dist/components/fetal-weight/index.js +1 -1
  143. package/dist/components/file-manager/index.js +1 -1
  144. package/dist/components/form-field/form-field.d.ts +8 -0
  145. package/dist/components/form-field/form-field.d.ts.map +1 -1
  146. package/dist/components/form-field/index.js +1 -1
  147. package/dist/components/gestational-age-calculator/index.js +1 -1
  148. package/dist/components/hcg-doubling/index.js +1 -1
  149. package/dist/components/notes-panel/index.js +1 -1
  150. package/dist/components/number-input/index.js +1 -1
  151. package/dist/components/number-input/number-input.d.ts +5 -2
  152. package/dist/components/number-input/number-input.d.ts.map +1 -1
  153. package/dist/components/operator-hero/index.js +1 -1
  154. package/dist/components/optical-prescription/index.js +1 -1
  155. package/dist/components/patient-details/index.js +1 -1
  156. package/dist/components/patient-summary-card/index.js +1 -1
  157. package/dist/components/patient-table/index.js +1 -1
  158. package/dist/components/payment-card/index.js +1 -1
  159. package/dist/components/periodontal-chart/index.js +1 -1
  160. package/dist/components/periodontal-chart-card/index.js +1 -1
  161. package/dist/components/periodontal-diagnosis/index.js +1 -1
  162. package/dist/components/periodontal-risk-chart/index.js +1 -1
  163. package/dist/components/practice-results/index.js +1 -1
  164. package/dist/components/pregnancy-dating/index.js +1 -1
  165. package/dist/components/pregnancy-weight-gain/index.js +1 -1
  166. package/dist/components/radio-group/index.js +1 -1
  167. package/dist/components/radio-group/radio-group.d.ts +5 -0
  168. package/dist/components/radio-group/radio-group.d.ts.map +1 -1
  169. package/dist/components/radiograph-panel/index.js +1 -1
  170. package/dist/components/signature-status-chip/index.js +1 -1
  171. package/dist/components/tab-bar/index.js +1 -1
  172. package/dist/components/tasks-panel/index.js +1 -1
  173. package/dist/components/unit-converter/index.js +1 -1
  174. package/dist/components/widget-picker/index.js +1 -1
  175. package/dist/components/workflow/index.js +1 -1
  176. package/dist/host-compat.css +4 -1
  177. package/dist/index.js +56 -56
  178. package/dist/patterns/anamnesis/anamnesis-evolution.d.ts +7 -1
  179. package/dist/patterns/anamnesis/anamnesis-evolution.d.ts.map +1 -1
  180. package/dist/patterns/anamnesis/anamnesis-field.d.ts +15 -1
  181. package/dist/patterns/anamnesis/anamnesis-field.d.ts.map +1 -1
  182. package/dist/patterns/anamnesis/anamnesis-i18n.d.ts.map +1 -1
  183. package/dist/patterns/anamnesis/anamnesis-indicators.d.ts +3 -1
  184. package/dist/patterns/anamnesis/anamnesis-indicators.d.ts.map +1 -1
  185. package/dist/patterns/anamnesis/anamnesis-intake.d.ts +3 -2
  186. package/dist/patterns/anamnesis/anamnesis-intake.d.ts.map +1 -1
  187. package/dist/patterns/anamnesis/anamnesis-questionnaire.d.ts.map +1 -1
  188. package/dist/patterns/anamnesis/anamnesis-types.d.ts +3 -0
  189. package/dist/patterns/anamnesis/anamnesis-types.d.ts.map +1 -1
  190. package/dist/patterns/anamnesis/index.js +1 -1
  191. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  192. package/dist/patterns/payment-automation-upsell/index.js +1 -1
  193. package/dist/tokens.css +3 -3
  194. package/package.json +1 -1
  195. package/dist/_chunks/anamnesis-summary-card-BKGVcwny.js.map +0 -1
  196. package/dist/_chunks/anamnesis-summary-rows-B5MAYkJ-.js.map +0 -1
  197. package/dist/_chunks/form-field-D1oqYisL.js +0 -127
  198. package/dist/_chunks/form-field-D1oqYisL.js.map +0 -1
  199. package/dist/_chunks/number-input-CM1q9zvH.js.map +0 -1
  200. package/dist/_chunks/radio-group-BmIqhIT2.js +0 -171
  201. package/dist/_chunks/radio-group-BmIqhIT2.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"bishop-score-B6iYYO0c.js","sources":["../../src/components/bishop-score/bishop-score.agent.ts","../../src/components/bishop-score/bishop.ts","../../src/components/bishop-score/bishop-score.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — BishopScore. */\n/* */\n/* Cervical-favourability calculator. The agent-relevant surface is the */\n/* read-only computed result (total + band) plus the five enumerated */\n/* findings, and `set_value` actions to drive each finding. NO patient */\n/* identity is ever exposed — only the structural exam findings and the */\n/* derived score. The handle is the curated `BishopScoreHandle`, never */\n/* React state. See `src/docs/26-agent-readiness.mdx`. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { BishopScoreHandle } from './bishop-score';\nimport type { BishopComponent } from './bishop';\n\n/**\n * Enumerated finding ids, mirrored from `./bishop`'s `BISHOP_COMPONENTS`.\n * Inlined as a literal (rather than runtime-imported) so the ESM catalog\n * build can load this pure module without TS path resolution. The `satisfies`\n * keeps it in lockstep with the `BishopComponent` union at compile time.\n */\nconst COMPONENT_IDS = [\n 'dilation',\n 'effacement',\n 'station',\n 'consistency',\n 'position',\n] as const satisfies readonly BishopComponent[];\n\nexport const bishopScoreAgent: AgentAdapter<BishopScoreHandle> = {\n id: 'bishop-score',\n capabilities: ['set_value'],\n state: {\n selection: {\n type: 'Partial<Record<BishopComponent, string>>',\n descriptionKey: 'ui.agent.bishopScore.state.selection',\n description:\n 'The five cervical-exam findings keyed by component (dilation, effacement, station, consistency, position). Each value is an enumerated option key, not free text.',\n read: (handle) => handle.getSelection(),\n },\n result: {\n type: '{ total: number, band: string } | null',\n descriptionKey: 'ui.agent.bishopScore.state.result',\n description:\n 'Computed Bishop result — total (0–13) and favourability band (unfavourable / intermediate / favourable). Null until all five findings are set.',\n read: (handle) => handle.getResult(),\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ component: BishopComponent, value: string }',\n argsSchema: {\n type: 'object',\n properties: {\n component: {\n enum: [...COMPONENT_IDS],\n description: 'Which cervical-exam finding to set.',\n },\n value: {\n type: 'string',\n description:\n 'Enumerated option key for that finding (e.g. dilation \"closed\" | \"1-2\" | \"3-4\" | \"5+\").',\n },\n },\n required: ['component', 'value'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.bishopScore.actions.setValue',\n description:\n 'Set one cervical-exam finding to an enumerated option value. Unknown component/value pairs are ignored.',\n examples: [\n {\n args: { component: 'dilation', value: '3-4' },\n note: 'Record cervical dilation of 3–4 cm (2 points).',\n },\n ],\n invoke: (handle, args: { component: BishopComponent; value: string }) => {\n handle.setComponent(args.component, args.value);\n },\n },\n reset: {\n safety: 'write',\n idempotent: true,\n descriptionKey: 'ui.agent.bishopScore.actions.reset',\n description: 'Clear all five findings and the computed result.',\n invoke: (handle) => {\n handle.reset();\n },\n },\n get_result: {\n safety: 'read',\n returns: '{ total: number, band: string } | null',\n returnsSchema: {\n oneOf: [\n {\n type: 'object',\n properties: {\n total: { type: 'integer', minimum: 0, maximum: 13 },\n band: {\n enum: ['unfavourable', 'intermediate', 'favourable'],\n },\n },\n required: ['total', 'band'],\n },\n { type: 'null' },\n ],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.bishopScore.actions.getResult',\n description:\n 'Return the computed Bishop result, or null until all five findings are set.',\n invoke: (handle) => handle.getResult(),\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'bishop-score',\n description: 'Marks the BishopScore calculator wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific calculator instance.',\n },\n },\n};\n","/* ------------------------------------------------------------------ */\n/* Bishop score — cervical favourability for induction of labour. */\n/* */\n/* Pure, framework-free, unit-testable. Five components scored 0–3 */\n/* (dilation, effacement, station) or 0–2 (consistency, position), */\n/* summed to a 0–13 total. Bands per ACOG: ≤6 unfavourable (cervical */\n/* ripening advised), 7 intermediate, ≥8 favourable. */\n/* */\n/* Bishop EH, Obstet Gynecol 1964; thresholds per ACOG Practice */\n/* Bulletin 107 (Induction of Labor). */\n/* ------------------------------------------------------------------ */\n\nexport type BishopComponent =\n | 'dilation'\n | 'effacement'\n | 'station'\n | 'consistency'\n | 'position';\n\n/** The component fields in the order they are scored / displayed. */\nexport const BISHOP_COMPONENTS: readonly BishopComponent[] = [\n 'dilation',\n 'effacement',\n 'station',\n 'consistency',\n 'position',\n] as const;\n\nexport interface BishopOption {\n /** Stable value key → i18n lookup `bishopScore.<component>.<value>`. */\n value: string;\n /** Points this option contributes. */\n score: number;\n}\n\n/**\n * Scored options per component. Dilation / effacement / station run 0–3;\n * consistency / position run 0–2 (the classic Bishop weighting).\n */\nexport const BISHOP_OPTIONS: Record<BishopComponent, BishopOption[]> = {\n dilation: [\n { value: 'closed', score: 0 },\n { value: '1-2', score: 1 },\n { value: '3-4', score: 2 },\n { value: '5+', score: 3 },\n ],\n effacement: [\n { value: '0-30', score: 0 },\n { value: '40-50', score: 1 },\n { value: '60-70', score: 2 },\n { value: '80+', score: 3 },\n ],\n station: [\n { value: '-3', score: 0 },\n { value: '-2', score: 1 },\n { value: '-1-0', score: 2 },\n { value: '+1+2', score: 3 },\n ],\n consistency: [\n { value: 'firm', score: 0 },\n { value: 'medium', score: 1 },\n { value: 'soft', score: 2 },\n ],\n position: [\n { value: 'posterior', score: 0 },\n { value: 'mid', score: 1 },\n { value: 'anterior', score: 2 },\n ],\n};\n\nexport type BishopBand = 'unfavourable' | 'intermediate' | 'favourable';\n\n/** Highest attainable total (3 + 3 + 3 + 2 + 2). */\nexport const BISHOP_MAX_SCORE = 13;\n\n/** Classify a total into a favourability band (ACOG thresholds). */\nexport function bishopBand(total: number): BishopBand {\n if (total <= 6) return 'unfavourable';\n if (total >= 8) return 'favourable';\n return 'intermediate';\n}\n\nexport type BishopSelection = Partial<Record<BishopComponent, string>>;\n\nexport interface BishopResult {\n total: number;\n band: BishopBand;\n}\n\n/** Look up the score for a component's selected option, or `null` if unknown. */\nfunction scoreFor(component: BishopComponent, value: string): number | null {\n return (\n BISHOP_OPTIONS[component].find((o) => o.value === value)?.score ?? null\n );\n}\n\n/**\n * Sum the Bishop score. Returns `null` until every one of the five components\n * has a valid selection (a partial exam doesn't yield a meaningful total).\n */\nexport function bishopScore(selection: BishopSelection): BishopResult | null {\n let total = 0;\n for (const component of BISHOP_COMPONENTS) {\n const value = selection[component];\n if (value === undefined) return null;\n const score = scoreFor(component, value);\n if (score === null) return null;\n total += score;\n }\n return { total, band: bishopBand(total) };\n}\n","/* ------------------------------------------------------------------ */\n/* BishopScore — cervical favourability for induction of labour. */\n/* */\n/* Five enumerated cervical-exam findings → a 0–13 total with a */\n/* favourability band. Maths lives in `./bishop` (pure, tested). */\n/* ------------------------------------------------------------------ */\n\nimport { forwardRef, useEffect, useMemo, useRef, useState } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { bishopScoreAgent } from './bishop-score.agent';\nimport { FormField } from '../form-field';\nimport { Select } from '../select';\nimport { Card } from '../card';\nimport { Badge } from '../badge';\nimport {\n InsertButton,\n type InsertPayload,\n type InsertVariant,\n type InsertMode,\n} from '../_shared/insert-result';\nimport {\n type BishopComponent,\n type BishopSelection,\n type BishopResult,\n type BishopBand,\n BISHOP_COMPONENTS,\n BISHOP_OPTIONS,\n BISHOP_MAX_SCORE,\n bishopScore,\n} from './bishop';\n\nconst rootVariants = cva('ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]', {\n variants: {\n width: { full: 'ds:w-full', auto: 'ds:inline-flex' },\n },\n defaultVariants: { width: 'full' },\n});\n\n/** Band → on-screen Badge variant + inserted-card chip token. */\nconst BAND_BADGE: Record<BishopBand, 'warning' | 'info' | 'success'> = {\n unfavourable: 'warning',\n intermediate: 'info',\n favourable: 'success',\n};\nconst BAND_TOKEN: Record<BishopBand, string> = {\n unfavourable: '--warning-readable',\n intermediate: '--info',\n favourable: '--success',\n};\n\nexport interface BishopScoreProps extends VariantProps<typeof rootVariants> {\n /** Fires whenever all five findings are set (and `null` when not). */\n onResultChange?: (result: BishopResult | null) => void;\n /** When provided, shows the result-action buttons that emit / copy the result. */\n onInsert?: (payload: InsertPayload) => void;\n /** Which verb the result button performs. Defaults to `'insert'`. */\n insertVariant?: InsertVariant;\n /** `copy` variant only — fired after a successful clipboard write. */\n onCopy?: (mode: InsertMode) => void;\n /** `copy` variant only — fired if the clipboard write can't proceed. */\n onError?: (error: unknown) => void;\n /** Brand wordmark printed in the inserted/copied result-card footer. */\n insertBrand?: string | false;\n /** Opaque instance id, emitted as `data-component-id`. */\n id?: string;\n /** Extra class names on the wrapper. */\n className?: string;\n}\n\n/**\n * Curated imperative handle for agent / external automation. Exposes the\n * structural exam findings + computed result and lets a caller set one\n * finding at a time. Never exposes patient identity. Consumed by the\n * `bishop-score.agent.ts` adapter; the public `ref` stays the DOM element.\n */\nexport interface BishopScoreHandle {\n /** Snapshot of the five findings keyed by component. */\n getSelection: () => BishopSelection;\n /** Current computed result, or null until all five findings are set. */\n getResult: () => BishopResult | null;\n /** Set one finding to an enumerated option value (unknown pairs are ignored). */\n setComponent: (component: BishopComponent, value: string) => void;\n /** Clear all findings. */\n reset: () => void;\n}\n\nexport const BishopScore = forwardRef<HTMLDivElement, BishopScoreProps>(\n (\n {\n onResultChange,\n onInsert,\n insertVariant = 'insert',\n onCopy,\n onError,\n insertBrand,\n id,\n width,\n className,\n },\n ref,\n ) => {\n const { t } = useTranslation();\n\n const [selection, setSelection] = useState<BishopSelection>({});\n\n const result = useMemo(() => bishopScore(selection), [selection]);\n\n useEffect(() => {\n onResultChange?.(result);\n }, [result, onResultChange]);\n\n // Live refs so the once-built agent handle reads/writes current state\n // without re-creating on every keystroke. Public `ref` stays the DOM node.\n const selectionRef = useRef(selection);\n selectionRef.current = selection;\n const resultRef = useRef(result);\n resultRef.current = result;\n const agentHandle = useMemo<BishopScoreHandle>(\n () => ({\n getSelection: () => ({ ...selectionRef.current }),\n getResult: () => resultRef.current,\n setComponent: (component, value) => {\n const allowed = BISHOP_OPTIONS[component]?.some(\n (o) => o.value === value,\n );\n if (!allowed) return;\n setSelection((prev) => ({ ...prev, [component]: value }));\n },\n reset: () => setSelection({}),\n }),\n [],\n );\n useAgentRegistration(bishopScoreAgent, agentHandle, id);\n\n const optionsFor = (component: BishopComponent) =>\n BISHOP_OPTIONS[component].map((o) => ({\n value: o.value,\n label: t(`bishopScore.${component}.${o.value}`),\n }));\n\n const bandLabel = (band: BishopBand): string =>\n t(`bishopScore.band.${band}`);\n\n return (\n <div\n ref={ref}\n data-component=\"bishop-score\"\n data-component-id={id}\n className={rootVariants({ width, className })}\n >\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-2\">\n {BISHOP_COMPONENTS.map((component) => (\n <FormField\n key={component}\n label={t(`bishopScore.${component}.label`)}\n >\n <Select\n options={optionsFor(component)}\n value={selection[component] ?? ''}\n onValueChange={(next) =>\n setSelection((prev) => ({ ...prev, [component]: next }))\n }\n />\n </FormField>\n ))}\n </div>\n\n <p className=\"ds:sr-only\" role=\"status\" aria-live=\"polite\">\n {result\n ? `${t('bishopScore.totalLabel')}: ${t('bishopScore.scoreOf', {\n score: result.total,\n max: BISHOP_MAX_SCORE,\n })}. ${bandLabel(result.band)}.`\n : ''}\n </p>\n\n {result ? (\n <Card variant=\"elevated\">\n <Card.Body className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <dl className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-2\">\n <div className=\"ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-xs)]\">\n <dt className=\"type-label ds:text-muted-foreground\">\n {t('bishopScore.totalLabel')}\n </dt>\n <dd className=\"type-metric ds:text-foreground\">\n {t('bishopScore.scoreOf', {\n score: result.total,\n max: BISHOP_MAX_SCORE,\n })}\n </dd>\n </div>\n <div className=\"ds:flex ds:flex-col ds:items-end ds:gap-[var(--spacing-xs)] ds:text-end\">\n <dt className=\"type-label ds:text-muted-foreground\">\n {t('bishopScore.bandLabel')}\n </dt>\n <dd>\n <Badge variant={BAND_BADGE[result.band]} size=\"lg\">\n {bandLabel(result.band)}\n </Badge>\n </dd>\n </div>\n </dl>\n <p className=\"type-body-sm ds:text-muted-foreground\">\n {t(`bishopScore.interpretation.${result.band}`)}\n </p>\n {insertVariant === 'copy' || onInsert ? (\n <InsertButton\n onInsert={onInsert}\n variant={insertVariant}\n onCopy={onCopy}\n onError={onError}\n card={{\n title: t('insert.title.bishop'),\n icon: 'activity',\n highlight: bandLabel(result.band),\n highlightToken: BAND_TOKEN[result.band],\n brand: insertBrand,\n fields: [\n {\n icon: 'percent',\n label: t('bishopScore.totalLabel'),\n value: t('bishopScore.scoreOf', {\n score: result.total,\n max: BISHOP_MAX_SCORE,\n }),\n },\n {\n icon: 'tag',\n label: t('bishopScore.bandLabel'),\n value: bandLabel(result.band),\n },\n ],\n }}\n />\n ) : null}\n </Card.Body>\n </Card>\n ) : (\n <p className=\"type-body ds:text-muted-foreground\">\n {t('bishopScore.empty')}\n </p>\n )}\n </div>\n );\n },\n);\n\nBishopScore.displayName = 'BishopScore';\n"],"names":["COMPONENT_IDS","bishopScoreAgent","handle","args","BISHOP_COMPONENTS","BISHOP_OPTIONS","BISHOP_MAX_SCORE","bishopBand","total","scoreFor","component","value","_a","o","bishopScore","selection","score","rootVariants","cva","BAND_BADGE","BAND_TOKEN","BishopScore","forwardRef","onResultChange","onInsert","insertVariant","onCopy","onError","insertBrand","id","width","className","ref","t","useTranslation","setSelection","useState","result","useMemo","useEffect","selectionRef","useRef","resultRef","agentHandle","prev","useAgentRegistration","optionsFor","bandLabel","band","jsxs","jsx","FormField","Select","next","Card","Badge","InsertButton"],"mappings":"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"}
1
+ {"version":3,"file":"bishop-score-BV1JAEMV.js","sources":["../../src/components/bishop-score/bishop-score.agent.ts","../../src/components/bishop-score/bishop.ts","../../src/components/bishop-score/bishop-score.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — BishopScore. */\n/* */\n/* Cervical-favourability calculator. The agent-relevant surface is the */\n/* read-only computed result (total + band) plus the five enumerated */\n/* findings, and `set_value` actions to drive each finding. NO patient */\n/* identity is ever exposed — only the structural exam findings and the */\n/* derived score. The handle is the curated `BishopScoreHandle`, never */\n/* React state. See `src/docs/26-agent-readiness.mdx`. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { BishopScoreHandle } from './bishop-score';\nimport type { BishopComponent } from './bishop';\n\n/**\n * Enumerated finding ids, mirrored from `./bishop`'s `BISHOP_COMPONENTS`.\n * Inlined as a literal (rather than runtime-imported) so the ESM catalog\n * build can load this pure module without TS path resolution. The `satisfies`\n * keeps it in lockstep with the `BishopComponent` union at compile time.\n */\nconst COMPONENT_IDS = [\n 'dilation',\n 'effacement',\n 'station',\n 'consistency',\n 'position',\n] as const satisfies readonly BishopComponent[];\n\nexport const bishopScoreAgent: AgentAdapter<BishopScoreHandle> = {\n id: 'bishop-score',\n capabilities: ['set_value'],\n state: {\n selection: {\n type: 'Partial<Record<BishopComponent, string>>',\n descriptionKey: 'ui.agent.bishopScore.state.selection',\n description:\n 'The five cervical-exam findings keyed by component (dilation, effacement, station, consistency, position). Each value is an enumerated option key, not free text.',\n read: (handle) => handle.getSelection(),\n },\n result: {\n type: '{ total: number, band: string } | null',\n descriptionKey: 'ui.agent.bishopScore.state.result',\n description:\n 'Computed Bishop result — total (0–13) and favourability band (unfavourable / intermediate / favourable). Null until all five findings are set.',\n read: (handle) => handle.getResult(),\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ component: BishopComponent, value: string }',\n argsSchema: {\n type: 'object',\n properties: {\n component: {\n enum: [...COMPONENT_IDS],\n description: 'Which cervical-exam finding to set.',\n },\n value: {\n type: 'string',\n description:\n 'Enumerated option key for that finding (e.g. dilation \"closed\" | \"1-2\" | \"3-4\" | \"5+\").',\n },\n },\n required: ['component', 'value'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.bishopScore.actions.setValue',\n description:\n 'Set one cervical-exam finding to an enumerated option value. Unknown component/value pairs are ignored.',\n examples: [\n {\n args: { component: 'dilation', value: '3-4' },\n note: 'Record cervical dilation of 3–4 cm (2 points).',\n },\n ],\n invoke: (handle, args: { component: BishopComponent; value: string }) => {\n handle.setComponent(args.component, args.value);\n },\n },\n reset: {\n safety: 'write',\n idempotent: true,\n descriptionKey: 'ui.agent.bishopScore.actions.reset',\n description: 'Clear all five findings and the computed result.',\n invoke: (handle) => {\n handle.reset();\n },\n },\n get_result: {\n safety: 'read',\n returns: '{ total: number, band: string } | null',\n returnsSchema: {\n oneOf: [\n {\n type: 'object',\n properties: {\n total: { type: 'integer', minimum: 0, maximum: 13 },\n band: {\n enum: ['unfavourable', 'intermediate', 'favourable'],\n },\n },\n required: ['total', 'band'],\n },\n { type: 'null' },\n ],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.bishopScore.actions.getResult',\n description:\n 'Return the computed Bishop result, or null until all five findings are set.',\n invoke: (handle) => handle.getResult(),\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'bishop-score',\n description: 'Marks the BishopScore calculator wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific calculator instance.',\n },\n },\n};\n","/* ------------------------------------------------------------------ */\n/* Bishop score — cervical favourability for induction of labour. */\n/* */\n/* Pure, framework-free, unit-testable. Five components scored 0–3 */\n/* (dilation, effacement, station) or 0–2 (consistency, position), */\n/* summed to a 0–13 total. Bands per ACOG: ≤6 unfavourable (cervical */\n/* ripening advised), 7 intermediate, ≥8 favourable. */\n/* */\n/* Bishop EH, Obstet Gynecol 1964; thresholds per ACOG Practice */\n/* Bulletin 107 (Induction of Labor). */\n/* ------------------------------------------------------------------ */\n\nexport type BishopComponent =\n | 'dilation'\n | 'effacement'\n | 'station'\n | 'consistency'\n | 'position';\n\n/** The component fields in the order they are scored / displayed. */\nexport const BISHOP_COMPONENTS: readonly BishopComponent[] = [\n 'dilation',\n 'effacement',\n 'station',\n 'consistency',\n 'position',\n] as const;\n\nexport interface BishopOption {\n /** Stable value key → i18n lookup `bishopScore.<component>.<value>`. */\n value: string;\n /** Points this option contributes. */\n score: number;\n}\n\n/**\n * Scored options per component. Dilation / effacement / station run 0–3;\n * consistency / position run 0–2 (the classic Bishop weighting).\n */\nexport const BISHOP_OPTIONS: Record<BishopComponent, BishopOption[]> = {\n dilation: [\n { value: 'closed', score: 0 },\n { value: '1-2', score: 1 },\n { value: '3-4', score: 2 },\n { value: '5+', score: 3 },\n ],\n effacement: [\n { value: '0-30', score: 0 },\n { value: '40-50', score: 1 },\n { value: '60-70', score: 2 },\n { value: '80+', score: 3 },\n ],\n station: [\n { value: '-3', score: 0 },\n { value: '-2', score: 1 },\n { value: '-1-0', score: 2 },\n { value: '+1+2', score: 3 },\n ],\n consistency: [\n { value: 'firm', score: 0 },\n { value: 'medium', score: 1 },\n { value: 'soft', score: 2 },\n ],\n position: [\n { value: 'posterior', score: 0 },\n { value: 'mid', score: 1 },\n { value: 'anterior', score: 2 },\n ],\n};\n\nexport type BishopBand = 'unfavourable' | 'intermediate' | 'favourable';\n\n/** Highest attainable total (3 + 3 + 3 + 2 + 2). */\nexport const BISHOP_MAX_SCORE = 13;\n\n/** Classify a total into a favourability band (ACOG thresholds). */\nexport function bishopBand(total: number): BishopBand {\n if (total <= 6) return 'unfavourable';\n if (total >= 8) return 'favourable';\n return 'intermediate';\n}\n\nexport type BishopSelection = Partial<Record<BishopComponent, string>>;\n\nexport interface BishopResult {\n total: number;\n band: BishopBand;\n}\n\n/** Look up the score for a component's selected option, or `null` if unknown. */\nfunction scoreFor(component: BishopComponent, value: string): number | null {\n return (\n BISHOP_OPTIONS[component].find((o) => o.value === value)?.score ?? null\n );\n}\n\n/**\n * Sum the Bishop score. Returns `null` until every one of the five components\n * has a valid selection (a partial exam doesn't yield a meaningful total).\n */\nexport function bishopScore(selection: BishopSelection): BishopResult | null {\n let total = 0;\n for (const component of BISHOP_COMPONENTS) {\n const value = selection[component];\n if (value === undefined) return null;\n const score = scoreFor(component, value);\n if (score === null) return null;\n total += score;\n }\n return { total, band: bishopBand(total) };\n}\n","/* ------------------------------------------------------------------ */\n/* BishopScore — cervical favourability for induction of labour. */\n/* */\n/* Five enumerated cervical-exam findings → a 0–13 total with a */\n/* favourability band. Maths lives in `./bishop` (pure, tested). */\n/* ------------------------------------------------------------------ */\n\nimport { forwardRef, useEffect, useMemo, useRef, useState } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { bishopScoreAgent } from './bishop-score.agent';\nimport { FormField } from '../form-field';\nimport { Select } from '../select';\nimport { Card } from '../card';\nimport { Badge } from '../badge';\nimport {\n InsertButton,\n type InsertPayload,\n type InsertVariant,\n type InsertMode,\n} from '../_shared/insert-result';\nimport {\n type BishopComponent,\n type BishopSelection,\n type BishopResult,\n type BishopBand,\n BISHOP_COMPONENTS,\n BISHOP_OPTIONS,\n BISHOP_MAX_SCORE,\n bishopScore,\n} from './bishop';\n\nconst rootVariants = cva('ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]', {\n variants: {\n width: { full: 'ds:w-full', auto: 'ds:inline-flex' },\n },\n defaultVariants: { width: 'full' },\n});\n\n/** Band → on-screen Badge variant + inserted-card chip token. */\nconst BAND_BADGE: Record<BishopBand, 'warning' | 'info' | 'success'> = {\n unfavourable: 'warning',\n intermediate: 'info',\n favourable: 'success',\n};\nconst BAND_TOKEN: Record<BishopBand, string> = {\n unfavourable: '--warning-readable',\n intermediate: '--info',\n favourable: '--success',\n};\n\nexport interface BishopScoreProps extends VariantProps<typeof rootVariants> {\n /** Fires whenever all five findings are set (and `null` when not). */\n onResultChange?: (result: BishopResult | null) => void;\n /** When provided, shows the result-action buttons that emit / copy the result. */\n onInsert?: (payload: InsertPayload) => void;\n /** Which verb the result button performs. Defaults to `'insert'`. */\n insertVariant?: InsertVariant;\n /** `copy` variant only — fired after a successful clipboard write. */\n onCopy?: (mode: InsertMode) => void;\n /** `copy` variant only — fired if the clipboard write can't proceed. */\n onError?: (error: unknown) => void;\n /** Brand wordmark printed in the inserted/copied result-card footer. */\n insertBrand?: string | false;\n /** Opaque instance id, emitted as `data-component-id`. */\n id?: string;\n /** Extra class names on the wrapper. */\n className?: string;\n}\n\n/**\n * Curated imperative handle for agent / external automation. Exposes the\n * structural exam findings + computed result and lets a caller set one\n * finding at a time. Never exposes patient identity. Consumed by the\n * `bishop-score.agent.ts` adapter; the public `ref` stays the DOM element.\n */\nexport interface BishopScoreHandle {\n /** Snapshot of the five findings keyed by component. */\n getSelection: () => BishopSelection;\n /** Current computed result, or null until all five findings are set. */\n getResult: () => BishopResult | null;\n /** Set one finding to an enumerated option value (unknown pairs are ignored). */\n setComponent: (component: BishopComponent, value: string) => void;\n /** Clear all findings. */\n reset: () => void;\n}\n\nexport const BishopScore = forwardRef<HTMLDivElement, BishopScoreProps>(\n (\n {\n onResultChange,\n onInsert,\n insertVariant = 'insert',\n onCopy,\n onError,\n insertBrand,\n id,\n width,\n className,\n },\n ref,\n ) => {\n const { t } = useTranslation();\n\n const [selection, setSelection] = useState<BishopSelection>({});\n\n const result = useMemo(() => bishopScore(selection), [selection]);\n\n useEffect(() => {\n onResultChange?.(result);\n }, [result, onResultChange]);\n\n // Live refs so the once-built agent handle reads/writes current state\n // without re-creating on every keystroke. Public `ref` stays the DOM node.\n const selectionRef = useRef(selection);\n selectionRef.current = selection;\n const resultRef = useRef(result);\n resultRef.current = result;\n const agentHandle = useMemo<BishopScoreHandle>(\n () => ({\n getSelection: () => ({ ...selectionRef.current }),\n getResult: () => resultRef.current,\n setComponent: (component, value) => {\n const allowed = BISHOP_OPTIONS[component]?.some(\n (o) => o.value === value,\n );\n if (!allowed) return;\n setSelection((prev) => ({ ...prev, [component]: value }));\n },\n reset: () => setSelection({}),\n }),\n [],\n );\n useAgentRegistration(bishopScoreAgent, agentHandle, id);\n\n const optionsFor = (component: BishopComponent) =>\n BISHOP_OPTIONS[component].map((o) => ({\n value: o.value,\n label: t(`bishopScore.${component}.${o.value}`),\n }));\n\n const bandLabel = (band: BishopBand): string =>\n t(`bishopScore.band.${band}`);\n\n return (\n <div\n ref={ref}\n data-component=\"bishop-score\"\n data-component-id={id}\n className={rootVariants({ width, className })}\n >\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-2\">\n {BISHOP_COMPONENTS.map((component) => (\n <FormField\n key={component}\n label={t(`bishopScore.${component}.label`)}\n >\n <Select\n options={optionsFor(component)}\n value={selection[component] ?? ''}\n onValueChange={(next) =>\n setSelection((prev) => ({ ...prev, [component]: next }))\n }\n />\n </FormField>\n ))}\n </div>\n\n <p className=\"ds:sr-only\" role=\"status\" aria-live=\"polite\">\n {result\n ? `${t('bishopScore.totalLabel')}: ${t('bishopScore.scoreOf', {\n score: result.total,\n max: BISHOP_MAX_SCORE,\n })}. ${bandLabel(result.band)}.`\n : ''}\n </p>\n\n {result ? (\n <Card variant=\"elevated\">\n <Card.Body className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <dl className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-2\">\n <div className=\"ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-xs)]\">\n <dt className=\"type-label ds:text-muted-foreground\">\n {t('bishopScore.totalLabel')}\n </dt>\n <dd className=\"type-metric ds:text-foreground\">\n {t('bishopScore.scoreOf', {\n score: result.total,\n max: BISHOP_MAX_SCORE,\n })}\n </dd>\n </div>\n <div className=\"ds:flex ds:flex-col ds:items-end ds:gap-[var(--spacing-xs)] ds:text-end\">\n <dt className=\"type-label ds:text-muted-foreground\">\n {t('bishopScore.bandLabel')}\n </dt>\n <dd>\n <Badge variant={BAND_BADGE[result.band]} size=\"lg\">\n {bandLabel(result.band)}\n </Badge>\n </dd>\n </div>\n </dl>\n <p className=\"type-body-sm ds:text-muted-foreground\">\n {t(`bishopScore.interpretation.${result.band}`)}\n </p>\n {insertVariant === 'copy' || onInsert ? (\n <InsertButton\n onInsert={onInsert}\n variant={insertVariant}\n onCopy={onCopy}\n onError={onError}\n card={{\n title: t('insert.title.bishop'),\n icon: 'activity',\n highlight: bandLabel(result.band),\n highlightToken: BAND_TOKEN[result.band],\n brand: insertBrand,\n fields: [\n {\n icon: 'percent',\n label: t('bishopScore.totalLabel'),\n value: t('bishopScore.scoreOf', {\n score: result.total,\n max: BISHOP_MAX_SCORE,\n }),\n },\n {\n icon: 'tag',\n label: t('bishopScore.bandLabel'),\n value: bandLabel(result.band),\n },\n ],\n }}\n />\n ) : null}\n </Card.Body>\n </Card>\n ) : (\n <p className=\"type-body ds:text-muted-foreground\">\n {t('bishopScore.empty')}\n </p>\n )}\n </div>\n );\n },\n);\n\nBishopScore.displayName = 'BishopScore';\n"],"names":["COMPONENT_IDS","bishopScoreAgent","handle","args","BISHOP_COMPONENTS","BISHOP_OPTIONS","BISHOP_MAX_SCORE","bishopBand","total","scoreFor","component","value","_a","o","bishopScore","selection","score","rootVariants","cva","BAND_BADGE","BAND_TOKEN","BishopScore","forwardRef","onResultChange","onInsert","insertVariant","onCopy","onError","insertBrand","id","width","className","ref","t","useTranslation","setSelection","useState","result","useMemo","useEffect","selectionRef","useRef","resultRef","agentHandle","prev","useAgentRegistration","optionsFor","bandLabel","band","jsxs","jsx","FormField","Select","next","Card","Badge","InsertButton"],"mappings":"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"}
@@ -4,11 +4,11 @@ import { c as se } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as oe } from "react-i18next";
5
5
  import { u as ce } from "./registry-DvAUVLHh.js";
6
6
  import { R as E } from "./radio-TWf9Q-mp.js";
7
- import { R as ue } from "./radio-group-BmIqhIT2.js";
8
- import { F as G } from "./form-field-D1oqYisL.js";
9
- import { N as L } from "./number-input-CM1q9zvH.js";
7
+ import { R as ue } from "./radio-group-rXDJADzW.js";
8
+ import { F as G } from "./form-field-CahJzTxp.js";
9
+ import { N as L } from "./number-input-Cgu2TtA8.js";
10
10
  import { C as j } from "./card-DPmk26CL.js";
11
- import { B as me } from "./badge-CIt-UFEx.js";
11
+ import { B as me } from "./badge-sTusUqZD.js";
12
12
  import { B as de, I as ge, b as pe } from "./insert-result-98J1QEp7.js";
13
13
  import { c as q, b as he, e as be, l as D, f as V, k as z } from "./bmi-BxD-tFzU.js";
14
14
  const ye = {
@@ -431,4 +431,4 @@ we.displayName = "BmiCalculator";
431
431
  export {
432
432
  we as B
433
433
  };
434
- //# sourceMappingURL=bmi-calculator-DC5SaqXT.js.map
434
+ //# sourceMappingURL=bmi-calculator-CdR-RLFj.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bmi-calculator-DC5SaqXT.js","sources":["../../src/components/bmi-calculator/bmi-calculator.agent.ts","../../src/components/bmi-calculator/bmi-calculator.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — BmiCalculator. */\n/* */\n/* Height + weight → WHO body-mass-index. The agent-relevant surface is */\n/* the read-only computed result (bmi + WHO category) plus the canonical */\n/* metric inputs and the active unit system, with `set_value` actions to */\n/* drive height/weight and switch units. NO patient identity is exposed — */\n/* only the structural measurements and the derived index. The handle is */\n/* the curated `BmiCalculatorHandle`. See `src/docs/26-agent-readiness`. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { BmiCalculatorHandle } from './bmi-calculator';\n\nexport const bmiCalculatorAgent: AgentAdapter<BmiCalculatorHandle> = {\n id: 'bmi-calculator',\n capabilities: ['set_value', 'view_change'],\n state: {\n unitSystem: {\n type: \"'metric' | 'imperial'\",\n descriptionKey: 'ui.agent.bmiCalculator.state.unitSystem',\n description: 'Active unit system the inputs are entered in.',\n read: (handle) => handle.getUnitSystem(),\n },\n inputs: {\n type: '{ heightCm: number | null, weightKg: number | null }',\n descriptionKey: 'ui.agent.bmiCalculator.state.inputs',\n description:\n 'Canonical metric measurements regardless of the active unit system — height in centimetres and weight in kilograms, or null when unset.',\n read: (handle) => handle.getInputs(),\n },\n result: {\n type: '{ bmi: number, category: string } | null',\n descriptionKey: 'ui.agent.bmiCalculator.state.result',\n description:\n 'Computed BMI (kg/m²) and WHO category (underweight / normal / overweight / obese). Null until both height and weight are valid.',\n read: (handle) => handle.getResult(),\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ heightCm?: number | null, weightKg?: number | null }',\n argsSchema: {\n type: 'object',\n properties: {\n heightCm: {\n type: ['number', 'null'],\n description: 'Height in centimetres (canonical metric).',\n minimum: 0,\n },\n weightKg: {\n type: ['number', 'null'],\n description: 'Weight in kilograms (canonical metric).',\n minimum: 0,\n },\n },\n additionalProperties: false,\n },\n idempotent: true,\n descriptionKey: 'ui.agent.bmiCalculator.actions.setValue',\n description:\n 'Set height (cm) and/or weight (kg) in canonical metric units. Omitted fields are left unchanged.',\n examples: [\n {\n args: { heightCm: 175, weightKg: 72 },\n note: 'A 175 cm, 72 kg patient → BMI ~23.5 (normal).',\n },\n ],\n invoke: (\n handle,\n args: { heightCm?: number | null; weightKg?: number | null },\n ) => {\n handle.setMetric(args);\n },\n },\n set_unit_system: {\n safety: 'write',\n argsType: \"{ unitSystem: 'metric' | 'imperial' }\",\n argsSchema: {\n type: 'object',\n properties: {\n unitSystem: {\n enum: ['metric', 'imperial'],\n description: 'Unit system to display the inputs in.',\n },\n },\n required: ['unitSystem'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.bmiCalculator.actions.setUnitSystem',\n description:\n 'Switch the input unit system. Entered figures are preserved by conversion; the computed BMI is unchanged.',\n invoke: (handle, args: { unitSystem: 'metric' | 'imperial' }) => {\n handle.setUnitSystem(args.unitSystem);\n },\n },\n reset: {\n safety: 'write',\n idempotent: true,\n descriptionKey: 'ui.agent.bmiCalculator.actions.reset',\n description: 'Clear height and weight and the computed result.',\n invoke: (handle) => {\n handle.reset();\n },\n },\n get_result: {\n safety: 'read',\n returns: '{ bmi: number, category: string } | null',\n returnsSchema: {\n oneOf: [\n {\n type: 'object',\n properties: {\n bmi: { type: 'number', minimum: 0 },\n category: {\n enum: ['underweight', 'normal', 'overweight', 'obese'],\n },\n },\n required: ['bmi', 'category'],\n },\n { type: 'null' },\n ],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.bmiCalculator.actions.getResult',\n description:\n 'Return the computed BMI + WHO category, or null until both inputs are valid.',\n invoke: (handle) => handle.getResult(),\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'bmi-calculator',\n description: 'Marks the BmiCalculator wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific calculator instance.',\n },\n },\n};\n","/* ------------------------------------------------------------------ */\n/* BmiCalculator — height + weight → WHO body-mass-index, shown on a */\n/* banded-linear gauge. */\n/* */\n/* - Maths + unit conversion live in `./bmi` (pure, separately tested). */\n/* - Metric ⇄ imperial toggle persists the entered figures across the */\n/* switch by converting them (a patient measured in lb/ft doesn't */\n/* lose their numbers when a clinician flips to kg/cm). */\n/* - The gauge is the shared `BandedGauge`: a horizontal WHO-banded bar */\n/* (15–40) with a marker at the BMI's x-position. The SAME geometry */\n/* bakes into the inserted result-card PNG (banded variant), so the */\n/* on-screen widget and the rasterised card never drift. The band */\n/* fills come from semantic tokens (`--info` / `--success` / */\n/* `--warning-readable` / `--destructive`) — the contrast-safe */\n/* `--warning-readable` token handles the overweight orange in every */\n/* theme, so no `getComputedStyle` arc-colour sampling is needed. */\n/* ------------------------------------------------------------------ */\n\nimport { forwardRef, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { bmiCalculatorAgent } from './bmi-calculator.agent';\nimport { RadioGroup, Radio } from '../radio-group';\nimport { FormField } from '../form-field';\nimport { NumberInput } from '../number-input';\nimport { Card } from '../card';\nimport { Badge } from '../badge';\nimport {\n InsertButton,\n type InsertPayload,\n type InsertVariant,\n type InsertMode,\n} from '../_shared/insert-result';\nimport { BandedGauge, bmiBands } from '../_shared/banded-gauge';\nimport {\n type UnitSystem,\n type BmiCategory,\n computeBmi,\n bmiCategory,\n cmToFtIn,\n ftInToCm,\n kgToLb,\n lbToKg,\n} from './bmi';\n\n/* ------------------------------------------------------------------ */\n/* Result payload emitted to consumers */\n/* ------------------------------------------------------------------ */\n\nexport interface BmiResult {\n /** BMI in kg/m². */\n bmi: number;\n /** WHO category the BMI falls into. */\n category: BmiCategory;\n}\n\n/**\n * Curated imperative handle for agent / external automation. Reads/writes the\n * canonical metric measurements and the WHO result, and switches the display\n * unit system. Never exposes patient identity. Consumed by the\n * `bmi-calculator.agent.ts` adapter; the public `ref` stays the DOM element.\n */\nexport interface BmiCalculatorHandle {\n /** Active display unit system. */\n getUnitSystem: () => UnitSystem;\n /** Switch the display unit system (entered figures are converted, not lost). */\n setUnitSystem: (next: UnitSystem) => void;\n /** Canonical metric snapshot — height in cm and weight in kg, or null. */\n getInputs: () => { heightCm: number | null; weightKg: number | null };\n /** Set height (cm) and/or weight (kg) in canonical metric units. */\n setMetric: (next: {\n heightCm?: number | null;\n weightKg?: number | null;\n }) => void;\n /** Current computed result, or null until both inputs are valid. */\n getResult: () => BmiResult | null;\n /** Clear height and weight. */\n reset: () => void;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst rootVariants = cva('ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]', {\n variants: {\n width: {\n full: 'ds:w-full',\n auto: 'ds:inline-flex',\n },\n },\n defaultVariants: { width: 'full' },\n});\n\n/* ------------------------------------------------------------------ */\n/* Category → semantic intent for the Stat headline */\n/* ------------------------------------------------------------------ */\n\nconst CATEGORY_BADGE: Record<\n BmiCategory,\n 'info' | 'success' | 'warning' | 'error'\n> = {\n underweight: 'info',\n normal: 'success',\n overweight: 'warning',\n obese: 'error',\n};\n\n/* ------------------------------------------------------------------ */\n/* Category → semantic band token. */\n/* */\n/* The four WHO bands carry these tokens both on-screen (the shared */\n/* `bmiBands()` definition fills each zone with the same name) and in */\n/* the card chip's `highlightToken`. `overweight` uses */\n/* `--warning-readable` — the kit's contrast-safe orange that already */\n/* resolves correctly per theme (orange-600 in light/non-accessible, */\n/* `--warning` elsewhere), so NO `getComputedStyle` arc sampling or */\n/* `document.documentElement` override is needed. */\n/* ------------------------------------------------------------------ */\n\nconst CATEGORY_TOKEN: Record<BmiCategory, string> = {\n underweight: '--info',\n normal: '--success',\n overweight: '--warning-readable',\n obese: '--destructive',\n};\n\nexport interface BmiCalculatorProps extends VariantProps<typeof rootVariants> {\n /** Initial unit system. Defaults to `'metric'`. */\n defaultUnitSystem?: UnitSystem;\n /** Fires whenever a valid BMI can be computed (and with `null` when it can't). */\n onResultChange?: (result: BmiResult | null) => void;\n /** When provided, shows an \"Insert\" button that emits the result for an editor. */\n onInsert?: (payload: InsertPayload) => void;\n /**\n * Which verb the result button performs. Defaults to `'insert'`.\n * Use `'copy'` in an app-shell surface (no editor to insert into) — the\n * button writes the result to the clipboard as a multi-format `ClipboardItem`.\n */\n insertVariant?: InsertVariant;\n /** `copy` variant only — fired after a successful clipboard write. */\n onCopy?: (mode: InsertMode) => void;\n /** `copy` variant only — fired if the clipboard write can't proceed. */\n onError?: (error: unknown) => void;\n /**\n * Brand wordmark printed in the inserted/copied result-card footer.\n * Omitted → no brand line (and no footer hairline); a string → that custom\n * brand; `false` → no brand line. Brand is opt-in.\n */\n insertBrand?: string | false;\n /** Opaque instance id, emitted as `data-component-id`. */\n id?: string;\n /** Extra class names on the wrapper. */\n className?: string;\n}\n\n/** Round to one decimal place — used when seeding a unit-switch. */\nconst round1 = (n: number): number => Math.round(n * 10) / 10;\n\nexport const BmiCalculator = forwardRef<HTMLDivElement, BmiCalculatorProps>(\n (\n {\n defaultUnitSystem = 'metric',\n onResultChange,\n onInsert,\n insertVariant = 'insert',\n onCopy,\n onError,\n insertBrand,\n id,\n width,\n className,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const heightGroupId = useId();\n\n const [unitSystem, setUnitSystem] = useState<UnitSystem>(defaultUnitSystem);\n\n // Raw per-system inputs. Metric is canonical for cm/kg; imperial keeps\n // ft + in + lb so typing isn't fought by rounding round-trips.\n const [heightCm, setHeightCm] = useState<number | null>(null);\n const [weightKg, setWeightKg] = useState<number | null>(null);\n const [heightFt, setHeightFt] = useState<number | null>(null);\n const [heightIn, setHeightIn] = useState<number | null>(null);\n const [weightLb, setWeightLb] = useState<number | null>(null);\n\n const handleUnitChange = (next: string): void => {\n const target = next as UnitSystem;\n if (target === unitSystem) return;\n if (target === 'imperial') {\n if (heightCm !== null) {\n const { ft, in: inches } = cmToFtIn(heightCm);\n setHeightFt(ft);\n setHeightIn(round1(inches));\n }\n if (weightKg !== null) setWeightLb(round1(kgToLb(weightKg)));\n } else {\n if (heightFt !== null || heightIn !== null) {\n setHeightCm(round1(ftInToCm(heightFt ?? 0, heightIn ?? 0)));\n }\n if (weightLb !== null) setWeightKg(round1(lbToKg(weightLb)));\n }\n setUnitSystem(target);\n };\n\n /* Canonical metric figures for the active system. */\n const canonicalHeightCm =\n unitSystem === 'metric'\n ? heightCm\n : heightFt !== null || heightIn !== null\n ? ftInToCm(heightFt ?? 0, heightIn ?? 0)\n : null;\n const canonicalWeightKg =\n unitSystem === 'metric'\n ? weightKg\n : weightLb !== null\n ? lbToKg(weightLb)\n : null;\n\n const bmi = computeBmi(canonicalWeightKg, canonicalHeightCm);\n const category = bmi !== null ? bmiCategory(bmi) : null;\n\n const bmiFormatter = useMemo(\n () =>\n new Intl.NumberFormat(i18n.language, {\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n }),\n [i18n.language],\n );\n\n // Notify consumers without re-firing on unrelated re-renders.\n useEffect(() => {\n onResultChange?.(\n bmi !== null && category !== null ? { bmi, category } : null,\n );\n }, [bmi, category, onResultChange]);\n\n // Live refs so the once-built agent handle reads/writes current state\n // without re-creating on every keystroke. Public `ref` stays the DOM node.\n const liveRef = useRef({\n unitSystem,\n canonicalHeightCm,\n canonicalWeightKg,\n bmi,\n category,\n handleUnitChange,\n });\n liveRef.current = {\n unitSystem,\n canonicalHeightCm,\n canonicalWeightKg,\n bmi,\n category,\n handleUnitChange,\n };\n const agentHandle = useMemo<BmiCalculatorHandle>(\n () => ({\n getUnitSystem: () => liveRef.current.unitSystem,\n setUnitSystem: (next) => liveRef.current.handleUnitChange(next),\n getInputs: () => ({\n heightCm: liveRef.current.canonicalHeightCm,\n weightKg: liveRef.current.canonicalWeightKg,\n }),\n setMetric: (next) => {\n // Write canonical metric figures into whichever raw store the\n // active unit system reads from, so the on-screen inputs reflect\n // the change without losing the user's chosen unit display.\n if ('heightCm' in next) {\n const cm = next.heightCm;\n if (liveRef.current.unitSystem === 'metric') {\n setHeightCm(cm ?? null);\n } else if (cm === null || cm === undefined) {\n setHeightFt(null);\n setHeightIn(null);\n } else {\n const { ft, in: inches } = cmToFtIn(cm);\n setHeightFt(ft);\n setHeightIn(round1(inches));\n }\n }\n if ('weightKg' in next) {\n const kg = next.weightKg;\n if (liveRef.current.unitSystem === 'metric') {\n setWeightKg(kg ?? null);\n } else {\n setWeightLb(\n kg === null || kg === undefined ? null : round1(kgToLb(kg)),\n );\n }\n }\n },\n getResult: () => {\n const { bmi: b, category: c } = liveRef.current;\n return b !== null && c !== null ? { bmi: b, category: c } : null;\n },\n reset: () => {\n setHeightCm(null);\n setWeightKg(null);\n setHeightFt(null);\n setHeightIn(null);\n setWeightLb(null);\n },\n }),\n [],\n );\n useAgentRegistration(bmiCalculatorAgent, agentHandle, id);\n\n const isMetric = unitSystem === 'metric';\n\n // Pre-translated gauge labels, shared by the on-screen widget and the\n // inserted card so both surfaces read identically. The shared `BandedGauge`\n // is i18n-agnostic — every visible string arrives already through `t()`.\n const gauge = useMemo(() => {\n if (bmi === null || category === null) return null;\n const { bands, min, max, ticks } = bmiBands();\n const valueLabel = bmiFormatter.format(bmi);\n const categoryLabel = t(`bmiCalculator.category.${category}`);\n const rangeLabel = t(`bmiCalculator.range.${category}`);\n const ariaLabel = t('bmiCalculator.gaugeAria', {\n bmi: valueLabel,\n category: categoryLabel,\n range: rangeLabel,\n });\n return {\n value: bmi,\n bands,\n min,\n max,\n ticks,\n valueLabel,\n categoryLabel,\n rangeLabel,\n ariaLabel,\n };\n }, [bmi, category, bmiFormatter, t]);\n\n return (\n <div\n ref={ref}\n data-component=\"bmi-calculator\"\n data-component-id={id}\n className={rootVariants({ width, className })}\n >\n <RadioGroup\n label={t('bmiCalculator.unitSystem.label')}\n variant=\"horizontal\"\n value={unitSystem}\n onValueChange={handleUnitChange}\n >\n <Radio label={t('bmiCalculator.unitSystem.metric')} value=\"metric\" />\n <Radio\n label={t('bmiCalculator.unitSystem.imperial')}\n value=\"imperial\"\n />\n </RadioGroup>\n\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-2\">\n {isMetric ? (\n <FormField\n label={`${t('bmiCalculator.height')} (${t('bmiCalculator.units.cm')})`}\n >\n <NumberInput\n mode=\"decimal\"\n min={0}\n step={0.5}\n value={heightCm}\n onChange={setHeightCm}\n />\n </FormField>\n ) : (\n <div role=\"group\" aria-labelledby={heightGroupId}>\n <span\n id={heightGroupId}\n className=\"type-label ds:mb-[var(--spacing-xs)] ds:block ds:text-foreground\"\n >\n {t('bmiCalculator.height')}\n </span>\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <NumberInput\n mode=\"integer\"\n min={0}\n value={heightFt}\n onChange={setHeightFt}\n aria-label={t('bmiCalculator.feet')}\n />\n <span className=\"type-label ds:text-muted-foreground\">\n {t('bmiCalculator.units.ft')}\n </span>\n <NumberInput\n mode=\"decimal\"\n min={0}\n max={11.9}\n step={0.5}\n value={heightIn}\n onChange={setHeightIn}\n aria-label={t('bmiCalculator.inches')}\n />\n <span className=\"type-label ds:text-muted-foreground\">\n {t('bmiCalculator.units.in')}\n </span>\n </div>\n </div>\n )}\n\n <FormField\n label={`${t('bmiCalculator.weight')} (${t(\n isMetric ? 'bmiCalculator.units.kg' : 'bmiCalculator.units.lb',\n )})`}\n >\n <NumberInput\n mode=\"decimal\"\n min={0}\n step={isMetric ? 0.1 : 0.5}\n value={isMetric ? weightKg : weightLb}\n onChange={isMetric ? setWeightKg : setWeightLb}\n />\n </FormField>\n </div>\n\n {/* Concise polite announcement when the result resolves — the gauge\n itself stays out of the live region to avoid re-reading on every\n keystroke. */}\n <p className=\"ds:sr-only\" role=\"status\" aria-live=\"polite\">\n {gauge ? gauge.ariaLabel : ''}\n </p>\n\n {bmi !== null && category !== null && gauge !== null ? (\n <Card variant=\"elevated\">\n <Card.Body className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-md)]\">\n <div className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-xs)] ds:text-center\">\n <span className=\"type-label ds:text-muted-foreground\">\n {t('bmiCalculator.category.label')}\n </span>\n <Badge variant={CATEGORY_BADGE[category]} size=\"lg\">\n {t(`bmiCalculator.category.${category}`)}\n </Badge>\n <p className=\"type-body ds:text-muted-foreground\">\n {gauge.rangeLabel}\n </p>\n </div>\n {/* `data-bmi-category` exposes the WHO band so the gauge's\n semantic colour is assertable without sampling pixels. The\n shared BandedGauge fills each zone via `var(<token>)`, so a\n theme switch repaints the bands with no JS re-sample. */}\n <div\n data-bmi-category={category}\n className=\"ds:w-full ds:max-w-[320px]\"\n >\n <BandedGauge model={gauge} className=\"ds:w-full\" />\n </div>\n {insertVariant === 'copy' || onInsert ? (\n <InsertButton\n onInsert={onInsert}\n variant={insertVariant}\n onCopy={onCopy}\n onError={onError}\n card={{\n title: t('insert.title.bmi'),\n icon: 'scale',\n highlight: t(`bmiCalculator.category.${category}`),\n // Chip shares the WHO-category semantic token so the\n // inserted PNG chip matches the on-screen band colour.\n highlightToken: CATEGORY_TOKEN[category],\n brand: insertBrand,\n // Banded gauge: the SAME geometry + WHO bands as the\n // on-screen widget, baked into the card PNG with\n // probe-resolved theme colours.\n gauge: {\n variant: 'banded',\n value: bmi,\n bands: gauge.bands,\n min: gauge.min,\n max: gauge.max,\n valueLabel: gauge.valueLabel,\n categoryLabel: gauge.categoryLabel,\n rangeLabel: gauge.rangeLabel,\n ariaLabel: gauge.ariaLabel,\n ticks: gauge.ticks,\n },\n fields: [\n {\n // Mirrors the on-screen scale glyph + header icon.\n icon: 'scale',\n label: t('insert.title.bmi'),\n value: gauge.valueLabel,\n },\n {\n // WHO band is a classification → tag glyph.\n icon: 'tag',\n label: t('bmiCalculator.category.label'),\n value: gauge.categoryLabel,\n },\n ],\n }}\n />\n ) : null}\n </Card.Body>\n </Card>\n ) : (\n <p className=\"type-body ds:text-muted-foreground\">\n {t('bmiCalculator.empty')}\n </p>\n )}\n </div>\n );\n },\n);\n\nBmiCalculator.displayName = 'BmiCalculator';\n"],"names":["bmiCalculatorAgent","handle","args","rootVariants","cva","CATEGORY_BADGE","CATEGORY_TOKEN","round1","n","BmiCalculator","forwardRef","defaultUnitSystem","onResultChange","onInsert","insertVariant","onCopy","onError","insertBrand","id","width","className","ref","t","i18n","useTranslation","heightGroupId","useId","unitSystem","setUnitSystem","useState","heightCm","setHeightCm","weightKg","setWeightKg","heightFt","setHeightFt","heightIn","setHeightIn","weightLb","setWeightLb","handleUnitChange","next","target","ft","inches","cmToFtIn","kgToLb","ftInToCm","lbToKg","canonicalHeightCm","canonicalWeightKg","bmi","computeBmi","category","bmiCategory","bmiFormatter","useMemo","useEffect","liveRef","useRef","agentHandle","cm","kg","b","c","useAgentRegistration","isMetric","gauge","bands","min","max","ticks","bmiBands","valueLabel","categoryLabel","rangeLabel","ariaLabel","jsxs","RadioGroup","jsx","Radio","FormField","NumberInput","Card","Badge","BandedGauge","InsertButton"],"mappings":"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"}
1
+ {"version":3,"file":"bmi-calculator-CdR-RLFj.js","sources":["../../src/components/bmi-calculator/bmi-calculator.agent.ts","../../src/components/bmi-calculator/bmi-calculator.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — BmiCalculator. */\n/* */\n/* Height + weight → WHO body-mass-index. The agent-relevant surface is */\n/* the read-only computed result (bmi + WHO category) plus the canonical */\n/* metric inputs and the active unit system, with `set_value` actions to */\n/* drive height/weight and switch units. NO patient identity is exposed — */\n/* only the structural measurements and the derived index. The handle is */\n/* the curated `BmiCalculatorHandle`. See `src/docs/26-agent-readiness`. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { BmiCalculatorHandle } from './bmi-calculator';\n\nexport const bmiCalculatorAgent: AgentAdapter<BmiCalculatorHandle> = {\n id: 'bmi-calculator',\n capabilities: ['set_value', 'view_change'],\n state: {\n unitSystem: {\n type: \"'metric' | 'imperial'\",\n descriptionKey: 'ui.agent.bmiCalculator.state.unitSystem',\n description: 'Active unit system the inputs are entered in.',\n read: (handle) => handle.getUnitSystem(),\n },\n inputs: {\n type: '{ heightCm: number | null, weightKg: number | null }',\n descriptionKey: 'ui.agent.bmiCalculator.state.inputs',\n description:\n 'Canonical metric measurements regardless of the active unit system — height in centimetres and weight in kilograms, or null when unset.',\n read: (handle) => handle.getInputs(),\n },\n result: {\n type: '{ bmi: number, category: string } | null',\n descriptionKey: 'ui.agent.bmiCalculator.state.result',\n description:\n 'Computed BMI (kg/m²) and WHO category (underweight / normal / overweight / obese). Null until both height and weight are valid.',\n read: (handle) => handle.getResult(),\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ heightCm?: number | null, weightKg?: number | null }',\n argsSchema: {\n type: 'object',\n properties: {\n heightCm: {\n type: ['number', 'null'],\n description: 'Height in centimetres (canonical metric).',\n minimum: 0,\n },\n weightKg: {\n type: ['number', 'null'],\n description: 'Weight in kilograms (canonical metric).',\n minimum: 0,\n },\n },\n additionalProperties: false,\n },\n idempotent: true,\n descriptionKey: 'ui.agent.bmiCalculator.actions.setValue',\n description:\n 'Set height (cm) and/or weight (kg) in canonical metric units. Omitted fields are left unchanged.',\n examples: [\n {\n args: { heightCm: 175, weightKg: 72 },\n note: 'A 175 cm, 72 kg patient → BMI ~23.5 (normal).',\n },\n ],\n invoke: (\n handle,\n args: { heightCm?: number | null; weightKg?: number | null },\n ) => {\n handle.setMetric(args);\n },\n },\n set_unit_system: {\n safety: 'write',\n argsType: \"{ unitSystem: 'metric' | 'imperial' }\",\n argsSchema: {\n type: 'object',\n properties: {\n unitSystem: {\n enum: ['metric', 'imperial'],\n description: 'Unit system to display the inputs in.',\n },\n },\n required: ['unitSystem'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.bmiCalculator.actions.setUnitSystem',\n description:\n 'Switch the input unit system. Entered figures are preserved by conversion; the computed BMI is unchanged.',\n invoke: (handle, args: { unitSystem: 'metric' | 'imperial' }) => {\n handle.setUnitSystem(args.unitSystem);\n },\n },\n reset: {\n safety: 'write',\n idempotent: true,\n descriptionKey: 'ui.agent.bmiCalculator.actions.reset',\n description: 'Clear height and weight and the computed result.',\n invoke: (handle) => {\n handle.reset();\n },\n },\n get_result: {\n safety: 'read',\n returns: '{ bmi: number, category: string } | null',\n returnsSchema: {\n oneOf: [\n {\n type: 'object',\n properties: {\n bmi: { type: 'number', minimum: 0 },\n category: {\n enum: ['underweight', 'normal', 'overweight', 'obese'],\n },\n },\n required: ['bmi', 'category'],\n },\n { type: 'null' },\n ],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.bmiCalculator.actions.getResult',\n description:\n 'Return the computed BMI + WHO category, or null until both inputs are valid.',\n invoke: (handle) => handle.getResult(),\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'bmi-calculator',\n description: 'Marks the BmiCalculator wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific calculator instance.',\n },\n },\n};\n","/* ------------------------------------------------------------------ */\n/* BmiCalculator — height + weight → WHO body-mass-index, shown on a */\n/* banded-linear gauge. */\n/* */\n/* - Maths + unit conversion live in `./bmi` (pure, separately tested). */\n/* - Metric ⇄ imperial toggle persists the entered figures across the */\n/* switch by converting them (a patient measured in lb/ft doesn't */\n/* lose their numbers when a clinician flips to kg/cm). */\n/* - The gauge is the shared `BandedGauge`: a horizontal WHO-banded bar */\n/* (15–40) with a marker at the BMI's x-position. The SAME geometry */\n/* bakes into the inserted result-card PNG (banded variant), so the */\n/* on-screen widget and the rasterised card never drift. The band */\n/* fills come from semantic tokens (`--info` / `--success` / */\n/* `--warning-readable` / `--destructive`) — the contrast-safe */\n/* `--warning-readable` token handles the overweight orange in every */\n/* theme, so no `getComputedStyle` arc-colour sampling is needed. */\n/* ------------------------------------------------------------------ */\n\nimport { forwardRef, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { bmiCalculatorAgent } from './bmi-calculator.agent';\nimport { RadioGroup, Radio } from '../radio-group';\nimport { FormField } from '../form-field';\nimport { NumberInput } from '../number-input';\nimport { Card } from '../card';\nimport { Badge } from '../badge';\nimport {\n InsertButton,\n type InsertPayload,\n type InsertVariant,\n type InsertMode,\n} from '../_shared/insert-result';\nimport { BandedGauge, bmiBands } from '../_shared/banded-gauge';\nimport {\n type UnitSystem,\n type BmiCategory,\n computeBmi,\n bmiCategory,\n cmToFtIn,\n ftInToCm,\n kgToLb,\n lbToKg,\n} from './bmi';\n\n/* ------------------------------------------------------------------ */\n/* Result payload emitted to consumers */\n/* ------------------------------------------------------------------ */\n\nexport interface BmiResult {\n /** BMI in kg/m². */\n bmi: number;\n /** WHO category the BMI falls into. */\n category: BmiCategory;\n}\n\n/**\n * Curated imperative handle for agent / external automation. Reads/writes the\n * canonical metric measurements and the WHO result, and switches the display\n * unit system. Never exposes patient identity. Consumed by the\n * `bmi-calculator.agent.ts` adapter; the public `ref` stays the DOM element.\n */\nexport interface BmiCalculatorHandle {\n /** Active display unit system. */\n getUnitSystem: () => UnitSystem;\n /** Switch the display unit system (entered figures are converted, not lost). */\n setUnitSystem: (next: UnitSystem) => void;\n /** Canonical metric snapshot — height in cm and weight in kg, or null. */\n getInputs: () => { heightCm: number | null; weightKg: number | null };\n /** Set height (cm) and/or weight (kg) in canonical metric units. */\n setMetric: (next: {\n heightCm?: number | null;\n weightKg?: number | null;\n }) => void;\n /** Current computed result, or null until both inputs are valid. */\n getResult: () => BmiResult | null;\n /** Clear height and weight. */\n reset: () => void;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst rootVariants = cva('ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]', {\n variants: {\n width: {\n full: 'ds:w-full',\n auto: 'ds:inline-flex',\n },\n },\n defaultVariants: { width: 'full' },\n});\n\n/* ------------------------------------------------------------------ */\n/* Category → semantic intent for the Stat headline */\n/* ------------------------------------------------------------------ */\n\nconst CATEGORY_BADGE: Record<\n BmiCategory,\n 'info' | 'success' | 'warning' | 'error'\n> = {\n underweight: 'info',\n normal: 'success',\n overweight: 'warning',\n obese: 'error',\n};\n\n/* ------------------------------------------------------------------ */\n/* Category → semantic band token. */\n/* */\n/* The four WHO bands carry these tokens both on-screen (the shared */\n/* `bmiBands()` definition fills each zone with the same name) and in */\n/* the card chip's `highlightToken`. `overweight` uses */\n/* `--warning-readable` — the kit's contrast-safe orange that already */\n/* resolves correctly per theme (orange-600 in light/non-accessible, */\n/* `--warning` elsewhere), so NO `getComputedStyle` arc sampling or */\n/* `document.documentElement` override is needed. */\n/* ------------------------------------------------------------------ */\n\nconst CATEGORY_TOKEN: Record<BmiCategory, string> = {\n underweight: '--info',\n normal: '--success',\n overweight: '--warning-readable',\n obese: '--destructive',\n};\n\nexport interface BmiCalculatorProps extends VariantProps<typeof rootVariants> {\n /** Initial unit system. Defaults to `'metric'`. */\n defaultUnitSystem?: UnitSystem;\n /** Fires whenever a valid BMI can be computed (and with `null` when it can't). */\n onResultChange?: (result: BmiResult | null) => void;\n /** When provided, shows an \"Insert\" button that emits the result for an editor. */\n onInsert?: (payload: InsertPayload) => void;\n /**\n * Which verb the result button performs. Defaults to `'insert'`.\n * Use `'copy'` in an app-shell surface (no editor to insert into) — the\n * button writes the result to the clipboard as a multi-format `ClipboardItem`.\n */\n insertVariant?: InsertVariant;\n /** `copy` variant only — fired after a successful clipboard write. */\n onCopy?: (mode: InsertMode) => void;\n /** `copy` variant only — fired if the clipboard write can't proceed. */\n onError?: (error: unknown) => void;\n /**\n * Brand wordmark printed in the inserted/copied result-card footer.\n * Omitted → no brand line (and no footer hairline); a string → that custom\n * brand; `false` → no brand line. Brand is opt-in.\n */\n insertBrand?: string | false;\n /** Opaque instance id, emitted as `data-component-id`. */\n id?: string;\n /** Extra class names on the wrapper. */\n className?: string;\n}\n\n/** Round to one decimal place — used when seeding a unit-switch. */\nconst round1 = (n: number): number => Math.round(n * 10) / 10;\n\nexport const BmiCalculator = forwardRef<HTMLDivElement, BmiCalculatorProps>(\n (\n {\n defaultUnitSystem = 'metric',\n onResultChange,\n onInsert,\n insertVariant = 'insert',\n onCopy,\n onError,\n insertBrand,\n id,\n width,\n className,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const heightGroupId = useId();\n\n const [unitSystem, setUnitSystem] = useState<UnitSystem>(defaultUnitSystem);\n\n // Raw per-system inputs. Metric is canonical for cm/kg; imperial keeps\n // ft + in + lb so typing isn't fought by rounding round-trips.\n const [heightCm, setHeightCm] = useState<number | null>(null);\n const [weightKg, setWeightKg] = useState<number | null>(null);\n const [heightFt, setHeightFt] = useState<number | null>(null);\n const [heightIn, setHeightIn] = useState<number | null>(null);\n const [weightLb, setWeightLb] = useState<number | null>(null);\n\n const handleUnitChange = (next: string): void => {\n const target = next as UnitSystem;\n if (target === unitSystem) return;\n if (target === 'imperial') {\n if (heightCm !== null) {\n const { ft, in: inches } = cmToFtIn(heightCm);\n setHeightFt(ft);\n setHeightIn(round1(inches));\n }\n if (weightKg !== null) setWeightLb(round1(kgToLb(weightKg)));\n } else {\n if (heightFt !== null || heightIn !== null) {\n setHeightCm(round1(ftInToCm(heightFt ?? 0, heightIn ?? 0)));\n }\n if (weightLb !== null) setWeightKg(round1(lbToKg(weightLb)));\n }\n setUnitSystem(target);\n };\n\n /* Canonical metric figures for the active system. */\n const canonicalHeightCm =\n unitSystem === 'metric'\n ? heightCm\n : heightFt !== null || heightIn !== null\n ? ftInToCm(heightFt ?? 0, heightIn ?? 0)\n : null;\n const canonicalWeightKg =\n unitSystem === 'metric'\n ? weightKg\n : weightLb !== null\n ? lbToKg(weightLb)\n : null;\n\n const bmi = computeBmi(canonicalWeightKg, canonicalHeightCm);\n const category = bmi !== null ? bmiCategory(bmi) : null;\n\n const bmiFormatter = useMemo(\n () =>\n new Intl.NumberFormat(i18n.language, {\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n }),\n [i18n.language],\n );\n\n // Notify consumers without re-firing on unrelated re-renders.\n useEffect(() => {\n onResultChange?.(\n bmi !== null && category !== null ? { bmi, category } : null,\n );\n }, [bmi, category, onResultChange]);\n\n // Live refs so the once-built agent handle reads/writes current state\n // without re-creating on every keystroke. Public `ref` stays the DOM node.\n const liveRef = useRef({\n unitSystem,\n canonicalHeightCm,\n canonicalWeightKg,\n bmi,\n category,\n handleUnitChange,\n });\n liveRef.current = {\n unitSystem,\n canonicalHeightCm,\n canonicalWeightKg,\n bmi,\n category,\n handleUnitChange,\n };\n const agentHandle = useMemo<BmiCalculatorHandle>(\n () => ({\n getUnitSystem: () => liveRef.current.unitSystem,\n setUnitSystem: (next) => liveRef.current.handleUnitChange(next),\n getInputs: () => ({\n heightCm: liveRef.current.canonicalHeightCm,\n weightKg: liveRef.current.canonicalWeightKg,\n }),\n setMetric: (next) => {\n // Write canonical metric figures into whichever raw store the\n // active unit system reads from, so the on-screen inputs reflect\n // the change without losing the user's chosen unit display.\n if ('heightCm' in next) {\n const cm = next.heightCm;\n if (liveRef.current.unitSystem === 'metric') {\n setHeightCm(cm ?? null);\n } else if (cm === null || cm === undefined) {\n setHeightFt(null);\n setHeightIn(null);\n } else {\n const { ft, in: inches } = cmToFtIn(cm);\n setHeightFt(ft);\n setHeightIn(round1(inches));\n }\n }\n if ('weightKg' in next) {\n const kg = next.weightKg;\n if (liveRef.current.unitSystem === 'metric') {\n setWeightKg(kg ?? null);\n } else {\n setWeightLb(\n kg === null || kg === undefined ? null : round1(kgToLb(kg)),\n );\n }\n }\n },\n getResult: () => {\n const { bmi: b, category: c } = liveRef.current;\n return b !== null && c !== null ? { bmi: b, category: c } : null;\n },\n reset: () => {\n setHeightCm(null);\n setWeightKg(null);\n setHeightFt(null);\n setHeightIn(null);\n setWeightLb(null);\n },\n }),\n [],\n );\n useAgentRegistration(bmiCalculatorAgent, agentHandle, id);\n\n const isMetric = unitSystem === 'metric';\n\n // Pre-translated gauge labels, shared by the on-screen widget and the\n // inserted card so both surfaces read identically. The shared `BandedGauge`\n // is i18n-agnostic — every visible string arrives already through `t()`.\n const gauge = useMemo(() => {\n if (bmi === null || category === null) return null;\n const { bands, min, max, ticks } = bmiBands();\n const valueLabel = bmiFormatter.format(bmi);\n const categoryLabel = t(`bmiCalculator.category.${category}`);\n const rangeLabel = t(`bmiCalculator.range.${category}`);\n const ariaLabel = t('bmiCalculator.gaugeAria', {\n bmi: valueLabel,\n category: categoryLabel,\n range: rangeLabel,\n });\n return {\n value: bmi,\n bands,\n min,\n max,\n ticks,\n valueLabel,\n categoryLabel,\n rangeLabel,\n ariaLabel,\n };\n }, [bmi, category, bmiFormatter, t]);\n\n return (\n <div\n ref={ref}\n data-component=\"bmi-calculator\"\n data-component-id={id}\n className={rootVariants({ width, className })}\n >\n <RadioGroup\n label={t('bmiCalculator.unitSystem.label')}\n variant=\"horizontal\"\n value={unitSystem}\n onValueChange={handleUnitChange}\n >\n <Radio label={t('bmiCalculator.unitSystem.metric')} value=\"metric\" />\n <Radio\n label={t('bmiCalculator.unitSystem.imperial')}\n value=\"imperial\"\n />\n </RadioGroup>\n\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-2\">\n {isMetric ? (\n <FormField\n label={`${t('bmiCalculator.height')} (${t('bmiCalculator.units.cm')})`}\n >\n <NumberInput\n mode=\"decimal\"\n min={0}\n step={0.5}\n value={heightCm}\n onChange={setHeightCm}\n />\n </FormField>\n ) : (\n <div role=\"group\" aria-labelledby={heightGroupId}>\n <span\n id={heightGroupId}\n className=\"type-label ds:mb-[var(--spacing-xs)] ds:block ds:text-foreground\"\n >\n {t('bmiCalculator.height')}\n </span>\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <NumberInput\n mode=\"integer\"\n min={0}\n value={heightFt}\n onChange={setHeightFt}\n aria-label={t('bmiCalculator.feet')}\n />\n <span className=\"type-label ds:text-muted-foreground\">\n {t('bmiCalculator.units.ft')}\n </span>\n <NumberInput\n mode=\"decimal\"\n min={0}\n max={11.9}\n step={0.5}\n value={heightIn}\n onChange={setHeightIn}\n aria-label={t('bmiCalculator.inches')}\n />\n <span className=\"type-label ds:text-muted-foreground\">\n {t('bmiCalculator.units.in')}\n </span>\n </div>\n </div>\n )}\n\n <FormField\n label={`${t('bmiCalculator.weight')} (${t(\n isMetric ? 'bmiCalculator.units.kg' : 'bmiCalculator.units.lb',\n )})`}\n >\n <NumberInput\n mode=\"decimal\"\n min={0}\n step={isMetric ? 0.1 : 0.5}\n value={isMetric ? weightKg : weightLb}\n onChange={isMetric ? setWeightKg : setWeightLb}\n />\n </FormField>\n </div>\n\n {/* Concise polite announcement when the result resolves — the gauge\n itself stays out of the live region to avoid re-reading on every\n keystroke. */}\n <p className=\"ds:sr-only\" role=\"status\" aria-live=\"polite\">\n {gauge ? gauge.ariaLabel : ''}\n </p>\n\n {bmi !== null && category !== null && gauge !== null ? (\n <Card variant=\"elevated\">\n <Card.Body className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-md)]\">\n <div className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-xs)] ds:text-center\">\n <span className=\"type-label ds:text-muted-foreground\">\n {t('bmiCalculator.category.label')}\n </span>\n <Badge variant={CATEGORY_BADGE[category]} size=\"lg\">\n {t(`bmiCalculator.category.${category}`)}\n </Badge>\n <p className=\"type-body ds:text-muted-foreground\">\n {gauge.rangeLabel}\n </p>\n </div>\n {/* `data-bmi-category` exposes the WHO band so the gauge's\n semantic colour is assertable without sampling pixels. The\n shared BandedGauge fills each zone via `var(<token>)`, so a\n theme switch repaints the bands with no JS re-sample. */}\n <div\n data-bmi-category={category}\n className=\"ds:w-full ds:max-w-[320px]\"\n >\n <BandedGauge model={gauge} className=\"ds:w-full\" />\n </div>\n {insertVariant === 'copy' || onInsert ? (\n <InsertButton\n onInsert={onInsert}\n variant={insertVariant}\n onCopy={onCopy}\n onError={onError}\n card={{\n title: t('insert.title.bmi'),\n icon: 'scale',\n highlight: t(`bmiCalculator.category.${category}`),\n // Chip shares the WHO-category semantic token so the\n // inserted PNG chip matches the on-screen band colour.\n highlightToken: CATEGORY_TOKEN[category],\n brand: insertBrand,\n // Banded gauge: the SAME geometry + WHO bands as the\n // on-screen widget, baked into the card PNG with\n // probe-resolved theme colours.\n gauge: {\n variant: 'banded',\n value: bmi,\n bands: gauge.bands,\n min: gauge.min,\n max: gauge.max,\n valueLabel: gauge.valueLabel,\n categoryLabel: gauge.categoryLabel,\n rangeLabel: gauge.rangeLabel,\n ariaLabel: gauge.ariaLabel,\n ticks: gauge.ticks,\n },\n fields: [\n {\n // Mirrors the on-screen scale glyph + header icon.\n icon: 'scale',\n label: t('insert.title.bmi'),\n value: gauge.valueLabel,\n },\n {\n // WHO band is a classification → tag glyph.\n icon: 'tag',\n label: t('bmiCalculator.category.label'),\n value: gauge.categoryLabel,\n },\n ],\n }}\n />\n ) : null}\n </Card.Body>\n </Card>\n ) : (\n <p className=\"type-body ds:text-muted-foreground\">\n {t('bmiCalculator.empty')}\n </p>\n )}\n </div>\n );\n },\n);\n\nBmiCalculator.displayName = 'BmiCalculator';\n"],"names":["bmiCalculatorAgent","handle","args","rootVariants","cva","CATEGORY_BADGE","CATEGORY_TOKEN","round1","n","BmiCalculator","forwardRef","defaultUnitSystem","onResultChange","onInsert","insertVariant","onCopy","onError","insertBrand","id","width","className","ref","t","i18n","useTranslation","heightGroupId","useId","unitSystem","setUnitSystem","useState","heightCm","setHeightCm","weightKg","setWeightKg","heightFt","setHeightFt","heightIn","setHeightIn","weightLb","setWeightLb","handleUnitChange","next","target","ft","inches","cmToFtIn","kgToLb","ftInToCm","lbToKg","canonicalHeightCm","canonicalWeightKg","bmi","computeBmi","category","bmiCategory","bmiFormatter","useMemo","useEffect","liveRef","useRef","agentHandle","cm","kg","b","c","useAgentRegistration","isMetric","gauge","bands","min","max","ticks","bmiBands","valueLabel","categoryLabel","rangeLabel","ariaLabel","jsxs","RadioGroup","jsx","Radio","FormField","NumberInput","Card","Badge","BandedGauge","InsertButton"],"mappings":"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"}
@@ -9,7 +9,7 @@ import { C as Ke } from "./checkbox-BuZ1u__2.js";
9
9
  import { C as Ot } from "./checkbox-group-CfqMv57d.js";
10
10
  import { D as Et } from "./date-picker-Bp64zk2p.js";
11
11
  import { E as Rt } from "./email-input-Dpe63k0K.js";
12
- import { F as W } from "./form-field-D1oqYisL.js";
12
+ import { F as W } from "./form-field-CahJzTxp.js";
13
13
  import { P as Vt } from "./phone-input-BsZIoE36.js";
14
14
  import { T as Lt } from "./text-area-Bt3p7Pt0.js";
15
15
  import { T as Ce } from "./text-input-CUvCb6ST.js";
@@ -2703,4 +2703,4 @@ export {
2703
2703
  Q as O,
2704
2704
  Cs as b
2705
2705
  };
2706
- //# sourceMappingURL=booking-CmHX15dh.js.map
2706
+ //# sourceMappingURL=booking-CGKof8QU.js.map