@alfadocs/ui-kit-debug 1.37.0 → 1.38.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/{agenda-tray-DYGCTIWB.js → agenda-tray-CG6jUjKc.js} +2 -2
- package/dist/_chunks/{agenda-tray-DYGCTIWB.js.map → agenda-tray-CG6jUjKc.js.map} +1 -1
- package/dist/_chunks/{anamnesis-summary-card-GYHa7VGp.js → anamnesis-summary-card-CclBbiXg.js} +2 -2
- package/dist/_chunks/{anamnesis-summary-card-GYHa7VGp.js.map → anamnesis-summary-card-CclBbiXg.js.map} +1 -1
- package/dist/_chunks/{appointment-timeline-ByfovxqR.js → appointment-timeline-D-rNwKpS.js} +2 -2
- package/dist/_chunks/{appointment-timeline-ByfovxqR.js.map → appointment-timeline-D-rNwKpS.js.map} +1 -1
- package/dist/_chunks/{appointment-tray-D6UyJHej.js → appointment-tray-CK2CULg_.js} +2 -2
- package/dist/_chunks/{appointment-tray-D6UyJHej.js.map → appointment-tray-CK2CULg_.js.map} +1 -1
- package/dist/_chunks/{balance-badge-cell-B0Z8Dwn8.js → balance-badge-cell-DHs5p0bA.js} +2 -2
- package/dist/_chunks/{balance-badge-cell-B0Z8Dwn8.js.map → balance-badge-cell-DHs5p0bA.js.map} +1 -1
- package/dist/_chunks/{booking-Dp-9qR6F.js → booking-x3J7sS2G.js} +3 -3
- package/dist/_chunks/{booking-Dp-9qR6F.js.map → booking-x3J7sS2G.js.map} +1 -1
- package/dist/_chunks/{calendar-workspace-BqKBj26r.js → calendar-workspace-Cc1LRVWY.js} +1665 -1480
- package/dist/_chunks/calendar-workspace-Cc1LRVWY.js.map +1 -0
- package/dist/_chunks/{data-table-BYGK-gUJ.js → data-table-Dy1lyumT.js} +2 -2
- package/dist/_chunks/{data-table-BYGK-gUJ.js.map → data-table-Dy1lyumT.js.map} +1 -1
- package/dist/_chunks/editable-description-7ptNpJEg.js +142 -0
- package/dist/_chunks/editable-description-7ptNpJEg.js.map +1 -0
- package/dist/_chunks/{file-manager-DvkFgj7d.js → file-manager-UlcYQv8n.js} +3 -3
- package/dist/_chunks/{file-manager-DvkFgj7d.js.map → file-manager-UlcYQv8n.js.map} +1 -1
- package/dist/_chunks/{message-tray-BcLyaO-G.js → message-tray-CXjVsKqp.js} +2 -2
- package/dist/_chunks/{message-tray-BcLyaO-G.js.map → message-tray-CXjVsKqp.js.map} +1 -1
- package/dist/_chunks/{note-timeline-CXfSV3yX.js → note-timeline-D2oPuQP6.js} +134 -73
- package/dist/_chunks/note-timeline-D2oPuQP6.js.map +1 -0
- package/dist/_chunks/notes-panel-CkbfDDzj.js +614 -0
- package/dist/_chunks/notes-panel-CkbfDDzj.js.map +1 -0
- package/dist/_chunks/{notification-tray-CJ8jOe-U.js → notification-tray-_NoChRKi.js} +2 -2
- package/dist/_chunks/{notification-tray-CJ8jOe-U.js.map → notification-tray-_NoChRKi.js.map} +1 -1
- package/dist/_chunks/{patient-summary-card-BzmJH9a-.js → patient-summary-card-B131Q7Bp.js} +2 -2
- package/dist/_chunks/{patient-summary-card-BzmJH9a-.js.map → patient-summary-card-B131Q7Bp.js.map} +1 -1
- package/dist/_chunks/{practice-results-DOcORTkP.js → practice-results-CBNRJNnY.js} +2 -2
- package/dist/_chunks/{practice-results-DOcORTkP.js.map → practice-results-CBNRJNnY.js.map} +1 -1
- package/dist/_chunks/{product-hub-panel-C0TO69P7.js → product-hub-panel-C3bMjscm.js} +2 -2
- package/dist/_chunks/{product-hub-panel-C0TO69P7.js.map → product-hub-panel-C3bMjscm.js.map} +1 -1
- package/dist/_chunks/{reviews-panel-BaHZb_ai.js → reviews-panel-Cy969x7q.js} +2 -2
- package/dist/_chunks/{reviews-panel-BaHZb_ai.js.map → reviews-panel-Cy969x7q.js.map} +1 -1
- package/dist/_chunks/{signature-request-Dej2g86d.js → signature-request-b-86AGlT.js} +2 -2
- package/dist/_chunks/{signature-request-Dej2g86d.js.map → signature-request-b-86AGlT.js.map} +1 -1
- package/dist/_chunks/{skeleton-CZbwyJAA.js → skeleton-B1KTdJ4N.js} +46 -33
- package/dist/_chunks/skeleton-B1KTdJ4N.js.map +1 -0
- package/dist/_chunks/{slot-grid-8Ko6thzz.js → slot-grid-Bk3GZL1p.js} +2 -2
- package/dist/_chunks/{slot-grid-8Ko6thzz.js.map → slot-grid-Bk3GZL1p.js.map} +1 -1
- package/dist/_chunks/{task-tray-CQ8UAR2j.js → task-tray-5co9Jr2L.js} +2 -2
- package/dist/_chunks/{task-tray-CQ8UAR2j.js.map → task-tray-5co9Jr2L.js.map} +1 -1
- package/dist/_chunks/{tasks-panel-CBGMtQ_f.js → tasks-panel-BpH-x7U3.js} +2 -2
- package/dist/_chunks/{tasks-panel-CBGMtQ_f.js.map → tasks-panel-BpH-x7U3.js.map} +1 -1
- package/dist/_chunks/treatment-receipt-dUm99mdn.js +160 -0
- package/dist/_chunks/treatment-receipt-dUm99mdn.js.map +1 -0
- package/dist/agent-catalog.json +1 -1
- package/dist/components/agenda-tray/index.js +1 -1
- package/dist/components/anamnesis-summary-card/index.js +1 -1
- package/dist/components/appointment-card/index.js +1 -1
- package/dist/components/appointment-timeline/index.js +1 -1
- package/dist/components/booking/index.js +1 -1
- package/dist/components/data-table/index.js +1 -1
- package/dist/components/editable-description/editable-description.d.ts +6 -0
- package/dist/components/editable-description/editable-description.d.ts.map +1 -1
- package/dist/components/editable-description/index.js +1 -1
- package/dist/components/file-manager/index.js +1 -1
- package/dist/components/message-tray/index.js +1 -1
- package/dist/components/note-timeline/index.js +1 -1
- package/dist/components/note-timeline/note-timeline.d.ts +8 -0
- package/dist/components/note-timeline/note-timeline.d.ts.map +1 -1
- package/dist/components/notes-panel/index.js +1 -1
- package/dist/components/notes-panel/notes-panel.d.ts.map +1 -1
- package/dist/components/notification-tray/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/practice-results/index.js +1 -1
- package/dist/components/product-hub-tray/index.js +1 -1
- package/dist/components/reviews-panel/index.js +1 -1
- package/dist/components/skeleton/index.d.ts +1 -1
- package/dist/components/skeleton/index.d.ts.map +1 -1
- package/dist/components/skeleton/index.js +3 -2
- package/dist/components/skeleton/skeleton.d.ts +12 -0
- package/dist/components/skeleton/skeleton.d.ts.map +1 -1
- package/dist/components/slot-grid/index.js +1 -1
- package/dist/components/task-tray/index.js +1 -1
- package/dist/components/tasks-panel/index.js +1 -1
- package/dist/components/treatment-receipt/index.js +1 -1
- package/dist/components/treatment-receipt/treatment-receipt.d.ts +8 -0
- package/dist/components/treatment-receipt/treatment-receipt.d.ts.map +1 -1
- package/dist/index.js +755 -754
- package/dist/patterns/calendar/calendar-appointment-details.d.ts +1 -1
- package/dist/patterns/calendar/calendar-appointment-details.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar-editor-hydration.d.ts +0 -2
- package/dist/patterns/calendar/calendar-editor-hydration.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.sheets.d.ts.map +1 -1
- package/dist/patterns/calendar/index.js +1 -1
- package/dist/patterns/signature-request/index.js +1 -1
- package/dist/tokens.css +1 -1
- package/package.json +1 -1
- package/dist/_chunks/calendar-workspace-BqKBj26r.js.map +0 -1
- package/dist/_chunks/editable-description-BOfAeY3T.js +0 -112
- package/dist/_chunks/editable-description-BOfAeY3T.js.map +0 -1
- package/dist/_chunks/note-timeline-CXfSV3yX.js.map +0 -1
- package/dist/_chunks/notes-panel-4y5JioWN.js +0 -556
- package/dist/_chunks/notes-panel-4y5JioWN.js.map +0 -1
- package/dist/_chunks/skeleton-CZbwyJAA.js.map +0 -1
- package/dist/_chunks/treatment-receipt-D4kOLXOk.js +0 -94
- package/dist/_chunks/treatment-receipt-D4kOLXOk.js.map +0 -1
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
import { jsxs as d, jsx as s } from "react/jsx-runtime";
|
|
2
|
-
import { forwardRef as k, useState as D, useMemo as j } from "react";
|
|
3
|
-
import { c as t } from "./index-D2ZczOXr.js";
|
|
4
|
-
import { useTranslation as B } from "react-i18next";
|
|
5
|
-
import { B as V } from "./button-nJaPh_HC.js";
|
|
6
|
-
import { I as z } from "./icon-button-8xqRnkdG.js";
|
|
7
|
-
import { P as E } from "./pencil-B1sKKyuT.js";
|
|
8
|
-
const C = t(
|
|
9
|
-
"ds:flex ds:min-w-0 ds:items-start ds:gap-[var(--spacing-xs)]"
|
|
10
|
-
), M = t(
|
|
11
|
-
[
|
|
12
|
-
"ds:m-0 ds:flex ds:min-w-0 ds:flex-1 ds:list-none ds:flex-col ds:p-0",
|
|
13
|
-
"ds:gap-[var(--spacing-2xs)]"
|
|
14
|
-
].join(" ")
|
|
15
|
-
), I = t(
|
|
16
|
-
"ds:m-0 ds:min-w-0 ds:flex-1 type-body-sm ds:text-[color:var(--muted-foreground)]"
|
|
17
|
-
), P = t(
|
|
18
|
-
"ds:flex ds:items-start ds:gap-[var(--spacing-xs)] type-body-sm ds:text-[color:var(--foreground)]"
|
|
19
|
-
), $ = t(
|
|
20
|
-
[
|
|
21
|
-
"ds:mt-[var(--spacing-sm)] ds:size-[var(--spacing-xs)] ds:shrink-0 ds:self-start",
|
|
22
|
-
"ds:rounded-[var(--radius-full)] ds:bg-[color:var(--border)]"
|
|
23
|
-
].join(" ")
|
|
24
|
-
), L = k(
|
|
25
|
-
({
|
|
26
|
-
value: r,
|
|
27
|
-
maxLines: o = 3,
|
|
28
|
-
onEdit: l,
|
|
29
|
-
editButtonRef: p,
|
|
30
|
-
emptyLabel: m,
|
|
31
|
-
editLabel: f,
|
|
32
|
-
seeMoreLabel: h,
|
|
33
|
-
showLessLabel: g,
|
|
34
|
-
className: x,
|
|
35
|
-
...u
|
|
36
|
-
}, b) => {
|
|
37
|
-
const { t: i } = B(), [n, v] = D(!1), a = j(
|
|
38
|
-
() => (r ?? "").split(/\r?\n/).map((e) => e.trim()).filter(Boolean),
|
|
39
|
-
[r]
|
|
40
|
-
), N = Math.max(0, a.length - o), w = n ? a : a.slice(0, o), c = f ?? i("editableDescription.edit");
|
|
41
|
-
return /* @__PURE__ */ d(
|
|
42
|
-
"div",
|
|
43
|
-
{
|
|
44
|
-
...u,
|
|
45
|
-
ref: b,
|
|
46
|
-
"data-component": "editable-description",
|
|
47
|
-
"data-empty": a.length === 0 ? "" : void 0,
|
|
48
|
-
className: [C(), x].filter(Boolean).join(" "),
|
|
49
|
-
children: [
|
|
50
|
-
a.length === 0 ? /* @__PURE__ */ s("p", { "data-editable-description-empty": "", className: I(), children: m ?? i("editableDescription.empty") }) : /* @__PURE__ */ d("ul", { className: M(), children: [
|
|
51
|
-
w.map((e, y) => /* @__PURE__ */ d(
|
|
52
|
-
"li",
|
|
53
|
-
{
|
|
54
|
-
"data-editable-description-line": "",
|
|
55
|
-
className: P(),
|
|
56
|
-
children: [
|
|
57
|
-
/* @__PURE__ */ s("span", { "aria-hidden": "true", className: $() }),
|
|
58
|
-
/* @__PURE__ */ s("span", { className: "ds:min-w-0 ds:[overflow-wrap:anywhere]", children: e })
|
|
59
|
-
]
|
|
60
|
-
},
|
|
61
|
-
`${y}-${e}`
|
|
62
|
-
)),
|
|
63
|
-
N > 0 ? (
|
|
64
|
-
// An ITEM of the list, aligned with the text rather than the
|
|
65
|
-
// dots, so opening it does not shift the column.
|
|
66
|
-
/* @__PURE__ */ d("li", { className: "ds:flex ds:items-start ds:gap-[var(--spacing-xs)]", children: [
|
|
67
|
-
/* @__PURE__ */ s(
|
|
68
|
-
"span",
|
|
69
|
-
{
|
|
70
|
-
"aria-hidden": "true",
|
|
71
|
-
className: "ds:size-[var(--spacing-xs)] ds:shrink-0"
|
|
72
|
-
}
|
|
73
|
-
),
|
|
74
|
-
/* @__PURE__ */ s(
|
|
75
|
-
V,
|
|
76
|
-
{
|
|
77
|
-
intent: "link",
|
|
78
|
-
size: "sm",
|
|
79
|
-
"data-editable-description-toggle": "",
|
|
80
|
-
className: "ds:!ps-0 ds:!pe-0",
|
|
81
|
-
"aria-expanded": n,
|
|
82
|
-
onClick: () => v((e) => !e),
|
|
83
|
-
children: n ? g ?? i("editableDescription.showLess") : h ?? i("editableDescription.seeMore")
|
|
84
|
-
}
|
|
85
|
-
)
|
|
86
|
-
] })
|
|
87
|
-
) : null
|
|
88
|
-
] }),
|
|
89
|
-
l ? /* @__PURE__ */ s(
|
|
90
|
-
z,
|
|
91
|
-
{
|
|
92
|
-
ref: p,
|
|
93
|
-
icon: /* @__PURE__ */ s(E, { "aria-hidden": "true" }),
|
|
94
|
-
intent: "ghost",
|
|
95
|
-
size: "sm",
|
|
96
|
-
className: "ds:-mt-[var(--spacing-sm)] ds:shrink-0",
|
|
97
|
-
"aria-label": c,
|
|
98
|
-
tooltip: c,
|
|
99
|
-
"data-editable-description-edit": "",
|
|
100
|
-
onClick: l
|
|
101
|
-
}
|
|
102
|
-
) : null
|
|
103
|
-
]
|
|
104
|
-
}
|
|
105
|
-
);
|
|
106
|
-
}
|
|
107
|
-
);
|
|
108
|
-
L.displayName = "EditableDescription";
|
|
109
|
-
export {
|
|
110
|
-
L as E
|
|
111
|
-
};
|
|
112
|
-
//# sourceMappingURL=editable-description-BOfAeY3T.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"editable-description-BOfAeY3T.js","sources":["../../src/components/editable-description/editable-description.tsx"],"sourcesContent":["import {\n forwardRef,\n useMemo,\n useState,\n type HTMLAttributes,\n type Ref,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { Pencil } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '../button/button';\nimport { IconButton } from '../button/icon-button';\n\n/* -------------------------------------------------------------------- */\n/* EditableDescription */\n/* */\n/* A record's free-text description, set as bulleted lines, with a pencil */\n/* beside it when the reader may edit. An appointment's description, a */\n/* task's description, a treatment's remark. PLAIN text only: patient */\n/* notes are rich text and belong to NotesPanel and NoteTimeline. */\n/* */\n/* In practice this text is written as a list (\"sensitive lower left\", */\n/* \"review the bitewings\", \"allow extra time\"), so it is set as one, a */\n/* dot per line, rather than as a paragraph pretending to be prose. */\n/* */\n/* Long descriptions cut at the LINE, not at a rendered row: `maxLines` */\n/* bullets, then a \"See more\" that is itself an item of the list, so the */\n/* column does not shift when it opens. */\n/* */\n/* It DISPLAYS and asks to edit; it does not own the editor. `onEdit` */\n/* hands over to the host, which opens its form, in a rail panel a */\n/* `PanelSubview` with a `TextArea`. Omit `onEdit` for a read-only view. */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva(\n 'ds:flex ds:min-w-0 ds:items-start ds:gap-[var(--spacing-xs)]',\n);\n\nconst listVariants = cva(\n [\n 'ds:m-0 ds:flex ds:min-w-0 ds:flex-1 ds:list-none ds:flex-col ds:p-0',\n 'ds:gap-[var(--spacing-2xs)]',\n ].join(' '),\n);\n\nconst emptyVariants = cva(\n 'ds:m-0 ds:min-w-0 ds:flex-1 type-body-sm ds:text-[color:var(--muted-foreground)]',\n);\n\nconst lineVariants = cva(\n 'ds:flex ds:items-start ds:gap-[var(--spacing-xs)] type-body-sm ds:text-[color:var(--foreground)]',\n);\n\n/* `--spacing-sm` is (line-height − dot) / 2 for this type scale, so the dot\n centres on the FIRST line; `self-start` keeps it there when a line wraps. */\nconst dotVariants = cva(\n [\n 'ds:mt-[var(--spacing-sm)] ds:size-[var(--spacing-xs)] ds:shrink-0 ds:self-start',\n 'ds:rounded-[var(--radius-full)] ds:bg-[color:var(--border)]',\n ].join(' '),\n);\n\nexport interface EditableDescriptionProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange'\n> {\n /** The description. One bullet per non-empty line. */\n value?: string | null;\n /** Lines shown before the rest go behind \"See more\". Default `3`. */\n maxLines?: number;\n /** Fires from the pencil. Omit for a read-only description. */\n onEdit?: () => void;\n /** Receives the pencil button, so a host can return focus to it. */\n editButtonRef?: Ref<HTMLButtonElement>;\n /** Shown when there are no lines. Defaults to the kit's translated text. */\n emptyLabel?: string;\n /** Accessible name and tooltip of the pencil. Defaults to the kit's text. */\n editLabel?: string;\n /** Disclosure labels. Default to the kit's translated text. */\n seeMoreLabel?: string;\n showLessLabel?: string;\n}\n\nexport const EditableDescription = forwardRef<\n HTMLDivElement,\n EditableDescriptionProps\n>(\n (\n {\n value,\n maxLines = 3,\n onEdit,\n editButtonRef,\n emptyLabel,\n editLabel,\n seeMoreLabel,\n showLessLabel,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const [expanded, setExpanded] = useState(false);\n\n const lines = useMemo(\n () =>\n (value ?? '')\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean),\n [value],\n );\n\n const hiddenCount = Math.max(0, lines.length - maxLines);\n const shown = expanded ? lines : lines.slice(0, maxLines);\n const resolvedEditLabel = editLabel ?? t('editableDescription.edit');\n\n return (\n <div\n {...rest}\n ref={ref}\n data-component=\"editable-description\"\n data-empty={lines.length === 0 ? '' : undefined}\n className={[rootVariants(), className].filter(Boolean).join(' ')}\n >\n {lines.length === 0 ? (\n <p data-editable-description-empty=\"\" className={emptyVariants()}>\n {emptyLabel ?? t('editableDescription.empty')}\n </p>\n ) : (\n <ul className={listVariants()}>\n {shown.map((line, index) => (\n <li\n key={`${index}-${line}`}\n data-editable-description-line=\"\"\n className={lineVariants()}\n >\n <span aria-hidden=\"true\" className={dotVariants()} />\n <span className=\"ds:min-w-0 ds:[overflow-wrap:anywhere]\">\n {line}\n </span>\n </li>\n ))}\n {hiddenCount > 0 ? (\n // An ITEM of the list, aligned with the text rather than the\n // dots, so opening it does not shift the column.\n <li className=\"ds:flex ds:items-start ds:gap-[var(--spacing-xs)]\">\n <span\n aria-hidden=\"true\"\n className=\"ds:size-[var(--spacing-xs)] ds:shrink-0\"\n />\n <Button\n intent=\"link\"\n size=\"sm\"\n data-editable-description-toggle=\"\"\n className=\"ds:!ps-0 ds:!pe-0\"\n aria-expanded={expanded}\n onClick={() => setExpanded((previous) => !previous)}\n >\n {expanded\n ? (showLessLabel ?? t('editableDescription.showLess'))\n : (seeMoreLabel ?? t('editableDescription.seeMore'))}\n </Button>\n </li>\n ) : null}\n </ul>\n )}\n {onEdit ? (\n <IconButton\n ref={editButtonRef}\n icon={<Pencil aria-hidden=\"true\" />}\n intent=\"ghost\"\n size=\"sm\"\n // Pulled up so the 2rem button centres on the first text line.\n className=\"ds:-mt-[var(--spacing-sm)] ds:shrink-0\"\n aria-label={resolvedEditLabel}\n tooltip={resolvedEditLabel}\n data-editable-description-edit=\"\"\n onClick={onEdit}\n />\n ) : null}\n </div>\n );\n },\n);\nEditableDescription.displayName = 'EditableDescription';\n"],"names":["rootVariants","cva","listVariants","emptyVariants","lineVariants","dotVariants","EditableDescription","forwardRef","value","maxLines","onEdit","editButtonRef","emptyLabel","editLabel","seeMoreLabel","showLessLabel","className","rest","ref","t","useTranslation","expanded","setExpanded","useState","lines","useMemo","line","hiddenCount","shown","resolvedEditLabel","jsxs","jsx","index","Button","previous","IconButton","Pencil"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"note-timeline-CXfSV3yX.js","sources":["../../src/components/note-timeline/note-timeline.agent.ts","../../src/components/note-timeline/note-timeline.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — NoteTimeline. */\n/* */\n/* Read-only presentation surface. Exposes the STRUCTURE of the rendered */\n/* rows — ids plus pinned / flagged / clinical flags — and how many rows */\n/* survived `maxItems`, so a future MCP UI bridge can locate and describe */\n/* what is on screen. It NEVER reads a note body, an author or a date: */\n/* all three are PHI and stay out of the agent layer, exactly as the */\n/* ClinicalNoteCard adapter does. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { NoteTimelineHandle } from './note-timeline';\n\nexport const noteTimelineAgent: AgentAdapter<NoteTimelineHandle> = {\n id: 'note-timeline',\n capabilities: [],\n state: {\n notes: {\n type: 'Array<{ id?: string; pinned: boolean; flagged: boolean; clinical: boolean }>',\n descriptionKey: 'ui.agent.noteTimeline.state.notes',\n description:\n 'Structural snapshot of the rendered rows: ids and flags only, never note content or author.',\n read: (handle) => handle.getNotes(),\n },\n visibleCount: {\n type: 'number',\n descriptionKey: 'ui.agent.noteTimeline.state.visibleCount',\n description:\n 'How many notes are rendered, after the maxItems cap is applied.',\n read: (handle) => handle.getVisibleCount(),\n },\n },\n actions: {},\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'note-timeline',\n description:\n 'Marks the NoteTimeline root. Emits data-empty when there is nothing to show.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop — addresses a specific timeline.',\n },\n },\n};\n","import {\n forwardRef,\n useMemo,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Flag, Pin } from 'lucide-react';\nimport { SafeHtml } from '../_shared/safe-html';\nimport { noteMarkdownToHtml } from '../_shared/note-markdown';\nimport {\n NoteAttachmentChip,\n type NoteAttachment,\n} from '../_shared/note-attachment';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { noteTimelineAgent } from './note-timeline.agent';\n\n/* -------------------------------------------------------------------- */\n/* NoteTimeline */\n/* */\n/* A compact dated list of notes — the reading surface for a handful of */\n/* recent notes beside something else (an appointment, a care plan), */\n/* where a full ClinicalNoteCard per note would swamp the panel. */\n/* */\n/* It takes the SAME note objects a host already gives NotesPanel, so a */\n/* page can show a preview here and the full panel elsewhere without */\n/* reshaping its data. */\n/* */\n/* Deliberately READ-ONLY and deliberately without a \"+N more\" footer: */\n/* it shows the first `maxItems` and stops. The host owns the affordance */\n/* that opens the rest, because only the host knows where the rest live. */\n/* */\n/* Pinned and flagged are never colour-only: each carries a glyph and an */\n/* `sr-only` label, so the state survives greyscale, forced colours and */\n/* a screen reader (05-accessibility.mdx §Colour is not the only cue). */\n/* -------------------------------------------------------------------- */\n\n/** The note author — name, plus an optional avatar the timeline never shows. */\nexport interface NoteTimelineAuthor {\n /** Display name. */\n name: string;\n /** Optional avatar image URL. Unused here; kept so a `NotesPanelNote`\n * passes straight through without reshaping. */\n avatarUrl?: string;\n}\n\n/**\n * One note. Structurally a subset of `NotesPanelNote` / `ClinicalNoteCardProps`\n * so a host can pass the very objects it already gives `NotesPanel`.\n */\nexport interface NoteTimelineNote {\n /** Stable identifier. Surfaced as `data-note-id` — the ONLY note field that\n * ever reaches an attribute, because it is the only one that is not PHI. */\n id?: string;\n /** ISO-8601 timestamp the note refers to (the clinical date). Drives the\n * date gutter and the sort. */\n dateIso: string;\n /** ISO-8601 timestamp the note was written, when it differs from `dateIso`. */\n createdAtIso?: string;\n /** Who wrote it. Omit for a system-generated note — the byline is then\n * dropped entirely rather than rendered empty. */\n author?: NoteTimelineAuthor;\n /** The note body. */\n content: string;\n /** How `content` is authored. `'markdown'` (default) runs the small Markdown\n * subset through the shared converter; `'html'` treats it as rich HTML.\n * Either way `SafeHtml` is the only carrier. */\n contentFormat?: 'markdown' | 'html';\n /** Pinned notes sort to the top and take an accent dot. */\n pinned?: boolean;\n /** Flagged for follow-up — a warning dot and a Flag glyph. */\n flagged?: boolean;\n /** The entity the note is bound to; renders the shared attachment chip. */\n attachedTo?: NoteAttachment;\n /** Whether the note is clinical. Structural only — it drives no styling\n * here, but it is carried so the same objects serve both surfaces. */\n clinical?: boolean;\n}\n\n/** Imperative handle for the agent runtime — identifiers / flags only. */\nexport interface NoteTimelineHandle {\n /** Structural snapshot of the RENDERED rows: ids + flags, never a body or\n * an author (both PHI). */\n getNotes: () => Array<{\n id?: string;\n pinned: boolean;\n flagged: boolean;\n clinical: boolean;\n }>;\n /** How many rows are rendered, after `maxItems` is applied. */\n getVisibleCount: () => number;\n}\n\nconst rowVariants = cva(\n [\n // Named group so the rail's connector can ask \"is my ROW the last one?\".\n // A bare `last:` on the rail asks \"am I the last child of my row?\", which\n // is never true — it is the middle of three — so the line ran on past the\n // final dot and read as more content below.\n 'ds:group/note-row ds:relative ds:flex ds:gap-[var(--spacing-sm)]',\n 'ds:pb-3 ds:last:pb-0',\n ].join(' '),\n);\n\nconst bodyVariants = cva(\n [\n 'type-body-sm ds:[overflow-wrap:break-word]',\n // `[&_p]:m-0` — the converter wraps each block in <p>; the timeline\n // controls its own rhythm, so the paragraph margins are dropped.\n 'ds:[&_p]:m-0',\n ].join(' '),\n {\n variants: {\n // Literal classes, one per supported value: Tailwind generates what it\n // can see in the source, so an interpolated arbitrary value emits\n // nothing and the body would silently never clamp.\n lines: {\n 1: 'ds:line-clamp-1',\n 2: 'ds:line-clamp-2',\n 3: 'ds:line-clamp-3',\n 4: 'ds:line-clamp-4',\n 5: 'ds:line-clamp-5',\n },\n },\n defaultVariants: { lines: 3 },\n },\n);\n\nconst dotVariants = cva(\n [\n 'ds:absolute ds:top-1 ds:start-0 ds:size-[9px]',\n 'ds:rounded-[var(--radius-full)] ds:border-2',\n 'ds:bg-[color:var(--background)]',\n 'ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n {\n variants: {\n tone: {\n default: 'ds:border-[color:var(--border)]',\n pinned: [\n 'ds:border-[color:var(--accent)]',\n 'ds:bg-[color:color-mix(in_srgb,var(--accent)_20%,var(--background))]',\n ].join(' '),\n flagged: [\n 'ds:border-[color:var(--warning-readable)]',\n 'ds:bg-[color:color-mix(in_srgb,var(--warning-readable)_20%,var(--background))]',\n ].join(' '),\n },\n },\n defaultVariants: { tone: 'default' },\n },\n);\n\nexport interface NoteTimelineProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'children'>,\n VariantProps<typeof rowVariants> {\n /** Agent-readiness consumer id, surfaced as `data-component-id`. */\n id?: string;\n /** The notes. Sorted pinned-first, then `dateIso` descending. */\n notes: readonly NoteTimelineNote[];\n /** How many rows to render after sorting. Default 3. The remainder is NOT\n * counted or footered here — the host owns that affordance. */\n maxItems?: number;\n /** Lines each note body clamps to. Default 3. */\n lines?: 1 | 2 | 3 | 4 | 5;\n /** Locale for the date gutter. Defaults to the active i18n language. */\n locale?: string;\n /** Rendered in place of the list when `notes` is empty. */\n emptyState?: ReactNode;\n /** Accessible name for the list region. Defaults to `ui.noteTimeline.regionLabel`. */\n 'aria-label'?: string;\n}\n\n/** Pinned first, then newest by `dateIso`. Stable for equal dates. */\nfunction sortNotes(\n notes: readonly NoteTimelineNote[],\n): readonly NoteTimelineNote[] {\n return [...notes].sort((a, b) => {\n if (!!a.pinned !== !!b.pinned) return a.pinned ? -1 : 1;\n return b.dateIso.localeCompare(a.dateIso);\n });\n}\n\nexport const NoteTimeline = forwardRef<HTMLDivElement, NoteTimelineProps>(\n (\n {\n id,\n notes,\n maxItems = 3,\n lines = 3,\n locale,\n emptyState,\n 'aria-label': ariaLabel,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const resolvedLocale = locale ?? i18n.language;\n\n const visible = useMemo(\n () => sortNotes(notes).slice(0, Math.max(0, maxItems)),\n [notes, maxItems],\n );\n\n // Two formatters, not one: the gutter stacks \"20 JUN\" over \"2026\", so the\n // day/month and the year are formatted apart and both stay locale-aware.\n const fmt = useMemo(\n () => ({\n dayMonth: new Intl.DateTimeFormat(resolvedLocale, {\n day: 'numeric',\n month: 'short',\n }),\n year: new Intl.DateTimeFormat(resolvedLocale, { year: 'numeric' }),\n }),\n [resolvedLocale],\n );\n\n useAgentRegistration(\n noteTimelineAgent,\n {\n getNotes: () =>\n visible.map((note) => ({\n id: note.id,\n pinned: !!note.pinned,\n flagged: !!note.flagged,\n clinical: !!note.clinical,\n })),\n getVisibleCount: () => visible.length,\n },\n id,\n );\n\n if (visible.length === 0) {\n return (\n <div\n ref={ref}\n data-component=\"note-timeline\"\n data-component-id={id}\n data-empty=\"\"\n className={className}\n {...rest}\n >\n {emptyState}\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n data-component=\"note-timeline\"\n data-component-id={id}\n role=\"list\"\n aria-label={ariaLabel ?? t('noteTimeline.regionLabel')}\n className={['ds:flex ds:flex-col', className ?? ''].join(' ').trim()}\n {...rest}\n >\n {visible.map((note) => {\n const date = new Date(note.dateIso);\n const tone = note.pinned\n ? ('pinned' as const)\n : note.flagged\n ? ('flagged' as const)\n : ('default' as const);\n const html =\n note.contentFormat === 'html'\n ? note.content\n : noteMarkdownToHtml(note.content);\n\n return (\n <div\n key={note.id ?? note.dateIso}\n role=\"listitem\"\n /* id ONLY. Body, author and dates are PHI and never reach an\n attribute, where a DOM scrape or a screenshot would carry\n them out of the component. */\n data-note-id={note.id}\n data-pinned={note.pinned ? '' : undefined}\n data-flagged={note.flagged ? '' : undefined}\n className={rowVariants()}\n >\n {/* 1 — date gutter */}\n {/* Sized from the --type-meta-size ROLE token, not the raw\n --font-size-2xs ramp step: `.theme-accessible` scales type by\n re-pointing the role aliases (meta xs → sm), so a raw ramp\n value would stay 10px for exactly the readers who asked for\n bigger text. The token rather than the `type-meta` CLASS,\n because that class also sets transform / weight / tracking\n and would quietly flatten the gutter's own treatment. */}\n <div className=\"ds:w-12 ds:shrink-0 ds:pt-px ds:text-end ds:text-[length:var(--type-meta-size)] ds:leading-[1.3]\">\n <div className=\"ds:font-semibold ds:tracking-[0.03em] ds:uppercase\">\n {fmt.dayMonth.format(date)}\n </div>\n <div className=\"ds:text-[color:var(--muted-foreground)]\">\n {fmt.year.format(date)}\n </div>\n </div>\n\n {/* 2 — rail: dot over the connector. The connector is a\n pseudo-element so it never lands in the a11y tree, and it is\n hidden on the last row rather than dangling into nothing. */}\n <div\n aria-hidden=\"true\"\n className={[\n 'ds:relative ds:w-[9px] ds:shrink-0',\n 'ds:before:absolute ds:before:start-[4px] ds:before:top-[14px]',\n 'ds:before:bottom-[-12px] ds:before:w-px',\n 'ds:before:bg-[color:var(--border)] ds:before:content-[\"\"]',\n 'ds:group-last/note-row:before:hidden',\n ].join(' ')}\n >\n <span className={dotVariants({ tone })} />\n </div>\n\n {/* 3 — body + byline */}\n <div className=\"ds:min-w-0 ds:flex-1\">\n <SafeHtml\n html={html}\n profile={\n note.contentFormat === 'html' ? 'rich-text' : 'markdown'\n }\n className={bodyVariants({ lines })}\n />\n {note.author ||\n note.pinned ||\n note.flagged ||\n note.attachedTo ? (\n <div className=\"ds:mt-[var(--spacing-2xs)] ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-2xs)] type-meta ds:text-[color:var(--muted-foreground)]\">\n {note.author ? <span>{note.author.name}</span> : null}\n {note.pinned ? (\n <span className=\"ds:inline-flex ds:items-center\">\n <Pin\n aria-hidden=\"true\"\n className=\"ds:size-3 ds:text-[color:var(--accent)]\"\n />\n <span className=\"ds:sr-only\">\n {t('noteTimeline.pinned')}\n </span>\n </span>\n ) : null}\n {note.flagged ? (\n <span className=\"ds:inline-flex ds:items-center\">\n <Flag\n aria-hidden=\"true\"\n className=\"ds:size-3 ds:text-[color:var(--warning-readable)]\"\n />\n <span className=\"ds:sr-only\">\n {t('noteTimeline.flagged')}\n </span>\n </span>\n ) : null}\n <NoteAttachmentChip attachedTo={note.attachedTo} />\n </div>\n ) : null}\n </div>\n </div>\n );\n })}\n </div>\n );\n },\n);\n\nNoteTimeline.displayName = 'NoteTimeline';\n"],"names":["noteTimelineAgent","handle","rowVariants","cva","bodyVariants","dotVariants","sortNotes","notes","a","b","NoteTimeline","forwardRef","id","maxItems","lines","locale","emptyState","ariaLabel","className","rest","ref","t","i18n","useTranslation","resolvedLocale","visible","useMemo","fmt","useAgentRegistration","note","jsx","date","tone","html","noteMarkdownToHtml","jsxs","SafeHtml","Pin","Flag","NoteAttachmentChip"],"mappings":"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"}
|