@alfadocs/ui-kit-debug 1.130.1 → 1.130.2
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/{actions-cell-renderer-DTaIQKp9.js → actions-cell-renderer-C-l_ppP6.js} +3 -3
- package/dist/_chunks/{actions-cell-renderer-DTaIQKp9.js.map → actions-cell-renderer-C-l_ppP6.js.map} +1 -1
- package/dist/_chunks/{alia-sidebar-BBxbMRmX.js → alia-sidebar-CK1zw_Bc.js} +2 -2
- package/dist/_chunks/{alia-sidebar-BBxbMRmX.js.map → alia-sidebar-CK1zw_Bc.js.map} +1 -1
- package/dist/_chunks/{anamnesis-summary-rows-CtcULkvc.js → anamnesis-summary-rows-CCNmkq55.js} +5 -5
- package/dist/_chunks/{anamnesis-summary-rows-CtcULkvc.js.map → anamnesis-summary-rows-CCNmkq55.js.map} +1 -1
- package/dist/_chunks/{appointment-card-vbUsDh70.js → appointment-card-OAOur8lH.js} +2 -2
- package/dist/_chunks/{appointment-card-vbUsDh70.js.map → appointment-card-OAOur8lH.js.map} +1 -1
- package/dist/_chunks/{appointment-peek-DdUhqfEi.js → appointment-peek-DZa6xyUb.js} +2 -2
- package/dist/_chunks/{appointment-peek-DdUhqfEi.js.map → appointment-peek-DZa6xyUb.js.map} +1 -1
- package/dist/_chunks/{appointment-timeline-B5pfBl-b.js → appointment-timeline-DQePqpyH.js} +3 -3
- package/dist/_chunks/{appointment-timeline-B5pfBl-b.js.map → appointment-timeline-DQePqpyH.js.map} +1 -1
- package/dist/_chunks/{appointment-tray-BhiXetjs.js → appointment-tray-DSFqO5Rm.js} +2 -2
- package/dist/_chunks/{appointment-tray-BhiXetjs.js.map → appointment-tray-DSFqO5Rm.js.map} +1 -1
- package/dist/_chunks/{balance-badge-cell-BtFge7Y6.js → balance-badge-cell-DTiMdnCZ.js} +4 -4
- package/dist/_chunks/{balance-badge-cell-BtFge7Y6.js.map → balance-badge-cell-DTiMdnCZ.js.map} +1 -1
- package/dist/_chunks/body-pointer-lock-CsOEDm1I.js +15 -0
- package/dist/_chunks/body-pointer-lock-CsOEDm1I.js.map +1 -0
- package/dist/_chunks/{button-group-B2MJo0Se.js → button-group-DuQuuulC.js} +2 -2
- package/dist/_chunks/{button-group-B2MJo0Se.js.map → button-group-DuQuuulC.js.map} +1 -1
- package/dist/_chunks/{calculator-dialog-BGX5XQCM.js → calculator-dialog-Cg3GjaRf.js} +2 -2
- package/dist/_chunks/{calculator-dialog-BGX5XQCM.js.map → calculator-dialog-Cg3GjaRf.js.map} +1 -1
- package/dist/_chunks/{calendar-DzR-vdJ5.js → calendar-BIoOeBTT.js} +103 -103
- package/dist/_chunks/{calendar-DzR-vdJ5.js.map → calendar-BIoOeBTT.js.map} +1 -1
- package/dist/_chunks/{calendar-appointment-editor-dialog-CXch4Pmu.js → calendar-appointment-editor-dialog-WW6V1SGh.js} +15 -15
- package/dist/_chunks/{calendar-appointment-editor-dialog-CXch4Pmu.js.map → calendar-appointment-editor-dialog-WW6V1SGh.js.map} +1 -1
- package/dist/_chunks/{care-plan-card-CwgkImOD.js → care-plan-card-DKScH9Ss.js} +2 -2
- package/dist/_chunks/{care-plan-card-CwgkImOD.js.map → care-plan-card-DKScH9Ss.js.map} +1 -1
- package/dist/_chunks/{care-plan-entry-card-cdojypxu.js → care-plan-entry-card-AG1y3nyW.js} +2 -2
- package/dist/_chunks/{care-plan-entry-card-cdojypxu.js.map → care-plan-entry-card-AG1y3nyW.js.map} +1 -1
- package/dist/_chunks/{chart-Aue_2dMb.js → chart-D0EeFWst.js} +2 -2
- package/dist/_chunks/{chart-Aue_2dMb.js.map → chart-D0EeFWst.js.map} +1 -1
- package/dist/_chunks/{dashboard-grid-CaxgaEgI.js → dashboard-grid-2uVXEe9e.js} +2 -2
- package/dist/_chunks/{dashboard-grid-CaxgaEgI.js.map → dashboard-grid-2uVXEe9e.js.map} +1 -1
- package/dist/_chunks/{data-table-BCfkcPti.js → data-table-FTV3uRjX.js} +3 -3
- package/dist/_chunks/{data-table-BCfkcPti.js.map → data-table-FTV3uRjX.js.map} +1 -1
- package/dist/_chunks/{default-tabs-BnB6FUEW.js → default-tabs-BryvhiHv.js} +4 -4
- package/dist/_chunks/{default-tabs-BnB6FUEW.js.map → default-tabs-BryvhiHv.js.map} +1 -1
- package/dist/_chunks/{dialog-CIUn5oLb.js → dialog-CVTxyR0v.js} +48 -47
- package/dist/_chunks/dialog-CVTxyR0v.js.map +1 -0
- package/dist/_chunks/{document-preview-BWDTCEHI.js → document-preview-_kQ9QvZV.js} +2 -2
- package/dist/_chunks/{document-preview-BWDTCEHI.js.map → document-preview-_kQ9QvZV.js.map} +1 -1
- package/dist/_chunks/{dropdown-menu-Dw6sgQwJ.js → dropdown-menu-DBWaW4pq.js} +92 -88
- package/dist/_chunks/dropdown-menu-DBWaW4pq.js.map +1 -0
- package/dist/_chunks/{editable-currency-cell-renderer-BlK-8A7b.js → editable-currency-cell-renderer-CZMQ5xRT.js} +2 -2
- package/dist/_chunks/{editable-currency-cell-renderer-BlK-8A7b.js.map → editable-currency-cell-renderer-CZMQ5xRT.js.map} +1 -1
- package/dist/_chunks/{face-scheme-Bt07zQJU.js → face-scheme-D_Y1StPl.js} +3 -3
- package/dist/_chunks/{face-scheme-Bt07zQJU.js.map → face-scheme-D_Y1StPl.js.map} +1 -1
- package/dist/_chunks/{file-manager-Dpwv0qs-.js → file-manager-Bzr5NK1t.js} +5 -5
- package/dist/_chunks/{file-manager-Dpwv0qs-.js.map → file-manager-Bzr5NK1t.js.map} +1 -1
- package/dist/_chunks/{header-settings-ZGvYAuKF.js → header-settings-Cu-MKOsO.js} +2 -2
- package/dist/_chunks/{header-settings-ZGvYAuKF.js.map → header-settings-Cu-MKOsO.js.map} +1 -1
- package/dist/_chunks/{heatmap-Ds5DJBUL.js → heatmap-C5gJin_F.js} +3 -3
- package/dist/_chunks/{heatmap-Ds5DJBUL.js.map → heatmap-C5gJin_F.js.map} +1 -1
- package/dist/_chunks/{help-me-write-templates-C28E_rOt.js → help-me-write-templates-DO6vJeP4.js} +2 -2
- package/dist/_chunks/{help-me-write-templates-C28E_rOt.js.map → help-me-write-templates-DO6vJeP4.js.map} +1 -1
- package/dist/_chunks/{icon-button-group-BKtkVZ1W.js → icon-button-group-SmkdVCNx.js} +2 -2
- package/dist/_chunks/{icon-button-group-BKtkVZ1W.js.map → icon-button-group-SmkdVCNx.js.map} +1 -1
- package/dist/_chunks/{invoice-upload-list-tJY7W1g_.js → invoice-upload-list-868v1oDe.js} +3 -3
- package/dist/_chunks/{invoice-upload-list-tJY7W1g_.js.map → invoice-upload-list-868v1oDe.js.map} +1 -1
- package/dist/_chunks/{link-cell-renderer-CC9VHU68.js → link-cell-renderer-D3JLPURZ.js} +2 -2
- package/dist/_chunks/{link-cell-renderer-CC9VHU68.js.map → link-cell-renderer-D3JLPURZ.js.map} +1 -1
- package/dist/_chunks/{marketplace-app-shell-D_HA8CKx.js → marketplace-app-shell-dMmxI6MT.js} +4 -4
- package/dist/_chunks/{marketplace-app-shell-D_HA8CKx.js.map → marketplace-app-shell-dMmxI6MT.js.map} +1 -1
- package/dist/_chunks/{muscle-scheme-DdIdm8Gw.js → muscle-scheme-BGJD62op.js} +2 -2
- package/dist/_chunks/{muscle-scheme-DdIdm8Gw.js.map → muscle-scheme-BGJD62op.js.map} +1 -1
- package/dist/_chunks/{notes-panel-DIY7eNsq.js → notes-panel-Cm-_pCRJ.js} +3 -3
- package/dist/_chunks/{notes-panel-DIY7eNsq.js.map → notes-panel-Cm-_pCRJ.js.map} +1 -1
- package/dist/_chunks/{parts-tGzYz0uG.js → parts-BOnDDU3E.js} +2 -2
- package/dist/_chunks/{parts-tGzYz0uG.js.map → parts-BOnDDU3E.js.map} +1 -1
- package/dist/_chunks/{patient-search-OAwFgOW3.js → patient-search-DBvLFArV.js} +2 -2
- package/dist/_chunks/{patient-search-OAwFgOW3.js.map → patient-search-DBvLFArV.js.map} +1 -1
- package/dist/_chunks/{practice-results-BDnZtbDM.js → practice-results-M5A9-X9y.js} +3 -3
- package/dist/_chunks/{practice-results-BDnZtbDM.js.map → practice-results-M5A9-X9y.js.map} +1 -1
- package/dist/_chunks/{public-header.agent-Db4wm6_S.js → public-header.agent-DaeDfLfy.js} +2 -2
- package/dist/_chunks/{public-header.agent-Db4wm6_S.js.map → public-header.agent-DaeDfLfy.js.map} +1 -1
- package/dist/_chunks/{radiograph-panel.agent-B-r3BoqU.js → radiograph-panel.agent-88VjqlG7.js} +2 -2
- package/dist/_chunks/{radiograph-panel.agent-B-r3BoqU.js.map → radiograph-panel.agent-88VjqlG7.js.map} +1 -1
- package/dist/_chunks/{rich-text-editor-TnX0SYdq.js → rich-text-editor-DjHL1b3E.js} +3 -3
- package/dist/_chunks/{rich-text-editor-TnX0SYdq.js.map → rich-text-editor-DjHL1b3E.js.map} +1 -1
- package/dist/_chunks/{row-actions-Dpf9CrCP.js → row-actions-BF2-uizV.js} +3 -3
- package/dist/_chunks/{row-actions-Dpf9CrCP.js.map → row-actions-BF2-uizV.js.map} +1 -1
- package/dist/_chunks/{sheet-uZZXaO_S.js → sheet-BdhYeQQT.js} +84 -72
- package/dist/_chunks/sheet-BdhYeQQT.js.map +1 -0
- package/dist/_chunks/{signature-request-DW2PSp66.js → signature-request-4pGq3YBe.js} +3 -3
- package/dist/_chunks/{signature-request-DW2PSp66.js.map → signature-request-4pGq3YBe.js.map} +1 -1
- package/dist/_chunks/{tab-bar-CF8R38Og.js → tab-bar-CeC2QOwB.js} +2 -2
- package/dist/_chunks/{tab-bar-CF8R38Og.js.map → tab-bar-CeC2QOwB.js.map} +1 -1
- package/dist/_chunks/{tabs-P4qFmxk5.js → tabs-CRIDBLP7.js} +2 -2
- package/dist/_chunks/{tabs-P4qFmxk5.js.map → tabs-CRIDBLP7.js.map} +1 -1
- package/dist/_chunks/{task-editor-CVRrDqpe.js → task-editor-BL2hHxNz.js} +3 -3
- package/dist/_chunks/{task-editor-CVRrDqpe.js.map → task-editor-BL2hHxNz.js.map} +1 -1
- package/dist/_chunks/{tasks-panel-DBSm3WjK.js → tasks-panel-BE3zaayj.js} +2 -2
- package/dist/_chunks/{tasks-panel-DBSm3WjK.js.map → tasks-panel-BE3zaayj.js.map} +1 -1
- package/dist/_chunks/{theme-toggle-CeKl8f_f.js → theme-toggle-BQDFxvVS.js} +3 -3
- package/dist/_chunks/{theme-toggle-CeKl8f_f.js.map → theme-toggle-BQDFxvVS.js.map} +1 -1
- package/dist/_chunks/{token-insert-menu-BrK5NQIq.js → token-insert-menu-BLtfMTJd.js} +2 -2
- package/dist/_chunks/{token-insert-menu-BrK5NQIq.js.map → token-insert-menu-BLtfMTJd.js.map} +1 -1
- package/dist/_chunks/{toolbar-CC-Ls_eC.js → toolbar-BK6S9PhI.js} +2 -2
- package/dist/_chunks/{toolbar-CC-Ls_eC.js.map → toolbar-BK6S9PhI.js.map} +1 -1
- package/dist/_chunks/{tooth-scheme-DHRxV2sE.js → tooth-scheme-BtnFgugP.js} +2 -2
- package/dist/_chunks/{tooth-scheme-DHRxV2sE.js.map → tooth-scheme-BtnFgugP.js.map} +1 -1
- package/dist/_chunks/{use-appointment-details-read-BrykoTOR.js → use-appointment-details-read-_b7FRB1x.js} +4 -4
- package/dist/_chunks/{use-appointment-details-read-BrykoTOR.js.map → use-appointment-details-read-_b7FRB1x.js.map} +1 -1
- package/dist/_chunks/{verify-identity-types-D_LdByCp.js → verify-identity-types-CxtrBXsZ.js} +2 -2
- package/dist/_chunks/{verify-identity-types-D_LdByCp.js.map → verify-identity-types-CxtrBXsZ.js.map} +1 -1
- package/dist/_chunks/{widget-picker-DrxJjEkv.js → widget-picker-D3T7e8a4.js} +2 -2
- package/dist/_chunks/{widget-picker-DrxJjEkv.js.map → widget-picker-D3T7e8a4.js.map} +1 -1
- package/dist/_chunks/{workflow-map-DCjkRuS_.js → workflow-map-DaZFP9SJ.js} +2 -2
- package/dist/_chunks/{workflow-map-DCjkRuS_.js.map → workflow-map-DaZFP9SJ.js.map} +1 -1
- package/dist/_chunks/{workflow-status-D0avpoeS.js → workflow-status-D1WgGVTP.js} +2 -2
- package/dist/_chunks/{workflow-status-D0avpoeS.js.map → workflow-status-D1WgGVTP.js.map} +1 -1
- package/dist/_chunks/{workflow-webhook-action-Cae02r_4.js → workflow-webhook-action-BsGSh3h9.js} +2 -2
- package/dist/_chunks/{workflow-webhook-action-Cae02r_4.js.map → workflow-webhook-action-BsGSh3h9.js.map} +1 -1
- package/dist/agent-catalog.json +1 -1
- package/dist/browser-support.js +1 -1
- package/dist/components/_shared/body-pointer-lock.d.ts +2 -0
- package/dist/components/_shared/body-pointer-lock.d.ts.map +1 -0
- package/dist/components/appointment-card/index.js +2 -2
- package/dist/components/appointment-details-panel/index.js +1 -1
- package/dist/components/appointment-peek/index.js +1 -1
- package/dist/components/appointment-timeline/index.js +1 -1
- package/dist/components/bill-table/index.js +1 -1
- package/dist/components/button-group/index.js +1 -1
- package/dist/components/calculator-dialog/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/care-plan-card/index.js +1 -1
- package/dist/components/care-plan-entry-card/index.js +1 -1
- package/dist/components/chart/index.js +1 -1
- package/dist/components/dashboard-grid/index.js +1 -1
- package/dist/components/data-grid/index.js +1 -1
- package/dist/components/data-table/index.js +4 -4
- package/dist/components/dialog/dialog.d.ts.map +1 -1
- package/dist/components/dialog/index.js +1 -1
- package/dist/components/document-preview/index.js +1 -1
- package/dist/components/dropdown-menu/dropdown-menu.d.ts.map +1 -1
- package/dist/components/dropdown-menu/index.js +1 -1
- package/dist/components/face-scheme/index.js +1 -1
- package/dist/components/file-manager/index.js +1 -1
- package/dist/components/header-settings/index.js +1 -1
- package/dist/components/heatmap/index.js +1 -1
- package/dist/components/icon-button-group/index.js +1 -1
- package/dist/components/invoice-upload-list/index.js +1 -1
- package/dist/components/muscle-scheme/index.js +1 -1
- package/dist/components/notes-panel/index.js +1 -1
- package/dist/components/patient-search/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/public-header/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/row-actions/index.js +1 -1
- package/dist/components/sheet/index.js +1 -1
- package/dist/components/sheet/sheet.d.ts.map +1 -1
- package/dist/components/skeleton-scheme/index.js +1 -1
- package/dist/components/tab-bar/index.js +1 -1
- package/dist/components/tabs/index.js +1 -1
- package/dist/components/task-editor/index.js +1 -1
- package/dist/components/tasks-panel/index.js +1 -1
- package/dist/components/theme-toggle/index.js +1 -1
- package/dist/components/token-insert-menu/index.js +1 -1
- package/dist/components/tooth-scheme/index.js +1 -1
- package/dist/components/widget-picker/index.js +1 -1
- package/dist/components/workflow/index.js +1 -1
- package/dist/components/workflow-status/index.js +1 -1
- package/dist/index.js +54 -54
- package/dist/patterns/alia-assistant/index.js +1 -1
- package/dist/patterns/anamnesis/index.js +1 -1
- package/dist/patterns/calendar/index.js +1 -1
- package/dist/patterns/help-me-write-templates/index.js +1 -1
- package/dist/patterns/marketplace-app-shell/index.js +1 -1
- package/dist/patterns/signature-request/index.js +1 -1
- package/dist/patterns/verify-identity/index.js +1 -1
- package/dist/patterns/workflow-webhook-action/index.js +1 -1
- package/package.json +1 -1
- package/dist/_chunks/dialog-CIUn5oLb.js.map +0 -1
- package/dist/_chunks/dropdown-menu-Dw6sgQwJ.js.map +0 -1
- package/dist/_chunks/sheet-uZZXaO_S.js.map +0 -1
|
@@ -7,13 +7,14 @@ import { u as J } from "./use-controllable-state-BiY4xTzM.js";
|
|
|
7
7
|
import { u as Q } from "./use-isomorphic-layout-effect-BGfaCOP1.js";
|
|
8
8
|
import { u as W } from "./registry-DvAUVLHh.js";
|
|
9
9
|
import { u as Z } from "./non-modal-tab-exit-j3CPOuE3.js";
|
|
10
|
-
import { c as
|
|
11
|
-
import {
|
|
12
|
-
|
|
10
|
+
import { c as B } from "./compose-refs-C0k0tdqF.js";
|
|
11
|
+
import { r as ee } from "./body-pointer-lock-CsOEDm1I.js";
|
|
12
|
+
import { X as te } from "./x-B5YnXwCz.js";
|
|
13
|
+
const oe = 8;
|
|
13
14
|
function h(e) {
|
|
14
15
|
return e instanceof HTMLElement ? e : null;
|
|
15
16
|
}
|
|
16
|
-
function
|
|
17
|
+
function ae(e) {
|
|
17
18
|
var a;
|
|
18
19
|
const t = e.ownerDocument, o = ((a = e.getAttribute("aria-labelledby")) == null ? void 0 : a.split(/\s+/)) ?? [];
|
|
19
20
|
for (const s of o) {
|
|
@@ -28,28 +29,28 @@ function oe(e) {
|
|
|
28
29
|
}
|
|
29
30
|
return null;
|
|
30
31
|
}
|
|
31
|
-
function
|
|
32
|
+
function se(e) {
|
|
32
33
|
const t = [];
|
|
33
34
|
let o = h(e);
|
|
34
35
|
if (!o || o === o.ownerDocument.body) return t;
|
|
35
|
-
for (let a = 0; o && a <=
|
|
36
|
+
for (let a = 0; o && a <= oe; a += 1) {
|
|
36
37
|
t.push(o);
|
|
37
38
|
const s = o.closest('[role="menu"]');
|
|
38
39
|
if (!s) break;
|
|
39
|
-
o =
|
|
40
|
+
o = ae(s);
|
|
40
41
|
}
|
|
41
42
|
return t;
|
|
42
43
|
}
|
|
43
|
-
function
|
|
44
|
+
function ne(e) {
|
|
44
45
|
return e.isConnected && !e.matches(":disabled") && e.closest("[inert]") === null && e.getClientRects().length > 0;
|
|
45
46
|
}
|
|
46
|
-
function
|
|
47
|
+
function ie(e) {
|
|
47
48
|
for (const t of e)
|
|
48
|
-
if (
|
|
49
|
+
if (ne(t) && (t.focus({ preventScroll: !0 }), t.ownerDocument.activeElement === t))
|
|
49
50
|
return !0;
|
|
50
51
|
return !1;
|
|
51
52
|
}
|
|
52
|
-
const
|
|
53
|
+
const re = {
|
|
53
54
|
id: "dialog",
|
|
54
55
|
capabilities: ["open", "close", "dismiss"],
|
|
55
56
|
state: {
|
|
@@ -97,18 +98,18 @@ const ie = {
|
|
|
97
98
|
description: "Sourced from the id prop on Dialog.Root."
|
|
98
99
|
}
|
|
99
100
|
}
|
|
100
|
-
},
|
|
101
|
+
}, de = [
|
|
101
102
|
"ds-dialog__backdrop",
|
|
102
103
|
"ds:backdrop-blur-sm",
|
|
103
104
|
"ds:data-[state=open]:animate-in ds:data-[state=open]:fade-in-0",
|
|
104
105
|
"ds:data-[state=closed]:animate-out ds:data-[state=closed]:fade-out-0",
|
|
105
106
|
"ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none"
|
|
106
|
-
].join(" "),
|
|
107
|
+
].join(" "), le = [
|
|
107
108
|
"ds:focus-visible:outline-none",
|
|
108
109
|
"ds:data-[state=open]:animate-in ds:data-[state=open]:fade-in-0 ds:data-[state=open]:zoom-in-95",
|
|
109
110
|
"ds:data-[state=closed]:animate-out ds:data-[state=closed]:fade-out-0 ds:data-[state=closed]:zoom-out-95",
|
|
110
111
|
"ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none"
|
|
111
|
-
].join(" "),
|
|
112
|
+
].join(" "), ce = k(`ds-dialog ds-dialog__surface ${le}`, {
|
|
112
113
|
variants: {
|
|
113
114
|
size: {
|
|
114
115
|
sm: "ds-dialog__surface--sm",
|
|
@@ -161,10 +162,10 @@ const ie = {
|
|
|
161
162
|
}),
|
|
162
163
|
[c]
|
|
163
164
|
);
|
|
164
|
-
W(
|
|
165
|
+
W(re, b, t);
|
|
165
166
|
const D = m(null), g = m([]);
|
|
166
167
|
Q(() => {
|
|
167
|
-
i && (g.current =
|
|
168
|
+
i && (g.current = se(document.activeElement));
|
|
168
169
|
}, [i]);
|
|
169
170
|
const y = j(
|
|
170
171
|
() => ({ id: t, modal: r, triggerRef: D, returnFocusRef: g }),
|
|
@@ -182,14 +183,14 @@ const ie = {
|
|
|
182
183
|
) });
|
|
183
184
|
};
|
|
184
185
|
C.displayName = "Dialog.Root";
|
|
185
|
-
const
|
|
186
|
+
const H = u(({ children: e, ...t }, o) => {
|
|
186
187
|
const { triggerRef: a } = S(N);
|
|
187
|
-
return /* @__PURE__ */ n(l.Trigger, { ref:
|
|
188
|
+
return /* @__PURE__ */ n(l.Trigger, { ref: B(o, a), ...t, children: e });
|
|
188
189
|
});
|
|
189
|
-
|
|
190
|
-
const
|
|
191
|
-
|
|
192
|
-
const
|
|
190
|
+
H.displayName = "Dialog.Trigger";
|
|
191
|
+
const M = u(({ children: e, ...t }, o) => /* @__PURE__ */ n(l.Close, { ref: o, ...t, children: e }));
|
|
192
|
+
M.displayName = "Dialog.Close";
|
|
193
|
+
const L = u(
|
|
193
194
|
({
|
|
194
195
|
size: e = "md",
|
|
195
196
|
variant: t = "default",
|
|
@@ -214,17 +215,17 @@ const w = u(
|
|
|
214
215
|
l.Overlay,
|
|
215
216
|
{
|
|
216
217
|
"data-component": "dialog-overlay",
|
|
217
|
-
className:
|
|
218
|
+
className: de
|
|
218
219
|
}
|
|
219
220
|
),
|
|
220
221
|
/* @__PURE__ */ O(
|
|
221
222
|
l.Content,
|
|
222
223
|
{
|
|
223
|
-
ref:
|
|
224
|
+
ref: B(b, x),
|
|
224
225
|
...X,
|
|
225
226
|
"data-component": "dialog",
|
|
226
227
|
"data-component-id": g,
|
|
227
|
-
className:
|
|
228
|
+
className: ce({ size: e, scroll: o, flush: a, className: r }),
|
|
228
229
|
...p,
|
|
229
230
|
onKeyDown: (d) => {
|
|
230
231
|
f == null || f(d), U(d);
|
|
@@ -234,11 +235,11 @@ const w = u(
|
|
|
234
235
|
},
|
|
235
236
|
onCloseAutoFocus: (d) => {
|
|
236
237
|
var T, E;
|
|
237
|
-
c == null || c(d);
|
|
238
|
+
ee(), c == null || c(d);
|
|
238
239
|
const q = _.current;
|
|
239
240
|
if (_.current = !1, d.defaultPrevented || (T = A.current) != null && T.isConnected || !y && q) return;
|
|
240
241
|
const R = document.activeElement;
|
|
241
|
-
R !== null && R !== document.body && !((E = x.current) != null && E.contains(R)) ||
|
|
242
|
+
R !== null && R !== document.body && !((E = x.current) != null && E.contains(R)) || ie(I.current) && d.preventDefault();
|
|
242
243
|
},
|
|
243
244
|
children: [
|
|
244
245
|
v,
|
|
@@ -253,7 +254,7 @@ const w = u(
|
|
|
253
254
|
type: "button",
|
|
254
255
|
className: "ds-dialog__close",
|
|
255
256
|
"aria-label": D("common.close", "Close"),
|
|
256
|
-
children: /* @__PURE__ */ n(
|
|
257
|
+
children: /* @__PURE__ */ n(te, { "aria-hidden": "true" })
|
|
257
258
|
}
|
|
258
259
|
)
|
|
259
260
|
]
|
|
@@ -262,8 +263,8 @@ const w = u(
|
|
|
262
263
|
] });
|
|
263
264
|
}
|
|
264
265
|
);
|
|
265
|
-
|
|
266
|
-
const
|
|
266
|
+
L.displayName = "Dialog.Content";
|
|
267
|
+
const P = u(
|
|
267
268
|
({ className: e, ...t }, o) => /* @__PURE__ */ n(
|
|
268
269
|
"div",
|
|
269
270
|
{
|
|
@@ -273,8 +274,8 @@ const F = u(
|
|
|
273
274
|
}
|
|
274
275
|
)
|
|
275
276
|
);
|
|
276
|
-
|
|
277
|
-
const
|
|
277
|
+
P.displayName = "Dialog.Header";
|
|
278
|
+
const w = u(
|
|
278
279
|
({ className: e, ...t }, o) => /* @__PURE__ */ n(
|
|
279
280
|
"div",
|
|
280
281
|
{
|
|
@@ -284,8 +285,8 @@ const L = u(
|
|
|
284
285
|
}
|
|
285
286
|
)
|
|
286
287
|
);
|
|
287
|
-
|
|
288
|
-
const
|
|
288
|
+
w.displayName = "Dialog.Body";
|
|
289
|
+
const F = u(({ className: e, ...t }, o) => /* @__PURE__ */ n(
|
|
289
290
|
l.Title,
|
|
290
291
|
{
|
|
291
292
|
ref: o,
|
|
@@ -293,7 +294,7 @@ const P = u(({ className: e, ...t }, o) => /* @__PURE__ */ n(
|
|
|
293
294
|
...t
|
|
294
295
|
}
|
|
295
296
|
));
|
|
296
|
-
|
|
297
|
+
F.displayName = "Dialog.Title";
|
|
297
298
|
const V = u(({ className: e, ...t }, o) => /* @__PURE__ */ n(
|
|
298
299
|
l.Description,
|
|
299
300
|
{
|
|
@@ -303,7 +304,7 @@ const V = u(({ className: e, ...t }, o) => /* @__PURE__ */ n(
|
|
|
303
304
|
}
|
|
304
305
|
));
|
|
305
306
|
V.displayName = "Dialog.Description";
|
|
306
|
-
const
|
|
307
|
+
const ue = k(
|
|
307
308
|
[
|
|
308
309
|
"ds:@container/dialog-footer",
|
|
309
310
|
"ds:flex ds:flex-wrap ds:items-center ds:justify-end ds:gap-[var(--spacing-sm)]",
|
|
@@ -324,25 +325,25 @@ const ce = k(
|
|
|
324
325
|
"div",
|
|
325
326
|
{
|
|
326
327
|
ref: a,
|
|
327
|
-
className:
|
|
328
|
+
className: ue({ divider: t, className: e }),
|
|
328
329
|
...o
|
|
329
330
|
}
|
|
330
331
|
)
|
|
331
332
|
);
|
|
332
333
|
z.displayName = "Dialog.Footer";
|
|
333
|
-
const
|
|
334
|
+
const Ne = Object.assign(C, {
|
|
334
335
|
Root: C,
|
|
335
|
-
Trigger:
|
|
336
|
-
Content:
|
|
337
|
-
Header:
|
|
338
|
-
Title:
|
|
336
|
+
Trigger: H,
|
|
337
|
+
Content: L,
|
|
338
|
+
Header: P,
|
|
339
|
+
Title: F,
|
|
339
340
|
Description: V,
|
|
340
|
-
Body:
|
|
341
|
+
Body: w,
|
|
341
342
|
Footer: z,
|
|
342
|
-
Close:
|
|
343
|
+
Close: M
|
|
343
344
|
});
|
|
344
345
|
export {
|
|
345
|
-
|
|
346
|
-
|
|
346
|
+
Ne as D,
|
|
347
|
+
re as d
|
|
347
348
|
};
|
|
348
|
-
//# sourceMappingURL=dialog-
|
|
349
|
+
//# sourceMappingURL=dialog-CVTxyR0v.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialog-CVTxyR0v.js","sources":["../../src/components/dialog/focus-return.ts","../../src/components/dialog/dialog.agent.ts","../../src/components/dialog/dialog.tsx"],"sourcesContent":["/*\n * Focus return for a Dialog opened without a Dialog.Trigger.\n *\n * Radix returns focus to its Trigger on close, and to nothing when there is\n * no Trigger, so a controlled dialog opened from a button, a row action or a\n * menu item left focus on <body>. Dialog.Root records where focus was when it\n * opened (`focusReturnCandidates`), and Dialog.Content hands it back on close\n * (`restoreFocus`).\n *\n * A menu item is gone by the time the dialog closes, so the list also holds\n * the control that opened each enclosing menu (a submenu's item, then the\n * menu's trigger): the first one still in the page and focusable wins.\n */\n\n/** How many menu levels to climb; a guard against a labelling loop. */\nconst MAX_MENU_DEPTH = 8;\n\nfunction asHTMLElement(node: Element | null | undefined): HTMLElement | null {\n return node instanceof HTMLElement ? node : null;\n}\n\n/** The control that opened a menu: Radix labels the menu with its trigger's\n * id, and the open trigger names the menu in `aria-controls`. */\nfunction menuOpener(menu: HTMLElement): HTMLElement | null {\n const doc = menu.ownerDocument;\n const labelIds = menu.getAttribute('aria-labelledby')?.split(/\\s+/) ?? [];\n for (const id of labelIds) {\n const label = id ? asHTMLElement(doc.getElementById(id)) : null;\n if (label && !menu.contains(label)) return label;\n }\n if (menu.id) {\n const controller = asHTMLElement(\n doc.querySelector(`[aria-controls~=\"${CSS.escape(menu.id)}\"]`),\n );\n if (controller && !menu.contains(controller)) return controller;\n }\n return null;\n}\n\n/**\n * The elements focus should go back to, best first: the element focused when\n * the dialog opened, then the opener of each menu it sits in. Empty when\n * nothing was focused (focus on <body>).\n */\nexport function focusReturnCandidates(active: Element | null): HTMLElement[] {\n const candidates: HTMLElement[] = [];\n let current = asHTMLElement(active);\n if (!current || current === current.ownerDocument.body) return candidates;\n for (let depth = 0; current && depth <= MAX_MENU_DEPTH; depth += 1) {\n candidates.push(current);\n const menu = current.closest<HTMLElement>('[role=\"menu\"]');\n if (!menu) break;\n current = menuOpener(menu);\n }\n return candidates;\n}\n\nfunction canTakeFocus(element: HTMLElement): boolean {\n return (\n element.isConnected &&\n !element.matches(':disabled') &&\n element.closest('[inert]') === null &&\n element.getClientRects().length > 0\n );\n}\n\n/**\n * Focus the first candidate that is still in the page and can take focus.\n * Returns false when none could, so the caller leaves Radix's default alone.\n */\nexport function restoreFocus(candidates: readonly HTMLElement[]): boolean {\n for (const element of candidates) {\n if (!canTakeFocus(element)) continue;\n // As Radix's own focus return: no scroll jump to a far-off row.\n element.focus({ preventScroll: true });\n if (element.ownerDocument.activeElement === element) return true;\n }\n return false;\n}\n","import type { AgentAdapter } from '../../agent/types';\nimport type { DialogHandle } from './dialog';\n\n/**\n * Dialog wraps Radix Dialog. The curated handle (`DialogHandle`) bridges the\n * Radix controlled-or-uncontrolled `open` state so an agent can observe and\n * drive the dialog without owning the React state itself.\n */\nexport const dialogAgent: AgentAdapter<DialogHandle> = {\n id: 'dialog',\n capabilities: ['open', 'close', 'dismiss'],\n state: {\n isOpen: {\n type: 'boolean',\n descriptionKey: 'ui.agent.dialog.state.isOpen',\n description: 'True when the dialog is currently open.',\n read: (handle) => handle.getIsOpen(),\n },\n },\n actions: {\n open: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.dialog.actions.open',\n description: 'Open the dialog.',\n invoke: (handle) => {\n handle.open();\n },\n },\n close: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.dialog.actions.close',\n description: 'Close the dialog. Reversible by reopening.',\n invoke: (handle) => {\n handle.close();\n },\n },\n dismiss: {\n safety: 'destructive',\n idempotent: true,\n descriptionKey: 'ui.agent.dialog.actions.dismiss',\n description:\n 'Dismiss the dialog. Loses any in-progress input that has not been committed.',\n invoke: (handle) => {\n handle.close();\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'dialog' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop on Dialog.Root.',\n },\n },\n};\n","import {\n createContext,\n forwardRef,\n useContext,\n useEffect,\n useMemo,\n useRef,\n type ComponentPropsWithoutRef,\n type HTMLAttributes,\n type MutableRefObject,\n type ReactNode,\n} from 'react';\nimport * as RadixDialog from '@radix-ui/react-dialog';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { X } from 'lucide-react';\nimport { useControllableState } from '../../hooks/use-controllable-state';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { useAgentRegistration } from '../../agent';\nimport { useNonModalTabExit } from '../_shared/non-modal-tab-exit';\nimport { composeRefs } from '../_shared/compose-refs';\nimport { focusReturnCandidates, restoreFocus } from './focus-return';\nimport { dialogAgent } from './dialog.agent';\nimport { releaseStaleBodyPointerLock } from '../_shared/body-pointer-lock';\n\n// The `ds-dialog__*` class names below are the framework-agnostic contract\n// defined in src/styles.css (@layer ui-kit-components). The React component\n// renders the SAME classes a vanilla (non-React) host hand-authors — the\n// surface (`ds-dialog__surface` + its size modifiers), the close button\n// (`ds-dialog__close`), and the body slot (`ds-dialog__body`) — so there is\n// ONE visual skin (scrim, radius, elevation, bg, padding, centering, sizing,\n// close-button glyph + hover/focus) and the two surfaces can't drift. The few\n// Tailwind utilities that remain are NOT skin: they are the Radix animation\n// hooks (`data-[state=…]:animate-*`) and the surface focus-suppression chrome\n// — neither lives in the vanilla CSS contract. Layer order\n// (`…, utilities, ui-kit-tokens, ui-kit-components`) puts the `ds-dialog__*`\n// rules after Tailwind's utilities, so the contract owns every visual\n// property and the animation utilities only touch `animation` / `outline`.\nconst OVERLAY_CLASSES = [\n 'ds-dialog__backdrop',\n 'ds:backdrop-blur-sm',\n 'ds:data-[state=open]:animate-in ds:data-[state=open]:fade-in-0',\n 'ds:data-[state=closed]:animate-out ds:data-[state=closed]:fade-out-0',\n 'ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n].join(' ');\n\n// Animation + focus chrome only — every visual property (position, centering,\n// bg, radius, elevation, padding, sizing) comes from `.ds-dialog__surface`.\nconst SURFACE_CHROME = [\n 'ds:focus-visible:outline-none',\n 'ds:data-[state=open]:animate-in ds:data-[state=open]:fade-in-0 ds:data-[state=open]:zoom-in-95',\n 'ds:data-[state=closed]:animate-out ds:data-[state=closed]:fade-out-0 ds:data-[state=closed]:zoom-out-95',\n 'ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n].join(' ');\n\n// CVA drives only the contract class names per size. `ds-dialog` is the host\n// marker (cascade-reset boundary); `ds-dialog__surface` carries the panel skin;\n// the `--sm` / `--lg` / `--fullscreen` modifiers shift only `max-inline-size`\n// (or the fullscreen geometry) and are defined alongside the base rule in\n// src/styles.css — so size, like the skin, lives in one place.\nconst contentVariants = cva(`ds-dialog ds-dialog__surface ${SURFACE_CHROME}`, {\n variants: {\n size: {\n sm: 'ds-dialog__surface--sm',\n md: '',\n lg: 'ds-dialog__surface--lg',\n xl: 'ds-dialog__surface--xl',\n fullscreen: 'ds-dialog__surface--fullscreen',\n },\n // `body` pins the header and footer and scrolls only `Dialog.Body` once\n // the content passes the height cap. `surface` (default) scrolls the\n // whole panel as one block.\n scroll: {\n surface: '',\n body: 'ds-dialog__surface--scroll-body',\n },\n // `flush` drops the surface padding for content that brings its own\n // header, scroll box and footer (a docked panel thrown in a dialog).\n flush: {\n true: 'ds-dialog__surface--flush',\n false: '',\n },\n },\n defaultVariants: { size: 'md', scroll: 'surface', flush: false },\n});\n\n// Curated agent-readiness handle — see dialog.agent.ts.\nexport interface DialogHandle {\n getIsOpen: () => boolean;\n open: () => void;\n close: () => void;\n}\n\nexport interface DialogRootProps extends ComponentPropsWithoutRef<\n typeof RadixDialog.Root\n> {\n /** Opaque instance id — forwarded to Dialog.Content as `data-component-id`. */\n id?: string;\n}\n\ninterface DialogContextValue {\n id?: string;\n modal: boolean;\n /** Set while a Dialog.Trigger is mounted: Radix returns focus to it. */\n triggerRef: MutableRefObject<HTMLButtonElement | null>;\n /** Where focus was when the dialog opened, best first (focus-return.ts). */\n returnFocusRef: MutableRefObject<HTMLElement[]>;\n}\n\nconst DialogContext = createContext<DialogContextValue>({\n modal: true,\n triggerRef: { current: null },\n returnFocusRef: { current: [] },\n});\n\nconst DialogRoot = ({\n children,\n id,\n open: openProp,\n defaultOpen,\n onOpenChange,\n modal = true,\n ...props\n}: DialogRootProps) => {\n const [openRaw, setOpen] = useControllableState<boolean>({\n value: openProp,\n defaultValue: defaultOpen ?? false,\n onChange: onOpenChange,\n });\n const open = openRaw ?? false;\n\n const openRef = useRef(open);\n useEffect(() => {\n openRef.current = open;\n }, [open]);\n\n const handle = useMemo<DialogHandle>(\n () => ({\n getIsOpen: () => openRef.current,\n open: () => setOpen(true),\n close: () => setOpen(false),\n }),\n [setOpen],\n );\n useAgentRegistration(dialogAgent, handle, id);\n\n // Record where focus is as the dialog opens. A layout effect runs before\n // Radix's FocusScope moves focus into the content (a passive effect), so\n // this still sees the button, row action or menu item that opened it.\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const returnFocusRef = useRef<HTMLElement[]>([]);\n useIsomorphicLayoutEffect(() => {\n if (open) {\n returnFocusRef.current = focusReturnCandidates(document.activeElement);\n }\n }, [open]);\n\n const context = useMemo(\n () => ({ id, modal, triggerRef, returnFocusRef }),\n [id, modal],\n );\n\n return (\n <DialogContext.Provider value={context}>\n <RadixDialog.Root\n open={open}\n onOpenChange={setOpen}\n modal={modal}\n {...props}\n >\n {children}\n </RadixDialog.Root>\n </DialogContext.Provider>\n );\n};\nDialogRoot.displayName = 'Dialog.Root';\n\nconst DialogTrigger = forwardRef<\n HTMLButtonElement,\n ComponentPropsWithoutRef<typeof RadixDialog.Trigger>\n>(({ children, ...props }, ref) => {\n const { triggerRef } = useContext(DialogContext);\n return (\n <RadixDialog.Trigger ref={composeRefs(ref, triggerRef)} {...props}>\n {children}\n </RadixDialog.Trigger>\n );\n});\nDialogTrigger.displayName = 'Dialog.Trigger';\n\nconst DialogClose = forwardRef<\n HTMLButtonElement,\n ComponentPropsWithoutRef<typeof RadixDialog.Close>\n>(({ children, ...props }, ref) => (\n <RadixDialog.Close ref={ref} {...props}>\n {children}\n </RadixDialog.Close>\n));\nDialogClose.displayName = 'Dialog.Close';\n\nexport interface DialogContentProps\n extends\n Omit<ComponentPropsWithoutRef<typeof RadixDialog.Content>, 'role'>,\n VariantProps<typeof contentVariants> {\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'fullscreen';\n variant?: 'default' | 'alert' | 'confirmation';\n /**\n * Hide the top-right dismiss \"X\". The default is **variant-aware**: the X is\n * shown for `variant=\"default\"` and hidden for `variant=\"alert\"` /\n * `\"confirmation\"` (forced-choice surfaces, where the decision is made via\n * the explicit footer actions). An explicit value always wins — pass `false`\n * to force the X onto an alert, or `true` to suppress it on a default dialog.\n */\n hideCloseButton?: boolean;\n /**\n * What scrolls once the content passes the height cap (85dvh). `surface`\n * (default) scrolls the whole panel, title and footer included. `body`\n * keeps `Dialog.Header` and `Dialog.Footer` in view and scrolls only\n * `Dialog.Body`, so the content must sit in a `Dialog.Body`. Below 480px\n * of viewport height it falls back to scrolling the whole panel.\n */\n scroll?: 'surface' | 'body';\n /**\n * No surface padding, and the surface becomes a column that does not\n * scroll itself: for one child that brings its own header, scroll box\n * and footer, such as a side panel shown in a dialog. That child must\n * fill the column (`flex: 1; min-block-size: 0`) and scroll inside.\n */\n flush?: boolean;\n className?: string;\n children: ReactNode;\n}\n\nconst DialogContent = forwardRef<HTMLDivElement, DialogContentProps>(\n (\n {\n size = 'md',\n variant = 'default',\n scroll = 'surface',\n flush = false,\n hideCloseButton,\n className,\n children,\n onKeyDown,\n onCloseAutoFocus,\n onInteractOutside,\n ...props\n },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n const {\n id: instanceId,\n modal,\n triggerRef,\n returnFocusRef,\n } = useContext(DialogContext);\n const contentRef = useRef<HTMLDivElement | null>(null);\n const interactedOutsideRef = useRef(false);\n const exitOnTab = useNonModalTabExit(!modal);\n // Only forward `role` when we actually need to override Radix's default\n // (`role=\"dialog\"`). Passing `role={undefined}` explicitly wins over\n // Radix's internal assignment and strips the attribute entirely.\n const roleOverride =\n variant === 'alert' ? { role: 'alertdialog' as const } : {};\n\n // Variant-aware close default: plain dialogs expose the dismiss X; alert\n // and confirmation dialogs are forced-choice (no X) so the decision is\n // made via the explicit footer actions. An explicit `hideCloseButton`\n // always wins.\n const closeHidden = hideCloseButton ?? variant !== 'default';\n\n return (\n <RadixDialog.Portal>\n <RadixDialog.Overlay\n data-component=\"dialog-overlay\"\n className={OVERLAY_CLASSES}\n />\n <RadixDialog.Content\n ref={composeRefs(ref, contentRef)}\n {...roleOverride}\n data-component=\"dialog\"\n data-component-id={instanceId}\n className={contentVariants({ size, scroll, flush, className })}\n {...props}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n exitOnTab(event);\n }}\n onInteractOutside={(event) => {\n onInteractOutside?.(event);\n if (!event.defaultPrevented) interactedOutsideRef.current = true;\n }}\n onCloseAutoFocus={(event) => {\n releaseStaleBodyPointerLock();\n onCloseAutoFocus?.(event);\n const interactedOutside = interactedOutsideRef.current;\n interactedOutsideRef.current = false;\n // The host chose a target, or a Dialog.Trigger is mounted and\n // Radix returns focus to it, as before.\n if (event.defaultPrevented || triggerRef.current?.isConnected) {\n return;\n }\n // A non-modal dialog left by clicking elsewhere keeps focus\n // where the user put it (Radix does the same for its Trigger).\n if (!modal && interactedOutside) return;\n const active = document.activeElement;\n const focusMovedOn =\n active !== null &&\n active !== document.body &&\n !contentRef.current?.contains(active);\n if (focusMovedOn) return;\n if (restoreFocus(returnFocusRef.current)) event.preventDefault();\n }}\n >\n {children}\n\n {!closeHidden && (\n // The close is a plain button carrying the `ds-dialog__close`\n // contract class — the SAME class a vanilla host renders. The CSS\n // (src/styles.css) owns its position, sizing, glyph size, hover\n // wash, and focus ring from tokens, so the React and non-React\n // close buttons are identical and can't drift.\n <RadixDialog.Close\n type=\"button\"\n className=\"ds-dialog__close\"\n aria-label={t('common.close', 'Close')}\n >\n <X aria-hidden=\"true\" />\n </RadixDialog.Close>\n )}\n </RadixDialog.Content>\n </RadixDialog.Portal>\n );\n },\n);\nDialogContent.displayName = 'Dialog.Content';\n\nconst DialogHeader = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={['ds-dialog__header', className].filter(Boolean).join(' ')}\n {...props}\n />\n ),\n);\nDialogHeader.displayName = 'Dialog.Header';\n\n// Optional body slot. Carries the `ds-dialog__body` contract class — the SAME\n// class a vanilla host renders — so content / iframe slots match between the\n// React and non-React surfaces and can't drift. Additive: content placed\n// directly in Dialog.Content (without this wrapper) still works as before.\nconst DialogBody = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={['ds-dialog__body', className].filter(Boolean).join(' ')}\n {...props}\n />\n ),\n);\nDialogBody.displayName = 'Dialog.Body';\n\nconst DialogTitle = forwardRef<\n HTMLHeadingElement,\n ComponentPropsWithoutRef<typeof RadixDialog.Title>\n>(({ className, ...props }, ref) => (\n <RadixDialog.Title\n ref={ref}\n className={['ds-dialog__title type-title-card ds:break-words', className]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n));\nDialogTitle.displayName = 'Dialog.Title';\n\nconst DialogDescription = forwardRef<\n HTMLParagraphElement,\n ComponentPropsWithoutRef<typeof RadixDialog.Description>\n>(({ className, ...props }, ref) => (\n <RadixDialog.Description\n ref={ref}\n className={['type-body-sm ds:text-[var(--muted-foreground)]', className]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n));\nDialogDescription.displayName = 'Dialog.Description';\n\ninterface DialogFooterProps extends HTMLAttributes<HTMLDivElement> {\n divider?: boolean;\n}\n\n// Below 384px of footer width (a phone, whatever the dialog size) every\n// action goes full-width on its own line, in DOM order, so each label fits on\n// one line. The footer is its own container; px so a host root cannot move it.\nconst footerVariants = cva(\n [\n 'ds:@container/dialog-footer',\n 'ds:flex ds:flex-wrap ds:items-center ds:justify-end ds:gap-[var(--spacing-sm)]',\n 'ds:@max-[384px]/dialog-footer:[&>*]:w-full',\n 'ds:mt-[var(--spacing-md)]',\n ].join(' '),\n {\n variants: {\n divider: {\n true: 'ds:border-t ds:border-[color:var(--border)] ds:pt-[var(--spacing-md)]',\n false: '',\n },\n },\n defaultVariants: { divider: false },\n },\n);\n\nconst DialogFooter = forwardRef<HTMLDivElement, DialogFooterProps>(\n ({ className, divider = false, ...props }, ref) => (\n <div\n ref={ref}\n className={footerVariants({ divider, className })}\n {...props}\n />\n ),\n);\nDialogFooter.displayName = 'Dialog.Footer';\n\nexport const Dialog = Object.assign(DialogRoot, {\n Root: DialogRoot,\n Trigger: DialogTrigger,\n Content: DialogContent,\n Header: DialogHeader,\n Title: DialogTitle,\n Description: DialogDescription,\n Body: DialogBody,\n Footer: DialogFooter,\n Close: DialogClose,\n});\n\nexport type { DialogFooterProps };\n"],"names":["MAX_MENU_DEPTH","asHTMLElement","node","menuOpener","menu","doc","labelIds","_a","id","label","controller","focusReturnCandidates","active","candidates","current","depth","canTakeFocus","element","restoreFocus","dialogAgent","handle","OVERLAY_CLASSES","SURFACE_CHROME","contentVariants","cva","DialogContext","createContext","DialogRoot","children","openProp","defaultOpen","onOpenChange","modal","props","openRaw","setOpen","useControllableState","open","openRef","useRef","useEffect","useMemo","useAgentRegistration","triggerRef","returnFocusRef","useIsomorphicLayoutEffect","context","jsx","RadixDialog","DialogTrigger","forwardRef","ref","useContext","composeRefs","DialogClose","DialogContent","size","variant","scroll","flush","hideCloseButton","className","onKeyDown","onCloseAutoFocus","onInteractOutside","t","useTranslation","instanceId","contentRef","interactedOutsideRef","exitOnTab","useNonModalTabExit","roleOverride","closeHidden","jsxs","event","releaseStaleBodyPointerLock","interactedOutside","_b","X","DialogHeader","DialogBody","DialogTitle","DialogDescription","footerVariants","DialogFooter","divider","Dialog"],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ import { C as B } from "./card-n6W6LW-N.js";
|
|
|
7
7
|
import { E as G } from "./empty-state-DwJ5YNzz.js";
|
|
8
8
|
import { P as Y } from "./panel-header-CbtlTe85.js";
|
|
9
9
|
import { P as J } from "./pdf-viewer-BnBKdx0y.js";
|
|
10
|
-
import { T as O, b as Q, c as X, a as Z } from "./tabs-
|
|
10
|
+
import { T as O, b as Q, c as X, a as Z } from "./tabs-CRIDBLP7.js";
|
|
11
11
|
import { u as ee } from "./registry-DvAUVLHh.js";
|
|
12
12
|
import { F as ie } from "./file-image-cDgE-BTy.js";
|
|
13
13
|
import { F as te } from "./file-text-5yv6r2ls.js";
|
|
@@ -288,4 +288,4 @@ export {
|
|
|
288
288
|
ue as D,
|
|
289
289
|
de as d
|
|
290
290
|
};
|
|
291
|
-
//# sourceMappingURL=document-preview-
|
|
291
|
+
//# sourceMappingURL=document-preview-_kQ9QvZV.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-preview-BWDTCEHI.js","sources":["../../node_modules/lucide-react/dist/esm/icons/files.mjs","../../src/components/document-preview/document-preview.agent.ts","../../src/components/document-preview/document-preview.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M15 2h-4a2 2 0 0 0-2 2v11a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V8\", key: \"14sh0y\" }],\n [\n \"path\",\n {\n d: \"M16.706 2.706A2.4 2.4 0 0 0 15 2v5a1 1 0 0 0 1 1h5a2.4 2.4 0 0 0-.706-1.706z\",\n key: \"1970lx\"\n }\n ],\n [\"path\", { d: \"M5 7a2 2 0 0 0-2 2v11a2 2 0 0 0 2 2h8a2 2 0 0 0 1.732-1\", key: \"l4dndm\" }]\n];\nconst Files = createLucideIcon(\"files\", __iconNode);\n\nexport { __iconNode, Files as default };\n//# sourceMappingURL=files.mjs.map\n","/* -------------------------------------------------------------------- */\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. The body is an */\n/* elevated Card: a bounded preview viewport (PDF → kit PDFViewer; */\n/* image/* → <img>; otherwise a MIME-icon placeholder) above an always-on */\n/* Details block (badges + every structural field the host supplies), so */\n/* the metadata is never dropped when a real preview renders. No name → */\n/* EmptyState. */\n/* */\n/* Title lives in the canonical PanelHeader (the same header every rail */\n/* panel adopts) so the Control Room rail can inject its pin / close */\n/* controls into it. Pass `documents` (≥ 2) to preview a SELECTION as */\n/* tabs — one tab per document, the active one shown below; a single */\n/* entry (or the single-document props) renders without a tab strip. */\n/* */\n/* The root is a `<section>` (region landmark) so the PanelHeader's */\n/* <header> is scoped and never exposed as a page banner — the same */\n/* shape RadiographPanel uses. It is also a keyboard-focusable scroll */\n/* region (tabIndex 0 + labelled focus ring). */\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. In tabbed mode the handle reflects the ACTIVE tab. */\n/* -------------------------------------------------------------------- */\n\nimport {\n forwardRef,\n Fragment,\n useImperativeHandle,\n useMemo,\n useState,\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 Files,\n type LucideIcon,\n} from 'lucide-react';\nimport { Badge } from '../badge';\nimport { Card } from '../card';\nimport { EmptyState } from '../empty-state';\nimport { PanelHeader } from '../panel-header';\nimport { PDFViewer } from '../pdf-viewer';\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from '../tabs';\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 /** Display name of whoever created the document (host-supplied). */\n createdBy?: string;\n /** ISO 8601 timestamp the document was created. */\n createdAt?: string;\n /** ISO 8601 timestamp of the last modification. */\n updatedAt?: string;\n /** ISO 8601 timestamp a signature was requested from the patient. */\n signatureRequestedAt?: string;\n /** ISO 8601 timestamp the document was signed. */\n signedAt?: string;\n /** ISO 8601 timestamp the document was shared with the patient. */\n sharedAt?: 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\n/**\n * A single previewable document. In multi-document mode each becomes a tab;\n * `id` is the tab value (never a patient name) and `name` is the tab label.\n */\nexport interface DocumentPreviewDocument {\n /** Stable, non-identifying id. Emitted as the tab value — never PHI. */\n id: string;\n /** Display name (PHI). Also the tab label in multi-document mode. */\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. */\n src?: string;\n /** Structural metadata rendered by the metadata-card branch. */\n metadata?: DocumentPreviewMetadata;\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 (and no `documents`) → empty state. PHI. */\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 /**\n * Multiple documents to preview as tabs — e.g. a multi-row selection. Two\n * or more render a tab per document (label = name) with the active one\n * shown below; a single entry renders without a tab strip. When non-empty\n * this takes precedence over the single-document props. Names are PHI.\n */\n documents?: DocumentPreviewDocument[];\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 active document's 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 header / 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, documents, className }, ref) => {\n const { t, i18n } = useTranslation('ui');\n\n // Resolve the document list: an explicit `documents` list wins; otherwise\n // the single-document props form a one-item list; nothing → empty. The\n // synthetic single-doc id is never emitted as a tab value (a lone doc\n // renders without a tab strip), so falling back to the name is PHI-safe.\n const docs = useMemo<DocumentPreviewDocument[]>(() => {\n if (documents && documents.length > 0) return documents;\n if (name) return [{ id: id ?? name, name, mimeType, src, metadata }];\n return [];\n }, [documents, id, name, mimeType, src, metadata]);\n\n const isTabbed = docs.length > 1;\n\n // Active tab (multi mode). When the current id is stale after the selection\n // changes we fall back to the first document — no reconciling effect needed.\n const [activeId, setActiveId] = useState<string | undefined>(undefined);\n const activeDoc = docs.find((doc) => doc.id === activeId) ?? docs[0];\n\n const handle = useMemo<DocumentPreviewHandle>(\n () => ({\n getKind: () =>\n activeDoc\n ? resolveKind(activeDoc.name, activeDoc.mimeType, activeDoc.src)\n : 'empty',\n getName: () => activeDoc?.name,\n }),\n [activeDoc],\n );\n useImperativeHandle(ref, () => handle, [handle]);\n useAgentRegistration(documentPreviewAgent, handle, id);\n\n /* The per-document body — an elevated Card with a bounded preview viewport\n (pdf / image / placeholder) above an always-on Details block. The title is\n NOT rendered here (the PanelHeader owns it, or the tab label in multi mode). */\n const renderBody = (doc: DocumentPreviewDocument): ReactNode => {\n const kind = resolveKind(doc.name, doc.mimeType, doc.src);\n const meta = doc.metadata;\n const PlaceholderIcon = iconForMime(doc.mimeType);\n\n // Preview viewport — the rendered document, or a MIME-icon placeholder when\n // no source resolves. Bounded to a consistent aspect so the Details below\n // stay reachable in the rail.\n let viewport: ReactNode;\n if (kind === 'pdf' && doc.src) {\n viewport = (\n <PDFViewer\n src={doc.src}\n toolbarVariant=\"minimal\"\n // Name the embedded viewer after the document so it stays distinct\n // from the surrounding \"Document preview\" region (nested landmarks\n // must not share an accessible name). Mirrors visible header text.\n ariaLabel={doc.name}\n className=\"ds:h-full ds:w-full\"\n />\n );\n } else if (kind === 'image' && doc.src) {\n viewport = (\n <img\n src={doc.src}\n alt={t('documentPreview.imageAlt', 'Preview of {{name}}', {\n name: doc.name,\n })}\n className=\"ds:max-h-full ds:max-w-full ds:object-contain\"\n />\n );\n } else {\n viewport = (\n <span className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-sm)] ds:text-muted-foreground\">\n <PlaceholderIcon aria-hidden=\"true\" className=\"ds:size-10\" />\n <span className=\"type-body-sm\">\n {t('documentPreview.noPreview', 'No preview available.')}\n </span>\n </span>\n );\n }\n\n // Badges: type / clinical / signature status.\n const status = meta?.signatureStatus;\n const hasBadges =\n Boolean(meta?.documentType) ||\n Boolean(meta?.clinical) ||\n (status !== undefined && status !== 'none');\n\n // Detail rows — every structural field the host supplies, so nothing is\n // dropped when a real preview renders. Only present fields render a row.\n const fmtDate = (iso: string): string =>\n new Intl.DateTimeFormat(i18n.language, { dateStyle: 'medium' }).format(\n new Date(iso),\n );\n const rows: Array<{ key: string; label: string; value: string }> = [];\n if (meta?.createdBy)\n rows.push({\n key: 'createdBy',\n label: t('documentPreview.fields.createdBy', 'Created by'),\n value: meta.createdBy,\n });\n if (meta?.createdAt)\n rows.push({\n key: 'created',\n label: t('documentPreview.fields.created', 'Created'),\n value: fmtDate(meta.createdAt),\n });\n if (meta?.updatedAt)\n rows.push({\n key: 'modified',\n label: t('documentPreview.fields.modified', 'Modified'),\n value: fmtDate(meta.updatedAt),\n });\n if (meta?.signatureRequestedAt)\n rows.push({\n key: 'signatureRequested',\n label: t(\n 'documentPreview.fields.signatureRequested',\n 'Signature requested',\n ),\n value: fmtDate(meta.signatureRequestedAt),\n });\n if (meta?.signedAt)\n rows.push({\n key: 'signed',\n label: t('documentPreview.fields.signed', 'Signed'),\n value: fmtDate(meta.signedAt),\n });\n if (meta?.sharedAt)\n rows.push({\n key: 'sharedWithPatient',\n label: t(\n 'documentPreview.fields.sharedWithPatient',\n 'Shared with patient',\n ),\n value: fmtDate(meta.sharedAt),\n });\n if (meta?.size !== undefined)\n rows.push({\n key: 'size',\n label: t('documentPreview.fields.size', 'Size'),\n value: formatBytes(meta.size, i18n.language, t),\n });\n if (meta?.expiresAt)\n rows.push({\n key: 'expires',\n label: t('documentPreview.fields.expires', 'Expires'),\n value: fmtDate(meta.expiresAt),\n });\n\n const hasDetails = hasBadges || rows.length > 0;\n\n return (\n <div className=\"ds:p-[var(--spacing-md)]\">\n <Card\n variant=\"elevated\"\n className=\"ds:flex ds:flex-col ds:overflow-hidden\"\n >\n <div className=\"ds:flex ds:aspect-[4/3] ds:min-h-0 ds:items-center ds:justify-center ds:overflow-hidden ds:border-b ds:border-[color:var(--card-border)] ds:bg-muted\">\n {viewport}\n </div>\n {hasDetails && (\n <Card.Body className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <h3 className=\"type-eyebrow ds:m-0 ds:text-muted-foreground\">\n {t('documentPreview.detailsTitle', 'Details')}\n </h3>\n {hasBadges && (\n <span className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n {meta?.documentType && (\n <Badge variant=\"neutral\" size=\"sm\">\n {meta.documentType}\n </Badge>\n )}\n {meta?.clinical && (\n <Badge variant=\"info\" size=\"sm\">\n {t('documentPreview.clinical', 'Clinical')}\n </Badge>\n )}\n {status && status !== 'none' && (\n <Badge\n variant={SIGNATURE_VARIANT[status]}\n size=\"sm\"\n withDot\n >\n {t(`documentPreview.signature.${status}`, status)}\n </Badge>\n )}\n </span>\n )}\n {rows.length > 0 && (\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 {rows.map((row) => (\n <Fragment key={row.key}>\n <dt className=\"ds:text-muted-foreground\">{row.label}</dt>\n <dd className=\"ds:m-0\">{row.value}</dd>\n </Fragment>\n ))}\n </dl>\n )}\n </Card.Body>\n )}\n </Card>\n </div>\n );\n };\n\n // Header: a MIME icon + the document name for a single doc; a Files glyph +\n // a count badge (RadiographPanel's title-plus-badge shape) when tabbed.\n const HeaderMimeIcon = iconForMime(activeDoc?.mimeType);\n const headerIcon = isTabbed ? (\n <Files aria-hidden=\"true\" />\n ) : (\n <HeaderMimeIcon aria-hidden=\"true\" />\n );\n const headerTitle: ReactNode = isTabbed ? (\n <>\n {t('documentPreview.multiTitle', 'Documents')}\n <Badge variant=\"neutral\" size=\"sm\">\n {docs.length}\n </Badge>\n </>\n ) : (\n activeDoc?.name\n );\n\n let content: ReactNode;\n if (docs.length === 0) {\n content = (\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 } else if (isTabbed) {\n content = (\n <Tabs\n value={activeDoc?.id ?? ''}\n onValueChange={setActiveId}\n variant=\"underlined\"\n size=\"sm\"\n // Each tab shows its full file name when there's room and shrinks with\n // an ellipsis only when the tabs would otherwise overflow the width\n // (`min-inline-size:0` lets a tab shrink below its content; the label\n // truncates). The full name stays the accessible name and shows in the\n // body, so nothing is lost.\n className=\"ds:min-h-0 ds:flex-1 ds:pt-[var(--spacing-sm)]\"\n >\n <TabsList\n aria-label={t('documentPreview.tabsLabel', 'Selected documents')}\n className=\"ds:gap-[var(--spacing-sm)]\"\n >\n {docs.map((doc) => {\n const TabIcon = iconForMime(doc.mimeType);\n return (\n <TabsTrigger\n key={doc.id}\n value={doc.id}\n // Match the header glyph: same 16px size (never larger) and the\n // accent tint that marks a file across the grid and the rail.\n icon={\n <TabIcon\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:text-[color:var(--accent)]\"\n />\n }\n className=\"ds:[min-inline-size:0]\"\n >\n <span className=\"ds:block ds:truncate ds:[min-inline-size:0]\">\n {doc.name}\n </span>\n </TabsTrigger>\n );\n })}\n </TabsList>\n {docs.map((doc) => (\n <TabsContent\n key={doc.id}\n value={doc.id}\n className=\"ds:min-h-0 ds:flex-1\"\n >\n {renderBody(doc)}\n </TabsContent>\n ))}\n </Tabs>\n );\n } else {\n content = renderBody(activeDoc);\n }\n\n return (\n <section\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 // A labelled <section> is a region landmark, which also scopes the\n // PanelHeader's <header> so it is never exposed as a page banner.\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- keyboard-focusable scroll region (see comment above)\n tabIndex={0}\n aria-label={t('documentPreview.regionLabel', 'Document preview')}\n className={documentPreviewVariants({ className })}\n >\n {docs.length > 0 && (\n <PanelHeader sticky icon={headerIcon} title={headerTitle} />\n )}\n {content}\n </section>\n );\n});\n\nDocumentPreview.displayName = 'DocumentPreview';\n"],"names":["__iconNode","Files","createLucideIcon","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","documents","className","ref","i18n","useTranslation","docs","useMemo","isTabbed","activeId","setActiveId","useState","activeDoc","doc","useImperativeHandle","useAgentRegistration","renderBody","kind","meta","PlaceholderIcon","viewport","jsx","PDFViewer","jsxs","status","hasBadges","fmtDate","iso","rows","hasDetails","Card","Badge","row","Fragment","HeaderMimeIcon","headerIcon","headerTitle","content","EmptyState","Tabs","TabsList","TabIcon","TabsTrigger","TabsContent","PanelHeader"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"document-preview-_kQ9QvZV.js","sources":["../../node_modules/lucide-react/dist/esm/icons/files.mjs","../../src/components/document-preview/document-preview.agent.ts","../../src/components/document-preview/document-preview.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M15 2h-4a2 2 0 0 0-2 2v11a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V8\", key: \"14sh0y\" }],\n [\n \"path\",\n {\n d: \"M16.706 2.706A2.4 2.4 0 0 0 15 2v5a1 1 0 0 0 1 1h5a2.4 2.4 0 0 0-.706-1.706z\",\n key: \"1970lx\"\n }\n ],\n [\"path\", { d: \"M5 7a2 2 0 0 0-2 2v11a2 2 0 0 0 2 2h8a2 2 0 0 0 1.732-1\", key: \"l4dndm\" }]\n];\nconst Files = createLucideIcon(\"files\", __iconNode);\n\nexport { __iconNode, Files as default };\n//# sourceMappingURL=files.mjs.map\n","/* -------------------------------------------------------------------- */\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. The body is an */\n/* elevated Card: a bounded preview viewport (PDF → kit PDFViewer; */\n/* image/* → <img>; otherwise a MIME-icon placeholder) above an always-on */\n/* Details block (badges + every structural field the host supplies), so */\n/* the metadata is never dropped when a real preview renders. No name → */\n/* EmptyState. */\n/* */\n/* Title lives in the canonical PanelHeader (the same header every rail */\n/* panel adopts) so the Control Room rail can inject its pin / close */\n/* controls into it. Pass `documents` (≥ 2) to preview a SELECTION as */\n/* tabs — one tab per document, the active one shown below; a single */\n/* entry (or the single-document props) renders without a tab strip. */\n/* */\n/* The root is a `<section>` (region landmark) so the PanelHeader's */\n/* <header> is scoped and never exposed as a page banner — the same */\n/* shape RadiographPanel uses. It is also a keyboard-focusable scroll */\n/* region (tabIndex 0 + labelled focus ring). */\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. In tabbed mode the handle reflects the ACTIVE tab. */\n/* -------------------------------------------------------------------- */\n\nimport {\n forwardRef,\n Fragment,\n useImperativeHandle,\n useMemo,\n useState,\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 Files,\n type LucideIcon,\n} from 'lucide-react';\nimport { Badge } from '../badge';\nimport { Card } from '../card';\nimport { EmptyState } from '../empty-state';\nimport { PanelHeader } from '../panel-header';\nimport { PDFViewer } from '../pdf-viewer';\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from '../tabs';\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 /** Display name of whoever created the document (host-supplied). */\n createdBy?: string;\n /** ISO 8601 timestamp the document was created. */\n createdAt?: string;\n /** ISO 8601 timestamp of the last modification. */\n updatedAt?: string;\n /** ISO 8601 timestamp a signature was requested from the patient. */\n signatureRequestedAt?: string;\n /** ISO 8601 timestamp the document was signed. */\n signedAt?: string;\n /** ISO 8601 timestamp the document was shared with the patient. */\n sharedAt?: 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\n/**\n * A single previewable document. In multi-document mode each becomes a tab;\n * `id` is the tab value (never a patient name) and `name` is the tab label.\n */\nexport interface DocumentPreviewDocument {\n /** Stable, non-identifying id. Emitted as the tab value — never PHI. */\n id: string;\n /** Display name (PHI). Also the tab label in multi-document mode. */\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. */\n src?: string;\n /** Structural metadata rendered by the metadata-card branch. */\n metadata?: DocumentPreviewMetadata;\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 (and no `documents`) → empty state. PHI. */\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 /**\n * Multiple documents to preview as tabs — e.g. a multi-row selection. Two\n * or more render a tab per document (label = name) with the active one\n * shown below; a single entry renders without a tab strip. When non-empty\n * this takes precedence over the single-document props. Names are PHI.\n */\n documents?: DocumentPreviewDocument[];\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 active document's 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 header / 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, documents, className }, ref) => {\n const { t, i18n } = useTranslation('ui');\n\n // Resolve the document list: an explicit `documents` list wins; otherwise\n // the single-document props form a one-item list; nothing → empty. The\n // synthetic single-doc id is never emitted as a tab value (a lone doc\n // renders without a tab strip), so falling back to the name is PHI-safe.\n const docs = useMemo<DocumentPreviewDocument[]>(() => {\n if (documents && documents.length > 0) return documents;\n if (name) return [{ id: id ?? name, name, mimeType, src, metadata }];\n return [];\n }, [documents, id, name, mimeType, src, metadata]);\n\n const isTabbed = docs.length > 1;\n\n // Active tab (multi mode). When the current id is stale after the selection\n // changes we fall back to the first document — no reconciling effect needed.\n const [activeId, setActiveId] = useState<string | undefined>(undefined);\n const activeDoc = docs.find((doc) => doc.id === activeId) ?? docs[0];\n\n const handle = useMemo<DocumentPreviewHandle>(\n () => ({\n getKind: () =>\n activeDoc\n ? resolveKind(activeDoc.name, activeDoc.mimeType, activeDoc.src)\n : 'empty',\n getName: () => activeDoc?.name,\n }),\n [activeDoc],\n );\n useImperativeHandle(ref, () => handle, [handle]);\n useAgentRegistration(documentPreviewAgent, handle, id);\n\n /* The per-document body — an elevated Card with a bounded preview viewport\n (pdf / image / placeholder) above an always-on Details block. The title is\n NOT rendered here (the PanelHeader owns it, or the tab label in multi mode). */\n const renderBody = (doc: DocumentPreviewDocument): ReactNode => {\n const kind = resolveKind(doc.name, doc.mimeType, doc.src);\n const meta = doc.metadata;\n const PlaceholderIcon = iconForMime(doc.mimeType);\n\n // Preview viewport — the rendered document, or a MIME-icon placeholder when\n // no source resolves. Bounded to a consistent aspect so the Details below\n // stay reachable in the rail.\n let viewport: ReactNode;\n if (kind === 'pdf' && doc.src) {\n viewport = (\n <PDFViewer\n src={doc.src}\n toolbarVariant=\"minimal\"\n // Name the embedded viewer after the document so it stays distinct\n // from the surrounding \"Document preview\" region (nested landmarks\n // must not share an accessible name). Mirrors visible header text.\n ariaLabel={doc.name}\n className=\"ds:h-full ds:w-full\"\n />\n );\n } else if (kind === 'image' && doc.src) {\n viewport = (\n <img\n src={doc.src}\n alt={t('documentPreview.imageAlt', 'Preview of {{name}}', {\n name: doc.name,\n })}\n className=\"ds:max-h-full ds:max-w-full ds:object-contain\"\n />\n );\n } else {\n viewport = (\n <span className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-sm)] ds:text-muted-foreground\">\n <PlaceholderIcon aria-hidden=\"true\" className=\"ds:size-10\" />\n <span className=\"type-body-sm\">\n {t('documentPreview.noPreview', 'No preview available.')}\n </span>\n </span>\n );\n }\n\n // Badges: type / clinical / signature status.\n const status = meta?.signatureStatus;\n const hasBadges =\n Boolean(meta?.documentType) ||\n Boolean(meta?.clinical) ||\n (status !== undefined && status !== 'none');\n\n // Detail rows — every structural field the host supplies, so nothing is\n // dropped when a real preview renders. Only present fields render a row.\n const fmtDate = (iso: string): string =>\n new Intl.DateTimeFormat(i18n.language, { dateStyle: 'medium' }).format(\n new Date(iso),\n );\n const rows: Array<{ key: string; label: string; value: string }> = [];\n if (meta?.createdBy)\n rows.push({\n key: 'createdBy',\n label: t('documentPreview.fields.createdBy', 'Created by'),\n value: meta.createdBy,\n });\n if (meta?.createdAt)\n rows.push({\n key: 'created',\n label: t('documentPreview.fields.created', 'Created'),\n value: fmtDate(meta.createdAt),\n });\n if (meta?.updatedAt)\n rows.push({\n key: 'modified',\n label: t('documentPreview.fields.modified', 'Modified'),\n value: fmtDate(meta.updatedAt),\n });\n if (meta?.signatureRequestedAt)\n rows.push({\n key: 'signatureRequested',\n label: t(\n 'documentPreview.fields.signatureRequested',\n 'Signature requested',\n ),\n value: fmtDate(meta.signatureRequestedAt),\n });\n if (meta?.signedAt)\n rows.push({\n key: 'signed',\n label: t('documentPreview.fields.signed', 'Signed'),\n value: fmtDate(meta.signedAt),\n });\n if (meta?.sharedAt)\n rows.push({\n key: 'sharedWithPatient',\n label: t(\n 'documentPreview.fields.sharedWithPatient',\n 'Shared with patient',\n ),\n value: fmtDate(meta.sharedAt),\n });\n if (meta?.size !== undefined)\n rows.push({\n key: 'size',\n label: t('documentPreview.fields.size', 'Size'),\n value: formatBytes(meta.size, i18n.language, t),\n });\n if (meta?.expiresAt)\n rows.push({\n key: 'expires',\n label: t('documentPreview.fields.expires', 'Expires'),\n value: fmtDate(meta.expiresAt),\n });\n\n const hasDetails = hasBadges || rows.length > 0;\n\n return (\n <div className=\"ds:p-[var(--spacing-md)]\">\n <Card\n variant=\"elevated\"\n className=\"ds:flex ds:flex-col ds:overflow-hidden\"\n >\n <div className=\"ds:flex ds:aspect-[4/3] ds:min-h-0 ds:items-center ds:justify-center ds:overflow-hidden ds:border-b ds:border-[color:var(--card-border)] ds:bg-muted\">\n {viewport}\n </div>\n {hasDetails && (\n <Card.Body className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <h3 className=\"type-eyebrow ds:m-0 ds:text-muted-foreground\">\n {t('documentPreview.detailsTitle', 'Details')}\n </h3>\n {hasBadges && (\n <span className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n {meta?.documentType && (\n <Badge variant=\"neutral\" size=\"sm\">\n {meta.documentType}\n </Badge>\n )}\n {meta?.clinical && (\n <Badge variant=\"info\" size=\"sm\">\n {t('documentPreview.clinical', 'Clinical')}\n </Badge>\n )}\n {status && status !== 'none' && (\n <Badge\n variant={SIGNATURE_VARIANT[status]}\n size=\"sm\"\n withDot\n >\n {t(`documentPreview.signature.${status}`, status)}\n </Badge>\n )}\n </span>\n )}\n {rows.length > 0 && (\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 {rows.map((row) => (\n <Fragment key={row.key}>\n <dt className=\"ds:text-muted-foreground\">{row.label}</dt>\n <dd className=\"ds:m-0\">{row.value}</dd>\n </Fragment>\n ))}\n </dl>\n )}\n </Card.Body>\n )}\n </Card>\n </div>\n );\n };\n\n // Header: a MIME icon + the document name for a single doc; a Files glyph +\n // a count badge (RadiographPanel's title-plus-badge shape) when tabbed.\n const HeaderMimeIcon = iconForMime(activeDoc?.mimeType);\n const headerIcon = isTabbed ? (\n <Files aria-hidden=\"true\" />\n ) : (\n <HeaderMimeIcon aria-hidden=\"true\" />\n );\n const headerTitle: ReactNode = isTabbed ? (\n <>\n {t('documentPreview.multiTitle', 'Documents')}\n <Badge variant=\"neutral\" size=\"sm\">\n {docs.length}\n </Badge>\n </>\n ) : (\n activeDoc?.name\n );\n\n let content: ReactNode;\n if (docs.length === 0) {\n content = (\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 } else if (isTabbed) {\n content = (\n <Tabs\n value={activeDoc?.id ?? ''}\n onValueChange={setActiveId}\n variant=\"underlined\"\n size=\"sm\"\n // Each tab shows its full file name when there's room and shrinks with\n // an ellipsis only when the tabs would otherwise overflow the width\n // (`min-inline-size:0` lets a tab shrink below its content; the label\n // truncates). The full name stays the accessible name and shows in the\n // body, so nothing is lost.\n className=\"ds:min-h-0 ds:flex-1 ds:pt-[var(--spacing-sm)]\"\n >\n <TabsList\n aria-label={t('documentPreview.tabsLabel', 'Selected documents')}\n className=\"ds:gap-[var(--spacing-sm)]\"\n >\n {docs.map((doc) => {\n const TabIcon = iconForMime(doc.mimeType);\n return (\n <TabsTrigger\n key={doc.id}\n value={doc.id}\n // Match the header glyph: same 16px size (never larger) and the\n // accent tint that marks a file across the grid and the rail.\n icon={\n <TabIcon\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:text-[color:var(--accent)]\"\n />\n }\n className=\"ds:[min-inline-size:0]\"\n >\n <span className=\"ds:block ds:truncate ds:[min-inline-size:0]\">\n {doc.name}\n </span>\n </TabsTrigger>\n );\n })}\n </TabsList>\n {docs.map((doc) => (\n <TabsContent\n key={doc.id}\n value={doc.id}\n className=\"ds:min-h-0 ds:flex-1\"\n >\n {renderBody(doc)}\n </TabsContent>\n ))}\n </Tabs>\n );\n } else {\n content = renderBody(activeDoc);\n }\n\n return (\n <section\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 // A labelled <section> is a region landmark, which also scopes the\n // PanelHeader's <header> so it is never exposed as a page banner.\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- keyboard-focusable scroll region (see comment above)\n tabIndex={0}\n aria-label={t('documentPreview.regionLabel', 'Document preview')}\n className={documentPreviewVariants({ className })}\n >\n {docs.length > 0 && (\n <PanelHeader sticky icon={headerIcon} title={headerTitle} />\n )}\n {content}\n </section>\n );\n});\n\nDocumentPreview.displayName = 'DocumentPreview';\n"],"names":["__iconNode","Files","createLucideIcon","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","documents","className","ref","i18n","useTranslation","docs","useMemo","isTabbed","activeId","setActiveId","useState","activeDoc","doc","useImperativeHandle","useAgentRegistration","renderBody","kind","meta","PlaceholderIcon","viewport","jsx","PDFViewer","jsxs","status","hasBadges","fmtDate","iso","rows","hasDetails","Card","Badge","row","Fragment","HeaderMimeIcon","headerIcon","headerTitle","content","EmptyState","Tabs","TabsList","TabIcon","TabsTrigger","TabsContent","PanelHeader"],"mappings":"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","x_google_ignoreList":[0]}
|