@alfadocs/ui-kit-debug 1.64.0 → 1.66.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. package/dist/_chunks/{anamnesis-summary-rows-DFWws7mM.js → anamnesis-summary-rows-BIfw890v.js} +3 -3
  2. package/dist/_chunks/{anamnesis-summary-rows-DFWws7mM.js.map → anamnesis-summary-rows-BIfw890v.js.map} +1 -1
  3. package/dist/_chunks/{antenatal-schedule-timeline-DuaAQj1m.js → antenatal-schedule-timeline-DW_qkGo1.js} +3 -3
  4. package/dist/_chunks/{antenatal-schedule-timeline-DuaAQj1m.js.map → antenatal-schedule-timeline-DW_qkGo1.js.map} +1 -1
  5. package/dist/_chunks/{appointment-timeline-DaHKV81s.js → appointment-timeline-CCqjORFb.js} +2 -2
  6. package/dist/_chunks/{appointment-timeline-DaHKV81s.js.map → appointment-timeline-CCqjORFb.js.map} +1 -1
  7. package/dist/_chunks/{balance-badge-cell-ejODZU7R.js → balance-badge-cell-DZNthHO1.js} +3 -3
  8. package/dist/_chunks/{balance-badge-cell-ejODZU7R.js.map → balance-badge-cell-DZNthHO1.js.map} +1 -1
  9. package/dist/_chunks/{booking-CGhOtxad.js → booking-DkjatiXc.js} +5 -5
  10. package/dist/_chunks/{booking-CGhOtxad.js.map → booking-DkjatiXc.js.map} +1 -1
  11. package/dist/_chunks/{calendar-DCr65Kt1.js → calendar-BhN-jisv.js} +43 -40
  12. package/dist/_chunks/calendar-BhN-jisv.js.map +1 -0
  13. package/dist/_chunks/{calendar-workspace-BArq9vkD.js → calendar-workspace-Cp8yTZ1g.js} +9 -9
  14. package/dist/_chunks/{calendar-workspace-BArq9vkD.js.map → calendar-workspace-Cp8yTZ1g.js.map} +1 -1
  15. package/dist/_chunks/chart-CwmyCuWe.js +1340 -0
  16. package/dist/_chunks/chart-CwmyCuWe.js.map +1 -0
  17. package/dist/_chunks/{clinical-note-card-D2bbWksq.js → clinical-note-card-BnFTIs6x.js} +2 -2
  18. package/dist/_chunks/{clinical-note-card-D2bbWksq.js.map → clinical-note-card-BnFTIs6x.js.map} +1 -1
  19. package/dist/_chunks/{contact-profile-card-B4sjoIqf.js → contact-profile-card-C4-OCshj.js} +2 -2
  20. package/dist/_chunks/{contact-profile-card-B4sjoIqf.js.map → contact-profile-card-C4-OCshj.js.map} +1 -1
  21. package/dist/_chunks/{cycle-calculator-D-rwX9Pj.js → cycle-calculator-D2Y4LvgC.js} +3 -3
  22. package/dist/_chunks/{cycle-calculator-D-rwX9Pj.js.map → cycle-calculator-D2Y4LvgC.js.map} +1 -1
  23. package/dist/_chunks/{data-table-C6ft3fSd.js → data-table-COoCQ4n_.js} +2 -2
  24. package/dist/_chunks/{data-table-C6ft3fSd.js.map → data-table-COoCQ4n_.js.map} +1 -1
  25. package/dist/_chunks/{date-picker-BSZuKo13.js → date-picker-KcoNNsM0.js} +3 -3
  26. package/dist/_chunks/{date-picker-BSZuKo13.js.map → date-picker-KcoNNsM0.js.map} +1 -1
  27. package/dist/_chunks/{date-picker-variants-BnF-sHzq.js → date-picker-variants-DN37Oj5-.js} +2 -2
  28. package/dist/_chunks/{date-picker-variants-BnF-sHzq.js.map → date-picker-variants-DN37Oj5-.js.map} +1 -1
  29. package/dist/_chunks/{date-range-picker-CFk-5O3R.js → date-range-picker-CjcjUJLW.js} +4 -4
  30. package/dist/_chunks/{date-range-picker-CFk-5O3R.js.map → date-range-picker-CjcjUJLW.js.map} +1 -1
  31. package/dist/_chunks/{date-time-picker-CjxTkblD.js → date-time-picker-BVQNZ4yC.js} +3 -3
  32. package/dist/_chunks/{date-time-picker-CjxTkblD.js.map → date-time-picker-BVQNZ4yC.js.map} +1 -1
  33. package/dist/_chunks/{due-date-calculator-DTfxFJCM.js → due-date-calculator-41uZDkVR.js} +4 -4
  34. package/dist/_chunks/{due-date-calculator-DTfxFJCM.js.map → due-date-calculator-41uZDkVR.js.map} +1 -1
  35. package/dist/_chunks/escape-html-Cn9Fao6a.js +7 -0
  36. package/dist/_chunks/escape-html-Cn9Fao6a.js.map +1 -0
  37. package/dist/_chunks/{file-manager-w1UEprw8.js → file-manager-RiV7-OEE.js} +2 -2
  38. package/dist/_chunks/{file-manager-w1UEprw8.js.map → file-manager-RiV7-OEE.js.map} +1 -1
  39. package/dist/_chunks/{format-price-BKle6Xwt.js → format-price-BcFBa-WP.js} +2 -2
  40. package/dist/_chunks/{format-price-BKle6Xwt.js.map → format-price-BcFBa-WP.js.map} +1 -1
  41. package/dist/_chunks/{freemium-paywall-r-z48YaT.js → freemium-paywall-DKJHRFpp.js} +2 -2
  42. package/dist/_chunks/{freemium-paywall-r-z48YaT.js.map → freemium-paywall-DKJHRFpp.js.map} +1 -1
  43. package/dist/_chunks/{gestational-age-calculator-BnCAL5a-.js → gestational-age-calculator-CZYa2D6m.js} +5 -5
  44. package/dist/_chunks/{gestational-age-calculator-BnCAL5a-.js.map → gestational-age-calculator-CZYa2D6m.js.map} +1 -1
  45. package/dist/_chunks/{hcg-doubling-DVDiqFyp.js → hcg-doubling-DwTcjfke.js} +3 -3
  46. package/dist/_chunks/{hcg-doubling-DVDiqFyp.js.map → hcg-doubling-DwTcjfke.js.map} +1 -1
  47. package/dist/_chunks/heatmap-C1TeC7wT.js +3650 -0
  48. package/dist/_chunks/heatmap-C1TeC7wT.js.map +1 -0
  49. package/dist/_chunks/intl-locale-FWh-Y5_3.js +33 -0
  50. package/dist/_chunks/intl-locale-FWh-Y5_3.js.map +1 -0
  51. package/dist/_chunks/{kit-extensions-RnddkrXn.js → kit-extensions-DWs1UEXb.js} +4 -4
  52. package/dist/_chunks/{kit-extensions-RnddkrXn.js.map → kit-extensions-DWs1UEXb.js.map} +1 -1
  53. package/dist/_chunks/{link-cell-renderer-dtEYlxi2.js → link-cell-renderer-CtTsvfPY.js} +2 -2
  54. package/dist/_chunks/{link-cell-renderer-dtEYlxi2.js.map → link-cell-renderer-CtTsvfPY.js.map} +1 -1
  55. package/dist/_chunks/{money-CeClE1nH.js → money-Tsczpjfz.js} +2 -2
  56. package/dist/_chunks/{money-CeClE1nH.js.map → money-Tsczpjfz.js.map} +1 -1
  57. package/dist/_chunks/{note-attachment-D8V7PUiR.js → note-attachment-DIlIQ7JF.js} +14 -16
  58. package/dist/_chunks/note-attachment-DIlIQ7JF.js.map +1 -0
  59. package/dist/_chunks/{note-timeline-CwxPQ2Ak.js → note-timeline-DDqNU46n.js} +2 -2
  60. package/dist/_chunks/{note-timeline-CwxPQ2Ak.js.map → note-timeline-DDqNU46n.js.map} +1 -1
  61. package/dist/_chunks/{notes-panel-BRLc2ozF.js → notes-panel-uEGIL7mi.js} +2 -2
  62. package/dist/_chunks/{notes-panel-BRLc2ozF.js.map → notes-panel-uEGIL7mi.js.map} +1 -1
  63. package/dist/_chunks/{parse-jZ-i8Xgj.js → parse-UB4FJGNA.js} +2 -2
  64. package/dist/_chunks/{parse-jZ-i8Xgj.js.map → parse-UB4FJGNA.js.map} +1 -1
  65. package/dist/_chunks/{patient-details-BY8Rwwpi.js → patient-details-4P1vA9Ls.js} +2 -2
  66. package/dist/_chunks/{patient-details-BY8Rwwpi.js.map → patient-details-4P1vA9Ls.js.map} +1 -1
  67. package/dist/_chunks/{patient-field-row-C8ymfffP.js → patient-field-row-CBXhlfGD.js} +2 -2
  68. package/dist/_chunks/{patient-field-row-C8ymfffP.js.map → patient-field-row-CBXhlfGD.js.map} +1 -1
  69. package/dist/_chunks/{patient-summary-card-cmqjIXMk.js → patient-summary-card-CuDLo8MP.js} +2 -2
  70. package/dist/_chunks/{patient-summary-card-cmqjIXMk.js.map → patient-summary-card-CuDLo8MP.js.map} +1 -1
  71. package/dist/_chunks/{payment-form-i90DUuNK.js → payment-form-C3dGY7v4.js} +2 -2
  72. package/dist/_chunks/{payment-form-i90DUuNK.js.map → payment-form-C3dGY7v4.js.map} +1 -1
  73. package/dist/_chunks/{practice-results-B8L9ZmtR.js → practice-results-8h2Utpt3.js} +2 -2
  74. package/dist/_chunks/{practice-results-B8L9ZmtR.js.map → practice-results-8h2Utpt3.js.map} +1 -1
  75. package/dist/_chunks/{pregnancy-dating-D2XTELiw.js → pregnancy-dating-B8wo4l_r.js} +5 -5
  76. package/dist/_chunks/{pregnancy-dating-D2XTELiw.js.map → pregnancy-dating-B8wo4l_r.js.map} +1 -1
  77. package/dist/_chunks/{radiograph-panel.agent-DDNUo4Ul.js → radiograph-panel.agent-8Ewv8-d7.js} +3 -3
  78. package/dist/_chunks/{radiograph-panel.agent-DDNUo4Ul.js.map → radiograph-panel.agent-8Ewv8-d7.js.map} +1 -1
  79. package/dist/_chunks/{sparkline-pkGPCXbl.js → sparkline-SnniCoCl.js} +72 -64
  80. package/dist/_chunks/sparkline-SnniCoCl.js.map +1 -0
  81. package/dist/_chunks/subDays-xH7cpN6B.js +8 -0
  82. package/dist/_chunks/{subDays-DlMw8Xng.js.map → subDays-xH7cpN6B.js.map} +1 -1
  83. package/dist/_chunks/{task-editor-DoiOzNiC.js → task-editor-CifOznfq.js} +2 -2
  84. package/dist/_chunks/{task-editor-DoiOzNiC.js.map → task-editor-CifOznfq.js.map} +1 -1
  85. package/dist/_chunks/{treatment-receipt-BdJ36vNP.js → treatment-receipt-Cpm8tqQN.js} +2 -2
  86. package/dist/_chunks/{treatment-receipt-BdJ36vNP.js.map → treatment-receipt-Cpm8tqQN.js.map} +1 -1
  87. package/dist/_chunks/{use-appointment-details-read-D6Gb_OuN.js → use-appointment-details-read-B-FEWbQM.js} +5 -5
  88. package/dist/_chunks/{use-appointment-details-read-D6Gb_OuN.js.map → use-appointment-details-read-B-FEWbQM.js.map} +1 -1
  89. package/dist/agent-catalog.json +1 -1
  90. package/dist/components/_shared/escape-html.d.ts +7 -0
  91. package/dist/components/_shared/escape-html.d.ts.map +1 -0
  92. package/dist/components/_shared/intl-locale.d.ts +5 -3
  93. package/dist/components/_shared/intl-locale.d.ts.map +1 -1
  94. package/dist/components/_shared/note-markdown.d.ts.map +1 -1
  95. package/dist/components/_shared/use-apex-legend-scroll.d.ts.map +1 -1
  96. package/dist/components/_shared/use-apex-radial-centre.d.ts +22 -0
  97. package/dist/components/_shared/use-apex-radial-centre.d.ts.map +1 -0
  98. package/dist/components/appointment-details-panel/index.js +1 -1
  99. package/dist/components/appointment-timeline/index.js +1 -1
  100. package/dist/components/booking/index.js +1 -1
  101. package/dist/components/calendar/calendar.d.ts.map +1 -1
  102. package/dist/components/calendar/index.js +1 -1
  103. package/dist/components/chart/chart.d.ts +8 -5
  104. package/dist/components/chart/chart.d.ts.map +1 -1
  105. package/dist/components/chart/index.js +1 -1
  106. package/dist/components/clinical-note-card/index.js +1 -1
  107. package/dist/components/contact-profile-card/index.js +1 -1
  108. package/dist/components/cycle-calculator/index.js +1 -1
  109. package/dist/components/data-table/index.js +2 -2
  110. package/dist/components/date-picker/index.js +1 -1
  111. package/dist/components/date-range-picker/index.js +1 -1
  112. package/dist/components/date-time-picker/index.js +1 -1
  113. package/dist/components/due-date-calculator/index.js +2 -2
  114. package/dist/components/file-manager/index.js +1 -1
  115. package/dist/components/freemium-paywall/index.js +1 -1
  116. package/dist/components/gestational-age-calculator/index.js +1 -1
  117. package/dist/components/hcg-doubling/index.js +1 -1
  118. package/dist/components/heatmap/heatmap-context.d.ts +3 -0
  119. package/dist/components/heatmap/heatmap-context.d.ts.map +1 -1
  120. package/dist/components/heatmap/heatmap-disclosure.d.ts +67 -0
  121. package/dist/components/heatmap/heatmap-disclosure.d.ts.map +1 -0
  122. package/dist/components/heatmap/heatmap-format.d.ts.map +1 -1
  123. package/dist/components/heatmap/heatmap-grid.d.ts +1 -1
  124. package/dist/components/heatmap/heatmap-grid.d.ts.map +1 -1
  125. package/dist/components/heatmap/heatmap-legend.d.ts +5 -2
  126. package/dist/components/heatmap/heatmap-legend.d.ts.map +1 -1
  127. package/dist/components/heatmap/heatmap-model.d.ts +111 -16
  128. package/dist/components/heatmap/heatmap-model.d.ts.map +1 -1
  129. package/dist/components/heatmap/heatmap-table-view.d.ts +3 -2
  130. package/dist/components/heatmap/heatmap-table-view.d.ts.map +1 -1
  131. package/dist/components/heatmap/heatmap.d.ts +34 -6
  132. package/dist/components/heatmap/heatmap.d.ts.map +1 -1
  133. package/dist/components/heatmap/index.d.ts +1 -1
  134. package/dist/components/heatmap/index.d.ts.map +1 -1
  135. package/dist/components/heatmap/index.js +1 -1
  136. package/dist/components/money/index.js +1 -1
  137. package/dist/components/note-timeline/index.js +1 -1
  138. package/dist/components/notes-panel/index.js +1 -1
  139. package/dist/components/patient-details/index.js +1 -1
  140. package/dist/components/patient-summary-card/index.js +1 -1
  141. package/dist/components/patient-table/index.js +1 -1
  142. package/dist/components/payment-form/index.js +1 -1
  143. package/dist/components/practice-results/index.js +1 -1
  144. package/dist/components/pregnancy-dating/index.js +1 -1
  145. package/dist/components/radiograph-panel/index.js +1 -1
  146. package/dist/components/rich-text-editor/index.js +1 -1
  147. package/dist/components/sparkline/index.js +1 -1
  148. package/dist/components/sparkline/sparkline.d.ts.map +1 -1
  149. package/dist/components/task-editor/index.js +1 -1
  150. package/dist/components/treatment-receipt/index.js +1 -1
  151. package/dist/i18n/locales/ar.d.ts +2 -0
  152. package/dist/i18n/locales/ar.d.ts.map +1 -1
  153. package/dist/i18n/locales/ar.js +2 -0
  154. package/dist/i18n/locales/ar.js.map +1 -1
  155. package/dist/i18n/locales/de.d.ts +2 -0
  156. package/dist/i18n/locales/de.d.ts.map +1 -1
  157. package/dist/i18n/locales/de.js +2 -0
  158. package/dist/i18n/locales/de.js.map +1 -1
  159. package/dist/i18n/locales/el.d.ts +2 -0
  160. package/dist/i18n/locales/el.d.ts.map +1 -1
  161. package/dist/i18n/locales/el.js +2 -0
  162. package/dist/i18n/locales/el.js.map +1 -1
  163. package/dist/i18n/locales/en.d.ts +2 -0
  164. package/dist/i18n/locales/en.d.ts.map +1 -1
  165. package/dist/i18n/locales/en.js +2 -0
  166. package/dist/i18n/locales/en.js.map +1 -1
  167. package/dist/i18n/locales/es.d.ts +2 -0
  168. package/dist/i18n/locales/es.d.ts.map +1 -1
  169. package/dist/i18n/locales/es.js +2 -0
  170. package/dist/i18n/locales/es.js.map +1 -1
  171. package/dist/i18n/locales/fr.d.ts +2 -0
  172. package/dist/i18n/locales/fr.d.ts.map +1 -1
  173. package/dist/i18n/locales/fr.js +2 -0
  174. package/dist/i18n/locales/fr.js.map +1 -1
  175. package/dist/i18n/locales/hi.d.ts +2 -0
  176. package/dist/i18n/locales/hi.d.ts.map +1 -1
  177. package/dist/i18n/locales/hi.js +2 -0
  178. package/dist/i18n/locales/hi.js.map +1 -1
  179. package/dist/i18n/locales/it.d.ts +2 -0
  180. package/dist/i18n/locales/it.d.ts.map +1 -1
  181. package/dist/i18n/locales/it.js +2 -0
  182. package/dist/i18n/locales/it.js.map +1 -1
  183. package/dist/i18n/locales/ja.d.ts +2 -0
  184. package/dist/i18n/locales/ja.d.ts.map +1 -1
  185. package/dist/i18n/locales/ja.js +2 -0
  186. package/dist/i18n/locales/ja.js.map +1 -1
  187. package/dist/i18n/locales/nl.d.ts +2 -0
  188. package/dist/i18n/locales/nl.d.ts.map +1 -1
  189. package/dist/i18n/locales/nl.js +2 -0
  190. package/dist/i18n/locales/nl.js.map +1 -1
  191. package/dist/i18n/locales/pl.d.ts +2 -0
  192. package/dist/i18n/locales/pl.d.ts.map +1 -1
  193. package/dist/i18n/locales/pl.js +2 -0
  194. package/dist/i18n/locales/pl.js.map +1 -1
  195. package/dist/i18n/locales/pt.d.ts +2 -0
  196. package/dist/i18n/locales/pt.d.ts.map +1 -1
  197. package/dist/i18n/locales/pt.js +2 -0
  198. package/dist/i18n/locales/pt.js.map +1 -1
  199. package/dist/i18n/locales/ro.d.ts +2 -0
  200. package/dist/i18n/locales/ro.d.ts.map +1 -1
  201. package/dist/i18n/locales/ro.js +2 -0
  202. package/dist/i18n/locales/ro.js.map +1 -1
  203. package/dist/i18n/locales/ru.d.ts +2 -0
  204. package/dist/i18n/locales/ru.d.ts.map +1 -1
  205. package/dist/i18n/locales/ru.js +2 -0
  206. package/dist/i18n/locales/ru.js.map +1 -1
  207. package/dist/i18n/locales/sq.d.ts +2 -0
  208. package/dist/i18n/locales/sq.d.ts.map +1 -1
  209. package/dist/i18n/locales/sq.js +2 -0
  210. package/dist/i18n/locales/sq.js.map +1 -1
  211. package/dist/i18n/locales/sv.d.ts +2 -0
  212. package/dist/i18n/locales/sv.d.ts.map +1 -1
  213. package/dist/i18n/locales/sv.js +2 -0
  214. package/dist/i18n/locales/sv.js.map +1 -1
  215. package/dist/i18n/locales/tr.d.ts +2 -0
  216. package/dist/i18n/locales/tr.d.ts.map +1 -1
  217. package/dist/i18n/locales/tr.js +2 -0
  218. package/dist/i18n/locales/tr.js.map +1 -1
  219. package/dist/i18n/locales/zh.d.ts +2 -0
  220. package/dist/i18n/locales/zh.d.ts.map +1 -1
  221. package/dist/i18n/locales/zh.js +2 -0
  222. package/dist/i18n/locales/zh.js.map +1 -1
  223. package/dist/index.js +36 -36
  224. package/dist/locales/ar.json +2 -0
  225. package/dist/locales/de.json +2 -0
  226. package/dist/locales/el.json +2 -0
  227. package/dist/locales/en.json +2 -0
  228. package/dist/locales/es.json +2 -0
  229. package/dist/locales/fr.json +2 -0
  230. package/dist/locales/hi.json +2 -0
  231. package/dist/locales/it.json +2 -0
  232. package/dist/locales/ja.json +2 -0
  233. package/dist/locales/nl.json +2 -0
  234. package/dist/locales/pl.json +2 -0
  235. package/dist/locales/pt.json +2 -0
  236. package/dist/locales/ro.json +2 -0
  237. package/dist/locales/ru.json +2 -0
  238. package/dist/locales/sq.json +2 -0
  239. package/dist/locales/sv.json +2 -0
  240. package/dist/locales/tr.json +2 -0
  241. package/dist/locales/zh.json +2 -0
  242. package/dist/patterns/anamnesis/index.js +1 -1
  243. package/dist/patterns/calendar/index.js +1 -1
  244. package/dist/tokens.css +15 -1
  245. package/package.json +1 -1
  246. package/dist/_chunks/calendar-DCr65Kt1.js.map +0 -1
  247. package/dist/_chunks/chart-CzTF8yhH.js +0 -1123
  248. package/dist/_chunks/chart-CzTF8yhH.js.map +0 -1
  249. package/dist/_chunks/heatmap-DuDfTIII.js +0 -2865
  250. package/dist/_chunks/heatmap-DuDfTIII.js.map +0 -1
  251. package/dist/_chunks/intl-locale-ySteXlDD.js +0 -23
  252. package/dist/_chunks/intl-locale-ySteXlDD.js.map +0 -1
  253. package/dist/_chunks/note-attachment-D8V7PUiR.js.map +0 -1
  254. package/dist/_chunks/sparkline-pkGPCXbl.js.map +0 -1
  255. package/dist/_chunks/subDays-DlMw8Xng.js +0 -8
@@ -1,4 +1,4 @@
1
- import { n as s } from "./intl-locale-ySteXlDD.js";
1
+ import { n as s } from "./intl-locale-FWh-Y5_3.js";
2
2
  const n = /* @__PURE__ */ new Set([
3
3
  "BIF",
4
4
  "CLP",
@@ -49,4 +49,4 @@ export {
49
49
  F as b,
50
50
  f
51
51
  };
52
- //# sourceMappingURL=format-price-BKle6Xwt.js.map
52
+ //# sourceMappingURL=format-price-BcFBa-WP.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"format-price-BKle6Xwt.js","sources":["../../src/components/_shared/format-price.ts"],"sourcesContent":["/**\n * Shared money formatter for the kit's \"price in minor units\" convention.\n *\n * Every component that renders a price takes the amount as an integer in\n * the smallest currency unit (cents / centesimi) plus an ISO-4217\n * `currencyCode`, and the KIT does the formatting — the consumer never\n * hands the kit a pre-rendered string. Lifted from the file-local\n * duplicate in `contact-profile-card.tsx` when PracticeResults adopted\n * the same convention, so both surfaces render an identical price for\n * identical input.\n *\n * Not to be confused with `formatPaymentAmount` (payment-form): that one\n * is the checkout formatter and falls back to an `en` currency string so\n * a raw integer can never leak into a payment UI. This is the lightweight\n * leaf helper for read-only price captions — it lives in `_shared` so a\n * SERP card can use it without pulling the payment-form module graph in.\n * Both apply the same zero-decimal divisor rule; only the failure\n * behaviour differs.\n */\n\nimport { numberLocale } from './intl-locale';\n\n/**\n * Currencies with no minor unit — the integer IS the major amount, so\n * dividing by 100 would render the price 100× too small. Pinned to\n * Stripe's list: https://stripe.com/docs/currencies#zero-decimal\n *\n * Kept in step with `ZERO_DECIMAL_CURRENCIES` in\n * `src/components/payment-form/payment-form.tsx`. Consolidating the two\n * into one exported set is a follow-up — payment-form is a shipped\n * subpath entry and re-pointing it is out of scope here.\n */\nconst ZERO_DECIMAL_CURRENCIES = new Set<string>([\n 'BIF',\n 'CLP',\n 'DJF',\n 'GNF',\n 'IDR',\n 'JPY',\n 'KMF',\n 'KRW',\n 'MGA',\n 'PYG',\n 'RWF',\n 'UGX',\n 'VND',\n 'VUV',\n 'XAF',\n 'XOF',\n 'XPF',\n]);\n\nexport function formatPrice(\n minorUnits: number,\n currency: string,\n locale: string,\n): string {\n const iso = currency.toUpperCase();\n const major = ZERO_DECIMAL_CURRENCIES.has(iso)\n ? minorUnits\n : minorUnits / 100;\n try {\n return new Intl.NumberFormat(numberLocale(locale), {\n style: 'currency',\n currency: iso,\n }).format(major);\n } catch {\n // Locale or currency code rejected. Fall back to a plain amount — but\n // keep the zero-decimal rule, or the fallback would reintroduce the very\n // bug this module exists to fix (`JPY 8000` reading as \"8000.00\"), and\n // keep the ISO code so the reader is not left with a bare number.\n const amount = ZERO_DECIMAL_CURRENCIES.has(iso)\n ? String(major)\n : major.toFixed(2);\n return `${amount} ${iso}`;\n }\n}\n\n/**\n * A first-visit price caption: `0` means the visit is free, so it reads as\n * the caller's translated word (\"Free\" / \"Gratuito\"), never as \"€0.00\".\n * Any other amount goes through {@link formatPrice} unchanged.\n */\nexport function formatPriceOrFree(\n minorUnits: number,\n currency: string,\n locale: string,\n freeLabel: string,\n): string {\n return minorUnits === 0\n ? freeLabel\n : formatPrice(minorUnits, currency, locale);\n}\n\n/**\n * The same amount as {@link formatPrice}, but broken into its typed parts so\n * a renderer can treat the fraction differently from the rest.\n *\n * Splitting a formatted price with a regex is not safe across locales: in\n * `it-IT` the group separator is `.` and the decimal is `,`, so `1.000 €`\n * would read as a fraction of `000` and a \"drop the zero fraction\" rule\n * would render it as `1 €`. `Intl.NumberFormat.formatToParts` labels each\n * piece, so the fraction is whatever the locale says it is, wherever it\n * sits relative to the currency symbol.\n *\n * Returns `null` when the locale or currency is rejected — callers fall\n * back to {@link formatPrice}, which keeps the zero-decimal rule.\n */\nexport function formatPriceParts(\n minorUnits: number,\n currency: string,\n locale: string,\n options: Pick<Intl.NumberFormatOptions, 'signDisplay'> = {},\n): Intl.NumberFormatPart[] | null {\n const iso = currency.toUpperCase();\n const major = ZERO_DECIMAL_CURRENCIES.has(iso)\n ? minorUnits\n : minorUnits / 100;\n try {\n return new Intl.NumberFormat(numberLocale(locale), {\n style: 'currency',\n currency: iso,\n ...options,\n }).formatToParts(major);\n } catch {\n return null;\n }\n}\n"],"names":["ZERO_DECIMAL_CURRENCIES","formatPrice","minorUnits","currency","locale","iso","major","numberLocale","formatPriceOrFree","freeLabel","formatPriceParts","options"],"mappings":";AAgCA,MAAMA,wBAA8B,IAAY;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAASC,EACdC,GACAC,GACAC,GACQ;AACR,QAAMC,IAAMF,EAAS,YAAA,GACfG,IAAQN,EAAwB,IAAIK,CAAG,IACzCH,IACAA,IAAa;AACjB,MAAI;AACF,WAAO,IAAI,KAAK,aAAaK,EAAaH,CAAM,GAAG;AAAA,MACjD,OAAO;AAAA,MACP,UAAUC;AAAA,IAAA,CACX,EAAE,OAAOC,CAAK;AAAA,EACjB,QAAQ;AAQN,WAAO,GAHQN,EAAwB,IAAIK,CAAG,IAC1C,OAAOC,CAAK,IACZA,EAAM,QAAQ,CAAC,CACH,IAAID,CAAG;AAAA,EACzB;AACF;AAOO,SAASG,EACdN,GACAC,GACAC,GACAK,GACQ;AACR,SAAOP,MAAe,IAClBO,IACAR,EAAYC,GAAYC,GAAUC,CAAM;AAC9C;AAgBO,SAASM,EACdR,GACAC,GACAC,GACAO,IAAyD,CAAA,GACzB;AAChC,QAAMN,IAAMF,EAAS,YAAA,GACfG,IAAQN,EAAwB,IAAIK,CAAG,IACzCH,IACAA,IAAa;AACjB,MAAI;AACF,WAAO,IAAI,KAAK,aAAaK,EAAaH,CAAM,GAAG;AAAA,MACjD,OAAO;AAAA,MACP,UAAUC;AAAA,MACV,GAAGM;AAAA,IAAA,CACJ,EAAE,cAAcL,CAAK;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;"}
1
+ {"version":3,"file":"format-price-BcFBa-WP.js","sources":["../../src/components/_shared/format-price.ts"],"sourcesContent":["/**\n * Shared money formatter for the kit's \"price in minor units\" convention.\n *\n * Every component that renders a price takes the amount as an integer in\n * the smallest currency unit (cents / centesimi) plus an ISO-4217\n * `currencyCode`, and the KIT does the formatting — the consumer never\n * hands the kit a pre-rendered string. Lifted from the file-local\n * duplicate in `contact-profile-card.tsx` when PracticeResults adopted\n * the same convention, so both surfaces render an identical price for\n * identical input.\n *\n * Not to be confused with `formatPaymentAmount` (payment-form): that one\n * is the checkout formatter and falls back to an `en` currency string so\n * a raw integer can never leak into a payment UI. This is the lightweight\n * leaf helper for read-only price captions — it lives in `_shared` so a\n * SERP card can use it without pulling the payment-form module graph in.\n * Both apply the same zero-decimal divisor rule; only the failure\n * behaviour differs.\n */\n\nimport { numberLocale } from './intl-locale';\n\n/**\n * Currencies with no minor unit — the integer IS the major amount, so\n * dividing by 100 would render the price 100× too small. Pinned to\n * Stripe's list: https://stripe.com/docs/currencies#zero-decimal\n *\n * Kept in step with `ZERO_DECIMAL_CURRENCIES` in\n * `src/components/payment-form/payment-form.tsx`. Consolidating the two\n * into one exported set is a follow-up — payment-form is a shipped\n * subpath entry and re-pointing it is out of scope here.\n */\nconst ZERO_DECIMAL_CURRENCIES = new Set<string>([\n 'BIF',\n 'CLP',\n 'DJF',\n 'GNF',\n 'IDR',\n 'JPY',\n 'KMF',\n 'KRW',\n 'MGA',\n 'PYG',\n 'RWF',\n 'UGX',\n 'VND',\n 'VUV',\n 'XAF',\n 'XOF',\n 'XPF',\n]);\n\nexport function formatPrice(\n minorUnits: number,\n currency: string,\n locale: string,\n): string {\n const iso = currency.toUpperCase();\n const major = ZERO_DECIMAL_CURRENCIES.has(iso)\n ? minorUnits\n : minorUnits / 100;\n try {\n return new Intl.NumberFormat(numberLocale(locale), {\n style: 'currency',\n currency: iso,\n }).format(major);\n } catch {\n // Locale or currency code rejected. Fall back to a plain amount — but\n // keep the zero-decimal rule, or the fallback would reintroduce the very\n // bug this module exists to fix (`JPY 8000` reading as \"8000.00\"), and\n // keep the ISO code so the reader is not left with a bare number.\n const amount = ZERO_DECIMAL_CURRENCIES.has(iso)\n ? String(major)\n : major.toFixed(2);\n return `${amount} ${iso}`;\n }\n}\n\n/**\n * A first-visit price caption: `0` means the visit is free, so it reads as\n * the caller's translated word (\"Free\" / \"Gratuito\"), never as \"€0.00\".\n * Any other amount goes through {@link formatPrice} unchanged.\n */\nexport function formatPriceOrFree(\n minorUnits: number,\n currency: string,\n locale: string,\n freeLabel: string,\n): string {\n return minorUnits === 0\n ? freeLabel\n : formatPrice(minorUnits, currency, locale);\n}\n\n/**\n * The same amount as {@link formatPrice}, but broken into its typed parts so\n * a renderer can treat the fraction differently from the rest.\n *\n * Splitting a formatted price with a regex is not safe across locales: in\n * `it-IT` the group separator is `.` and the decimal is `,`, so `1.000 €`\n * would read as a fraction of `000` and a \"drop the zero fraction\" rule\n * would render it as `1 €`. `Intl.NumberFormat.formatToParts` labels each\n * piece, so the fraction is whatever the locale says it is, wherever it\n * sits relative to the currency symbol.\n *\n * Returns `null` when the locale or currency is rejected — callers fall\n * back to {@link formatPrice}, which keeps the zero-decimal rule.\n */\nexport function formatPriceParts(\n minorUnits: number,\n currency: string,\n locale: string,\n options: Pick<Intl.NumberFormatOptions, 'signDisplay'> = {},\n): Intl.NumberFormatPart[] | null {\n const iso = currency.toUpperCase();\n const major = ZERO_DECIMAL_CURRENCIES.has(iso)\n ? minorUnits\n : minorUnits / 100;\n try {\n return new Intl.NumberFormat(numberLocale(locale), {\n style: 'currency',\n currency: iso,\n ...options,\n }).formatToParts(major);\n } catch {\n return null;\n }\n}\n"],"names":["ZERO_DECIMAL_CURRENCIES","formatPrice","minorUnits","currency","locale","iso","major","numberLocale","formatPriceOrFree","freeLabel","formatPriceParts","options"],"mappings":";AAgCA,MAAMA,wBAA8B,IAAY;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAASC,EACdC,GACAC,GACAC,GACQ;AACR,QAAMC,IAAMF,EAAS,YAAA,GACfG,IAAQN,EAAwB,IAAIK,CAAG,IACzCH,IACAA,IAAa;AACjB,MAAI;AACF,WAAO,IAAI,KAAK,aAAaK,EAAaH,CAAM,GAAG;AAAA,MACjD,OAAO;AAAA,MACP,UAAUC;AAAA,IAAA,CACX,EAAE,OAAOC,CAAK;AAAA,EACjB,QAAQ;AAQN,WAAO,GAHQN,EAAwB,IAAIK,CAAG,IAC1C,OAAOC,CAAK,IACZA,EAAM,QAAQ,CAAC,CACH,IAAID,CAAG;AAAA,EACzB;AACF;AAOO,SAASG,EACdN,GACAC,GACAC,GACAK,GACQ;AACR,SAAOP,MAAe,IAClBO,IACAR,EAAYC,GAAYC,GAAUC,CAAM;AAC9C;AAgBO,SAASM,EACdR,GACAC,GACAC,GACAO,IAAyD,CAAA,GACzB;AAChC,QAAMN,IAAMF,EAAS,YAAA,GACfG,IAAQN,EAAwB,IAAIK,CAAG,IACzCH,IACAA,IAAa;AACjB,MAAI;AACF,WAAO,IAAI,KAAK,aAAaK,EAAaH,CAAM,GAAG;AAAA,MACjD,OAAO;AAAA,MACP,UAAUC;AAAA,MACV,GAAGM;AAAA,IAAA,CACJ,EAAE,cAAcL,CAAK;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;"}
@@ -9,7 +9,7 @@ import { u as $ } from "./use-select-on-arrow-Cr4iBuW5.js";
9
9
  import { u as ee } from "./registry-DvAUVLHh.js";
10
10
  import { B as R } from "./button-D-MQxsA_.js";
11
11
  import { P as ae } from "./progress-D_g_Sl2g.js";
12
- import { f as se } from "./payment-form-i90DUuNK.js";
12
+ import { f as se } from "./payment-form-C3dGY7v4.js";
13
13
  import { T as re } from "./triangle-alert-CBnO6nq_.js";
14
14
  import { C as te } from "./check-DrFSN__t.js";
15
15
  const de = {
@@ -282,4 +282,4 @@ export {
282
282
  le as F,
283
283
  de as f
284
284
  };
285
- //# sourceMappingURL=freemium-paywall-r-z48YaT.js.map
285
+ //# sourceMappingURL=freemium-paywall-DKJHRFpp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"freemium-paywall-r-z48YaT.js","sources":["../../src/components/freemium-paywall/freemium-paywall.agent.ts","../../src/components/freemium-paywall/freemium-paywall.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — FreemiumPaywall. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { FreemiumPaywallHandle } from './freemium-paywall';\n\nexport const freemiumPaywallAgent: AgentAdapter<FreemiumPaywallHandle> = {\n id: 'freemium-paywall',\n capabilities: ['submit', 'dismiss'],\n state: {\n isOpen: {\n type: 'boolean',\n descriptionKey: 'ui.agent.freemiumPaywall.state.isOpen',\n description: 'True when the paywall dialog is open.',\n read: (handle) => handle.isOpen(),\n },\n selectedPlanId: {\n type: 'string | null',\n descriptionKey: 'ui.agent.freemiumPaywall.state.selectedPlanId',\n description: 'Opaque id of the currently-selected plan.',\n read: (handle) => handle.getSelectedPlanId(),\n },\n },\n actions: {\n upgrade: {\n safety: 'write',\n // Backs the `submit` capability: commits the current plan selection\n // to the host's upgrade flow (checkout / billing).\n openWorld: true,\n descriptionKey: 'ui.agent.freemiumPaywall.actions.upgrade',\n description: 'Fire onUpgrade with the currently-selected plan id.',\n errors: ['No plan selected — upgrade is a no-op until a plan is chosen.'],\n invoke: (handle) => {\n handle.upgrade();\n },\n },\n dismiss: {\n safety: 'destructive',\n // Backs the `dismiss` capability.\n descriptionKey: 'ui.agent.freemiumPaywall.actions.dismiss',\n description:\n 'Dismiss the paywall via the Not Now action. Irreversible from the same UI.',\n invoke: (handle) => {\n handle.dismiss();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'freemium-paywall',\n description: 'Marks the FreemiumPaywall dialog content.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n type ReactNode,\n} from 'react';\nimport * as RadixAlertDialog from '@radix-ui/react-alert-dialog';\nimport * as RadixRadioGroup from '@radix-ui/react-radio-group';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useControllableState } from '../../hooks/use-controllable-state';\nimport { useSelectOnArrow } from '../_shared/use-select-on-arrow';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { freemiumPaywallAgent } from './freemium-paywall.agent';\nimport { TriangleAlert, Check } from 'lucide-react';\nimport { Button } from '../button';\nimport { Progress } from '../progress';\nimport { formatPaymentAmount } from '../payment-form';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface FreemiumPlan {\n id: string;\n /** Translation key for the plan name (e.g. `app.paywall.plans.pro`). */\n nameKey: string;\n /** Amount in minor units (cents, centesimi). */\n priceAmount: number;\n /** ISO 4217 currency code. */\n currency: string;\n /** Translation key for the cadence suffix (e.g. `app.paywall.period.month`). */\n perKey?: string;\n /** Per-line feature translation keys. */\n featuresKeys?: string[];\n}\n\nconst contentVariants = cva(\n [\n 'ds:fixed ds:z-[var(--z-modal)] ds:overflow-auto',\n 'ds:bg-[color:var(--popover)] ds:text-[color:var(--popover-foreground)]',\n 'ds:border ds:border-border ds:shadow-[var(--shadow-lg)]',\n // forced-colors: keep the dialog boundary visible under Windows High\n // Contrast, where `var(--border)` may collapse to system colours.\n 'ds:forced-colors:border-[CanvasText]',\n 'ds:focus:outline-none',\n ].join(' '),\n {\n variants: {\n layout: {\n centered:\n 'ds:start-1/2 ds:top-1/2 ds:-translate-x-1/2 ds:-translate-y-1/2 ds:rtl:translate-x-1/2 ds:rounded-[var(--radius-md)] ds:max-w-[var(--dialog-width-xl)] ds:w-[calc(100vw-2rem)] ds:max-h-[90vh]',\n sheet:\n // `inset-x-0` compiles to logical `inset-inline`; the\n // `inset-inline-0` spelling compiled to nothing.\n 'ds:inset-x-0 ds:bottom-0 ds:w-full ds:max-h-[90vh] ds:rounded-t-[var(--radius-md)]',\n },\n density: {\n compact:\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n full: 'ds:ps-[var(--spacing-lg)] ds:pe-[var(--spacing-lg)] ds:pt-[var(--spacing-lg)] ds:pb-[var(--spacing-lg)]',\n },\n },\n defaultVariants: { layout: 'centered', density: 'full' },\n },\n);\n\n/** Curated imperative handle for agent / external automation. */\nexport interface FreemiumPaywallHandle {\n isOpen: () => boolean;\n getSelectedPlanId: () => string | null;\n upgrade: () => void;\n dismiss: () => void;\n}\n\nexport interface FreemiumPaywallProps extends VariantProps<\n typeof contentVariants\n> {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n plans: FreemiumPlan[];\n /** Currently-selected plan id (controlled) or default. */\n selectedPlanId?: string;\n defaultSelectedPlanId?: string;\n onSelectedPlanChange?: (id: string) => void;\n /** Usage indicator values — omit the object to hide the bar. */\n usage?: { used: number; limit: number };\n /** Fires on upgrade. */\n onUpgrade: (planId: string) => void;\n /** Fires when the user dismisses via Not Now. */\n onCancel?: () => void;\n /** Title override; defaults to t('paywall.title'). */\n title?: ReactNode;\n /** Description override; defaults to t('paywall.description'). */\n description?: ReactNode;\n /**\n * Stable instance id. Emitted on the dialog content as\n * `data-component-id` and used as the agent-registry instance key so\n * a host can address this specific paywall.\n */\n id?: string;\n className?: string;\n}\n\nexport const FreemiumPaywall = forwardRef<HTMLDivElement, FreemiumPaywallProps>(\n (\n {\n open,\n onOpenChange,\n plans,\n selectedPlanId,\n defaultSelectedPlanId,\n onSelectedPlanChange,\n usage,\n onUpgrade,\n onCancel,\n title,\n description,\n id,\n layout = 'centered',\n density = 'full',\n className,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation('ui');\n const titleId = useId();\n const descId = useId();\n\n const [currentSelectedRaw, handleSelectedChange] =\n useControllableState<string>({\n value: selectedPlanId,\n defaultValue: defaultSelectedPlanId ?? plans[0]?.id ?? '',\n onChange: onSelectedPlanChange,\n });\n const currentSelected = currentSelectedRaw ?? '';\n const selectOnArrow = useSelectOnArrow();\n\n const handleCancel = () => {\n onCancel?.();\n onOpenChange(false);\n };\n\n const handleUpgrade = () => {\n if (!currentSelected) return;\n onUpgrade(currentSelected);\n };\n\n const openRef = useRef(open);\n openRef.current = open;\n const selectedRef = useRef<string>(currentSelected);\n selectedRef.current = currentSelected;\n\n const contentRef = useRef<HTMLDivElement>(null);\n useImperativeHandle(ref, () => contentRef.current as HTMLDivElement, []);\n\n const agentHandle = useMemo<FreemiumPaywallHandle>(\n () => ({\n isOpen: () => openRef.current,\n getSelectedPlanId: () => selectedRef.current || null,\n upgrade: () => handleUpgrade(),\n dismiss: () => handleCancel(),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n useAgentRegistration(freemiumPaywallAgent, agentHandle, id);\n\n const usagePercent = usage\n ? Math.min(\n 100,\n Math.max(0, (usage.used / Math.max(1, usage.limit)) * 100),\n )\n : 0;\n const usageFull = usage ? usage.used >= usage.limit : false;\n\n return (\n <RadixAlertDialog.Root open={open} onOpenChange={onOpenChange}>\n <RadixAlertDialog.Portal>\n <RadixAlertDialog.Overlay\n className={[\n 'ds:fixed ds:inset-0 ds:z-[var(--z-modal-backdrop)]',\n 'ds:bg-[color:var(--background)]/70',\n 'ds:motion-safe:data-[state=open]:animate-in ds:motion-safe:data-[state=closed]:animate-out',\n // --animation-duration is 0ms in the accessible themes, as on\n // Dialog, so the overlay does not animate there.\n 'ds:duration-[var(--animation-duration)]',\n ].join(' ')}\n />\n <RadixAlertDialog.Content\n ref={contentRef}\n aria-labelledby={titleId}\n aria-describedby={descId}\n className={contentVariants({ layout, density, className })}\n data-component=\"freemium-paywall\"\n data-component-id={id}\n >\n <RadixAlertDialog.Title id={titleId} asChild>\n <h2 className=\"type-title-card\">{title ?? t('paywall.title')}</h2>\n </RadixAlertDialog.Title>\n <RadixAlertDialog.Description id={descId} asChild>\n <p className=\"ds:mt-[var(--spacing-xs)] ds:text-[color:var(--muted-foreground)]\">\n {description ?? t('paywall.description')}\n </p>\n </RadixAlertDialog.Description>\n\n {usage ? (\n <div className=\"ds:mt-[var(--spacing-md)]\">\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)] ds:mb-[var(--spacing-xs)]\">\n {usageFull ? (\n <TriangleAlert\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:text-[color:var(--destructive)]\"\n />\n ) : null}\n <span\n className={[\n 'type-body-sm',\n usageFull\n ? 'ds:text-[color:var(--destructive)]'\n : 'ds:text-[color:var(--muted-foreground)]',\n ].join(' ')}\n >\n {usageFull\n ? t('paywall.usageFull')\n : t('paywall.usageLabel', {\n used: usage.used,\n limit: usage.limit,\n })}\n </span>\n </div>\n <Progress\n value={usagePercent}\n max={100}\n ariaLabel={t('paywall.usageLabel', {\n used: usage.used,\n limit: usage.limit,\n })}\n className={\n usageFull\n ? 'ds:[&_[role=progressbar]>*]:bg-[color:var(--destructive)]'\n : ''\n }\n />\n </div>\n ) : null}\n\n <RadixRadioGroup.Root\n value={currentSelected}\n onValueChange={(next) => {\n selectOnArrow.noteSelection();\n handleSelectedChange(next);\n }}\n onKeyDown={selectOnArrow.onKeyDown}\n aria-label={t('paywall.title')}\n className=\"ds:mt-[var(--spacing-md)] ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\"\n >\n {plans.map((plan) => {\n // Reuse the payment-form helper — it knows about\n // zero-decimal currencies (JPY, KRW, VND …) and applies\n // the right divisor. Raw `/ 100` would 100× the price in\n // those currencies.\n const formattedPrice = formatPaymentAmount(\n plan.priceAmount,\n plan.currency,\n i18n.language,\n );\n const period = plan.perKey ? t(plan.perKey) : undefined;\n const priceLine = period\n ? t('paywall.pricePer', { price: formattedPrice, period })\n : formattedPrice;\n const planName = t(plan.nameKey);\n return (\n <RadixRadioGroup.Item\n key={plan.id}\n value={plan.id}\n className={[\n 'ds:group ds:relative ds:flex ds:flex-col ds:items-stretch',\n 'ds:rounded-[var(--radius-md)] ds:[:where(&)]:border-[length:var(--surface-border-width,var(--border-width-sm))] ds:border-[color:var(--card-border)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'ds:text-start ds:bg-[color:var(--card)] ds:text-[color:var(--card-foreground)]',\n 'ds:data-[state=checked]:border-[color:var(--primary)]',\n 'ds:data-[state=checked]:bg-[color:var(--primary)]/5',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n ].join(' ')}\n >\n <span className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <span className=\"ds:font-semibold\">{planName}</span>\n <span className=\"ds:tabular-nums\">{priceLine}</span>\n </span>\n {plan.featuresKeys && plan.featuresKeys.length > 0 ? (\n <ul\n aria-label={t('paywall.features')}\n className=\"ds:mt-[var(--spacing-xs)] ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n >\n {plan.featuresKeys.map((key, i) => (\n <li\n key={i}\n className=\"ds:flex ds:items-start ds:gap-[var(--spacing-xs)] type-body-sm\"\n >\n <Check\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:shrink-0 ds:text-[color:var(--primary)] ds:mt-[1px]\"\n />\n <span>{t(key)}</span>\n </li>\n ))}\n </ul>\n ) : null}\n </RadixRadioGroup.Item>\n );\n })}\n </RadixRadioGroup.Root>\n\n {/* Stacks full-width in DOM order below 384px, as Dialog.Footer does. */}\n <div className=\"ds:@container/paywall-actions ds:mt-[var(--spacing-lg)] ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)] ds:justify-end ds:@max-[384px]/paywall-actions:[&>*]:w-full\">\n <RadixAlertDialog.Cancel asChild>\n <Button intent=\"outline\" onClick={handleCancel}>\n {t('paywall.notNow')}\n </Button>\n </RadixAlertDialog.Cancel>\n <RadixAlertDialog.Action asChild>\n <Button intent=\"primary\" onClick={handleUpgrade}>\n {t('paywall.upgrade')}\n </Button>\n </RadixAlertDialog.Action>\n </div>\n </RadixAlertDialog.Content>\n </RadixAlertDialog.Portal>\n </RadixAlertDialog.Root>\n );\n },\n);\n\nFreemiumPaywall.displayName = 'FreemiumPaywall';\n"],"names":["freemiumPaywallAgent","handle","contentVariants","cva","FreemiumPaywall","forwardRef","open","onOpenChange","plans","selectedPlanId","defaultSelectedPlanId","onSelectedPlanChange","usage","onUpgrade","onCancel","title","description","id","layout","density","className","ref","t","i18n","useTranslation","titleId","useId","descId","currentSelectedRaw","handleSelectedChange","useControllableState","_a","currentSelected","selectOnArrow","useSelectOnArrow","handleCancel","handleUpgrade","openRef","useRef","selectedRef","contentRef","useImperativeHandle","agentHandle","useMemo","useAgentRegistration","usagePercent","usageFull","jsx","RadixAlertDialog","jsxs","TriangleAlert","Progress","RadixRadioGroup","next","plan","formattedPrice","formatPaymentAmount","period","priceLine","planName","key","i","Check","Button"],"mappings":"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"}
1
+ {"version":3,"file":"freemium-paywall-DKJHRFpp.js","sources":["../../src/components/freemium-paywall/freemium-paywall.agent.ts","../../src/components/freemium-paywall/freemium-paywall.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — FreemiumPaywall. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { FreemiumPaywallHandle } from './freemium-paywall';\n\nexport const freemiumPaywallAgent: AgentAdapter<FreemiumPaywallHandle> = {\n id: 'freemium-paywall',\n capabilities: ['submit', 'dismiss'],\n state: {\n isOpen: {\n type: 'boolean',\n descriptionKey: 'ui.agent.freemiumPaywall.state.isOpen',\n description: 'True when the paywall dialog is open.',\n read: (handle) => handle.isOpen(),\n },\n selectedPlanId: {\n type: 'string | null',\n descriptionKey: 'ui.agent.freemiumPaywall.state.selectedPlanId',\n description: 'Opaque id of the currently-selected plan.',\n read: (handle) => handle.getSelectedPlanId(),\n },\n },\n actions: {\n upgrade: {\n safety: 'write',\n // Backs the `submit` capability: commits the current plan selection\n // to the host's upgrade flow (checkout / billing).\n openWorld: true,\n descriptionKey: 'ui.agent.freemiumPaywall.actions.upgrade',\n description: 'Fire onUpgrade with the currently-selected plan id.',\n errors: ['No plan selected — upgrade is a no-op until a plan is chosen.'],\n invoke: (handle) => {\n handle.upgrade();\n },\n },\n dismiss: {\n safety: 'destructive',\n // Backs the `dismiss` capability.\n descriptionKey: 'ui.agent.freemiumPaywall.actions.dismiss',\n description:\n 'Dismiss the paywall via the Not Now action. Irreversible from the same UI.',\n invoke: (handle) => {\n handle.dismiss();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'freemium-paywall',\n description: 'Marks the FreemiumPaywall dialog content.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n type ReactNode,\n} from 'react';\nimport * as RadixAlertDialog from '@radix-ui/react-alert-dialog';\nimport * as RadixRadioGroup from '@radix-ui/react-radio-group';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useControllableState } from '../../hooks/use-controllable-state';\nimport { useSelectOnArrow } from '../_shared/use-select-on-arrow';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { freemiumPaywallAgent } from './freemium-paywall.agent';\nimport { TriangleAlert, Check } from 'lucide-react';\nimport { Button } from '../button';\nimport { Progress } from '../progress';\nimport { formatPaymentAmount } from '../payment-form';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface FreemiumPlan {\n id: string;\n /** Translation key for the plan name (e.g. `app.paywall.plans.pro`). */\n nameKey: string;\n /** Amount in minor units (cents, centesimi). */\n priceAmount: number;\n /** ISO 4217 currency code. */\n currency: string;\n /** Translation key for the cadence suffix (e.g. `app.paywall.period.month`). */\n perKey?: string;\n /** Per-line feature translation keys. */\n featuresKeys?: string[];\n}\n\nconst contentVariants = cva(\n [\n 'ds:fixed ds:z-[var(--z-modal)] ds:overflow-auto',\n 'ds:bg-[color:var(--popover)] ds:text-[color:var(--popover-foreground)]',\n 'ds:border ds:border-border ds:shadow-[var(--shadow-lg)]',\n // forced-colors: keep the dialog boundary visible under Windows High\n // Contrast, where `var(--border)` may collapse to system colours.\n 'ds:forced-colors:border-[CanvasText]',\n 'ds:focus:outline-none',\n ].join(' '),\n {\n variants: {\n layout: {\n centered:\n 'ds:start-1/2 ds:top-1/2 ds:-translate-x-1/2 ds:-translate-y-1/2 ds:rtl:translate-x-1/2 ds:rounded-[var(--radius-md)] ds:max-w-[var(--dialog-width-xl)] ds:w-[calc(100vw-2rem)] ds:max-h-[90vh]',\n sheet:\n // `inset-x-0` compiles to logical `inset-inline`; the\n // `inset-inline-0` spelling compiled to nothing.\n 'ds:inset-x-0 ds:bottom-0 ds:w-full ds:max-h-[90vh] ds:rounded-t-[var(--radius-md)]',\n },\n density: {\n compact:\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n full: 'ds:ps-[var(--spacing-lg)] ds:pe-[var(--spacing-lg)] ds:pt-[var(--spacing-lg)] ds:pb-[var(--spacing-lg)]',\n },\n },\n defaultVariants: { layout: 'centered', density: 'full' },\n },\n);\n\n/** Curated imperative handle for agent / external automation. */\nexport interface FreemiumPaywallHandle {\n isOpen: () => boolean;\n getSelectedPlanId: () => string | null;\n upgrade: () => void;\n dismiss: () => void;\n}\n\nexport interface FreemiumPaywallProps extends VariantProps<\n typeof contentVariants\n> {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n plans: FreemiumPlan[];\n /** Currently-selected plan id (controlled) or default. */\n selectedPlanId?: string;\n defaultSelectedPlanId?: string;\n onSelectedPlanChange?: (id: string) => void;\n /** Usage indicator values — omit the object to hide the bar. */\n usage?: { used: number; limit: number };\n /** Fires on upgrade. */\n onUpgrade: (planId: string) => void;\n /** Fires when the user dismisses via Not Now. */\n onCancel?: () => void;\n /** Title override; defaults to t('paywall.title'). */\n title?: ReactNode;\n /** Description override; defaults to t('paywall.description'). */\n description?: ReactNode;\n /**\n * Stable instance id. Emitted on the dialog content as\n * `data-component-id` and used as the agent-registry instance key so\n * a host can address this specific paywall.\n */\n id?: string;\n className?: string;\n}\n\nexport const FreemiumPaywall = forwardRef<HTMLDivElement, FreemiumPaywallProps>(\n (\n {\n open,\n onOpenChange,\n plans,\n selectedPlanId,\n defaultSelectedPlanId,\n onSelectedPlanChange,\n usage,\n onUpgrade,\n onCancel,\n title,\n description,\n id,\n layout = 'centered',\n density = 'full',\n className,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation('ui');\n const titleId = useId();\n const descId = useId();\n\n const [currentSelectedRaw, handleSelectedChange] =\n useControllableState<string>({\n value: selectedPlanId,\n defaultValue: defaultSelectedPlanId ?? plans[0]?.id ?? '',\n onChange: onSelectedPlanChange,\n });\n const currentSelected = currentSelectedRaw ?? '';\n const selectOnArrow = useSelectOnArrow();\n\n const handleCancel = () => {\n onCancel?.();\n onOpenChange(false);\n };\n\n const handleUpgrade = () => {\n if (!currentSelected) return;\n onUpgrade(currentSelected);\n };\n\n const openRef = useRef(open);\n openRef.current = open;\n const selectedRef = useRef<string>(currentSelected);\n selectedRef.current = currentSelected;\n\n const contentRef = useRef<HTMLDivElement>(null);\n useImperativeHandle(ref, () => contentRef.current as HTMLDivElement, []);\n\n const agentHandle = useMemo<FreemiumPaywallHandle>(\n () => ({\n isOpen: () => openRef.current,\n getSelectedPlanId: () => selectedRef.current || null,\n upgrade: () => handleUpgrade(),\n dismiss: () => handleCancel(),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n useAgentRegistration(freemiumPaywallAgent, agentHandle, id);\n\n const usagePercent = usage\n ? Math.min(\n 100,\n Math.max(0, (usage.used / Math.max(1, usage.limit)) * 100),\n )\n : 0;\n const usageFull = usage ? usage.used >= usage.limit : false;\n\n return (\n <RadixAlertDialog.Root open={open} onOpenChange={onOpenChange}>\n <RadixAlertDialog.Portal>\n <RadixAlertDialog.Overlay\n className={[\n 'ds:fixed ds:inset-0 ds:z-[var(--z-modal-backdrop)]',\n 'ds:bg-[color:var(--background)]/70',\n 'ds:motion-safe:data-[state=open]:animate-in ds:motion-safe:data-[state=closed]:animate-out',\n // --animation-duration is 0ms in the accessible themes, as on\n // Dialog, so the overlay does not animate there.\n 'ds:duration-[var(--animation-duration)]',\n ].join(' ')}\n />\n <RadixAlertDialog.Content\n ref={contentRef}\n aria-labelledby={titleId}\n aria-describedby={descId}\n className={contentVariants({ layout, density, className })}\n data-component=\"freemium-paywall\"\n data-component-id={id}\n >\n <RadixAlertDialog.Title id={titleId} asChild>\n <h2 className=\"type-title-card\">{title ?? t('paywall.title')}</h2>\n </RadixAlertDialog.Title>\n <RadixAlertDialog.Description id={descId} asChild>\n <p className=\"ds:mt-[var(--spacing-xs)] ds:text-[color:var(--muted-foreground)]\">\n {description ?? t('paywall.description')}\n </p>\n </RadixAlertDialog.Description>\n\n {usage ? (\n <div className=\"ds:mt-[var(--spacing-md)]\">\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)] ds:mb-[var(--spacing-xs)]\">\n {usageFull ? (\n <TriangleAlert\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:text-[color:var(--destructive)]\"\n />\n ) : null}\n <span\n className={[\n 'type-body-sm',\n usageFull\n ? 'ds:text-[color:var(--destructive)]'\n : 'ds:text-[color:var(--muted-foreground)]',\n ].join(' ')}\n >\n {usageFull\n ? t('paywall.usageFull')\n : t('paywall.usageLabel', {\n used: usage.used,\n limit: usage.limit,\n })}\n </span>\n </div>\n <Progress\n value={usagePercent}\n max={100}\n ariaLabel={t('paywall.usageLabel', {\n used: usage.used,\n limit: usage.limit,\n })}\n className={\n usageFull\n ? 'ds:[&_[role=progressbar]>*]:bg-[color:var(--destructive)]'\n : ''\n }\n />\n </div>\n ) : null}\n\n <RadixRadioGroup.Root\n value={currentSelected}\n onValueChange={(next) => {\n selectOnArrow.noteSelection();\n handleSelectedChange(next);\n }}\n onKeyDown={selectOnArrow.onKeyDown}\n aria-label={t('paywall.title')}\n className=\"ds:mt-[var(--spacing-md)] ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\"\n >\n {plans.map((plan) => {\n // Reuse the payment-form helper — it knows about\n // zero-decimal currencies (JPY, KRW, VND …) and applies\n // the right divisor. Raw `/ 100` would 100× the price in\n // those currencies.\n const formattedPrice = formatPaymentAmount(\n plan.priceAmount,\n plan.currency,\n i18n.language,\n );\n const period = plan.perKey ? t(plan.perKey) : undefined;\n const priceLine = period\n ? t('paywall.pricePer', { price: formattedPrice, period })\n : formattedPrice;\n const planName = t(plan.nameKey);\n return (\n <RadixRadioGroup.Item\n key={plan.id}\n value={plan.id}\n className={[\n 'ds:group ds:relative ds:flex ds:flex-col ds:items-stretch',\n 'ds:rounded-[var(--radius-md)] ds:[:where(&)]:border-[length:var(--surface-border-width,var(--border-width-sm))] ds:border-[color:var(--card-border)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'ds:text-start ds:bg-[color:var(--card)] ds:text-[color:var(--card-foreground)]',\n 'ds:data-[state=checked]:border-[color:var(--primary)]',\n 'ds:data-[state=checked]:bg-[color:var(--primary)]/5',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n ].join(' ')}\n >\n <span className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <span className=\"ds:font-semibold\">{planName}</span>\n <span className=\"ds:tabular-nums\">{priceLine}</span>\n </span>\n {plan.featuresKeys && plan.featuresKeys.length > 0 ? (\n <ul\n aria-label={t('paywall.features')}\n className=\"ds:mt-[var(--spacing-xs)] ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n >\n {plan.featuresKeys.map((key, i) => (\n <li\n key={i}\n className=\"ds:flex ds:items-start ds:gap-[var(--spacing-xs)] type-body-sm\"\n >\n <Check\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:shrink-0 ds:text-[color:var(--primary)] ds:mt-[1px]\"\n />\n <span>{t(key)}</span>\n </li>\n ))}\n </ul>\n ) : null}\n </RadixRadioGroup.Item>\n );\n })}\n </RadixRadioGroup.Root>\n\n {/* Stacks full-width in DOM order below 384px, as Dialog.Footer does. */}\n <div className=\"ds:@container/paywall-actions ds:mt-[var(--spacing-lg)] ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)] ds:justify-end ds:@max-[384px]/paywall-actions:[&>*]:w-full\">\n <RadixAlertDialog.Cancel asChild>\n <Button intent=\"outline\" onClick={handleCancel}>\n {t('paywall.notNow')}\n </Button>\n </RadixAlertDialog.Cancel>\n <RadixAlertDialog.Action asChild>\n <Button intent=\"primary\" onClick={handleUpgrade}>\n {t('paywall.upgrade')}\n </Button>\n </RadixAlertDialog.Action>\n </div>\n </RadixAlertDialog.Content>\n </RadixAlertDialog.Portal>\n </RadixAlertDialog.Root>\n );\n },\n);\n\nFreemiumPaywall.displayName = 'FreemiumPaywall';\n"],"names":["freemiumPaywallAgent","handle","contentVariants","cva","FreemiumPaywall","forwardRef","open","onOpenChange","plans","selectedPlanId","defaultSelectedPlanId","onSelectedPlanChange","usage","onUpgrade","onCancel","title","description","id","layout","density","className","ref","t","i18n","useTranslation","titleId","useId","descId","currentSelectedRaw","handleSelectedChange","useControllableState","_a","currentSelected","selectOnArrow","useSelectOnArrow","handleCancel","handleUpgrade","openRef","useRef","selectedRef","contentRef","useImperativeHandle","agentHandle","useMemo","useAgentRegistration","usagePercent","usageFull","jsx","RadixAlertDialog","jsxs","TriangleAlert","Progress","RadixRadioGroup","next","plan","formattedPrice","formatPaymentAmount","period","priceLine","planName","key","i","Check","Button"],"mappings":"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"}
@@ -6,15 +6,15 @@ import { u as ue } from "./registry-DvAUVLHh.js";
6
6
  import { R as d } from "./radio-BZQs6_36.js";
7
7
  import { R as S } from "./radio-group-ChIKyeSJ.js";
8
8
  import { F as k } from "./form-field-Ani72sVY.js";
9
- import { D as _ } from "./date-picker-BSZuKo13.js";
9
+ import { D as _ } from "./date-picker-KcoNNsM0.js";
10
10
  import { S as me } from "./select-k4gBdS8N.js";
11
11
  import { S as ge } from "./switch-D--x7n6h.js";
12
12
  import { C as E } from "./card-BA4Ig_kn.js";
13
13
  import { B as G } from "./badge-BUk4RjTS.js";
14
14
  import { I as pe } from "./insert-result-h3WL-gMo.js";
15
- import { c as he, g as fe, e as ye, f as ve, A as be, h as Ae, i as De, G as Ce } from "./antenatal-schedule-timeline-DuaAQj1m.js";
16
- import { s as we } from "./subDays-DlMw8Xng.js";
17
- import { d as j } from "./date-picker-variants-BnF-sHzq.js";
15
+ import { c as he, g as fe, e as ye, f as ve, A as be, h as Ae, i as De, G as Ce } from "./antenatal-schedule-timeline-DW_qkGo1.js";
16
+ import { s as we } from "./subDays-xH7cpN6B.js";
17
+ import { d as j } from "./date-picker-variants-DN37Oj5-.js";
18
18
  import { p as Se } from "./parseISO-y3LncvfO.js";
19
19
  import { f as ke } from "./format-D-1gTdHF.js";
20
20
  const x = "Superseded by the `pregnancy-dating` adapter.", F = {
@@ -485,4 +485,4 @@ Re.displayName = "GestationalAgeCalculator";
485
485
  export {
486
486
  Re as G
487
487
  };
488
- //# sourceMappingURL=gestational-age-calculator-BnCAL5a-.js.map
488
+ //# sourceMappingURL=gestational-age-calculator-CZYa2D6m.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gestational-age-calculator-BnCAL5a-.js","sources":["../../src/components/gestational-age-calculator/gestational-age-calculator.agent.ts","../../src/components/gestational-age-calculator/gestational-age-calculator.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — GestationalAgeCalculator. */\n/* */\n/* Clinical calculator: a known LMP or due date → current gestational */\n/* age, trimester and milestone dates (with an optional antenatal exam */\n/* schedule). The agent surface is the dating inputs plus the computed */\n/* gestational age / trimester / due date; the handle is the curated */\n/* `GestationalAgeCalculatorHandle` (the public `ref` stays the root */\n/* <div>, exactly as `slider.tsx` and `bmi-calculator.tsx` keep theirs). */\n/* */\n/* Dates cross the boundary as local-time `yyyy-MM-dd` strings, never */\n/* `Date` objects, so nothing shifts a day under JSON/UTC serialisation. */\n/* */\n/* DEPRECATED surface: this component is superseded by PregnancyDating, */\n/* which unifies dating + gestational age. Prefer the `pregnancy-dating` */\n/* adapter for new work — every action here is marked deprecated. */\n/* */\n/* PHI (§7): never exposes patient identity — the slots return the */\n/* operator's own structural dating inputs and the dates derived from */\n/* them. See `src/docs/26-agent-readiness.mdx`. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { GestationalAgeCalculatorHandle } from './gestational-age-calculator';\n\nconst DEPRECATED = 'Superseded by the `pregnancy-dating` adapter.';\n\n/** Shared JSON Schema fragment for a local calendar date. */\nconst isoDate = {\n type: 'string',\n pattern: '^\\\\d{4}-\\\\d{2}-\\\\d{2}$',\n} as const;\n\nexport const gestationalAgeCalculatorAgent: AgentAdapter<GestationalAgeCalculatorHandle> =\n {\n id: 'gestational-age-calculator',\n // set_value → the three `set_*` actions + the `inputs` state slot.\n capabilities: ['set_value'],\n state: {\n inputs: {\n type: \"{ method: 'lmp' | 'edd', referenceDate: string | null, asOfDate: string }\",\n descriptionKey: 'ui.agent.gestationalAgeCalculator.state.inputs',\n description:\n 'The dating inputs as entered — whether the reference date is a last period or a known due date, that date, and the evaluation date. Dates are `yyyy-MM-dd`. Read this to see which method a reference date will be interpreted under.',\n read: (handle) => handle.getInputs(),\n },\n result: {\n type: '{ gestationalAge: { weeks: number, days: number, totalDays: number } | null, trimester: string, dueDate: string } | null',\n descriptionKey: 'ui.agent.gestationalAgeCalculator.state.result',\n description:\n 'Computed gestational age in completed weeks + days as of the evaluation date, the trimester band (preconception / first / second / third / postterm), and the estimated delivery date. Null until a reference date is set.',\n read: (handle) => handle.getResult(),\n },\n },\n actions: {\n set_method: {\n // Drives the same local input state a user picks; nothing is persisted\n // to a record, and the choice is reversible in the same UI.\n safety: 'write',\n argsType: \"{ method: 'lmp' | 'edd' }\",\n argsSchema: {\n type: 'object',\n properties: {\n method: {\n enum: ['lmp', 'edd'],\n description:\n 'Whether the reference date is the last menstrual period or a known estimated delivery date.',\n },\n },\n required: ['method'],\n additionalProperties: false,\n },\n idempotent: true,\n deprecated: DEPRECATED,\n returns: 'boolean',\n returnsSchema: {\n type: 'boolean',\n description: 'True when the method was applied.',\n },\n errors: ['Returns false for a method other than `lmp` or `edd`.'],\n descriptionKey: 'ui.agent.gestationalAgeCalculator.actions.setMethod',\n description:\n 'Choose how the reference date is read. The date is kept and re-interpreted under the new method, so set the method first — an EDD may be in the future, an LMP may not.',\n invoke: (handle, args: { method: 'lmp' | 'edd' }) =>\n handle.setMethod(args.method),\n },\n set_reference_date: {\n safety: 'write',\n argsType: '{ date: string | null }',\n argsSchema: {\n type: 'object',\n properties: {\n date: {\n oneOf: [\n {\n ...isoDate,\n description: 'Local calendar date, `yyyy-MM-dd`.',\n },\n { type: 'null' },\n ],\n description:\n 'The last period (not in the future) or the known due date, depending on the active method — or null to clear it.',\n },\n },\n required: ['date'],\n additionalProperties: false,\n },\n idempotent: true,\n deprecated: DEPRECATED,\n returns: 'boolean',\n returnsSchema: {\n type: 'boolean',\n description: 'True when the date was applied.',\n },\n errors: [\n 'Returns false for an unparseable date, or for a future date under the `lmp` method — the on-screen DatePicker caps an LMP at today.',\n ],\n examples: [\n {\n args: { date: '2026-01-12' },\n note: 'Under the default LMP method, a last period starting 12 January.',\n },\n ],\n descriptionKey:\n 'ui.agent.gestationalAgeCalculator.actions.setReferenceDate',\n description:\n 'Set the dating anchor. This is the only required input — the result stays null without it.',\n invoke: (handle, args: { date: string | null }) =>\n handle.setReferenceDate(args.date),\n },\n set_as_of_date: {\n safety: 'write',\n argsType: '{ date: string }',\n argsSchema: {\n type: 'object',\n properties: {\n date: {\n ...isoDate,\n description:\n 'Date to evaluate gestational age and trimester against, `yyyy-MM-dd`. May be in the future to project forward.',\n },\n },\n required: ['date'],\n additionalProperties: false,\n },\n idempotent: true,\n deprecated: DEPRECATED,\n returns: 'boolean',\n returnsSchema: {\n type: 'boolean',\n description: 'True when the date was applied.',\n },\n errors: ['Returns false for an unparseable date.'],\n examples: [\n {\n args: { date: '2026-09-15' },\n note: 'Project gestational age forward to an upcoming appointment.',\n },\n ],\n descriptionKey: 'ui.agent.gestationalAgeCalculator.actions.setAsOfDate',\n description:\n 'Set the date gestational age, trimester and the antenatal schedule are evaluated against. Defaults to today; the estimated delivery date itself does not depend on it.',\n invoke: (handle, args: { date: string }) =>\n handle.setAsOfDate(args.date),\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'gestational-age-calculator',\n description:\n 'Marks the GestationalAgeCalculator (current gestational age, trimester and milestones from LMP or due date).',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Also the registry key — without an `id` the instance does not register and the handle-driven actions/state are unreachable.',\n },\n },\n };\n","/* ------------------------------------------------------------------ */\n/* GestationalAgeCalculator — current gestational age, trimester and */\n/* milestone dates, from either a known LMP or a known due date. */\n/* */\n/* Reuses the shared `gestation` maths from due-date-calculator: GA day */\n/* 0 is the LMP; from an EDD we back out LMP = EDD − 280 days. */\n/* ------------------------------------------------------------------ */\n\nimport { forwardRef, useEffect, useMemo, useRef, useState } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { format, parseISO, subDays, isAfter } from 'date-fns';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { gestationalAgeCalculatorAgent } from './gestational-age-calculator.agent';\nimport { RadioGroup, Radio } from '../radio-group';\nimport { FormField } from '../form-field';\nimport { DatePicker } from '../date-picker';\nimport { Select } from '../select';\nimport { Switch } from '../switch';\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 Trimester,\n type GestationalAge,\n type Plurality,\n type Chorionicity,\n computeDueDate,\n gestationalMilestones,\n GESTATION_DAYS,\n TRIMESTER_BADGE_VARIANT,\n trimesterHighlightToken,\n} from '../_shared/obstetrics';\nimport {\n computeAntenatalSchedule,\n type AntenatalScheduleOptions,\n type GdmRisk,\n} from '../_shared/antenatal-schedule';\nimport {\n AntenatalScheduleTimeline,\n buildScheduleInsertFields,\n} from '../_shared/antenatal-schedule-timeline';\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/** Whether the entered date is the last period (`lmp`) or the due date (`edd`). */\nexport type GestationalAgeMethod = 'lmp' | 'edd';\n\nexport interface GestationalAgeResult {\n gestationalAge: GestationalAge | null;\n trimester: Trimester;\n dueDate: Date;\n}\n\n/* ------------------------------------------------------------------ */\n/* Agent boundary */\n/* */\n/* Dates cross the agent boundary as local-time `yyyy-MM-dd` strings, */\n/* never `Date` objects — a Date JSON-serialises to UTC and silently */\n/* shifts the day for anyone east or west of Greenwich. */\n/* ------------------------------------------------------------------ */\n\nconst toIsoDate = (d: Date): string => format(d, 'yyyy-MM-dd');\n\nconst fromIsoDate = (iso: string): Date | null => {\n const d = parseISO(iso);\n return Number.isNaN(d.getTime()) ? null : d;\n};\n\n/** The dating inputs as entered. */\nexport interface GestationalAgeInputsSnapshot {\n /** Whether the reference date is a last period or a due date. */\n method: GestationalAgeMethod;\n /** The reference date (`yyyy-MM-dd`), or null when unset. */\n referenceDate: string | null;\n /** The date gestational age and trimester are evaluated against. */\n asOfDate: string;\n}\n\n/** `GestationalAgeResult` projected onto the agent boundary — ISO dates. */\nexport interface GestationalAgeSnapshot {\n /** Gestational age as of the evaluation date; null before conception. */\n gestationalAge: { weeks: number; days: number; totalDays: number } | null;\n /** Trimester band as of the evaluation date. */\n trimester: Trimester;\n /** Estimated date of delivery, `yyyy-MM-dd`. */\n dueDate: string;\n}\n\n/**\n * Curated imperative handle for agent / external automation. Reads the dating\n * inputs and the computed gestational age, and drives the inputs the way a\n * user would. Never exposes patient identity — only structural dates and\n * numbers. Consumed by `gestational-age-calculator.agent.ts`; the public `ref`\n * stays the root DOM element.\n */\nexport interface GestationalAgeCalculatorHandle {\n /** The dating inputs as entered. */\n getInputs: () => GestationalAgeInputsSnapshot;\n /** Computed gestational age, trimester and due date, or null until a reference date is set. */\n getResult: () => GestationalAgeSnapshot | null;\n /** Switch between dating from a last period and dating from a known due date. */\n setMethod: (method: GestationalAgeMethod) => boolean;\n /** Set the reference date (`yyyy-MM-dd`); a last period may not be in the future. */\n setReferenceDate: (isoDate: string | null) => boolean;\n /** Set the date gestational age and trimester are evaluated against. */\n setAsOfDate: (isoDate: string) => boolean;\n}\n\nexport interface GestationalAgeCalculatorProps extends VariantProps<\n typeof rootVariants\n> {\n /** Whether the input date is the last period (`lmp`) or the due date (`edd`). */\n defaultMethod?: GestationalAgeMethod;\n /** Pre-fill the reference date (e.g. a known LMP from the patient record). */\n defaultReferenceDate?: Date;\n /** Fires whenever a result can be computed (and `null` when it can't). */\n onResultChange?: (result: GestationalAgeResult | null) => void;\n /** When provided, shows the result-action buttons that emit / copy the result. */\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 /**\n * Append the antenatal exam schedule (the time-sensitive screening windows)\n * below the result, dated from the computed gestational start, and reveal the\n * plurality / chorionicity inputs that drive it.\n */\n showSchedule?: boolean;\n /** `showSchedule` only — initial number of babies. Defaults to `'singleton'`. */\n defaultPlurality?: Plurality;\n /** `showSchedule` only — initial chorionicity for multiples. Defaults to `'unknown'`. */\n defaultChorionicity?: Chorionicity;\n /** `showSchedule` only — initial Rh-negative state (surfaces anti-D). */\n defaultRhNegative?: boolean;\n /** `showSchedule` only — initial gestational-diabetes risk tier (surfaces OGTT). */\n defaultGdmRisk?: GdmRisk;\n /**\n * Passthrough options for the appended schedule (national `schedule`,\n * `includeOnIndication`, `birthGuideline`). `today`, `plurality`,\n * `chorionicity`, `rhNegative` and `gdmRisk` come from the component's own\n * inputs. Ignored unless `showSchedule` is set.\n */\n scheduleOptions?: Omit<\n AntenatalScheduleOptions,\n 'today' | 'plurality' | 'chorionicity' | 'rhNegative' | 'gdmRisk'\n >;\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 * @deprecated Superseded by `PregnancyDating`, which unifies the due-date and\n * gestational-age calculators (any anchor → both EDD and current GA) and adds a\n * manual ±days dating adjustment. This component will be removed in a future\n * release; migrate to `PregnancyDating` (`defaultMethod=\"edd\"` for the\n * date-back-from-EDD flow).\n */\nexport const GestationalAgeCalculator = forwardRef<\n HTMLDivElement,\n GestationalAgeCalculatorProps\n>(\n (\n {\n defaultMethod = 'lmp',\n defaultReferenceDate,\n onResultChange,\n onInsert,\n insertVariant = 'insert',\n onCopy,\n onError,\n insertBrand,\n showSchedule = false,\n defaultPlurality = 'singleton',\n defaultChorionicity = 'unknown',\n defaultRhNegative = false,\n defaultGdmRisk,\n scheduleOptions,\n id,\n width,\n className,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation('ui');\n\n const [method, setMethod] = useState<GestationalAgeMethod>(defaultMethod);\n const [refDate, setRefDate] = useState<Date | undefined>(\n defaultReferenceDate,\n );\n // The date the result is evaluated against (\"as of\"); defaults to today but\n // can be a future appointment date to project the GA/schedule forward.\n const [asOfDate, setAsOfDate] = useState<Date>(() => new Date());\n // Real today — caps the dating-anchor input (an LMP can't be in the future).\n const today = useMemo(() => new Date(), []);\n const [plurality, setPlurality] = useState<Plurality>(defaultPlurality);\n const [chorionicity, setChorionicity] =\n useState<Chorionicity>(defaultChorionicity);\n const [rhNegative, setRhNegative] = useState<boolean>(defaultRhNegative);\n const [gdmRisk, setGdmRisk] = useState<GdmRisk | 'none'>(\n defaultGdmRisk ?? 'none',\n );\n\n const data = useMemo(() => {\n if (!refDate) return null;\n // Normalise to an LMP, then reuse the shared gestation maths.\n const lmp = method === 'lmp' ? refDate : subDays(refDate, GESTATION_DAYS);\n const r = computeDueDate({ method: 'lmp', date: lmp }, asOfDate);\n return {\n result: {\n gestationalAge: r.gestationalAge,\n trimester: r.trimester,\n dueDate: r.dueDate,\n } satisfies GestationalAgeResult,\n milestones: gestationalMilestones(r.gestationalStart),\n gestationalStart: r.gestationalStart,\n };\n }, [method, refDate, asOfDate]);\n\n const schedule = useMemo(() => {\n if (!showSchedule || !data) return null;\n return computeAntenatalSchedule(data.gestationalStart, {\n ...scheduleOptions,\n today: asOfDate,\n plurality,\n chorionicity,\n rhNegative,\n gdmRisk: gdmRisk === 'none' ? undefined : gdmRisk,\n });\n }, [\n showSchedule,\n data,\n asOfDate,\n scheduleOptions,\n plurality,\n chorionicity,\n rhNegative,\n gdmRisk,\n ]);\n\n const chorionicityOptions = useMemo(\n () =>\n (\n [\n 'unknown',\n 'dichorionic-diamniotic',\n 'monochorionic-diamniotic',\n 'monochorionic-monoamniotic',\n ] as const\n ).map((c) => ({\n value: c,\n label: t(`antenatalSchedule.chorionicity.${c}`),\n })),\n [t],\n );\n\n const dateFormatter = useMemo(\n () => new Intl.DateTimeFormat(i18n.language, { dateStyle: 'medium' }),\n [i18n.language],\n );\n\n useEffect(() => {\n onResultChange?.(data?.result ?? null);\n }, [data, onResultChange]);\n\n /* ── Agent handle ────────────────────────────────────────────────── */\n const liveRef = useRef({ method, refDate, asOfDate, data });\n liveRef.current = { method, refDate, asOfDate, data };\n\n const agentHandle = useMemo<GestationalAgeCalculatorHandle>(\n () => ({\n getInputs: () => {\n const live = liveRef.current;\n return {\n method: live.method,\n referenceDate: live.refDate ? toIsoDate(live.refDate) : null,\n asOfDate: toIsoDate(live.asOfDate),\n };\n },\n getResult: () => {\n const r = liveRef.current.data?.result;\n if (!r) return null;\n return {\n gestationalAge: r.gestationalAge ? { ...r.gestationalAge } : null,\n trimester: r.trimester,\n dueDate: toIsoDate(r.dueDate),\n };\n },\n setMethod: (next) => {\n if (next !== 'lmp' && next !== 'edd') return false;\n setMethod(next);\n return true;\n },\n setReferenceDate: (isoDate) => {\n if (isoDate === null) {\n setRefDate(undefined);\n return true;\n }\n const parsed = fromIsoDate(isoDate);\n if (!parsed) return false;\n // The DatePicker caps an LMP at today; a known EDD is in the future.\n if (liveRef.current.method === 'lmp' && isAfter(parsed, new Date())) {\n return false;\n }\n setRefDate(parsed);\n return true;\n },\n setAsOfDate: (isoDate) => {\n const parsed = fromIsoDate(isoDate);\n if (!parsed) return false;\n setAsOfDate(parsed);\n return true;\n },\n }),\n [],\n );\n useAgentRegistration(gestationalAgeCalculatorAgent, agentHandle, id);\n\n const gaText = (ga: GestationalAge | null): string =>\n ga\n ? t('gestationalAgeCalculator.gestation', {\n weeks: ga.weeks,\n days: ga.days,\n })\n : '—';\n\n return (\n <div\n ref={ref}\n data-component=\"gestational-age-calculator\"\n data-component-id={id}\n className={rootVariants({ width, className })}\n >\n <RadioGroup\n label={t('gestationalAgeCalculator.method.label')}\n variant=\"horizontal\"\n value={method}\n onValueChange={(next) => setMethod(next as GestationalAgeMethod)}\n >\n <Radio label={t('gestationalAgeCalculator.method.lmp')} value=\"lmp\" />\n <Radio label={t('gestationalAgeCalculator.method.edd')} value=\"edd\" />\n </RadioGroup>\n\n <FormField\n label={t(\n method === 'lmp'\n ? 'gestationalAgeCalculator.lmpDate'\n : 'gestationalAgeCalculator.eddDate',\n )}\n >\n <DatePicker\n value={refDate}\n onChange={setRefDate}\n maxDate={method === 'lmp' ? today : undefined}\n />\n </FormField>\n\n <FormField\n label={t('gestationalAgeCalculator.asOfDate')}\n description={t('gestationalAgeCalculator.asOfDateHint')}\n >\n <DatePicker value={asOfDate} onChange={(d) => d && setAsOfDate(d)} />\n </FormField>\n\n {showSchedule ? (\n <>\n <RadioGroup\n label={t('antenatalSchedule.plurality.label')}\n variant=\"horizontal\"\n value={plurality}\n onValueChange={(next) => setPlurality(next as Plurality)}\n >\n <Radio\n label={t('antenatalSchedule.plurality.singleton')}\n value=\"singleton\"\n />\n <Radio\n label={t('antenatalSchedule.plurality.twin')}\n value=\"twin\"\n />\n <Radio\n label={t('antenatalSchedule.plurality.triplet')}\n value=\"triplet\"\n />\n </RadioGroup>\n\n {plurality !== 'singleton' ? (\n <FormField label={t('antenatalSchedule.chorionicity.label')}>\n <Select\n options={chorionicityOptions}\n value={chorionicity}\n onValueChange={(next) =>\n setChorionicity(next as Chorionicity)\n }\n />\n </FormField>\n ) : null}\n\n <Switch\n label={t('antenatalSchedule.rhNegative')}\n checked={rhNegative}\n onCheckedChange={setRhNegative}\n />\n\n <RadioGroup\n label={t('antenatalSchedule.gdmRisk.label')}\n variant=\"horizontal\"\n value={gdmRisk}\n onValueChange={(next) => setGdmRisk(next as GdmRisk | 'none')}\n >\n <Radio label={t('antenatalSchedule.gdmRisk.none')} value=\"none\" />\n <Radio\n label={t('antenatalSchedule.gdmRisk.medium')}\n value=\"medium\"\n />\n <Radio label={t('antenatalSchedule.gdmRisk.high')} value=\"high\" />\n </RadioGroup>\n </>\n ) : null}\n\n <p className=\"ds:sr-only\" role=\"status\" aria-live=\"polite\">\n {data\n ? `${t('gestationalAgeCalculator.gestationLabel')}: ${gaText(\n data.result.gestationalAge,\n )}. ${t('gestationalAgeCalculator.trimesterLabel')}: ${t(\n `gestationalAgeCalculator.trimester.${data.result.trimester}`,\n )}.`\n : ''}\n </p>\n\n {data ? (\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('gestationalAgeCalculator.trimesterLabel')}\n </dt>\n <dd>\n <Badge\n variant={TRIMESTER_BADGE_VARIANT[data.result.trimester]}\n size=\"lg\"\n >\n {t(\n `gestationalAgeCalculator.trimester.${data.result.trimester}`,\n )}\n </Badge>\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('gestationalAgeCalculator.gestationLabel')}\n </dt>\n <dd className=\"type-metric ds:text-foreground\">\n {gaText(data.result.gestationalAge)}\n </dd>\n </div>\n </dl>\n\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <span className=\"type-label ds:text-muted-foreground\">\n {t('gestationalAgeCalculator.milestonesLabel')}\n </span>\n <ul className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n {data.milestones.map((m) => {\n const reached = isAfter(asOfDate, m.date);\n return (\n <li\n key={m.key}\n className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-md)]\"\n >\n <span className=\"type-body ds:text-foreground\">\n {t(`gestationalAgeCalculator.milestone.${m.key}`)}\n </span>\n <span className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <span className=\"type-body ds:text-muted-foreground\">\n {dateFormatter.format(m.date)}\n </span>\n {reached ? (\n <Badge variant=\"success\">\n {t('gestationalAgeCalculator.reached')}\n </Badge>\n ) : null}\n </span>\n </li>\n );\n })}\n </ul>\n </div>\n </Card.Body>\n </Card>\n ) : (\n <p className=\"type-body ds:text-muted-foreground\">\n {t('gestationalAgeCalculator.empty')}\n </p>\n )}\n\n {schedule ? <AntenatalScheduleTimeline events={schedule} /> : null}\n\n {/* One result-action group for the whole result — sits after both the\n gestational-age card and the schedule, and its payload carries the\n schedule rows when shown (no per-card buttons). */}\n {data && (insertVariant === 'copy' || onInsert) ? (\n <InsertButton\n onInsert={onInsert}\n variant={insertVariant}\n onCopy={onCopy}\n onError={onError}\n card={{\n title: t('insert.title.gestationalAge'),\n icon: 'baby',\n highlight: t(\n `gestationalAgeCalculator.trimester.${data.result.trimester}`,\n ),\n // Chip shares the trimester's semantic token so the inserted PNG\n // chip matches the on-screen trimester badge — with the\n // contrast-safe orange override for the `--warning` third trimester.\n highlightToken: trimesterHighlightToken(data.result.trimester),\n brand: insertBrand,\n fields: [\n {\n // Gestational age is an elapsed duration → clock glyph.\n icon: 'clock',\n label: t('gestationalAgeCalculator.gestationLabel'),\n value: gaText(data.result.gestationalAge),\n },\n {\n // Trimester is a clinical-stage classification → tag.\n icon: 'tag',\n label: t('gestationalAgeCalculator.trimesterLabel'),\n value: t(\n `gestationalAgeCalculator.trimester.${data.result.trimester}`,\n ),\n },\n // When the schedule is shown, the single Insert button carries\n // the exam windows too (no second button).\n ...(schedule\n ? buildScheduleInsertFields(schedule, t, (d) =>\n dateFormatter.format(d),\n )\n : []),\n ],\n }}\n />\n ) : null}\n </div>\n );\n },\n);\n\nGestationalAgeCalculator.displayName = 'GestationalAgeCalculator';\n"],"names":["DEPRECATED","isoDate","gestationalAgeCalculatorAgent","handle","args","rootVariants","cva","toIsoDate","d","format","fromIsoDate","iso","parseISO","GestationalAgeCalculator","forwardRef","defaultMethod","defaultReferenceDate","onResultChange","onInsert","insertVariant","onCopy","onError","insertBrand","showSchedule","defaultPlurality","defaultChorionicity","defaultRhNegative","defaultGdmRisk","scheduleOptions","id","width","className","ref","i18n","useTranslation","method","setMethod","useState","refDate","setRefDate","asOfDate","setAsOfDate","today","useMemo","plurality","setPlurality","chorionicity","setChorionicity","rhNegative","setRhNegative","gdmRisk","setGdmRisk","data","lmp","subDays","GESTATION_DAYS","r","computeDueDate","gestationalMilestones","schedule","computeAntenatalSchedule","chorionicityOptions","c","dateFormatter","useEffect","liveRef","useRef","agentHandle","live","_a","next","parsed","isAfter","useAgentRegistration","gaText","ga","jsxs","RadioGroup","jsx","Radio","FormField","DatePicker","Fragment","Select","Switch","Card","Badge","TRIMESTER_BADGE_VARIANT","m","reached","AntenatalScheduleTimeline","InsertButton","trimesterHighlightToken","buildScheduleInsertFields"],"mappings":"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"}
1
+ {"version":3,"file":"gestational-age-calculator-CZYa2D6m.js","sources":["../../src/components/gestational-age-calculator/gestational-age-calculator.agent.ts","../../src/components/gestational-age-calculator/gestational-age-calculator.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — GestationalAgeCalculator. */\n/* */\n/* Clinical calculator: a known LMP or due date → current gestational */\n/* age, trimester and milestone dates (with an optional antenatal exam */\n/* schedule). The agent surface is the dating inputs plus the computed */\n/* gestational age / trimester / due date; the handle is the curated */\n/* `GestationalAgeCalculatorHandle` (the public `ref` stays the root */\n/* <div>, exactly as `slider.tsx` and `bmi-calculator.tsx` keep theirs). */\n/* */\n/* Dates cross the boundary as local-time `yyyy-MM-dd` strings, never */\n/* `Date` objects, so nothing shifts a day under JSON/UTC serialisation. */\n/* */\n/* DEPRECATED surface: this component is superseded by PregnancyDating, */\n/* which unifies dating + gestational age. Prefer the `pregnancy-dating` */\n/* adapter for new work — every action here is marked deprecated. */\n/* */\n/* PHI (§7): never exposes patient identity — the slots return the */\n/* operator's own structural dating inputs and the dates derived from */\n/* them. See `src/docs/26-agent-readiness.mdx`. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { GestationalAgeCalculatorHandle } from './gestational-age-calculator';\n\nconst DEPRECATED = 'Superseded by the `pregnancy-dating` adapter.';\n\n/** Shared JSON Schema fragment for a local calendar date. */\nconst isoDate = {\n type: 'string',\n pattern: '^\\\\d{4}-\\\\d{2}-\\\\d{2}$',\n} as const;\n\nexport const gestationalAgeCalculatorAgent: AgentAdapter<GestationalAgeCalculatorHandle> =\n {\n id: 'gestational-age-calculator',\n // set_value → the three `set_*` actions + the `inputs` state slot.\n capabilities: ['set_value'],\n state: {\n inputs: {\n type: \"{ method: 'lmp' | 'edd', referenceDate: string | null, asOfDate: string }\",\n descriptionKey: 'ui.agent.gestationalAgeCalculator.state.inputs',\n description:\n 'The dating inputs as entered — whether the reference date is a last period or a known due date, that date, and the evaluation date. Dates are `yyyy-MM-dd`. Read this to see which method a reference date will be interpreted under.',\n read: (handle) => handle.getInputs(),\n },\n result: {\n type: '{ gestationalAge: { weeks: number, days: number, totalDays: number } | null, trimester: string, dueDate: string } | null',\n descriptionKey: 'ui.agent.gestationalAgeCalculator.state.result',\n description:\n 'Computed gestational age in completed weeks + days as of the evaluation date, the trimester band (preconception / first / second / third / postterm), and the estimated delivery date. Null until a reference date is set.',\n read: (handle) => handle.getResult(),\n },\n },\n actions: {\n set_method: {\n // Drives the same local input state a user picks; nothing is persisted\n // to a record, and the choice is reversible in the same UI.\n safety: 'write',\n argsType: \"{ method: 'lmp' | 'edd' }\",\n argsSchema: {\n type: 'object',\n properties: {\n method: {\n enum: ['lmp', 'edd'],\n description:\n 'Whether the reference date is the last menstrual period or a known estimated delivery date.',\n },\n },\n required: ['method'],\n additionalProperties: false,\n },\n idempotent: true,\n deprecated: DEPRECATED,\n returns: 'boolean',\n returnsSchema: {\n type: 'boolean',\n description: 'True when the method was applied.',\n },\n errors: ['Returns false for a method other than `lmp` or `edd`.'],\n descriptionKey: 'ui.agent.gestationalAgeCalculator.actions.setMethod',\n description:\n 'Choose how the reference date is read. The date is kept and re-interpreted under the new method, so set the method first — an EDD may be in the future, an LMP may not.',\n invoke: (handle, args: { method: 'lmp' | 'edd' }) =>\n handle.setMethod(args.method),\n },\n set_reference_date: {\n safety: 'write',\n argsType: '{ date: string | null }',\n argsSchema: {\n type: 'object',\n properties: {\n date: {\n oneOf: [\n {\n ...isoDate,\n description: 'Local calendar date, `yyyy-MM-dd`.',\n },\n { type: 'null' },\n ],\n description:\n 'The last period (not in the future) or the known due date, depending on the active method — or null to clear it.',\n },\n },\n required: ['date'],\n additionalProperties: false,\n },\n idempotent: true,\n deprecated: DEPRECATED,\n returns: 'boolean',\n returnsSchema: {\n type: 'boolean',\n description: 'True when the date was applied.',\n },\n errors: [\n 'Returns false for an unparseable date, or for a future date under the `lmp` method — the on-screen DatePicker caps an LMP at today.',\n ],\n examples: [\n {\n args: { date: '2026-01-12' },\n note: 'Under the default LMP method, a last period starting 12 January.',\n },\n ],\n descriptionKey:\n 'ui.agent.gestationalAgeCalculator.actions.setReferenceDate',\n description:\n 'Set the dating anchor. This is the only required input — the result stays null without it.',\n invoke: (handle, args: { date: string | null }) =>\n handle.setReferenceDate(args.date),\n },\n set_as_of_date: {\n safety: 'write',\n argsType: '{ date: string }',\n argsSchema: {\n type: 'object',\n properties: {\n date: {\n ...isoDate,\n description:\n 'Date to evaluate gestational age and trimester against, `yyyy-MM-dd`. May be in the future to project forward.',\n },\n },\n required: ['date'],\n additionalProperties: false,\n },\n idempotent: true,\n deprecated: DEPRECATED,\n returns: 'boolean',\n returnsSchema: {\n type: 'boolean',\n description: 'True when the date was applied.',\n },\n errors: ['Returns false for an unparseable date.'],\n examples: [\n {\n args: { date: '2026-09-15' },\n note: 'Project gestational age forward to an upcoming appointment.',\n },\n ],\n descriptionKey: 'ui.agent.gestationalAgeCalculator.actions.setAsOfDate',\n description:\n 'Set the date gestational age, trimester and the antenatal schedule are evaluated against. Defaults to today; the estimated delivery date itself does not depend on it.',\n invoke: (handle, args: { date: string }) =>\n handle.setAsOfDate(args.date),\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'gestational-age-calculator',\n description:\n 'Marks the GestationalAgeCalculator (current gestational age, trimester and milestones from LMP or due date).',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Also the registry key — without an `id` the instance does not register and the handle-driven actions/state are unreachable.',\n },\n },\n };\n","/* ------------------------------------------------------------------ */\n/* GestationalAgeCalculator — current gestational age, trimester and */\n/* milestone dates, from either a known LMP or a known due date. */\n/* */\n/* Reuses the shared `gestation` maths from due-date-calculator: GA day */\n/* 0 is the LMP; from an EDD we back out LMP = EDD − 280 days. */\n/* ------------------------------------------------------------------ */\n\nimport { forwardRef, useEffect, useMemo, useRef, useState } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { format, parseISO, subDays, isAfter } from 'date-fns';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { gestationalAgeCalculatorAgent } from './gestational-age-calculator.agent';\nimport { RadioGroup, Radio } from '../radio-group';\nimport { FormField } from '../form-field';\nimport { DatePicker } from '../date-picker';\nimport { Select } from '../select';\nimport { Switch } from '../switch';\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 Trimester,\n type GestationalAge,\n type Plurality,\n type Chorionicity,\n computeDueDate,\n gestationalMilestones,\n GESTATION_DAYS,\n TRIMESTER_BADGE_VARIANT,\n trimesterHighlightToken,\n} from '../_shared/obstetrics';\nimport {\n computeAntenatalSchedule,\n type AntenatalScheduleOptions,\n type GdmRisk,\n} from '../_shared/antenatal-schedule';\nimport {\n AntenatalScheduleTimeline,\n buildScheduleInsertFields,\n} from '../_shared/antenatal-schedule-timeline';\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/** Whether the entered date is the last period (`lmp`) or the due date (`edd`). */\nexport type GestationalAgeMethod = 'lmp' | 'edd';\n\nexport interface GestationalAgeResult {\n gestationalAge: GestationalAge | null;\n trimester: Trimester;\n dueDate: Date;\n}\n\n/* ------------------------------------------------------------------ */\n/* Agent boundary */\n/* */\n/* Dates cross the agent boundary as local-time `yyyy-MM-dd` strings, */\n/* never `Date` objects — a Date JSON-serialises to UTC and silently */\n/* shifts the day for anyone east or west of Greenwich. */\n/* ------------------------------------------------------------------ */\n\nconst toIsoDate = (d: Date): string => format(d, 'yyyy-MM-dd');\n\nconst fromIsoDate = (iso: string): Date | null => {\n const d = parseISO(iso);\n return Number.isNaN(d.getTime()) ? null : d;\n};\n\n/** The dating inputs as entered. */\nexport interface GestationalAgeInputsSnapshot {\n /** Whether the reference date is a last period or a due date. */\n method: GestationalAgeMethod;\n /** The reference date (`yyyy-MM-dd`), or null when unset. */\n referenceDate: string | null;\n /** The date gestational age and trimester are evaluated against. */\n asOfDate: string;\n}\n\n/** `GestationalAgeResult` projected onto the agent boundary — ISO dates. */\nexport interface GestationalAgeSnapshot {\n /** Gestational age as of the evaluation date; null before conception. */\n gestationalAge: { weeks: number; days: number; totalDays: number } | null;\n /** Trimester band as of the evaluation date. */\n trimester: Trimester;\n /** Estimated date of delivery, `yyyy-MM-dd`. */\n dueDate: string;\n}\n\n/**\n * Curated imperative handle for agent / external automation. Reads the dating\n * inputs and the computed gestational age, and drives the inputs the way a\n * user would. Never exposes patient identity — only structural dates and\n * numbers. Consumed by `gestational-age-calculator.agent.ts`; the public `ref`\n * stays the root DOM element.\n */\nexport interface GestationalAgeCalculatorHandle {\n /** The dating inputs as entered. */\n getInputs: () => GestationalAgeInputsSnapshot;\n /** Computed gestational age, trimester and due date, or null until a reference date is set. */\n getResult: () => GestationalAgeSnapshot | null;\n /** Switch between dating from a last period and dating from a known due date. */\n setMethod: (method: GestationalAgeMethod) => boolean;\n /** Set the reference date (`yyyy-MM-dd`); a last period may not be in the future. */\n setReferenceDate: (isoDate: string | null) => boolean;\n /** Set the date gestational age and trimester are evaluated against. */\n setAsOfDate: (isoDate: string) => boolean;\n}\n\nexport interface GestationalAgeCalculatorProps extends VariantProps<\n typeof rootVariants\n> {\n /** Whether the input date is the last period (`lmp`) or the due date (`edd`). */\n defaultMethod?: GestationalAgeMethod;\n /** Pre-fill the reference date (e.g. a known LMP from the patient record). */\n defaultReferenceDate?: Date;\n /** Fires whenever a result can be computed (and `null` when it can't). */\n onResultChange?: (result: GestationalAgeResult | null) => void;\n /** When provided, shows the result-action buttons that emit / copy the result. */\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 /**\n * Append the antenatal exam schedule (the time-sensitive screening windows)\n * below the result, dated from the computed gestational start, and reveal the\n * plurality / chorionicity inputs that drive it.\n */\n showSchedule?: boolean;\n /** `showSchedule` only — initial number of babies. Defaults to `'singleton'`. */\n defaultPlurality?: Plurality;\n /** `showSchedule` only — initial chorionicity for multiples. Defaults to `'unknown'`. */\n defaultChorionicity?: Chorionicity;\n /** `showSchedule` only — initial Rh-negative state (surfaces anti-D). */\n defaultRhNegative?: boolean;\n /** `showSchedule` only — initial gestational-diabetes risk tier (surfaces OGTT). */\n defaultGdmRisk?: GdmRisk;\n /**\n * Passthrough options for the appended schedule (national `schedule`,\n * `includeOnIndication`, `birthGuideline`). `today`, `plurality`,\n * `chorionicity`, `rhNegative` and `gdmRisk` come from the component's own\n * inputs. Ignored unless `showSchedule` is set.\n */\n scheduleOptions?: Omit<\n AntenatalScheduleOptions,\n 'today' | 'plurality' | 'chorionicity' | 'rhNegative' | 'gdmRisk'\n >;\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 * @deprecated Superseded by `PregnancyDating`, which unifies the due-date and\n * gestational-age calculators (any anchor → both EDD and current GA) and adds a\n * manual ±days dating adjustment. This component will be removed in a future\n * release; migrate to `PregnancyDating` (`defaultMethod=\"edd\"` for the\n * date-back-from-EDD flow).\n */\nexport const GestationalAgeCalculator = forwardRef<\n HTMLDivElement,\n GestationalAgeCalculatorProps\n>(\n (\n {\n defaultMethod = 'lmp',\n defaultReferenceDate,\n onResultChange,\n onInsert,\n insertVariant = 'insert',\n onCopy,\n onError,\n insertBrand,\n showSchedule = false,\n defaultPlurality = 'singleton',\n defaultChorionicity = 'unknown',\n defaultRhNegative = false,\n defaultGdmRisk,\n scheduleOptions,\n id,\n width,\n className,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation('ui');\n\n const [method, setMethod] = useState<GestationalAgeMethod>(defaultMethod);\n const [refDate, setRefDate] = useState<Date | undefined>(\n defaultReferenceDate,\n );\n // The date the result is evaluated against (\"as of\"); defaults to today but\n // can be a future appointment date to project the GA/schedule forward.\n const [asOfDate, setAsOfDate] = useState<Date>(() => new Date());\n // Real today — caps the dating-anchor input (an LMP can't be in the future).\n const today = useMemo(() => new Date(), []);\n const [plurality, setPlurality] = useState<Plurality>(defaultPlurality);\n const [chorionicity, setChorionicity] =\n useState<Chorionicity>(defaultChorionicity);\n const [rhNegative, setRhNegative] = useState<boolean>(defaultRhNegative);\n const [gdmRisk, setGdmRisk] = useState<GdmRisk | 'none'>(\n defaultGdmRisk ?? 'none',\n );\n\n const data = useMemo(() => {\n if (!refDate) return null;\n // Normalise to an LMP, then reuse the shared gestation maths.\n const lmp = method === 'lmp' ? refDate : subDays(refDate, GESTATION_DAYS);\n const r = computeDueDate({ method: 'lmp', date: lmp }, asOfDate);\n return {\n result: {\n gestationalAge: r.gestationalAge,\n trimester: r.trimester,\n dueDate: r.dueDate,\n } satisfies GestationalAgeResult,\n milestones: gestationalMilestones(r.gestationalStart),\n gestationalStart: r.gestationalStart,\n };\n }, [method, refDate, asOfDate]);\n\n const schedule = useMemo(() => {\n if (!showSchedule || !data) return null;\n return computeAntenatalSchedule(data.gestationalStart, {\n ...scheduleOptions,\n today: asOfDate,\n plurality,\n chorionicity,\n rhNegative,\n gdmRisk: gdmRisk === 'none' ? undefined : gdmRisk,\n });\n }, [\n showSchedule,\n data,\n asOfDate,\n scheduleOptions,\n plurality,\n chorionicity,\n rhNegative,\n gdmRisk,\n ]);\n\n const chorionicityOptions = useMemo(\n () =>\n (\n [\n 'unknown',\n 'dichorionic-diamniotic',\n 'monochorionic-diamniotic',\n 'monochorionic-monoamniotic',\n ] as const\n ).map((c) => ({\n value: c,\n label: t(`antenatalSchedule.chorionicity.${c}`),\n })),\n [t],\n );\n\n const dateFormatter = useMemo(\n () => new Intl.DateTimeFormat(i18n.language, { dateStyle: 'medium' }),\n [i18n.language],\n );\n\n useEffect(() => {\n onResultChange?.(data?.result ?? null);\n }, [data, onResultChange]);\n\n /* ── Agent handle ────────────────────────────────────────────────── */\n const liveRef = useRef({ method, refDate, asOfDate, data });\n liveRef.current = { method, refDate, asOfDate, data };\n\n const agentHandle = useMemo<GestationalAgeCalculatorHandle>(\n () => ({\n getInputs: () => {\n const live = liveRef.current;\n return {\n method: live.method,\n referenceDate: live.refDate ? toIsoDate(live.refDate) : null,\n asOfDate: toIsoDate(live.asOfDate),\n };\n },\n getResult: () => {\n const r = liveRef.current.data?.result;\n if (!r) return null;\n return {\n gestationalAge: r.gestationalAge ? { ...r.gestationalAge } : null,\n trimester: r.trimester,\n dueDate: toIsoDate(r.dueDate),\n };\n },\n setMethod: (next) => {\n if (next !== 'lmp' && next !== 'edd') return false;\n setMethod(next);\n return true;\n },\n setReferenceDate: (isoDate) => {\n if (isoDate === null) {\n setRefDate(undefined);\n return true;\n }\n const parsed = fromIsoDate(isoDate);\n if (!parsed) return false;\n // The DatePicker caps an LMP at today; a known EDD is in the future.\n if (liveRef.current.method === 'lmp' && isAfter(parsed, new Date())) {\n return false;\n }\n setRefDate(parsed);\n return true;\n },\n setAsOfDate: (isoDate) => {\n const parsed = fromIsoDate(isoDate);\n if (!parsed) return false;\n setAsOfDate(parsed);\n return true;\n },\n }),\n [],\n );\n useAgentRegistration(gestationalAgeCalculatorAgent, agentHandle, id);\n\n const gaText = (ga: GestationalAge | null): string =>\n ga\n ? t('gestationalAgeCalculator.gestation', {\n weeks: ga.weeks,\n days: ga.days,\n })\n : '—';\n\n return (\n <div\n ref={ref}\n data-component=\"gestational-age-calculator\"\n data-component-id={id}\n className={rootVariants({ width, className })}\n >\n <RadioGroup\n label={t('gestationalAgeCalculator.method.label')}\n variant=\"horizontal\"\n value={method}\n onValueChange={(next) => setMethod(next as GestationalAgeMethod)}\n >\n <Radio label={t('gestationalAgeCalculator.method.lmp')} value=\"lmp\" />\n <Radio label={t('gestationalAgeCalculator.method.edd')} value=\"edd\" />\n </RadioGroup>\n\n <FormField\n label={t(\n method === 'lmp'\n ? 'gestationalAgeCalculator.lmpDate'\n : 'gestationalAgeCalculator.eddDate',\n )}\n >\n <DatePicker\n value={refDate}\n onChange={setRefDate}\n maxDate={method === 'lmp' ? today : undefined}\n />\n </FormField>\n\n <FormField\n label={t('gestationalAgeCalculator.asOfDate')}\n description={t('gestationalAgeCalculator.asOfDateHint')}\n >\n <DatePicker value={asOfDate} onChange={(d) => d && setAsOfDate(d)} />\n </FormField>\n\n {showSchedule ? (\n <>\n <RadioGroup\n label={t('antenatalSchedule.plurality.label')}\n variant=\"horizontal\"\n value={plurality}\n onValueChange={(next) => setPlurality(next as Plurality)}\n >\n <Radio\n label={t('antenatalSchedule.plurality.singleton')}\n value=\"singleton\"\n />\n <Radio\n label={t('antenatalSchedule.plurality.twin')}\n value=\"twin\"\n />\n <Radio\n label={t('antenatalSchedule.plurality.triplet')}\n value=\"triplet\"\n />\n </RadioGroup>\n\n {plurality !== 'singleton' ? (\n <FormField label={t('antenatalSchedule.chorionicity.label')}>\n <Select\n options={chorionicityOptions}\n value={chorionicity}\n onValueChange={(next) =>\n setChorionicity(next as Chorionicity)\n }\n />\n </FormField>\n ) : null}\n\n <Switch\n label={t('antenatalSchedule.rhNegative')}\n checked={rhNegative}\n onCheckedChange={setRhNegative}\n />\n\n <RadioGroup\n label={t('antenatalSchedule.gdmRisk.label')}\n variant=\"horizontal\"\n value={gdmRisk}\n onValueChange={(next) => setGdmRisk(next as GdmRisk | 'none')}\n >\n <Radio label={t('antenatalSchedule.gdmRisk.none')} value=\"none\" />\n <Radio\n label={t('antenatalSchedule.gdmRisk.medium')}\n value=\"medium\"\n />\n <Radio label={t('antenatalSchedule.gdmRisk.high')} value=\"high\" />\n </RadioGroup>\n </>\n ) : null}\n\n <p className=\"ds:sr-only\" role=\"status\" aria-live=\"polite\">\n {data\n ? `${t('gestationalAgeCalculator.gestationLabel')}: ${gaText(\n data.result.gestationalAge,\n )}. ${t('gestationalAgeCalculator.trimesterLabel')}: ${t(\n `gestationalAgeCalculator.trimester.${data.result.trimester}`,\n )}.`\n : ''}\n </p>\n\n {data ? (\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('gestationalAgeCalculator.trimesterLabel')}\n </dt>\n <dd>\n <Badge\n variant={TRIMESTER_BADGE_VARIANT[data.result.trimester]}\n size=\"lg\"\n >\n {t(\n `gestationalAgeCalculator.trimester.${data.result.trimester}`,\n )}\n </Badge>\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('gestationalAgeCalculator.gestationLabel')}\n </dt>\n <dd className=\"type-metric ds:text-foreground\">\n {gaText(data.result.gestationalAge)}\n </dd>\n </div>\n </dl>\n\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <span className=\"type-label ds:text-muted-foreground\">\n {t('gestationalAgeCalculator.milestonesLabel')}\n </span>\n <ul className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n {data.milestones.map((m) => {\n const reached = isAfter(asOfDate, m.date);\n return (\n <li\n key={m.key}\n className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-md)]\"\n >\n <span className=\"type-body ds:text-foreground\">\n {t(`gestationalAgeCalculator.milestone.${m.key}`)}\n </span>\n <span className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <span className=\"type-body ds:text-muted-foreground\">\n {dateFormatter.format(m.date)}\n </span>\n {reached ? (\n <Badge variant=\"success\">\n {t('gestationalAgeCalculator.reached')}\n </Badge>\n ) : null}\n </span>\n </li>\n );\n })}\n </ul>\n </div>\n </Card.Body>\n </Card>\n ) : (\n <p className=\"type-body ds:text-muted-foreground\">\n {t('gestationalAgeCalculator.empty')}\n </p>\n )}\n\n {schedule ? <AntenatalScheduleTimeline events={schedule} /> : null}\n\n {/* One result-action group for the whole result — sits after both the\n gestational-age card and the schedule, and its payload carries the\n schedule rows when shown (no per-card buttons). */}\n {data && (insertVariant === 'copy' || onInsert) ? (\n <InsertButton\n onInsert={onInsert}\n variant={insertVariant}\n onCopy={onCopy}\n onError={onError}\n card={{\n title: t('insert.title.gestationalAge'),\n icon: 'baby',\n highlight: t(\n `gestationalAgeCalculator.trimester.${data.result.trimester}`,\n ),\n // Chip shares the trimester's semantic token so the inserted PNG\n // chip matches the on-screen trimester badge — with the\n // contrast-safe orange override for the `--warning` third trimester.\n highlightToken: trimesterHighlightToken(data.result.trimester),\n brand: insertBrand,\n fields: [\n {\n // Gestational age is an elapsed duration → clock glyph.\n icon: 'clock',\n label: t('gestationalAgeCalculator.gestationLabel'),\n value: gaText(data.result.gestationalAge),\n },\n {\n // Trimester is a clinical-stage classification → tag.\n icon: 'tag',\n label: t('gestationalAgeCalculator.trimesterLabel'),\n value: t(\n `gestationalAgeCalculator.trimester.${data.result.trimester}`,\n ),\n },\n // When the schedule is shown, the single Insert button carries\n // the exam windows too (no second button).\n ...(schedule\n ? buildScheduleInsertFields(schedule, t, (d) =>\n dateFormatter.format(d),\n )\n : []),\n ],\n }}\n />\n ) : null}\n </div>\n );\n },\n);\n\nGestationalAgeCalculator.displayName = 'GestationalAgeCalculator';\n"],"names":["DEPRECATED","isoDate","gestationalAgeCalculatorAgent","handle","args","rootVariants","cva","toIsoDate","d","format","fromIsoDate","iso","parseISO","GestationalAgeCalculator","forwardRef","defaultMethod","defaultReferenceDate","onResultChange","onInsert","insertVariant","onCopy","onError","insertBrand","showSchedule","defaultPlurality","defaultChorionicity","defaultRhNegative","defaultGdmRisk","scheduleOptions","id","width","className","ref","i18n","useTranslation","method","setMethod","useState","refDate","setRefDate","asOfDate","setAsOfDate","today","useMemo","plurality","setPlurality","chorionicity","setChorionicity","rhNegative","setRhNegative","gdmRisk","setGdmRisk","data","lmp","subDays","GESTATION_DAYS","r","computeDueDate","gestationalMilestones","schedule","computeAntenatalSchedule","chorionicityOptions","c","dateFormatter","useEffect","liveRef","useRef","agentHandle","live","_a","next","parsed","isAfter","useAgentRegistration","gaText","ga","jsxs","RadioGroup","jsx","Radio","FormField","DatePicker","Fragment","Select","Switch","Card","Badge","TRIMESTER_BADGE_VARIANT","m","reached","AntenatalScheduleTimeline","InsertButton","trimesterHighlightToken","buildScheduleInsertFields"],"mappings":"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"}
@@ -5,11 +5,11 @@ import { useTranslation as J } from "react-i18next";
5
5
  import { u as Q } from "./registry-DvAUVLHh.js";
6
6
  import { F as S } from "./form-field-Ani72sVY.js";
7
7
  import { N as P } from "./number-input-CVwI1ltI.js";
8
- import { D as G } from "./date-time-picker-CjxTkblD.js";
8
+ import { D as G } from "./date-time-picker-BVQNZ4yC.js";
9
9
  import { C as B } from "./card-BA4Ig_kn.js";
10
10
  import { B as X } from "./badge-BUk4RjTS.js";
11
11
  import { I as ee } from "./insert-result-h3WL-gMo.js";
12
- import { d as te } from "./date-picker-variants-BnF-sHzq.js";
12
+ import { d as te } from "./date-picker-variants-DN37Oj5-.js";
13
13
  import { p as ne } from "./parseISO-y3LncvfO.js";
14
14
  import { t as se, k as h } from "./format-D-1gTdHF.js";
15
15
  function ae(e, l) {
@@ -309,4 +309,4 @@ export {
309
309
  re as M,
310
310
  oe as a
311
311
  };
312
- //# sourceMappingURL=hcg-doubling-DVDiqFyp.js.map
312
+ //# sourceMappingURL=hcg-doubling-DwTcjfke.js.map