@alfadocs/ui-kit-debug 0.89.0 → 0.93.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 (201) hide show
  1. package/dist/_chunks/{antenatal-schedule-timeline-UiZQze4P.js → antenatal-schedule-timeline-BMMpi2lb.js} +17 -17
  2. package/dist/_chunks/{antenatal-schedule-timeline-UiZQze4P.js.map → antenatal-schedule-timeline-BMMpi2lb.js.map} +1 -1
  3. package/dist/_chunks/{appointment-timeline-CwpbQGC1.js → appointment-timeline-BB-c1LeR.js} +2 -2
  4. package/dist/_chunks/{appointment-timeline-CwpbQGC1.js.map → appointment-timeline-BB-c1LeR.js.map} +1 -1
  5. package/dist/_chunks/{ar-C9FRRqJs.js → ar-THMLfSoN.js} +22 -22
  6. package/dist/_chunks/{ar-C9FRRqJs.js.map → ar-THMLfSoN.js.map} +1 -1
  7. package/dist/_chunks/{booking-DEwmDprH.js → booking-BSpSMmJ2.js} +4 -4
  8. package/dist/_chunks/{booking-DEwmDprH.js.map → booking-BSpSMmJ2.js.map} +1 -1
  9. package/dist/_chunks/{cycle-calculator-DXSNIWFk.js → cycle-calculator-DNvvr0bP.js} +3 -3
  10. package/dist/_chunks/{cycle-calculator-DXSNIWFk.js.map → cycle-calculator-DNvvr0bP.js.map} +1 -1
  11. package/dist/_chunks/date-picker-BP_W6VtE.js +265 -0
  12. package/dist/_chunks/date-picker-BP_W6VtE.js.map +1 -0
  13. package/dist/_chunks/{date-picker-variants-D9B6hg15.js → date-picker-variants-eL6HjWvw.js} +966 -841
  14. package/dist/_chunks/{date-picker-variants-D9B6hg15.js.map → date-picker-variants-eL6HjWvw.js.map} +1 -1
  15. package/dist/_chunks/date-range-picker-Cc4DLAL2.js +824 -0
  16. package/dist/_chunks/date-range-picker-Cc4DLAL2.js.map +1 -0
  17. package/dist/_chunks/{date-time-picker-BU-j0qj4.js → date-time-picker-695QvBGj.js} +2 -2
  18. package/dist/_chunks/{date-time-picker-BU-j0qj4.js.map → date-time-picker-695QvBGj.js.map} +1 -1
  19. package/dist/_chunks/{de-C3_KZ6mR.js → de-DmZ-8rTN.js} +4 -4
  20. package/dist/_chunks/{de-C3_KZ6mR.js.map → de-DmZ-8rTN.js.map} +1 -1
  21. package/dist/_chunks/{due-date-calculator-BR_GuqHH.js → due-date-calculator-BEcdoy_E.js} +3 -3
  22. package/dist/_chunks/{due-date-calculator-BR_GuqHH.js.map → due-date-calculator-BEcdoy_E.js.map} +1 -1
  23. package/dist/_chunks/{el-v9xDKHgu.js → el-Bela9mxs.js} +6 -6
  24. package/dist/_chunks/{el-v9xDKHgu.js.map → el-Bela9mxs.js.map} +1 -1
  25. package/dist/_chunks/{es-Lgmjq9Rp.js → es-BNncHKex.js} +10 -10
  26. package/dist/_chunks/{es-Lgmjq9Rp.js.map → es-BNncHKex.js.map} +1 -1
  27. package/dist/_chunks/{fr-INS1OD7m.js → fr-CH8ADfhN.js} +12 -12
  28. package/dist/_chunks/{fr-INS1OD7m.js.map → fr-CH8ADfhN.js.map} +1 -1
  29. package/dist/_chunks/{gestational-age-calculator-DBIcxfjP.js → gestational-age-calculator-CuGkVqKp.js} +5 -5
  30. package/dist/_chunks/{gestational-age-calculator-DBIcxfjP.js.map → gestational-age-calculator-CuGkVqKp.js.map} +1 -1
  31. package/dist/_chunks/{hcg-doubling-BgCkds8R.js → hcg-doubling-fZ6qQN08.js} +2 -2
  32. package/dist/_chunks/{hcg-doubling-BgCkds8R.js.map → hcg-doubling-fZ6qQN08.js.map} +1 -1
  33. package/dist/_chunks/{hi-BUYtlosF.js → hi-Bppfxp8l.js} +16 -16
  34. package/dist/_chunks/{hi-BUYtlosF.js.map → hi-Bppfxp8l.js.map} +1 -1
  35. package/dist/_chunks/{isSameWeek-BUNsv4OO.js → isSameWeek-CK4HS9lH.js} +2 -2
  36. package/dist/_chunks/{isSameWeek-BUNsv4OO.js.map → isSameWeek-CK4HS9lH.js.map} +1 -1
  37. package/dist/_chunks/{it-VfsdUqeV.js → it-B4ySaRyK.js} +24 -24
  38. package/dist/_chunks/{it-VfsdUqeV.js.map → it-B4ySaRyK.js.map} +1 -1
  39. package/dist/_chunks/{ja-Dfk9qwzE.js → ja-CGF6Io9P.js} +12 -12
  40. package/dist/_chunks/{ja-Dfk9qwzE.js.map → ja-CGF6Io9P.js.map} +1 -1
  41. package/dist/_chunks/{link-cell-renderer-BzITwSXq.js → link-cell-renderer-DQjZeoAr.js} +214 -197
  42. package/dist/_chunks/link-cell-renderer-DQjZeoAr.js.map +1 -0
  43. package/dist/_chunks/{nl-Crxwg0IZ.js → nl-DuShqwuV.js} +12 -12
  44. package/dist/_chunks/{nl-Crxwg0IZ.js.map → nl-DuShqwuV.js.map} +1 -1
  45. package/dist/_chunks/parse-DvA97ro9.js +1601 -0
  46. package/dist/_chunks/parse-DvA97ro9.js.map +1 -0
  47. package/dist/_chunks/{patient-details-Dggsz-ki.js → patient-details-DrhlTrLf.js} +2 -2
  48. package/dist/_chunks/{patient-details-Dggsz-ki.js.map → patient-details-DrhlTrLf.js.map} +1 -1
  49. package/dist/_chunks/{patient-table-ps4byVwA.js → patient-table-DU_zFZoq.js} +2 -2
  50. package/dist/_chunks/{patient-table-ps4byVwA.js.map → patient-table-DU_zFZoq.js.map} +1 -1
  51. package/dist/_chunks/{pl-IdHtxWTl.js → pl-CKQwX9Fk.js} +22 -22
  52. package/dist/_chunks/{pl-IdHtxWTl.js.map → pl-CKQwX9Fk.js.map} +1 -1
  53. package/dist/_chunks/{pregnancy-dating-CvIRwWaG.js → pregnancy-dating-BdFl-rB1.js} +5 -5
  54. package/dist/_chunks/{pregnancy-dating-CvIRwWaG.js.map → pregnancy-dating-BdFl-rB1.js.map} +1 -1
  55. package/dist/_chunks/{pt-CY2m2bBz.js → pt-_njpXyOZ.js} +16 -16
  56. package/dist/_chunks/{pt-CY2m2bBz.js.map → pt-_njpXyOZ.js.map} +1 -1
  57. package/dist/_chunks/{radiograph-panel.agent-C93AXgtV.js → radiograph-panel.agent-rnrQZtK3.js} +3 -3
  58. package/dist/_chunks/{radiograph-panel.agent-C93AXgtV.js.map → radiograph-panel.agent-rnrQZtK3.js.map} +1 -1
  59. package/dist/_chunks/{ro-qoxLkXED.js → ro-3X6_4FcN.js} +14 -14
  60. package/dist/_chunks/{ro-qoxLkXED.js.map → ro-3X6_4FcN.js.map} +1 -1
  61. package/dist/_chunks/{ru-BVZlxoKf.js → ru-bAcgmnS-.js} +20 -20
  62. package/dist/_chunks/{ru-BVZlxoKf.js.map → ru-bAcgmnS-.js.map} +1 -1
  63. package/dist/_chunks/{sq--eT8hIiD.js → sq-jYFqr4Ga.js} +6 -6
  64. package/dist/_chunks/{sq--eT8hIiD.js.map → sq-jYFqr4Ga.js.map} +1 -1
  65. package/dist/_chunks/subDays-BcNi04uf.js +8 -0
  66. package/dist/_chunks/{subDays-fEHRx4hg.js.map → subDays-BcNi04uf.js.map} +1 -1
  67. package/dist/_chunks/{sv-BGNQ5gX6.js → sv-BSGEJ-8B.js} +10 -10
  68. package/dist/_chunks/{sv-BGNQ5gX6.js.map → sv-BSGEJ-8B.js.map} +1 -1
  69. package/dist/_chunks/{tr-B2NEu6Gy.js → tr-CTpgUtw6.js} +14 -14
  70. package/dist/_chunks/{tr-B2NEu6Gy.js.map → tr-CTpgUtw6.js.map} +1 -1
  71. package/dist/_chunks/{zh-CN-DClT1wDk.js → zh-CN-BgM0Io2O.js} +22 -22
  72. package/dist/_chunks/{zh-CN-DClT1wDk.js.map → zh-CN-BgM0Io2O.js.map} +1 -1
  73. package/dist/agent-catalog.json +93 -2
  74. package/dist/agent-i18n/en.json +8 -2
  75. package/dist/components/_shared/calendar-class-names.d.ts +5 -0
  76. package/dist/components/_shared/calendar-class-names.d.ts.map +1 -1
  77. package/dist/components/_shared/date-picker-variants.d.ts +23 -1
  78. package/dist/components/_shared/date-picker-variants.d.ts.map +1 -1
  79. package/dist/components/_shared/index.d.ts +2 -2
  80. package/dist/components/_shared/index.d.ts.map +1 -1
  81. package/dist/components/appointment-timeline/index.js +1 -1
  82. package/dist/components/booking/index.js +1 -1
  83. package/dist/components/cycle-calculator/index.js +1 -1
  84. package/dist/components/data-table/filters/date-range-filter.d.ts +13 -0
  85. package/dist/components/data-table/filters/date-range-filter.d.ts.map +1 -1
  86. package/dist/components/data-table/index.js +1 -1
  87. package/dist/components/date-picker/date-picker.d.ts.map +1 -1
  88. package/dist/components/date-picker/index.js +1 -1
  89. package/dist/components/date-range-picker/date-range-picker.agent.d.ts.map +1 -1
  90. package/dist/components/date-range-picker/date-range-picker.d.ts +79 -1
  91. package/dist/components/date-range-picker/date-range-picker.d.ts.map +1 -1
  92. package/dist/components/date-range-picker/index.d.ts +1 -1
  93. package/dist/components/date-range-picker/index.d.ts.map +1 -1
  94. package/dist/components/date-range-picker/index.js +1 -1
  95. package/dist/components/date-time-picker/index.js +1 -1
  96. package/dist/components/due-date-calculator/index.js +2 -2
  97. package/dist/components/gestational-age-calculator/index.js +1 -1
  98. package/dist/components/hcg-doubling/index.js +1 -1
  99. package/dist/components/patient-details/index.js +1 -1
  100. package/dist/components/patient-table/index.js +1 -1
  101. package/dist/components/pregnancy-dating/index.js +1 -1
  102. package/dist/components/radiograph-panel/index.js +1 -1
  103. package/dist/i18n/locales/ar.d.ts +24 -0
  104. package/dist/i18n/locales/ar.d.ts.map +1 -1
  105. package/dist/i18n/locales/ar.js +24 -0
  106. package/dist/i18n/locales/ar.js.map +1 -1
  107. package/dist/i18n/locales/de.d.ts +24 -0
  108. package/dist/i18n/locales/de.d.ts.map +1 -1
  109. package/dist/i18n/locales/de.js +24 -0
  110. package/dist/i18n/locales/de.js.map +1 -1
  111. package/dist/i18n/locales/el.d.ts +24 -0
  112. package/dist/i18n/locales/el.d.ts.map +1 -1
  113. package/dist/i18n/locales/el.js +24 -0
  114. package/dist/i18n/locales/el.js.map +1 -1
  115. package/dist/i18n/locales/en.d.ts +24 -0
  116. package/dist/i18n/locales/en.d.ts.map +1 -1
  117. package/dist/i18n/locales/en.js +24 -0
  118. package/dist/i18n/locales/en.js.map +1 -1
  119. package/dist/i18n/locales/es.d.ts +24 -0
  120. package/dist/i18n/locales/es.d.ts.map +1 -1
  121. package/dist/i18n/locales/es.js +24 -0
  122. package/dist/i18n/locales/es.js.map +1 -1
  123. package/dist/i18n/locales/fr.d.ts +24 -0
  124. package/dist/i18n/locales/fr.d.ts.map +1 -1
  125. package/dist/i18n/locales/fr.js +24 -0
  126. package/dist/i18n/locales/fr.js.map +1 -1
  127. package/dist/i18n/locales/hi.d.ts +24 -0
  128. package/dist/i18n/locales/hi.d.ts.map +1 -1
  129. package/dist/i18n/locales/hi.js +24 -0
  130. package/dist/i18n/locales/hi.js.map +1 -1
  131. package/dist/i18n/locales/it.d.ts +24 -0
  132. package/dist/i18n/locales/it.d.ts.map +1 -1
  133. package/dist/i18n/locales/it.js +24 -0
  134. package/dist/i18n/locales/it.js.map +1 -1
  135. package/dist/i18n/locales/ja.d.ts +24 -0
  136. package/dist/i18n/locales/ja.d.ts.map +1 -1
  137. package/dist/i18n/locales/ja.js +24 -0
  138. package/dist/i18n/locales/ja.js.map +1 -1
  139. package/dist/i18n/locales/nl.d.ts +24 -0
  140. package/dist/i18n/locales/nl.d.ts.map +1 -1
  141. package/dist/i18n/locales/nl.js +24 -0
  142. package/dist/i18n/locales/nl.js.map +1 -1
  143. package/dist/i18n/locales/pl.d.ts +24 -0
  144. package/dist/i18n/locales/pl.d.ts.map +1 -1
  145. package/dist/i18n/locales/pl.js +24 -0
  146. package/dist/i18n/locales/pl.js.map +1 -1
  147. package/dist/i18n/locales/pt.d.ts +24 -0
  148. package/dist/i18n/locales/pt.d.ts.map +1 -1
  149. package/dist/i18n/locales/pt.js +24 -0
  150. package/dist/i18n/locales/pt.js.map +1 -1
  151. package/dist/i18n/locales/ro.d.ts +24 -0
  152. package/dist/i18n/locales/ro.d.ts.map +1 -1
  153. package/dist/i18n/locales/ro.js +24 -0
  154. package/dist/i18n/locales/ro.js.map +1 -1
  155. package/dist/i18n/locales/ru.d.ts +24 -0
  156. package/dist/i18n/locales/ru.d.ts.map +1 -1
  157. package/dist/i18n/locales/ru.js +24 -0
  158. package/dist/i18n/locales/ru.js.map +1 -1
  159. package/dist/i18n/locales/sq.d.ts +24 -0
  160. package/dist/i18n/locales/sq.d.ts.map +1 -1
  161. package/dist/i18n/locales/sq.js +24 -0
  162. package/dist/i18n/locales/sq.js.map +1 -1
  163. package/dist/i18n/locales/sv.d.ts +24 -0
  164. package/dist/i18n/locales/sv.d.ts.map +1 -1
  165. package/dist/i18n/locales/sv.js +24 -0
  166. package/dist/i18n/locales/sv.js.map +1 -1
  167. package/dist/i18n/locales/tr.d.ts +24 -0
  168. package/dist/i18n/locales/tr.d.ts.map +1 -1
  169. package/dist/i18n/locales/tr.js +24 -0
  170. package/dist/i18n/locales/tr.js.map +1 -1
  171. package/dist/i18n/locales/zh.d.ts +24 -0
  172. package/dist/i18n/locales/zh.d.ts.map +1 -1
  173. package/dist/i18n/locales/zh.js +24 -0
  174. package/dist/i18n/locales/zh.js.map +1 -1
  175. package/dist/index.js +15 -15
  176. package/dist/locales/ar.json +24 -0
  177. package/dist/locales/de.json +24 -0
  178. package/dist/locales/el.json +24 -0
  179. package/dist/locales/en.json +24 -0
  180. package/dist/locales/es.json +24 -0
  181. package/dist/locales/fr.json +24 -0
  182. package/dist/locales/hi.json +24 -0
  183. package/dist/locales/it.json +24 -0
  184. package/dist/locales/ja.json +24 -0
  185. package/dist/locales/nl.json +24 -0
  186. package/dist/locales/pl.json +24 -0
  187. package/dist/locales/pt.json +24 -0
  188. package/dist/locales/ro.json +24 -0
  189. package/dist/locales/ru.json +24 -0
  190. package/dist/locales/sq.json +24 -0
  191. package/dist/locales/sv.json +24 -0
  192. package/dist/locales/tr.json +24 -0
  193. package/dist/locales/zh.json +24 -0
  194. package/dist/tokens.css +1 -1
  195. package/package.json +1 -1
  196. package/dist/_chunks/date-picker-ffmyjvlI.js +0 -1845
  197. package/dist/_chunks/date-picker-ffmyjvlI.js.map +0 -1
  198. package/dist/_chunks/date-range-picker-DSOH50-f.js +0 -325
  199. package/dist/_chunks/date-range-picker-DSOH50-f.js.map +0 -1
  200. package/dist/_chunks/link-cell-renderer-BzITwSXq.js.map +0 -1
  201. package/dist/_chunks/subDays-fEHRx4hg.js +0 -8
@@ -3,12 +3,12 @@ import { forwardRef as A, useState as C, useMemo as N, useEffect as I } from "re
3
3
  import { c as S } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as k } from "react-i18next";
5
5
  import { F as L } from "./form-field-M5UpX65Z.js";
6
- import { D as z } from "./date-picker-ffmyjvlI.js";
6
+ import { D as z } from "./date-picker-BP_W6VtE.js";
7
7
  import { N as D } from "./number-input-DjWzmlEY.js";
8
8
  import { C as E } from "./card-DPmk26CL.js";
9
9
  import { B as P } from "./badge-DCOqV9mI.js";
10
10
  import { I as B } from "./insert-result-D074GtHX.js";
11
- import { a as i } from "./date-picker-variants-D9B6hg15.js";
11
+ import { a as i } from "./date-picker-variants-eL6HjWvw.js";
12
12
  import { C as G } from "./check-DrFSN__t.js";
13
13
  import { H as R } from "./heart--qCA4ffe.js";
14
14
  import { c as Y } from "./createLucideIcon-DhHxpK9K.js";
@@ -249,4 +249,4 @@ export {
249
249
  U as L,
250
250
  O as p
251
251
  };
252
- //# sourceMappingURL=cycle-calculator-DXSNIWFk.js.map
252
+ //# sourceMappingURL=cycle-calculator-DNvvr0bP.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cycle-calculator-DXSNIWFk.js","sources":["../../node_modules/lucide-react/dist/esm/icons/droplet.mjs","../../src/components/cycle-calculator/cycle.ts","../../src/components/cycle-calculator/cycle-calculator.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.22.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.mjs';\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.mjs.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 * The current period's bleed range (first day → last day), or `null` when no\n * `periodLength` was given.\n */\n periodRange: DateRange | null;\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 const periodRange: DateRange | null =\n input.periodLength && input.periodLength > 0\n ? {\n start: lastPeriodStart,\n end: addDays(lastPeriodStart, input.periodLength - 1),\n }\n : null;\n\n return { nextPeriod, ovulation, fertileWindow, upcomingPeriods, periodRange };\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 const [periodLength, setPeriodLength] = useState<number | null>(null);\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 periodLength: periodLength ?? undefined,\n });\n }, [lastPeriod, cycleLength, periodLength]);\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 <FormField\n label={t('cycleCalculator.periodLength')}\n description={t('cycleCalculator.periodLengthHint')}\n >\n <NumberInput\n mode=\"integer\"\n min={1}\n max={14}\n value={periodLength}\n onChange={setPeriodLength}\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\n {result.periodRange ? (\n <div className=\"ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-2xs)]\">\n <span className=\"type-label ds:text-muted-foreground\">\n {t('cycleCalculator.periodRange')}\n </span>\n <span className=\"type-body ds:text-foreground\">\n {fmt(result.periodRange.start)} –{' '}\n {fmt(result.periodRange.end)}\n </span>\n </div>\n ) : null}\n\n <div className=\"ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-2xs)]\">\n <span className=\"type-label ds:text-muted-foreground\">\n {t('cycleCalculator.upcomingPeriods')}\n </span>\n <ul className=\"ds:flex ds:flex-wrap ds:gap-x-[var(--spacing-md)] ds:gap-y-[var(--spacing-2xs)]\">\n {result.upcomingPeriods.map((d) => (\n <li\n key={d.getTime()}\n className=\"type-body ds:text-foreground\"\n >\n {fmt(d)}\n </li>\n ))}\n </ul>\n </div>\n\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","periodRange","rootVariants","cva","HIGHLIGHT_TOKEN","CycleCalculator","forwardRef","defaultCycleLength","onResultChange","onInsert","insertVariant","onCopy","onError","insertBrand","id","width","className","ref","i18n","useTranslation","lastPeriod","setLastPeriod","useState","cycleLength","setCycleLength","periodLength","setPeriodLength","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
+ {"version":3,"file":"cycle-calculator-DNvvr0bP.js","sources":["../../node_modules/lucide-react/dist/esm/icons/droplet.mjs","../../src/components/cycle-calculator/cycle.ts","../../src/components/cycle-calculator/cycle-calculator.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.22.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.mjs';\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.mjs.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 * The current period's bleed range (first day → last day), or `null` when no\n * `periodLength` was given.\n */\n periodRange: DateRange | null;\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 const periodRange: DateRange | null =\n input.periodLength && input.periodLength > 0\n ? {\n start: lastPeriodStart,\n end: addDays(lastPeriodStart, input.periodLength - 1),\n }\n : null;\n\n return { nextPeriod, ovulation, fertileWindow, upcomingPeriods, periodRange };\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 const [periodLength, setPeriodLength] = useState<number | null>(null);\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 periodLength: periodLength ?? undefined,\n });\n }, [lastPeriod, cycleLength, periodLength]);\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 <FormField\n label={t('cycleCalculator.periodLength')}\n description={t('cycleCalculator.periodLengthHint')}\n >\n <NumberInput\n mode=\"integer\"\n min={1}\n max={14}\n value={periodLength}\n onChange={setPeriodLength}\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\n {result.periodRange ? (\n <div className=\"ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-2xs)]\">\n <span className=\"type-label ds:text-muted-foreground\">\n {t('cycleCalculator.periodRange')}\n </span>\n <span className=\"type-body ds:text-foreground\">\n {fmt(result.periodRange.start)} –{' '}\n {fmt(result.periodRange.end)}\n </span>\n </div>\n ) : null}\n\n <div className=\"ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-2xs)]\">\n <span className=\"type-label ds:text-muted-foreground\">\n {t('cycleCalculator.upcomingPeriods')}\n </span>\n <ul className=\"ds:flex ds:flex-wrap ds:gap-x-[var(--spacing-md)] ds:gap-y-[var(--spacing-2xs)]\">\n {result.upcomingPeriods.map((d) => (\n <li\n key={d.getTime()}\n className=\"type-body ds:text-foreground\"\n >\n {fmt(d)}\n </li>\n ))}\n </ul>\n </div>\n\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","periodRange","rootVariants","cva","HIGHLIGHT_TOKEN","CycleCalculator","forwardRef","defaultCycleLength","onResultChange","onInsert","insertVariant","onCopy","onError","insertBrand","id","width","className","ref","i18n","useTranslation","lastPeriod","setLastPeriod","useState","cycleLength","setCycleLength","periodLength","setPeriodLength","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,265 @@
1
+ import { jsx as r, jsxs as v } from "react/jsx-runtime";
2
+ import { forwardRef as ae, useState as y, useRef as K, useEffect as re, useCallback as R, useMemo as ne, useImperativeHandle as se } from "react";
3
+ import { useTranslation as ie } from "react-i18next";
4
+ import * as k from "@radix-ui/react-popover";
5
+ import { u as oe } from "./use-controllable-state-BiY4xTzM.js";
6
+ import { u as de } from "./form-field-context-B3APVHKx.js";
7
+ import { u as ce } from "./registry-DvAUVLHh.js";
8
+ import { u as le, g as pe, f as T, b as ue, c as fe, i as me, t as he, d as ge, p as ve, D as ye, C as ke, e as be, h as Ce, j as De } from "./date-picker-variants-eL6HjWvw.js";
9
+ import { C as Pe } from "./calendar-days-BGWklvE-.js";
10
+ import { C as Se } from "./check-DrFSN__t.js";
11
+ import { p as xe } from "./parse-DvA97ro9.js";
12
+ import { i as we } from "./isSameDay-DUEiAT0G.js";
13
+ const Ie = {
14
+ id: "date-picker",
15
+ // Persisted single date (value state + set_date) → select_single + set_value,
16
+ // plus open/close of the calendar popover.
17
+ capabilities: ["select_single", "set_value", "open", "close"],
18
+ state: {
19
+ value: {
20
+ type: "iso-date",
21
+ descriptionKey: "ui.agent.datePicker.state.value",
22
+ description: "Currently-selected ISO date, or null.",
23
+ read: (a) => {
24
+ var c;
25
+ return ((c = a.getValue()) == null ? void 0 : c.toISOString()) ?? null;
26
+ }
27
+ },
28
+ isOpen: {
29
+ type: "boolean",
30
+ descriptionKey: "ui.agent.datePicker.state.isOpen",
31
+ description: "Whether the calendar popover is open.",
32
+ read: (a) => a.isOpen()
33
+ }
34
+ },
35
+ actions: {
36
+ set_date: {
37
+ safety: "write",
38
+ argsType: "{ date: string }",
39
+ argsSchema: {
40
+ type: "object",
41
+ properties: {
42
+ date: {
43
+ type: "string",
44
+ format: "date",
45
+ description: 'ISO date, e.g. "2026-06-23".'
46
+ }
47
+ },
48
+ required: ["date"]
49
+ },
50
+ idempotent: !0,
51
+ descriptionKey: "ui.agent.datePicker.actions.setDate",
52
+ description: "Select a specific date (ISO yyyy-mm-dd).",
53
+ examples: [{ args: { date: "2026-06-23" }, note: "Select 23 Jun 2026." }],
54
+ invoke: (a, c) => {
55
+ a.setValue(new Date(c.date));
56
+ }
57
+ },
58
+ clear: {
59
+ // Discards the selected date — loses the user's input.
60
+ safety: "destructive",
61
+ idempotent: !0,
62
+ descriptionKey: "ui.agent.datePicker.actions.clear",
63
+ description: "Clear the selected date.",
64
+ invoke: (a) => {
65
+ a.clear();
66
+ }
67
+ },
68
+ open: {
69
+ safety: "read",
70
+ idempotent: !0,
71
+ descriptionKey: "ui.agent.datePicker.actions.open",
72
+ description: "Open the calendar popover.",
73
+ invoke: (a) => {
74
+ a.open();
75
+ }
76
+ },
77
+ close: {
78
+ safety: "read",
79
+ idempotent: !0,
80
+ descriptionKey: "ui.agent.datePicker.actions.close",
81
+ description: "Close the calendar popover.",
82
+ invoke: (a) => {
83
+ a.close();
84
+ }
85
+ }
86
+ },
87
+ domHooks: {
88
+ root: {
89
+ attr: "data-component",
90
+ value: "date-picker",
91
+ description: "Marks the DatePicker wrapper."
92
+ },
93
+ instanceId: {
94
+ attr: "data-component-id",
95
+ sourceProp: "id",
96
+ description: "Sourced from the id prop."
97
+ }
98
+ }
99
+ }, Oe = ae(
100
+ ({
101
+ value: a,
102
+ defaultValue: c,
103
+ onChange: F,
104
+ minDate: m,
105
+ maxDate: h,
106
+ disabledDates: l,
107
+ weekStartsOn: M,
108
+ presets: b,
109
+ size: x = "md",
110
+ disabled: j,
111
+ placeholder: q,
112
+ className: B,
113
+ id: E
114
+ }, L) => {
115
+ const { t: w, i18n: I } = ie(), p = de(), C = E ?? p.id, O = p.disabled || j, _ = p.invalid ? "error" : "default", u = le(I.language), f = pe(I.language), H = q ?? w("inputs.datePicker.placeholder", "Select date"), [W, N] = oe({
116
+ value: a,
117
+ defaultValue: c,
118
+ onChange: F
119
+ }), n = W, [i, s] = y(!1), [J, D] = y(
120
+ n ? T(n, f, { locale: u }) : ""
121
+ ), [V, g] = y(!1), [z, P] = y(n ?? /* @__PURE__ */ new Date()), S = K(null);
122
+ re(() => {
123
+ n ? (D(T(n, f, { locale: u })), g(!1)) : D("");
124
+ }, [n, f, u]);
125
+ const G = ue(
126
+ m,
127
+ h,
128
+ l
129
+ ), Q = R(
130
+ (e) => m && fe(e, m) || h && me(e, h) ? !0 : Array.isArray(l) ? l.some(
131
+ (t) => t.toDateString() === e.toDateString()
132
+ ) : typeof l == "function" ? l(e) : !1,
133
+ [m, h, l]
134
+ ), o = R(
135
+ (e) => {
136
+ N(e);
137
+ },
138
+ [N]
139
+ ), U = (e) => {
140
+ const t = e.target.value;
141
+ if (D(t), t.length === 0) {
142
+ g(!1), o(void 0);
143
+ return;
144
+ }
145
+ const d = xe(t, f, /* @__PURE__ */ new Date(), { locale: u });
146
+ De(d) && !Q(d) ? (g(!1), o(d), P(d)) : t.length === f.length && g(!0);
147
+ }, X = (e) => {
148
+ e.key === "Enter" && i && (e.preventDefault(), s(!1)), e.key === "Escape" && i && (e.preventDefault(), s(!1)), e.key === "ArrowDown" && !i && (e.preventDefault(), s(!0));
149
+ }, Y = (e) => {
150
+ var t;
151
+ e && (o(e), s(!1), (t = S.current) == null || t.focus());
152
+ }, Z = (e) => {
153
+ var d;
154
+ const t = e.date();
155
+ o(t), P(t), s(!1), (d = S.current) == null || d.focus();
156
+ }, $ = (e) => n ? we(e.date(), n) : !1, ee = w("inputs.datePicker.gridLabel", "Calendar"), te = ne(
157
+ () => ({
158
+ getValue: () => n,
159
+ setValue: (e) => o(e),
160
+ clear: () => o(void 0),
161
+ isOpen: () => i,
162
+ open: () => s(!0),
163
+ close: () => s(!1)
164
+ }),
165
+ [n, o, i]
166
+ ), A = K(null);
167
+ return se(L, () => A.current, []), ce(Ie, te, C), /* @__PURE__ */ r(k.Root, { open: i, onOpenChange: s, children: /* @__PURE__ */ v(
168
+ "div",
169
+ {
170
+ ref: A,
171
+ className: B,
172
+ "data-component": "date-picker",
173
+ "data-component-id": C,
174
+ children: [
175
+ /* @__PURE__ */ v("div", { className: "ds:relative", children: [
176
+ /* @__PURE__ */ r(k.Trigger, { asChild: !0, disabled: O, children: /* @__PURE__ */ r(
177
+ "input",
178
+ {
179
+ ref: S,
180
+ id: C,
181
+ type: "text",
182
+ role: "combobox",
183
+ value: J,
184
+ placeholder: H,
185
+ disabled: O,
186
+ "aria-describedby": p.describedBy || void 0,
187
+ "aria-invalid": p.invalid || V || void 0,
188
+ "aria-required": p.required || void 0,
189
+ "aria-haspopup": "dialog",
190
+ "aria-expanded": i,
191
+ onChange: U,
192
+ onKeyDown: X,
193
+ onClick: () => !i && s(!0),
194
+ className: he({
195
+ size: x,
196
+ tone: V ? "error" : _
197
+ })
198
+ }
199
+ ) }),
200
+ /* @__PURE__ */ r("span", { "aria-hidden": "true", className: ge({ size: x }), children: /* @__PURE__ */ r(Pe, {}) })
201
+ ] }),
202
+ /* @__PURE__ */ r(k.Portal, { children: /* @__PURE__ */ r(
203
+ k.Content,
204
+ {
205
+ sideOffset: 4,
206
+ align: "start",
207
+ className: Ce(),
208
+ onOpenAutoFocus: (e) => {
209
+ e.preventDefault();
210
+ },
211
+ children: /* @__PURE__ */ v("div", { className: "ds:flex ds:gap-[var(--spacing-md)]", children: [
212
+ b && b.length > 0 ? /* @__PURE__ */ r("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:min-w-[8rem] ds:border-e ds:border-border ds:pe-[var(--spacing-md)]", children: b.map((e) => {
213
+ const t = $(e);
214
+ return /* @__PURE__ */ v(
215
+ "button",
216
+ {
217
+ type: "button",
218
+ "aria-pressed": t,
219
+ onClick: () => Z(e),
220
+ className: ve({ active: t }),
221
+ children: [
222
+ /* @__PURE__ */ r("span", { className: "ds:min-w-0 ds:truncate", children: e.label }),
223
+ t ? /* @__PURE__ */ r(
224
+ Se,
225
+ {
226
+ "aria-hidden": "true",
227
+ className: "ds:size-4 ds:shrink-0 ds:text-primary"
228
+ }
229
+ ) : null
230
+ ]
231
+ },
232
+ e.label
233
+ );
234
+ }) }) : null,
235
+ /* @__PURE__ */ r("div", { role: "region", "aria-label": ee, children: /* @__PURE__ */ r(
236
+ ye,
237
+ {
238
+ mode: "single",
239
+ selected: n,
240
+ onSelect: Y,
241
+ month: z,
242
+ onMonthChange: P,
243
+ disabled: G,
244
+ weekStartsOn: M,
245
+ locale: u,
246
+ showOutsideDays: !0,
247
+ fixedWeeks: !0,
248
+ classNames: be,
249
+ components: { Chevron: ke }
250
+ }
251
+ ) })
252
+ ] })
253
+ }
254
+ ) })
255
+ ]
256
+ }
257
+ ) });
258
+ }
259
+ );
260
+ Oe.displayName = "DatePicker";
261
+ export {
262
+ Oe as D,
263
+ Ie as d
264
+ };
265
+ //# sourceMappingURL=date-picker-BP_W6VtE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-picker-BP_W6VtE.js","sources":["../../src/components/date-picker/date-picker.agent.ts","../../src/components/date-picker/date-picker.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — DatePicker. */\n/* */\n/* DatePicker wraps react-day-picker inside a Radix Popover. The agent */\n/* surface curates the input + popover into a small set of date-shaped */\n/* operations — set / clear / open / close. The handle is the curated */\n/* surface; raw rdp internals are deliberately not exposed. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` §15. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { DatePickerHandle } from './date-picker';\n\nexport const datePickerAgent: AgentAdapter<DatePickerHandle> = {\n id: 'date-picker',\n // Persisted single date (value state + set_date) → select_single + set_value,\n // plus open/close of the calendar popover.\n capabilities: ['select_single', 'set_value', 'open', 'close'],\n state: {\n value: {\n type: 'iso-date',\n descriptionKey: 'ui.agent.datePicker.state.value',\n description: 'Currently-selected ISO date, or null.',\n read: (handle) => handle.getValue()?.toISOString() ?? null,\n },\n isOpen: {\n type: 'boolean',\n descriptionKey: 'ui.agent.datePicker.state.isOpen',\n description: 'Whether the calendar popover is open.',\n read: (handle) => handle.isOpen(),\n },\n },\n actions: {\n set_date: {\n safety: 'write',\n argsType: '{ date: string }',\n argsSchema: {\n type: 'object',\n properties: {\n date: {\n type: 'string',\n format: 'date',\n description: 'ISO date, e.g. \"2026-06-23\".',\n },\n },\n required: ['date'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.datePicker.actions.setDate',\n description: 'Select a specific date (ISO yyyy-mm-dd).',\n examples: [{ args: { date: '2026-06-23' }, note: 'Select 23 Jun 2026.' }],\n invoke: (handle, args: { date: string }) => {\n handle.setValue(new Date(args.date));\n },\n },\n clear: {\n // Discards the selected date — loses the user's input.\n safety: 'destructive',\n idempotent: true,\n descriptionKey: 'ui.agent.datePicker.actions.clear',\n description: 'Clear the selected date.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n open: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.datePicker.actions.open',\n description: 'Open the calendar popover.',\n invoke: (handle) => {\n handle.open();\n },\n },\n close: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.datePicker.actions.close',\n description: 'Close the calendar popover.',\n invoke: (handle) => {\n handle.close();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'date-picker',\n description: 'Marks the DatePicker wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type KeyboardEvent,\n} from 'react';\nimport { type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport * as Popover from '@radix-ui/react-popover';\nimport { DayPicker } from 'react-day-picker';\nimport {\n format as fnsFormat,\n parse as fnsParse,\n isValid,\n isSameDay,\n isBefore,\n isAfter,\n} from 'date-fns';\nimport { CalendarDays, Check } from 'lucide-react';\nimport { useControllableState } from '../../hooks/use-controllable-state';\nimport { useFormField } from '../form-field/form-field-context';\nimport {\n useDateFnsLocale,\n getShortDateFormat,\n buildDisabledMatcher,\n CalendarChevron,\n calendarClassNames,\n triggerVariants,\n calendarIconVariants,\n popoverContentVariants,\n presetButtonVariants,\n} from '../_shared';\nimport { useAgentRegistration } from '../../agent';\nimport { datePickerAgent } from './date-picker.agent';\n\n/* -------------------------------------------------------------------------- */\n/* Imperative handle */\n/* -------------------------------------------------------------------------- */\n\n/** Curated imperative handle exposed via `ref` — also consumed by the agent adapter. */\nexport interface DatePickerHandle {\n /** Get the current selected date, or undefined. */\n getValue: () => Date | undefined;\n /** Set the selected date. */\n setValue: (date: Date | undefined) => void;\n /** Clear the selected date. */\n clear: () => void;\n /** Whether the popover is open. */\n isOpen: () => boolean;\n /** Open the calendar popover. */\n open: () => void;\n /** Close the calendar popover. */\n close: () => void;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Props */\n/* -------------------------------------------------------------------------- */\n\nexport interface DatePickerPreset {\n label: string;\n date: () => Date;\n}\n\nexport interface DatePickerProps extends Pick<\n VariantProps<typeof triggerVariants>,\n 'size'\n> {\n /** Current selected date — controlled. */\n value?: Date;\n /** Default selected date — uncontrolled. */\n defaultValue?: Date;\n /** Called when the selected date changes. */\n onChange?: (date: Date | undefined) => void;\n /** Minimum selectable date. */\n minDate?: Date;\n /** Maximum selectable date. */\n maxDate?: Date;\n /** Disabled dates — array or predicate. */\n disabledDates?: Date[] | ((date: Date) => boolean);\n /** Week starts on (0=Sunday). Derived from locale if not specified. */\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n /** Quick-pick presets shown inline-start of the calendar. */\n presets?: DatePickerPreset[];\n /** Component size. */\n size?: 'sm' | 'md' | 'lg';\n /** Disabled state. */\n disabled?: boolean;\n /** Placeholder text. */\n placeholder?: string;\n /** Additional class names. */\n className?: string;\n /** id override. */\n id?: string;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------------- */\n\nexport const DatePicker = forwardRef<HTMLDivElement, DatePickerProps>(\n (\n {\n value,\n defaultValue,\n onChange,\n minDate,\n maxDate,\n disabledDates,\n weekStartsOn,\n presets,\n size = 'md',\n disabled,\n placeholder,\n className,\n id,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const ctx = useFormField();\n const effectiveId = id ?? ctx.id;\n const effectiveDisabled = ctx.disabled || disabled;\n const effectiveTone = ctx.invalid ? 'error' : 'default';\n\n const locale = useDateFnsLocale(i18n.language);\n const dateFormat = getShortDateFormat(i18n.language);\n const placeholderText =\n placeholder ?? t('inputs.datePicker.placeholder', 'Select date');\n\n const [currentValueRaw, setDateValue] = useControllableState<\n Date | undefined\n >({\n value,\n defaultValue,\n onChange,\n });\n const currentValue = currentValueRaw;\n\n const [open, setOpen] = useState(false);\n const [inputText, setInputText] = useState(\n currentValue ? fnsFormat(currentValue, dateFormat, { locale }) : '',\n );\n const [inputInvalid, setInputInvalid] = useState(false);\n const [month, setMonth] = useState<Date>(currentValue ?? new Date());\n\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Sync input text when value changes externally\n useEffect(() => {\n if (currentValue) {\n setInputText(fnsFormat(currentValue, dateFormat, { locale }));\n setInputInvalid(false);\n } else {\n setInputText('');\n }\n }, [currentValue, dateFormat, locale]);\n\n const disabledMatcher = buildDisabledMatcher(\n minDate,\n maxDate,\n disabledDates,\n );\n\n /** Check if a date is disabled. */\n const isDateDisabled = useCallback(\n (date: Date): boolean => {\n if (minDate && isBefore(date, minDate)) return true;\n if (maxDate && isAfter(date, maxDate)) return true;\n if (Array.isArray(disabledDates)) {\n return disabledDates.some(\n (d) => d.toDateString() === date.toDateString(),\n );\n }\n if (typeof disabledDates === 'function') {\n return disabledDates(date);\n }\n return false;\n },\n [minDate, maxDate, disabledDates],\n );\n\n const emit = useCallback(\n (date: Date | undefined) => {\n setDateValue(date);\n },\n [setDateValue],\n );\n\n const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n const text = e.target.value;\n setInputText(text);\n\n if (text.length === 0) {\n setInputInvalid(false);\n emit(undefined);\n return;\n }\n\n const parsed = fnsParse(text, dateFormat, new Date(), { locale });\n if (isValid(parsed) && !isDateDisabled(parsed)) {\n setInputInvalid(false);\n emit(parsed);\n setMonth(parsed);\n } else if (text.length === dateFormat.length) {\n setInputInvalid(true);\n }\n };\n\n const handleInputKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' && open) {\n e.preventDefault();\n setOpen(false);\n }\n if (e.key === 'Escape' && open) {\n e.preventDefault();\n setOpen(false);\n }\n if (e.key === 'ArrowDown' && !open) {\n e.preventDefault();\n setOpen(true);\n }\n };\n\n const handleDaySelect = (date: Date | undefined) => {\n if (date) {\n emit(date);\n setOpen(false);\n inputRef.current?.focus();\n }\n };\n\n const handlePresetClick = (preset: DatePickerPreset) => {\n const date = preset.date();\n emit(date);\n setMonth(date);\n setOpen(false);\n inputRef.current?.focus();\n };\n\n // A preset is \"active\" when the selected date matches the one it produces,\n // so the shortcut and the highlighted day visibly agree.\n const isPresetActive = (preset: DatePickerPreset): boolean =>\n currentValue ? isSameDay(preset.date(), currentValue) : false;\n\n const gridLabel = t('inputs.datePicker.gridLabel', 'Calendar');\n\n const handle = useMemo<DatePickerHandle>(\n () => ({\n getValue: () => currentValue,\n setValue: (date) => emit(date),\n clear: () => emit(undefined),\n isOpen: () => open,\n open: () => setOpen(true),\n close: () => setOpen(false),\n }),\n [currentValue, emit, open],\n );\n\n const rootRef = useRef<HTMLDivElement>(null);\n useImperativeHandle(ref, () => rootRef.current as HTMLDivElement, []);\n useAgentRegistration(datePickerAgent, handle, effectiveId);\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen}>\n <div\n ref={rootRef}\n className={className}\n data-component=\"date-picker\"\n data-component-id={effectiveId}\n >\n <div className=\"ds:relative\">\n {/* `Popover.Trigger asChild` slots Radix's trigger props\n (including `type=\"button\"`, `aria-haspopup`,\n `aria-expanded`) onto the child element. We want those on\n the input, not the surrounding `<div>`, so the input is\n the direct asChild target and the icon sits as a sibling. */}\n <Popover.Trigger asChild disabled={effectiveDisabled}>\n <input\n ref={inputRef}\n id={effectiveId}\n type=\"text\"\n // ARIA 1.2 permits `role=\"combobox\"` on `<input>`. That's\n // what makes `aria-expanded` / `aria-controls` valid\n // here — the input acts as a combobox-style trigger\n // whose popup is the calendar dialog. `aria-haspopup=\"dialog\"`\n // replaces `aria-controls` for the dialog-popup pattern.\n // eslint-disable-next-line jsx-a11y/role-has-required-aria-props\n role=\"combobox\"\n value={inputText}\n placeholder={placeholderText}\n disabled={effectiveDisabled}\n aria-describedby={ctx.describedBy || undefined}\n aria-invalid={ctx.invalid || inputInvalid || undefined}\n aria-required={ctx.required || undefined}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n onChange={handleInputChange}\n onKeyDown={handleInputKeyDown}\n onClick={() => !open && setOpen(true)}\n className={triggerVariants({\n size,\n tone: inputInvalid ? 'error' : effectiveTone,\n })}\n />\n </Popover.Trigger>\n <span aria-hidden=\"true\" className={calendarIconVariants({ size })}>\n <CalendarDays />\n </span>\n </div>\n\n <Popover.Portal>\n <Popover.Content\n sideOffset={4}\n align=\"start\"\n className={popoverContentVariants()}\n onOpenAutoFocus={(e) => {\n // Keep focus on input, don't auto-focus the calendar\n e.preventDefault();\n }}\n >\n <div className=\"ds:flex ds:gap-[var(--spacing-md)]\">\n {/* Presets column */}\n {presets && presets.length > 0 ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:min-w-[8rem] ds:border-e ds:border-border ds:pe-[var(--spacing-md)]\">\n {presets.map((preset) => {\n const active = isPresetActive(preset);\n return (\n <button\n key={preset.label}\n type=\"button\"\n aria-pressed={active}\n onClick={() => handlePresetClick(preset)}\n className={presetButtonVariants({ active })}\n >\n <span className=\"ds:min-w-0 ds:truncate\">\n {preset.label}\n </span>\n {active ? (\n <Check\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:shrink-0 ds:text-primary\"\n />\n ) : null}\n </button>\n );\n })}\n </div>\n ) : null}\n\n {/* Calendar */}\n <div role=\"region\" aria-label={gridLabel}>\n <DayPicker\n mode=\"single\"\n selected={currentValue}\n onSelect={handleDaySelect}\n month={month}\n onMonthChange={setMonth}\n disabled={disabledMatcher}\n weekStartsOn={weekStartsOn}\n locale={locale}\n showOutsideDays\n fixedWeeks\n classNames={calendarClassNames}\n components={{ Chevron: CalendarChevron }}\n />\n </div>\n </div>\n </Popover.Content>\n </Popover.Portal>\n </div>\n </Popover.Root>\n );\n },\n);\n\nDatePicker.displayName = 'DatePicker';\n"],"names":["datePickerAgent","handle","_a","args","DatePicker","forwardRef","value","defaultValue","onChange","minDate","maxDate","disabledDates","weekStartsOn","presets","size","disabled","placeholder","className","id","ref","t","i18n","useTranslation","ctx","useFormField","effectiveId","effectiveDisabled","effectiveTone","locale","useDateFnsLocale","dateFormat","getShortDateFormat","placeholderText","currentValueRaw","setDateValue","useControllableState","currentValue","open","setOpen","useState","inputText","setInputText","fnsFormat","inputInvalid","setInputInvalid","month","setMonth","inputRef","useRef","useEffect","disabledMatcher","buildDisabledMatcher","isDateDisabled","useCallback","date","isBefore","isAfter","d","emit","handleInputChange","text","parsed","fnsParse","isValid","handleInputKeyDown","handleDaySelect","handlePresetClick","preset","isPresetActive","isSameDay","gridLabel","useMemo","rootRef","useImperativeHandle","useAgentRegistration","Popover","jsxs","jsx","triggerVariants","calendarIconVariants","CalendarDays","popoverContentVariants","active","presetButtonVariants","Check","DayPicker","calendarClassNames","CalendarChevron"],"mappings":"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"}