@alfadocs/ui-kit-debug 1.3.11 → 1.3.13

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 (72) hide show
  1. package/dist/_chunks/{anamnesis-i18n-DFXSM72N.js → anamnesis-i18n-CfC0qYzy.js} +883 -875
  2. package/dist/_chunks/anamnesis-i18n-CfC0qYzy.js.map +1 -0
  3. package/dist/_chunks/{appointment-timeline-BB-c1LeR.js → appointment-timeline-B630OT_J.js} +2 -2
  4. package/dist/_chunks/{appointment-timeline-BB-c1LeR.js.map → appointment-timeline-B630OT_J.js.map} +1 -1
  5. package/dist/_chunks/{bmi-calculator-Bk2GAju7.js → bmi-calculator-CM0-G2mg.js} +2 -2
  6. package/dist/_chunks/{bmi-calculator-Bk2GAju7.js.map → bmi-calculator-CM0-G2mg.js.map} +1 -1
  7. package/dist/_chunks/{booking-BxFV0hT5.js → booking-DjNbd7C1.js} +2 -2
  8. package/dist/_chunks/{booking-BxFV0hT5.js.map → booking-DjNbd7C1.js.map} +1 -1
  9. package/dist/_chunks/{cycle-calculator-DNvvr0bP.js → cycle-calculator-BwqYVPB4.js} +3 -3
  10. package/dist/_chunks/{cycle-calculator-DNvvr0bP.js.map → cycle-calculator-BwqYVPB4.js.map} +1 -1
  11. package/dist/_chunks/{date-picker-BP_W6VtE.js → date-picker-ZHejTVAJ.js} +81 -77
  12. package/dist/_chunks/date-picker-ZHejTVAJ.js.map +1 -0
  13. package/dist/_chunks/{due-date-calculator-BEcdoy_E.js → due-date-calculator-CwfsFd3T.js} +3 -3
  14. package/dist/_chunks/{due-date-calculator-BEcdoy_E.js.map → due-date-calculator-CwfsFd3T.js.map} +1 -1
  15. package/dist/_chunks/{fetal-weight-1F9N4IMx.js → fetal-weight-ePlLjJPc.js} +2 -2
  16. package/dist/_chunks/{fetal-weight-1F9N4IMx.js.map → fetal-weight-ePlLjJPc.js.map} +1 -1
  17. package/dist/_chunks/{gestational-age-calculator-CuGkVqKp.js → gestational-age-calculator-DdgbH69Z.js} +2 -2
  18. package/dist/_chunks/{gestational-age-calculator-CuGkVqKp.js.map → gestational-age-calculator-DdgbH69Z.js.map} +1 -1
  19. package/dist/_chunks/{hcg-doubling-fZ6qQN08.js → hcg-doubling-BBqD2wI2.js} +2 -2
  20. package/dist/_chunks/{hcg-doubling-fZ6qQN08.js.map → hcg-doubling-BBqD2wI2.js.map} +1 -1
  21. package/dist/_chunks/{link-cell-renderer-_DlEZHLI.js → link-cell-renderer-C5XLwVXQ.js} +2 -2
  22. package/dist/_chunks/{link-cell-renderer-_DlEZHLI.js.map → link-cell-renderer-C5XLwVXQ.js.map} +1 -1
  23. package/dist/_chunks/number-input-DrozbZAU.js +370 -0
  24. package/dist/_chunks/number-input-DrozbZAU.js.map +1 -0
  25. package/dist/_chunks/{optical-prescription-BEjYQjiO.js → optical-prescription-BDHJr8Zz.js} +2 -2
  26. package/dist/_chunks/{optical-prescription-BEjYQjiO.js.map → optical-prescription-BDHJr8Zz.js.map} +1 -1
  27. package/dist/_chunks/{patient-details-BAUg0FWs.js → patient-details-DqjjwPmt.js} +3 -3
  28. package/dist/_chunks/{patient-details-BAUg0FWs.js.map → patient-details-DqjjwPmt.js.map} +1 -1
  29. package/dist/_chunks/{patient-table-C7QHFC63.js → patient-table-BmIDrLIS.js} +2 -2
  30. package/dist/_chunks/{patient-table-C7QHFC63.js.map → patient-table-BmIDrLIS.js.map} +1 -1
  31. package/dist/_chunks/{pregnancy-dating-BdFl-rB1.js → pregnancy-dating-DzYTlBkT.js} +3 -3
  32. package/dist/_chunks/{pregnancy-dating-BdFl-rB1.js.map → pregnancy-dating-DzYTlBkT.js.map} +1 -1
  33. package/dist/_chunks/{pregnancy-weight-gain-B-CkVYnU.js → pregnancy-weight-gain-O6J0sUIi.js} +2 -2
  34. package/dist/_chunks/{pregnancy-weight-gain-B-CkVYnU.js.map → pregnancy-weight-gain-O6J0sUIi.js.map} +1 -1
  35. package/dist/_chunks/{radiograph-panel.agent-AsXJBr1p.js → radiograph-panel.agent-BQZ64Riy.js} +2 -2
  36. package/dist/_chunks/{radiograph-panel.agent-AsXJBr1p.js.map → radiograph-panel.agent-BQZ64Riy.js.map} +1 -1
  37. package/dist/_chunks/{unit-converter-CSLWFDQh.js → unit-converter-COgkN7YP.js} +2 -2
  38. package/dist/_chunks/{unit-converter-CSLWFDQh.js.map → unit-converter-COgkN7YP.js.map} +1 -1
  39. package/dist/agent-catalog.json +1 -1
  40. package/dist/components/appointment-timeline/index.js +1 -1
  41. package/dist/components/bmi-calculator/index.js +1 -1
  42. package/dist/components/booking/index.js +1 -1
  43. package/dist/components/cycle-calculator/index.js +1 -1
  44. package/dist/components/data-table/index.js +1 -1
  45. package/dist/components/date-picker/date-picker.d.ts +8 -0
  46. package/dist/components/date-picker/date-picker.d.ts.map +1 -1
  47. package/dist/components/date-picker/index.js +1 -1
  48. package/dist/components/due-date-calculator/index.js +1 -1
  49. package/dist/components/fetal-weight/index.js +1 -1
  50. package/dist/components/gestational-age-calculator/index.js +1 -1
  51. package/dist/components/hcg-doubling/index.js +1 -1
  52. package/dist/components/number-input/index.js +1 -1
  53. package/dist/components/number-input/number-input.d.ts.map +1 -1
  54. package/dist/components/optical-prescription/index.js +1 -1
  55. package/dist/components/patient-details/index.js +1 -1
  56. package/dist/components/patient-table/index.js +1 -1
  57. package/dist/components/pregnancy-dating/index.js +1 -1
  58. package/dist/components/pregnancy-weight-gain/index.js +1 -1
  59. package/dist/components/radiograph-panel/index.js +1 -1
  60. package/dist/components/unit-converter/index.js +1 -1
  61. package/dist/index.js +19 -19
  62. package/dist/patterns/anamnesis/anamnesis-derive.d.ts +16 -0
  63. package/dist/patterns/anamnesis/anamnesis-derive.d.ts.map +1 -1
  64. package/dist/patterns/anamnesis/anamnesis-questionnaire.d.ts.map +1 -1
  65. package/dist/patterns/anamnesis/anamnesis-target-strip.d.ts +4 -3
  66. package/dist/patterns/anamnesis/anamnesis-target-strip.d.ts.map +1 -1
  67. package/dist/patterns/anamnesis/index.js +1 -1
  68. package/package.json +1 -1
  69. package/dist/_chunks/anamnesis-i18n-DFXSM72N.js.map +0 -1
  70. package/dist/_chunks/date-picker-BP_W6VtE.js.map +0 -1
  71. package/dist/_chunks/number-input-DjWzmlEY.js +0 -350
  72. package/dist/_chunks/number-input-DjWzmlEY.js.map +0 -1
@@ -3,8 +3,8 @@ 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-BP_W6VtE.js";
7
- import { N as D } from "./number-input-DjWzmlEY.js";
6
+ import { D as z } from "./date-picker-ZHejTVAJ.js";
7
+ import { N as D } from "./number-input-DrozbZAU.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";
@@ -249,4 +249,4 @@ export {
249
249
  U as L,
250
250
  O as p
251
251
  };
252
- //# sourceMappingURL=cycle-calculator-DNvvr0bP.js.map
252
+ //# sourceMappingURL=cycle-calculator-BwqYVPB4.js.map
@@ -1 +1 @@
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]}
1
+ {"version":3,"file":"cycle-calculator-BwqYVPB4.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,16 +1,16 @@
1
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";
2
+ import { forwardRef as se, useContext as ie, useState as y, useRef as K, useEffect as oe, useCallback as R, useMemo as le, useImperativeHandle as de } from "react";
3
+ import { useTranslation as ce } from "react-i18next";
4
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 = {
5
+ import { u as pe } from "./use-controllable-state-BiY4xTzM.js";
6
+ import { u as ue, F as fe } from "./form-field-context-B3APVHKx.js";
7
+ import { u as me } from "./registry-DvAUVLHh.js";
8
+ import { u as he, g as ge, f as T, b as ve, c as ye, i as ke, t as be, d as Ce, p as De, D as Pe, C as Se, e as xe, h as we, j as Ie } from "./date-picker-variants-eL6HjWvw.js";
9
+ import { C as Oe } from "./calendar-days-BGWklvE-.js";
10
+ import { C as Ne } from "./check-DrFSN__t.js";
11
+ import { p as Ve } from "./parse-DvA97ro9.js";
12
+ import { i as Fe } from "./isSameDay-DUEiAT0G.js";
13
+ const Ae = {
14
14
  id: "date-picker",
15
15
  // Persisted single date (value state + set_date) → select_single + set_value,
16
16
  // plus open/close of the calendar popover.
@@ -21,8 +21,8 @@ const Ie = {
21
21
  descriptionKey: "ui.agent.datePicker.state.value",
22
22
  description: "Currently-selected ISO date, or null.",
23
23
  read: (a) => {
24
- var c;
25
- return ((c = a.getValue()) == null ? void 0 : c.toISOString()) ?? null;
24
+ var d;
25
+ return ((d = a.getValue()) == null ? void 0 : d.toISOString()) ?? null;
26
26
  }
27
27
  },
28
28
  isOpen: {
@@ -51,8 +51,8 @@ const Ie = {
51
51
  descriptionKey: "ui.agent.datePicker.actions.setDate",
52
52
  description: "Select a specific date (ISO yyyy-mm-dd).",
53
53
  examples: [{ args: { date: "2026-06-23" }, note: "Select 23 Jun 2026." }],
54
- invoke: (a, c) => {
55
- a.setValue(new Date(c.date));
54
+ invoke: (a, d) => {
55
+ a.setValue(new Date(d.date));
56
56
  }
57
57
  },
58
58
  clear: {
@@ -96,64 +96,66 @@ const Ie = {
96
96
  description: "Sourced from the id prop."
97
97
  }
98
98
  }
99
- }, Oe = ae(
99
+ }, Ke = se(
100
100
  ({
101
101
  value: a,
102
- defaultValue: c,
103
- onChange: F,
102
+ defaultValue: d,
103
+ onChange: M,
104
104
  minDate: m,
105
105
  maxDate: h,
106
- disabledDates: l,
107
- weekStartsOn: M,
106
+ disabledDates: c,
107
+ weekStartsOn: j,
108
108
  presets: b,
109
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({
110
+ disabled: q,
111
+ placeholder: B,
112
+ className: E,
113
+ id: L,
114
+ "aria-label": _,
115
+ "aria-labelledby": H
116
+ }, W) => {
117
+ const { t: w, i18n: I } = ce(), p = ue(), O = ie(fe) !== null, C = L ?? p.id, N = p.disabled || q, J = p.invalid ? "error" : "default", u = he(I.language), f = ge(I.language), z = B ?? w("inputs.datePicker.placeholder", "Select date"), [G, V] = pe({
116
118
  value: a,
117
- defaultValue: c,
118
- onChange: F
119
- }), n = W, [i, s] = y(!1), [J, D] = y(
119
+ defaultValue: d,
120
+ onChange: M
121
+ }), n = G, [i, s] = y(!1), [Q, D] = y(
120
122
  n ? T(n, f, { locale: u }) : ""
121
- ), [V, g] = y(!1), [z, P] = y(n ?? /* @__PURE__ */ new Date()), S = K(null);
122
- re(() => {
123
+ ), [F, g] = y(!1), [U, P] = y(n ?? /* @__PURE__ */ new Date()), S = K(null);
124
+ oe(() => {
123
125
  n ? (D(T(n, f, { locale: u })), g(!1)) : D("");
124
126
  }, [n, f, u]);
125
- const G = ue(
127
+ const X = ve(
126
128
  m,
127
129
  h,
128
- l
129
- ), Q = R(
130
- (e) => m && fe(e, m) || h && me(e, h) ? !0 : Array.isArray(l) ? l.some(
130
+ c
131
+ ), Y = R(
132
+ (e) => m && ye(e, m) || h && ke(e, h) ? !0 : Array.isArray(c) ? c.some(
131
133
  (t) => t.toDateString() === e.toDateString()
132
- ) : typeof l == "function" ? l(e) : !1,
133
- [m, h, l]
134
+ ) : typeof c == "function" ? c(e) : !1,
135
+ [m, h, c]
134
136
  ), o = R(
135
137
  (e) => {
136
- N(e);
138
+ V(e);
137
139
  },
138
- [N]
139
- ), U = (e) => {
140
+ [V]
141
+ ), Z = (e) => {
140
142
  const t = e.target.value;
141
143
  if (D(t), t.length === 0) {
142
144
  g(!1), o(void 0);
143
145
  return;
144
146
  }
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) => {
147
+ const l = Ve(t, f, /* @__PURE__ */ new Date(), { locale: u });
148
+ Ie(l) && !Y(l) ? (g(!1), o(l), P(l)) : t.length === f.length && g(!0);
149
+ }, $ = (e) => {
148
150
  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) => {
151
+ }, ee = (e) => {
150
152
  var t;
151
153
  e && (o(e), s(!1), (t = S.current) == null || t.focus());
152
- }, Z = (e) => {
153
- var d;
154
+ }, te = (e) => {
155
+ var l;
154
156
  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
+ o(t), P(t), s(!1), (l = S.current) == null || l.focus();
158
+ }, ae = (e) => n ? Fe(e.date(), n) : !1, re = w("inputs.datePicker.gridLabel", "Calendar"), ne = le(
157
159
  () => ({
158
160
  getValue: () => n,
159
161
  setValue: (e) => o(e),
@@ -164,64 +166,66 @@ const Ie = {
164
166
  }),
165
167
  [n, o, i]
166
168
  ), A = K(null);
167
- return se(L, () => A.current, []), ce(Ie, te, C), /* @__PURE__ */ r(k.Root, { open: i, onOpenChange: s, children: /* @__PURE__ */ v(
169
+ return de(W, () => A.current, []), me(Ae, ne, C), /* @__PURE__ */ r(k.Root, { open: i, onOpenChange: s, children: /* @__PURE__ */ v(
168
170
  "div",
169
171
  {
170
172
  ref: A,
171
- className: B,
173
+ className: E,
172
174
  "data-component": "date-picker",
173
175
  "data-component-id": C,
174
176
  children: [
175
177
  /* @__PURE__ */ v("div", { className: "ds:relative", children: [
176
- /* @__PURE__ */ r(k.Trigger, { asChild: !0, disabled: O, children: /* @__PURE__ */ r(
178
+ /* @__PURE__ */ r(k.Trigger, { asChild: !0, disabled: N, children: /* @__PURE__ */ r(
177
179
  "input",
178
180
  {
179
181
  ref: S,
180
182
  id: C,
181
183
  type: "text",
182
184
  role: "combobox",
183
- value: J,
184
- placeholder: H,
185
- disabled: O,
185
+ value: Q,
186
+ placeholder: z,
187
+ disabled: N,
188
+ "aria-label": O ? void 0 : _,
189
+ "aria-labelledby": O ? void 0 : H,
186
190
  "aria-describedby": p.describedBy || void 0,
187
- "aria-invalid": p.invalid || V || void 0,
191
+ "aria-invalid": p.invalid || F || void 0,
188
192
  "aria-required": p.required || void 0,
189
193
  "aria-haspopup": "dialog",
190
194
  "aria-expanded": i,
191
- onChange: U,
192
- onKeyDown: X,
195
+ onChange: Z,
196
+ onKeyDown: $,
193
197
  onClick: () => !i && s(!0),
194
- className: he({
198
+ className: be({
195
199
  size: x,
196
- tone: V ? "error" : _
200
+ tone: F ? "error" : J
197
201
  })
198
202
  }
199
203
  ) }),
200
- /* @__PURE__ */ r("span", { "aria-hidden": "true", className: ge({ size: x }), children: /* @__PURE__ */ r(Pe, {}) })
204
+ /* @__PURE__ */ r("span", { "aria-hidden": "true", className: Ce({ size: x }), children: /* @__PURE__ */ r(Oe, {}) })
201
205
  ] }),
202
206
  /* @__PURE__ */ r(k.Portal, { children: /* @__PURE__ */ r(
203
207
  k.Content,
204
208
  {
205
209
  sideOffset: 4,
206
210
  align: "start",
207
- className: Ce(),
211
+ className: we(),
208
212
  onOpenAutoFocus: (e) => {
209
213
  e.preventDefault();
210
214
  },
211
215
  children: /* @__PURE__ */ v("div", { className: "ds:flex ds:gap-[var(--spacing-md)]", children: [
212
216
  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);
217
+ const t = ae(e);
214
218
  return /* @__PURE__ */ v(
215
219
  "button",
216
220
  {
217
221
  type: "button",
218
222
  "aria-pressed": t,
219
- onClick: () => Z(e),
220
- className: ve({ active: t }),
223
+ onClick: () => te(e),
224
+ className: De({ active: t }),
221
225
  children: [
222
226
  /* @__PURE__ */ r("span", { className: "ds:min-w-0 ds:truncate", children: e.label }),
223
227
  t ? /* @__PURE__ */ r(
224
- Se,
228
+ Ne,
225
229
  {
226
230
  "aria-hidden": "true",
227
231
  className: "ds:size-4 ds:shrink-0 ds:text-primary"
@@ -232,21 +236,21 @@ const Ie = {
232
236
  e.label
233
237
  );
234
238
  }) }) : null,
235
- /* @__PURE__ */ r("div", { role: "region", "aria-label": ee, children: /* @__PURE__ */ r(
236
- ye,
239
+ /* @__PURE__ */ r("div", { role: "region", "aria-label": re, children: /* @__PURE__ */ r(
240
+ Pe,
237
241
  {
238
242
  mode: "single",
239
243
  selected: n,
240
- onSelect: Y,
241
- month: z,
244
+ onSelect: ee,
245
+ month: U,
242
246
  onMonthChange: P,
243
- disabled: G,
244
- weekStartsOn: M,
247
+ disabled: X,
248
+ weekStartsOn: j,
245
249
  locale: u,
246
250
  showOutsideDays: !0,
247
251
  fixedWeeks: !0,
248
- classNames: be,
249
- components: { Chevron: ke }
252
+ classNames: xe,
253
+ components: { Chevron: Se }
250
254
  }
251
255
  ) })
252
256
  ] })
@@ -257,9 +261,9 @@ const Ie = {
257
261
  ) });
258
262
  }
259
263
  );
260
- Oe.displayName = "DatePicker";
264
+ Ke.displayName = "DatePicker";
261
265
  export {
262
- Oe as D,
263
- Ie as d
266
+ Ke as D,
267
+ Ae as d
264
268
  };
265
- //# sourceMappingURL=date-picker-BP_W6VtE.js.map
269
+ //# sourceMappingURL=date-picker-ZHejTVAJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-picker-ZHejTVAJ.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 useContext,\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 {\n FormFieldContext,\n useFormField,\n} 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 /** Accessible name for the date input, when the picker is NOT wrapped in a\n * `FormField`. Without one — and without a FormField's `<label htmlFor>` —\n * the input has no accessible name at all, so a picker placed inline beside\n * chips or in a toolbar was unnamed to a screen reader. Ignored in favour of\n * the FormField label when both are present. */\n 'aria-label'?: string;\n /** Accessible name by reference, same conditions as `aria-label`. */\n 'aria-labelledby'?: 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 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const ctx = useFormField();\n // A FormField labels the input through `<label htmlFor>`; outside one the\n // caller's aria-label is the only name available.\n const inFormField = useContext(FormFieldContext) !== null;\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 // A FormField labels the input through `<label htmlFor>`, so\n // its label wins and these stay off. Outside one they are the\n // only name the input can have.\n aria-label={inFormField ? undefined : ariaLabel}\n aria-labelledby={inFormField ? undefined : ariaLabelledBy}\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","ariaLabel","ariaLabelledBy","ref","t","i18n","useTranslation","ctx","useFormField","inFormField","useContext","FormFieldContext","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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"}
@@ -5,8 +5,8 @@ import { useTranslation as W } from "react-i18next";
5
5
  import { R as m } from "./radio-TWf9Q-mp.js";
6
6
  import { R as T } from "./radio-group-CI-6SmSw.js";
7
7
  import { F as g } from "./form-field-M5UpX65Z.js";
8
- import { D as b } from "./date-picker-BP_W6VtE.js";
9
- import { N as S } from "./number-input-DjWzmlEY.js";
8
+ import { D as b } from "./date-picker-ZHejTVAJ.js";
9
+ import { N as S } from "./number-input-DrozbZAU.js";
10
10
  import { C as k } from "./card-DPmk26CL.js";
11
11
  import { B } from "./badge-DCOqV9mI.js";
12
12
  import { I as X } from "./insert-result-D074GtHX.js";
@@ -253,4 +253,4 @@ ce.displayName = "DueDateCalculator";
253
253
  export {
254
254
  ce as D
255
255
  };
256
- //# sourceMappingURL=due-date-calculator-BEcdoy_E.js.map
256
+ //# sourceMappingURL=due-date-calculator-CwfsFd3T.js.map