@alfadocs/ui-kit-debug 1.29.0 → 1.31.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.
- package/dist/_chunks/{address-fields-CZ0pEdEI.js → address-fields-jFfjxOQR.js} +3 -3
- package/dist/_chunks/{address-fields-CZ0pEdEI.js.map → address-fields-jFfjxOQR.js.map} +1 -1
- package/dist/_chunks/{anamnesis-summary-rows-DwjqZgR5.js → anamnesis-summary-rows-DMO3MWSt.js} +2 -2
- package/dist/_chunks/{anamnesis-summary-rows-DwjqZgR5.js.map → anamnesis-summary-rows-DMO3MWSt.js.map} +1 -1
- package/dist/_chunks/{appointment-card-Dzr3GeVz.js → appointment-card-CvUFFEdS.js} +8 -6
- package/dist/_chunks/appointment-card-CvUFFEdS.js.map +1 -0
- package/dist/_chunks/{appointment-timeline-DhHwmHo1.js → appointment-timeline-DsMZY7U9.js} +2 -2
- package/dist/_chunks/{appointment-timeline-DhHwmHo1.js.map → appointment-timeline-DsMZY7U9.js.map} +1 -1
- package/dist/_chunks/{appointment-tray-4FUu_5NX.js → appointment-tray-Z2GaOIYQ.js} +2 -2
- package/dist/_chunks/{appointment-tray-4FUu_5NX.js.map → appointment-tray-Z2GaOIYQ.js.map} +1 -1
- package/dist/_chunks/{booking-AabCk7CI.js → booking-jGzRUETo.js} +2 -2
- package/dist/_chunks/{booking-AabCk7CI.js.map → booking-jGzRUETo.js.map} +1 -1
- package/dist/_chunks/{calendar-CI9MINcR.js → calendar-BNQKpxhE.js} +494 -438
- package/dist/_chunks/calendar-BNQKpxhE.js.map +1 -0
- package/dist/_chunks/{calendar-event-card-66CEEWU6.js → calendar-event-card-DSh-69HT.js} +130 -122
- package/dist/_chunks/calendar-event-card-DSh-69HT.js.map +1 -0
- package/dist/_chunks/calendar-workspace-Dy1jHBvG.js +9392 -0
- package/dist/_chunks/calendar-workspace-Dy1jHBvG.js.map +1 -0
- package/dist/_chunks/{clinical-note-card-BBgFd2nB.js → clinical-note-card-yCTR9DB6.js} +185 -188
- package/dist/_chunks/clinical-note-card-yCTR9DB6.js.map +1 -0
- package/dist/_chunks/{color-picker-CU303VjY.js → color-picker-Bl5f0iK1.js} +28 -25
- package/dist/_chunks/color-picker-Bl5f0iK1.js.map +1 -0
- package/dist/_chunks/{combobox-D7_NLE2Z.js → combobox-DnSdYssy.js} +216 -215
- package/dist/_chunks/combobox-DnSdYssy.js.map +1 -0
- package/dist/_chunks/{country-select-DzbPFktV.js → country-select-CfDNFG5c.js} +2 -2
- package/dist/_chunks/{country-select-DzbPFktV.js.map → country-select-CfDNFG5c.js.map} +1 -1
- package/dist/_chunks/{face-scheme-DA2vjqaM.js → face-scheme-l-CQyLs-.js} +2 -2
- package/dist/_chunks/{face-scheme-DA2vjqaM.js.map → face-scheme-l-CQyLs-.js.map} +1 -1
- package/dist/_chunks/notes-panel-am6e-Lwh.js +380 -0
- package/dist/_chunks/notes-panel-am6e-Lwh.js.map +1 -0
- package/dist/_chunks/{patient-details-DYAmq76G.js → patient-details-CdfursHt.js} +3 -3
- package/dist/_chunks/{patient-details-DYAmq76G.js.map → patient-details-CdfursHt.js.map} +1 -1
- package/dist/_chunks/{province-select-BBc7s7vR.js → province-select-BaUnkg4S.js} +2 -2
- package/dist/_chunks/{province-select-BBc7s7vR.js.map → province-select-BaUnkg4S.js.map} +1 -1
- package/dist/_chunks/{rich-text-editor-lSCiE0Zz.js → rich-text-editor-VJATL1Tk.js} +2 -2
- package/dist/_chunks/{rich-text-editor-lSCiE0Zz.js.map → rich-text-editor-VJATL1Tk.js.map} +1 -1
- package/dist/_chunks/{sparkline-BmGcEyZO.js → sparkline-Dx_sxK3J.js} +228 -198
- package/dist/_chunks/sparkline-Dx_sxK3J.js.map +1 -0
- package/dist/_chunks/{timeline-r-8IUoBS.js → timeline-u-2t9t_M.js} +37 -35
- package/dist/_chunks/timeline-u-2t9t_M.js.map +1 -0
- package/dist/_chunks/use-zoom-drilldown-qCX34w9I.js +210 -0
- package/dist/_chunks/use-zoom-drilldown-qCX34w9I.js.map +1 -0
- package/dist/agent-catalog.json +55 -11
- package/dist/agent-i18n/en.json +10 -8
- package/dist/components/_shared/get-error-message.d.ts +3 -0
- package/dist/components/_shared/get-error-message.d.ts.map +1 -0
- package/dist/components/address-fields/index.js +1 -1
- package/dist/components/appointment-card/appointment-card.d.ts.map +1 -1
- package/dist/components/appointment-card/index.js +2 -2
- package/dist/components/appointment-timeline/index.js +1 -1
- package/dist/components/booking/index.js +1 -1
- package/dist/components/calendar/calendar.d.ts +26 -2
- package/dist/components/calendar/calendar.d.ts.map +1 -1
- package/dist/components/calendar/index.js +1 -1
- package/dist/components/calendar-event-card/calendar-event-card.d.ts +9 -0
- package/dist/components/calendar-event-card/calendar-event-card.d.ts.map +1 -1
- package/dist/components/calendar-event-card/index.js +1 -1
- package/dist/components/clinical-note-card/clinical-note-card.d.ts +16 -1
- package/dist/components/clinical-note-card/clinical-note-card.d.ts.map +1 -1
- package/dist/components/clinical-note-card/index.js +1 -1
- package/dist/components/color-picker/color-utils.d.ts.map +1 -1
- package/dist/components/color-picker/index.js +1 -1
- package/dist/components/combobox/combobox.d.ts +5 -0
- package/dist/components/combobox/combobox.d.ts.map +1 -1
- package/dist/components/combobox/index.js +1 -1
- package/dist/components/country-select/index.js +1 -1
- package/dist/components/face-scheme/index.js +1 -1
- package/dist/components/index.d.ts +2 -2
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/notes-panel/index.d.ts +1 -1
- package/dist/components/notes-panel/index.d.ts.map +1 -1
- package/dist/components/notes-panel/index.js +1 -1
- package/dist/components/notes-panel/notes-panel.agent.d.ts.map +1 -1
- package/dist/components/notes-panel/notes-panel.d.ts +24 -5
- package/dist/components/notes-panel/notes-panel.d.ts.map +1 -1
- package/dist/components/patient-details/index.js +1 -1
- package/dist/components/province-select/index.js +1 -1
- package/dist/components/rich-text-editor/index.js +1 -1
- package/dist/components/sparkline/index.js +1 -1
- package/dist/components/sparkline/sparkline.agent.d.ts.map +1 -1
- package/dist/components/sparkline/sparkline.d.ts +6 -0
- package/dist/components/sparkline/sparkline.d.ts.map +1 -1
- package/dist/components/timeline/index.js +1 -1
- package/dist/components/timeline/timeline.d.ts +2 -0
- package/dist/components/timeline/timeline.d.ts.map +1 -1
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +56 -54
- package/dist/hooks/use-zoom-drilldown.d.ts +23 -0
- package/dist/hooks/use-zoom-drilldown.d.ts.map +1 -0
- package/dist/host-compat.css +10 -1
- package/dist/i18n/locales/ar.d.ts +50 -0
- package/dist/i18n/locales/ar.d.ts.map +1 -1
- package/dist/i18n/locales/ar.js +54 -4
- package/dist/i18n/locales/ar.js.map +1 -1
- package/dist/i18n/locales/de.d.ts +60 -10
- package/dist/i18n/locales/de.d.ts.map +1 -1
- package/dist/i18n/locales/de.js +64 -14
- package/dist/i18n/locales/de.js.map +1 -1
- package/dist/i18n/locales/el.d.ts +50 -0
- package/dist/i18n/locales/el.d.ts.map +1 -1
- package/dist/i18n/locales/el.js +54 -4
- package/dist/i18n/locales/el.js.map +1 -1
- package/dist/i18n/locales/en.d.ts +50 -0
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +54 -4
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/es.d.ts +50 -0
- package/dist/i18n/locales/es.d.ts.map +1 -1
- package/dist/i18n/locales/es.js +54 -4
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +50 -0
- package/dist/i18n/locales/fr.d.ts.map +1 -1
- package/dist/i18n/locales/fr.js +53 -3
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hi.d.ts +50 -0
- package/dist/i18n/locales/hi.d.ts.map +1 -1
- package/dist/i18n/locales/hi.js +54 -4
- package/dist/i18n/locales/hi.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +60 -10
- package/dist/i18n/locales/it.d.ts.map +1 -1
- package/dist/i18n/locales/it.js +64 -14
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/ja.d.ts +50 -0
- package/dist/i18n/locales/ja.d.ts.map +1 -1
- package/dist/i18n/locales/ja.js +54 -4
- package/dist/i18n/locales/ja.js.map +1 -1
- package/dist/i18n/locales/nl.d.ts +50 -0
- package/dist/i18n/locales/nl.d.ts.map +1 -1
- package/dist/i18n/locales/nl.js +54 -4
- package/dist/i18n/locales/nl.js.map +1 -1
- package/dist/i18n/locales/pl.d.ts +50 -0
- package/dist/i18n/locales/pl.d.ts.map +1 -1
- package/dist/i18n/locales/pl.js +54 -4
- package/dist/i18n/locales/pl.js.map +1 -1
- package/dist/i18n/locales/pt.d.ts +50 -0
- package/dist/i18n/locales/pt.d.ts.map +1 -1
- package/dist/i18n/locales/pt.js +54 -4
- package/dist/i18n/locales/pt.js.map +1 -1
- package/dist/i18n/locales/ro.d.ts +50 -0
- package/dist/i18n/locales/ro.d.ts.map +1 -1
- package/dist/i18n/locales/ro.js +53 -3
- package/dist/i18n/locales/ro.js.map +1 -1
- package/dist/i18n/locales/ru.d.ts +50 -0
- package/dist/i18n/locales/ru.d.ts.map +1 -1
- package/dist/i18n/locales/ru.js +54 -4
- package/dist/i18n/locales/ru.js.map +1 -1
- package/dist/i18n/locales/sq.d.ts +50 -0
- package/dist/i18n/locales/sq.d.ts.map +1 -1
- package/dist/i18n/locales/sq.js +54 -4
- package/dist/i18n/locales/sq.js.map +1 -1
- package/dist/i18n/locales/sv.d.ts +50 -0
- package/dist/i18n/locales/sv.d.ts.map +1 -1
- package/dist/i18n/locales/sv.js +54 -4
- package/dist/i18n/locales/sv.js.map +1 -1
- package/dist/i18n/locales/tr.d.ts +50 -0
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/locales/tr.js +54 -4
- package/dist/i18n/locales/tr.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +50 -0
- package/dist/i18n/locales/zh.d.ts.map +1 -1
- package/dist/i18n/locales/zh.js +54 -4
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/index.js +1073 -1070
- package/dist/locales/ar.json +54 -4
- package/dist/locales/de.json +64 -14
- package/dist/locales/el.json +54 -4
- package/dist/locales/en.json +54 -4
- package/dist/locales/es.json +54 -4
- package/dist/locales/fr.json +53 -3
- package/dist/locales/hi.json +54 -4
- package/dist/locales/it.json +64 -14
- package/dist/locales/ja.json +54 -4
- package/dist/locales/nl.json +54 -4
- package/dist/locales/pl.json +54 -4
- package/dist/locales/pt.json +54 -4
- package/dist/locales/ro.json +53 -3
- package/dist/locales/ru.json +54 -4
- package/dist/locales/sq.json +54 -4
- package/dist/locales/sv.json +54 -4
- package/dist/locales/tr.json +54 -4
- package/dist/locales/zh.json +54 -4
- package/dist/patterns/anamnesis/index.js +1 -1
- package/dist/patterns/calendar/calendar-appointment-details.d.ts +145 -0
- package/dist/patterns/calendar/calendar-appointment-details.d.ts.map +1 -0
- package/dist/patterns/calendar/calendar-appointment-details.sections.d.ts +32 -0
- package/dist/patterns/calendar/calendar-appointment-details.sections.d.ts.map +1 -0
- package/dist/patterns/calendar/calendar-editor-hydration.d.ts +59 -0
- package/dist/patterns/calendar/calendar-editor-hydration.d.ts.map +1 -0
- package/dist/patterns/calendar/calendar-notes-tool.d.ts +14 -0
- package/dist/patterns/calendar/calendar-notes-tool.d.ts.map +1 -0
- package/dist/patterns/calendar/calendar-patient-picker.d.ts +11 -0
- package/dist/patterns/calendar/calendar-patient-picker.d.ts.map +1 -0
- package/dist/patterns/calendar/calendar-series-scope-chooser.d.ts +18 -0
- package/dist/patterns/calendar/calendar-series-scope-chooser.d.ts.map +1 -0
- package/dist/patterns/calendar/calendar-workspace.d.ts +26 -1
- package/dist/patterns/calendar/calendar-workspace.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar-workspace.model.d.ts +8 -5
- package/dist/patterns/calendar/calendar-workspace.model.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.data.d.ts +66 -1
- package/dist/patterns/calendar/calendar.data.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.host.d.ts +2 -0
- package/dist/patterns/calendar/calendar.host.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.journey.d.ts +42 -7
- package/dist/patterns/calendar/calendar.journey.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.model.d.ts +54 -5
- package/dist/patterns/calendar/calendar.model.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.sheets.d.ts +68 -15
- package/dist/patterns/calendar/calendar.sheets.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.surface.d.ts +12 -2
- package/dist/patterns/calendar/calendar.surface.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.types.d.ts +29 -1
- package/dist/patterns/calendar/calendar.types.d.ts.map +1 -1
- package/dist/patterns/calendar/index.d.ts +9 -6
- package/dist/patterns/calendar/index.d.ts.map +1 -1
- package/dist/patterns/calendar/index.js +15 -14
- package/dist/tokens.css +10 -2
- package/package.json +1 -1
- package/dist/_chunks/appointment-card-Dzr3GeVz.js.map +0 -1
- package/dist/_chunks/calendar-CI9MINcR.js.map +0 -1
- package/dist/_chunks/calendar-event-card-66CEEWU6.js.map +0 -1
- package/dist/_chunks/calendar-workspace-a84AHQwj.js +0 -7506
- package/dist/_chunks/calendar-workspace-a84AHQwj.js.map +0 -1
- package/dist/_chunks/clinical-note-card-BBgFd2nB.js.map +0 -1
- package/dist/_chunks/color-picker-CU303VjY.js.map +0 -1
- package/dist/_chunks/combobox-D7_NLE2Z.js.map +0 -1
- package/dist/_chunks/notes-panel-CTNpsByN.js +0 -353
- package/dist/_chunks/notes-panel-CTNpsByN.js.map +0 -1
- package/dist/_chunks/sparkline-BmGcEyZO.js.map +0 -1
- package/dist/_chunks/timeline-r-8IUoBS.js.map +0 -1
- package/dist/_chunks/use-signing-session-CyOZWinp.js +0 -147
- package/dist/_chunks/use-signing-session-CyOZWinp.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clinical-note-card-yCTR9DB6.js","sources":["../../node_modules/lucide-react/dist/esm/icons/flag.mjs","../../node_modules/lucide-react/dist/esm/icons/pin.mjs","../../src/components/clinical-note-card/clinical-note-card.agent.ts","../../src/components/clinical-note-card/clinical-note-card.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M4 22V4a1 1 0 0 1 .4-.8A6 6 0 0 1 8 2c3 0 5 2 7.333 2q2 0 3.067-.8A1 1 0 0 1 20 4v10a1 1 0 0 1-.4.8A6 6 0 0 1 16 16c-3 0-5-2-8-2a6 6 0 0 0-4 1.528\",\n key: \"1jaruq\"\n }\n ]\n];\nconst Flag = createLucideIcon(\"flag\", __iconNode);\n\nexport { __iconNode, Flag as default };\n//# sourceMappingURL=flag.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: \"M12 17v5\", key: \"bb1du9\" }],\n [\n \"path\",\n {\n d: \"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z\",\n key: \"1nkz8b\"\n }\n ]\n];\nconst Pin = createLucideIcon(\"pin\", __iconNode);\n\nexport { __iconNode, Pin as default };\n//# sourceMappingURL=pin.mjs.map\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — ClinicalNoteCard. */\n/* */\n/* Read-only presentation surface. Exposes the note's id + structural */\n/* flags (pinned / flagged / attachment kind) so a future MCP UI bridge */\n/* can locate and describe a rendered note. NEVER reads the note body or */\n/* any author identity — those are PHI and stay out of the agent layer. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { ClinicalNoteCardHandle } from './clinical-note-card';\n\nexport const clinicalNoteCardAgent: AgentAdapter<ClinicalNoteCardHandle> = {\n id: 'clinical-note-card',\n capabilities: [],\n state: {\n noteId: {\n type: 'string | undefined',\n descriptionKey: 'ui.agent.clinicalNoteCard.state.noteId',\n description: 'Stable identifier of the rendered note, when supplied.',\n read: (handle) => handle.getNoteId(),\n },\n pinned: {\n type: 'boolean',\n descriptionKey: 'ui.agent.clinicalNoteCard.state.pinned',\n description: 'Whether the note is pinned to the top of the timeline.',\n read: (handle) => handle.isPinned(),\n },\n flagged: {\n type: 'boolean',\n descriptionKey: 'ui.agent.clinicalNoteCard.state.flagged',\n description: 'Whether the note is flagged for follow-up.',\n read: (handle) => handle.isFlagged(),\n },\n attachmentKind: {\n type: \"'patient' | 'carePlan' | 'carePlanEntry' | 'phase' | 'xray' | undefined\",\n descriptionKey: 'ui.agent.clinicalNoteCard.state.attachmentKind',\n description:\n 'Structural kind the note is attached to. Never the attachment identity or content.',\n read: (handle) => handle.getAttachmentKind(),\n },\n },\n actions: {},\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'clinical-note-card',\n description:\n 'Marks the ClinicalNoteCard root. Also emits data-pinned / data-flagged / data-attached-to structural hooks.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop — addresses a specific note.',\n },\n },\n};\n","import {\n forwardRef,\n useId,\n useMemo,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Flag, Pin, FileText, Layers, ScanLine, User } from 'lucide-react';\nimport { Avatar } from '../avatar/avatar';\nimport { Badge } from '../badge/badge';\nimport { Card } from '../card/card';\nimport { Link } from '../link/link';\nimport { Timestamp } from '../timestamp';\nimport { SafeHtml } from '../_shared/safe-html';\nimport { isSafeEntityUrl } from '../_shared/is-safe-url';\nimport { useClampOverflow } from '../../hooks/use-clamp-overflow';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { clinicalNoteCardAgent } from './clinical-note-card.agent';\n\n/* -------------------------------------------------------------------- */\n/* ClinicalNoteCard */\n/* */\n/* A single clinical note — the free-text annotation an operator writes */\n/* against a patient, care plan, treatment phase, or x-ray. Replaces the */\n/* bespoke \"nota clinica\" rows scattered across the platform patient */\n/* timeline. Composes Card + Avatar (author) + Timestamp + Badge/Tag */\n/* (clinical / pinned / flagged) + Link (attachment) and renders the */\n/* markdown body through the shared SafeHtml helper — the only sanctioned */\n/* carrier of dangerouslySetInnerHTML (constraint §8). */\n/* */\n/* All visible text flows through useTranslation('ui') against the */\n/* `clinicalNoteCard.*` namespace. No PHI is read by the agent adapter — */\n/* only the note id and structural flags are exposed. */\n/* -------------------------------------------------------------------- */\n\n/* -------------------------------------------------------------------- */\n/* Public types */\n/* -------------------------------------------------------------------- */\n\n/** Author identity — drives the avatar + visible byline. */\nexport interface ClinicalNoteAuthor {\n /** Display name. */\n name: string;\n /** Optional avatar image URL. */\n avatarUrl?: string;\n}\n\n/**\n * What the note is attached to. Discriminated by `kind`:\n * - `patient` — a free-standing note on the patient record.\n * - `carePlan` — attached to a care plan (estimate / treatment plan),\n * identified by its number, with an optional deep link.\n * - `carePlanEntry` — attached to one entry inside a care plan, naming the\n * care and (optionally) the listed elements.\n * - `phase` — attached to a treatment phase, labelled.\n * - `xray` — attached to an x-ray / radiograph, optionally labelled.\n *\n * Every non-patient kind takes an optional `url`: a safe one turns the chip\n * into a link, an unsafe one keeps the chip.\n */\nexport type NoteAttachment =\n | { kind: 'patient' }\n | { kind: 'carePlan'; number: string; url?: string }\n | {\n kind: 'carePlanEntry';\n careName: string;\n elements?: string[];\n url?: string;\n }\n | { kind: 'phase'; label: string; url?: string }\n | { kind: 'xray'; label?: string; url?: string };\n\n/** Imperative handle exposed to the agent runtime — identifiers / flags only. */\nexport interface ClinicalNoteCardHandle {\n /** The note's stable id, when supplied. */\n getNoteId: () => string | undefined;\n /** Whether the note is currently pinned. */\n isPinned: () => boolean;\n /** Whether the note is currently flagged. */\n isFlagged: () => boolean;\n /** The attachment kind the note is bound to. */\n getAttachmentKind: () => NoteAttachment['kind'] | undefined;\n}\n\nexport interface ClinicalNoteCardProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'aria-label' | 'children' | 'content' | 'title'\n> {\n /** Agent-readiness consumer id, surfaced as `data-component-id`. */\n id?: string;\n /**\n * ISO-8601 timestamp the note refers to (the clinical date). Drives the\n * primary `<Timestamp>`. An empty string renders no timestamp (an undated\n * imported note).\n */\n dateIso: string;\n /**\n * ISO-8601 timestamp the note was authored, when it differs from\n * `dateIso`. Rendered as a secondary \"added\" line.\n */\n createdAtIso?: string;\n /** Author identity — avatar + byline. Optional for system notes. */\n author?: ClinicalNoteAuthor;\n /** The operator the note is credited to: a secondary \"Operator: …\" byline. */\n operatorName?: string;\n /**\n * A deleted note kept for the record. Shows a \"Deleted\" badge and keeps the\n * body out of the DOM until the reader presses \"Show deleted note\". Not an\n * access control: the body is one press away.\n */\n deleted?: boolean;\n /**\n * Whether this is a clinical note (vs. an administrative one). When true a\n * \"Clinical\" badge is shown so the note's nature is unambiguous at a glance.\n */\n clinical?: boolean;\n /** What the note is attached to — drives a contextual chip + optional link. */\n attachedTo?: NoteAttachment;\n /**\n * The note body, authored in a small, safe subset of Markdown (bold,\n * italic, inline code, links, line breaks, simple lists). Rendered through\n * the shared `SafeHtml` helper with the `markdown` sanitiser profile —\n * raw HTML and unsafe link schemes are stripped.\n */\n content: string;\n /**\n * How `content` is authored. `'markdown'` (default) runs the small Markdown\n * subset through the converter; `'html'` treats `content` as rich HTML\n * (e.g. Redactor output) and renders it through SafeHtml's `rich-text`\n * profile, so colours, sizes, tables and images survive sanitisation.\n */\n contentFormat?: 'markdown' | 'html';\n /** Pin the note to the top of a timeline — shows a \"Pinned\" chip. */\n pinned?: boolean;\n /** Flag the note for follow-up / attention — shows a \"Flagged\" chip. */\n flagged?: boolean;\n /**\n * When provided, the pinned chip becomes an `aria-pressed` toggle button so\n * the note can be (un)pinned in place — the pin glyph fills and tints to the\n * accent when pinned (no button fill). Omit for a static, display-only card.\n */\n onTogglePin?: () => void;\n /** As `onTogglePin`, for the flagged state (warning-tinted when flagged). */\n onToggleFlag?: () => void;\n /**\n * Clamp the rendered body to five lines. When the body is taller than the\n * clamp, a \"Read more\" / \"Read less\" disclosure toggles the full text in\n * place — the note stays a read-only display surface, so this is the\n * sighted-user escape hatch (assistive tech reads the full body regardless).\n */\n truncate?: boolean;\n /**\n * `'elevated'` (default) wraps the note in `<Card variant=\"elevated\">`.\n * `'flat'` drops the chrome for use inside an existing Card / timeline rail.\n */\n surface?: 'flat' | 'elevated';\n /** Override the default region aria-label. */\n 'aria-label'?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* CVA — root */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva('ds:w-full ds:text-[color:var(--foreground)]', {\n variants: {\n surface: { flat: '', elevated: '' },\n },\n defaultVariants: { surface: 'elevated' },\n});\n\n/* Body clamp — applied only when `truncate` is set. Logical-safe. */\nconst bodyVariants = cva(\n [\n 'type-body-sm ds:text-[color:var(--foreground)]',\n 'ds:break-words',\n '[&_a]:ds:underline [&_a]:ds:underline-offset-2',\n '[&_code]:ds:rounded-[var(--radius-sm)] [&_code]:ds:bg-muted/30 [&_code]:ds:ps-[var(--spacing-xs)] [&_code]:ds:pe-[var(--spacing-xs)] [&_code]:ds:font-[family-name:var(--font-mono)]',\n '[&_p]:ds:m-0 [&_p+p]:ds:mt-[var(--spacing-sm)]',\n // `list-disc` / `list-decimal` are load-bearing: the card renders host\n // HTML inside `[data-component]`, where preflight's `list-style: none`\n // still applies. Without them the indent lands but the markers do not.\n 'ds:[&_ul]:m-0 ds:[&_ul]:ps-[var(--spacing-md)] ds:[&_ul]:list-disc ds:[&_ol]:m-0 ds:[&_ol]:ps-[var(--spacing-md)] ds:[&_ol]:list-decimal',\n // Rich-text (Redactor) extras — harmless on markdown notes, which carry\n // none of these tags. Headings, inline images and tables stay readable.\n '[&_h2]:type-title-item [&_h3]:type-title-item [&_h2]:ds:m-0 [&_h3]:ds:m-0',\n '[&_img]:ds:max-w-full [&_img]:ds:h-auto [&_img]:ds:rounded-[var(--radius-sm)]',\n '[&_table]:ds:my-[var(--spacing-sm)] [&_table]:ds:w-full [&_table]:ds:border-collapse',\n '[&_th]:ds:border [&_th]:ds:border-[color:var(--border)] [&_th]:ds:ps-[var(--spacing-xs)] [&_th]:ds:pe-[var(--spacing-xs)] [&_th]:ds:py-[var(--spacing-2xs)] [&_th]:ds:text-start',\n '[&_td]:ds:border [&_td]:ds:border-[color:var(--border)] [&_td]:ds:ps-[var(--spacing-xs)] [&_td]:ds:pe-[var(--spacing-xs)] [&_td]:ds:py-[var(--spacing-2xs)]',\n ].join(' '),\n {\n variants: {\n truncate: {\n true: 'ds:[overflow:hidden] ds:[display:-webkit-box] ds:[-webkit-box-orient:vertical] ds:[-webkit-line-clamp:5]',\n false: '',\n },\n },\n defaultVariants: { truncate: false },\n },\n);\n\n/* -------------------------------------------------------------------- */\n/* Inline affordances — pin / flag toggle + read-more disclosure */\n/* -------------------------------------------------------------------- */\n\n/* Pin / flag toggle. A raw button (not IconButton) so the pressed state\n reads as a FILLED glyph + colour tint rather than a filled button — the\n same treatment as the Sidebar favourite star. The compact box keeps a\n --min-target-size hit area on touch via the ::before expansion. */\nconst noteToggleBase = [\n 'ds:relative ds:inline-flex ds:items-center ds:justify-center ds:shrink-0',\n 'ds:size-7 ds:rounded-[var(--radius-sm)]',\n 'ds:before:absolute ds:before:inset-x-[calc((var(--min-target-size)-100%)/-2)] ds:before:inset-y-[calc((var(--min-target-size)-100%)/-2)] ds:before:content-[\"\"] ds:sm:before:hidden',\n 'ds:hover:bg-[color:var(--muted)]/20',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:transition-[color,background-color] ds:duration-[var(--animation-duration)]',\n 'ds:motion-reduce:transition-none',\n].join(' ');\n\n/* Read-more / read-less disclosure — an inline text toggle in the flow of\n the body copy (exempt from target-size the same way an inline link is). */\nconst readMoreClasses = [\n 'ds:mt-[var(--spacing-2xs)] ds:inline-flex ds:items-center ds:self-start',\n 'ds:text-[length:var(--font-size-xs)] ds:font-semibold',\n 'ds:underline ds:underline-offset-2 ds:text-[color:var(--primary)] ds:hover:no-underline',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n].join(' ');\n\nconst deletedDisclosure = cva([\n readMoreClasses,\n 'ds:[min-block-size:var(--min-target-size)] ds:[min-inline-size:var(--min-target-size)]',\n]);\n\ninterface NoteToggleProps {\n /** The lucide glyph, pre-configured with `fill` + size by the caller. */\n icon: ReactNode;\n /** Current pressed state. */\n pressed: boolean;\n /** Accessible label (flips between the on / off verb). */\n label: string;\n /** Colour class applied while pressed (accent for pin, warning for flag). */\n activeClassName: string;\n onToggle: () => void;\n}\n\nfunction NoteToggle({\n icon,\n pressed,\n label,\n activeClassName,\n onToggle,\n}: NoteToggleProps) {\n return (\n <button\n type=\"button\"\n aria-pressed={pressed}\n aria-label={label}\n onClick={onToggle}\n className={[\n noteToggleBase,\n pressed\n ? activeClassName\n : 'ds:text-[color:var(--muted-foreground)] ds:hover:text-[color:var(--foreground)]',\n ].join(' ')}\n >\n {icon}\n </button>\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* Markdown → safe HTML */\n/* */\n/* A dependency-free converter for the small Markdown subset the note */\n/* body supports. The output is then passed to `SafeHtml` (markdown */\n/* profile) which strips everything outside the allow-list — so even a */\n/* hostile note can only ever emit the sanitised tag set. We never call */\n/* dangerouslySetInnerHTML ourselves; SafeHtml is the single carrier. */\n/* -------------------------------------------------------------------- */\n\n/** HTML-escape a raw text run before re-inserting our own safe markup. */\nfunction escapeHtml(input: string): string {\n return input\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n\n/** Apply inline markdown (bold, italic, code, links) to an escaped run. */\nfunction renderInlineHtml(escaped: string): string {\n let out = escaped;\n // Inline code first so its contents aren't re-processed.\n out = out.replace(/`([^`]+)`/g, '<code>$1</code>');\n out = out.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');\n out = out.replace(/\\*([^*]+)\\*/g, '<em>$1</em>');\n // Links — the href is left as-authored; SafeHtml's markdown profile\n // rejects any scheme outside http(s)/mailto/tel at sanitise time.\n out = out.replace(\n /\\[([^\\]]+)\\]\\(([^)\\s]+)\\)/g,\n '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>',\n );\n return out;\n}\n\n/** Convert the supported Markdown subset into an HTML string. */\nfunction markdownToHtml(input: string): string {\n const blocks = input.split(/\\n{2,}/);\n return blocks\n .map((block) => {\n const lines = block.split('\\n');\n const isUnordered = lines.every((l) => /^\\s*[-*]\\s+/.test(l));\n const isOrdered = lines.every((l) => /^\\s*\\d+\\.\\s+/.test(l));\n if (isUnordered && lines.length > 0) {\n const items = lines\n .map((l) => l.replace(/^\\s*[-*]\\s+/, ''))\n .map((l) => `<li>${renderInlineHtml(escapeHtml(l))}</li>`)\n .join('');\n return `<ul>${items}</ul>`;\n }\n if (isOrdered && lines.length > 0) {\n const items = lines\n .map((l) => l.replace(/^\\s*\\d+\\.\\s+/, ''))\n .map((l) => `<li>${renderInlineHtml(escapeHtml(l))}</li>`)\n .join('');\n return `<ol>${items}</ol>`;\n }\n const paragraph = renderInlineHtml(escapeHtml(block)).replace(\n /\\n/g,\n '<br />',\n );\n return `<p>${paragraph}</p>`;\n })\n .join('');\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nexport const ClinicalNoteCard = forwardRef<\n HTMLDivElement,\n ClinicalNoteCardProps\n>(\n (\n {\n id,\n dateIso,\n createdAtIso,\n author,\n operatorName,\n deleted,\n clinical,\n attachedTo,\n content,\n contentFormat = 'markdown',\n pinned,\n flagged,\n onTogglePin,\n onToggleFlag,\n truncate = false,\n surface = 'elevated',\n 'aria-label': ariaLabel,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const headingId = useId();\n const bodyId = useId();\n const [expanded, setExpanded] = useState(false);\n const [deletedOpen, setDeletedOpen] = useState(false);\n const [previousDeleted, setPreviousDeleted] = useState(!!deleted);\n if (previousDeleted !== !!deleted) {\n setPreviousDeleted(!!deleted);\n setDeletedOpen(false);\n }\n // A deleted note's body stays empty and hidden until the reader reveals it.\n const bodyHidden = !!deleted && !deletedOpen;\n\n // Only measure while clamped — once expanded there's nothing to clip.\n const { ref: clampRef, isOverflowing } = useClampOverflow<HTMLDivElement>(\n truncate && !expanded && !bodyHidden,\n );\n // Show the disclosure once the body overflows; keep it while expanded so\n // the user can collapse again.\n const showReadMore = truncate && !bodyHidden && (isOverflowing || expanded);\n\n // Markdown notes are converted to a safe HTML subset; rich-text (Redactor)\n // notes are passed through verbatim and sanitised by SafeHtml's broader\n // `rich-text` profile at render. Either way SafeHtml is the only carrier.\n const bodyHtml = useMemo(\n () => (contentFormat === 'html' ? content : markdownToHtml(content)),\n [content, contentFormat],\n );\n\n const resolvedAriaLabel = ariaLabel ?? t('clinicalNoteCard.regionLabel');\n\n useAgentRegistration(\n clinicalNoteCardAgent,\n {\n getNoteId: () => id,\n isPinned: () => !!pinned,\n isFlagged: () => !!flagged,\n getAttachmentKind: () => attachedTo?.kind,\n },\n id,\n );\n\n /* ----- Attachment chip / link ----- */\n // A safe host url turns the chip into a link; otherwise it stays a chip.\n const linkOrChip = (\n label: string,\n icon: ReactNode,\n variant: 'info' | 'neutral',\n url: string | undefined,\n ): ReactNode =>\n url && isSafeEntityUrl(url) ? (\n <Link href={url} intent=\"default\" startIcon={icon}>\n {label}\n </Link>\n ) : (\n <Badge variant={variant} size=\"sm\" leading={icon}>\n {label}\n </Badge>\n );\n\n let attachmentNode: ReactNode = null;\n if (attachedTo) {\n switch (attachedTo.kind) {\n case 'patient':\n attachmentNode = (\n <Badge\n variant=\"neutral\"\n size=\"sm\"\n leading={<User aria-hidden=\"true\" />}\n >\n {t('clinicalNoteCard.attachment.patient')}\n </Badge>\n );\n break;\n case 'carePlan':\n attachmentNode = linkOrChip(\n t('clinicalNoteCard.attachment.carePlan', {\n number: attachedTo.number,\n }),\n <FileText aria-hidden=\"true\" />,\n 'info',\n attachedTo.url,\n );\n break;\n case 'carePlanEntry':\n attachmentNode = linkOrChip(\n attachedTo.elements && attachedTo.elements.length > 0\n ? t('clinicalNoteCard.attachment.carePlanEntryWithElements', {\n care: attachedTo.careName,\n elements: attachedTo.elements.join(', '),\n })\n : t('clinicalNoteCard.attachment.carePlanEntry', {\n care: attachedTo.careName,\n }),\n <FileText aria-hidden=\"true\" />,\n 'info',\n attachedTo.url,\n );\n break;\n case 'phase':\n attachmentNode = linkOrChip(\n t('clinicalNoteCard.attachment.phase', { label: attachedTo.label }),\n <Layers aria-hidden=\"true\" />,\n 'neutral',\n attachedTo.url,\n );\n break;\n case 'xray':\n attachmentNode = linkOrChip(\n attachedTo.label\n ? t('clinicalNoteCard.attachment.xrayWithLabel', {\n label: attachedTo.label,\n })\n : t('clinicalNoteCard.attachment.xray'),\n <ScanLine aria-hidden=\"true\" />,\n 'neutral',\n attachedTo.url,\n );\n break;\n }\n }\n\n const inner = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {/* Header: author + date + status chips */}\n <div className=\"ds:flex ds:items-start ds:gap-[var(--spacing-sm)]\">\n {author ? (\n <Avatar\n name={author.name}\n src={author.avatarUrl}\n size=\"sm\"\n className=\"ds:shrink-0\"\n aria-hidden=\"true\"\n role=\"presentation\"\n aria-label={undefined}\n />\n ) : null}\n <div className=\"ds:flex-1 ds:min-w-0 ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n {author ? (\n <span\n id={headingId}\n className=\"type-title-item ds:text-[color:var(--foreground)] ds:truncate\"\n >\n {author.name}\n </span>\n ) : (\n <span id={headingId} className=\"ds:sr-only\">\n {resolvedAriaLabel}\n </span>\n )}\n {operatorName ? (\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)] ds:break-words\">\n {t('clinicalNoteCard.operator', { name: operatorName })}\n </span>\n ) : null}\n <span className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-x-[var(--spacing-xs)] ds:gap-y-[var(--spacing-2xs)] ds:empty:hidden\">\n {dateIso ? (\n <Timestamp value={dateIso} shape=\"bare\" size=\"sm\" />\n ) : null}\n {createdAtIso && createdAtIso !== dateIso ? (\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {t('clinicalNoteCard.added')}{' '}\n <Timestamp value={createdAtIso} shape=\"bare\" size=\"sm\" />\n </span>\n ) : null}\n </span>\n </div>\n {deleted ||\n clinical ||\n onTogglePin ||\n onToggleFlag ||\n pinned ||\n flagged ? (\n <span className=\"ds:ms-auto ds:flex ds:shrink-0 ds:flex-wrap ds:items-center ds:justify-end ds:gap-[var(--spacing-xs)]\">\n {deleted ? (\n <Badge variant=\"error\" size=\"sm\">\n {t('clinicalNoteCard.deleted')}\n </Badge>\n ) : null}\n {clinical ? (\n <Badge variant=\"brand\" size=\"sm\">\n {t('clinicalNoteCard.clinical')}\n </Badge>\n ) : null}\n {/* Pin + flag — grouped tightly together, kept clear of the\n clinical badge by the cluster's larger gap. Each is an\n interactive toggle when a handler is supplied (filled glyph +\n tint when active, no button fill), else a static chip. */}\n {onTogglePin || onToggleFlag || pinned || flagged ? (\n <span className=\"ds:flex ds:items-center ds:gap-[var(--spacing-2xs)]\">\n {onTogglePin ? (\n <NoteToggle\n pressed={!!pinned}\n onToggle={onTogglePin}\n label={\n pinned\n ? t('clinicalNoteCard.unpin')\n : t('clinicalNoteCard.pin')\n }\n activeClassName=\"ds:text-[color:var(--accent)]\"\n icon={\n <Pin\n aria-hidden=\"true\"\n className=\"ds:size-4\"\n fill={pinned ? 'currentColor' : 'none'}\n />\n }\n />\n ) : pinned ? (\n <Badge\n variant=\"accent\"\n size=\"sm\"\n leading={<Pin aria-hidden=\"true\" />}\n >\n {t('clinicalNoteCard.pinned')}\n </Badge>\n ) : null}\n {onToggleFlag ? (\n <NoteToggle\n pressed={!!flagged}\n onToggle={onToggleFlag}\n label={\n flagged\n ? t('clinicalNoteCard.unflag')\n : t('clinicalNoteCard.flag')\n }\n activeClassName=\"ds:text-[color:var(--warning-readable)]\"\n icon={\n <Flag\n aria-hidden=\"true\"\n className=\"ds:size-4\"\n fill={flagged ? 'currentColor' : 'none'}\n />\n }\n />\n ) : flagged ? (\n <Badge\n variant=\"warning\"\n size=\"sm\"\n leading={<Flag aria-hidden=\"true\" />}\n >\n {t('clinicalNoteCard.flagged')}\n </Badge>\n ) : null}\n </span>\n ) : null}\n </span>\n ) : null}\n </div>\n\n {deleted ? (\n <button\n type=\"button\"\n aria-expanded={deletedOpen}\n aria-controls={bodyId}\n onClick={() => setDeletedOpen((prev) => !prev)}\n className={deletedDisclosure()}\n >\n {deletedOpen\n ? t('clinicalNoteCard.hideDeleted')\n : t('clinicalNoteCard.showDeleted')}\n </button>\n ) : null}\n {/* Body — rendered via the sanctioned SafeHtml carrier. Markdown notes\n use the tight markdown profile; rich-text notes the broader one.\n When `truncate`, the body clamps to five lines with a read-more\n disclosure once it overflows. */}\n <SafeHtml\n ref={clampRef}\n id={truncate || deleted ? bodyId : undefined}\n hidden={bodyHidden}\n html={bodyHidden ? '' : bodyHtml}\n profile={contentFormat === 'html' ? 'rich-text' : 'markdown'}\n className={bodyVariants({ truncate: truncate && !expanded })}\n />\n {showReadMore ? (\n <button\n type=\"button\"\n aria-expanded={expanded}\n aria-controls={bodyId}\n onClick={() => setExpanded((prev) => !prev)}\n className={readMoreClasses}\n >\n {expanded\n ? t('clinicalNoteCard.readLess')\n : t('clinicalNoteCard.readMore')}\n </button>\n ) : null}\n\n {/* Attachment context */}\n {attachmentNode ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n {attachmentNode}\n </div>\n ) : null}\n </div>\n );\n\n return (\n <div\n ref={ref}\n role=\"article\"\n aria-label={resolvedAriaLabel}\n aria-labelledby={headingId}\n data-component=\"clinical-note-card\"\n data-component-id={id}\n data-pinned={pinned ? 'true' : undefined}\n data-flagged={flagged ? 'true' : undefined}\n data-deleted={deleted ? 'true' : undefined}\n data-attached-to={attachedTo?.kind}\n id={id}\n className={rootVariants({ surface, className })}\n {...rest}\n >\n {surface === 'elevated' ? (\n <Card variant=\"elevated\">\n <Card.Body>{inner}</Card.Body>\n </Card>\n ) : (\n inner\n )}\n </div>\n );\n },\n);\n\nClinicalNoteCard.displayName = 'ClinicalNoteCard';\n\n/** Re-export of the surface variant union for downstream typing. */\nexport type ClinicalNoteCardSurface = NonNullable<\n VariantProps<typeof rootVariants>['surface']\n>;\n"],"names":["__iconNode","Flag","createLucideIcon","Pin","clinicalNoteCardAgent","handle","rootVariants","cva","bodyVariants","noteToggleBase","readMoreClasses","deletedDisclosure","NoteToggle","icon","pressed","label","activeClassName","onToggle","jsx","escapeHtml","input","renderInlineHtml","escaped","out","markdownToHtml","block","lines","isUnordered","l","isOrdered","ClinicalNoteCard","forwardRef","id","dateIso","createdAtIso","author","operatorName","deleted","clinical","attachedTo","content","contentFormat","pinned","flagged","onTogglePin","onToggleFlag","truncate","surface","ariaLabel","className","rest","ref","t","useTranslation","headingId","useId","bodyId","expanded","setExpanded","useState","deletedOpen","setDeletedOpen","previousDeleted","setPreviousDeleted","bodyHidden","clampRef","isOverflowing","useClampOverflow","showReadMore","bodyHtml","useMemo","resolvedAriaLabel","useAgentRegistration","linkOrChip","variant","url","isSafeEntityUrl","Link","Badge","attachmentNode","User","FileText","Layers","ScanLine","inner","jsxs","Avatar","Timestamp","prev","SafeHtml","Card"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
@@ -5,9 +5,9 @@ import { c as te } from "./index-D2ZczOXr.js";
|
|
|
5
5
|
import { useTranslation as Ne } from "react-i18next";
|
|
6
6
|
import { u as Ae } from "./form-field-context-B3APVHKx.js";
|
|
7
7
|
import { S as se } from "./slider-DN1CWkKB.js";
|
|
8
|
-
import { u as
|
|
8
|
+
import { u as Me } from "./registry-DvAUVLHh.js";
|
|
9
9
|
import { C as re } from "./check-DrFSN__t.js";
|
|
10
|
-
import { X as
|
|
10
|
+
import { X as Se } from "./x-B5YnXwCz.js";
|
|
11
11
|
const Te = {
|
|
12
12
|
id: "color-picker",
|
|
13
13
|
capabilities: ["set_value"],
|
|
@@ -69,10 +69,13 @@ function ne(e, t, r, s) {
|
|
|
69
69
|
w = c > 0.5 ? x / (2 - n - d) : x / (n + d), n === e ? m = ((t - r) / x + (t < r ? 6 : 0)) / 6 : n === t ? m = ((r - e) / x + 2) / 6 : m = ((e - t) / x + 4) / 6;
|
|
70
70
|
}
|
|
71
71
|
return {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
72
|
+
// Preserve byte identity through RGB -> HSL -> RGB. Palette colours
|
|
73
|
+
// can be server identifiers, so even one changed channel is a different
|
|
74
|
+
// selection. Round human-facing labels only, never this stored value.
|
|
75
|
+
h: m * 360,
|
|
76
|
+
s: w * 100,
|
|
77
|
+
l: c * 100,
|
|
78
|
+
a: s
|
|
76
79
|
};
|
|
77
80
|
}
|
|
78
81
|
function C(e) {
|
|
@@ -103,7 +106,7 @@ function D(e, t) {
|
|
|
103
106
|
case "hex":
|
|
104
107
|
return C(e);
|
|
105
108
|
case "hsl":
|
|
106
|
-
return e.a < 1 ? `hsla(${e.h}, ${e.s}%, ${e.l}%, ${e.a})` : `hsl(${e.h}, ${e.s}%, ${e.l}%)`;
|
|
109
|
+
return e.a < 1 ? `hsla(${Math.round(e.h)}, ${Math.round(e.s)}%, ${Math.round(e.l)}%, ${e.a})` : `hsl(${Math.round(e.h)}, ${Math.round(e.s)}%, ${Math.round(e.l)}%)`;
|
|
107
110
|
case "rgba":
|
|
108
111
|
return Le(e);
|
|
109
112
|
}
|
|
@@ -305,7 +308,7 @@ const He = [
|
|
|
305
308
|
size: x = "md",
|
|
306
309
|
disabled: ie = !1,
|
|
307
310
|
variant: de = "inline",
|
|
308
|
-
compact:
|
|
311
|
+
compact: S = !0,
|
|
309
312
|
className: U
|
|
310
313
|
} = e, { t: g } = Ne(), N = Ae(), le = Pe(), P = N.id || le, v = N.disabled || ie, L = r !== void 0, [X, ce] = T(() => {
|
|
311
314
|
const a = r ?? s;
|
|
@@ -384,15 +387,15 @@ const He = [
|
|
|
384
387
|
f = p % u;
|
|
385
388
|
break;
|
|
386
389
|
case "PageDown": {
|
|
387
|
-
const
|
|
388
|
-
f = Math.min(
|
|
390
|
+
const M = Math.floor((i - 1) / u) * u;
|
|
391
|
+
f = Math.min(M + p % u, i - 1);
|
|
389
392
|
break;
|
|
390
393
|
}
|
|
391
394
|
case "Enter":
|
|
392
395
|
case " ": {
|
|
393
396
|
a.preventDefault();
|
|
394
|
-
const
|
|
395
|
-
|
|
397
|
+
const M = y(A[p].hex);
|
|
398
|
+
M && b(M);
|
|
396
399
|
return;
|
|
397
400
|
}
|
|
398
401
|
default:
|
|
@@ -409,7 +412,7 @@ const He = [
|
|
|
409
412
|
}),
|
|
410
413
|
[b]
|
|
411
414
|
);
|
|
412
|
-
|
|
415
|
+
Me(Te, ve, P);
|
|
413
416
|
const I = E(() => {
|
|
414
417
|
if (!w) return null;
|
|
415
418
|
const a = y(w);
|
|
@@ -428,8 +431,8 @@ const He = [
|
|
|
428
431
|
className: "ds:grid ds:grid-cols-6 ds:gap-[var(--spacing-xs)]",
|
|
429
432
|
children: A.map((a, i) => {
|
|
430
433
|
const f = Math.floor(i / u) * u;
|
|
431
|
-
return i === f ? /* @__PURE__ */ l("div", { role: "row", className: "ds:contents", children: A.slice(f, f + u).map((k,
|
|
432
|
-
const O = f +
|
|
434
|
+
return i === f ? /* @__PURE__ */ l("div", { role: "row", className: "ds:contents", children: A.slice(f, f + u).map((k, M) => {
|
|
435
|
+
const O = f + M, V = O === B;
|
|
433
436
|
return (
|
|
434
437
|
// eslint-disable-next-line jsx-a11y/click-events-have-key-events -- parent grid handles keyboard navigation via onKeyDown
|
|
435
438
|
/* @__PURE__ */ l(
|
|
@@ -464,7 +467,7 @@ const He = [
|
|
|
464
467
|
})
|
|
465
468
|
}
|
|
466
469
|
)
|
|
467
|
-
), Ce =
|
|
470
|
+
), Ce = S ? null : /* @__PURE__ */ h(ke, { children: [
|
|
468
471
|
/* @__PURE__ */ h("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]", children: [
|
|
469
472
|
/* @__PURE__ */ l(
|
|
470
473
|
"label",
|
|
@@ -497,7 +500,7 @@ const He = [
|
|
|
497
500
|
max: 360,
|
|
498
501
|
value: o.h,
|
|
499
502
|
onChange: (a) => b({ ...o, h: a }),
|
|
500
|
-
formatValue: (a) => `H ${a}°`,
|
|
503
|
+
formatValue: (a) => `H ${Math.round(a)}°`,
|
|
501
504
|
disabled: v
|
|
502
505
|
}
|
|
503
506
|
),
|
|
@@ -510,7 +513,7 @@ const He = [
|
|
|
510
513
|
max: 100,
|
|
511
514
|
value: o.s,
|
|
512
515
|
onChange: (a) => b({ ...o, s: a }),
|
|
513
|
-
formatValue: (a) => `S ${a}%`,
|
|
516
|
+
formatValue: (a) => `S ${Math.round(a)}%`,
|
|
514
517
|
disabled: v
|
|
515
518
|
}
|
|
516
519
|
),
|
|
@@ -523,7 +526,7 @@ const He = [
|
|
|
523
526
|
max: 100,
|
|
524
527
|
value: o.l,
|
|
525
528
|
onChange: (a) => b({ ...o, l: a }),
|
|
526
|
-
formatValue: (a) => `L ${a}%`,
|
|
529
|
+
formatValue: (a) => `L ${Math.round(a)}%`,
|
|
527
530
|
disabled: v
|
|
528
531
|
}
|
|
529
532
|
),
|
|
@@ -593,7 +596,7 @@ const He = [
|
|
|
593
596
|
] }), J = /* @__PURE__ */ h(
|
|
594
597
|
"div",
|
|
595
598
|
{
|
|
596
|
-
className:
|
|
599
|
+
className: S ? x === "sm" ? Ge : Ve : Be,
|
|
597
600
|
children: [
|
|
598
601
|
be,
|
|
599
602
|
Ce
|
|
@@ -623,7 +626,7 @@ const He = [
|
|
|
623
626
|
id: P,
|
|
624
627
|
"aria-describedby": N.describedBy || void 0,
|
|
625
628
|
"aria-invalid": N.invalid || void 0,
|
|
626
|
-
"aria-label":
|
|
629
|
+
"aria-label": S ? g("inputs.colorPicker.triggerLabel", "Choose colour") : void 0,
|
|
627
630
|
className: _e({ size: x, className: U }),
|
|
628
631
|
"data-component": "color-picker",
|
|
629
632
|
"data-component-id": P,
|
|
@@ -632,12 +635,12 @@ const He = [
|
|
|
632
635
|
/* @__PURE__ */ l(
|
|
633
636
|
"span",
|
|
634
637
|
{
|
|
635
|
-
className: `ds:inline-block ds:size-5 ds:rounded-[var(--radius-sm)] ds:border ds:border-[color:var(--border)] ds:shrink-0 ds:bg-[var(--swatch-bg)]${
|
|
638
|
+
className: `ds:inline-block ds:size-5 ds:rounded-[var(--radius-sm)] ds:border ds:border-[color:var(--border)] ds:shrink-0 ds:bg-[var(--swatch-bg)]${S ? "" : " ds:me-[var(--spacing-sm)]"}`,
|
|
636
639
|
"aria-hidden": "true",
|
|
637
640
|
style: { "--swatch-bg": C(o) }
|
|
638
641
|
}
|
|
639
642
|
),
|
|
640
|
-
|
|
643
|
+
S ? null : /* @__PURE__ */ l("span", { className: "ds:text-start ds:truncate ds:tabular-nums", children: D(o, d) })
|
|
641
644
|
]
|
|
642
645
|
}
|
|
643
646
|
) }),
|
|
@@ -675,7 +678,7 @@ function ae({
|
|
|
675
678
|
className: "ds:size-4 ds:text-[var(--success)]"
|
|
676
679
|
}
|
|
677
680
|
) : /* @__PURE__ */ l(
|
|
678
|
-
|
|
681
|
+
Se,
|
|
679
682
|
{
|
|
680
683
|
"aria-hidden": "true",
|
|
681
684
|
className: "ds:size-4 ds:text-[var(--destructive)]"
|
|
@@ -730,4 +733,4 @@ export {
|
|
|
730
733
|
ze as c,
|
|
731
734
|
Ee as h
|
|
732
735
|
};
|
|
733
|
-
//# sourceMappingURL=color-picker-
|
|
736
|
+
//# sourceMappingURL=color-picker-Bl5f0iK1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color-picker-Bl5f0iK1.js","sources":["../../src/components/color-picker/color-picker.agent.ts","../../src/components/color-picker/color-utils.ts","../../src/components/color-picker/palettes.ts","../../src/components/color-picker/color-picker.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — ColorPicker. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { ColorPickerHandle } from './color-picker';\n\nexport const colorPickerAgent: AgentAdapter<ColorPickerHandle> = {\n id: 'color-picker',\n capabilities: ['set_value'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.colorPicker.state.value',\n description: 'Currently picked colour as a hex string (e.g. \"#3b82f6\").',\n read: (handle) => handle.getValue(),\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ hex: string }',\n argsSchema: {\n type: 'object',\n properties: {\n hex: {\n type: 'string',\n description: 'Hex colour string, e.g. \"#3b82f6\".',\n },\n },\n required: ['hex'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.colorPicker.actions.setValue',\n description: 'Set the picked colour from a hex string.',\n examples: [{ args: { hex: '#3b82f6' }, note: 'Set to brand blue.' }],\n invoke: (handle, args: { hex: string }) => {\n handle.setValue(args.hex);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'color-picker',\n description:\n 'Marks the ColorPicker wrapper (inline) or trigger (popover variant).',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","/**\n * Pure colour-conversion utilities for the ColorPicker component.\n *\n * This is the ONLY file where hex/rgb literals are permitted (for conversion\n * math). The component file (`color-picker.tsx`) must not contain hex/rgb\n * literals — it references `var(--…)` tokens for its own UI.\n */\n\nexport interface HSLA {\n h: number; // 0–360\n s: number; // 0–100\n l: number; // 0–100\n a: number; // 0–1\n}\n\n/* ------------------------------------------------------------------ */\n/* Hex ↔ HSL */\n/* ------------------------------------------------------------------ */\n\n/** Parse a hex string (#rgb, #rrggbb, #rrggbbaa) into HSLA. */\nexport function hexToHsl(hex: string): HSLA {\n let h = hex.startsWith('#') ? hex.slice(1) : hex;\n\n // Expand shorthand (#rgb → #rrggbb, #rgba → #rrggbbaa)\n if (h.length === 3 || h.length === 4) {\n h = h\n .split('')\n .map((c) => c + c)\n .join('');\n }\n\n const r = parseInt(h.slice(0, 2), 16) / 255;\n const g = parseInt(h.slice(2, 4), 16) / 255;\n const b = parseInt(h.slice(4, 6), 16) / 255;\n const a = h.length === 8 ? parseInt(h.slice(6, 8), 16) / 255 : 1;\n\n return rgbToHsl(r, g, b, a);\n}\n\n/** Convert normalised RGB (0–1) + alpha to HSLA. */\nfunction rgbToHsl(r: number, g: number, b: number, a: number): HSLA {\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let hue = 0;\n let sat = 0;\n\n if (max !== min) {\n const d = max - min;\n sat = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n if (max === r) {\n hue = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n } else if (max === g) {\n hue = ((b - r) / d + 2) / 6;\n } else {\n hue = ((r - g) / d + 4) / 6;\n }\n }\n\n return {\n // Preserve byte identity through RGB -> HSL -> RGB. Palette colours\n // can be server identifiers, so even one changed channel is a different\n // selection. Round human-facing labels only, never this stored value.\n h: hue * 360,\n s: sat * 100,\n l: l * 100,\n a,\n };\n}\n\n/** Convert HSLA to a hex string (#rrggbb or #rrggbbaa when a < 1). */\nexport function hslToHex(hsl: HSLA): string {\n const { r, g, b } = hslToRgbComponents(hsl);\n const toHex = (n: number) =>\n Math.round(n * 255)\n .toString(16)\n .padStart(2, '0');\n\n const base = `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n if (hsl.a < 1) {\n return `${base}${toHex(hsl.a)}`;\n }\n return base;\n}\n\n/** Convert HSLA to an rgba() string. */\nexport function hslToRgba(hsl: HSLA): string {\n const { r, g, b } = hslToRgbComponents(hsl);\n const ri = Math.round(r * 255);\n const gi = Math.round(g * 255);\n const bi = Math.round(b * 255);\n\n if (hsl.a < 1) {\n return `rgba(${ri}, ${gi}, ${bi}, ${hsl.a})`;\n }\n return `rgba(${ri}, ${gi}, ${bi}, 1)`;\n}\n\n/** Internal: convert HSLA to normalised RGB components (0–1). */\nfunction hslToRgbComponents(hsl: HSLA): {\n r: number;\n g: number;\n b: number;\n} {\n const h = hsl.h / 360;\n const s = hsl.s / 100;\n const l = hsl.l / 100;\n\n if (s === 0) {\n return { r: l, g: l, b: l };\n }\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n\n return {\n r: hueToRgb(p, q, h + 1 / 3),\n g: hueToRgb(p, q, h),\n b: hueToRgb(p, q, h - 1 / 3),\n };\n}\n\nfunction hueToRgb(p: number, q: number, t: number): number {\n let tt = t;\n if (tt < 0) tt += 1;\n if (tt > 1) tt -= 1;\n if (tt < 1 / 6) return p + (q - p) * 6 * tt;\n if (tt < 1 / 2) return q;\n if (tt < 2 / 3) return p + (q - p) * (2 / 3 - tt) * 6;\n return p;\n}\n\n/* ------------------------------------------------------------------ */\n/* Format / Parse */\n/* ------------------------------------------------------------------ */\n\n/** Format an HSLA value to the specified output format. */\nexport function formatOutput(\n hsl: HSLA,\n format: 'hex' | 'hsl' | 'rgba',\n): string {\n switch (format) {\n case 'hex':\n return hslToHex(hsl);\n case 'hsl':\n if (hsl.a < 1) {\n return `hsla(${Math.round(hsl.h)}, ${Math.round(hsl.s)}%, ${Math.round(hsl.l)}%, ${hsl.a})`;\n }\n return `hsl(${Math.round(hsl.h)}, ${Math.round(hsl.s)}%, ${Math.round(hsl.l)}%)`;\n case 'rgba':\n return hslToRgba(hsl);\n }\n}\n\n/** Parse any supported colour string into HSLA. Returns null on failure. */\nexport function parseInput(value: string): HSLA | null {\n const trimmed = value.trim();\n if (!trimmed) return null;\n\n // Hex: #rgb, #rrggbb, #rrggbbaa\n if (trimmed.startsWith('#')) {\n const body = trimmed.slice(1);\n if (!/^[0-9a-fA-F]{3,8}$/.test(body)) return null;\n if (![3, 4, 6, 8].includes(body.length)) return null;\n return hexToHsl(trimmed);\n }\n\n // hsla(h, s%, l%, a) or hsl(h, s%, l%)\n const hslaMatch = trimmed.match(\n /^hsla?\\(\\s*([\\d.]+)\\s*[,/]\\s*([\\d.]+)%?\\s*[,/]\\s*([\\d.]+)%?\\s*(?:[,/]\\s*([\\d.]+))?\\s*\\)$/,\n );\n if (hslaMatch) {\n return {\n h: Math.round(parseFloat(hslaMatch[1])) % 360,\n s: Math.round(parseFloat(hslaMatch[2])),\n l: Math.round(parseFloat(hslaMatch[3])),\n a: hslaMatch[4] !== undefined ? parseFloat(hslaMatch[4]) : 1,\n };\n }\n\n // rgba(r, g, b, a) or rgb(r, g, b)\n const rgbaMatch = trimmed.match(\n /^rgba?\\(\\s*([\\d.]+)\\s*[,/]\\s*([\\d.]+)\\s*[,/]\\s*([\\d.]+)\\s*(?:[,/]\\s*([\\d.]+))?\\s*\\)$/,\n );\n if (rgbaMatch) {\n const r = parseFloat(rgbaMatch[1]) / 255;\n const g = parseFloat(rgbaMatch[2]) / 255;\n const b = parseFloat(rgbaMatch[3]) / 255;\n const a = rgbaMatch[4] !== undefined ? parseFloat(rgbaMatch[4]) : 1;\n return rgbToHsl(r, g, b, a);\n }\n\n return null;\n}\n\n/* ------------------------------------------------------------------ */\n/* Contrast — WCAG 2.x relative luminance */\n/* ------------------------------------------------------------------ */\n\n/** Relative luminance per WCAG 2.x (0 = black, 1 = white). */\nexport function relativeLuminance(hsl: HSLA): number {\n const { r, g, b } = hslToRgbComponents(hsl);\n const linearise = (c: number) =>\n c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n return 0.2126 * linearise(r) + 0.7152 * linearise(g) + 0.0722 * linearise(b);\n}\n\n/** WCAG 2.x contrast ratio between two colours. */\nexport function contrastRatio(fg: HSLA, bg: HSLA): number {\n const lum1 = relativeLuminance(fg);\n const lum2 = relativeLuminance(bg);\n const lighter = Math.max(lum1, lum2);\n const darker = Math.min(lum1, lum2);\n return Math.round(((lighter + 0.05) / (darker + 0.05)) * 100) / 100;\n}\n\n/** Meets WCAG AA for normal text (≥ 4.5:1). */\nexport function meetsAA(ratio: number): boolean {\n return ratio >= 4.5;\n}\n\n/** Meets WCAG AAA for normal text (≥ 7:1). */\nexport function meetsAAA(ratio: number): boolean {\n return ratio >= 7;\n}\n","export interface PaletteSwatch {\n name: string;\n hex: string;\n /** Recommended text colour for contrast. */\n textColor?: '#000000' | '#ffffff';\n}\n\n/**\n * Material Design appointment colours — mirrors the platform's `DoctorColor`\n * entity. Pink 500 is first because it's the default appointment colour;\n * remaining dark (white-text) colours follow alphabetically, then light\n * (black-text) colours alphabetically.\n */\nexport const APPOINTMENT_PALETTE: PaletteSwatch[] = [\n { name: 'Pink 500', hex: '#e91e63', textColor: '#ffffff' },\n { name: 'Black', hex: '#000000', textColor: '#ffffff' },\n { name: 'Blue 500', hex: '#2196f3', textColor: '#ffffff' },\n { name: 'Blue 900', hex: '#0d47a1', textColor: '#ffffff' },\n { name: 'Blue Grey 500', hex: '#607d8b', textColor: '#ffffff' },\n { name: 'Blue Grey 800', hex: '#37474f', textColor: '#ffffff' },\n { name: 'Brown 500', hex: '#795548', textColor: '#ffffff' },\n { name: 'Deep Orange 500', hex: '#ff5722', textColor: '#ffffff' },\n { name: 'Deep Purple 500', hex: '#673ab7', textColor: '#ffffff' },\n { name: 'Green 500', hex: '#4caf50', textColor: '#ffffff' },\n { name: 'Green 900', hex: '#1b5e20', textColor: '#ffffff' },\n { name: 'Indigo 500', hex: '#3f51b5', textColor: '#ffffff' },\n { name: 'Indigo 900', hex: '#1a237e', textColor: '#ffffff' },\n { name: 'Pink 900', hex: '#880e4f', textColor: '#ffffff' },\n { name: 'Purple 500', hex: '#9c27b0', textColor: '#ffffff' },\n { name: 'Purple 900', hex: '#4a148c', textColor: '#ffffff' },\n { name: 'Red 500', hex: '#f44336', textColor: '#ffffff' },\n { name: 'Red 900', hex: '#b71c1c', textColor: '#ffffff' },\n { name: 'Teal 500', hex: '#009688', textColor: '#ffffff' },\n { name: 'Teal 900', hex: '#004d40', textColor: '#ffffff' },\n { name: 'Amber 500', hex: '#ffc107', textColor: '#000000' },\n { name: 'Cyan 500', hex: '#00bcd4', textColor: '#000000' },\n { name: 'Grey 500', hex: '#9e9e9e', textColor: '#000000' },\n { name: 'Light Blue 500', hex: '#03a9f4', textColor: '#000000' },\n { name: 'Light Green 500', hex: '#8bc34a', textColor: '#000000' },\n { name: 'Lime 500', hex: '#cddc39', textColor: '#000000' },\n { name: 'Orange 500', hex: '#ff9800', textColor: '#000000' },\n { name: 'Orange 900', hex: '#e65100', textColor: '#000000' },\n { name: 'White', hex: '#ffffff', textColor: '#000000' },\n { name: 'Yellow 500', hex: '#ffeb3b', textColor: '#000000' },\n];\n\n/** Alfadocs brand palette — the six brand families × 3 shades (300/500/700). */\nexport const BRAND_PALETTE: PaletteSwatch[] = [\n { name: 'Blue 300', hex: '#70738c' },\n { name: 'Blue 500', hex: '#292e53' },\n { name: 'Blue 700', hex: '#1d213b' },\n { name: 'Violet 300', hex: '#9995ee' },\n { name: 'Violet 500', hex: '#6761e5' },\n { name: 'Violet 700', hex: '#4945a3' },\n { name: 'Purple 300', hex: '#ccaafa' },\n { name: 'Purple 500', hex: '#b380f8' },\n { name: 'Purple 700', hex: '#7f5bb0' },\n { name: 'Magenta 300', hex: '#ea7ffc' },\n { name: 'Magenta 500', hex: '#e040fb' },\n { name: 'Magenta 700', hex: '#9f2db2' },\n { name: 'Fuchsia 300', hex: '#fa76fc' },\n { name: 'Fuchsia 500', hex: '#f732fb' },\n { name: 'Fuchsia 700', hex: '#af24b2' },\n { name: 'Grey 300', hex: '#f9f6f3' },\n { name: 'Grey 500', hex: '#f6f1ed' },\n { name: 'Grey 700', hex: '#afaba8' },\n];\n\n/**\n * Google Calendar event colours — the platform's DEFAULT appointment\n * palette (practice DoctorColor sets mirror Google Calendar so synced\n * events keep their colours; the event `colorId` set is capped at 11 —\n * the 24 \"label\" colours exist only in Google's Labels API).\n * `textColor` is deliberately omitted: solid-scheme consumers get the\n * event card's auto-derived ink (provably WCAG AA for any opaque hex),\n * and the tinted scheme paints text on theme tokens regardless.\n */\nexport const GOOGLE_CALENDAR_PALETTE: PaletteSwatch[] = [\n { name: 'Tomato', hex: '#d50000' },\n { name: 'Flamingo', hex: '#e67c73' },\n { name: 'Tangerine', hex: '#f4511e' },\n { name: 'Banana', hex: '#f6bf26' },\n { name: 'Sage', hex: '#33b679' },\n { name: 'Basil', hex: '#0b8043' },\n { name: 'Peacock', hex: '#039be5' },\n { name: 'Blueberry', hex: '#3f51b5' },\n { name: 'Lavender', hex: '#7986cb' },\n { name: 'Grape', hex: '#8e24aa' },\n { name: 'Graphite', hex: '#616161' },\n];\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent,\n} from 'react';\nimport * as Popover from '@radix-ui/react-popover';\nimport { cva } from 'class-variance-authority';\nimport { Check, X } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { useFormField } from '../form-field/form-field-context';\nimport { Slider } from '../slider/slider';\nimport { useAgentRegistration } from '../../agent';\nimport { colorPickerAgent } from './color-picker.agent';\n\n/** Agent-readiness curated handle for ColorPicker. */\nexport interface ColorPickerHandle {\n getValue: () => string;\n setValue: (hex: string) => void;\n}\nimport {\n contrastRatio,\n formatOutput,\n hslToHex,\n meetsAA,\n meetsAAA,\n parseInput,\n type HSLA,\n} from './color-utils';\nimport { APPOINTMENT_PALETTE, type PaletteSwatch } from './palettes';\n\nconst COLS = 6;\n\nconst triggerVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:w-full',\n 'ds:rounded-[var(--radius-sm)] ds:border ds:border-[color:var(--border)] ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:h-8 ds:text-[length:var(--font-size-sm)] ds:ps-3 ds:pe-3',\n md: 'ds:h-[var(--min-target-size)] ds:text-[length:var(--font-size-base)] ds:ps-3 ds:pe-3',\n lg: 'ds:h-12 ds:text-[length:var(--font-size-lg)] ds:ps-4 ds:pe-4',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst swatchVariants = cva(\n [\n 'ds:relative ds:rounded-[var(--radius-sm)] ds:border-2 ds:cursor-pointer',\n 'ds:transition-[transform,box-shadow] ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:hover:scale-110',\n // The swatch background is the user-picked colour — set as a CSS custom\n // property via inline `style` per 23-constraints §Runtime-computed\n // dimensions (CSS custom property setter; the bg rule lives on the class).\n 'ds:bg-[var(--swatch-bg)]',\n ].join(' '),\n {\n variants: {\n selected: {\n true: 'ds:border-[var(--primary)] ds:shadow-[var(--shadow-md)]',\n false: 'ds:border-transparent',\n },\n // Swatch footprint. md/lg honour --min-target-size (44/48px) for touch.\n // sm is a denser 28px swatch for toolbar/inline use — comfortably above\n // the WCAG 2.5.8 (AA) 24px minimum, with the grid gap providing spacing.\n // sm intentionally does NOT take the accessible-theme --min-target-size\n // bump (48px) — a dense colour grid is opt-in and the full roving-tabindex\n // keyboard path is the mitigation for the sub-AAA pointer target.\n size: {\n // sm = 28px: clears WCAG 2.5.8 (AA, 24px) but intentionally opts out of\n // the accessible-theme 48px min-target bump — a conscious, signed-off\n // trade-off (dense opt-in grid; keyboard roving-tabindex is the mitigation).\n sm: 'ds:min-w-7 ds:min-h-7',\n md: 'ds:min-w-[var(--min-target-size)] ds:min-h-[var(--min-target-size)]',\n lg: 'ds:min-w-[var(--min-target-size)] ds:min-h-[var(--min-target-size)]',\n },\n },\n defaultVariants: { selected: false, size: 'md' },\n },\n);\n\nconst PANEL_CLASSES = [\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-md)]',\n 'ds:rounded-[var(--radius-md)] ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:p-[var(--spacing-md)]',\n].join(' ');\n\n// Checkerboard under the opacity track — static geometry, so expressed as\n// Tailwind arbitrary values rather than inline `style`. `grey-700` comes\n// from the closed palette so the tile colour still tracks the token ramp.\nconst OPACITY_CHECKER_CLASSES = [\n 'ds:bg-[image:repeating-conic-gradient(var(--color-grey-700)_0%_25%,transparent_0%_50%)]',\n 'ds:bg-[size:8px_8px]',\n].join(' ');\n\nconst PANEL_COMPACT_CLASSES = [\n 'ds:rounded-[var(--radius-md)] ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:p-[var(--spacing-sm)]',\n].join(' ');\n\n// Tighter padding for the dense (sm) swatch-only panel — toolbar/inline use.\nconst PANEL_COMPACT_SM_CLASSES = [\n 'ds:rounded-[var(--radius-md)] ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:p-[var(--spacing-xs)]',\n].join(' ');\n\nconst POPOVER_CONTENT_CLASSES = [\n 'ds:z-[var(--z-popover)] ds:rounded-[var(--radius-md)]',\n 'ds:border ds:border-[color:var(--border)] ds:bg-[var(--background)] ds:shadow-[var(--shadow-lg)]',\n 'ds:w-72',\n 'ds:data-[state=open]:animate-in ds:data-[state=open]:fade-in-0 ds:data-[state=open]:zoom-in-95',\n 'ds:data-[state=closed]:animate-out ds:data-[state=closed]:fade-out-0 ds:data-[state=closed]:zoom-out-95',\n 'ds:data-[side=bottom]:slide-in-from-top-2 ds:data-[side=top]:slide-in-from-bottom-2',\n 'ds:data-[side=left]:slide-in-from-right-2 ds:data-[side=right]:slide-in-from-left-2',\n].join(' ');\n\nconst HEX_INPUT_CLASSES = [\n 'ds:w-full ds:rounded-[var(--radius-sm)] ds:border ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:py-[var(--spacing-xs)] ds:text-[length:var(--font-size-sm)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n].join(' ');\n\n// Makes the Slider track/range transparent so the gradient behind shows through\nconst TRANSPARENT_SLIDER =\n 'ds:[&>span:first-child]:bg-transparent ds:[&>span:first-child>span]:bg-transparent';\n\nexport interface ColorPickerProps {\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n format?: 'hex' | 'hsl' | 'rgba';\n allowOpacity?: boolean;\n palette?: (string | PaletteSwatch)[];\n against?: string;\n size?: 'sm' | 'md' | 'lg';\n disabled?: boolean;\n variant?: 'inline' | 'popover';\n /** Show only the swatch grid without sliders, hex input, or contrast readout */\n compact?: boolean;\n className?: string;\n}\n\nexport const ColorPicker = forwardRef<HTMLDivElement, ColorPickerProps>(\n (props, ref) => {\n const {\n value,\n defaultValue,\n onChange,\n format = 'hex',\n allowOpacity = false,\n palette,\n against,\n size = 'md',\n disabled = false,\n variant = 'inline',\n compact = true,\n className,\n } = props;\n\n const { t } = useTranslation();\n const ctx = useFormField();\n const generatedId = useId();\n const pickerId = ctx.id || generatedId;\n const effectiveDisabled = ctx.disabled || disabled;\n\n const isControlled = value !== undefined;\n const [internalHsl, setInternalHsl] = useState<HSLA>(() => {\n const initial = value ?? defaultValue;\n if (initial) {\n const parsed = parseInput(initial);\n if (parsed) return parsed;\n }\n return { h: 0, s: 100, l: 50, a: 1 };\n });\n\n const currentHsl: HSLA = useMemo(() => {\n if (isControlled && value) {\n const parsed = parseInput(value);\n if (parsed) return parsed;\n }\n return internalHsl;\n }, [isControlled, value, internalHsl]);\n\n const emitChange = useCallback(\n (hsl: HSLA) => {\n const finalHsl = allowOpacity ? hsl : { ...hsl, a: 1 };\n if (!isControlled) setInternalHsl(finalHsl);\n onChange?.(formatOutput(finalHsl, format));\n },\n [allowOpacity, format, isControlled, onChange],\n );\n\n const [hexInput, setHexInput] = useState(() => hslToHex(currentHsl));\n const [hexError, setHexError] = useState(false);\n const revertTimerRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n const currentHslRef = useRef(currentHsl);\n currentHslRef.current = currentHsl;\n\n useEffect(() => {\n setHexInput(hslToHex(currentHsl));\n setHexError(false);\n if (revertTimerRef.current !== undefined) {\n clearTimeout(revertTimerRef.current);\n revertTimerRef.current = undefined;\n }\n }, [currentHsl]);\n\n useEffect(() => {\n return () => {\n if (revertTimerRef.current !== undefined) {\n clearTimeout(revertTimerRef.current);\n }\n };\n }, []);\n\n const handleHexBlur = () => {\n const parsed = parseInput(hexInput);\n if (parsed) {\n setHexError(false);\n emitChange(parsed);\n } else {\n setHexError(true);\n revertTimerRef.current = setTimeout(() => {\n revertTimerRef.current = undefined;\n setHexError(false);\n setHexInput(hslToHex(currentHslRef.current));\n }, 800);\n }\n };\n\n const swatches: PaletteSwatch[] = useMemo(() => {\n if (!palette) return APPOINTMENT_PALETTE;\n return palette.map((item) =>\n typeof item === 'string'\n ? { name: item.toUpperCase(), hex: item }\n : item,\n );\n }, [palette]);\n\n const currentHex = hslToHex(currentHsl);\n // Normalise palette entries through parseInput so swatches declared as\n // rgb()/hsl()/shorthand hex still match — raw `s.hex` comparison misses\n // any non-literal-hex representation.\n const swatchCanonicalHexes = useMemo(\n () =>\n swatches.map((s) => {\n const parsed = parseInput(s.hex);\n return parsed ? hslToHex(parsed).toLowerCase() : null;\n }),\n [swatches],\n );\n const selectedSwatchIndex = swatchCanonicalHexes.findIndex(\n (hex) => hex !== null && hex === currentHex.toLowerCase(),\n );\n\n const gridRef = useRef<HTMLDivElement>(null);\n const [focusedIndex, setFocusedIndex] = useState(\n selectedSwatchIndex >= 0 ? selectedSwatchIndex : 0,\n );\n\n const focusSwatch = (index: number) => {\n const cells =\n gridRef.current?.querySelectorAll<HTMLElement>('[role=\"gridcell\"]');\n if (cells?.[index]) {\n cells[index].focus();\n setFocusedIndex(index);\n }\n };\n\n const handleGridKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (effectiveDisabled) return;\n const total = swatches.length;\n let next = focusedIndex;\n\n // The grid (grid-cols-6) mirrors under dir=\"rtl\", so the physical\n // ArrowRight/ArrowLeft keys must map to the inverse logical delta to keep\n // keyboard navigation following the visual reading order. Resolve the\n // effective direction from the element's computed style.\n const isRtl =\n typeof window !== 'undefined' && gridRef.current\n ? window.getComputedStyle(gridRef.current).direction === 'rtl'\n : false;\n const forward = isRtl ? -1 : 1;\n\n switch (event.key) {\n case 'ArrowRight':\n next = (focusedIndex + forward + total) % total;\n break;\n case 'ArrowLeft':\n next = (focusedIndex - forward + total) % total;\n break;\n case 'ArrowDown':\n next = Math.min(focusedIndex + COLS, total - 1);\n break;\n case 'ArrowUp':\n next = Math.max(focusedIndex - COLS, 0);\n break;\n case 'Home':\n next = Math.floor(focusedIndex / COLS) * COLS;\n break;\n case 'End':\n next = Math.min(\n Math.floor(focusedIndex / COLS) * COLS + COLS - 1,\n total - 1,\n );\n break;\n case 'PageUp':\n next = focusedIndex % COLS;\n break;\n case 'PageDown': {\n const lastRowStart = Math.floor((total - 1) / COLS) * COLS;\n next = Math.min(lastRowStart + (focusedIndex % COLS), total - 1);\n break;\n }\n case 'Enter':\n case ' ': {\n event.preventDefault();\n const parsed = parseInput(swatches[focusedIndex].hex);\n if (parsed) emitChange(parsed);\n return;\n }\n default:\n return;\n }\n\n event.preventDefault();\n focusSwatch(next);\n };\n\n const [open, setOpen] = useState(false);\n\n const agentHandle = useMemo<ColorPickerHandle>(\n () => ({\n getValue: () => hslToHex(currentHslRef.current),\n setValue: (hex) => {\n const parsed = parseInput(hex);\n if (parsed) emitChange(parsed);\n },\n }),\n [emitChange],\n );\n useAgentRegistration(colorPickerAgent, agentHandle, pickerId);\n\n const contrastInfo = useMemo(() => {\n if (!against) return null;\n const bgHsl = parseInput(against);\n if (!bgHsl) return null;\n const ratio = contrastRatio(currentHsl, bgHsl);\n return { ratio, aa: meetsAA(ratio), aaa: meetsAAA(ratio) };\n }, [against, currentHsl]);\n\n const swatchGrid = (\n // eslint-disable-next-line jsx-a11y/interactive-supports-focus -- inner gridcells are individually focusable via roving tabindex\n <div\n ref={gridRef}\n role=\"grid\"\n aria-label={t('inputs.colorPicker.paletteLabel', 'Colour palette')}\n onKeyDown={handleGridKeyDown}\n className=\"ds:grid ds:grid-cols-6 ds:gap-[var(--spacing-xs)]\"\n >\n {swatches.map((_swatch, i) => {\n const rowStart = Math.floor(i / COLS) * COLS;\n const isFirstInRow = i === rowStart;\n return isFirstInRow ? (\n <div key={i} role=\"row\" className=\"ds:contents\">\n {swatches.slice(rowStart, rowStart + COLS).map((s, j) => {\n const idx = rowStart + j;\n const sel = idx === selectedSwatchIndex;\n return (\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events -- parent grid handles keyboard navigation via onKeyDown\n <div\n key={s.hex}\n role=\"gridcell\"\n aria-selected={sel}\n aria-label={t('inputs.colorPicker.swatchLabel', {\n name: s.name,\n hex: s.hex,\n })}\n tabIndex={idx === focusedIndex ? 0 : -1}\n onClick={() => {\n if (effectiveDisabled) return;\n const parsed = parseInput(s.hex);\n if (parsed) emitChange(parsed);\n setFocusedIndex(idx);\n }}\n className={swatchVariants({ selected: sel, size })}\n // eslint-disable-next-line react/forbid-dom-props -- user-picked swatch hex injected via --swatch-bg CSS variable\n style={{ ['--swatch-bg' as string]: s.hex }}\n >\n {sel ? (\n <Check\n aria-hidden=\"true\"\n className=\"ds:absolute ds:inset-0 ds:m-auto ds:size-4 ds:text-[var(--background)] ds:mix-blend-difference\"\n />\n ) : null}\n </div>\n );\n })}\n </div>\n ) : null;\n })}\n </div>\n );\n\n const fullControls = compact ? null : (\n <>\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <label\n htmlFor={`${pickerId}-hex`}\n className=\"ds:text-[length:var(--font-size-xs)] ds:text-[var(--muted-foreground)]\"\n >\n {t('inputs.colorPicker.hex', 'Hex')}\n </label>\n <bdi dir=\"ltr\">\n <input\n id={`${pickerId}-hex`}\n type=\"text\"\n value={hexInput}\n disabled={effectiveDisabled}\n onChange={(e) => setHexInput(e.target.value)}\n onBlur={handleHexBlur}\n className={`${HEX_INPUT_CLASSES} ${hexError ? 'ds:border-[var(--destructive)]' : 'ds:border-[color:var(--border)]'}`}\n />\n </bdi>\n </div>\n\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <SliderWithGradient\n label={t('inputs.colorPicker.hue', 'Hue')}\n gradient=\"linear-gradient(to right, hsl(0,100%,50%), hsl(60,100%,50%), hsl(120,100%,50%), hsl(180,100%,50%), hsl(240,100%,50%), hsl(300,100%,50%), hsl(360,100%,50%))\"\n min={0}\n max={360}\n value={currentHsl.h}\n onChange={(h) => emitChange({ ...currentHsl, h })}\n formatValue={(v) => `H ${Math.round(v)}°`}\n disabled={effectiveDisabled}\n />\n <SliderWithGradient\n label={t('inputs.colorPicker.saturation', 'Saturation')}\n gradient={`linear-gradient(to right, hsl(${currentHsl.h},0%,${currentHsl.l}%), hsl(${currentHsl.h},100%,${currentHsl.l}%))`}\n min={0}\n max={100}\n value={currentHsl.s}\n onChange={(s) => emitChange({ ...currentHsl, s })}\n formatValue={(v) => `S ${Math.round(v)}%`}\n disabled={effectiveDisabled}\n />\n <SliderWithGradient\n label={t('inputs.colorPicker.lightness', 'Lightness')}\n gradient={`linear-gradient(to right, hsl(${currentHsl.h},${currentHsl.s}%,0%), hsl(${currentHsl.h},${currentHsl.s}%,50%), hsl(${currentHsl.h},${currentHsl.s}%,100%))`}\n min={0}\n max={100}\n value={currentHsl.l}\n onChange={(l) => emitChange({ ...currentHsl, l })}\n formatValue={(v) => `L ${Math.round(v)}%`}\n disabled={effectiveDisabled}\n />\n {allowOpacity ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <label className=\"ds:text-[length:var(--font-size-xs)] ds:text-[var(--muted-foreground)]\">\n {t('inputs.colorPicker.opacity', 'Opacity')}\n </label>\n <div className=\"ds:relative\">\n <div\n className={`ds:absolute ds:inset-0 ds:rounded-[var(--radius-full)] ds:pointer-events-none ${OPACITY_CHECKER_CLASSES}`}\n aria-hidden=\"true\"\n />\n <div\n className=\"ds:absolute ds:inset-0 ds:rounded-[var(--radius-full)] ds:pointer-events-none ds:bg-[image:var(--opacity-gradient)]\"\n // eslint-disable-next-line react/forbid-dom-props -- opacity-track gradient derived from live HSL, no token equivalent\n style={{\n ['--opacity-gradient' as string]: `linear-gradient(to right, hsla(${currentHsl.h},${currentHsl.s}%,${currentHsl.l}%,0), hsl(${currentHsl.h},${currentHsl.s}%,${currentHsl.l}%))`,\n }}\n aria-hidden=\"true\"\n />\n <Slider\n min={0}\n max={100}\n step={1}\n value={[Math.round(currentHsl.a * 100)]}\n onValueChange={([v]) =>\n emitChange({ ...currentHsl, a: v / 100 })\n }\n aria-label={t('inputs.colorPicker.opacity', 'Opacity')}\n formatValue={(v) => `${v}%`}\n disabled={effectiveDisabled}\n className={TRANSPARENT_SLIDER}\n />\n </div>\n </div>\n ) : null}\n </div>\n\n {contrastInfo ? (\n <div\n className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)] ds:text-[length:var(--font-size-sm)]\"\n role=\"status\"\n aria-live=\"polite\"\n >\n <span className=\"ds:tabular-nums\">\n {t('inputs.colorPicker.contrastRatio', {\n ratio: contrastInfo.ratio.toFixed(1),\n })}\n </span>\n <ContrastBadge level=\"AA\" passes={contrastInfo.aa} t={t} />\n <ContrastBadge level=\"AAA\" passes={contrastInfo.aaa} t={t} />\n </div>\n ) : null}\n\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <div\n className=\"ds:size-8 ds:rounded-[var(--radius-sm)] ds:border ds:border-[color:var(--border)] ds:bg-[var(--swatch-bg)]\"\n // eslint-disable-next-line react/forbid-dom-props -- live picked colour injected via --swatch-bg CSS variable\n style={{ ['--swatch-bg' as string]: hslToHex(currentHsl) }}\n aria-hidden=\"true\"\n />\n <span className=\"ds:text-[length:var(--font-size-sm)] ds:text-[var(--muted-foreground)] ds:tabular-nums\">\n {formatOutput(currentHsl, format)}\n </span>\n </div>\n </>\n );\n\n const panelContent = (\n <div\n className={\n compact\n ? size === 'sm'\n ? PANEL_COMPACT_SM_CLASSES\n : PANEL_COMPACT_CLASSES\n : PANEL_CLASSES\n }\n >\n {swatchGrid}\n {fullControls}\n </div>\n );\n\n if (variant === 'inline') {\n return (\n <div\n ref={ref}\n id={pickerId}\n className={className}\n aria-describedby={ctx.describedBy || undefined}\n aria-invalid={ctx.invalid || undefined}\n aria-disabled={effectiveDisabled || undefined}\n data-component=\"color-picker\"\n data-component-id={pickerId}\n data-testid=\"color-picker\"\n >\n {panelContent}\n </div>\n );\n }\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.Trigger asChild disabled={effectiveDisabled}>\n {/* eslint-disable-next-line jsx-a11y/role-supports-aria-props -- FormField propagates invalid state to its trigger; users rely on this for validation announcements */}\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n type=\"button\"\n id={pickerId}\n aria-describedby={ctx.describedBy || undefined}\n aria-invalid={ctx.invalid || undefined}\n // In compact mode the trigger only renders the swatch (which is\n // aria-hidden). Provide a fallback name so the button is named\n // for AT regardless of variant. The current value is announced\n // separately via the hex/HSL output inside the popover.\n aria-label={\n compact\n ? t('inputs.colorPicker.triggerLabel', 'Choose colour')\n : undefined\n }\n className={triggerVariants({ size, className })}\n data-component=\"color-picker\"\n data-component-id={pickerId}\n data-testid=\"color-picker-trigger\"\n >\n <span\n className={`ds:inline-block ds:size-5 ds:rounded-[var(--radius-sm)] ds:border ds:border-[color:var(--border)] ds:shrink-0 ds:bg-[var(--swatch-bg)]${compact ? '' : ' ds:me-[var(--spacing-sm)]'}`}\n aria-hidden=\"true\"\n // eslint-disable-next-line react/forbid-dom-props -- trigger preview swatch shows current picked colour via --swatch-bg\n style={{ ['--swatch-bg' as string]: hslToHex(currentHsl) }}\n />\n {compact ? null : (\n <span className=\"ds:text-start ds:truncate ds:tabular-nums\">\n {formatOutput(currentHsl, format)}\n </span>\n )}\n </button>\n </Popover.Trigger>\n <Popover.Portal>\n <Popover.Content\n sideOffset={4}\n align=\"start\"\n className={POPOVER_CONTENT_CLASSES}\n >\n {panelContent}\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n );\n },\n);\n\nColorPicker.displayName = 'ColorPicker';\n\nfunction ContrastBadge({\n level,\n passes,\n t,\n}: {\n level: string;\n passes: boolean;\n t: (key: string, fallback: string) => string;\n}) {\n return (\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <abbr\n title={`Web Content Accessibility Guidelines Level ${level}`}\n className=\"ds:no-underline ds:font-medium\"\n >\n {level}\n </abbr>\n {passes ? (\n <Check\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:text-[var(--success)]\"\n />\n ) : (\n <X\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:text-[var(--destructive)]\"\n />\n )}\n <span className=\"ds:sr-only\">\n {passes\n ? t('inputs.colorPicker.contrastPass', 'Pass')\n : t('inputs.colorPicker.contrastFail', 'Fail')}\n </span>\n </span>\n );\n}\n\nfunction SliderWithGradient({\n label,\n gradient,\n min,\n max,\n value,\n onChange,\n formatValue,\n disabled,\n}: {\n label: string;\n gradient: string;\n min: number;\n max: number;\n value: number;\n onChange: (v: number) => void;\n formatValue: (v: number) => string;\n disabled: boolean;\n}) {\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <label className=\"ds:text-[length:var(--font-size-xs)] ds:text-[var(--muted-foreground)]\">\n {label}\n </label>\n <div className=\"ds:relative\">\n <div\n className=\"ds:absolute ds:inset-0 ds:rounded-[var(--radius-full)] ds:pointer-events-none ds:bg-[image:var(--slider-gradient)]\"\n // eslint-disable-next-line react/forbid-dom-props -- hue/saturation/lightness gradient derived from live HSL, no token equivalent\n style={{ ['--slider-gradient' as string]: gradient }}\n aria-hidden=\"true\"\n />\n <Slider\n min={min}\n max={max}\n step={1}\n value={[value]}\n onValueChange={([v]) => onChange(v)}\n aria-label={label}\n formatValue={formatValue}\n disabled={disabled}\n className={TRANSPARENT_SLIDER}\n />\n </div>\n </div>\n );\n}\n"],"names":["colorPickerAgent","handle","args","hexToHsl","hex","h","g","b","a","rgbToHsl","r","max","min","l","hue","sat","d","hslToHex","hsl","hslToRgbComponents","toHex","n","base","hslToRgba","ri","gi","bi","s","q","p","hueToRgb","t","tt","formatOutput","format","parseInput","value","trimmed","body","hslaMatch","rgbaMatch","relativeLuminance","linearise","c","contrastRatio","fg","bg","lum1","lum2","lighter","darker","meetsAA","ratio","meetsAAA","APPOINTMENT_PALETTE","BRAND_PALETTE","GOOGLE_CALENDAR_PALETTE","COLS","triggerVariants","cva","swatchVariants","PANEL_CLASSES","OPACITY_CHECKER_CLASSES","PANEL_COMPACT_CLASSES","PANEL_COMPACT_SM_CLASSES","POPOVER_CONTENT_CLASSES","HEX_INPUT_CLASSES","TRANSPARENT_SLIDER","ColorPicker","forwardRef","props","ref","defaultValue","onChange","allowOpacity","palette","against","size","disabled","variant","compact","className","useTranslation","ctx","useFormField","generatedId","useId","pickerId","effectiveDisabled","isControlled","internalHsl","setInternalHsl","useState","initial","parsed","currentHsl","useMemo","emitChange","useCallback","finalHsl","hexInput","setHexInput","hexError","setHexError","revertTimerRef","useRef","currentHslRef","useEffect","handleHexBlur","swatches","item","currentHex","selectedSwatchIndex","gridRef","focusedIndex","setFocusedIndex","focusSwatch","index","cells","_a","handleGridKeyDown","event","total","next","forward","lastRowStart","open","setOpen","agentHandle","useAgentRegistration","contrastInfo","bgHsl","swatchGrid","jsx","_swatch","rowStart","j","idx","sel","Check","fullControls","jsxs","Fragment","e","SliderWithGradient","v","Slider","ContrastBadge","panelContent","Popover","level","passes","X","label","gradient","formatValue"],"mappings":";;;;;;;;;;AASO,MAAMA,KAAoD;AAAA,EAC/D,IAAI;AAAA,EACJ,cAAc,CAAC,WAAW;AAAA,EAC1B,OAAO;AAAA,IACL,OAAO;AAAA,MACL,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,MAAM,CAACC,MAAWA,EAAO,SAAA;AAAA,IAAS;AAAA,EACpC;AAAA,EAEF,SAAS;AAAA,IACP,WAAW;AAAA,MACT,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,YAAY;AAAA,QACV,MAAM;AAAA,QACN,YAAY;AAAA,UACV,KAAK;AAAA,YACH,MAAM;AAAA,YACN,aAAa;AAAA,UAAA;AAAA,QACf;AAAA,QAEF,UAAU,CAAC,KAAK;AAAA,MAAA;AAAA,MAElB,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,aAAa,MAAM,sBAAsB;AAAA,MACnE,QAAQ,CAACA,GAAQC,MAA0B;AACzC,QAAAD,EAAO,SAASC,EAAK,GAAG;AAAA,MAC1B;AAAA,IAAA;AAAA,EACF;AAAA,EAEF,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aACE;AAAA,IAAA;AAAA,IAEJ,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ;ACpCO,SAASC,GAASC,GAAmB;AAC1C,MAAIC,IAAID,EAAI,WAAW,GAAG,IAAIA,EAAI,MAAM,CAAC,IAAIA;AAG7C,GAAIC,EAAE,WAAW,KAAKA,EAAE,WAAW,OACjCA,IAAIA,EACD,MAAM,EAAE,EACR,IAAI,CAAC,MAAM,IAAI,CAAC,EAChB,KAAK,EAAE;AAGZ,QAAM,IAAI,SAASA,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,KAClCC,IAAI,SAASD,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,KAClCE,IAAI,SAASF,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,KAClCG,IAAIH,EAAE,WAAW,IAAI,SAASA,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,MAAM;AAE/D,SAAOI,GAAS,GAAGH,GAAGC,GAAGC,CAAC;AAC5B;AAGA,SAASC,GAASC,GAAWJ,GAAWC,GAAWC,GAAiB;AAClE,QAAMG,IAAM,KAAK,IAAID,GAAGJ,GAAGC,CAAC,GACtBK,IAAM,KAAK,IAAIF,GAAGJ,GAAGC,CAAC,GACtBM,KAAKF,IAAMC,KAAO;AACxB,MAAIE,IAAM,GACNC,IAAM;AAEV,MAAIJ,MAAQC,GAAK;AACf,UAAMI,IAAIL,IAAMC;AAChB,IAAAG,IAAMF,IAAI,MAAMG,KAAK,IAAIL,IAAMC,KAAOI,KAAKL,IAAMC,IAE7CD,MAAQD,IACVI,MAAQR,IAAIC,KAAKS,KAAKV,IAAIC,IAAI,IAAI,MAAM,IAC/BI,MAAQL,IACjBQ,MAAQP,IAAIG,KAAKM,IAAI,KAAK,IAE1BF,MAAQJ,IAAIJ,KAAKU,IAAI,KAAK;AAAA,EAE9B;AAEA,SAAO;AAAA;AAAA;AAAA;AAAA,IAIL,GAAGF,IAAM;AAAA,IACT,GAAGC,IAAM;AAAA,IACT,GAAGF,IAAI;AAAA,IACP,GAAAL;AAAA,EAAA;AAEJ;AAGO,SAASS,EAASC,GAAmB;AAC1C,QAAM,EAAE,GAAAR,GAAG,GAAAJ,GAAG,GAAAC,EAAA,IAAMY,EAAmBD,CAAG,GACpCE,IAAQ,CAACC,MACb,KAAK,MAAMA,IAAI,GAAG,EACf,SAAS,EAAE,EACX,SAAS,GAAG,GAAG,GAEdC,IAAO,IAAIF,EAAMV,CAAC,CAAC,GAAGU,EAAMd,CAAC,CAAC,GAAGc,EAAMb,CAAC,CAAC;AAC/C,SAAIW,EAAI,IAAI,IACH,GAAGI,CAAI,GAAGF,EAAMF,EAAI,CAAC,CAAC,KAExBI;AACT;AAGO,SAASC,GAAUL,GAAmB;AAC3C,QAAM,EAAE,GAAAR,GAAG,GAAAJ,GAAG,GAAAC,EAAA,IAAMY,EAAmBD,CAAG,GACpCM,IAAK,KAAK,MAAMd,IAAI,GAAG,GACvBe,IAAK,KAAK,MAAMnB,IAAI,GAAG,GACvBoB,IAAK,KAAK,MAAMnB,IAAI,GAAG;AAE7B,SAAIW,EAAI,IAAI,IACH,QAAQM,CAAE,KAAKC,CAAE,KAAKC,CAAE,KAAKR,EAAI,CAAC,MAEpC,QAAQM,CAAE,KAAKC,CAAE,KAAKC,CAAE;AACjC;AAGA,SAASP,EAAmBD,GAI1B;AACA,QAAMb,IAAIa,EAAI,IAAI,KACZS,IAAIT,EAAI,IAAI,KACZL,IAAIK,EAAI,IAAI;AAElB,MAAIS,MAAM;AACR,WAAO,EAAE,GAAGd,GAAG,GAAGA,GAAG,GAAGA,EAAA;AAG1B,QAAMe,IAAIf,IAAI,MAAMA,KAAK,IAAIc,KAAKd,IAAIc,IAAId,IAAIc,GACxCE,IAAI,IAAIhB,IAAIe;AAElB,SAAO;AAAA,IACL,GAAGE,EAASD,GAAGD,GAAGvB,IAAI,IAAI,CAAC;AAAA,IAC3B,GAAGyB,EAASD,GAAGD,GAAGvB,CAAC;AAAA,IACnB,GAAGyB,EAASD,GAAGD,GAAGvB,IAAI,IAAI,CAAC;AAAA,EAAA;AAE/B;AAEA,SAASyB,EAASD,GAAWD,GAAWG,GAAmB;AACzD,MAAIC,IAAKD;AAGT,SAFIC,IAAK,MAAGA,KAAM,IACdA,IAAK,MAAGA,KAAM,IACdA,IAAK,IAAI,IAAUH,KAAKD,IAAIC,KAAK,IAAIG,IACrCA,IAAK,IAAI,IAAUJ,IACnBI,IAAK,IAAI,IAAUH,KAAKD,IAAIC,MAAM,IAAI,IAAIG,KAAM,IAC7CH;AACT;AAOO,SAASI,EACdf,GACAgB,GACQ;AACR,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAOjB,EAASC,CAAG;AAAA,IACrB,KAAK;AACH,aAAIA,EAAI,IAAI,IACH,QAAQ,KAAK,MAAMA,EAAI,CAAC,CAAC,KAAK,KAAK,MAAMA,EAAI,CAAC,CAAC,MAAM,KAAK,MAAMA,EAAI,CAAC,CAAC,MAAMA,EAAI,CAAC,MAEnF,OAAO,KAAK,MAAMA,EAAI,CAAC,CAAC,KAAK,KAAK,MAAMA,EAAI,CAAC,CAAC,MAAM,KAAK,MAAMA,EAAI,CAAC,CAAC;AAAA,IAC9E,KAAK;AACH,aAAOK,GAAUL,CAAG;AAAA,EAAA;AAE1B;AAGO,SAASiB,EAAWC,GAA4B;AACrD,QAAMC,IAAUD,EAAM,KAAA;AACtB,MAAI,CAACC,EAAS,QAAO;AAGrB,MAAIA,EAAQ,WAAW,GAAG,GAAG;AAC3B,UAAMC,IAAOD,EAAQ,MAAM,CAAC;AAE5B,WADI,CAAC,qBAAqB,KAAKC,CAAI,KAC/B,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,SAASA,EAAK,MAAM,IAAU,OACzCnC,GAASkC,CAAO;AAAA,EACzB;AAGA,QAAME,IAAYF,EAAQ;AAAA,IACxB;AAAA,EAAA;AAEF,MAAIE;AACF,WAAO;AAAA,MACL,GAAG,KAAK,MAAM,WAAWA,EAAU,CAAC,CAAC,CAAC,IAAI;AAAA,MAC1C,GAAG,KAAK,MAAM,WAAWA,EAAU,CAAC,CAAC,CAAC;AAAA,MACtC,GAAG,KAAK,MAAM,WAAWA,EAAU,CAAC,CAAC,CAAC;AAAA,MACtC,GAAGA,EAAU,CAAC,MAAM,SAAY,WAAWA,EAAU,CAAC,CAAC,IAAI;AAAA,IAAA;AAK/D,QAAMC,IAAYH,EAAQ;AAAA,IACxB;AAAA,EAAA;AAEF,MAAIG,GAAW;AACb,UAAM9B,IAAI,WAAW8B,EAAU,CAAC,CAAC,IAAI,KAC/BlC,IAAI,WAAWkC,EAAU,CAAC,CAAC,IAAI,KAC/BjC,IAAI,WAAWiC,EAAU,CAAC,CAAC,IAAI,KAC/BhC,IAAIgC,EAAU,CAAC,MAAM,SAAY,WAAWA,EAAU,CAAC,CAAC,IAAI;AAClE,WAAO/B,GAASC,GAAGJ,GAAGC,GAAGC,CAAC;AAAA,EAC5B;AAEA,SAAO;AACT;AAOO,SAASiC,GAAkBvB,GAAmB;AACnD,QAAM,EAAE,GAAAR,GAAG,GAAAJ,GAAG,GAAAC,EAAA,IAAMY,EAAmBD,CAAG,GACpCwB,IAAY,CAACC,MACjBA,KAAK,UAAUA,IAAI,QAAQ,KAAK,KAAKA,IAAI,SAAS,OAAO,GAAG;AAC9D,SAAO,SAASD,EAAUhC,CAAC,IAAI,SAASgC,EAAUpC,CAAC,IAAI,SAASoC,EAAUnC,CAAC;AAC7E;AAGO,SAASqC,GAAcC,GAAUC,GAAkB;AACxD,QAAMC,IAAON,GAAkBI,CAAE,GAC3BG,IAAOP,GAAkBK,CAAE,GAC3BG,IAAU,KAAK,IAAIF,GAAMC,CAAI,GAC7BE,IAAS,KAAK,IAAIH,GAAMC,CAAI;AAClC,SAAO,KAAK,OAAQC,IAAU,SAASC,IAAS,QAAS,GAAG,IAAI;AAClE;AAGO,SAASC,GAAQC,GAAwB;AAC9C,SAAOA,KAAS;AAClB;AAGO,SAASC,GAASD,GAAwB;AAC/C,SAAOA,KAAS;AAClB;ACpNO,MAAME,KAAuC;AAAA,EAClD,EAAE,MAAM,YAAY,KAAK,WAAW,WAAW,UAAA;AAAA,EAC/C,EAAE,MAAM,SAAS,KAAK,WAAW,WAAW,UAAA;AAAA,EAC5C,EAAE,MAAM,YAAY,KAAK,WAAW,WAAW,UAAA;AAAA,EAC/C,EAAE,MAAM,YAAY,KAAK,WAAW,WAAW,UAAA;AAAA,EAC/C,EAAE,MAAM,iBAAiB,KAAK,WAAW,WAAW,UAAA;AAAA,EACpD,EAAE,MAAM,iBAAiB,KAAK,WAAW,WAAW,UAAA;AAAA,EACpD,EAAE,MAAM,aAAa,KAAK,WAAW,WAAW,UAAA;AAAA,EAChD,EAAE,MAAM,mBAAmB,KAAK,WAAW,WAAW,UAAA;AAAA,EACtD,EAAE,MAAM,mBAAmB,KAAK,WAAW,WAAW,UAAA;AAAA,EACtD,EAAE,MAAM,aAAa,KAAK,WAAW,WAAW,UAAA;AAAA,EAChD,EAAE,MAAM,aAAa,KAAK,WAAW,WAAW,UAAA;AAAA,EAChD,EAAE,MAAM,cAAc,KAAK,WAAW,WAAW,UAAA;AAAA,EACjD,EAAE,MAAM,cAAc,KAAK,WAAW,WAAW,UAAA;AAAA,EACjD,EAAE,MAAM,YAAY,KAAK,WAAW,WAAW,UAAA;AAAA,EAC/C,EAAE,MAAM,cAAc,KAAK,WAAW,WAAW,UAAA;AAAA,EACjD,EAAE,MAAM,cAAc,KAAK,WAAW,WAAW,UAAA;AAAA,EACjD,EAAE,MAAM,WAAW,KAAK,WAAW,WAAW,UAAA;AAAA,EAC9C,EAAE,MAAM,WAAW,KAAK,WAAW,WAAW,UAAA;AAAA,EAC9C,EAAE,MAAM,YAAY,KAAK,WAAW,WAAW,UAAA;AAAA,EAC/C,EAAE,MAAM,YAAY,KAAK,WAAW,WAAW,UAAA;AAAA,EAC/C,EAAE,MAAM,aAAa,KAAK,WAAW,WAAW,UAAA;AAAA,EAChD,EAAE,MAAM,YAAY,KAAK,WAAW,WAAW,UAAA;AAAA,EAC/C,EAAE,MAAM,YAAY,KAAK,WAAW,WAAW,UAAA;AAAA,EAC/C,EAAE,MAAM,kBAAkB,KAAK,WAAW,WAAW,UAAA;AAAA,EACrD,EAAE,MAAM,mBAAmB,KAAK,WAAW,WAAW,UAAA;AAAA,EACtD,EAAE,MAAM,YAAY,KAAK,WAAW,WAAW,UAAA;AAAA,EAC/C,EAAE,MAAM,cAAc,KAAK,WAAW,WAAW,UAAA;AAAA,EACjD,EAAE,MAAM,cAAc,KAAK,WAAW,WAAW,UAAA;AAAA,EACjD,EAAE,MAAM,SAAS,KAAK,WAAW,WAAW,UAAA;AAAA,EAC5C,EAAE,MAAM,cAAc,KAAK,WAAW,WAAW,UAAA;AACnD,GAGaC,KAAiC;AAAA,EAC5C,EAAE,MAAM,YAAY,KAAK,UAAA;AAAA,EACzB,EAAE,MAAM,YAAY,KAAK,UAAA;AAAA,EACzB,EAAE,MAAM,YAAY,KAAK,UAAA;AAAA,EACzB,EAAE,MAAM,cAAc,KAAK,UAAA;AAAA,EAC3B,EAAE,MAAM,cAAc,KAAK,UAAA;AAAA,EAC3B,EAAE,MAAM,cAAc,KAAK,UAAA;AAAA,EAC3B,EAAE,MAAM,cAAc,KAAK,UAAA;AAAA,EAC3B,EAAE,MAAM,cAAc,KAAK,UAAA;AAAA,EAC3B,EAAE,MAAM,cAAc,KAAK,UAAA;AAAA,EAC3B,EAAE,MAAM,eAAe,KAAK,UAAA;AAAA,EAC5B,EAAE,MAAM,eAAe,KAAK,UAAA;AAAA,EAC5B,EAAE,MAAM,eAAe,KAAK,UAAA;AAAA,EAC5B,EAAE,MAAM,eAAe,KAAK,UAAA;AAAA,EAC5B,EAAE,MAAM,eAAe,KAAK,UAAA;AAAA,EAC5B,EAAE,MAAM,eAAe,KAAK,UAAA;AAAA,EAC5B,EAAE,MAAM,YAAY,KAAK,UAAA;AAAA,EACzB,EAAE,MAAM,YAAY,KAAK,UAAA;AAAA,EACzB,EAAE,MAAM,YAAY,KAAK,UAAA;AAC3B,GAWaC,KAA2C;AAAA,EACtD,EAAE,MAAM,UAAU,KAAK,UAAA;AAAA,EACvB,EAAE,MAAM,YAAY,KAAK,UAAA;AAAA,EACzB,EAAE,MAAM,aAAa,KAAK,UAAA;AAAA,EAC1B,EAAE,MAAM,UAAU,KAAK,UAAA;AAAA,EACvB,EAAE,MAAM,QAAQ,KAAK,UAAA;AAAA,EACrB,EAAE,MAAM,SAAS,KAAK,UAAA;AAAA,EACtB,EAAE,MAAM,WAAW,KAAK,UAAA;AAAA,EACxB,EAAE,MAAM,aAAa,KAAK,UAAA;AAAA,EAC1B,EAAE,MAAM,YAAY,KAAK,UAAA;AAAA,EACzB,EAAE,MAAM,SAAS,KAAK,UAAA;AAAA,EACtB,EAAE,MAAM,YAAY,KAAK,UAAA;AAC3B,GCtDMC,IAAO,GAEPC,KAAkBC;AAAA,EACtB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AAAA,EACV;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA;AAAA,IACN;AAAA,IAEF,iBAAiB,EAAE,MAAM,KAAA;AAAA,EAAK;AAElC,GAEMC,KAAiBD;AAAA,EACrB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,IAIA;AAAA,EAAA,EACA,KAAK,GAAG;AAAA,EACV;AAAA,IACE,UAAU;AAAA,MACR,UAAU;AAAA,QACR,MAAM;AAAA,QACN,OAAO;AAAA,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQT,MAAM;AAAA;AAAA;AAAA;AAAA,QAIJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA;AAAA,IACN;AAAA,IAEF,iBAAiB,EAAE,UAAU,IAAO,MAAM,KAAA;AAAA,EAAK;AAEnD,GAEME,KAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG,GAKJC,KAA0B;AAAA,EAC9B;AAAA,EACA;AACF,EAAE,KAAK,GAAG,GAEJC,KAAwB;AAAA,EAC5B;AAAA,EACA;AACF,EAAE,KAAK,GAAG,GAGJC,KAA2B;AAAA,EAC/B;AAAA,EACA;AACF,EAAE,KAAK,GAAG,GAEJC,KAA0B;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG,GAEJC,KAAoB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG,GAGJC,KACJ,sFAkBWC,KAAcC;AAAA,EACzB,CAACC,GAAOC,MAAQ;AACd,UAAM;AAAA,MACJ,OAAAnC;AAAA,MACA,cAAAoC;AAAA,MACA,UAAAC;AAAA,MACA,QAAAvC,IAAS;AAAA,MACT,cAAAwC,IAAe;AAAA,MACf,SAAAC;AAAA,MACA,SAAAC;AAAA,MACA,MAAAC,IAAO;AAAA,MACP,UAAAC,KAAW;AAAA,MACX,SAAAC,KAAU;AAAA,MACV,SAAAC,IAAU;AAAA,MACV,WAAAC;AAAA,IAAA,IACEX,GAEE,EAAE,GAAAvC,EAAA,IAAMmD,GAAA,GACRC,IAAMC,GAAA,GACNC,KAAcC,GAAA,GACdC,IAAWJ,EAAI,MAAME,IACrBG,IAAoBL,EAAI,YAAYL,IAEpCW,IAAerD,MAAU,QACzB,CAACsD,GAAaC,EAAc,IAAIC,EAAe,MAAM;AACzD,YAAMC,IAAUzD,KAASoC;AACzB,UAAIqB,GAAS;AACX,cAAMC,IAAS3D,EAAW0D,CAAO;AACjC,YAAIC,EAAQ,QAAOA;AAAA,MACrB;AACA,aAAO,EAAE,GAAG,GAAG,GAAG,KAAK,GAAG,IAAI,GAAG,EAAA;AAAA,IACnC,CAAC,GAEKC,IAAmBC,EAAQ,MAAM;AACrC,UAAIP,KAAgBrD,GAAO;AACzB,cAAM0D,IAAS3D,EAAWC,CAAK;AAC/B,YAAI0D,EAAQ,QAAOA;AAAA,MACrB;AACA,aAAOJ;AAAA,IACT,GAAG,CAACD,GAAcrD,GAAOsD,CAAW,CAAC,GAE/BO,IAAaC;AAAA,MACjB,CAAChF,MAAc;AACb,cAAMiF,IAAWzB,IAAexD,IAAM,EAAE,GAAGA,GAAK,GAAG,EAAA;AACnD,QAAKuE,KAAcE,GAAeQ,CAAQ,GAC1C1B,KAAA,QAAAA,EAAWxC,EAAakE,GAAUjE,CAAM;AAAA,MAC1C;AAAA,MACA,CAACwC,GAAcxC,GAAQuD,GAAchB,CAAQ;AAAA,IAAA,GAGzC,CAAC2B,GAAUC,CAAW,IAAIT,EAAS,MAAM3E,EAAS8E,CAAU,CAAC,GAC7D,CAACO,IAAUC,CAAW,IAAIX,EAAS,EAAK,GACxCY,IAAiBC,EAAsC,MAAS,GAChEC,IAAgBD,EAAOV,CAAU;AACvC,IAAAW,EAAc,UAAUX,GAExBY,EAAU,MAAM;AACd,MAAAN,EAAYpF,EAAS8E,CAAU,CAAC,GAChCQ,EAAY,EAAK,GACbC,EAAe,YAAY,WAC7B,aAAaA,EAAe,OAAO,GACnCA,EAAe,UAAU;AAAA,IAE7B,GAAG,CAACT,CAAU,CAAC,GAEfY,EAAU,MACD,MAAM;AACX,MAAIH,EAAe,YAAY,UAC7B,aAAaA,EAAe,OAAO;AAAA,IAEvC,GACC,CAAA,CAAE;AAEL,UAAMI,KAAgB,MAAM;AAC1B,YAAMd,IAAS3D,EAAWiE,CAAQ;AAClC,MAAIN,KACFS,EAAY,EAAK,GACjBN,EAAWH,CAAM,MAEjBS,EAAY,EAAI,GAChBC,EAAe,UAAU,WAAW,MAAM;AACxC,QAAAA,EAAe,UAAU,QACzBD,EAAY,EAAK,GACjBF,EAAYpF,EAASyF,EAAc,OAAO,CAAC;AAAA,MAC7C,GAAG,GAAG;AAAA,IAEV,GAEMG,IAA4Bb,EAAQ,MACnCrB,IACEA,EAAQ;AAAA,MAAI,CAACmC,MAClB,OAAOA,KAAS,WACZ,EAAE,MAAMA,EAAK,YAAA,GAAe,KAAKA,MACjCA;AAAA,IAAA,IAJexD,IAMpB,CAACqB,CAAO,CAAC,GAENoC,KAAa9F,EAAS8E,CAAU,GAYhCiB,IARuBhB;AAAA,MAC3B,MACEa,EAAS,IAAI,CAAClF,MAAM;AAClB,cAAMmE,IAAS3D,EAAWR,EAAE,GAAG;AAC/B,eAAOmE,IAAS7E,EAAS6E,CAAM,EAAE,gBAAgB;AAAA,MACnD,CAAC;AAAA,MACH,CAACe,CAAQ;AAAA,IAAA,EAEsC;AAAA,MAC/C,CAACzG,MAAQA,MAAQ,QAAQA,MAAQ2G,GAAW,YAAA;AAAA,IAAY,GAGpDE,IAAUR,EAAuB,IAAI,GACrC,CAACS,GAAcC,CAAe,IAAIvB;AAAA,MACtCoB,KAAuB,IAAIA,IAAsB;AAAA,IAAA,GAG7CI,KAAc,CAACC,MAAkB;;AACrC,YAAMC,KACJC,IAAAN,EAAQ,YAAR,gBAAAM,EAAiB,iBAA8B;AACjD,MAAID,KAAA,QAAAA,EAAQD,OACVC,EAAMD,CAAK,EAAE,MAAA,GACbF,EAAgBE,CAAK;AAAA,IAEzB,GAEMG,KAAoB,CAACC,MAAyC;AAClE,UAAIjC,EAAmB;AACvB,YAAMkC,IAAQb,EAAS;AACvB,UAAIc,IAAOT;AAUX,YAAMU,KAHJ,OAAO,SAAW,OAAeX,EAAQ,UACrC,OAAO,iBAAiBA,EAAQ,OAAO,EAAE,cAAc,QACvD,MACkB,KAAK;AAE7B,cAAQQ,EAAM,KAAA;AAAA,QACZ,KAAK;AACH,UAAAE,KAAQT,IAAeU,IAAUF,KAASA;AAC1C;AAAA,QACF,KAAK;AACH,UAAAC,KAAQT,IAAeU,IAAUF,KAASA;AAC1C;AAAA,QACF,KAAK;AACH,UAAAC,IAAO,KAAK,IAAIT,IAAezD,GAAMiE,IAAQ,CAAC;AAC9C;AAAA,QACF,KAAK;AACH,UAAAC,IAAO,KAAK,IAAIT,IAAezD,GAAM,CAAC;AACtC;AAAA,QACF,KAAK;AACH,UAAAkE,IAAO,KAAK,MAAMT,IAAezD,CAAI,IAAIA;AACzC;AAAA,QACF,KAAK;AACH,UAAAkE,IAAO,KAAK;AAAA,YACV,KAAK,MAAMT,IAAezD,CAAI,IAAIA,IAAOA,IAAO;AAAA,YAChDiE,IAAQ;AAAA,UAAA;AAEV;AAAA,QACF,KAAK;AACH,UAAAC,IAAOT,IAAezD;AACtB;AAAA,QACF,KAAK,YAAY;AACf,gBAAMoE,IAAe,KAAK,OAAOH,IAAQ,KAAKjE,CAAI,IAAIA;AACtD,UAAAkE,IAAO,KAAK,IAAIE,IAAgBX,IAAezD,GAAOiE,IAAQ,CAAC;AAC/D;AAAA,QACF;AAAA,QACA,KAAK;AAAA,QACL,KAAK,KAAK;AACR,UAAAD,EAAM,eAAA;AACN,gBAAM3B,IAAS3D,EAAW0E,EAASK,CAAY,EAAE,GAAG;AACpD,UAAIpB,OAAmBA,CAAM;AAC7B;AAAA,QACF;AAAA,QACA;AACE;AAAA,MAAA;AAGJ,MAAA2B,EAAM,eAAA,GACNL,GAAYO,CAAI;AAAA,IAClB,GAEM,CAACG,IAAMC,EAAO,IAAInC,EAAS,EAAK,GAEhCoC,KAAchC;AAAA,MAClB,OAAO;AAAA,QACL,UAAU,MAAM/E,EAASyF,EAAc,OAAO;AAAA,QAC9C,UAAU,CAACtG,MAAQ;AACjB,gBAAM0F,IAAS3D,EAAW/B,CAAG;AAC7B,UAAI0F,OAAmBA,CAAM;AAAA,QAC/B;AAAA,MAAA;AAAA,MAEF,CAACG,CAAU;AAAA,IAAA;AAEb,IAAAgC,GAAqBjI,IAAkBgI,IAAazC,CAAQ;AAE5D,UAAM2C,IAAelC,EAAQ,MAAM;AACjC,UAAI,CAACpB,EAAS,QAAO;AACrB,YAAMuD,IAAQhG,EAAWyC,CAAO;AAChC,UAAI,CAACuD,EAAO,QAAO;AACnB,YAAM/E,IAAQR,GAAcmD,GAAYoC,CAAK;AAC7C,aAAO,EAAE,OAAA/E,GAAO,IAAID,GAAQC,CAAK,GAAG,KAAKC,GAASD,CAAK,EAAA;AAAA,IACzD,GAAG,CAACwB,GAASmB,CAAU,CAAC,GAElBqC;AAAA;AAAA,MAEJ,gBAAAC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAKpB;AAAA,UACL,MAAK;AAAA,UACL,cAAYlF,EAAE,mCAAmC,gBAAgB;AAAA,UACjE,WAAWyF;AAAA,UACX,WAAU;AAAA,UAET,UAAAX,EAAS,IAAI,CAACyB,GAAS,MAAM;AAC5B,kBAAMC,IAAW,KAAK,MAAM,IAAI9E,CAAI,IAAIA;AAExC,mBADqB,MAAM8E,IAEzB,gBAAAF,EAAC,OAAA,EAAY,MAAK,OAAM,WAAU,eAC/B,UAAAxB,EAAS,MAAM0B,GAAUA,IAAW9E,CAAI,EAAE,IAAI,CAAC9B,GAAG6G,MAAM;AACvD,oBAAMC,IAAMF,IAAWC,GACjBE,IAAMD,MAAQzB;AACpB;AAAA;AAAA,gBAEE,gBAAAqB;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBAEC,MAAK;AAAA,oBACL,iBAAeK;AAAA,oBACf,cAAY3G,EAAE,kCAAkC;AAAA,sBAC9C,MAAMJ,EAAE;AAAA,sBACR,KAAKA,EAAE;AAAA,oBAAA,CACR;AAAA,oBACD,UAAU8G,MAAQvB,IAAe,IAAI;AAAA,oBACrC,SAAS,MAAM;AACb,0BAAI1B,EAAmB;AACvB,4BAAMM,IAAS3D,EAAWR,EAAE,GAAG;AAC/B,sBAAImE,OAAmBA,CAAM,GAC7BqB,EAAgBsB,CAAG;AAAA,oBACrB;AAAA,oBACA,WAAW7E,GAAe,EAAE,UAAU8E,GAAK,MAAA7D,GAAM;AAAA,oBAEjD,OAAO,EAAG,eAA0BlD,EAAE,IAAA;AAAA,oBAErC,UAAA+G,IACC,gBAAAL;AAAA,sBAACM;AAAA,sBAAA;AAAA,wBACC,eAAY;AAAA,wBACZ,WAAU;AAAA,sBAAA;AAAA,oBAAA,IAEV;AAAA,kBAAA;AAAA,kBAvBChH,EAAE;AAAA,gBAAA;AAAA;AAAA,YA0Bb,CAAC,EAAA,GAjCO,CAkCV,IACE;AAAA,UACN,CAAC;AAAA,QAAA;AAAA,MAAA;AAAA,OAICiH,KAAe5D,IAAU,OAC7B,gBAAA6D,EAAAC,IAAA,EACE,UAAA;AAAA,MAAA,gBAAAD,EAAC,OAAA,EAAI,WAAU,kDACb,UAAA;AAAA,QAAA,gBAAAR;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,GAAG9C,CAAQ;AAAA,YACpB,WAAU;AAAA,YAET,UAAAxD,EAAE,0BAA0B,KAAK;AAAA,UAAA;AAAA,QAAA;AAAA,QAEpC,gBAAAsG,EAAC,OAAA,EAAI,KAAI,OACP,UAAA,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAI,GAAG9C,CAAQ;AAAA,YACf,MAAK;AAAA,YACL,OAAOa;AAAA,YACP,UAAUZ;AAAA,YACV,UAAU,CAACuD,MAAM1C,EAAY0C,EAAE,OAAO,KAAK;AAAA,YAC3C,QAAQnC;AAAA,YACR,WAAW,GAAG1C,EAAiB,IAAIoC,KAAW,mCAAmC,iCAAiC;AAAA,UAAA;AAAA,QAAA,EACpH,CACF;AAAA,MAAA,GACF;AAAA,MAEA,gBAAAuC,EAAC,OAAA,EAAI,WAAU,kDACb,UAAA;AAAA,QAAA,gBAAAR;AAAA,UAACW;AAAA,UAAA;AAAA,YACC,OAAOjH,EAAE,0BAA0B,KAAK;AAAA,YACxC,UAAS;AAAA,YACT,KAAK;AAAA,YACL,KAAK;AAAA,YACL,OAAOgE,EAAW;AAAA,YAClB,UAAU,CAAC1F,MAAM4F,EAAW,EAAE,GAAGF,GAAY,GAAA1F,GAAG;AAAA,YAChD,aAAa,CAAC4I,MAAM,KAAK,KAAK,MAAMA,CAAC,CAAC;AAAA,YACtC,UAAUzD;AAAA,UAAA;AAAA,QAAA;AAAA,QAEZ,gBAAA6C;AAAA,UAACW;AAAA,UAAA;AAAA,YACC,OAAOjH,EAAE,iCAAiC,YAAY;AAAA,YACtD,UAAU,iCAAiCgE,EAAW,CAAC,OAAOA,EAAW,CAAC,WAAWA,EAAW,CAAC,SAASA,EAAW,CAAC;AAAA,YACtH,KAAK;AAAA,YACL,KAAK;AAAA,YACL,OAAOA,EAAW;AAAA,YAClB,UAAU,CAACpE,MAAMsE,EAAW,EAAE,GAAGF,GAAY,GAAApE,GAAG;AAAA,YAChD,aAAa,CAACsH,MAAM,KAAK,KAAK,MAAMA,CAAC,CAAC;AAAA,YACtC,UAAUzD;AAAA,UAAA;AAAA,QAAA;AAAA,QAEZ,gBAAA6C;AAAA,UAACW;AAAA,UAAA;AAAA,YACC,OAAOjH,EAAE,gCAAgC,WAAW;AAAA,YACpD,UAAU,iCAAiCgE,EAAW,CAAC,IAAIA,EAAW,CAAC,cAAcA,EAAW,CAAC,IAAIA,EAAW,CAAC,eAAeA,EAAW,CAAC,IAAIA,EAAW,CAAC;AAAA,YAC5J,KAAK;AAAA,YACL,KAAK;AAAA,YACL,OAAOA,EAAW;AAAA,YAClB,UAAU,CAAClF,MAAMoF,EAAW,EAAE,GAAGF,GAAY,GAAAlF,GAAG;AAAA,YAChD,aAAa,CAACoI,MAAM,KAAK,KAAK,MAAMA,CAAC,CAAC;AAAA,YACtC,UAAUzD;AAAA,UAAA;AAAA,QAAA;AAAA,QAEXd,IACC,gBAAAmE,EAAC,OAAA,EAAI,WAAU,kDACb,UAAA;AAAA,UAAA,gBAAAR,EAAC,WAAM,WAAU,0EACd,UAAAtG,EAAE,8BAA8B,SAAS,GAC5C;AAAA,UACA,gBAAA8G,EAAC,OAAA,EAAI,WAAU,eACb,UAAA;AAAA,YAAA,gBAAAR;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW,iFAAiFvE,EAAuB;AAAA,gBACnH,eAAY;AAAA,cAAA;AAAA,YAAA;AAAA,YAEd,gBAAAuE;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBAEV,OAAO;AAAA,kBACJ,sBAAiC,kCAAkCtC,EAAW,CAAC,IAAIA,EAAW,CAAC,KAAKA,EAAW,CAAC,aAAaA,EAAW,CAAC,IAAIA,EAAW,CAAC,KAAKA,EAAW,CAAC;AAAA,gBAAA;AAAA,gBAE7K,eAAY;AAAA,cAAA;AAAA,YAAA;AAAA,YAEd,gBAAAsC;AAAA,cAACa;AAAA,cAAA;AAAA,gBACC,KAAK;AAAA,gBACL,KAAK;AAAA,gBACL,MAAM;AAAA,gBACN,OAAO,CAAC,KAAK,MAAMnD,EAAW,IAAI,GAAG,CAAC;AAAA,gBACtC,eAAe,CAAC,CAACkD,CAAC,MAChBhD,EAAW,EAAE,GAAGF,GAAY,GAAGkD,IAAI,KAAK;AAAA,gBAE1C,cAAYlH,EAAE,8BAA8B,SAAS;AAAA,gBACrD,aAAa,CAACkH,MAAM,GAAGA,CAAC;AAAA,gBACxB,UAAUzD;AAAA,gBACV,WAAWrB;AAAA,cAAA;AAAA,YAAA;AAAA,UACb,EAAA,CACF;AAAA,QAAA,EAAA,CACF,IACE;AAAA,MAAA,GACN;AAAA,MAEC+D,IACC,gBAAAW;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,MAAK;AAAA,UACL,aAAU;AAAA,UAEV,UAAA;AAAA,YAAA,gBAAAR,EAAC,QAAA,EAAK,WAAU,mBACb,UAAAtG,EAAE,oCAAoC;AAAA,cACrC,OAAOmG,EAAa,MAAM,QAAQ,CAAC;AAAA,YAAA,CACpC,GACH;AAAA,8BACCiB,IAAA,EAAc,OAAM,MAAK,QAAQjB,EAAa,IAAI,GAAAnG,GAAM;AAAA,8BACxDoH,IAAA,EAAc,OAAM,OAAM,QAAQjB,EAAa,KAAK,GAAAnG,EAAA,CAAM;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA,IAE3D;AAAA,MAEJ,gBAAA8G,EAAC,OAAA,EAAI,WAAU,sDACb,UAAA;AAAA,QAAA,gBAAAR;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YAEV,OAAO,EAAG,eAA0BpH,EAAS8E,CAAU,EAAA;AAAA,YACvD,eAAY;AAAA,UAAA;AAAA,QAAA;AAAA,0BAEb,QAAA,EAAK,WAAU,0FACb,UAAA9D,EAAa8D,GAAY7D,CAAM,EAAA,CAClC;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,GACF,GAGIkH,IACJ,gBAAAP;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WACE7D,IACIH,MAAS,OACPb,KACAD,KACFF;AAAA,QAGL,UAAA;AAAA,UAAAuE;AAAA,UACAQ;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAIL,WAAI7D,OAAY,WAEZ,gBAAAsD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAA9D;AAAA,QACA,IAAIgB;AAAA,QACJ,WAAAN;AAAA,QACA,oBAAkBE,EAAI,eAAe;AAAA,QACrC,gBAAcA,EAAI,WAAW;AAAA,QAC7B,iBAAeK,KAAqB;AAAA,QACpC,kBAAe;AAAA,QACf,qBAAmBD;AAAA,QACnB,eAAY;AAAA,QAEX,UAAA6D;AAAA,MAAA;AAAA,IAAA,sBAMJC,EAAQ,MAAR,EAAa,MAAAvB,IAAY,cAAcC,IACtC,UAAA;AAAA,MAAA,gBAAAM,EAACgB,EAAQ,SAAR,EAAgB,SAAO,IAAC,UAAU7D,GAEjC,UAAA,gBAAAqD;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAAtE;AAAA,UACA,MAAK;AAAA,UACL,IAAIgB;AAAA,UACJ,oBAAkBJ,EAAI,eAAe;AAAA,UACrC,gBAAcA,EAAI,WAAW;AAAA,UAK7B,cACEH,IACIjD,EAAE,mCAAmC,eAAe,IACpD;AAAA,UAEN,WAAW2B,GAAgB,EAAE,MAAAmB,GAAM,WAAAI,GAAW;AAAA,UAC9C,kBAAe;AAAA,UACf,qBAAmBM;AAAA,UACnB,eAAY;AAAA,UAEZ,UAAA;AAAA,YAAA,gBAAA8C;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW,yIAAyIrD,IAAU,KAAK,4BAA4B;AAAA,gBAC/L,eAAY;AAAA,gBAEZ,OAAO,EAAG,eAA0B/D,EAAS8E,CAAU,EAAA;AAAA,cAAE;AAAA,YAAA;AAAA,YAE1Df,IAAU,OACT,gBAAAqD,EAAC,QAAA,EAAK,WAAU,6CACb,UAAApG,EAAa8D,GAAY7D,CAAM,EAAA,CAClC;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA,GAGN;AAAA,MACA,gBAAAmG,EAACgB,EAAQ,QAAR,EACC,UAAA,gBAAAhB;AAAA,QAACgB,EAAQ;AAAA,QAAR;AAAA,UACC,YAAY;AAAA,UACZ,OAAM;AAAA,UACN,WAAWpF;AAAA,UAEV,UAAAmF;AAAA,QAAA;AAAA,MAAA,EACH,CACF;AAAA,IAAA,GACF;AAAA,EAEJ;AACF;AAEAhF,GAAY,cAAc;AAE1B,SAAS+E,GAAc;AAAA,EACrB,OAAAG;AAAA,EACA,QAAAC;AAAA,EACA,GAAAxH;AACF,GAIG;AACD,SACE,gBAAA8G,EAAC,QAAA,EAAK,WAAU,6DACd,UAAA;AAAA,IAAA,gBAAAR;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO,8CAA8CiB,CAAK;AAAA,QAC1D,WAAU;AAAA,QAET,UAAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAEFC,IACC,gBAAAlB;AAAA,MAACM;AAAA,MAAA;AAAA,QACC,eAAY;AAAA,QACZ,WAAU;AAAA,MAAA;AAAA,IAAA,IAGZ,gBAAAN;AAAA,MAACmB;AAAA,MAAA;AAAA,QACC,eAAY;AAAA,QACZ,WAAU;AAAA,MAAA;AAAA,IAAA;AAAA,IAGd,gBAAAnB,EAAC,QAAA,EAAK,WAAU,cACb,UAAAkB,IACGxH,EAAE,mCAAmC,MAAM,IAC3CA,EAAE,mCAAmC,MAAM,EAAA,CACjD;AAAA,EAAA,GACF;AAEJ;AAEA,SAASiH,EAAmB;AAAA,EAC1B,OAAAS;AAAA,EACA,UAAAC;AAAA,EACA,KAAA9I;AAAA,EACA,KAAAD;AAAA,EACA,OAAAyB;AAAA,EACA,UAAAqC;AAAA,EACA,aAAAkF;AAAA,EACA,UAAA7E;AACF,GASG;AACD,SACE,gBAAA+D,EAAC,OAAA,EAAI,WAAU,kDACb,UAAA;AAAA,IAAA,gBAAAR,EAAC,SAAA,EAAM,WAAU,0EACd,UAAAoB,GACH;AAAA,IACA,gBAAAZ,EAAC,OAAA,EAAI,WAAU,eACb,UAAA;AAAA,MAAA,gBAAAR;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UAEV,OAAO,EAAG,qBAAgCqB,EAAA;AAAA,UAC1C,eAAY;AAAA,QAAA;AAAA,MAAA;AAAA,MAEd,gBAAArB;AAAA,QAACa;AAAA,QAAA;AAAA,UACC,KAAAtI;AAAA,UACA,KAAAD;AAAA,UACA,MAAM;AAAA,UACN,OAAO,CAACyB,CAAK;AAAA,UACb,eAAe,CAAC,CAAC6G,CAAC,MAAMxE,EAASwE,CAAC;AAAA,UAClC,cAAYQ;AAAA,UACZ,aAAAE;AAAA,UACA,UAAA7E;AAAA,UACA,WAAWX;AAAA,QAAA;AAAA,MAAA;AAAA,IACb,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;"}
|