@alfadocs/ui-kit-debug 0.48.0 → 0.49.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 (310) hide show
  1. package/dist/_chunks/{address-autocomplete-CSjMrBvu.js → address-autocomplete-CT-9AOli.js} +2 -2
  2. package/dist/_chunks/{address-autocomplete-CSjMrBvu.js.map → address-autocomplete-CT-9AOli.js.map} +1 -1
  3. package/dist/_chunks/{ai-consent-banner-DO5ingMq.js → ai-consent-banner-F2md5JD3.js} +2 -2
  4. package/dist/_chunks/{ai-consent-banner-DO5ingMq.js.map → ai-consent-banner-F2md5JD3.js.map} +1 -1
  5. package/dist/_chunks/{ai-tools-rail-CxYG04cw.js → ai-tools-rail-CYLWrRmm.js} +6 -6
  6. package/dist/_chunks/ai-tools-rail-CYLWrRmm.js.map +1 -0
  7. package/dist/_chunks/{alert-ywPR59NE.js → alert-CUTxnym2.js} +56 -35
  8. package/dist/_chunks/alert-CUTxnym2.js.map +1 -0
  9. package/dist/_chunks/antenatal-schedule-timeline-Dg0m0yFl.js +412 -0
  10. package/dist/_chunks/antenatal-schedule-timeline-Dg0m0yFl.js.map +1 -0
  11. package/dist/_chunks/{ar-DEz65ZJW.js → ar-C68WKG5a.js} +2 -2
  12. package/dist/_chunks/{ar-DEz65ZJW.js.map → ar-C68WKG5a.js.map} +1 -1
  13. package/dist/_chunks/{audio-recorder-DC-v9YFW.js → audio-recorder-DVJXV7_k.js} +2 -2
  14. package/dist/_chunks/{audio-recorder-DC-v9YFW.js.map → audio-recorder-DVJXV7_k.js.map} +1 -1
  15. package/dist/_chunks/bishop-score-2MzAz8NE.js +185 -0
  16. package/dist/_chunks/bishop-score-2MzAz8NE.js.map +1 -0
  17. package/dist/_chunks/{booking-WV2GSru5.js → booking-DljH0JkS.js} +5 -5
  18. package/dist/_chunks/{booking-WV2GSru5.js.map → booking-DljH0JkS.js.map} +1 -1
  19. package/dist/_chunks/circle-arrow-up-CC_85SuH.js +16 -0
  20. package/dist/_chunks/circle-arrow-up-CC_85SuH.js.map +1 -0
  21. package/dist/_chunks/cycle-calculator-oOkj5wlB.js +252 -0
  22. package/dist/_chunks/cycle-calculator-oOkj5wlB.js.map +1 -0
  23. package/dist/_chunks/{date-picker-Bq7xhMA-.js → date-picker-BfHblqwA.js} +2 -2
  24. package/dist/_chunks/{date-picker-Bq7xhMA-.js.map → date-picker-BfHblqwA.js.map} +1 -1
  25. package/dist/_chunks/{date-picker-variants-DLi1Va_e.js → date-picker-variants-CXEAx3O_.js} +22 -22
  26. package/dist/_chunks/{date-picker-variants-DLi1Va_e.js.map → date-picker-variants-CXEAx3O_.js.map} +1 -1
  27. package/dist/_chunks/{date-range-picker-DcXuI9y7.js → date-range-picker-hcAMs1wO.js} +3 -3
  28. package/dist/_chunks/{date-range-picker-DcXuI9y7.js.map → date-range-picker-hcAMs1wO.js.map} +1 -1
  29. package/dist/_chunks/{date-time-picker-RimumeLR.js → date-time-picker-H-3Pwqlb.js} +9 -9
  30. package/dist/_chunks/{date-time-picker-RimumeLR.js.map → date-time-picker-H-3Pwqlb.js.map} +1 -1
  31. package/dist/_chunks/{de-bTBGdjPS.js → de-DK4A9_a8.js} +2 -2
  32. package/dist/_chunks/{de-bTBGdjPS.js.map → de-DK4A9_a8.js.map} +1 -1
  33. package/dist/_chunks/{document-scanner-BqLsGs4Y.js → document-scanner-Cxqvq7GR.js} +2 -2
  34. package/dist/_chunks/{document-scanner-BqLsGs4Y.js.map → document-scanner-Cxqvq7GR.js.map} +1 -1
  35. package/dist/_chunks/due-date-calculator-tDqZXPWO.js +256 -0
  36. package/dist/_chunks/due-date-calculator-tDqZXPWO.js.map +1 -0
  37. package/dist/_chunks/{editable-currency-cell-renderer-CLil9B29.js → editable-currency-cell-renderer-Bh48OHRv.js} +2 -2
  38. package/dist/_chunks/{editable-currency-cell-renderer-CLil9B29.js.map → editable-currency-cell-renderer-Bh48OHRv.js.map} +1 -1
  39. package/dist/_chunks/{el-BWG5RXxa.js → el-B29HXhG5.js} +2 -2
  40. package/dist/_chunks/{el-BWG5RXxa.js.map → el-B29HXhG5.js.map} +1 -1
  41. package/dist/_chunks/{es-DfO_G435.js → es-BOwPVwWn.js} +2 -2
  42. package/dist/_chunks/{es-DfO_G435.js.map → es-BOwPVwWn.js.map} +1 -1
  43. package/dist/_chunks/fetal-weight-Da-B4P4k.js +122 -0
  44. package/dist/_chunks/fetal-weight-Da-B4P4k.js.map +1 -0
  45. package/dist/_chunks/{fr-BTn24bs8.js → fr-DoDBtn0T.js} +2 -2
  46. package/dist/_chunks/{fr-BTn24bs8.js.map → fr-DoDBtn0T.js.map} +1 -1
  47. package/dist/_chunks/{freemium-paywall-DzpD63WY.js → freemium-paywall-BWaLWje-.js} +2 -2
  48. package/dist/_chunks/{freemium-paywall-DzpD63WY.js.map → freemium-paywall-BWaLWje-.js.map} +1 -1
  49. package/dist/_chunks/gestational-age-calculator-DbDfTJU2.js +311 -0
  50. package/dist/_chunks/gestational-age-calculator-DbDfTJU2.js.map +1 -0
  51. package/dist/_chunks/hcg-doubling-DAnpbale.js +170 -0
  52. package/dist/_chunks/hcg-doubling-DAnpbale.js.map +1 -0
  53. package/dist/_chunks/{hi-Dj3oYd84.js → hi-DGByrKby.js} +2 -2
  54. package/dist/_chunks/{hi-Dj3oYd84.js.map → hi-DGByrKby.js.map} +1 -1
  55. package/dist/_chunks/{isSameWeek-HfxKk6Lz.js → isSameWeek-B1odL2vR.js} +2 -2
  56. package/dist/_chunks/{isSameWeek-HfxKk6Lz.js.map → isSameWeek-B1odL2vR.js.map} +1 -1
  57. package/dist/_chunks/{it-Y85ofIQQ.js → it-B16rEecm.js} +3 -3
  58. package/dist/_chunks/{it-Y85ofIQQ.js.map → it-B16rEecm.js.map} +1 -1
  59. package/dist/_chunks/{ja-CQ7J6YoA.js → ja-B0viOgft.js} +2 -2
  60. package/dist/_chunks/{ja-CQ7J6YoA.js.map → ja-B0viOgft.js.map} +1 -1
  61. package/dist/_chunks/{marketplace-app-shell-Gfsf78ge.js → marketplace-app-shell-UKSLx9K_.js} +3 -3
  62. package/dist/_chunks/{marketplace-app-shell-Gfsf78ge.js.map → marketplace-app-shell-UKSLx9K_.js.map} +1 -1
  63. package/dist/_chunks/{nl-D9kHCmp3.js → nl-cBxEX2QU.js} +2 -2
  64. package/dist/_chunks/{nl-D9kHCmp3.js.map → nl-cBxEX2QU.js.map} +1 -1
  65. package/dist/_chunks/{patient-search-CocVcGJ3.js → patient-search-BJOmTmDA.js} +2 -2
  66. package/dist/_chunks/{patient-search-CocVcGJ3.js.map → patient-search-BJOmTmDA.js.map} +1 -1
  67. package/dist/_chunks/{patient-shell-CnT4L8gn.js → patient-shell-DUmhXnFq.js} +2 -2
  68. package/dist/_chunks/{patient-shell-CnT4L8gn.js.map → patient-shell-DUmhXnFq.js.map} +1 -1
  69. package/dist/_chunks/{payment-form-BNTx4876.js → payment-form-xmeCkxas.js} +2 -2
  70. package/dist/_chunks/{payment-form-BNTx4876.js.map → payment-form-xmeCkxas.js.map} +1 -1
  71. package/dist/_chunks/{pdf-viewer-G8SU6Azw.js → pdf-viewer-q1D3Uion.js} +2 -2
  72. package/dist/_chunks/{pdf-viewer-G8SU6Azw.js.map → pdf-viewer-q1D3Uion.js.map} +1 -1
  73. package/dist/_chunks/{pl-B3Smqpkr.js → pl-DtS08ioY.js} +3 -3
  74. package/dist/_chunks/{pl-B3Smqpkr.js.map → pl-DtS08ioY.js.map} +1 -1
  75. package/dist/_chunks/{practice-results-BFL_mcDW.js → practice-results-Cq1y8JFD.js} +2 -2
  76. package/dist/_chunks/{practice-results-BFL_mcDW.js.map → practice-results-Cq1y8JFD.js.map} +1 -1
  77. package/dist/_chunks/pregnancy-weight-gain-CCGrvarh.js +322 -0
  78. package/dist/_chunks/pregnancy-weight-gain-CCGrvarh.js.map +1 -0
  79. package/dist/_chunks/product-hub-panel-CkfZBA3t.js +620 -0
  80. package/dist/_chunks/product-hub-panel-CkfZBA3t.js.map +1 -0
  81. package/dist/_chunks/{pt-D3J-1c_7.js → pt-yFXs1VvH.js} +2 -2
  82. package/dist/_chunks/{pt-D3J-1c_7.js.map → pt-yFXs1VvH.js.map} +1 -1
  83. package/dist/_chunks/{ro-BKAbbEA3.js → ro-DsCzSrzR.js} +2 -2
  84. package/dist/_chunks/{ro-BKAbbEA3.js.map → ro-DsCzSrzR.js.map} +1 -1
  85. package/dist/_chunks/{ru-BeG8f0Ep.js → ru-DgDxL0pc.js} +3 -3
  86. package/dist/_chunks/{ru-BeG8f0Ep.js.map → ru-DgDxL0pc.js.map} +1 -1
  87. package/dist/_chunks/{sidebar-_vJXI9rB.js → sidebar-h78cTNLh.js} +440 -338
  88. package/dist/_chunks/sidebar-h78cTNLh.js.map +1 -0
  89. package/dist/_chunks/{sign-document-DPI2pY9V.js → sign-document-CZkAf28g.js} +2 -2
  90. package/dist/_chunks/{sign-document-DPI2pY9V.js.map → sign-document-CZkAf28g.js.map} +1 -1
  91. package/dist/_chunks/{sq-_hRPaeUy.js → sq-DHlCYN67.js} +2 -2
  92. package/dist/_chunks/{sq-_hRPaeUy.js.map → sq-DHlCYN67.js.map} +1 -1
  93. package/dist/_chunks/subDays-Bs00akhK.js +8 -0
  94. package/dist/_chunks/{subDays-Dv7q9S7u.js.map → subDays-Bs00akhK.js.map} +1 -1
  95. package/dist/_chunks/{sv-g009fSpe.js → sv-O0QaQs_s.js} +2 -2
  96. package/dist/_chunks/{sv-g009fSpe.js.map → sv-O0QaQs_s.js.map} +1 -1
  97. package/dist/_chunks/{tr-OKUOuhMW.js → tr-BmNDRuio.js} +2 -2
  98. package/dist/_chunks/{tr-OKUOuhMW.js.map → tr-BmNDRuio.js.map} +1 -1
  99. package/dist/_chunks/warning-stack-CXfoAT-_.js +220 -0
  100. package/dist/_chunks/warning-stack-CXfoAT-_.js.map +1 -0
  101. package/dist/_chunks/{workflow-map-ZXw-zsZ8.js → workflow-map-DzX_LI4y.js} +2 -2
  102. package/dist/_chunks/{workflow-map-ZXw-zsZ8.js.map → workflow-map-DzX_LI4y.js.map} +1 -1
  103. package/dist/_chunks/{zh-CN-De4zwEhx.js → zh-CN-CgVJZEzz.js} +3 -3
  104. package/dist/_chunks/{zh-CN-De4zwEhx.js.map → zh-CN-CgVJZEzz.js.map} +1 -1
  105. package/dist/agent-catalog.json +44 -1
  106. package/dist/components/_shared/antenatal-schedule-timeline.d.ts +18 -0
  107. package/dist/components/_shared/antenatal-schedule-timeline.d.ts.map +1 -0
  108. package/dist/components/_shared/antenatal-schedule.d.ts +68 -0
  109. package/dist/components/_shared/antenatal-schedule.d.ts.map +1 -0
  110. package/dist/components/_shared/index.d.ts +3 -0
  111. package/dist/components/_shared/index.d.ts.map +1 -1
  112. package/dist/components/_shared/obstetrics.d.ts +138 -0
  113. package/dist/components/_shared/obstetrics.d.ts.map +1 -0
  114. package/dist/components/address-autocomplete/index.js +1 -1
  115. package/dist/components/ai-consent-banner/index.js +1 -1
  116. package/dist/components/ai-tools-rail/ai-tools-rail.d.ts.map +1 -1
  117. package/dist/components/ai-tools-rail/index.js +1 -1
  118. package/dist/components/alert/alert.d.ts +2 -2
  119. package/dist/components/alert/alert.d.ts.map +1 -1
  120. package/dist/components/alert/index.js +1 -1
  121. package/dist/components/audio-recorder/index.js +1 -1
  122. package/dist/components/bishop-score/bishop-score.d.ts +27 -0
  123. package/dist/components/bishop-score/bishop-score.d.ts.map +1 -0
  124. package/dist/components/bishop-score/bishop.d.ts +30 -0
  125. package/dist/components/bishop-score/bishop.d.ts.map +1 -0
  126. package/dist/components/bishop-score/index.d.ts +4 -0
  127. package/dist/components/bishop-score/index.d.ts.map +1 -0
  128. package/dist/components/bishop-score/index.js +10 -0
  129. package/dist/components/bishop-score/index.js.map +1 -0
  130. package/dist/components/booking/index.js +1 -1
  131. package/dist/components/cycle-calculator/cycle-calculator.d.ts.map +1 -1
  132. package/dist/components/cycle-calculator/cycle.d.ts +5 -0
  133. package/dist/components/cycle-calculator/cycle.d.ts.map +1 -1
  134. package/dist/components/cycle-calculator/index.js +1 -1
  135. package/dist/components/data-table/index.js +1 -1
  136. package/dist/components/date-picker/index.js +1 -1
  137. package/dist/components/date-range-picker/index.js +1 -1
  138. package/dist/components/date-time-picker/index.js +1 -1
  139. package/dist/components/document-scanner/index.js +1 -1
  140. package/dist/components/due-date-calculator/due-date-calculator.d.ts +13 -1
  141. package/dist/components/due-date-calculator/due-date-calculator.d.ts.map +1 -1
  142. package/dist/components/due-date-calculator/gestation.d.ts +1 -59
  143. package/dist/components/due-date-calculator/gestation.d.ts.map +1 -1
  144. package/dist/components/due-date-calculator/index.d.ts +1 -1
  145. package/dist/components/due-date-calculator/index.d.ts.map +1 -1
  146. package/dist/components/due-date-calculator/index.js +16 -10
  147. package/dist/components/fetal-weight/efw.d.ts +25 -0
  148. package/dist/components/fetal-weight/efw.d.ts.map +1 -0
  149. package/dist/components/fetal-weight/fetal-weight.d.ts +27 -0
  150. package/dist/components/fetal-weight/fetal-weight.d.ts.map +1 -0
  151. package/dist/components/fetal-weight/index.d.ts +4 -0
  152. package/dist/components/fetal-weight/index.d.ts.map +1 -0
  153. package/dist/components/fetal-weight/index.js +6 -0
  154. package/dist/components/fetal-weight/index.js.map +1 -0
  155. package/dist/components/freemium-paywall/index.js +1 -1
  156. package/dist/components/gestational-age-calculator/gestational-age-calculator.d.ts +25 -1
  157. package/dist/components/gestational-age-calculator/gestational-age-calculator.d.ts.map +1 -1
  158. package/dist/components/gestational-age-calculator/index.js +1 -1
  159. package/dist/components/hcg-doubling/hcg-doubling.d.ts +31 -0
  160. package/dist/components/hcg-doubling/hcg-doubling.d.ts.map +1 -0
  161. package/dist/components/hcg-doubling/hcg.d.ts +33 -0
  162. package/dist/components/hcg-doubling/hcg.d.ts.map +1 -0
  163. package/dist/components/hcg-doubling/index.d.ts +4 -0
  164. package/dist/components/hcg-doubling/index.d.ts.map +1 -0
  165. package/dist/components/hcg-doubling/index.js +7 -0
  166. package/dist/components/hcg-doubling/index.js.map +1 -0
  167. package/dist/components/index.d.ts +4 -0
  168. package/dist/components/index.d.ts.map +1 -1
  169. package/dist/components/patient-search/index.js +1 -1
  170. package/dist/components/payment-form/index.js +1 -1
  171. package/dist/components/pdf-viewer/index.js +1 -1
  172. package/dist/components/practice-results/index.js +1 -1
  173. package/dist/components/pregnancy-weight-gain/index.js +1 -1
  174. package/dist/components/pregnancy-weight-gain/pregnancy-weight-gain.d.ts +7 -0
  175. package/dist/components/pregnancy-weight-gain/pregnancy-weight-gain.d.ts.map +1 -1
  176. package/dist/components/pregnancy-weight-gain/weight-gain.d.ts +33 -8
  177. package/dist/components/pregnancy-weight-gain/weight-gain.d.ts.map +1 -1
  178. package/dist/components/product-hub-tray/index.d.ts +8 -0
  179. package/dist/components/product-hub-tray/index.d.ts.map +1 -0
  180. package/dist/components/product-hub-tray/index.js +10 -0
  181. package/dist/components/product-hub-tray/index.js.map +1 -0
  182. package/dist/components/product-hub-tray/product-hub-panel.agent.d.ts +4 -0
  183. package/dist/components/product-hub-tray/product-hub-panel.agent.d.ts.map +1 -0
  184. package/dist/components/product-hub-tray/product-hub-panel.d.ts +54 -0
  185. package/dist/components/product-hub-tray/product-hub-panel.d.ts.map +1 -0
  186. package/dist/components/product-hub-tray/product-hub-tray.agent.d.ts +4 -0
  187. package/dist/components/product-hub-tray/product-hub-tray.agent.d.ts.map +1 -0
  188. package/dist/components/product-hub-tray/product-hub-tray.d.ts +115 -0
  189. package/dist/components/product-hub-tray/product-hub-tray.d.ts.map +1 -0
  190. package/dist/components/sidebar/index.d.ts +2 -2
  191. package/dist/components/sidebar/index.d.ts.map +1 -1
  192. package/dist/components/sidebar/index.js +12 -11
  193. package/dist/components/sidebar/sidebar.d.ts +14 -1
  194. package/dist/components/sidebar/sidebar.d.ts.map +1 -1
  195. package/dist/components/sign-document/index.js +1 -1
  196. package/dist/components/warning-stack/index.js +1 -1
  197. package/dist/components/warning-stack/warning-stack.d.ts.map +1 -1
  198. package/dist/components/workflow/index.js +1 -1
  199. package/dist/i18n/locales/ar.d.ts +210 -1
  200. package/dist/i18n/locales/ar.d.ts.map +1 -1
  201. package/dist/i18n/locales/ar.js +209 -2
  202. package/dist/i18n/locales/ar.js.map +1 -1
  203. package/dist/i18n/locales/de.d.ts +210 -1
  204. package/dist/i18n/locales/de.d.ts.map +1 -1
  205. package/dist/i18n/locales/de.js +209 -2
  206. package/dist/i18n/locales/de.js.map +1 -1
  207. package/dist/i18n/locales/el.d.ts +210 -1
  208. package/dist/i18n/locales/el.d.ts.map +1 -1
  209. package/dist/i18n/locales/el.js +209 -2
  210. package/dist/i18n/locales/el.js.map +1 -1
  211. package/dist/i18n/locales/en.d.ts +210 -1
  212. package/dist/i18n/locales/en.d.ts.map +1 -1
  213. package/dist/i18n/locales/en.js +209 -2
  214. package/dist/i18n/locales/en.js.map +1 -1
  215. package/dist/i18n/locales/es.d.ts +210 -1
  216. package/dist/i18n/locales/es.d.ts.map +1 -1
  217. package/dist/i18n/locales/es.js +209 -2
  218. package/dist/i18n/locales/es.js.map +1 -1
  219. package/dist/i18n/locales/fr.d.ts +210 -1
  220. package/dist/i18n/locales/fr.d.ts.map +1 -1
  221. package/dist/i18n/locales/fr.js +209 -2
  222. package/dist/i18n/locales/fr.js.map +1 -1
  223. package/dist/i18n/locales/hi.d.ts +210 -1
  224. package/dist/i18n/locales/hi.d.ts.map +1 -1
  225. package/dist/i18n/locales/hi.js +209 -2
  226. package/dist/i18n/locales/hi.js.map +1 -1
  227. package/dist/i18n/locales/it.d.ts +210 -1
  228. package/dist/i18n/locales/it.d.ts.map +1 -1
  229. package/dist/i18n/locales/it.js +209 -2
  230. package/dist/i18n/locales/it.js.map +1 -1
  231. package/dist/i18n/locales/ja.d.ts +210 -1
  232. package/dist/i18n/locales/ja.d.ts.map +1 -1
  233. package/dist/i18n/locales/ja.js +209 -2
  234. package/dist/i18n/locales/ja.js.map +1 -1
  235. package/dist/i18n/locales/nl.d.ts +210 -1
  236. package/dist/i18n/locales/nl.d.ts.map +1 -1
  237. package/dist/i18n/locales/nl.js +209 -2
  238. package/dist/i18n/locales/nl.js.map +1 -1
  239. package/dist/i18n/locales/pl.d.ts +210 -1
  240. package/dist/i18n/locales/pl.d.ts.map +1 -1
  241. package/dist/i18n/locales/pl.js +209 -2
  242. package/dist/i18n/locales/pl.js.map +1 -1
  243. package/dist/i18n/locales/pt.d.ts +210 -1
  244. package/dist/i18n/locales/pt.d.ts.map +1 -1
  245. package/dist/i18n/locales/pt.js +209 -2
  246. package/dist/i18n/locales/pt.js.map +1 -1
  247. package/dist/i18n/locales/ro.d.ts +210 -1
  248. package/dist/i18n/locales/ro.d.ts.map +1 -1
  249. package/dist/i18n/locales/ro.js +209 -2
  250. package/dist/i18n/locales/ro.js.map +1 -1
  251. package/dist/i18n/locales/ru.d.ts +210 -1
  252. package/dist/i18n/locales/ru.d.ts.map +1 -1
  253. package/dist/i18n/locales/ru.js +209 -2
  254. package/dist/i18n/locales/ru.js.map +1 -1
  255. package/dist/i18n/locales/sq.d.ts +210 -1
  256. package/dist/i18n/locales/sq.d.ts.map +1 -1
  257. package/dist/i18n/locales/sq.js +209 -2
  258. package/dist/i18n/locales/sq.js.map +1 -1
  259. package/dist/i18n/locales/sv.d.ts +210 -1
  260. package/dist/i18n/locales/sv.d.ts.map +1 -1
  261. package/dist/i18n/locales/sv.js +209 -2
  262. package/dist/i18n/locales/sv.js.map +1 -1
  263. package/dist/i18n/locales/tr.d.ts +210 -1
  264. package/dist/i18n/locales/tr.d.ts.map +1 -1
  265. package/dist/i18n/locales/tr.js +209 -2
  266. package/dist/i18n/locales/tr.js.map +1 -1
  267. package/dist/i18n/locales/zh.d.ts +210 -1
  268. package/dist/i18n/locales/zh.d.ts.map +1 -1
  269. package/dist/i18n/locales/zh.js +209 -2
  270. package/dist/i18n/locales/zh.js.map +1 -1
  271. package/dist/index.js +658 -631
  272. package/dist/index.js.map +1 -1
  273. package/dist/locales/ar.json +211 -2
  274. package/dist/locales/de.json +211 -2
  275. package/dist/locales/el.json +211 -2
  276. package/dist/locales/en.json +211 -2
  277. package/dist/locales/es.json +211 -2
  278. package/dist/locales/fr.json +211 -2
  279. package/dist/locales/hi.json +211 -2
  280. package/dist/locales/it.json +211 -2
  281. package/dist/locales/ja.json +211 -2
  282. package/dist/locales/nl.json +211 -2
  283. package/dist/locales/pl.json +211 -2
  284. package/dist/locales/pt.json +211 -2
  285. package/dist/locales/ro.json +211 -2
  286. package/dist/locales/ru.json +211 -2
  287. package/dist/locales/sq.json +211 -2
  288. package/dist/locales/sv.json +211 -2
  289. package/dist/locales/tr.json +211 -2
  290. package/dist/locales/zh.json +211 -2
  291. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  292. package/dist/patterns/patient-shell/index.js +1 -1
  293. package/dist/tokens.css +1 -1
  294. package/package.json +17 -1
  295. package/dist/_chunks/ai-tools-rail-CxYG04cw.js.map +0 -1
  296. package/dist/_chunks/alert-ywPR59NE.js.map +0 -1
  297. package/dist/_chunks/cycle-calculator-DYvGm_m1.js +0 -211
  298. package/dist/_chunks/cycle-calculator-DYvGm_m1.js.map +0 -1
  299. package/dist/_chunks/due-date-calculator-BXd3ANj7.js +0 -216
  300. package/dist/_chunks/due-date-calculator-BXd3ANj7.js.map +0 -1
  301. package/dist/_chunks/gestation-mWF4AXea.js +0 -50
  302. package/dist/_chunks/gestation-mWF4AXea.js.map +0 -1
  303. package/dist/_chunks/gestational-age-calculator-Crj6FgZw.js +0 -203
  304. package/dist/_chunks/gestational-age-calculator-Crj6FgZw.js.map +0 -1
  305. package/dist/_chunks/pregnancy-weight-gain-C7dK89jE.js +0 -246
  306. package/dist/_chunks/pregnancy-weight-gain-C7dK89jE.js.map +0 -1
  307. package/dist/_chunks/sidebar-_vJXI9rB.js.map +0 -1
  308. package/dist/_chunks/subDays-Dv7q9S7u.js +0 -8
  309. package/dist/_chunks/warning-stack-DNR3-IbP.js +0 -180
  310. package/dist/_chunks/warning-stack-DNR3-IbP.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alfadocs/ui-kit-debug",
3
- "version": "0.48.0",
3
+ "version": "0.49.0",
4
4
  "type": "module",
5
5
  "description": "AlfaDocs shared design system — tokens, components, patterns, and translations for platform, booking, and alfascribe. (debug build — identical runtime to @alfadocs/ui-kit, ships source maps for symbolication).",
6
6
  "license": "BUSL-1.1",
@@ -95,10 +95,22 @@
95
95
  "types": "./dist/components/benefit-card/index.d.ts",
96
96
  "import": "./dist/components/benefit-card/index.js"
97
97
  },
98
+ "./bishop-score": {
99
+ "types": "./dist/components/bishop-score/index.d.ts",
100
+ "import": "./dist/components/bishop-score/index.js"
101
+ },
98
102
  "./bmi-calculator": {
99
103
  "types": "./dist/components/bmi-calculator/index.d.ts",
100
104
  "import": "./dist/components/bmi-calculator/index.js"
101
105
  },
106
+ "./fetal-weight": {
107
+ "types": "./dist/components/fetal-weight/index.d.ts",
108
+ "import": "./dist/components/fetal-weight/index.js"
109
+ },
110
+ "./hcg-doubling": {
111
+ "types": "./dist/components/hcg-doubling/index.d.ts",
112
+ "import": "./dist/components/hcg-doubling/index.js"
113
+ },
102
114
  "./calculator-dialog": {
103
115
  "types": "./dist/components/calculator-dialog/index.d.ts",
104
116
  "import": "./dist/components/calculator-dialog/index.js"
@@ -387,6 +399,10 @@
387
399
  "types": "./dist/components/privacy-lock/index.d.ts",
388
400
  "import": "./dist/components/privacy-lock/index.js"
389
401
  },
402
+ "./product-hub-tray": {
403
+ "types": "./dist/components/product-hub-tray/index.d.ts",
404
+ "import": "./dist/components/product-hub-tray/index.js"
405
+ },
390
406
  "./progress": {
391
407
  "types": "./dist/components/progress/index.d.ts",
392
408
  "import": "./dist/components/progress/index.js"
@@ -1 +0,0 @@
1
- {"version":3,"file":"ai-tools-rail-CxYG04cw.js","sources":["../../src/components/ai-tools-rail/ai-tools-rail.agent.ts","../../src/components/ai-tools-rail/ai-tools-rail.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — AiToolsRail. */\n/* */\n/* Rail-level surface: open / close a tool's panel and read which tool */\n/* is active. State is strictly the active tool id — never any tool's */\n/* panel CONTENT (which may carry PHI). Tool ids + badge counts are */\n/* supplied by the host via props, not derived from panel bodies. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { AiToolsRailHandle } from './ai-tools-rail';\n\nexport const aiToolsRailAgent: AgentAdapter<AiToolsRailHandle> = {\n id: 'ai-tools-rail',\n capabilities: ['open', 'close', 'select_single'],\n state: {\n activeToolId: {\n type: 'string | null',\n descriptionKey: 'ui.aiToolsRail.agent.state.activeToolId',\n description:\n 'Id of the tool whose panel is currently open, or null when the rail is collapsed to its strip. No panel content is ever exposed.',\n read: (handle) => handle.getActiveToolId(),\n },\n },\n actions: {\n open: {\n safety: 'read',\n argsType: '{ id: string }',\n descriptionKey: 'ui.aiToolsRail.agent.actions.open',\n description: \"Open the given tool's panel.\",\n invoke: (handle, args: { id: string }) => {\n handle.open(args.id);\n },\n },\n close: {\n safety: 'read',\n descriptionKey: 'ui.aiToolsRail.agent.actions.close',\n description: 'Collapse the rail to its strip (no active tool).',\n invoke: (handle) => {\n handle.close();\n },\n },\n select_tool: {\n safety: 'read',\n argsType: '{ id: string | null }',\n descriptionKey: 'ui.aiToolsRail.agent.actions.selectTool',\n description:\n 'Set the active tool by id (opens its panel), or pass null to collapse.',\n invoke: (handle, args: { id: string | null }) => {\n handle.setActiveTool(args.id);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'ai-tools-rail',\n description: 'Marks the AiToolsRail wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific rail from the agent.',\n },\n item: {\n attr: 'data-tool-id',\n description:\n 'Stable tool id emitted on each strip IconButton. The active icon also carries data-active set to its id.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { IconButton } from '../button/icon-button';\nimport { ScrollArea } from '../scroll-area/scroll-area';\nimport { TooltipProvider } from '../tooltip/tooltip';\nimport { useControllableState } from '../../hooks/use-controllable-state';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { aiToolsRailAgent } from './ai-tools-rail.agent';\n\n/* ------------------------------------------------------------------ */\n/* Tokenised widths */\n/* */\n/* Fixed + tokenised so the rail stays constraint-compliant — no */\n/* prop-driven inline styles. Bare `[inline-size:…]` is NOT a */\n/* recognised utility under the `ds:` prefix; it must carry the */\n/* prefix or Tailwind emits no rule. Consumers needing a different */\n/* size wrap the rail and override via CSS. */\n/* ------------------------------------------------------------------ */\nconst RAIL_WIDTH = 'ds:[inline-size:3rem]';\nconst PANEL_WIDTH = 'ds:[inline-size:22rem]';\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport interface AiToolsRailTool {\n /** Stable tool id — used in `data-active`, the imperative handle, and\n * to label the open panel region. */\n id: string;\n /** Accessible name for the strip icon + tooltip, and the open panel's\n * region label. Never rendered as visible body text. */\n label: string;\n /** lucide-react glyph (rendered `aria-hidden` inside the IconButton). */\n icon: ReactNode;\n /** Panel body for this tool. Rendered inline-start of the strip when\n * `side='end'` (mirrored for `'start'`). The consumer composes it. */\n panel: ReactNode;\n /** Optional unseen / notification count shown on the strip icon. */\n badgeCount?: number;\n /** When true the icon is non-interactive and skipped by roving focus. */\n disabled?: boolean;\n}\n\n/**\n * Curated imperative handle for AiToolsRail. Exposed as the forwardRef\n * target so a future agent / MCP UI bridge can drive the rail without\n * touching the DOM. See `ai-tools-rail.agent.ts`.\n *\n * State surfaced here is strictly identifiers + counts — never any\n * tool's panel content (which may carry PHI).\n */\nexport interface AiToolsRailHandle {\n /** Currently-active tool id, or null when collapsed to strip-only. */\n getActiveToolId: () => string | null;\n /** Activate a tool by id (opens its panel), or null to collapse. */\n setActiveTool: (id: string | null) => void;\n /** Activate a tool by id (opens its panel). */\n open: (id: string) => void;\n /** Collapse to strip-only (no active tool). */\n close: () => void;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA — `side` drives the dock edge + which shadow faces main content */\n/* ------------------------------------------------------------------ */\n\nconst railVariants = cva(\n ['ds:flex ds:shrink-0 ds:h-full', 'ds:bg-[var(--background)]'].join(' '),\n {\n variants: {\n side: {\n // Strip docks inline-end; the panel mounts inline-start of it\n // (flex-row, panel rendered first). Shadow faces the main area.\n end: 'ds:flex-row ds:shadow-[var(--shadow-chrome-start)]',\n // Strip docks inline-start; the panel mounts inline-end of it.\n start: 'ds:flex-row-reverse ds:shadow-[var(--shadow-chrome-end)]',\n },\n },\n defaultVariants: { side: 'end' },\n },\n);\n\nconst stripVariants = cva(\n [\n 'ds:flex ds:shrink-0 ds:flex-col ds:items-center',\n 'ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n 'ds:gap-[var(--spacing-xs)]',\n RAIL_WIDTH,\n ].join(' '),\n);\n\nconst panelVariants = cva(\n [\n 'ds:flex ds:min-h-0 ds:flex-col ds:h-full',\n 'ds:bg-[var(--background)]',\n PANEL_WIDTH,\n ].join(' '),\n);\n\n// Hand-rolled overlay count chip — mirrors the AliaSidebar / MessageTray\n// badge markup. A <Badge> would re-introduce its own landmark/role; the\n// strip icon already carries the count in its accessible name, so this\n// span is purely decorative (`aria-hidden`).\nconst badgeVariants = cva(\n [\n 'ds:absolute ds:-top-[var(--spacing-xs)] ds:-end-[var(--spacing-xs)]',\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:min-w-[calc(var(--spacing-md)+var(--spacing-xs))]',\n 'ds:h-[calc(var(--spacing-md)+var(--spacing-xs))]',\n 'ds:ps-[calc(var(--spacing-xs)/1.5)] ds:pe-[calc(var(--spacing-xs)/1.5)]',\n 'ds:rounded-[var(--radius-full)]',\n 'ds:bg-[color:var(--destructive)] ds:text-[color:var(--destructive-foreground)]',\n 'ds:text-[length:var(--font-size-xs)] ds:font-semibold ds:leading-none',\n 'ds:pointer-events-none ds:select-none',\n 'ds:forced-colors:outline ds:forced-colors:outline-1 ds:forced-colors:outline-[CanvasText]',\n ].join(' '),\n);\n\n/* ------------------------------------------------------------------ */\n/* Props */\n/* ------------------------------------------------------------------ */\n\nexport interface AiToolsRailProps extends VariantProps<typeof railVariants> {\n /** Stable instance id, surfaced on the root as `data-component-id`. */\n id?: string;\n /** The tools shown as icons on the strip. */\n tools: AiToolsRailTool[];\n /** Controlled active tool id (null = collapsed / strip-only). */\n activeToolId?: string | null;\n /** Uncontrolled initial active tool id (default null). */\n defaultActiveToolId?: string | null;\n /** Fires whenever the active tool changes (incl. → null on collapse). */\n onActiveToolChange?: (id: string | null) => void;\n /** Which edge the rail docks to. Default `'end'` (inline-end). */\n side?: 'start' | 'end';\n /** Accessible label for the toolbar strip. */\n railLabel?: string;\n className?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nfunction formatBadgeCount(count: number, overflowLabel: string): string {\n return count > 99 ? overflowLabel : String(count);\n}\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nexport const AiToolsRail = forwardRef<AiToolsRailHandle, AiToolsRailProps>(\n (\n {\n id,\n tools,\n activeToolId,\n defaultActiveToolId = null,\n onActiveToolChange,\n side = 'end',\n railLabel,\n className,\n },\n ref,\n ) => {\n const { t } = useTranslation();\n\n // Controlled / uncontrolled bridge — the same hook MessageTray uses.\n const [activeRaw, setActiveRaw] = useControllableState<string | null>({\n value: activeToolId,\n defaultValue: defaultActiveToolId,\n onChange: onActiveToolChange,\n });\n const activeId = activeRaw ?? null;\n\n // Roving-tabindex bookkeeping for the vertical toolbar strip.\n const buttonsRef = useRef<Array<HTMLButtonElement | null>>([]);\n const panelRef = useRef<HTMLElement | null>(null);\n const [focusIndex, setFocusIndex] = useState(0);\n // Distinguishes keyboard activation (auto-focus into the panel) from\n // pointer activation (focus stays on the icon — less jarring).\n const activatedByKeyboardRef = useRef(false);\n // Set on Enter/Space keydown, read by the click handler that follows,\n // cleared on keyup — so a subsequent mouse click never inherits it.\n const keyboardActivateRef = useRef(false);\n\n const activeIndex = useMemo(\n () => tools.findIndex((tl) => tl.id === activeId),\n [tools, activeId],\n );\n const activeTool = activeIndex >= 0 ? tools[activeIndex] : null;\n\n // First non-disabled index — the resting roving stop when none active.\n const firstEnabledIndex = useMemo(\n () => tools.findIndex((tl) => !tl.disabled),\n [tools],\n );\n\n // The roving tab stop: the active icon when a tool is open, else the\n // index the user last focused, else the first enabled icon.\n const rovingIndex =\n activeIndex >= 0\n ? activeIndex\n : focusIndex >= 0 && !tools[focusIndex]?.disabled\n ? focusIndex\n : firstEnabledIndex;\n\n const selectTool = useCallback(\n (toolId: string, fromKeyboard: boolean) => {\n const tool = tools.find((tl) => tl.id === toolId);\n if (!tool || tool.disabled) return;\n activatedByKeyboardRef.current = fromKeyboard;\n // Clicking / activating the active tool collapses to strip-only.\n setActiveRaw(activeId === toolId ? null : toolId);\n },\n [tools, activeId, setActiveRaw],\n );\n\n /* ---- Roving arrow-key navigation (vertical toolbar) ----------- */\n const handleStripKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>) => {\n const count = tools.length;\n if (count === 0) return;\n\n let next: number | null = null;\n if (event.key === 'ArrowDown') next = (rovingIndex + 1) % count;\n else if (event.key === 'ArrowUp')\n next = (rovingIndex - 1 + count) % count;\n else if (event.key === 'Home') next = 0;\n else if (event.key === 'End') next = count - 1;\n if (next === null) return;\n\n // Skip disabled icons in the travel direction.\n const goingBack = event.key === 'ArrowUp' || event.key === 'End';\n let candidate = next;\n let attempts = 0;\n while (attempts < count && tools[candidate]?.disabled) {\n candidate = goingBack\n ? (candidate - 1 + count) % count\n : (candidate + 1) % count;\n attempts += 1;\n }\n if (tools[candidate]?.disabled) return;\n\n event.preventDefault();\n setFocusIndex(candidate);\n buttonsRef.current[candidate]?.focus();\n },\n [tools, rovingIndex],\n );\n\n /* ---- Esc collapses + returns focus to the active tool's icon -- */\n // Attached imperatively via the root ref (not a JSX onKeyDown on the\n // static container) so the Escape shortcut works from anywhere inside the\n // open panel without an interaction handler on a non-interactive element.\n const rootRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n const node = rootRef.current;\n if (!node) return undefined;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return;\n if (activeIndex < 0) return;\n event.preventDefault();\n const returnIndex = activeIndex;\n setActiveRaw(null);\n setFocusIndex(returnIndex);\n // Defer until after the panel unmounts so focus lands cleanly.\n requestAnimationFrame(() => {\n buttonsRef.current[returnIndex]?.focus();\n });\n };\n node.addEventListener('keydown', onKeyDown);\n return () => node.removeEventListener('keydown', onKeyDown);\n }, [activeIndex, setActiveRaw]);\n\n /* ---- Move focus into the panel when opened by keyboard -------- */\n useIsomorphicLayoutEffect(() => {\n if (activeTool && activatedByKeyboardRef.current) {\n panelRef.current?.focus();\n }\n activatedByKeyboardRef.current = false;\n }, [activeTool]);\n\n /* ---- Curated imperative handle for agent integration ---------- */\n const activeIdRef = useRef<string | null>(activeId);\n activeIdRef.current = activeId;\n\n const handle = useMemo<AiToolsRailHandle>(\n () => ({\n getActiveToolId: () => activeIdRef.current,\n setActiveTool: (toolId) => {\n activatedByKeyboardRef.current = false;\n setActiveRaw(toolId);\n },\n open: (toolId) => {\n const tool = tools.find((tl) => tl.id === toolId);\n if (!tool || tool.disabled) return;\n activatedByKeyboardRef.current = false;\n setActiveRaw(toolId);\n },\n close: () => {\n activatedByKeyboardRef.current = false;\n setActiveRaw(null);\n },\n }),\n [tools, setActiveRaw],\n );\n\n useImperativeHandle(ref, () => handle, [handle]);\n useAgentRegistration(aiToolsRailAgent, handle, id);\n\n const overflowLabel = t('aiToolsRail.badgeCountOverflow', {\n defaultValue: '99+',\n });\n\n return (\n <div\n ref={rootRef}\n data-component=\"ai-tools-rail\"\n data-component-id={id}\n data-side={side}\n className={[railVariants({ side }), className]\n .filter(Boolean)\n .join(' ')}\n >\n {/* The OPEN panel is the single complementary landmark, named by\n the active tool. Rendered only while a tool is active so two\n unnamed regions never coexist. */}\n {activeTool ? (\n <aside\n ref={panelRef}\n tabIndex={-1}\n aria-label={t('aiToolsRail.panelLabel', {\n tool: activeTool.label,\n defaultValue: '{{tool}} panel',\n })}\n data-ai-tools-rail-state=\"expanded\"\n data-active-tool={activeTool.id}\n className={[panelVariants(), 'ds:focus-visible:outline-none'].join(\n ' ',\n )}\n >\n <ScrollArea orientation=\"vertical\" className=\"ds:flex-1 ds:min-h-0\">\n {activeTool.panel}\n </ScrollArea>\n </aside>\n ) : null}\n\n {/* The 3rem icon strip — a vertical toolbar with roving tabindex.\n Self-contained TooltipProvider so consumers needn't mount one;\n Radix providers compose, so a host-level provider still works. */}\n <TooltipProvider>\n <div\n role=\"toolbar\"\n aria-orientation=\"vertical\"\n aria-label={\n railLabel ??\n t('aiToolsRail.railLabel', { defaultValue: 'AI tools' })\n }\n className={stripVariants()}\n onKeyDown={handleStripKeyDown}\n >\n {tools.map((tool, index) => {\n const isActive = tool.id === activeId;\n const showBadge =\n typeof tool.badgeCount === 'number' && tool.badgeCount > 0;\n // Fold the count into the accessible name so SR users hear it\n // without relying on the decorative chip.\n const accessibleName = showBadge\n ? t('aiToolsRail.toolWithCount', {\n tool: tool.label,\n count: tool.badgeCount,\n defaultValue: '{{tool}}, {{count}} updates',\n })\n : tool.label;\n return (\n <div key={tool.id} className=\"ds:relative\">\n <IconButton\n ref={(el) => {\n buttonsRef.current[index] = el;\n }}\n icon={tool.icon}\n tooltip={tool.label}\n aria-label={accessibleName}\n intent=\"ghost\"\n size=\"sm\"\n disabled={tool.disabled}\n aria-pressed={isActive}\n aria-expanded={isActive}\n data-active={isActive ? tool.id : undefined}\n data-tool-id={tool.id}\n tabIndex={index === rovingIndex ? 0 : -1}\n onFocus={() => {\n if (!tool.disabled) setFocusIndex(index);\n }}\n onClick={() =>\n selectTool(tool.id, keyboardActivateRef.current)\n }\n onKeyDown={(event) => {\n // Enter/Space activate via the native button's click,\n // which fires AFTER this keydown. Flag the upcoming\n // click as keyboard-driven so focus moves into the\n // panel; reset on keyup so a later mouse click doesn't\n // inherit the flag.\n if (event.key === 'Enter' || event.key === ' ') {\n keyboardActivateRef.current = true;\n }\n }}\n onKeyUp={(event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n keyboardActivateRef.current = false;\n }\n }}\n />\n {showBadge ? (\n <span aria-hidden=\"true\" className={badgeVariants()}>\n {formatBadgeCount(\n tool.badgeCount as number,\n overflowLabel,\n )}\n </span>\n ) : null}\n </div>\n );\n })}\n </div>\n </TooltipProvider>\n </div>\n );\n },\n);\n\nAiToolsRail.displayName = 'AiToolsRail';\n"],"names":["aiToolsRailAgent","handle","args","RAIL_WIDTH","PANEL_WIDTH","railVariants","cva","stripVariants","panelVariants","badgeVariants","formatBadgeCount","count","overflowLabel","AiToolsRail","forwardRef","id","tools","activeToolId","defaultActiveToolId","onActiveToolChange","side","railLabel","className","ref","t","useTranslation","activeRaw","setActiveRaw","useControllableState","activeId","buttonsRef","useRef","panelRef","focusIndex","setFocusIndex","useState","activatedByKeyboardRef","keyboardActivateRef","activeIndex","useMemo","tl","activeTool","firstEnabledIndex","rovingIndex","_a","selectTool","useCallback","toolId","fromKeyboard","tool","handleStripKeyDown","event","next","goingBack","candidate","attempts","_b","_c","rootRef","useEffect","node","onKeyDown","returnIndex","useIsomorphicLayoutEffect","activeIdRef","useImperativeHandle","useAgentRegistration","jsxs","jsx","ScrollArea","TooltipProvider","index","isActive","showBadge","accessibleName","IconButton","el"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"alert-ywPR59NE.js","sources":["../../src/components/alert/alert.tsx"],"sourcesContent":["import {\n Children,\n forwardRef,\n isValidElement,\n useCallback,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Info, CircleCheck, TriangleAlert, CircleX, X } from 'lucide-react';\nimport { useControllableState } from '../../hooks/use-controllable-state';\n\nconst alertVariants = cva(\n [\n // Default `items-center` keeps the icon + dismiss optically aligned\n // with a single-line description. The `data-[has-title=true]`\n // selector flips to `items-start` when an `<Alert.Title>` is\n // present so the icon anchors to the heading's top instead of\n // floating against the centre of the title+description block.\n // For multi-line descriptions without a title, `items-center` still\n // looks right at 2–3 lines and matches Toast / Notification.\n 'ds:flex ds:items-center ds:data-[has-title=true]:items-start ds:gap-[var(--spacing-md)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:border ds:border-[length:var(--border-width-sm)]',\n 'ds:p-[var(--spacing-md)]',\n 'ds:break-words',\n ].join(' '),\n {\n variants: {\n // Each variant paints `<Button intent=\"tonal\">` descendants via a\n // child selector — the button carries `data-intent=\"tonal\"`, the\n // Alert applies the matching tint (`*-foreground` for bg + the\n // surface `--background` for fg). Descendant selectors sidestep\n // custom-property inheritance and are rock-solid across themes.\n variant: {\n info: [\n 'ds:border-[color:var(--info)]',\n 'ds:bg-[color-mix(in_srgb,var(--info)_10%,transparent)]',\n 'ds:text-[var(--info-foreground)]',\n 'ds:[&_[data-intent=tonal]]:bg-[color:var(--info-foreground)]',\n 'ds:[&_[data-intent=tonal]]:text-[color:var(--background)]',\n ].join(' '),\n success: [\n 'ds:border-[color:var(--success)]',\n 'ds:bg-[color-mix(in_srgb,var(--success)_10%,transparent)]',\n 'ds:text-[var(--success-foreground)]',\n 'ds:[&_[data-intent=tonal]]:bg-[color:var(--success-foreground)]',\n 'ds:[&_[data-intent=tonal]]:text-[color:var(--background)]',\n ].join(' '),\n warning: [\n 'ds:border-[color:var(--warning)]',\n 'ds:bg-[color-mix(in_srgb,var(--warning)_10%,transparent)]',\n 'ds:text-[var(--warning-foreground)]',\n 'ds:[&_[data-intent=tonal]]:bg-[color:var(--warning-foreground)]',\n 'ds:[&_[data-intent=tonal]]:text-[color:var(--background)]',\n ].join(' '),\n error: [\n 'ds:border-[color:var(--error)]',\n 'ds:bg-[color-mix(in_srgb,var(--error)_10%,transparent)]',\n 'ds:text-[var(--error-foreground)]',\n 'ds:[&_[data-intent=tonal]]:bg-[color:var(--error-foreground)]',\n 'ds:[&_[data-intent=tonal]]:text-[color:var(--background)]',\n ].join(' '),\n },\n },\n defaultVariants: {\n variant: 'info',\n },\n },\n);\n\n// Icon stays `mt-0.5` only when an `<Alert.Title>` is present — that\n// offset compensates for the title's cap-height vs. line-box origin so\n// the glyph aligns with the heading's caps. Without a title, the\n// container uses `items-center` and the offset would push the icon\n// 2px off the optical axis.\nconst ICON_BASE = 'ds:shrink-0 ds:size-5';\nconst ICON_WITH_TITLE = `${ICON_BASE} ds:mt-0.5`;\n\nconst CLOSE_BUTTON_CLASSES = [\n // Default (no title): the alert root uses `items-center` and the\n // button centres in the cross-axis. A centred 16×16 glyph inside a\n // 44×44 button aligns optically with a single-line description.\n // With a title: the root flips to `items-start` so the button's top\n // edge aligns with the title row top. A centred glyph would then\n // land ~11 px below the title's optical centre (button height is\n // --min-target-size, much taller than the title's line-height). The\n // `[data-has-title=true]` variant below flips the button to\n // `items-start` and adds a block-start padding that pulls the glyph\n // up onto the title row — same cap-height compensation idea as the\n // leading icon's `mt-0.5`.\n 'ds:ms-auto ds:shrink-0 ds:inline-flex ds:items-center ds:justify-center',\n 'ds:[[data-has-title=true]_&]:items-start',\n 'ds:[[data-has-title=true]_&]:pt-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:min-h-[var(--min-target-size)] ds:min-w-[var(--min-target-size)]',\n 'ds:-mt-[var(--spacing-xs)] ds:-me-[var(--spacing-xs)]',\n 'ds:text-current ds:opacity-70',\n 'ds:hover:opacity-100',\n 'ds:transition-opacity ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\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 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n].join(' ');\n\nconst VARIANT_CONFIG = {\n info: { icon: <Info aria-hidden=\"true\" />, role: 'status', live: 'polite' },\n success: {\n icon: <CircleCheck aria-hidden=\"true\" />,\n role: 'status',\n live: 'polite',\n },\n warning: {\n icon: <TriangleAlert aria-hidden=\"true\" />,\n role: 'alert',\n live: 'assertive',\n },\n error: {\n icon: <CircleX aria-hidden=\"true\" />,\n role: 'alert',\n live: 'assertive',\n },\n} as const;\n\ninterface AlertTitleProps extends HTMLAttributes<HTMLHeadingElement> {\n as?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span';\n}\n\nconst AlertTitle = forwardRef<HTMLHeadingElement, AlertTitleProps>(\n ({ as: Tag = 'h5', className, ...props }, ref) => (\n <Tag\n ref={ref}\n className={['type-title-item', className].filter(Boolean).join(' ')}\n {...props}\n />\n ),\n);\nAlertTitle.displayName = 'Alert.Title';\n\nconst AlertDescription = forwardRef<\n HTMLParagraphElement,\n HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n // `mt` is gated on the root's `data-has-title=\"true\"` attribute so\n // the margin only paints when there's a Title above the\n // Description to separate from. Without this gate, a Description\n // rendered alone sits a few pixels below the icon + dismiss ×\n // optical centre — visible on the AlfaDocs marketing privacy\n // generator before HTP-4860's follow-up fix.\n className={[\n 'ds:[[data-has-title=true]_&]:mt-[var(--spacing-xs)] type-body-sm',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n));\nAlertDescription.displayName = 'Alert.Description';\n\nconst AlertAction = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={[\n 'ds:mt-[var(--spacing-sm)] ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n ),\n);\nAlertAction.displayName = 'Alert.Action';\n\nexport interface AlertProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'role'>,\n VariantProps<typeof alertVariants> {\n variant?: 'info' | 'success' | 'warning' | 'error';\n dismissible?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n icon?: ReactNode;\n live?: 'assertive' | 'polite' | 'off';\n}\n\nexport type { AlertTitleProps };\n\nconst AlertRoot = forwardRef<HTMLDivElement, AlertProps>(\n (\n {\n variant = 'info',\n dismissible = false,\n open: controlledOpen,\n onOpenChange,\n icon,\n live,\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const [isOpenRaw, setOpen] = useControllableState<boolean>({\n value: controlledOpen,\n defaultValue: true,\n onChange: onOpenChange,\n });\n const isOpen = isOpenRaw ?? true;\n const [isClosing, setIsClosing] = useState(false);\n const closeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const animationDurationMs = useCallback((): number => {\n if (typeof window === 'undefined') return 200;\n const raw = window\n .getComputedStyle(document.documentElement)\n .getPropertyValue('--animation-duration');\n if (!raw) return 200;\n const trimmed = raw.trim();\n const n = parseFloat(trimmed);\n if (!Number.isFinite(n)) return 200;\n return trimmed.endsWith('ms') ? n : n * 1000;\n }, []);\n\n if (!isOpen) return null;\n\n const config = VARIANT_CONFIG[variant];\n const effectiveIcon = icon !== undefined ? icon : config.icon;\n\n // Detect an `<Alert.Title>` anywhere in the immediate children so\n // the root can flip its cross-axis alignment. Nested wrappers\n // around a Title aren't supported — keep the API as flat as the\n // existing `Alert.Title` / `Alert.Description` convention.\n const hasTitle = Children.toArray(children).some(\n (child) => isValidElement(child) && child.type === AlertTitle,\n );\n\n const handleDismiss = () => {\n if (isClosing) return;\n setIsClosing(true);\n if (closeTimerRef.current) clearTimeout(closeTimerRef.current);\n closeTimerRef.current = setTimeout(() => {\n setIsClosing(false);\n setOpen(false);\n }, animationDurationMs());\n };\n\n return (\n <div\n ref={ref}\n role={config.role}\n aria-live={live ?? config.live}\n data-component=\"alert\"\n data-has-title={hasTitle ? 'true' : 'false'}\n data-state={isClosing ? 'closing' : 'open'}\n className={[\n alertVariants({ variant, className }),\n // Entry: fade + slide-down on mount. Exit: fade + slide-up + slight\n // scale when dismissed. Driven by `tw-animate-css`. Respects\n // `prefers-reduced-motion` via `motion-safe:` and zeroes under the\n // accessible theme (`--animation-duration: 0ms`).\n 'ds:motion-safe:animate-in ds:motion-safe:fade-in-0 ds:motion-safe:slide-in-from-top-2',\n 'ds:motion-safe:data-[state=closing]:animate-out ds:motion-safe:data-[state=closing]:fade-out-0',\n 'ds:motion-safe:data-[state=closing]:slide-out-to-top-2 ds:motion-safe:data-[state=closing]:zoom-out-95',\n // Pin the exit's end-state until React unmounts. Without\n // `fill-mode-forwards` the element snaps back to opacity:1 for one\n // paint frame after the animation ends.\n 'ds:motion-safe:data-[state=closing]:fill-mode-forwards',\n 'ds:motion-safe:duration-[var(--animation-duration)]',\n ].join(' ')}\n {...props}\n >\n {effectiveIcon ? (\n <span className={hasTitle ? ICON_WITH_TITLE : ICON_BASE}>\n {effectiveIcon}\n </span>\n ) : null}\n\n <div className=\"ds:flex-1 ds:min-w-0\">{children}</div>\n\n {dismissible ? (\n <button\n type=\"button\"\n aria-label={t('common.close', 'Close')}\n onClick={handleDismiss}\n className={CLOSE_BUTTON_CLASSES}\n >\n <X aria-hidden=\"true\" className=\"ds:size-4\" />\n </button>\n ) : null}\n </div>\n );\n },\n);\n\nAlertRoot.displayName = 'Alert';\n\nexport const Alert = Object.assign(AlertRoot, {\n Title: AlertTitle,\n Description: AlertDescription,\n Action: AlertAction,\n});\n"],"names":["alertVariants","cva","ICON_BASE","ICON_WITH_TITLE","CLOSE_BUTTON_CLASSES","VARIANT_CONFIG","jsx","Info","CircleCheck","TriangleAlert","CircleX","AlertTitle","forwardRef","Tag","className","props","ref","AlertDescription","AlertAction","AlertRoot","variant","dismissible","controlledOpen","onOpenChange","icon","live","children","t","useTranslation","isOpenRaw","setOpen","useControllableState","isOpen","isClosing","setIsClosing","useState","closeTimerRef","useRef","animationDurationMs","useCallback","raw","trimmed","n","config","effectiveIcon","hasTitle","Children","child","isValidElement","handleDismiss","jsxs","Alert"],"mappings":"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"}
@@ -1,211 +0,0 @@
1
- import { jsxs as r, jsx as e } from "react/jsx-runtime";
2
- import { forwardRef as F, useState as L, useMemo as y, useEffect as H } from "react";
3
- import { c as $ } from "./index-D2ZczOXr.js";
4
- import { useTranslation as A } from "react-i18next";
5
- import { F as w } from "./form-field-BOm9hK35.js";
6
- import { D as I } from "./date-picker-Bq7xhMA-.js";
7
- import { N as S } from "./number-input-Dj5L3pXK.js";
8
- import { C as P } from "./card-DPmk26CL.js";
9
- import { B as v } from "./badge-zsf5i5bH.js";
10
- import { I as k } from "./insert-result-DNdi_JYW.js";
11
- import { a as s } from "./date-picker-variants-DLi1Va_e.js";
12
- import { C as z } from "./check-DPdL_Sm7.js";
13
- import { H as B } from "./heart-C0faivFf.js";
14
- import { c as G } from "./createLucideIcon-CrFbzy84.js";
15
- /**
16
- * @license lucide-react v1.8.0 - ISC
17
- *
18
- * This source code is licensed under the ISC license.
19
- * See the LICENSE file in the root directory of this source tree.
20
- */
21
- const Y = [
22
- [
23
- "path",
24
- {
25
- d: "M12 22a7 7 0 0 0 7-7c0-2-1-3.9-3-5.5s-3.5-4-4-6.5c-.5 2.5-2 4.9-4 6.5C6 11.1 5 13 5 15a7 7 0 0 0 7 7z",
26
- key: "c7niix"
27
- }
28
- ]
29
- ], j = G("droplet", Y), x = 28, M = 14, U = 1;
30
- function K(n, c = 3) {
31
- const d = n.cycleLength ?? x, { lastPeriodStart: o } = n, i = s(o, d - M), u = {
32
- start: s(i, -5),
33
- end: s(i, U)
34
- }, f = s(o, d), p = Array.from(
35
- { length: c },
36
- (C, g) => s(o, d * (g + 1))
37
- );
38
- return { nextPeriod: f, ovulation: i, fertileWindow: u, upcomingPeriods: p };
39
- }
40
- const O = $("ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]", {
41
- variants: {
42
- width: { full: "ds:w-full", auto: "ds:inline-flex" }
43
- },
44
- defaultVariants: { width: "full" }
45
- }), V = "--accent", q = F(
46
- ({
47
- defaultCycleLength: n = x,
48
- onResultChange: c,
49
- onInsert: d,
50
- insertVariant: o = "insert",
51
- onCopy: i,
52
- onError: u,
53
- insertBrand: f,
54
- id: p,
55
- width: C,
56
- className: g
57
- }, b) => {
58
- const { t: a, i18n: N } = A(), [m, D] = L(void 0), [h, E] = L(
59
- n
60
- ), t = y(() => m ? K({
61
- lastPeriodStart: m,
62
- cycleLength: h ?? x
63
- }) : null, [m, h]), T = y(
64
- () => new Intl.DateTimeFormat(N.language, { dateStyle: "medium" }),
65
- [N.language]
66
- );
67
- H(() => {
68
- c == null || c(t);
69
- }, [t, c]);
70
- const _ = y(() => /* @__PURE__ */ new Date(), []), l = (W) => T.format(W);
71
- return /* @__PURE__ */ r(
72
- "div",
73
- {
74
- ref: b,
75
- "data-component": "cycle-calculator",
76
- "data-component-id": p,
77
- className: O({ width: C, className: g }),
78
- children: [
79
- /* @__PURE__ */ r("div", { className: "ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-2", children: [
80
- /* @__PURE__ */ e(w, { label: a("cycleCalculator.lastPeriod"), children: /* @__PURE__ */ e(
81
- I,
82
- {
83
- value: m,
84
- onChange: D,
85
- maxDate: _
86
- }
87
- ) }),
88
- /* @__PURE__ */ e(
89
- w,
90
- {
91
- label: a("cycleCalculator.cycleLength"),
92
- description: a("cycleCalculator.cycleLengthHint"),
93
- children: /* @__PURE__ */ e(
94
- S,
95
- {
96
- mode: "integer",
97
- min: 20,
98
- max: 45,
99
- value: h,
100
- onChange: E
101
- }
102
- )
103
- }
104
- )
105
- ] }),
106
- /* @__PURE__ */ e("p", { className: "ds:sr-only", role: "status", "aria-live": "polite", children: t ? `${a("cycleCalculator.ovulation")}: ${l(t.ovulation)}. ${a(
107
- "cycleCalculator.nextPeriod"
108
- )}: ${l(t.nextPeriod)}.` : "" }),
109
- t ? /* @__PURE__ */ e(P, { variant: "elevated", children: /* @__PURE__ */ r(P.Body, { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-md)]", children: [
110
- /* @__PURE__ */ r("dl", { className: "ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-3", children: [
111
- /* @__PURE__ */ r("div", { className: "ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-xs)] ds:text-center", children: [
112
- /* @__PURE__ */ e("dt", { className: "type-label ds:text-muted-foreground", children: a("cycleCalculator.ovulation") }),
113
- /* @__PURE__ */ e("dd", { children: /* @__PURE__ */ e(
114
- v,
115
- {
116
- variant: "success",
117
- size: "lg",
118
- leading: /* @__PURE__ */ e(z, { "aria-hidden": !0 }),
119
- children: l(t.ovulation)
120
- }
121
- ) })
122
- ] }),
123
- /* @__PURE__ */ r("div", { className: "ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-xs)] ds:text-center", children: [
124
- /* @__PURE__ */ e("dt", { className: "type-label ds:text-muted-foreground", children: a("cycleCalculator.fertileWindow") }),
125
- /* @__PURE__ */ e("dd", { children: /* @__PURE__ */ r(
126
- v,
127
- {
128
- variant: "accent",
129
- size: "lg",
130
- leading: /* @__PURE__ */ e(B, { "aria-hidden": !0 }),
131
- children: [
132
- l(t.fertileWindow.start),
133
- " –",
134
- " ",
135
- l(t.fertileWindow.end)
136
- ]
137
- }
138
- ) })
139
- ] }),
140
- /* @__PURE__ */ r("div", { className: "ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-xs)] ds:text-center", children: [
141
- /* @__PURE__ */ e("dt", { className: "type-label ds:text-muted-foreground", children: a("cycleCalculator.nextPeriod") }),
142
- /* @__PURE__ */ e("dd", { children: /* @__PURE__ */ e(
143
- v,
144
- {
145
- variant: "error",
146
- size: "lg",
147
- leading: /* @__PURE__ */ e(j, { "aria-hidden": !0 }),
148
- children: l(t.nextPeriod)
149
- }
150
- ) })
151
- ] })
152
- ] }),
153
- o === "copy" || d ? /* @__PURE__ */ e(
154
- k,
155
- {
156
- onInsert: d,
157
- variant: o,
158
- onCopy: i,
159
- onError: u,
160
- card: {
161
- title: a("insert.title.cycle"),
162
- icon: "heart",
163
- highlight: `${l(t.fertileWindow.start)} – ${l(
164
- t.fertileWindow.end
165
- )}`,
166
- // Chip reuses the on-screen fertile-window badge's accent
167
- // token so the inserted PNG chip matches the screen.
168
- highlightToken: V,
169
- brand: f,
170
- fields: [
171
- {
172
- // Ovulation is a predicted date → calendar glyph (the
173
- // on-screen badge uses a Check tick, which ICON_GEOMETRY
174
- // does not carry, so the calendar reads the date meaning).
175
- icon: "calendar",
176
- label: a("cycleCalculator.ovulation"),
177
- value: l(t.ovulation)
178
- },
179
- {
180
- // Fertile window → heart glyph, matching the on-screen
181
- // fertile-window badge's Heart icon.
182
- icon: "heart",
183
- label: a("cycleCalculator.fertileWindow"),
184
- value: `${l(t.fertileWindow.start)} – ${l(
185
- t.fertileWindow.end
186
- )}`
187
- },
188
- {
189
- // Next period → droplets glyph, matching the on-screen
190
- // next-period badge's Droplet icon.
191
- icon: "droplets",
192
- label: a("cycleCalculator.nextPeriod"),
193
- value: l(t.nextPeriod)
194
- }
195
- ]
196
- }
197
- }
198
- ) : null
199
- ] }) }) : /* @__PURE__ */ e("p", { className: "type-body ds:text-muted-foreground", children: a("cycleCalculator.empty") })
200
- ]
201
- }
202
- );
203
- }
204
- );
205
- q.displayName = "CycleCalculator";
206
- export {
207
- q as C,
208
- M as L,
209
- K as p
210
- };
211
- //# sourceMappingURL=cycle-calculator-DYvGm_m1.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cycle-calculator-DYvGm_m1.js","sources":["../../node_modules/lucide-react/dist/esm/icons/droplet.js","../../src/components/cycle-calculator/cycle.ts","../../src/components/cycle-calculator/cycle-calculator.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M12 22a7 7 0 0 0 7-7c0-2-1-3.9-3-5.5s-3.5-4-4-6.5c-.5 2.5-2 4.9-4 6.5C6 11.1 5 13 5 15a7 7 0 0 0 7 7z\",\n key: \"c7niix\"\n }\n ]\n];\nconst Droplet = createLucideIcon(\"droplet\", __iconNode);\n\nexport { __iconNode, Droplet as default };\n//# sourceMappingURL=droplet.js.map\n","/* ------------------------------------------------------------------ */\n/* Menstrual-cycle prediction — pure, framework-free, unit-testable. */\n/* */\n/* Uses the standard fixed-luteal-phase model: ovulation falls ~14 days */\n/* before the next period, so on a cycle of length L ovulation is day */\n/* (L − 14). The fertile window spans the 5 days before ovulation */\n/* (sperm survival) through 1 day after (oocyte viability). */\n/* ------------------------------------------------------------------ */\n\nimport { addDays } from 'date-fns';\n\n/** Standard menstrual-cycle length. */\nexport const DEFAULT_CYCLE_LENGTH = 28;\n/** Luteal phase is biologically near-constant at ~14 days. */\nexport const LUTEAL_PHASE_DAYS = 14;\n/** Sperm survive up to ~5 days before ovulation. */\nexport const FERTILE_DAYS_BEFORE = 5;\n/** The oocyte is viable ~1 day after ovulation. */\nexport const FERTILE_DAYS_AFTER = 1;\n\nexport interface CycleInput {\n /** First day of the most recent period. */\n lastPeriodStart: Date;\n /** Average cycle length in days. Defaults to 28. */\n cycleLength?: number;\n /** Period (bleed) length in days. Optional — used for the period range. */\n periodLength?: number;\n}\n\nexport interface DateRange {\n start: Date;\n end: Date;\n}\n\nexport interface CyclePrediction {\n /** Start date of the next period. */\n nextPeriod: Date;\n /** Estimated ovulation date. */\n ovulation: Date;\n /** Fertile window (5 days before ovulation → 1 day after). */\n fertileWindow: DateRange;\n /** Start dates of the next few periods (length = `occurrences`). */\n upcomingPeriods: Date[];\n}\n\n/**\n * Predict ovulation, the fertile window and upcoming periods from the last\n * period's start date. `occurrences` controls how many future periods to\n * list (default 3).\n */\nexport function predictCycle(\n input: CycleInput,\n occurrences = 3,\n): CyclePrediction {\n const cycle = input.cycleLength ?? DEFAULT_CYCLE_LENGTH;\n const { lastPeriodStart } = input;\n\n const ovulation = addDays(lastPeriodStart, cycle - LUTEAL_PHASE_DAYS);\n const fertileWindow: DateRange = {\n start: addDays(ovulation, -FERTILE_DAYS_BEFORE),\n end: addDays(ovulation, FERTILE_DAYS_AFTER),\n };\n const nextPeriod = addDays(lastPeriodStart, cycle);\n const upcomingPeriods = Array.from({ length: occurrences }, (_, i) =>\n addDays(lastPeriodStart, cycle * (i + 1)),\n );\n\n return { nextPeriod, ovulation, fertileWindow, upcomingPeriods };\n}\n","/* ------------------------------------------------------------------ */\n/* CycleCalculator — predict ovulation, fertile window and upcoming */\n/* periods from the last period's start date. */\n/* */\n/* Maths lives in `./cycle` (pure, separately tested). */\n/* ------------------------------------------------------------------ */\n\nimport { forwardRef, useEffect, useMemo, useState } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Heart, Check, Droplet } from 'lucide-react';\nimport { FormField } from '../form-field';\nimport { DatePicker } from '../date-picker';\nimport { NumberInput } from '../number-input';\nimport { Card } from '../card';\nimport { Badge } from '../badge';\nimport {\n InsertButton,\n type InsertPayload,\n type InsertVariant,\n type InsertMode,\n} from '../_shared/insert-result';\nimport {\n type CyclePrediction,\n predictCycle,\n DEFAULT_CYCLE_LENGTH,\n} from './cycle';\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/**\n * DS token NAME backing the result-card chip — the fertile window is the\n * headline fertility datum, shown on screen with the `accent` Badge variant\n * (which fills `--accent`). The card chip reuses that token so the inserted\n * PNG chip matches the on-screen fertile-window badge.\n */\nconst HIGHLIGHT_TOKEN = '--accent';\n\nexport interface CycleCalculatorProps extends VariantProps<\n typeof rootVariants\n> {\n /** Initial cycle length in days. Defaults to 28. */\n defaultCycleLength?: number;\n /** Fires whenever a prediction can be computed (and `null` when it can't). */\n onResultChange?: (result: CyclePrediction | 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 /** Opaque instance id, emitted as `data-component-id`. */\n id?: string;\n /** Extra class names on the wrapper. */\n className?: string;\n}\n\nexport const CycleCalculator = forwardRef<HTMLDivElement, CycleCalculatorProps>(\n (\n {\n defaultCycleLength = DEFAULT_CYCLE_LENGTH,\n onResultChange,\n onInsert,\n insertVariant = 'insert',\n onCopy,\n onError,\n insertBrand,\n id,\n width,\n className,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n\n const [lastPeriod, setLastPeriod] = useState<Date | undefined>(undefined);\n const [cycleLength, setCycleLength] = useState<number | null>(\n defaultCycleLength,\n );\n\n const result = useMemo<CyclePrediction | null>(() => {\n if (!lastPeriod) return null;\n return predictCycle({\n lastPeriodStart: lastPeriod,\n cycleLength: cycleLength ?? DEFAULT_CYCLE_LENGTH,\n });\n }, [lastPeriod, cycleLength]);\n\n const dateFormatter = useMemo(\n () => new Intl.DateTimeFormat(i18n.language, { dateStyle: 'medium' }),\n [i18n.language],\n );\n\n useEffect(() => {\n onResultChange?.(result);\n }, [result, onResultChange]);\n\n const today = useMemo(() => new Date(), []);\n\n const fmt = (d: Date): string => dateFormatter.format(d);\n\n return (\n <div\n ref={ref}\n data-component=\"cycle-calculator\"\n data-component-id={id}\n className={rootVariants({ width, className })}\n >\n <div className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-2\">\n <FormField label={t('cycleCalculator.lastPeriod')}>\n <DatePicker\n value={lastPeriod}\n onChange={setLastPeriod}\n maxDate={today}\n />\n </FormField>\n <FormField\n label={t('cycleCalculator.cycleLength')}\n description={t('cycleCalculator.cycleLengthHint')}\n >\n <NumberInput\n mode=\"integer\"\n min={20}\n max={45}\n value={cycleLength}\n onChange={setCycleLength}\n />\n </FormField>\n </div>\n\n <p className=\"ds:sr-only\" role=\"status\" aria-live=\"polite\">\n {result\n ? `${t('cycleCalculator.ovulation')}: ${fmt(result.ovulation)}. ${t(\n 'cycleCalculator.nextPeriod',\n )}: ${fmt(result.nextPeriod)}.`\n : ''}\n </p>\n\n {result ? (\n <Card variant=\"elevated\">\n <Card.Body className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <dl className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-3\">\n <div className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-xs)] ds:text-center\">\n <dt className=\"type-label ds:text-muted-foreground\">\n {t('cycleCalculator.ovulation')}\n </dt>\n <dd>\n <Badge\n variant=\"success\"\n size=\"lg\"\n leading={<Check aria-hidden />}\n >\n {fmt(result.ovulation)}\n </Badge>\n </dd>\n </div>\n <div className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-xs)] ds:text-center\">\n <dt className=\"type-label ds:text-muted-foreground\">\n {t('cycleCalculator.fertileWindow')}\n </dt>\n <dd>\n <Badge\n variant=\"accent\"\n size=\"lg\"\n leading={<Heart aria-hidden />}\n >\n {fmt(result.fertileWindow.start)} –{' '}\n {fmt(result.fertileWindow.end)}\n </Badge>\n </dd>\n </div>\n <div className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-xs)] ds:text-center\">\n <dt className=\"type-label ds:text-muted-foreground\">\n {t('cycleCalculator.nextPeriod')}\n </dt>\n <dd>\n <Badge\n variant=\"error\"\n size=\"lg\"\n leading={<Droplet aria-hidden />}\n >\n {fmt(result.nextPeriod)}\n </Badge>\n </dd>\n </div>\n </dl>\n {insertVariant === 'copy' || onInsert ? (\n <InsertButton\n onInsert={onInsert}\n variant={insertVariant}\n onCopy={onCopy}\n onError={onError}\n card={{\n title: t('insert.title.cycle'),\n icon: 'heart',\n highlight: `${fmt(result.fertileWindow.start)} – ${fmt(\n result.fertileWindow.end,\n )}`,\n // Chip reuses the on-screen fertile-window badge's accent\n // token so the inserted PNG chip matches the screen.\n highlightToken: HIGHLIGHT_TOKEN,\n brand: insertBrand,\n fields: [\n {\n // Ovulation is a predicted date → calendar glyph (the\n // on-screen badge uses a Check tick, which ICON_GEOMETRY\n // does not carry, so the calendar reads the date meaning).\n icon: 'calendar',\n label: t('cycleCalculator.ovulation'),\n value: fmt(result.ovulation),\n },\n {\n // Fertile window → heart glyph, matching the on-screen\n // fertile-window badge's Heart icon.\n icon: 'heart',\n label: t('cycleCalculator.fertileWindow'),\n value: `${fmt(result.fertileWindow.start)} – ${fmt(\n result.fertileWindow.end,\n )}`,\n },\n {\n // Next period → droplets glyph, matching the on-screen\n // next-period badge's Droplet icon.\n icon: 'droplets',\n label: t('cycleCalculator.nextPeriod'),\n value: fmt(result.nextPeriod),\n },\n ],\n }}\n />\n ) : null}\n </Card.Body>\n </Card>\n ) : (\n <p className=\"type-body ds:text-muted-foreground\">\n {t('cycleCalculator.empty')}\n </p>\n )}\n </div>\n );\n },\n);\n\nCycleCalculator.displayName = 'CycleCalculator';\n"],"names":["__iconNode","Droplet","createLucideIcon","DEFAULT_CYCLE_LENGTH","LUTEAL_PHASE_DAYS","FERTILE_DAYS_AFTER","predictCycle","input","occurrences","cycle","lastPeriodStart","ovulation","addDays","fertileWindow","nextPeriod","upcomingPeriods","_","i","rootVariants","cva","HIGHLIGHT_TOKEN","CycleCalculator","forwardRef","defaultCycleLength","onResultChange","onInsert","insertVariant","onCopy","onError","insertBrand","id","width","className","ref","t","i18n","useTranslation","lastPeriod","setLastPeriod","useState","cycleLength","setCycleLength","result","useMemo","dateFormatter","useEffect","today","fmt","d","jsxs","jsx","FormField","DatePicker","NumberInput","Card","Badge","Check","Heart","InsertButton"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1,216 +0,0 @@
1
- import { jsxs as l, jsx as a } from "react/jsx-runtime";
2
- import { forwardRef as F, useState as c, useMemo as p, useEffect as H } from "react";
3
- import { c as G } from "./index-D2ZczOXr.js";
4
- import { useTranslation as R } from "react-i18next";
5
- import { R as s } from "./radio-TWf9Q-mp.js";
6
- import { R as v } from "./radio-group-CLjK-SlK.js";
7
- import { F as b } from "./form-field-BOm9hK35.js";
8
- import { D as S } from "./date-picker-Bq7xhMA-.js";
9
- import { N as M } from "./number-input-Dj5L3pXK.js";
10
- import { C } from "./card-DPmk26CL.js";
11
- import { B as z } from "./badge-zsf5i5bH.js";
12
- import { I as V } from "./insert-result-DNdi_JYW.js";
13
- import { D as y, c as j } from "./gestation-mWF4AXea.js";
14
- const K = G("ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]", {
15
- variants: {
16
- width: { full: "ds:w-full", auto: "ds:inline-flex" }
17
- },
18
- defaultVariants: { width: "full" }
19
- }), Y = {
20
- preconception: "neutral",
21
- first: "info",
22
- second: "success",
23
- third: "warning",
24
- postterm: "error"
25
- }, O = {
26
- preconception: "--muted",
27
- first: "--info",
28
- second: "--success",
29
- third: "--warning-readable",
30
- postterm: "--destructive"
31
- };
32
- function P(n) {
33
- return O[n];
34
- }
35
- const U = {
36
- lmp: "dueDateCalculator.lmpDate",
37
- conception: "dueDateCalculator.conceptionDate",
38
- ivf: "dueDateCalculator.transferDate"
39
- }, q = F(
40
- ({
41
- defaultMethod: n = "lmp",
42
- onResultChange: d,
43
- onInsert: f,
44
- insertVariant: D = "insert",
45
- onCopy: x,
46
- onError: N,
47
- insertBrand: L,
48
- id: E,
49
- width: w,
50
- className: A
51
- }, T) => {
52
- const { t: e, i18n: h } = R(), [r, k] = c(n), [o, I] = c(void 0), [u, _] = c(
53
- y
54
- ), [m, $] = c(5), t = p(() => o ? j(
55
- {
56
- method: r,
57
- date: o,
58
- cycleLength: u ?? y,
59
- embryoAge: m
60
- },
61
- /* @__PURE__ */ new Date()
62
- ) : null, [r, o, u, m]), i = p(
63
- () => new Intl.DateTimeFormat(h.language, { dateStyle: "long" }),
64
- [h.language]
65
- );
66
- H(() => {
67
- d == null || d(t);
68
- }, [t, d]);
69
- const B = p(() => /* @__PURE__ */ new Date(), []);
70
- return /* @__PURE__ */ l(
71
- "div",
72
- {
73
- ref: T,
74
- "data-component": "due-date-calculator",
75
- "data-component-id": E,
76
- className: K({ width: w, className: A }),
77
- children: [
78
- /* @__PURE__ */ l(
79
- v,
80
- {
81
- label: e("dueDateCalculator.method.label"),
82
- variant: "horizontal",
83
- value: r,
84
- onValueChange: (g) => k(g),
85
- children: [
86
- /* @__PURE__ */ a(s, { label: e("dueDateCalculator.method.lmp"), value: "lmp" }),
87
- /* @__PURE__ */ a(
88
- s,
89
- {
90
- label: e("dueDateCalculator.method.conception"),
91
- value: "conception"
92
- }
93
- ),
94
- /* @__PURE__ */ a(s, { label: e("dueDateCalculator.method.ivf"), value: "ivf" })
95
- ]
96
- }
97
- ),
98
- /* @__PURE__ */ l("div", { className: "ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-2", children: [
99
- /* @__PURE__ */ a(b, { label: e(U[r]), children: /* @__PURE__ */ a(S, { value: o, onChange: I, maxDate: B }) }),
100
- r === "lmp" && /* @__PURE__ */ a(
101
- b,
102
- {
103
- label: e("dueDateCalculator.cycleLength"),
104
- description: e("dueDateCalculator.cycleLengthHint"),
105
- children: /* @__PURE__ */ a(
106
- M,
107
- {
108
- mode: "integer",
109
- min: 20,
110
- max: 45,
111
- value: u,
112
- onChange: _
113
- }
114
- )
115
- }
116
- ),
117
- r === "ivf" && /* @__PURE__ */ l(
118
- v,
119
- {
120
- label: e("dueDateCalculator.embryoAge"),
121
- variant: "horizontal",
122
- value: String(m),
123
- onValueChange: (g) => $(Number(g)),
124
- children: [
125
- /* @__PURE__ */ a(s, { label: e("dueDateCalculator.day3"), value: "3" }),
126
- /* @__PURE__ */ a(s, { label: e("dueDateCalculator.day5"), value: "5" })
127
- ]
128
- }
129
- )
130
- ] }),
131
- /* @__PURE__ */ a("p", { className: "ds:sr-only", role: "status", "aria-live": "polite", children: t ? `${e("dueDateCalculator.result.dueDateLabel")}: ${i.format(
132
- t.dueDate
133
- )}. ${e("dueDateCalculator.result.trimesterLabel")}: ${e(
134
- `dueDateCalculator.trimester.${t.trimester}`
135
- )}.` : "" }),
136
- t ? /* @__PURE__ */ a(C, { variant: "elevated", children: /* @__PURE__ */ l(C.Body, { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-md)]", children: [
137
- /* @__PURE__ */ l("dl", { className: "ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-3", children: [
138
- /* @__PURE__ */ l("div", { className: "ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-xs)]", children: [
139
- /* @__PURE__ */ a("dt", { className: "type-label ds:text-muted-foreground", children: e("dueDateCalculator.result.trimesterLabel") }),
140
- /* @__PURE__ */ a("dd", { children: /* @__PURE__ */ a(
141
- z,
142
- {
143
- variant: Y[t.trimester],
144
- size: "lg",
145
- children: e(`dueDateCalculator.trimester.${t.trimester}`)
146
- }
147
- ) })
148
- ] }),
149
- /* @__PURE__ */ l("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]", children: [
150
- /* @__PURE__ */ a("dt", { className: "type-label ds:text-muted-foreground", children: e("dueDateCalculator.result.gestationLabel") }),
151
- /* @__PURE__ */ a("dd", { className: "type-body ds:text-foreground", children: t.gestationalAge ? e("dueDateCalculator.result.gestation", {
152
- weeks: t.gestationalAge.weeks,
153
- days: t.gestationalAge.days
154
- }) : "—" })
155
- ] }),
156
- /* @__PURE__ */ l("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]", children: [
157
- /* @__PURE__ */ a("dt", { className: "type-label ds:text-muted-foreground", children: e("dueDateCalculator.result.dueDateLabel") }),
158
- /* @__PURE__ */ a("dd", { className: "type-metric ds:text-foreground", children: i.format(t.dueDate) })
159
- ] })
160
- ] }),
161
- D === "copy" || f ? /* @__PURE__ */ a(
162
- V,
163
- {
164
- variant: D,
165
- onInsert: f,
166
- onCopy: x,
167
- onError: N,
168
- card: {
169
- title: e("insert.title.dueDate"),
170
- icon: "calendar-heart",
171
- highlight: i.format(t.dueDate),
172
- // Chip tinted with the trimester's semantic token so the
173
- // inserted PNG carries the same clinical-stage colour as
174
- // the on-screen trimester badge — with the contrast-safe
175
- // orange override for the `--warning` third trimester.
176
- highlightToken: P(t.trimester),
177
- brand: L,
178
- fields: [
179
- {
180
- // The estimated date of delivery → calendar glyph.
181
- icon: "calendar",
182
- label: e("dueDateCalculator.result.dueDateLabel"),
183
- value: i.format(t.dueDate)
184
- },
185
- {
186
- // Gestational age is an elapsed duration → clock glyph.
187
- icon: "clock",
188
- label: e("dueDateCalculator.result.gestationLabel"),
189
- value: t.gestationalAge ? e("dueDateCalculator.result.gestation", {
190
- weeks: t.gestationalAge.weeks,
191
- days: t.gestationalAge.days
192
- }) : "—"
193
- },
194
- {
195
- // Trimester is a clinical-stage classification → tag.
196
- icon: "tag",
197
- label: e("dueDateCalculator.result.trimesterLabel"),
198
- value: e(
199
- `dueDateCalculator.trimester.${t.trimester}`
200
- )
201
- }
202
- ]
203
- }
204
- }
205
- ) : null
206
- ] }) }) : /* @__PURE__ */ a("p", { className: "type-body ds:text-muted-foreground", children: e("dueDateCalculator.empty") })
207
- ]
208
- }
209
- );
210
- }
211
- );
212
- q.displayName = "DueDateCalculator";
213
- export {
214
- q as D
215
- };
216
- //# sourceMappingURL=due-date-calculator-BXd3ANj7.js.map