sos-portal-components-react 0.3.2 → 0.3.4

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/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## Unreleased
4
+
5
+ ## 0.3.4 - 2026-11-12
6
+
7
+ - Render provider-supplied organization/service labels for authorized foreign history without exposing service-reference internals or mutation controls.
8
+
9
+ - Keep other-organization Encounter history read-only in the shared journey action selector. Document consent-free professional encounter traceability, scoped history read grants and the full IPS permission catalog.
10
+
11
+ ## 0.3.3 - 2026-11-11
12
+
13
+ - Add controlled, host-authorized Encounter journey and transfer components, including persisted response validation and read-only Personal presentation. Retain the UHC transfer console through a compatibility wrapper.
14
+ - Recover the shared person/animal clinical-section, permission and US Core STU6 contract; distinguish existing views from the pending complete example lifecycle.
15
+
3
16
  ## 0.3.2 - 2026-11-10
4
17
 
5
18
  - Add controlled `SubjectCardLocatorFields` for card-number or DID/QR entry.
package/README.md CHANGED
@@ -87,6 +87,8 @@ This is the current runtime inventory, not completion of the whole catalogue:
87
87
 
88
88
  | Export | Owner / responsibility |
89
89
  | --- | --- |
90
+ | `EncounterJourneyPanel` | Controlled create/status/transfer and read-only saved journey; BFF callbacks own authority and persistence. |
91
+ | `EncounterTransferConsole` | Shared transfer presentation; UHC retains a deprecated compatibility wrapper. |
90
92
  | `SubjectConversationChat` | SOS projection of authorized subject Communications into the neutral Antifraud conversation renderer. |
91
93
  | `createLiveKitRealtimeCallClient` | Host-configured RTC client adapter; the BFF retains authorization, credentials and Communication persistence. |
92
94
  | `useRealtimeCallSessionLifecycle` | Shared persisted-end observation and profile-owned session cleanup for Personal and Professional, including React Strict Mode replay. |
@@ -227,3 +229,5 @@ group adapter.
227
229
  genuinely reusable.
228
230
  6. Remove compatibility implementations only in a later breaking release.
229
231
 
232
+
233
+ See [clinical sections, permissions and US Core contract](docs/03-CLINICAL_SECTIONS_AND_US_CORE_CONTRACT.md) for the recovered person/animal mappings and pending full example lifecycle.
@@ -0,0 +1,34 @@
1
+ import { type PortalEncounterJourneyView, type PortalEncounterMutationResult, type PortalEncounterRequest } from 'sos-data-utils-ts/portal-encounter-journey';
2
+ import { type EncounterTransferConsoleCopy } from './EncounterTransferConsole.js';
3
+ export declare const ENCOUNTER_TRANSFER_COPY_EN: EncounterTransferConsoleCopy;
4
+ export type EncounterJourneyCopy = Readonly<{
5
+ title: string;
6
+ empty: string;
7
+ service: string;
8
+ create: string;
9
+ encounter: string;
10
+ destination: string;
11
+ transfer: string;
12
+ history: string;
13
+ refresh: string;
14
+ retry: string;
15
+ confirmed: string;
16
+ start: string;
17
+ resume: string;
18
+ hold: string;
19
+ complete: string;
20
+ discharge: string;
21
+ cancel: string;
22
+ discontinue: string;
23
+ transferCopy: EncounterTransferConsoleCopy;
24
+ }>;
25
+ export declare const ENCOUNTER_JOURNEY_COPY_EN: EncounterJourneyCopy;
26
+ /** One renderer and one intent contract. The host chooses the authorized provider and returns its actual readback. */
27
+ export declare function EncounterJourneyPanel({ subjectLabel, view, onCommand, onRefresh, copy }: Readonly<{
28
+ subjectLabel: string;
29
+ view: PortalEncounterJourneyView;
30
+ onCommand?: (command: PortalEncounterRequest) => Promise<PortalEncounterMutationResult>;
31
+ onRefresh?: () => Promise<void>;
32
+ copy?: EncounterJourneyCopy;
33
+ }>): import("react").JSX.Element;
34
+ //# sourceMappingURL=EncounterJourneyPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EncounterJourneyPanel.d.ts","sourceRoot":"","sources":["../src/EncounterJourneyPanel.tsx"],"names":[],"mappings":"AACA,OAAO,EAAoD,KAAK,0BAA0B,EAAC,KAAK,6BAA6B,EAAC,KAAK,sBAAsB,EAAC,MAAM,4CAA4C,CAAA;AAE5M,OAAO,EAA0B,KAAK,4BAA4B,EAAyD,MAAM,+BAA+B,CAAA;AAEhK,eAAO,MAAM,0BAA0B,EAAC,4BASvC,CAAA;AACD,MAAM,MAAM,oBAAoB,GAAC,QAAQ,CAAC;IACxC,KAAK,EAAC,MAAM,CAAC;IAAA,KAAK,EAAC,MAAM,CAAC;IAAA,OAAO,EAAC,MAAM,CAAC;IAAA,MAAM,EAAC,MAAM,CAAC;IAAA,SAAS,EAAC,MAAM,CAAC;IAAA,WAAW,EAAC,MAAM,CAAC;IAAA,QAAQ,EAAC,MAAM,CAAC;IAAA,OAAO,EAAC,MAAM,CAAC;IAAA,OAAO,EAAC,MAAM,CAAC;IAAA,KAAK,EAAC,MAAM,CAAC;IAAA,SAAS,EAAC,MAAM,CAAA;IACtK,KAAK,EAAC,MAAM,CAAC;IAAA,MAAM,EAAC,MAAM,CAAC;IAAA,IAAI,EAAC,MAAM,CAAC;IAAA,QAAQ,EAAC,MAAM,CAAC;IAAA,SAAS,EAAC,MAAM,CAAC;IAAA,MAAM,EAAC,MAAM,CAAC;IAAA,WAAW,EAAC,MAAM,CAAC;IAAA,YAAY,EAAC,4BAA4B,CAAA;CACnJ,CAAC,CAAA;AACF,eAAO,MAAM,yBAAyB,EAAC,oBAA4kB,CAAA;AAEnnB,sHAAsH;AACtH,wBAAgB,qBAAqB,CAAC,EAAC,YAAY,EAAC,IAAI,EAAC,SAAS,EAAC,SAAS,EAAC,IAA8B,EAAC,EAAC,QAAQ,CAAC;IACpH,YAAY,EAAC,MAAM,CAAC;IAAA,IAAI,EAAC,0BAA0B,CAAC;IAAA,SAAS,CAAC,EAAC,CAAC,OAAO,EAAC,sBAAsB,KAAG,OAAO,CAAC,6BAA6B,CAAC,CAAA;IACvI,SAAS,CAAC,EAAC,MAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAAA,IAAI,CAAC,EAAC,oBAAoB,CAAA;CACxD,CAAC,+BA6DD"}
@@ -0,0 +1,82 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useRef, useState } from 'react';
3
+ import { EncounterStatusR5 as S, portalEncounterNextStatuses } from 'sos-data-utils-ts/portal-encounter-journey';
4
+ import { EncounterClaim as E, EncounterHistoryClaim as H } from 'fhir-data-utils-ts/claims';
5
+ import { EncounterTransferConsole } from './EncounterTransferConsole.js';
6
+ export const ENCOUNTER_TRANSFER_COPY_EN = {
7
+ patientSearchTitle: 'Find a patient', scanQr: 'Scan QR', patientId: 'Card identifier', search: 'Find card', journeyTitle: 'Service stages',
8
+ sourceTitle: 'Current service', destinationTitle: 'Destination service', returning: 'Patient will return', returningHint: 'Keep the current service on hold.',
9
+ notReturning: 'Patient will not return', notReturningHint: 'Complete the current service.', transferTo: 'Transfer to', reviewChanges: 'Review changes', applyTransfer: 'Confirm transfer',
10
+ emergencyActions: 'Emergency contacts', call: 'Call', videoCall: 'Video call', sendMessage: 'Send message', text: 'Text', audio: 'Audio', messageLabel: 'Message', attach: 'Attach', pdf: 'PDF', fhirBundle: 'FHIR Bundle', calendar: 'Calendar', send: 'Send',
11
+ resourceSummary: 'Transfer changes', sourceUpdate: 'Update source', sourceHistory: 'Record source history', destinationUpdate: 'Update destination', destinationHistory: 'Record destination history', indexProjection: 'Project continuity',
12
+ demoWarning: 'Synthetic Demo data', helpTitle: 'What happens to the previous service?', helpBody: 'A temporary move keeps it on hold. A definitive move completes it. The destination starts only after the transfer is confirmed.',
13
+ transferReady: 'Transfer confirmed', messageReady: 'Message prepared', callReady: 'Call prepared', videoReady: 'Video call prepared', patientReady: 'Card found', reviewReady: 'Review prepared', attachmentReady: 'Attachment selected', technicalDetails: 'Technical details',
14
+ encounterIdentifier: 'Encounter identifier', transferPending: 'Transfer is not confirmed. Retry the same change.', retryTransfer: 'Retry transfer', transferRejected: 'The transfer was rejected.',
15
+ };
16
+ export const ENCOUNTER_JOURNEY_COPY_EN = { title: 'Encounter journey', empty: 'No encounters have been recorded for this card.', service: 'Service', create: 'Create encounter', encounter: 'Encounter', destination: 'Destination service', transfer: 'Transfer to another service', history: 'Encounter history', refresh: 'Refresh journey', retry: 'Retry last change', confirmed: 'Change confirmed', start: 'Start encounter', resume: 'Resume encounter', hold: 'Pause encounter', complete: 'Complete encounter', discharge: 'Clinical discharge', cancel: 'Cancel encounter', discontinue: 'Discontinue encounter', transferCopy: ENCOUNTER_TRANSFER_COPY_EN };
17
+ /** One renderer and one intent contract. The host chooses the authorized provider and returns its actual readback. */
18
+ export function EncounterJourneyPanel({ subjectLabel, view, onCommand, onRefresh, copy = ENCOUNTER_JOURNEY_COPY_EN }) {
19
+ const [selectedReference, setSelectedReference] = useState(''), [serviceReference, setServiceReference] = useState('');
20
+ const [destinationReference, setDestinationReference] = useState(''), [transferOpen, setTransferOpen] = useState(false);
21
+ const [busy, setBusy] = useState(false), [error, setError] = useState(''), [notice, setNotice] = useState('');
22
+ const retry = useRef(null);
23
+ const manageable = view.encounters.filter(row => view.services.some(service => service.reference === row.entry.claims[E.ServiceType] && (!row.entry.claims[E.ServiceProvider] || service.organizationReference === row.entry.claims[E.ServiceProvider])));
24
+ const selected = manageable.find(row => row.entry.reference === selectedReference)
25
+ ?? manageable.find(row => row.entry.claims[E.Status] === S.InProgress) ?? manageable[0];
26
+ const canManage = Boolean(view.canManage && onCommand), blocked = busy || Boolean(error && retry.current);
27
+ const service = view.services.find(item => item.reference === serviceReference) ?? view.services[0];
28
+ const destinations = view.services.filter(item => item.organizationReference === selected?.entry.claims[E.ServiceProvider] && item.reference !== selected.entry.claims[E.ServiceType]);
29
+ const destination = destinations.find(item => item.reference === destinationReference) ?? destinations[0];
30
+ const stages = view.encounters.map(row => ({ identifier: row.entry.reference,
31
+ serviceLabel: row.serviceLabel || view.services.find(item => item.reference === row.entry.claims[E.ServiceType])?.label || 'Other organization encounter',
32
+ arrivedAt: row.entry.claims[E.ActualPeriodStart] || row.entry.claims[E.PeriodStart] || '', status: row.entry.claims[E.Status],
33
+ }));
34
+ const statuses = selected?.allowedStatuses ?? portalEncounterNextStatuses(selected?.entry.claims[E.Status] || '');
35
+ const statusLabel = (status) => status === S.InProgress ? (selected?.entry.claims[E.Status] === S.OnHold ? copy.resume : copy.start) : status === S.OnHold ? copy.hold : status === S.Completed ? copy.complete : status === S.Discharged ? copy.discharge : status === S.Cancelled ? copy.cancel : copy.discontinue;
36
+ async function execute(command) {
37
+ if (!canManage || !onCommand)
38
+ throw new Error('encounter_write_unavailable');
39
+ retry.current = command;
40
+ setBusy(true);
41
+ setError('');
42
+ setNotice('');
43
+ try {
44
+ const result = await onCommand(command);
45
+ if (result.journey.subjectIdentifier !== view.subjectIdentifier || !result.affectedEncounterReferences.length
46
+ || result.affectedEncounterReferences.some(reference => !result.journey.encounters.some(row => row.entry.reference === reference)))
47
+ throw new Error('encounter_readback_missing');
48
+ if (command.action === 'status' && !result.journey.encounters.some(row => row.entry.reference === command.encounterReference && row.entry.claims[E.Status] === command.status))
49
+ throw new Error('encounter_readback_mismatch');
50
+ if (command.action === 'transfer' && (!result.journey.encounters.some(row => row.entry.reference === command.encounterReference && row.entry.claims[E.Status] === command.sourceOutcome)
51
+ || !result.journey.encounters.some(row => row.entry.reference !== command.encounterReference && row.entry.claims[E.ServiceType] === command.destinationServiceReference && row.entry.claims[E.Status] === S.InProgress)))
52
+ throw new Error('encounter_readback_mismatch');
53
+ if (command.action === 'create' && !result.journey.encounters.some(row => result.affectedEncounterReferences.includes(row.entry.reference) && row.entry.claims[E.Status] === S.Planned))
54
+ throw new Error('encounter_readback_mismatch');
55
+ retry.current = null;
56
+ setTransferOpen(false);
57
+ setNotice(copy.confirmed);
58
+ }
59
+ catch (reason) {
60
+ setError(reason instanceof Error ? reason.message : 'Encounter change failed');
61
+ throw reason;
62
+ }
63
+ finally {
64
+ setBusy(false);
65
+ }
66
+ }
67
+ async function transfer(outcome) {
68
+ if (!selected || !destination)
69
+ return { state: 'rejected' };
70
+ const pending = retry.current;
71
+ const command = pending?.action === 'transfer' ? pending : { action: 'transfer', operationId: crypto.randomUUID(), encounterReference: selected.entry.reference, expectedRevision: selected.revision, destinationServiceReference: destination.reference, sourceOutcome: outcome };
72
+ try {
73
+ await execute(command);
74
+ return { state: 'confirmed' };
75
+ }
76
+ catch {
77
+ return { state: 'retryable' };
78
+ }
79
+ }
80
+ return _jsxs("section", { className: "sos-encounter-journey", role: "region", "aria-label": copy.title, children: [_jsxs("header", { children: [_jsxs("div", { children: [_jsx("h2", { children: copy.title }), _jsx("p", { children: subjectLabel })] }), onRefresh && _jsx("button", { type: "button", disabled: busy, onClick: () => void onRefresh().then(() => { retry.current = null; setError(''); setNotice(''); }).catch(reason => setError(String(reason))), children: copy.refresh })] }), canManage && service && _jsxs("form", { onSubmit: event => { event.preventDefault(); void execute({ action: 'create', operationId: crypto.randomUUID(), serviceReference: service.reference }).catch(() => { }); }, children: [_jsxs("label", { children: [copy.service, _jsx("select", { "aria-label": copy.service, value: service.reference, disabled: blocked, onChange: event => setServiceReference(event.target.value), children: view.services.map(item => _jsx("option", { value: item.reference, children: item.label }, item.reference)) })] }), _jsx("button", { type: "submit", disabled: blocked, children: copy.create })] }), !view.encounters.length ? _jsx("p", { children: copy.empty }) : _jsxs(_Fragment, { children: [canManage && selected && _jsxs("div", { className: "sos-encounter-actions", children: [_jsxs("label", { children: [copy.encounter, _jsx("select", { "aria-label": copy.encounter, value: selected.entry.reference, disabled: blocked, onChange: event => { setSelectedReference(event.target.value); setTransferOpen(false); }, children: stages.filter(item => manageable.some(row => row.entry.reference === item.identifier)).map(item => _jsxs("option", { value: item.identifier, children: [item.serviceLabel, " \u00B7 ", item.status] }, item.identifier)) })] }), statuses.map(status => _jsx("button", { type: "button", disabled: blocked, onClick: () => void execute({ action: 'status', operationId: crypto.randomUUID(), encounterReference: selected.entry.reference, expectedRevision: selected.revision, status }).catch(() => { }), children: statusLabel(status) }, status)), destinations.length > 0 && selected.entry.claims[E.Status] === S.InProgress && _jsx("button", { type: "button", disabled: blocked, onClick: () => setTransferOpen(value => !value), children: copy.transfer })] }), canManage && transferOpen && destination && _jsxs("label", { children: [copy.destination, _jsx("select", { "aria-label": copy.destination, disabled: blocked, value: destination.reference, onChange: event => setDestinationReference(event.target.value), children: destinations.map(item => _jsx("option", { value: item.reference, children: item.label }, item.reference)) })] }), _jsx(EncounterTransferConsole, { copy: copy.transferCopy, patientDisplay: subjectLabel, encounters: stages, sourceEncounterId: transferOpen ? selected?.entry.reference || '' : '', destinationEncounterId: "", contacts: [], readOnly: !canManage || !transferOpen, ...(transferOpen && destination ? { destinationPreview: { serviceLabel: destination.label } } : {}), ...(canManage && transferOpen ? { onApplyTransfer: transfer } : {}) }, transferOpen ? 'edit' : 'read')] }), view.history.length > 0 && _jsxs("details", { children: [_jsx("summary", { children: copy.history }), _jsx("ol", { children: view.history.map(row => _jsxs("li", { "data-encounter-history": row.entry.claims[H.Encounter], children: [_jsx("time", { children: row.entry.claims[H.ActualPeriodStart] }), " \u00B7 ", row.entry.claims[H.Status], " \u00B7 ", row.serviceLabel || view.services.find(service => service.reference === row.entry.claims[H.ServiceType])?.label || 'Other organization encounter'] }, row.entry.reference)) })] }), error && _jsx("p", { role: "alert", children: error }), canManage && error && retry.current && _jsx("button", { type: "button", disabled: busy, onClick: () => void execute(retry.current).catch(() => { }), children: copy.retry }), notice && _jsx("p", { role: "status", children: notice })] });
81
+ }
82
+ //# sourceMappingURL=EncounterJourneyPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EncounterJourneyPanel.js","sourceRoot":"","sources":["../src/EncounterJourneyPanel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ import type { PortalEncounterRequest, PortalEncounterSourceOutcome } from 'sos-data-utils-ts/portal-encounter-journey';
2
+ export type EncounterTransferStatus = `${Extract<PortalEncounterRequest, {
3
+ action: 'status';
4
+ }>['status']}`;
5
+ export type EncounterSourceOutcome = PortalEncounterSourceOutcome | `${PortalEncounterSourceOutcome}`;
6
+ export type EncounterTransferStage = Readonly<{
7
+ identifier: string;
8
+ /** Human-readable provider business identifier; never replaces the FHIR resource id. */
9
+ displayIdentifier?: string;
10
+ serviceLabel: string;
11
+ locationLabel?: string;
12
+ arrivedAt: string;
13
+ status: EncounterTransferStatus;
14
+ }>;
15
+ export type EmergencyContactAction = Readonly<{
16
+ identifier: string;
17
+ name: string;
18
+ relationship: string;
19
+ phone?: string;
20
+ }>;
21
+ export type EncounterTransferConsoleCopy = Readonly<{
22
+ patientSearchTitle: string;
23
+ scanQr: string;
24
+ patientId: string;
25
+ search: string;
26
+ journeyTitle: string;
27
+ sourceTitle: string;
28
+ destinationTitle: string;
29
+ returning: string;
30
+ returningHint: string;
31
+ notReturning: string;
32
+ notReturningHint: string;
33
+ transferTo: string;
34
+ reviewChanges: string;
35
+ applyTransfer: string;
36
+ emergencyActions: string;
37
+ call: string;
38
+ videoCall: string;
39
+ sendMessage: string;
40
+ text: string;
41
+ audio: string;
42
+ messageLabel: string;
43
+ attach: string;
44
+ pdf: string;
45
+ fhirBundle: string;
46
+ calendar: string;
47
+ send: string;
48
+ resourceSummary: string;
49
+ sourceUpdate: string;
50
+ sourceHistory: string;
51
+ destinationUpdate: string;
52
+ destinationHistory: string;
53
+ indexProjection: string;
54
+ demoWarning: string;
55
+ helpTitle: string;
56
+ helpBody: string;
57
+ transferReady: string;
58
+ messageReady: string;
59
+ callReady: string;
60
+ videoReady: string;
61
+ patientReady: string;
62
+ reviewReady: string;
63
+ attachmentReady: string;
64
+ technicalDetails: string;
65
+ encounterIdentifier: string;
66
+ transferPending: string;
67
+ retryTransfer: string;
68
+ transferRejected: string;
69
+ }>;
70
+ export type EncounterTransferApplyOutcome = Readonly<{
71
+ state: 'confirmed' | 'pending' | 'retryable' | 'rejected';
72
+ message?: string;
73
+ }>;
74
+ export type EncounterTransferConsoleProps = Readonly<{
75
+ copy: EncounterTransferConsoleCopy;
76
+ patientDisplay: string;
77
+ encounters: readonly EncounterTransferStage[];
78
+ sourceEncounterId: string;
79
+ destinationEncounterId: string;
80
+ contacts: readonly EmergencyContactAction[];
81
+ demo?: boolean;
82
+ /** Old illustrative tools are opt-in; normal hosts supply their real card/contact actions separately. */
83
+ legacyTools?: boolean;
84
+ readOnly?: boolean;
85
+ destinationPreview?: Readonly<{
86
+ serviceLabel: string;
87
+ locationLabel?: string;
88
+ }>;
89
+ onApplyTransfer?: (sourceOutcome: EncounterSourceOutcome) => void | EncounterTransferApplyOutcome | Promise<void | EncounterTransferApplyOutcome>;
90
+ }>;
91
+ /**
92
+ * Shared visual editor for one already-authorized subject transfer.
93
+ *
94
+ * Selection and demo state never grant access. The host must resolve the
95
+ * subject, contacts, department sender, HealthcareService and write
96
+ * capability in its BFF. `onApplyTransfer` reports only the requested source
97
+ * outcome; the provider commits authoritative Encounter changes before any
98
+ * completed Communication projects the result to the subject index.
99
+ */
100
+ export declare function EncounterTransferConsole({ copy, patientDisplay, encounters, sourceEncounterId, destinationEncounterId, contacts, demo, legacyTools, readOnly, destinationPreview, onApplyTransfer }: EncounterTransferConsoleProps): import("react").JSX.Element;
101
+ //# sourceMappingURL=EncounterTransferConsole.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EncounterTransferConsole.d.ts","sourceRoot":"","sources":["../src/EncounterTransferConsole.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useId, useMemo, useRef, useState } from 'react';
3
+ const icons = {
4
+ scan: _jsxs(_Fragment, { children: [_jsx("path", { d: "M4 8V5a1 1 0 0 1 1-1h3M16 4h3a1 1 0 0 1 1 1v3M20 16v3a1 1 0 0 1-1 1h-3M8 20H5a1 1 0 0 1-1-1v-3" }), _jsx("path", { d: "M8 8h3v3H8zM14 8h2v2M8 14h2v2M13 13h3v3h-3z" })] }),
5
+ phone: _jsx("path", { d: "M7.2 3.8 9.4 7 8 9.1a14 14 0 0 0 6.9 6.9l2.1-1.4 3.2 2.2-.8 3a2 2 0 0 1-2.1 1.4C9.8 20.2 3.8 14.2 2.8 6.7A2 2 0 0 1 4.2 4.6z" }),
6
+ video: _jsxs(_Fragment, { children: [_jsx("rect", { x: "3", y: "6", width: "12", height: "12", rx: "2" }), _jsx("path", { d: "m15 10 6-3v10l-6-3z" })] }),
7
+ message: _jsx("path", { d: "M4 4h16v12H9l-5 4z" }),
8
+ chevron: _jsx("path", { d: "m9 5 7 7-7 7" }),
9
+ };
10
+ function Icon({ name }) {
11
+ return _jsx("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", children: icons[name] });
12
+ }
13
+ /**
14
+ * Shared visual editor for one already-authorized subject transfer.
15
+ *
16
+ * Selection and demo state never grant access. The host must resolve the
17
+ * subject, contacts, department sender, HealthcareService and write
18
+ * capability in its BFF. `onApplyTransfer` reports only the requested source
19
+ * outcome; the provider commits authoritative Encounter changes before any
20
+ * completed Communication projects the result to the subject index.
21
+ */
22
+ export function EncounterTransferConsole({ copy, patientDisplay, encounters, sourceEncounterId, destinationEncounterId, contacts, demo = false, legacyTools = false, readOnly = false, destinationPreview, onApplyTransfer }) {
23
+ const [sourceOutcome, setSourceOutcome] = useState('on-hold');
24
+ const [selectedContact, setSelectedContact] = useState(contacts[0]?.identifier);
25
+ const [messageOpen, setMessageOpen] = useState(false);
26
+ const [messageMode, setMessageMode] = useState('text');
27
+ const [attachments, setAttachments] = useState([]);
28
+ const [showTechnical, setShowTechnical] = useState(false);
29
+ const [status, setStatus] = useState('');
30
+ const [transferSync, setTransferSync] = useState('idle');
31
+ const railRef = useRef(null);
32
+ const source = useMemo(() => encounters.find((item) => item.identifier === sourceEncounterId), [encounters, sourceEncounterId]);
33
+ const destination = useMemo(() => encounters.find((item) => item.identifier === destinationEncounterId), [encounters, destinationEncounterId]);
34
+ const history = useMemo(() => encounters.filter((item) => item.identifier !== sourceEncounterId && item.identifier !== destinationEncounterId), [encounters, sourceEncounterId, destinationEncounterId]);
35
+ const contact = contacts.find((item) => item.identifier === selectedContact) ?? contacts[0];
36
+ const helpId = useId();
37
+ function toggleAttachment(kind) {
38
+ setAttachments(current => current.includes(kind) ? current.filter(item => item !== kind) : [...current, kind]);
39
+ setStatus(copy.attachmentReady);
40
+ }
41
+ async function applyTransfer() {
42
+ if (readOnly || !onApplyTransfer)
43
+ return;
44
+ setTransferSync('submitting');
45
+ try {
46
+ const outcome = await onApplyTransfer?.(sourceOutcome);
47
+ if (!outcome && !legacyTools) {
48
+ setTransferSync('retryable');
49
+ setStatus(copy.transferPending);
50
+ return;
51
+ }
52
+ if (outcome?.state === 'pending' || outcome?.state === 'retryable') {
53
+ setTransferSync('retryable');
54
+ setStatus(outcome.message || copy.transferPending);
55
+ return;
56
+ }
57
+ if (outcome?.state === 'rejected') {
58
+ setTransferSync('idle');
59
+ setStatus(outcome.message || copy.transferRejected);
60
+ return;
61
+ }
62
+ setTransferSync('idle');
63
+ setStatus(copy.transferReady);
64
+ }
65
+ catch (reason) {
66
+ setTransferSync('retryable');
67
+ setStatus(reason instanceof Error && reason.message ? reason.message : copy.transferPending);
68
+ }
69
+ }
70
+ return _jsxs("section", { className: "uhcp-transfer-console", style: legacyTools ? undefined : { gridTemplateColumns: 'minmax(0,1fr)', minHeight: 'auto' }, children: [legacyTools && _jsx("aside", { className: "uhcp-transfer-contacts", children: _jsxs("details", { open: true, children: [_jsx("summary", { children: copy.emergencyActions }), _jsx("div", { className: "uhcp-transfer-contact-list", role: "list", children: contacts.map((item) => _jsxs("button", { type: "button", role: "listitem", "aria-pressed": item.identifier === contact?.identifier, onClick: () => setSelectedContact(item.identifier), children: [_jsx("span", { "aria-hidden": "true", children: item.name.split(/\s+/).map(part => part[0]).slice(0, 2).join('') }), _jsx("strong", { children: item.name }), _jsxs("small", { children: [item.relationship, item.phone ? ` · ${item.phone}` : ''] })] }, item.identifier)) }), _jsxs("div", { className: "uhcp-transfer-contact-actions", children: [_jsxs("button", { type: "button", onClick: () => setStatus(copy.callReady), children: [_jsx(Icon, { name: "phone" }), copy.call] }), _jsxs("button", { type: "button", onClick: () => setStatus(copy.videoReady), children: [_jsx(Icon, { name: "video" }), copy.videoCall] }), _jsxs("button", { type: "button", "aria-pressed": messageOpen, onClick: () => setMessageOpen(value => !value), children: [_jsx(Icon, { name: "message" }), copy.sendMessage] })] }), messageOpen && contact ? _jsxs("form", { className: "uhcp-transfer-composer", onSubmit: (event) => { event.preventDefault(); setStatus(copy.messageReady); }, children: [_jsxs("h3", { children: [copy.sendMessage, ": ", contact.name] }), _jsxs("div", { className: "uhcp-transfer-mode", role: "group", "aria-label": copy.sendMessage, children: [_jsx("button", { type: "button", "aria-pressed": messageMode === 'text', onClick: () => setMessageMode('text'), children: copy.text }), _jsx("button", { type: "button", "aria-pressed": messageMode === 'audio', onClick: () => setMessageMode('audio'), children: copy.audio })] }), messageMode === 'text' ? _jsxs("label", { children: [copy.messageLabel, _jsx("textarea", { rows: 5 })] }) : _jsxs("button", { className: "uhcp-transfer-record", type: "button", children: ["\u25CF ", copy.audio] }), _jsxs("fieldset", { children: [_jsx("legend", { children: copy.attach }), _jsxs("div", { children: [_jsx("button", { type: "button", "aria-pressed": attachments.includes('pdf'), onClick: () => toggleAttachment('pdf'), children: copy.pdf }), _jsx("button", { type: "button", "aria-pressed": attachments.includes('fhir'), onClick: () => toggleAttachment('fhir'), children: copy.fhirBundle }), _jsx("button", { type: "button", "aria-pressed": attachments.includes('calendar'), onClick: () => toggleAttachment('calendar'), children: copy.calendar })] })] }), _jsx("button", { className: "uhcp-transfer-primary", type: "submit", children: copy.send })] }) : null] }) }), _jsxs("div", { className: "uhcp-transfer-main", children: [legacyTools && _jsxs("header", { className: "uhcp-transfer-patient", children: [_jsx("h2", { children: copy.patientSearchTitle }), _jsxs("div", { children: [_jsxs("button", { type: "button", onClick: () => setStatus(copy.patientReady), children: [_jsx(Icon, { name: "scan" }), copy.scanQr] }), _jsx("span", { "aria-hidden": "true" }), _jsxs("label", { children: [copy.patientId, _jsx("input", { defaultValue: patientDisplay })] }), _jsx("button", { type: "button", onClick: () => setStatus(copy.patientReady), children: copy.search })] })] }), _jsxs("section", { className: "uhcp-transfer-journey", role: "region", "aria-label": copy.journeyTitle, "aria-describedby": readOnly ? undefined : helpId, children: [_jsxs("header", { children: [_jsx("h2", { children: copy.journeyTitle }), _jsxs("div", { children: [_jsx("button", { type: "button", "aria-label": "Anterior", onClick: () => railRef.current?.scrollBy({ left: -260, behavior: 'smooth' }), children: _jsx(Icon, { name: "chevron" }) }), _jsx("button", { type: "button", "aria-label": "Siguiente", onClick: () => railRef.current?.scrollBy({ left: 260, behavior: 'smooth' }), children: _jsx(Icon, { name: "chevron" }) })] })] }), _jsxs("div", { className: "uhcp-transfer-rail", ref: railRef, children: [history.map((item) => _jsx(EncounterCard, { encounter: item }, item.identifier)), source ? _jsxs("article", { className: "uhcp-transfer-card uhcp-transfer-source", children: [_jsx("h3", { children: copy.sourceTitle }), _jsx(EncounterCardBody, { encounter: source, ...(legacyTools ? { identifierLabel: copy.encounterIdentifier } : {}) }), !readOnly && _jsxs("fieldset", { children: [_jsx("legend", { children: copy.helpTitle }), _jsxs("label", { children: [_jsx("input", { type: "radio", name: "source-outcome", checked: sourceOutcome === 'on-hold', onChange: () => setSourceOutcome('on-hold') }), _jsxs("span", { children: [_jsx("strong", { children: copy.returning }), _jsx("small", { children: copy.returningHint })] })] }), _jsxs("label", { children: [_jsx("input", { type: "radio", name: "source-outcome", checked: sourceOutcome === 'completed', onChange: () => setSourceOutcome('completed') }), _jsxs("span", { children: [_jsx("strong", { children: copy.notReturning }), _jsx("small", { children: copy.notReturningHint })] })] })] })] }) : null, (destination || destinationPreview) && _jsxs("div", { className: "uhcp-transfer-arrow", children: [_jsx("span", { children: copy.transferTo }), _jsx("i", {}), _jsx(Icon, { name: "chevron" })] }), destination ? _jsxs("article", { className: "uhcp-transfer-card uhcp-transfer-destination", children: [_jsx("h3", { children: copy.destinationTitle }), _jsx(EncounterCardBody, { encounter: destination, ...(legacyTools ? { identifierLabel: copy.encounterIdentifier } : {}) })] }) : destinationPreview ? _jsxs("article", { className: "uhcp-transfer-card uhcp-transfer-destination", children: [_jsx("h3", { children: copy.destinationTitle }), _jsx("strong", { children: destinationPreview.serviceLabel }), _jsx("p", { children: destinationPreview.locationLabel })] }) : null] }), !readOnly && _jsxs("details", { className: "uhcp-transfer-help", open: true, children: [_jsx("summary", { id: helpId, children: copy.helpTitle }), _jsx("p", { children: copy.helpBody })] }), !readOnly && _jsxs("div", { className: "uhcp-transfer-controls", children: [legacyTools && _jsx("button", { type: "button", onClick: () => { setShowTechnical(true); setStatus(copy.reviewReady); }, children: copy.reviewChanges }), _jsx("button", { className: "uhcp-transfer-primary", type: "button", disabled: !onApplyTransfer || transferSync === 'submitting', onClick: () => void applyTransfer(), children: transferSync === 'retryable' ? copy.retryTransfer : copy.applyTransfer })] })] }), legacyTools && _jsxs("section", { className: "uhcp-transfer-review", children: [_jsxs("header", { children: [_jsx("h2", { children: copy.resourceSummary }), demo ? _jsx("p", { children: copy.demoWarning }) : null] }), _jsx("ol", { "aria-label": copy.resourceSummary, children: [[copy.sourceUpdate, 'Encounter'], [copy.sourceHistory, 'EncounterHistory'], [copy.destinationUpdate, 'Encounter'], [copy.destinationHistory, 'EncounterHistory'], [copy.indexProjection, 'Communication']].map(([label, resource], index) => _jsxs("li", { children: [_jsx("span", { children: index + 1 }), _jsx("strong", { children: label }), _jsxs("details", { open: showTechnical, children: [_jsx("summary", { children: copy.technicalDetails }), _jsx("code", { children: resource })] })] }, `${resource}-${index}`)) })] }), status ? _jsx("p", { className: "uhcp-transfer-status", role: "status", children: status }) : null] })] });
71
+ }
72
+ function EncounterCard({ encounter }) {
73
+ return _jsx("article", { className: "uhcp-transfer-card", children: _jsx(EncounterCardBody, { encounter: encounter }) });
74
+ }
75
+ function EncounterCardBody({ encounter, identifierLabel }) {
76
+ return _jsxs("div", { className: "uhcp-transfer-card-body", children: [_jsx("time", { children: encounter.arrivedAt }), _jsx("strong", { children: encounter.serviceLabel }), encounter.locationLabel ? _jsx("span", { children: encounter.locationLabel }) : null, _jsx("small", { "data-status": encounter.status, children: encounter.status }), (identifierLabel || encounter.displayIdentifier) && _jsx("code", { "aria-label": identifierLabel, children: encounter.displayIdentifier ?? encounter.identifier })] });
77
+ }
78
+ //# sourceMappingURL=EncounterTransferConsole.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EncounterTransferConsole.js","sourceRoot":"","sources":["../src/EncounterTransferConsole.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ .uhcp-transfer-console { background:var(--uhcp-surface,#fff); color:var(--uhcp-text,#102754); display:grid; font-family:Inter,ui-sans-serif,system-ui,sans-serif; grid-template-columns:minmax(16rem,23rem) minmax(0,1fr); min-height:calc(100vh - 4.5rem); }
2
+ .uhcp-transfer-console button,.uhcp-transfer-console input,.uhcp-transfer-console textarea { font:inherit; }
3
+ .uhcp-transfer-console svg { fill:none; height:1.25rem; stroke:currentColor; stroke-linecap:round; stroke-linejoin:round; stroke-width:1.8; width:1.25rem; }
4
+ .uhcp-transfer-contacts { border-inline-end:1px solid #dce5ec; padding:1.2rem; }
5
+ .uhcp-transfer-contacts summary { cursor:pointer; font-size:1.05rem; font-weight:850; list-style-position:inside; padding:.35rem 0 1rem; }
6
+ .uhcp-transfer-contact-list { border-block:1px solid #e2e9ef; display:grid; padding:.45rem 0; }
7
+ .uhcp-transfer-contact-list button { background:transparent; border:0; border-inline-start:3px solid transparent; color:inherit; cursor:pointer; display:grid; gap:.15rem; grid-template-columns:2.7rem 1fr; padding:.75rem; text-align:start; }
8
+ .uhcp-transfer-contact-list button[aria-pressed=true] { background:var(--uhcp-surface-muted,#eaf8fd); border-inline-start-color:var(--uhcp-text,#09a9dc); }
9
+ .uhcp-transfer-contact-list button>span { align-items:center; background:var(--uhcp-surface-muted,#d7e7f1); border-radius:50%; display:flex; font-weight:800; grid-row:span 2; height:2.4rem; justify-content:center; width:2.4rem; }
10
+ .uhcp-transfer-contact-list small { color:var(--uhcp-text,#58708e); }
11
+ .uhcp-transfer-contact-actions { display:grid; gap:.55rem; padding:1rem 0; }
12
+ .uhcp-transfer-contact-actions button,.uhcp-transfer-mode button,.uhcp-transfer-composer fieldset button { align-items:center; background:var(--uhcp-surface,#fff); border:1px solid #cad7e2; border-radius:.55rem; color:inherit; cursor:pointer; display:flex; gap:.7rem; padding:.7rem .85rem; }
13
+ .uhcp-transfer-contact-actions button[aria-pressed=true],.uhcp-transfer-mode button[aria-pressed=true] { background:var(--uhcp-surface-muted,#eaf8fd); border-color:var(--uhcp-text,#09a9dc); color:var(--uhcp-text,#006f96); font-weight:800; }
14
+ .uhcp-transfer-composer fieldset button[aria-pressed=true] { background:var(--uhcp-surface-muted,#eaf8fd); border-color:var(--uhcp-text,#09a9dc); color:var(--uhcp-text,#006f96); font-weight:800; }
15
+ .uhcp-transfer-composer { display:grid; gap:.8rem; }
16
+ .uhcp-transfer-composer h3 { font-size:.95rem; margin:.2rem 0 0; }
17
+ .uhcp-transfer-mode { display:grid; grid-template-columns:1fr 1fr; }
18
+ .uhcp-transfer-mode button { justify-content:center; }
19
+ .uhcp-transfer-composer label { display:grid; font-size:.82rem; font-weight:750; gap:.35rem; }
20
+ .uhcp-transfer-composer textarea { border:1px solid #cad7e2; border-radius:.55rem; color:inherit; resize:vertical; padding:.75rem; }
21
+ .uhcp-transfer-composer fieldset { border:0; margin:0; padding:0; }
22
+ .uhcp-transfer-composer legend { font-size:.82rem; font-weight:750; margin-bottom:.4rem; }
23
+ .uhcp-transfer-composer fieldset>div { display:flex; flex-wrap:wrap; gap:.4rem; }
24
+ .uhcp-transfer-record { background:var(--uhcp-surface,#fff); border:1px dashed #09a9dc; border-radius:.55rem; color:var(--uhcp-text,#006f96); padding:1rem; }
25
+ .uhcp-transfer-primary { background:#0796a8!important; border-color:#0796a8!important; color:#fff!important; font-weight:850!important; }
26
+ .uhcp-transfer-main { min-width:0; padding:1rem; }
27
+ .uhcp-transfer-patient,.uhcp-transfer-journey,.uhcp-transfer-review { border:1px solid #dce5ec; border-radius:.7rem; box-shadow:0 4px 16px rgb(16 39 84 / 5%); }
28
+ .uhcp-transfer-patient { padding:1rem; }
29
+ .uhcp-transfer-patient h2,.uhcp-transfer-journey h2,.uhcp-transfer-review h2 { font-size:1.18rem; margin:0; }
30
+ .uhcp-transfer-patient>div { align-items:center; display:grid; gap:.75rem; grid-template-columns:minmax(11rem,.85fr) 1px minmax(13rem,1fr) auto; margin-top:.75rem; }
31
+ .uhcp-transfer-patient button,.uhcp-transfer-patient label { align-items:center; background:var(--uhcp-surface,#fff); border:1px solid #9fb3c8; border-radius:.45rem; display:flex; gap:.65rem; min-height:3rem; padding:.7rem .9rem; }
32
+ .uhcp-transfer-patient button { color:inherit; cursor:pointer; font-weight:800; justify-content:center; }
33
+ .uhcp-transfer-patient button:last-child { background:var(--uhcp-surface-muted,#0796a8); border-color:var(--uhcp-text,#0796a8); color:#fff; }
34
+ .uhcp-transfer-patient>div>span { background:var(--uhcp-surface-muted,#cbd7e1); height:2rem; }
35
+ .uhcp-transfer-patient label { color:var(--uhcp-text,#64748b); }
36
+ .uhcp-transfer-patient input { border:0; color:var(--uhcp-text,#102754); min-width:0; outline:0; width:100%; }
37
+ .uhcp-transfer-journey { margin-top:.8rem; overflow:hidden; padding:1rem; }
38
+ .uhcp-transfer-journey>header,.uhcp-transfer-review>header { align-items:center; display:flex; justify-content:space-between; }
39
+ .uhcp-transfer-journey>header>div { display:flex; gap:.4rem; }
40
+ .uhcp-transfer-journey>header button { align-items:center; background:var(--uhcp-surface,#fff); border:1px solid #cad7e2; border-radius:.45rem; color:inherit; display:flex; padding:.45rem; }
41
+ .uhcp-transfer-journey>header button:first-child svg { transform:rotate(180deg); }
42
+ .uhcp-transfer-rail { align-items:center; display:flex; gap:.8rem; min-height:18rem; overflow-x:auto; padding:1rem .25rem; scrollbar-color:#aebfce #edf2f5; }
43
+ .uhcp-transfer-card { border:1px solid #cad7e2; border-radius:.5rem; flex:0 0 10rem; min-height:12rem; overflow:hidden; }
44
+ .uhcp-transfer-card h3 { background:var(--uhcp-surface-muted,#087db8); color:var(--uhcp-text,#fff); font-size:.82rem; margin:0; padding:.65rem; }
45
+ .uhcp-transfer-card-body { display:grid; gap:.45rem; padding:.85rem; }
46
+ .uhcp-transfer-card-body time,.uhcp-transfer-card-body span,.uhcp-transfer-card-body code { color:var(--uhcp-text,#60738c); font-size:.72rem; }
47
+ .uhcp-transfer-card-body small { background:var(--uhcp-surface-muted,#edf2f5); border-radius:999px; color:var(--uhcp-text,#466079); font-size:.7rem; justify-self:start; padding:.25rem .55rem; }
48
+ .uhcp-transfer-card-body small[data-status=in-progress] { background:var(--uhcp-surface-muted,#d7f4e5); color:var(--uhcp-text,#087a47); }
49
+ .uhcp-transfer-card-body small[data-status=completed] { background:var(--uhcp-surface-muted,#dff6e8); color:var(--uhcp-text,#087a47); }
50
+ .uhcp-transfer-card-body small[data-status=on-hold] { background:var(--uhcp-surface-muted,#fff1d2); color:var(--uhcp-text,#9a5a00); }
51
+ .uhcp-transfer-source { border-color:var(--uhcp-text,#078dcc); flex-basis:13.5rem; }
52
+ .uhcp-transfer-destination { border-color:var(--uhcp-text,#069f69); flex-basis:13rem; }
53
+ .uhcp-transfer-destination h3 { background:var(--uhcp-surface-muted,#069f69); }
54
+ .uhcp-transfer-source fieldset { border:0; border-top:1px solid #dce5ec; margin:.2rem .7rem .7rem; padding:.7rem 0 0; }
55
+ .uhcp-transfer-source legend { font-size:.72rem; font-weight:800; }
56
+ .uhcp-transfer-source label { align-items:start; display:flex; gap:.45rem; padding:.35rem 0; }
57
+ .uhcp-transfer-source label span { display:grid; }
58
+ .uhcp-transfer-source label small { color:var(--uhcp-text,#60738c); font-size:.68rem; }
59
+ .uhcp-transfer-arrow { align-items:center; color:var(--uhcp-text,#0796a8); display:grid; flex:0 0 5rem; grid-template-columns:1fr auto; text-align:center; }
60
+ .uhcp-transfer-arrow span { font-size:.7rem; font-weight:800; grid-column:1/-1; }
61
+ .uhcp-transfer-arrow i { background:var(--uhcp-surface-muted,#0796a8); height:2px; }
62
+ .uhcp-transfer-arrow svg { margin-left:-.45rem; }
63
+ .uhcp-transfer-help { background:var(--uhcp-surface-muted,#f4f9fc); border-radius:.5rem; padding:.65rem .8rem; }
64
+ .uhcp-transfer-help summary { cursor:pointer; font-size:.78rem; font-weight:800; }
65
+ .uhcp-transfer-help p { color:var(--uhcp-text,#51677e); font-size:.78rem; margin:.4rem 0 0; }
66
+ .uhcp-transfer-controls { display:flex; gap:.55rem; justify-content:flex-end; padding-top:.75rem; }
67
+ .uhcp-transfer-controls button { background:var(--uhcp-surface,#fff); border:1px solid #0796a8; border-radius:.45rem; color:var(--uhcp-text,#08738a); padding:.7rem 1rem; }
68
+ .uhcp-transfer-review { margin-top:.8rem; padding:1rem; }
69
+ .uhcp-transfer-review header p { background:var(--uhcp-surface-muted,#fff5dd); border:1px solid #f3ce79; border-radius:.4rem; color:var(--uhcp-text,#925800); font-size:.72rem; margin:0; padding:.5rem .7rem; }
70
+ .uhcp-transfer-review ol { list-style:none; margin:.7rem 0 0; padding:0; }
71
+ .uhcp-transfer-review li { align-items:center; border-top:1px solid #e1e8ee; display:grid; gap:.7rem; grid-template-columns:1.8rem 1fr auto; padding:.55rem; }
72
+ .uhcp-transfer-review li>span { align-items:center; background:var(--uhcp-surface-muted,#e8f6fc); border-radius:50%; color:var(--uhcp-text,#087db8); display:flex; font-size:.72rem; font-weight:900; height:1.7rem; justify-content:center; width:1.7rem; }
73
+ .uhcp-transfer-review li strong { font-size:.8rem; }
74
+ .uhcp-transfer-review details { font-size:.68rem; }
75
+ .uhcp-transfer-review summary { color:var(--uhcp-text,#60738c); cursor:pointer; }
76
+ .uhcp-transfer-status { background:var(--uhcp-surface-muted,#dff6e8); border-radius:.45rem; color:var(--uhcp-text,#087a47); font-weight:750; padding:.75rem; }
77
+ @media(max-width:900px){.uhcp-transfer-console{grid-template-columns:1fr}.uhcp-transfer-contacts{border-bottom:1px solid #dce5ec;border-inline-end:0}.uhcp-transfer-contact-actions{grid-template-columns:repeat(3,1fr)}.uhcp-transfer-patient>div{grid-template-columns:1fr}.uhcp-transfer-patient>div>span{display:none}.uhcp-transfer-review>header{align-items:flex-start;gap:.7rem;flex-direction:column}}
78
+ @media(max-width:560px){.uhcp-transfer-main{padding:.55rem}.uhcp-transfer-contact-actions{grid-template-columns:1fr}.uhcp-transfer-rail{align-items:stretch}.uhcp-transfer-review li{grid-template-columns:1.8rem 1fr}.uhcp-transfer-review li details{grid-column:2}.uhcp-transfer-controls button{flex:1}.uhcp-transfer-review header p{font-size:.65rem}}
79
+
80
+ .sos-encounter-journey { min-width:0; color:var(--uhcp-text,inherit); border:1px solid var(--uhcp-border,#dce5ec); border-radius:1rem; padding:clamp(.75rem,2vw,1.5rem); }
81
+ .sos-encounter-journey>header,.sos-encounter-journey>form,.sos-encounter-actions { display:flex; align-items:center; flex-wrap:wrap; gap:.75rem; margin-bottom:1rem; }
82
+ .sos-encounter-journey>header { justify-content:space-between; }
83
+ .sos-encounter-journey h2 { margin:0; font-size:1.25rem; }
84
+ .sos-encounter-journey label { display:grid; gap:.35rem; min-width:0; }
85
+ .sos-encounter-journey select { max-width:100%; color:inherit; background:var(--uhcp-surface,#fff); border:1px solid var(--uhcp-border,#dce5ec); border-radius:.4rem; padding:.5rem; }
86
+ .sos-encounter-journey button { cursor:pointer; border:1px solid var(--uhcp-border,#9bbfd1); border-radius:.5rem; padding:.55rem .8rem; color:inherit; background:var(--uhcp-surface-muted,#eef6fa); }
87
+ .sos-encounter-journey button:disabled { opacity:.5; cursor:not-allowed; }
88
+ .sos-encounter-journey button:focus-visible,.sos-encounter-journey select:focus-visible { outline:3px solid #1388c9; outline-offset:2px; }
89
+ .sos-encounter-journey time,.sos-encounter-journey code { overflow-wrap:anywhere; }
90
+ .sos-encounter-journey [role=alert] { color:var(--uhcp-danger,#b42318); }
91
+ .sos-encounter-journey [role=status] { color:var(--uhcp-success,#087a47); }
package/dist/index.d.ts CHANGED
@@ -5,4 +5,6 @@ export * from './LiveKitRealtimeCallClient.js';
5
5
  export * from './EmergencyContactCardDirectory.js';
6
6
  export * from './PushNotificationRegistration.js';
7
7
  export * from './useRealtimeCallSessionLifecycle.js';
8
+ export * from './EncounterTransferConsole.js';
9
+ export * from './EncounterJourneyPanel.js';
8
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAA;AAC5C,cAAc,kCAAkC,CAAA;AAChD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,oCAAoC,CAAA;AAClD,cAAc,mCAAmC,CAAA;AACjD,cAAc,sCAAsC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAA;AAC5C,cAAc,kCAAkC,CAAA;AAChD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,oCAAoC,CAAA;AAClD,cAAc,mCAAmC,CAAA;AACjD,cAAc,sCAAsC,CAAA;AACpD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,4BAA4B,CAAA"}
package/dist/index.js CHANGED
@@ -5,4 +5,6 @@ export * from './LiveKitRealtimeCallClient.js';
5
5
  export * from './EmergencyContactCardDirectory.js';
6
6
  export * from './PushNotificationRegistration.js';
7
7
  export * from './useRealtimeCallSessionLifecycle.js';
8
+ export * from './EncounterTransferConsole.js';
9
+ export * from './EncounterJourneyPanel.js';
8
10
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAA;AAC5C,cAAc,kCAAkC,CAAA;AAChD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,oCAAoC,CAAA;AAClD,cAAc,mCAAmC,CAAA;AACjD,cAAc,sCAAsC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAA;AAC5C,cAAc,kCAAkC,CAAA;AAChD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,oCAAoC,CAAA;AAClD,cAAc,mCAAmC,CAAA;AACjD,cAAc,sCAAsC,CAAA;AACpD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,4BAA4B,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sos-portal-components-react",
3
- "version": "0.3.2",
3
+ "version": "0.3.4",
4
4
  "description": "Shared portal UI for base components",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -22,7 +22,16 @@
22
22
  "./subject-conversation-chat": {
23
23
  "types": "./dist/SubjectConversationChat.d.ts",
24
24
  "default": "./dist/SubjectConversationChat.js"
25
- }
25
+ },
26
+ "./encounter-journey": {
27
+ "types": "./dist/EncounterJourneyPanel.d.ts",
28
+ "default": "./dist/EncounterJourneyPanel.js"
29
+ },
30
+ "./encounter-transfer-console": {
31
+ "types": "./dist/EncounterTransferConsole.d.ts",
32
+ "default": "./dist/EncounterTransferConsole.js"
33
+ },
34
+ "./encounter-journey.css": "./dist/encounter-journey.css"
26
35
  },
27
36
  "files": [
28
37
  "dist",
@@ -31,7 +40,7 @@
31
40
  ],
32
41
  "scripts": {
33
42
  "clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
34
- "build": "npm run clean && tsc -p tsconfig.build.json",
43
+ "build": "npm run clean && tsc -p tsconfig.build.json && node -e \"require('node:fs').copyFileSync('src/encounter-journey.css','dist/encounter-journey.css')\"",
35
44
  "typecheck": "tsc -p tsconfig.json --noEmit",
36
45
  "test": "vitest run --maxWorkers=1",
37
46
  "check": "npm run typecheck && npm test && npm run build",
@@ -76,7 +85,8 @@
76
85
  },
77
86
  "dependencies": {
78
87
  "antifraud-portal-components-react": "0.3.0",
79
- "sos-data-utils-ts": "0.6.30"
88
+ "fhir-data-utils-ts": "0.6.24",
89
+ "sos-data-utils-ts": "0.6.34"
80
90
  },
81
91
  "devDependencies": {
82
92
  "@testing-library/react": "^16.3.2",