@smileid/web-components 2.0.2 → 10.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/DocumentCaptureScreens-ChpBVvNE.js +1532 -0
- package/dist/esm/DocumentCaptureScreens-ChpBVvNE.js.map +1 -0
- package/dist/esm/EndUserConsent-CMHp-34-.js +715 -0
- package/dist/esm/EndUserConsent-CMHp-34-.js.map +1 -0
- package/dist/esm/Navigation-juBE4qOw.js +136 -0
- package/dist/esm/Navigation-juBE4qOw.js.map +1 -0
- package/dist/esm/PoweredBySmileId-CxbaihMu.js +33 -0
- package/dist/esm/PoweredBySmileId-CxbaihMu.js.map +1 -0
- package/dist/esm/SelfieCaptureScreens-DMo-z-32.js +7618 -0
- package/dist/esm/SelfieCaptureScreens-DMo-z-32.js.map +1 -0
- package/dist/esm/SignaturePad-C7MtmT8m.js +324 -0
- package/dist/esm/SignaturePad-C7MtmT8m.js.map +1 -0
- package/dist/esm/TotpConsent-CQU5jQi4.js +730 -0
- package/dist/esm/TotpConsent-CQU5jQi4.js.map +1 -0
- package/dist/esm/combobox.js +300 -0
- package/dist/esm/combobox.js.map +1 -0
- package/dist/esm/document.js +5 -0
- package/dist/esm/document.js.map +1 -0
- package/dist/esm/end-user-consent.js +5 -0
- package/dist/esm/end-user-consent.js.map +1 -0
- package/dist/esm/main.js +22 -0
- package/dist/esm/main.js.map +1 -0
- package/dist/esm/navigation.js +5 -0
- package/dist/esm/navigation.js.map +1 -0
- package/dist/esm/package-D_4zJ9ck.js +105 -0
- package/dist/esm/package-D_4zJ9ck.js.map +1 -0
- package/dist/esm/selfie.js +5 -0
- package/dist/esm/selfie.js.map +1 -0
- package/dist/esm/signature-pad.js +5 -0
- package/dist/esm/signature-pad.js.map +1 -0
- package/dist/esm/smart-camera-web.js +302 -0
- package/dist/esm/smart-camera-web.js.map +1 -0
- package/dist/esm/styles-D2i3GFLK.js +405 -0
- package/dist/esm/styles-D2i3GFLK.js.map +1 -0
- package/dist/esm/totp-consent.js +5 -0
- package/dist/esm/totp-consent.js.map +1 -0
- package/dist/smart-camera-web.js +4130 -0
- package/dist/smart-camera-web.js.map +1 -0
- package/dist/types/combobox.d.ts +21 -0
- package/dist/types/document.d.ts +21 -0
- package/dist/types/end-user-consent.d.ts +21 -0
- package/dist/types/main.d.ts +331 -0
- package/dist/types/navigation.d.ts +21 -0
- package/dist/types/selfie.d.ts +21 -0
- package/dist/types/signature-pad.d.ts +21 -0
- package/dist/types/smart-camera-web.d.ts +21 -0
- package/dist/types/totp-consent.d.ts +21 -0
- package/{src → lib}/components/camera-permission/CameraPermission.js +0 -1
- package/{src → lib}/components/document/src/document-capture/DocumentCapture.js +0 -1
- package/{src → lib}/components/document/src/document-capture-review/DocumentCaptureReview.js +0 -1
- package/{src → lib}/components/selfie/src/SelfieCaptureScreens.js +188 -37
- package/{src → lib}/components/selfie/src/index.js +0 -2
- package/{src → lib}/components/selfie/src/selfie-capture/SelfieCapture.js +3 -4
- package/{src → lib}/components/selfie/src/selfie-capture-instructions/SelfieCaptureInstructions.js +0 -1
- package/{src → lib}/components/selfie/src/selfie-capture-review/SelfieCaptureReview.js +0 -8
- package/lib/components/selfie/src/selfie-capture-wrapper/SelfieCaptureWrapper.tsx +226 -0
- package/lib/components/selfie/src/selfie-capture-wrapper/index.ts +1 -0
- package/lib/components/selfie/src/smartselfie-capture/OvalProgress.tsx +81 -0
- package/lib/components/selfie/src/smartselfie-capture/SmartSelfieCapture.tsx +223 -0
- package/lib/components/selfie/src/smartselfie-capture/components/AlertDisplay.tsx +34 -0
- package/lib/components/selfie/src/smartselfie-capture/components/CameraPreview.tsx +97 -0
- package/lib/components/selfie/src/smartselfie-capture/components/CaptureControls.tsx +74 -0
- package/lib/components/selfie/src/smartselfie-capture/components/index.ts +3 -0
- package/lib/components/selfie/src/smartselfie-capture/constants.ts +23 -0
- package/lib/components/selfie/src/smartselfie-capture/hooks/index.ts +2 -0
- package/lib/components/selfie/src/smartselfie-capture/hooks/useCamera.ts +94 -0
- package/lib/components/selfie/src/smartselfie-capture/hooks/useFaceCapture.ts +558 -0
- package/lib/components/selfie/src/smartselfie-capture/index.ts +1 -0
- package/lib/components/selfie/src/smartselfie-capture/utils/alertMessages.ts +12 -0
- package/lib/components/selfie/src/smartselfie-capture/utils/canvas.ts +105 -0
- package/lib/components/selfie/src/smartselfie-capture/utils/faceDetection.ts +129 -0
- package/lib/components/selfie/src/smartselfie-capture/utils/imageCapture.ts +65 -0
- package/lib/components/selfie/src/smartselfie-capture/utils/index.ts +4 -0
- package/lib/components/selfie/src/smartselfie-capture/utils/mediapipeManager.ts +60 -0
- package/{src → lib}/components/signature-pad/package.json +1 -1
- package/{src → lib}/components/smart-camera-web/src/README.md +0 -1
- package/{src → lib}/styles/src/styles.js +0 -1
- package/package.json +76 -24
- package/src/index.js +0 -5
- /package/{src → lib}/components/README.md +0 -0
- /package/{src → lib}/components/attribution/PoweredBySmileId.js +0 -0
- /package/{src → lib}/components/camera-permission/CameraPermission.stories.js +0 -0
- /package/{src → lib}/components/combobox/src/Combobox.js +0 -0
- /package/{src → lib}/components/combobox/src/index.js +0 -0
- /package/{src → lib}/components/document/src/DocumentCaptureScreens.js +0 -0
- /package/{src → lib}/components/document/src/DocumentCaptureScreens.stories.js +0 -0
- /package/{src → lib}/components/document/src/README.md +0 -0
- /package/{src → lib}/components/document/src/document-capture/DocumentCapture.stories.js +0 -0
- /package/{src → lib}/components/document/src/document-capture/README.md +0 -0
- /package/{src → lib}/components/document/src/document-capture/index.js +0 -0
- /package/{src → lib}/components/document/src/document-capture-instructions/DocumentCaptureInstructions.js +0 -0
- /package/{src → lib}/components/document/src/document-capture-instructions/DocumentCaptureInstructions.stories.js +0 -0
- /package/{src → lib}/components/document/src/document-capture-instructions/README.md +0 -0
- /package/{src → lib}/components/document/src/document-capture-instructions/index.js +0 -0
- /package/{src → lib}/components/document/src/document-capture-review/DocumentCaptureReview.stories.js +0 -0
- /package/{src → lib}/components/document/src/document-capture-review/README.md +0 -0
- /package/{src → lib}/components/document/src/document-capture-review/index.js +0 -0
- /package/{src → lib}/components/document/src/index.js +0 -0
- /package/{src → lib}/components/end-user-consent/src/EndUserConsent.js +0 -0
- /package/{src → lib}/components/end-user-consent/src/EndUserConsent.stories.js +0 -0
- /package/{src → lib}/components/end-user-consent/src/index.js +0 -0
- /package/{src → lib}/components/navigation/src/Navigation.js +0 -0
- /package/{src → lib}/components/navigation/src/Navigation.stories.js +0 -0
- /package/{src → lib}/components/navigation/src/index.js +0 -0
- /package/{src → lib}/components/selfie/README.md +0 -0
- /package/{src → lib}/components/selfie/src/SelfieCaptureScreens.stories.js +0 -0
- /package/{src → lib}/components/selfie/src/selfie-capture/SelfieCapture.stories.js +0 -0
- /package/{src → lib}/components/selfie/src/selfie-capture/index.js +0 -0
- /package/{src → lib}/components/selfie/src/selfie-capture-instructions/SelfieCaptureInstructions.stories.js +0 -0
- /package/{src → lib}/components/selfie/src/selfie-capture-instructions/index.js +0 -0
- /package/{src → lib}/components/selfie/src/selfie-capture-review/SelfieCaptureReview.stories.js +0 -0
- /package/{src → lib}/components/selfie/src/selfie-capture-review/index.js +0 -0
- /package/{src → lib}/components/signature-pad/package-lock.json +0 -0
- /package/{src → lib}/components/signature-pad/src/SignaturePad.js +0 -0
- /package/{src → lib}/components/signature-pad/src/SignaturePad.stories.js +0 -0
- /package/{src → lib}/components/signature-pad/src/index.js +0 -0
- /package/{src → lib}/components/smart-camera-web/src/SmartCameraWeb.js +0 -0
- /package/{src → lib}/components/smart-camera-web/src/SmartCameraWeb.stories.js +0 -0
- /package/{src → lib}/components/totp-consent/src/TotpConsent.js +0 -0
- /package/{src → lib}/components/totp-consent/src/index.js +0 -0
- /package/{src → lib}/domain/camera/src/README.md +0 -0
- /package/{src → lib}/domain/camera/src/SmartCamera.js +0 -0
- /package/{src → lib}/domain/constants/src/Constants.js +0 -0
- /package/{src → lib}/domain/file-upload/README.md +0 -0
- /package/{src → lib}/domain/file-upload/src/SmartFileUpload.js +0 -0
- /package/{src → lib}/styles/README.md +0 -0
- /package/{src → lib}/styles/src/typography.js +0 -0
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import p from "signature_pad";
|
|
2
|
+
class n {
|
|
3
|
+
static memoryLimit = 2048e3;
|
|
4
|
+
static supportedTypes = ["image/jpeg", "image/png", "image/svg+xml"];
|
|
5
|
+
static getHumanSize(e) {
|
|
6
|
+
const t = ["B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"], a = Math.min(
|
|
7
|
+
Math.floor(Math.log(e) / Math.log(1024)),
|
|
8
|
+
t.length - 1
|
|
9
|
+
), r = e / 1024 ** a;
|
|
10
|
+
return a === 0 ? `${e} bytes` : `${r.toFixed(0)} ${t[a]}`;
|
|
11
|
+
}
|
|
12
|
+
static getData(e) {
|
|
13
|
+
return new Promise((t, a) => {
|
|
14
|
+
const r = new FileReader();
|
|
15
|
+
r.onload = (i) => {
|
|
16
|
+
t(i.target.result);
|
|
17
|
+
}, r.onerror = () => {
|
|
18
|
+
a(
|
|
19
|
+
new Error(
|
|
20
|
+
"An error occurred reading the file. Please check the file, and try again"
|
|
21
|
+
)
|
|
22
|
+
);
|
|
23
|
+
}, r.readAsDataURL(e);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
static async retrieve(e) {
|
|
27
|
+
if (e.length > 1)
|
|
28
|
+
throw new Error("Only one file upload is permitted at a time");
|
|
29
|
+
const t = e[0];
|
|
30
|
+
if (!n.supportedTypes.includes(t.type))
|
|
31
|
+
throw new Error(
|
|
32
|
+
"Unsupported file format. Please ensure that you are providing a JPG, PNG or SVG image"
|
|
33
|
+
);
|
|
34
|
+
if (t.size > n.memoryLimit)
|
|
35
|
+
throw new Error(
|
|
36
|
+
`${t.name} is too large. Please ensure that the file is less than ${n.getHumanSize(
|
|
37
|
+
n.memoryLimit
|
|
38
|
+
)}.`
|
|
39
|
+
);
|
|
40
|
+
return await n.getData(t);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
class g extends HTMLElement {
|
|
44
|
+
connectedCallback() {
|
|
45
|
+
const e = this.attachShadow({ mode: "open" }), t = document.createElement("style");
|
|
46
|
+
t.textContent = `
|
|
47
|
+
:host {
|
|
48
|
+
display: block;
|
|
49
|
+
block-size: auto;
|
|
50
|
+
inline-size: 30rem;
|
|
51
|
+
max-inline-size: 100%;
|
|
52
|
+
position: relative;
|
|
53
|
+
--color-active: #2D2B2A;
|
|
54
|
+
--color-default: #001096;
|
|
55
|
+
--color-disabled: #848282;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
:host::part(upload) {
|
|
59
|
+
text-align: center;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
:host::part(signature-controls) {
|
|
63
|
+
display: inline-flex;
|
|
64
|
+
position: absolute;
|
|
65
|
+
top: 1rem;
|
|
66
|
+
right: 1rem;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
:host::part(upload) svg + * {
|
|
70
|
+
margin-inline-start: .5rem;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
:host::part(canvas) {
|
|
74
|
+
background-color: #F9F0E7;
|
|
75
|
+
--dot-bg: #F9F0E7;
|
|
76
|
+
--dot-color: black;
|
|
77
|
+
--dot-size: 1px;
|
|
78
|
+
--dot-space: 22px;
|
|
79
|
+
background:
|
|
80
|
+
linear-gradient(90deg, var(--dot-bg) calc(var(--dot-space) - var(--dot-size)), transparent 1%) center / var(--dot-space) var(--dot-space),
|
|
81
|
+
linear-gradient(var(--dot-bg) calc(var(--dot-space) - var(--dot-size)), transparent 1%) center / var(--dot-space) var(--dot-space),
|
|
82
|
+
var(--dot-color);
|
|
83
|
+
border-radius: 2rem;
|
|
84
|
+
inline-size: 30rem;
|
|
85
|
+
max-inline-size: 100%;
|
|
86
|
+
aspect-ratio: 2 / 1;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
:host::part(upload-preview-image) {
|
|
90
|
+
max-inline-size: 10rem;
|
|
91
|
+
margin-inline: auto;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.visually-hidden {
|
|
95
|
+
clip: rect(0 0 0 0);
|
|
96
|
+
clip-path: inset(50%);
|
|
97
|
+
height: 1px;
|
|
98
|
+
overflow: hidden;
|
|
99
|
+
position: absolute;
|
|
100
|
+
white-space: nowrap;
|
|
101
|
+
width: 1px;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
button,
|
|
105
|
+
label {
|
|
106
|
+
font: inherit;
|
|
107
|
+
cursor: pointer;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
label {
|
|
111
|
+
display: inline-flex;
|
|
112
|
+
text-decoration: underline;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
label svg + * {
|
|
116
|
+
margin-inline-start: .5rem;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
[type="file"] {
|
|
120
|
+
display: none;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.center {
|
|
124
|
+
text-align: center;
|
|
125
|
+
margin-inline: auto;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.color-red {
|
|
129
|
+
color: red;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
button[data-variant="icon"] {
|
|
133
|
+
appearance: none;
|
|
134
|
+
-webkit-appearance: none;
|
|
135
|
+
background-color: transparent;
|
|
136
|
+
border: 0px;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
button[data-variant="text"] {
|
|
140
|
+
appearance: none;
|
|
141
|
+
-webkit-appearance: none;
|
|
142
|
+
background-color: transparent;
|
|
143
|
+
border: 0px;
|
|
144
|
+
text-decoration: underline;
|
|
145
|
+
display: inline-flex;
|
|
146
|
+
align-items: baseline;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
button[data-variant="solid"] {
|
|
150
|
+
--button-color: ${this.themeColor};
|
|
151
|
+
border-radius: 2.5rem;
|
|
152
|
+
border: 0;
|
|
153
|
+
background-color: transparent;
|
|
154
|
+
color: #fff;
|
|
155
|
+
cursor: pointer;
|
|
156
|
+
inline-size: 100%;
|
|
157
|
+
display: inline-flex;
|
|
158
|
+
align-items: center;
|
|
159
|
+
justify-content: center;
|
|
160
|
+
font-size: 18px;
|
|
161
|
+
font-weight: 600;
|
|
162
|
+
padding: .75rem 1.5rem;
|
|
163
|
+
text-align: center;
|
|
164
|
+
background-color: var(--button-color);
|
|
165
|
+
border: 2px solid var(--button-color);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
button:hover,
|
|
169
|
+
button:focus,
|
|
170
|
+
button:active {
|
|
171
|
+
--button-color: var(--color-active);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
button:disabled {
|
|
175
|
+
--button-color: var(--color-disabled);
|
|
176
|
+
}
|
|
177
|
+
`;
|
|
178
|
+
const a = document.createElement("div"), r = document.createElement("div");
|
|
179
|
+
r.innerHTML = `
|
|
180
|
+
<p id="error" class="color-red | center"><p>
|
|
181
|
+
`;
|
|
182
|
+
const i = document.createElement("div");
|
|
183
|
+
i.setAttribute("id", "controls"), i.setAttribute("part", "signature-controls"), i.innerHTML = `
|
|
184
|
+
<button data-variant="icon" type="button" name="clear" id="clear">
|
|
185
|
+
<span class="visually-hidden">
|
|
186
|
+
Clear Signature
|
|
187
|
+
</span>
|
|
188
|
+
<svg fill="none" xmlns="http://www.w3.org/2000/svg" width="18" viewBox="0 0 17 18">
|
|
189
|
+
<path d="M3.314 15.646a8.004 8.004 0 01-2.217-4.257 8.06 8.06 0 01.545-4.655l1.789.788a6.062 6.062 0 001.264 6.737 6.033 6.033 0 008.551 0c2.358-2.37 2.358-6.224 0-8.592a5.996 5.996 0 00-4.405-1.782l.662 2.354-3.128-.796-3.127-.796 2.25-2.324L7.748 0l.55 1.953a7.966 7.966 0 016.33 2.326 8.004 8.004 0 012.342 5.684 8.005 8.005 0 01-2.343 5.683A7.928 7.928 0 018.97 18a7.928 7.928 0 01-5.656-2.354z" fill="currentColor" />
|
|
190
|
+
</svg>
|
|
191
|
+
</button>
|
|
192
|
+
`;
|
|
193
|
+
const o = document.createElement("canvas"), s = this.parentElement.closest(":not([hidden])").querySelector(":not([hidden])").offsetWidth, l = 30 * getComputedStyle(document.documentElement).fontSize.split(
|
|
194
|
+
"px"
|
|
195
|
+
)[0], u = 2;
|
|
196
|
+
o.width = s < l ? s : l, o.height = (s < l ? s : l) / u, o.setAttribute("id", "signature-canvas"), o.setAttribute("part", "canvas");
|
|
197
|
+
const c = document.createElement("div");
|
|
198
|
+
c.setAttribute("id", "signature-upload-wrapper"), c.innerHTML = `
|
|
199
|
+
<p part="upload">
|
|
200
|
+
<strong>or</strong>
|
|
201
|
+
<label>
|
|
202
|
+
<input type='file' onclick='this.value=null;' id='upload-signature' accept='image/jpeg, image/png, image/svg+xml' />
|
|
203
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none">
|
|
204
|
+
<rect width="16" height="16" fill="#F9F0E7" rx="2"/>
|
|
205
|
+
<mask id="sign" width="16" height="16" x="0" y="0" maskUnits="userSpaceOnUse" style="mask-type:alpha">
|
|
206
|
+
<rect width="16" height="16" fill="#D9D9D9" rx="2"/>
|
|
207
|
+
</mask>
|
|
208
|
+
<g mask="url(#sign)">
|
|
209
|
+
<path fill="#2D2B2A" d="M0 13.333h16V16H0z"/>
|
|
210
|
+
</g>
|
|
211
|
+
<path fill="#2D2B2A" fill-rule="evenodd" d="M2.69 7.346a.23.23 0 0 1 .059-.073.275.275 0 0 1 .284-.034c.07.036.146.064.224.084h.12c0-.012.105-.048.105-.395a.796.796 0 0 1 .211-.61.667.667 0 0 1 .607-.096c.202.061.39.154.555.275.194.138.38.286.555.443.146.134.31.25.489.347l.092.047c.119.06.238-.023.185-.143l-.04-.12a.817.817 0 0 1-.066-.694.675.675 0 0 1 .244-.273.774.774 0 0 1 .364-.12c.324-.028.651 0 .964.083h.026c.027-.861.225-1.83.82-2.523.593-.694 1.478-.993 2.205-.837.726.155 1.307.73 1.307 1.602 0 1.34-.872 2.26-1.915 2.93.471.374.85.835 1.11 1.351.027.046.05.094.065.144h.014a.55.55 0 0 0 .079.203.44.44 0 0 0 .04.18c.002.025.011.05.026.07h-.013c.037.17.041.344.013.515a.955.955 0 0 1-.188.493 1.097 1.097 0 0 1-.433.344 1.346 1.346 0 0 1-1.122.012 2.194 2.194 0 0 1-.846-.67 5.024 5.024 0 0 1-.462-.681h-.026a.502.502 0 0 0-.106-.144.014.014 0 0 1-.01-.003.011.011 0 0 1-.003-.009.035.035 0 0 1-.013-.023.047.047 0 0 1-.011-.017.626.626 0 0 0-.055-.163.24.24 0 0 0-.014-.095h.014a3.477 3.477 0 0 1-.198-.49 6.318 6.318 0 0 1-.278-1.699L7.51 6.51c-.243-.07-.5-.094-.753-.071-.158.024-.198.071-.211.107-.014.036-.04.168.053.359.092.191.171.478.118.658a.45.45 0 0 1-.21.25.66.66 0 0 1-.305.06 1.521 1.521 0 0 1-.568-.19 3.533 3.533 0 0 1-.58-.42 3.54 3.54 0 0 0-.49-.394 1.49 1.49 0 0 0-.409-.203c-.053-.024-.079-.024-.092-.012H4.05c-.014.012-.066.072-.066.275 0 .395-.12.705-.423.813a.813.813 0 0 1-.41.024 1.646 1.646 0 0 1-.343-.12.237.237 0 0 1-.126-.127.208.208 0 0 1 .007-.172Zm5.731.766c.068.204.152.404.251.598.011.053.03.105.053.155.036.068.08.132.132.191.02.05.047.099.08.144.085.152.186.296.303.43.167.22.389.4.647.526a.847.847 0 0 0 .687-.011.655.655 0 0 0 .247-.204.573.573 0 0 0 .11-.287 1.435 1.435 0 0 0-.04-.454h-.014a.496.496 0 0 0-.079-.335.491.491 0 0 0-.119-.191 3.842 3.842 0 0 0-1.017-1.16l-.356.18a.253.253 0 0 1-.193.027.248.248 0 0 1-.088-.041.22.22 0 0 1-.063-.07.219.219 0 0 1-.02-.172.242.242 0 0 1 .113-.14l.172-.083a3.388 3.388 0 0 0-.463-.251l-.58-.24c.022.47.101.935.237 1.388Zm.568-1.555c.24.12.474.252.7.395 1.017-.634 1.81-1.459 1.81-2.63 0-.67-.41-1.053-.912-1.16-.502-.108-1.189.083-1.704.669-.515.586-.7 1.47-.713 2.32v.083c.251.084.515.192.819.323Z" clip-rule="evenodd"/>
|
|
212
|
+
</svg>
|
|
213
|
+
<span>upload a signature</span>
|
|
214
|
+
</label>
|
|
215
|
+
</p>
|
|
216
|
+
`;
|
|
217
|
+
const d = document.createElement("p");
|
|
218
|
+
d.innerHTML = `
|
|
219
|
+
<button data-variant="solid" type="button" name="publish" id="publish">
|
|
220
|
+
<span>
|
|
221
|
+
Continue
|
|
222
|
+
</span>
|
|
223
|
+
<svg
|
|
224
|
+
aria-hidden="true"
|
|
225
|
+
width="25"
|
|
226
|
+
height="24"
|
|
227
|
+
fill="none"
|
|
228
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
229
|
+
>
|
|
230
|
+
<path
|
|
231
|
+
d="M7 12h11m0 0-4.588-4M18 12l-4.588 4"
|
|
232
|
+
stroke="#fff"
|
|
233
|
+
stroke-width="1.5"
|
|
234
|
+
stroke-linecap="round"
|
|
235
|
+
stroke-linejoin="round"
|
|
236
|
+
/>
|
|
237
|
+
</svg>
|
|
238
|
+
</button>
|
|
239
|
+
`, a.appendChild(r), a.appendChild(i), a.appendChild(o), this.allowUpload && a.appendChild(c), a.appendChild(d), e.appendChild(t), e.appendChild(a), this.core = new p(o), this.errorMessage = r.querySelector("#error"), window && (window.onresize = this.resizeCanvas()), this.clearSignatureButton = i.querySelector("#clear"), this.clearSignatureButton.addEventListener(
|
|
240
|
+
"click",
|
|
241
|
+
() => this.clearSignature()
|
|
242
|
+
), this.uploadSignatureButton = c.querySelector("#upload-signature"), this.uploadSignatureButton.addEventListener(
|
|
243
|
+
"change",
|
|
244
|
+
(h) => this.uploadSignature(h)
|
|
245
|
+
), this.publishSignatureButton = d.querySelector("#publish"), this.publishSignatureButton.addEventListener(
|
|
246
|
+
"click",
|
|
247
|
+
() => this.publishSignature()
|
|
248
|
+
);
|
|
249
|
+
}
|
|
250
|
+
disconnectedCallback() {
|
|
251
|
+
this.publishSignatureButton.removeEventListener(
|
|
252
|
+
"click",
|
|
253
|
+
() => this.publishSignature()
|
|
254
|
+
), this.clearSignatureButton.removeEventListener(
|
|
255
|
+
"click",
|
|
256
|
+
() => this.clearSignature()
|
|
257
|
+
), this.uploadSignatureButton.removeEventListener(
|
|
258
|
+
"change",
|
|
259
|
+
(e) => this.uploadSignature(e)
|
|
260
|
+
);
|
|
261
|
+
}
|
|
262
|
+
// Adjust canvas coordinate space taking into account pixel ratio,
|
|
263
|
+
// to make it look crisp on mobile devices.
|
|
264
|
+
// This also causes canvas to be cleared.
|
|
265
|
+
resizeCanvas() {
|
|
266
|
+
const e = this.shadowRoot.querySelector("canvas"), t = Math.max(window.devicePixelRatio || 1, 1);
|
|
267
|
+
e.width = (e.offsetWidth || e.width) * t, e.height = (e.offsetHeight || e.height) * t, e.getContext("2d").scale(t, t), this.core.fromData(this.core.toData());
|
|
268
|
+
}
|
|
269
|
+
publishSignature() {
|
|
270
|
+
try {
|
|
271
|
+
this.resetErrorMessage();
|
|
272
|
+
const e = this.shadowRoot.querySelector("img");
|
|
273
|
+
let t = e ? e.src : void 0;
|
|
274
|
+
if (!t && !this.core.isEmpty() && (t = this.core.toDataURL("image/svg+xml")), t)
|
|
275
|
+
this.dispatchEvent(
|
|
276
|
+
new CustomEvent("signature-pad.publish", {
|
|
277
|
+
detail: t
|
|
278
|
+
})
|
|
279
|
+
);
|
|
280
|
+
else
|
|
281
|
+
throw new Error(
|
|
282
|
+
`No signature present. ${this.allowUpload ? "Draw or upload" : "Draw"} a signature`
|
|
283
|
+
);
|
|
284
|
+
} catch (e) {
|
|
285
|
+
this.handleError(e.message);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
resetErrorMessage() {
|
|
289
|
+
this.errorMessage.textContent = "";
|
|
290
|
+
}
|
|
291
|
+
handleError(e) {
|
|
292
|
+
this.errorMessage.textContent = e;
|
|
293
|
+
}
|
|
294
|
+
clearSignature() {
|
|
295
|
+
this.resetErrorMessage();
|
|
296
|
+
const e = this.shadowRoot.querySelector("canvas"), t = this.shadowRoot.querySelector("img");
|
|
297
|
+
t && (t.remove(), e.removeAttribute("hidden")), this.core.clear();
|
|
298
|
+
}
|
|
299
|
+
previewUpload(e) {
|
|
300
|
+
const t = this.shadowRoot.querySelector("canvas");
|
|
301
|
+
let a = this.shadowRoot.querySelector("img");
|
|
302
|
+
a || (a = document.createElement("img")), a.src = e, a.setAttribute("part", "upload-preview-image"), t.setAttribute("hidden", !0), t.insertAdjacentElement("afterend", a);
|
|
303
|
+
}
|
|
304
|
+
async uploadSignature(e) {
|
|
305
|
+
try {
|
|
306
|
+
this.resetErrorMessage();
|
|
307
|
+
const { files: t } = e.target, a = await n.retrieve(t);
|
|
308
|
+
this.previewUpload(a);
|
|
309
|
+
} catch (t) {
|
|
310
|
+
this.handleError(t.message);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
get allowUpload() {
|
|
314
|
+
return this.hasAttribute("allow-upload");
|
|
315
|
+
}
|
|
316
|
+
get themeColor() {
|
|
317
|
+
return this.getAttribute("theme-color") || "#001096";
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
"customElements" in window && !window.customElements.get("smileid-signature-pad") && window.customElements.define("smileid-signature-pad", g);
|
|
321
|
+
export {
|
|
322
|
+
g as S
|
|
323
|
+
};
|
|
324
|
+
//# sourceMappingURL=SignaturePad-C7MtmT8m.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SignaturePad-C7MtmT8m.js","sources":["../../lib/components/signature-pad/src/SignaturePad.js"],"sourcesContent":["import SignaturePadCore from 'signature_pad';\r\n\r\nclass SmartFileUpload {\r\n static memoryLimit = 2048000;\r\n\r\n static supportedTypes = ['image/jpeg', 'image/png', 'image/svg+xml'];\r\n\r\n static getHumanSize(numberOfBytes) {\r\n // Approximate to the closest prefixed unit\r\n const units = ['B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\r\n const exponent = Math.min(\r\n Math.floor(Math.log(numberOfBytes) / Math.log(1024)),\r\n units.length - 1,\r\n );\r\n const approx = numberOfBytes / 1024 ** exponent;\r\n const output =\r\n exponent === 0\r\n ? `${numberOfBytes} bytes`\r\n : `${approx.toFixed(0)} ${units[exponent]}`;\r\n\r\n return output;\r\n }\r\n\r\n static getData(file) {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n\r\n reader.onload = (e) => {\r\n resolve(e.target.result);\r\n };\r\n reader.onerror = () => {\r\n reject(\r\n new Error(\r\n 'An error occurred reading the file. Please check the file, and try again',\r\n ),\r\n );\r\n };\r\n reader.readAsDataURL(file);\r\n });\r\n }\r\n\r\n static async retrieve(files) {\r\n if (files.length > 1) {\r\n throw new Error('Only one file upload is permitted at a time');\r\n }\r\n\r\n const file = files[0];\r\n\r\n if (!SmartFileUpload.supportedTypes.includes(file.type)) {\r\n throw new Error(\r\n 'Unsupported file format. Please ensure that you are providing a JPG, PNG or SVG image',\r\n );\r\n }\r\n\r\n if (file.size > SmartFileUpload.memoryLimit) {\r\n throw new Error(\r\n `${\r\n file.name\r\n } is too large. Please ensure that the file is less than ${SmartFileUpload.getHumanSize(\r\n SmartFileUpload.memoryLimit,\r\n )}.`,\r\n );\r\n }\r\n\r\n const imageAsDataUrl = await SmartFileUpload.getData(file);\r\n\r\n return imageAsDataUrl;\r\n }\r\n}\r\n\r\nclass SignaturePad extends HTMLElement {\r\n connectedCallback() {\r\n const shadow = this.attachShadow({ mode: 'open' });\r\n\r\n const style = document.createElement('style');\r\n style.textContent = `\r\n:host {\r\n display: block;\r\n block-size: auto;\r\n inline-size: 30rem;\r\n max-inline-size: 100%;\r\n position: relative;\r\n --color-active: #2D2B2A;\r\n --color-default: #001096;\r\n --color-disabled: #848282;\r\n}\r\n\r\n:host::part(upload) {\r\n text-align: center;\r\n}\r\n\r\n:host::part(signature-controls) {\r\n display: inline-flex;\r\n position: absolute;\r\n top: 1rem;\r\n right: 1rem;\r\n}\r\n\r\n:host::part(upload) svg + * {\r\n margin-inline-start: .5rem;\r\n}\r\n\r\n:host::part(canvas) {\r\n background-color: #F9F0E7;\r\n --dot-bg: #F9F0E7;\r\n --dot-color: black;\r\n --dot-size: 1px;\r\n --dot-space: 22px;\r\n background:\r\n linear-gradient(90deg, var(--dot-bg) calc(var(--dot-space) - var(--dot-size)), transparent 1%) center / var(--dot-space) var(--dot-space),\r\n linear-gradient(var(--dot-bg) calc(var(--dot-space) - var(--dot-size)), transparent 1%) center / var(--dot-space) var(--dot-space),\r\n var(--dot-color);\r\n border-radius: 2rem;\r\n inline-size: 30rem;\r\n max-inline-size: 100%;\r\n aspect-ratio: 2 / 1;\r\n}\r\n\r\n:host::part(upload-preview-image) {\r\n max-inline-size: 10rem;\r\n margin-inline: auto;\r\n}\r\n\r\n.visually-hidden {\r\n clip: rect(0 0 0 0); \r\n clip-path: inset(50%);\r\n height: 1px;\r\n overflow: hidden;\r\n position: absolute;\r\n white-space: nowrap; \r\n width: 1px;\r\n}\r\n\r\nbutton,\r\nlabel {\r\n font: inherit;\r\n cursor: pointer;\r\n}\r\n\r\nlabel {\r\n display: inline-flex;\r\n text-decoration: underline;\r\n}\r\n\r\nlabel svg + * {\r\n margin-inline-start: .5rem;\r\n}\r\n\r\n[type=\"file\"] {\r\n display: none;\r\n}\r\n\r\n.center {\r\n text-align: center;\r\n margin-inline: auto;\r\n}\r\n\r\n.color-red {\r\n color: red;\r\n}\r\n\r\nbutton[data-variant=\"icon\"] {\r\n appearance: none;\r\n -webkit-appearance: none;\r\n background-color: transparent;\r\n border: 0px;\r\n}\r\n\r\nbutton[data-variant=\"text\"] {\r\n appearance: none;\r\n -webkit-appearance: none;\r\n background-color: transparent;\r\n border: 0px;\r\n text-decoration: underline;\r\n display: inline-flex;\r\n align-items: baseline;\r\n}\r\n\r\nbutton[data-variant=\"solid\"] {\r\n --button-color: ${this.themeColor};\r\n border-radius: 2.5rem;\r\n border: 0;\r\n background-color: transparent;\r\n color: #fff;\r\n cursor: pointer;\r\n inline-size: 100%;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: 18px;\r\n font-weight: 600;\r\n padding: .75rem 1.5rem;\r\n text-align: center;\r\n background-color: var(--button-color);\r\n border: 2px solid var(--button-color);\r\n}\r\n\r\nbutton:hover,\r\nbutton:focus,\r\nbutton:active {\r\n --button-color: var(--color-active);\r\n}\r\n\r\nbutton:disabled {\r\n --button-color: var(--color-disabled);\r\n}\r\n`;\r\n\r\n const wrapper = document.createElement('div');\r\n const errorMessage = document.createElement('div');\r\n errorMessage.innerHTML = `\r\n <p id=\"error\" class=\"color-red | center\"><p>\r\n `;\r\n\r\n const signatureControls = document.createElement('div');\r\n signatureControls.setAttribute('id', 'controls');\r\n signatureControls.setAttribute('part', 'signature-controls');\r\n signatureControls.innerHTML = `\r\n <button data-variant=\"icon\" type=\"button\" name=\"clear\" id=\"clear\">\r\n <span class=\"visually-hidden\">\r\n Clear Signature\r\n </span>\r\n <svg fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" viewBox=\"0 0 17 18\">\r\n <path d=\"M3.314 15.646a8.004 8.004 0 01-2.217-4.257 8.06 8.06 0 01.545-4.655l1.789.788a6.062 6.062 0 001.264 6.737 6.033 6.033 0 008.551 0c2.358-2.37 2.358-6.224 0-8.592a5.996 5.996 0 00-4.405-1.782l.662 2.354-3.128-.796-3.127-.796 2.25-2.324L7.748 0l.55 1.953a7.966 7.966 0 016.33 2.326 8.004 8.004 0 012.342 5.684 8.005 8.005 0 01-2.343 5.683A7.928 7.928 0 018.97 18a7.928 7.928 0 01-5.656-2.354z\" fill=\"currentColor\" />\r\n </svg>\r\n </button>\r\n `;\r\n\r\n const canvas = document.createElement('canvas');\r\n\r\n /**\r\n * NOTE: In order to make this responsive, we need to calculate the width\r\n * / height of the canvas element relative to the closest visible element\r\n *\r\n * Within our consuming context, we do follow these steps:\r\n * - Find the closest ancestor that is visible\r\n * - Find the visible child of that ancestor\r\n * - Get the reference width / inline-size of the element\r\n * - Compute the canvas.height as the lesser of the reference width or the\r\n * inline size of the canvas set in CSS\r\n * - Compute the canvas.height as half the size of the canvas.width or the\r\n * block size computed by the aspect-ratio property\r\n */\r\n\r\n const closestVisibleAncestor = this.parentElement.closest(':not([hidden])');\r\n const visibleChild = closestVisibleAncestor.querySelector(':not([hidden])');\r\n const containerWidth = visibleChild.offsetWidth;\r\n\r\n const remInPx = getComputedStyle(document.documentElement).fontSize.split(\r\n 'px',\r\n )[0];\r\n const componentMaxInlineSize = 30 * remInPx; // 30rem from the style declaration\r\n const aspectRatio = 2; // 2 from the canvas style aspect ratio declaration\r\n\r\n canvas.width =\r\n containerWidth < componentMaxInlineSize\r\n ? containerWidth\r\n : componentMaxInlineSize;\r\n canvas.height =\r\n (containerWidth < componentMaxInlineSize\r\n ? containerWidth\r\n : componentMaxInlineSize) / aspectRatio;\r\n\r\n canvas.setAttribute('id', 'signature-canvas');\r\n canvas.setAttribute('part', 'canvas');\r\n\r\n const uploadControl = document.createElement('div');\r\n uploadControl.setAttribute('id', 'signature-upload-wrapper');\r\n uploadControl.innerHTML = `\r\n <p part=\"upload\">\r\n <strong>or</strong>\r\n <label>\r\n <input type='file' onclick='this.value=null;' id='upload-signature' accept='image/jpeg, image/png, image/svg+xml' />\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\r\n <rect width=\"16\" height=\"16\" fill=\"#F9F0E7\" rx=\"2\"/>\r\n <mask id=\"sign\" width=\"16\" height=\"16\" x=\"0\" y=\"0\" maskUnits=\"userSpaceOnUse\" style=\"mask-type:alpha\">\r\n <rect width=\"16\" height=\"16\" fill=\"#D9D9D9\" rx=\"2\"/>\r\n </mask>\r\n <g mask=\"url(#sign)\">\r\n <path fill=\"#2D2B2A\" d=\"M0 13.333h16V16H0z\"/>\r\n </g>\r\n <path fill=\"#2D2B2A\" fill-rule=\"evenodd\" d=\"M2.69 7.346a.23.23 0 0 1 .059-.073.275.275 0 0 1 .284-.034c.07.036.146.064.224.084h.12c0-.012.105-.048.105-.395a.796.796 0 0 1 .211-.61.667.667 0 0 1 .607-.096c.202.061.39.154.555.275.194.138.38.286.555.443.146.134.31.25.489.347l.092.047c.119.06.238-.023.185-.143l-.04-.12a.817.817 0 0 1-.066-.694.675.675 0 0 1 .244-.273.774.774 0 0 1 .364-.12c.324-.028.651 0 .964.083h.026c.027-.861.225-1.83.82-2.523.593-.694 1.478-.993 2.205-.837.726.155 1.307.73 1.307 1.602 0 1.34-.872 2.26-1.915 2.93.471.374.85.835 1.11 1.351.027.046.05.094.065.144h.014a.55.55 0 0 0 .079.203.44.44 0 0 0 .04.18c.002.025.011.05.026.07h-.013c.037.17.041.344.013.515a.955.955 0 0 1-.188.493 1.097 1.097 0 0 1-.433.344 1.346 1.346 0 0 1-1.122.012 2.194 2.194 0 0 1-.846-.67 5.024 5.024 0 0 1-.462-.681h-.026a.502.502 0 0 0-.106-.144.014.014 0 0 1-.01-.003.011.011 0 0 1-.003-.009.035.035 0 0 1-.013-.023.047.047 0 0 1-.011-.017.626.626 0 0 0-.055-.163.24.24 0 0 0-.014-.095h.014a3.477 3.477 0 0 1-.198-.49 6.318 6.318 0 0 1-.278-1.699L7.51 6.51c-.243-.07-.5-.094-.753-.071-.158.024-.198.071-.211.107-.014.036-.04.168.053.359.092.191.171.478.118.658a.45.45 0 0 1-.21.25.66.66 0 0 1-.305.06 1.521 1.521 0 0 1-.568-.19 3.533 3.533 0 0 1-.58-.42 3.54 3.54 0 0 0-.49-.394 1.49 1.49 0 0 0-.409-.203c-.053-.024-.079-.024-.092-.012H4.05c-.014.012-.066.072-.066.275 0 .395-.12.705-.423.813a.813.813 0 0 1-.41.024 1.646 1.646 0 0 1-.343-.12.237.237 0 0 1-.126-.127.208.208 0 0 1 .007-.172Zm5.731.766c.068.204.152.404.251.598.011.053.03.105.053.155.036.068.08.132.132.191.02.05.047.099.08.144.085.152.186.296.303.43.167.22.389.4.647.526a.847.847 0 0 0 .687-.011.655.655 0 0 0 .247-.204.573.573 0 0 0 .11-.287 1.435 1.435 0 0 0-.04-.454h-.014a.496.496 0 0 0-.079-.335.491.491 0 0 0-.119-.191 3.842 3.842 0 0 0-1.017-1.16l-.356.18a.253.253 0 0 1-.193.027.248.248 0 0 1-.088-.041.22.22 0 0 1-.063-.07.219.219 0 0 1-.02-.172.242.242 0 0 1 .113-.14l.172-.083a3.388 3.388 0 0 0-.463-.251l-.58-.24c.022.47.101.935.237 1.388Zm.568-1.555c.24.12.474.252.7.395 1.017-.634 1.81-1.459 1.81-2.63 0-.67-.41-1.053-.912-1.16-.502-.108-1.189.083-1.704.669-.515.586-.7 1.47-.713 2.32v.083c.251.084.515.192.819.323Z\" clip-rule=\"evenodd\"/>\r\n </svg>\r\n <span>upload a signature</span>\r\n </label>\r\n </p>\r\n `;\r\n\r\n const publishSignatureContainer = document.createElement('p');\r\n publishSignatureContainer.innerHTML = `\r\n <button data-variant=\"solid\" type=\"button\" name=\"publish\" id=\"publish\">\r\n <span>\r\n Continue\r\n </span>\r\n <svg\r\n aria-hidden=\"true\"\r\n width=\"25\"\r\n height=\"24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M7 12h11m0 0-4.588-4M18 12l-4.588 4\"\r\n stroke=\"#fff\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n `;\r\n\r\n wrapper.appendChild(errorMessage);\r\n wrapper.appendChild(signatureControls);\r\n wrapper.appendChild(canvas);\r\n if (this.allowUpload) wrapper.appendChild(uploadControl);\r\n wrapper.appendChild(publishSignatureContainer);\r\n\r\n shadow.appendChild(style);\r\n shadow.appendChild(wrapper);\r\n\r\n this.core = new SignaturePadCore(canvas);\r\n\r\n // Error Message\r\n this.errorMessage = errorMessage.querySelector('#error');\r\n\r\n // Canvas Resize / Sizing\r\n if (window) {\r\n window.onresize = this.resizeCanvas();\r\n }\r\n\r\n // Signature Pad Controls\r\n this.clearSignatureButton = signatureControls.querySelector('#clear');\r\n this.clearSignatureButton.addEventListener('click', () =>\r\n this.clearSignature(),\r\n );\r\n\r\n // Upload Controls\r\n this.uploadSignatureButton =\r\n uploadControl.querySelector('#upload-signature');\r\n this.uploadSignatureButton.addEventListener('change', (event) =>\r\n this.uploadSignature(event),\r\n );\r\n\r\n // Publish Signature\r\n this.publishSignatureButton =\r\n publishSignatureContainer.querySelector('#publish');\r\n this.publishSignatureButton.addEventListener('click', () =>\r\n this.publishSignature(),\r\n );\r\n }\r\n\r\n disconnectedCallback() {\r\n this.publishSignatureButton.removeEventListener('click', () =>\r\n this.publishSignature(),\r\n );\r\n this.clearSignatureButton.removeEventListener('click', () =>\r\n this.clearSignature(),\r\n );\r\n this.uploadSignatureButton.removeEventListener('change', (event) =>\r\n this.uploadSignature(event),\r\n );\r\n }\r\n\r\n // Adjust canvas coordinate space taking into account pixel ratio,\r\n // to make it look crisp on mobile devices.\r\n // This also causes canvas to be cleared.\r\n resizeCanvas() {\r\n // When zoomed out to less than 100%, for some very strange reason,\r\n // some browsers report devicePixelRatio as less than 1\r\n // and only part of the canvas is cleared then.\r\n const canvas = this.shadowRoot.querySelector('canvas');\r\n const ratio = Math.max(window.devicePixelRatio || 1, 1);\r\n\r\n // This part causes the canvas to be cleared\r\n canvas.width = (canvas.offsetWidth || canvas.width) * ratio;\r\n canvas.height = (canvas.offsetHeight || canvas.height) * ratio;\r\n canvas.getContext('2d').scale(ratio, ratio);\r\n\r\n // This library does not listen for canvas changes, so after the canvas is automatically\r\n // cleared by the browser, SignaturePad#isEmpty might still return false, even though the\r\n // canvas looks empty, because the internal data of this library wasn't cleared. To make sure\r\n // that the state of this library is consistent with visual state of the canvas, you\r\n // have to clear it manually.\r\n // signaturePad.clear();\r\n\r\n // If you want to keep the drawing on resize instead of clearing it you can reset the data.\r\n this.core.fromData(this.core.toData());\r\n }\r\n\r\n publishSignature() {\r\n try {\r\n this.resetErrorMessage();\r\n const previewImage = this.shadowRoot.querySelector('img');\r\n let image = previewImage ? previewImage.src : undefined;\r\n if (!image && !this.core.isEmpty()) {\r\n image = this.core.toDataURL('image/svg+xml');\r\n }\r\n\r\n if (image) {\r\n this.dispatchEvent(\r\n new CustomEvent('signature-pad.publish', {\r\n detail: image,\r\n }),\r\n );\r\n } else {\r\n throw new Error(\r\n `No signature present. ${\r\n this.allowUpload ? 'Draw or upload' : 'Draw'\r\n } a signature`,\r\n );\r\n }\r\n } catch (error) {\r\n this.handleError(error.message);\r\n }\r\n }\r\n\r\n resetErrorMessage() {\r\n this.errorMessage.textContent = '';\r\n }\r\n\r\n handleError(error) {\r\n this.errorMessage.textContent = error;\r\n }\r\n\r\n clearSignature() {\r\n this.resetErrorMessage();\r\n const canvas = this.shadowRoot.querySelector('canvas');\r\n const img = this.shadowRoot.querySelector('img');\r\n\r\n if (img) {\r\n img.remove();\r\n canvas.removeAttribute('hidden');\r\n }\r\n\r\n this.core.clear();\r\n }\r\n\r\n previewUpload(fileData) {\r\n const canvas = this.shadowRoot.querySelector('canvas');\r\n let img = this.shadowRoot.querySelector('img');\r\n\r\n if (!img) {\r\n img = document.createElement('img');\r\n }\r\n\r\n img.src = fileData;\r\n img.setAttribute('part', 'upload-preview-image');\r\n canvas.setAttribute('hidden', true);\r\n canvas.insertAdjacentElement('afterend', img);\r\n }\r\n\r\n async uploadSignature(event) {\r\n try {\r\n this.resetErrorMessage();\r\n const { files } = event.target;\r\n\r\n // validate file, and convert file to data url\r\n const fileData = await SmartFileUpload.retrieve(files);\r\n\r\n // swap out canvas for an image for preview\r\n this.previewUpload(fileData);\r\n } catch (error) {\r\n this.handleError(error.message);\r\n }\r\n }\r\n\r\n get allowUpload() {\r\n return this.hasAttribute('allow-upload');\r\n }\r\n\r\n get themeColor() {\r\n return this.getAttribute('theme-color') || '#001096';\r\n }\r\n}\r\n\r\nif (\r\n 'customElements' in window &&\r\n !window.customElements.get('smileid-signature-pad')\r\n) {\r\n window.customElements.define('smileid-signature-pad', SignaturePad);\r\n}\r\n\r\nexport default SignaturePad;\r\n"],"names":["SmartFileUpload","numberOfBytes","units","exponent","approx","file","resolve","reject","reader","e","files","SignaturePad","shadow","style","wrapper","errorMessage","signatureControls","canvas","containerWidth","componentMaxInlineSize","aspectRatio","uploadControl","publishSignatureContainer","SignaturePadCore","event","ratio","previewImage","image","error","img","fileData"],"mappings":"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"}
|