@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.
Files changed (127) hide show
  1. package/dist/esm/DocumentCaptureScreens-ChpBVvNE.js +1532 -0
  2. package/dist/esm/DocumentCaptureScreens-ChpBVvNE.js.map +1 -0
  3. package/dist/esm/EndUserConsent-CMHp-34-.js +715 -0
  4. package/dist/esm/EndUserConsent-CMHp-34-.js.map +1 -0
  5. package/dist/esm/Navigation-juBE4qOw.js +136 -0
  6. package/dist/esm/Navigation-juBE4qOw.js.map +1 -0
  7. package/dist/esm/PoweredBySmileId-CxbaihMu.js +33 -0
  8. package/dist/esm/PoweredBySmileId-CxbaihMu.js.map +1 -0
  9. package/dist/esm/SelfieCaptureScreens-DMo-z-32.js +7618 -0
  10. package/dist/esm/SelfieCaptureScreens-DMo-z-32.js.map +1 -0
  11. package/dist/esm/SignaturePad-C7MtmT8m.js +324 -0
  12. package/dist/esm/SignaturePad-C7MtmT8m.js.map +1 -0
  13. package/dist/esm/TotpConsent-CQU5jQi4.js +730 -0
  14. package/dist/esm/TotpConsent-CQU5jQi4.js.map +1 -0
  15. package/dist/esm/combobox.js +300 -0
  16. package/dist/esm/combobox.js.map +1 -0
  17. package/dist/esm/document.js +5 -0
  18. package/dist/esm/document.js.map +1 -0
  19. package/dist/esm/end-user-consent.js +5 -0
  20. package/dist/esm/end-user-consent.js.map +1 -0
  21. package/dist/esm/main.js +22 -0
  22. package/dist/esm/main.js.map +1 -0
  23. package/dist/esm/navigation.js +5 -0
  24. package/dist/esm/navigation.js.map +1 -0
  25. package/dist/esm/package-D_4zJ9ck.js +105 -0
  26. package/dist/esm/package-D_4zJ9ck.js.map +1 -0
  27. package/dist/esm/selfie.js +5 -0
  28. package/dist/esm/selfie.js.map +1 -0
  29. package/dist/esm/signature-pad.js +5 -0
  30. package/dist/esm/signature-pad.js.map +1 -0
  31. package/dist/esm/smart-camera-web.js +302 -0
  32. package/dist/esm/smart-camera-web.js.map +1 -0
  33. package/dist/esm/styles-D2i3GFLK.js +405 -0
  34. package/dist/esm/styles-D2i3GFLK.js.map +1 -0
  35. package/dist/esm/totp-consent.js +5 -0
  36. package/dist/esm/totp-consent.js.map +1 -0
  37. package/dist/smart-camera-web.js +4130 -0
  38. package/dist/smart-camera-web.js.map +1 -0
  39. package/dist/types/combobox.d.ts +21 -0
  40. package/dist/types/document.d.ts +21 -0
  41. package/dist/types/end-user-consent.d.ts +21 -0
  42. package/dist/types/main.d.ts +331 -0
  43. package/dist/types/navigation.d.ts +21 -0
  44. package/dist/types/selfie.d.ts +21 -0
  45. package/dist/types/signature-pad.d.ts +21 -0
  46. package/dist/types/smart-camera-web.d.ts +21 -0
  47. package/dist/types/totp-consent.d.ts +21 -0
  48. package/{src → lib}/components/camera-permission/CameraPermission.js +0 -1
  49. package/{src → lib}/components/document/src/document-capture/DocumentCapture.js +0 -1
  50. package/{src → lib}/components/document/src/document-capture-review/DocumentCaptureReview.js +0 -1
  51. package/{src → lib}/components/selfie/src/SelfieCaptureScreens.js +188 -37
  52. package/{src → lib}/components/selfie/src/index.js +0 -2
  53. package/{src → lib}/components/selfie/src/selfie-capture/SelfieCapture.js +3 -4
  54. package/{src → lib}/components/selfie/src/selfie-capture-instructions/SelfieCaptureInstructions.js +0 -1
  55. package/{src → lib}/components/selfie/src/selfie-capture-review/SelfieCaptureReview.js +0 -8
  56. package/lib/components/selfie/src/selfie-capture-wrapper/SelfieCaptureWrapper.tsx +226 -0
  57. package/lib/components/selfie/src/selfie-capture-wrapper/index.ts +1 -0
  58. package/lib/components/selfie/src/smartselfie-capture/OvalProgress.tsx +81 -0
  59. package/lib/components/selfie/src/smartselfie-capture/SmartSelfieCapture.tsx +223 -0
  60. package/lib/components/selfie/src/smartselfie-capture/components/AlertDisplay.tsx +34 -0
  61. package/lib/components/selfie/src/smartselfie-capture/components/CameraPreview.tsx +97 -0
  62. package/lib/components/selfie/src/smartselfie-capture/components/CaptureControls.tsx +74 -0
  63. package/lib/components/selfie/src/smartselfie-capture/components/index.ts +3 -0
  64. package/lib/components/selfie/src/smartselfie-capture/constants.ts +23 -0
  65. package/lib/components/selfie/src/smartselfie-capture/hooks/index.ts +2 -0
  66. package/lib/components/selfie/src/smartselfie-capture/hooks/useCamera.ts +94 -0
  67. package/lib/components/selfie/src/smartselfie-capture/hooks/useFaceCapture.ts +558 -0
  68. package/lib/components/selfie/src/smartselfie-capture/index.ts +1 -0
  69. package/lib/components/selfie/src/smartselfie-capture/utils/alertMessages.ts +12 -0
  70. package/lib/components/selfie/src/smartselfie-capture/utils/canvas.ts +105 -0
  71. package/lib/components/selfie/src/smartselfie-capture/utils/faceDetection.ts +129 -0
  72. package/lib/components/selfie/src/smartselfie-capture/utils/imageCapture.ts +65 -0
  73. package/lib/components/selfie/src/smartselfie-capture/utils/index.ts +4 -0
  74. package/lib/components/selfie/src/smartselfie-capture/utils/mediapipeManager.ts +60 -0
  75. package/{src → lib}/components/signature-pad/package.json +1 -1
  76. package/{src → lib}/components/smart-camera-web/src/README.md +0 -1
  77. package/{src → lib}/styles/src/styles.js +0 -1
  78. package/package.json +76 -24
  79. package/src/index.js +0 -5
  80. /package/{src → lib}/components/README.md +0 -0
  81. /package/{src → lib}/components/attribution/PoweredBySmileId.js +0 -0
  82. /package/{src → lib}/components/camera-permission/CameraPermission.stories.js +0 -0
  83. /package/{src → lib}/components/combobox/src/Combobox.js +0 -0
  84. /package/{src → lib}/components/combobox/src/index.js +0 -0
  85. /package/{src → lib}/components/document/src/DocumentCaptureScreens.js +0 -0
  86. /package/{src → lib}/components/document/src/DocumentCaptureScreens.stories.js +0 -0
  87. /package/{src → lib}/components/document/src/README.md +0 -0
  88. /package/{src → lib}/components/document/src/document-capture/DocumentCapture.stories.js +0 -0
  89. /package/{src → lib}/components/document/src/document-capture/README.md +0 -0
  90. /package/{src → lib}/components/document/src/document-capture/index.js +0 -0
  91. /package/{src → lib}/components/document/src/document-capture-instructions/DocumentCaptureInstructions.js +0 -0
  92. /package/{src → lib}/components/document/src/document-capture-instructions/DocumentCaptureInstructions.stories.js +0 -0
  93. /package/{src → lib}/components/document/src/document-capture-instructions/README.md +0 -0
  94. /package/{src → lib}/components/document/src/document-capture-instructions/index.js +0 -0
  95. /package/{src → lib}/components/document/src/document-capture-review/DocumentCaptureReview.stories.js +0 -0
  96. /package/{src → lib}/components/document/src/document-capture-review/README.md +0 -0
  97. /package/{src → lib}/components/document/src/document-capture-review/index.js +0 -0
  98. /package/{src → lib}/components/document/src/index.js +0 -0
  99. /package/{src → lib}/components/end-user-consent/src/EndUserConsent.js +0 -0
  100. /package/{src → lib}/components/end-user-consent/src/EndUserConsent.stories.js +0 -0
  101. /package/{src → lib}/components/end-user-consent/src/index.js +0 -0
  102. /package/{src → lib}/components/navigation/src/Navigation.js +0 -0
  103. /package/{src → lib}/components/navigation/src/Navigation.stories.js +0 -0
  104. /package/{src → lib}/components/navigation/src/index.js +0 -0
  105. /package/{src → lib}/components/selfie/README.md +0 -0
  106. /package/{src → lib}/components/selfie/src/SelfieCaptureScreens.stories.js +0 -0
  107. /package/{src → lib}/components/selfie/src/selfie-capture/SelfieCapture.stories.js +0 -0
  108. /package/{src → lib}/components/selfie/src/selfie-capture/index.js +0 -0
  109. /package/{src → lib}/components/selfie/src/selfie-capture-instructions/SelfieCaptureInstructions.stories.js +0 -0
  110. /package/{src → lib}/components/selfie/src/selfie-capture-instructions/index.js +0 -0
  111. /package/{src → lib}/components/selfie/src/selfie-capture-review/SelfieCaptureReview.stories.js +0 -0
  112. /package/{src → lib}/components/selfie/src/selfie-capture-review/index.js +0 -0
  113. /package/{src → lib}/components/signature-pad/package-lock.json +0 -0
  114. /package/{src → lib}/components/signature-pad/src/SignaturePad.js +0 -0
  115. /package/{src → lib}/components/signature-pad/src/SignaturePad.stories.js +0 -0
  116. /package/{src → lib}/components/signature-pad/src/index.js +0 -0
  117. /package/{src → lib}/components/smart-camera-web/src/SmartCameraWeb.js +0 -0
  118. /package/{src → lib}/components/smart-camera-web/src/SmartCameraWeb.stories.js +0 -0
  119. /package/{src → lib}/components/totp-consent/src/TotpConsent.js +0 -0
  120. /package/{src → lib}/components/totp-consent/src/index.js +0 -0
  121. /package/{src → lib}/domain/camera/src/README.md +0 -0
  122. /package/{src → lib}/domain/camera/src/SmartCamera.js +0 -0
  123. /package/{src → lib}/domain/constants/src/Constants.js +0 -0
  124. /package/{src → lib}/domain/file-upload/README.md +0 -0
  125. /package/{src → lib}/domain/file-upload/src/SmartFileUpload.js +0 -0
  126. /package/{src → lib}/styles/README.md +0 -0
  127. /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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"}