uhc-portal-components-react 0.2.9 → 0.2.10

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,16 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.10 - 2026-10-10
4
+
5
+ - Keep animal-controller creation focused on identity and contact data: the
6
+ controller channel already owns its unlock credential, so the form no longer
7
+ asks for a second PIN or requires identity-evidence uploads at creation time.
8
+ - Let hosts require email and telephone independently, start country selection
9
+ without an implicit jurisdiction and keep optional evidence collection for a
10
+ later, explicit post-creation step.
11
+ - Improve the reusable entity editor contrast and distinguish its edit action
12
+ with an accessible icon.
13
+
3
14
  ## 0.2.9 - 2026-10-10
4
15
 
5
16
  - Add one reusable identity entity editor for animal controllers and related
@@ -17,10 +17,10 @@ export type AnimalIdentityOnboardingInput = Readonly<{
17
17
  controllerTelephone?: string;
18
18
  verificationMethod?: 'pipp' | 'sripp' | 'eid' | 'uripp';
19
19
  relationship: AnimalControllerRelationship;
20
- ownerDocument: File;
20
+ ownerDocument?: File;
21
21
  animalDocument: File;
22
- relationshipDocument: File;
23
- controllerPin: string;
22
+ relationshipDocument?: File;
23
+ controllerPin?: string;
24
24
  }>;
25
25
  export type AnimalIdentityOnboardingCopy = Readonly<{
26
26
  title: string;
@@ -48,7 +48,7 @@ export type AnimalIdentityOnboardingCopy = Readonly<{
48
48
  ownerDocument: string;
49
49
  animalDocument: string;
50
50
  relationshipDocument: string;
51
- controllerPin: string;
51
+ controllerPin?: string;
52
52
  submit: string;
53
53
  }>;
54
54
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"AnimalIdentityOnboarding.d.ts","sourceRoot":"","sources":["../src/AnimalIdentityOnboarding.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AnimalIdentityOnboarding.d.ts","sourceRoot":"","sources":["../src/AnimalIdentityOnboarding.tsx"],"names":[],"mappings":"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"}
@@ -48,7 +48,7 @@ export function SubjectIdentityCard({ subject, relationship, statusLabels, editL
48
48
  const initial = subject.displayName.trim().slice(0, 1).toUpperCase() || '•';
49
49
  return _jsxs("article", { className: "uhcp-subject-identity-card", children: [_jsxs("header", { children: [subject.imageUrl
50
50
  ? _jsx("img", { src: subject.imageUrl, alt: "" })
51
- : _jsx("span", { className: "uhcp-subject-identity-avatar", "aria-hidden": "true", children: initial }), _jsxs("div", { children: [_jsx("small", { children: subject.kind }), _jsx("h3", { children: subject.displayName })] }), canEdit && onEdit && editLabel ? _jsx("button", { type: "button", onClick: onEdit, children: editLabel }) : null] }), _jsx("dl", { children: subject.facts.map(fact => _jsxs("div", { children: [_jsx("dt", { children: fact.label }), _jsx("dd", { children: fact.value })] }, `${fact.label}:${fact.value}`)) }), relationship ? _jsxs("section", { className: "uhcp-subject-identity-relationship", children: [_jsx("span", { children: relationship.label }), _jsx("strong", { children: relationship.displayName }), _jsx("small", { className: `uhcp-identity-status uhcp-identity-status-${relationship.status}`, children: statusLabels[relationship.status] })] }) : null] });
51
+ : _jsx("span", { className: "uhcp-subject-identity-avatar", "aria-hidden": "true", children: initial }), _jsxs("div", { children: [_jsx("small", { children: subject.kind }), _jsx("h3", { children: subject.displayName })] }), canEdit && onEdit && editLabel ? _jsx("button", { className: "uhcp-subject-identity-edit", type: "button", "aria-label": editLabel, title: editLabel, onClick: onEdit, children: _jsx("span", { "aria-hidden": "true", children: "\u270E" }) }) : null] }), _jsx("dl", { children: subject.facts.map(fact => _jsxs("div", { children: [_jsx("dt", { children: fact.label }), _jsx("dd", { children: fact.value })] }, `${fact.label}:${fact.value}`)) }), relationship ? _jsxs("section", { className: "uhcp-subject-identity-relationship", children: [_jsx("span", { children: relationship.label }), _jsx("strong", { children: relationship.displayName }), _jsx("small", { className: `uhcp-identity-status uhcp-identity-status-${relationship.status}`, children: statusLabels[relationship.status] })] }) : null] });
52
52
  }
53
53
  function StepNumber({ value }) {
54
54
  return _jsx("span", { className: "uhcp-identity-step-number", "aria-hidden": "true", children: value });
@@ -21,6 +21,7 @@ export type AnimalIdentityOnboardingV2Copy = AnimalIdentityOnboardingCopy & Read
21
21
  supervisedRemote: string;
22
22
  electronicId: string;
23
23
  unsupervisedRemote: string;
24
+ countryPlaceholder?: string;
24
25
  }>;
25
26
  type SelectOption = Readonly<{
26
27
  value: string;
@@ -30,7 +31,7 @@ type SelectOption = Readonly<{
30
31
  * Progressive animal onboarding presentation. It preserves the V1 payload so
31
32
  * hosts can adopt it without changing evidence, authorization or persistence.
32
33
  */
33
- export declare function AnimalIdentityOnboardingV2({ copy, onSubmit, submitAction, speciesOptions, countryOptions, regionOptionsByCountry, identifierTypeOptions, showHeader, busy }: Readonly<{
34
+ export declare function AnimalIdentityOnboardingV2({ copy, onSubmit, submitAction, speciesOptions, countryOptions, regionOptionsByCountry, identifierTypeOptions, showHeader, requireEmail, requireTelephone, busy }: Readonly<{
34
35
  copy: AnimalIdentityOnboardingV2Copy;
35
36
  onSubmit: (input: AnimalIdentityOnboardingInput) => Promise<void> | void;
36
37
  submitAction?: string;
@@ -45,6 +46,8 @@ export declare function AnimalIdentityOnboardingV2({ copy, onSubmit, submitActio
45
46
  organization: readonly SelectOption[];
46
47
  }>;
47
48
  showHeader?: boolean;
49
+ requireEmail?: boolean;
50
+ requireTelephone?: boolean;
48
51
  busy?: boolean;
49
52
  }>): import("react").JSX.Element;
50
53
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"AnimalIdentityOnboardingV2.d.ts","sourceRoot":"","sources":["../src/AnimalIdentityOnboardingV2.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,4BAA4B,EAC5B,6BAA6B,EAC9B,MAAM,+BAA+B,CAAA;AAGtC,MAAM,MAAM,8BAA8B,GAAG,4BAA4B,GAAG,QAAQ,CAAC;IACnF,+BAA+B,EAAE,MAAM,CAAA;IACvC,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,MAAM,CAAA;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,sBAAsB,EAAE,MAAM,CAAA;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,gBAAgB,EAAE,MAAM,CAAA;IACxB,eAAe,EAAE,MAAM,CAAA;IACvB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,eAAe,EAAE,MAAM,CAAA;IACvB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,EAAE,MAAM,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,kBAAkB,EAAE,MAAM,CAAA;CAC3B,CAAC,CAAA;AAEF,KAAK,YAAY,GAAG,QAAQ,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAG9D;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAmB,EAAE,cAAmB,EAAE,sBAA2B,EAAE,qBAAqB,EAAE,UAAiB,EAAE,IAAY,EAAE,EAAE,QAAQ,CAAC;IACnN,IAAI,EAAE,8BAA8B,CAAA;IACpC,QAAQ,EAAE,CAAC,KAAK,EAAE,6BAA6B,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACxE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,cAAc,CAAC,EAAE,SAAS,QAAQ,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAA;IAC3E,cAAc,CAAC,EAAE,SAAS,YAAY,EAAE,CAAA;IACxC,sBAAsB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC,CAAC,CAAA;IAC1E,qBAAqB,CAAC,EAAE,QAAQ,CAAC;QAAE,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;QAAC,YAAY,EAAE,SAAS,YAAY,EAAE,CAAA;KAAE,CAAC,CAAA;IAC5G,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,IAAI,CAAC,EAAE,OAAO,CAAA;CACf,CAAC,+BAmID"}
1
+ {"version":3,"file":"AnimalIdentityOnboardingV2.d.ts","sourceRoot":"","sources":["../src/AnimalIdentityOnboardingV2.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,4BAA4B,EAC5B,6BAA6B,EAC9B,MAAM,+BAA+B,CAAA;AAGtC,MAAM,MAAM,8BAA8B,GAAG,4BAA4B,GAAG,QAAQ,CAAC;IACnF,+BAA+B,EAAE,MAAM,CAAA;IACvC,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,MAAM,CAAA;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,sBAAsB,EAAE,MAAM,CAAA;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,gBAAgB,EAAE,MAAM,CAAA;IACxB,eAAe,EAAE,MAAM,CAAA;IACvB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,eAAe,EAAE,MAAM,CAAA;IACvB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,EAAE,MAAM,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B,CAAC,CAAA;AAEF,KAAK,YAAY,GAAG,QAAQ,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAG9D;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAmB,EAAE,cAAmB,EAAE,sBAA2B,EAAE,qBAAqB,EAAE,UAAiB,EAAE,YAAoB,EAAE,gBAAwB,EAAE,IAAY,EAAE,EAAE,QAAQ,CAAC;IACnQ,IAAI,EAAE,8BAA8B,CAAA;IACpC,QAAQ,EAAE,CAAC,KAAK,EAAE,6BAA6B,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACxE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,cAAc,CAAC,EAAE,SAAS,QAAQ,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAA;IAC3E,cAAc,CAAC,EAAE,SAAS,YAAY,EAAE,CAAA;IACxC,sBAAsB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC,CAAC,CAAA;IAC1E,qBAAqB,CAAC,EAAE,QAAQ,CAAC;QAAE,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;QAAC,YAAY,EAAE,SAAS,YAAY,EAAE,CAAA;KAAE,CAAC,CAAA;IAC5G,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAA;CACf,CAAC,+BAiID"}
@@ -6,7 +6,7 @@ const MAX_ANIMAL_PHOTO_BYTES = 2 * 1024 * 1024;
6
6
  * Progressive animal onboarding presentation. It preserves the V1 payload so
7
7
  * hosts can adopt it without changing evidence, authorization or persistence.
8
8
  */
9
- export function AnimalIdentityOnboardingV2({ copy, onSubmit, submitAction, speciesOptions = [], countryOptions = [], regionOptionsByCountry = {}, identifierTypeOptions, showHeader = true, busy = false }) {
9
+ export function AnimalIdentityOnboardingV2({ copy, onSubmit, submitAction, speciesOptions = [], countryOptions = [], regionOptionsByCountry = {}, identifierTypeOptions, showHeader = true, requireEmail = false, requireTelephone = false, busy = false }) {
10
10
  const [submitting, setSubmitting] = useState(false);
11
11
  const [animalName, setAnimalName] = useState('');
12
12
  const [previewUrl, setPreviewUrl] = useState('');
@@ -85,12 +85,10 @@ export function AnimalIdentityOnboardingV2({ copy, onSubmit, submitAction, speci
85
85
  controllerRegion: optionalText(form, 'controllerRegion'),
86
86
  controllerEmail,
87
87
  controllerTelephone,
88
- verificationMethod: requiredText(form, 'verificationMethod'),
89
88
  relationship: requiredText(form, 'relationship'),
90
- ownerDocument: requiredFile(formElement, 'ownerDocument'),
89
+ ownerDocument: optionalFile(formElement, 'ownerDocument'),
91
90
  animalDocument: animalDocument || requiredFile(formElement, 'animalDocument'),
92
- relationshipDocument: requiredFile(formElement, 'relationshipDocument'),
93
- controllerPin: requiredText(form, 'controllerPin'),
91
+ relationshipDocument: optionalFile(formElement, 'relationshipDocument'),
94
92
  });
95
93
  }
96
94
  finally {
@@ -102,7 +100,7 @@ export function AnimalIdentityOnboardingV2({ copy, onSubmit, submitAction, speci
102
100
  ? _jsx("img", { src: previewUrl, alt: copy.animalPreview.replace('{name}', animalName || copy.animalName) })
103
101
  : _jsx("span", { "aria-hidden": "true", children: "\uFF0B" }), _jsx("input", { name: "animalDocument", type: "file", accept: "image/jpeg,image/png", required: !animalDocument, "aria-label": copy.addAnimalPhoto, onChange: event => void previewAnimal(event.currentTarget.files?.[0]) })] }), previewUrl ? _jsx("button", { type: "button", className: "uhcp-animal-photo-remove", "aria-label": copy.removeAnimalPhoto, title: copy.removeAnimalPhoto, onClick: removeAnimalPhoto, children: "\u00D7" }) : null, _jsx("small", { children: copy.photoHelp }), photoError ? _jsx("p", { role: "alert", children: photoError }) : null] }), _jsxs("div", { className: "uhcp-animal-onboarding-fields", children: [_jsxs("label", { children: [copy.animalName, _jsx("input", { name: "animalName", required: true, maxLength: 80, value: animalName, onChange: event => setAnimalName(event.currentTarget.value) })] }), _jsxs("label", { children: [copy.taxonomyId, speciesOptions.length > 0
104
102
  ? _jsx("select", { name: "taxonomyId", required: true, defaultValue: speciesOptions[0]?.taxonomyId, children: speciesOptions.map(option => _jsx("option", { value: option.taxonomyId, children: option.label }, option.taxonomyId)) })
105
- : _jsx("input", { name: "taxonomyId", required: true, inputMode: "numeric", pattern: "[1-9][0-9]{0,6}", defaultValue: "9615" })] }), _jsxs("label", { children: [copy.birthDate, _jsx("input", { name: "birthDate", type: "date" })] }), _jsxs("label", { children: [copy.sex, _jsxs("select", { name: "sex", defaultValue: "unknown", children: [_jsx("option", { value: "unknown", children: copy.sexUnknown }), _jsx("option", { value: "female", children: copy.sexFemale }), _jsx("option", { value: "male", children: copy.sexMale }), _jsx("option", { value: "other", children: copy.sexOther })] })] }), _jsxs("label", { children: [copy.identifierSystem, _jsxs("select", { name: "identifierSystem", defaultValue: "urn:iso:std:iso:11784:11785", children: [_jsx("option", { value: "urn:iso:std:iso:11784:11785", children: "ISO 11784/11785" }), _jsx("option", { value: "https://europa.eu/pet-passport", children: "EU pet passport" }), _jsx("option", { value: "https://vetchain.app/identifier/tattoo", children: "Tattoo" })] })] }), _jsxs("label", { children: [copy.identifierValue, _jsx("input", { name: "identifierValue", required: true, maxLength: 80, autoComplete: "off" })] })] })] })] }), _jsxs("details", { "aria-labelledby": "animal-onboarding-v2-controller-step", children: [_jsxs("summary", { id: "animal-onboarding-v2-controller-step", children: [_jsx(StepNumber, { value: 2 }), " ", copy.controllerStep] }), _jsx(IdentityEntityEditorV2, { mode: "controller", countryOptions: countryOptions, regionOptionsByCountry: regionOptionsByCountry, identifierTypeOptions: identifierTypeOptions, contactError: contactError, copy: {
103
+ : _jsx("input", { name: "taxonomyId", required: true, inputMode: "numeric", pattern: "[1-9][0-9]{0,6}", defaultValue: "9615" })] }), _jsxs("label", { children: [copy.birthDate, _jsx("input", { name: "birthDate", type: "date" })] }), _jsxs("label", { children: [copy.sex, _jsxs("select", { name: "sex", defaultValue: "unknown", children: [_jsx("option", { value: "unknown", children: copy.sexUnknown }), _jsx("option", { value: "female", children: copy.sexFemale }), _jsx("option", { value: "male", children: copy.sexMale }), _jsx("option", { value: "other", children: copy.sexOther })] })] }), _jsxs("label", { children: [copy.identifierSystem, _jsxs("select", { name: "identifierSystem", defaultValue: "urn:iso:std:iso:11784:11785", children: [_jsx("option", { value: "urn:iso:std:iso:11784:11785", children: "ISO 11784/11785" }), _jsx("option", { value: "https://europa.eu/pet-passport", children: "EU pet passport" }), _jsx("option", { value: "https://vetchain.app/identifier/tattoo", children: "Tattoo" })] })] }), _jsxs("label", { children: [copy.identifierValue, _jsx("input", { name: "identifierValue", required: true, maxLength: 80, autoComplete: "off" })] })] })] })] }), _jsxs("details", { "aria-labelledby": "animal-onboarding-v2-controller-step", children: [_jsxs("summary", { id: "animal-onboarding-v2-controller-step", children: [_jsx(StepNumber, { value: 2 }), " ", copy.controllerStep] }), _jsx(IdentityEntityEditorV2, { mode: "controller", showEvidence: false, countryOptions: countryOptions, regionOptionsByCountry: regionOptionsByCountry, identifierTypeOptions: identifierTypeOptions, contactError: contactError, requireEmail: requireEmail, requireTelephone: requireTelephone, copy: {
106
104
  entityType: copy.ownerKind, personEntity: copy.personOwner, organizationEntity: copy.organizationOwner,
107
105
  fullLegalName: copy.controllerLegalName, country: copy.controllerCountry, regionalIdentifier: copy.regionalIdentifier,
108
106
  region: copy.controllerRegion, identifierType: copy.controllerIdentifierType, identifierValue: copy.controllerIdentifierValue,
@@ -110,8 +108,8 @@ export function AnimalIdentityOnboardingV2({ copy, onSubmit, submitAction, speci
110
108
  responsibleParty: copy.responsibleParty ?? copy.owner, evidence: copy.evidenceStep,
111
109
  verificationMethod: copy.verificationMethod, physicalInPerson: copy.physicalInPerson,
112
110
  supervisedRemote: copy.supervisedRemote, electronicId: copy.electronicId, unsupervisedRemote: copy.unsupervisedRemote,
113
- identityDocument: copy.ownerDocument, relationshipDocument: copy.relationshipDocument, pin: copy.controllerPin,
114
- controllerConfirmation: copy.controllerIsLegalRepresentative,
111
+ identityDocument: copy.ownerDocument, relationshipDocument: copy.relationshipDocument,
112
+ countryPlaceholder: copy.countryPlaceholder, controllerConfirmation: copy.controllerIsLegalRepresentative,
115
113
  } })] }), _jsx("button", { type: "submit", className: "uhcp-animal-onboarding-submit", "data-portal-action": submitAction, disabled: disabled, children: copy.submit })] })] });
116
114
  }
117
115
  function StepNumber({ value }) {
@@ -134,6 +132,11 @@ function requiredFile(form, name) {
134
132
  throw new Error(`animal_identity_${name}_required`);
135
133
  return value;
136
134
  }
135
+ function optionalFile(form, name) {
136
+ const input = form.elements.namedItem(name);
137
+ const value = input instanceof HTMLInputElement ? input.files?.[0] : undefined;
138
+ return value && value.size > 0 ? value : undefined;
139
+ }
137
140
  async function readImageDimensions(file) {
138
141
  if (typeof createImageBitmap === 'function') {
139
142
  const bitmap = await createImageBitmap(file);
@@ -24,15 +24,16 @@ export type IdentityEntityEditorV2Copy = Readonly<{
24
24
  unsupervisedRemote: string;
25
25
  identityDocument: string;
26
26
  relationshipDocument: string;
27
- pin: string;
27
+ pin?: string;
28
28
  controllerConfirmation: string;
29
+ countryPlaceholder?: string;
29
30
  }>;
30
31
  /**
31
32
  * Reusable identity-and-evidence editor for one controller or related entity.
32
33
  * A controller has a fixed responsible-party relationship; related entities
33
34
  * receive their host-governed relationship choices.
34
35
  */
35
- export declare function IdentityEntityEditorV2({ copy, mode, countryOptions, regionOptionsByCountry, identifierTypeOptions, relationshipOptions, fieldPrefix, contactError, }: Readonly<{
36
+ export declare function IdentityEntityEditorV2({ copy, mode, countryOptions, regionOptionsByCountry, identifierTypeOptions, relationshipOptions, fieldPrefix, contactError, requireEmail, requireTelephone, showEvidence, }: Readonly<{
36
37
  copy: IdentityEntityEditorV2Copy;
37
38
  mode: 'controller' | 'related';
38
39
  countryOptions?: readonly IdentityEntitySelectOption[];
@@ -44,5 +45,8 @@ export declare function IdentityEntityEditorV2({ copy, mode, countryOptions, reg
44
45
  relationshipOptions?: readonly IdentityEntitySelectOption[];
45
46
  fieldPrefix?: string;
46
47
  contactError?: string;
48
+ requireEmail?: boolean;
49
+ requireTelephone?: boolean;
50
+ showEvidence?: boolean;
47
51
  }>): import("react").JSX.Element;
48
52
  //# sourceMappingURL=IdentityEntityEditorV2.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"IdentityEntityEditorV2.d.ts","sourceRoot":"","sources":["../src/IdentityEntityEditorV2.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,0BAA0B,GAAG,QAAQ,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAEnF,MAAM,MAAM,0BAA0B,GAAG,QAAQ,CAAC;IAChD,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,kBAAkB,EAAE,MAAM,CAAA;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,gBAAgB,EAAE,MAAM,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,EAAE,MAAM,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,gBAAgB,EAAE,MAAM,CAAA;IACxB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,sBAAsB,EAAE,MAAM,CAAA;CAC/B,CAAC,CAAA;AAEF;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,IAAI,EACJ,IAAI,EACJ,cAAmB,EACnB,sBAA2B,EAC3B,qBAAqB,EACrB,mBAAwB,EACxB,WAAgB,EAChB,YAAY,GACb,EAAE,QAAQ,CAAC;IACV,IAAI,EAAE,0BAA0B,CAAA;IAChC,IAAI,EAAE,YAAY,GAAG,SAAS,CAAA;IAC9B,cAAc,CAAC,EAAE,SAAS,0BAA0B,EAAE,CAAA;IACtD,sBAAsB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,0BAA0B,EAAE,CAAC,CAAC,CAAA;IACxF,qBAAqB,CAAC,EAAE,QAAQ,CAAC;QAAE,MAAM,EAAE,SAAS,0BAA0B,EAAE,CAAC;QAAC,YAAY,EAAE,SAAS,0BAA0B,EAAE,CAAA;KAAE,CAAC,CAAA;IACxI,mBAAmB,CAAC,EAAE,SAAS,0BAA0B,EAAE,CAAA;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAC,+BA0CD"}
1
+ {"version":3,"file":"IdentityEntityEditorV2.d.ts","sourceRoot":"","sources":["../src/IdentityEntityEditorV2.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,0BAA0B,GAAG,QAAQ,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAEnF,MAAM,MAAM,0BAA0B,GAAG,QAAQ,CAAC;IAChD,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,kBAAkB,EAAE,MAAM,CAAA;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,gBAAgB,EAAE,MAAM,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,EAAE,MAAM,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,gBAAgB,EAAE,MAAM,CAAA;IACxB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,sBAAsB,EAAE,MAAM,CAAA;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B,CAAC,CAAA;AAEF;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,IAAI,EACJ,IAAI,EACJ,cAAmB,EACnB,sBAA2B,EAC3B,qBAAqB,EACrB,mBAAwB,EACxB,WAAgB,EAChB,YAAY,EACZ,YAAoB,EACpB,gBAAwB,EACxB,YAAmB,GACpB,EAAE,QAAQ,CAAC;IACV,IAAI,EAAE,0BAA0B,CAAA;IAChC,IAAI,EAAE,YAAY,GAAG,SAAS,CAAA;IAC9B,cAAc,CAAC,EAAE,SAAS,0BAA0B,EAAE,CAAA;IACtD,sBAAsB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,0BAA0B,EAAE,CAAC,CAAC,CAAA;IACxF,qBAAqB,CAAC,EAAE,QAAQ,CAAC;QAAE,MAAM,EAAE,SAAS,0BAA0B,EAAE,CAAC;QAAC,YAAY,EAAE,SAAS,0BAA0B,EAAE,CAAA;KAAE,CAAC,CAAA;IACxI,mBAAmB,CAAC,EAAE,SAAS,0BAA0B,EAAE,CAAA;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,CAAC,+BAyCD"}
@@ -5,13 +5,13 @@ import { useState } from 'react';
5
5
  * A controller has a fixed responsible-party relationship; related entities
6
6
  * receive their host-governed relationship choices.
7
7
  */
8
- export function IdentityEntityEditorV2({ copy, mode, countryOptions = [], regionOptionsByCountry = {}, identifierTypeOptions, relationshipOptions = [], fieldPrefix = '', contactError, }) {
8
+ export function IdentityEntityEditorV2({ copy, mode, countryOptions = [], regionOptionsByCountry = {}, identifierTypeOptions, relationshipOptions = [], fieldPrefix = '', contactError, requireEmail = false, requireTelephone = false, showEvidence = true, }) {
9
9
  const [entityType, setEntityType] = useState('person');
10
- const [country, setCountry] = useState(countryOptions[0]?.value || '');
10
+ const [country, setCountry] = useState('');
11
11
  const [regional, setRegional] = useState(false);
12
12
  const regions = regionOptionsByCountry[country] ?? [];
13
13
  const name = (value) => fieldPrefix ? `${fieldPrefix}.${value}` : value;
14
14
  return _jsxs("div", { className: "uhcp-identity-entity-editor", children: [_jsxs("div", { className: "uhcp-identity-entity-heading-row", children: [_jsxs("fieldset", { className: "uhcp-animal-owner-kind", children: [_jsx("legend", { children: copy.entityType }), _jsxs("label", { children: [_jsx("input", { type: "radio", name: name('controllerKind'), value: "person", checked: entityType === 'person', onChange: () => setEntityType('person') }), " ", copy.personEntity] }), _jsxs("label", { children: [_jsx("input", { type: "radio", name: name('controllerKind'), value: "organization", checked: entityType === 'organization', onChange: () => setEntityType('organization') }), " ", copy.organizationEntity] })] }), _jsxs("div", { className: "uhcp-identity-entity-relationship", children: [_jsx("span", { children: copy.relationship }), mode === 'controller'
15
15
  ? _jsxs(_Fragment, { children: [_jsx("strong", { children: copy.responsibleParty }), _jsx("input", { type: "hidden", name: name('relationship'), value: "owner" })] })
16
- : _jsx("select", { name: name('relationship'), "aria-label": copy.relationship, required: true, defaultValue: relationshipOptions[0]?.value, children: relationshipOptions.map(option => _jsx("option", { value: option.value, children: option.label }, option.value)) })] })] }), _jsxs("div", { className: "uhcp-animal-onboarding-fields", children: [_jsxs("label", { className: "uhcp-animal-owner-name", children: [copy.fullLegalName, _jsx("input", { name: name('controllerLegalName'), required: true, maxLength: 160, autoComplete: entityType === 'person' ? 'name' : 'organization' })] }), _jsxs("label", { children: [copy.country, countryOptions.length ? _jsx("select", { name: name('controllerCountry'), required: true, value: country, onChange: event => setCountry(event.currentTarget.value), children: countryOptions.map(option => _jsx("option", { value: option.value, children: option.label }, option.value)) }) : _jsx("input", { name: name('controllerCountry'), required: true, pattern: "[A-Za-z]{2}", maxLength: 2, autoComplete: "country", onChange: event => setCountry(event.currentTarget.value.toUpperCase()) })] }), _jsxs("label", { className: "uhcp-animal-regional-identifier", children: [_jsx("input", { type: "checkbox", checked: regional, disabled: !regions.length, onChange: event => setRegional(event.currentTarget.checked) }), " ", copy.regionalIdentifier] }), _jsxs("label", { children: [copy.region, _jsxs("select", { name: name('controllerRegion'), required: regional, disabled: !regional, children: [_jsx("option", { value: "" }), regions.map(option => _jsx("option", { value: option.value, children: option.label }, option.value))] })] }), _jsxs("label", { children: [copy.identifierType, identifierTypeOptions ? _jsx("select", { name: name('controllerIdentifierType'), required: true, children: identifierTypeOptions[entityType].map(option => _jsx("option", { value: option.value, children: option.label }, option.value)) }, entityType) : _jsx("input", { name: name('controllerIdentifierType'), required: true, defaultValue: "national_identity_card", maxLength: 80 })] }), _jsxs("label", { children: [copy.identifierValue, _jsx("input", { name: name('controllerIdentifierValue'), required: true, maxLength: 120, autoComplete: "off" })] }), _jsxs("label", { children: [copy.email, _jsx("input", { name: name('controllerEmail'), type: "email", autoComplete: "email" })] }), _jsxs("label", { children: [copy.telephone, _jsx("input", { name: name('controllerTelephone'), type: "tel", autoComplete: "tel" })] }), mode === 'controller' ? _jsxs("label", { className: "uhcp-animal-controller-confirmation", children: [_jsx("input", { type: "checkbox", defaultChecked: true, required: true }), " ", copy.controllerConfirmation] }) : null, contactError ? _jsx("p", { role: "alert", children: contactError }) : null] }), _jsxs("fieldset", { className: "uhcp-identity-entity-evidence", children: [_jsx("legend", { children: copy.evidence }), _jsxs("div", { className: "uhcp-animal-onboarding-fields", children: [_jsxs("label", { children: [copy.verificationMethod, _jsxs("select", { name: name('verificationMethod'), defaultValue: "pipp", children: [_jsx("option", { value: "pipp", children: copy.physicalInPerson }), _jsx("option", { value: "sripp", children: copy.supervisedRemote }), _jsx("option", { value: "eid", children: copy.electronicId }), _jsx("option", { value: "uripp", children: copy.unsupervisedRemote })] })] }), _jsxs("label", { children: [copy.identityDocument, _jsx("input", { name: name('ownerDocument'), type: "file", accept: "application/pdf,image/jpeg,image/png", required: true })] }), _jsxs("label", { children: [copy.relationshipDocument, _jsx("input", { name: name('relationshipDocument'), type: "file", accept: "application/pdf,image/jpeg,image/png", required: true })] }), mode === 'controller' ? _jsxs("label", { children: [copy.pin, _jsx("input", { name: name('controllerPin'), type: "password", inputMode: "numeric", pattern: "[0-9]{6,12}", required: true, autoComplete: "new-password" })] }) : null] })] })] });
16
+ : _jsx("select", { name: name('relationship'), "aria-label": copy.relationship, required: true, defaultValue: relationshipOptions[0]?.value, children: relationshipOptions.map(option => _jsx("option", { value: option.value, children: option.label }, option.value)) })] })] }), _jsxs("div", { className: "uhcp-animal-onboarding-fields", children: [_jsxs("label", { className: "uhcp-animal-owner-name", children: [copy.fullLegalName, _jsx("input", { name: name('controllerLegalName'), required: true, maxLength: 160, autoComplete: entityType === 'person' ? 'name' : 'organization' })] }), _jsxs("label", { children: [copy.country, countryOptions.length ? _jsxs("select", { name: name('controllerCountry'), required: true, value: country, onChange: event => setCountry(event.currentTarget.value), children: [_jsx("option", { value: "", disabled: true, children: copy.countryPlaceholder ?? copy.country }), countryOptions.map(option => _jsx("option", { value: option.value, children: option.label }, option.value))] }) : _jsx("input", { name: name('controllerCountry'), required: true, pattern: "[A-Za-z]{2}", maxLength: 2, autoComplete: "country", onChange: event => setCountry(event.currentTarget.value.toUpperCase()) })] }), _jsxs("label", { className: "uhcp-animal-regional-identifier", children: [_jsx("input", { type: "checkbox", checked: regional, disabled: !regions.length, onChange: event => setRegional(event.currentTarget.checked) }), " ", copy.regionalIdentifier] }), _jsxs("label", { children: [copy.region, _jsxs("select", { name: name('controllerRegion'), required: regional, disabled: !regional, children: [_jsx("option", { value: "" }), regions.map(option => _jsx("option", { value: option.value, children: option.label }, option.value))] })] }), _jsxs("label", { children: [copy.identifierType, identifierTypeOptions ? _jsx("select", { name: name('controllerIdentifierType'), required: true, children: identifierTypeOptions[entityType].map(option => _jsx("option", { value: option.value, children: option.label }, option.value)) }, entityType) : _jsx("input", { name: name('controllerIdentifierType'), required: true, defaultValue: "national_identity_card", maxLength: 80 })] }), _jsxs("label", { children: [copy.identifierValue, _jsx("input", { name: name('controllerIdentifierValue'), required: true, maxLength: 120, autoComplete: "off" })] }), _jsxs("label", { className: "uhcp-identity-entity-contact-wide", children: [copy.email, _jsx("input", { name: name('controllerEmail'), type: "email", autoComplete: "email", required: requireEmail })] }), _jsxs("label", { children: [copy.telephone, _jsx("input", { name: name('controllerTelephone'), type: "tel", autoComplete: "tel", required: requireTelephone })] }), mode === 'controller' ? _jsxs("label", { className: "uhcp-animal-controller-confirmation", children: [_jsx("input", { type: "checkbox", checked: true, disabled: true, readOnly: true, "aria-disabled": "true" }), " ", copy.controllerConfirmation] }) : null, contactError ? _jsx("p", { role: "alert", children: contactError }) : null] }), showEvidence ? _jsxs("fieldset", { className: "uhcp-identity-entity-evidence", children: [_jsx("legend", { children: copy.evidence }), _jsxs("div", { className: "uhcp-animal-onboarding-fields", children: [_jsxs("label", { children: [copy.verificationMethod, _jsxs("select", { name: name('verificationMethod'), defaultValue: "pipp", children: [_jsx("option", { value: "pipp", children: copy.physicalInPerson }), _jsx("option", { value: "sripp", children: copy.supervisedRemote }), _jsx("option", { value: "eid", children: copy.electronicId }), _jsx("option", { value: "uripp", children: copy.unsupervisedRemote })] })] }), _jsxs("label", { children: [copy.identityDocument, _jsx("input", { name: name('ownerDocument'), type: "file", accept: "application/pdf,image/jpeg,image/png" })] }), _jsxs("label", { children: [copy.relationshipDocument, _jsx("input", { name: name('relationshipDocument'), type: "file", accept: "application/pdf,image/jpeg,image/png" })] })] })] }) : null] });
17
17
  }
package/dist/styles.css CHANGED
@@ -799,10 +799,13 @@ html[data-theme='dark'] .uhcp-brand-artwork-dark { display: block !important; }
799
799
  .uhcp-identity-entity-heading-row { align-items:stretch; display:grid; gap:1rem; grid-template-columns:minmax(0,1fr) minmax(12rem,.7fr); }
800
800
  .uhcp-identity-entity-relationship { align-content:center; background:var(--uhcp-panel-muted, #f4f7fa); border:1px solid var(--uhcp-border, #d9dee7); border-radius:1rem; display:grid; gap:.35rem; padding:1rem; }
801
801
  .uhcp-identity-entity-relationship span { color:var(--uhcp-muted, #5f6875); font-size:.85rem; font-weight:750; }
802
- .uhcp-identity-entity-evidence { background:var(--uhcp-panel-muted, #f4f7fa); }
802
+ .uhcp-identity-entity-editor input,.uhcp-identity-entity-editor select { background:var(--uhcp-panel); border:1px solid var(--uhcp-border); border-radius:.75rem; color:var(--uhcp-text); font:inherit; padding:.7rem .8rem; }
803
+ .uhcp-identity-entity-evidence { background:var(--uhcp-panel-muted); border:1px solid var(--uhcp-border); border-radius:1rem; color:var(--uhcp-text); margin:0; padding:1rem; }
804
+ .uhcp-identity-entity-evidence legend { color:var(--uhcp-text); font-weight:800; padding:0 .35rem; }
805
+ .uhcp-identity-entity-contact-wide,.uhcp-animal-controller-confirmation { grid-column:1/-1; }
803
806
  .uhcp-animal-owner-name { grid-column:1/-1; }
804
- .uhcp-animal-controller-confirmation { align-items:center; background:var(--uhcp-accent-soft, #e9f3ff); border-radius:.75rem; display:flex !important; grid-column:1 / -1; padding:.75rem; }
805
- .uhcp-animal-controller-confirmation input { min-height:auto !important; width:auto !important; }
807
+ .uhcp-animal-controller-confirmation { align-items:center; background:color-mix(in srgb,var(--uhcp-turquoise) 12%,var(--uhcp-panel)); border:1px solid color-mix(in srgb,var(--uhcp-turquoise) 30%,var(--uhcp-border)); border-radius:.75rem; color:var(--uhcp-text); display:flex!important; padding:.75rem; }
808
+ .uhcp-animal-controller-confirmation input { accent-color:var(--uhcp-turquoise); min-height:auto!important; width:auto!important; }
806
809
  @media (max-width: 42rem) { .uhcp-animal-onboarding-primary,.uhcp-identity-entity-heading-row { grid-template-columns:1fr; } .uhcp-animal-photo { justify-self:center; max-width:15rem; width:100%; } }
807
810
  .uhcp-animal-card { aspect-ratio: 1.586; background: linear-gradient(145deg, #0a4169 0%, #087f8d 60%, #18a4a6 100%); border: 1px solid color-mix(in srgb, #fff 32%, transparent); border-radius: 1.15rem; box-shadow: 0 1rem 2.5rem rgb(2 30 51 / 22%); box-sizing: border-box; color: #fff; display: grid; gap: .8rem; grid-template-rows: auto 1fr auto; max-width: 33.5rem; min-height: 18.25rem; overflow: hidden; padding: 1.25rem; position: relative; width: 100%; }
808
811
  .uhcp-animal-card::after { background: radial-gradient(circle, rgb(255 255 255 / 18%), transparent 68%); content: ''; height: 18rem; inset: -8rem -7rem auto auto; pointer-events: none; position: absolute; width: 18rem; }
@@ -841,6 +844,8 @@ html[data-theme='dark'] .uhcp-brand-artwork-dark { display: block !important; }
841
844
  .uhcp-emergency-task-hub > header h1 { font-size: clamp(1.35rem, 3vw, 1.9rem); margin: 0; }
842
845
  .uhcp-subject-identity-card { border: 1px solid var(--uhcp-border, #d9dee7); border-radius: 1rem; display: grid; gap: 1rem; padding: 1rem; }
843
846
  .uhcp-subject-identity-card > header { align-items: center; display: grid; gap: .8rem; grid-template-columns: auto 1fr auto; }
847
+ .uhcp-subject-identity-edit { align-items: center; background: var(--uhcp-action-soft, #e8f3ff); border: 1px solid var(--uhcp-action-end, #2563a9); border-radius: 50%; color: var(--uhcp-action-end, #2563a9); cursor: pointer; display: inline-flex; font: inherit; font-size: 1.25rem; height: 2.75rem; justify-content: center; width: 2.75rem; }
848
+ .uhcp-subject-identity-edit:hover, .uhcp-subject-identity-edit:focus-visible { background: var(--uhcp-action-end, #2563a9); color: #fff; }
844
849
  .uhcp-subject-identity-card img, .uhcp-subject-identity-avatar { align-items: center; aspect-ratio: 1; border-radius: 50%; display: flex; height: 3.5rem; justify-content: center; object-fit: cover; width: 3.5rem; }
845
850
  .uhcp-current-subject { margin-inline-start:auto; position:relative; }
846
851
  .uhcp-current-subject-trigger { align-items:center; background:var(--uhcp-surface, #fff); border:1px solid var(--uhcp-border, #d8e0e8); border-radius:999px; color:inherit; cursor:pointer; display:flex; gap:.55rem; min-height:2.75rem; padding:.3rem .7rem .3rem .3rem; }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "uhc-portal-components-react",
3
- "version": "0.2.9",
3
+ "version": "0.2.10",
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",