@alfadocs/ui-kit-debug 0.75.0 → 0.78.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/{address-fields-COyjgqxA.js → address-fields-7k59FnJ6.js} +2 -2
- package/dist/_chunks/{address-fields-COyjgqxA.js.map → address-fields-7k59FnJ6.js.map} +1 -1
- package/dist/_chunks/{booking-B1Qkcl3c.js → booking-CLmeXtGv.js} +2 -2
- package/dist/_chunks/{booking-B1Qkcl3c.js.map → booking-CLmeXtGv.js.map} +1 -1
- package/dist/_chunks/{country-select-DYHDLEjG.js → country-select-BN9nedAp.js} +2 -2
- package/dist/_chunks/{country-select-DYHDLEjG.js.map → country-select-BN9nedAp.js.map} +1 -1
- package/dist/_chunks/document-preview-nwfulDEs.js +290 -0
- package/dist/_chunks/document-preview-nwfulDEs.js.map +1 -0
- package/dist/_chunks/{file-manager-UF8dkQF1.js → file-manager-DfTG7bxx.js} +394 -399
- package/dist/_chunks/file-manager-DfTG7bxx.js.map +1 -0
- package/dist/_chunks/flag-Cnmivlrl.js +641 -0
- package/dist/_chunks/{flag-DZ6V7-hU.js.map → flag-Cnmivlrl.js.map} +1 -1
- package/dist/_chunks/{header-settings-4cwQzeFc.js → header-settings-DMfdx0Vq.js} +2 -2
- package/dist/_chunks/{header-settings-4cwQzeFc.js.map → header-settings-DMfdx0Vq.js.map} +1 -1
- package/dist/_chunks/{locale-picker-GNF3lo8K.js → locale-picker-EyvPrwDc.js} +2 -2
- package/dist/_chunks/{locale-picker-GNF3lo8K.js.map → locale-picker-EyvPrwDc.js.map} +1 -1
- package/dist/_chunks/{marketplace-app-shell-D_1tF4La.js → marketplace-app-shell-Bxq1PYAj.js} +2 -2
- package/dist/_chunks/{marketplace-app-shell-D_1tF4La.js.map → marketplace-app-shell-Bxq1PYAj.js.map} +1 -1
- package/dist/_chunks/{patient-details-DP4wKyq4.js → patient-details-zy76MRh7.js} +3 -3
- package/dist/_chunks/{patient-details-DP4wKyq4.js.map → patient-details-zy76MRh7.js.map} +1 -1
- package/dist/_chunks/periodontal-chart-CYBhr9vc.js +1305 -0
- package/dist/_chunks/periodontal-chart-CYBhr9vc.js.map +1 -0
- package/dist/_chunks/{phone-input-dtnrvnZf.js → phone-input-D00ZBAm-.js} +2 -2
- package/dist/_chunks/{phone-input-dtnrvnZf.js.map → phone-input-D00ZBAm-.js.map} +1 -1
- package/dist/agent-catalog.json +149 -1
- package/dist/agent-i18n/en.json +2 -0
- package/dist/components/address-fields/index.js +1 -1
- package/dist/components/booking/index.js +1 -1
- package/dist/components/country-select/index.js +1 -1
- package/dist/components/document-preview/document-preview.d.ts +35 -2
- package/dist/components/document-preview/document-preview.d.ts.map +1 -1
- package/dist/components/document-preview/index.d.ts +1 -1
- package/dist/components/document-preview/index.d.ts.map +1 -1
- package/dist/components/document-preview/index.js +1 -1
- package/dist/components/file-manager/file-manager.d.ts.map +1 -1
- package/dist/components/file-manager/index.js +1 -1
- package/dist/components/file-manager/list-view.d.ts.map +1 -1
- package/dist/components/flag/flag.d.ts.map +1 -1
- package/dist/components/flag/index.js +1 -1
- package/dist/components/header-settings/index.js +1 -1
- package/dist/components/locale-picker/index.js +1 -1
- package/dist/components/patient-details/index.js +1 -1
- package/dist/components/periodontal-chart/index.d.ts +2 -2
- package/dist/components/periodontal-chart/index.d.ts.map +1 -1
- package/dist/components/periodontal-chart/index.js +8 -7
- package/dist/components/periodontal-chart/periodontal-chart-data.d.ts +45 -0
- package/dist/components/periodontal-chart/periodontal-chart-data.d.ts.map +1 -1
- package/dist/components/periodontal-chart/periodontal-chart.agent.d.ts.map +1 -1
- package/dist/components/periodontal-chart/periodontal-chart.d.ts +3 -1
- package/dist/components/periodontal-chart/periodontal-chart.d.ts.map +1 -1
- package/dist/components/phone-input/index.js +1 -1
- package/dist/i18n/locales/ar.d.ts +8 -1
- package/dist/i18n/locales/ar.d.ts.map +1 -1
- package/dist/i18n/locales/ar.js +8 -1
- package/dist/i18n/locales/ar.js.map +1 -1
- package/dist/i18n/locales/de.d.ts +8 -1
- package/dist/i18n/locales/de.d.ts.map +1 -1
- package/dist/i18n/locales/de.js +8 -1
- package/dist/i18n/locales/de.js.map +1 -1
- package/dist/i18n/locales/el.d.ts +8 -1
- package/dist/i18n/locales/el.d.ts.map +1 -1
- package/dist/i18n/locales/el.js +8 -1
- package/dist/i18n/locales/el.js.map +1 -1
- package/dist/i18n/locales/en.d.ts +8 -1
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +8 -1
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/es.d.ts +8 -1
- package/dist/i18n/locales/es.d.ts.map +1 -1
- package/dist/i18n/locales/es.js +8 -1
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +8 -1
- package/dist/i18n/locales/fr.d.ts.map +1 -1
- package/dist/i18n/locales/fr.js +8 -1
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hi.d.ts +8 -1
- package/dist/i18n/locales/hi.d.ts.map +1 -1
- package/dist/i18n/locales/hi.js +8 -1
- package/dist/i18n/locales/hi.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +8 -1
- package/dist/i18n/locales/it.d.ts.map +1 -1
- package/dist/i18n/locales/it.js +8 -1
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/ja.d.ts +8 -1
- package/dist/i18n/locales/ja.d.ts.map +1 -1
- package/dist/i18n/locales/ja.js +8 -1
- package/dist/i18n/locales/ja.js.map +1 -1
- package/dist/i18n/locales/nl.d.ts +8 -1
- package/dist/i18n/locales/nl.d.ts.map +1 -1
- package/dist/i18n/locales/nl.js +8 -1
- package/dist/i18n/locales/nl.js.map +1 -1
- package/dist/i18n/locales/pl.d.ts +8 -1
- package/dist/i18n/locales/pl.d.ts.map +1 -1
- package/dist/i18n/locales/pl.js +8 -1
- package/dist/i18n/locales/pl.js.map +1 -1
- package/dist/i18n/locales/pt.d.ts +8 -1
- package/dist/i18n/locales/pt.d.ts.map +1 -1
- package/dist/i18n/locales/pt.js +8 -1
- package/dist/i18n/locales/pt.js.map +1 -1
- package/dist/i18n/locales/ro.d.ts +8 -1
- package/dist/i18n/locales/ro.d.ts.map +1 -1
- package/dist/i18n/locales/ro.js +8 -1
- package/dist/i18n/locales/ro.js.map +1 -1
- package/dist/i18n/locales/ru.d.ts +8 -1
- package/dist/i18n/locales/ru.d.ts.map +1 -1
- package/dist/i18n/locales/ru.js +8 -1
- package/dist/i18n/locales/ru.js.map +1 -1
- package/dist/i18n/locales/sq.d.ts +8 -1
- package/dist/i18n/locales/sq.d.ts.map +1 -1
- package/dist/i18n/locales/sq.js +8 -1
- package/dist/i18n/locales/sq.js.map +1 -1
- package/dist/i18n/locales/sv.d.ts +8 -1
- package/dist/i18n/locales/sv.d.ts.map +1 -1
- package/dist/i18n/locales/sv.js +8 -1
- package/dist/i18n/locales/sv.js.map +1 -1
- package/dist/i18n/locales/tr.d.ts +8 -1
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/locales/tr.js +8 -1
- package/dist/i18n/locales/tr.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +8 -1
- package/dist/i18n/locales/zh.d.ts.map +1 -1
- package/dist/i18n/locales/zh.js +8 -1
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/index.js +217 -216
- package/dist/locales/ar.json +8 -1
- package/dist/locales/de.json +8 -1
- package/dist/locales/el.json +8 -1
- package/dist/locales/en.json +8 -1
- package/dist/locales/es.json +8 -1
- package/dist/locales/fr.json +8 -1
- package/dist/locales/hi.json +8 -1
- package/dist/locales/it.json +8 -1
- package/dist/locales/ja.json +8 -1
- package/dist/locales/nl.json +8 -1
- package/dist/locales/pl.json +8 -1
- package/dist/locales/pt.json +8 -1
- package/dist/locales/ro.json +8 -1
- package/dist/locales/ru.json +8 -1
- package/dist/locales/sq.json +8 -1
- package/dist/locales/sv.json +8 -1
- package/dist/locales/tr.json +8 -1
- package/dist/locales/zh.json +8 -1
- package/dist/patterns/marketplace-app-shell/index.js +1 -1
- package/dist/tokens.css +2 -1
- package/package.json +1 -1
- package/dist/_chunks/document-preview-CGSM_au9.js +0 -181
- package/dist/_chunks/document-preview-CGSM_au9.js.map +0 -1
- package/dist/_chunks/file-manager-UF8dkQF1.js.map +0 -1
- package/dist/_chunks/flag-DZ6V7-hU.js +0 -637
- package/dist/_chunks/periodontal-chart-D8hOFmde.js +0 -1173
- package/dist/_chunks/periodontal-chart-D8hOFmde.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alfadocs/ui-kit-debug",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.78.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "AlfaDocs shared design system — tokens, components, patterns, and translations for platform, booking, and alfascribe. (debug build — identical runtime to @alfadocs/ui-kit, ships source maps for symbolication).",
|
|
6
6
|
"license": "BUSL-1.1",
|
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
import { jsx as i, jsxs as c, Fragment as p } from "react/jsx-runtime";
|
|
2
|
-
import { forwardRef as P, useMemo as N, useImperativeHandle as b, useRef as D } from "react";
|
|
3
|
-
import { c as I } from "./index-D2ZczOXr.js";
|
|
4
|
-
import { useTranslation as F } from "react-i18next";
|
|
5
|
-
import { B as a } from "./badge-DCOqV9mI.js";
|
|
6
|
-
import { E as A } from "./empty-state-CrLsi0XI.js";
|
|
7
|
-
import { P as S } from "./pdf-viewer-DF3VMaPo.js";
|
|
8
|
-
import { u as B } from "./registry-DvAUVLHh.js";
|
|
9
|
-
import { F as T, a as z } from "./file-Cwe9VC1A.js";
|
|
10
|
-
import { F as k } from "./file-text-5yv6r2ls.js";
|
|
11
|
-
const K = {
|
|
12
|
-
id: "document-preview",
|
|
13
|
-
capabilities: [],
|
|
14
|
-
state: {
|
|
15
|
-
kind: {
|
|
16
|
-
type: "'pdf' | 'image' | 'metadata' | 'empty'",
|
|
17
|
-
descriptionKey: "ui.agent.documentPreview.state.kind",
|
|
18
|
-
description: "Which render branch is active: pdf, image, metadata (no inline preview), or empty (no document). Structural — never the document name.",
|
|
19
|
-
read: (s) => s.getKind()
|
|
20
|
-
}
|
|
21
|
-
},
|
|
22
|
-
actions: {
|
|
23
|
-
get_name: {
|
|
24
|
-
// phi (not read): resolves the document display name, which can identify
|
|
25
|
-
// patients. PRS §26 — phi outranks read so the host gates it behind
|
|
26
|
-
// stricter confirm + audit. The always-on kind slot stays name-free.
|
|
27
|
-
safety: "phi",
|
|
28
|
-
returns: "string | undefined",
|
|
29
|
-
returnsSchema: { type: ["string", "null"] },
|
|
30
|
-
idempotent: !0,
|
|
31
|
-
descriptionKey: "ui.agent.documentPreview.actions.getName",
|
|
32
|
-
description: "Read the display name of the previewed document. May identify a patient (PHI).",
|
|
33
|
-
invoke: (s) => s.getName()
|
|
34
|
-
}
|
|
35
|
-
},
|
|
36
|
-
domHooks: {
|
|
37
|
-
root: {
|
|
38
|
-
attr: "data-component",
|
|
39
|
-
value: "document-preview",
|
|
40
|
-
description: "Marks the DocumentPreview region."
|
|
41
|
-
},
|
|
42
|
-
instanceId: {
|
|
43
|
-
attr: "data-component-id",
|
|
44
|
-
sourceProp: "id",
|
|
45
|
-
description: "Sourced from the id prop."
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}, R = I(
|
|
49
|
-
[
|
|
50
|
-
"ds:flex ds:h-full ds:min-h-0 ds:min-w-0 ds:flex-col ds:overflow-auto",
|
|
51
|
-
"ds:focus-visible:outline-[length:var(--focus-ring-width)]",
|
|
52
|
-
"ds:focus-visible:outline-solid",
|
|
53
|
-
"ds:focus-visible:outline-ring"
|
|
54
|
-
].join(" ")
|
|
55
|
-
), M = {
|
|
56
|
-
signed: "success",
|
|
57
|
-
pending: "warning"
|
|
58
|
-
};
|
|
59
|
-
function E(s, n, o) {
|
|
60
|
-
if (!s) return "empty";
|
|
61
|
-
const r = n ?? "";
|
|
62
|
-
return r === "application/pdf" && o ? "pdf" : r.startsWith("image/") && o ? "image" : "metadata";
|
|
63
|
-
}
|
|
64
|
-
function L(s) {
|
|
65
|
-
const n = s ?? "";
|
|
66
|
-
return n.startsWith("image/") ? T : n === "application/pdf" || n.startsWith("text/") || n.includes("word") ? k : z;
|
|
67
|
-
}
|
|
68
|
-
const _ = [
|
|
69
|
-
"documentPreview.units.bytes",
|
|
70
|
-
"documentPreview.units.kilobytes",
|
|
71
|
-
"documentPreview.units.megabytes",
|
|
72
|
-
"documentPreview.units.gigabytes"
|
|
73
|
-
], g = ["B", "KB", "MB", "GB"];
|
|
74
|
-
function j(s, n, o) {
|
|
75
|
-
let r = s, e = 0;
|
|
76
|
-
for (; r >= 1024 && e < g.length - 1; )
|
|
77
|
-
r /= 1024, e++;
|
|
78
|
-
return `${new Intl.NumberFormat(n, {
|
|
79
|
-
maximumFractionDigits: e === 0 ? 0 : 1
|
|
80
|
-
}).format(r)} ${o(_[e], g[e])}`;
|
|
81
|
-
}
|
|
82
|
-
const V = P(({ id: s, name: n, mimeType: o, src: r, metadata: e, className: f }, v) => {
|
|
83
|
-
const { t, i18n: u } = F(), l = E(n, o, r), m = N(
|
|
84
|
-
() => ({
|
|
85
|
-
getKind: () => l,
|
|
86
|
-
getName: () => n
|
|
87
|
-
}),
|
|
88
|
-
[l, n]
|
|
89
|
-
);
|
|
90
|
-
b(v, () => m, [m]), B(K, m, s);
|
|
91
|
-
const w = D(null), h = (() => {
|
|
92
|
-
if (l === "empty")
|
|
93
|
-
return /* @__PURE__ */ i(
|
|
94
|
-
A,
|
|
95
|
-
{
|
|
96
|
-
variant: "first-use",
|
|
97
|
-
size: "sm",
|
|
98
|
-
title: t("documentPreview.emptyTitle", "No document selected"),
|
|
99
|
-
description: t(
|
|
100
|
-
"documentPreview.emptyDescription",
|
|
101
|
-
"Select a document to preview it here."
|
|
102
|
-
)
|
|
103
|
-
}
|
|
104
|
-
);
|
|
105
|
-
if (l === "pdf" && r)
|
|
106
|
-
return /* @__PURE__ */ i(
|
|
107
|
-
S,
|
|
108
|
-
{
|
|
109
|
-
src: r,
|
|
110
|
-
toolbarVariant: "minimal",
|
|
111
|
-
ariaLabel: t("documentPreview.pdfLabel", "Document preview"),
|
|
112
|
-
className: "ds:h-full"
|
|
113
|
-
}
|
|
114
|
-
);
|
|
115
|
-
if (l === "image" && r)
|
|
116
|
-
return /* @__PURE__ */ i(
|
|
117
|
-
"img",
|
|
118
|
-
{
|
|
119
|
-
src: r,
|
|
120
|
-
alt: t("documentPreview.imageAlt", "Preview of {{name}}", { name: n }),
|
|
121
|
-
className: "ds:max-h-full ds:max-w-full ds:ms-auto ds:me-auto ds:object-contain"
|
|
122
|
-
}
|
|
123
|
-
);
|
|
124
|
-
const y = L(o), d = e == null ? void 0 : e.signatureStatus, x = !!(e != null && e.documentType) || !!(e != null && e.clinical) || d !== void 0 && d !== "none";
|
|
125
|
-
return /* @__PURE__ */ c("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-md)] ds:p-[var(--spacing-md)]", children: [
|
|
126
|
-
/* @__PURE__ */ c("span", { className: "ds:flex ds:items-center ds:gap-[var(--spacing-sm)]", children: [
|
|
127
|
-
/* @__PURE__ */ i(
|
|
128
|
-
y,
|
|
129
|
-
{
|
|
130
|
-
"aria-hidden": "true",
|
|
131
|
-
className: "ds:size-8 ds:shrink-0 ds:text-muted-foreground"
|
|
132
|
-
}
|
|
133
|
-
),
|
|
134
|
-
/* @__PURE__ */ i("span", { className: "type-title-card ds:min-w-0 ds:truncate", children: n })
|
|
135
|
-
] }),
|
|
136
|
-
x && /* @__PURE__ */ c("span", { className: "ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]", children: [
|
|
137
|
-
(e == null ? void 0 : e.documentType) && /* @__PURE__ */ i(a, { variant: "neutral", size: "sm", children: e.documentType }),
|
|
138
|
-
(e == null ? void 0 : e.clinical) && /* @__PURE__ */ i(a, { variant: "info", size: "sm", children: t("documentPreview.clinical", "Clinical") }),
|
|
139
|
-
d && d !== "none" && /* @__PURE__ */ i(a, { variant: M[d], size: "sm", withDot: !0, children: t(`documentPreview.signature.${d}`, d) })
|
|
140
|
-
] }),
|
|
141
|
-
/* @__PURE__ */ c("dl", { className: "ds:grid ds:grid-cols-[auto_1fr] ds:gap-x-[var(--spacing-md)] ds:gap-y-[var(--spacing-xs)] type-body-sm", children: [
|
|
142
|
-
(e == null ? void 0 : e.size) !== void 0 && /* @__PURE__ */ c(p, { children: [
|
|
143
|
-
/* @__PURE__ */ i("dt", { className: "ds:text-muted-foreground", children: t("documentPreview.fields.size", "Size") }),
|
|
144
|
-
/* @__PURE__ */ i("dd", { className: "ds:m-0", children: j(e.size, u.language, t) })
|
|
145
|
-
] }),
|
|
146
|
-
(e == null ? void 0 : e.updatedAt) && /* @__PURE__ */ c(p, { children: [
|
|
147
|
-
/* @__PURE__ */ i("dt", { className: "ds:text-muted-foreground", children: t("documentPreview.fields.modified", "Modified") }),
|
|
148
|
-
/* @__PURE__ */ i("dd", { className: "ds:m-0", children: new Intl.DateTimeFormat(u.language, {
|
|
149
|
-
dateStyle: "medium"
|
|
150
|
-
}).format(new Date(e.updatedAt)) })
|
|
151
|
-
] }),
|
|
152
|
-
(e == null ? void 0 : e.expiresAt) && /* @__PURE__ */ c(p, { children: [
|
|
153
|
-
/* @__PURE__ */ i("dt", { className: "ds:text-muted-foreground", children: t("documentPreview.fields.expires", "Expires") }),
|
|
154
|
-
/* @__PURE__ */ i("dd", { className: "ds:m-0", children: new Intl.DateTimeFormat(u.language, {
|
|
155
|
-
dateStyle: "medium"
|
|
156
|
-
}).format(new Date(e.expiresAt)) })
|
|
157
|
-
] })
|
|
158
|
-
] }),
|
|
159
|
-
/* @__PURE__ */ i("p", { className: "type-body-sm ds:m-0 ds:text-muted-foreground", children: t("documentPreview.noPreview", "No preview available.") })
|
|
160
|
-
] });
|
|
161
|
-
})();
|
|
162
|
-
return /* @__PURE__ */ i(
|
|
163
|
-
"div",
|
|
164
|
-
{
|
|
165
|
-
ref: w,
|
|
166
|
-
"data-component": "document-preview",
|
|
167
|
-
"data-component-id": s,
|
|
168
|
-
tabIndex: 0,
|
|
169
|
-
role: "group",
|
|
170
|
-
"aria-label": t("documentPreview.regionLabel", "Document preview"),
|
|
171
|
-
className: R({ className: f }),
|
|
172
|
-
children: h
|
|
173
|
-
}
|
|
174
|
-
);
|
|
175
|
-
});
|
|
176
|
-
V.displayName = "DocumentPreview";
|
|
177
|
-
export {
|
|
178
|
-
V as D,
|
|
179
|
-
K as d
|
|
180
|
-
};
|
|
181
|
-
//# sourceMappingURL=document-preview-CGSM_au9.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"document-preview-CGSM_au9.js","sources":["../../src/components/document-preview/document-preview.agent.ts","../../src/components/document-preview/document-preview.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — DocumentPreview. */\n/* */\n/* A passive, read-only viewer, so it declares no interactive */\n/* capabilities. The always-on state slot carries only the structural */\n/* render `kind` (pdf / image / metadata / empty) — never the document */\n/* name. */\n/* */\n/* PHI rule (PRS §26 §7): the document display name can identify a */\n/* patient (e.g. \"Rossi Maria — referto 2026.pdf\"). It renders as text */\n/* (fine) but the only name-returning read is the deliberate get_name */\n/* action with `safety: 'phi'`, so the host gates it behind confirm + */\n/* audit. No name is ever emitted in a data-* hook. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { DocumentPreviewHandle } from './document-preview';\n\nexport const documentPreviewAgent: AgentAdapter<DocumentPreviewHandle> = {\n id: 'document-preview',\n capabilities: [],\n state: {\n kind: {\n type: \"'pdf' | 'image' | 'metadata' | 'empty'\",\n descriptionKey: 'ui.agent.documentPreview.state.kind',\n description:\n 'Which render branch is active: pdf, image, metadata (no inline preview), or empty (no document). Structural — never the document name.',\n read: (handle) => handle.getKind(),\n },\n },\n actions: {\n get_name: {\n // phi (not read): resolves the document display name, which can identify\n // patients. PRS §26 — phi outranks read so the host gates it behind\n // stricter confirm + audit. The always-on kind slot stays name-free.\n safety: 'phi',\n returns: 'string | undefined',\n returnsSchema: { type: ['string', 'null'] },\n idempotent: true,\n descriptionKey: 'ui.agent.documentPreview.actions.getName',\n description:\n 'Read the display name of the previewed document. May identify a patient (PHI).',\n invoke: (handle) => handle.getName(),\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'document-preview',\n description: 'Marks the DocumentPreview region.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","/* -------------------------------------------------------------------- */\n/* DocumentPreview — a standalone, reusable document viewer. */\n/* */\n/* Decoupled from FileManager: it takes primitive props (name, mimeType, */\n/* src, metadata) rather than a FileManagerItem, so signing, the patient */\n/* portal, and the Control Room rail can all reuse it. Render branches, */\n/* in order: PDF (application/pdf + src) → kit PDFViewer; image (image/* */\n/* + src) → <img>; otherwise a metadata card; no name → EmptyState. The */\n/* outer element is a keyboard-focusable scroll region (tabIndex 0 + */\n/* role=\"group\" + labelled focus ring), the same affordance the old */\n/* FileManager preview tray carried. */\n/* */\n/* PHI: the visible name renders as text (fine), but the only */\n/* name-returning handle read is surfaced by document-preview.agent.ts */\n/* as a `safety: 'phi'` action — never in always-on state, never in a */\n/* data-* hook. */\n/* -------------------------------------------------------------------- */\n\nimport {\n forwardRef,\n useImperativeHandle,\n useMemo,\n useRef,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport {\n File as FileIcon,\n FileImage,\n FileText,\n type LucideIcon,\n} from 'lucide-react';\nimport { Badge } from '../badge';\nimport { EmptyState } from '../empty-state';\nimport { PDFViewer } from '../pdf-viewer';\nimport { useAgentRegistration } from '../../agent';\nimport { documentPreviewAgent } from './document-preview.agent';\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type DocumentPreviewSignatureStatus = 'none' | 'pending' | 'signed';\n\n/** Which render branch DocumentPreview is showing — structural, never PHI. */\nexport type DocumentPreviewKind = 'pdf' | 'image' | 'metadata' | 'empty';\n\nexport interface DocumentPreviewMetadata {\n /** Size in bytes. */\n size?: number;\n /** ISO 8601 timestamp of the last modification. */\n updatedAt?: string;\n /** Open document-type category (non-identifying), e.g. `'xray'`. */\n documentType?: string;\n /** Signature workflow state. */\n signatureStatus?: DocumentPreviewSignatureStatus;\n /** Clinical-document flag (host-defined semantics). */\n clinical?: boolean;\n /** ISO 8601 expiry (e.g. identification documents). */\n expiresAt?: string;\n}\n\nexport interface DocumentPreviewProps extends VariantProps<\n typeof documentPreviewVariants\n> {\n /** Opaque instance id — emitted as `data-component-id` for the agent registry. */\n id?: string;\n /** Display name. Absent → empty state. Treated as PHI by the agent contract. */\n name?: string;\n /** MIME type — drives the render branch and the fallback icon. */\n mimeType?: string;\n /** Resolved URL / data URI for the PDF or image viewer. The host owns auth. */\n src?: string;\n /** Structural metadata rendered by the metadata-card branch. */\n metadata?: DocumentPreviewMetadata;\n className?: string;\n}\n\nexport interface DocumentPreviewHandle {\n /** Which render branch is active — structural, safe for always-on reads. */\n getKind: () => DocumentPreviewKind;\n /** The document display name (PHI). Surfaced by the adapter as a `phi` action. */\n getName: () => string | undefined;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst documentPreviewVariants = cva(\n [\n 'ds:flex ds:h-full ds:min-h-0 ds:min-w-0 ds:flex-col ds:overflow-auto',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring',\n ].join(' '),\n);\n\nconst SIGNATURE_VARIANT: Record<\n Exclude<DocumentPreviewSignatureStatus, 'none'>,\n 'success' | 'warning'\n> = {\n signed: 'success',\n pending: 'warning',\n};\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nfunction resolveKind(\n name: string | undefined,\n mimeType: string | undefined,\n src: string | undefined,\n): DocumentPreviewKind {\n if (!name) return 'empty';\n const mime = mimeType ?? '';\n if (mime === 'application/pdf' && src) return 'pdf';\n if (mime.startsWith('image/') && src) return 'image';\n return 'metadata';\n}\n\n/** Fallback icon for the metadata card — a small MIME-family lookup. */\nfunction iconForMime(mimeType: string | undefined): LucideIcon {\n const mime = mimeType ?? '';\n if (mime.startsWith('image/')) return FileImage;\n if (\n mime === 'application/pdf' ||\n mime.startsWith('text/') ||\n mime.includes('word')\n ) {\n return FileText;\n }\n return FileIcon;\n}\n\nconst UNIT_KEYS = [\n 'documentPreview.units.bytes',\n 'documentPreview.units.kilobytes',\n 'documentPreview.units.megabytes',\n 'documentPreview.units.gigabytes',\n] as const;\n\nconst UNIT_FALLBACKS = ['B', 'KB', 'MB', 'GB'] as const;\n\nfunction formatBytes(\n bytes: number,\n locale: string,\n t: (key: string, fallback: string) => string,\n): string {\n let value = bytes;\n let unitIndex = 0;\n while (value >= 1024 && unitIndex < UNIT_FALLBACKS.length - 1) {\n value /= 1024;\n unitIndex++;\n }\n const formatted = new Intl.NumberFormat(locale, {\n maximumFractionDigits: unitIndex === 0 ? 0 : 1,\n }).format(value);\n return `${formatted} ${t(UNIT_KEYS[unitIndex], UNIT_FALLBACKS[unitIndex])}`;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const DocumentPreview = forwardRef<\n DocumentPreviewHandle,\n DocumentPreviewProps\n>(({ id, name, mimeType, src, metadata, className }, ref) => {\n const { t, i18n } = useTranslation();\n\n const kind = resolveKind(name, mimeType, src);\n\n const handle = useMemo<DocumentPreviewHandle>(\n () => ({\n getKind: () => kind,\n getName: () => name,\n }),\n [kind, name],\n );\n useImperativeHandle(ref, () => handle, [handle]);\n useAgentRegistration(documentPreviewAgent, handle, id);\n\n const regionRef = useRef<HTMLDivElement>(null);\n\n const body: ReactNode = (() => {\n if (kind === 'empty') {\n return (\n <EmptyState\n variant=\"first-use\"\n size=\"sm\"\n title={t('documentPreview.emptyTitle', 'No document selected')}\n description={t(\n 'documentPreview.emptyDescription',\n 'Select a document to preview it here.',\n )}\n />\n );\n }\n\n if (kind === 'pdf' && src) {\n return (\n <PDFViewer\n src={src}\n toolbarVariant=\"minimal\"\n ariaLabel={t('documentPreview.pdfLabel', 'Document preview')}\n className=\"ds:h-full\"\n />\n );\n }\n\n if (kind === 'image' && src) {\n return (\n <img\n src={src}\n alt={t('documentPreview.imageAlt', 'Preview of {{name}}', { name })}\n className=\"ds:max-h-full ds:max-w-full ds:ms-auto ds:me-auto ds:object-contain\"\n />\n );\n }\n\n // Metadata card.\n const IconComponent = iconForMime(mimeType);\n const status = metadata?.signatureStatus;\n const hasBadges =\n Boolean(metadata?.documentType) ||\n Boolean(metadata?.clinical) ||\n (status !== undefined && status !== 'none');\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)] ds:p-[var(--spacing-md)]\">\n <span className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <IconComponent\n aria-hidden=\"true\"\n className=\"ds:size-8 ds:shrink-0 ds:text-muted-foreground\"\n />\n <span className=\"type-title-card ds:min-w-0 ds:truncate\">{name}</span>\n </span>\n\n {hasBadges && (\n <span className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n {metadata?.documentType && (\n <Badge variant=\"neutral\" size=\"sm\">\n {metadata.documentType}\n </Badge>\n )}\n {metadata?.clinical && (\n <Badge variant=\"info\" size=\"sm\">\n {t('documentPreview.clinical', 'Clinical')}\n </Badge>\n )}\n {status && status !== 'none' && (\n <Badge variant={SIGNATURE_VARIANT[status]} size=\"sm\" withDot>\n {t(`documentPreview.signature.${status}`, status)}\n </Badge>\n )}\n </span>\n )}\n\n <dl className=\"ds:grid ds:grid-cols-[auto_1fr] ds:gap-x-[var(--spacing-md)] ds:gap-y-[var(--spacing-xs)] type-body-sm\">\n {metadata?.size !== undefined && (\n <>\n <dt className=\"ds:text-muted-foreground\">\n {t('documentPreview.fields.size', 'Size')}\n </dt>\n <dd className=\"ds:m-0\">\n {formatBytes(metadata.size, i18n.language, t)}\n </dd>\n </>\n )}\n {metadata?.updatedAt && (\n <>\n <dt className=\"ds:text-muted-foreground\">\n {t('documentPreview.fields.modified', 'Modified')}\n </dt>\n <dd className=\"ds:m-0\">\n {new Intl.DateTimeFormat(i18n.language, {\n dateStyle: 'medium',\n }).format(new Date(metadata.updatedAt))}\n </dd>\n </>\n )}\n {metadata?.expiresAt && (\n <>\n <dt className=\"ds:text-muted-foreground\">\n {t('documentPreview.fields.expires', 'Expires')}\n </dt>\n <dd className=\"ds:m-0\">\n {new Intl.DateTimeFormat(i18n.language, {\n dateStyle: 'medium',\n }).format(new Date(metadata.expiresAt))}\n </dd>\n </>\n )}\n </dl>\n\n <p className=\"type-body-sm ds:m-0 ds:text-muted-foreground\">\n {t('documentPreview.noPreview', 'No preview available.')}\n </p>\n </div>\n );\n })();\n\n return (\n <div\n ref={regionRef}\n data-component=\"document-preview\"\n data-component-id={id}\n // The preview body scrolls (PDF pages, tall images, long metadata), so\n // the region needs a keyboard tab stop (axe scrollable-region-focusable).\n // role=\"group\" + a translated aria-label name it without adding a second\n // landmark; the focus ring mirrors the old FileManager preview tray.\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- keyboard-focusable scroll region (see comment above)\n tabIndex={0}\n role=\"group\"\n aria-label={t('documentPreview.regionLabel', 'Document preview')}\n className={documentPreviewVariants({ className })}\n >\n {body}\n </div>\n );\n});\n\nDocumentPreview.displayName = 'DocumentPreview';\n"],"names":["documentPreviewAgent","handle","documentPreviewVariants","cva","SIGNATURE_VARIANT","resolveKind","name","mimeType","src","mime","iconForMime","FileImage","FileText","FileIcon","UNIT_KEYS","UNIT_FALLBACKS","formatBytes","bytes","locale","t","value","unitIndex","DocumentPreview","forwardRef","id","metadata","className","ref","i18n","useTranslation","kind","useMemo","useImperativeHandle","useAgentRegistration","regionRef","useRef","body","jsx","EmptyState","PDFViewer","IconComponent","status","hasBadges","jsxs","Badge","Fragment"],"mappings":"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"}
|