@alfadocs/ui-kit-debug 0.94.0 → 0.96.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 (134) hide show
  1. package/dist/_chunks/{apexcharts-theme-fAQXLIMW.js → apexcharts-theme-B_AxGC_h.js} +25 -20
  2. package/dist/_chunks/apexcharts-theme-B_AxGC_h.js.map +1 -0
  3. package/dist/_chunks/chart-DR68TJD5.js +705 -0
  4. package/dist/_chunks/chart-DR68TJD5.js.map +1 -0
  5. package/dist/_chunks/{date-range-picker-Cfv4Sr63.js → date-range-picker-pEG3Ln3i.js} +314 -297
  6. package/dist/_chunks/date-range-picker-pEG3Ln3i.js.map +1 -0
  7. package/dist/_chunks/{link-cell-renderer-_LDZhY4r.js → link-cell-renderer-flfZh2qY.js} +2 -2
  8. package/dist/_chunks/{link-cell-renderer-_LDZhY4r.js.map → link-cell-renderer-flfZh2qY.js.map} +1 -1
  9. package/dist/_chunks/{patient-table-CFM92QqU.js → patient-table-CvZTIM2R.js} +2 -2
  10. package/dist/_chunks/{patient-table-CFM92QqU.js.map → patient-table-CvZTIM2R.js.map} +1 -1
  11. package/dist/_chunks/{radiograph-panel.agent-DDnDGVpN.js → radiograph-panel.agent-AsXJBr1p.js} +2 -2
  12. package/dist/_chunks/{radiograph-panel.agent-DDnDGVpN.js.map → radiograph-panel.agent-AsXJBr1p.js.map} +1 -1
  13. package/dist/_chunks/signature-request-BzXTV_RH.js +403 -0
  14. package/dist/_chunks/signature-request-BzXTV_RH.js.map +1 -0
  15. package/dist/_chunks/{sparkline-o6JH4O66.js → sparkline-DcXqRZoq.js} +2 -2
  16. package/dist/_chunks/{sparkline-o6JH4O66.js.map → sparkline-DcXqRZoq.js.map} +1 -1
  17. package/dist/agent-catalog.json +10 -6
  18. package/dist/agent-i18n/en.json +1 -1
  19. package/dist/components/chart/chart.d.ts +12 -5
  20. package/dist/components/chart/chart.d.ts.map +1 -1
  21. package/dist/components/chart/index.js +1 -1
  22. package/dist/components/data-table/index.js +1 -1
  23. package/dist/components/date-range-picker/date-range-picker.d.ts +10 -1
  24. package/dist/components/date-range-picker/date-range-picker.d.ts.map +1 -1
  25. package/dist/components/date-range-picker/index.js +1 -1
  26. package/dist/components/patient-table/index.js +1 -1
  27. package/dist/components/radiograph-panel/index.js +1 -1
  28. package/dist/components/sparkline/index.js +1 -1
  29. package/dist/i18n/locales/ar.d.ts +3 -1
  30. package/dist/i18n/locales/ar.d.ts.map +1 -1
  31. package/dist/i18n/locales/ar.js +3 -1
  32. package/dist/i18n/locales/ar.js.map +1 -1
  33. package/dist/i18n/locales/de.d.ts +3 -1
  34. package/dist/i18n/locales/de.d.ts.map +1 -1
  35. package/dist/i18n/locales/de.js +3 -1
  36. package/dist/i18n/locales/de.js.map +1 -1
  37. package/dist/i18n/locales/el.d.ts +3 -1
  38. package/dist/i18n/locales/el.d.ts.map +1 -1
  39. package/dist/i18n/locales/el.js +3 -1
  40. package/dist/i18n/locales/el.js.map +1 -1
  41. package/dist/i18n/locales/en.d.ts +3 -1
  42. package/dist/i18n/locales/en.d.ts.map +1 -1
  43. package/dist/i18n/locales/en.js +3 -1
  44. package/dist/i18n/locales/en.js.map +1 -1
  45. package/dist/i18n/locales/es.d.ts +3 -1
  46. package/dist/i18n/locales/es.d.ts.map +1 -1
  47. package/dist/i18n/locales/es.js +3 -1
  48. package/dist/i18n/locales/es.js.map +1 -1
  49. package/dist/i18n/locales/fr.d.ts +3 -1
  50. package/dist/i18n/locales/fr.d.ts.map +1 -1
  51. package/dist/i18n/locales/fr.js +3 -1
  52. package/dist/i18n/locales/fr.js.map +1 -1
  53. package/dist/i18n/locales/hi.d.ts +3 -1
  54. package/dist/i18n/locales/hi.d.ts.map +1 -1
  55. package/dist/i18n/locales/hi.js +3 -1
  56. package/dist/i18n/locales/hi.js.map +1 -1
  57. package/dist/i18n/locales/it.d.ts +3 -1
  58. package/dist/i18n/locales/it.d.ts.map +1 -1
  59. package/dist/i18n/locales/it.js +3 -1
  60. package/dist/i18n/locales/it.js.map +1 -1
  61. package/dist/i18n/locales/ja.d.ts +3 -1
  62. package/dist/i18n/locales/ja.d.ts.map +1 -1
  63. package/dist/i18n/locales/ja.js +3 -1
  64. package/dist/i18n/locales/ja.js.map +1 -1
  65. package/dist/i18n/locales/nl.d.ts +3 -1
  66. package/dist/i18n/locales/nl.d.ts.map +1 -1
  67. package/dist/i18n/locales/nl.js +3 -1
  68. package/dist/i18n/locales/nl.js.map +1 -1
  69. package/dist/i18n/locales/pl.d.ts +3 -1
  70. package/dist/i18n/locales/pl.d.ts.map +1 -1
  71. package/dist/i18n/locales/pl.js +3 -1
  72. package/dist/i18n/locales/pl.js.map +1 -1
  73. package/dist/i18n/locales/pt.d.ts +3 -1
  74. package/dist/i18n/locales/pt.d.ts.map +1 -1
  75. package/dist/i18n/locales/pt.js +3 -1
  76. package/dist/i18n/locales/pt.js.map +1 -1
  77. package/dist/i18n/locales/ro.d.ts +3 -1
  78. package/dist/i18n/locales/ro.d.ts.map +1 -1
  79. package/dist/i18n/locales/ro.js +3 -1
  80. package/dist/i18n/locales/ro.js.map +1 -1
  81. package/dist/i18n/locales/ru.d.ts +3 -1
  82. package/dist/i18n/locales/ru.d.ts.map +1 -1
  83. package/dist/i18n/locales/ru.js +3 -1
  84. package/dist/i18n/locales/ru.js.map +1 -1
  85. package/dist/i18n/locales/sq.d.ts +3 -1
  86. package/dist/i18n/locales/sq.d.ts.map +1 -1
  87. package/dist/i18n/locales/sq.js +3 -1
  88. package/dist/i18n/locales/sq.js.map +1 -1
  89. package/dist/i18n/locales/sv.d.ts +3 -1
  90. package/dist/i18n/locales/sv.d.ts.map +1 -1
  91. package/dist/i18n/locales/sv.js +3 -1
  92. package/dist/i18n/locales/sv.js.map +1 -1
  93. package/dist/i18n/locales/tr.d.ts +3 -1
  94. package/dist/i18n/locales/tr.d.ts.map +1 -1
  95. package/dist/i18n/locales/tr.js +3 -1
  96. package/dist/i18n/locales/tr.js.map +1 -1
  97. package/dist/i18n/locales/zh.d.ts +3 -1
  98. package/dist/i18n/locales/zh.d.ts.map +1 -1
  99. package/dist/i18n/locales/zh.js +3 -1
  100. package/dist/i18n/locales/zh.js.map +1 -1
  101. package/dist/index.js +7 -7
  102. package/dist/locales/ar.json +3 -1
  103. package/dist/locales/de.json +3 -1
  104. package/dist/locales/el.json +3 -1
  105. package/dist/locales/en.json +3 -1
  106. package/dist/locales/es.json +3 -1
  107. package/dist/locales/fr.json +3 -1
  108. package/dist/locales/hi.json +3 -1
  109. package/dist/locales/it.json +3 -1
  110. package/dist/locales/ja.json +3 -1
  111. package/dist/locales/nl.json +3 -1
  112. package/dist/locales/pl.json +3 -1
  113. package/dist/locales/pt.json +3 -1
  114. package/dist/locales/ro.json +3 -1
  115. package/dist/locales/ru.json +3 -1
  116. package/dist/locales/sq.json +3 -1
  117. package/dist/locales/sv.json +3 -1
  118. package/dist/locales/tr.json +3 -1
  119. package/dist/locales/zh.json +3 -1
  120. package/dist/patterns/signature-request/index.d.ts +1 -1
  121. package/dist/patterns/signature-request/index.d.ts.map +1 -1
  122. package/dist/patterns/signature-request/index.js +1 -1
  123. package/dist/patterns/signature-request/signature-request.d.ts +30 -3
  124. package/dist/patterns/signature-request/signature-request.d.ts.map +1 -1
  125. package/dist/tokens/apexcharts-theme.d.ts +19 -33
  126. package/dist/tokens/apexcharts-theme.d.ts.map +1 -1
  127. package/dist/tokens.css +1 -1
  128. package/package.json +1 -1
  129. package/dist/_chunks/apexcharts-theme-fAQXLIMW.js.map +0 -1
  130. package/dist/_chunks/chart-DqxVCm1I.js +0 -664
  131. package/dist/_chunks/chart-DqxVCm1I.js.map +0 -1
  132. package/dist/_chunks/date-range-picker-Cfv4Sr63.js.map +0 -1
  133. package/dist/_chunks/signature-request-D_6jgDZd.js +0 -324
  134. package/dist/_chunks/signature-request-D_6jgDZd.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature-request-BzXTV_RH.js","sources":["../../node_modules/lucide-react/dist/esm/icons/tablet.mjs","../../node_modules/lucide-react/dist/esm/icons/user-plus.mjs","../../src/patterns/signature-request/signature-request.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"16\", height: \"20\", x: \"4\", y: \"2\", rx: \"2\", ry: \"2\", key: \"76otgf\" }],\n [\"line\", { x1: \"12\", x2: \"12.01\", y1: \"18\", y2: \"18\", key: \"1dp563\" }]\n];\nconst Tablet = createLucideIcon(\"tablet\", __iconNode);\n\nexport { __iconNode, Tablet as default };\n//# sourceMappingURL=tablet.mjs.map\n","/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\", key: \"1yyitq\" }],\n [\"circle\", { cx: \"9\", cy: \"7\", r: \"4\", key: \"nufk8\" }],\n [\"line\", { x1: \"19\", x2: \"19\", y1: \"8\", y2: \"14\", key: \"1bvyxn\" }],\n [\"line\", { x1: \"22\", x2: \"16\", y1: \"11\", y2: \"11\", key: \"1shjgl\" }]\n];\nconst UserPlus = createLucideIcon(\"user-plus\", __iconNode);\n\nexport { __iconNode, UserPlus as default };\n//# sourceMappingURL=user-plus.mjs.map\n","/**\n * SignatureRequestModal — the practice-side \"Documenti firmati\" modal that\n * dispatches a document-signature request: assign the operator who must\n * counter-sign (or leave the request unassigned) and how their request is\n * delivered (their system-defined default channel arrives pre-checked),\n * build the patient-side signer roster (up to `maxSigners`, each with their\n * own delivery channel and, for on-device signing, an OTP waiver), and send.\n *\n * Runtime pattern: real consuming apps mount this in production (surfaced via\n * `src/patterns/index.ts` and the `./patterns/signature-request` subpath).\n * The component owns the form state — re-seeded from the `initial*` props\n * every time `open` flips back to `true` — while the host owns `open`, the\n * option lists, and what happens on submit. Multiple on-device signers sign\n * sequentially in roster order — the execution side is the Signing pattern's\n * multi-signer flow; this modal only encodes the intents.\n */\nimport {\n forwardRef,\n useEffect,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n Mail,\n MessageSquare,\n PenLine,\n Plus,\n Tablet,\n UserPlus,\n X,\n} from 'lucide-react';\nimport { Dialog } from '../../components/dialog';\nimport { Button } from '../../components/button';\nimport { IconButton } from '../../components/icon-button';\nimport { Checkbox } from '../../components/checkbox';\nimport { WhatsAppGlyph } from '../../components/whatsapp-button';\nimport { Select } from '../../components/select';\nimport { Switch } from '../../components/switch';\nimport { Alert } from '../../components/alert';\nimport { InfoTip } from '../../components/info-tip';\nimport { Separator } from '../../components/separator';\nimport { Avatar } from '../../components/avatar';\n\n/** Delivery channel for one signer's signature request. */\nexport type SignatureChannel = 'sms' | 'email' | 'whatsapp' | 'on-device';\n\n/**\n * Delivery channel for the operator's counter-sign request. The default is\n * system defined — the assigned operator's own `defaultChannel` (e-mail or\n * SMS) arrives pre-checked; `'on-device'` is offerable only while a roster\n * signer also signs on this device.\n */\nexport type OperatorChannel = 'sms' | 'email' | 'on-device';\n\n/** One selectable person/role for the operator or signer selects. */\nexport interface SignerOption {\n value: string;\n label: string;\n /**\n * Delivery channels this person can actually receive. Omit (or pass an\n * empty list) to offer every channel. Hosts gate this from per-patient\n * capability flags — e.g. a patient with no mobile number drops `'sms'`\n * and `'whatsapp'`. Only meaningful for signer options, not operators.\n */\n availableChannels?: SignatureChannel[];\n /**\n * The delivery channel this operator's own settings resolve to — the\n * system-defined default, pre-checked when the operator is assigned.\n * Falls back to `'email'` when omitted. Only meaningful for operator\n * options, not signers.\n */\n defaultChannel?: 'sms' | 'email';\n}\n\n/** One patient-side signer row in the submission. */\nexport interface SignerRequest {\n signerId: string;\n channel: SignatureChannel;\n /** Only meaningful when `channel` is `'on-device'`. */\n skipOtp?: boolean;\n}\n\n/** Payload handed to `onRequestSignature`. */\nexport interface SignatureRequestSubmission {\n /** `null` when the counter-signing operator is left unassigned. */\n operatorId: string | null;\n /**\n * How the operator's counter-sign request is delivered. `null` while the\n * operator is unassigned. Defaults to the operator's own system-defined\n * channel unless explicitly changed in the modal.\n */\n operatorChannel: OperatorChannel | null;\n /** 1..N signers; on-device signers sign sequentially in this order. */\n signers: SignerRequest[];\n}\n\nexport interface SignatureRequestModalProps {\n /** Controlled open state. Reopening re-seeds the form from `initial*`. */\n open: boolean;\n /**\n * Fires when the dialog requests a state change (<kbd>Esc</kbd> or the\n * footer Close button). `false` is the dismiss signal — hosts typically\n * persist a \"dismissed this session\" flag there.\n */\n onOpenChange: (open: boolean) => void;\n /** Operators offered as the counter-signing signer. */\n operators: SignerOption[];\n /** Patient-side people/roles offered in each signer row. */\n signerOptions: SignerOption[];\n /** Enables the \"Assign to me\" shortcut targeting this operator. */\n currentOperatorId?: string;\n /** Offer an \"Assign later\" option in the operator select. Default `true`. */\n allowAssignLater?: boolean;\n /**\n * Preselected operator; `null` preselects \"Assign later\" (honoured only\n * while `allowAssignLater` — otherwise the first operator is seeded).\n */\n initialOperatorId?: string | null;\n /**\n * Preselected operator delivery channel. Defaults to the seeded operator's\n * system-defined `defaultChannel`. `'on-device'` is honoured only while a\n * seeded roster signer also signs on this device.\n */\n initialOperatorChannel?: OperatorChannel;\n /** Seed the signer roster. Defaults to the first option, on-device. */\n initialSigners?: SignerRequest[];\n /** Cap on roster size. Default `2`. */\n maxSigners?: number;\n /** Disables all inputs and shows the primary action as loading. */\n busy?: boolean;\n /** Consumer-translated error shown above the footer (e.g. server failure). */\n error?: string;\n /** Override the dialog title. Defaults to the `ui.*` string. */\n title?: string;\n /** Override the dialog description. Defaults to the `ui.*` string. */\n description?: string;\n /** Receives the completed submission. The host closes via `onOpenChange`. */\n onRequestSignature: (submission: SignatureRequestSubmission) => void;\n /**\n * Extra attributes for the portaled dialog surface (e.g. `dir`/`lang`\n * when the host pins a locale below `<html>`, or a test id).\n */\n contentProps?: ComponentPropsWithoutRef<'div'>;\n}\n\nconst ASSIGN_LATER = '__assign-later__';\n\n/** Canonical channel display order; per-signer availability filters this. */\nconst CHANNEL_ORDER: SignatureChannel[] = [\n 'sms',\n 'email',\n 'whatsapp',\n 'on-device',\n];\n\n/** Internal roster row — `rowId` keys the DOM so editing a row's person\n * never remounts the row (which would drop keyboard focus). */\ninterface RosterRow extends SignerRequest {\n rowId: number;\n}\n\nfunction labelFor(options: SignerOption[], value: string): string {\n return options.find((option) => option.value === value)?.label ?? '';\n}\n\nexport const SignatureRequestModal = forwardRef<\n HTMLDivElement,\n SignatureRequestModalProps\n>(\n (\n {\n open,\n onOpenChange,\n operators,\n signerOptions,\n currentOperatorId,\n allowAssignLater = true,\n initialOperatorId,\n initialOperatorChannel,\n initialSigners,\n maxSigners = 2,\n busy = false,\n error,\n title,\n description,\n onRequestSignature,\n contentProps,\n },\n ref,\n ) => {\n const { t } = useTranslation();\n\n const nextRowId = useRef(0);\n const addButtonRef = useRef<HTMLButtonElement>(null);\n\n // Channels a given signer can receive on — the person's `availableChannels`\n // filtered into canonical order; omitted/empty means every channel.\n const channelsFor = (signerId: string): SignatureChannel[] => {\n const allowed = signerOptions.find(\n (option) => option.value === signerId,\n )?.availableChannels;\n return allowed && allowed.length > 0\n ? CHANNEL_ORDER.filter((channel) => allowed.includes(channel))\n : CHANNEL_ORDER;\n };\n\n // First available channel for a signer, preferring `preferred` when offered.\n const resolveChannel = (\n signerId: string,\n preferred: SignatureChannel,\n ): SignatureChannel => {\n const available = channelsFor(signerId);\n return available.includes(preferred) ? preferred : available[0];\n };\n\n const seedOperator = () => {\n if (initialOperatorId === null) {\n return allowAssignLater\n ? ASSIGN_LATER\n : (operators[0]?.value ?? ASSIGN_LATER);\n }\n return (\n initialOperatorId ??\n operators[0]?.value ??\n (allowAssignLater ? ASSIGN_LATER : '')\n );\n };\n const seedRows = (): RosterRow[] => {\n const seed =\n initialSigners && initialSigners.length > 0\n ? initialSigners\n : signerOptions.length > 0\n ? [\n {\n signerId: signerOptions[0].value,\n channel: resolveChannel(signerOptions[0].value, 'on-device'),\n },\n ]\n : [];\n return seed.map((signer) => ({ ...signer, rowId: nextRowId.current++ }));\n };\n\n // System-defined default for one operator — the channel their own\n // settings resolve to.\n const operatorDefaultChannel = (operatorId: string): OperatorChannel =>\n operators.find((option) => option.value === operatorId)?.defaultChannel ??\n 'email';\n\n // Seed clamp: `'on-device'` is honoured only when the seeded roster\n // makes it available, so the option is never checked-and-disabled, not\n // even for a frame.\n const seedOperatorChannel = (\n operatorId: string,\n rows: RosterRow[],\n ): OperatorChannel => {\n if (initialOperatorChannel === 'on-device') {\n return rows.some((signer) => signer.channel === 'on-device')\n ? 'on-device'\n : operatorDefaultChannel(operatorId);\n }\n return initialOperatorChannel ?? operatorDefaultChannel(operatorId);\n };\n\n const [operator, setOperator] = useState<string>(seedOperator);\n const [signers, setSigners] = useState<RosterRow[]>(seedRows);\n const [operatorChannel, setOperatorChannel] = useState<OperatorChannel>(\n () => seedOperatorChannel(operator, signers),\n );\n // Feeds the sr-only live region announcing the automatic channel\n // fallback below; any explicit choice clears it.\n const [revertedTo, setRevertedTo] = useState<OperatorChannel | null>(null);\n\n // Re-seed the form whenever the host reopens the (still-mounted) modal,\n // so a previous request's choices never leak into the next one.\n const wasOpen = useRef(open);\n useEffect(() => {\n if (open && !wasOpen.current) {\n const nextOperator = seedOperator();\n const nextRows = seedRows();\n setOperator(nextOperator);\n setSigners(nextRows);\n setOperatorChannel(seedOperatorChannel(nextOperator, nextRows));\n setRevertedTo(null);\n }\n wasOpen.current = open;\n // The seeds intentionally read the render-time props on the rising\n // edge only — prop changes while open (or closed) don't reset input.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n // Operator on-device signing piggybacks on a patient handover: it is\n // offerable only while a roster signer signs on this device, and falls\n // back to the operator's system default the moment the last on-device\n // row leaves. The fallback is announced via the live region — the\n // trigger lives in the roster section, far from the checkbox it moves.\n const anySignerOnDevice = signers.some(\n (signer) => signer.channel === 'on-device',\n );\n useEffect(() => {\n if (operatorChannel === 'on-device' && !anySignerOnDevice) {\n const fallback = operatorDefaultChannel(operator);\n setOperatorChannel(fallback);\n setRevertedTo(fallback);\n }\n // `operatorDefaultChannel` reads the render-time `operators` prop.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [operatorChannel, anySignerOnDevice, operator]);\n\n const operatorSelectOptions = allowAssignLater\n ? [\n ...operators,\n { value: ASSIGN_LATER, label: t('signatureRequest.assignLater') },\n ]\n : operators;\n const isUnassigned = operator === ASSIGN_LATER;\n\n const channelMeta: Record<\n SignatureChannel,\n { label: string; icon: React.ReactNode }\n > = {\n sms: {\n label: t('signatureRequest.viaSms'),\n icon: <MessageSquare className=\"ds:size-4\" aria-hidden />,\n },\n email: {\n label: t('signatureRequest.viaEmail'),\n icon: <Mail className=\"ds:size-4\" aria-hidden />,\n },\n whatsapp: {\n label: t('signatureRequest.viaWhatsapp'),\n icon: <WhatsAppGlyph className=\"ds:size-4\" aria-hidden />,\n },\n 'on-device': {\n label: t('signatureRequest.onThisDevice'),\n icon: <Tablet className=\"ds:size-4\" aria-hidden />,\n },\n };\n\n // Operator delivery — same checkbox visuals as the signer rows, minus\n // WhatsApp. No \"system defined\" option: the operator's own default\n // (e-mail or SMS per their settings) arrives pre-checked instead.\n // On-device greys out while no patient signer signs on this device;\n // an InfoTip explains why.\n const operatorChannelOptions: Array<{\n value: OperatorChannel;\n label: string;\n icon: React.ReactNode;\n disabled?: boolean;\n hint?: string;\n }> = [\n { value: 'sms', ...channelMeta.sms },\n { value: 'email', ...channelMeta.email },\n {\n value: 'on-device',\n ...channelMeta['on-device'],\n disabled: !anySignerOnDevice,\n hint: anySignerOnDevice\n ? undefined\n : t('signatureRequest.onDeviceUnavailableHint'),\n },\n ];\n\n const chosenIds = signers.map((signer) => signer.signerId);\n const nextFreeOption = signerOptions.find(\n (option) => !chosenIds.includes(option.value),\n );\n const canAddSigner =\n !busy && signers.length < maxSigners && nextFreeOption !== undefined;\n\n const patchSigner = (rowId: number, patch: Partial<SignerRequest>) => {\n setSigners((current) =>\n current.map((signer) =>\n signer.rowId === rowId ? { ...signer, ...patch } : signer,\n ),\n );\n };\n\n const addSigner = () => {\n if (!nextFreeOption) return;\n setSigners((current) => [\n ...current,\n {\n signerId: nextFreeOption.value,\n channel: resolveChannel(nextFreeOption.value, 'sms'),\n rowId: nextRowId.current++,\n },\n ]);\n };\n\n const removeSigner = (rowId: number) => {\n // Move focus BEFORE the row (and the focused remove button) unmounts —\n // otherwise Radix's focus scope dumps focus on the dialog container.\n addButtonRef.current?.focus();\n setSigners((current) =>\n current.filter((signer) => signer.rowId !== rowId),\n );\n };\n\n const handleRequest = () => {\n onRequestSignature({\n operatorId: isUnassigned ? null : operator,\n operatorChannel: isUnassigned ? null : operatorChannel,\n signers: signers.map(({ rowId: _rowId, ...signer }) => signer),\n });\n };\n\n return (\n <div ref={ref} className=\"ds:contents\" data-component=\"signature-request\">\n <Dialog open={open} onOpenChange={onOpenChange}>\n <Dialog.Content size=\"lg\" hideCloseButton {...contentProps}>\n <Dialog.Header>\n <Dialog.Title>\n {title ?? t('signatureRequest.title')}\n </Dialog.Title>\n <Dialog.Description>\n {description ?? t('signatureRequest.noSignedVersions')}\n </Dialog.Description>\n </Dialog.Header>\n\n <Dialog.Body className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <section className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <div className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <p className=\"type-eyebrow ds:text-start ds:text-[color:var(--muted-foreground)]\">\n {t('signatureRequest.operatorSection')}\n </p>\n {currentOperatorId !== undefined ? (\n <Button\n intent=\"primary\"\n size=\"sm\"\n startIcon={<UserPlus />}\n disabled={busy}\n onClick={() => {\n setOperator(currentOperatorId);\n setOperatorChannel(\n operatorDefaultChannel(currentOperatorId),\n );\n setRevertedTo(null);\n }}\n >\n {t('signatureRequest.assignToMe')}\n </Button>\n ) : null}\n </div>\n\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n {/* Mirrors the select value — decorative for AT. No name →\n Avatar's built-in placeholder-icon fallback. */}\n <Avatar\n aria-hidden=\"true\"\n name={\n isUnassigned ? undefined : labelFor(operators, operator)\n }\n size=\"sm\"\n />\n <div className=\"ds:min-w-0 ds:flex-1 ds:text-start\">\n <Select\n options={operatorSelectOptions}\n value={operator}\n onValueChange={(value) => {\n if (!value) return;\n setOperator(value);\n // A different operator brings their own system\n // default along.\n setOperatorChannel(\n value === ASSIGN_LATER\n ? 'email'\n : operatorDefaultChannel(value),\n );\n setRevertedTo(null);\n }}\n required\n disabled={busy}\n placeholder={t('signatureRequest.operatorPlaceholder')}\n aria-label={t('signatureRequest.operatorSection')}\n />\n </div>\n </div>\n\n {/* One channel for the operator too — same mutually exclusive\n checkbox visuals as the signer rows. Hidden while the\n request is unassigned: there is nobody to deliver to. */}\n {isUnassigned ? null : (\n <div\n role=\"group\"\n aria-label={t('signatureRequest.operatorChannelLabel')}\n className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-x-[var(--spacing-lg)] ds:gap-y-[var(--spacing-sm)] ds:ps-[var(--spacing-xl)]\"\n >\n {operatorChannelOptions.map((option) => (\n <span\n key={option.value}\n className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-sm)]\"\n >\n <Checkbox\n checked={operatorChannel === option.value}\n disabled={busy || option.disabled}\n onCheckedChange={(checked) => {\n if (checked !== true) return;\n setOperatorChannel(option.value);\n setRevertedTo(null);\n }}\n label={\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <span\n aria-hidden=\"true\"\n className=\"ds:text-[var(--accent)]\"\n >\n {option.icon}\n </span>\n {option.label}\n </span>\n }\n />\n {/* Sibling of the checkbox, never inside its label —\n the tip is its own interactive control. The wider\n gap keeps the tip's touch hit-area off the label. */}\n {option.hint ? (\n <InfoTip size=\"sm\" content={option.hint} />\n ) : null}\n </span>\n ))}\n </div>\n )}\n\n {/* Announces the automatic on-device → default fallback: the\n trigger (the patient's channel change) sits in another\n section, so the moved checkmark alone is not enough. */}\n <span role=\"status\" className=\"ds:sr-only\">\n {revertedTo\n ? t('signatureRequest.operatorChannelReverted', {\n channel: channelMeta[revertedTo].label,\n })\n : null}\n </span>\n </section>\n\n <Separator decorative />\n\n <section className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:text-start\">\n <div className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <p className=\"type-eyebrow ds:text-[color:var(--muted-foreground)]\">\n {t('signatureRequest.signersSection')}\n </p>\n <Button\n ref={addButtonRef}\n intent=\"primary\"\n size=\"sm\"\n startIcon={<Plus />}\n disabled={!canAddSigner}\n onClick={addSigner}\n >\n {t('signatureRequest.addSigner')}\n </Button>\n </div>\n\n {signers.map((signer) => {\n const rowOptions = signerOptions.filter(\n (option) =>\n option.value === signer.signerId ||\n !chosenIds.includes(option.value),\n );\n const rowLabel = labelFor(signerOptions, signer.signerId);\n const rowChannelOptions = channelsFor(signer.signerId).map(\n (channel) => ({ value: channel, ...channelMeta[channel] }),\n );\n return (\n <div\n key={signer.rowId}\n role=\"group\"\n aria-label={rowLabel}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\"\n >\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n {/* Mirrors the select value — decorative for AT. */}\n <Avatar aria-hidden=\"true\" name={rowLabel} size=\"sm\" />\n <div className=\"ds:min-w-0 ds:flex-1\">\n <Select\n options={rowOptions}\n value={signer.signerId}\n onValueChange={(value) => {\n if (!value) return;\n const channel = resolveChannel(\n value,\n signer.channel,\n );\n patchSigner(signer.rowId, {\n signerId: value,\n channel,\n skipOtp:\n channel === 'on-device'\n ? signer.skipOtp\n : undefined,\n });\n }}\n required\n disabled={busy}\n placeholder={t(\n 'signatureRequest.signerPlaceholder',\n )}\n aria-label={t('signatureRequest.signerPlaceholder')}\n />\n </div>\n {signers.length > 1 ? (\n <IconButton\n intent=\"ghost\"\n size=\"sm\"\n icon={<X />}\n disabled={busy}\n aria-label={t('signatureRequest.removeSigner')}\n onClick={() => removeSigner(signer.rowId)}\n />\n ) : null}\n </div>\n\n {/* One channel per signer — checkbox visuals, but the\n choice is mutually exclusive: checking a channel\n unchecks the others, and the active one can't be\n unchecked. */}\n <div\n role=\"group\"\n aria-label={t('signatureRequest.channelLabel')}\n className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-x-[var(--spacing-lg)] ds:gap-y-[var(--spacing-sm)] ds:ps-[var(--spacing-xl)]\"\n >\n {rowChannelOptions.map((option) => (\n <Checkbox\n key={option.value}\n checked={signer.channel === option.value}\n disabled={busy}\n onCheckedChange={(checked) =>\n checked === true &&\n patchSigner(signer.rowId, {\n channel: option.value,\n skipOtp: undefined,\n })\n }\n label={\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <span\n aria-hidden=\"true\"\n className=\"ds:text-[var(--accent)]\"\n >\n {option.icon}\n </span>\n {option.label}\n </span>\n }\n />\n ))}\n </div>\n\n {signer.channel === 'on-device' ? (\n <div className=\"ds:ps-[var(--spacing-xl)]\">\n <Switch\n label={t('signatureRequest.noOtp')}\n checked={signer.skipOtp === true}\n disabled={busy}\n onCheckedChange={(checked) =>\n patchSigner(signer.rowId, { skipOtp: checked })\n }\n />\n </div>\n ) : null}\n </div>\n );\n })}\n </section>\n\n {/* Dedicated alert area — one warning regardless of how many\n signers waive OTP, stacked with any submission error, all at\n the same full width as the operator hint. */}\n {signers.some(\n (signer) =>\n signer.channel === 'on-device' && signer.skipOtp === true,\n ) ? (\n <Alert variant=\"warning\">\n <Alert.Description>\n {t('signatureRequest.noOtpWarning')}\n </Alert.Description>\n </Alert>\n ) : null}\n {error ? (\n <Alert variant=\"error\">\n <Alert.Description>{error}</Alert.Description>\n </Alert>\n ) : null}\n </Dialog.Body>\n\n <Dialog.Footer>\n <Button\n intent=\"primary\"\n startIcon={<PenLine />}\n onClick={handleRequest}\n disabled={busy || signers.length === 0}\n loading={busy}\n >\n {t('signatureRequest.requestSignature')}\n </Button>\n <Dialog.Close asChild>\n <Button intent=\"outline\" disabled={busy}>\n {t('signatureRequest.close')}\n </Button>\n </Dialog.Close>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog>\n </div>\n );\n },\n);\nSignatureRequestModal.displayName = 'SignatureRequestModal';\n"],"names":["__iconNode","Tablet","createLucideIcon","UserPlus","ASSIGN_LATER","CHANNEL_ORDER","labelFor","options","value","_a","option","SignatureRequestModal","forwardRef","open","onOpenChange","operators","signerOptions","currentOperatorId","allowAssignLater","initialOperatorId","initialOperatorChannel","initialSigners","maxSigners","busy","error","title","description","onRequestSignature","contentProps","ref","t","useTranslation","nextRowId","useRef","addButtonRef","channelsFor","signerId","allowed","channel","resolveChannel","preferred","available","seedOperator","_b","seedRows","signer","operatorDefaultChannel","operatorId","seedOperatorChannel","rows","operator","setOperator","useState","signers","setSigners","operatorChannel","setOperatorChannel","revertedTo","setRevertedTo","wasOpen","useEffect","nextOperator","nextRows","anySignerOnDevice","fallback","operatorSelectOptions","isUnassigned","channelMeta","jsx","MessageSquare","Mail","WhatsAppGlyph","operatorChannelOptions","chosenIds","nextFreeOption","canAddSigner","patchSigner","rowId","patch","current","addSigner","removeSigner","handleRequest","_rowId","Dialog","jsxs","Button","Avatar","Select","Checkbox","checked","InfoTip","Separator","Plus","rowOptions","rowLabel","rowChannelOptions","IconButton","X","Switch","Alert","PenLine"],"mappings":"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","x_google_ignoreList":[0,1]}
@@ -4,7 +4,7 @@ import { c as Z } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as $ } from "react-i18next";
5
5
  import q from "react-apexcharts";
6
6
  import R from "apexcharts";
7
- import { g as U, u as J } from "./apexcharts-theme-fAQXLIMW.js";
7
+ import { g as U, u as J } from "./apexcharts-theme-B_AxGC_h.js";
8
8
  import { u as Q } from "./registry-DvAUVLHh.js";
9
9
  function X(n) {
10
10
  if (n.length < 2)
@@ -280,4 +280,4 @@ export {
280
280
  Y as s,
281
281
  X as u
282
282
  };
283
- //# sourceMappingURL=sparkline-o6JH4O66.js.map
283
+ //# sourceMappingURL=sparkline-DcXqRZoq.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sparkline-o6JH4O66.js","sources":["../../src/components/sparkline/use-linear-trend.ts","../../src/components/sparkline/sparkline.agent.ts","../../src/components/sparkline/sparkline.tsx"],"sourcesContent":["export type TrendDirection = 'increasing' | 'decreasing' | 'steady';\n\nexport interface LinearTrendResult {\n slope: number;\n direction: TrendDirection;\n}\n\nexport function useLinearTrend(data: number[]): LinearTrendResult {\n if (data.length < 2) {\n return { slope: 0, direction: 'steady' };\n }\n\n const n = data.length;\n const xMean = (n - 1) / 2;\n const yMean = data.reduce((sum, y) => sum + y, 0) / n;\n\n let numerator = 0;\n let denominator = 0;\n\n for (let i = 0; i < n; i++) {\n const dx = i - xMean;\n numerator += dx * (data[i] - yMean);\n denominator += dx * dx;\n }\n\n const slope = denominator === 0 ? 0 : numerator / denominator;\n const range = Math.max(...data) - Math.min(...data);\n const threshold = 0.01 * (range || 1);\n\n const direction: TrendDirection =\n Math.abs(slope) < threshold\n ? 'steady'\n : slope > 0\n ? 'increasing'\n : 'decreasing';\n\n return { slope, direction };\n}\n","import type { AgentAdapter } from '../../agent/types';\nimport type { SparklineHandle } from './sparkline';\n\nexport const sparklineAgent: AgentAdapter<SparklineHandle> = {\n id: 'sparkline',\n capabilities: [],\n state: {},\n actions: {\n update_series: {\n // Replacing the rendered series mutates what the chart displays — write,\n // not read.\n safety: 'write',\n argsType: '{ data: number[] }',\n argsSchema: {\n type: 'object',\n properties: {\n data: {\n type: 'array',\n items: { type: 'number' },\n description: 'The new data points to render.',\n },\n },\n required: ['data'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.sparkline.actions.updateSeries',\n description: 'Replace the sparkline data without remounting.',\n invoke: (handle, args: { data: number[] }) => {\n handle.updateSeries(args.data);\n },\n },\n export_png: {\n // Pure getter — returns an image of the current chart, no state change.\n safety: 'read',\n returns: 'string',\n returnsSchema: {\n type: 'string',\n description: 'A PNG image of the sparkline encoded as a data URI.',\n },\n descriptionKey: 'ui.agent.sparkline.actions.exportPng',\n description: 'Return a PNG data URI of the sparkline.',\n invoke: (handle) => handle.dataURI(),\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'sparkline' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport ReactApexChart from 'react-apexcharts';\nimport ApexCharts from 'apexcharts';\nimport { getApexChartsTheme } from '../../tokens/apexcharts-theme';\nimport { useNeutraliseHiddenFocus } from '../_shared/use-neutralize-hidden-focus';\nimport { useLinearTrend } from './use-linear-trend';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { sparklineAgent } from './sparkline.agent';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst sparklineVariants = cva('ds:relative ds:inline-block ds:w-full', {\n variants: {\n size: {\n xs: 'ds:h-6',\n sm: 'ds:h-8',\n md: 'ds:h-10',\n // Applied when an explicit `height` prop is given: the wrapper\n // grows with the svg instead of clipping at the size's fixed height.\n auto: '',\n },\n },\n defaultVariants: { size: 'md' },\n});\n\n/* ------------------------------------------------------------------ */\n/* Constants */\n/* ------------------------------------------------------------------ */\n\nconst DIRECTION_ARROW = {\n increasing: '↑',\n decreasing: '↓',\n steady: '→',\n} as const;\n\nconst SIZE_HEIGHT: Record<'xs' | 'sm' | 'md', number> = {\n xs: 24,\n sm: 32,\n md: 40,\n};\n\nfunction prefersReducedMotion(): boolean {\n return (\n typeof window !== 'undefined' &&\n window.matchMedia('(prefers-reduced-motion: reduce)').matches\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport interface SparklineHandle {\n updateSeries: (data: number[]) => void;\n updateOptions: (opts: ApexCharts.ApexOptions) => void;\n dataURI: () => Promise<string>;\n}\n\nexport interface SparklineProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'role' | 'children'>,\n VariantProps<typeof sparklineVariants> {\n /** Array of numeric data points */\n data: number[];\n /** Chart visual style */\n variant?: 'line' | 'bar' | 'area';\n /** Size preset */\n size?: 'xs' | 'sm' | 'md';\n /** Accessible label prefix, e.g. \"Revenue, 30 days\" */\n label?: string;\n /** Stroke / bar colour override — defaults to var(--primary) via bridge */\n color?: string;\n /** Show end-point dot with trend direction arrow */\n showEndpoint?: boolean;\n /**\n * Show Apex's hover tooltip with the data point value. Defaults to\n * `false` — sparklines are intentionally minimal — opt in when the\n * sparkline is large enough to be a primary metric surface (e.g.\n * dashboard widgets) and the user benefits from per-point readout.\n */\n showTooltip?: boolean;\n /** Width override — defaults to 100% of container */\n width?: string | number;\n /** Height override — defaults to the size variant height */\n height?: string | number;\n}\n\n/* ------------------------------------------------------------------ */\n/* Sparkline component */\n/* ------------------------------------------------------------------ */\n\nexport const Sparkline = forwardRef<SparklineHandle, SparklineProps>(\n (\n {\n id,\n data,\n variant = 'line',\n size = 'md',\n label,\n color,\n showEndpoint = false,\n showTooltip = false,\n width,\n height,\n className,\n ...props\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const rawId = useId();\n const chartId = useMemo(\n () => `sparkline-${rawId.replace(/[^a-zA-Z0-9-_]/g, '')}`,\n [rawId],\n );\n const wrapperRef = useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = useState(0);\n\n const { direction } = useLinearTrend(data);\n\n /* ---- accessible summary ---------------------------------------- */\n const ariaLabel = useMemo(() => {\n if (data.length === 0) {\n return t('sparkline.noData', 'No data');\n }\n const fmt = (n: number) => new Intl.NumberFormat(i18n.language).format(n);\n const dirText = t(`sparkline.direction.${direction}`);\n const nums = {\n min: fmt(Math.min(...data)),\n max: fmt(Math.max(...data)),\n current: fmt(data[data.length - 1]),\n direction: dirText,\n };\n if (label) {\n return t('sparkline.summary', { label, ...nums });\n }\n return t('sparkline.summaryNoLabel', nums);\n }, [data, label, direction, i18n.language, t]);\n\n /* ---- theme-reactive state -------------------------------------- */\n const [themeOptions, setThemeOptions] = useState<ApexCharts.ApexOptions>(\n () => {\n try {\n return getApexChartsTheme();\n } catch {\n return {};\n }\n },\n );\n\n /* ---- MutationObserver: re-read theme on class change ----------- */\n useEffect(() => {\n let timer: ReturnType<typeof setTimeout>;\n const observer = new MutationObserver(() => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n try {\n setThemeOptions(getApexChartsTheme());\n } catch {\n /* no-op in non-browser environments */\n }\n }, 50);\n });\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n });\n return () => {\n clearTimeout(timer);\n observer.disconnect();\n };\n }, []);\n\n /* ---- ResizeObserver: track container width -------------------- */\n useEffect(() => {\n const el = wrapperRef.current;\n if (!el) return;\n const ro = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) setContainerWidth(Math.floor(entry.contentRect.width));\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n /* ApexCharts injects focusable canvases inside the `aria-hidden` */\n /* chart wrapper. Neutralise their tabindex so axe's */\n /* `aria-hidden-focus` rule passes. Shared hook — same fix in */\n /* `Chart` (full apex) and the calendar's mirror events. */\n useNeutraliseHiddenFocus(wrapperRef);\n\n /* ---- imperative handle ---------------------------------------- */\n const agentHandle = useMemo<SparklineHandle>(\n () => ({\n updateSeries(newData: number[]) {\n ApexCharts.getChartByID(chartId)?.updateSeries([{ data: newData }]);\n },\n updateOptions(opts: ApexCharts.ApexOptions) {\n ApexCharts.getChartByID(chartId)?.updateOptions(opts);\n },\n async dataURI(): Promise<string> {\n const instance = ApexCharts.getChartByID(chartId);\n if (!instance) return '';\n const result = await instance.dataURI();\n return (result as { imgURI: string }).imgURI;\n },\n }),\n [chartId],\n );\n useImperativeHandle(ref, () => agentHandle, [agentHandle]);\n useAgentRegistration(sparklineAgent, agentHandle, id);\n\n /* ---- resolve color -------------------------------------------- */\n const resolvedColor = color ?? themeOptions.colors?.[0] ?? 'currentColor';\n\n /* ---- empty state ---------------------------------------------- */\n if (data.length === 0) {\n return (\n <div\n ref={wrapperRef}\n role=\"img\"\n aria-label={ariaLabel}\n dir=\"ltr\"\n className={sparklineVariants({\n size: height !== undefined ? 'auto' : size,\n className,\n })}\n {...props}\n />\n );\n }\n\n /* ---- chart config ---------------------------------------------- */\n const reducedMotion = prefersReducedMotion();\n\n const chartOptions: ApexCharts.ApexOptions = {\n ...themeOptions,\n chart: {\n ...themeOptions.chart,\n id: chartId,\n type: variant,\n sparkline: { enabled: true },\n toolbar: { show: false },\n animations: {\n enabled: !reducedMotion,\n dynamicAnimation: { enabled: !reducedMotion },\n },\n zoom: { enabled: false },\n parentHeightOffset: 0,\n },\n colors: [resolvedColor],\n stroke: {\n curve: 'smooth',\n width: variant === 'bar' ? 0 : 2,\n },\n fill: {\n opacity: variant === 'area' ? 0.15 : 1,\n },\n xaxis: {\n crosshairs: { show: false },\n },\n tooltip: { enabled: showTooltip },\n markers: showEndpoint\n ? {\n size: [0],\n discrete: [\n {\n seriesIndex: 0,\n dataPointIndex: data.length - 1,\n fillColor: resolvedColor,\n strokeColor: resolvedColor,\n size: 4,\n },\n ],\n }\n : { size: 0 },\n grid: {\n ...themeOptions.grid,\n show: false,\n // ApexCharts grid.padding uses physical keys (not CSS logical properties).\n // The chart wrapper enforces dir=\"ltr\" so these always resolve correctly.\n padding: { top: 2, right: 2, bottom: 2, left: 2 },\n },\n };\n\n const resolvedWidth =\n width ?? (containerWidth > 0 ? containerWidth : '100%');\n const resolvedHeight = height ?? SIZE_HEIGHT[size ?? 'md'];\n\n return (\n <div\n ref={wrapperRef}\n role=\"img\"\n aria-label={ariaLabel}\n dir=\"ltr\"\n className={sparklineVariants({\n size: height !== undefined ? 'auto' : size,\n className,\n })}\n data-component=\"sparkline\"\n data-component-id={id}\n {...props}\n >\n <ReactApexChart\n type={variant}\n series={[{ data }]}\n options={chartOptions}\n width={resolvedWidth}\n height={resolvedHeight}\n aria-hidden=\"true\"\n />\n {showEndpoint && (\n <span\n aria-hidden=\"true\"\n className=\"ds:pointer-events-none ds:absolute ds:end-0 ds:top-0 ds:text-[length:var(--font-size-xs)] ds:leading-none\"\n >\n {DIRECTION_ARROW[direction]}\n </span>\n )}\n </div>\n );\n },\n);\n\nSparkline.displayName = 'Sparkline';\n"],"names":["useLinearTrend","data","n","xMean","yMean","sum","y","numerator","denominator","i","dx","slope","threshold","direction","sparklineAgent","handle","args","sparklineVariants","cva","DIRECTION_ARROW","SIZE_HEIGHT","prefersReducedMotion","Sparkline","forwardRef","id","variant","size","label","color","showEndpoint","showTooltip","width","height","className","props","ref","t","i18n","useTranslation","rawId","useId","chartId","useMemo","wrapperRef","useRef","containerWidth","setContainerWidth","useState","ariaLabel","fmt","dirText","nums","themeOptions","setThemeOptions","getApexChartsTheme","useEffect","timer","observer","el","ro","entries","entry","useNeutraliseHiddenFocus","agentHandle","newData","_a","ApexCharts","opts","instance","useImperativeHandle","useAgentRegistration","resolvedColor","jsx","reducedMotion","chartOptions","resolvedWidth","resolvedHeight","jsxs","ReactApexChart"],"mappings":"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"}
1
+ {"version":3,"file":"sparkline-DcXqRZoq.js","sources":["../../src/components/sparkline/use-linear-trend.ts","../../src/components/sparkline/sparkline.agent.ts","../../src/components/sparkline/sparkline.tsx"],"sourcesContent":["export type TrendDirection = 'increasing' | 'decreasing' | 'steady';\n\nexport interface LinearTrendResult {\n slope: number;\n direction: TrendDirection;\n}\n\nexport function useLinearTrend(data: number[]): LinearTrendResult {\n if (data.length < 2) {\n return { slope: 0, direction: 'steady' };\n }\n\n const n = data.length;\n const xMean = (n - 1) / 2;\n const yMean = data.reduce((sum, y) => sum + y, 0) / n;\n\n let numerator = 0;\n let denominator = 0;\n\n for (let i = 0; i < n; i++) {\n const dx = i - xMean;\n numerator += dx * (data[i] - yMean);\n denominator += dx * dx;\n }\n\n const slope = denominator === 0 ? 0 : numerator / denominator;\n const range = Math.max(...data) - Math.min(...data);\n const threshold = 0.01 * (range || 1);\n\n const direction: TrendDirection =\n Math.abs(slope) < threshold\n ? 'steady'\n : slope > 0\n ? 'increasing'\n : 'decreasing';\n\n return { slope, direction };\n}\n","import type { AgentAdapter } from '../../agent/types';\nimport type { SparklineHandle } from './sparkline';\n\nexport const sparklineAgent: AgentAdapter<SparklineHandle> = {\n id: 'sparkline',\n capabilities: [],\n state: {},\n actions: {\n update_series: {\n // Replacing the rendered series mutates what the chart displays — write,\n // not read.\n safety: 'write',\n argsType: '{ data: number[] }',\n argsSchema: {\n type: 'object',\n properties: {\n data: {\n type: 'array',\n items: { type: 'number' },\n description: 'The new data points to render.',\n },\n },\n required: ['data'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.sparkline.actions.updateSeries',\n description: 'Replace the sparkline data without remounting.',\n invoke: (handle, args: { data: number[] }) => {\n handle.updateSeries(args.data);\n },\n },\n export_png: {\n // Pure getter — returns an image of the current chart, no state change.\n safety: 'read',\n returns: 'string',\n returnsSchema: {\n type: 'string',\n description: 'A PNG image of the sparkline encoded as a data URI.',\n },\n descriptionKey: 'ui.agent.sparkline.actions.exportPng',\n description: 'Return a PNG data URI of the sparkline.',\n invoke: (handle) => handle.dataURI(),\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'sparkline' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport ReactApexChart from 'react-apexcharts';\nimport ApexCharts from 'apexcharts';\nimport { getApexChartsTheme } from '../../tokens/apexcharts-theme';\nimport { useNeutraliseHiddenFocus } from '../_shared/use-neutralize-hidden-focus';\nimport { useLinearTrend } from './use-linear-trend';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { sparklineAgent } from './sparkline.agent';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst sparklineVariants = cva('ds:relative ds:inline-block ds:w-full', {\n variants: {\n size: {\n xs: 'ds:h-6',\n sm: 'ds:h-8',\n md: 'ds:h-10',\n // Applied when an explicit `height` prop is given: the wrapper\n // grows with the svg instead of clipping at the size's fixed height.\n auto: '',\n },\n },\n defaultVariants: { size: 'md' },\n});\n\n/* ------------------------------------------------------------------ */\n/* Constants */\n/* ------------------------------------------------------------------ */\n\nconst DIRECTION_ARROW = {\n increasing: '↑',\n decreasing: '↓',\n steady: '→',\n} as const;\n\nconst SIZE_HEIGHT: Record<'xs' | 'sm' | 'md', number> = {\n xs: 24,\n sm: 32,\n md: 40,\n};\n\nfunction prefersReducedMotion(): boolean {\n return (\n typeof window !== 'undefined' &&\n window.matchMedia('(prefers-reduced-motion: reduce)').matches\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport interface SparklineHandle {\n updateSeries: (data: number[]) => void;\n updateOptions: (opts: ApexCharts.ApexOptions) => void;\n dataURI: () => Promise<string>;\n}\n\nexport interface SparklineProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'role' | 'children'>,\n VariantProps<typeof sparklineVariants> {\n /** Array of numeric data points */\n data: number[];\n /** Chart visual style */\n variant?: 'line' | 'bar' | 'area';\n /** Size preset */\n size?: 'xs' | 'sm' | 'md';\n /** Accessible label prefix, e.g. \"Revenue, 30 days\" */\n label?: string;\n /** Stroke / bar colour override — defaults to var(--primary) via bridge */\n color?: string;\n /** Show end-point dot with trend direction arrow */\n showEndpoint?: boolean;\n /**\n * Show Apex's hover tooltip with the data point value. Defaults to\n * `false` — sparklines are intentionally minimal — opt in when the\n * sparkline is large enough to be a primary metric surface (e.g.\n * dashboard widgets) and the user benefits from per-point readout.\n */\n showTooltip?: boolean;\n /** Width override — defaults to 100% of container */\n width?: string | number;\n /** Height override — defaults to the size variant height */\n height?: string | number;\n}\n\n/* ------------------------------------------------------------------ */\n/* Sparkline component */\n/* ------------------------------------------------------------------ */\n\nexport const Sparkline = forwardRef<SparklineHandle, SparklineProps>(\n (\n {\n id,\n data,\n variant = 'line',\n size = 'md',\n label,\n color,\n showEndpoint = false,\n showTooltip = false,\n width,\n height,\n className,\n ...props\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const rawId = useId();\n const chartId = useMemo(\n () => `sparkline-${rawId.replace(/[^a-zA-Z0-9-_]/g, '')}`,\n [rawId],\n );\n const wrapperRef = useRef<HTMLDivElement>(null);\n const [containerWidth, setContainerWidth] = useState(0);\n\n const { direction } = useLinearTrend(data);\n\n /* ---- accessible summary ---------------------------------------- */\n const ariaLabel = useMemo(() => {\n if (data.length === 0) {\n return t('sparkline.noData', 'No data');\n }\n const fmt = (n: number) => new Intl.NumberFormat(i18n.language).format(n);\n const dirText = t(`sparkline.direction.${direction}`);\n const nums = {\n min: fmt(Math.min(...data)),\n max: fmt(Math.max(...data)),\n current: fmt(data[data.length - 1]),\n direction: dirText,\n };\n if (label) {\n return t('sparkline.summary', { label, ...nums });\n }\n return t('sparkline.summaryNoLabel', nums);\n }, [data, label, direction, i18n.language, t]);\n\n /* ---- theme-reactive state -------------------------------------- */\n const [themeOptions, setThemeOptions] = useState<ApexCharts.ApexOptions>(\n () => {\n try {\n return getApexChartsTheme();\n } catch {\n return {};\n }\n },\n );\n\n /* ---- MutationObserver: re-read theme on class change ----------- */\n useEffect(() => {\n let timer: ReturnType<typeof setTimeout>;\n const observer = new MutationObserver(() => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n try {\n setThemeOptions(getApexChartsTheme());\n } catch {\n /* no-op in non-browser environments */\n }\n }, 50);\n });\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n });\n return () => {\n clearTimeout(timer);\n observer.disconnect();\n };\n }, []);\n\n /* ---- ResizeObserver: track container width -------------------- */\n useEffect(() => {\n const el = wrapperRef.current;\n if (!el) return;\n const ro = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) setContainerWidth(Math.floor(entry.contentRect.width));\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n /* ApexCharts injects focusable canvases inside the `aria-hidden` */\n /* chart wrapper. Neutralise their tabindex so axe's */\n /* `aria-hidden-focus` rule passes. Shared hook — same fix in */\n /* `Chart` (full apex) and the calendar's mirror events. */\n useNeutraliseHiddenFocus(wrapperRef);\n\n /* ---- imperative handle ---------------------------------------- */\n const agentHandle = useMemo<SparklineHandle>(\n () => ({\n updateSeries(newData: number[]) {\n ApexCharts.getChartByID(chartId)?.updateSeries([{ data: newData }]);\n },\n updateOptions(opts: ApexCharts.ApexOptions) {\n ApexCharts.getChartByID(chartId)?.updateOptions(opts);\n },\n async dataURI(): Promise<string> {\n const instance = ApexCharts.getChartByID(chartId);\n if (!instance) return '';\n const result = await instance.dataURI();\n return (result as { imgURI: string }).imgURI;\n },\n }),\n [chartId],\n );\n useImperativeHandle(ref, () => agentHandle, [agentHandle]);\n useAgentRegistration(sparklineAgent, agentHandle, id);\n\n /* ---- resolve color -------------------------------------------- */\n const resolvedColor = color ?? themeOptions.colors?.[0] ?? 'currentColor';\n\n /* ---- empty state ---------------------------------------------- */\n if (data.length === 0) {\n return (\n <div\n ref={wrapperRef}\n role=\"img\"\n aria-label={ariaLabel}\n dir=\"ltr\"\n className={sparklineVariants({\n size: height !== undefined ? 'auto' : size,\n className,\n })}\n {...props}\n />\n );\n }\n\n /* ---- chart config ---------------------------------------------- */\n const reducedMotion = prefersReducedMotion();\n\n const chartOptions: ApexCharts.ApexOptions = {\n ...themeOptions,\n chart: {\n ...themeOptions.chart,\n id: chartId,\n type: variant,\n sparkline: { enabled: true },\n toolbar: { show: false },\n animations: {\n enabled: !reducedMotion,\n dynamicAnimation: { enabled: !reducedMotion },\n },\n zoom: { enabled: false },\n parentHeightOffset: 0,\n },\n colors: [resolvedColor],\n stroke: {\n curve: 'smooth',\n width: variant === 'bar' ? 0 : 2,\n },\n fill: {\n opacity: variant === 'area' ? 0.15 : 1,\n },\n xaxis: {\n crosshairs: { show: false },\n },\n tooltip: { enabled: showTooltip },\n markers: showEndpoint\n ? {\n size: [0],\n discrete: [\n {\n seriesIndex: 0,\n dataPointIndex: data.length - 1,\n fillColor: resolvedColor,\n strokeColor: resolvedColor,\n size: 4,\n },\n ],\n }\n : { size: 0 },\n grid: {\n ...themeOptions.grid,\n show: false,\n // ApexCharts grid.padding uses physical keys (not CSS logical properties).\n // The chart wrapper enforces dir=\"ltr\" so these always resolve correctly.\n padding: { top: 2, right: 2, bottom: 2, left: 2 },\n },\n };\n\n const resolvedWidth =\n width ?? (containerWidth > 0 ? containerWidth : '100%');\n const resolvedHeight = height ?? SIZE_HEIGHT[size ?? 'md'];\n\n return (\n <div\n ref={wrapperRef}\n role=\"img\"\n aria-label={ariaLabel}\n dir=\"ltr\"\n className={sparklineVariants({\n size: height !== undefined ? 'auto' : size,\n className,\n })}\n data-component=\"sparkline\"\n data-component-id={id}\n {...props}\n >\n <ReactApexChart\n type={variant}\n series={[{ data }]}\n options={chartOptions}\n width={resolvedWidth}\n height={resolvedHeight}\n aria-hidden=\"true\"\n />\n {showEndpoint && (\n <span\n aria-hidden=\"true\"\n className=\"ds:pointer-events-none ds:absolute ds:end-0 ds:top-0 ds:text-[length:var(--font-size-xs)] ds:leading-none\"\n >\n {DIRECTION_ARROW[direction]}\n </span>\n )}\n </div>\n );\n },\n);\n\nSparkline.displayName = 'Sparkline';\n"],"names":["useLinearTrend","data","n","xMean","yMean","sum","y","numerator","denominator","i","dx","slope","threshold","direction","sparklineAgent","handle","args","sparklineVariants","cva","DIRECTION_ARROW","SIZE_HEIGHT","prefersReducedMotion","Sparkline","forwardRef","id","variant","size","label","color","showEndpoint","showTooltip","width","height","className","props","ref","t","i18n","useTranslation","rawId","useId","chartId","useMemo","wrapperRef","useRef","containerWidth","setContainerWidth","useState","ariaLabel","fmt","dirText","nums","themeOptions","setThemeOptions","getApexChartsTheme","useEffect","timer","observer","el","ro","entries","entry","useNeutraliseHiddenFocus","agentHandle","newData","_a","ApexCharts","opts","instance","useImperativeHandle","useAgentRegistration","resolvedColor","jsx","reducedMotion","chartOptions","resolvedWidth","resolvedHeight","jsxs","ReactApexChart"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "packageVersion": "0.94.0",
3
+ "packageVersion": "0.96.0",
4
4
  "components": [
5
5
  {
6
6
  "kind": "component",
@@ -16501,6 +16501,14 @@
16501
16501
  "component": "select",
16502
16502
  "as": "operatorSigner"
16503
16503
  },
16504
+ {
16505
+ "component": "checkbox",
16506
+ "as": "operatorChannel"
16507
+ },
16508
+ {
16509
+ "component": "info-tip",
16510
+ "as": "operatorChannelHint"
16511
+ },
16504
16512
  {
16505
16513
  "component": "select",
16506
16514
  "as": "signerPerson",
@@ -16516,10 +16524,6 @@
16516
16524
  "as": "otpWaiver",
16517
16525
  "entity": "signer"
16518
16526
  },
16519
- {
16520
- "component": "alert",
16521
- "as": "operatorHint"
16522
- },
16523
16527
  {
16524
16528
  "component": "alert",
16525
16529
  "as": "otpWarning",
@@ -16581,7 +16585,7 @@
16581
16585
  {
16582
16586
  "name": "choose_delivery_channel",
16583
16587
  "safety": "write",
16584
- "description": "Choose how each signer's request is delivered via the per-row channel checkboxes (mutually exclusive — checking one channel unchecks the others): SMS, e-mail, WhatsApp, or signing on this device. On-device signers sign sequentially in roster order.",
16588
+ "description": "Choose how each signer's request is delivered via the per-row channel checkboxes (mutually exclusive — checking one channel unchecks the others): SMS, e-mail, WhatsApp, or signing on this device. On-device signers sign sequentially in roster order. The assigned operator has the same mutually exclusive checkboxes with SMS, e-mail, or on this device — the operator's own system-defined channel arrives pre-checked, and the on-device option is enabled only while a patient signer also signs on this device (an info tip explains the greyed-out state; an automatic fallback to the operator's default is announced via a live region when the last on-device patient row leaves).",
16585
16589
  "descriptionKey": "ui.agent.signatureRequest.workflows.chooseDeliveryChannel",
16586
16590
  "uiActions": [
16587
16591
  "checkbox.set_checked"
@@ -1608,7 +1608,7 @@
1608
1608
  "workflows": {
1609
1609
  "assignOperator": "Pick the operator who must counter-sign (or \"Assign later\" to leave the request unassigned). \"Assign to me\" claims it for the signed-in operator.",
1610
1610
  "manageSignerRoster": "Build the patient-side signer roster: pick who signs in each row (the patient or their configured signee, e.g. a legal guardian), add a second signer up to the cap, or remove a row. People already on the roster are excluded from the other rows.",
1611
- "chooseDeliveryChannel": "Choose how each signer's request is delivered via the per-row channel checkboxes (mutually exclusive — checking one channel unchecks the others): SMS, e-mail, WhatsApp, or signing on this device. On-device signers sign sequentially in roster order.",
1611
+ "chooseDeliveryChannel": "Choose how each signer's request is delivered via the per-row channel checkboxes (mutually exclusive — checking one channel unchecks the others): SMS, e-mail, WhatsApp, or signing on this device. On-device signers sign sequentially in roster order. The assigned operator has the same mutually exclusive checkboxes with SMS, e-mail, or on this device — the operator's own system-defined channel arrives pre-checked, and the on-device option is enabled only while a patient signer also signs on this device (an info tip explains the greyed-out state; an automatic fallback to the operator's default is announced via a live region when the last on-device patient row leaves).",
1612
1612
  "waiveOtp": "Toggle a signer's on-device OTP waiver. Waiving OTP lowers the evidentiary value of that signature; the pattern surfaces a warning alert while waived.",
1613
1613
  "requestSignature": "Send the signature request. Notifies every roster signer over their selected channel and hands the submission to the host.",
1614
1614
  "dismiss": "Close the modal without sending a signature request. Discards the in-progress operator, roster, channel, and OTP choices."
@@ -10,11 +10,18 @@ export interface ChartSeries {
10
10
  * Marks this series as a secondary "compare" overlay — e.g. the previous
11
11
  * period in a current-vs-previous financial view. Rendered visually
12
12
  * subordinate and colour-blind-safe, distinguished from primary series by
13
- * BOTH a non-colour cue AND a muted hue (never colour alone):
14
- * - line / area: DASHED stroke in a resolved neutral grey (the chart echo
15
- * of the calendar compare band's dashed block-end rule).
16
- * - bar: HATCHED (slantedLines) grey fill bars have a zero-width stroke
17
- * and cannot dash, so the non-colour cue lives in the fill texture.
13
+ * BOTH a non-colour cue AND a lighter shade of the SAME hue (never colour
14
+ * alone). The compare series inherits its PAIRED primary's colour (k-th
15
+ * compare pairs with the k-th primary, by order), then:
16
+ * - line / area: a round-DOTTED stroke in the paired-primary colour (the
17
+ * dotted-vs-solid pattern is the non-colour cue); area also gets a tinted
18
+ * fill at `--chart-compare-fill-opacity`.
19
+ * - bar: a tinted fill (paired-primary hue at `--chart-compare-fill-opacity`)
20
+ * under a full-strength DOTTED outline that is OPEN at the baseline — so a
21
+ * compare bar reads as an outlined "ghost" of its solid primary.
22
+ * The legend swatch shows the lighter tint (via `legend.markers.fillColors`),
23
+ * and the series name (e.g. "Revenue (previous period)") remains the primary
24
+ * signal in the legend and the screen-reader table.
18
25
  * Only meaningful on axis types (line / area / bar); it is structurally
19
26
  * impossible on pie / donut / radialBar (their `series` is `number[]`, which
20
27
  * cannot carry this field), so the axis-only invariant is enforced by the
@@ -1 +1 @@
1
- {"version":3,"file":"chart.d.ts","sourceRoot":"","sources":["../../../src/components/chart/chart.tsx"],"names":[],"mappings":"AA2BA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AA0BlE,QAAA,MAAM,aAAa;;8EAYjB,CAAC;AAMH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,CAAC;AAEhF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf;;;;;;;;;;;;;;;;;;OAkBG;IACH,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CAC9B;AAED,wFAAwF;AACxF,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,YAAY,CAAC;AAEzD,4DAA4D;AAC5D,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;AAE5D,MAAM,WAAW,UAAW,SAAQ,YAAY,CAAC,OAAO,aAAa,CAAC;IACpE,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd,kFAAkF;IAClF,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,yBAAyB;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB;;;OAGG;IACH,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,EAAE,CAAC;IACjC,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,sDAAsD;IACtD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACjD;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3C;;;;;;;;;;;;OAYG;IACH,eAAe,CAAC,EAAE,SAAS,EAAE,CAAC;IAC9B,oEAAoE;IACpE,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACzC,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,4CAA4C;IAC5C,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/B;;;;;;;;OAQG;IACH,YAAY,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;IACnD;;;OAGG;IACH,OAAO,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC;IACtC,uFAAuF;IACvF,YAAY,EAAE,MAAM;QAClB,YAAY,EAAE,SAAS,CAAC;QACxB,aAAa,EAAE,SAAS,CAAC;QACzB,cAAc,EAAE,SAAS,EAAE,CAAC;KAC7B,CAAC;CACH;AAmFD,eAAO,MAAM,KAAK,oGA6rBjB,CAAC;AAQF,OAAO,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"chart.d.ts","sourceRoot":"","sources":["../../../src/components/chart/chart.tsx"],"names":[],"mappings":"AA2BA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AA4BlE,QAAA,MAAM,aAAa;;8EAYjB,CAAC;AAMH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,CAAC;AAEhF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CAC9B;AAED,wFAAwF;AACxF,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,YAAY,CAAC;AAEzD,4DAA4D;AAC5D,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;AAE5D,MAAM,WAAW,UAAW,SAAQ,YAAY,CAAC,OAAO,aAAa,CAAC;IACpE,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd,kFAAkF;IAClF,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,yBAAyB;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB;;;OAGG;IACH,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,EAAE,CAAC;IACjC,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,sDAAsD;IACtD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACjD;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3C;;;;;;;;;;;;OAYG;IACH,eAAe,CAAC,EAAE,SAAS,EAAE,CAAC;IAC9B,oEAAoE;IACpE,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACzC,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,4CAA4C;IAC5C,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/B;;;;;;;;OAQG;IACH,YAAY,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;IACnD;;;OAGG;IACH,OAAO,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC;IACtC,uFAAuF;IACvF,YAAY,EAAE,MAAM;QAClB,YAAY,EAAE,SAAS,CAAC;QACxB,aAAa,EAAE,SAAS,CAAC;QACzB,cAAc,EAAE,SAAS,EAAE,CAAC;KAC7B,CAAC;CACH;AAwID,eAAO,MAAM,KAAK,oGAswBjB,CAAC;AAQF,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -1,4 +1,4 @@
1
- import { C as t, c as s, a as c } from "../../_chunks/chart-DqxVCm1I.js";
1
+ import { C as t, c as s, a as c } from "../../_chunks/chart-DR68TJD5.js";
2
2
  export {
3
3
  t as Chart,
4
4
  s as chartAgent,
@@ -1,6 +1,6 @@
1
1
  import { A as r, D as l, T as t, a as s, b as n, c as o, d, e as i, f as C } from "../../_chunks/actions-cell-renderer-DaL80uqL.js";
2
2
  import { B as T, C as F, E as g, a as b, R as u, T as c, b as m, r as f, u as x } from "../../_chunks/editable-currency-cell-renderer-Dus_sBvX.js";
3
- import { C as p, D as h, a as y, b as E, I as S, L as A, N as L, c as N, S as B, d as I, e as P, T as U, f as W, g as k, U as v } from "../../_chunks/link-cell-renderer-_LDZhY4r.js";
3
+ import { C as p, D as h, a as y, b as E, I as S, L as A, N as L, c as N, S as B, d as I, e as P, T as U, f as W, g as k, U as v } from "../../_chunks/link-cell-renderer-flfZh2qY.js";
4
4
  export {
5
5
  r as ActionsCellRenderer,
6
6
  T as BalanceCellRenderer,
@@ -117,7 +117,16 @@ export interface DateRangePickerProps extends Pick<VariantProps<typeof triggerVa
117
117
  * `onCompareChange`.
118
118
  */
119
119
  compare?: boolean;
120
- /** Start with compare enabled (only meaningful when `compare` is set). */
120
+ /**
121
+ * Controlled checked state of the compare toggle — the APPLIED compare
122
+ * on/off value. Pair with `onCompareChange` and drive it from the consumer
123
+ * so a reopened picker reflects the applied state. When omitted the toggle
124
+ * is uncontrolled and seeded from `defaultCompare`. This is distinct from
125
+ * `compare`, which only decides whether the control renders. Only
126
+ * meaningful when `compare` is set.
127
+ */
128
+ compareEnabled?: boolean;
129
+ /** Start with compare enabled — uncontrolled initial checked state (only meaningful when `compare` is set). */
121
130
  defaultCompare?: boolean;
122
131
  defaultCompareMode?: DateRangeCompareMode;
123
132
  onCompareChange?: (enabled: boolean, compareRange?: DateRangeValue) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"date-range-picker.d.ts","sourceRoot":"","sources":["../../../src/components/date-range-picker/date-range-picker.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"date-range-picker.d.ts","sourceRoot":"","sources":["../../../src/components/date-range-picker/date-range-picker.tsx"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { D as r, d as t } from "../../_chunks/date-range-picker-Cfv4Sr63.js";
1
+ import { D as r, d as t } from "../../_chunks/date-range-picker-pEG3Ln3i.js";
2
2
  export {
3
3
  r as DateRangePicker,
4
4
  t as dateRangePickerAgent
@@ -1,4 +1,4 @@
1
- import { B as s, C as l, N as t, P as n, a as C, b as i, g as o, u } from "../../_chunks/patient-table-CFM92QqU.js";
1
+ import { B as s, C as l, N as t, P as n, a as C, b as i, g as o, u } from "../../_chunks/patient-table-CvZTIM2R.js";
2
2
  export {
3
3
  s as BalanceBadgeCell,
4
4
  l as CarePlanStatusCell,
@@ -1,4 +1,4 @@
1
- import { R as o, I as e, r as n } from "../../_chunks/radiograph-panel.agent-DDnDGVpN.js";
1
+ import { R as o, I as e, r as n } from "../../_chunks/radiograph-panel.agent-AsXJBr1p.js";
2
2
  export {
3
3
  o as RadiographPanel,
4
4
  e as RadiographPanelIcon,
@@ -1,4 +1,4 @@
1
- import { S as r, s, u as n } from "../../_chunks/sparkline-o6JH4O66.js";
1
+ import { S as r, s, u as n } from "../../_chunks/sparkline-DcXqRZoq.js";
2
2
  export {
3
3
  r as Sparkline,
4
4
  s as sparklineAgent,
@@ -3030,7 +3030,9 @@ export declare const arUi: {
3030
3030
  readonly assignToMe: "إسناد إليّ";
3031
3031
  readonly operatorPlaceholder: "اختر مشغّلاً";
3032
3032
  readonly assignLater: "الإسناد لاحقاً";
3033
- readonly operatorHint: "سيتم إرسال طلب التوقيع إلى المشغّل عبر البريد الإلكتروني أو الرسائل النصية حسب إعداداته.";
3033
+ readonly operatorChannelLabel: "قناة توقيع المشغّل";
3034
+ readonly onDeviceUnavailableHint: "متاح عندما يوقّع واحد على الأقل من موقّعي المريض على هذا الجهاز.";
3035
+ readonly operatorChannelReverted: "تمت إعادة تعيين قناة توقيع المشغّل إلى {{channel}} — لا يوقّع أي من موقّعي المريض على هذا الجهاز.";
3034
3036
  readonly signersSection: "موقّعو المريض";
3035
3037
  readonly signerPlaceholder: "اختر موقّعاً";
3036
3038
  readonly channelLabel: "قناة التوقيع";
@@ -1 +1 @@
1
- {"version":3,"file":"ar.d.ts","sourceRoot":"","sources":["../../../src/i18n/locales/ar.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuxHP,CAAC"}
1
+ {"version":3,"file":"ar.d.ts","sourceRoot":"","sources":["../../../src/i18n/locales/ar.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0xHP,CAAC"}
@@ -3004,7 +3004,9 @@ const e = {
3004
3004
  assignToMe: "إسناد إليّ",
3005
3005
  operatorPlaceholder: "اختر مشغّلاً",
3006
3006
  assignLater: "الإسناد لاحقاً",
3007
- operatorHint: "سيتم إرسال طلب التوقيع إلى المشغّل عبر البريد الإلكتروني أو الرسائل النصية حسب إعداداته.",
3007
+ operatorChannelLabel: "قناة توقيع المشغّل",
3008
+ onDeviceUnavailableHint: "متاح عندما يوقّع واحد على الأقل من موقّعي المريض على هذا الجهاز.",
3009
+ operatorChannelReverted: "تمت إعادة تعيين قناة توقيع المشغّل إلى {{channel}} — لا يوقّع أي من موقّعي المريض على هذا الجهاز.",
3008
3010
  signersSection: "موقّعو المريض",
3009
3011
  signerPlaceholder: "اختر موقّعاً",
3010
3012
  channelLabel: "قناة التوقيع",