@mieweb/ui 0.11.0-dev.34 → 0.11.0-dev.36
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/MIGRATION.md +45 -11
- package/dist/{EncounterMdyEditor-73PTTIRY.cjs → EncounterMdyEditor-46WMYRFI.cjs} +6 -6
- package/dist/{EncounterMdyEditor-73PTTIRY.cjs.map → EncounterMdyEditor-46WMYRFI.cjs.map} +1 -1
- package/dist/{EncounterMdyEditor-3SQY4MK2.js → EncounterMdyEditor-L7RBLE7B.js} +3 -3
- package/dist/{EncounterMdyEditor-3SQY4MK2.js.map → EncounterMdyEditor-L7RBLE7B.js.map} +1 -1
- package/dist/{chunk-4SUEBKTY.js → chunk-2OTPQPJS.js} +52 -44
- package/dist/chunk-2OTPQPJS.js.map +1 -0
- package/dist/{chunk-MZR634HI.cjs → chunk-3M2BBOXF.cjs} +9 -9
- package/dist/{chunk-MZR634HI.cjs.map → chunk-3M2BBOXF.cjs.map} +1 -1
- package/dist/{chunk-6UYMO3PF.cjs → chunk-47AOS5EC.cjs} +10 -2
- package/dist/chunk-47AOS5EC.cjs.map +1 -0
- package/dist/{chunk-DXNVQQYN.cjs → chunk-6L7CTEX2.cjs} +51 -44
- package/dist/chunk-6L7CTEX2.cjs.map +1 -0
- package/dist/{chunk-RTADGBBN.js → chunk-AIO2GCTL.js} +3 -3
- package/dist/{chunk-RTADGBBN.js.map → chunk-AIO2GCTL.js.map} +1 -1
- package/dist/{chunk-EX7Q5545.js → chunk-AKC677ZF.js} +5 -5
- package/dist/{chunk-EX7Q5545.js.map → chunk-AKC677ZF.js.map} +1 -1
- package/dist/{chunk-XEHD2HA5.cjs → chunk-FRPELUI5.cjs} +3 -3
- package/dist/{chunk-XEHD2HA5.cjs.map → chunk-FRPELUI5.cjs.map} +1 -1
- package/dist/{chunk-DGHS5IVD.js → chunk-GJSLKD4Q.js} +3 -3
- package/dist/{chunk-DGHS5IVD.js.map → chunk-GJSLKD4Q.js.map} +1 -1
- package/dist/{chunk-VMEVLBI3.js → chunk-GKMMDKYY.js} +3 -3
- package/dist/{chunk-VMEVLBI3.js.map → chunk-GKMMDKYY.js.map} +1 -1
- package/dist/{chunk-46RYJYN2.cjs → chunk-GU6TPVXF.cjs} +6 -6
- package/dist/{chunk-46RYJYN2.cjs.map → chunk-GU6TPVXF.cjs.map} +1 -1
- package/dist/chunk-IALTKN3Y.js +1017 -0
- package/dist/chunk-IALTKN3Y.js.map +1 -0
- package/dist/{chunk-33Y3KQWL.js → chunk-IGRHPZOJ.js} +3 -3
- package/dist/{chunk-33Y3KQWL.js.map → chunk-IGRHPZOJ.js.map} +1 -1
- package/dist/{chunk-PLBWZW4F.js → chunk-KAQNYX7B.js} +3 -3
- package/dist/{chunk-PLBWZW4F.js.map → chunk-KAQNYX7B.js.map} +1 -1
- package/dist/{chunk-SPGP252Q.js → chunk-KB2PLV5Q.js} +4 -4
- package/dist/{chunk-SPGP252Q.js.map → chunk-KB2PLV5Q.js.map} +1 -1
- package/dist/{chunk-NCPDUJKJ.cjs → chunk-KQXD6BFO.cjs} +4 -4
- package/dist/{chunk-NCPDUJKJ.cjs.map → chunk-KQXD6BFO.cjs.map} +1 -1
- package/dist/{chunk-4VSK3EE5.cjs → chunk-L77XJPKC.cjs} +3 -3
- package/dist/{chunk-4VSK3EE5.cjs.map → chunk-L77XJPKC.cjs.map} +1 -1
- package/dist/{chunk-PGJLW2NO.cjs → chunk-LLIG4X6M.cjs} +7 -7
- package/dist/{chunk-PGJLW2NO.cjs.map → chunk-LLIG4X6M.cjs.map} +1 -1
- package/dist/{chunk-NW6D6AFL.js → chunk-LWLHCUDP.js} +10 -10
- package/dist/{chunk-NW6D6AFL.js.map → chunk-LWLHCUDP.js.map} +1 -1
- package/dist/{chunk-YR45POH2.js → chunk-MAEANAAJ.js} +3 -3
- package/dist/{chunk-YR45POH2.js.map → chunk-MAEANAAJ.js.map} +1 -1
- package/dist/{chunk-X5HLVACK.js → chunk-MLCIINXT.js} +4 -4
- package/dist/{chunk-X5HLVACK.js.map → chunk-MLCIINXT.js.map} +1 -1
- package/dist/{chunk-JEXEFWEM.js → chunk-MNXIN4MS.js} +10 -2
- package/dist/chunk-MNXIN4MS.js.map +1 -0
- package/dist/{chunk-PHUTJKHL.cjs → chunk-MXIIPFTA.cjs} +3 -3
- package/dist/{chunk-PHUTJKHL.cjs.map → chunk-MXIIPFTA.cjs.map} +1 -1
- package/dist/{chunk-QO4A6U73.cjs → chunk-NCG7NJAW.cjs} +93 -30
- package/dist/chunk-NCG7NJAW.cjs.map +1 -0
- package/dist/{chunk-25MPUVTM.js → chunk-NIE3WBJH.js} +94 -31
- package/dist/chunk-NIE3WBJH.js.map +1 -0
- package/dist/{chunk-4GSFVD5V.js → chunk-NUHHWELE.js} +3 -3
- package/dist/{chunk-4GSFVD5V.js.map → chunk-NUHHWELE.js.map} +1 -1
- package/dist/{chunk-4M2KE4O5.cjs → chunk-OGFSFUIX.cjs} +7 -7
- package/dist/{chunk-4M2KE4O5.cjs.map → chunk-OGFSFUIX.cjs.map} +1 -1
- package/dist/{chunk-YSIFPHLX.js → chunk-OJQMC426.js} +2 -2
- package/dist/{chunk-YSIFPHLX.js.map → chunk-OJQMC426.js.map} +1 -1
- package/dist/{chunk-SVC7NPQ6.cjs → chunk-PDLVSJMZ.cjs} +6 -6
- package/dist/{chunk-SVC7NPQ6.cjs.map → chunk-PDLVSJMZ.cjs.map} +1 -1
- package/dist/{chunk-KD7YD6US.cjs → chunk-QOQQVNP3.cjs} +2 -2
- package/dist/{chunk-KD7YD6US.cjs.map → chunk-QOQQVNP3.cjs.map} +1 -1
- package/dist/{chunk-6O6EYKOG.cjs → chunk-R4QWCP2T.cjs} +65 -65
- package/dist/{chunk-6O6EYKOG.cjs.map → chunk-R4QWCP2T.cjs.map} +1 -1
- package/dist/chunk-RCTIPBLU.cjs +1039 -0
- package/dist/chunk-RCTIPBLU.cjs.map +1 -0
- package/dist/{chunk-FSWHZY3T.cjs → chunk-RD2I67C4.cjs} +3 -3
- package/dist/{chunk-FSWHZY3T.cjs.map → chunk-RD2I67C4.cjs.map} +1 -1
- package/dist/{chunk-YGSPIDE4.js → chunk-RM4CBS7Y.js} +3 -3
- package/dist/{chunk-YGSPIDE4.js.map → chunk-RM4CBS7Y.js.map} +1 -1
- package/dist/{chunk-3O3Q3DX7.cjs → chunk-S3LTUSO5.cjs} +21 -21
- package/dist/{chunk-3O3Q3DX7.cjs.map → chunk-S3LTUSO5.cjs.map} +1 -1
- package/dist/{chunk-2OXNJJHJ.cjs → chunk-TERHGQ73.cjs} +3 -3
- package/dist/{chunk-2OXNJJHJ.cjs.map → chunk-TERHGQ73.cjs.map} +1 -1
- package/dist/{chunk-DO7EED3B.cjs → chunk-WZ7WTIVU.cjs} +3 -3
- package/dist/{chunk-DO7EED3B.cjs.map → chunk-WZ7WTIVU.cjs.map} +1 -1
- package/dist/{chunk-566FIEPE.js → chunk-YFZNSP7F.js} +3 -3
- package/dist/{chunk-566FIEPE.js.map → chunk-YFZNSP7F.js.map} +1 -1
- package/dist/{chunk-I6Y2KLTZ.js → chunk-ZP4H5HA4.js} +3 -3
- package/dist/{chunk-I6Y2KLTZ.js.map → chunk-ZP4H5HA4.js.map} +1 -1
- package/dist/components/ActionPlan/index.cjs +1 -1
- package/dist/components/ActionPlan/index.js +1 -1
- package/dist/components/AlertDialog/index.cjs +7 -7
- package/dist/components/AlertDialog/index.js +3 -3
- package/dist/components/CustomizableDashboard/index.cjs +1 -1
- package/dist/components/CustomizableDashboard/index.js +1 -1
- package/dist/components/DateInput/index.cjs +3 -3
- package/dist/components/DateInput/index.js +2 -2
- package/dist/components/EmailEditor/index.cjs +16 -13
- package/dist/components/EmailEditor/index.js +7 -4
- package/dist/components/KeyboardShortcutsOverlay/index.cjs +5 -5
- package/dist/components/KeyboardShortcutsOverlay/index.js +3 -3
- package/dist/components/Markdown/index.cjs +10 -10
- package/dist/components/Markdown/index.js +2 -2
- package/dist/components/MediaEditor/index.cjs +9 -9
- package/dist/components/MediaEditor/index.js +4 -4
- package/dist/components/MediaFeed/index.cjs +4 -4
- package/dist/components/MediaFeed/index.js +3 -3
- package/dist/components/Modal/index.cjs +10 -10
- package/dist/components/Modal/index.js +2 -2
- package/dist/components/RadialExplorer/index.cjs +3 -3
- package/dist/components/RadialExplorer/index.js +2 -2
- package/dist/components/RecordHeader/index.cjs +4 -4
- package/dist/components/RecordHeader/index.js +2 -2
- package/dist/components/RecordLayout/index.cjs +1 -1
- package/dist/components/RecordLayout/index.js +1 -1
- package/dist/components/Sheet/index.cjs +1 -1
- package/dist/components/Sheet/index.js +1 -1
- package/dist/components/SuperChat/index.cjs +6 -6
- package/dist/components/SuperChat/index.js +5 -5
- package/dist/components/SuperChat/plugins/index.cjs +1 -1
- package/dist/components/SuperChat/plugins/index.js +1 -1
- package/dist/components/TagEditor/index.cjs +4 -4
- package/dist/components/TagEditor/index.js +2 -2
- package/dist/components/Textarea/index.cjs +7 -4
- package/dist/components/Textarea/index.js +4 -1
- package/dist/esheet.cjs +122 -123
- package/dist/esheet.cjs.map +1 -1
- package/dist/esheet.js +25 -26
- package/dist/esheet.js.map +1 -1
- package/dist/hooks/index.cjs +15 -15
- package/dist/hooks/index.js +3 -3
- package/dist/index.cjs +456 -425
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +19 -10
- package/dist/index.d.ts +19 -10
- package/dist/index.js +80 -42
- package/dist/index.js.map +1 -1
- package/dist/kerebron.cjs +32 -62
- package/dist/kerebron.cjs.map +1 -1
- package/dist/kerebron.css +145 -8
- package/dist/kerebron.d.cts +299 -1
- package/dist/kerebron.d.ts +299 -1
- package/dist/kerebron.js +22 -63
- package/dist/kerebron.js.map +1 -1
- package/dist/{model-EFXX5JZN.cjs → model-5PB6KNYH.cjs} +20 -20
- package/dist/{model-EFXX5JZN.cjs.map → model-5PB6KNYH.cjs.map} +1 -1
- package/dist/{model-TAARSYDY.js → model-OGWTZEXR.js} +6 -6
- package/dist/{model-TAARSYDY.js.map → model-OGWTZEXR.js.map} +1 -1
- package/dist/styles.css +1 -1
- package/dist/tailwind-preset.cjs +4 -4
- package/dist/tailwind-preset.js +1 -1
- package/dist/templates.cjs +31 -31
- package/dist/templates.js +2 -2
- package/dist/utils/index.cjs +5 -5
- package/dist/utils/index.d.cts +12 -12
- package/dist/utils/index.d.ts +12 -12
- package/dist/utils/index.js +1 -1
- package/package.json +3 -13
- package/dist/chunk-25MPUVTM.js.map +0 -1
- package/dist/chunk-4SUEBKTY.js.map +0 -1
- package/dist/chunk-6UYMO3PF.cjs.map +0 -1
- package/dist/chunk-DXNVQQYN.cjs.map +0 -1
- package/dist/chunk-JEXEFWEM.js.map +0 -1
- package/dist/chunk-QO4A6U73.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/RowActionToolbar/RowActionToolbar.tsx","../src/components/ProblemList/ProblemList.tsx"],"names":["isRtl","cn","jsx","Tooltip","Button","ExternalLink","StickyNote","Pencil","RefreshCw","CheckCircle","Link","Trash2","ChevronUp","ChevronDown","useMessages","jsxs","Fragment","Badge","HelpCircle","React","dragIndicatorClasses","GripVertical","History","useLiveAnnouncement","useDragReorder","Card","CardHeader","CardContent","Plus"],"mappings":"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","file":"chunk-NCPDUJKJ.cjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { isRtl } from '../../hooks/useDirection';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../Button';\nimport { Tooltip } from '../Tooltip';\n\n/**\n * Toolbar / group arrow-key navigation (WAI-ARIA toolbar pattern).\n * Attach to a container's onKeyDown: ←/→ move focus between enabled\n * buttons, Home/End jump to first/last. Horizontal arrows follow the\n * visual direction, so they invert under RTL.\n */\nexport function toolbarKeyNav(e: React.KeyboardEvent<HTMLElement>) {\n if (e.altKey || e.ctrlKey || e.metaKey) return;\n if (!['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(e.key)) return;\n const buttons = Array.from(\n e.currentTarget.querySelectorAll<HTMLButtonElement>(\n 'button:not([disabled])'\n )\n );\n const i = buttons.indexOf(document.activeElement as HTMLButtonElement);\n if (i === -1 || buttons.length === 0) return;\n e.preventDefault();\n e.stopPropagation();\n let key = e.key;\n if (isRtl(e.currentTarget)) {\n if (key === 'ArrowRight') key = 'ArrowLeft';\n else if (key === 'ArrowLeft') key = 'ArrowRight';\n }\n const next =\n key === 'ArrowLeft'\n ? (i - 1 + buttons.length) % buttons.length\n : key === 'ArrowRight'\n ? (i + 1) % buttons.length\n : key === 'Home'\n ? 0\n : buttons.length - 1;\n buttons[next]?.focus();\n}\n\n// Alignment of the floating (fine-pointer) overlay within the row.\nconst ALIGN = {\n /** Vertically centered on the row's right edge (single-line rows). */\n center:\n 'pointer-fine:top-1/2 pointer-fine:end-0 pointer-fine:-translate-y-1/2',\n /** Pinned near the row's top-right corner (multi-line rows). */\n top: 'pointer-fine:top-1.5 pointer-fine:end-1.5',\n} as const;\n\n// Which hover scope reveals the toolbar. Rows nested inside another `group`\n// (e.g. order rows inside an assessed problem) use a named group so hovering\n// the outer block doesn't reveal every nested toolbar. `grid` keys off the\n// datavis (NITRO) table row (`.wcdv-tr`) for toolbars rendered into grid\n// cells via `formatCell`.\nconst REVEAL = {\n row: cn(\n 'group-hover:pointer-events-auto group-hover:opacity-100',\n 'group-focus-within:pointer-events-auto group-focus-within:opacity-100',\n 'group-focus:pointer-events-auto group-focus:opacity-100'\n ),\n order: cn(\n 'group-hover/order:pointer-events-auto group-hover/order:opacity-100',\n 'group-focus-within/order:pointer-events-auto group-focus-within/order:opacity-100',\n 'group-focus/order:pointer-events-auto group-focus/order:opacity-100'\n ),\n grid: cn(\n '[.wcdv-tr:hover_&]:pointer-events-auto [.wcdv-tr:hover_&]:opacity-100',\n '[.wcdv-tr:focus-within_&]:pointer-events-auto [.wcdv-tr:focus-within_&]:opacity-100'\n ),\n} as const;\n\nexport interface RowActionToolbarProps {\n /** Accessible name, e.g. `Actions for penicillin`. */\n label: string;\n /** Overlay alignment on fine-pointer devices. @default 'center' */\n align?: keyof typeof ALIGN;\n /**\n * Hover scope for the reveal. Use `'order'` when the row is a\n * `group/order` nested inside another `group`; use `'grid'` inside a\n * datavis (NITRO) grid cell — the toolbar then stays in flow (the cell\n * reserves its space) and reveals when the `.wcdv-tr` row is hovered.\n * @default 'row'\n */\n group?: keyof typeof REVEAL;\n /**\n * `'hover'` floats the toolbar over the row on fine-pointer devices and\n * reveals it on hover/focus; `'always'` keeps it in flow at the end of the\n * row and always visible on every pointer type.\n * @default 'hover'\n */\n reveal?: 'hover' | 'always';\n className?: string;\n children: React.ReactNode;\n}\n\n/**\n * Per-row action toolbar for clinical lists.\n *\n * On hover-capable (fine pointer) devices it floats over the row's right\n * edge as a card-styled overlay, hidden until the row is hovered or\n * keyboard-focused. Touch devices can't hover, so the toolbar stays in\n * flow at the end of the row (`ms-auto`) and is always visible.\n *\n * Implements WAI-ARIA toolbar arrow-key navigation. The parent row must be\n * `relative` and carry the matching `group` (or `group/order`) class.\n */\nexport function RowActionToolbar({\n label,\n align = 'center',\n group = 'row',\n reveal = 'hover',\n className,\n children,\n}: RowActionToolbarProps) {\n return (\n <div\n role=\"toolbar\"\n aria-label={label}\n onKeyDown={toolbarKeyNav}\n className={cn(\n 'z-10 ms-auto flex items-center gap-0.5',\n reveal === 'hover' && [\n 'transition-opacity',\n // Inside a grid cell the column already reserves the space, so the\n // toolbar stays in flow — no absolute overlay. It keeps the card\n // chrome, though: pair with a `sticky end-0` actions column and it\n // floats over scrolled-under content at the grid's right edge.\n group !== 'grid' && [\n 'pointer-fine:absolute',\n ALIGN[align],\n 'pointer-fine:bg-card pointer-fine:border-border pointer-fine:rounded-md pointer-fine:border pointer-fine:p-0.5 pointer-fine:shadow-sm',\n ],\n group === 'grid' &&\n 'bg-card border-border rounded-md border p-0.5 shadow-sm',\n 'pointer-fine:pointer-events-none pointer-fine:opacity-0',\n REVEAL[group],\n 'focus-within:pointer-events-auto focus-within:opacity-100',\n ],\n className\n )}\n >\n {children}\n </div>\n );\n}\n\nexport interface RowIconButtonProps {\n label: string;\n icon: React.ComponentType<{ size?: number | string }>;\n onClick: () => void;\n /** Toggle-button state (renders `aria-pressed` + tinted background). */\n active?: boolean;\n /** Disclosure state and the id of the controlled region. */\n expanded?: boolean;\n controls?: string;\n /** `md` = 32px button / 16px icon; `sm` = 28px / 14px. @default 'md' */\n size?: 'md' | 'sm';\n}\n\n/** Tooltip-labeled ghost icon button for `RowActionToolbar`. */\nexport function RowIconButton({\n label,\n icon: Icon,\n onClick,\n active,\n expanded,\n controls,\n size = 'md',\n}: RowIconButtonProps) {\n return (\n <Tooltip content={label}>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={label}\n aria-pressed={active}\n aria-expanded={expanded}\n aria-controls={controls}\n onClick={(e) => {\n e.stopPropagation();\n onClick();\n }}\n className={cn(\n size === 'sm' ? 'h-7 w-7' : 'h-8 w-8',\n 'shrink-0',\n (active || expanded) &&\n 'bg-primary-50 text-primary-700 dark:bg-primary-950 dark:text-primary-400'\n )}\n >\n <Icon size={size === 'sm' ? 14 : 16} />\n </Button>\n </Tooltip>\n );\n}\n","'use client';\n\nimport { useMessages, type MessageTranslator } from '../../utils/messages';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Badge } from '../Badge/Badge';\nimport { Button } from '../Button';\nimport { Tooltip } from '../Tooltip';\nimport { Card, CardHeader, CardContent } from '../Card/Card';\nimport {\n PencilIcon,\n RefreshIcon,\n CheckCircleIcon,\n LinkIcon,\n ExternalLinkIcon,\n ChevronDownIcon,\n ChevronUpIcon,\n PlusIcon,\n HistoryIcon,\n HelpCircleIcon,\n GripVerticalIcon,\n StickyNoteIcon,\n TrashIcon,\n} from '../Icons';\nimport {\n useDragReorder,\n dragIndicatorClasses,\n type UseDragReorderReturn,\n} from '../../hooks/useDragReorder';\nimport { RowActionToolbar, RowIconButton } from '../RowActionToolbar';\nimport { useLiveAnnouncement } from '../../hooks/useLiveAnnouncement';\n\n// =============================================================================\n// Types — shared condition (concern/assertion) model\n// =============================================================================\n\n/** A single coding on a condition assertion (ICD-10 / ICD-11 / SNOMED). */\nexport interface ConditionCoding {\n /** Coding system, e.g. 'ICD-10-CM', 'ICD-11', 'SNOMED' */\n system: 'ICD-10-CM' | 'ICD-11' | 'SNOMED' | string;\n code: string;\n display?: string;\n /** Which coding is authoritative for this assertion */\n primary?: boolean;\n /** Provenance when derived via a crosswalk (e.g. SNOMED→ICD-10 map) */\n mappedFrom?: string;\n}\n\n/** Longitudinal status of the concern (the stable problem thread). */\nexport type ConcernStatus =\n | 'active'\n | 'recurrence'\n | 'relapse'\n | 'inactive'\n | 'remission'\n | 'resolved';\n\n/** FHIR-aligned verification status of an assertion. */\nexport type VerificationStatus =\n | 'unconfirmed'\n | 'provisional'\n | 'differential'\n | 'confirmed'\n | 'refuted'\n | 'entered-in-error';\n\n/** Why an assertion superseded its predecessor. */\nexport type AssertionChangeType =\n | 'refinement'\n | 'revision'\n | 'progression'\n | 'reattribution';\n\n// ---- Uncertainty (mirrors §4 of the design doc) ----\n\n/** Three-state flag for an optional field: confident / uncertain / explicitly unknown. */\nexport interface FieldUncertainty {\n /** false = explicitly unknown (\"asked; patient doesn't know\") — distinct from untouched */\n known: boolean;\n /** Why the value is absent (~ FHIR data-absent-reason) */\n reason?: 'asked-unknown' | 'not-asked' | 'masked' | 'unavailable';\n /** Softness of a value that IS present */\n confidence?: 'low' | 'medium' | 'high';\n note?: string;\n}\n\n/** Condition fields that can carry per-field uncertainty. */\nexport type UncertainConditionField =\n | 'coding'\n | 'onset'\n | 'severity'\n | 'laterality'\n | 'bodySite';\n\n/** First-class uncertainty block for a condition assertion. */\nexport interface Uncertainty {\n overall?: 'confirmed' | 'low' | 'medium' | 'high';\n fields?: Partial<Record<UncertainConditionField, FieldUncertainty>>;\n}\n\n/** A time-stamped, coded characterization of a concern. */\nexport interface ConditionAssertion {\n id: string;\n /** Display date the assertion was made, e.g. \"2023-06-14\" */\n date: string;\n /** Free-text condition name — the only hard-required clinical field */\n text: string;\n coding?: ConditionCoding[];\n verificationStatus: VerificationStatus;\n /** How this assertion relates to the one it supersedes */\n changeType?: AssertionChangeType;\n /** Id of the assertion this one supersedes */\n supersedes?: string;\n severity?: 'mild' | 'moderate' | 'severe';\n /** Onset — exact date and/or fuzzy human string (\"since her twenties\") */\n onset?: { date?: string; fuzzy?: string };\n /** First-class uncertainty (§4 of the design doc) */\n uncertainty?: Uncertainty;\n note?: string;\n}\n\n/** Relationship between two concerns. */\nexport interface ConcernRelationship {\n type:\n | 'caused-by'\n | 'evolved-from'\n | 'differential-sibling'\n | 'complication-of';\n /** concernId of the related concern */\n concernId: string;\n /** Display name of the related concern */\n display?: string;\n}\n\n/** A quick, dated progress note about a concern — lighter than an assertion. */\nexport interface ConditionObservation {\n id: string;\n /** Display date, e.g. \"2026-07-03\" */\n date: string;\n text: string;\n author?: string;\n}\n\n/**\n * A stable problem thread. The concernId is the durable identity that orders\n * and encounters reference; assertions carry the evolving codes.\n */\nexport interface ConditionConcern {\n concernId: string;\n clinicalStatus: ConcernStatus;\n /** Ordered oldest → newest; the last non-refuted assertion is current */\n assertions: ConditionAssertion[];\n /** Quick progress notes over time (newest last) */\n observations?: ConditionObservation[];\n relationships?: ConcernRelationship[];\n /** Where the concern came from */\n source?:\n | 'ehrProblemList'\n | 'patientReported'\n | 'manuallyAdded'\n | 'claimsHistory';\n}\n\n/** Row actions on a concern. */\nexport type ProblemListAction =\n | 'open'\n | 'observe'\n | 'refine'\n | 'revise'\n | 'resolve'\n | 'relate'\n | 'remove'\n | 'move-up'\n | 'move-down';\n\nexport interface ProblemListProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'className' | 'title'\n> {\n /** Patient-level concerns (controlled) */\n concerns: ConditionConcern[];\n /** Header title (pass null to hide) */\n title?: string | null;\n /** Called when a row action is clicked */\n onAction?: (concern: ConditionConcern, action: ProblemListAction) => void;\n /** Called when a new problem is added via the capture-first input */\n onAddProblem?: (text: string) => void;\n /** Inline coded add search (e.g. a CodeLookup) rendered in the add section */\n addSearch?: React.ReactNode;\n /** Called when the \"Add\" pill is clicked (omit to hide; opens the host's detailed editor) */\n onAdd?: () => void;\n /**\n * Called with the full ordered list of concernIds after a move — via drag\n * and drop, the move buttons, or Alt+Arrow keys. Enables reordering. The\n * component renders concerns in props order — persist the ids wherever the\n * encounter/patient object lives and feed them back in.\n */\n onReorder?: (concernIds: string[]) => void;\n /** Which row actions to show (default: all except 'remove') */\n actions?: ProblemListAction[];\n /** Show row actions in flow, always visible, instead of the hover-reveal overlay */\n inlineActions?: boolean;\n /** Hide all action buttons (display only) */\n readOnly?: boolean;\n /** Message shown when there are no concerns */\n emptyMessage?: string;\n /** Additional CSS classes */\n className?: string;\n /** Test ID for testing */\n 'data-testid'?: string;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst GROUP_ORDER: { key: string; label: string; statuses: ConcernStatus[] }[] =\n [\n {\n key: 'active',\n label: 'Active',\n statuses: ['active', 'recurrence', 'relapse'],\n },\n { key: 'inactive', label: 'Inactive', statuses: ['inactive', 'remission'] },\n { key: 'resolved', label: 'Resolved', statuses: ['resolved'] },\n ];\n\n/**\n * Grouping key for a concern. Unconfirmed concerns (current assertion not yet\n * verified) live in their own group, separate from Active / Resolved.\n */\nexport function concernGroupKey(concern: ConditionConcern): string {\n if (currentAssertion(concern)?.verificationStatus === 'unconfirmed') {\n return 'unconfirmed';\n }\n return (\n GROUP_ORDER.find((g) => g.statuses.includes(concern.clinicalStatus))?.key ??\n 'active'\n );\n}\n\nexport const CONCERN_STATUS_LABELS: Record<ConcernStatus, string> = {\n active: 'Active',\n recurrence: 'Recurrence',\n relapse: 'Relapse',\n inactive: 'Inactive',\n remission: 'Remission',\n resolved: 'Resolved',\n};\n\nexport const CHANGE_TYPE_LABELS: Record<AssertionChangeType, string> = {\n refinement: 'Refined',\n revision: 'Revised',\n progression: 'Progressed',\n reattribution: 'Re-attributed',\n};\n\nconst DEFAULT_ACTIONS: ProblemListAction[] = [\n 'open',\n 'observe',\n 'refine',\n 'revise',\n 'resolve',\n 'relate',\n 'move-up',\n 'move-down',\n];\n\nconst ACTION_META: Record<\n ProblemListAction,\n { label: string; icon: React.ComponentType<{ size?: number | string }> }\n> = {\n open: { label: 'Open', icon: ExternalLinkIcon },\n observe: { label: 'Add observation (progress note)', icon: StickyNoteIcon },\n refine: { label: 'Refine (more specific)', icon: PencilIcon },\n revise: { label: 'Revise (prior was wrong)', icon: RefreshIcon },\n resolve: { label: 'Resolve', icon: CheckCircleIcon },\n relate: { label: 'Relate to another problem', icon: LinkIcon },\n remove: { label: 'Delete', icon: TrashIcon },\n 'move-up': { label: 'Move up (Alt+↑)', icon: ChevronUpIcon },\n 'move-down': { label: 'Move down (Alt+↓)', icon: ChevronDownIcon },\n};\n\nconst VERIFICATION_BADGE: Record<\n VerificationStatus,\n {\n label: string;\n variant: 'default' | 'secondary' | 'success' | 'warning' | 'outline';\n }\n> = {\n unconfirmed: { label: 'Unconfirmed', variant: 'outline' },\n provisional: { label: 'Provisional', variant: 'warning' },\n differential: { label: 'Differential', variant: 'warning' },\n confirmed: { label: 'Confirmed', variant: 'success' },\n refuted: { label: 'Refuted', variant: 'secondary' },\n 'entered-in-error': { label: 'Entered in error', variant: 'secondary' },\n};\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/** The current (last non-refuted, non-error) assertion of a concern. */\nexport function currentAssertion(\n concern: ConditionConcern\n): ConditionAssertion | undefined {\n for (let i = concern.assertions.length - 1; i >= 0; i--) {\n const a = concern.assertions[i];\n if (\n a.verificationStatus !== 'refuted' &&\n a.verificationStatus !== 'entered-in-error'\n ) {\n return a;\n }\n }\n return concern.assertions[concern.assertions.length - 1];\n}\n\nconst UNCERTAIN_FIELD_LABELS: Record<UncertainConditionField, string> = {\n coding: 'Coding',\n onset: 'Onset',\n severity: 'Severity',\n laterality: 'Laterality',\n bodySite: 'Body site',\n};\n\nfunction describeFieldUncertainty(\n field: UncertainConditionField,\n f: FieldUncertainty,\n m: MessageTranslator\n): string {\n const label = UNCERTAIN_FIELD_LABELS[field];\n if (!f.known) {\n const reason =\n f.reason === 'asked-unknown'\n ? 'asked — unknown'\n : (f.reason ?? 'unknown').replace(/-/g, ' ');\n return `${m(label)}: ${m(reason)}${f.note ? ` (${f.note})` : ''}`;\n }\n return `${m(label)}: ${m('{confidence} confidence', {\n confidence: m(f.confidence ?? 'uncertain'),\n })}${f.note ? ` (${f.note})` : ''}`;\n}\n\n// =============================================================================\n// Sub-components\n// =============================================================================\n\n/**\n * Parenthetical coding display. Clinicians don't need chip noise: inline we\n * show only ICD-10/ICD-11 codes, unlabeled (the code format is obvious), and\n * SNOMED stays out of the way. The full coding background — every system,\n * display name, and crosswalk provenance — lives in the tooltip.\n */\nexport function CodingChips({ coding }: { coding?: ConditionCoding[] }) {\n const m = useMessages();\n if (!coding?.length) return null;\n const icd = coding.filter((c) => c.system.startsWith('ICD'));\n const inline = icd.length > 0 ? icd : coding.filter((c) => c.primary);\n const label = inline.map((c) => c.code).join(', ');\n return (\n <Tooltip\n content={\n <span className=\"flex flex-col gap-0.5\">\n {coding.map((c) => (\n <span key={`${c.system}:${c.code}`}>\n {c.system} {c.code}\n {c.display ? ` — ${c.display}` : ''}\n {c.primary ? m(' · primary') : ''}\n {c.mappedFrom\n ? m(' · mapped from {source}', { source: c.mappedFrom })\n : ''}\n </span>\n ))}\n </span>\n }\n >\n {/* focusable so the coding provenance is reachable by keyboard */}\n <span\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n tabIndex={0}\n className=\"text-muted-foreground focus-visible:ring-ring rounded text-xs whitespace-nowrap focus-visible:ring-2 focus-visible:outline-none\"\n >\n ({label || m('coded')})\n </span>\n </Tooltip>\n );\n}\n\n/**\n * Full concern background for a hover/long-press tooltip: assertion history,\n * coding background, and recent observations.\n */\nexport function concernHistoryContent(\n concern: ConditionConcern,\n m: MessageTranslator = (message) => message\n): React.ReactNode {\n return (\n <span className=\"flex max-w-xs flex-col gap-1\">\n <span className=\"font-semibold\">{m('History')}</span>\n {[...concern.assertions].reverse().map((a) => (\n <span key={a.id}>\n {a.date} — {a.text}\n {a.changeType\n ? ` (${m(CHANGE_TYPE_LABELS[a.changeType]).toLocaleLowerCase()})`\n : ''}\n {a.verificationStatus === 'refuted'\n ? ` — ${m('Refuted').toLocaleLowerCase()}`\n : ''}\n </span>\n ))}\n {concern.observations && concern.observations.length > 0 && (\n <>\n <span className=\"mt-1 font-semibold\">{m('Observations')}</span>\n {[...concern.observations]\n .reverse()\n .slice(0, 3)\n .map((o) => (\n <span key={o.id}>\n {o.date} — {o.text}\n </span>\n ))}\n </>\n )}\n {(currentAssertion(concern)?.coding?.length ?? 0) > 0 && (\n <>\n <span className=\"mt-1 font-semibold\">{m('Coding')}</span>\n {currentAssertion(concern)!.coding!.map((c) => (\n <span key={`${c.system}:${c.code}`}>\n {c.system} {c.code}\n {c.display ? ` — ${c.display}` : ''}\n </span>\n ))}\n </>\n )}\n </span>\n );\n}\n\n/** Badge summarizing an assertion's uncertainty block (§4 of the design doc). */\nexport function UncertaintyBadge({\n uncertainty,\n}: {\n uncertainty?: Uncertainty;\n}) {\n const m = useMessages();\n if (!uncertainty) return null;\n const fieldEntries = Object.entries(uncertainty.fields ?? {}) as Array<\n [UncertainConditionField, FieldUncertainty]\n >;\n const overall =\n uncertainty.overall && uncertainty.overall !== 'confirmed'\n ? uncertainty.overall\n : null;\n if (!overall && fieldEntries.length === 0) return null;\n const lines = [\n ...(overall\n ? [m('Overall certainty: {certainty}', { certainty: m(overall) })]\n : []),\n ...fieldEntries.map(([field, f]) => describeFieldUncertainty(field, f, m)),\n ];\n return (\n <Tooltip content={lines.join(' · ')}>\n <Badge variant=\"warning\" size=\"sm\" className=\"gap-1\">\n <HelpCircleIcon size={10} />\n {overall\n ? m('{certainty} certainty', { certainty: m(overall) })\n : m('{count} uncertain', { count: fieldEntries.length })}\n </Badge>\n </Tooltip>\n );\n}\n\nfunction AssertionTimeline({ concern }: { concern: ConditionConcern }) {\n const m = useMessages();\n const items = [...concern.assertions].reverse(); // newest first\n return (\n <ol\n aria-label={m('Assertion history')}\n className=\"border-border ms-1.5 mt-2 space-y-2 border-s ps-4\"\n >\n {items.map((a) => {\n const refuted =\n a.verificationStatus === 'refuted' ||\n a.verificationStatus === 'entered-in-error';\n const verification = VERIFICATION_BADGE[a.verificationStatus];\n return (\n <li key={a.id} className=\"relative text-sm\">\n <span\n aria-hidden\n className=\"bg-border absolute -start-5 top-1.5 h-2 w-2 rounded-full\"\n />\n <span className=\"flex flex-wrap items-center gap-x-2 gap-y-1\">\n <span className=\"text-muted-foreground text-xs tabular-nums\">\n {a.date}\n </span>\n <span\n className={cn(\n 'text-foreground font-medium',\n refuted && 'text-muted-foreground line-through'\n )}\n >\n {a.text}\n </span>\n {a.changeType && (\n <Badge variant=\"secondary\" size=\"sm\">\n {m(CHANGE_TYPE_LABELS[a.changeType])}\n </Badge>\n )}\n <Badge variant={verification.variant} size=\"sm\">\n {m(verification.label)}\n </Badge>\n <UncertaintyBadge uncertainty={a.uncertainty} />\n <CodingChips coding={a.coding} />\n </span>\n {a.note && (\n <p className=\"text-muted-foreground mt-0.5 text-xs\">{a.note}</p>\n )}\n </li>\n );\n })}\n </ol>\n );\n}\n\nfunction ConcernRow({\n concern,\n actions,\n inlineActions,\n readOnly,\n canReorder,\n drag,\n onAction,\n}: {\n concern: ConditionConcern;\n actions: ProblemListAction[];\n inlineActions: boolean;\n readOnly: boolean;\n canReorder: boolean;\n drag: UseDragReorderReturn;\n onAction?: (concern: ConditionConcern, action: ProblemListAction) => void;\n}) {\n const m = useMessages();\n const [expanded, setExpanded] = React.useState(false);\n const current = currentAssertion(concern);\n const hasHistory = concern.assertions.length > 1;\n\n const visibleActions = actions.filter(\n (a) => canReorder || (a !== 'move-up' && a !== 'move-down')\n );\n\n const handleRowKeyDown = (e: React.KeyboardEvent<HTMLElement>) => {\n if (e.target !== e.currentTarget) return;\n if (e.altKey && (e.key === 'ArrowUp' || e.key === 'ArrowDown')) {\n if (!canReorder) return;\n e.preventDefault();\n onAction?.(concern, e.key === 'ArrowUp' ? 'move-up' : 'move-down');\n } else if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n // Roving focus between rows\n e.preventDefault();\n const list = e.currentTarget.closest('ul');\n if (!list) return;\n const rows = Array.from(\n list.querySelectorAll<HTMLElement>('li[data-concern-id]')\n );\n const i = rows.indexOf(e.currentTarget as HTMLElement);\n rows[\n e.key === 'ArrowUp'\n ? Math.max(0, i - 1)\n : Math.min(rows.length - 1, i + 1)\n ]?.focus();\n } else if ((e.key === 'Enter' || e.key === ' ') && hasHistory) {\n e.preventDefault();\n setExpanded((v) => !v);\n }\n };\n\n if (!current) return null;\n\n return (\n // Roving-focus row (WAI-ARIA listbox-like keyboard pattern): the row is a\n // legitimate focus stop so ↑/↓ navigate rows, Enter toggles history, and\n // Alt+↑/↓ reorders — required for 508 keyboard operability.\n /* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */\n <li\n data-slot=\"clinical-list-row\"\n data-concern-id={concern.concernId}\n tabIndex={0}\n onKeyDown={handleRowKeyDown}\n {...drag.rowProps(concern.concernId)}\n aria-label={[\n `${current.text}.`,\n hasHistory ? m('Press Enter to toggle history.') : '',\n canReorder ? m('Alt plus arrow keys to reorder.') : '',\n ]\n .filter(Boolean)\n .join(' ')}\n className={cn(\n 'group border-border/60 relative border-b px-1 py-2',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none',\n drag.enabled && 'cursor-grab active:cursor-grabbing',\n dragIndicatorClasses(drag, concern.concernId)\n )}\n >\n {/* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */}\n <div className=\"flex min-h-9 flex-wrap items-center gap-x-2 gap-y-1\">\n {drag.enabled ? (\n <GripVerticalIcon\n size={14}\n aria-hidden\n className=\"text-muted-foreground/50 shrink-0\"\n />\n ) : (\n <span className=\"text-muted-foreground/60 select-none\">•</span>\n )}\n {/* Hover (or long-press on touch) the name for the complete background:\n assertion history, observations, and coding provenance. */}\n <Tooltip content={concernHistoryContent(concern, m)}>\n <span className=\"text-foreground font-medium\">{current.text}</span>\n </Tooltip>\n <CodingChips coding={current.coding} />\n {/* 'unconfirmed' is conveyed by the Unconfirmed group header */}\n {current.verificationStatus !== 'confirmed' &&\n current.verificationStatus !== 'unconfirmed' && (\n <Badge\n variant={VERIFICATION_BADGE[current.verificationStatus].variant}\n size=\"sm\"\n >\n {m(VERIFICATION_BADGE[current.verificationStatus].label)}\n </Badge>\n )}\n <UncertaintyBadge uncertainty={current.uncertainty} />\n {concern.relationships?.map((r) => (\n <Badge key={`${r.type}:${r.concernId}`} variant=\"outline\" size=\"sm\">\n <LinkIcon size={10} className=\"me-1\" />\n {m(r.type.replace(/-/g, ' '))}\n {r.display ? `: ${r.display}` : ''}\n </Badge>\n ))}\n {hasHistory && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setExpanded((v) => !v)}\n aria-expanded={expanded}\n leftIcon={<HistoryIcon size={12} />}\n rightIcon={\n expanded ? (\n <ChevronUpIcon size={12} />\n ) : (\n <ChevronDownIcon size={12} />\n )\n }\n className=\"text-muted-foreground h-auto px-1.5 py-0.5 text-xs\"\n >\n {m('{count} assertions', { count: concern.assertions.length })}\n </Button>\n )}\n\n {!readOnly && (\n <RowActionToolbar\n label={m('Actions for {name}', { name: current.text })}\n align=\"top\"\n reveal={inlineActions ? 'always' : 'hover'}\n >\n {visibleActions.map((action) => (\n <RowIconButton\n key={action}\n label={m(ACTION_META[action].label)}\n icon={ACTION_META[action].icon}\n onClick={() => onAction?.(concern, action)}\n />\n ))}\n </RowActionToolbar>\n )}\n </div>\n\n {expanded && (\n <>\n <AssertionTimeline concern={concern} />\n {concern.observations && concern.observations.length > 0 && (\n <div className=\"ms-1.5 mt-2 ps-4\">\n <h5 className=\"text-muted-foreground text-xs font-semibold tracking-wide uppercase\">\n {m('Observations')}\n </h5>\n <ol aria-label={m('Observations')} className=\"mt-1 space-y-1\">\n {[...concern.observations].reverse().map((o) => (\n <li key={o.id} className=\"flex flex-wrap gap-x-2 text-sm\">\n <span className=\"text-muted-foreground text-xs tabular-nums\">\n {o.date}\n </span>\n <span className=\"text-foreground\">{o.text}</span>\n {o.author && (\n <span className=\"text-muted-foreground text-xs\">\n — {o.author}\n </span>\n )}\n </li>\n ))}\n </ol>\n </div>\n )}\n </>\n )}\n </li>\n );\n}\n\n// =============================================================================\n// ProblemList\n// =============================================================================\n\n/**\n * Patient-level problem list built on the concern/assertion model: each row is\n * a stable ConditionConcern whose coded characterization evolves through an\n * assertion history (refinement / revision / progression). Rows expand to show\n * the assertion timeline; refuted assertions render struck-through.\n *\n * Controlled component: concerns come in via props; every user interaction is\n * reported through callbacks.\n *\n * @example\n * ```tsx\n * <ProblemList\n * concerns={concerns}\n * onAction={(concern, action) => handleAction(concern, action)}\n * onAddProblem={(text) => addConcern(text)}\n * />\n * ```\n */\nexport const ProblemList = React.forwardRef<HTMLDivElement, ProblemListProps>(\n (\n {\n concerns,\n title = 'Problem list',\n onAction,\n onAddProblem,\n addSearch,\n onAdd,\n onReorder,\n actions = DEFAULT_ACTIONS,\n inlineActions = false,\n readOnly = false,\n emptyMessage = 'No problems recorded.',\n className,\n 'data-testid': dataTestId,\n ...props\n },\n ref\n ) => {\n const m = useMessages();\n const [draft, setDraft] = React.useState('');\n // clears-then-sets so repeated identical messages re-announce\n const [announcement, setAnnouncement] = useLiveAnnouncement();\n\n const submitDraft = () => {\n const text = draft.trim();\n if (!text) return;\n onAddProblem?.(text);\n setDraft('');\n };\n\n /** Swap with the adjacent concern in the same group, then report the full order. */\n const moveConcern = React.useCallback(\n (concern: ConditionConcern, dir: -1 | 1) => {\n if (!onReorder || readOnly) return;\n const groupKey = concernGroupKey(concern);\n const ids = concerns.map((c) => c.concernId);\n const from = ids.indexOf(concern.concernId);\n // nearest neighbor in the same group\n let to = from + dir;\n while (\n to >= 0 &&\n to < concerns.length &&\n concernGroupKey(concerns[to]) !== groupKey\n ) {\n to += dir;\n }\n if (to < 0 || to >= concerns.length) return;\n [ids[from], ids[to]] = [ids[to], ids[from]];\n const current = currentAssertion(concern);\n setAnnouncement(\n m(dir === -1 ? '{name} moved up' : '{name} moved down', {\n name: current?.text ?? concern.concernId,\n })\n );\n onReorder(ids);\n },\n [concerns, onReorder, readOnly, setAnnouncement, m]\n );\n\n const handleAction = React.useCallback(\n (concern: ConditionConcern, action: ProblemListAction) => {\n if (action === 'move-up') moveConcern(concern, -1);\n else if (action === 'move-down') moveConcern(concern, 1);\n else onAction?.(concern, action);\n },\n [moveConcern, onAction]\n );\n\n // Drag & drop reordering, restricted to the same group (a cross-group\n // drop would silently imply a status change). Precomputed map — dragover\n // fires too frequently for a linear concern scan per event.\n const groupById = React.useMemo(\n () =>\n new Map(\n concerns.map((c) => [c.concernId, concernGroupKey(c)] as const)\n ),\n [concerns]\n );\n const groupOf = React.useCallback(\n (id: string) => groupById.get(id),\n [groupById]\n );\n const drag = useDragReorder({\n ids: concerns.map((c) => c.concernId),\n onReorder:\n readOnly || !onReorder\n ? undefined\n : (newIds) => {\n // announce pointer drops too, not just keyboard moves\n setAnnouncement(m('Problem list reordered'));\n onReorder(newIds);\n },\n canDropOn: (dragged, target) => groupOf(dragged) === groupOf(target),\n });\n\n // Unconfirmed concerns get their own list, ahead of Active / Resolved.\n const groups = [\n {\n key: 'unconfirmed',\n label: 'Unconfirmed',\n items: concerns.filter((c) => concernGroupKey(c) === 'unconfirmed'),\n },\n ...GROUP_ORDER.map(({ key, label }) => ({\n key,\n label,\n items: concerns.filter((c) => concernGroupKey(c) === key),\n })),\n // Active stays visible as the empty state only when nothing is recorded\n // at all — an empty Active section next to populated groups would\n // misleadingly read \"No problems recorded\".\n ].filter(\n (g) => g.items.length > 0 || (g.key === 'active' && concerns.length === 0)\n );\n\n return (\n <Card\n ref={ref}\n padding=\"none\"\n className={cn('w-full', className)}\n data-testid={dataTestId}\n {...props}\n >\n {title !== null && (\n <CardHeader className=\"border-border bg-muted/50 border-b px-4 py-3\">\n <h3 className=\"text-foreground text-sm font-semibold tracking-wide uppercase\">\n {m(title)}\n </h3>\n </CardHeader>\n )}\n\n <CardContent className=\"space-y-6 px-4 py-4\">\n {groups.map(({ key, label, items }) => (\n <section key={key} aria-label={m(label)}>\n <h4\n data-slot=\"clinical-list-heading\"\n className=\"border-border text-foreground border-b pb-1 text-sm font-semibold tracking-wide uppercase\"\n >\n {m(label)}\n </h4>\n {items.length > 0 ? (\n <ul className=\"mt-1\">\n {items.map((concern) => (\n <ConcernRow\n key={concern.concernId}\n concern={concern}\n actions={actions}\n inlineActions={inlineActions}\n readOnly={readOnly}\n canReorder={drag.enabled}\n drag={drag}\n onAction={handleAction}\n />\n ))}\n </ul>\n ) : (\n <p className=\"text-muted-foreground mt-2 text-sm\">\n {m(emptyMessage)}\n </p>\n )}\n </section>\n ))}\n\n {!readOnly && (addSearch || onAddProblem || onAdd) && (\n <div className=\"space-y-2\">\n <span className=\"text-muted-foreground text-xs font-semibold tracking-wide uppercase\">\n {m('Add problem')}\n </span>\n {addSearch}\n {onAddProblem && (\n <div className=\"flex items-center gap-1.5\">\n <input\n type=\"text\"\n data-slot=\"input\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') submitDraft();\n }}\n placeholder={m('Add problem (name is enough)…')}\n aria-label={m('Add problem')}\n className={cn(\n 'border-border bg-background text-foreground placeholder:text-muted-foreground',\n 'h-8 flex-1 rounded-md border px-2.5 text-sm',\n 'focus:ring-ring focus:ring-2 focus:outline-none'\n )}\n />\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={submitDraft}\n disabled={!draft.trim()}\n leftIcon={<PlusIcon size={12} />}\n className=\"h-8\"\n >\n {m('Add')}\n </Button>\n </div>\n )}\n {onAdd && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onAdd}\n leftIcon={<PlusIcon size={12} />}\n className=\"h-auto rounded-full px-2.5 py-1 text-xs\"\n >\n {m('Add')}\n </Button>\n )}\n </div>\n )}\n </CardContent>\n\n {/* Reorder announcements for screen readers */}\n <div aria-live=\"polite\" className=\"sr-only\">\n {announcement}\n </div>\n </Card>\n );\n }\n);\n\nProblemList.displayName = 'ProblemList';\n\nexport default ProblemList;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/RowActionToolbar/RowActionToolbar.tsx","../src/components/ProblemList/ProblemList.tsx"],"names":["isRtl","cn","jsx","Tooltip","Button","ExternalLink","StickyNote","Pencil","RefreshCw","CheckCircle","Link","Trash2","ChevronUp","ChevronDown","useMessages","jsxs","Fragment","Badge","HelpCircle","React","dragIndicatorClasses","GripVertical","History","useLiveAnnouncement","useDragReorder","Card","CardHeader","CardContent","Plus"],"mappings":"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","file":"chunk-KQXD6BFO.cjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { isRtl } from '../../hooks/useDirection';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../Button';\nimport { Tooltip } from '../Tooltip';\n\n/**\n * Toolbar / group arrow-key navigation (WAI-ARIA toolbar pattern).\n * Attach to a container's onKeyDown: ←/→ move focus between enabled\n * buttons, Home/End jump to first/last. Horizontal arrows follow the\n * visual direction, so they invert under RTL.\n */\nexport function toolbarKeyNav(e: React.KeyboardEvent<HTMLElement>) {\n if (e.altKey || e.ctrlKey || e.metaKey) return;\n if (!['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(e.key)) return;\n const buttons = Array.from(\n e.currentTarget.querySelectorAll<HTMLButtonElement>(\n 'button:not([disabled])'\n )\n );\n const i = buttons.indexOf(document.activeElement as HTMLButtonElement);\n if (i === -1 || buttons.length === 0) return;\n e.preventDefault();\n e.stopPropagation();\n let key = e.key;\n if (isRtl(e.currentTarget)) {\n if (key === 'ArrowRight') key = 'ArrowLeft';\n else if (key === 'ArrowLeft') key = 'ArrowRight';\n }\n const next =\n key === 'ArrowLeft'\n ? (i - 1 + buttons.length) % buttons.length\n : key === 'ArrowRight'\n ? (i + 1) % buttons.length\n : key === 'Home'\n ? 0\n : buttons.length - 1;\n buttons[next]?.focus();\n}\n\n// Alignment of the floating (fine-pointer) overlay within the row.\nconst ALIGN = {\n /** Vertically centered on the row's right edge (single-line rows). */\n center:\n 'pointer-fine:top-1/2 pointer-fine:end-0 pointer-fine:-translate-y-1/2',\n /** Pinned near the row's top-right corner (multi-line rows). */\n top: 'pointer-fine:top-1.5 pointer-fine:end-1.5',\n} as const;\n\n// Which hover scope reveals the toolbar. Rows nested inside another `group`\n// (e.g. order rows inside an assessed problem) use a named group so hovering\n// the outer block doesn't reveal every nested toolbar. `grid` keys off the\n// datavis (NITRO) table row (`.wcdv-tr`) for toolbars rendered into grid\n// cells via `formatCell`.\nconst REVEAL = {\n row: cn(\n 'group-hover:pointer-events-auto group-hover:opacity-100',\n 'group-focus-within:pointer-events-auto group-focus-within:opacity-100',\n 'group-focus:pointer-events-auto group-focus:opacity-100'\n ),\n order: cn(\n 'group-hover/order:pointer-events-auto group-hover/order:opacity-100',\n 'group-focus-within/order:pointer-events-auto group-focus-within/order:opacity-100',\n 'group-focus/order:pointer-events-auto group-focus/order:opacity-100'\n ),\n grid: cn(\n '[.wcdv-tr:hover_&]:pointer-events-auto [.wcdv-tr:hover_&]:opacity-100',\n '[.wcdv-tr:focus-within_&]:pointer-events-auto [.wcdv-tr:focus-within_&]:opacity-100'\n ),\n} as const;\n\nexport interface RowActionToolbarProps {\n /** Accessible name, e.g. `Actions for penicillin`. */\n label: string;\n /** Overlay alignment on fine-pointer devices. @default 'center' */\n align?: keyof typeof ALIGN;\n /**\n * Hover scope for the reveal. Use `'order'` when the row is a\n * `group/order` nested inside another `group`; use `'grid'` inside a\n * datavis (NITRO) grid cell — the toolbar then stays in flow (the cell\n * reserves its space) and reveals when the `.wcdv-tr` row is hovered.\n * @default 'row'\n */\n group?: keyof typeof REVEAL;\n /**\n * `'hover'` floats the toolbar over the row on fine-pointer devices and\n * reveals it on hover/focus; `'always'` keeps it in flow at the end of the\n * row and always visible on every pointer type.\n * @default 'hover'\n */\n reveal?: 'hover' | 'always';\n className?: string;\n children: React.ReactNode;\n}\n\n/**\n * Per-row action toolbar for clinical lists.\n *\n * On hover-capable (fine pointer) devices it floats over the row's right\n * edge as a card-styled overlay, hidden until the row is hovered or\n * keyboard-focused. Touch devices can't hover, so the toolbar stays in\n * flow at the end of the row (`ms-auto`) and is always visible.\n *\n * Implements WAI-ARIA toolbar arrow-key navigation. The parent row must be\n * `relative` and carry the matching `group` (or `group/order`) class.\n */\nexport function RowActionToolbar({\n label,\n align = 'center',\n group = 'row',\n reveal = 'hover',\n className,\n children,\n}: RowActionToolbarProps) {\n return (\n <div\n role=\"toolbar\"\n aria-label={label}\n onKeyDown={toolbarKeyNav}\n className={cn(\n 'z-10 ms-auto flex items-center gap-0.5',\n reveal === 'hover' && [\n 'transition-opacity',\n // Inside a grid cell the column already reserves the space, so the\n // toolbar stays in flow — no absolute overlay. It keeps the card\n // chrome, though: pair with a `sticky end-0` actions column and it\n // floats over scrolled-under content at the grid's right edge.\n group !== 'grid' && [\n 'pointer-fine:absolute',\n ALIGN[align],\n 'pointer-fine:bg-card pointer-fine:border-border pointer-fine:rounded-md pointer-fine:border pointer-fine:p-0.5 pointer-fine:shadow-sm',\n ],\n group === 'grid' &&\n 'bg-card border-border rounded-md border p-0.5 shadow-sm',\n 'pointer-fine:pointer-events-none pointer-fine:opacity-0',\n REVEAL[group],\n 'focus-within:pointer-events-auto focus-within:opacity-100',\n ],\n className\n )}\n >\n {children}\n </div>\n );\n}\n\nexport interface RowIconButtonProps {\n label: string;\n icon: React.ComponentType<{ size?: number | string }>;\n onClick: () => void;\n /** Toggle-button state (renders `aria-pressed` + tinted background). */\n active?: boolean;\n /** Disclosure state and the id of the controlled region. */\n expanded?: boolean;\n controls?: string;\n /** `md` = 32px button / 16px icon; `sm` = 28px / 14px. @default 'md' */\n size?: 'md' | 'sm';\n}\n\n/** Tooltip-labeled ghost icon button for `RowActionToolbar`. */\nexport function RowIconButton({\n label,\n icon: Icon,\n onClick,\n active,\n expanded,\n controls,\n size = 'md',\n}: RowIconButtonProps) {\n return (\n <Tooltip content={label}>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={label}\n aria-pressed={active}\n aria-expanded={expanded}\n aria-controls={controls}\n onClick={(e) => {\n e.stopPropagation();\n onClick();\n }}\n className={cn(\n size === 'sm' ? 'h-7 w-7' : 'h-8 w-8',\n 'shrink-0',\n (active || expanded) &&\n 'bg-primary-50 text-primary-700 dark:bg-primary-950 dark:text-primary-400'\n )}\n >\n <Icon size={size === 'sm' ? 14 : 16} />\n </Button>\n </Tooltip>\n );\n}\n","'use client';\n\nimport { useMessages, type MessageTranslator } from '../../utils/messages';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Badge } from '../Badge/Badge';\nimport { Button } from '../Button';\nimport { Tooltip } from '../Tooltip';\nimport { Card, CardHeader, CardContent } from '../Card/Card';\nimport {\n PencilIcon,\n RefreshIcon,\n CheckCircleIcon,\n LinkIcon,\n ExternalLinkIcon,\n ChevronDownIcon,\n ChevronUpIcon,\n PlusIcon,\n HistoryIcon,\n HelpCircleIcon,\n GripVerticalIcon,\n StickyNoteIcon,\n TrashIcon,\n} from '../Icons';\nimport {\n useDragReorder,\n dragIndicatorClasses,\n type UseDragReorderReturn,\n} from '../../hooks/useDragReorder';\nimport { RowActionToolbar, RowIconButton } from '../RowActionToolbar';\nimport { useLiveAnnouncement } from '../../hooks/useLiveAnnouncement';\n\n// =============================================================================\n// Types — shared condition (concern/assertion) model\n// =============================================================================\n\n/** A single coding on a condition assertion (ICD-10 / ICD-11 / SNOMED). */\nexport interface ConditionCoding {\n /** Coding system, e.g. 'ICD-10-CM', 'ICD-11', 'SNOMED' */\n system: 'ICD-10-CM' | 'ICD-11' | 'SNOMED' | string;\n code: string;\n display?: string;\n /** Which coding is authoritative for this assertion */\n primary?: boolean;\n /** Provenance when derived via a crosswalk (e.g. SNOMED→ICD-10 map) */\n mappedFrom?: string;\n}\n\n/** Longitudinal status of the concern (the stable problem thread). */\nexport type ConcernStatus =\n | 'active'\n | 'recurrence'\n | 'relapse'\n | 'inactive'\n | 'remission'\n | 'resolved';\n\n/** FHIR-aligned verification status of an assertion. */\nexport type VerificationStatus =\n | 'unconfirmed'\n | 'provisional'\n | 'differential'\n | 'confirmed'\n | 'refuted'\n | 'entered-in-error';\n\n/** Why an assertion superseded its predecessor. */\nexport type AssertionChangeType =\n | 'refinement'\n | 'revision'\n | 'progression'\n | 'reattribution';\n\n// ---- Uncertainty (mirrors §4 of the design doc) ----\n\n/** Three-state flag for an optional field: confident / uncertain / explicitly unknown. */\nexport interface FieldUncertainty {\n /** false = explicitly unknown (\"asked; patient doesn't know\") — distinct from untouched */\n known: boolean;\n /** Why the value is absent (~ FHIR data-absent-reason) */\n reason?: 'asked-unknown' | 'not-asked' | 'masked' | 'unavailable';\n /** Softness of a value that IS present */\n confidence?: 'low' | 'medium' | 'high';\n note?: string;\n}\n\n/** Condition fields that can carry per-field uncertainty. */\nexport type UncertainConditionField =\n | 'coding'\n | 'onset'\n | 'severity'\n | 'laterality'\n | 'bodySite';\n\n/** First-class uncertainty block for a condition assertion. */\nexport interface Uncertainty {\n overall?: 'confirmed' | 'low' | 'medium' | 'high';\n fields?: Partial<Record<UncertainConditionField, FieldUncertainty>>;\n}\n\n/** A time-stamped, coded characterization of a concern. */\nexport interface ConditionAssertion {\n id: string;\n /** Display date the assertion was made, e.g. \"2023-06-14\" */\n date: string;\n /** Free-text condition name — the only hard-required clinical field */\n text: string;\n coding?: ConditionCoding[];\n verificationStatus: VerificationStatus;\n /** How this assertion relates to the one it supersedes */\n changeType?: AssertionChangeType;\n /** Id of the assertion this one supersedes */\n supersedes?: string;\n severity?: 'mild' | 'moderate' | 'severe';\n /** Onset — exact date and/or fuzzy human string (\"since her twenties\") */\n onset?: { date?: string; fuzzy?: string };\n /** First-class uncertainty (§4 of the design doc) */\n uncertainty?: Uncertainty;\n note?: string;\n}\n\n/** Relationship between two concerns. */\nexport interface ConcernRelationship {\n type:\n | 'caused-by'\n | 'evolved-from'\n | 'differential-sibling'\n | 'complication-of';\n /** concernId of the related concern */\n concernId: string;\n /** Display name of the related concern */\n display?: string;\n}\n\n/** A quick, dated progress note about a concern — lighter than an assertion. */\nexport interface ConditionObservation {\n id: string;\n /** Display date, e.g. \"2026-07-03\" */\n date: string;\n text: string;\n author?: string;\n}\n\n/**\n * A stable problem thread. The concernId is the durable identity that orders\n * and encounters reference; assertions carry the evolving codes.\n */\nexport interface ConditionConcern {\n concernId: string;\n clinicalStatus: ConcernStatus;\n /** Ordered oldest → newest; the last non-refuted assertion is current */\n assertions: ConditionAssertion[];\n /** Quick progress notes over time (newest last) */\n observations?: ConditionObservation[];\n relationships?: ConcernRelationship[];\n /** Where the concern came from */\n source?:\n | 'ehrProblemList'\n | 'patientReported'\n | 'manuallyAdded'\n | 'claimsHistory';\n}\n\n/** Row actions on a concern. */\nexport type ProblemListAction =\n | 'open'\n | 'observe'\n | 'refine'\n | 'revise'\n | 'resolve'\n | 'relate'\n | 'remove'\n | 'move-up'\n | 'move-down';\n\nexport interface ProblemListProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'className' | 'title'\n> {\n /** Patient-level concerns (controlled) */\n concerns: ConditionConcern[];\n /** Header title (pass null to hide) */\n title?: string | null;\n /** Called when a row action is clicked */\n onAction?: (concern: ConditionConcern, action: ProblemListAction) => void;\n /** Called when a new problem is added via the capture-first input */\n onAddProblem?: (text: string) => void;\n /** Inline coded add search (e.g. a CodeLookup) rendered in the add section */\n addSearch?: React.ReactNode;\n /** Called when the \"Add\" pill is clicked (omit to hide; opens the host's detailed editor) */\n onAdd?: () => void;\n /**\n * Called with the full ordered list of concernIds after a move — via drag\n * and drop, the move buttons, or Alt+Arrow keys. Enables reordering. The\n * component renders concerns in props order — persist the ids wherever the\n * encounter/patient object lives and feed them back in.\n */\n onReorder?: (concernIds: string[]) => void;\n /** Which row actions to show (default: all except 'remove') */\n actions?: ProblemListAction[];\n /** Show row actions in flow, always visible, instead of the hover-reveal overlay */\n inlineActions?: boolean;\n /** Hide all action buttons (display only) */\n readOnly?: boolean;\n /** Message shown when there are no concerns */\n emptyMessage?: string;\n /** Additional CSS classes */\n className?: string;\n /** Test ID for testing */\n 'data-testid'?: string;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst GROUP_ORDER: { key: string; label: string; statuses: ConcernStatus[] }[] =\n [\n {\n key: 'active',\n label: 'Active',\n statuses: ['active', 'recurrence', 'relapse'],\n },\n { key: 'inactive', label: 'Inactive', statuses: ['inactive', 'remission'] },\n { key: 'resolved', label: 'Resolved', statuses: ['resolved'] },\n ];\n\n/**\n * Grouping key for a concern. Unconfirmed concerns (current assertion not yet\n * verified) live in their own group, separate from Active / Resolved.\n */\nexport function concernGroupKey(concern: ConditionConcern): string {\n if (currentAssertion(concern)?.verificationStatus === 'unconfirmed') {\n return 'unconfirmed';\n }\n return (\n GROUP_ORDER.find((g) => g.statuses.includes(concern.clinicalStatus))?.key ??\n 'active'\n );\n}\n\nexport const CONCERN_STATUS_LABELS: Record<ConcernStatus, string> = {\n active: 'Active',\n recurrence: 'Recurrence',\n relapse: 'Relapse',\n inactive: 'Inactive',\n remission: 'Remission',\n resolved: 'Resolved',\n};\n\nexport const CHANGE_TYPE_LABELS: Record<AssertionChangeType, string> = {\n refinement: 'Refined',\n revision: 'Revised',\n progression: 'Progressed',\n reattribution: 'Re-attributed',\n};\n\nconst DEFAULT_ACTIONS: ProblemListAction[] = [\n 'open',\n 'observe',\n 'refine',\n 'revise',\n 'resolve',\n 'relate',\n 'move-up',\n 'move-down',\n];\n\nconst ACTION_META: Record<\n ProblemListAction,\n { label: string; icon: React.ComponentType<{ size?: number | string }> }\n> = {\n open: { label: 'Open', icon: ExternalLinkIcon },\n observe: { label: 'Add observation (progress note)', icon: StickyNoteIcon },\n refine: { label: 'Refine (more specific)', icon: PencilIcon },\n revise: { label: 'Revise (prior was wrong)', icon: RefreshIcon },\n resolve: { label: 'Resolve', icon: CheckCircleIcon },\n relate: { label: 'Relate to another problem', icon: LinkIcon },\n remove: { label: 'Delete', icon: TrashIcon },\n 'move-up': { label: 'Move up (Alt+↑)', icon: ChevronUpIcon },\n 'move-down': { label: 'Move down (Alt+↓)', icon: ChevronDownIcon },\n};\n\nconst VERIFICATION_BADGE: Record<\n VerificationStatus,\n {\n label: string;\n variant: 'default' | 'secondary' | 'success' | 'warning' | 'outline';\n }\n> = {\n unconfirmed: { label: 'Unconfirmed', variant: 'outline' },\n provisional: { label: 'Provisional', variant: 'warning' },\n differential: { label: 'Differential', variant: 'warning' },\n confirmed: { label: 'Confirmed', variant: 'success' },\n refuted: { label: 'Refuted', variant: 'secondary' },\n 'entered-in-error': { label: 'Entered in error', variant: 'secondary' },\n};\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/** The current (last non-refuted, non-error) assertion of a concern. */\nexport function currentAssertion(\n concern: ConditionConcern\n): ConditionAssertion | undefined {\n for (let i = concern.assertions.length - 1; i >= 0; i--) {\n const a = concern.assertions[i];\n if (\n a.verificationStatus !== 'refuted' &&\n a.verificationStatus !== 'entered-in-error'\n ) {\n return a;\n }\n }\n return concern.assertions[concern.assertions.length - 1];\n}\n\nconst UNCERTAIN_FIELD_LABELS: Record<UncertainConditionField, string> = {\n coding: 'Coding',\n onset: 'Onset',\n severity: 'Severity',\n laterality: 'Laterality',\n bodySite: 'Body site',\n};\n\nfunction describeFieldUncertainty(\n field: UncertainConditionField,\n f: FieldUncertainty,\n m: MessageTranslator\n): string {\n const label = UNCERTAIN_FIELD_LABELS[field];\n if (!f.known) {\n const reason =\n f.reason === 'asked-unknown'\n ? 'asked — unknown'\n : (f.reason ?? 'unknown').replace(/-/g, ' ');\n return `${m(label)}: ${m(reason)}${f.note ? ` (${f.note})` : ''}`;\n }\n return `${m(label)}: ${m('{confidence} confidence', {\n confidence: m(f.confidence ?? 'uncertain'),\n })}${f.note ? ` (${f.note})` : ''}`;\n}\n\n// =============================================================================\n// Sub-components\n// =============================================================================\n\n/**\n * Parenthetical coding display. Clinicians don't need chip noise: inline we\n * show only ICD-10/ICD-11 codes, unlabeled (the code format is obvious), and\n * SNOMED stays out of the way. The full coding background — every system,\n * display name, and crosswalk provenance — lives in the tooltip.\n */\nexport function CodingChips({ coding }: { coding?: ConditionCoding[] }) {\n const m = useMessages();\n if (!coding?.length) return null;\n const icd = coding.filter((c) => c.system.startsWith('ICD'));\n const inline = icd.length > 0 ? icd : coding.filter((c) => c.primary);\n const label = inline.map((c) => c.code).join(', ');\n return (\n <Tooltip\n content={\n <span className=\"flex flex-col gap-0.5\">\n {coding.map((c) => (\n <span key={`${c.system}:${c.code}`}>\n {c.system} {c.code}\n {c.display ? ` — ${c.display}` : ''}\n {c.primary ? m(' · primary') : ''}\n {c.mappedFrom\n ? m(' · mapped from {source}', { source: c.mappedFrom })\n : ''}\n </span>\n ))}\n </span>\n }\n >\n {/* focusable so the coding provenance is reachable by keyboard */}\n <span\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n tabIndex={0}\n className=\"text-muted-foreground focus-visible:ring-ring rounded text-xs whitespace-nowrap focus-visible:ring-2 focus-visible:outline-none\"\n >\n ({label || m('coded')})\n </span>\n </Tooltip>\n );\n}\n\n/**\n * Full concern background for a hover/long-press tooltip: assertion history,\n * coding background, and recent observations.\n */\nexport function concernHistoryContent(\n concern: ConditionConcern,\n m: MessageTranslator = (message) => message\n): React.ReactNode {\n return (\n <span className=\"flex max-w-xs flex-col gap-1\">\n <span className=\"font-semibold\">{m('History')}</span>\n {[...concern.assertions].reverse().map((a) => (\n <span key={a.id}>\n {a.date} — {a.text}\n {a.changeType\n ? ` (${m(CHANGE_TYPE_LABELS[a.changeType]).toLocaleLowerCase()})`\n : ''}\n {a.verificationStatus === 'refuted'\n ? ` — ${m('Refuted').toLocaleLowerCase()}`\n : ''}\n </span>\n ))}\n {concern.observations && concern.observations.length > 0 && (\n <>\n <span className=\"mt-1 font-semibold\">{m('Observations')}</span>\n {[...concern.observations]\n .reverse()\n .slice(0, 3)\n .map((o) => (\n <span key={o.id}>\n {o.date} — {o.text}\n </span>\n ))}\n </>\n )}\n {(currentAssertion(concern)?.coding?.length ?? 0) > 0 && (\n <>\n <span className=\"mt-1 font-semibold\">{m('Coding')}</span>\n {currentAssertion(concern)!.coding!.map((c) => (\n <span key={`${c.system}:${c.code}`}>\n {c.system} {c.code}\n {c.display ? ` — ${c.display}` : ''}\n </span>\n ))}\n </>\n )}\n </span>\n );\n}\n\n/** Badge summarizing an assertion's uncertainty block (§4 of the design doc). */\nexport function UncertaintyBadge({\n uncertainty,\n}: {\n uncertainty?: Uncertainty;\n}) {\n const m = useMessages();\n if (!uncertainty) return null;\n const fieldEntries = Object.entries(uncertainty.fields ?? {}) as Array<\n [UncertainConditionField, FieldUncertainty]\n >;\n const overall =\n uncertainty.overall && uncertainty.overall !== 'confirmed'\n ? uncertainty.overall\n : null;\n if (!overall && fieldEntries.length === 0) return null;\n const lines = [\n ...(overall\n ? [m('Overall certainty: {certainty}', { certainty: m(overall) })]\n : []),\n ...fieldEntries.map(([field, f]) => describeFieldUncertainty(field, f, m)),\n ];\n return (\n <Tooltip content={lines.join(' · ')}>\n <Badge variant=\"warning\" size=\"sm\" className=\"gap-1\">\n <HelpCircleIcon size={10} />\n {overall\n ? m('{certainty} certainty', { certainty: m(overall) })\n : m('{count} uncertain', { count: fieldEntries.length })}\n </Badge>\n </Tooltip>\n );\n}\n\nfunction AssertionTimeline({ concern }: { concern: ConditionConcern }) {\n const m = useMessages();\n const items = [...concern.assertions].reverse(); // newest first\n return (\n <ol\n aria-label={m('Assertion history')}\n className=\"border-border ms-1.5 mt-2 space-y-2 border-s ps-4\"\n >\n {items.map((a) => {\n const refuted =\n a.verificationStatus === 'refuted' ||\n a.verificationStatus === 'entered-in-error';\n const verification = VERIFICATION_BADGE[a.verificationStatus];\n return (\n <li key={a.id} className=\"relative text-sm\">\n <span\n aria-hidden\n className=\"bg-border absolute -start-5 top-1.5 h-2 w-2 rounded-full\"\n />\n <span className=\"flex flex-wrap items-center gap-x-2 gap-y-1\">\n <span className=\"text-muted-foreground text-xs tabular-nums\">\n {a.date}\n </span>\n <span\n className={cn(\n 'text-foreground font-medium',\n refuted && 'text-muted-foreground line-through'\n )}\n >\n {a.text}\n </span>\n {a.changeType && (\n <Badge variant=\"secondary\" size=\"sm\">\n {m(CHANGE_TYPE_LABELS[a.changeType])}\n </Badge>\n )}\n <Badge variant={verification.variant} size=\"sm\">\n {m(verification.label)}\n </Badge>\n <UncertaintyBadge uncertainty={a.uncertainty} />\n <CodingChips coding={a.coding} />\n </span>\n {a.note && (\n <p className=\"text-muted-foreground mt-0.5 text-xs\">{a.note}</p>\n )}\n </li>\n );\n })}\n </ol>\n );\n}\n\nfunction ConcernRow({\n concern,\n actions,\n inlineActions,\n readOnly,\n canReorder,\n drag,\n onAction,\n}: {\n concern: ConditionConcern;\n actions: ProblemListAction[];\n inlineActions: boolean;\n readOnly: boolean;\n canReorder: boolean;\n drag: UseDragReorderReturn;\n onAction?: (concern: ConditionConcern, action: ProblemListAction) => void;\n}) {\n const m = useMessages();\n const [expanded, setExpanded] = React.useState(false);\n const current = currentAssertion(concern);\n const hasHistory = concern.assertions.length > 1;\n\n const visibleActions = actions.filter(\n (a) => canReorder || (a !== 'move-up' && a !== 'move-down')\n );\n\n const handleRowKeyDown = (e: React.KeyboardEvent<HTMLElement>) => {\n if (e.target !== e.currentTarget) return;\n if (e.altKey && (e.key === 'ArrowUp' || e.key === 'ArrowDown')) {\n if (!canReorder) return;\n e.preventDefault();\n onAction?.(concern, e.key === 'ArrowUp' ? 'move-up' : 'move-down');\n } else if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n // Roving focus between rows\n e.preventDefault();\n const list = e.currentTarget.closest('ul');\n if (!list) return;\n const rows = Array.from(\n list.querySelectorAll<HTMLElement>('li[data-concern-id]')\n );\n const i = rows.indexOf(e.currentTarget as HTMLElement);\n rows[\n e.key === 'ArrowUp'\n ? Math.max(0, i - 1)\n : Math.min(rows.length - 1, i + 1)\n ]?.focus();\n } else if ((e.key === 'Enter' || e.key === ' ') && hasHistory) {\n e.preventDefault();\n setExpanded((v) => !v);\n }\n };\n\n if (!current) return null;\n\n return (\n // Roving-focus row (WAI-ARIA listbox-like keyboard pattern): the row is a\n // legitimate focus stop so ↑/↓ navigate rows, Enter toggles history, and\n // Alt+↑/↓ reorders — required for 508 keyboard operability.\n /* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */\n <li\n data-slot=\"clinical-list-row\"\n data-concern-id={concern.concernId}\n tabIndex={0}\n onKeyDown={handleRowKeyDown}\n {...drag.rowProps(concern.concernId)}\n aria-label={[\n `${current.text}.`,\n hasHistory ? m('Press Enter to toggle history.') : '',\n canReorder ? m('Alt plus arrow keys to reorder.') : '',\n ]\n .filter(Boolean)\n .join(' ')}\n className={cn(\n 'group border-border/60 relative border-b px-1 py-2',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none',\n drag.enabled && 'cursor-grab active:cursor-grabbing',\n dragIndicatorClasses(drag, concern.concernId)\n )}\n >\n {/* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */}\n <div className=\"flex min-h-9 flex-wrap items-center gap-x-2 gap-y-1\">\n {drag.enabled ? (\n <GripVerticalIcon\n size={14}\n aria-hidden\n className=\"text-muted-foreground/50 shrink-0\"\n />\n ) : (\n <span className=\"text-muted-foreground/60 select-none\">•</span>\n )}\n {/* Hover (or long-press on touch) the name for the complete background:\n assertion history, observations, and coding provenance. */}\n <Tooltip content={concernHistoryContent(concern, m)}>\n <span className=\"text-foreground font-medium\">{current.text}</span>\n </Tooltip>\n <CodingChips coding={current.coding} />\n {/* 'unconfirmed' is conveyed by the Unconfirmed group header */}\n {current.verificationStatus !== 'confirmed' &&\n current.verificationStatus !== 'unconfirmed' && (\n <Badge\n variant={VERIFICATION_BADGE[current.verificationStatus].variant}\n size=\"sm\"\n >\n {m(VERIFICATION_BADGE[current.verificationStatus].label)}\n </Badge>\n )}\n <UncertaintyBadge uncertainty={current.uncertainty} />\n {concern.relationships?.map((r) => (\n <Badge key={`${r.type}:${r.concernId}`} variant=\"outline\" size=\"sm\">\n <LinkIcon size={10} className=\"me-1\" />\n {m(r.type.replace(/-/g, ' '))}\n {r.display ? `: ${r.display}` : ''}\n </Badge>\n ))}\n {hasHistory && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setExpanded((v) => !v)}\n aria-expanded={expanded}\n leftIcon={<HistoryIcon size={12} />}\n rightIcon={\n expanded ? (\n <ChevronUpIcon size={12} />\n ) : (\n <ChevronDownIcon size={12} />\n )\n }\n className=\"text-muted-foreground h-auto px-1.5 py-0.5 text-xs\"\n >\n {m('{count} assertions', { count: concern.assertions.length })}\n </Button>\n )}\n\n {!readOnly && (\n <RowActionToolbar\n label={m('Actions for {name}', { name: current.text })}\n align=\"top\"\n reveal={inlineActions ? 'always' : 'hover'}\n >\n {visibleActions.map((action) => (\n <RowIconButton\n key={action}\n label={m(ACTION_META[action].label)}\n icon={ACTION_META[action].icon}\n onClick={() => onAction?.(concern, action)}\n />\n ))}\n </RowActionToolbar>\n )}\n </div>\n\n {expanded && (\n <>\n <AssertionTimeline concern={concern} />\n {concern.observations && concern.observations.length > 0 && (\n <div className=\"ms-1.5 mt-2 ps-4\">\n <h5 className=\"text-muted-foreground text-xs font-semibold tracking-wide uppercase\">\n {m('Observations')}\n </h5>\n <ol aria-label={m('Observations')} className=\"mt-1 space-y-1\">\n {[...concern.observations].reverse().map((o) => (\n <li key={o.id} className=\"flex flex-wrap gap-x-2 text-sm\">\n <span className=\"text-muted-foreground text-xs tabular-nums\">\n {o.date}\n </span>\n <span className=\"text-foreground\">{o.text}</span>\n {o.author && (\n <span className=\"text-muted-foreground text-xs\">\n — {o.author}\n </span>\n )}\n </li>\n ))}\n </ol>\n </div>\n )}\n </>\n )}\n </li>\n );\n}\n\n// =============================================================================\n// ProblemList\n// =============================================================================\n\n/**\n * Patient-level problem list built on the concern/assertion model: each row is\n * a stable ConditionConcern whose coded characterization evolves through an\n * assertion history (refinement / revision / progression). Rows expand to show\n * the assertion timeline; refuted assertions render struck-through.\n *\n * Controlled component: concerns come in via props; every user interaction is\n * reported through callbacks.\n *\n * @example\n * ```tsx\n * <ProblemList\n * concerns={concerns}\n * onAction={(concern, action) => handleAction(concern, action)}\n * onAddProblem={(text) => addConcern(text)}\n * />\n * ```\n */\nexport const ProblemList = React.forwardRef<HTMLDivElement, ProblemListProps>(\n (\n {\n concerns,\n title = 'Problem list',\n onAction,\n onAddProblem,\n addSearch,\n onAdd,\n onReorder,\n actions = DEFAULT_ACTIONS,\n inlineActions = false,\n readOnly = false,\n emptyMessage = 'No problems recorded.',\n className,\n 'data-testid': dataTestId,\n ...props\n },\n ref\n ) => {\n const m = useMessages();\n const [draft, setDraft] = React.useState('');\n // clears-then-sets so repeated identical messages re-announce\n const [announcement, setAnnouncement] = useLiveAnnouncement();\n\n const submitDraft = () => {\n const text = draft.trim();\n if (!text) return;\n onAddProblem?.(text);\n setDraft('');\n };\n\n /** Swap with the adjacent concern in the same group, then report the full order. */\n const moveConcern = React.useCallback(\n (concern: ConditionConcern, dir: -1 | 1) => {\n if (!onReorder || readOnly) return;\n const groupKey = concernGroupKey(concern);\n const ids = concerns.map((c) => c.concernId);\n const from = ids.indexOf(concern.concernId);\n // nearest neighbor in the same group\n let to = from + dir;\n while (\n to >= 0 &&\n to < concerns.length &&\n concernGroupKey(concerns[to]) !== groupKey\n ) {\n to += dir;\n }\n if (to < 0 || to >= concerns.length) return;\n [ids[from], ids[to]] = [ids[to], ids[from]];\n const current = currentAssertion(concern);\n setAnnouncement(\n m(dir === -1 ? '{name} moved up' : '{name} moved down', {\n name: current?.text ?? concern.concernId,\n })\n );\n onReorder(ids);\n },\n [concerns, onReorder, readOnly, setAnnouncement, m]\n );\n\n const handleAction = React.useCallback(\n (concern: ConditionConcern, action: ProblemListAction) => {\n if (action === 'move-up') moveConcern(concern, -1);\n else if (action === 'move-down') moveConcern(concern, 1);\n else onAction?.(concern, action);\n },\n [moveConcern, onAction]\n );\n\n // Drag & drop reordering, restricted to the same group (a cross-group\n // drop would silently imply a status change). Precomputed map — dragover\n // fires too frequently for a linear concern scan per event.\n const groupById = React.useMemo(\n () =>\n new Map(\n concerns.map((c) => [c.concernId, concernGroupKey(c)] as const)\n ),\n [concerns]\n );\n const groupOf = React.useCallback(\n (id: string) => groupById.get(id),\n [groupById]\n );\n const drag = useDragReorder({\n ids: concerns.map((c) => c.concernId),\n onReorder:\n readOnly || !onReorder\n ? undefined\n : (newIds) => {\n // announce pointer drops too, not just keyboard moves\n setAnnouncement(m('Problem list reordered'));\n onReorder(newIds);\n },\n canDropOn: (dragged, target) => groupOf(dragged) === groupOf(target),\n });\n\n // Unconfirmed concerns get their own list, ahead of Active / Resolved.\n const groups = [\n {\n key: 'unconfirmed',\n label: 'Unconfirmed',\n items: concerns.filter((c) => concernGroupKey(c) === 'unconfirmed'),\n },\n ...GROUP_ORDER.map(({ key, label }) => ({\n key,\n label,\n items: concerns.filter((c) => concernGroupKey(c) === key),\n })),\n // Active stays visible as the empty state only when nothing is recorded\n // at all — an empty Active section next to populated groups would\n // misleadingly read \"No problems recorded\".\n ].filter(\n (g) => g.items.length > 0 || (g.key === 'active' && concerns.length === 0)\n );\n\n return (\n <Card\n ref={ref}\n padding=\"none\"\n className={cn('w-full', className)}\n data-testid={dataTestId}\n {...props}\n >\n {title !== null && (\n <CardHeader className=\"border-border bg-muted/50 border-b px-4 py-3\">\n <h3 className=\"text-foreground text-sm font-semibold tracking-wide uppercase\">\n {m(title)}\n </h3>\n </CardHeader>\n )}\n\n <CardContent className=\"space-y-6 px-4 py-4\">\n {groups.map(({ key, label, items }) => (\n <section key={key} aria-label={m(label)}>\n <h4\n data-slot=\"clinical-list-heading\"\n className=\"border-border text-foreground border-b pb-1 text-sm font-semibold tracking-wide uppercase\"\n >\n {m(label)}\n </h4>\n {items.length > 0 ? (\n <ul className=\"mt-1\">\n {items.map((concern) => (\n <ConcernRow\n key={concern.concernId}\n concern={concern}\n actions={actions}\n inlineActions={inlineActions}\n readOnly={readOnly}\n canReorder={drag.enabled}\n drag={drag}\n onAction={handleAction}\n />\n ))}\n </ul>\n ) : (\n <p className=\"text-muted-foreground mt-2 text-sm\">\n {m(emptyMessage)}\n </p>\n )}\n </section>\n ))}\n\n {!readOnly && (addSearch || onAddProblem || onAdd) && (\n <div className=\"space-y-2\">\n <span className=\"text-muted-foreground text-xs font-semibold tracking-wide uppercase\">\n {m('Add problem')}\n </span>\n {addSearch}\n {onAddProblem && (\n <div className=\"flex items-center gap-1.5\">\n <input\n type=\"text\"\n data-slot=\"input\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') submitDraft();\n }}\n placeholder={m('Add problem (name is enough)…')}\n aria-label={m('Add problem')}\n className={cn(\n 'border-border bg-background text-foreground placeholder:text-muted-foreground',\n 'h-8 flex-1 rounded-md border px-2.5 text-sm',\n 'focus:ring-ring focus:ring-2 focus:outline-none'\n )}\n />\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={submitDraft}\n disabled={!draft.trim()}\n leftIcon={<PlusIcon size={12} />}\n className=\"h-8\"\n >\n {m('Add')}\n </Button>\n </div>\n )}\n {onAdd && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onAdd}\n leftIcon={<PlusIcon size={12} />}\n className=\"h-auto rounded-full px-2.5 py-1 text-xs\"\n >\n {m('Add')}\n </Button>\n )}\n </div>\n )}\n </CardContent>\n\n {/* Reorder announcements for screen readers */}\n <div aria-live=\"polite\" className=\"sr-only\">\n {announcement}\n </div>\n </Card>\n );\n }\n);\n\nProblemList.displayName = 'ProblemList';\n\nexport default ProblemList;\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var chunkYW2AKBLS_cjs = require('./chunk-YW2AKBLS.cjs');
|
|
4
3
|
var chunk7E46YDOT_cjs = require('./chunk-7E46YDOT.cjs');
|
|
4
|
+
var chunkYW2AKBLS_cjs = require('./chunk-YW2AKBLS.cjs');
|
|
5
5
|
var chunkHGJHWI7W_cjs = require('./chunk-HGJHWI7W.cjs');
|
|
6
6
|
var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
|
|
7
7
|
var React = require('react');
|
|
@@ -328,5 +328,5 @@ function Detail({
|
|
|
328
328
|
}
|
|
329
329
|
|
|
330
330
|
exports.RadialExplorer = RadialExplorer;
|
|
331
|
-
//# sourceMappingURL=chunk-
|
|
332
|
-
//# sourceMappingURL=chunk-
|
|
331
|
+
//# sourceMappingURL=chunk-L77XJPKC.cjs.map
|
|
332
|
+
//# sourceMappingURL=chunk-L77XJPKC.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/RadialExplorer/RadialExplorer.tsx"],"names":["usePrefersReducedMotion","React","jsxs","cn","jsx","Badge","buttonVariants","ArrowRight"],"mappings":"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","file":"chunk-4VSK3EE5.cjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { ArrowRight } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { Badge } from '../Badge';\nimport { buttonVariants } from '../Button';\nimport { usePrefersReducedMotion } from '../../hooks/usePrefersReducedMotion';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface RadialSpoke {\n id: string;\n /** Label under the tile. */\n label: string;\n /** Tile icon (Lucide, ~22px). */\n icon: React.ReactNode;\n /** Small caps tag above the detail heading. Defaults to `label`. */\n tag?: string;\n /** Detail heading. Defaults to `label`. */\n title?: string;\n description?: string;\n /** Detail media — a `VideoCard variant=\"plate\"`, an image, a chart. */\n media?: React.ReactNode;\n /** Caption under the media, e.g. \"AI Medical Assistant · 2:44\". */\n caption?: string;\n /** Primary CTA in the detail panel. */\n cta?: { label: string; href: string };\n /** Secondary \"Explore module →\" link. */\n href?: string;\n hrefLabel?: string;\n}\n\nexport interface RadialExplorerProps {\n spokes: RadialSpoke[];\n /** Centre node — a brand mark or product tile. */\n center: React.ReactNode;\n /** Small caps label over the whole explorer. */\n eyebrow?: string;\n /** Controlled active spoke. */\n activeId?: string | null;\n defaultActiveId?: string | null;\n onActiveChange?: (id: string | null) => void;\n /** Shown in the detail panel before any spoke is chosen. */\n welcome?: {\n tag?: string;\n title: string;\n description?: string;\n media?: React.ReactNode;\n cta?: { label: string; href: string };\n };\n /**\n * Auto-advance through the spokes until the visitor interacts. Default\n * 2200ms; pass 0 to disable. Skipped under `prefers-reduced-motion`.\n */\n attractMs?: number;\n /** Hint under the ring. Default \"Hover a module to preview\". */\n hint?: string;\n /** Orbit radius. Default `clamp(118px, 17vw, 188px)`. */\n radius?: string;\n /** Accessible name for the spoke group. Default \"Modules\". */\n groupLabel?: string;\n className?: string;\n}\n\n// =============================================================================\n// RadialExplorer\n// =============================================================================\n\n/**\n * A radial product explorer: a centre mark with N icon tiles orbiting it, a\n * glowing tracer ray from the core to the active tile, tab dots, and a detail\n * panel beside the ring that shows the active spoke's media, copy and CTAs\n * (with a welcome state before any pick). Auto-advances gently until the\n * visitor engages. Below `lg` the ring becomes a chip grid above the panel.\n * Ported from the Enterprise Health hero HUD.\n *\n * @example\n * ```tsx\n * <RadialExplorer\n * eyebrow=\"Explore the platform\"\n * center={<img src=\"/mark.svg\" alt=\"\" />}\n * spokes={[{ id: 'ehr', label: 'Certified EHR', icon: <FileText />, description: '…',\n * media: <VideoCard variant=\"plate\" title=\"EHR tour\" youtubeId=\"…\" duration=\"2:44\" />,\n * cta: { label: 'Request a demo', href: '/demo/' }, href: '/platform/ehr/' }]}\n * />\n * ```\n */\nexport function RadialExplorer({\n spokes,\n center,\n eyebrow,\n activeId: controlled,\n defaultActiveId = null,\n onActiveChange,\n welcome,\n attractMs = 2200,\n hint = 'Hover a module to preview',\n radius = 'clamp(118px, 17vw, 188px)',\n groupLabel = 'Modules',\n className,\n}: RadialExplorerProps) {\n const reduced = usePrefersReducedMotion();\n const [inner, setInner] = React.useState<string | null>(defaultActiveId);\n const [engaged, setEngaged] = React.useState(false);\n const activeId = controlled !== undefined ? controlled : inner;\n const id = React.useId();\n\n const select = React.useCallback(\n (next: string | null) => {\n setEngaged(true);\n if (controlled === undefined) setInner(next);\n onActiveChange?.(next);\n },\n [controlled, onActiveChange]\n );\n\n // Attract loop until the visitor interacts. Never runs in controlled mode:\n // `activeId` is owned by the host, so cycling it (or firing unsolicited\n // `onActiveChange` ticks) would fight the controlled API contract.\n React.useEffect(() => {\n if (\n controlled !== undefined ||\n engaged ||\n reduced ||\n !attractMs ||\n spokes.length === 0\n )\n return;\n let i = spokes.findIndex((s) => s.id === activeId);\n const t = window.setInterval(() => {\n i = (i + 1) % spokes.length;\n setInner(spokes[i].id);\n onActiveChange?.(spokes[i].id);\n }, attractMs);\n return () => window.clearInterval(t);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [engaged, reduced, attractMs, spokes.length, controlled]);\n\n const activeIndex = spokes.findIndex((s) => s.id === activeId);\n const active = activeIndex >= 0 ? spokes[activeIndex] : null;\n const step = 360 / Math.max(spokes.length, 1);\n const angle = (i: number) => `${i * step - 90}deg`;\n\n return (\n <section\n data-slot=\"radial-explorer\"\n style={{ '--re-r': radius } as React.CSSProperties}\n className={cn(\n 'grid gap-8 lg:grid-cols-[1.1fr_minmax(300px,380px)] lg:items-center',\n className\n )}\n aria-labelledby={eyebrow ? `${id}-eyebrow` : undefined}\n >\n <div className=\"flex flex-col items-center gap-5\">\n {eyebrow && (\n <p\n id={`${id}-eyebrow`}\n className=\"text-primary-800 dark:text-primary-300 text-[11px] font-bold tracking-[0.18em] uppercase\"\n >\n {eyebrow}\n </p>\n )}\n\n {/* Ring (lg+) */}\n <div\n role=\"group\"\n aria-label={groupLabel}\n data-slot=\"radial-explorer-ring\"\n className=\"relative hidden aspect-square w-[calc(var(--re-r)*2+120px)] place-items-center lg:grid\"\n >\n <span\n aria-hidden\n data-slot=\"radial-explorer-core\"\n className={cn(\n // rtl-ignore -- physical centering paired with -translate-x-1/2 is direction-independent; start-1/2 would break it in RTL\n 'absolute top-1/2 left-1/2 grid h-[100px] w-[100px] -translate-x-1/2 -translate-y-1/2 place-items-center rounded-[24%] border border-white/15 text-white shadow-[0_14px_30px_rgba(0,0,0,0.3),inset_0_1px_0_rgba(255,255,255,0.08)]',\n '[background:radial-gradient(90%_90%_at_24%_8%,color-mix(in_srgb,var(--mieweb-primary-400)_35%,transparent),transparent_60%),linear-gradient(145deg,var(--mieweb-primary-700)_0%,var(--mieweb-primary-900)_68%,var(--mieweb-primary-950)_100%)]',\n '[&>*]:h-[54px] [&>*]:w-[54px] [&>img]:object-contain'\n )}\n >\n {center}\n </span>\n\n {active && (\n <span\n aria-hidden\n data-slot=\"radial-explorer-ray\"\n style={{\n width: 'var(--re-r)',\n transform: `translateY(-50%) rotate(${angle(activeIndex)})`,\n }}\n className={cn(\n // rtl-ignore -- the ray is rotated to a computed angle from the physical center; origin/tip geometry must stay physical\n 'pointer-events-none absolute top-1/2 left-1/2 z-0 h-0.5 origin-left rounded-full transition-transform duration-500 [transition-timing-function:cubic-bezier(0.4,0.85,0.3,1)]',\n '[filter:drop-shadow(0_0_6px_color-mix(in_srgb,var(--mieweb-accent,var(--mieweb-primary-300))_55%,transparent))] [background:linear-gradient(90deg,transparent_4%,var(--mieweb-accent,var(--mieweb-primary-300))_94%)]',\n // rtl-ignore -- tip dot sits at the physical end of the rotated ray\n 'after:absolute after:top-1/2 after:-right-[3px] after:h-[7px] after:w-[7px] after:-translate-y-1/2 after:rounded-full after:bg-[var(--mieweb-accent,var(--mieweb-primary-300))] after:shadow-[0_0_9px_2px_color-mix(in_srgb,var(--mieweb-accent,var(--mieweb-primary-300))_70%,transparent)] after:content-[\"\"]'\n )}\n />\n )}\n\n {spokes.map((s, i) => {\n const on = s.id === activeId;\n return (\n <button\n key={s.id}\n type=\"button\"\n aria-pressed={on}\n data-slot=\"radial-explorer-spoke\"\n data-active={on || undefined}\n style={{\n transform: `translate(-50%,-50%) rotate(${angle(i)}) translate(var(--re-r)) rotate(calc(-1 * ${angle(i)}))`,\n }}\n onMouseEnter={() => select(s.id)}\n onFocus={() => select(s.id)}\n onClick={() => select(s.id)}\n // rtl-ignore -- spokes are placed by rotate/translate trig from the physical center; the wheel is rotationally symmetric\n className=\"group/spoke absolute top-1/2 left-1/2 grid w-24 justify-items-center gap-2 focus-visible:outline-none\"\n >\n <SpokeTile icon={s.icon} active={on} />\n <span\n className={cn(\n 'text-muted-foreground group-hover/spoke:text-primary-800 dark:group-hover/spoke:text-primary-200 text-[13px] font-semibold transition-colors',\n on && 'text-primary-800 dark:text-primary-200'\n )}\n >\n {s.label}\n </span>\n </button>\n );\n })}\n </div>\n\n {/* Chip grid (< lg) */}\n <div\n role=\"group\"\n aria-label={groupLabel}\n className=\"grid w-full grid-cols-3 gap-3 lg:hidden\"\n >\n {spokes.map((s) => {\n const on = s.id === activeId;\n return (\n <button\n key={s.id}\n type=\"button\"\n aria-pressed={on}\n data-slot=\"radial-explorer-chip\"\n onClick={() => select(s.id)}\n className=\"group/spoke grid justify-items-center gap-1.5 focus-visible:outline-none\"\n >\n <SpokeTile icon={s.icon} active={on} size=\"sm\" />\n <span\n className={cn(\n 'text-muted-foreground text-center text-xs font-semibold',\n on && 'text-primary-800 dark:text-primary-200'\n )}\n >\n {s.label}\n </span>\n </button>\n );\n })}\n </div>\n\n {/* dots + hint */}\n <div className=\"flex flex-col items-center gap-2\">\n <div role=\"group\" aria-label={groupLabel} className=\"flex gap-2\">\n {spokes.map((s, i) => (\n <button\n key={s.id}\n type=\"button\"\n aria-pressed={i === activeIndex}\n aria-label={s.label}\n onClick={() => select(s.id)}\n className={cn(\n 'h-2 rounded-full transition-all',\n i === activeIndex\n ? 'w-6 bg-[var(--mieweb-accent,var(--mieweb-primary-400))]'\n : 'bg-primary-300/60 hover:bg-primary-400 w-2'\n )}\n />\n ))}\n </div>\n {hint && (\n <p\n className={cn(\n 'text-muted-foreground text-xs transition-opacity',\n engaged && 'opacity-0'\n )}\n aria-hidden={engaged}\n >\n {hint}\n </p>\n )}\n </div>\n </div>\n\n {/* Detail */}\n <div\n data-slot=\"radial-explorer-detail\"\n aria-live={engaged ? 'polite' : 'off'}\n className=\"border-border bg-card text-card-foreground grid content-center gap-3.5 rounded-2xl border p-5 shadow-xl\"\n >\n {active ? (\n <Detail\n key={active.id}\n tag={active.tag ?? active.label}\n title={active.title ?? active.label}\n description={active.description}\n media={active.media}\n caption={active.caption}\n cta={active.cta}\n href={active.href}\n hrefLabel={active.hrefLabel ?? 'Explore module'}\n />\n ) : welcome ? (\n <Detail\n key=\"welcome\"\n tag={welcome.tag}\n title={welcome.title}\n description={welcome.description}\n media={welcome.media}\n cta={welcome.cta}\n />\n ) : null}\n </div>\n </section>\n );\n}\n\n// =============================================================================\n// Pieces\n// =============================================================================\n\nfunction SpokeTile({\n icon,\n active,\n size = 'md',\n}: {\n icon: React.ReactNode;\n active: boolean;\n size?: 'sm' | 'md';\n}) {\n return (\n <span\n aria-hidden\n className={cn(\n 'mie-fx-sheen relative grid place-items-center rounded-[17px] border transition-[transform,border-color,color,box-shadow,background] duration-200',\n size === 'md'\n ? 'h-[60px] w-[60px] [&>svg]:h-[22px] [&>svg]:w-[22px]'\n : 'h-12 w-12 rounded-xl [&>svg]:h-5 [&>svg]:w-5',\n 'border-border bg-primary-500/10 text-primary-800 dark:text-primary-300 shadow-md backdrop-blur-sm',\n 'group-hover/spoke:-translate-y-0.5 group-hover/spoke:scale-[1.04] group-hover/spoke:border-transparent group-hover/spoke:text-white group-hover/spoke:shadow-xl',\n 'group-hover/spoke:[background:linear-gradient(150deg,var(--mieweb-primary-700),var(--mieweb-primary-900))_padding-box,linear-gradient(135deg,var(--mieweb-accent,var(--mieweb-primary-300)),var(--mieweb-primary-200)_55%,var(--mieweb-accent,var(--mieweb-primary-300)))_border-box]',\n 'group-focus-visible/spoke:outline-primary-500 group-focus-visible/spoke:outline group-focus-visible/spoke:outline-2 group-focus-visible/spoke:outline-offset-[3px]',\n active &&\n '-translate-y-0.5 scale-[1.04] border-transparent text-white shadow-xl [background:linear-gradient(150deg,var(--mieweb-primary-700),var(--mieweb-primary-900))_padding-box,linear-gradient(135deg,var(--mieweb-accent,var(--mieweb-primary-300)),var(--mieweb-primary-200)_55%,var(--mieweb-accent,var(--mieweb-primary-300)))_border-box]'\n )}\n >\n {icon}\n </span>\n );\n}\n\nfunction Detail({\n tag,\n title,\n description,\n media,\n caption,\n cta,\n href,\n hrefLabel,\n}: {\n tag?: string;\n title: string;\n description?: string;\n media?: React.ReactNode;\n caption?: string;\n cta?: { label: string; href: string };\n href?: string;\n hrefLabel?: string;\n}) {\n return (\n <div className=\"grid gap-3.5 motion-safe:animate-[mie-fade-in_0.25s_ease-out]\">\n {media && <div data-slot=\"radial-explorer-media\">{media}</div>}\n {tag && (\n <Badge\n size=\"sm\"\n className=\"w-fit text-[10px] font-bold tracking-[0.14em] uppercase\"\n >\n {tag}\n </Badge>\n )}\n <h3 className=\"text-foreground text-2xl leading-tight font-semibold\">\n {title}\n </h3>\n {description && (\n <p className=\"text-muted-foreground text-[15px] leading-snug\">\n {description}\n </p>\n )}\n {caption && <p className=\"text-muted-foreground text-sm\">{caption}</p>}\n {(cta || href) && (\n <div className=\"mt-1 flex flex-wrap items-center gap-3\">\n {cta && (\n <a href={cta.href} className={buttonVariants({ effect: 'sheen' })}>\n {cta.label}\n <ArrowRight size={16} aria-hidden className=\"rtl:-scale-x-100\" />\n </a>\n )}\n {href && (\n <a\n href={href}\n className=\"text-primary-800 dark:text-primary-200 text-sm font-semibold underline-offset-4 hover:underline\"\n >\n {hrefLabel}\n </a>\n )}\n </div>\n )}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/RadialExplorer/RadialExplorer.tsx"],"names":["usePrefersReducedMotion","React","jsxs","cn","jsx","Badge","buttonVariants","ArrowRight"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0FO,SAAS,cAAA,CAAe;AAAA,EAC7B,MAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA,EAAU,UAAA;AAAA,EACV,eAAA,GAAkB,IAAA;AAAA,EAClB,cAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA,GAAY,IAAA;AAAA,EACZ,IAAA,GAAO,2BAAA;AAAA,EACP,MAAA,GAAS,2BAAA;AAAA,EACT,UAAA,GAAa,SAAA;AAAA,EACb;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,UAAUA,yCAAA,EAAwB;AACxC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUC,0BAAwB,eAAe,CAAA;AACvE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAUA,0BAAS,KAAK,CAAA;AAClD,EAAA,MAAM,QAAA,GAAW,UAAA,KAAe,MAAA,GAAY,UAAA,GAAa,KAAA;AACzD,EAAA,MAAM,KAAWA,gBAAA,CAAA,KAAA,EAAM;AAEvB,EAAA,MAAM,MAAA,GAAeA,gBAAA,CAAA,WAAA;AAAA,IACnB,CAAC,IAAA,KAAwB;AACvB,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,IAAI,UAAA,KAAe,MAAA,EAAW,QAAA,CAAS,IAAI,CAAA;AAC3C,MAAA,cAAA,GAAiB,IAAI,CAAA;AAAA,IACvB,CAAA;AAAA,IACA,CAAC,YAAY,cAAc;AAAA,GAC7B;AAKA,EAAMA,2BAAU,MAAM;AACpB,IAAA,IACE,eAAe,MAAA,IACf,OAAA,IACA,WACA,CAAC,SAAA,IACD,OAAO,MAAA,KAAW,CAAA;AAElB,MAAA;AACF,IAAA,IAAI,IAAI,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,QAAQ,CAAA;AACjD,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,WAAA,CAAY,MAAM;AACjC,MAAA,CAAA,GAAA,CAAK,CAAA,GAAI,KAAK,MAAA,CAAO,MAAA;AACrB,MAAA,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,CAAE,EAAE,CAAA;AACrB,MAAA,cAAA,GAAiB,MAAA,CAAO,CAAC,CAAA,CAAE,EAAE,CAAA;AAAA,IAC/B,GAAG,SAAS,CAAA;AACZ,IAAA,OAAO,MAAM,MAAA,CAAO,aAAA,CAAc,CAAC,CAAA;AAAA,EAErC,CAAA,EAAG,CAAC,OAAA,EAAS,OAAA,EAAS,WAAW,MAAA,CAAO,MAAA,EAAQ,UAAU,CAAC,CAAA;AAE3D,EAAA,MAAM,cAAc,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,QAAQ,CAAA;AAC7D,EAAA,MAAM,MAAA,GAAS,WAAA,IAAe,CAAA,GAAI,MAAA,CAAO,WAAW,CAAA,GAAI,IAAA;AACxD,EAAA,MAAM,OAAO,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAC,CAAA;AAC5C,EAAA,MAAM,QAAQ,CAAC,CAAA,KAAc,CAAA,EAAG,CAAA,GAAI,OAAO,EAAE,CAAA,GAAA,CAAA;AAE7C,EAAA,uBACEC,eAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,KAAA,EAAO,EAAE,QAAA,EAAU,MAAA,EAAO;AAAA,MAC1B,SAAA,EAAWC,oBAAA;AAAA,QACT,qEAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,iBAAA,EAAiB,OAAA,GAAU,CAAA,EAAG,EAAE,CAAA,QAAA,CAAA,GAAa,MAAA;AAAA,MAE7C,QAAA,EAAA;AAAA,wBAAAD,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kCAAA,EACZ,QAAA,EAAA;AAAA,UAAA,OAAA,oBACCE,cAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAI,GAAG,EAAE,CAAA,QAAA,CAAA;AAAA,cACT,SAAA,EAAU,0FAAA;AAAA,cAET,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,0BAIFF,eAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,OAAA;AAAA,cACL,YAAA,EAAY,UAAA;AAAA,cACZ,WAAA,EAAU,sBAAA;AAAA,cACV,SAAA,EAAU,wFAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAAE,cAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,aAAA,EAAW,IAAA;AAAA,oBACX,WAAA,EAAU,sBAAA;AAAA,oBACV,SAAA,EAAWD,oBAAA;AAAA;AAAA,sBAET,mOAAA;AAAA,sBACA,gPAAA;AAAA,sBACA;AAAA,qBACF;AAAA,oBAEC,QAAA,EAAA;AAAA;AAAA,iBACH;AAAA,gBAEC,MAAA,oBACCC,cAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,aAAA,EAAW,IAAA;AAAA,oBACX,WAAA,EAAU,qBAAA;AAAA,oBACV,KAAA,EAAO;AAAA,sBACL,KAAA,EAAO,aAAA;AAAA,sBACP,SAAA,EAAW,CAAA,wBAAA,EAA2B,KAAA,CAAM,WAAW,CAAC,CAAA,CAAA;AAAA,qBAC1D;AAAA,oBACA,SAAA,EAAWD,oBAAA;AAAA;AAAA,sBAET,8KAAA;AAAA,sBACA,uNAAA;AAAA;AAAA,sBAEA;AAAA;AACF;AAAA,iBACF;AAAA,gBAGD,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AACpB,kBAAA,MAAM,EAAA,GAAK,EAAE,EAAA,KAAO,QAAA;AACpB,kBAAA,uBACED,eAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBAEC,IAAA,EAAK,QAAA;AAAA,sBACL,cAAA,EAAc,EAAA;AAAA,sBACd,WAAA,EAAU,uBAAA;AAAA,sBACV,eAAa,EAAA,IAAM,MAAA;AAAA,sBACnB,KAAA,EAAO;AAAA,wBACL,SAAA,EAAW,+BAA+B,KAAA,CAAM,CAAC,CAAC,CAAA,0CAAA,EAA6C,KAAA,CAAM,CAAC,CAAC,CAAA,EAAA;AAAA,uBACzG;AAAA,sBACA,YAAA,EAAc,MAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AAAA,sBAC/B,OAAA,EAAS,MAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AAAA,sBAC1B,OAAA,EAAS,MAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AAAA,sBAE1B,SAAA,EAAU,uGAAA;AAAA,sBAEV,QAAA,EAAA;AAAA,wCAAAE,cAAA,CAAC,SAAA,EAAA,EAAU,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,QAAQ,EAAA,EAAI,CAAA;AAAA,wCACrCA,cAAA;AAAA,0BAAC,MAAA;AAAA,0BAAA;AAAA,4BACC,SAAA,EAAWD,oBAAA;AAAA,8BACT,8IAAA;AAAA,8BACA,EAAA,IAAM;AAAA,6BACR;AAAA,4BAEC,QAAA,EAAA,CAAA,CAAE;AAAA;AAAA;AACL;AAAA,qBAAA;AAAA,oBAtBK,CAAA,CAAE;AAAA,mBAuBT;AAAA,gBAEJ,CAAC;AAAA;AAAA;AAAA,WACH;AAAA,0BAGAC,cAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,OAAA;AAAA,cACL,YAAA,EAAY,UAAA;AAAA,cACZ,SAAA,EAAU,yCAAA;AAAA,cAET,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AACjB,gBAAA,MAAM,EAAA,GAAK,EAAE,EAAA,KAAO,QAAA;AACpB,gBAAA,uBACEF,eAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBAEC,IAAA,EAAK,QAAA;AAAA,oBACL,cAAA,EAAc,EAAA;AAAA,oBACd,WAAA,EAAU,sBAAA;AAAA,oBACV,OAAA,EAAS,MAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AAAA,oBAC1B,SAAA,EAAU,0EAAA;AAAA,oBAEV,QAAA,EAAA;AAAA,sCAAAE,cAAA,CAAC,aAAU,IAAA,EAAM,CAAA,CAAE,MAAM,MAAA,EAAQ,EAAA,EAAI,MAAK,IAAA,EAAK,CAAA;AAAA,sCAC/CA,cAAA;AAAA,wBAAC,MAAA;AAAA,wBAAA;AAAA,0BACC,SAAA,EAAWD,oBAAA;AAAA,4BACT,yDAAA;AAAA,4BACA,EAAA,IAAM;AAAA,2BACR;AAAA,0BAEC,QAAA,EAAA,CAAA,CAAE;AAAA;AAAA;AACL;AAAA,mBAAA;AAAA,kBAfK,CAAA,CAAE;AAAA,iBAgBT;AAAA,cAEJ,CAAC;AAAA;AAAA,WACH;AAAA,0BAGAD,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA;AAAA,4BAAAE,cAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,OAAA,EAAQ,YAAA,EAAY,UAAA,EAAY,SAAA,EAAU,YAAA,EACjD,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBACdA,cAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBAEC,IAAA,EAAK,QAAA;AAAA,gBACL,gBAAc,CAAA,KAAM,WAAA;AAAA,gBACpB,cAAY,CAAA,CAAE,KAAA;AAAA,gBACd,OAAA,EAAS,MAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AAAA,gBAC1B,SAAA,EAAWD,oBAAA;AAAA,kBACT,iCAAA;AAAA,kBACA,CAAA,KAAM,cACF,yDAAA,GACA;AAAA;AACN,eAAA;AAAA,cAVK,CAAA,CAAE;AAAA,aAYV,CAAA,EACH,CAAA;AAAA,YACC,IAAA,oBACCC,cAAA;AAAA,cAAC,GAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAWD,oBAAA;AAAA,kBACT,kDAAA;AAAA,kBACA,OAAA,IAAW;AAAA,iBACb;AAAA,gBACA,aAAA,EAAa,OAAA;AAAA,gBAEZ,QAAA,EAAA;AAAA;AAAA;AACH,WAAA,EAEJ;AAAA,SAAA,EACF,CAAA;AAAA,wBAGAC,cAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,WAAA,EAAU,wBAAA;AAAA,YACV,WAAA,EAAW,UAAU,QAAA,GAAW,KAAA;AAAA,YAChC,SAAA,EAAU,yGAAA;AAAA,YAET,QAAA,EAAA,MAAA,mBACCA,cAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBAEC,GAAA,EAAK,MAAA,CAAO,GAAA,IAAO,MAAA,CAAO,KAAA;AAAA,gBAC1B,KAAA,EAAO,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,KAAA;AAAA,gBAC9B,aAAa,MAAA,CAAO,WAAA;AAAA,gBACpB,OAAO,MAAA,CAAO,KAAA;AAAA,gBACd,SAAS,MAAA,CAAO,OAAA;AAAA,gBAChB,KAAK,MAAA,CAAO,GAAA;AAAA,gBACZ,MAAM,MAAA,CAAO,IAAA;AAAA,gBACb,SAAA,EAAW,OAAO,SAAA,IAAa;AAAA,eAAA;AAAA,cAR1B,MAAA,CAAO;AAAA,gBAUZ,OAAA,mBACFA,cAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBAEC,KAAK,OAAA,CAAQ,GAAA;AAAA,gBACb,OAAO,OAAA,CAAQ,KAAA;AAAA,gBACf,aAAa,OAAA,CAAQ,WAAA;AAAA,gBACrB,OAAO,OAAA,CAAQ,KAAA;AAAA,gBACf,KAAK,OAAA,CAAQ;AAAA,eAAA;AAAA,cALT;AAAA,aAMN,GACE;AAAA;AAAA;AACN;AAAA;AAAA,GACF;AAEJ;AAMA,SAAS,SAAA,CAAU;AAAA,EACjB,IAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA,GAAO;AACT,CAAA,EAIG;AACD,EAAA,uBACEA,cAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAWD,oBAAA;AAAA,QACT,kJAAA;AAAA,QACA,IAAA,KAAS,OACL,qDAAA,GACA,8CAAA;AAAA,QACJ,mGAAA;AAAA,QACA,iKAAA;AAAA,QACA,uRAAA;AAAA,QACA,oKAAA;AAAA,QACA,MAAA,IACE;AAAA,OACJ;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;AAEA,SAAS,MAAA,CAAO;AAAA,EACd,GAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,EASG;AACD,EAAA,uBACED,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DAAA,EACZ,QAAA,EAAA;AAAA,IAAA,KAAA,oBAASE,cAAA,CAAC,KAAA,EAAA,EAAI,WAAA,EAAU,uBAAA,EAAyB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IACvD,GAAA,oBACCA,cAAA;AAAA,MAACC,uBAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,IAAA;AAAA,QACL,SAAA,EAAU,yDAAA;AAAA,QAET,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,oBAEFD,cAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,sDAAA,EACX,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,IACC,WAAA,oBACCA,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kDACV,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,IAED,OAAA,oBAAWA,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAiC,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,IAAA,CAChE,GAAA,IAAO,IAAA,qBACPF,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wCAAA,EACZ,QAAA,EAAA;AAAA,MAAA,GAAA,oBACCA,eAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,SAAA,EAAWI,gCAAA,CAAe,EAAE,MAAA,EAAQ,OAAA,EAAS,CAAA,EAC7D,QAAA,EAAA;AAAA,QAAA,GAAA,CAAI,KAAA;AAAA,uCACJC,sBAAA,EAAA,EAAW,IAAA,EAAM,IAAI,aAAA,EAAW,IAAA,EAAC,WAAU,kBAAA,EAAmB;AAAA,OAAA,EACjE,CAAA;AAAA,MAED,IAAA,oBACCH,cAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,IAAA;AAAA,UACA,SAAA,EAAU,iGAAA;AAAA,UAET,QAAA,EAAA;AAAA;AAAA;AACH,KAAA,EAEJ;AAAA,GAAA,EAEJ,CAAA;AAEJ","file":"chunk-L77XJPKC.cjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { ArrowRight } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { Badge } from '../Badge';\nimport { buttonVariants } from '../Button';\nimport { usePrefersReducedMotion } from '../../hooks/usePrefersReducedMotion';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface RadialSpoke {\n id: string;\n /** Label under the tile. */\n label: string;\n /** Tile icon (Lucide, ~22px). */\n icon: React.ReactNode;\n /** Small caps tag above the detail heading. Defaults to `label`. */\n tag?: string;\n /** Detail heading. Defaults to `label`. */\n title?: string;\n description?: string;\n /** Detail media — a `VideoCard variant=\"plate\"`, an image, a chart. */\n media?: React.ReactNode;\n /** Caption under the media, e.g. \"AI Medical Assistant · 2:44\". */\n caption?: string;\n /** Primary CTA in the detail panel. */\n cta?: { label: string; href: string };\n /** Secondary \"Explore module →\" link. */\n href?: string;\n hrefLabel?: string;\n}\n\nexport interface RadialExplorerProps {\n spokes: RadialSpoke[];\n /** Centre node — a brand mark or product tile. */\n center: React.ReactNode;\n /** Small caps label over the whole explorer. */\n eyebrow?: string;\n /** Controlled active spoke. */\n activeId?: string | null;\n defaultActiveId?: string | null;\n onActiveChange?: (id: string | null) => void;\n /** Shown in the detail panel before any spoke is chosen. */\n welcome?: {\n tag?: string;\n title: string;\n description?: string;\n media?: React.ReactNode;\n cta?: { label: string; href: string };\n };\n /**\n * Auto-advance through the spokes until the visitor interacts. Default\n * 2200ms; pass 0 to disable. Skipped under `prefers-reduced-motion`.\n */\n attractMs?: number;\n /** Hint under the ring. Default \"Hover a module to preview\". */\n hint?: string;\n /** Orbit radius. Default `clamp(118px, 17vw, 188px)`. */\n radius?: string;\n /** Accessible name for the spoke group. Default \"Modules\". */\n groupLabel?: string;\n className?: string;\n}\n\n// =============================================================================\n// RadialExplorer\n// =============================================================================\n\n/**\n * A radial product explorer: a centre mark with N icon tiles orbiting it, a\n * glowing tracer ray from the core to the active tile, tab dots, and a detail\n * panel beside the ring that shows the active spoke's media, copy and CTAs\n * (with a welcome state before any pick). Auto-advances gently until the\n * visitor engages. Below `lg` the ring becomes a chip grid above the panel.\n * Ported from the Enterprise Health hero HUD.\n *\n * @example\n * ```tsx\n * <RadialExplorer\n * eyebrow=\"Explore the platform\"\n * center={<img src=\"/mark.svg\" alt=\"\" />}\n * spokes={[{ id: 'ehr', label: 'Certified EHR', icon: <FileText />, description: '…',\n * media: <VideoCard variant=\"plate\" title=\"EHR tour\" youtubeId=\"…\" duration=\"2:44\" />,\n * cta: { label: 'Request a demo', href: '/demo/' }, href: '/platform/ehr/' }]}\n * />\n * ```\n */\nexport function RadialExplorer({\n spokes,\n center,\n eyebrow,\n activeId: controlled,\n defaultActiveId = null,\n onActiveChange,\n welcome,\n attractMs = 2200,\n hint = 'Hover a module to preview',\n radius = 'clamp(118px, 17vw, 188px)',\n groupLabel = 'Modules',\n className,\n}: RadialExplorerProps) {\n const reduced = usePrefersReducedMotion();\n const [inner, setInner] = React.useState<string | null>(defaultActiveId);\n const [engaged, setEngaged] = React.useState(false);\n const activeId = controlled !== undefined ? controlled : inner;\n const id = React.useId();\n\n const select = React.useCallback(\n (next: string | null) => {\n setEngaged(true);\n if (controlled === undefined) setInner(next);\n onActiveChange?.(next);\n },\n [controlled, onActiveChange]\n );\n\n // Attract loop until the visitor interacts. Never runs in controlled mode:\n // `activeId` is owned by the host, so cycling it (or firing unsolicited\n // `onActiveChange` ticks) would fight the controlled API contract.\n React.useEffect(() => {\n if (\n controlled !== undefined ||\n engaged ||\n reduced ||\n !attractMs ||\n spokes.length === 0\n )\n return;\n let i = spokes.findIndex((s) => s.id === activeId);\n const t = window.setInterval(() => {\n i = (i + 1) % spokes.length;\n setInner(spokes[i].id);\n onActiveChange?.(spokes[i].id);\n }, attractMs);\n return () => window.clearInterval(t);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [engaged, reduced, attractMs, spokes.length, controlled]);\n\n const activeIndex = spokes.findIndex((s) => s.id === activeId);\n const active = activeIndex >= 0 ? spokes[activeIndex] : null;\n const step = 360 / Math.max(spokes.length, 1);\n const angle = (i: number) => `${i * step - 90}deg`;\n\n return (\n <section\n data-slot=\"radial-explorer\"\n style={{ '--re-r': radius } as React.CSSProperties}\n className={cn(\n 'grid gap-8 lg:grid-cols-[1.1fr_minmax(300px,380px)] lg:items-center',\n className\n )}\n aria-labelledby={eyebrow ? `${id}-eyebrow` : undefined}\n >\n <div className=\"flex flex-col items-center gap-5\">\n {eyebrow && (\n <p\n id={`${id}-eyebrow`}\n className=\"text-primary-800 dark:text-primary-300 text-[11px] font-bold tracking-[0.18em] uppercase\"\n >\n {eyebrow}\n </p>\n )}\n\n {/* Ring (lg+) */}\n <div\n role=\"group\"\n aria-label={groupLabel}\n data-slot=\"radial-explorer-ring\"\n className=\"relative hidden aspect-square w-[calc(var(--re-r)*2+120px)] place-items-center lg:grid\"\n >\n <span\n aria-hidden\n data-slot=\"radial-explorer-core\"\n className={cn(\n // rtl-ignore -- physical centering paired with -translate-x-1/2 is direction-independent; start-1/2 would break it in RTL\n 'absolute top-1/2 left-1/2 grid h-[100px] w-[100px] -translate-x-1/2 -translate-y-1/2 place-items-center rounded-[24%] border border-white/15 text-white shadow-[0_14px_30px_rgba(0,0,0,0.3),inset_0_1px_0_rgba(255,255,255,0.08)]',\n '[background:radial-gradient(90%_90%_at_24%_8%,color-mix(in_srgb,var(--mieweb-primary-400)_35%,transparent),transparent_60%),linear-gradient(145deg,var(--mieweb-primary-700)_0%,var(--mieweb-primary-900)_68%,var(--mieweb-primary-950)_100%)]',\n '[&>*]:h-[54px] [&>*]:w-[54px] [&>img]:object-contain'\n )}\n >\n {center}\n </span>\n\n {active && (\n <span\n aria-hidden\n data-slot=\"radial-explorer-ray\"\n style={{\n width: 'var(--re-r)',\n transform: `translateY(-50%) rotate(${angle(activeIndex)})`,\n }}\n className={cn(\n // rtl-ignore -- the ray is rotated to a computed angle from the physical center; origin/tip geometry must stay physical\n 'pointer-events-none absolute top-1/2 left-1/2 z-0 h-0.5 origin-left rounded-full transition-transform duration-500 [transition-timing-function:cubic-bezier(0.4,0.85,0.3,1)]',\n '[filter:drop-shadow(0_0_6px_color-mix(in_srgb,var(--mieweb-accent,var(--mieweb-primary-300))_55%,transparent))] [background:linear-gradient(90deg,transparent_4%,var(--mieweb-accent,var(--mieweb-primary-300))_94%)]',\n // rtl-ignore -- tip dot sits at the physical end of the rotated ray\n 'after:absolute after:top-1/2 after:-right-[3px] after:h-[7px] after:w-[7px] after:-translate-y-1/2 after:rounded-full after:bg-[var(--mieweb-accent,var(--mieweb-primary-300))] after:shadow-[0_0_9px_2px_color-mix(in_srgb,var(--mieweb-accent,var(--mieweb-primary-300))_70%,transparent)] after:content-[\"\"]'\n )}\n />\n )}\n\n {spokes.map((s, i) => {\n const on = s.id === activeId;\n return (\n <button\n key={s.id}\n type=\"button\"\n aria-pressed={on}\n data-slot=\"radial-explorer-spoke\"\n data-active={on || undefined}\n style={{\n transform: `translate(-50%,-50%) rotate(${angle(i)}) translate(var(--re-r)) rotate(calc(-1 * ${angle(i)}))`,\n }}\n onMouseEnter={() => select(s.id)}\n onFocus={() => select(s.id)}\n onClick={() => select(s.id)}\n // rtl-ignore -- spokes are placed by rotate/translate trig from the physical center; the wheel is rotationally symmetric\n className=\"group/spoke absolute top-1/2 left-1/2 grid w-24 justify-items-center gap-2 focus-visible:outline-none\"\n >\n <SpokeTile icon={s.icon} active={on} />\n <span\n className={cn(\n 'text-muted-foreground group-hover/spoke:text-primary-800 dark:group-hover/spoke:text-primary-200 text-[13px] font-semibold transition-colors',\n on && 'text-primary-800 dark:text-primary-200'\n )}\n >\n {s.label}\n </span>\n </button>\n );\n })}\n </div>\n\n {/* Chip grid (< lg) */}\n <div\n role=\"group\"\n aria-label={groupLabel}\n className=\"grid w-full grid-cols-3 gap-3 lg:hidden\"\n >\n {spokes.map((s) => {\n const on = s.id === activeId;\n return (\n <button\n key={s.id}\n type=\"button\"\n aria-pressed={on}\n data-slot=\"radial-explorer-chip\"\n onClick={() => select(s.id)}\n className=\"group/spoke grid justify-items-center gap-1.5 focus-visible:outline-none\"\n >\n <SpokeTile icon={s.icon} active={on} size=\"sm\" />\n <span\n className={cn(\n 'text-muted-foreground text-center text-xs font-semibold',\n on && 'text-primary-800 dark:text-primary-200'\n )}\n >\n {s.label}\n </span>\n </button>\n );\n })}\n </div>\n\n {/* dots + hint */}\n <div className=\"flex flex-col items-center gap-2\">\n <div role=\"group\" aria-label={groupLabel} className=\"flex gap-2\">\n {spokes.map((s, i) => (\n <button\n key={s.id}\n type=\"button\"\n aria-pressed={i === activeIndex}\n aria-label={s.label}\n onClick={() => select(s.id)}\n className={cn(\n 'h-2 rounded-full transition-all',\n i === activeIndex\n ? 'w-6 bg-[var(--mieweb-accent,var(--mieweb-primary-400))]'\n : 'bg-primary-300/60 hover:bg-primary-400 w-2'\n )}\n />\n ))}\n </div>\n {hint && (\n <p\n className={cn(\n 'text-muted-foreground text-xs transition-opacity',\n engaged && 'opacity-0'\n )}\n aria-hidden={engaged}\n >\n {hint}\n </p>\n )}\n </div>\n </div>\n\n {/* Detail */}\n <div\n data-slot=\"radial-explorer-detail\"\n aria-live={engaged ? 'polite' : 'off'}\n className=\"border-border bg-card text-card-foreground grid content-center gap-3.5 rounded-2xl border p-5 shadow-xl\"\n >\n {active ? (\n <Detail\n key={active.id}\n tag={active.tag ?? active.label}\n title={active.title ?? active.label}\n description={active.description}\n media={active.media}\n caption={active.caption}\n cta={active.cta}\n href={active.href}\n hrefLabel={active.hrefLabel ?? 'Explore module'}\n />\n ) : welcome ? (\n <Detail\n key=\"welcome\"\n tag={welcome.tag}\n title={welcome.title}\n description={welcome.description}\n media={welcome.media}\n cta={welcome.cta}\n />\n ) : null}\n </div>\n </section>\n );\n}\n\n// =============================================================================\n// Pieces\n// =============================================================================\n\nfunction SpokeTile({\n icon,\n active,\n size = 'md',\n}: {\n icon: React.ReactNode;\n active: boolean;\n size?: 'sm' | 'md';\n}) {\n return (\n <span\n aria-hidden\n className={cn(\n 'mie-fx-sheen relative grid place-items-center rounded-[17px] border transition-[transform,border-color,color,box-shadow,background] duration-200',\n size === 'md'\n ? 'h-[60px] w-[60px] [&>svg]:h-[22px] [&>svg]:w-[22px]'\n : 'h-12 w-12 rounded-xl [&>svg]:h-5 [&>svg]:w-5',\n 'border-border bg-primary-500/10 text-primary-800 dark:text-primary-300 shadow-md backdrop-blur-sm',\n 'group-hover/spoke:-translate-y-0.5 group-hover/spoke:scale-[1.04] group-hover/spoke:border-transparent group-hover/spoke:text-white group-hover/spoke:shadow-xl',\n 'group-hover/spoke:[background:linear-gradient(150deg,var(--mieweb-primary-700),var(--mieweb-primary-900))_padding-box,linear-gradient(135deg,var(--mieweb-accent,var(--mieweb-primary-300)),var(--mieweb-primary-200)_55%,var(--mieweb-accent,var(--mieweb-primary-300)))_border-box]',\n 'group-focus-visible/spoke:outline-primary-500 group-focus-visible/spoke:outline group-focus-visible/spoke:outline-2 group-focus-visible/spoke:outline-offset-[3px]',\n active &&\n '-translate-y-0.5 scale-[1.04] border-transparent text-white shadow-xl [background:linear-gradient(150deg,var(--mieweb-primary-700),var(--mieweb-primary-900))_padding-box,linear-gradient(135deg,var(--mieweb-accent,var(--mieweb-primary-300)),var(--mieweb-primary-200)_55%,var(--mieweb-accent,var(--mieweb-primary-300)))_border-box]'\n )}\n >\n {icon}\n </span>\n );\n}\n\nfunction Detail({\n tag,\n title,\n description,\n media,\n caption,\n cta,\n href,\n hrefLabel,\n}: {\n tag?: string;\n title: string;\n description?: string;\n media?: React.ReactNode;\n caption?: string;\n cta?: { label: string; href: string };\n href?: string;\n hrefLabel?: string;\n}) {\n return (\n <div className=\"grid gap-3.5 motion-safe:animate-[mie-fade-in_0.25s_ease-out]\">\n {media && <div data-slot=\"radial-explorer-media\">{media}</div>}\n {tag && (\n <Badge\n size=\"sm\"\n className=\"w-fit text-[10px] font-bold tracking-[0.14em] uppercase\"\n >\n {tag}\n </Badge>\n )}\n <h3 className=\"text-foreground text-2xl leading-tight font-semibold\">\n {title}\n </h3>\n {description && (\n <p className=\"text-muted-foreground text-[15px] leading-snug\">\n {description}\n </p>\n )}\n {caption && <p className=\"text-muted-foreground text-sm\">{caption}</p>}\n {(cta || href) && (\n <div className=\"mt-1 flex flex-wrap items-center gap-3\">\n {cta && (\n <a href={cta.href} className={buttonVariants({ effect: 'sheen' })}>\n {cta.label}\n <ArrowRight size={16} aria-hidden className=\"rtl:-scale-x-100\" />\n </a>\n )}\n {href && (\n <a\n href={href}\n className=\"text-primary-800 dark:text-primary-200 text-sm font-semibold underline-offset-4 hover:underline\"\n >\n {hrefLabel}\n </a>\n )}\n </div>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
var chunkS7AMZ4RD_cjs = require('./chunk-S7AMZ4RD.cjs');
|
|
4
4
|
var chunkPLMXN23Q_cjs = require('./chunk-PLMXN23Q.cjs');
|
|
5
|
-
var
|
|
6
|
-
var chunkS2CJ57BX_cjs = require('./chunk-S2CJ57BX.cjs');
|
|
5
|
+
var chunk6L7CTEX2_cjs = require('./chunk-6L7CTEX2.cjs');
|
|
7
6
|
var chunkUPWIJC6I_cjs = require('./chunk-UPWIJC6I.cjs');
|
|
8
|
-
var chunkZ5S5JEJD_cjs = require('./chunk-Z5S5JEJD.cjs');
|
|
9
7
|
var chunkCPDNX3LS_cjs = require('./chunk-CPDNX3LS.cjs');
|
|
8
|
+
var chunkS2CJ57BX_cjs = require('./chunk-S2CJ57BX.cjs');
|
|
9
|
+
var chunkZ5S5JEJD_cjs = require('./chunk-Z5S5JEJD.cjs');
|
|
10
10
|
var chunkFSARTLUE_cjs = require('./chunk-FSARTLUE.cjs');
|
|
11
11
|
var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
|
|
12
12
|
var React3 = require('react');
|
|
@@ -800,7 +800,7 @@ function TextField({
|
|
|
800
800
|
multiline,
|
|
801
801
|
...props
|
|
802
802
|
}) {
|
|
803
|
-
const Control = multiline ?
|
|
803
|
+
const Control = multiline ? chunk6L7CTEX2_cjs.Textarea : chunkZ5S5JEJD_cjs.Input;
|
|
804
804
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
805
805
|
Control,
|
|
806
806
|
{
|
|
@@ -1271,7 +1271,7 @@ function EmailBlockSettings({
|
|
|
1271
1271
|
] });
|
|
1272
1272
|
case "html":
|
|
1273
1273
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1274
|
-
|
|
1274
|
+
chunk6L7CTEX2_cjs.Textarea,
|
|
1275
1275
|
{
|
|
1276
1276
|
label: f.html,
|
|
1277
1277
|
value: block.html,
|
|
@@ -2569,5 +2569,5 @@ exports.createEmptyEmailContentTree = createEmptyEmailContentTree;
|
|
|
2569
2569
|
exports.defaultEmailEditorLabels = defaultEmailEditorLabels;
|
|
2570
2570
|
exports.generateEmailBlockId = generateEmailBlockId;
|
|
2571
2571
|
exports.renderEmailMjml = renderEmailMjml;
|
|
2572
|
-
//# sourceMappingURL=chunk-
|
|
2573
|
-
//# sourceMappingURL=chunk-
|
|
2572
|
+
//# sourceMappingURL=chunk-LLIG4X6M.cjs.map
|
|
2573
|
+
//# sourceMappingURL=chunk-LLIG4X6M.cjs.map
|