uhc-portal-components-react 0.1.41 → 0.1.42

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
@@ -2,6 +2,13 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.1.42 - 2026-10-07
6
+
7
+ - Add a product-neutral, JSON-Schema-driven IPS Bundle draft editor with local
8
+ add/edit/remove staging, shared terminology and speech hooks, and one explicit
9
+ final document submission boundary. Typed ResearchSubject references and
10
+ professional author/attester provenance remain host-controlled.
11
+
5
12
  ## 0.1.41 - 2026-10-05
6
13
 
7
14
  - Add one brand-neutral professional access panel shared by Partner and Test
@@ -0,0 +1,55 @@
1
+ import 'gdc-common-utils-ts/utils/allergy-intolerance-entry-editor';
2
+ import 'gdc-common-utils-ts/utils/condition-entry-editor';
3
+ import 'gdc-common-utils-ts/utils/immunization-entry-editor';
4
+ import 'gdc-common-utils-ts/utils/medication-statement-entry-editor';
5
+ import 'gdc-common-utils-ts/utils/observation-entry-editor';
6
+ import 'gdc-common-utils-ts/utils/procedure-entry-editor';
7
+ import type { MultichannelOperationSchema } from 'sos-data-utils-ts/multichannel-operation-schemas';
8
+ import { type ClinicalArtifactAuthoringContext, type ClinicalArtifactEditorCopy, type ClinicalArtifactSchema, type ClinicalTerminologySearch, type ClinicalTerminologyCandidate } from './ClinicalArtifactEditor.js';
9
+ export type ClinicalBundleDraftSchema = Readonly<{
10
+ schema: ClinicalArtifactSchema;
11
+ operationSchema: MultichannelOperationSchema;
12
+ sectionLabel: string;
13
+ artifactLabel: string;
14
+ }>;
15
+ export type ClinicalBundleDraft = Readonly<{
16
+ resourceType: 'Bundle';
17
+ type: 'document';
18
+ entry: readonly unknown[];
19
+ }>;
20
+ export type ClinicalBundleDraftSubmitOutcome = Readonly<{
21
+ state: 'confirmed' | 'pending' | 'retryable' | 'rejected';
22
+ message?: string;
23
+ }>;
24
+ export type ClinicalBundleDraftEditorCopy = Readonly<{
25
+ title: string;
26
+ description: string;
27
+ empty: string;
28
+ add: string;
29
+ edit: string;
30
+ remove: string;
31
+ submit: string;
32
+ submitting: string;
33
+ drafted: string;
34
+ editor: ClinicalArtifactEditorCopy;
35
+ }>;
36
+ export type ClinicalBundleDraftEditorProps = Readonly<{
37
+ schemas: readonly ClinicalBundleDraftSchema[];
38
+ authoringContext: ClinicalArtifactAuthoringContext;
39
+ copy: ClinicalBundleDraftEditorCopy;
40
+ locale?: string;
41
+ timeZone?: string;
42
+ taxonomyId?: string;
43
+ fieldLabel: (claim: string) => string;
44
+ searchTerminology?: (input: ClinicalTerminologySearch) => Promise<readonly ClinicalTerminologyCandidate[]>;
45
+ onSubmitDraft: (bundle: ClinicalBundleDraft) => Promise<ClinicalBundleDraftSubmitOutcome>;
46
+ }>;
47
+ /**
48
+ * Shared local-first IPS authoring workspace.
49
+ *
50
+ * The component stages schema-validated claims-first operations in one Bundle.
51
+ * It owns no authorization or persistence: the host supplies subject and
52
+ * provenance and only `onSubmitDraft` may cross a persistence boundary.
53
+ */
54
+ export declare function ClinicalBundleDraftEditor({ schemas, authoringContext, copy, locale, timeZone, taxonomyId, fieldLabel, searchTerminology, onSubmitDraft, }: ClinicalBundleDraftEditorProps): import("react").JSX.Element;
55
+ //# sourceMappingURL=ClinicalBundleDraftEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClinicalBundleDraftEditor.d.ts","sourceRoot":"","sources":["../src/ClinicalBundleDraftEditor.tsx"],"names":[],"mappings":"AAOA,OAAO,4DAA4D,CAAA;AACnE,OAAO,kDAAkD,CAAA;AACzD,OAAO,qDAAqD,CAAA;AAC5D,OAAO,6DAA6D,CAAA;AACpE,OAAO,oDAAoD,CAAA;AAC3D,OAAO,kDAAkD,CAAA;AACzD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,kDAAkD,CAAA;AACnG,OAAO,EAEL,KAAK,gCAAgC,EAErC,KAAK,0BAA0B,EAE/B,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,EAC9B,KAAK,4BAA4B,EAClC,MAAM,6BAA6B,CAAA;AAGpC,MAAM,MAAM,yBAAyB,GAAG,QAAQ,CAAC;IAC/C,MAAM,EAAE,sBAAsB,CAAA;IAC9B,eAAe,EAAE,2BAA2B,CAAA;IAC5C,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;CACtB,CAAC,CAAA;AAEF,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC,YAAY,EAAE,QAAQ,CAAA;IACtB,IAAI,EAAE,UAAU,CAAA;IAChB,KAAK,EAAE,SAAS,OAAO,EAAE,CAAA;CAC1B,CAAC,CAAA;AAEF,MAAM,MAAM,gCAAgC,GAAG,QAAQ,CAAC;IACtD,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,CAAA;IACzD,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAC,CAAA;AAEF,MAAM,MAAM,6BAA6B,GAAG,QAAQ,CAAC;IACnD,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,0BAA0B,CAAA;CACnC,CAAC,CAAA;AAEF,MAAM,MAAM,8BAA8B,GAAG,QAAQ,CAAC;IACpD,OAAO,EAAE,SAAS,yBAAyB,EAAE,CAAA;IAC7C,gBAAgB,EAAE,gCAAgC,CAAA;IAClD,IAAI,EAAE,6BAA6B,CAAA;IACnC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IACrC,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,OAAO,CAAC,SAAS,4BAA4B,EAAE,CAAC,CAAA;IAC1G,aAAa,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,OAAO,CAAC,gCAAgC,CAAC,CAAA;CAC1F,CAAC,CAAA;AAYF;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,EACxC,OAAO,EACP,gBAAgB,EAChB,IAAI,EACJ,MAAa,EACb,QAAQ,EACR,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,aAAa,GACd,EAAE,8BAA8B,+BAuFhC"}
@@ -0,0 +1,138 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useMemo, useState } from 'react';
4
+ import { BundleEditor } from 'gdc-common-utils-ts/utils/bundle-editor-core';
5
+ import { BundleTypes } from 'gdc-common-utils-ts/models/bundle-editor-types';
6
+ import { HealthcareDocumentTypes } from 'gdc-common-utils-ts/constants/healthcare';
7
+ import { ClinicalResourceEntryEditor } from 'gdc-common-utils-ts/utils/clinical-resource-entry-editor';
8
+ import 'gdc-common-utils-ts/utils/allergy-intolerance-entry-editor';
9
+ import 'gdc-common-utils-ts/utils/condition-entry-editor';
10
+ import 'gdc-common-utils-ts/utils/immunization-entry-editor';
11
+ import 'gdc-common-utils-ts/utils/medication-statement-entry-editor';
12
+ import 'gdc-common-utils-ts/utils/observation-entry-editor';
13
+ import 'gdc-common-utils-ts/utils/procedure-entry-editor';
14
+ import { ClinicalArtifactEditor, } from './ClinicalArtifactEditor.js';
15
+ import { ClinicalActionButton } from './ClinicalActionButton.js';
16
+ /**
17
+ * Shared local-first IPS authoring workspace.
18
+ *
19
+ * The component stages schema-validated claims-first operations in one Bundle.
20
+ * It owns no authorization or persistence: the host supplies subject and
21
+ * provenance and only `onSubmitDraft` may cross a persistence boundary.
22
+ */
23
+ export function ClinicalBundleDraftEditor({ schemas, authoringContext, copy, locale = 'en', timeZone, taxonomyId, fieldLabel, searchTerminology, onSubmitDraft, }) {
24
+ const [artifacts, setArtifacts] = useState([]);
25
+ const [editor, setEditor] = useState();
26
+ const [notice, setNotice] = useState('');
27
+ const [error, setError] = useState('');
28
+ const [submitting, setSubmitting] = useState(false);
29
+ const sections = useMemo(() => groupSchemas(schemas), [schemas]);
30
+ function stageArtifact(draft) {
31
+ if (!editor)
32
+ throw new TypeError('clinical_bundle_draft_editor_schema_required');
33
+ setArtifacts((current) => {
34
+ const next = current.filter((candidate) => candidate.draft.id !== draft.id);
35
+ return [...next, { schema: editor.schema, draft }];
36
+ });
37
+ setNotice(copy.drafted);
38
+ return { resourceType: 'Bundle', type: 'batch', data: [] };
39
+ }
40
+ async function submitDraft() {
41
+ if (artifacts.length === 0 || submitting)
42
+ return;
43
+ setSubmitting(true);
44
+ setError('');
45
+ try {
46
+ const outcome = await onSubmitDraft(combineDrafts(artifacts, authoringContext, copy.title));
47
+ if (outcome.state === 'confirmed') {
48
+ setArtifacts([]);
49
+ setNotice(outcome.message || '');
50
+ }
51
+ else if (outcome.state === 'rejected') {
52
+ setError(outcome.message || copy.editor.readbackMissing);
53
+ }
54
+ else {
55
+ setNotice(outcome.message || copy.editor.pending || copy.editor.readbackMissing);
56
+ }
57
+ }
58
+ catch (reason) {
59
+ setError(reason instanceof Error ? reason.message : String(reason));
60
+ }
61
+ finally {
62
+ setSubmitting(false);
63
+ }
64
+ }
65
+ return _jsxs("section", { className: "uhcp-clinical-bundle-draft", "data-clinical-bundle-draft": true, children: [_jsxs("header", { children: [_jsx("h2", { children: copy.title }), _jsx("p", { children: copy.description })] }), notice ? _jsx("p", { role: "status", children: notice }) : null, error ? _jsx("p", { role: "alert", className: "uhcp-clinical-editor-error", children: error }) : null, sections.map(({ label, schemas: sectionSchemas }) => {
66
+ const sectionArtifacts = artifacts.filter((artifact) => artifact.schema.sectionLabel === label);
67
+ return _jsxs("details", { open: true, children: [_jsxs("summary", { children: [label, " (", sectionArtifacts.length, ")"] }), _jsx("div", { className: "uhcp-clinical-bundle-draft-add", children: sectionSchemas.map((candidate) => _jsx(ClinicalActionButton, { kind: "add", label: `${copy.add} ${candidate.artifactLabel}`, onClick: () => setEditor({ schema: candidate }) }, schemaKey(candidate))) }), sectionArtifacts.length === 0 ? _jsx("p", { children: copy.empty }) : _jsx("ul", { children: sectionArtifacts.map((artifact) => {
68
+ const title = artifactTitle(artifact.draft);
69
+ return _jsxs("li", { children: [_jsxs("span", { children: [_jsx("strong", { children: title }), _jsx("small", { children: artifact.draft.resourceType })] }), _jsxs("span", { children: [_jsx(ClinicalActionButton, { kind: "edit", label: `${copy.edit} ${title}`, onClick: () => setEditor({ schema: artifact.schema, draft: artifact.draft }) }), _jsx(ClinicalActionButton, { kind: "delete", label: `${copy.remove} ${title}`, onClick: () => setArtifacts((current) => current.filter((candidate) => candidate.draft.id !== artifact.draft.id)) })] })] }, artifact.draft.id);
70
+ }) })] }, label);
71
+ }), artifacts.length === 0 && sections.length === 0 ? _jsx("p", { children: copy.empty }) : null, _jsx("footer", { children: _jsx("button", { type: "button", disabled: artifacts.length === 0 || submitting, onClick: () => void submitDraft(), children: submitting ? copy.submitting : copy.submit }) }), editor ? _jsx(ClinicalArtifactEditor, { request: editorRequest(editor), schema: editor.schema.schema, operationSchema: editor.schema.operationSchema, authoringContext: authoringContext, copy: copy.editor, locale: locale, timeZone: timeZone, taxonomyId: taxonomyId, fieldLabel: fieldLabel, searchTerminology: searchTerminology, saveArtifact: async (draft) => stageArtifact(draft), onCancel: () => setEditor(undefined), onReadback: () => setEditor(undefined) }) : null] });
72
+ }
73
+ function editorRequest(editor) {
74
+ return {
75
+ resourceType: editor.schema.schema.resourceType,
76
+ sectionCode: editor.schema.schema.sectionCode ?? '',
77
+ mode: 'create',
78
+ ...(editor.draft ? { artifactId: editor.draft.id, initialClaims: editor.draft.claims } : { initialClaims: editor.schema.schema.initialClaims }),
79
+ };
80
+ }
81
+ function combineDrafts(artifacts, authoringContext, documentTitle) {
82
+ const editor = new BundleEditor()
83
+ .setBundleType(BundleTypes.document)
84
+ .setCompositionSubject(authoringContext.subjectReference)
85
+ .setCompositionType(HealthcareDocumentTypes.IPS.attributeValue)
86
+ .setCompositionTitle(documentTitle)
87
+ .setCompositionDate(authoringContext.createdAt)
88
+ .setCompositionAuthorList([authoringContext.dataAuthorReference]);
89
+ if (authoringContext.attestationState === 'confirmed') {
90
+ if (!authoringContext.attesterReference || !authoringContext.attesterMode || !authoringContext.attestedAt) {
91
+ throw new TypeError('clinical_bundle_draft_attester_required');
92
+ }
93
+ editor.setCompositionAttesterList([{
94
+ reference: authoringContext.attesterReference,
95
+ mode: authoringContext.attesterMode,
96
+ time: authoringContext.attestedAt,
97
+ }]);
98
+ }
99
+ for (const { draft } of artifacts) {
100
+ const entry = editor.newEntryAs(draft.resourceType, draft.id);
101
+ for (const [claim, value] of Object.entries(operationClaims(draft)))
102
+ entry.setClaim(claim, value);
103
+ if (!(entry instanceof ClinicalResourceEntryEditor)) {
104
+ throw new TypeError(`clinical_bundle_draft_resource_unsupported:${draft.resourceType}`);
105
+ }
106
+ entry.setSectionList([draft.sectionCode]);
107
+ }
108
+ return editor.buildDocument();
109
+ }
110
+ function operationClaims(draft) {
111
+ const entries = draft.changesBundle?.data ?? draft.changesBundle?.entry ?? [];
112
+ const first = entries[0];
113
+ if (!first || typeof first !== 'object' || !('resource' in first)) {
114
+ throw new TypeError('clinical_bundle_draft_operation_entry_required');
115
+ }
116
+ const resource = first.resource;
117
+ if (!resource || typeof resource !== 'object' || !('meta' in resource)) {
118
+ throw new TypeError('clinical_bundle_draft_operation_claims_required');
119
+ }
120
+ const meta = resource.meta;
121
+ if (!meta || typeof meta !== 'object' || !('claims' in meta) || !meta.claims || typeof meta.claims !== 'object') {
122
+ throw new TypeError('clinical_bundle_draft_operation_claims_required');
123
+ }
124
+ return meta.claims;
125
+ }
126
+ function groupSchemas(schemas) {
127
+ const sections = new Map();
128
+ for (const schema of schemas)
129
+ sections.set(schema.sectionLabel, [...(sections.get(schema.sectionLabel) ?? []), schema]);
130
+ return [...sections].map(([label, grouped]) => ({ label, schemas: grouped }));
131
+ }
132
+ function schemaKey(schema) {
133
+ return `${schema.schema.sectionCode ?? ''}:${schema.operationSchema['x-operation-id']}`;
134
+ }
135
+ function artifactTitle(draft) {
136
+ const preferred = Object.entries(draft.claims).find(([claim, value]) => typeof value === 'string' && value.trim() && (claim.endsWith('-text') || claim.endsWith('.note') || claim.endsWith('.description')))?.[1];
137
+ return typeof preferred === 'string' ? preferred : draft.resourceType;
138
+ }
package/dist/index.d.ts CHANGED
@@ -13,6 +13,7 @@ export * from './ClinicalDocumentEncounterExplorer.js';
13
13
  export * from './AllClinicalSections.js';
14
14
  export * from './ClinicalTimeline.js';
15
15
  export * from './ClinicalArtifactEditor.js';
16
+ export * from './ClinicalBundleDraftEditor.js';
16
17
  export * from './ClinicalSpeechInput.js';
17
18
  export * from './BrowserClinicalSpeechInput.js';
18
19
  export * from './ClinicalActionButton.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,yBAAyB,CAAA;AACvC,cAAc,mBAAmB,CAAA;AACjC,cAAc,2BAA2B,CAAA;AACzC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,6BAA6B,CAAA;AAC3C,cAAc,uBAAuB,CAAA;AACrC,cAAc,wCAAwC,CAAA;AACtD,cAAc,0BAA0B,CAAA;AACxC,cAAc,uBAAuB,CAAA;AACrC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,0BAA0B,CAAA;AACxC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,2BAA2B,CAAA;AACzC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,wBAAwB,CAAA;AACtC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,0CAA0C,CAAA;AACxD,cAAc,kCAAkC,CAAA;AAChD,cAAc,0BAA0B,CAAA;AACxC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,oCAAoC,CAAA;AAClD,cAAc,sCAAsC,CAAA;AACpD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,uCAAuC,CAAA;AACrD,cAAc,uBAAuB,CAAA;AACrC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,8BAA8B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,yBAAyB,CAAA;AACvC,cAAc,mBAAmB,CAAA;AACjC,cAAc,2BAA2B,CAAA;AACzC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,6BAA6B,CAAA;AAC3C,cAAc,uBAAuB,CAAA;AACrC,cAAc,wCAAwC,CAAA;AACtD,cAAc,0BAA0B,CAAA;AACxC,cAAc,uBAAuB,CAAA;AACrC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,0BAA0B,CAAA;AACxC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,2BAA2B,CAAA;AACzC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,wBAAwB,CAAA;AACtC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,0CAA0C,CAAA;AACxD,cAAc,kCAAkC,CAAA;AAChD,cAAc,0BAA0B,CAAA;AACxC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,oCAAoC,CAAA;AAClD,cAAc,sCAAsC,CAAA;AACpD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,uCAAuC,CAAA;AACrD,cAAc,uBAAuB,CAAA;AACrC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,8BAA8B,CAAA"}
package/dist/index.js CHANGED
@@ -13,6 +13,7 @@ export * from './ClinicalDocumentEncounterExplorer.js';
13
13
  export * from './AllClinicalSections.js';
14
14
  export * from './ClinicalTimeline.js';
15
15
  export * from './ClinicalArtifactEditor.js';
16
+ export * from './ClinicalBundleDraftEditor.js';
16
17
  export * from './ClinicalSpeechInput.js';
17
18
  export * from './BrowserClinicalSpeechInput.js';
18
19
  export * from './ClinicalActionButton.js';
package/dist/styles.css CHANGED
@@ -464,6 +464,21 @@ html[data-theme='dark'] .uhcp-brand-artwork-dark { display: block !important; }
464
464
  .uhcp-clinical-icon-action:disabled { cursor:not-allowed; opacity:.42; }
465
465
  .uhcp-clinical-icon-action svg { fill:none; height:1.2rem; stroke:currentColor; stroke-linecap:round; stroke-linejoin:round; stroke-width:1.8; width:1.2rem; }
466
466
  .uhcp-clinical-icon-action-delete:hover { border-color:var(--uhcp-attention); color:var(--uhcp-attention); }
467
+ .uhcp-clinical-bundle-draft { background:var(--uhcp-panel); border:1px solid var(--uhcp-border); border-radius:1.5rem; color:var(--uhcp-text); display:grid; gap:1rem; padding:1.25rem; }
468
+ .uhcp-clinical-bundle-draft>header h2,.uhcp-clinical-bundle-draft>header p { margin:.15rem 0; }
469
+ .uhcp-clinical-bundle-draft>header p,.uhcp-clinical-bundle-draft details>p { color:var(--uhcp-muted); }
470
+ .uhcp-clinical-bundle-draft details { background:var(--uhcp-panel-muted); border:1px solid var(--uhcp-border); border-radius:1rem; padding:.85rem 1rem; }
471
+ .uhcp-clinical-bundle-draft summary { cursor:pointer; font-weight:800; }
472
+ .uhcp-clinical-bundle-draft-add { display:flex; flex-wrap:wrap; gap:.5rem; margin-top:.8rem; }
473
+ .uhcp-clinical-bundle-draft ul { display:grid; gap:.55rem; list-style:none; margin:.8rem 0 0; padding:0; }
474
+ .uhcp-clinical-bundle-draft li { align-items:center; background:var(--uhcp-panel); border:1px solid var(--uhcp-border); border-radius:.8rem; display:flex; gap:1rem; justify-content:space-between; padding:.7rem; }
475
+ .uhcp-clinical-bundle-draft li>span { display:flex; gap:.45rem; }
476
+ .uhcp-clinical-bundle-draft li>span:first-child { align-items:flex-start; flex-direction:column; min-width:0; }
477
+ .uhcp-clinical-bundle-draft li strong { overflow-wrap:anywhere; }
478
+ .uhcp-clinical-bundle-draft li small { color:var(--uhcp-muted); }
479
+ .uhcp-clinical-bundle-draft>footer { display:flex; justify-content:flex-end; }
480
+ .uhcp-clinical-bundle-draft>footer button { background:linear-gradient(135deg,var(--uhcp-action-start),var(--uhcp-action-end)); border:0; border-radius:.75rem; color:#fff; cursor:pointer; font:inherit; font-weight:800; padding:.75rem 1rem; }
481
+ .uhcp-clinical-bundle-draft>footer button:disabled { cursor:not-allowed; opacity:.5; }
467
482
  .uhcp-clinical-title { font-weight: 800; margin: 0; }
468
483
  .uhcp-clinical-type { color: var(--uhcp-muted); font-size: .72rem; font-weight: 800; letter-spacing: .06em; margin: .35rem 0 0; text-transform: uppercase; }
469
484
  .uhcp-clinical-date, .uhcp-clinical-empty { color: var(--uhcp-muted); margin: .35rem 0 0; }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "uhc-portal-components-react",
3
- "version": "0.1.41",
3
+ "version": "0.1.42",
4
4
  "description": "Brand-neutral React portal shell, account preferences and protected-profile UI for UHC and VetChain portals.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",