@alfadocs/ui-kit-debug 0.43.0 → 0.45.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 (200) hide show
  1. package/dist/_chunks/{alia-sidebar-BpX4z_af.js → alia-sidebar-Be8FhKYd.js} +332 -237
  2. package/dist/_chunks/alia-sidebar-Be8FhKYd.js.map +1 -0
  3. package/dist/_chunks/{autocomplete-DIgdhCGJ.js → autocomplete-CDqxB68B.js} +2 -2
  4. package/dist/_chunks/{autocomplete-DIgdhCGJ.js.map → autocomplete-CDqxB68B.js.map} +1 -1
  5. package/dist/_chunks/bmi-calculator-CQqXTVNL.js +258 -0
  6. package/dist/_chunks/bmi-calculator-CQqXTVNL.js.map +1 -0
  7. package/dist/_chunks/{booking-CtLwaxkK.js → booking-DlDVuWMd.js} +2 -2
  8. package/dist/_chunks/{booking-CtLwaxkK.js.map → booking-DlDVuWMd.js.map} +1 -1
  9. package/dist/_chunks/{calculator-dialog-DdexHrTP.js → calculator-dialog-D-nfvteH.js} +2 -2
  10. package/dist/_chunks/{calculator-dialog-DdexHrTP.js.map → calculator-dialog-D-nfvteH.js.map} +1 -1
  11. package/dist/_chunks/{cycle-calculator-Dln-y1k_.js → cycle-calculator-KxA8dqDf.js} +73 -54
  12. package/dist/_chunks/cycle-calculator-KxA8dqDf.js.map +1 -0
  13. package/dist/_chunks/dialog-BTpZV6It.js +223 -0
  14. package/dist/_chunks/dialog-BTpZV6It.js.map +1 -0
  15. package/dist/_chunks/{due-date-calculator-Cc4dRqTI.js → due-date-calculator-mFxpHLml.js} +73 -49
  16. package/dist/_chunks/due-date-calculator-mFxpHLml.js.map +1 -0
  17. package/dist/_chunks/{editable-currency-cell-renderer-9jqwDv5x.js → editable-currency-cell-renderer-BEBUQl9P.js} +2 -2
  18. package/dist/_chunks/{editable-currency-cell-renderer-9jqwDv5x.js.map → editable-currency-cell-renderer-BEBUQl9P.js.map} +1 -1
  19. package/dist/_chunks/{freemium-paywall-BLXESpH4.js → freemium-paywall-BYist2sJ.js} +2 -2
  20. package/dist/_chunks/{freemium-paywall-BLXESpH4.js.map → freemium-paywall-BYist2sJ.js.map} +1 -1
  21. package/dist/_chunks/gestational-age-calculator-gWI_uRA1.js +203 -0
  22. package/dist/_chunks/gestational-age-calculator-gWI_uRA1.js.map +1 -0
  23. package/dist/_chunks/insert-result-C5ABnzDl.js +711 -0
  24. package/dist/_chunks/insert-result-C5ABnzDl.js.map +1 -0
  25. package/dist/_chunks/{marketplace-app-shell-Dc5cTIt8.js → marketplace-app-shell-Gfsf78ge.js} +2 -2
  26. package/dist/_chunks/{marketplace-app-shell-Dc5cTIt8.js.map → marketplace-app-shell-Gfsf78ge.js.map} +1 -1
  27. package/dist/_chunks/{patient-search-DPe2ZYEL.js → patient-search-CocVcGJ3.js} +2 -2
  28. package/dist/_chunks/{patient-search-DPe2ZYEL.js.map → patient-search-CocVcGJ3.js.map} +1 -1
  29. package/dist/_chunks/{payment-form-BzVsG6Ks.js → payment-form-DqEiEJRO.js} +247 -195
  30. package/dist/_chunks/payment-form-DqEiEJRO.js.map +1 -0
  31. package/dist/_chunks/{pdf-viewer-B6MC6VTx.js → pdf-viewer-CWEXTlwq.js} +2 -2
  32. package/dist/_chunks/{pdf-viewer-B6MC6VTx.js.map → pdf-viewer-CWEXTlwq.js.map} +1 -1
  33. package/dist/_chunks/{practice-results-CrLpEiiW.js → practice-results-DDi-kvaD.js} +2 -2
  34. package/dist/_chunks/{practice-results-CrLpEiiW.js.map → practice-results-DDi-kvaD.js.map} +1 -1
  35. package/dist/_chunks/{pregnancy-weight-gain-zZL5Ir2-.js → pregnancy-weight-gain-BtEHaSqy.js} +78 -56
  36. package/dist/_chunks/pregnancy-weight-gain-BtEHaSqy.js.map +1 -0
  37. package/dist/_chunks/{search-bar-CP6wUJFY.js → search-bar-CvN_S0jW.js} +2 -2
  38. package/dist/_chunks/{search-bar-CP6wUJFY.js.map → search-bar-CvN_S0jW.js.map} +1 -1
  39. package/dist/_chunks/{search-input-C1C3jQpD.js → search-input-D3aMvi4l.js} +2 -2
  40. package/dist/_chunks/{search-input-C1C3jQpD.js.map → search-input-D3aMvi4l.js.map} +1 -1
  41. package/dist/_chunks/{sign-document-B-3k_0LO.js → sign-document-BCyLpFHJ.js} +2 -2
  42. package/dist/_chunks/{sign-document-B-3k_0LO.js.map → sign-document-BCyLpFHJ.js.map} +1 -1
  43. package/dist/_chunks/{sign-in-with-alfadocs-button-DeHBFRNS.js → sign-in-with-alfadocs-button-CuYn_kKP.js} +2 -2
  44. package/dist/_chunks/{sign-in-with-alfadocs-button-DeHBFRNS.js.map → sign-in-with-alfadocs-button-CuYn_kKP.js.map} +1 -1
  45. package/dist/_chunks/{social-sign-in-button-X54ySJr1.js → social-sign-in-button-uJYLM366.js} +2 -2
  46. package/dist/_chunks/{social-sign-in-button-X54ySJr1.js.map → social-sign-in-button-uJYLM366.js.map} +1 -1
  47. package/dist/_chunks/{spinner-CCByyvcb.js → spinner-OjQNn8oN.js} +7 -3
  48. package/dist/_chunks/spinner-OjQNn8oN.js.map +1 -0
  49. package/dist/_chunks/{transcript-panel-CR7VY1uw.js → transcript-panel-B4HiC7ed.js} +2 -2
  50. package/dist/_chunks/{transcript-panel-CR7VY1uw.js.map → transcript-panel-B4HiC7ed.js.map} +1 -1
  51. package/dist/_chunks/{unit-converter-CuXCXJhK.js → unit-converter-u3CwNDpP.js} +96 -74
  52. package/dist/_chunks/unit-converter-u3CwNDpP.js.map +1 -0
  53. package/dist/_chunks/{wallet-pay-button-DK4ESYge.js → wallet-pay-button-DuDPBlCO.js} +2 -2
  54. package/dist/_chunks/{wallet-pay-button-DK4ESYge.js.map → wallet-pay-button-DuDPBlCO.js.map} +1 -1
  55. package/dist/agent-catalog.json +1 -1
  56. package/dist/components/_shared/banded-gauge.d.ts +193 -0
  57. package/dist/components/_shared/banded-gauge.d.ts.map +1 -0
  58. package/dist/components/_shared/index.d.ts +1 -1
  59. package/dist/components/_shared/index.d.ts.map +1 -1
  60. package/dist/components/_shared/insert-result.d.ts +173 -10
  61. package/dist/components/_shared/insert-result.d.ts.map +1 -1
  62. package/dist/components/autocomplete/index.js +1 -1
  63. package/dist/components/bmi-calculator/bmi-calculator.d.ts +6 -0
  64. package/dist/components/bmi-calculator/bmi-calculator.d.ts.map +1 -1
  65. package/dist/components/bmi-calculator/index.js +1 -1
  66. package/dist/components/booking/index.js +1 -1
  67. package/dist/components/calculator-dialog/index.js +1 -1
  68. package/dist/components/cycle-calculator/cycle-calculator.d.ts +6 -0
  69. package/dist/components/cycle-calculator/cycle-calculator.d.ts.map +1 -1
  70. package/dist/components/cycle-calculator/index.js +1 -1
  71. package/dist/components/data-table/index.js +1 -1
  72. package/dist/components/dialog/dialog.d.ts +1 -0
  73. package/dist/components/dialog/dialog.d.ts.map +1 -1
  74. package/dist/components/dialog/index.js +1 -1
  75. package/dist/components/due-date-calculator/due-date-calculator.d.ts +6 -0
  76. package/dist/components/due-date-calculator/due-date-calculator.d.ts.map +1 -1
  77. package/dist/components/due-date-calculator/index.js +1 -1
  78. package/dist/components/freemium-paywall/index.js +1 -1
  79. package/dist/components/gestational-age-calculator/gestational-age-calculator.d.ts +6 -0
  80. package/dist/components/gestational-age-calculator/gestational-age-calculator.d.ts.map +1 -1
  81. package/dist/components/gestational-age-calculator/index.js +1 -1
  82. package/dist/components/index.d.ts +1 -1
  83. package/dist/components/index.d.ts.map +1 -1
  84. package/dist/components/patient-search/index.js +1 -1
  85. package/dist/components/payment-form/index.js +1 -1
  86. package/dist/components/payment-form/payment-form.d.ts +24 -2
  87. package/dist/components/payment-form/payment-form.d.ts.map +1 -1
  88. package/dist/components/pdf-viewer/index.js +1 -1
  89. package/dist/components/practice-results/index.js +1 -1
  90. package/dist/components/pregnancy-weight-gain/index.js +1 -1
  91. package/dist/components/pregnancy-weight-gain/pregnancy-weight-gain.d.ts +6 -0
  92. package/dist/components/pregnancy-weight-gain/pregnancy-weight-gain.d.ts.map +1 -1
  93. package/dist/components/search-bar/index.js +1 -1
  94. package/dist/components/search-input/index.js +1 -1
  95. package/dist/components/sign-document/index.js +1 -1
  96. package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
  97. package/dist/components/social-sign-in-button/index.js +1 -1
  98. package/dist/components/spinner/index.js +1 -1
  99. package/dist/components/spinner/spinner.d.ts +2 -2
  100. package/dist/components/spinner/spinner.d.ts.map +1 -1
  101. package/dist/components/transcript-panel/index.js +1 -1
  102. package/dist/components/unit-converter/index.js +1 -1
  103. package/dist/components/unit-converter/unit-converter.d.ts +6 -0
  104. package/dist/components/unit-converter/unit-converter.d.ts.map +1 -1
  105. package/dist/components/wallet-pay-button/index.js +1 -1
  106. package/dist/i18n/locales/ar.d.ts +1 -1
  107. package/dist/i18n/locales/ar.js +1 -1
  108. package/dist/i18n/locales/ar.js.map +1 -1
  109. package/dist/i18n/locales/de.d.ts +1 -1
  110. package/dist/i18n/locales/de.js +1 -1
  111. package/dist/i18n/locales/de.js.map +1 -1
  112. package/dist/i18n/locales/el.d.ts +1 -1
  113. package/dist/i18n/locales/el.js +1 -1
  114. package/dist/i18n/locales/el.js.map +1 -1
  115. package/dist/i18n/locales/en.d.ts +1 -1
  116. package/dist/i18n/locales/en.js +1 -1
  117. package/dist/i18n/locales/en.js.map +1 -1
  118. package/dist/i18n/locales/es.d.ts +1 -1
  119. package/dist/i18n/locales/es.js +1 -1
  120. package/dist/i18n/locales/es.js.map +1 -1
  121. package/dist/i18n/locales/fr.d.ts +1 -1
  122. package/dist/i18n/locales/fr.js +1 -1
  123. package/dist/i18n/locales/fr.js.map +1 -1
  124. package/dist/i18n/locales/hi.d.ts +1 -1
  125. package/dist/i18n/locales/hi.js +1 -1
  126. package/dist/i18n/locales/hi.js.map +1 -1
  127. package/dist/i18n/locales/it.d.ts +1 -1
  128. package/dist/i18n/locales/it.js +1 -1
  129. package/dist/i18n/locales/it.js.map +1 -1
  130. package/dist/i18n/locales/ja.d.ts +1 -1
  131. package/dist/i18n/locales/ja.js +1 -1
  132. package/dist/i18n/locales/ja.js.map +1 -1
  133. package/dist/i18n/locales/nl.d.ts +1 -1
  134. package/dist/i18n/locales/nl.js +1 -1
  135. package/dist/i18n/locales/nl.js.map +1 -1
  136. package/dist/i18n/locales/pl.d.ts +1 -1
  137. package/dist/i18n/locales/pl.js +1 -1
  138. package/dist/i18n/locales/pl.js.map +1 -1
  139. package/dist/i18n/locales/pt.d.ts +1 -1
  140. package/dist/i18n/locales/pt.js +1 -1
  141. package/dist/i18n/locales/pt.js.map +1 -1
  142. package/dist/i18n/locales/ro.d.ts +1 -1
  143. package/dist/i18n/locales/ro.js +1 -1
  144. package/dist/i18n/locales/ro.js.map +1 -1
  145. package/dist/i18n/locales/ru.d.ts +1 -1
  146. package/dist/i18n/locales/ru.js +1 -1
  147. package/dist/i18n/locales/ru.js.map +1 -1
  148. package/dist/i18n/locales/sq.d.ts +1 -1
  149. package/dist/i18n/locales/sq.js +1 -1
  150. package/dist/i18n/locales/sq.js.map +1 -1
  151. package/dist/i18n/locales/sv.d.ts +1 -1
  152. package/dist/i18n/locales/sv.js +1 -1
  153. package/dist/i18n/locales/sv.js.map +1 -1
  154. package/dist/i18n/locales/tr.d.ts +1 -1
  155. package/dist/i18n/locales/tr.js +1 -1
  156. package/dist/i18n/locales/tr.js.map +1 -1
  157. package/dist/i18n/locales/zh.d.ts +1 -1
  158. package/dist/i18n/locales/zh.js +1 -1
  159. package/dist/i18n/locales/zh.js.map +1 -1
  160. package/dist/index.js +497 -496
  161. package/dist/locales/ar.json +1 -1
  162. package/dist/locales/de.json +1 -1
  163. package/dist/locales/el.json +1 -1
  164. package/dist/locales/en.json +1 -1
  165. package/dist/locales/es.json +1 -1
  166. package/dist/locales/fr.json +1 -1
  167. package/dist/locales/hi.json +1 -1
  168. package/dist/locales/it.json +1 -1
  169. package/dist/locales/ja.json +1 -1
  170. package/dist/locales/nl.json +1 -1
  171. package/dist/locales/pl.json +1 -1
  172. package/dist/locales/pt.json +1 -1
  173. package/dist/locales/ro.json +1 -1
  174. package/dist/locales/ru.json +1 -1
  175. package/dist/locales/sq.json +1 -1
  176. package/dist/locales/sv.json +1 -1
  177. package/dist/locales/tr.json +1 -1
  178. package/dist/locales/zh.json +1 -1
  179. package/dist/patterns/alia-assistant/alia-chat-surface.d.ts.map +1 -1
  180. package/dist/patterns/alia-assistant/alia-types.d.ts +20 -0
  181. package/dist/patterns/alia-assistant/alia-types.d.ts.map +1 -1
  182. package/dist/patterns/alia-assistant/index.js +1 -1
  183. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  184. package/dist/tokens.css +1 -1
  185. package/package.json +1 -1
  186. package/dist/_chunks/alia-sidebar-BpX4z_af.js.map +0 -1
  187. package/dist/_chunks/bmi-calculator-DuVSFDuw.js +0 -259
  188. package/dist/_chunks/bmi-calculator-DuVSFDuw.js.map +0 -1
  189. package/dist/_chunks/cycle-calculator-Dln-y1k_.js.map +0 -1
  190. package/dist/_chunks/dialog-DOYgd75U.js +0 -224
  191. package/dist/_chunks/dialog-DOYgd75U.js.map +0 -1
  192. package/dist/_chunks/due-date-calculator-Cc4dRqTI.js.map +0 -1
  193. package/dist/_chunks/gestational-age-calculator-ZMSrzkRW.js +0 -179
  194. package/dist/_chunks/gestational-age-calculator-ZMSrzkRW.js.map +0 -1
  195. package/dist/_chunks/insert-result-DisOY2G-.js +0 -243
  196. package/dist/_chunks/insert-result-DisOY2G-.js.map +0 -1
  197. package/dist/_chunks/payment-form-BzVsG6Ks.js.map +0 -1
  198. package/dist/_chunks/pregnancy-weight-gain-zZL5Ir2-.js.map +0 -1
  199. package/dist/_chunks/spinner-CCByyvcb.js.map +0 -1
  200. package/dist/_chunks/unit-converter-CuXCXJhK.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import { jsxs as a, jsx as l } from "react/jsx-runtime";
2
2
  import { forwardRef as p } from "react";
3
- import { D as r } from "./dialog-DOYgd75U.js";
3
+ import { D as r } from "./dialog-BTpZV6It.js";
4
4
  const u = p(
5
5
  ({
6
6
  trigger: i,
@@ -37,4 +37,4 @@ u.displayName = "CalculatorDialog";
37
37
  export {
38
38
  u as C
39
39
  };
40
- //# sourceMappingURL=calculator-dialog-DdexHrTP.js.map
40
+ //# sourceMappingURL=calculator-dialog-D-nfvteH.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"calculator-dialog-DdexHrTP.js","sources":["../../src/components/calculator-dialog/calculator-dialog.tsx"],"sourcesContent":["/* ------------------------------------------------------------------ */\n/* CalculatorDialog — shared modal wrapper for the calculator toolset. */\n/* */\n/* Rather than baking Dialog wiring into every calculator, this single */\n/* wrapper composes the kit `Dialog` and hosts ANY calculator (or any */\n/* content) as children. Every calculator therefore gains a modal */\n/* presentation for free: */\n/* */\n/* <CalculatorDialog */\n/* trigger={<Button>Open BMI calculator</Button>} */\n/* title=\"BMI calculator\"> */\n/* <BmiCalculator /> */\n/* </CalculatorDialog> */\n/* ------------------------------------------------------------------ */\n\nimport { forwardRef, type ReactNode } from 'react';\nimport { Dialog, type DialogContentProps } from '../dialog';\n\nexport interface CalculatorDialogProps {\n /** The element that opens the modal (rendered via `Dialog.Trigger asChild`). */\n trigger: ReactNode;\n /** Modal heading — also names the dialog for assistive tech. */\n title: string;\n /** Optional supporting line under the title. */\n description?: string;\n /** The calculator (or any content) shown inside the modal. */\n children: ReactNode;\n /** Dialog size. Calculators default to `lg` to fit inputs + result. */\n size?: DialogContentProps['size'];\n /** Controlled open state. */\n open?: boolean;\n /** Uncontrolled initial open state. */\n defaultOpen?: boolean;\n /** Open-state change handler. */\n onOpenChange?: (open: boolean) => void;\n /** Opaque instance id, forwarded to the dialog content. */\n id?: string;\n /** Extra class names on the modal body wrapper. */\n className?: string;\n}\n\nexport const CalculatorDialog = forwardRef<\n HTMLDivElement,\n CalculatorDialogProps\n>(\n (\n {\n trigger,\n title,\n description,\n children,\n size = 'lg',\n open,\n defaultOpen,\n onOpenChange,\n id,\n className,\n },\n ref,\n ) => {\n return (\n <Dialog\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n id={id}\n >\n <Dialog.Trigger asChild>{trigger}</Dialog.Trigger>\n <Dialog.Content ref={ref} size={size}>\n <Dialog.Header>\n <Dialog.Title>{title}</Dialog.Title>\n {description ? (\n <Dialog.Description>{description}</Dialog.Description>\n ) : null}\n </Dialog.Header>\n <div data-component=\"calculator-dialog\" className={className}>\n {children}\n </div>\n </Dialog.Content>\n </Dialog>\n );\n },\n);\n\nCalculatorDialog.displayName = 'CalculatorDialog';\n"],"names":["CalculatorDialog","forwardRef","trigger","title","description","children","size","open","defaultOpen","onOpenChange","id","className","ref","jsxs","Dialog","jsx"],"mappings":";;;AAyCO,MAAMA,IAAmBC;AAAA,EAI9B,CACE;AAAA,IACE,SAAAC;AAAA,IACA,OAAAC;AAAA,IACA,aAAAC;AAAA,IACA,UAAAC;AAAA,IACA,MAAAC,IAAO;AAAA,IACP,MAAAC;AAAA,IACA,aAAAC;AAAA,IACA,cAAAC;AAAA,IACA,IAAAC;AAAA,IACA,WAAAC;AAAA,EAAA,GAEFC,MAGE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,MAAAP;AAAA,MACA,aAAAC;AAAA,MACA,cAAAC;AAAA,MACA,IAAAC;AAAA,MAEA,UAAA;AAAA,QAAA,gBAAAK,EAACD,EAAO,SAAP,EAAe,SAAO,IAAE,UAAAZ,GAAQ;AAAA,QACjC,gBAAAW,EAACC,EAAO,SAAP,EAAe,KAAAF,GAAU,MAAAN,GACxB,UAAA;AAAA,UAAA,gBAAAO,EAACC,EAAO,QAAP,EACC,UAAA;AAAA,YAAA,gBAAAC,EAACD,EAAO,OAAP,EAAc,UAAAX,EAAA,CAAM;AAAA,YACpBC,IACC,gBAAAW,EAACD,EAAO,aAAP,EAAoB,aAAY,IAC/B;AAAA,UAAA,GACN;AAAA,UACA,gBAAAC,EAAC,OAAA,EAAI,kBAAe,qBAAoB,WAAAJ,GACrC,UAAAN,EAAA,CACH;AAAA,QAAA,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;AAEAL,EAAiB,cAAc;"}
1
+ {"version":3,"file":"calculator-dialog-D-nfvteH.js","sources":["../../src/components/calculator-dialog/calculator-dialog.tsx"],"sourcesContent":["/* ------------------------------------------------------------------ */\n/* CalculatorDialog — shared modal wrapper for the calculator toolset. */\n/* */\n/* Rather than baking Dialog wiring into every calculator, this single */\n/* wrapper composes the kit `Dialog` and hosts ANY calculator (or any */\n/* content) as children. Every calculator therefore gains a modal */\n/* presentation for free: */\n/* */\n/* <CalculatorDialog */\n/* trigger={<Button>Open BMI calculator</Button>} */\n/* title=\"BMI calculator\"> */\n/* <BmiCalculator /> */\n/* </CalculatorDialog> */\n/* ------------------------------------------------------------------ */\n\nimport { forwardRef, type ReactNode } from 'react';\nimport { Dialog, type DialogContentProps } from '../dialog';\n\nexport interface CalculatorDialogProps {\n /** The element that opens the modal (rendered via `Dialog.Trigger asChild`). */\n trigger: ReactNode;\n /** Modal heading — also names the dialog for assistive tech. */\n title: string;\n /** Optional supporting line under the title. */\n description?: string;\n /** The calculator (or any content) shown inside the modal. */\n children: ReactNode;\n /** Dialog size. Calculators default to `lg` to fit inputs + result. */\n size?: DialogContentProps['size'];\n /** Controlled open state. */\n open?: boolean;\n /** Uncontrolled initial open state. */\n defaultOpen?: boolean;\n /** Open-state change handler. */\n onOpenChange?: (open: boolean) => void;\n /** Opaque instance id, forwarded to the dialog content. */\n id?: string;\n /** Extra class names on the modal body wrapper. */\n className?: string;\n}\n\nexport const CalculatorDialog = forwardRef<\n HTMLDivElement,\n CalculatorDialogProps\n>(\n (\n {\n trigger,\n title,\n description,\n children,\n size = 'lg',\n open,\n defaultOpen,\n onOpenChange,\n id,\n className,\n },\n ref,\n ) => {\n return (\n <Dialog\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n id={id}\n >\n <Dialog.Trigger asChild>{trigger}</Dialog.Trigger>\n <Dialog.Content ref={ref} size={size}>\n <Dialog.Header>\n <Dialog.Title>{title}</Dialog.Title>\n {description ? (\n <Dialog.Description>{description}</Dialog.Description>\n ) : null}\n </Dialog.Header>\n <div data-component=\"calculator-dialog\" className={className}>\n {children}\n </div>\n </Dialog.Content>\n </Dialog>\n );\n },\n);\n\nCalculatorDialog.displayName = 'CalculatorDialog';\n"],"names":["CalculatorDialog","forwardRef","trigger","title","description","children","size","open","defaultOpen","onOpenChange","id","className","ref","jsxs","Dialog","jsx"],"mappings":";;;AAyCO,MAAMA,IAAmBC;AAAA,EAI9B,CACE;AAAA,IACE,SAAAC;AAAA,IACA,OAAAC;AAAA,IACA,aAAAC;AAAA,IACA,UAAAC;AAAA,IACA,MAAAC,IAAO;AAAA,IACP,MAAAC;AAAA,IACA,aAAAC;AAAA,IACA,cAAAC;AAAA,IACA,IAAAC;AAAA,IACA,WAAAC;AAAA,EAAA,GAEFC,MAGE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,MAAAP;AAAA,MACA,aAAAC;AAAA,MACA,cAAAC;AAAA,MACA,IAAAC;AAAA,MAEA,UAAA;AAAA,QAAA,gBAAAK,EAACD,EAAO,SAAP,EAAe,SAAO,IAAE,UAAAZ,GAAQ;AAAA,QACjC,gBAAAW,EAACC,EAAO,SAAP,EAAe,KAAAF,GAAU,MAAAN,GACxB,UAAA;AAAA,UAAA,gBAAAO,EAACC,EAAO,QAAP,EACC,UAAA;AAAA,YAAA,gBAAAC,EAACD,EAAO,OAAP,EAAc,UAAAX,EAAA,CAAM;AAAA,YACpBC,IACC,gBAAAW,EAACD,EAAO,aAAP,EAAoB,aAAY,IAC/B;AAAA,UAAA,GACN;AAAA,UACA,gBAAAC,EAAC,OAAA,EAAI,kBAAe,qBAAoB,WAAAJ,GACrC,UAAAN,EAAA,CACH;AAAA,QAAA,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;AAEAL,EAAiB,cAAc;"}
@@ -1,17 +1,17 @@
1
1
  import { jsxs as r, jsx as e } from "react/jsx-runtime";
2
- import { forwardRef as A, useState as L, useMemo as v, useEffect as S } from "react";
3
- import { c as T } from "./index-D2ZczOXr.js";
4
- import { useTranslation as W } from "react-i18next";
5
- import { F as P } from "./form-field-BOm9hK35.js";
6
- import { D as $ } from "./date-picker-Bq7xhMA-.js";
7
- import { N as H } from "./number-input-Dj5L3pXK.js";
8
- import { C as w } from "./card-DPmk26CL.js";
9
- import { B as x } from "./badge-zsf5i5bH.js";
10
- import { I } from "./insert-result-DisOY2G-.js";
11
- import { a as i } from "./date-picker-variants-DLi1Va_e.js";
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-C5ABnzDl.js";
11
+ import { a as s } from "./date-picker-variants-DLi1Va_e.js";
12
12
  import { C as z } from "./check-DPdL_Sm7.js";
13
13
  import { H as B } from "./heart-C0faivFf.js";
14
- import { c as k } from "./createLucideIcon-CrFbzy84.js";
14
+ import { c as G } from "./createLucideIcon-CrFbzy84.js";
15
15
  /**
16
16
  * @license lucide-react v1.8.0 - ISC
17
17
  *
@@ -26,77 +26,78 @@ const Y = [
26
26
  key: "c7niix"
27
27
  }
28
28
  ]
29
- ], j = k("droplet", Y), h = 28, M = 14, U = 1;
30
- function G(n, c = 3) {
31
- const d = n.cycleLength ?? h, { lastPeriodStart: s } = n, o = i(s, d - M), u = {
32
- start: i(o, -5),
33
- end: i(o, U)
34
- }, f = i(s, d), p = Array.from(
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
35
  { length: c },
36
- (C, g) => i(s, d * (g + 1))
36
+ (C, g) => s(o, d * (g + 1))
37
37
  );
38
- return { nextPeriod: f, ovulation: o, fertileWindow: u, upcomingPeriods: p };
38
+ return { nextPeriod: f, ovulation: i, fertileWindow: u, upcomingPeriods: p };
39
39
  }
40
- const V = T("ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]", {
40
+ const O = $("ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]", {
41
41
  variants: {
42
42
  width: { full: "ds:w-full", auto: "ds:inline-flex" }
43
43
  },
44
44
  defaultVariants: { width: "full" }
45
- }), q = A(
45
+ }), V = "--accent", q = F(
46
46
  ({
47
- defaultCycleLength: n = h,
47
+ defaultCycleLength: n = x,
48
48
  onResultChange: c,
49
49
  onInsert: d,
50
- insertVariant: s = "insert",
51
- onCopy: o,
50
+ insertVariant: o = "insert",
51
+ onCopy: i,
52
52
  onError: u,
53
- id: f,
54
- width: p,
55
- className: C
56
- }, g) => {
57
- const { t: a, i18n: N } = W(), [m, b] = L(void 0), [y, D] = L(
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(
58
59
  n
59
- ), t = v(() => m ? G({
60
+ ), t = y(() => m ? K({
60
61
  lastPeriodStart: m,
61
- cycleLength: y ?? h
62
- }) : null, [m, y]), E = v(
62
+ cycleLength: h ?? x
63
+ }) : null, [m, h]), T = y(
63
64
  () => new Intl.DateTimeFormat(N.language, { dateStyle: "medium" }),
64
65
  [N.language]
65
66
  );
66
- S(() => {
67
+ H(() => {
67
68
  c == null || c(t);
68
69
  }, [t, c]);
69
- const _ = v(() => /* @__PURE__ */ new Date(), []), l = (F) => E.format(F);
70
+ const _ = y(() => /* @__PURE__ */ new Date(), []), l = (W) => T.format(W);
70
71
  return /* @__PURE__ */ r(
71
72
  "div",
72
73
  {
73
- ref: g,
74
+ ref: b,
74
75
  "data-component": "cycle-calculator",
75
- "data-component-id": f,
76
- className: V({ width: p, className: C }),
76
+ "data-component-id": p,
77
+ className: O({ width: C, className: g }),
77
78
  children: [
78
79
  /* @__PURE__ */ r("div", { className: "ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-2", children: [
79
- /* @__PURE__ */ e(P, { label: a("cycleCalculator.lastPeriod"), children: /* @__PURE__ */ e(
80
- $,
80
+ /* @__PURE__ */ e(w, { label: a("cycleCalculator.lastPeriod"), children: /* @__PURE__ */ e(
81
+ I,
81
82
  {
82
83
  value: m,
83
- onChange: b,
84
+ onChange: D,
84
85
  maxDate: _
85
86
  }
86
87
  ) }),
87
88
  /* @__PURE__ */ e(
88
- P,
89
+ w,
89
90
  {
90
91
  label: a("cycleCalculator.cycleLength"),
91
92
  description: a("cycleCalculator.cycleLengthHint"),
92
93
  children: /* @__PURE__ */ e(
93
- H,
94
+ S,
94
95
  {
95
96
  mode: "integer",
96
97
  min: 20,
97
98
  max: 45,
98
- value: y,
99
- onChange: D
99
+ value: h,
100
+ onChange: E
100
101
  }
101
102
  )
102
103
  }
@@ -105,12 +106,12 @@ const V = T("ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]", {
105
106
  /* @__PURE__ */ e("p", { className: "ds:sr-only", role: "status", "aria-live": "polite", children: t ? `${a("cycleCalculator.ovulation")}: ${l(t.ovulation)}. ${a(
106
107
  "cycleCalculator.nextPeriod"
107
108
  )}: ${l(t.nextPeriod)}.` : "" }),
108
- t ? /* @__PURE__ */ e(w, { variant: "elevated", children: /* @__PURE__ */ r(w.Body, { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-md)]", children: [
109
+ t ? /* @__PURE__ */ e(P, { variant: "elevated", children: /* @__PURE__ */ r(P.Body, { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-md)]", children: [
109
110
  /* @__PURE__ */ r("dl", { className: "ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-3", children: [
110
111
  /* @__PURE__ */ r("div", { className: "ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-xs)] ds:text-center", children: [
111
112
  /* @__PURE__ */ e("dt", { className: "type-label ds:text-muted-foreground", children: a("cycleCalculator.ovulation") }),
112
113
  /* @__PURE__ */ e("dd", { children: /* @__PURE__ */ e(
113
- x,
114
+ v,
114
115
  {
115
116
  variant: "success",
116
117
  size: "lg",
@@ -122,7 +123,7 @@ const V = T("ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]", {
122
123
  /* @__PURE__ */ r("div", { className: "ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-xs)] ds:text-center", children: [
123
124
  /* @__PURE__ */ e("dt", { className: "type-label ds:text-muted-foreground", children: a("cycleCalculator.fertileWindow") }),
124
125
  /* @__PURE__ */ e("dd", { children: /* @__PURE__ */ r(
125
- x,
126
+ v,
126
127
  {
127
128
  variant: "accent",
128
129
  size: "lg",
@@ -139,7 +140,7 @@ const V = T("ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]", {
139
140
  /* @__PURE__ */ r("div", { className: "ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-xs)] ds:text-center", children: [
140
141
  /* @__PURE__ */ e("dt", { className: "type-label ds:text-muted-foreground", children: a("cycleCalculator.nextPeriod") }),
141
142
  /* @__PURE__ */ e("dd", { children: /* @__PURE__ */ e(
142
- x,
143
+ v,
143
144
  {
144
145
  variant: "error",
145
146
  size: "lg",
@@ -149,27 +150,45 @@ const V = T("ds:flex ds:flex-col ds:gap-[var(--spacing-lg)]", {
149
150
  ) })
150
151
  ] })
151
152
  ] }),
152
- s === "copy" || d ? /* @__PURE__ */ e(
153
- I,
153
+ o === "copy" || d ? /* @__PURE__ */ e(
154
+ k,
154
155
  {
155
156
  onInsert: d,
156
- variant: s,
157
- onCopy: o,
157
+ variant: o,
158
+ onCopy: i,
158
159
  onError: u,
159
160
  card: {
160
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,
161
170
  fields: [
162
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",
163
176
  label: a("cycleCalculator.ovulation"),
164
177
  value: l(t.ovulation)
165
178
  },
166
179
  {
180
+ // Fertile window → heart glyph, matching the on-screen
181
+ // fertile-window badge's Heart icon.
182
+ icon: "heart",
167
183
  label: a("cycleCalculator.fertileWindow"),
168
184
  value: `${l(t.fertileWindow.start)} – ${l(
169
185
  t.fertileWindow.end
170
186
  )}`
171
187
  },
172
188
  {
189
+ // Next period → droplets glyph, matching the on-screen
190
+ // next-period badge's Droplet icon.
191
+ icon: "droplets",
173
192
  label: a("cycleCalculator.nextPeriod"),
174
193
  value: l(t.nextPeriod)
175
194
  }
@@ -187,6 +206,6 @@ q.displayName = "CycleCalculator";
187
206
  export {
188
207
  q as C,
189
208
  M as L,
190
- G as p
209
+ K as p
191
210
  };
192
- //# sourceMappingURL=cycle-calculator-Dln-y1k_.js.map
211
+ //# sourceMappingURL=cycle-calculator-KxA8dqDf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cycle-calculator-KxA8dqDf.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]}
@@ -0,0 +1,223 @@
1
+ import { jsx as t, jsxs as u } from "react/jsx-runtime";
2
+ import { useRef as j, useEffect as O, useMemo as T, forwardRef as i, useContext as x, createContext as B } from "react";
3
+ import * as s from "@radix-ui/react-dialog";
4
+ import { c as k } from "./index-D2ZczOXr.js";
5
+ import { useTranslation as S } from "react-i18next";
6
+ import { u as w } from "./use-controllable-state-BiY4xTzM.js";
7
+ import { u as A } from "./registry-nPAVE19X.js";
8
+ import { X as E } from "./x-CCcI3eJp.js";
9
+ const H = {
10
+ id: "dialog",
11
+ capabilities: ["open", "close", "dismiss"],
12
+ state: {
13
+ isOpen: {
14
+ type: "boolean",
15
+ description: "True when the dialog is currently open.",
16
+ read: (e) => e.getIsOpen()
17
+ }
18
+ },
19
+ actions: {
20
+ open: {
21
+ safety: "read",
22
+ description: "Open the dialog.",
23
+ invoke: (e) => {
24
+ e.open();
25
+ }
26
+ },
27
+ close: {
28
+ safety: "write",
29
+ description: "Close the dialog. Reversible by reopening.",
30
+ invoke: (e) => {
31
+ e.close();
32
+ }
33
+ },
34
+ dismiss: {
35
+ safety: "destructive",
36
+ description: "Dismiss the dialog. Loses any in-progress input that has not been committed.",
37
+ invoke: (e) => {
38
+ e.close();
39
+ }
40
+ }
41
+ },
42
+ domHooks: {
43
+ root: { attr: "data-component", value: "dialog" },
44
+ instanceId: {
45
+ attr: "data-component-id",
46
+ sourceProp: "id",
47
+ description: "Sourced from the id prop on Dialog.Root."
48
+ }
49
+ }
50
+ }, I = [
51
+ "ds-dialog__backdrop",
52
+ "ds:backdrop-blur-sm",
53
+ "ds:data-[state=open]:animate-in ds:data-[state=open]:fade-in-0",
54
+ "ds:data-[state=closed]:animate-out ds:data-[state=closed]:fade-out-0",
55
+ "ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none"
56
+ ].join(" "), z = [
57
+ "ds:focus-visible:outline-none",
58
+ "ds:data-[state=open]:animate-in ds:data-[state=open]:fade-in-0 ds:data-[state=open]:zoom-in-95",
59
+ "ds:data-[state=closed]:animate-out ds:data-[state=closed]:fade-out-0 ds:data-[state=closed]:zoom-out-95",
60
+ "ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none"
61
+ ].join(" "), F = k(`ds-dialog ds-dialog__surface ${z}`, {
62
+ variants: {
63
+ size: {
64
+ sm: "ds-dialog__surface--sm",
65
+ md: "",
66
+ lg: "ds-dialog__surface--lg",
67
+ fullscreen: "ds-dialog__surface--fullscreen"
68
+ }
69
+ },
70
+ defaultVariants: { size: "md" }
71
+ }), f = B(void 0), g = ({
72
+ children: e,
73
+ id: o,
74
+ open: a,
75
+ defaultOpen: r,
76
+ onOpenChange: c,
77
+ ...m
78
+ }) => {
79
+ const [p, n] = w({
80
+ value: a,
81
+ defaultValue: r ?? !1,
82
+ onChange: c
83
+ }), d = p ?? !1, l = j(d);
84
+ O(() => {
85
+ l.current = d;
86
+ }, [d]);
87
+ const R = T(
88
+ () => ({
89
+ getIsOpen: () => l.current,
90
+ open: () => n(!0),
91
+ close: () => n(!1)
92
+ }),
93
+ [n]
94
+ );
95
+ return A(H, R, o), /* @__PURE__ */ t(f.Provider, { value: o, children: /* @__PURE__ */ t(s.Root, { open: d, onOpenChange: n, ...m, children: e }) });
96
+ };
97
+ g.displayName = "Dialog.Root";
98
+ const D = i(({ children: e, ...o }, a) => /* @__PURE__ */ t(s.Trigger, { ref: a, ...o, children: e }));
99
+ D.displayName = "Dialog.Trigger";
100
+ const y = i(({ children: e, ...o }, a) => /* @__PURE__ */ t(s.Close, { ref: a, ...o, children: e }));
101
+ y.displayName = "Dialog.Close";
102
+ const v = i(
103
+ ({
104
+ size: e = "md",
105
+ variant: o = "default",
106
+ hideCloseButton: a = !0,
107
+ className: r,
108
+ children: c,
109
+ ...m
110
+ }, p) => {
111
+ const { t: n } = S(), d = x(f), l = o === "alert" ? { role: "alertdialog" } : {};
112
+ return /* @__PURE__ */ u(s.Portal, { children: [
113
+ /* @__PURE__ */ t(
114
+ s.Overlay,
115
+ {
116
+ "data-component": "dialog-overlay",
117
+ className: I
118
+ }
119
+ ),
120
+ /* @__PURE__ */ u(
121
+ s.Content,
122
+ {
123
+ ref: p,
124
+ ...l,
125
+ "data-component": "dialog",
126
+ "data-component-id": d,
127
+ className: F({ size: e, className: r }),
128
+ ...m,
129
+ children: [
130
+ c,
131
+ !a && // The close is a plain button carrying the `ds-dialog__close`
132
+ // contract class — the SAME class a vanilla host renders. The CSS
133
+ // (src/styles.css) owns its position, sizing, glyph size, hover
134
+ // wash, and focus ring from tokens, so the React and non-React
135
+ // close buttons are identical and can't drift.
136
+ /* @__PURE__ */ t(
137
+ s.Close,
138
+ {
139
+ type: "button",
140
+ className: "ds-dialog__close",
141
+ "aria-label": n("common.close", "Close"),
142
+ children: /* @__PURE__ */ t(E, { "aria-hidden": "true" })
143
+ }
144
+ )
145
+ ]
146
+ }
147
+ )
148
+ ] });
149
+ }
150
+ );
151
+ v.displayName = "Dialog.Content";
152
+ const C = i(
153
+ ({ className: e, ...o }, a) => /* @__PURE__ */ t(
154
+ "div",
155
+ {
156
+ ref: a,
157
+ className: ["ds-dialog__header", e].filter(Boolean).join(" "),
158
+ ...o
159
+ }
160
+ )
161
+ );
162
+ C.displayName = "Dialog.Header";
163
+ const _ = i(
164
+ ({ className: e, ...o }, a) => /* @__PURE__ */ t(
165
+ "div",
166
+ {
167
+ ref: a,
168
+ className: ["ds-dialog__body", e].filter(Boolean).join(" "),
169
+ ...o
170
+ }
171
+ )
172
+ );
173
+ _.displayName = "Dialog.Body";
174
+ const b = i(({ className: e, ...o }, a) => /* @__PURE__ */ t(
175
+ s.Title,
176
+ {
177
+ ref: a,
178
+ className: ["ds-dialog__title type-title-card ds:break-words", e].filter(Boolean).join(" "),
179
+ ...o
180
+ }
181
+ ));
182
+ b.displayName = "Dialog.Title";
183
+ const h = i(({ className: e, ...o }, a) => /* @__PURE__ */ t(
184
+ s.Description,
185
+ {
186
+ ref: a,
187
+ className: ["type-body-sm ds:text-[var(--muted-foreground)]", e].filter(Boolean).join(" "),
188
+ ...o
189
+ }
190
+ ));
191
+ h.displayName = "Dialog.Description";
192
+ const N = i(
193
+ ({ className: e, divider: o = !1, ...a }, r) => /* @__PURE__ */ t(
194
+ "div",
195
+ {
196
+ ref: r,
197
+ className: [
198
+ "ds:flex ds:items-center ds:justify-end ds:gap-[var(--spacing-sm)]",
199
+ "ds:mt-[var(--spacing-md)]",
200
+ o && "ds:border-t ds:border-[color:var(--border)] ds:pt-[var(--spacing-md)]",
201
+ e
202
+ ].filter(Boolean).join(" "),
203
+ ...a
204
+ }
205
+ )
206
+ );
207
+ N.displayName = "Dialog.Footer";
208
+ const $ = Object.assign(g, {
209
+ Root: g,
210
+ Trigger: D,
211
+ Content: v,
212
+ Header: C,
213
+ Title: b,
214
+ Description: h,
215
+ Body: _,
216
+ Footer: N,
217
+ Close: y
218
+ });
219
+ export {
220
+ $ as D,
221
+ H as d
222
+ };
223
+ //# sourceMappingURL=dialog-BTpZV6It.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialog-BTpZV6It.js","sources":["../../src/components/dialog/dialog.agent.ts","../../src/components/dialog/dialog.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { DialogHandle } from './dialog';\n\n/**\n * Dialog wraps Radix Dialog. The curated handle (`DialogHandle`) bridges the\n * Radix controlled-or-uncontrolled `open` state so an agent can observe and\n * drive the dialog without owning the React state itself.\n */\nexport const dialogAgent: AgentAdapter<DialogHandle> = {\n id: 'dialog',\n capabilities: ['open', 'close', 'dismiss'],\n state: {\n isOpen: {\n type: 'boolean',\n description: 'True when the dialog is currently open.',\n read: (handle) => handle.getIsOpen(),\n },\n },\n actions: {\n open: {\n safety: 'read',\n description: 'Open the dialog.',\n invoke: (handle) => {\n handle.open();\n },\n },\n close: {\n safety: 'write',\n description: 'Close the dialog. Reversible by reopening.',\n invoke: (handle) => {\n handle.close();\n },\n },\n dismiss: {\n safety: 'destructive',\n description:\n 'Dismiss the dialog. Loses any in-progress input that has not been committed.',\n invoke: (handle) => {\n handle.close();\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'dialog' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop on Dialog.Root.',\n },\n },\n};\n","import {\n createContext,\n forwardRef,\n useContext,\n useEffect,\n useMemo,\n useRef,\n type ComponentPropsWithoutRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport * as RadixDialog from '@radix-ui/react-dialog';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { X } from 'lucide-react';\nimport { useControllableState } from '../../hooks/use-controllable-state';\nimport { useAgentRegistration } from '../../agent';\nimport { dialogAgent } from './dialog.agent';\n\n// The `ds-dialog__*` class names below are the framework-agnostic contract\n// defined in src/styles.css (@layer ui-kit-components). The React component\n// renders the SAME classes a vanilla (non-React) host hand-authors — the\n// surface (`ds-dialog__surface` + its size modifiers), the close button\n// (`ds-dialog__close`), and the body slot (`ds-dialog__body`) — so there is\n// ONE visual skin (scrim, radius, elevation, bg, padding, centering, sizing,\n// close-button glyph + hover/focus) and the two surfaces can't drift. The few\n// Tailwind utilities that remain are NOT skin: they are the Radix animation\n// hooks (`data-[state=…]:animate-*`) and the surface focus-suppression chrome\n// — neither lives in the vanilla CSS contract. Layer order\n// (`…, utilities, ui-kit-tokens, ui-kit-components`) puts the `ds-dialog__*`\n// rules after Tailwind's utilities, so the contract owns every visual\n// property and the animation utilities only touch `animation` / `outline`.\nconst OVERLAY_CLASSES = [\n 'ds-dialog__backdrop',\n 'ds:backdrop-blur-sm',\n 'ds:data-[state=open]:animate-in ds:data-[state=open]:fade-in-0',\n 'ds:data-[state=closed]:animate-out ds:data-[state=closed]:fade-out-0',\n 'ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n].join(' ');\n\n// Animation + focus chrome only — every visual property (position, centering,\n// bg, radius, elevation, padding, sizing) comes from `.ds-dialog__surface`.\nconst SURFACE_CHROME = [\n 'ds:focus-visible:outline-none',\n 'ds:data-[state=open]:animate-in ds:data-[state=open]:fade-in-0 ds:data-[state=open]:zoom-in-95',\n 'ds:data-[state=closed]:animate-out ds:data-[state=closed]:fade-out-0 ds:data-[state=closed]:zoom-out-95',\n 'ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n].join(' ');\n\n// CVA drives only the contract class names per size. `ds-dialog` is the host\n// marker (cascade-reset boundary); `ds-dialog__surface` carries the panel skin;\n// the `--sm` / `--lg` / `--fullscreen` modifiers shift only `max-inline-size`\n// (or the fullscreen geometry) and are defined alongside the base rule in\n// src/styles.css — so size, like the skin, lives in one place.\nconst contentVariants = cva(`ds-dialog ds-dialog__surface ${SURFACE_CHROME}`, {\n variants: {\n size: {\n sm: 'ds-dialog__surface--sm',\n md: '',\n lg: 'ds-dialog__surface--lg',\n fullscreen: 'ds-dialog__surface--fullscreen',\n },\n },\n defaultVariants: { size: 'md' },\n});\n\n// Curated agent-readiness handle — see dialog.agent.ts.\nexport interface DialogHandle {\n getIsOpen: () => boolean;\n open: () => void;\n close: () => void;\n}\n\nexport interface DialogRootProps extends ComponentPropsWithoutRef<\n typeof RadixDialog.Root\n> {\n /** Opaque instance id — forwarded to Dialog.Content as `data-component-id`. */\n id?: string;\n}\n\nconst DialogIdContext = createContext<string | undefined>(undefined);\n\nconst DialogRoot = ({\n children,\n id,\n open: openProp,\n defaultOpen,\n onOpenChange,\n ...props\n}: DialogRootProps) => {\n const [openRaw, setOpen] = useControllableState<boolean>({\n value: openProp,\n defaultValue: defaultOpen ?? false,\n onChange: onOpenChange,\n });\n const open = openRaw ?? false;\n\n const openRef = useRef(open);\n useEffect(() => {\n openRef.current = open;\n }, [open]);\n\n const handle = useMemo<DialogHandle>(\n () => ({\n getIsOpen: () => openRef.current,\n open: () => setOpen(true),\n close: () => setOpen(false),\n }),\n [setOpen],\n );\n useAgentRegistration(dialogAgent, handle, id);\n\n return (\n <DialogIdContext.Provider value={id}>\n <RadixDialog.Root open={open} onOpenChange={setOpen} {...props}>\n {children}\n </RadixDialog.Root>\n </DialogIdContext.Provider>\n );\n};\nDialogRoot.displayName = 'Dialog.Root';\n\nconst DialogTrigger = forwardRef<\n HTMLButtonElement,\n ComponentPropsWithoutRef<typeof RadixDialog.Trigger>\n>(({ children, ...props }, ref) => (\n <RadixDialog.Trigger ref={ref} {...props}>\n {children}\n </RadixDialog.Trigger>\n));\nDialogTrigger.displayName = 'Dialog.Trigger';\n\nconst DialogClose = forwardRef<\n HTMLButtonElement,\n ComponentPropsWithoutRef<typeof RadixDialog.Close>\n>(({ children, ...props }, ref) => (\n <RadixDialog.Close ref={ref} {...props}>\n {children}\n </RadixDialog.Close>\n));\nDialogClose.displayName = 'Dialog.Close';\n\nexport interface DialogContentProps\n extends\n Omit<ComponentPropsWithoutRef<typeof RadixDialog.Content>, 'role'>,\n VariantProps<typeof contentVariants> {\n size?: 'sm' | 'md' | 'lg' | 'fullscreen';\n variant?: 'default' | 'alert' | 'confirmation';\n hideCloseButton?: boolean;\n className?: string;\n children: ReactNode;\n}\n\nconst DialogContent = forwardRef<HTMLDivElement, DialogContentProps>(\n (\n {\n size = 'md',\n variant = 'default',\n hideCloseButton = true,\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const instanceId = useContext(DialogIdContext);\n // Only forward `role` when we actually need to override Radix's default\n // (`role=\"dialog\"`). Passing `role={undefined}` explicitly wins over\n // Radix's internal assignment and strips the attribute entirely.\n const roleOverride =\n variant === 'alert' ? { role: 'alertdialog' as const } : {};\n\n return (\n <RadixDialog.Portal>\n <RadixDialog.Overlay\n data-component=\"dialog-overlay\"\n className={OVERLAY_CLASSES}\n />\n <RadixDialog.Content\n ref={ref}\n {...roleOverride}\n data-component=\"dialog\"\n data-component-id={instanceId}\n className={contentVariants({ size, className })}\n {...props}\n >\n {children}\n\n {!hideCloseButton && (\n // The close is a plain button carrying the `ds-dialog__close`\n // contract class — the SAME class a vanilla host renders. The CSS\n // (src/styles.css) owns its position, sizing, glyph size, hover\n // wash, and focus ring from tokens, so the React and non-React\n // close buttons are identical and can't drift.\n <RadixDialog.Close\n type=\"button\"\n className=\"ds-dialog__close\"\n aria-label={t('common.close', 'Close')}\n >\n <X aria-hidden=\"true\" />\n </RadixDialog.Close>\n )}\n </RadixDialog.Content>\n </RadixDialog.Portal>\n );\n },\n);\nDialogContent.displayName = 'Dialog.Content';\n\nconst DialogHeader = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={['ds-dialog__header', className].filter(Boolean).join(' ')}\n {...props}\n />\n ),\n);\nDialogHeader.displayName = 'Dialog.Header';\n\n// Optional body slot. Carries the `ds-dialog__body` contract class — the SAME\n// class a vanilla host renders — so content / iframe slots match between the\n// React and non-React surfaces and can't drift. Additive: content placed\n// directly in Dialog.Content (without this wrapper) still works as before.\nconst DialogBody = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={['ds-dialog__body', className].filter(Boolean).join(' ')}\n {...props}\n />\n ),\n);\nDialogBody.displayName = 'Dialog.Body';\n\nconst DialogTitle = forwardRef<\n HTMLHeadingElement,\n ComponentPropsWithoutRef<typeof RadixDialog.Title>\n>(({ className, ...props }, ref) => (\n <RadixDialog.Title\n ref={ref}\n className={['ds-dialog__title type-title-card ds:break-words', className]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n));\nDialogTitle.displayName = 'Dialog.Title';\n\nconst DialogDescription = forwardRef<\n HTMLParagraphElement,\n ComponentPropsWithoutRef<typeof RadixDialog.Description>\n>(({ className, ...props }, ref) => (\n <RadixDialog.Description\n ref={ref}\n className={['type-body-sm ds:text-[var(--muted-foreground)]', className]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n));\nDialogDescription.displayName = 'Dialog.Description';\n\ninterface DialogFooterProps extends HTMLAttributes<HTMLDivElement> {\n divider?: boolean;\n}\n\nconst DialogFooter = forwardRef<HTMLDivElement, DialogFooterProps>(\n ({ className, divider = false, ...props }, ref) => (\n <div\n ref={ref}\n className={[\n 'ds:flex ds:items-center ds:justify-end ds:gap-[var(--spacing-sm)]',\n 'ds:mt-[var(--spacing-md)]',\n divider &&\n 'ds:border-t ds:border-[color:var(--border)] ds:pt-[var(--spacing-md)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n ),\n);\nDialogFooter.displayName = 'Dialog.Footer';\n\nexport const Dialog = Object.assign(DialogRoot, {\n Root: DialogRoot,\n Trigger: DialogTrigger,\n Content: DialogContent,\n Header: DialogHeader,\n Title: DialogTitle,\n Description: DialogDescription,\n Body: DialogBody,\n Footer: DialogFooter,\n Close: DialogClose,\n});\n\nexport type { DialogFooterProps };\n"],"names":["dialogAgent","handle","OVERLAY_CLASSES","SURFACE_CHROME","contentVariants","cva","DialogIdContext","createContext","DialogRoot","children","id","openProp","defaultOpen","onOpenChange","props","openRaw","setOpen","useControllableState","open","openRef","useRef","useEffect","useMemo","useAgentRegistration","jsx","RadixDialog","DialogTrigger","forwardRef","ref","DialogClose","DialogContent","size","variant","hideCloseButton","className","t","useTranslation","instanceId","useContext","roleOverride","jsxs","X","DialogHeader","DialogBody","DialogTitle","DialogDescription","DialogFooter","divider","Dialog"],"mappings":"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"}