@alfadocs/ui-kit-debug 0.44.0 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/dist/_chunks/{alia-sidebar-BpX4z_af.js → alia-sidebar-Be8FhKYd.js} +332 -237
  2. package/dist/_chunks/alia-sidebar-Be8FhKYd.js.map +1 -0
  3. package/dist/_chunks/{autocomplete-DIgdhCGJ.js → autocomplete-CDqxB68B.js} +2 -2
  4. package/dist/_chunks/{autocomplete-DIgdhCGJ.js.map → autocomplete-CDqxB68B.js.map} +1 -1
  5. package/dist/_chunks/bmi-calculator-CQqXTVNL.js +258 -0
  6. package/dist/_chunks/bmi-calculator-CQqXTVNL.js.map +1 -0
  7. package/dist/_chunks/{booking-CtLwaxkK.js → booking-DlDVuWMd.js} +2 -2
  8. package/dist/_chunks/{booking-CtLwaxkK.js.map → booking-DlDVuWMd.js.map} +1 -1
  9. package/dist/_chunks/{cycle-calculator-ChHBcjet.js → cycle-calculator-KxA8dqDf.js} +31 -20
  10. package/dist/_chunks/cycle-calculator-KxA8dqDf.js.map +1 -0
  11. package/dist/_chunks/{due-date-calculator-CYXKLoof.js → due-date-calculator-mFxpHLml.js} +51 -39
  12. package/dist/_chunks/due-date-calculator-mFxpHLml.js.map +1 -0
  13. package/dist/_chunks/{editable-currency-cell-renderer-9jqwDv5x.js → editable-currency-cell-renderer-BEBUQl9P.js} +2 -2
  14. package/dist/_chunks/{editable-currency-cell-renderer-9jqwDv5x.js.map → editable-currency-cell-renderer-BEBUQl9P.js.map} +1 -1
  15. package/dist/_chunks/{freemium-paywall-BLXESpH4.js → freemium-paywall-BYist2sJ.js} +2 -2
  16. package/dist/_chunks/{freemium-paywall-BLXESpH4.js.map → freemium-paywall-BYist2sJ.js.map} +1 -1
  17. package/dist/_chunks/{gestational-age-calculator-sRmoqgVr.js → gestational-age-calculator-gWI_uRA1.js} +52 -39
  18. package/dist/_chunks/gestational-age-calculator-gWI_uRA1.js.map +1 -0
  19. package/dist/_chunks/insert-result-C5ABnzDl.js +711 -0
  20. package/dist/_chunks/insert-result-C5ABnzDl.js.map +1 -0
  21. package/dist/_chunks/{marketplace-app-shell-Dc5cTIt8.js → marketplace-app-shell-Gfsf78ge.js} +2 -2
  22. package/dist/_chunks/{marketplace-app-shell-Dc5cTIt8.js.map → marketplace-app-shell-Gfsf78ge.js.map} +1 -1
  23. package/dist/_chunks/{patient-search-DPe2ZYEL.js → patient-search-CocVcGJ3.js} +2 -2
  24. package/dist/_chunks/{patient-search-DPe2ZYEL.js.map → patient-search-CocVcGJ3.js.map} +1 -1
  25. package/dist/_chunks/{payment-form-BzVsG6Ks.js → payment-form-DqEiEJRO.js} +247 -195
  26. package/dist/_chunks/payment-form-DqEiEJRO.js.map +1 -0
  27. package/dist/_chunks/{pdf-viewer-B6MC6VTx.js → pdf-viewer-CWEXTlwq.js} +2 -2
  28. package/dist/_chunks/{pdf-viewer-B6MC6VTx.js.map → pdf-viewer-CWEXTlwq.js.map} +1 -1
  29. package/dist/_chunks/{practice-results-CrLpEiiW.js → practice-results-DDi-kvaD.js} +2 -2
  30. package/dist/_chunks/{practice-results-CrLpEiiW.js.map → practice-results-DDi-kvaD.js.map} +1 -1
  31. package/dist/_chunks/{pregnancy-weight-gain-C5YhfYnL.js → pregnancy-weight-gain-BtEHaSqy.js} +26 -13
  32. package/dist/_chunks/pregnancy-weight-gain-BtEHaSqy.js.map +1 -0
  33. package/dist/_chunks/{search-bar-CP6wUJFY.js → search-bar-CvN_S0jW.js} +2 -2
  34. package/dist/_chunks/{search-bar-CP6wUJFY.js.map → search-bar-CvN_S0jW.js.map} +1 -1
  35. package/dist/_chunks/{search-input-C1C3jQpD.js → search-input-D3aMvi4l.js} +2 -2
  36. package/dist/_chunks/{search-input-C1C3jQpD.js.map → search-input-D3aMvi4l.js.map} +1 -1
  37. package/dist/_chunks/{sign-document-B-3k_0LO.js → sign-document-BCyLpFHJ.js} +2 -2
  38. package/dist/_chunks/{sign-document-B-3k_0LO.js.map → sign-document-BCyLpFHJ.js.map} +1 -1
  39. package/dist/_chunks/{sign-in-with-alfadocs-button-DeHBFRNS.js → sign-in-with-alfadocs-button-CuYn_kKP.js} +2 -2
  40. package/dist/_chunks/{sign-in-with-alfadocs-button-DeHBFRNS.js.map → sign-in-with-alfadocs-button-CuYn_kKP.js.map} +1 -1
  41. package/dist/_chunks/{social-sign-in-button-X54ySJr1.js → social-sign-in-button-uJYLM366.js} +2 -2
  42. package/dist/_chunks/{social-sign-in-button-X54ySJr1.js.map → social-sign-in-button-uJYLM366.js.map} +1 -1
  43. package/dist/_chunks/{spinner-CCByyvcb.js → spinner-OjQNn8oN.js} +7 -3
  44. package/dist/_chunks/spinner-OjQNn8oN.js.map +1 -0
  45. package/dist/_chunks/{transcript-panel-CR7VY1uw.js → transcript-panel-B4HiC7ed.js} +2 -2
  46. package/dist/_chunks/{transcript-panel-CR7VY1uw.js.map → transcript-panel-B4HiC7ed.js.map} +1 -1
  47. package/dist/_chunks/{unit-converter-Ds9jalbN.js → unit-converter-u3CwNDpP.js} +63 -52
  48. package/dist/_chunks/unit-converter-u3CwNDpP.js.map +1 -0
  49. package/dist/_chunks/{wallet-pay-button-DK4ESYge.js → wallet-pay-button-DuDPBlCO.js} +2 -2
  50. package/dist/_chunks/{wallet-pay-button-DK4ESYge.js.map → wallet-pay-button-DuDPBlCO.js.map} +1 -1
  51. package/dist/agent-catalog.json +1 -1
  52. package/dist/components/_shared/banded-gauge.d.ts +193 -0
  53. package/dist/components/_shared/banded-gauge.d.ts.map +1 -0
  54. package/dist/components/_shared/insert-result.d.ts +81 -8
  55. package/dist/components/_shared/insert-result.d.ts.map +1 -1
  56. package/dist/components/autocomplete/index.js +1 -1
  57. package/dist/components/bmi-calculator/bmi-calculator.d.ts +2 -2
  58. package/dist/components/bmi-calculator/bmi-calculator.d.ts.map +1 -1
  59. package/dist/components/bmi-calculator/index.js +1 -1
  60. package/dist/components/booking/index.js +1 -1
  61. package/dist/components/cycle-calculator/cycle-calculator.d.ts +2 -2
  62. package/dist/components/cycle-calculator/cycle-calculator.d.ts.map +1 -1
  63. package/dist/components/cycle-calculator/index.js +1 -1
  64. package/dist/components/data-table/index.js +1 -1
  65. package/dist/components/due-date-calculator/due-date-calculator.d.ts +2 -2
  66. package/dist/components/due-date-calculator/due-date-calculator.d.ts.map +1 -1
  67. package/dist/components/due-date-calculator/index.js +1 -1
  68. package/dist/components/freemium-paywall/index.js +1 -1
  69. package/dist/components/gestational-age-calculator/gestational-age-calculator.d.ts +2 -2
  70. package/dist/components/gestational-age-calculator/gestational-age-calculator.d.ts.map +1 -1
  71. package/dist/components/gestational-age-calculator/index.js +1 -1
  72. package/dist/components/patient-search/index.js +1 -1
  73. package/dist/components/payment-form/index.js +1 -1
  74. package/dist/components/payment-form/payment-form.d.ts +24 -2
  75. package/dist/components/payment-form/payment-form.d.ts.map +1 -1
  76. package/dist/components/pdf-viewer/index.js +1 -1
  77. package/dist/components/practice-results/index.js +1 -1
  78. package/dist/components/pregnancy-weight-gain/index.js +1 -1
  79. package/dist/components/pregnancy-weight-gain/pregnancy-weight-gain.d.ts +2 -2
  80. package/dist/components/pregnancy-weight-gain/pregnancy-weight-gain.d.ts.map +1 -1
  81. package/dist/components/search-bar/index.js +1 -1
  82. package/dist/components/search-input/index.js +1 -1
  83. package/dist/components/sign-document/index.js +1 -1
  84. package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
  85. package/dist/components/social-sign-in-button/index.js +1 -1
  86. package/dist/components/spinner/index.js +1 -1
  87. package/dist/components/spinner/spinner.d.ts +2 -2
  88. package/dist/components/spinner/spinner.d.ts.map +1 -1
  89. package/dist/components/transcript-panel/index.js +1 -1
  90. package/dist/components/unit-converter/index.js +1 -1
  91. package/dist/components/unit-converter/unit-converter.d.ts +2 -2
  92. package/dist/components/unit-converter/unit-converter.d.ts.map +1 -1
  93. package/dist/components/wallet-pay-button/index.js +1 -1
  94. package/dist/i18n/locales/ar.d.ts +1 -1
  95. package/dist/i18n/locales/ar.js +1 -1
  96. package/dist/i18n/locales/ar.js.map +1 -1
  97. package/dist/i18n/locales/de.d.ts +1 -1
  98. package/dist/i18n/locales/de.js +1 -1
  99. package/dist/i18n/locales/de.js.map +1 -1
  100. package/dist/i18n/locales/el.d.ts +1 -1
  101. package/dist/i18n/locales/el.js +1 -1
  102. package/dist/i18n/locales/el.js.map +1 -1
  103. package/dist/i18n/locales/en.d.ts +1 -1
  104. package/dist/i18n/locales/en.js +1 -1
  105. package/dist/i18n/locales/en.js.map +1 -1
  106. package/dist/i18n/locales/es.d.ts +1 -1
  107. package/dist/i18n/locales/es.js +1 -1
  108. package/dist/i18n/locales/es.js.map +1 -1
  109. package/dist/i18n/locales/fr.d.ts +1 -1
  110. package/dist/i18n/locales/fr.js +1 -1
  111. package/dist/i18n/locales/fr.js.map +1 -1
  112. package/dist/i18n/locales/hi.d.ts +1 -1
  113. package/dist/i18n/locales/hi.js +1 -1
  114. package/dist/i18n/locales/hi.js.map +1 -1
  115. package/dist/i18n/locales/it.d.ts +1 -1
  116. package/dist/i18n/locales/it.js +1 -1
  117. package/dist/i18n/locales/it.js.map +1 -1
  118. package/dist/i18n/locales/ja.d.ts +1 -1
  119. package/dist/i18n/locales/ja.js +1 -1
  120. package/dist/i18n/locales/ja.js.map +1 -1
  121. package/dist/i18n/locales/nl.d.ts +1 -1
  122. package/dist/i18n/locales/nl.js +1 -1
  123. package/dist/i18n/locales/nl.js.map +1 -1
  124. package/dist/i18n/locales/pl.d.ts +1 -1
  125. package/dist/i18n/locales/pl.js +1 -1
  126. package/dist/i18n/locales/pl.js.map +1 -1
  127. package/dist/i18n/locales/pt.d.ts +1 -1
  128. package/dist/i18n/locales/pt.js +1 -1
  129. package/dist/i18n/locales/pt.js.map +1 -1
  130. package/dist/i18n/locales/ro.d.ts +1 -1
  131. package/dist/i18n/locales/ro.js +1 -1
  132. package/dist/i18n/locales/ro.js.map +1 -1
  133. package/dist/i18n/locales/ru.d.ts +1 -1
  134. package/dist/i18n/locales/ru.js +1 -1
  135. package/dist/i18n/locales/ru.js.map +1 -1
  136. package/dist/i18n/locales/sq.d.ts +1 -1
  137. package/dist/i18n/locales/sq.js +1 -1
  138. package/dist/i18n/locales/sq.js.map +1 -1
  139. package/dist/i18n/locales/sv.d.ts +1 -1
  140. package/dist/i18n/locales/sv.js +1 -1
  141. package/dist/i18n/locales/sv.js.map +1 -1
  142. package/dist/i18n/locales/tr.d.ts +1 -1
  143. package/dist/i18n/locales/tr.js +1 -1
  144. package/dist/i18n/locales/tr.js.map +1 -1
  145. package/dist/i18n/locales/zh.d.ts +1 -1
  146. package/dist/i18n/locales/zh.js +1 -1
  147. package/dist/i18n/locales/zh.js.map +1 -1
  148. package/dist/index.js +25 -25
  149. package/dist/locales/ar.json +1 -1
  150. package/dist/locales/de.json +1 -1
  151. package/dist/locales/el.json +1 -1
  152. package/dist/locales/en.json +1 -1
  153. package/dist/locales/es.json +1 -1
  154. package/dist/locales/fr.json +1 -1
  155. package/dist/locales/hi.json +1 -1
  156. package/dist/locales/it.json +1 -1
  157. package/dist/locales/ja.json +1 -1
  158. package/dist/locales/nl.json +1 -1
  159. package/dist/locales/pl.json +1 -1
  160. package/dist/locales/pt.json +1 -1
  161. package/dist/locales/ro.json +1 -1
  162. package/dist/locales/ru.json +1 -1
  163. package/dist/locales/sq.json +1 -1
  164. package/dist/locales/sv.json +1 -1
  165. package/dist/locales/tr.json +1 -1
  166. package/dist/locales/zh.json +1 -1
  167. package/dist/patterns/alia-assistant/alia-chat-surface.d.ts.map +1 -1
  168. package/dist/patterns/alia-assistant/alia-types.d.ts +20 -0
  169. package/dist/patterns/alia-assistant/alia-types.d.ts.map +1 -1
  170. package/dist/patterns/alia-assistant/index.js +1 -1
  171. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  172. package/dist/tokens.css +1 -1
  173. package/package.json +1 -1
  174. package/dist/_chunks/alia-sidebar-BpX4z_af.js.map +0 -1
  175. package/dist/_chunks/bmi-calculator-DFPWL2OJ.js +0 -273
  176. package/dist/_chunks/bmi-calculator-DFPWL2OJ.js.map +0 -1
  177. package/dist/_chunks/cycle-calculator-ChHBcjet.js.map +0 -1
  178. package/dist/_chunks/due-date-calculator-CYXKLoof.js.map +0 -1
  179. package/dist/_chunks/gestational-age-calculator-sRmoqgVr.js.map +0 -1
  180. package/dist/_chunks/insert-result-CoC1oo6R.js +0 -334
  181. package/dist/_chunks/insert-result-CoC1oo6R.js.map +0 -1
  182. package/dist/_chunks/payment-form-BzVsG6Ks.js.map +0 -1
  183. package/dist/_chunks/pregnancy-weight-gain-C5YhfYnL.js.map +0 -1
  184. package/dist/_chunks/spinner-CCByyvcb.js.map +0 -1
  185. package/dist/_chunks/unit-converter-Ds9jalbN.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"gestational-age-calculator-sRmoqgVr.js","sources":["../../src/components/gestational-age-calculator/gestational-age-calculator.tsx"],"sourcesContent":["/* ------------------------------------------------------------------ */\n/* GestationalAgeCalculator — current gestational age, trimester and */\n/* milestone dates, from either a known LMP or a known due date. */\n/* */\n/* Reuses the shared `gestation` maths from due-date-calculator: GA day */\n/* 0 is the LMP; from an EDD we back out LMP = EDD − 280 days. */\n/* ------------------------------------------------------------------ */\n\nimport { forwardRef, useEffect, useMemo, useState } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { subDays, isAfter } from 'date-fns';\nimport { RadioGroup, Radio } from '../radio-group';\nimport { FormField } from '../form-field';\nimport { DatePicker } from '../date-picker';\nimport { Card } from '../card';\nimport { Badge } from '../badge';\nimport {\n InsertButton,\n type InsertPayload,\n type InsertVariant,\n type InsertMode,\n} from '../_shared/insert-result';\nimport {\n type Trimester,\n type GestationalAge,\n computeDueDate,\n gestationalMilestones,\n GESTATION_DAYS,\n} from '../due-date-calculator';\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\nconst TRIMESTER_BADGE: Record<\n Trimester,\n 'neutral' | 'info' | 'success' | 'warning' | 'error'\n> = {\n preconception: 'neutral',\n first: 'info',\n second: 'success',\n third: 'warning',\n postterm: 'error',\n};\n\n/**\n * DS token NAME backing each trimester's result-card chip — the solid-fill\n * companion of the on-screen `TRIMESTER_BADGE` variant (Badge `error` fills\n * `--destructive`; `neutral` fills `--muted`). Passed as the card's\n * `highlightToken` so the inserted PNG chip matches the on-screen trimester\n * badge; `InsertButton` resolves the name to a concrete colour at raster time.\n */\nconst TRIMESTER_HIGHLIGHT_TOKEN: Record<Trimester, string> = {\n preconception: '--muted',\n first: '--info',\n second: '--success',\n third: '--warning',\n postterm: '--destructive',\n};\n\ntype DateMethod = 'lmp' | 'edd';\n\nexport interface GestationalAgeResult {\n gestationalAge: GestationalAge | null;\n trimester: Trimester;\n dueDate: Date;\n}\n\nexport interface GestationalAgeCalculatorProps extends VariantProps<\n typeof rootVariants\n> {\n /** Whether the input date is the last period (`lmp`) or the due date (`edd`). */\n defaultMethod?: DateMethod;\n /** Fires whenever a result can be computed (and `null` when it can't). */\n onResultChange?: (result: GestationalAgeResult | null) => void;\n /** When provided, shows the result-action buttons that emit / copy the result. */\n onInsert?: (payload: InsertPayload) => void;\n /**\n * Which verb the result button performs. Defaults to `'insert'`.\n * Use `'copy'` in an app-shell surface (no editor to insert into) — the\n * button writes the result to the clipboard as a multi-format `ClipboardItem`.\n */\n insertVariant?: InsertVariant;\n /** `copy` variant only — fired after a successful clipboard write. */\n onCopy?: (mode: InsertMode) => void;\n /** `copy` variant only — fired if the clipboard write can't proceed. */\n onError?: (error: unknown) => void;\n /**\n * Brand wordmark printed in the inserted/copied result-card footer.\n * Omitted → the default `'AlfaDocs'` wordmark; a string overrides it;\n * `false` removes the brand line.\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 GestationalAgeCalculator = forwardRef<\n HTMLDivElement,\n GestationalAgeCalculatorProps\n>(\n (\n {\n defaultMethod = 'lmp',\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 [method, setMethod] = useState<DateMethod>(defaultMethod);\n const [refDate, setRefDate] = useState<Date | undefined>(undefined);\n\n const today = useMemo(() => new Date(), []);\n\n const data = useMemo(() => {\n if (!refDate) return null;\n // Normalise to an LMP, then reuse the shared gestation maths.\n const lmp = method === 'lmp' ? refDate : subDays(refDate, GESTATION_DAYS);\n const r = computeDueDate({ method: 'lmp', date: lmp }, today);\n return {\n result: {\n gestationalAge: r.gestationalAge,\n trimester: r.trimester,\n dueDate: r.dueDate,\n } satisfies GestationalAgeResult,\n milestones: gestationalMilestones(r.gestationalStart),\n };\n }, [method, refDate, today]);\n\n const dateFormatter = useMemo(\n () => new Intl.DateTimeFormat(i18n.language, { dateStyle: 'medium' }),\n [i18n.language],\n );\n\n useEffect(() => {\n onResultChange?.(data?.result ?? null);\n }, [data, onResultChange]);\n\n const gaText = (ga: GestationalAge | null): string =>\n ga\n ? t('gestationalAgeCalculator.gestation', {\n weeks: ga.weeks,\n days: ga.days,\n })\n : '—';\n\n return (\n <div\n ref={ref}\n data-component=\"gestational-age-calculator\"\n data-component-id={id}\n className={rootVariants({ width, className })}\n >\n <RadioGroup\n label={t('gestationalAgeCalculator.method.label')}\n variant=\"horizontal\"\n value={method}\n onValueChange={(next) => setMethod(next as DateMethod)}\n >\n <Radio label={t('gestationalAgeCalculator.method.lmp')} value=\"lmp\" />\n <Radio label={t('gestationalAgeCalculator.method.edd')} value=\"edd\" />\n </RadioGroup>\n\n <FormField\n label={t(\n method === 'lmp'\n ? 'gestationalAgeCalculator.lmpDate'\n : 'gestationalAgeCalculator.eddDate',\n )}\n >\n <DatePicker\n value={refDate}\n onChange={setRefDate}\n maxDate={method === 'lmp' ? today : undefined}\n />\n </FormField>\n\n <p className=\"ds:sr-only\" role=\"status\" aria-live=\"polite\">\n {data\n ? `${t('gestationalAgeCalculator.gestationLabel')}: ${gaText(\n data.result.gestationalAge,\n )}. ${t('gestationalAgeCalculator.trimesterLabel')}: ${t(\n `gestationalAgeCalculator.trimester.${data.result.trimester}`,\n )}.`\n : ''}\n </p>\n\n {data ? (\n <Card variant=\"elevated\">\n <Card.Body className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <dl className=\"ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-md)] ds:sm:grid-cols-2\">\n <div className=\"ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-xs)]\">\n <dt className=\"type-label ds:text-muted-foreground\">\n {t('gestationalAgeCalculator.trimesterLabel')}\n </dt>\n <dd>\n <Badge\n variant={TRIMESTER_BADGE[data.result.trimester]}\n size=\"lg\"\n >\n {t(\n `gestationalAgeCalculator.trimester.${data.result.trimester}`,\n )}\n </Badge>\n </dd>\n </div>\n <div className=\"ds:flex ds:flex-col ds:items-end ds:gap-[var(--spacing-xs)] ds:text-end\">\n <dt className=\"type-label ds:text-muted-foreground\">\n {t('gestationalAgeCalculator.gestationLabel')}\n </dt>\n <dd className=\"type-metric ds:text-foreground\">\n {gaText(data.result.gestationalAge)}\n </dd>\n </div>\n </dl>\n\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <span className=\"type-label ds:text-muted-foreground\">\n {t('gestationalAgeCalculator.milestonesLabel')}\n </span>\n <ul className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n {data.milestones.map((m) => {\n const reached = isAfter(today, m.date);\n return (\n <li\n key={m.key}\n className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-md)]\"\n >\n <span className=\"type-body ds:text-foreground\">\n {t(`gestationalAgeCalculator.milestone.${m.key}`)}\n </span>\n <span className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <span className=\"type-body ds:text-muted-foreground\">\n {dateFormatter.format(m.date)}\n </span>\n {reached ? (\n <Badge variant=\"success\">\n {t('gestationalAgeCalculator.reached')}\n </Badge>\n ) : null}\n </span>\n </li>\n );\n })}\n </ul>\n </div>\n {insertVariant === 'copy' || onInsert ? (\n <InsertButton\n onInsert={onInsert}\n variant={insertVariant}\n onCopy={onCopy}\n onError={onError}\n card={{\n title: t('insert.title.gestationalAge'),\n highlight: t(\n `gestationalAgeCalculator.trimester.${data.result.trimester}`,\n ),\n // Chip shares the trimester's semantic token so the\n // inserted PNG chip matches the on-screen trimester badge.\n highlightToken:\n TRIMESTER_HIGHLIGHT_TOKEN[data.result.trimester],\n brand: insertBrand,\n fields: [\n {\n label: t('gestationalAgeCalculator.gestationLabel'),\n value: gaText(data.result.gestationalAge),\n },\n {\n label: t('gestationalAgeCalculator.trimesterLabel'),\n value: t(\n `gestationalAgeCalculator.trimester.${data.result.trimester}`,\n ),\n },\n ],\n }}\n />\n ) : null}\n </Card.Body>\n </Card>\n ) : (\n <p className=\"type-body ds:text-muted-foreground\">\n {t('gestationalAgeCalculator.empty')}\n </p>\n )}\n </div>\n );\n },\n);\n\nGestationalAgeCalculator.displayName = 'GestationalAgeCalculator';\n"],"names":["rootVariants","cva","TRIMESTER_BADGE","TRIMESTER_HIGHLIGHT_TOKEN","GestationalAgeCalculator","forwardRef","defaultMethod","onResultChange","onInsert","insertVariant","onCopy","onError","insertBrand","id","width","className","ref","t","i18n","useTranslation","method","setMethod","useState","refDate","setRefDate","today","useMemo","data","lmp","subDays","GESTATION_DAYS","computeDueDate","gestationalMilestones","dateFormatter","useEffect","gaText","ga","jsxs","RadioGroup","next","jsx","Radio","FormField","DatePicker","Card","Badge","m","reached","isAfter","InsertButton"],"mappings":"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"}
@@ -1,334 +0,0 @@
1
- import { jsxs as E, jsx as p } from "react/jsx-runtime";
2
- import { forwardRef as J, useRef as Q } from "react";
3
- import { useTranslation as Z } from "react-i18next";
4
- import { c as tt } from "./index-D2ZczOXr.js";
5
- import { B as et } from "./button-DD_0Xdmr.js";
6
- import { c as L } from "./createLucideIcon-CrFbzy84.js";
7
- import { I as nt } from "./image-C6RM5hfF.js";
8
- /**
9
- * @license lucide-react v1.8.0 - ISC
10
- *
11
- * This source code is licensed under the ISC license.
12
- * See the LICENSE file in the root directory of this source tree.
13
- */
14
- const ot = [
15
- [
16
- "path",
17
- {
18
- d: "M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z",
19
- key: "zw3jo"
20
- }
21
- ],
22
- [
23
- "path",
24
- {
25
- d: "M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12",
26
- key: "1wduqc"
27
- }
28
- ],
29
- [
30
- "path",
31
- {
32
- d: "M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17",
33
- key: "kqbvx6"
34
- }
35
- ]
36
- ], at = L("layers", ot);
37
- /**
38
- * @license lucide-react v1.8.0 - ISC
39
- *
40
- * This source code is licensed under the ISC license.
41
- * See the LICENSE file in the root directory of this source tree.
42
- */
43
- const it = [
44
- ["path", { d: "M12 4v16", key: "1654pz" }],
45
- ["path", { d: "M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2", key: "e0r10z" }],
46
- ["path", { d: "M9 20h6", key: "s66wpe" }]
47
- ], rt = L("type", it), st = ["fg", "muted", "accent", "border", "bg"], N = "--primary", D = 380, H = (t) => t.trim().replace(/^--/, "");
48
- function R(t) {
49
- const e = /* @__PURE__ */ new Set();
50
- if (t.highlight) {
51
- const o = t.highlightToken ?? N;
52
- e.add(o), e.add(`${o}-foreground`);
53
- }
54
- return t.gauge && e.add(t.gauge.colorToken), [...e];
55
- }
56
- function M(t, e = []) {
57
- const o = {
58
- fg: "currentColor",
59
- muted: "currentColor",
60
- accent: "currentColor",
61
- border: "currentColor",
62
- bg: "transparent",
63
- font: "sans-serif",
64
- tokens: {}
65
- };
66
- if (!t) return o;
67
- const n = (a) => {
68
- const r = t.querySelector(`[data-k="${a}"]`);
69
- return r && getComputedStyle(r).color || "currentColor";
70
- }, i = {};
71
- for (const a of e) {
72
- const r = t.querySelector(
73
- `[data-token="${H(a)}"]`
74
- );
75
- if (r) {
76
- const u = getComputedStyle(r).color;
77
- u && (i[a] = u);
78
- }
79
- }
80
- return {
81
- fg: n("fg"),
82
- muted: n("muted"),
83
- accent: n("accent"),
84
- border: n("border"),
85
- bg: n("bg"),
86
- font: getComputedStyle(t).fontFamily || "sans-serif",
87
- tokens: i
88
- };
89
- }
90
- function _(t, e, o) {
91
- var n;
92
- return e ? ((n = t.tokens) == null ? void 0 : n[e]) ?? o : o;
93
- }
94
- const f = (t) => t.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
95
- function O(t) {
96
- const e = [t.title];
97
- t.highlight && e.push(t.highlight);
98
- for (const o of t.fields) e.push(`• ${o.label}: ${o.value}`);
99
- return e.join(`
100
- `);
101
- }
102
- function Y(t) {
103
- const e = t.fields.map((n) => `<li>${f(n.label)}: ${f(n.value)}</li>`).join(""), o = t.highlight ? `<p><strong>${f(t.highlight)}</strong></p>` : "";
104
- return `<p><strong>${f(t.title)}</strong></p>${o}<ul>${e}</ul>`;
105
- }
106
- const z = "AlfaDocs", m = 20, y = m + 18, T = 22, lt = 10, B = 22, S = 16, F = 12, ct = 12, V = 34, U = 9, k = (V + U) * 2;
107
- function A(t, e) {
108
- const o = e !== void 0 ? e : t.brand;
109
- return o === !1 ? !1 : typeof o == "string" ? o : z;
110
- }
111
- function ut(t) {
112
- if (typeof t.fraction == "number")
113
- return Math.min(1, Math.max(0, t.fraction));
114
- const e = parseFloat(t.value);
115
- return Number.isFinite(e) && typeof t.max == "number" && t.max > 0 ? Math.min(1, Math.max(0, e / t.max)) : 1;
116
- }
117
- function W(t, e) {
118
- const o = !!t.highlight, n = y + lt, i = (o ? n + T + S : y + S) + B - 6, a = i + Math.max(0, t.fields.length - 1) * B, r = o ? n : y, u = t.gauge ? r + k : 0, l = Math.max(a, u), c = e ? l + F + ct - 4 : l, d = Math.round(c + (e ? F : m));
119
- return { hasChip: o, chipY: n, firstFieldY: i, fieldsEndY: a, footerY: c, height: d };
120
- }
121
- function q(t, e) {
122
- return W(t, e !== !1).height;
123
- }
124
- function dt(t, e, o, n, i) {
125
- const a = V, r = 2 * Math.PI * a, u = ut(t), l = _(e, t.colorToken, e.accent), c = typeof t.segments == "number" && t.segments > 1 ? t.segments : 0, d = c ? 3 : 0, g = c ? r / c - d : r, $ = c ? `${g} ${d}` : "", v = `${r * u} ${r}`, w = `transform="rotate(-90 ${n} ${i})"`, s = f(
126
- t.label ? `${t.value} — ${t.label}` : t.value
127
- ), x = `<circle cx="${n}" cy="${i}" r="${a}" fill="none" stroke="${e.border}" stroke-width="${U}"${$ ? ` stroke-dasharray="${$}"` : ""} ${w}/>`, h = `<circle cx="${n}" cy="${i}" r="${a}" fill="none" stroke="${l}" stroke-width="${U}" stroke-linecap="round" stroke-dasharray="${v}" ${w}/>`, b = `<text x="${n}" y="${i + 1}" text-anchor="middle" dominant-baseline="middle" font-family="${o}" font-size="16" font-weight="700" fill="${e.fg}">${f(
128
- t.value
129
- )}</text>`, C = t.label ? `<text x="${n}" y="${i + 15}" text-anchor="middle" dominant-baseline="middle" font-family="${o}" font-size="9" fill="${e.muted}">${f(
130
- t.label
131
- )}</text>` : "";
132
- return `<g role="img" aria-label="${s}"><title>${s}</title>${x}${h}${b}${C}</g>`;
133
- }
134
- function ft(t, e, o, n) {
135
- const i = t.highlight, a = t.highlightToken ?? N, r = _(e, a, e.accent), u = _(e, `${a}-foreground`, e.bg), l = Math.round(i.length * 7.2 + 28), c = m + l / 2, d = n + T / 2 + 1;
136
- return `<rect x="${m}" y="${n}" width="${l}" height="${T}" rx="${T / 2}" fill="${r}"/><text x="${c}" y="${d}" text-anchor="middle" dominant-baseline="middle" font-family="${o}" font-size="12" font-weight="600" fill="${u}">${f(
137
- i
138
- )}</text>`;
139
- }
140
- function P(t, e, o = z) {
141
- const n = D, i = W(t, o !== !1), a = i.height, r = f(e.font);
142
- t.gauge ? n - m - k - 12 : n - m;
143
- const u = t.fields.map((g, $) => {
144
- const v = i.firstFieldY + $ * B;
145
- return `<text x="${m}" y="${v}" font-family="${r}" font-size="13"><tspan fill="${e.muted}">${f(
146
- g.label
147
- )}: </tspan><tspan fill="${e.fg}">${f(g.value)}</tspan></text>`;
148
- }).join(""), l = i.hasChip ? ft(t, e, r, i.chipY) : "", c = t.gauge ? dt(
149
- t.gauge,
150
- e,
151
- r,
152
- n - m - k / 2,
153
- (i.hasChip ? i.chipY : y) + k / 2
154
- ) : "", d = o !== !1 ? `<text x="${m}" y="${i.footerY}" font-family="${r}" font-size="10" fill="${e.muted}">${f(
155
- o
156
- )}</text>` : "";
157
- return `<svg xmlns="http://www.w3.org/2000/svg" width="${n}" height="${a}" viewBox="0 0 ${n} ${a}" role="img" aria-label="${f(
158
- t.title
159
- )}"><rect x="0.5" y="0.5" width="${n - 1}" height="${a - 1}" rx="12" fill="${e.bg}" stroke="${e.border}"/><text x="${m}" y="${y}" font-family="${r}" font-size="16" font-weight="700" fill="${e.fg}">${f(
160
- t.title
161
- )}</text>${l}${c}${u}${d}</svg>`;
162
- }
163
- function mt() {
164
- var t;
165
- return typeof navigator < "u" && typeof ((t = navigator.clipboard) == null ? void 0 : t.write) == "function" && typeof ClipboardItem < "u";
166
- }
167
- function j(t, e, o) {
168
- return new Promise((n, i) => {
169
- const a = new Image();
170
- a.decoding = "async", a.onload = () => {
171
- const r = document.createElement("canvas");
172
- r.width = e, r.height = o;
173
- const u = r.getContext("2d");
174
- if (!u) {
175
- i(new Error("2D canvas context unavailable"));
176
- return;
177
- }
178
- u.drawImage(a, 0, 0, e, o), r.toBlob((l) => {
179
- l ? n(l) : i(new Error("canvas.toBlob produced no PNG"));
180
- }, "image/png");
181
- }, a.onerror = () => i(new Error("SVG failed to decode as an image")), a.src = t;
182
- });
183
- }
184
- function K() {
185
- const t = typeof window < "u" && typeof window.devicePixelRatio == "number" ? window.devicePixelRatio : 1;
186
- return Math.max(2, t);
187
- }
188
- async function Mt(t, e = {}) {
189
- return (await X(t, e)).dataUri;
190
- }
191
- async function X(t, e = {}) {
192
- const { colours: o, scale: n = K() } = e, i = o ?? M(null), a = A(t, e.brand), r = P(t, i, a), u = `data:image/svg+xml,${encodeURIComponent(r)}`, l = D, c = q(t, a), d = await j(
193
- u,
194
- Math.round(l * n),
195
- Math.round(c * n)
196
- );
197
- return { dataUri: await gt(d), width: l, height: c };
198
- }
199
- function gt(t) {
200
- return new Promise((e, o) => {
201
- const n = new FileReader();
202
- n.onload = () => e(String(n.result)), n.onerror = () => o(n.error ?? new Error("FileReader error")), n.readAsDataURL(t);
203
- });
204
- }
205
- async function ht(t, e, o) {
206
- const n = O(e), i = new Blob([n], { type: "text/plain" });
207
- if (t === "text")
208
- return new ClipboardItem({ "text/plain": i });
209
- const a = A(e, void 0), r = P(e, o, a), u = `data:image/svg+xml,${encodeURIComponent(r)}`, l = K(), c = await j(
210
- u,
211
- Math.round(D * l),
212
- Math.round(q(e, a) * l)
213
- );
214
- if (t === "image")
215
- return new ClipboardItem({ "image/png": c, "text/plain": i });
216
- const d = new Blob([Y(e)], { type: "text/html" });
217
- return new ClipboardItem({
218
- "text/html": d,
219
- "image/png": c,
220
- "text/plain": i
221
- });
222
- }
223
- const pt = tt(
224
- "ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]",
225
- {
226
- variants: {
227
- variant: {
228
- insert: "",
229
- copy: ""
230
- }
231
- },
232
- defaultVariants: { variant: "insert" }
233
- }
234
- ), $t = ["text", "image", "text-image"], xt = {
235
- text: /* @__PURE__ */ p(rt, { "aria-hidden": !0 }),
236
- image: /* @__PURE__ */ p(nt, { "aria-hidden": !0 }),
237
- "text-image": /* @__PURE__ */ p(at, { "aria-hidden": !0 })
238
- }, G = {
239
- insert: {
240
- text: "insert.text",
241
- image: "insert.image",
242
- "text-image": "insert.textImage"
243
- },
244
- copy: {
245
- text: "insert.copyText",
246
- image: "insert.copyImage",
247
- "text-image": "insert.copyTextImage"
248
- }
249
- }, bt = J(
250
- function({
251
- card: e,
252
- variant: o = "insert",
253
- onInsert: n,
254
- onCopy: i,
255
- onError: a,
256
- size: r = "sm",
257
- intent: u = "primary"
258
- }, l) {
259
- const { t: c } = Z(), d = Q(null), g = (s) => {
260
- const x = O(e), h = Y(e);
261
- let b = "", C = "";
262
- const I = s === "text" ? null : M(d.current, R(e));
263
- return I && (b = P(e, I, A(e, void 0)), C = `data:image/svg+xml,${encodeURIComponent(b)}`), { mode: s, text: x, html: h, svg: b, imageDataUri: C, pngDataUri: () => I ? X(e, { colours: I }) : Promise.resolve({ dataUri: "", width: 0, height: 0 }) };
264
- }, w = o === "copy" ? (s) => {
265
- if (!mt()) {
266
- a == null || a(new Error("Clipboard write unavailable in this context"));
267
- return;
268
- }
269
- const x = M(
270
- d.current,
271
- R(e)
272
- );
273
- (async () => {
274
- try {
275
- const h = await ht(s, e, x);
276
- await navigator.clipboard.write([h]), i == null || i(s);
277
- } catch (h) {
278
- a == null || a(h);
279
- }
280
- })();
281
- } : (s) => {
282
- n == null || n(g(s));
283
- };
284
- return /* @__PURE__ */ E(
285
- "div",
286
- {
287
- ref: l,
288
- "data-component": "insert-result",
289
- "data-variant": o,
290
- className: pt({ variant: o }),
291
- children: [
292
- /* @__PURE__ */ E("span", { ref: d, "aria-hidden": !0, className: "ds:sr-only", children: [
293
- st.map((s) => /* @__PURE__ */ p(
294
- "span",
295
- {
296
- "data-k": s,
297
- className: s === "fg" ? "ds:text-foreground" : s === "muted" ? "ds:text-muted-foreground" : s === "accent" ? "ds:text-[color:var(--primary)]" : s === "border" ? "ds:text-[color:var(--border)]" : "ds:text-[color:var(--card)]"
298
- },
299
- s
300
- )),
301
- R(e).map((s) => /* @__PURE__ */ p(
302
- "span",
303
- {
304
- "data-token": H(s),
305
- className: `ds:text-[color:var(${s})]`
306
- },
307
- s
308
- ))
309
- ] }),
310
- $t.map((s) => /* @__PURE__ */ p(
311
- et,
312
- {
313
- type: "button",
314
- intent: u,
315
- size: r,
316
- startIcon: xt[s],
317
- "aria-label": c(G[o][s]),
318
- onClick: () => w(s),
319
- children: c(G[o][s])
320
- },
321
- s
322
- ))
323
- ]
324
- }
325
- );
326
- }
327
- );
328
- bt.displayName = "InsertButton";
329
- export {
330
- bt as I,
331
- Mt as a,
332
- X as s
333
- };
334
- //# sourceMappingURL=insert-result-CoC1oo6R.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"insert-result-CoC1oo6R.js","sources":["../../node_modules/lucide-react/dist/esm/icons/layers.js","../../node_modules/lucide-react/dist/esm/icons/type.js","../../src/components/_shared/insert-result.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z\",\n key: \"zw3jo\"\n }\n ],\n [\n \"path\",\n {\n d: \"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12\",\n key: \"1wduqc\"\n }\n ],\n [\n \"path\",\n {\n d: \"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17\",\n key: \"kqbvx6\"\n }\n ]\n];\nconst Layers = createLucideIcon(\"layers\", __iconNode);\n\nexport { __iconNode, Layers as default };\n//# sourceMappingURL=layers.js.map\n","/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 4v16\", key: \"1654pz\" }],\n [\"path\", { d: \"M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2\", key: \"e0r10z\" }],\n [\"path\", { d: \"M9 20h6\", key: \"s66wpe\" }]\n];\nconst Type = createLucideIcon(\"type\", __iconNode);\n\nexport { __iconNode, Type as default };\n//# sourceMappingURL=type.js.map\n","/* ------------------------------------------------------------------ */\n/* InsertButton — shared \"use this result\" control for the calculator */\n/* toolset. */\n/* */\n/* Two variants, one set of payload builders: */\n/* */\n/* • `insert` (default) — editor-extension context. Each button hands */\n/* the built InsertPayload to `onInsert`, who drops it into whatever */\n/* editor they use. The kit never touches an editor. */\n/* */\n/* • `copy` — app-shell context. Each button writes the chosen */\n/* representation(s) to the clipboard as a multi-format ClipboardItem */\n/* so a single copy serves any paste target. The image format is a */\n/* REAL raster PNG (the SVG card rasterised to a canvas) — clipboards */\n/* reject SVG as an image, so copying the data-URI as text is the */\n/* exact \"copied text without the image\" bug this variant fixes. */\n/* */\n/* Three inline buttons, one per mode (text / image / text + image). */\n/* */\n/* The SVG card embeds CONCRETE colours so it renders standalone as an */\n/* <img>. To stay within the \"no hardcoded colours\" rule, those colours */\n/* are sampled at click time from hidden probe spans that carry the */\n/* token utility classes — i.e. resolved from the live theme, never */\n/* written as literals in source. */\n/* ------------------------------------------------------------------ */\n\nimport { forwardRef, useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { cva } from 'class-variance-authority';\nimport { Type, Image as ImageIcon, Layers } from 'lucide-react';\nimport { Button, type ButtonProps } from '../button';\n\nexport type InsertMode = 'text' | 'image' | 'text-image';\n\nexport type InsertVariant = 'insert' | 'copy';\n\nexport interface InsertCardField {\n label: string;\n value: string;\n}\n\n/**\n * Optional radial gauge, drawn as a hand-rolled native-SVG donut (track\n * `<circle>` + value arc via `stroke-dasharray`) so it survives the\n * `<img>` → `<canvas>` → `toBlob` raster. No `<foreignObject>`, no charting lib.\n */\nexport interface InsertCardGauge {\n /** Big number rendered in the gauge centre (e.g. `'22.4'`). */\n value: string;\n /**\n * Filled fraction of the ring, `0`–`1`. Takes precedence when supplied;\n * otherwise derived from a `value`/`max` numeric parse (falling back to a\n * full ring when neither is numeric).\n */\n fraction?: number;\n /** Denominator used to derive `fraction` when `fraction` is omitted. */\n max?: number;\n /**\n * Number of evenly-spaced segment gaps to notch into the ring (e.g. `4` for\n * a quartered dial). `0`/omitted draws a continuous arc.\n */\n segments?: number;\n /**\n * DS token NAME for the arc colour — e.g. `'--success'`, `'--warning'`,\n * `'--destructive'`, `'--info'`, or the light-orange overweight override.\n * Resolved to a concrete colour from a probe span at raster time; never a\n * hex literal in source.\n */\n colorToken: string;\n /** Small category label under the value inside the ring. */\n label?: string;\n}\n\nexport interface InsertCardData {\n /** Card heading. */\n title: string;\n /** Key/value rows. */\n fields: InsertCardField[];\n /** Optional highlighted line, rendered as a category chip (pill). */\n highlight?: string;\n /**\n * DS token NAME for the highlight chip fill. Defaults to the accent token\n * (`--primary`). The chip text uses the matching `<token>-foreground` when it\n * resolves, else falls back to the card background for contrast.\n */\n highlightToken?: string;\n /** Optional radial gauge drawn natively in the card. */\n gauge?: InsertCardGauge;\n /**\n * Brand wordmark printed in the card footer.\n *\n * - omitted → the default `'AlfaDocs'` wordmark.\n * - a string → that custom wordmark.\n * - `false` → no brand line at all.\n *\n * A `brand` passed to {@link SvgCardToPngOptions} overrides this per-render.\n */\n brand?: string | false;\n}\n\nexport interface InsertPayload {\n /** Which button the user chose. */\n mode: InsertMode;\n /** Plain-text summary. Always present. */\n text: string;\n /** Rich HTML summary (heading + list). Always present. */\n html: string;\n /**\n * Branded SVG result-card markup. Empty for mode `'text'`.\n *\n * Kept for back-compat and for callers that need the live, copy-pasteable\n * vector. NOTE: SVG can carry `<script>` and is routinely stripped by\n * rich-text sanitisers, so it is NOT the format to insert into an editor —\n * use {@link InsertPayload.pngDataUri} for that.\n */\n svg: string;\n /**\n * SVG as an `image/svg+xml` data URI for `<img src>`. Empty for `'text'`.\n *\n * Same caveat as {@link InsertPayload.svg}: fine for a preview `<img>`, but a\n * sanitiser-stripped vector once it reaches an editor. Prefer\n * {@link InsertPayload.pngDataUri}.\n */\n imageDataUri: string;\n /**\n * Async thunk that resolves the result-card raster — the format intended for\n * editor insertion. PNG is a flat raster: it carries no script and survives\n * the rich-text sanitiser that strips SVG.\n *\n * Resolves to `{ dataUri, width, height }` where `width`/`height` are the\n * **logical (un-scaled) CSS pixel** dimensions: set them on the inserted\n * `<img width height>` and the supersampled (`>= 2×`) PNG renders crisp with\n * no consumer-side shim. For mode `'text'` resolves to an empty\n * `{ dataUri: '', width: 0, height: 0 }`. Rendered lazily so the synchronous\n * payload stays cheap; `await payload.pngDataUri()` only when you need it.\n *\n * @since 0.43.0 — this return shape changed from a bare `Promise<string>` to\n * `Promise<{ dataUri; width; height }>` (see CHANGELOG).\n */\n pngDataUri: () => Promise<InsertPngResult>;\n}\n\n/** Resolved PNG raster plus its logical (un-scaled) `<img>` dimensions. */\nexport interface InsertPngResult {\n /** `image/png` data URI, or `''` for the text-only mode. */\n dataUri: string;\n /** Logical (CSS px) width to set on the inserted `<img>`. `0` when empty. */\n width: number;\n /** Logical (CSS px) height to set on the inserted `<img>`. `0` when empty. */\n height: number;\n}\n\nexport interface InsertButtonProps {\n /** Structured result used to build every payload representation. */\n card: InsertCardData;\n /**\n * Verb the buttons perform. Defaults to `'insert'`.\n *\n * - `'insert'` — fires `onInsert(payload)` (editor-extension context).\n * - `'copy'` — writes the chosen representation(s) to the clipboard as a\n * multi-format `ClipboardItem` (app-shell context).\n */\n variant?: InsertVariant;\n /**\n * Receives the built payload when a button is pressed.\n *\n * Required for the `insert` variant; optional (and ignored) for `copy`.\n */\n onInsert?: (payload: InsertPayload) => void;\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 /** Trigger size. Defaults to `'sm'`. */\n size?: 'sm' | 'md' | 'lg';\n /**\n * Visual intent of the three trigger buttons (text / image / text+image).\n * Mirrors the `Button` `intent` prop and applies to every trigger uniformly\n * so the three stay visually consistent. Defaults to `'primary'`.\n */\n intent?: ButtonProps['intent'];\n}\n\ninterface ThemeColours {\n fg: string;\n muted: string;\n accent: string;\n border: string;\n bg: string;\n font: string;\n /**\n * Concrete colours resolved from arbitrary DS token names, keyed by the token\n * name the caller passed (e.g. `'--success'`). Populated for the gauge arc\n * and the highlight chip; consulted by {@link buildResultCardSvg} via\n * {@link resolveToken}.\n */\n tokens?: Record<string, string>;\n}\n\n/* Fixed probe keys → the resolved colour they sample. */\nconst PROBE_KEYS = ['fg', 'muted', 'accent', 'border', 'bg'] as const;\n\n/** Default DS token names driving the chip and the on-token text colours. */\nconst DEFAULT_HIGHLIGHT_TOKEN = '--primary';\n\nconst SVG_W = 380;\n\n/** Strip a leading `--`/whitespace so a token name is a safe class/probe id. */\nconst tokenName = (token: string): string => token.trim().replace(/^--/, '');\n\n/**\n * Extra `<token>` → resolved-colour probes a given card needs beyond the five\n * fixed keys: the gauge arc colour, the highlight chip fill, and each token's\n * `-foreground` companion (for contrasting on-token text).\n */\nfunction extraTokensForCard(card: InsertCardData): string[] {\n const wanted = new Set<string>();\n if (card.highlight) {\n const fill = card.highlightToken ?? DEFAULT_HIGHLIGHT_TOKEN;\n wanted.add(fill);\n wanted.add(`${fill}-foreground`);\n }\n if (card.gauge) wanted.add(card.gauge.colorToken);\n return [...wanted];\n}\n\nfunction readThemeColours(\n probe: HTMLElement | null,\n extraTokens: string[] = [],\n): ThemeColours {\n const fallback: ThemeColours = {\n fg: 'currentColor',\n muted: 'currentColor',\n accent: 'currentColor',\n border: 'currentColor',\n bg: 'transparent',\n font: 'sans-serif',\n tokens: {},\n };\n if (!probe) return fallback;\n const read = (key: string): string => {\n const el = probe.querySelector<HTMLElement>(`[data-k=\"${key}\"]`);\n if (!el) return 'currentColor';\n return getComputedStyle(el).color || 'currentColor';\n };\n const tokens: Record<string, string> = {};\n for (const token of extraTokens) {\n const el = probe.querySelector<HTMLElement>(\n `[data-token=\"${tokenName(token)}\"]`,\n );\n if (el) {\n const colour = getComputedStyle(el).color;\n if (colour) tokens[token] = colour;\n }\n }\n return {\n fg: read('fg'),\n muted: read('muted'),\n accent: read('accent'),\n border: read('border'),\n bg: read('bg'),\n font: getComputedStyle(probe).fontFamily || 'sans-serif',\n tokens,\n };\n}\n\n/**\n * Internal resolved-colour shape, re-exported for tests that construct a card\n * raster without a live DOM probe. Not part of the public component API.\n */\nexport type ThemeColoursForTest = ThemeColours;\n\n/** Resolve a token NAME to a concrete colour, or a fallback when unsampled. */\nfunction resolveToken(\n c: ThemeColours,\n token: string | undefined,\n fallback: string,\n): string {\n if (!token) return fallback;\n return c.tokens?.[token] ?? fallback;\n}\n\nconst escapeXml = (s: string): string =>\n s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n\nexport function buildResultText(card: InsertCardData): string {\n const lines = [card.title];\n if (card.highlight) lines.push(card.highlight);\n for (const f of card.fields) lines.push(`• ${f.label}: ${f.value}`);\n return lines.join('\\n');\n}\n\nexport function buildResultHtml(card: InsertCardData): string {\n const items = card.fields\n .map((f) => `<li>${escapeXml(f.label)}: ${escapeXml(f.value)}</li>`)\n .join('');\n const highlight = card.highlight\n ? `<p><strong>${escapeXml(card.highlight)}</strong></p>`\n : '';\n return `<p><strong>${escapeXml(card.title)}</strong></p>${highlight}<ul>${items}</ul>`;\n}\n\n/** Default brand wordmark printed in the footer when none is specified. */\nconst DEFAULT_BRAND = 'AlfaDocs';\n\n/* Layout constants — shared by the height calc and the markup builder. */\nconst PAD = 20;\nconst TITLE_BASELINE = PAD + 18;\nconst CHIP_H = 22;\nconst CHIP_GAP = 10;\nconst ROW_H = 22;\nconst FIELDS_GAP = 16;\nconst FOOTER_GAP = 12;\nconst FOOTER_H = 12;\nconst GAUGE_R = 34; // outer radius\nconst GAUGE_STROKE = 9;\nconst GAUGE_BOX = (GAUGE_R + GAUGE_STROKE) * 2; // gauge group bounding box\n\n/** Resolve the brand line for a render: option override wins over card field. */\nfunction resolveBrand(\n card: InsertCardData,\n override: string | false | undefined,\n): string | false {\n const value = override !== undefined ? override : card.brand;\n if (value === false) return false;\n if (typeof value === 'string') return value;\n return DEFAULT_BRAND;\n}\n\n/** Filled fraction `0`–`1` for a gauge, from `fraction` or `value`/`max`. */\nfunction gaugeFraction(gauge: InsertCardGauge): number {\n if (typeof gauge.fraction === 'number') {\n return Math.min(1, Math.max(0, gauge.fraction));\n }\n const v = parseFloat(gauge.value);\n if (Number.isFinite(v) && typeof gauge.max === 'number' && gauge.max > 0) {\n return Math.min(1, Math.max(0, v / gauge.max));\n }\n return 1;\n}\n\ninterface CardLayout {\n hasChip: boolean;\n chipY: number;\n firstFieldY: number;\n fieldsEndY: number;\n footerY: number;\n height: number;\n}\n\n/** Compute the vertical layout once; reused by height + markup. */\nfunction layoutCard(card: InsertCardData, hasBrand: boolean): CardLayout {\n const hasChip = Boolean(card.highlight);\n const chipY = TITLE_BASELINE + CHIP_GAP; // chip top\n const firstFieldY =\n (hasChip ? chipY + CHIP_H + FIELDS_GAP : TITLE_BASELINE + FIELDS_GAP) +\n ROW_H -\n 6;\n const fieldsEndY = firstFieldY + Math.max(0, card.fields.length - 1) * ROW_H;\n // Keep the body at least as tall as the gauge so the donut never clips.\n const bodyTop = hasChip ? chipY : TITLE_BASELINE;\n const gaugeFloor = card.gauge ? bodyTop + GAUGE_BOX : 0;\n const contentBottom = Math.max(fieldsEndY, gaugeFloor);\n const footerY = hasBrand\n ? contentBottom + FOOTER_GAP + FOOTER_H - 4\n : contentBottom;\n const height = Math.round(footerY + (hasBrand ? FOOTER_GAP : PAD));\n return { hasChip, chipY, firstFieldY, fieldsEndY, footerY, height };\n}\n\n/** Result-card SVG height for a given card — kept in sync with the markup. */\nfunction svgHeight(card: InsertCardData, brand: string | false): number {\n return layoutCard(card, brand !== false).height;\n}\n\n/**\n * Build the gauge group: a track `<circle>` plus a value arc drawn with\n * `stroke-dasharray`/`stroke-dashoffset` (optionally notched into `segments`),\n * a centred value + label, and a `<title>` accessible name. Pure native SVG —\n * never `<foreignObject>`.\n */\nfunction buildGauge(\n gauge: InsertCardGauge,\n c: ThemeColours,\n font: string,\n cx: number,\n cy: number,\n): string {\n const r = GAUGE_R;\n const circumference = 2 * Math.PI * r;\n const frac = gaugeFraction(gauge);\n const arc = resolveToken(c, gauge.colorToken, c.accent);\n const segments =\n typeof gauge.segments === 'number' && gauge.segments > 1\n ? gauge.segments\n : 0;\n // Notch the ring into evenly-spaced segments via a dasharray pattern.\n const gap = segments ? 3 : 0;\n const segLen = segments ? circumference / segments - gap : circumference;\n const trackDash = segments ? `${segLen} ${gap}` : '';\n const valueDash = `${circumference * frac} ${circumference}`;\n const rotate = `transform=\"rotate(-90 ${cx} ${cy})\"`;\n const title = escapeXml(\n gauge.label ? `${gauge.value} — ${gauge.label}` : gauge.value,\n );\n const track = `<circle cx=\"${cx}\" cy=\"${cy}\" r=\"${r}\" fill=\"none\" stroke=\"${c.border}\" stroke-width=\"${GAUGE_STROKE}\"${\n trackDash ? ` stroke-dasharray=\"${trackDash}\"` : ''\n } ${rotate}/>`;\n const valueArc = `<circle cx=\"${cx}\" cy=\"${cy}\" r=\"${r}\" fill=\"none\" stroke=\"${arc}\" stroke-width=\"${GAUGE_STROKE}\" stroke-linecap=\"round\" stroke-dasharray=\"${valueDash}\" ${rotate}/>`;\n const centreValue = `<text x=\"${cx}\" y=\"${cy + 1}\" text-anchor=\"middle\" dominant-baseline=\"middle\" font-family=\"${font}\" font-size=\"16\" font-weight=\"700\" fill=\"${c.fg}\">${escapeXml(\n gauge.value,\n )}</text>`;\n const centreLabel = gauge.label\n ? `<text x=\"${cx}\" y=\"${cy + 15}\" text-anchor=\"middle\" dominant-baseline=\"middle\" font-family=\"${font}\" font-size=\"9\" fill=\"${c.muted}\">${escapeXml(\n gauge.label,\n )}</text>`\n : '';\n return `<g role=\"img\" aria-label=\"${title}\"><title>${title}</title>${track}${valueArc}${centreValue}${centreLabel}</g>`;\n}\n\n/** Build the highlight chip: rounded `<rect>` pill + centred `<text>`. */\nfunction buildChip(\n card: InsertCardData,\n c: ThemeColours,\n font: string,\n y: number,\n): string {\n const text = card.highlight as string;\n const fillToken = card.highlightToken ?? DEFAULT_HIGHLIGHT_TOKEN;\n const fill = resolveToken(c, fillToken, c.accent);\n const textColour = resolveToken(c, `${fillToken}-foreground`, c.bg);\n // Rough monospace-free width estimate: glyph ≈ 7.2px at 12px + 28px padding.\n const chipW = Math.round(text.length * 7.2 + 28);\n const textX = PAD + chipW / 2;\n const textY = y + CHIP_H / 2 + 1;\n return `<rect x=\"${PAD}\" y=\"${y}\" width=\"${chipW}\" height=\"${CHIP_H}\" rx=\"${\n CHIP_H / 2\n }\" fill=\"${fill}\"/><text x=\"${textX}\" y=\"${textY}\" text-anchor=\"middle\" dominant-baseline=\"middle\" font-family=\"${font}\" font-size=\"12\" font-weight=\"600\" fill=\"${textColour}\">${escapeXml(\n text,\n )}</text>`;\n}\n\nexport function buildResultCardSvg(\n card: InsertCardData,\n c: ThemeColours,\n brand: string | false = DEFAULT_BRAND,\n): string {\n const W = SVG_W;\n const L = layoutCard(card, brand !== false);\n const H = L.height;\n const font = escapeXml(c.font);\n\n // Fields flow on the inline-start edge; when a gauge is present it sits on\n // the inline-end edge so the rows don't run under it.\n const fieldsRightEdge = card.gauge ? W - PAD - GAUGE_BOX - 12 : W - PAD;\n const rows = card.fields\n .map((f, i) => {\n const y = L.firstFieldY + i * ROW_H;\n return `<text x=\"${PAD}\" y=\"${y}\" font-family=\"${font}\" font-size=\"13\"><tspan fill=\"${c.muted}\">${escapeXml(\n f.label,\n )}: </tspan><tspan fill=\"${c.fg}\">${escapeXml(f.value)}</tspan></text>`;\n })\n .join('');\n\n const chip = L.hasChip ? buildChip(card, c, font, L.chipY) : '';\n\n const gauge = card.gauge\n ? buildGauge(\n card.gauge,\n c,\n font,\n W - PAD - GAUGE_BOX / 2,\n (L.hasChip ? L.chipY : TITLE_BASELINE) + GAUGE_BOX / 2,\n )\n : '';\n\n const footer =\n brand !== false\n ? `<text x=\"${PAD}\" y=\"${L.footerY}\" font-family=\"${font}\" font-size=\"10\" fill=\"${c.muted}\">${escapeXml(\n brand,\n )}</text>`\n : '';\n\n // `fieldsRightEdge` is reserved for future wrapping; referenced to keep the\n // intent explicit even though rows are single-line today.\n void fieldsRightEdge;\n\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${W}\" height=\"${H}\" viewBox=\"0 0 ${W} ${H}\" role=\"img\" aria-label=\"${escapeXml(\n card.title,\n )}\"><rect x=\"0.5\" y=\"0.5\" width=\"${W - 1}\" height=\"${H - 1}\" rx=\"12\" fill=\"${c.bg}\" stroke=\"${c.border}\"/><text x=\"${PAD}\" y=\"${TITLE_BASELINE}\" font-family=\"${font}\" font-size=\"16\" font-weight=\"700\" fill=\"${c.fg}\">${escapeXml(\n card.title,\n )}</text>${chip}${gauge}${rows}${footer}</svg>`;\n}\n\n/* ------------------------------------------------------------------ */\n/* Clipboard helpers (copy variant) */\n/* ------------------------------------------------------------------ */\n\n/** True when a multi-format clipboard write is reachable in this context. */\nfunction canWriteRichClipboard(): boolean {\n return (\n typeof navigator !== 'undefined' &&\n typeof navigator.clipboard?.write === 'function' &&\n typeof ClipboardItem !== 'undefined'\n );\n}\n\n/**\n * Rasterise the result-card SVG data-URI to a PNG Blob. Clipboards reject\n * SVG as an image, so we load the SVG into an <img>, paint it onto a canvas\n * at the SVG's intrinsic size, and read the canvas back as `image/png`.\n */\nfunction rasteriseSvgToPng(\n imageDataUri: string,\n width: number,\n height: number,\n): Promise<Blob> {\n return new Promise<Blob>((resolve, reject) => {\n const img = new Image();\n img.decoding = 'async';\n img.onload = () => {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n reject(new Error('2D canvas context unavailable'));\n return;\n }\n ctx.drawImage(img, 0, 0, width, height);\n canvas.toBlob((blob) => {\n if (blob) resolve(blob);\n else reject(new Error('canvas.toBlob produced no PNG'));\n }, 'image/png');\n };\n img.onerror = () => reject(new Error('SVG failed to decode as an image'));\n img.src = imageDataUri;\n });\n}\n\n/** Options for {@link svgCardToPngDataUri}. */\nexport interface SvgCardToPngOptions {\n /**\n * Resolved theme colours to paint into the card. When omitted, the card\n * renders with `currentColor` / transparent fallbacks (see\n * {@link buildResultCardSvg}) — pass sampled colours for a branded raster.\n */\n colours?: ThemeColours;\n /**\n * Device-pixel scale factor for the raster. `2` yields a retina-sharp PNG.\n * Defaults to `Math.max(2, devicePixelRatio)` so the inserted image is crisp\n * without a consumer-side supersampling shim.\n */\n scale?: number;\n /**\n * Brand wordmark for the footer. Omitted → the card's own `brand` (then the\n * default `'AlfaDocs'`); a string overrides it; `false` removes it.\n */\n brand?: string | false;\n}\n\n/** dpr-aware default raster scale — never below 2× so the PNG stays crisp. */\nfunction defaultRasterScale(): number {\n const dpr =\n typeof window !== 'undefined' && typeof window.devicePixelRatio === 'number'\n ? window.devicePixelRatio\n : 1;\n return Math.max(2, dpr);\n}\n\n/**\n * Render an {@link InsertCardData} result card to an `image/png` data URI.\n *\n * This is the format intended for editor insertion: a flat raster carries no\n * `<script>` and survives the rich-text sanitiser that strips inline SVG. The\n * card is built as SVG, loaded into an `<img>`, painted onto a canvas at the\n * card's intrinsic size (optionally scaled), and read back as `image/png`.\n *\n * Browser-only — relies on `Image`, `<canvas>`, and `canvas.toBlob`. Throws if\n * called in a non-DOM context or if the SVG fails to decode.\n */\nexport async function svgCardToPngDataUri(\n card: InsertCardData,\n opts: SvgCardToPngOptions = {},\n): Promise<string> {\n return (await svgCardToPng(card, opts)).dataUri;\n}\n\n/**\n * Like {@link svgCardToPngDataUri} but also returns the **logical (un-scaled)**\n * card dimensions so consumers can size the inserted `<img width height>` and\n * drop their own supersampling shim. The PNG itself is rasterised at `scale`\n * (default `Math.max(2, devicePixelRatio)`) for crispness.\n */\nexport async function svgCardToPng(\n card: InsertCardData,\n opts: SvgCardToPngOptions = {},\n): Promise<InsertPngResult> {\n const { colours, scale = defaultRasterScale() } = opts;\n const resolved: ThemeColours = colours ?? readThemeColours(null);\n const brand = resolveBrand(card, opts.brand);\n const svg = buildResultCardSvg(card, resolved, brand);\n const imageDataUri = `data:image/svg+xml,${encodeURIComponent(svg)}`;\n const logicalW = SVG_W;\n const logicalH = svgHeight(card, brand);\n const blob = await rasteriseSvgToPng(\n imageDataUri,\n Math.round(logicalW * scale),\n Math.round(logicalH * scale),\n );\n const dataUri = await blobToDataUri(blob);\n return { dataUri, width: logicalW, height: logicalH };\n}\n\n/** Read a Blob back as a `data:` URI string. */\nfunction blobToDataUri(blob: Blob): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(String(reader.result));\n reader.onerror = () =>\n reject(reader.error ?? new Error('FileReader error'));\n reader.readAsDataURL(blob);\n });\n}\n\n/** Build the per-mode ClipboardItem contents map for a copy. */\nasync function buildClipboardItem(\n mode: InsertMode,\n card: InsertCardData,\n colours: ThemeColours,\n): Promise<ClipboardItem> {\n const text = buildResultText(card);\n const textBlob = new Blob([text], { type: 'text/plain' });\n\n if (mode === 'text') {\n return new ClipboardItem({ 'text/plain': textBlob });\n }\n\n const brand = resolveBrand(card, undefined);\n const svg = buildResultCardSvg(card, colours, brand);\n const imageDataUri = `data:image/svg+xml,${encodeURIComponent(svg)}`;\n const scale = defaultRasterScale();\n const pngBlob = await rasteriseSvgToPng(\n imageDataUri,\n Math.round(SVG_W * scale),\n Math.round(svgHeight(card, brand) * scale),\n );\n\n if (mode === 'image') {\n return new ClipboardItem({ 'image/png': pngBlob, 'text/plain': textBlob });\n }\n\n const htmlBlob = new Blob([buildResultHtml(card)], { type: 'text/html' });\n return new ClipboardItem({\n 'text/html': htmlBlob,\n 'image/png': pngBlob,\n 'text/plain': textBlob,\n });\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nconst rowVariants = cva(\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n {\n variants: {\n variant: {\n insert: '',\n copy: '',\n },\n },\n defaultVariants: { variant: 'insert' },\n },\n);\n\nconst MODES: readonly InsertMode[] = ['text', 'image', 'text-image'] as const;\n\nconst MODE_ICON: Record<InsertMode, React.ReactNode> = {\n text: <Type aria-hidden />,\n image: <ImageIcon aria-hidden />,\n 'text-image': <Layers aria-hidden />,\n};\n\n/* i18n leaf keys per variant × mode — bare keys against the `ui` namespace. */\nconst LABEL_KEY: Record<InsertVariant, Record<InsertMode, string>> = {\n insert: {\n text: 'insert.text',\n image: 'insert.image',\n 'text-image': 'insert.textImage',\n },\n copy: {\n text: 'insert.copyText',\n image: 'insert.copyImage',\n 'text-image': 'insert.copyTextImage',\n },\n};\n\nexport const InsertButton = forwardRef<HTMLDivElement, InsertButtonProps>(\n function InsertButton(\n {\n card,\n variant = 'insert',\n onInsert,\n onCopy,\n onError,\n size = 'sm',\n intent = 'primary',\n },\n ref,\n ) {\n const { t } = useTranslation();\n const probeRef = useRef<HTMLSpanElement>(null);\n\n const buildPayload = (mode: InsertMode): InsertPayload => {\n const text = buildResultText(card);\n const html = buildResultHtml(card);\n let svg = '';\n let imageDataUri = '';\n // Sample the live theme once, at click time (including any gauge/chip\n // token colours the card needs), so both the SVG fields and the lazy PNG\n // thunk paint with the same resolved colours.\n const colours =\n mode === 'text'\n ? null\n : readThemeColours(probeRef.current, extraTokensForCard(card));\n if (colours) {\n svg = buildResultCardSvg(card, colours, resolveBrand(card, undefined));\n imageDataUri = `data:image/svg+xml,${encodeURIComponent(svg)}`;\n }\n const pngDataUri = (): Promise<InsertPngResult> =>\n colours\n ? svgCardToPng(card, { colours })\n : Promise.resolve({ dataUri: '', width: 0, height: 0 });\n return { mode, text, html, svg, imageDataUri, pngDataUri };\n };\n\n const handleInsert = (mode: InsertMode): void => {\n onInsert?.(buildPayload(mode));\n };\n\n const handleCopy = (mode: InsertMode): void => {\n if (!canWriteRichClipboard()) {\n onError?.(new Error('Clipboard write unavailable in this context'));\n return;\n }\n const colours = readThemeColours(\n probeRef.current,\n extraTokensForCard(card),\n );\n void (async () => {\n try {\n const item = await buildClipboardItem(mode, card, colours);\n await navigator.clipboard.write([item]);\n onCopy?.(mode);\n } catch (error) {\n onError?.(error);\n }\n })();\n };\n\n const onActivate = variant === 'copy' ? handleCopy : handleInsert;\n\n return (\n <div\n ref={ref}\n data-component=\"insert-result\"\n data-variant={variant}\n className={rowVariants({ variant })}\n >\n {/* Hidden colour probes — sampled at click time so the SVG card uses\n the live theme's resolved colours (no literals in source). The\n fixed five plus any per-card gauge/chip token colours. */}\n <span ref={probeRef} aria-hidden className=\"ds:sr-only\">\n {PROBE_KEYS.map((k) => (\n <span\n key={k}\n data-k={k}\n className={\n k === 'fg'\n ? 'ds:text-foreground'\n : k === 'muted'\n ? 'ds:text-muted-foreground'\n : k === 'accent'\n ? 'ds:text-[color:var(--primary)]'\n : k === 'border'\n ? 'ds:text-[color:var(--border)]'\n : 'ds:text-[color:var(--card)]'\n }\n />\n ))}\n {extraTokensForCard(card).map((token) => (\n <span\n key={token}\n data-token={tokenName(token)}\n className={`ds:text-[color:var(${token})]`}\n />\n ))}\n </span>\n {MODES.map((mode) => (\n <Button\n key={mode}\n type=\"button\"\n intent={intent}\n size={size}\n startIcon={MODE_ICON[mode]}\n aria-label={t(LABEL_KEY[variant][mode])}\n onClick={() => onActivate(mode)}\n >\n {t(LABEL_KEY[variant][mode])}\n </Button>\n ))}\n </div>\n );\n },\n);\n\nInsertButton.displayName = 'InsertButton';\n"],"names":["__iconNode","Layers","createLucideIcon","Type","PROBE_KEYS","DEFAULT_HIGHLIGHT_TOKEN","SVG_W","tokenName","token","extraTokensForCard","card","wanted","fill","readThemeColours","probe","extraTokens","fallback","read","key","el","tokens","colour","resolveToken","c","_a","escapeXml","s","buildResultText","lines","f","buildResultHtml","items","highlight","DEFAULT_BRAND","PAD","TITLE_BASELINE","CHIP_H","CHIP_GAP","ROW_H","FIELDS_GAP","FOOTER_GAP","FOOTER_H","GAUGE_R","GAUGE_STROKE","GAUGE_BOX","resolveBrand","override","value","gaugeFraction","gauge","v","layoutCard","hasBrand","hasChip","chipY","firstFieldY","fieldsEndY","bodyTop","gaugeFloor","contentBottom","footerY","height","svgHeight","brand","buildGauge","font","cx","cy","r","circumference","frac","arc","segments","gap","segLen","trackDash","valueDash","rotate","title","track","valueArc","centreValue","centreLabel","buildChip","y","text","fillToken","textColour","chipW","textX","textY","buildResultCardSvg","W","L","H","rows","i","chip","footer","canWriteRichClipboard","rasteriseSvgToPng","imageDataUri","width","resolve","reject","img","canvas","ctx","blob","defaultRasterScale","dpr","svgCardToPngDataUri","opts","svgCardToPng","colours","scale","resolved","svg","logicalW","logicalH","blobToDataUri","reader","buildClipboardItem","mode","textBlob","pngBlob","htmlBlob","rowVariants","cva","MODES","MODE_ICON","jsx","ImageIcon","LABEL_KEY","InsertButton","forwardRef","variant","onInsert","onCopy","onError","size","intent","ref","t","useTranslation","probeRef","useRef","buildPayload","html","onActivate","item","error","jsxs","k","Button"],"mappings":"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","x_google_ignoreList":[0,1]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"payment-form-BzVsG6Ks.js","sources":["../../src/tokens/themes/bridges/stripe-appearance.ts","../../src/components/payment-form/payment-form.agent.ts","../../src/components/payment-form/payment-form.tsx"],"sourcesContent":["import type { Appearance } from '@stripe/stripe-js';\n\n/**\n * Reads the current design-system tokens from a theme-root element and maps\n * them to Stripe Elements' Appearance API. `root` defaults to\n * `document.documentElement` but consumers can pass a scoped theme wrapper\n * (e.g. a modal with its own `.theme-accessible` override) so that Stripe\n * iframes pick up the right token set.\n *\n * Tokens referenced: --primary, --background, --foreground, --muted,\n * --muted-foreground, --border, --destructive, --radius-md, --font-sans,\n * --font-size-base, --spacing-sm, --animation-duration, --focus-ring-width,\n * --ring.\n *\n * No hex / rgb / hsl literals — every value flows from the token layer.\n */\n\nfunction isBrowser(): boolean {\n return typeof document !== 'undefined' && typeof window !== 'undefined';\n}\n\nexport function getStripeAppearance(root?: HTMLElement): Appearance {\n if (!isBrowser()) {\n return { theme: 'stripe' };\n }\n\n const target = root ?? document.documentElement;\n const styles = getComputedStyle(target);\n const read = (token: string) => styles.getPropertyValue(token).trim();\n const isDark = target.classList.contains('theme-dark');\n\n return {\n theme: isDark ? 'night' : 'stripe',\n variables: {\n colorPrimary: read('--primary'),\n colorBackground: read('--background'),\n colorText: read('--foreground'),\n colorDanger: read('--destructive'),\n colorTextSecondary: read('--muted-foreground'),\n colorTextPlaceholder: read('--muted-foreground'),\n borderRadius: read('--radius-md'),\n fontFamily: read('--font-sans'),\n fontSizeBase: read('--font-size-base'),\n // Stripe multiplies spacingUnit throughout every Element; --spacing-sm\n // gives readable density. Keep this in sync with the JSDoc above.\n spacingUnit: read('--spacing-sm'),\n },\n rules: {\n '.Input': {\n backgroundColor: read('--background'),\n border: `1px solid ${read('--border')}`,\n color: read('--foreground'),\n padding: read('--spacing-sm'),\n transition: `border-color ${read('--animation-duration')} ease-out`,\n },\n '.Input:focus': {\n borderColor: read('--primary'),\n boxShadow: `0 0 0 ${read('--focus-ring-width')} ${read('--ring')}`,\n outline: 'none',\n },\n '.Input--invalid': {\n borderColor: read('--destructive'),\n color: read('--foreground'),\n },\n '.Label': {\n color: read('--foreground'),\n fontWeight: read('--font-weight-medium'),\n fontSize: read('--font-size-sm'),\n },\n '.Error': {\n color: read('--destructive'),\n fontSize: read('--font-size-sm'),\n },\n '.Tab': {\n border: `1px solid ${read('--border')}`,\n backgroundColor: read('--background'),\n color: read('--foreground'),\n },\n '.Tab--selected': {\n borderColor: read('--primary'),\n backgroundColor: read('--background'),\n color: read('--primary'),\n },\n },\n };\n}\n\n/**\n * Calls `onChange(getStripeAppearance(root))` whenever the theme root's\n * class list mutates (theme switch) or the user toggles\n * `prefers-color-scheme` / `prefers-reduced-motion`. Returns an\n * unsubscribe function.\n */\nexport function subscribeStripeAppearance(\n onChange: (next: Appearance) => void,\n root?: HTMLElement,\n): () => void {\n if (!isBrowser()) return () => undefined;\n\n const target = root ?? document.documentElement;\n const emit = () => onChange(getStripeAppearance(root));\n\n const observer = new MutationObserver(emit);\n observer.observe(target, {\n attributes: true,\n attributeFilter: ['class', 'dir', 'lang'],\n });\n\n const schemeMql = window.matchMedia('(prefers-color-scheme: dark)');\n const motionMql = window.matchMedia('(prefers-reduced-motion: reduce)');\n schemeMql.addEventListener('change', emit);\n motionMql.addEventListener('change', emit);\n\n return () => {\n observer.disconnect();\n schemeMql.removeEventListener('change', emit);\n motionMql.removeEventListener('change', emit);\n };\n}\n","import type { AgentAdapter } from '../../agent/types';\nimport type { PaymentFormHandle } from './payment-form';\n\nexport const paymentFormAgent: AgentAdapter<PaymentFormHandle> = {\n id: 'payment-form',\n capabilities: ['submit'],\n state: {},\n actions: {\n submit: {\n safety: 'destructive',\n description:\n 'Submit the payment. Charges the configured payment method — irreversible.',\n invoke: (handle) => handle.submit(),\n },\n reset: {\n safety: 'destructive',\n description:\n 'Reset the form to its initial state. Loses any in-progress input.',\n invoke: (handle) => {\n handle.reset();\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'payment-form' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","/* ------------------------------------------------------------------ */\n/* PaymentForm — Stripe Elements wrapper (PCI DSS SAQ-A). */\n/* */\n/* - Library: `@stripe/react-stripe-js` + `@stripe/stripe-js` (see */\n/* `src/docs/08-third-party.mdx §Payments`). Card number, expiry, */\n/* CVC, and postal code all live inside Stripe-hosted iframes on */\n/* `js.stripe.com` — raw PAN never touches our origin, keeping us */\n/* inside PCI DSS SAQ-A scope. */\n/* */\n/* - Theming: the `stripe-appearance` bridge snapshots our tokens into */\n/* Stripe's Appearance API (`variables`, `rules`). A */\n/* `MutationObserver` on `<html class>` re-runs the snapshot when */\n/* the user flips theme so the embedded iframes repaint. */\n/* */\n/* - Security invariants enforced in this file: */\n/* 1. No `<input type=\"tel\" name=\"card\">` anywhere. */\n/* 2. Error strings are sanitised via `stripCardLikeDigits` before */\n/* forwarding to `onError` (replaces any `\\b\\d{4,}\\b` with */\n/* `****`). */\n/* 3. Element change events are never logged; any dev-only logging */\n/* is gated behind `import.meta.env.DEV` — never runs in prod. */\n/* */\n/* TODO: */\n/* - Stripe's `direction: 'rtl'` is not part of the current */\n/* `Appearance` TypeScript type; we rely on CSS mirroring of our */\n/* chrome via logical properties and let Stripe lay out the iframe */\n/* ltr for now. Revisit when @stripe/stripe-js publishes the type. */\n/* - No `<CardNumberElement>` / split-fields story — `PaymentElement` */\n/* handles accordion + card-only modes via its own `layout` option.*/\n/* ------------------------------------------------------------------ */\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type FormEvent,\n type ReactElement,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Spinner } from '../spinner';\nimport { Alert } from '../alert';\nimport {\n loadStripe,\n type Stripe,\n type Appearance,\n type StripeElementLocale,\n} from '@stripe/stripe-js';\nimport {\n Elements,\n PaymentElement,\n AddressElement,\n useElements,\n useStripe,\n} from '@stripe/react-stripe-js';\n\nimport {\n getStripeAppearance,\n subscribeStripeAppearance,\n} from '../../tokens/themes/bridges/stripe-appearance';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { paymentFormAgent } from './payment-form.agent';\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type PaymentCurrency = string; // ISO-4217\n\nexport interface PaymentFormProps {\n /** Opaque instance id — emitted as `data-component-id` for the agent registry. */\n id?: string;\n /** Required — from your server, created via the PaymentIntents API. */\n clientSecret: string;\n /** Stripe publishable key (`pk_test_…` / `pk_live_…`). */\n publishableKey: string;\n /** ISO-4217 currency code (e.g. 'EUR', 'USD', 'JPY'). */\n currency: PaymentCurrency;\n /** Amount in the currency's smallest unit (cents for EUR/USD, yen for JPY). */\n amount: number;\n /** Called with the PaymentIntent id on successful confirmation. */\n onSuccess?: (paymentIntentId: string) => void;\n /** Called with a sanitised error (no PAN digits, no Stripe English strings). */\n onError?: (error: { code: string; translatedMessage: string }) => void;\n /** Show the billing-address collector below the payment fields. */\n billingAddress?: boolean;\n /** Locale override — defaults to the active i18next locale. */\n locale?: string;\n /** Accessible label for the form. */\n ariaLabel?: string;\n /** URL Stripe redirects to when a payment method requires it. */\n returnUrl?: string;\n /** Pre-injected Stripe instance — used by tests + stories to bypass the network. */\n stripePromise?: Promise<Stripe | null> | null;\n className?: string;\n}\n\nexport interface PaymentFormHandle {\n /** Programmatically submit the form (same flow as the Pay button). */\n submit: () => Promise<void>;\n /** Reset the form to its initial state. */\n reset: () => void;\n}\n\n/* ------------------------------------------------------------------ */\n/* Currency helpers */\n/* ------------------------------------------------------------------ */\n\n/**\n * Currencies that Stripe bills in their base unit (no decimals). Source:\n * https://stripe.com/docs/currencies#zero-decimal — list pinned per\n * 08-third-party.mdx.\n */\nconst ZERO_DECIMAL_CURRENCIES = new Set<string>([\n 'BIF',\n 'CLP',\n 'DJF',\n 'GNF',\n 'IDR',\n 'JPY',\n 'KMF',\n 'KRW',\n 'MGA',\n 'PYG',\n 'RWF',\n 'UGX',\n 'VND',\n 'VUV',\n 'XAF',\n 'XOF',\n 'XPF',\n]);\n\nexport function formatPaymentAmount(\n amount: number,\n currency: string,\n locale: string,\n): string {\n const iso = currency.toUpperCase();\n const major = ZERO_DECIMAL_CURRENCIES.has(iso) ? amount : amount / 100;\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: iso,\n }).format(major);\n } catch {\n // Invalid locale/currency pair — fall back to a safe format so we\n // never leak raw amount integers into the UI.\n return new Intl.NumberFormat('en', {\n style: 'currency',\n currency: iso,\n }).format(major);\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Return URL validation */\n/* ------------------------------------------------------------------ */\n\n/**\n * Resolve `returnUrl` against the current origin. Accepts:\n * - absolute URLs on the same origin as `window.location`\n * - relative paths (resolved against the current origin)\n * Rejects (returns `null`):\n * - cross-origin URLs — would leak `payment_intent_client_secret`\n * - `javascript:` / `data:` / `file:` / `blob:` schemes\n * - SSR contexts (no `window`) — the submit path requires a browser\n * anyway, so rejecting here is the safer default.\n * See security-hardening.mdx.\n */\nexport function validateReturnUrl(\n returnUrl: string | undefined,\n): string | null {\n if (returnUrl === undefined) return null;\n const raw = returnUrl.trim();\n if (raw === '') return null;\n if (typeof window === 'undefined') return null;\n try {\n const resolved = new URL(raw, window.location.href);\n const allowedSchemes = new Set(['http:', 'https:']);\n if (!allowedSchemes.has(resolved.protocol)) return null;\n if (resolved.origin !== window.location.origin) return null;\n return resolved.toString();\n } catch {\n return null;\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Error sanitisation */\n/* ------------------------------------------------------------------ */\n\n/**\n * Replace any run of 4+ consecutive digits with `****`. Called before any\n * error text leaves the wrapper. Defensive: even though Stripe's error\n * strings don't normally contain PANs, a future SDK change could, and we\n * want a hard guarantee that `console` / analytics / Sentry breadcrumbs\n * stay clear of anything that looks like card data.\n */\nexport function stripCardLikeDigits(message: string): string {\n if (!message) return message;\n // Deliberately no word boundaries: a PAN run embedded between word\n // characters (e.g. \"CARD4242424242424242DECLINED\") must still be masked.\n return message.replace(/\\d{4,}/g, '****');\n}\n\n/**\n * Map a Stripe error code (e.g. `card_declined`, `incorrect_number`) to a\n * translation key under `payment.error.*`. Unknown codes fall through to\n * `payment.error.generic`.\n */\nexport function stripeErrorCodeToI18nKey(code: string | undefined): string {\n switch (code) {\n case 'incorrect_number':\n case 'invalid_number':\n return 'payment.error.cardNumber';\n case 'invalid_expiry_month':\n case 'invalid_expiry_year':\n case 'expired_card':\n return 'payment.error.expiry';\n case 'invalid_cvc':\n case 'incorrect_cvc':\n return 'payment.error.cvc';\n case 'incorrect_zip':\n case 'invalid_zip':\n return 'payment.error.postalCode';\n case 'card_declined':\n case 'do_not_honor':\n case 'generic_decline':\n return 'payment.error.declined';\n case 'network_error':\n case 'api_connection_error':\n return 'payment.error.network';\n default:\n return 'payment.error.generic';\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst formVariants = cva(\n [\n 'ds:payment-form-alfadocs ds:flex ds:flex-col',\n 'ds:gap-[var(--spacing-md)]',\n 'ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-[color:var(--card-border)] ds:shadow-[var(--shadow-card)] ds:[.theme-accessible_&]:border-2',\n 'ds:p-[var(--spacing-md)]',\n 'ds:aria-disabled:opacity-[var(--opacity-50)] ds:aria-disabled:cursor-not-allowed',\n ].join(' '),\n);\n\nconst fieldLabelVariants = cva(\n ['ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]'].join(' '),\n);\n\nconst labelTextVariants = cva(\n ['type-label', 'ds:text-[var(--foreground)]'].join(' '),\n);\n\nconst amountSummaryVariants = cva(\n [\n 'ds:flex ds:items-baseline ds:justify-between',\n 'ds:gap-[var(--spacing-sm)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n 'ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'ds:bg-[var(--muted)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:text-[var(--foreground)]',\n ].join(' '),\n);\n\nconst submitButtonVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center ds:gap-[var(--spacing-xs)]',\n 'ds:[min-block-size:var(--min-target-size)]',\n 'ds:[min-inline-size:var(--min-target-size)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:bg-[var(--primary)] ds:text-[var(--primary-foreground)]',\n 'ds:text-[length:var(--font-size-base)] ds:font-medium',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:hover:bg-[var(--primary-hover)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)]',\n 'ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:aria-disabled:opacity-[var(--opacity-50)] ds:aria-disabled:cursor-not-allowed',\n 'ds:aria-busy:cursor-wait',\n ].join(' '),\n);\n\n/* ------------------------------------------------------------------ */\n/* Inner form — lives inside the <Elements> provider */\n/* ------------------------------------------------------------------ */\n\ninterface InnerPaymentFormProps {\n amount: number;\n currency: string;\n locale: string;\n billingAddress: boolean;\n returnUrl: string | undefined;\n onSuccess: PaymentFormProps['onSuccess'];\n onError: PaymentFormProps['onError'];\n}\n\nfunction InnerPaymentForm(props: InnerPaymentFormProps): ReactElement {\n const {\n amount,\n currency,\n locale,\n billingAddress,\n returnUrl,\n onSuccess,\n onError,\n } = props;\n\n const { t } = useTranslation();\n const stripe = useStripe();\n const elements = useElements();\n\n const rawId = useId();\n const idSafe = useMemo(\n () => `pay-${rawId.replace(/[^a-zA-Z0-9-_]/g, '')}`,\n [rawId],\n );\n const paymentFieldId = `${idSafe}-payment`;\n const addressFieldId = `${idSafe}-address`;\n const errorId = `${idSafe}-error`;\n\n const [processing, setProcessing] = useState(false);\n const [elementComplete, setElementComplete] = useState(false);\n const [errorKey, setErrorKey] = useState<string | null>(null);\n const [errorMessage, setErrorMessage] = useState<string>('');\n\n const onSuccessRef = useRef(onSuccess);\n const onErrorRef = useRef(onError);\n useEffect(() => {\n onSuccessRef.current = onSuccess;\n onErrorRef.current = onError;\n }, [onSuccess, onError]);\n\n const handleSubmit = useCallback(\n async (event?: FormEvent<HTMLFormElement>): Promise<void> => {\n if (event) event.preventDefault();\n if (!stripe || !elements) return;\n if (processing) return;\n\n setProcessing(true);\n setErrorKey(null);\n setErrorMessage('');\n\n // Validate returnUrl at the boundary so even a careless consumer\n // cannot leak payment_intent_client_secret to a third-party origin.\n const safeReturnUrl = validateReturnUrl(returnUrl);\n if (returnUrl !== undefined && safeReturnUrl === null) {\n setErrorKey('payment.error.invalidReturnUrl');\n setErrorMessage(t('payment.error.invalidReturnUrl'));\n onErrorRef.current?.({\n code: 'invalid_return_url',\n translatedMessage: t('payment.error.invalidReturnUrl'),\n });\n setProcessing(false);\n return;\n }\n try {\n const result = await stripe.confirmPayment({\n elements,\n confirmParams: safeReturnUrl ? { return_url: safeReturnUrl } : {},\n redirect: 'if_required',\n });\n\n if (result.error) {\n const code = result.error.code ?? 'generic';\n const key = stripeErrorCodeToI18nKey(code);\n // CRITICAL: sanitise before storing OR forwarding.\n const safe = stripCardLikeDigits(result.error.message ?? '');\n setErrorKey(key);\n setErrorMessage(t(key));\n onErrorRef.current?.({\n code,\n translatedMessage: safe || t(key),\n });\n return;\n }\n\n // Success path — only the PaymentIntent id leaves the wrapper.\n if (result.paymentIntent) {\n onSuccessRef.current?.(result.paymentIntent.id);\n }\n } catch (err: unknown) {\n const raw = err instanceof Error ? err.message : '';\n const safe = stripCardLikeDigits(raw);\n setErrorKey('payment.error.generic');\n setErrorMessage(t('payment.error.generic'));\n onErrorRef.current?.({\n code: 'unexpected',\n translatedMessage: safe || t('payment.error.generic'),\n });\n } finally {\n setProcessing(false);\n }\n },\n [stripe, elements, processing, returnUrl, t],\n );\n\n // Imperative submit hook used by the outer component's ref handle.\n useEffect(() => {\n const host = document.getElementById(idSafe);\n if (!host) return;\n const submitter = () => {\n void handleSubmit();\n };\n host.addEventListener('payment-form:submit', submitter);\n return () => host.removeEventListener('payment-form:submit', submitter);\n }, [idSafe, handleSubmit]);\n\n const submitDisabled = !stripe || !elements || !elementComplete || processing;\n\n return (\n <form\n id={idSafe}\n onSubmit={handleSubmit}\n aria-label={t('payment.ariaLabel')}\n aria-busy={processing || undefined}\n noValidate\n >\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <div className={amountSummaryVariants()}>\n <span className={labelTextVariants()}>\n {t('payment.amountLabel')}\n </span>\n <span className=\"type-title-card\" data-testid=\"payment-amount\">\n {formatPaymentAmount(amount, currency, locale)}\n </span>\n </div>\n\n <label\n htmlFor={paymentFieldId}\n className={fieldLabelVariants()}\n data-testid=\"payment-field\"\n >\n <span className={labelTextVariants()}>\n {t('payment.fields.card')}\n </span>\n <PaymentElement\n id={paymentFieldId}\n options={{\n layout: { type: 'accordion', defaultCollapsed: false },\n }}\n onChange={(ev) => {\n // NOTE: never log `ev` — change events may include hints\n // about field contents. Keep only the boolean completeness.\n setElementComplete(ev.complete === true);\n if (ev.complete) {\n setErrorKey(null);\n setErrorMessage('');\n }\n }}\n />\n </label>\n\n {billingAddress ? (\n <label\n htmlFor={addressFieldId}\n className={fieldLabelVariants()}\n data-testid=\"payment-address\"\n >\n <span className={labelTextVariants()}>\n {t('payment.billingAddress')}\n </span>\n <AddressElement id={addressFieldId} options={{ mode: 'billing' }} />\n </label>\n ) : null}\n\n {errorKey ? (\n <Alert\n id={errorId}\n variant=\"error\"\n live=\"polite\"\n data-testid=\"payment-error\"\n >\n <Alert.Description>{errorMessage}</Alert.Description>\n </Alert>\n ) : null}\n\n <button\n type=\"submit\"\n aria-disabled={submitDisabled || undefined}\n aria-busy={processing || undefined}\n aria-describedby={errorKey ? errorId : undefined}\n className={submitButtonVariants()}\n data-testid=\"payment-submit\"\n >\n {processing ? (\n <>\n <Spinner size=\"sm\" label={t('payment.processing')} />\n <span>{t('payment.processing')}</span>\n </>\n ) : (\n <span>\n {t('payment.submit', {\n amount: formatPaymentAmount(amount, currency, locale),\n })}\n </span>\n )}\n </button>\n </div>\n </form>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* PaymentForm — outer wrapper */\n/* ------------------------------------------------------------------ */\n\n/**\n * Stripe ships a closed union of supported locales; anything outside it\n * must fall through to `'auto'` (Stripe picks the best match from the\n * browser). We also normalise the legacy `cn` code to `zh` per\n * `src/docs/06-i18n.mdx`.\n */\nconst STRIPE_LOCALES = new Set<StripeElementLocale>([\n 'auto',\n 'ar',\n 'bg',\n 'cs',\n 'da',\n 'de',\n 'el',\n 'en',\n 'en-AU',\n 'en-CA',\n 'en-NZ',\n 'en-GB',\n 'es',\n 'es-ES',\n 'es-419',\n 'et',\n 'fi',\n 'fil',\n 'fr',\n 'fr-CA',\n 'fr-FR',\n 'he',\n 'hu',\n 'hr',\n 'id',\n 'it',\n 'it-IT',\n 'ja',\n 'ko',\n 'lt',\n 'lv',\n 'ms',\n 'mt',\n 'nb',\n 'nl',\n 'no',\n 'pl',\n 'pt',\n 'pt-BR',\n 'ro',\n 'ru',\n 'sk',\n 'sl',\n 'sv',\n 'th',\n 'tr',\n 'vi',\n 'zh',\n 'zh-HK',\n 'zh-TW',\n]);\n\nfunction normaliseLocale(input: string): StripeElementLocale {\n if (!input) return 'auto';\n const candidate = input === 'cn' ? 'zh' : input;\n if ((STRIPE_LOCALES as Set<string>).has(candidate)) {\n return candidate as StripeElementLocale;\n }\n // Try stripping region (\"en-US\" → \"en\") before giving up.\n const base = candidate.split('-')[0];\n if ((STRIPE_LOCALES as Set<string>).has(base)) {\n return base as StripeElementLocale;\n }\n return 'auto';\n}\n\nexport const PaymentForm = forwardRef<HTMLDivElement, PaymentFormProps>(\n (\n {\n id,\n clientSecret,\n publishableKey,\n currency,\n amount,\n onSuccess,\n onError,\n billingAddress = false,\n locale,\n ariaLabel,\n returnUrl,\n stripePromise: injectedStripe,\n className,\n },\n ref,\n ) => {\n const { i18n } = useTranslation();\n const activeLocale = normaliseLocale(locale ?? i18n.language ?? 'en');\n\n // Stripe instance — pre-injected (tests/stories) or lazily loaded.\n const [stripeInstance, setStripeInstance] =\n useState<Promise<Stripe | null> | null>(injectedStripe ?? null);\n\n useEffect(() => {\n if (injectedStripe !== undefined) {\n setStripeInstance(injectedStripe);\n return;\n }\n if (!publishableKey) {\n setStripeInstance(null);\n return;\n }\n // `loadStripe` is cached by the SDK — safe to call per mount.\n setStripeInstance(loadStripe(publishableKey));\n }, [injectedStripe, publishableKey]);\n\n // Appearance bridge — snapshot + subscribe.\n const [appearance, setAppearance] = useState<Appearance>(() =>\n getStripeAppearance(),\n );\n useEffect(() => {\n setAppearance(getStripeAppearance());\n const unsubscribe = subscribeStripeAppearance(setAppearance);\n return unsubscribe;\n }, []);\n\n // Imperative handle — dispatch a custom event at the inner form so we\n // can trigger the same submit path as the button without leaking refs\n // through the Stripe `<Elements>` provider (which owns its own tree).\n const hostRef = useRef<HTMLDivElement>(null);\n\n const agentHandle = useMemo<PaymentFormHandle>(\n () => ({\n submit: async () => {\n const form = hostRef.current?.querySelector('form');\n if (form) {\n form.dispatchEvent(\n new CustomEvent('payment-form:submit', { bubbles: true }),\n );\n }\n },\n reset: () => {\n const form = hostRef.current?.querySelector('form');\n if (form instanceof HTMLFormElement) {\n form.reset();\n }\n },\n }),\n [],\n );\n useImperativeHandle(ref, () => hostRef.current as HTMLDivElement, []);\n useAgentRegistration(paymentFormAgent, agentHandle, id);\n\n const elementsOptions = useMemo(\n () => ({\n clientSecret,\n appearance,\n locale: activeLocale,\n }),\n [clientSecret, appearance, activeLocale],\n );\n\n return (\n <div\n ref={hostRef}\n aria-label={ariaLabel}\n className={[formVariants(), className].filter(Boolean).join(' ')}\n data-component=\"payment-form\"\n data-component-id={id}\n data-testid=\"payment-form-root\"\n >\n {stripeInstance && clientSecret ? (\n <Elements\n stripe={stripeInstance}\n options={elementsOptions}\n key={clientSecret}\n >\n <InnerPaymentForm\n amount={amount}\n currency={currency}\n locale={activeLocale}\n billingAddress={billingAddress}\n returnUrl={returnUrl}\n onSuccess={onSuccess}\n onError={onError}\n />\n </Elements>\n ) : (\n <PaymentFormSkeleton\n amount={amount}\n currency={currency}\n locale={activeLocale}\n billingAddress={billingAddress}\n />\n )}\n </div>\n );\n },\n);\n\nPaymentForm.displayName = 'PaymentForm';\n\n/* ------------------------------------------------------------------ */\n/* Skeleton — visual chrome when Stripe hasn't loaded yet */\n/* ------------------------------------------------------------------ */\n\ninterface PaymentFormSkeletonProps {\n amount: number;\n currency: string;\n locale: string;\n billingAddress: boolean;\n}\n\nfunction PaymentFormSkeleton(props: PaymentFormSkeletonProps): ReactElement {\n const { amount, currency, locale, billingAddress } = props;\n const { t } = useTranslation();\n\n return (\n <div\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n data-testid=\"payment-skeleton\"\n aria-busy=\"true\"\n >\n <div className={amountSummaryVariants()}>\n <span className={labelTextVariants()}>{t('payment.amountLabel')}</span>\n <span className=\"type-title-card\">\n {formatPaymentAmount(amount, currency, locale)}\n </span>\n </div>\n <div className={fieldLabelVariants()}>\n <span className={labelTextVariants()}>{t('payment.fields.card')}</span>\n <div\n className=\"ds:[min-block-size:var(--min-target-size)] ds:rounded-[var(--radius-sm)] ds:border ds:border-[color:var(--border)] ds:bg-[var(--muted)]\"\n aria-hidden=\"true\"\n />\n </div>\n {billingAddress ? (\n <div className={fieldLabelVariants()} data-testid=\"payment-address\">\n <span className={labelTextVariants()}>\n {t('payment.billingAddress')}\n </span>\n <div\n className=\"ds:[min-block-size:calc(var(--min-target-size)*2)] ds:rounded-[var(--radius-sm)] ds:border ds:border-[color:var(--border)] ds:bg-[var(--muted)]\"\n aria-hidden=\"true\"\n />\n </div>\n ) : null}\n <button\n type=\"button\"\n aria-disabled=\"true\"\n className={submitButtonVariants()}\n disabled\n >\n <Spinner size=\"sm\" label={t('payment.processing')} />\n <span>{t('payment.processing')}</span>\n </button>\n </div>\n );\n}\n\nexport {\n formVariants as paymentFormVariants,\n submitButtonVariants as paymentSubmitButtonVariants,\n};\n"],"names":["isBrowser","getStripeAppearance","root","target","styles","read","token","subscribeStripeAppearance","onChange","emit","observer","schemeMql","motionMql","paymentFormAgent","handle","ZERO_DECIMAL_CURRENCIES","formatPaymentAmount","amount","currency","locale","iso","major","validateReturnUrl","returnUrl","raw","resolved","stripCardLikeDigits","message","stripeErrorCodeToI18nKey","code","formVariants","cva","fieldLabelVariants","labelTextVariants","amountSummaryVariants","submitButtonVariants","InnerPaymentForm","props","billingAddress","onSuccess","onError","t","useTranslation","stripe","useStripe","elements","useElements","rawId","useId","idSafe","useMemo","paymentFieldId","addressFieldId","errorId","processing","setProcessing","useState","elementComplete","setElementComplete","errorKey","setErrorKey","errorMessage","setErrorMessage","onSuccessRef","useRef","onErrorRef","useEffect","handleSubmit","useCallback","event","safeReturnUrl","_a","result","key","safe","_b","_c","err","_d","host","submitter","submitDisabled","jsx","jsxs","PaymentElement","ev","AddressElement","Alert","Fragment","Spinner","STRIPE_LOCALES","normaliseLocale","input","candidate","base","PaymentForm","forwardRef","id","clientSecret","publishableKey","ariaLabel","injectedStripe","className","ref","i18n","activeLocale","stripeInstance","setStripeInstance","loadStripe","appearance","setAppearance","hostRef","agentHandle","form","useImperativeHandle","useAgentRegistration","elementsOptions","Elements","PaymentFormSkeleton"],"mappings":";;;;;;;;;AAiBA,SAASA,IAAqB;AAC5B,SAAO,OAAO,WAAa,OAAe,OAAO,SAAW;AAC9D;AAEO,SAASC,EAAoBC,GAAgC;AAClE,MAAI,CAACF;AACH,WAAO,EAAE,OAAO,SAAA;AAGlB,QAAMG,IAASD,KAAQ,SAAS,iBAC1BE,IAAS,iBAAiBD,CAAM,GAChCE,IAAO,CAACC,MAAkBF,EAAO,iBAAiBE,CAAK,EAAE,KAAA;AAG/D,SAAO;AAAA,IACL,OAHaH,EAAO,UAAU,SAAS,YAAY,IAGnC,UAAU;AAAA,IAC1B,WAAW;AAAA,MACT,cAAcE,EAAK,WAAW;AAAA,MAC9B,iBAAiBA,EAAK,cAAc;AAAA,MACpC,WAAWA,EAAK,cAAc;AAAA,MAC9B,aAAaA,EAAK,eAAe;AAAA,MACjC,oBAAoBA,EAAK,oBAAoB;AAAA,MAC7C,sBAAsBA,EAAK,oBAAoB;AAAA,MAC/C,cAAcA,EAAK,aAAa;AAAA,MAChC,YAAYA,EAAK,aAAa;AAAA,MAC9B,cAAcA,EAAK,kBAAkB;AAAA;AAAA;AAAA,MAGrC,aAAaA,EAAK,cAAc;AAAA,IAAA;AAAA,IAElC,OAAO;AAAA,MACL,UAAU;AAAA,QACR,iBAAiBA,EAAK,cAAc;AAAA,QACpC,QAAQ,aAAaA,EAAK,UAAU,CAAC;AAAA,QACrC,OAAOA,EAAK,cAAc;AAAA,QAC1B,SAASA,EAAK,cAAc;AAAA,QAC5B,YAAY,gBAAgBA,EAAK,sBAAsB,CAAC;AAAA,MAAA;AAAA,MAE1D,gBAAgB;AAAA,QACd,aAAaA,EAAK,WAAW;AAAA,QAC7B,WAAW,SAASA,EAAK,oBAAoB,CAAC,IAAIA,EAAK,QAAQ,CAAC;AAAA,QAChE,SAAS;AAAA,MAAA;AAAA,MAEX,mBAAmB;AAAA,QACjB,aAAaA,EAAK,eAAe;AAAA,QACjC,OAAOA,EAAK,cAAc;AAAA,MAAA;AAAA,MAE5B,UAAU;AAAA,QACR,OAAOA,EAAK,cAAc;AAAA,QAC1B,YAAYA,EAAK,sBAAsB;AAAA,QACvC,UAAUA,EAAK,gBAAgB;AAAA,MAAA;AAAA,MAEjC,UAAU;AAAA,QACR,OAAOA,EAAK,eAAe;AAAA,QAC3B,UAAUA,EAAK,gBAAgB;AAAA,MAAA;AAAA,MAEjC,QAAQ;AAAA,QACN,QAAQ,aAAaA,EAAK,UAAU,CAAC;AAAA,QACrC,iBAAiBA,EAAK,cAAc;AAAA,QACpC,OAAOA,EAAK,cAAc;AAAA,MAAA;AAAA,MAE5B,kBAAkB;AAAA,QAChB,aAAaA,EAAK,WAAW;AAAA,QAC7B,iBAAiBA,EAAK,cAAc;AAAA,QACpC,OAAOA,EAAK,WAAW;AAAA,MAAA;AAAA,IACzB;AAAA,EACF;AAEJ;AAQO,SAASE,GACdC,GACAN,GACY;AACZ,MAAI,CAACF,IAAa,QAAO;;AAEzB,QAAMG,IAAiB,SAAS,iBAC1BM,IAAO,MAAMD,EAASP,EAAoBC,CAAI,CAAC,GAE/CQ,IAAW,IAAI,iBAAiBD,CAAI;AAC1C,EAAAC,EAAS,QAAQP,GAAQ;AAAA,IACvB,YAAY;AAAA,IACZ,iBAAiB,CAAC,SAAS,OAAO,MAAM;AAAA,EAAA,CACzC;AAED,QAAMQ,IAAY,OAAO,WAAW,8BAA8B,GAC5DC,IAAY,OAAO,WAAW,kCAAkC;AACtE,SAAAD,EAAU,iBAAiB,UAAUF,CAAI,GACzCG,EAAU,iBAAiB,UAAUH,CAAI,GAElC,MAAM;AACX,IAAAC,EAAS,WAAA,GACTC,EAAU,oBAAoB,UAAUF,CAAI,GAC5CG,EAAU,oBAAoB,UAAUH,CAAI;AAAA,EAC9C;AACF;ACnHO,MAAMI,KAAoD;AAAA,EAC/D,IAAI;AAAA,EACJ,cAAc,CAAC,QAAQ;AAAA,EACvB,OAAO,CAAA;AAAA,EACP,SAAS;AAAA,IACP,QAAQ;AAAA,MACN,QAAQ;AAAA,MACR,aACE;AAAA,MACF,QAAQ,CAACC,MAAWA,EAAO,OAAA;AAAA,IAAO;AAAA,IAEpC,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,aACE;AAAA,MACF,QAAQ,CAACA,MAAW;AAClB,QAAAA,EAAO,MAAA;AAAA,MACT;AAAA,IAAA;AAAA,EACF;AAAA,EAEF,UAAU;AAAA,IACR,MAAM,EAAE,MAAM,kBAAkB,OAAO,eAAA;AAAA,IACvC,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ,GCuFMC,yBAA8B,IAAY;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAASC,EACdC,GACAC,GACAC,GACQ;AACR,QAAMC,IAAMF,EAAS,YAAA,GACfG,IAAQN,GAAwB,IAAIK,CAAG,IAAIH,IAASA,IAAS;AACnE,MAAI;AACF,WAAO,IAAI,KAAK,aAAaE,GAAQ;AAAA,MACnC,OAAO;AAAA,MACP,UAAUC;AAAA,IAAA,CACX,EAAE,OAAOC,CAAK;AAAA,EACjB,QAAQ;AAGN,WAAO,IAAI,KAAK,aAAa,MAAM;AAAA,MACjC,OAAO;AAAA,MACP,UAAUD;AAAA,IAAA,CACX,EAAE,OAAOC,CAAK;AAAA,EACjB;AACF;AAiBO,SAASC,GACdC,GACe;AACf,MAAIA,MAAc,OAAW,QAAO;AACpC,QAAMC,IAAMD,EAAU,KAAA;AAEtB,MADIC,MAAQ,MACR,OAAO,SAAW,IAAa,QAAO;AAC1C,MAAI;AACF,UAAMC,IAAW,IAAI,IAAID,GAAK,OAAO,SAAS,IAAI;AAGlD,WADI,EADmB,oBAAI,IAAI,CAAC,SAAS,QAAQ,CAAC,GAC9B,IAAIC,EAAS,QAAQ,KACrCA,EAAS,WAAW,OAAO,SAAS,SAAe,OAChDA,EAAS,SAAA;AAAA,EAClB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAaO,SAASC,EAAoBC,GAAyB;AAC3D,SAAKA,KAGEA,EAAQ,QAAQ,WAAW,MAAM;AAC1C;AAOO,SAASC,GAAyBC,GAAkC;AACzE,UAAQA,GAAA;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;AAMA,MAAMC,KAAeC;AAAA,EACnB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AACZ,GAEMC,IAAqBD;AAAA,EACzB,CAAC,gDAAgD,EAAE,KAAK,GAAG;AAC7D,GAEME,IAAoBF;AAAA,EACxB,CAAC,cAAc,6BAA6B,EAAE,KAAK,GAAG;AACxD,GAEMG,IAAwBH;AAAA,EAC5B;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AACZ,GAEMI,KAAuBJ;AAAA,EAC3B;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AACZ;AAgBA,SAASK,GAAiBC,GAA4C;AACpE,QAAM;AAAA,IACJ,QAAApB;AAAA,IACA,UAAAC;AAAA,IACA,QAAAC;AAAA,IACA,gBAAAmB;AAAA,IACA,WAAAf;AAAA,IACA,WAAAgB;AAAA,IACA,SAAAC;AAAA,EAAA,IACEH,GAEE,EAAE,GAAAI,EAAA,IAAMC,EAAA,GACRC,IAASC,GAAA,GACTC,IAAWC,GAAA,GAEXC,IAAQC,GAAA,GACRC,IAASC;AAAA,IACb,MAAM,OAAOH,EAAM,QAAQ,mBAAmB,EAAE,CAAC;AAAA,IACjD,CAACA,CAAK;AAAA,EAAA,GAEFI,IAAiB,GAAGF,CAAM,YAC1BG,IAAiB,GAAGH,CAAM,YAC1BI,IAAU,GAAGJ,CAAM,UAEnB,CAACK,GAAYC,CAAa,IAAIC,EAAS,EAAK,GAC5C,CAACC,GAAiBC,CAAkB,IAAIF,EAAS,EAAK,GACtD,CAACG,GAAUC,CAAW,IAAIJ,EAAwB,IAAI,GACtD,CAACK,GAAcC,CAAe,IAAIN,EAAiB,EAAE,GAErDO,IAAeC,EAAOzB,CAAS,GAC/B0B,IAAaD,EAAOxB,CAAO;AACjC,EAAA0B,EAAU,MAAM;AACd,IAAAH,EAAa,UAAUxB,GACvB0B,EAAW,UAAUzB;AAAA,EACvB,GAAG,CAACD,GAAWC,CAAO,CAAC;AAEvB,QAAM2B,IAAeC;AAAA,IACnB,OAAOC,MAAsD;;AAG3D,UAFIA,OAAa,eAAA,GACb,CAAC1B,KAAU,CAACE,KACZS,EAAY;AAEhB,MAAAC,EAAc,EAAI,GAClBK,EAAY,IAAI,GAChBE,EAAgB,EAAE;AAIlB,YAAMQ,IAAgBhD,GAAkBC,CAAS;AACjD,UAAIA,MAAc,UAAa+C,MAAkB,MAAM;AACrD,QAAAV,EAAY,gCAAgC,GAC5CE,EAAgBrB,EAAE,gCAAgC,CAAC,IACnD8B,IAAAN,EAAW,YAAX,QAAAM,EAAA,KAAAN,GAAqB;AAAA,UACnB,MAAM;AAAA,UACN,mBAAmBxB,EAAE,gCAAgC;AAAA,QAAA,IAEvDc,EAAc,EAAK;AACnB;AAAA,MACF;AACA,UAAI;AACF,cAAMiB,IAAS,MAAM7B,EAAO,eAAe;AAAA,UACzC,UAAAE;AAAA,UACA,eAAeyB,IAAgB,EAAE,YAAYA,EAAA,IAAkB,CAAA;AAAA,UAC/D,UAAU;AAAA,QAAA,CACX;AAED,YAAIE,EAAO,OAAO;AAChB,gBAAM3C,IAAO2C,EAAO,MAAM,QAAQ,WAC5BC,IAAM7C,GAAyBC,CAAI,GAEnC6C,KAAOhD,EAAoB8C,EAAO,MAAM,WAAW,EAAE;AAC3D,UAAAZ,EAAYa,CAAG,GACfX,EAAgBrB,EAAEgC,CAAG,CAAC,IACtBE,IAAAV,EAAW,YAAX,QAAAU,EAAA,KAAAV,GAAqB;AAAA,YACnB,MAAApC;AAAA,YACA,mBAAmB6C,MAAQjC,EAAEgC,CAAG;AAAA,UAAA;AAElC;AAAA,QACF;AAGA,QAAID,EAAO,mBACTI,IAAAb,EAAa,YAAb,QAAAa,EAAA,KAAAb,GAAuBS,EAAO,cAAc;AAAA,MAEhD,SAASK,GAAc;AACrB,cAAMrD,IAAMqD,aAAe,QAAQA,EAAI,UAAU,IAC3CH,IAAOhD,EAAoBF,CAAG;AACpC,QAAAoC,EAAY,uBAAuB,GACnCE,EAAgBrB,EAAE,uBAAuB,CAAC,IAC1CqC,IAAAb,EAAW,YAAX,QAAAa,EAAA,KAAAb,GAAqB;AAAA,UACnB,MAAM;AAAA,UACN,mBAAmBS,KAAQjC,EAAE,uBAAuB;AAAA,QAAA;AAAA,MAExD,UAAA;AACE,QAAAc,EAAc,EAAK;AAAA,MACrB;AAAA,IACF;AAAA,IACA,CAACZ,GAAQE,GAAUS,GAAY/B,GAAWkB,CAAC;AAAA,EAAA;AAI7C,EAAAyB,EAAU,MAAM;AACd,UAAMa,IAAO,SAAS,eAAe9B,CAAM;AAC3C,QAAI,CAAC8B,EAAM;AACX,UAAMC,IAAY,MAAM;AACtB,MAAKb,EAAA;AAAA,IACP;AACA,WAAAY,EAAK,iBAAiB,uBAAuBC,CAAS,GAC/C,MAAMD,EAAK,oBAAoB,uBAAuBC,CAAS;AAAA,EACxE,GAAG,CAAC/B,GAAQkB,CAAY,CAAC;AAEzB,QAAMc,KAAiB,CAACtC,KAAU,CAACE,KAAY,CAACY,KAAmBH;AAEnE,SACE,gBAAA4B;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAIjC;AAAA,MACJ,UAAUkB;AAAA,MACV,cAAY1B,EAAE,mBAAmB;AAAA,MACjC,aAAWa,KAAc;AAAA,MACzB,YAAU;AAAA,MAEV,UAAA,gBAAA6B,EAAC,OAAA,EAAI,WAAU,kDACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAWjD,EAAA,GACd,UAAA;AAAA,UAAA,gBAAAgD,EAAC,UAAK,WAAWjD,EAAA,GACd,UAAAQ,EAAE,qBAAqB,GAC1B;AAAA,UACA,gBAAAyC,EAAC,QAAA,EAAK,WAAU,mBAAkB,eAAY,kBAC3C,UAAAlE,EAAoBC,GAAQC,GAAUC,CAAM,EAAA,CAC/C;AAAA,QAAA,GACF;AAAA,QAEA,gBAAAgE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAShC;AAAA,YACT,WAAWnB,EAAA;AAAA,YACX,eAAY;AAAA,YAEZ,UAAA;AAAA,cAAA,gBAAAkD,EAAC,UAAK,WAAWjD,EAAA,GACd,UAAAQ,EAAE,qBAAqB,GAC1B;AAAA,cACA,gBAAAyC;AAAA,gBAACE;AAAA,gBAAA;AAAA,kBACC,IAAIjC;AAAA,kBACJ,SAAS;AAAA,oBACP,QAAQ,EAAE,MAAM,aAAa,kBAAkB,GAAA;AAAA,kBAAM;AAAA,kBAEvD,UAAU,CAACkC,MAAO;AAGhB,oBAAA3B,EAAmB2B,EAAG,aAAa,EAAI,GACnCA,EAAG,aACLzB,EAAY,IAAI,GAChBE,EAAgB,EAAE;AAAA,kBAEtB;AAAA,gBAAA;AAAA,cAAA;AAAA,YACF;AAAA,UAAA;AAAA,QAAA;AAAA,QAGDxB,IACC,gBAAA6C;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS/B;AAAA,YACT,WAAWpB,EAAA;AAAA,YACX,eAAY;AAAA,YAEZ,UAAA;AAAA,cAAA,gBAAAkD,EAAC,UAAK,WAAWjD,EAAA,GACd,UAAAQ,EAAE,wBAAwB,GAC7B;AAAA,cACA,gBAAAyC,EAACI,MAAe,IAAIlC,GAAgB,SAAS,EAAE,MAAM,YAAU,CAAG;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA,IAElE;AAAA,QAEHO,IACC,gBAAAuB;AAAA,UAACK;AAAA,UAAA;AAAA,YACC,IAAIlC;AAAA,YACJ,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,eAAY;AAAA,YAEZ,UAAA,gBAAA6B,EAACK,EAAM,aAAN,EAAmB,UAAA1B,EAAA,CAAa;AAAA,UAAA;AAAA,QAAA,IAEjC;AAAA,QAEJ,gBAAAqB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,iBAAeD,MAAkB;AAAA,YACjC,aAAW3B,KAAc;AAAA,YACzB,oBAAkBK,IAAWN,IAAU;AAAA,YACvC,WAAWlB,GAAA;AAAA,YACX,eAAY;AAAA,YAEX,cACC,gBAAAgD,EAAAK,IAAA,EACE,UAAA;AAAA,cAAA,gBAAAN,EAACO,KAAQ,MAAK,MAAK,OAAOhD,EAAE,oBAAoB,GAAG;AAAA,cACnD,gBAAAyC,EAAC,QAAA,EAAM,UAAAzC,EAAE,oBAAoB,EAAA,CAAE;AAAA,YAAA,EAAA,CACjC,IAEA,gBAAAyC,EAAC,QAAA,EACE,UAAAzC,EAAE,kBAAkB;AAAA,cACnB,QAAQzB,EAAoBC,GAAQC,GAAUC,CAAM;AAAA,YAAA,CACrD,EAAA,CACH;AAAA,UAAA;AAAA,QAAA;AAAA,MAEJ,EAAA,CACF;AAAA,IAAA;AAAA,EAAA;AAGN;AAYA,MAAMuE,wBAAqB,IAAyB;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAASC,GAAgBC,GAAoC;AAC3D,MAAI,CAACA,EAAO,QAAO;AACnB,QAAMC,IAAYD,MAAU,OAAO,OAAOA;AAC1C,MAAKF,EAA+B,IAAIG,CAAS;AAC/C,WAAOA;AAGT,QAAMC,IAAOD,EAAU,MAAM,GAAG,EAAE,CAAC;AACnC,SAAKH,EAA+B,IAAII,CAAI,IACnCA,IAEF;AACT;AAEO,MAAMC,KAAcC;AAAA,EACzB,CACE;AAAA,IACE,IAAAC;AAAA,IACA,cAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,UAAAjF;AAAA,IACA,QAAAD;AAAA,IACA,WAAAsB;AAAA,IACA,SAAAC;AAAA,IACA,gBAAAF,IAAiB;AAAA,IACjB,QAAAnB;AAAA,IACA,WAAAiF;AAAA,IACA,WAAA7E;AAAA,IACA,eAAe8E;AAAA,IACf,WAAAC;AAAA,EAAA,GAEFC,MACG;AACH,UAAM,EAAE,MAAAC,EAAA,IAAS9D,EAAA,GACX+D,IAAed,GAAgBxE,KAAUqF,EAAK,YAAY,IAAI,GAG9D,CAACE,GAAgBC,CAAiB,IACtCnD,EAAwC6C,KAAkB,IAAI;AAEhE,IAAAnC,EAAU,MAAM;AACd,UAAImC,MAAmB,QAAW;AAChC,QAAAM,EAAkBN,CAAc;AAChC;AAAA,MACF;AACA,UAAI,CAACF,GAAgB;AACnB,QAAAQ,EAAkB,IAAI;AACtB;AAAA,MACF;AAEA,MAAAA,EAAkBC,GAAWT,CAAc,CAAC;AAAA,IAC9C,GAAG,CAACE,GAAgBF,CAAc,CAAC;AAGnC,UAAM,CAACU,GAAYC,CAAa,IAAItD;AAAA,MAAqB,MACvDvD,EAAA;AAAA,IAAoB;AAEtB,IAAAiE,EAAU,OACR4C,EAAc7G,GAAqB,GACfM,GAA0BuG,CAAa,IAE1D,CAAA,CAAE;AAKL,UAAMC,IAAU/C,EAAuB,IAAI,GAErCgD,IAAc9D;AAAA,MAClB,OAAO;AAAA,QACL,QAAQ,YAAY;;AAClB,gBAAM+D,KAAO1C,IAAAwC,EAAQ,YAAR,gBAAAxC,EAAiB,cAAc;AAC5C,UAAI0C,KACFA,EAAK;AAAA,YACH,IAAI,YAAY,uBAAuB,EAAE,SAAS,IAAM;AAAA,UAAA;AAAA,QAG9D;AAAA,QACA,OAAO,MAAM;;AACX,gBAAMA,KAAO1C,IAAAwC,EAAQ,YAAR,gBAAAxC,EAAiB,cAAc;AAC5C,UAAI0C,aAAgB,mBAClBA,EAAK,MAAA;AAAA,QAET;AAAA,MAAA;AAAA,MAEF,CAAA;AAAA,IAAC;AAEH,IAAAC,GAAoBX,GAAK,MAAMQ,EAAQ,SAA2B,CAAA,CAAE,GACpEI,GAAqBtG,IAAkBmG,GAAaf,CAAE;AAEtD,UAAMmB,IAAkBlE;AAAA,MACtB,OAAO;AAAA,QACL,cAAAgD;AAAA,QACA,YAAAW;AAAA,QACA,QAAQJ;AAAA,MAAA;AAAA,MAEV,CAACP,GAAcW,GAAYJ,CAAY;AAAA,IAAA;AAGzC,WACE,gBAAAvB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAK6B;AAAA,QACL,cAAYX;AAAA,QACZ,WAAW,CAACtE,GAAA,GAAgBwE,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,QAC/D,kBAAe;AAAA,QACf,qBAAmBL;AAAA,QACnB,eAAY;AAAA,QAEX,eAAkBC,IACjB,gBAAAhB;AAAA,UAACmC;AAAA,UAAA;AAAA,YACC,QAAQX;AAAA,YACR,SAASU;AAAA,YAGT,UAAA,gBAAAlC;AAAA,cAAC9C;AAAA,cAAA;AAAA,gBACC,QAAAnB;AAAA,gBACA,UAAAC;AAAA,gBACA,QAAQuF;AAAA,gBACR,gBAAAnE;AAAA,gBACA,WAAAf;AAAA,gBACA,WAAAgB;AAAA,gBACA,SAAAC;AAAA,cAAA;AAAA,YAAA;AAAA,UACF;AAAA,UAVK0D;AAAA,QAAA,IAaP,gBAAAhB;AAAA,UAACoC;AAAA,UAAA;AAAA,YACC,QAAArG;AAAA,YACA,UAAAC;AAAA,YACA,QAAQuF;AAAA,YACR,gBAAAnE;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAIR;AACF;AAEAyD,GAAY,cAAc;AAa1B,SAASuB,GAAoBjF,GAA+C;AAC1E,QAAM,EAAE,QAAApB,GAAQ,UAAAC,GAAU,QAAAC,GAAQ,gBAAAmB,MAAmBD,GAC/C,EAAE,GAAAI,EAAA,IAAMC,EAAA;AAEd,SACE,gBAAAyC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA,MACZ,aAAU;AAAA,MAEV,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAWjD,EAAA,GACd,UAAA;AAAA,UAAA,gBAAAgD,EAAC,UAAK,WAAWjD,EAAA,GAAsB,UAAAQ,EAAE,qBAAqB,GAAE;AAAA,UAChE,gBAAAyC,EAAC,UAAK,WAAU,mBACb,YAAoBjE,GAAQC,GAAUC,CAAM,EAAA,CAC/C;AAAA,QAAA,GACF;AAAA,QACA,gBAAAgE,EAAC,OAAA,EAAI,WAAWnD,EAAA,GACd,UAAA;AAAA,UAAA,gBAAAkD,EAAC,UAAK,WAAWjD,EAAA,GAAsB,UAAAQ,EAAE,qBAAqB,GAAE;AAAA,UAChE,gBAAAyC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,eAAY;AAAA,YAAA;AAAA,UAAA;AAAA,QACd,GACF;AAAA,QACC5C,IACC,gBAAA6C,EAAC,OAAA,EAAI,WAAWnD,KAAsB,eAAY,mBAChD,UAAA;AAAA,UAAA,gBAAAkD,EAAC,UAAK,WAAWjD,EAAA,GACd,UAAAQ,EAAE,wBAAwB,GAC7B;AAAA,UACA,gBAAAyC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,eAAY;AAAA,YAAA;AAAA,UAAA;AAAA,QACd,EAAA,CACF,IACE;AAAA,QACJ,gBAAAC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,iBAAc;AAAA,YACd,WAAWhD,GAAA;AAAA,YACX,UAAQ;AAAA,YAER,UAAA;AAAA,cAAA,gBAAA+C,EAACO,KAAQ,MAAK,MAAK,OAAOhD,EAAE,oBAAoB,GAAG;AAAA,cACnD,gBAAAyC,EAAC,QAAA,EAAM,UAAAzC,EAAE,oBAAoB,EAAA,CAAE;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACjC;AAAA,IAAA;AAAA,EAAA;AAGN;"}