@alfadocs/ui-kit-debug 1.63.0 → 1.65.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/{anamnesis-summary-rows-DFWws7mM.js → anamnesis-summary-rows-BIfw890v.js} +3 -3
- package/dist/_chunks/{anamnesis-summary-rows-DFWws7mM.js.map → anamnesis-summary-rows-BIfw890v.js.map} +1 -1
- package/dist/_chunks/{antenatal-schedule-timeline-DuaAQj1m.js → antenatal-schedule-timeline-DW_qkGo1.js} +3 -3
- package/dist/_chunks/{antenatal-schedule-timeline-DuaAQj1m.js.map → antenatal-schedule-timeline-DW_qkGo1.js.map} +1 -1
- package/dist/_chunks/{appointment-timeline-DaHKV81s.js → appointment-timeline-CCqjORFb.js} +2 -2
- package/dist/_chunks/{appointment-timeline-DaHKV81s.js.map → appointment-timeline-CCqjORFb.js.map} +1 -1
- package/dist/_chunks/{balance-badge-cell-tB4u0Nr4.js → balance-badge-cell-DZNthHO1.js} +3 -3
- package/dist/_chunks/{balance-badge-cell-tB4u0Nr4.js.map → balance-badge-cell-DZNthHO1.js.map} +1 -1
- package/dist/_chunks/{booking-CGhOtxad.js → booking-DkjatiXc.js} +5 -5
- package/dist/_chunks/{booking-CGhOtxad.js.map → booking-DkjatiXc.js.map} +1 -1
- package/dist/_chunks/{calendar-DCr65Kt1.js → calendar-BhN-jisv.js} +43 -40
- package/dist/_chunks/calendar-BhN-jisv.js.map +1 -0
- package/dist/_chunks/{calendar-workspace-BgcqB0PI.js → calendar-workspace-Cp8yTZ1g.js} +9 -9
- package/dist/_chunks/{calendar-workspace-BgcqB0PI.js.map → calendar-workspace-Cp8yTZ1g.js.map} +1 -1
- package/dist/_chunks/chart-CIzXxNeM.js +1322 -0
- package/dist/_chunks/chart-CIzXxNeM.js.map +1 -0
- package/dist/_chunks/{clinical-note-card-D2bbWksq.js → clinical-note-card-BnFTIs6x.js} +2 -2
- package/dist/_chunks/{clinical-note-card-D2bbWksq.js.map → clinical-note-card-BnFTIs6x.js.map} +1 -1
- package/dist/_chunks/{contact-profile-card-B4sjoIqf.js → contact-profile-card-C4-OCshj.js} +2 -2
- package/dist/_chunks/{contact-profile-card-B4sjoIqf.js.map → contact-profile-card-C4-OCshj.js.map} +1 -1
- package/dist/_chunks/{cycle-calculator-D-rwX9Pj.js → cycle-calculator-D2Y4LvgC.js} +3 -3
- package/dist/_chunks/{cycle-calculator-D-rwX9Pj.js.map → cycle-calculator-D2Y4LvgC.js.map} +1 -1
- package/dist/_chunks/{data-table-Ck2rIwWF.js → data-table-COoCQ4n_.js} +3 -3
- package/dist/_chunks/{data-table-Ck2rIwWF.js.map → data-table-COoCQ4n_.js.map} +1 -1
- package/dist/_chunks/{date-picker-BSZuKo13.js → date-picker-KcoNNsM0.js} +3 -3
- package/dist/_chunks/{date-picker-BSZuKo13.js.map → date-picker-KcoNNsM0.js.map} +1 -1
- package/dist/_chunks/{date-picker-variants-BnF-sHzq.js → date-picker-variants-DN37Oj5-.js} +2 -2
- package/dist/_chunks/{date-picker-variants-BnF-sHzq.js.map → date-picker-variants-DN37Oj5-.js.map} +1 -1
- package/dist/_chunks/{date-range-picker-CFk-5O3R.js → date-range-picker-CjcjUJLW.js} +4 -4
- package/dist/_chunks/{date-range-picker-CFk-5O3R.js.map → date-range-picker-CjcjUJLW.js.map} +1 -1
- package/dist/_chunks/{date-time-picker-CjxTkblD.js → date-time-picker-BVQNZ4yC.js} +3 -3
- package/dist/_chunks/{date-time-picker-CjxTkblD.js.map → date-time-picker-BVQNZ4yC.js.map} +1 -1
- package/dist/_chunks/{due-date-calculator-DTfxFJCM.js → due-date-calculator-41uZDkVR.js} +4 -4
- package/dist/_chunks/{due-date-calculator-DTfxFJCM.js.map → due-date-calculator-41uZDkVR.js.map} +1 -1
- package/dist/_chunks/escape-html-Cn9Fao6a.js +7 -0
- package/dist/_chunks/escape-html-Cn9Fao6a.js.map +1 -0
- package/dist/_chunks/{file-manager-k85OOFr4.js → file-manager-RiV7-OEE.js} +2 -2
- package/dist/_chunks/{file-manager-k85OOFr4.js.map → file-manager-RiV7-OEE.js.map} +1 -1
- package/dist/_chunks/{format-price-BKle6Xwt.js → format-price-BcFBa-WP.js} +2 -2
- package/dist/_chunks/{format-price-BKle6Xwt.js.map → format-price-BcFBa-WP.js.map} +1 -1
- package/dist/_chunks/{freemium-paywall-r-z48YaT.js → freemium-paywall-DKJHRFpp.js} +2 -2
- package/dist/_chunks/{freemium-paywall-r-z48YaT.js.map → freemium-paywall-DKJHRFpp.js.map} +1 -1
- package/dist/_chunks/{gestational-age-calculator-BnCAL5a-.js → gestational-age-calculator-CZYa2D6m.js} +5 -5
- package/dist/_chunks/{gestational-age-calculator-BnCAL5a-.js.map → gestational-age-calculator-CZYa2D6m.js.map} +1 -1
- package/dist/_chunks/{hcg-doubling-DVDiqFyp.js → hcg-doubling-DwTcjfke.js} +3 -3
- package/dist/_chunks/{hcg-doubling-DVDiqFyp.js.map → hcg-doubling-DwTcjfke.js.map} +1 -1
- package/dist/_chunks/{heatmap-Cp8Gn9q-.js → heatmap-BxRHM8Et.js} +5 -5
- package/dist/_chunks/heatmap-BxRHM8Et.js.map +1 -0
- package/dist/_chunks/intl-locale-FWh-Y5_3.js +33 -0
- package/dist/_chunks/intl-locale-FWh-Y5_3.js.map +1 -0
- package/dist/_chunks/{kit-extensions-RnddkrXn.js → kit-extensions-DWs1UEXb.js} +4 -4
- package/dist/_chunks/{kit-extensions-RnddkrXn.js.map → kit-extensions-DWs1UEXb.js.map} +1 -1
- package/dist/_chunks/{link-cell-renderer-dtEYlxi2.js → link-cell-renderer-CtTsvfPY.js} +2 -2
- package/dist/_chunks/{link-cell-renderer-dtEYlxi2.js.map → link-cell-renderer-CtTsvfPY.js.map} +1 -1
- package/dist/_chunks/{money-CeClE1nH.js → money-Tsczpjfz.js} +2 -2
- package/dist/_chunks/{money-CeClE1nH.js.map → money-Tsczpjfz.js.map} +1 -1
- package/dist/_chunks/{note-attachment-D8V7PUiR.js → note-attachment-DIlIQ7JF.js} +14 -16
- package/dist/_chunks/note-attachment-DIlIQ7JF.js.map +1 -0
- package/dist/_chunks/{note-timeline-CwxPQ2Ak.js → note-timeline-DDqNU46n.js} +2 -2
- package/dist/_chunks/{note-timeline-CwxPQ2Ak.js.map → note-timeline-DDqNU46n.js.map} +1 -1
- package/dist/_chunks/{notes-panel-BRLc2ozF.js → notes-panel-uEGIL7mi.js} +2 -2
- package/dist/_chunks/{notes-panel-BRLc2ozF.js.map → notes-panel-uEGIL7mi.js.map} +1 -1
- package/dist/_chunks/{parse-jZ-i8Xgj.js → parse-UB4FJGNA.js} +2 -2
- package/dist/_chunks/{parse-jZ-i8Xgj.js.map → parse-UB4FJGNA.js.map} +1 -1
- package/dist/_chunks/{patient-details-BY8Rwwpi.js → patient-details-4P1vA9Ls.js} +2 -2
- package/dist/_chunks/{patient-details-BY8Rwwpi.js.map → patient-details-4P1vA9Ls.js.map} +1 -1
- package/dist/_chunks/{patient-field-row-C8ymfffP.js → patient-field-row-CBXhlfGD.js} +2 -2
- package/dist/_chunks/{patient-field-row-C8ymfffP.js.map → patient-field-row-CBXhlfGD.js.map} +1 -1
- package/dist/_chunks/{patient-summary-card-cmqjIXMk.js → patient-summary-card-CuDLo8MP.js} +2 -2
- package/dist/_chunks/{patient-summary-card-cmqjIXMk.js.map → patient-summary-card-CuDLo8MP.js.map} +1 -1
- package/dist/_chunks/{payment-form-i90DUuNK.js → payment-form-C3dGY7v4.js} +2 -2
- package/dist/_chunks/{payment-form-i90DUuNK.js.map → payment-form-C3dGY7v4.js.map} +1 -1
- package/dist/_chunks/{practice-results-B8L9ZmtR.js → practice-results-8h2Utpt3.js} +2 -2
- package/dist/_chunks/{practice-results-B8L9ZmtR.js.map → practice-results-8h2Utpt3.js.map} +1 -1
- package/dist/_chunks/{pregnancy-dating-D2XTELiw.js → pregnancy-dating-B8wo4l_r.js} +5 -5
- package/dist/_chunks/{pregnancy-dating-D2XTELiw.js.map → pregnancy-dating-B8wo4l_r.js.map} +1 -1
- package/dist/_chunks/{radiograph-panel.agent-DDNUo4Ul.js → radiograph-panel.agent-8Ewv8-d7.js} +3 -3
- package/dist/_chunks/{radiograph-panel.agent-DDNUo4Ul.js.map → radiograph-panel.agent-8Ewv8-d7.js.map} +1 -1
- package/dist/_chunks/{sparkline-pkGPCXbl.js → sparkline-SnniCoCl.js} +72 -64
- package/dist/_chunks/sparkline-SnniCoCl.js.map +1 -0
- package/dist/_chunks/subDays-xH7cpN6B.js +8 -0
- package/dist/_chunks/{subDays-DlMw8Xng.js.map → subDays-xH7cpN6B.js.map} +1 -1
- package/dist/_chunks/{task-editor-DoiOzNiC.js → task-editor-CifOznfq.js} +2 -2
- package/dist/_chunks/{task-editor-DoiOzNiC.js.map → task-editor-CifOznfq.js.map} +1 -1
- package/dist/_chunks/{treatment-receipt-BdJ36vNP.js → treatment-receipt-Cpm8tqQN.js} +2 -2
- package/dist/_chunks/{treatment-receipt-BdJ36vNP.js.map → treatment-receipt-Cpm8tqQN.js.map} +1 -1
- package/dist/_chunks/{use-appointment-details-read-D6Gb_OuN.js → use-appointment-details-read-B-FEWbQM.js} +5 -5
- package/dist/_chunks/{use-appointment-details-read-D6Gb_OuN.js.map → use-appointment-details-read-B-FEWbQM.js.map} +1 -1
- package/dist/agent-catalog.json +1 -1
- package/dist/components/_shared/escape-html.d.ts +7 -0
- package/dist/components/_shared/escape-html.d.ts.map +1 -0
- package/dist/components/_shared/intl-locale.d.ts +5 -3
- package/dist/components/_shared/intl-locale.d.ts.map +1 -1
- package/dist/components/_shared/note-markdown.d.ts.map +1 -1
- package/dist/components/_shared/use-apex-legend-scroll.d.ts.map +1 -1
- package/dist/components/_shared/use-apex-radial-centre.d.ts +19 -0
- package/dist/components/_shared/use-apex-radial-centre.d.ts.map +1 -0
- package/dist/components/appointment-details-panel/index.js +1 -1
- package/dist/components/appointment-timeline/index.js +1 -1
- package/dist/components/booking/index.js +1 -1
- package/dist/components/calendar/calendar.d.ts.map +1 -1
- package/dist/components/calendar/index.js +1 -1
- package/dist/components/chart/chart.d.ts +8 -5
- package/dist/components/chart/chart.d.ts.map +1 -1
- package/dist/components/chart/index.js +1 -1
- package/dist/components/clinical-note-card/index.js +1 -1
- package/dist/components/contact-profile-card/index.js +1 -1
- package/dist/components/cycle-calculator/index.js +1 -1
- package/dist/components/data-table/data-table.d.ts.map +1 -1
- package/dist/components/data-table/index.js +2 -2
- package/dist/components/date-picker/index.js +1 -1
- package/dist/components/date-range-picker/index.js +1 -1
- package/dist/components/date-time-picker/index.js +1 -1
- package/dist/components/due-date-calculator/index.js +2 -2
- package/dist/components/file-manager/index.js +1 -1
- package/dist/components/freemium-paywall/index.js +1 -1
- package/dist/components/gestational-age-calculator/index.js +1 -1
- package/dist/components/hcg-doubling/index.js +1 -1
- package/dist/components/heatmap/heatmap-model.d.ts +4 -1
- package/dist/components/heatmap/heatmap-model.d.ts.map +1 -1
- package/dist/components/heatmap/heatmap.d.ts +3 -1
- package/dist/components/heatmap/heatmap.d.ts.map +1 -1
- package/dist/components/heatmap/index.js +1 -1
- package/dist/components/money/index.js +1 -1
- package/dist/components/note-timeline/index.js +1 -1
- package/dist/components/notes-panel/index.js +1 -1
- package/dist/components/patient-details/index.js +1 -1
- package/dist/components/patient-summary-card/index.js +1 -1
- package/dist/components/patient-table/index.js +1 -1
- package/dist/components/payment-form/index.js +1 -1
- package/dist/components/practice-results/index.js +1 -1
- package/dist/components/pregnancy-dating/index.js +1 -1
- package/dist/components/radiograph-panel/index.js +1 -1
- package/dist/components/rich-text-editor/index.js +1 -1
- package/dist/components/sparkline/index.js +1 -1
- package/dist/components/sparkline/sparkline.d.ts.map +1 -1
- package/dist/components/task-editor/index.js +1 -1
- package/dist/components/treatment-receipt/index.js +1 -1
- package/dist/index.js +36 -36
- package/dist/patterns/anamnesis/index.js +1 -1
- package/dist/patterns/calendar/index.js +1 -1
- package/dist/tokens.css +16 -1
- package/package.json +1 -1
- package/dist/_chunks/calendar-DCr65Kt1.js.map +0 -1
- package/dist/_chunks/chart-BAeJ7pvD.js +0 -1120
- package/dist/_chunks/chart-BAeJ7pvD.js.map +0 -1
- package/dist/_chunks/heatmap-Cp8Gn9q-.js.map +0 -1
- package/dist/_chunks/intl-locale-ySteXlDD.js +0 -23
- package/dist/_chunks/intl-locale-ySteXlDD.js.map +0 -1
- package/dist/_chunks/note-attachment-D8V7PUiR.js.map +0 -1
- package/dist/_chunks/sparkline-pkGPCXbl.js.map +0 -1
- package/dist/_chunks/subDays-DlMw8Xng.js +0 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"radiograph-panel.agent-DDNUo4Ul.js","sources":["../../node_modules/lucide-react/dist/esm/icons/git-compare-arrows.mjs","../../node_modules/lucide-react/dist/esm/icons/images.mjs","../../src/components/radiograph-panel/radiograph-panel.tsx","../../src/components/radiograph-panel/radiograph-panel.agent.ts"],"sourcesContent":["/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"circle\", { cx: \"5\", cy: \"6\", r: \"3\", key: \"1qnov2\" }],\n [\"path\", { d: \"M12 6h5a2 2 0 0 1 2 2v7\", key: \"1yj91y\" }],\n [\"path\", { d: \"m15 9-3-3 3-3\", key: \"1lwv8l\" }],\n [\"circle\", { cx: \"19\", cy: \"18\", r: \"3\", key: \"1qljk2\" }],\n [\"path\", { d: \"M12 18H7a2 2 0 0 1-2-2V9\", key: \"16sdep\" }],\n [\"path\", { d: \"m9 15 3 3-3 3\", key: \"1m3kbl\" }]\n];\nconst GitCompareArrows = createLucideIcon(\"git-compare-arrows\", __iconNode);\n\nexport { __iconNode, GitCompareArrows as default };\n//# sourceMappingURL=git-compare-arrows.mjs.map\n","/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"m22 11-1.296-1.296a2.4 2.4 0 0 0-3.408 0L11 16\", key: \"9kzy35\" }],\n [\"path\", { d: \"M4 8a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2\", key: \"1t0f0t\" }],\n [\"circle\", { cx: \"13\", cy: \"7\", r: \"1\", fill: \"currentColor\", key: \"1obus6\" }],\n [\"rect\", { x: \"8\", y: \"2\", width: \"14\", height: \"14\", rx: \"2\", key: \"1gvhby\" }]\n];\nconst Images = createLucideIcon(\"images\", __iconNode);\n\nexport { __iconNode, Images as default };\n//# sourceMappingURL=images.mjs.map\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactElement,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n Upload,\n ZoomIn,\n ZoomOut,\n ChevronLeft,\n ChevronRight,\n Trash2,\n Eye,\n GitCompareArrows,\n Images,\n} from 'lucide-react';\nimport type { FdiId, Radiograph, RadiographKind } from '../tooth-scheme';\nimport { Dialog } from '../dialog';\nimport { Button } from '../button';\nimport { IconButton } from '../icon-button';\nimport { Badge } from '../badge';\nimport { FormField } from '../form-field';\nimport { TextArea } from '../text-area';\nimport { FileUpload } from '../file-upload';\nimport { DatePicker } from '../date-picker';\nimport { DateRangePicker, type DateRangeValue } from '../date-range-picker';\nimport { EmptyState } from '../empty-state';\nimport { PanelHeader } from '../panel-header';\n\n/* ------------------------------------------------------------------ */\n/* RadiographPanel — the Imaging tool for the Control Room rail. */\n/* */\n/* Shows one tooth's radiographs (x-rays / endorali): an upload */\n/* composer, a sortable + date-filtered history, and a fullscreen */\n/* viewer that zooms / steps / compares films. Drops into a */\n/* `ControlRoomRail` tool `panel`, the patient profile, or a care-plan */\n/* editor — anywhere a selected tooth's imaging belongs. The host owns */\n/* the films (`radiographs`) and persistence (`onAddRadiograph` / */\n/* `onDeleteRadiograph`); the panel owns only view state. The chart */\n/* drives selection via `ToothScheme.onOpenRadiographs(toothId)`. */\n/* */\n/* Image urls are opaque / consumer-hosted — never bundled. Real */\n/* radiographs are PHI; stories use synthetic placeholders only. */\n/* ------------------------------------------------------------------ */\n\nconst ZOOM_CLASS = ['ds:scale-100', 'ds:scale-150', 'ds:scale-200'] as const;\n\n/** Sort films newest-first (or oldest-first); undated films sink to the end in\n * BOTH directions — mirrors `ToothScheme.sortByDateDesc`. */\nfunction sortByDate(films: Radiograph[], desc: boolean): Radiograph[] {\n return [...films].sort((a, b) => {\n if (a.date === b.date) return 0;\n if (!a.date) return 1;\n if (!b.date) return -1;\n return (a.date < b.date ? -1 : 1) * (desc ? -1 : 1);\n });\n}\n\n/** Date-range membership. ISO `YYYY-MM-DD` is parsed at LOCAL midnight (the\n * `+'T00:00:00'`) so the filter agrees with the local-midnight `Date` objects\n * the DateRangePicker emits — without it, films are off-by-one west of UTC. */\nfunction inRange(film: Radiograph, range: DateRangeValue): boolean {\n if (!film.date) return !range.from && !range.to;\n const d = new Date(`${film.date}T00:00:00`);\n if (range.from && d < range.from) return false;\n if (range.to && d > range.to) return false;\n return true;\n}\n\n/** Local `YYYY-MM-DD` — avoids the UTC shift `Date.toISOString()` introduces\n * west of UTC for the local-midnight Date the DatePicker emits. */\nfunction toLocalIsoDate(d: Date): string {\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n}\n\nexport interface RadiographPanelHandle {\n /** Read the films currently shown (after the host's `radiographs` prop). */\n getRadiographs: () => Radiograph[];\n /** Open the fullscreen viewer on a film by id. */\n openViewer: (id: string) => void;\n /** Close the fullscreen viewer. */\n closeViewer: () => void;\n}\n\nexport interface RadiographPanelProps extends Omit<\n HTMLAttributes<HTMLElement>,\n 'title' | 'children'\n> {\n /** Instance id — emitted as `data-component-id` for the agent registry. */\n id?: string;\n /** The tooth whose films are shown (FDI id). Null → a \"select a tooth\" prompt. */\n toothId?: FdiId | null;\n /** Display label for the selected tooth. Defaults to the localised \"Tooth {{id}}\". */\n toothLabel?: string;\n /** The selected tooth's films. The panel sorts + filters; order in is irrelevant. */\n radiographs?: Radiograph[];\n /** Commit a new film (the host persists it). Omit to hide the upload composer. */\n onAddRadiograph?: (draft: {\n fileName: string;\n date?: string;\n note?: string;\n }) => void;\n /** Remove a film by id. Omit to hide the delete affordance. */\n onDeleteRadiograph?: (id: string) => void;\n /** Panel heading. Defaults to the localised \"Imaging\". */\n title?: string;\n /** Accessible name for the panel region (defaults to `title`). */\n 'aria-label'?: string;\n}\n\nfunction KindBadge({ kind }: { kind: RadiographKind }): ReactElement {\n const { t } = useTranslation('ui');\n const label = t(`radiographPanel.kind.${kind}`, {\n defaultValue: {\n periapical: 'Periapical',\n bitewing: 'Bitewing',\n panoramic: 'Panoramic',\n other: 'Other',\n }[kind],\n });\n return (\n <Badge variant=\"neutral\" size=\"sm\">\n {label}\n </Badge>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Fullscreen viewer — lightbox + compare */\n/* ------------------------------------------------------------------ */\n\ninterface ViewerState {\n films: Radiograph[];\n index: number;\n compare: boolean;\n}\n\nfunction RadiographViewer({\n state,\n toothLabel,\n onClose,\n onIndexChange,\n}: {\n state: ViewerState | null;\n toothLabel: string;\n onClose: () => void;\n onIndexChange: (index: number) => void;\n}): ReactElement {\n const { t } = useTranslation('ui');\n const [zoom, setZoom] = useState(0);\n // Reset zoom when the viewed film changes (prev/next) or the mode flips, so a\n // user doesn't carry one film's zoom into the next.\n useEffect(() => {\n setZoom(0);\n }, [state?.index, state?.compare]);\n const films = state?.films ?? [];\n const current = state ? films[state.index] : undefined;\n\n return (\n <Dialog.Root\n open={state !== null}\n onOpenChange={(next) => {\n if (!next) {\n setZoom(0);\n onClose();\n }\n }}\n >\n <Dialog.Content size=\"fullscreen\" aria-describedby={undefined}>\n <Dialog.Header>\n <Dialog.Title>\n {state?.compare\n ? t('radiographPanel.viewer.compareTitle', {\n defaultValue: '{{tooth}} — comparison',\n tooth: toothLabel,\n })\n : t('radiographPanel.viewer.title', {\n defaultValue: '{{tooth}} — radiograph',\n tooth: toothLabel,\n })}\n </Dialog.Title>\n </Dialog.Header>\n <Dialog.Body>\n {state?.compare ? (\n <div className=\"ds:grid ds:grid-cols-2 ds:gap-[var(--spacing-md)]\">\n {films.slice(0, 2).map((film) => (\n <figure\n key={film.id}\n className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-xs)]\"\n >\n <div className=\"ds:flex ds:items-center ds:justify-center ds:overflow-hidden ds:rounded-[var(--radius-md)] ds:bg-[var(--muted)] ds:p-[var(--spacing-xs)]\">\n <img\n src={film.thumbnailUrl ?? film.url}\n alt={film.alt ?? toothLabel}\n className=\"ds:max-h-full ds:max-w-full ds:object-contain\"\n />\n </div>\n <figcaption className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {film.date}\n </figcaption>\n </figure>\n ))}\n </div>\n ) : (\n <div className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-sm)]\">\n <div className=\"ds:flex ds:max-h-full ds:items-center ds:justify-center ds:overflow-hidden ds:rounded-[var(--radius-md)] ds:bg-[var(--muted)] ds:p-[var(--spacing-sm)]\">\n <img\n src={current?.thumbnailUrl ?? current?.url}\n alt={current?.alt ?? toothLabel}\n className={[\n 'ds:max-h-full ds:max-w-full ds:object-contain',\n 'ds:origin-center ds:transition-transform ds:motion-reduce:transition-none',\n ZOOM_CLASS[zoom],\n ].join(' ')}\n />\n </div>\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <IconButton\n icon={<ChevronLeft aria-hidden=\"true\" />}\n aria-label={t('radiographPanel.viewer.prev', {\n defaultValue: 'Previous radiograph',\n })}\n size=\"sm\"\n flipIconInRtl\n disabled={!state || state.index === 0}\n onClick={() =>\n state && onIndexChange(Math.max(0, state.index - 1))\n }\n />\n <span\n aria-live=\"polite\"\n className=\"type-meta ds:text-[color:var(--muted-foreground)]\"\n >\n {t('radiographPanel.viewer.position', {\n defaultValue: '{{current}} / {{total}}',\n current: (state?.index ?? 0) + 1,\n total: films.length,\n })}\n </span>\n <IconButton\n icon={<ChevronRight aria-hidden=\"true\" />}\n aria-label={t('radiographPanel.viewer.next', {\n defaultValue: 'Next radiograph',\n })}\n size=\"sm\"\n flipIconInRtl\n disabled={!state || state.index >= films.length - 1}\n onClick={() =>\n state &&\n onIndexChange(Math.min(films.length - 1, state.index + 1))\n }\n />\n <span\n aria-hidden=\"true\"\n className=\"ds:ms-[var(--spacing-xs)] ds:me-[var(--spacing-xs)] ds:h-[var(--spacing-md)] ds:w-px ds:bg-[var(--border)]\"\n />\n <IconButton\n icon={<ZoomOut aria-hidden=\"true\" />}\n aria-label={t('radiographPanel.viewer.zoomOut', {\n defaultValue: 'Zoom out',\n })}\n size=\"sm\"\n disabled={zoom === 0}\n onClick={() => setZoom((z) => Math.max(0, z - 1))}\n />\n <IconButton\n icon={<ZoomIn aria-hidden=\"true\" />}\n aria-label={t('radiographPanel.viewer.zoomIn', {\n defaultValue: 'Zoom in',\n })}\n size=\"sm\"\n disabled={zoom === ZOOM_CLASS.length - 1}\n onClick={() =>\n setZoom((z) => Math.min(ZOOM_CLASS.length - 1, z + 1))\n }\n />\n </div>\n {current?.note ? (\n <p className=\"type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {current.note}\n </p>\n ) : null}\n </div>\n )}\n </Dialog.Body>\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* RadiographPanel */\n/* ------------------------------------------------------------------ */\n\nexport const RadiographPanel = forwardRef<\n RadiographPanelHandle,\n RadiographPanelProps\n>(function RadiographPanel(\n {\n id,\n toothId,\n toothLabel: toothLabelProp,\n radiographs = [],\n onAddRadiograph,\n onDeleteRadiograph,\n title,\n 'aria-label': ariaLabel,\n className,\n ...rest\n },\n ref,\n) {\n const { t } = useTranslation('ui');\n\n const [viewer, setViewer] = useState<ViewerState | null>(null);\n const [compareIds, setCompareIds] = useState<string[]>([]);\n const [sortDesc, setSortDesc] = useState(true);\n const [range, setRange] = useState<DateRangeValue>({});\n const [pendingFile, setPendingFile] = useState<string | null>(null);\n const [date, setDate] = useState<Date | undefined>(undefined);\n const [note, setNote] = useState('');\n\n // Stable, current snapshot for the imperative handle.\n const filmsRef = useRef<Radiograph[]>(radiographs);\n filmsRef.current = radiographs;\n\n useImperativeHandle(\n ref,\n () => ({\n getRadiographs: () => filmsRef.current,\n openViewer: (filmId) => {\n const index = filmsRef.current.findIndex((f) => f.id === filmId);\n if (index >= 0) {\n setViewer({ films: filmsRef.current, index, compare: false });\n }\n },\n closeViewer: () => setViewer(null),\n }),\n [],\n );\n\n const heading =\n title ?? t('radiographPanel.title', { defaultValue: 'Imaging' });\n const toothLabel =\n toothLabelProp ??\n (toothId\n ? t('radiographPanel.toothLabel', {\n defaultValue: 'Tooth {{id}}',\n id: toothId,\n })\n : '');\n\n const visible = useMemo(\n () =>\n sortByDate(\n radiographs.filter((f) => inRange(f, range)),\n sortDesc,\n ),\n [radiographs, range, sortDesc],\n );\n\n const toggleCompare = useCallback((filmId: string) => {\n setCompareIds((ids) =>\n ids.includes(filmId)\n ? ids.filter((x) => x !== filmId)\n : [...ids, filmId].slice(-2),\n );\n }, []);\n\n const handleUpload = useCallback(() => {\n if (!pendingFile || !onAddRadiograph) return;\n onAddRadiograph({\n fileName: pendingFile,\n date: date ? toLocalIsoDate(date) : undefined,\n note: note || undefined,\n });\n setPendingFile(null);\n setNote('');\n setDate(undefined);\n }, [pendingFile, date, note, onAddRadiograph]);\n\n // History filter controls — pinned in the PanelHeader's filters row (only\n // meaningful once a tooth is selected) so they stay put as the list scrolls.\n const historyFilters = toothId ? (\n <>\n <FormField\n label={t('radiographPanel.history.range', {\n defaultValue: 'Date range',\n })}\n >\n <DateRangePicker value={range} onChange={setRange} />\n </FormField>\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n <Button intent=\"ghost\" size=\"sm\" onClick={() => setSortDesc((s) => !s)}>\n {sortDesc\n ? t('radiographPanel.history.sortNewest', {\n defaultValue: 'Newest first',\n })\n : t('radiographPanel.history.sortOldest', {\n defaultValue: 'Oldest first',\n })}\n </Button>\n <Button\n intent=\"ghost\"\n size=\"sm\"\n startIcon={<GitCompareArrows aria-hidden=\"true\" />}\n disabled={compareIds.length !== 2}\n onClick={() => {\n const films = radiographs.filter((f) => compareIds.includes(f.id));\n if (films.length === 2) {\n setViewer({ films, index: 0, compare: true });\n }\n }}\n >\n {t('radiographPanel.history.compare', {\n defaultValue: 'Compare',\n })}\n </Button>\n </div>\n </>\n ) : undefined;\n\n return (\n <section\n data-component=\"radiograph-panel\"\n data-component-id={id}\n data-tooth={toothId ?? undefined}\n aria-label={ariaLabel ?? heading}\n className={['ds:flex ds:flex-col', className].filter(Boolean).join(' ')}\n {...rest}\n >\n {/* Shared rail-panel header: title + film-count badge, history filters\n pinned beneath, divider, sticky so it stays visible as the list\n scrolls. The rail injects favourite/close into the action cluster. */}\n <PanelHeader\n sticky\n icon={<Images aria-hidden=\"true\" />}\n title={\n <>\n {toothId ? toothLabel : heading}\n {toothId ? (\n <Badge variant=\"info\" size=\"sm\">\n {radiographs.length}\n </Badge>\n ) : null}\n </>\n }\n filters={historyFilters}\n />\n\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)] ds:p-[var(--spacing-md)]\">\n {!toothId ? (\n <EmptyState\n variant=\"first-use\"\n title={t('radiographPanel.noTooth.title', {\n defaultValue: 'No tooth selected',\n })}\n description={t('radiographPanel.noTooth.body', {\n defaultValue:\n 'Select a tooth on the chart to view its radiographs.',\n })}\n />\n ) : (\n <>\n {/* Upload */}\n {onAddRadiograph ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <FormField\n label={t('radiographPanel.upload.file', {\n defaultValue: 'Image file',\n })}\n >\n <FileUpload\n accept={{ 'image/*': ['.png', '.jpg', '.jpeg', '.webp'] }}\n variant=\"both\"\n showPreview\n onDrop={(accepted) =>\n setPendingFile(accepted[0]?.name ?? null)\n }\n />\n </FormField>\n <FormField\n label={t('radiographPanel.upload.date', {\n defaultValue: 'Acquisition date',\n })}\n >\n <DatePicker value={date} onChange={(d) => setDate(d)} />\n </FormField>\n <FormField\n label={t('radiographPanel.upload.note', {\n defaultValue: 'Note (optional)',\n })}\n >\n <TextArea\n rows={2}\n value={note}\n onChange={(e) => setNote(e.target.value)}\n placeholder={t('radiographPanel.upload.notePlaceholder', {\n defaultValue: 'E.g. routine check, apical lesion…',\n })}\n />\n </FormField>\n <Button\n intent=\"primary\"\n size=\"sm\"\n startIcon={<Upload aria-hidden=\"true\" />}\n disabled={!pendingFile}\n onClick={handleUpload}\n className=\"ds:self-start\"\n >\n {t('radiographPanel.upload.submit', {\n defaultValue: 'Upload',\n })}\n </Button>\n </div>\n ) : null}\n\n {/* History */}\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {visible.length === 0 ? (\n <EmptyState\n variant=\"first-use\"\n title={t('radiographPanel.history.emptyTitle', {\n defaultValue: 'No radiographs yet',\n })}\n description={t('radiographPanel.history.emptyBody', {\n defaultValue: 'Upload the first film for this tooth.',\n })}\n />\n ) : (\n <ul className=\"ds:m-0 ds:flex ds:list-none ds:flex-col ds:gap-[var(--spacing-xs)] ds:p-0\">\n {visible.map((film, visibleIndex) => {\n const selected = compareIds.includes(film.id);\n // Disambiguate the repeated row actions for screen readers by\n // the film's date (falls back to its 1-based position).\n const filmLabel = film.date ?? String(visibleIndex + 1);\n return (\n <li\n key={film.id}\n data-radiograph-id={film.id}\n data-selected={selected}\n className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)] ds:rounded-[var(--radius-md)] ds:border ds:border-[color:var(--card-border)] ds:bg-[var(--card)] ds:p-[var(--spacing-xs)] ds:data-[selected=true]:border-[color:var(--info-foreground)]\"\n >\n <img\n src={film.thumbnailUrl ?? film.url}\n alt={film.alt ?? ''}\n className=\"ds:h-16 ds:w-12 ds:shrink-0 ds:rounded-[var(--radius-sm)] ds:object-cover\"\n />\n <div className=\"ds:flex ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <span className=\"type-body-sm ds:text-[color:var(--foreground)]\">\n {film.date}\n </span>\n <KindBadge kind={film.kind ?? 'periapical'} />\n </div>\n <IconButton\n icon={<Eye aria-hidden=\"true\" />}\n aria-label={t('radiographPanel.history.view', {\n defaultValue: 'View radiograph {{film}}',\n film: filmLabel,\n })}\n size=\"sm\"\n intent=\"ghost\"\n // Step the viewer through the FILTERED + sorted list the\n // user is looking at, not every film on the tooth.\n onClick={() =>\n setViewer({\n films: visible,\n index: visibleIndex,\n compare: false,\n })\n }\n />\n <IconButton\n icon={<GitCompareArrows aria-hidden=\"true\" />}\n aria-label={\n selected\n ? t('radiographPanel.history.compareRemove', {\n defaultValue:\n 'Remove {{film}} from comparison',\n film: filmLabel,\n })\n : t('radiographPanel.history.compareAdd', {\n defaultValue:\n 'Select {{film}} for comparison',\n film: filmLabel,\n })\n }\n aria-pressed={selected}\n size=\"sm\"\n intent={selected ? 'secondary' : 'ghost'}\n onClick={() => toggleCompare(film.id)}\n />\n {onDeleteRadiograph ? (\n <IconButton\n icon={<Trash2 aria-hidden=\"true\" />}\n aria-label={t('radiographPanel.history.delete', {\n defaultValue: 'Delete radiograph {{film}}',\n film: filmLabel,\n })}\n size=\"sm\"\n intent=\"ghost\"\n onClick={() => onDeleteRadiograph(film.id)}\n />\n ) : null}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </>\n )}\n </div>\n\n <RadiographViewer\n state={viewer}\n toothLabel={toothLabel}\n onClose={() => setViewer(null)}\n onIndexChange={(index) => setViewer((v) => (v ? { ...v, index } : v))}\n />\n </section>\n );\n});\n\n// `Images` is the panel's imaging glyph (a films archive, not a radiation\n// hazard) — re-exported so a host registering the Control Room tool can use\n// the same icon as the panel.\nexport { Images as RadiographPanelIcon };\n","import type { AgentAdapter } from '../../agent/types';\nimport type { RadiographPanelHandle } from './radiograph-panel';\nimport type { Radiograph } from '../tooth-scheme';\n\n/**\n * The Imaging panel for the Control Room rail. It DISPLAYS the selected tooth's\n * radiographs and drives the fullscreen viewer; uploads and deletes are the\n * host's responsibility (the `onAddRadiograph` / `onDeleteRadiograph` props),\n * so they are not exposed here — the consuming pattern/app owns those `write` /\n * `destructive` workflows and their `radiograph.*` API contracts.\n */\nexport const radiographPanelAgent: AgentAdapter<RadiographPanelHandle> = {\n id: 'radiograph-panel',\n // pick — open a specific film in the viewer; view_change — the viewer is a\n // view surface over the host-owned films.\n capabilities: ['pick', 'view_change'],\n state: {\n radiographs: {\n // A9: structural refs only (id + kind) — never the free-text `note`,\n // service dates, or consumer-hosted image URLs in the always-on snapshot.\n type: 'Array<{ id: string; kind?: string }>',\n descriptionKey: 'ui.agent.radiographPanel.state.radiographs',\n description:\n 'Structural references (id + kind) to the films shown for the selected tooth.',\n read: (handle) =>\n handle\n .getRadiographs()\n .map((film) => ({ id: film.id, kind: film.kind ?? 'periapical' })),\n },\n },\n actions: {\n view_radiograph: {\n safety: 'read',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: { id: { type: 'string' } },\n required: ['id'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.radiographPanel.actions.viewRadiograph',\n description: 'Open a film in the fullscreen viewer by id.',\n invoke: (handle, args: { id: string }) => {\n handle.openViewer(args.id);\n },\n },\n close_viewer: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.radiographPanel.actions.closeViewer',\n description: 'Close the fullscreen radiograph viewer.',\n invoke: (handle) => {\n handle.closeViewer();\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'radiograph-panel' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n item: {\n attr: 'data-radiograph-id',\n description:\n \"Each film row (`<li>`) carries its radiograph id as `data-radiograph-id`. The panel root additionally carries the selected tooth's FDI id as `data-tooth`.\",\n },\n },\n};\n\n// Re-exported for callers building typed reads against the adapter.\nexport type { Radiograph };\n"],"names":["__iconNode","GitCompareArrows","createLucideIcon","Images","ZOOM_CLASS","sortByDate","films","desc","a","b","inRange","film","range","d","toLocalIsoDate","pad","n","KindBadge","kind","t","useTranslation","label","Badge","RadiographViewer","state","toothLabel","onClose","onIndexChange","zoom","setZoom","useState","useEffect","current","jsx","Dialog","next","jsxs","IconButton","ChevronLeft","ChevronRight","ZoomOut","z","ZoomIn","RadiographPanel","forwardRef","id","toothId","toothLabelProp","radiographs","onAddRadiograph","onDeleteRadiograph","title","ariaLabel","className","rest","ref","viewer","setViewer","compareIds","setCompareIds","sortDesc","setSortDesc","setRange","pendingFile","setPendingFile","date","setDate","note","setNote","filmsRef","useRef","useImperativeHandle","filmId","index","f","heading","visible","useMemo","toggleCompare","useCallback","ids","x","handleUpload","historyFilters","Fragment","FormField","DateRangePicker","Button","s","PanelHeader","FileUpload","accepted","_a","DatePicker","TextArea","e","Upload","EmptyState","visibleIndex","selected","filmLabel","Eye","Trash2","v","radiographPanelAgent","handle","args"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
1
|
+
{"version":3,"file":"radiograph-panel.agent-8Ewv8-d7.js","sources":["../../node_modules/lucide-react/dist/esm/icons/git-compare-arrows.mjs","../../node_modules/lucide-react/dist/esm/icons/images.mjs","../../src/components/radiograph-panel/radiograph-panel.tsx","../../src/components/radiograph-panel/radiograph-panel.agent.ts"],"sourcesContent":["/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"circle\", { cx: \"5\", cy: \"6\", r: \"3\", key: \"1qnov2\" }],\n [\"path\", { d: \"M12 6h5a2 2 0 0 1 2 2v7\", key: \"1yj91y\" }],\n [\"path\", { d: \"m15 9-3-3 3-3\", key: \"1lwv8l\" }],\n [\"circle\", { cx: \"19\", cy: \"18\", r: \"3\", key: \"1qljk2\" }],\n [\"path\", { d: \"M12 18H7a2 2 0 0 1-2-2V9\", key: \"16sdep\" }],\n [\"path\", { d: \"m9 15 3 3-3 3\", key: \"1m3kbl\" }]\n];\nconst GitCompareArrows = createLucideIcon(\"git-compare-arrows\", __iconNode);\n\nexport { __iconNode, GitCompareArrows as default };\n//# sourceMappingURL=git-compare-arrows.mjs.map\n","/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"m22 11-1.296-1.296a2.4 2.4 0 0 0-3.408 0L11 16\", key: \"9kzy35\" }],\n [\"path\", { d: \"M4 8a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2\", key: \"1t0f0t\" }],\n [\"circle\", { cx: \"13\", cy: \"7\", r: \"1\", fill: \"currentColor\", key: \"1obus6\" }],\n [\"rect\", { x: \"8\", y: \"2\", width: \"14\", height: \"14\", rx: \"2\", key: \"1gvhby\" }]\n];\nconst Images = createLucideIcon(\"images\", __iconNode);\n\nexport { __iconNode, Images as default };\n//# sourceMappingURL=images.mjs.map\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactElement,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n Upload,\n ZoomIn,\n ZoomOut,\n ChevronLeft,\n ChevronRight,\n Trash2,\n Eye,\n GitCompareArrows,\n Images,\n} from 'lucide-react';\nimport type { FdiId, Radiograph, RadiographKind } from '../tooth-scheme';\nimport { Dialog } from '../dialog';\nimport { Button } from '../button';\nimport { IconButton } from '../icon-button';\nimport { Badge } from '../badge';\nimport { FormField } from '../form-field';\nimport { TextArea } from '../text-area';\nimport { FileUpload } from '../file-upload';\nimport { DatePicker } from '../date-picker';\nimport { DateRangePicker, type DateRangeValue } from '../date-range-picker';\nimport { EmptyState } from '../empty-state';\nimport { PanelHeader } from '../panel-header';\n\n/* ------------------------------------------------------------------ */\n/* RadiographPanel — the Imaging tool for the Control Room rail. */\n/* */\n/* Shows one tooth's radiographs (x-rays / endorali): an upload */\n/* composer, a sortable + date-filtered history, and a fullscreen */\n/* viewer that zooms / steps / compares films. Drops into a */\n/* `ControlRoomRail` tool `panel`, the patient profile, or a care-plan */\n/* editor — anywhere a selected tooth's imaging belongs. The host owns */\n/* the films (`radiographs`) and persistence (`onAddRadiograph` / */\n/* `onDeleteRadiograph`); the panel owns only view state. The chart */\n/* drives selection via `ToothScheme.onOpenRadiographs(toothId)`. */\n/* */\n/* Image urls are opaque / consumer-hosted — never bundled. Real */\n/* radiographs are PHI; stories use synthetic placeholders only. */\n/* ------------------------------------------------------------------ */\n\nconst ZOOM_CLASS = ['ds:scale-100', 'ds:scale-150', 'ds:scale-200'] as const;\n\n/** Sort films newest-first (or oldest-first); undated films sink to the end in\n * BOTH directions — mirrors `ToothScheme.sortByDateDesc`. */\nfunction sortByDate(films: Radiograph[], desc: boolean): Radiograph[] {\n return [...films].sort((a, b) => {\n if (a.date === b.date) return 0;\n if (!a.date) return 1;\n if (!b.date) return -1;\n return (a.date < b.date ? -1 : 1) * (desc ? -1 : 1);\n });\n}\n\n/** Date-range membership. ISO `YYYY-MM-DD` is parsed at LOCAL midnight (the\n * `+'T00:00:00'`) so the filter agrees with the local-midnight `Date` objects\n * the DateRangePicker emits — without it, films are off-by-one west of UTC. */\nfunction inRange(film: Radiograph, range: DateRangeValue): boolean {\n if (!film.date) return !range.from && !range.to;\n const d = new Date(`${film.date}T00:00:00`);\n if (range.from && d < range.from) return false;\n if (range.to && d > range.to) return false;\n return true;\n}\n\n/** Local `YYYY-MM-DD` — avoids the UTC shift `Date.toISOString()` introduces\n * west of UTC for the local-midnight Date the DatePicker emits. */\nfunction toLocalIsoDate(d: Date): string {\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n}\n\nexport interface RadiographPanelHandle {\n /** Read the films currently shown (after the host's `radiographs` prop). */\n getRadiographs: () => Radiograph[];\n /** Open the fullscreen viewer on a film by id. */\n openViewer: (id: string) => void;\n /** Close the fullscreen viewer. */\n closeViewer: () => void;\n}\n\nexport interface RadiographPanelProps extends Omit<\n HTMLAttributes<HTMLElement>,\n 'title' | 'children'\n> {\n /** Instance id — emitted as `data-component-id` for the agent registry. */\n id?: string;\n /** The tooth whose films are shown (FDI id). Null → a \"select a tooth\" prompt. */\n toothId?: FdiId | null;\n /** Display label for the selected tooth. Defaults to the localised \"Tooth {{id}}\". */\n toothLabel?: string;\n /** The selected tooth's films. The panel sorts + filters; order in is irrelevant. */\n radiographs?: Radiograph[];\n /** Commit a new film (the host persists it). Omit to hide the upload composer. */\n onAddRadiograph?: (draft: {\n fileName: string;\n date?: string;\n note?: string;\n }) => void;\n /** Remove a film by id. Omit to hide the delete affordance. */\n onDeleteRadiograph?: (id: string) => void;\n /** Panel heading. Defaults to the localised \"Imaging\". */\n title?: string;\n /** Accessible name for the panel region (defaults to `title`). */\n 'aria-label'?: string;\n}\n\nfunction KindBadge({ kind }: { kind: RadiographKind }): ReactElement {\n const { t } = useTranslation('ui');\n const label = t(`radiographPanel.kind.${kind}`, {\n defaultValue: {\n periapical: 'Periapical',\n bitewing: 'Bitewing',\n panoramic: 'Panoramic',\n other: 'Other',\n }[kind],\n });\n return (\n <Badge variant=\"neutral\" size=\"sm\">\n {label}\n </Badge>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Fullscreen viewer — lightbox + compare */\n/* ------------------------------------------------------------------ */\n\ninterface ViewerState {\n films: Radiograph[];\n index: number;\n compare: boolean;\n}\n\nfunction RadiographViewer({\n state,\n toothLabel,\n onClose,\n onIndexChange,\n}: {\n state: ViewerState | null;\n toothLabel: string;\n onClose: () => void;\n onIndexChange: (index: number) => void;\n}): ReactElement {\n const { t } = useTranslation('ui');\n const [zoom, setZoom] = useState(0);\n // Reset zoom when the viewed film changes (prev/next) or the mode flips, so a\n // user doesn't carry one film's zoom into the next.\n useEffect(() => {\n setZoom(0);\n }, [state?.index, state?.compare]);\n const films = state?.films ?? [];\n const current = state ? films[state.index] : undefined;\n\n return (\n <Dialog.Root\n open={state !== null}\n onOpenChange={(next) => {\n if (!next) {\n setZoom(0);\n onClose();\n }\n }}\n >\n <Dialog.Content size=\"fullscreen\" aria-describedby={undefined}>\n <Dialog.Header>\n <Dialog.Title>\n {state?.compare\n ? t('radiographPanel.viewer.compareTitle', {\n defaultValue: '{{tooth}} — comparison',\n tooth: toothLabel,\n })\n : t('radiographPanel.viewer.title', {\n defaultValue: '{{tooth}} — radiograph',\n tooth: toothLabel,\n })}\n </Dialog.Title>\n </Dialog.Header>\n <Dialog.Body>\n {state?.compare ? (\n <div className=\"ds:grid ds:grid-cols-2 ds:gap-[var(--spacing-md)]\">\n {films.slice(0, 2).map((film) => (\n <figure\n key={film.id}\n className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-xs)]\"\n >\n <div className=\"ds:flex ds:items-center ds:justify-center ds:overflow-hidden ds:rounded-[var(--radius-md)] ds:bg-[var(--muted)] ds:p-[var(--spacing-xs)]\">\n <img\n src={film.thumbnailUrl ?? film.url}\n alt={film.alt ?? toothLabel}\n className=\"ds:max-h-full ds:max-w-full ds:object-contain\"\n />\n </div>\n <figcaption className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {film.date}\n </figcaption>\n </figure>\n ))}\n </div>\n ) : (\n <div className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-sm)]\">\n <div className=\"ds:flex ds:max-h-full ds:items-center ds:justify-center ds:overflow-hidden ds:rounded-[var(--radius-md)] ds:bg-[var(--muted)] ds:p-[var(--spacing-sm)]\">\n <img\n src={current?.thumbnailUrl ?? current?.url}\n alt={current?.alt ?? toothLabel}\n className={[\n 'ds:max-h-full ds:max-w-full ds:object-contain',\n 'ds:origin-center ds:transition-transform ds:motion-reduce:transition-none',\n ZOOM_CLASS[zoom],\n ].join(' ')}\n />\n </div>\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <IconButton\n icon={<ChevronLeft aria-hidden=\"true\" />}\n aria-label={t('radiographPanel.viewer.prev', {\n defaultValue: 'Previous radiograph',\n })}\n size=\"sm\"\n flipIconInRtl\n disabled={!state || state.index === 0}\n onClick={() =>\n state && onIndexChange(Math.max(0, state.index - 1))\n }\n />\n <span\n aria-live=\"polite\"\n className=\"type-meta ds:text-[color:var(--muted-foreground)]\"\n >\n {t('radiographPanel.viewer.position', {\n defaultValue: '{{current}} / {{total}}',\n current: (state?.index ?? 0) + 1,\n total: films.length,\n })}\n </span>\n <IconButton\n icon={<ChevronRight aria-hidden=\"true\" />}\n aria-label={t('radiographPanel.viewer.next', {\n defaultValue: 'Next radiograph',\n })}\n size=\"sm\"\n flipIconInRtl\n disabled={!state || state.index >= films.length - 1}\n onClick={() =>\n state &&\n onIndexChange(Math.min(films.length - 1, state.index + 1))\n }\n />\n <span\n aria-hidden=\"true\"\n className=\"ds:ms-[var(--spacing-xs)] ds:me-[var(--spacing-xs)] ds:h-[var(--spacing-md)] ds:w-px ds:bg-[var(--border)]\"\n />\n <IconButton\n icon={<ZoomOut aria-hidden=\"true\" />}\n aria-label={t('radiographPanel.viewer.zoomOut', {\n defaultValue: 'Zoom out',\n })}\n size=\"sm\"\n disabled={zoom === 0}\n onClick={() => setZoom((z) => Math.max(0, z - 1))}\n />\n <IconButton\n icon={<ZoomIn aria-hidden=\"true\" />}\n aria-label={t('radiographPanel.viewer.zoomIn', {\n defaultValue: 'Zoom in',\n })}\n size=\"sm\"\n disabled={zoom === ZOOM_CLASS.length - 1}\n onClick={() =>\n setZoom((z) => Math.min(ZOOM_CLASS.length - 1, z + 1))\n }\n />\n </div>\n {current?.note ? (\n <p className=\"type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {current.note}\n </p>\n ) : null}\n </div>\n )}\n </Dialog.Body>\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* RadiographPanel */\n/* ------------------------------------------------------------------ */\n\nexport const RadiographPanel = forwardRef<\n RadiographPanelHandle,\n RadiographPanelProps\n>(function RadiographPanel(\n {\n id,\n toothId,\n toothLabel: toothLabelProp,\n radiographs = [],\n onAddRadiograph,\n onDeleteRadiograph,\n title,\n 'aria-label': ariaLabel,\n className,\n ...rest\n },\n ref,\n) {\n const { t } = useTranslation('ui');\n\n const [viewer, setViewer] = useState<ViewerState | null>(null);\n const [compareIds, setCompareIds] = useState<string[]>([]);\n const [sortDesc, setSortDesc] = useState(true);\n const [range, setRange] = useState<DateRangeValue>({});\n const [pendingFile, setPendingFile] = useState<string | null>(null);\n const [date, setDate] = useState<Date | undefined>(undefined);\n const [note, setNote] = useState('');\n\n // Stable, current snapshot for the imperative handle.\n const filmsRef = useRef<Radiograph[]>(radiographs);\n filmsRef.current = radiographs;\n\n useImperativeHandle(\n ref,\n () => ({\n getRadiographs: () => filmsRef.current,\n openViewer: (filmId) => {\n const index = filmsRef.current.findIndex((f) => f.id === filmId);\n if (index >= 0) {\n setViewer({ films: filmsRef.current, index, compare: false });\n }\n },\n closeViewer: () => setViewer(null),\n }),\n [],\n );\n\n const heading =\n title ?? t('radiographPanel.title', { defaultValue: 'Imaging' });\n const toothLabel =\n toothLabelProp ??\n (toothId\n ? t('radiographPanel.toothLabel', {\n defaultValue: 'Tooth {{id}}',\n id: toothId,\n })\n : '');\n\n const visible = useMemo(\n () =>\n sortByDate(\n radiographs.filter((f) => inRange(f, range)),\n sortDesc,\n ),\n [radiographs, range, sortDesc],\n );\n\n const toggleCompare = useCallback((filmId: string) => {\n setCompareIds((ids) =>\n ids.includes(filmId)\n ? ids.filter((x) => x !== filmId)\n : [...ids, filmId].slice(-2),\n );\n }, []);\n\n const handleUpload = useCallback(() => {\n if (!pendingFile || !onAddRadiograph) return;\n onAddRadiograph({\n fileName: pendingFile,\n date: date ? toLocalIsoDate(date) : undefined,\n note: note || undefined,\n });\n setPendingFile(null);\n setNote('');\n setDate(undefined);\n }, [pendingFile, date, note, onAddRadiograph]);\n\n // History filter controls — pinned in the PanelHeader's filters row (only\n // meaningful once a tooth is selected) so they stay put as the list scrolls.\n const historyFilters = toothId ? (\n <>\n <FormField\n label={t('radiographPanel.history.range', {\n defaultValue: 'Date range',\n })}\n >\n <DateRangePicker value={range} onChange={setRange} />\n </FormField>\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n <Button intent=\"ghost\" size=\"sm\" onClick={() => setSortDesc((s) => !s)}>\n {sortDesc\n ? t('radiographPanel.history.sortNewest', {\n defaultValue: 'Newest first',\n })\n : t('radiographPanel.history.sortOldest', {\n defaultValue: 'Oldest first',\n })}\n </Button>\n <Button\n intent=\"ghost\"\n size=\"sm\"\n startIcon={<GitCompareArrows aria-hidden=\"true\" />}\n disabled={compareIds.length !== 2}\n onClick={() => {\n const films = radiographs.filter((f) => compareIds.includes(f.id));\n if (films.length === 2) {\n setViewer({ films, index: 0, compare: true });\n }\n }}\n >\n {t('radiographPanel.history.compare', {\n defaultValue: 'Compare',\n })}\n </Button>\n </div>\n </>\n ) : undefined;\n\n return (\n <section\n data-component=\"radiograph-panel\"\n data-component-id={id}\n data-tooth={toothId ?? undefined}\n aria-label={ariaLabel ?? heading}\n className={['ds:flex ds:flex-col', className].filter(Boolean).join(' ')}\n {...rest}\n >\n {/* Shared rail-panel header: title + film-count badge, history filters\n pinned beneath, divider, sticky so it stays visible as the list\n scrolls. The rail injects favourite/close into the action cluster. */}\n <PanelHeader\n sticky\n icon={<Images aria-hidden=\"true\" />}\n title={\n <>\n {toothId ? toothLabel : heading}\n {toothId ? (\n <Badge variant=\"info\" size=\"sm\">\n {radiographs.length}\n </Badge>\n ) : null}\n </>\n }\n filters={historyFilters}\n />\n\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)] ds:p-[var(--spacing-md)]\">\n {!toothId ? (\n <EmptyState\n variant=\"first-use\"\n title={t('radiographPanel.noTooth.title', {\n defaultValue: 'No tooth selected',\n })}\n description={t('radiographPanel.noTooth.body', {\n defaultValue:\n 'Select a tooth on the chart to view its radiographs.',\n })}\n />\n ) : (\n <>\n {/* Upload */}\n {onAddRadiograph ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <FormField\n label={t('radiographPanel.upload.file', {\n defaultValue: 'Image file',\n })}\n >\n <FileUpload\n accept={{ 'image/*': ['.png', '.jpg', '.jpeg', '.webp'] }}\n variant=\"both\"\n showPreview\n onDrop={(accepted) =>\n setPendingFile(accepted[0]?.name ?? null)\n }\n />\n </FormField>\n <FormField\n label={t('radiographPanel.upload.date', {\n defaultValue: 'Acquisition date',\n })}\n >\n <DatePicker value={date} onChange={(d) => setDate(d)} />\n </FormField>\n <FormField\n label={t('radiographPanel.upload.note', {\n defaultValue: 'Note (optional)',\n })}\n >\n <TextArea\n rows={2}\n value={note}\n onChange={(e) => setNote(e.target.value)}\n placeholder={t('radiographPanel.upload.notePlaceholder', {\n defaultValue: 'E.g. routine check, apical lesion…',\n })}\n />\n </FormField>\n <Button\n intent=\"primary\"\n size=\"sm\"\n startIcon={<Upload aria-hidden=\"true\" />}\n disabled={!pendingFile}\n onClick={handleUpload}\n className=\"ds:self-start\"\n >\n {t('radiographPanel.upload.submit', {\n defaultValue: 'Upload',\n })}\n </Button>\n </div>\n ) : null}\n\n {/* History */}\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {visible.length === 0 ? (\n <EmptyState\n variant=\"first-use\"\n title={t('radiographPanel.history.emptyTitle', {\n defaultValue: 'No radiographs yet',\n })}\n description={t('radiographPanel.history.emptyBody', {\n defaultValue: 'Upload the first film for this tooth.',\n })}\n />\n ) : (\n <ul className=\"ds:m-0 ds:flex ds:list-none ds:flex-col ds:gap-[var(--spacing-xs)] ds:p-0\">\n {visible.map((film, visibleIndex) => {\n const selected = compareIds.includes(film.id);\n // Disambiguate the repeated row actions for screen readers by\n // the film's date (falls back to its 1-based position).\n const filmLabel = film.date ?? String(visibleIndex + 1);\n return (\n <li\n key={film.id}\n data-radiograph-id={film.id}\n data-selected={selected}\n className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)] ds:rounded-[var(--radius-md)] ds:border ds:border-[color:var(--card-border)] ds:bg-[var(--card)] ds:p-[var(--spacing-xs)] ds:data-[selected=true]:border-[color:var(--info-foreground)]\"\n >\n <img\n src={film.thumbnailUrl ?? film.url}\n alt={film.alt ?? ''}\n className=\"ds:h-16 ds:w-12 ds:shrink-0 ds:rounded-[var(--radius-sm)] ds:object-cover\"\n />\n <div className=\"ds:flex ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <span className=\"type-body-sm ds:text-[color:var(--foreground)]\">\n {film.date}\n </span>\n <KindBadge kind={film.kind ?? 'periapical'} />\n </div>\n <IconButton\n icon={<Eye aria-hidden=\"true\" />}\n aria-label={t('radiographPanel.history.view', {\n defaultValue: 'View radiograph {{film}}',\n film: filmLabel,\n })}\n size=\"sm\"\n intent=\"ghost\"\n // Step the viewer through the FILTERED + sorted list the\n // user is looking at, not every film on the tooth.\n onClick={() =>\n setViewer({\n films: visible,\n index: visibleIndex,\n compare: false,\n })\n }\n />\n <IconButton\n icon={<GitCompareArrows aria-hidden=\"true\" />}\n aria-label={\n selected\n ? t('radiographPanel.history.compareRemove', {\n defaultValue:\n 'Remove {{film}} from comparison',\n film: filmLabel,\n })\n : t('radiographPanel.history.compareAdd', {\n defaultValue:\n 'Select {{film}} for comparison',\n film: filmLabel,\n })\n }\n aria-pressed={selected}\n size=\"sm\"\n intent={selected ? 'secondary' : 'ghost'}\n onClick={() => toggleCompare(film.id)}\n />\n {onDeleteRadiograph ? (\n <IconButton\n icon={<Trash2 aria-hidden=\"true\" />}\n aria-label={t('radiographPanel.history.delete', {\n defaultValue: 'Delete radiograph {{film}}',\n film: filmLabel,\n })}\n size=\"sm\"\n intent=\"ghost\"\n onClick={() => onDeleteRadiograph(film.id)}\n />\n ) : null}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </>\n )}\n </div>\n\n <RadiographViewer\n state={viewer}\n toothLabel={toothLabel}\n onClose={() => setViewer(null)}\n onIndexChange={(index) => setViewer((v) => (v ? { ...v, index } : v))}\n />\n </section>\n );\n});\n\n// `Images` is the panel's imaging glyph (a films archive, not a radiation\n// hazard) — re-exported so a host registering the Control Room tool can use\n// the same icon as the panel.\nexport { Images as RadiographPanelIcon };\n","import type { AgentAdapter } from '../../agent/types';\nimport type { RadiographPanelHandle } from './radiograph-panel';\nimport type { Radiograph } from '../tooth-scheme';\n\n/**\n * The Imaging panel for the Control Room rail. It DISPLAYS the selected tooth's\n * radiographs and drives the fullscreen viewer; uploads and deletes are the\n * host's responsibility (the `onAddRadiograph` / `onDeleteRadiograph` props),\n * so they are not exposed here — the consuming pattern/app owns those `write` /\n * `destructive` workflows and their `radiograph.*` API contracts.\n */\nexport const radiographPanelAgent: AgentAdapter<RadiographPanelHandle> = {\n id: 'radiograph-panel',\n // pick — open a specific film in the viewer; view_change — the viewer is a\n // view surface over the host-owned films.\n capabilities: ['pick', 'view_change'],\n state: {\n radiographs: {\n // A9: structural refs only (id + kind) — never the free-text `note`,\n // service dates, or consumer-hosted image URLs in the always-on snapshot.\n type: 'Array<{ id: string; kind?: string }>',\n descriptionKey: 'ui.agent.radiographPanel.state.radiographs',\n description:\n 'Structural references (id + kind) to the films shown for the selected tooth.',\n read: (handle) =>\n handle\n .getRadiographs()\n .map((film) => ({ id: film.id, kind: film.kind ?? 'periapical' })),\n },\n },\n actions: {\n view_radiograph: {\n safety: 'read',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: { id: { type: 'string' } },\n required: ['id'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.radiographPanel.actions.viewRadiograph',\n description: 'Open a film in the fullscreen viewer by id.',\n invoke: (handle, args: { id: string }) => {\n handle.openViewer(args.id);\n },\n },\n close_viewer: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.radiographPanel.actions.closeViewer',\n description: 'Close the fullscreen radiograph viewer.',\n invoke: (handle) => {\n handle.closeViewer();\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'radiograph-panel' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n item: {\n attr: 'data-radiograph-id',\n description:\n \"Each film row (`<li>`) carries its radiograph id as `data-radiograph-id`. The panel root additionally carries the selected tooth's FDI id as `data-tooth`.\",\n },\n },\n};\n\n// Re-exported for callers building typed reads against the adapter.\nexport type { Radiograph };\n"],"names":["__iconNode","GitCompareArrows","createLucideIcon","Images","ZOOM_CLASS","sortByDate","films","desc","a","b","inRange","film","range","d","toLocalIsoDate","pad","n","KindBadge","kind","t","useTranslation","label","Badge","RadiographViewer","state","toothLabel","onClose","onIndexChange","zoom","setZoom","useState","useEffect","current","jsx","Dialog","next","jsxs","IconButton","ChevronLeft","ChevronRight","ZoomOut","z","ZoomIn","RadiographPanel","forwardRef","id","toothId","toothLabelProp","radiographs","onAddRadiograph","onDeleteRadiograph","title","ariaLabel","className","rest","ref","viewer","setViewer","compareIds","setCompareIds","sortDesc","setSortDesc","setRange","pendingFile","setPendingFile","date","setDate","note","setNote","filmsRef","useRef","useImperativeHandle","filmId","index","f","heading","visible","useMemo","toggleCompare","useCallback","ids","x","handleUpload","historyFilters","Fragment","FormField","DateRangePicker","Button","s","PanelHeader","FileUpload","accepted","_a","DatePicker","TextArea","e","Upload","EmptyState","visibleIndex","selected","filmLabel","Eye","Trash2","v","radiographPanelAgent","handle","args"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import { jsx as u, jsxs as
|
|
2
|
-
import { forwardRef as
|
|
1
|
+
import { jsx as u, jsxs as B } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef as we, useId as xe, useMemo as _, useRef as k, useState as E, useEffect as H, useImperativeHandle as ke } from "react";
|
|
3
3
|
import { c as j } from "./index-D2ZczOXr.js";
|
|
4
|
-
import { useTranslation as
|
|
5
|
-
import
|
|
4
|
+
import { useTranslation as Ie } from "react-i18next";
|
|
5
|
+
import Ne from "react-apexcharts";
|
|
6
6
|
import P from "apexcharts";
|
|
7
|
-
import { g as re, u as
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
|
|
7
|
+
import { g as re, u as Re, a as Me } from "./apexcharts-theme-DNoXvgnZ.js";
|
|
8
|
+
import { e as ae } from "./escape-html-Cn9Fao6a.js";
|
|
9
|
+
import { m as Te } from "./annotation-marker-D-M7y4R1.js";
|
|
10
|
+
import { u as Ce } from "./registry-DvAUVLHh.js";
|
|
11
|
+
function Ae(n) {
|
|
11
12
|
if (n.length < 2)
|
|
12
13
|
return { slope: 0, direction: "steady" };
|
|
13
14
|
const r = n.length, g = (r - 1) / 2, p = n.reduce((c, d) => c + d, 0) / r;
|
|
@@ -19,7 +20,7 @@ function Ce(n) {
|
|
|
19
20
|
const f = h === 0 ? 0 : a / h, N = 0.01 * (Math.max(...n) - Math.min(...n) || 1), v = Math.abs(f) < N ? "steady" : f > 0 ? "increasing" : "decreasing";
|
|
20
21
|
return { slope: f, direction: v };
|
|
21
22
|
}
|
|
22
|
-
const
|
|
23
|
+
const Oe = {
|
|
23
24
|
id: "sparkline",
|
|
24
25
|
capabilities: [],
|
|
25
26
|
// `select_annotation` enforces two preconditions silently and
|
|
@@ -129,7 +130,7 @@ const Ae = {
|
|
|
129
130
|
description: "Sourced from the id prop."
|
|
130
131
|
}
|
|
131
132
|
}
|
|
132
|
-
},
|
|
133
|
+
}, se = j("ds:relative ds:inline-block ds:w-full", {
|
|
133
134
|
variants: {
|
|
134
135
|
size: {
|
|
135
136
|
xs: "ds:h-6",
|
|
@@ -141,7 +142,7 @@ const Ae = {
|
|
|
141
142
|
}
|
|
142
143
|
},
|
|
143
144
|
defaultVariants: { size: "md" }
|
|
144
|
-
}),
|
|
145
|
+
}), ie = j("", {
|
|
145
146
|
variants: {
|
|
146
147
|
tone: {
|
|
147
148
|
neutral: "ds:[--annotation-color:var(--muted-foreground)]",
|
|
@@ -156,7 +157,7 @@ const Ae = {
|
|
|
156
157
|
}
|
|
157
158
|
},
|
|
158
159
|
defaultVariants: { tone: "neutral" }
|
|
159
|
-
}),
|
|
160
|
+
}), Se = j(
|
|
160
161
|
"ds:pointer-events-none ds:absolute ds:inset-x-[2px]",
|
|
161
162
|
{
|
|
162
163
|
variants: {
|
|
@@ -172,19 +173,19 @@ const Ae = {
|
|
|
172
173
|
},
|
|
173
174
|
defaultVariants: { size: "md" }
|
|
174
175
|
}
|
|
175
|
-
),
|
|
176
|
+
), ze = {
|
|
176
177
|
increasing: "↑",
|
|
177
178
|
decreasing: "↓",
|
|
178
179
|
steady: "→"
|
|
179
|
-
},
|
|
180
|
+
}, _e = {
|
|
180
181
|
xs: 24,
|
|
181
182
|
sm: 32,
|
|
182
183
|
md: 40
|
|
183
|
-
}, T = 2,
|
|
184
|
-
function
|
|
184
|
+
}, T = 2, oe = 2.5, de = 44;
|
|
185
|
+
function He(n, r, g = de) {
|
|
185
186
|
const p = n.map((a) => ({
|
|
186
187
|
annotation: a,
|
|
187
|
-
centre:
|
|
188
|
+
centre: ce(a.position) * r
|
|
188
189
|
})).sort((a, h) => a.centre - h.centre);
|
|
189
190
|
return p.map((a, h) => {
|
|
190
191
|
const f = p[h - 1], b = p[h + 1], N = f ? (f.centre + a.centre) / 2 : 0, v = b ? (a.centre + b.centre) / 2 : r, c = Math.max(0, N), d = Math.min(r, v), s = Math.min(g, Math.max(0, d - c)), y = Math.min(
|
|
@@ -194,16 +195,16 @@ function _e(n, r, g = oe) {
|
|
|
194
195
|
return { annotation: a.annotation, x: y, width: s };
|
|
195
196
|
});
|
|
196
197
|
}
|
|
197
|
-
function
|
|
198
|
+
function ce(n) {
|
|
198
199
|
return Number.isFinite(n) ? Math.min(1, Math.max(0, n)) : 0;
|
|
199
200
|
}
|
|
200
|
-
function
|
|
201
|
+
function Pe(n) {
|
|
201
202
|
return n.filter((r) => r != null);
|
|
202
203
|
}
|
|
203
|
-
function
|
|
204
|
+
function De() {
|
|
204
205
|
return typeof window < "u" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
205
206
|
}
|
|
206
|
-
const
|
|
207
|
+
const Fe = we(
|
|
207
208
|
({
|
|
208
209
|
id: n,
|
|
209
210
|
data: r,
|
|
@@ -221,12 +222,12 @@ const De = ve(
|
|
|
221
222
|
onAnnotationSelect: y,
|
|
222
223
|
className: G,
|
|
223
224
|
...L
|
|
224
|
-
},
|
|
225
|
+
}, le) => {
|
|
225
226
|
var ne;
|
|
226
|
-
const { t: w, i18n: q } =
|
|
227
|
+
const { t: w, i18n: q } = Ie("ui"), Z = xe(), x = _(
|
|
227
228
|
() => `sparkline-${Z.replace(/[^a-zA-Z0-9-_]/g, "")}`,
|
|
228
229
|
[Z]
|
|
229
|
-
), R = k(null), [D,
|
|
230
|
+
), R = k(null), [D, ue] = E(0), [pe, he] = E(de), m = _(() => Pe(r), [r]), { direction: F } = Ae(m), J = _(() => {
|
|
230
231
|
const e = s && s.length > 0 ? w("sparkline.annotations", {
|
|
231
232
|
list: s.map((I) => I.label).join(", ")
|
|
232
233
|
}) : "", t = (I) => e ? `${I}. ${e}` : I;
|
|
@@ -239,7 +240,7 @@ const De = ve(
|
|
|
239
240
|
direction: l
|
|
240
241
|
};
|
|
241
242
|
return t(a ? w("sparkline.summary", { label: a, ...o }) : w("sparkline.summaryNoLabel", o));
|
|
242
|
-
}, [m, s, a, F, q.language, w]), [C,
|
|
243
|
+
}, [m, s, a, F, q.language, w]), [C, me] = E(
|
|
243
244
|
() => {
|
|
244
245
|
try {
|
|
245
246
|
return re();
|
|
@@ -253,7 +254,7 @@ const De = ve(
|
|
|
253
254
|
const t = new MutationObserver(() => {
|
|
254
255
|
clearTimeout(e), e = setTimeout(() => {
|
|
255
256
|
try {
|
|
256
|
-
|
|
257
|
+
me(re());
|
|
257
258
|
} catch {
|
|
258
259
|
}
|
|
259
260
|
}, 50);
|
|
@@ -269,15 +270,15 @@ const De = ve(
|
|
|
269
270
|
if (!e) return;
|
|
270
271
|
const t = () => {
|
|
271
272
|
const l = getComputedStyle(e).getPropertyValue("--min-target-size"), o = Number.parseFloat(l);
|
|
272
|
-
Number.isFinite(o) && o > 0 &&
|
|
273
|
+
Number.isFinite(o) && o > 0 && he(o);
|
|
273
274
|
};
|
|
274
275
|
t();
|
|
275
276
|
const i = new ResizeObserver((l) => {
|
|
276
277
|
const o = l[0];
|
|
277
|
-
o &&
|
|
278
|
+
o && ue(Math.floor(o.contentRect.width)), t();
|
|
278
279
|
});
|
|
279
280
|
return i.observe(e), () => i.disconnect();
|
|
280
|
-
}, []),
|
|
281
|
+
}, []), Re(R), Me(R, b);
|
|
281
282
|
const M = k(y);
|
|
282
283
|
H(() => {
|
|
283
284
|
M.current = y;
|
|
@@ -320,8 +321,8 @@ const De = ve(
|
|
|
320
321
|
}),
|
|
321
322
|
[x]
|
|
322
323
|
);
|
|
323
|
-
|
|
324
|
-
const
|
|
324
|
+
ke(le, () => W, [W]), Ce(Oe, W, n);
|
|
325
|
+
const $ = h ?? ((ne = C.colors) == null ? void 0 : ne[0]) ?? "currentColor";
|
|
325
326
|
if (m.length === 0)
|
|
326
327
|
return /* @__PURE__ */ u(
|
|
327
328
|
"div",
|
|
@@ -330,7 +331,7 @@ const De = ve(
|
|
|
330
331
|
role: "img",
|
|
331
332
|
"aria-label": J,
|
|
332
333
|
dir: "ltr",
|
|
333
|
-
className:
|
|
334
|
+
className: se({
|
|
334
335
|
size: d !== void 0 ? "auto" : p,
|
|
335
336
|
className: G
|
|
336
337
|
}),
|
|
@@ -339,13 +340,13 @@ const De = ve(
|
|
|
339
340
|
...L
|
|
340
341
|
}
|
|
341
342
|
);
|
|
342
|
-
const X =
|
|
343
|
+
const X = De(), S = r.length > m.length, Y = S ? r.flatMap((e, t) => e == null ? [] : [{ x: t, y: e }]) : m, fe = S ? r.flatMap((e, t) => e == null ? [] : [t]) : void 0;
|
|
343
344
|
A.current = {
|
|
344
345
|
labels: v,
|
|
345
|
-
slotOf:
|
|
346
|
+
slotOf: fe,
|
|
346
347
|
shown: b && v !== void 0
|
|
347
348
|
};
|
|
348
|
-
const
|
|
349
|
+
const ge = b ? {
|
|
349
350
|
enabled: !0,
|
|
350
351
|
x: v ? {
|
|
351
352
|
show: !0,
|
|
@@ -353,13 +354,20 @@ const De = ve(
|
|
|
353
354
|
const { labels: i, slotOf: l } = A.current;
|
|
354
355
|
if (O.current || !i) return "";
|
|
355
356
|
const o = (t == null ? void 0 : t.dataPointIndex) ?? -1;
|
|
356
|
-
return
|
|
357
|
+
return ae(
|
|
358
|
+
i[l ? l[o] ?? -1 : o] ?? ""
|
|
359
|
+
);
|
|
357
360
|
}
|
|
358
361
|
} : (
|
|
359
362
|
// No labels: hide the title rather than show a raw index.
|
|
360
363
|
{ show: !1 }
|
|
361
|
-
)
|
|
362
|
-
|
|
364
|
+
),
|
|
365
|
+
y: {
|
|
366
|
+
title: {
|
|
367
|
+
formatter: (e) => e ? `${ae(String(e))}: ` : ""
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
} : { enabled: !1 }, ye = {
|
|
363
371
|
...C,
|
|
364
372
|
chart: {
|
|
365
373
|
...C.chart,
|
|
@@ -380,7 +388,7 @@ const De = ve(
|
|
|
380
388
|
zoom: { enabled: !1 },
|
|
381
389
|
parentHeightOffset: 0
|
|
382
390
|
},
|
|
383
|
-
colors: [
|
|
391
|
+
colors: [$],
|
|
384
392
|
stroke: {
|
|
385
393
|
curve: "smooth",
|
|
386
394
|
width: g === "bar" ? 0 : 2
|
|
@@ -395,7 +403,7 @@ const De = ve(
|
|
|
395
403
|
// and the annotation fractions would no longer mean the same thing.
|
|
396
404
|
...S ? { type: "numeric", min: 0, max: r.length - 1 } : {}
|
|
397
405
|
},
|
|
398
|
-
tooltip:
|
|
406
|
+
tooltip: ge,
|
|
399
407
|
markers: f ? {
|
|
400
408
|
size: [0],
|
|
401
409
|
discrete: [
|
|
@@ -405,8 +413,8 @@ const De = ve(
|
|
|
405
413
|
// the parameter was not measured at.
|
|
406
414
|
seriesIndex: 0,
|
|
407
415
|
dataPointIndex: Y.length - 1,
|
|
408
|
-
fillColor:
|
|
409
|
-
strokeColor:
|
|
416
|
+
fillColor: $,
|
|
417
|
+
strokeColor: $,
|
|
410
418
|
size: 4
|
|
411
419
|
}
|
|
412
420
|
]
|
|
@@ -423,15 +431,15 @@ const De = ve(
|
|
|
423
431
|
left: T
|
|
424
432
|
}
|
|
425
433
|
}
|
|
426
|
-
},
|
|
427
|
-
return /* @__PURE__ */
|
|
434
|
+
}, be = c ?? (D > 0 ? D : "100%"), ve = d ?? _e[p ?? "md"], z = s != null && s.length ? s : void 0, ee = D - T * 2, te = y && z && ee > 0 ? He(z, ee, pe) : void 0;
|
|
435
|
+
return /* @__PURE__ */ B(
|
|
428
436
|
"div",
|
|
429
437
|
{
|
|
430
438
|
ref: R,
|
|
431
439
|
role: "img",
|
|
432
440
|
"aria-label": J,
|
|
433
441
|
dir: "ltr",
|
|
434
|
-
className:
|
|
442
|
+
className: se({
|
|
435
443
|
size: d !== void 0 ? "auto" : p,
|
|
436
444
|
className: G
|
|
437
445
|
}),
|
|
@@ -440,13 +448,13 @@ const De = ve(
|
|
|
440
448
|
...L,
|
|
441
449
|
children: [
|
|
442
450
|
/* @__PURE__ */ u(
|
|
443
|
-
|
|
451
|
+
Ne,
|
|
444
452
|
{
|
|
445
453
|
type: g,
|
|
446
454
|
series: [{ name: U, data: Y }],
|
|
447
|
-
options:
|
|
448
|
-
width:
|
|
449
|
-
height:
|
|
455
|
+
options: ye,
|
|
456
|
+
width: be,
|
|
457
|
+
height: ve,
|
|
450
458
|
"aria-hidden": "true"
|
|
451
459
|
}
|
|
452
460
|
),
|
|
@@ -468,12 +476,12 @@ const De = ve(
|
|
|
468
476
|
"data-testid": "sparkline-annotations",
|
|
469
477
|
className: "ds:size-full",
|
|
470
478
|
children: z.map((e) => {
|
|
471
|
-
const t =
|
|
479
|
+
const t = ce(e.position);
|
|
472
480
|
return (
|
|
473
481
|
/* A nested viewport placed at a percentage of the plot: the
|
|
474
482
|
one positioning rule that needs no measurement, so a column
|
|
475
483
|
of sparklines shares an x whatever their widths. */
|
|
476
|
-
/* @__PURE__ */
|
|
484
|
+
/* @__PURE__ */ B(
|
|
477
485
|
"svg",
|
|
478
486
|
{
|
|
479
487
|
x: `${t * 100}%`,
|
|
@@ -483,7 +491,7 @@ const De = ve(
|
|
|
483
491
|
overflow: "visible",
|
|
484
492
|
"data-annotation-id": e.id,
|
|
485
493
|
"data-annotation-position": t,
|
|
486
|
-
className:
|
|
494
|
+
className: ie({ tone: e.tone }),
|
|
487
495
|
children: [
|
|
488
496
|
/* @__PURE__ */ u(
|
|
489
497
|
"line",
|
|
@@ -498,11 +506,11 @@ const De = ve(
|
|
|
498
506
|
/* @__PURE__ */ u(
|
|
499
507
|
"path",
|
|
500
508
|
{
|
|
501
|
-
d:
|
|
509
|
+
d: Te(
|
|
502
510
|
e.shape ?? "diamond",
|
|
503
511
|
0,
|
|
504
|
-
|
|
505
|
-
|
|
512
|
+
oe,
|
|
513
|
+
oe
|
|
506
514
|
),
|
|
507
515
|
className: "ds:[fill:var(--annotation-color)]"
|
|
508
516
|
}
|
|
@@ -522,7 +530,7 @@ const De = ve(
|
|
|
522
530
|
/* @__PURE__ */ u(
|
|
523
531
|
"div",
|
|
524
532
|
{
|
|
525
|
-
className:
|
|
533
|
+
className: Se({
|
|
526
534
|
size: d !== void 0 ? "auto" : p
|
|
527
535
|
}),
|
|
528
536
|
children: /* @__PURE__ */ u(
|
|
@@ -532,12 +540,12 @@ const De = ve(
|
|
|
532
540
|
focusable: "false",
|
|
533
541
|
"data-testid": "sparkline-annotation-hits",
|
|
534
542
|
className: "ds:size-full",
|
|
535
|
-
children: te.map(({ annotation: e, x: t, width: i }) => /* @__PURE__ */
|
|
543
|
+
children: te.map(({ annotation: e, x: t, width: i }) => /* @__PURE__ */ B(
|
|
536
544
|
"g",
|
|
537
545
|
{
|
|
538
546
|
"data-annotation-hit-id": e.id,
|
|
539
547
|
onClick: () => y(e.id),
|
|
540
|
-
className: `ds:group ds:pointer-events-auto ds:cursor-pointer ${
|
|
548
|
+
className: `ds:group ds:pointer-events-auto ds:cursor-pointer ${ie(
|
|
541
549
|
{ tone: e.tone }
|
|
542
550
|
)}`,
|
|
543
551
|
children: [
|
|
@@ -567,7 +575,7 @@ const De = ve(
|
|
|
567
575
|
{
|
|
568
576
|
"aria-hidden": "true",
|
|
569
577
|
className: "ds:pointer-events-none ds:absolute ds:end-0 ds:top-0 ds:text-[length:var(--font-size-xs)] ds:leading-none",
|
|
570
|
-
children:
|
|
578
|
+
children: ze[F]
|
|
571
579
|
}
|
|
572
580
|
)
|
|
573
581
|
]
|
|
@@ -575,10 +583,10 @@ const De = ve(
|
|
|
575
583
|
);
|
|
576
584
|
}
|
|
577
585
|
);
|
|
578
|
-
|
|
586
|
+
Fe.displayName = "Sparkline";
|
|
579
587
|
export {
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
588
|
+
Fe as S,
|
|
589
|
+
Oe as s,
|
|
590
|
+
Ae as u
|
|
583
591
|
};
|
|
584
|
-
//# sourceMappingURL=sparkline-
|
|
592
|
+
//# sourceMappingURL=sparkline-SnniCoCl.js.map
|