@smileid/web-components 10.0.6 → 11.0.1
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/README.md +15 -15
- package/dist/README.md +15 -0
- package/dist/components/README.md +14 -0
- package/dist/components/document/src/README.md +111 -0
- package/dist/components/document/src/document-capture/README.md +90 -0
- package/dist/components/document/src/document-capture-instructions/README.md +56 -0
- package/dist/components/document/src/document-capture-review/README.md +79 -0
- package/dist/components/selfie/README.md +225 -0
- package/dist/components/smart-camera-web/src/README.md +207 -0
- package/dist/domain/camera/src/README.md +38 -0
- package/dist/domain/file-upload/README.md +35 -0
- package/dist/esm/{DocumentCaptureScreens-BjATTDqu.js → DocumentCaptureScreens-DmH2JZDA.js} +3 -3
- package/dist/esm/DocumentCaptureScreens-DmH2JZDA.js.map +1 -0
- package/dist/esm/EndUserConsent-D4fd1ovG.js.map +1 -1
- package/dist/esm/Navigation-CTjK6tLU.js.map +1 -1
- package/dist/esm/PoweredBySmileId-CxbaihMu.js.map +1 -1
- package/dist/esm/SelfieCaptureScreens-DbdN2zNk.js +7901 -0
- package/dist/esm/SelfieCaptureScreens-DbdN2zNk.js.map +1 -0
- package/dist/esm/SignaturePad-C7MtmT8m.js.map +1 -1
- package/dist/esm/TotpConsent-CQU5jQi4.js.map +1 -1
- package/dist/esm/combobox.js.map +1 -1
- package/dist/esm/document.js +1 -1
- package/dist/esm/main.js +2 -2
- package/dist/esm/{package-CZlW6BZn.js → package-bgeQiff6.js} +2 -2
- package/dist/esm/package-bgeQiff6.js.map +1 -0
- package/dist/esm/selfie.js +1 -1
- package/dist/esm/smart-camera-web.js +3 -3
- package/dist/esm/smart-camera-web.js.map +1 -1
- package/dist/esm/styles-BOEZtbuc.js.map +1 -1
- package/dist/package-lock.json +4948 -0
- package/dist/package.json +59 -0
- package/dist/smart-camera-web.js +72 -98
- package/dist/smart-camera-web.js.gz +0 -0
- package/dist/smart-camera-web.js.map +1 -1
- package/dist/src/components/combobox/src/index.js +2 -0
- package/dist/src/components/combobox/src/index.js.map +7 -0
- package/dist/src/components/document/src/index.js +2 -0
- package/dist/src/components/document/src/index.js.map +7 -0
- package/dist/src/components/end-user-consent/src/index.js +14 -0
- package/dist/src/components/end-user-consent/src/index.js.map +7 -0
- package/dist/src/components/selfie/src/index.js +2 -0
- package/dist/src/components/selfie/src/index.js.map +7 -0
- package/dist/src/components/signature-pad/src/index.js +10 -0
- package/dist/src/components/signature-pad/src/index.js.map +7 -0
- package/dist/src/components/smart-camera-web/src/SmartCameraWeb.js +2 -0
- package/dist/src/components/smart-camera-web/src/SmartCameraWeb.js.map +7 -0
- package/dist/src/components/totp-consent/src/index.js +14 -0
- package/dist/src/components/totp-consent/src/index.js.map +7 -0
- package/dist/src/index.js.map +7 -0
- package/dist/styles/README.md +3 -0
- package/dist/types/combobox.d.ts +19 -19
- package/dist/types/document.d.ts +19 -19
- package/dist/types/end-user-consent.d.ts +19 -19
- package/dist/types/main.d.ts +24 -20
- package/dist/types/navigation.d.ts +19 -19
- package/dist/types/selfie.d.ts +19 -19
- package/dist/types/signature-pad.d.ts +19 -19
- package/dist/types/smart-camera-web.d.ts +19 -19
- package/dist/types/totp-consent.d.ts +19 -19
- package/lib/components/README.md +14 -14
- package/lib/components/attribution/PoweredBySmileId.js +42 -42
- package/lib/components/camera-permission/CameraPermission.js +139 -139
- package/lib/components/camera-permission/CameraPermission.stories.js +27 -27
- package/lib/components/combobox/src/Combobox.js +589 -589
- package/lib/components/combobox/src/index.js +1 -1
- package/lib/components/document/src/DocumentCaptureScreens.js +410 -409
- package/lib/components/document/src/DocumentCaptureScreens.stories.js +57 -57
- package/lib/components/document/src/README.md +111 -111
- package/lib/components/document/src/document-capture/DocumentCapture.js +760 -760
- package/lib/components/document/src/document-capture/DocumentCapture.stories.js +78 -78
- package/lib/components/document/src/document-capture/README.md +90 -90
- package/lib/components/document/src/document-capture/index.js +3 -3
- package/lib/components/document/src/document-capture-instructions/DocumentCaptureInstructions.js +545 -545
- package/lib/components/document/src/document-capture-instructions/DocumentCaptureInstructions.stories.js +24 -24
- package/lib/components/document/src/document-capture-instructions/README.md +56 -56
- package/lib/components/document/src/document-capture-instructions/index.js +3 -3
- package/lib/components/document/src/document-capture-review/DocumentCaptureReview.js +360 -360
- package/lib/components/document/src/document-capture-review/DocumentCaptureReview.stories.js +24 -24
- package/lib/components/document/src/document-capture-review/README.md +79 -79
- package/lib/components/document/src/document-capture-review/index.js +3 -3
- package/lib/components/document/src/index.js +3 -3
- package/lib/components/end-user-consent/src/EndUserConsent.js +795 -795
- package/lib/components/end-user-consent/src/EndUserConsent.stories.js +29 -29
- package/lib/components/end-user-consent/src/index.js +4 -4
- package/lib/components/navigation/src/Navigation.js +171 -171
- package/lib/components/navigation/src/Navigation.stories.js +24 -24
- package/lib/components/navigation/src/index.js +3 -3
- package/lib/components/selfie/README.md +225 -225
- package/lib/components/selfie/src/SelfieCaptureScreens.js +420 -431
- package/lib/components/selfie/src/SelfieCaptureScreens.stories.js +29 -29
- package/lib/components/selfie/src/index.js +3 -3
- package/lib/components/selfie/src/selfie-capture/SelfieCapture.js +1099 -1084
- package/lib/components/selfie/src/selfie-capture/SelfieCapture.stories.js +36 -36
- package/lib/components/selfie/src/selfie-capture/index.js +3 -3
- package/lib/components/selfie/src/selfie-capture-instructions/SelfieCaptureInstructions.js +689 -689
- package/lib/components/selfie/src/selfie-capture-instructions/SelfieCaptureInstructions.stories.js +23 -23
- package/lib/components/selfie/src/selfie-capture-instructions/index.js +3 -3
- package/lib/components/selfie/src/selfie-capture-review/SelfieCaptureReview.js +209 -209
- package/lib/components/selfie/src/selfie-capture-review/SelfieCaptureReview.stories.js +24 -24
- package/lib/components/selfie/src/selfie-capture-review/index.js +3 -3
- package/lib/components/selfie/src/selfie-capture-wrapper/SelfieCaptureWrapper.tsx +256 -239
- package/lib/components/selfie/src/selfie-capture-wrapper/index.ts +1 -1
- package/lib/components/selfie/src/smartselfie-capture/OvalProgress.tsx +81 -81
- package/lib/components/selfie/src/smartselfie-capture/SmartSelfieCapture.tsx +265 -283
- package/lib/components/selfie/src/smartselfie-capture/components/AlertDisplay.tsx +34 -34
- package/lib/components/selfie/src/smartselfie-capture/components/CameraPreview.tsx +97 -97
- package/lib/components/selfie/src/smartselfie-capture/components/CaptureControls.tsx +78 -76
- package/lib/components/selfie/src/smartselfie-capture/components/index.ts +3 -3
- package/lib/components/selfie/src/smartselfie-capture/constants.ts +23 -23
- package/lib/components/selfie/src/smartselfie-capture/hooks/index.ts +2 -2
- package/lib/components/selfie/src/smartselfie-capture/hooks/useCamera.ts +238 -238
- package/lib/components/selfie/src/smartselfie-capture/hooks/useFaceCapture.ts +618 -617
- package/lib/components/selfie/src/smartselfie-capture/index.ts +1 -1
- package/lib/components/selfie/src/smartselfie-capture/utils/alertMessages.ts +13 -13
- package/lib/components/selfie/src/smartselfie-capture/utils/canvas.ts +105 -105
- package/lib/components/selfie/src/smartselfie-capture/utils/faceDetection.ts +129 -129
- package/lib/components/selfie/src/smartselfie-capture/utils/imageCapture.ts +64 -64
- package/lib/components/selfie/src/smartselfie-capture/utils/index.ts +4 -4
- package/lib/components/selfie/src/smartselfie-capture/utils/mediapipeManager.ts +77 -77
- package/lib/components/signature-pad/package-lock.json +3009 -3009
- package/lib/components/signature-pad/package.json +30 -30
- package/lib/components/signature-pad/src/SignaturePad.js +484 -484
- package/lib/components/signature-pad/src/SignaturePad.stories.js +32 -32
- package/lib/components/signature-pad/src/index.js +3 -3
- package/lib/components/smart-camera-web/src/README.md +206 -206
- package/lib/components/smart-camera-web/src/SmartCameraWeb.js +305 -305
- package/lib/components/smart-camera-web/src/SmartCameraWeb.stories.js +57 -57
- package/lib/components/totp-consent/src/TotpConsent.js +949 -949
- package/lib/components/totp-consent/src/index.js +4 -4
- package/lib/domain/camera/src/README.md +38 -38
- package/lib/domain/camera/src/SmartCamera.js +109 -109
- package/lib/domain/constants/src/Constants.js +27 -27
- package/lib/domain/file-upload/README.md +35 -35
- package/lib/domain/file-upload/src/SmartFileUpload.js +65 -65
- package/lib/styles/README.md +3 -3
- package/lib/styles/src/styles.js +372 -372
- package/lib/styles/src/typography.js +52 -52
- package/package.json +111 -112
- package/dist/esm/DocumentCaptureScreens-BjATTDqu.js.map +0 -1
- package/dist/esm/SelfieCaptureScreens-UUzZzl1A.js +0 -11361
- package/dist/esm/SelfieCaptureScreens-UUzZzl1A.js.map +0 -1
- package/dist/esm/package-CZlW6BZn.js.map +0 -1
|
@@ -1 +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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"}
|
|
1
|
+
{"version":3,"file":"SignaturePad-C7MtmT8m.js","sources":["../../lib/components/signature-pad/src/SignaturePad.js"],"sourcesContent":["import SignaturePadCore from 'signature_pad';\n\nclass SmartFileUpload {\n static memoryLimit = 2048000;\n\n static supportedTypes = ['image/jpeg', 'image/png', 'image/svg+xml'];\n\n static getHumanSize(numberOfBytes) {\n // Approximate to the closest prefixed unit\n const units = ['B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n const exponent = Math.min(\n Math.floor(Math.log(numberOfBytes) / Math.log(1024)),\n units.length - 1,\n );\n const approx = numberOfBytes / 1024 ** exponent;\n const output =\n exponent === 0\n ? `${numberOfBytes} bytes`\n : `${approx.toFixed(0)} ${units[exponent]}`;\n\n return output;\n }\n\n static getData(file) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = (e) => {\n resolve(e.target.result);\n };\n reader.onerror = () => {\n reject(\n new Error(\n 'An error occurred reading the file. Please check the file, and try again',\n ),\n );\n };\n reader.readAsDataURL(file);\n });\n }\n\n static async retrieve(files) {\n if (files.length > 1) {\n throw new Error('Only one file upload is permitted at a time');\n }\n\n const file = files[0];\n\n if (!SmartFileUpload.supportedTypes.includes(file.type)) {\n throw new Error(\n 'Unsupported file format. Please ensure that you are providing a JPG, PNG or SVG image',\n );\n }\n\n if (file.size > SmartFileUpload.memoryLimit) {\n throw new Error(\n `${\n file.name\n } is too large. Please ensure that the file is less than ${SmartFileUpload.getHumanSize(\n SmartFileUpload.memoryLimit,\n )}.`,\n );\n }\n\n const imageAsDataUrl = await SmartFileUpload.getData(file);\n\n return imageAsDataUrl;\n }\n}\n\nclass SignaturePad extends HTMLElement {\n connectedCallback() {\n const shadow = this.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = `\n:host {\n display: block;\n block-size: auto;\n inline-size: 30rem;\n max-inline-size: 100%;\n position: relative;\n --color-active: #2D2B2A;\n --color-default: #001096;\n --color-disabled: #848282;\n}\n\n:host::part(upload) {\n text-align: center;\n}\n\n:host::part(signature-controls) {\n display: inline-flex;\n position: absolute;\n top: 1rem;\n right: 1rem;\n}\n\n:host::part(upload) svg + * {\n margin-inline-start: .5rem;\n}\n\n:host::part(canvas) {\n background-color: #F9F0E7;\n --dot-bg: #F9F0E7;\n --dot-color: black;\n --dot-size: 1px;\n --dot-space: 22px;\n background:\n linear-gradient(90deg, var(--dot-bg) calc(var(--dot-space) - var(--dot-size)), transparent 1%) center / var(--dot-space) var(--dot-space),\n linear-gradient(var(--dot-bg) calc(var(--dot-space) - var(--dot-size)), transparent 1%) center / var(--dot-space) var(--dot-space),\n var(--dot-color);\n border-radius: 2rem;\n inline-size: 30rem;\n max-inline-size: 100%;\n aspect-ratio: 2 / 1;\n}\n\n:host::part(upload-preview-image) {\n max-inline-size: 10rem;\n margin-inline: auto;\n}\n\n.visually-hidden {\n clip: rect(0 0 0 0); \n clip-path: inset(50%);\n height: 1px;\n overflow: hidden;\n position: absolute;\n white-space: nowrap; \n width: 1px;\n}\n\nbutton,\nlabel {\n font: inherit;\n cursor: pointer;\n}\n\nlabel {\n display: inline-flex;\n text-decoration: underline;\n}\n\nlabel svg + * {\n margin-inline-start: .5rem;\n}\n\n[type=\"file\"] {\n display: none;\n}\n\n.center {\n text-align: center;\n margin-inline: auto;\n}\n\n.color-red {\n color: red;\n}\n\nbutton[data-variant=\"icon\"] {\n appearance: none;\n -webkit-appearance: none;\n background-color: transparent;\n border: 0px;\n}\n\nbutton[data-variant=\"text\"] {\n appearance: none;\n -webkit-appearance: none;\n background-color: transparent;\n border: 0px;\n text-decoration: underline;\n display: inline-flex;\n align-items: baseline;\n}\n\nbutton[data-variant=\"solid\"] {\n --button-color: ${this.themeColor};\n border-radius: 2.5rem;\n border: 0;\n background-color: transparent;\n color: #fff;\n cursor: pointer;\n inline-size: 100%;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n font-weight: 600;\n padding: .75rem 1.5rem;\n text-align: center;\n background-color: var(--button-color);\n border: 2px solid var(--button-color);\n}\n\nbutton:hover,\nbutton:focus,\nbutton:active {\n --button-color: var(--color-active);\n}\n\nbutton:disabled {\n --button-color: var(--color-disabled);\n}\n`;\n\n const wrapper = document.createElement('div');\n const errorMessage = document.createElement('div');\n errorMessage.innerHTML = `\n <p id=\"error\" class=\"color-red | center\"><p>\n `;\n\n const signatureControls = document.createElement('div');\n signatureControls.setAttribute('id', 'controls');\n signatureControls.setAttribute('part', 'signature-controls');\n signatureControls.innerHTML = `\n <button data-variant=\"icon\" type=\"button\" name=\"clear\" id=\"clear\">\n <span class=\"visually-hidden\">\n Clear Signature\n </span>\n <svg fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" viewBox=\"0 0 17 18\">\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\" />\n </svg>\n </button>\n `;\n\n const canvas = document.createElement('canvas');\n\n /**\n * NOTE: In order to make this responsive, we need to calculate the width\n * / height of the canvas element relative to the closest visible element\n *\n * Within our consuming context, we do follow these steps:\n * - Find the closest ancestor that is visible\n * - Find the visible child of that ancestor\n * - Get the reference width / inline-size of the element\n * - Compute the canvas.height as the lesser of the reference width or the\n * inline size of the canvas set in CSS\n * - Compute the canvas.height as half the size of the canvas.width or the\n * block size computed by the aspect-ratio property\n */\n\n const closestVisibleAncestor = this.parentElement.closest(':not([hidden])');\n const visibleChild = closestVisibleAncestor.querySelector(':not([hidden])');\n const containerWidth = visibleChild.offsetWidth;\n\n const remInPx = getComputedStyle(document.documentElement).fontSize.split(\n 'px',\n )[0];\n const componentMaxInlineSize = 30 * remInPx; // 30rem from the style declaration\n const aspectRatio = 2; // 2 from the canvas style aspect ratio declaration\n\n canvas.width =\n containerWidth < componentMaxInlineSize\n ? containerWidth\n : componentMaxInlineSize;\n canvas.height =\n (containerWidth < componentMaxInlineSize\n ? containerWidth\n : componentMaxInlineSize) / aspectRatio;\n\n canvas.setAttribute('id', 'signature-canvas');\n canvas.setAttribute('part', 'canvas');\n\n const uploadControl = document.createElement('div');\n uploadControl.setAttribute('id', 'signature-upload-wrapper');\n uploadControl.innerHTML = `\n <p part=\"upload\">\n <strong>or</strong>\n <label>\n <input type='file' onclick='this.value=null;' id='upload-signature' accept='image/jpeg, image/png, image/svg+xml' />\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <rect width=\"16\" height=\"16\" fill=\"#F9F0E7\" rx=\"2\"/>\n <mask id=\"sign\" width=\"16\" height=\"16\" x=\"0\" y=\"0\" maskUnits=\"userSpaceOnUse\" style=\"mask-type:alpha\">\n <rect width=\"16\" height=\"16\" fill=\"#D9D9D9\" rx=\"2\"/>\n </mask>\n <g mask=\"url(#sign)\">\n <path fill=\"#2D2B2A\" d=\"M0 13.333h16V16H0z\"/>\n </g>\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\"/>\n </svg>\n <span>upload a signature</span>\n </label>\n </p>\n `;\n\n const publishSignatureContainer = document.createElement('p');\n publishSignatureContainer.innerHTML = `\n <button data-variant=\"solid\" type=\"button\" name=\"publish\" id=\"publish\">\n <span>\n Continue\n </span>\n <svg\n aria-hidden=\"true\"\n width=\"25\"\n height=\"24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M7 12h11m0 0-4.588-4M18 12l-4.588 4\"\n stroke=\"#fff\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n `;\n\n wrapper.appendChild(errorMessage);\n wrapper.appendChild(signatureControls);\n wrapper.appendChild(canvas);\n if (this.allowUpload) wrapper.appendChild(uploadControl);\n wrapper.appendChild(publishSignatureContainer);\n\n shadow.appendChild(style);\n shadow.appendChild(wrapper);\n\n this.core = new SignaturePadCore(canvas);\n\n // Error Message\n this.errorMessage = errorMessage.querySelector('#error');\n\n // Canvas Resize / Sizing\n if (window) {\n window.onresize = this.resizeCanvas();\n }\n\n // Signature Pad Controls\n this.clearSignatureButton = signatureControls.querySelector('#clear');\n this.clearSignatureButton.addEventListener('click', () =>\n this.clearSignature(),\n );\n\n // Upload Controls\n this.uploadSignatureButton =\n uploadControl.querySelector('#upload-signature');\n this.uploadSignatureButton.addEventListener('change', (event) =>\n this.uploadSignature(event),\n );\n\n // Publish Signature\n this.publishSignatureButton =\n publishSignatureContainer.querySelector('#publish');\n this.publishSignatureButton.addEventListener('click', () =>\n this.publishSignature(),\n );\n }\n\n disconnectedCallback() {\n this.publishSignatureButton.removeEventListener('click', () =>\n this.publishSignature(),\n );\n this.clearSignatureButton.removeEventListener('click', () =>\n this.clearSignature(),\n );\n this.uploadSignatureButton.removeEventListener('change', (event) =>\n this.uploadSignature(event),\n );\n }\n\n // Adjust canvas coordinate space taking into account pixel ratio,\n // to make it look crisp on mobile devices.\n // This also causes canvas to be cleared.\n resizeCanvas() {\n // When zoomed out to less than 100%, for some very strange reason,\n // some browsers report devicePixelRatio as less than 1\n // and only part of the canvas is cleared then.\n const canvas = this.shadowRoot.querySelector('canvas');\n const ratio = Math.max(window.devicePixelRatio || 1, 1);\n\n // This part causes the canvas to be cleared\n canvas.width = (canvas.offsetWidth || canvas.width) * ratio;\n canvas.height = (canvas.offsetHeight || canvas.height) * ratio;\n canvas.getContext('2d').scale(ratio, ratio);\n\n // This library does not listen for canvas changes, so after the canvas is automatically\n // cleared by the browser, SignaturePad#isEmpty might still return false, even though the\n // canvas looks empty, because the internal data of this library wasn't cleared. To make sure\n // that the state of this library is consistent with visual state of the canvas, you\n // have to clear it manually.\n // signaturePad.clear();\n\n // If you want to keep the drawing on resize instead of clearing it you can reset the data.\n this.core.fromData(this.core.toData());\n }\n\n publishSignature() {\n try {\n this.resetErrorMessage();\n const previewImage = this.shadowRoot.querySelector('img');\n let image = previewImage ? previewImage.src : undefined;\n if (!image && !this.core.isEmpty()) {\n image = this.core.toDataURL('image/svg+xml');\n }\n\n if (image) {\n this.dispatchEvent(\n new CustomEvent('signature-pad.publish', {\n detail: image,\n }),\n );\n } else {\n throw new Error(\n `No signature present. ${\n this.allowUpload ? 'Draw or upload' : 'Draw'\n } a signature`,\n );\n }\n } catch (error) {\n this.handleError(error.message);\n }\n }\n\n resetErrorMessage() {\n this.errorMessage.textContent = '';\n }\n\n handleError(error) {\n this.errorMessage.textContent = error;\n }\n\n clearSignature() {\n this.resetErrorMessage();\n const canvas = this.shadowRoot.querySelector('canvas');\n const img = this.shadowRoot.querySelector('img');\n\n if (img) {\n img.remove();\n canvas.removeAttribute('hidden');\n }\n\n this.core.clear();\n }\n\n previewUpload(fileData) {\n const canvas = this.shadowRoot.querySelector('canvas');\n let img = this.shadowRoot.querySelector('img');\n\n if (!img) {\n img = document.createElement('img');\n }\n\n img.src = fileData;\n img.setAttribute('part', 'upload-preview-image');\n canvas.setAttribute('hidden', true);\n canvas.insertAdjacentElement('afterend', img);\n }\n\n async uploadSignature(event) {\n try {\n this.resetErrorMessage();\n const { files } = event.target;\n\n // validate file, and convert file to data url\n const fileData = await SmartFileUpload.retrieve(files);\n\n // swap out canvas for an image for preview\n this.previewUpload(fileData);\n } catch (error) {\n this.handleError(error.message);\n }\n }\n\n get allowUpload() {\n return this.hasAttribute('allow-upload');\n }\n\n get themeColor() {\n return this.getAttribute('theme-color') || '#001096';\n }\n}\n\nif (\n 'customElements' in window &&\n !window.customElements.get('smileid-signature-pad')\n) {\n window.customElements.define('smileid-signature-pad', SignaturePad);\n}\n\nexport default SignaturePad;\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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TotpConsent-CQU5jQi4.js","sources":["../../lib/components/totp-consent/src/TotpConsent.js"],"sourcesContent":["import validate from 'validate.js';\r\n\r\nfunction postData(url, data) {\r\n return fetch(url, {\r\n body: JSON.stringify(data),\r\n cache: 'no-cache',\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type': 'application/json',\r\n },\r\n method: 'POST',\r\n mode: 'cors',\r\n });\r\n}\r\n\r\nfunction markup() {\r\n return `\r\n <style>\r\n *,\r\n *::before,\r\n *::after {\r\n box-sizing: border-box;\r\n margin: 0;\r\n padding: 0;\r\n }\r\n\r\n :host {\r\n --flow-space: 1.5rem;\r\n\r\n --color-dark: #404040;\r\n --color-grey: #555B69;\r\n\r\n --color-success: #1EB244;\r\n --color-failure: #FFEDEB;\r\n --color-failure-tint: #F86B58;\r\n\r\n --color-richblue: #043C93;\r\n --color-theme: ${this.themeColor};\r\n\r\n --color-active: #2D2B2A;\r\n --color-default: #001096;\r\n --color-disabled: #848282;\r\n }\r\n\r\n html {\r\n font-family: 'DM Sans', sans-serif;\r\n }\r\n\r\n [hidden] {\r\n display: none !important;\r\n }\r\n\r\n [disabled] {\r\n cursor: not-allowed !important;\r\n }\r\n\r\n .visually-hidden {\r\n border: 0;\r\n clip: rect(1px 1px 1px 1px);\r\n clip: rect(1px, 1px, 1px, 1px);\r\n height: auto;\r\n margin: 0;\r\n overflow: hidden;\r\n padding: 0;\r\n position: absolute;\r\n white-space: nowrap;\r\n width: 1px;\r\n }\r\n\r\n .color-dark {\r\n color: var(--color-dark);\r\n }\r\n\r\n .color-grey {\r\n color: var(--color-grey);\r\n }\r\n\r\n .flow > * + * {\r\n margin-top: var(--flow-space);\r\n }\r\n\r\n .center {\r\n margin-left: auto;\r\n margin-right: auto;\r\n\r\n text-align: center;\r\n }\r\n\r\n h1 {\r\n font-size: 1.5rem;\r\n font-weight: 700;\r\n }\r\n\r\n button, input, select, textarea {\r\n font: inherit\r\n }\r\n\r\n label,\r\n input,\r\n select,\r\n textarea {\r\n --flow-space: .5rem;\r\n display: block;\r\n width: 100%;\r\n }\r\n\r\n input,\r\n select,\r\n textarea {\r\n border: 1px solid #d1d8d6;\r\n border-radius: .5rem;\r\n padding: .75rem 1rem;\r\n }\r\n\r\n button {\r\n --button-color: var(--color-default);\r\n --flow-space: 3rem;\r\n -webkit-appearance: none;\r\n -moz-appearance: none;\r\n align-items: center;\r\n appearance: none;\r\n background-color: transparent;\r\n border-radius: 2.5rem;\r\n border: none;\r\n color: #ffffff;\r\n cursor: pointer;\r\n display: inline-flex;\r\n font-size: 20px;\r\n font-weight: 500;\r\n inline-size: 100%;\r\n justify-content: center;\r\n letter-spacing: .05ch;\r\n line-height: 1;\r\n padding: 1rem 2.5rem;\r\n text-align: center;\r\n text-decoration: none;\r\n }\r\n\r\n button[data-variant='solid'] {\r\n background-color: var(--button-color);\r\n border: 2px solid var(--button-color);\r\n }\r\n\r\n button[data-variant='outline'] {\r\n color: var(--button-color);\r\n border: 2px solid var(--button-color);\r\n }\r\n\r\n button[data-variant='ghost'] {\r\n color: var(--button-color);\r\n }\r\n\r\n button:hover,\r\n button:focus,\r\n button:active {\r\n --button-color: var(--color-active);\r\n }\r\n\r\n button:disabled {\r\n --button-color: var(--color-disabled);\r\n }\r\n\r\n button[data-type='icon'] {\r\n height: 2rem;\r\n padding: 0;\r\n width: 2rem;\r\n background: transparent;\r\n }\r\n\r\n input {\r\n font: inherit;\r\n }\r\n\r\n fieldset {\r\n margin: 0;\r\n border: none;\r\n }\r\n\r\n .font-weight:bold {\r\n font-weight: bold;\r\n }\r\n\r\n .justify-right {\r\n justify-content: end !important;\r\n }\r\n .nav {\r\n display: flex;\r\n justify-content: space-between;\r\n }\r\n\r\n .back-wrapper {\r\n display: flex;\r\n align-items: center;\r\n }\r\n\r\n .back-button-text {\r\n font-size: 11px;\r\n line-height: 11px;\r\n color: ${this.themeColor || 'rgb(21, 31, 114)'};\r\n }\r\n\r\n #error,\r\n .validation-message {\r\n color: red;\r\n text-transform: capitalize;\r\n }\r\n\r\n .input-group {\r\n --flow-space: 1.5rem;\r\n text-align: initial;\r\n }\r\n\r\n .input-radio {\r\n --flow-space: 1.5rem;\r\n background-color: #F8F8F8;\r\n border-radius: .5rem;\r\n padding: .625rem 1rem;\r\n display: flex;\r\n align-items: center;\r\n }\r\n\r\n .otp-mode {\r\n display: flex;\r\n align-items: center;\r\n text-align: initial;\r\n }\r\n\r\n .otp-mode :first-child {\r\n margin: 0;\r\n margin-inline-end: 1rem;\r\n }\r\n\r\n .otp-mode :nth-child(2n) {\r\n --flow-space: .5rem;\r\n }\r\n\r\n .input-radio [type='radio'] {\r\n border-radius: 50%;\r\n inline-size: 2rem;\r\n block-size: 2rem;\r\n margin-inline-end: .5rem;\r\n background-color: white;\r\n border: .125rem solid #f5f5f5;\r\n }\r\n\r\n #totp-token {\r\n block-size: 3rem;\r\n inline-size: 20rem;\r\n max-inline-size: 100%;\r\n background-color: #F5F5F5;\r\n border: none;\r\n border-bottom: 2px solid #2F718D;\r\n font-size: 1.5rem;\r\n text-align: center;\r\n font-weight: 700;\r\n letter-spacing: 2rem;\r\n padding: .5rem 1rem;\r\n margin-inline: auto;\r\n }\r\n\r\n @keyframes spin {\r\n 0% {\r\n transform: translate3d(-50%, -50%, 0) rotate(0deg);\r\n }\r\n 100% {\r\n transform: translate3d(-50%, -50%, 0) rotate(360deg);\r\n }\r\n }\r\n\r\n .spinner {\r\n animation: 1.5s linear infinite spin;\r\n animation-play-state: inherit;\r\n border: solid 5px #cfd0d1;\r\n border-bottom-color: var(--color-active);\r\n border-radius: 50%;\r\n content: \"\";\r\n display: block;\r\n height: 25px;\r\n width: 25px;\r\n will-change: transform;\r\n position: relative;\r\n top: .675rem;\r\n left: 1.25rem;\r\n }\r\n </style>\r\n\r\n <div class='flow center' id='id-entry'>\r\n <div class=\"nav\">\r\n <div class=\"back-wrapper\">\r\n <button type='button' data-type='icon' id=\"back-button\" class=\"back-button\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\">\r\n <path fill=\"#DBDBC4\" d=\"M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10Z\" opacity=\".4\"/>\r\n <path fill=\"${this.themeColor}\" d=\"M15.5 11.25h-5.19l1.72-1.72c.29-.29.29-.77 0-1.06a.754.754 0 0 0-1.06 0l-3 3c-.29.29-.29.77 0 1.06l3 3c.15.15.34.22.53.22s.38-.07.53-.22c.29-.29.29-.77 0-1.06l-1.72-1.72h5.19c.41 0 .75-.34.75-.75s-.34-.75-.75-.75Z\"/>\r\n </svg>\r\n </button>\r\n <div class=\"back-button-text\">Back</div>\r\n </div>\r\n <button data-type='icon' type='button' class='close-iframe'>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\">\r\n <path fill=\"#DBDBC4\" d=\"M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10Z\" opacity=\".4\"/>\r\n <path fill=\"#91190F\" d=\"m13.06 12 2.3-2.3c.29-.29.29-.77 0-1.06a.754.754 0 0 0-1.06 0l-2.3 2.3-2.3-2.3a.754.754 0 0 0-1.06 0c-.29.29-.29.77 0 1.06l2.3 2.3-2.3 2.3c-.29.29-.29.77 0 1.06.15.15.34.22.53.22s.38-.07.53-.22l2.3-2.3 2.3 2.3c.15.15.34.22.53.22s.38-.07.53-.22c.29-.29.29-.77 0-1.06l-2.3-2.3Z\"/>\r\n </svg>\r\n <span class='visually-hidden'>Close SmileIdentity Verification frame</span>\r\n </button>\r\n </div>\r\n <h1>\r\n Enter your ${this.idTypeLabel}\r\n </h1>\r\n\r\n <form name='id-entry-form' class='flow' novalidate style='--flow-space: 5.5rem'>\r\n <div id='id-number' class=\"input-group flow\">\r\n <label class='required' for=\"id_number\">\r\n ${this.idTypeLabel}\r\n </label>\r\n\r\n <input aria-required='true' id=\"id_number\" name=\"id_number\"\r\n maxlength='11' placeholder='' />\r\n\r\n <p>\r\n <small>${this.idHint}</small>\r\n </p>\r\n </div>\r\n\r\n <button data-variant='solid' id='query-otp-modes' type='submit'>\r\n <span class='text'>Continue</span>\r\n <svg aria-hidden='true' width=\"25\" height=\"24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M7 12h11m0 0-4.588-4M18 12l-4.588 4\" stroke=\"#fff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <span hidden class='spinner'></span>\r\n </button>\r\n </form>\r\n </div>\r\n\r\n <div hidden class='flow center' id='select-mode'>\r\n <div class=\"nav\">\r\n <div class=\"back-wrapper\">\r\n <button type='button' data-type='icon' id=\"back-to-entry-button\" class=\"back-button\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\">\r\n <path fill=\"#DBDBC4\" d=\"M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10Z\" opacity=\".4\"/>\r\n <path fill=\"${this.themeColor}\" d=\"M15.5 11.25h-5.19l1.72-1.72c.29-.29.29-.77 0-1.06a.754.754 0 0 0-1.06 0l-3 3c-.29.29-.29.77 0 1.06l3 3c.15.15.34.22.53.22s.38-.07.53-.22c.29-.29.29-.77 0-1.06l-1.72-1.72h5.19c.41 0 .75-.34.75-.75s-.34-.75-.75-.75Z\"/>\r\n </svg>\r\n </button>\r\n <div class=\"back-button-text\">Back</div>\r\n </div>\r\n <button data-type='icon' type='button' class='close-iframe'>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\">\r\n <path fill=\"#DBDBC4\" d=\"M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10Z\" opacity=\".4\"/>\r\n <path fill=\"#91190F\" d=\"m13.06 12 2.3-2.3c.29-.29.29-.77 0-1.06a.754.754 0 0 0-1.06 0l-2.3 2.3-2.3-2.3a.754.754 0 0 0-1.06 0c-.29.29-.29.77 0 1.06l2.3 2.3-2.3 2.3c-.29.29-.29.77 0 1.06.15.15.34.22.53.22s.38-.07.53-.22l2.3-2.3 2.3 2.3c.15.15.34.22.53.22s.38-.07.53-.22c.29-.29.29-.77 0-1.06l-2.3-2.3Z\"/>\r\n </svg>\r\n <span class='visually-hidden'>Close SmileIdentity Verification frame</span>\r\n </button>\r\n </div>\r\n <h1>\r\n Select contact method\r\n </h1>\r\n\r\n <form name='select-mode-form' novalidate style='--flow-space: 4.25rem' id='otp-entry' class='flow center'>\r\n <fieldset class='flow center'>\r\n <legend class='flow' style='--flow-space: 1.5rem'>\r\n <p>\r\n NIBSS, the data custodian of BVN, \r\n will send you a One-Time Password (OTP) \r\n </p>\r\n\r\n <p>\r\n <small>\r\n The request will be from Chams Plc, who is NIBSS' technical partner.\r\n </small>\r\n </p>\r\n </legend>\r\n\r\n <div class='flow center'>\r\n ${\r\n this.modes.length\r\n ? this.modes\r\n .map(\r\n (mode) => `<label class='input-radio'>\r\n <input type=\"radio\" id=\"\" name=\"mode\" value=\"${Object.keys(mode)[0]}\">\r\n <div class='otp-mode'>\r\n ${\r\n Object.keys(mode)[0].includes('sms')\r\n ? `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"29\" height=\"37\" fill=\"none\">\r\n <path stroke=\"#2F718D\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M16.697 24.12c4.914 0 7.37 0 8.897-1.652 1.527-1.651 1.527-4.31 1.527-9.625 0-5.316 0-7.974-1.527-9.625-1.526-1.651-3.983-1.651-8.897-1.651h-5.211c-4.914 0-7.37 0-8.897 1.651-1.527 1.651-1.527 4.31-1.527 9.625 0 5.316 0 7.974 1.527 9.625.85.92 1.991 1.328 3.685 1.508\"/>\r\n <g filter=\"url(#sms)\">\r\n <path stroke=\"#2F718D\" stroke-linecap=\"round\" stroke-width=\"2\" d=\"M16.697 24.12c-1.61 0-3.384.703-5.005 1.613-2.602 1.462-3.903 2.193-4.545 1.727-.64-.465-.52-1.91-.277-4.799l.055-.656\" shape-rendering=\"crispEdges\"/>\r\n </g>\r\n <defs>\r\n <filter id=\"sms\" width=\"20.023\" height=\"15.595\" x=\"1.675\" y=\"21.005\" color-interpolation-filters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\r\n <feColorMatrix in=\"SourceAlpha\" result=\"hardAlpha\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"/>\r\n <feOffset dy=\"4\"/>\r\n <feGaussianBlur stdDeviation=\"2\"/>\r\n <feComposite in2=\"hardAlpha\" operator=\"out\"/>\r\n <feColorMatrix values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0\"/>\r\n <feBlend in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_2_404\"/>\r\n <feBlend in=\"SourceGraphic\" in2=\"effect1_dropShadow_2_404\" result=\"shape\"/>\r\n </filter>\r\n </defs>\r\n </svg>\r\n `\r\n : `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"35\" height=\"24\" fill=\"none\">\r\n <path stroke=\"#2F718D\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4.062 4.367c0-1.437 1.221-2.603 2.727-2.603h21.815c1.506 0 2.727 1.166 2.727 2.603v15.62c0 1.438-1.221 2.604-2.727 2.604H6.789c-1.506 0-2.727-1.166-2.727-2.604V4.367Z\"/>\r\n <g filter=\"url(#message)\">\r\n <path stroke=\"#2F718D\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"m5.426 3.066 8.647 7.338c2.067 1.754 5.18 1.754 7.247 0l8.648-7.338\" shape-rendering=\"crispEdges\"/>\r\n </g>\r\n <defs>\r\n <filter id=\"message\" width=\"34.042\" height=\"18.154\" x=\".676\" y=\"2.316\" color-interpolation-filters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\r\n <feColorMatrix in=\"SourceAlpha\" result=\"hardAlpha\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"/>\r\n <feOffset dy=\"4\"/>\r\n <feGaussianBlur stdDeviation=\"2\"/>\r\n <feComposite in2=\"hardAlpha\" operator=\"out\"/>\r\n <feColorMatrix values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0\"/>\r\n <feBlend in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_2_394\"/>\r\n <feBlend in=\"SourceGraphic\" in2=\"effect1_dropShadow_2_394\" result=\"shape\"/>\r\n </filter>\r\n </defs>\r\n </svg>\r\n `\r\n }\r\n <div class='flow'>\r\n <p>\r\n ${Object.values(mode)[0]}\r\n </p>\r\n <p>\r\n <small>\r\n An OTP will be sent by ${\r\n Object.keys(mode)[0].includes(\r\n 'sms',\r\n )\r\n ? 'sms'\r\n : 'email'\r\n } to verify your identity\r\n </small>\r\n </p>\r\n </div>\r\n </div>\r\n </label>`,\r\n )\r\n .join('\\n')\r\n : 'No modes yet'\r\n }\r\n </div>\r\n </fieldset>\r\n\r\n <button data-variant='ghost' id='contact-methods-outdated' style='--flow-space: .5rem' class='' type='button'>\r\n I am no longer using any of these options\r\n </button>\r\n\r\n <button data-variant='solid' id='select-otp-mode' type='submit'>\r\n <span class='text'>Continue</span>\r\n <svg aria-hidden='true' width=\"25\" height=\"24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M7 12h11m0 0-4.588-4M18 12l-4.588 4\" stroke=\"#fff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <span hidden class='spinner'></span>\r\n </button>\r\n </form>\r\n </div>\r\n\r\n <div hidden class='flow center' id='otp-verification'>\r\n <div class=\"nav justify-right\">\r\n <button data-type='icon' type='button' class='close-iframe'>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\">\r\n <path fill=\"#DBDBC4\" d=\"M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10Z\" opacity=\".4\"/>\r\n <path fill=\"#91190F\" d=\"m13.06 12 2.3-2.3c.29-.29.29-.77 0-1.06a.754.754 0 0 0-1.06 0l-2.3 2.3-2.3-2.3a.754.754 0 0 0-1.06 0c-.29.29-.29.77 0 1.06l2.3 2.3-2.3 2.3c-.29.29-.29.77 0 1.06.15.15.34.22.53.22s.38-.07.53-.22l2.3-2.3 2.3 2.3c.15.15.34.22.53.22s.38-.07.53-.22c.29-.29.29-.77 0-1.06l-2.3-2.3Z\"/>\r\n </svg>\r\n <span class='visually-hidden'>Close SmileIdentity Verification frame</span>\r\n </button>\r\n </div>\r\n <h1>\r\n OTP Verification\r\n </h1>\r\n\r\n <div style='--flow-space: 4.25rem' id='otp-entry'>\r\n <form name='otp-submission-form' novalidate style='--flow-space: 1.5rem' class='flow center'>\r\n <label for='totp-token'>\r\n Enter the OTP sent to <span class='font-weight:bold'>${\r\n this.selectedOtpDeliveryMode\r\n }</span>\r\n </label>\r\n <input type='text' id='totp-token' maxlength='6' inputmode='numeric' autocomplete='one-time-code' />\r\n\r\n <p>\r\n Didn't receive the OTP${\r\n !this.selectedOtpDeliveryMode\r\n ? '?'\r\n : ` at <span class='font-weight:bold'>${this.selectedOtpDeliveryMode}</span>?`\r\n }\r\n </p>\r\n\r\n <button style='--flow-space: .5rem' data-variant='ghost' class='try-another-method' type='button'>\r\n Try another contact method\r\n </button>\r\n\r\n <button data-variant='solid' id='submit-otp' type='submit'>\r\n <span class='text'>Submit</span>\r\n <svg aria-hidden='true' width=\"25\" height=\"24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M7 12h11m0 0-4.588-4M18 12l-4.588 4\" stroke=\"#fff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <span hidden class='spinner'></span>\r\n </button>\r\n </form>\r\n </div>\r\n </div>\r\n `;\r\n}\r\n\r\nclass TotpConsent extends HTMLElement {\r\n constructor() {\r\n super();\r\n\r\n this.templateString = markup.bind(this);\r\n this.render = () => this.templateString();\r\n\r\n this.attachShadow({ mode: 'open' });\r\n\r\n this.modes = [];\r\n this['otp-delivery-mode'] = '';\r\n\r\n this.queryOtpModes = this.queryOtpModes.bind(this);\r\n this.selectOtpMode = this.selectOtpMode.bind(this);\r\n this.submitOtp = this.submitOtp.bind(this);\r\n this.switchContactMethod = this.switchContactMethod.bind(this);\r\n this.handleTotpConsentGrant = this.handleTotpConsentGrant.bind(this);\r\n this.handleTotpConsentContactMethodsOutdated =\r\n this.handleTotpConsentContactMethodsOutdated.bind(this);\r\n this.pages = [];\r\n }\r\n\r\n static get observedAttributes() {\r\n return ['modes', 'otp-delivery-mode'];\r\n }\r\n\r\n attributeChangedCallback(name) {\r\n switch (name) {\r\n case 'modes':\r\n case 'otp-delivery-mode': {\r\n const updatedTemplate = document.createElement('template');\r\n updatedTemplate.innerHTML = this.render();\r\n const updatedNode = updatedTemplate.content\r\n .cloneNode(true)\r\n .querySelector(`#${this.activeScreen.id}`);\r\n updatedNode.hidden = false;\r\n this.shadowRoot.replaceChild(updatedNode, this.activeScreen);\r\n this.setUpEventListeners();\r\n this.setActiveScreen(updatedNode);\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n setUpEventListeners() {\r\n // Screens\r\n this.idEntryScreen = this.shadowRoot.querySelector('#id-entry');\r\n this.selectModeScreen = this.shadowRoot.querySelector('#select-mode');\r\n this.otpVerificationScreen =\r\n this.shadowRoot.querySelector('#otp-verification');\r\n\r\n if (!this.activeScreen) {\r\n this.activeScreen = this.idEntryScreen;\r\n }\r\n\r\n // Buttons\r\n this.queryOtpModesButton =\r\n this.idEntryScreen.querySelector('#query-otp-modes');\r\n this.backButton = this.idEntryScreen.querySelector('#back-button');\r\n this.selectOtpModeButton =\r\n this.selectModeScreen.querySelector('#select-otp-mode');\r\n this.entryBackbutton = this.selectModeScreen.querySelector(\r\n '#back-to-entry-button',\r\n );\r\n this.contactMethodsOutdatedButton = this.selectModeScreen.querySelector(\r\n '#contact-methods-outdated',\r\n );\r\n this.submitOtpButton =\r\n this.otpVerificationScreen.querySelector('#submit-otp');\r\n this.switchContactMethodButton = this.otpVerificationScreen.querySelector(\r\n '.try-another-method',\r\n );\r\n const CloseIframeButtons =\r\n this.shadowRoot.querySelectorAll('.close-iframe');\r\n\r\n // Input Elements\r\n this.idNumberInput = this.idEntryScreen.querySelector('#id_number');\r\n this.modeInputs = this.selectModeScreen.querySelectorAll('[name=\"mode\"]');\r\n this.otpInput = this.otpVerificationScreen.querySelector('#totp-token');\r\n\r\n // Event Handlers\r\n this.queryOtpModesButton.addEventListener('click', (e) =>\r\n this.queryOtpModes(e),\r\n );\r\n this.selectOtpModeButton.addEventListener('click', (e) =>\r\n this.selectOtpMode(e),\r\n );\r\n this.submitOtpButton.addEventListener('click', (e) => this.submitOtp(e));\r\n this.switchContactMethodButton.addEventListener('click', (e) =>\r\n this.switchContactMethod(e),\r\n );\r\n this.contactMethodsOutdatedButton.addEventListener('click', (e) =>\r\n this.handleTotpConsentContactMethodsOutdated(e),\r\n );\r\n\r\n this.entryBackbutton.addEventListener('click', () => {\r\n this.handleBackClick();\r\n });\r\n\r\n this.backButton.addEventListener('click', () => {\r\n this.handleBackClick();\r\n });\r\n\r\n CloseIframeButtons.forEach((button) => {\r\n button.addEventListener(\r\n 'click',\r\n () => {\r\n this.closeWindow();\r\n },\r\n false,\r\n );\r\n });\r\n }\r\n\r\n closeWindow() {\r\n const referenceWindow = window.parent;\r\n [referenceWindow.parent, referenceWindow].forEach((win) => {\r\n win.postMessage('SmileIdentity::Close', '*');\r\n });\r\n }\r\n\r\n handleBackClick() {\r\n const page = this.pages.pop();\r\n if (page) {\r\n this.setActiveScreen(page);\r\n } else {\r\n this.dispatchEvent(\r\n new CustomEvent('end-user-consent.totp.cancelled', {}),\r\n );\r\n }\r\n }\r\n\r\n connectedCallback() {\r\n const template = document.createElement('template');\r\n template.innerHTML = this.render();\r\n\r\n this.shadowRoot.appendChild(template.content.cloneNode(true));\r\n this.setUpEventListeners();\r\n }\r\n\r\n switchContactMethod() {\r\n this.queryOtpModes();\r\n }\r\n\r\n resetForm() {\r\n const invalidElements =\r\n this.activeScreen.querySelectorAll('[aria-invalid]');\r\n invalidElements.forEach((el) => el.removeAttribute('aria-invalid'));\r\n\r\n const validationMessages = this.activeScreen.querySelectorAll(\r\n '.validation-message',\r\n );\r\n validationMessages.forEach((el) => el.remove());\r\n }\r\n\r\n handleIdNumberValidationErrors(errors) {\r\n const fields = Object.keys(errors);\r\n\r\n fields.forEach((field) => {\r\n const input = this.activeScreen.querySelector(`#${field}`);\r\n input.setAttribute('aria-invalid', 'true');\r\n input.setAttribute('aria-describedby', `${field}-hint`);\r\n\r\n const errorDiv = document.createElement('div');\r\n errorDiv.setAttribute('id', `${field}-hint`);\r\n errorDiv.setAttribute('class', 'validation-message');\r\n // eslint-disable-next-line prefer-destructuring\r\n errorDiv.textContent = errors[field][0];\r\n\r\n input.insertAdjacentElement('afterend', errorDiv);\r\n });\r\n }\r\n\r\n handleActiveScreenErrors(error) {\r\n const submitButton = this.activeScreen.querySelector('[type=\"submit\"]');\r\n const errorDiv = document.createElement('div');\r\n errorDiv.setAttribute('class', 'validation-message');\r\n errorDiv.textContent = error;\r\n submitButton.insertAdjacentElement('beforebegin', errorDiv);\r\n }\r\n\r\n validateIdNumber(idNumber) {\r\n const validationConstraints = {\r\n id_number: {\r\n format: new RegExp(this.idRegex),\r\n presence: {\r\n allowEmpty: false,\r\n message: 'is required',\r\n },\r\n },\r\n };\r\n\r\n const errors = validate({ id_number: idNumber }, validationConstraints);\r\n\r\n if (errors) {\r\n this.handleIdNumberValidationErrors(errors);\r\n }\r\n\r\n return errors;\r\n }\r\n\r\n async queryOtpModes(event) {\r\n if (event) {\r\n // ACTION: disable another submission\r\n event.preventDefault();\r\n\r\n // ACTION: Reset any form validation errors'\r\n this.resetForm();\r\n }\r\n\r\n // ACTION: Validate idNumber\r\n const validationErrors = this.validateIdNumber(this.idNumberInput.value);\r\n\r\n // ACTION: Get and set idNumber\r\n localStorage.setItem('idNumber', this.idNumberInput.value || this.idNumber);\r\n\r\n if (!validationErrors) {\r\n const data = {\r\n country: this.country,\r\n id_number: this.idNumber,\r\n id_type: this.idType,\r\n partner_id: this.partnerId,\r\n token: this.token,\r\n };\r\n const url = `${this.baseUrl}/totp_consent`;\r\n\r\n try {\r\n this.toggleLoading();\r\n const response = await postData(url, data);\r\n const json = await response.json();\r\n this.toggleLoading();\r\n\r\n if (!response.ok) {\r\n this.handleActiveScreenErrors(json.error);\r\n } else {\r\n this.sessionId = json.session_id;\r\n this.modes = json.modes;\r\n this.setActiveScreen(this.selectModeScreen);\r\n this.setAttribute('modes', json.modes);\r\n }\r\n } catch (error) {\r\n this.toggleLoading();\r\n this.handleActiveScreenErrors(error.message);\r\n }\r\n }\r\n }\r\n\r\n async selectOtpMode(event) {\r\n // ACTION: disable another submission\r\n event.preventDefault();\r\n\r\n // ACTION: Reset any form validation errors'\r\n this.resetForm();\r\n\r\n // ACTION: Get mode\r\n this.mode = Array.prototype.find.call(\r\n this.modeInputs,\r\n (node) => node.checked,\r\n ).value;\r\n const data = {\r\n country: this.country,\r\n id_number: this.idNumber,\r\n id_type: this.idType,\r\n mode: this.mode,\r\n partner_id: this.partnerId,\r\n session_id: this.sessionId,\r\n token: this.token,\r\n };\r\n const url = `${this.baseUrl}/totp_consent/mode`;\r\n\r\n try {\r\n this.toggleLoading();\r\n const response = await postData(url, data);\r\n const json = await response.json();\r\n this.toggleLoading();\r\n\r\n if (!response.ok) {\r\n this.handleActiveScreenErrors(json.error);\r\n } else {\r\n this.selectedOtpDeliveryMode = this.modes.filter(\r\n (mode) => mode[this.mode],\r\n )[0][this.mode];\r\n this.setActiveScreen(this.otpVerificationScreen);\r\n this.setAttribute('otp-delivery-mode', this.selectedOtpDeliveryMode);\r\n }\r\n } catch (error) {\r\n this.toggleLoading();\r\n this.handleActiveScreenErrors(error.message);\r\n }\r\n }\r\n\r\n async submitOtp(event) {\r\n // ACTION: disable another submission\r\n event.preventDefault();\r\n\r\n // ACTION: Reset any form validation errors'\r\n this.resetForm();\r\n\r\n this.otp = this.otpInput.value;\r\n\r\n const data = {\r\n country: this.country,\r\n id_number: this.idNumber,\r\n id_type: this.idType,\r\n otp: this.otp,\r\n partner_id: this.partnerId,\r\n session_id: this.sessionId,\r\n token: this.token,\r\n };\r\n const url = `${this.baseUrl}/totp_consent/otp`;\r\n\r\n try {\r\n this.toggleLoading();\r\n const response = await postData(url, data);\r\n const json = await response.json();\r\n this.toggleLoading();\r\n\r\n if (!response.ok) {\r\n this.handleActiveScreenErrors(json.error);\r\n } else {\r\n this.handleTotpConsentGrant(event);\r\n }\r\n } catch (error) {\r\n this.toggleLoading();\r\n this.handleActiveScreenErrors(error.message);\r\n }\r\n }\r\n\r\n toggleLoading() {\r\n const button = this.activeScreen.querySelector('button[type=\"submit\"]');\r\n const text = button.querySelector('.text');\r\n const arrow = button.querySelector('svg');\r\n const spinner = button.querySelector('.spinner');\r\n\r\n button.toggleAttribute('disabled');\r\n text.toggleAttribute('hidden');\r\n arrow.toggleAttribute('hidden');\r\n spinner.toggleAttribute('hidden');\r\n }\r\n\r\n setActiveScreen(screen) {\r\n this.activeScreen.hidden = true;\r\n screen.hidden = false;\r\n this.activeScreen = screen;\r\n }\r\n\r\n get baseUrl() {\r\n return this.getAttribute('base-url');\r\n }\r\n\r\n get country() {\r\n return this.getAttribute('country');\r\n }\r\n\r\n get idHint() {\r\n return this.getAttribute('id-hint') || 'Your BVN should be 11 digits long';\r\n }\r\n\r\n get idNumber() {\r\n return localStorage.getItem('idNumber');\r\n }\r\n\r\n get idRegex() {\r\n return this.getAttribute('id-regex');\r\n }\r\n\r\n get idType() {\r\n return this.getAttribute('id-type');\r\n }\r\n\r\n get idTypeLabel() {\r\n return this.getAttribute('id-type-label');\r\n }\r\n\r\n get partnerId() {\r\n return this.getAttribute('partner-id');\r\n }\r\n\r\n get partnerName() {\r\n return this.getAttribute('partner-name');\r\n }\r\n\r\n get token() {\r\n return this.getAttribute('token');\r\n }\r\n\r\n get themeColor() {\r\n return this.getAttribute('theme-color') || '#001096';\r\n }\r\n\r\n get hideBack() {\r\n return this.hasAttribute('hide-back');\r\n }\r\n\r\n get showNavigation() {\r\n return this.hasAttribute('show-navigation');\r\n }\r\n\r\n handleTotpConsentGrant() {\r\n const customEvent = new CustomEvent('end-user-consent.totp.granted', {\r\n detail: {\r\n consented: {\r\n contact_information: true,\r\n document_information: true,\r\n personal_details: true,\r\n },\r\n id_number: this.idNumber,\r\n session_id: this.sessionId,\r\n },\r\n });\r\n\r\n this.dispatchEvent(customEvent);\r\n }\r\n\r\n handleTotpConsentContactMethodsOutdated() {\r\n const tag = 'end-user-consent.totp.denied.contact-methods-outdated';\r\n const customEvent = new CustomEvent(tag, {\r\n detail: {\r\n data: {\r\n id_number: this.idNumber,\r\n session_id: this.sessionId,\r\n },\r\n message: tag,\r\n },\r\n });\r\n\r\n this.dispatchEvent(customEvent);\r\n }\r\n}\r\n\r\nif ('customElements' in window && !window.customElements.get('totp-consent')) {\r\n window.customElements.define('totp-consent', TotpConsent);\r\n}\r\n\r\nexport {\r\n // eslint-disable-next-line import/prefer-default-export\r\n TotpConsent,\r\n};\r\n"],"names":["postData","url","data","markup","mode","TotpConsent","name","updatedTemplate","updatedNode","CloseIframeButtons","button","referenceWindow","win","page","template","el","errors","field","input","errorDiv","error","submitButton","idNumber","validationConstraints","validate","event","validationErrors","response","json","node","text","arrow","spinner","screen","customEvent","tag"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TotpConsent-CQU5jQi4.js","sources":["../../lib/components/totp-consent/src/TotpConsent.js"],"sourcesContent":["import validate from 'validate.js';\n\nfunction postData(url, data) {\n return fetch(url, {\n body: JSON.stringify(data),\n cache: 'no-cache',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n mode: 'cors',\n });\n}\n\nfunction markup() {\n return `\n <style>\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n }\n\n :host {\n --flow-space: 1.5rem;\n\n --color-dark: #404040;\n --color-grey: #555B69;\n\n --color-success: #1EB244;\n --color-failure: #FFEDEB;\n --color-failure-tint: #F86B58;\n\n --color-richblue: #043C93;\n --color-theme: ${this.themeColor};\n\n --color-active: #2D2B2A;\n --color-default: #001096;\n --color-disabled: #848282;\n }\n\n html {\n font-family: 'DM Sans', sans-serif;\n }\n\n [hidden] {\n display: none !important;\n }\n\n [disabled] {\n cursor: not-allowed !important;\n }\n\n .visually-hidden {\n border: 0;\n clip: rect(1px 1px 1px 1px);\n clip: rect(1px, 1px, 1px, 1px);\n height: auto;\n margin: 0;\n overflow: hidden;\n padding: 0;\n position: absolute;\n white-space: nowrap;\n width: 1px;\n }\n\n .color-dark {\n color: var(--color-dark);\n }\n\n .color-grey {\n color: var(--color-grey);\n }\n\n .flow > * + * {\n margin-top: var(--flow-space);\n }\n\n .center {\n margin-left: auto;\n margin-right: auto;\n\n text-align: center;\n }\n\n h1 {\n font-size: 1.5rem;\n font-weight: 700;\n }\n\n button, input, select, textarea {\n font: inherit\n }\n\n label,\n input,\n select,\n textarea {\n --flow-space: .5rem;\n display: block;\n width: 100%;\n }\n\n input,\n select,\n textarea {\n border: 1px solid #d1d8d6;\n border-radius: .5rem;\n padding: .75rem 1rem;\n }\n\n button {\n --button-color: var(--color-default);\n --flow-space: 3rem;\n -webkit-appearance: none;\n -moz-appearance: none;\n align-items: center;\n appearance: none;\n background-color: transparent;\n border-radius: 2.5rem;\n border: none;\n color: #ffffff;\n cursor: pointer;\n display: inline-flex;\n font-size: 20px;\n font-weight: 500;\n inline-size: 100%;\n justify-content: center;\n letter-spacing: .05ch;\n line-height: 1;\n padding: 1rem 2.5rem;\n text-align: center;\n text-decoration: none;\n }\n\n button[data-variant='solid'] {\n background-color: var(--button-color);\n border: 2px solid var(--button-color);\n }\n\n button[data-variant='outline'] {\n color: var(--button-color);\n border: 2px solid var(--button-color);\n }\n\n button[data-variant='ghost'] {\n color: var(--button-color);\n }\n\n button:hover,\n button:focus,\n button:active {\n --button-color: var(--color-active);\n }\n\n button:disabled {\n --button-color: var(--color-disabled);\n }\n\n button[data-type='icon'] {\n height: 2rem;\n padding: 0;\n width: 2rem;\n background: transparent;\n }\n\n input {\n font: inherit;\n }\n\n fieldset {\n margin: 0;\n border: none;\n }\n\n .font-weight:bold {\n font-weight: bold;\n }\n\n .justify-right {\n justify-content: end !important;\n }\n .nav {\n display: flex;\n justify-content: space-between;\n }\n\n .back-wrapper {\n display: flex;\n align-items: center;\n }\n\n .back-button-text {\n font-size: 11px;\n line-height: 11px;\n color: ${this.themeColor || 'rgb(21, 31, 114)'};\n }\n\n #error,\n .validation-message {\n color: red;\n text-transform: capitalize;\n }\n\n .input-group {\n --flow-space: 1.5rem;\n text-align: initial;\n }\n\n .input-radio {\n --flow-space: 1.5rem;\n background-color: #F8F8F8;\n border-radius: .5rem;\n padding: .625rem 1rem;\n display: flex;\n align-items: center;\n }\n\n .otp-mode {\n display: flex;\n align-items: center;\n text-align: initial;\n }\n\n .otp-mode :first-child {\n margin: 0;\n margin-inline-end: 1rem;\n }\n\n .otp-mode :nth-child(2n) {\n --flow-space: .5rem;\n }\n\n .input-radio [type='radio'] {\n border-radius: 50%;\n inline-size: 2rem;\n block-size: 2rem;\n margin-inline-end: .5rem;\n background-color: white;\n border: .125rem solid #f5f5f5;\n }\n\n #totp-token {\n block-size: 3rem;\n inline-size: 20rem;\n max-inline-size: 100%;\n background-color: #F5F5F5;\n border: none;\n border-bottom: 2px solid #2F718D;\n font-size: 1.5rem;\n text-align: center;\n font-weight: 700;\n letter-spacing: 2rem;\n padding: .5rem 1rem;\n margin-inline: auto;\n }\n\n @keyframes spin {\n 0% {\n transform: translate3d(-50%, -50%, 0) rotate(0deg);\n }\n 100% {\n transform: translate3d(-50%, -50%, 0) rotate(360deg);\n }\n }\n\n .spinner {\n animation: 1.5s linear infinite spin;\n animation-play-state: inherit;\n border: solid 5px #cfd0d1;\n border-bottom-color: var(--color-active);\n border-radius: 50%;\n content: \"\";\n display: block;\n height: 25px;\n width: 25px;\n will-change: transform;\n position: relative;\n top: .675rem;\n left: 1.25rem;\n }\n </style>\n\n <div class='flow center' id='id-entry'>\n <div class=\"nav\">\n <div class=\"back-wrapper\">\n <button type='button' data-type='icon' id=\"back-button\" class=\"back-button\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\">\n <path fill=\"#DBDBC4\" d=\"M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10Z\" opacity=\".4\"/>\n <path fill=\"${this.themeColor}\" d=\"M15.5 11.25h-5.19l1.72-1.72c.29-.29.29-.77 0-1.06a.754.754 0 0 0-1.06 0l-3 3c-.29.29-.29.77 0 1.06l3 3c.15.15.34.22.53.22s.38-.07.53-.22c.29-.29.29-.77 0-1.06l-1.72-1.72h5.19c.41 0 .75-.34.75-.75s-.34-.75-.75-.75Z\"/>\n </svg>\n </button>\n <div class=\"back-button-text\">Back</div>\n </div>\n <button data-type='icon' type='button' class='close-iframe'>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\">\n <path fill=\"#DBDBC4\" d=\"M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10Z\" opacity=\".4\"/>\n <path fill=\"#91190F\" d=\"m13.06 12 2.3-2.3c.29-.29.29-.77 0-1.06a.754.754 0 0 0-1.06 0l-2.3 2.3-2.3-2.3a.754.754 0 0 0-1.06 0c-.29.29-.29.77 0 1.06l2.3 2.3-2.3 2.3c-.29.29-.29.77 0 1.06.15.15.34.22.53.22s.38-.07.53-.22l2.3-2.3 2.3 2.3c.15.15.34.22.53.22s.38-.07.53-.22c.29-.29.29-.77 0-1.06l-2.3-2.3Z\"/>\n </svg>\n <span class='visually-hidden'>Close SmileIdentity Verification frame</span>\n </button>\n </div>\n <h1>\n Enter your ${this.idTypeLabel}\n </h1>\n\n <form name='id-entry-form' class='flow' novalidate style='--flow-space: 5.5rem'>\n <div id='id-number' class=\"input-group flow\">\n <label class='required' for=\"id_number\">\n ${this.idTypeLabel}\n </label>\n\n <input aria-required='true' id=\"id_number\" name=\"id_number\"\n maxlength='11' placeholder='' />\n\n <p>\n <small>${this.idHint}</small>\n </p>\n </div>\n\n <button data-variant='solid' id='query-otp-modes' type='submit'>\n <span class='text'>Continue</span>\n <svg aria-hidden='true' width=\"25\" height=\"24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 12h11m0 0-4.588-4M18 12l-4.588 4\" stroke=\"#fff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span hidden class='spinner'></span>\n </button>\n </form>\n </div>\n\n <div hidden class='flow center' id='select-mode'>\n <div class=\"nav\">\n <div class=\"back-wrapper\">\n <button type='button' data-type='icon' id=\"back-to-entry-button\" class=\"back-button\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\">\n <path fill=\"#DBDBC4\" d=\"M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10Z\" opacity=\".4\"/>\n <path fill=\"${this.themeColor}\" d=\"M15.5 11.25h-5.19l1.72-1.72c.29-.29.29-.77 0-1.06a.754.754 0 0 0-1.06 0l-3 3c-.29.29-.29.77 0 1.06l3 3c.15.15.34.22.53.22s.38-.07.53-.22c.29-.29.29-.77 0-1.06l-1.72-1.72h5.19c.41 0 .75-.34.75-.75s-.34-.75-.75-.75Z\"/>\n </svg>\n </button>\n <div class=\"back-button-text\">Back</div>\n </div>\n <button data-type='icon' type='button' class='close-iframe'>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\">\n <path fill=\"#DBDBC4\" d=\"M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10Z\" opacity=\".4\"/>\n <path fill=\"#91190F\" d=\"m13.06 12 2.3-2.3c.29-.29.29-.77 0-1.06a.754.754 0 0 0-1.06 0l-2.3 2.3-2.3-2.3a.754.754 0 0 0-1.06 0c-.29.29-.29.77 0 1.06l2.3 2.3-2.3 2.3c-.29.29-.29.77 0 1.06.15.15.34.22.53.22s.38-.07.53-.22l2.3-2.3 2.3 2.3c.15.15.34.22.53.22s.38-.07.53-.22c.29-.29.29-.77 0-1.06l-2.3-2.3Z\"/>\n </svg>\n <span class='visually-hidden'>Close SmileIdentity Verification frame</span>\n </button>\n </div>\n <h1>\n Select contact method\n </h1>\n\n <form name='select-mode-form' novalidate style='--flow-space: 4.25rem' id='otp-entry' class='flow center'>\n <fieldset class='flow center'>\n <legend class='flow' style='--flow-space: 1.5rem'>\n <p>\n NIBSS, the data custodian of BVN, \n will send you a One-Time Password (OTP) \n </p>\n\n <p>\n <small>\n The request will be from Chams Plc, who is NIBSS' technical partner.\n </small>\n </p>\n </legend>\n\n <div class='flow center'>\n ${\n this.modes.length\n ? this.modes\n .map(\n (mode) => `<label class='input-radio'>\n <input type=\"radio\" id=\"\" name=\"mode\" value=\"${Object.keys(mode)[0]}\">\n <div class='otp-mode'>\n ${\n Object.keys(mode)[0].includes('sms')\n ? `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"29\" height=\"37\" fill=\"none\">\n <path stroke=\"#2F718D\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M16.697 24.12c4.914 0 7.37 0 8.897-1.652 1.527-1.651 1.527-4.31 1.527-9.625 0-5.316 0-7.974-1.527-9.625-1.526-1.651-3.983-1.651-8.897-1.651h-5.211c-4.914 0-7.37 0-8.897 1.651-1.527 1.651-1.527 4.31-1.527 9.625 0 5.316 0 7.974 1.527 9.625.85.92 1.991 1.328 3.685 1.508\"/>\n <g filter=\"url(#sms)\">\n <path stroke=\"#2F718D\" stroke-linecap=\"round\" stroke-width=\"2\" d=\"M16.697 24.12c-1.61 0-3.384.703-5.005 1.613-2.602 1.462-3.903 2.193-4.545 1.727-.64-.465-.52-1.91-.277-4.799l.055-.656\" shape-rendering=\"crispEdges\"/>\n </g>\n <defs>\n <filter id=\"sms\" width=\"20.023\" height=\"15.595\" x=\"1.675\" y=\"21.005\" color-interpolation-filters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\n <feColorMatrix in=\"SourceAlpha\" result=\"hardAlpha\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"/>\n <feOffset dy=\"4\"/>\n <feGaussianBlur stdDeviation=\"2\"/>\n <feComposite in2=\"hardAlpha\" operator=\"out\"/>\n <feColorMatrix values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0\"/>\n <feBlend in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_2_404\"/>\n <feBlend in=\"SourceGraphic\" in2=\"effect1_dropShadow_2_404\" result=\"shape\"/>\n </filter>\n </defs>\n </svg>\n `\n : `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"35\" height=\"24\" fill=\"none\">\n <path stroke=\"#2F718D\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4.062 4.367c0-1.437 1.221-2.603 2.727-2.603h21.815c1.506 0 2.727 1.166 2.727 2.603v15.62c0 1.438-1.221 2.604-2.727 2.604H6.789c-1.506 0-2.727-1.166-2.727-2.604V4.367Z\"/>\n <g filter=\"url(#message)\">\n <path stroke=\"#2F718D\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"m5.426 3.066 8.647 7.338c2.067 1.754 5.18 1.754 7.247 0l8.648-7.338\" shape-rendering=\"crispEdges\"/>\n </g>\n <defs>\n <filter id=\"message\" width=\"34.042\" height=\"18.154\" x=\".676\" y=\"2.316\" color-interpolation-filters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\n <feColorMatrix in=\"SourceAlpha\" result=\"hardAlpha\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"/>\n <feOffset dy=\"4\"/>\n <feGaussianBlur stdDeviation=\"2\"/>\n <feComposite in2=\"hardAlpha\" operator=\"out\"/>\n <feColorMatrix values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0\"/>\n <feBlend in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_2_394\"/>\n <feBlend in=\"SourceGraphic\" in2=\"effect1_dropShadow_2_394\" result=\"shape\"/>\n </filter>\n </defs>\n </svg>\n `\n }\n <div class='flow'>\n <p>\n ${Object.values(mode)[0]}\n </p>\n <p>\n <small>\n An OTP will be sent by ${\n Object.keys(mode)[0].includes(\n 'sms',\n )\n ? 'sms'\n : 'email'\n } to verify your identity\n </small>\n </p>\n </div>\n </div>\n </label>`,\n )\n .join('\\n')\n : 'No modes yet'\n }\n </div>\n </fieldset>\n\n <button data-variant='ghost' id='contact-methods-outdated' style='--flow-space: .5rem' class='' type='button'>\n I am no longer using any of these options\n </button>\n\n <button data-variant='solid' id='select-otp-mode' type='submit'>\n <span class='text'>Continue</span>\n <svg aria-hidden='true' width=\"25\" height=\"24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 12h11m0 0-4.588-4M18 12l-4.588 4\" stroke=\"#fff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span hidden class='spinner'></span>\n </button>\n </form>\n </div>\n\n <div hidden class='flow center' id='otp-verification'>\n <div class=\"nav justify-right\">\n <button data-type='icon' type='button' class='close-iframe'>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\">\n <path fill=\"#DBDBC4\" d=\"M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10Z\" opacity=\".4\"/>\n <path fill=\"#91190F\" d=\"m13.06 12 2.3-2.3c.29-.29.29-.77 0-1.06a.754.754 0 0 0-1.06 0l-2.3 2.3-2.3-2.3a.754.754 0 0 0-1.06 0c-.29.29-.29.77 0 1.06l2.3 2.3-2.3 2.3c-.29.29-.29.77 0 1.06.15.15.34.22.53.22s.38-.07.53-.22l2.3-2.3 2.3 2.3c.15.15.34.22.53.22s.38-.07.53-.22c.29-.29.29-.77 0-1.06l-2.3-2.3Z\"/>\n </svg>\n <span class='visually-hidden'>Close SmileIdentity Verification frame</span>\n </button>\n </div>\n <h1>\n OTP Verification\n </h1>\n\n <div style='--flow-space: 4.25rem' id='otp-entry'>\n <form name='otp-submission-form' novalidate style='--flow-space: 1.5rem' class='flow center'>\n <label for='totp-token'>\n Enter the OTP sent to <span class='font-weight:bold'>${\n this.selectedOtpDeliveryMode\n }</span>\n </label>\n <input type='text' id='totp-token' maxlength='6' inputmode='numeric' autocomplete='one-time-code' />\n\n <p>\n Didn't receive the OTP${\n !this.selectedOtpDeliveryMode\n ? '?'\n : ` at <span class='font-weight:bold'>${this.selectedOtpDeliveryMode}</span>?`\n }\n </p>\n\n <button style='--flow-space: .5rem' data-variant='ghost' class='try-another-method' type='button'>\n Try another contact method\n </button>\n\n <button data-variant='solid' id='submit-otp' type='submit'>\n <span class='text'>Submit</span>\n <svg aria-hidden='true' width=\"25\" height=\"24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 12h11m0 0-4.588-4M18 12l-4.588 4\" stroke=\"#fff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span hidden class='spinner'></span>\n </button>\n </form>\n </div>\n </div>\n `;\n}\n\nclass TotpConsent extends HTMLElement {\n constructor() {\n super();\n\n this.templateString = markup.bind(this);\n this.render = () => this.templateString();\n\n this.attachShadow({ mode: 'open' });\n\n this.modes = [];\n this['otp-delivery-mode'] = '';\n\n this.queryOtpModes = this.queryOtpModes.bind(this);\n this.selectOtpMode = this.selectOtpMode.bind(this);\n this.submitOtp = this.submitOtp.bind(this);\n this.switchContactMethod = this.switchContactMethod.bind(this);\n this.handleTotpConsentGrant = this.handleTotpConsentGrant.bind(this);\n this.handleTotpConsentContactMethodsOutdated =\n this.handleTotpConsentContactMethodsOutdated.bind(this);\n this.pages = [];\n }\n\n static get observedAttributes() {\n return ['modes', 'otp-delivery-mode'];\n }\n\n attributeChangedCallback(name) {\n switch (name) {\n case 'modes':\n case 'otp-delivery-mode': {\n const updatedTemplate = document.createElement('template');\n updatedTemplate.innerHTML = this.render();\n const updatedNode = updatedTemplate.content\n .cloneNode(true)\n .querySelector(`#${this.activeScreen.id}`);\n updatedNode.hidden = false;\n this.shadowRoot.replaceChild(updatedNode, this.activeScreen);\n this.setUpEventListeners();\n this.setActiveScreen(updatedNode);\n break;\n }\n default:\n break;\n }\n }\n\n setUpEventListeners() {\n // Screens\n this.idEntryScreen = this.shadowRoot.querySelector('#id-entry');\n this.selectModeScreen = this.shadowRoot.querySelector('#select-mode');\n this.otpVerificationScreen =\n this.shadowRoot.querySelector('#otp-verification');\n\n if (!this.activeScreen) {\n this.activeScreen = this.idEntryScreen;\n }\n\n // Buttons\n this.queryOtpModesButton =\n this.idEntryScreen.querySelector('#query-otp-modes');\n this.backButton = this.idEntryScreen.querySelector('#back-button');\n this.selectOtpModeButton =\n this.selectModeScreen.querySelector('#select-otp-mode');\n this.entryBackbutton = this.selectModeScreen.querySelector(\n '#back-to-entry-button',\n );\n this.contactMethodsOutdatedButton = this.selectModeScreen.querySelector(\n '#contact-methods-outdated',\n );\n this.submitOtpButton =\n this.otpVerificationScreen.querySelector('#submit-otp');\n this.switchContactMethodButton = this.otpVerificationScreen.querySelector(\n '.try-another-method',\n );\n const CloseIframeButtons =\n this.shadowRoot.querySelectorAll('.close-iframe');\n\n // Input Elements\n this.idNumberInput = this.idEntryScreen.querySelector('#id_number');\n this.modeInputs = this.selectModeScreen.querySelectorAll('[name=\"mode\"]');\n this.otpInput = this.otpVerificationScreen.querySelector('#totp-token');\n\n // Event Handlers\n this.queryOtpModesButton.addEventListener('click', (e) =>\n this.queryOtpModes(e),\n );\n this.selectOtpModeButton.addEventListener('click', (e) =>\n this.selectOtpMode(e),\n );\n this.submitOtpButton.addEventListener('click', (e) => this.submitOtp(e));\n this.switchContactMethodButton.addEventListener('click', (e) =>\n this.switchContactMethod(e),\n );\n this.contactMethodsOutdatedButton.addEventListener('click', (e) =>\n this.handleTotpConsentContactMethodsOutdated(e),\n );\n\n this.entryBackbutton.addEventListener('click', () => {\n this.handleBackClick();\n });\n\n this.backButton.addEventListener('click', () => {\n this.handleBackClick();\n });\n\n CloseIframeButtons.forEach((button) => {\n button.addEventListener(\n 'click',\n () => {\n this.closeWindow();\n },\n false,\n );\n });\n }\n\n closeWindow() {\n const referenceWindow = window.parent;\n [referenceWindow.parent, referenceWindow].forEach((win) => {\n win.postMessage('SmileIdentity::Close', '*');\n });\n }\n\n handleBackClick() {\n const page = this.pages.pop();\n if (page) {\n this.setActiveScreen(page);\n } else {\n this.dispatchEvent(\n new CustomEvent('end-user-consent.totp.cancelled', {}),\n );\n }\n }\n\n connectedCallback() {\n const template = document.createElement('template');\n template.innerHTML = this.render();\n\n this.shadowRoot.appendChild(template.content.cloneNode(true));\n this.setUpEventListeners();\n }\n\n switchContactMethod() {\n this.queryOtpModes();\n }\n\n resetForm() {\n const invalidElements =\n this.activeScreen.querySelectorAll('[aria-invalid]');\n invalidElements.forEach((el) => el.removeAttribute('aria-invalid'));\n\n const validationMessages = this.activeScreen.querySelectorAll(\n '.validation-message',\n );\n validationMessages.forEach((el) => el.remove());\n }\n\n handleIdNumberValidationErrors(errors) {\n const fields = Object.keys(errors);\n\n fields.forEach((field) => {\n const input = this.activeScreen.querySelector(`#${field}`);\n input.setAttribute('aria-invalid', 'true');\n input.setAttribute('aria-describedby', `${field}-hint`);\n\n const errorDiv = document.createElement('div');\n errorDiv.setAttribute('id', `${field}-hint`);\n errorDiv.setAttribute('class', 'validation-message');\n // eslint-disable-next-line prefer-destructuring\n errorDiv.textContent = errors[field][0];\n\n input.insertAdjacentElement('afterend', errorDiv);\n });\n }\n\n handleActiveScreenErrors(error) {\n const submitButton = this.activeScreen.querySelector('[type=\"submit\"]');\n const errorDiv = document.createElement('div');\n errorDiv.setAttribute('class', 'validation-message');\n errorDiv.textContent = error;\n submitButton.insertAdjacentElement('beforebegin', errorDiv);\n }\n\n validateIdNumber(idNumber) {\n const validationConstraints = {\n id_number: {\n format: new RegExp(this.idRegex),\n presence: {\n allowEmpty: false,\n message: 'is required',\n },\n },\n };\n\n const errors = validate({ id_number: idNumber }, validationConstraints);\n\n if (errors) {\n this.handleIdNumberValidationErrors(errors);\n }\n\n return errors;\n }\n\n async queryOtpModes(event) {\n if (event) {\n // ACTION: disable another submission\n event.preventDefault();\n\n // ACTION: Reset any form validation errors'\n this.resetForm();\n }\n\n // ACTION: Validate idNumber\n const validationErrors = this.validateIdNumber(this.idNumberInput.value);\n\n // ACTION: Get and set idNumber\n localStorage.setItem('idNumber', this.idNumberInput.value || this.idNumber);\n\n if (!validationErrors) {\n const data = {\n country: this.country,\n id_number: this.idNumber,\n id_type: this.idType,\n partner_id: this.partnerId,\n token: this.token,\n };\n const url = `${this.baseUrl}/totp_consent`;\n\n try {\n this.toggleLoading();\n const response = await postData(url, data);\n const json = await response.json();\n this.toggleLoading();\n\n if (!response.ok) {\n this.handleActiveScreenErrors(json.error);\n } else {\n this.sessionId = json.session_id;\n this.modes = json.modes;\n this.setActiveScreen(this.selectModeScreen);\n this.setAttribute('modes', json.modes);\n }\n } catch (error) {\n this.toggleLoading();\n this.handleActiveScreenErrors(error.message);\n }\n }\n }\n\n async selectOtpMode(event) {\n // ACTION: disable another submission\n event.preventDefault();\n\n // ACTION: Reset any form validation errors'\n this.resetForm();\n\n // ACTION: Get mode\n this.mode = Array.prototype.find.call(\n this.modeInputs,\n (node) => node.checked,\n ).value;\n const data = {\n country: this.country,\n id_number: this.idNumber,\n id_type: this.idType,\n mode: this.mode,\n partner_id: this.partnerId,\n session_id: this.sessionId,\n token: this.token,\n };\n const url = `${this.baseUrl}/totp_consent/mode`;\n\n try {\n this.toggleLoading();\n const response = await postData(url, data);\n const json = await response.json();\n this.toggleLoading();\n\n if (!response.ok) {\n this.handleActiveScreenErrors(json.error);\n } else {\n this.selectedOtpDeliveryMode = this.modes.filter(\n (mode) => mode[this.mode],\n )[0][this.mode];\n this.setActiveScreen(this.otpVerificationScreen);\n this.setAttribute('otp-delivery-mode', this.selectedOtpDeliveryMode);\n }\n } catch (error) {\n this.toggleLoading();\n this.handleActiveScreenErrors(error.message);\n }\n }\n\n async submitOtp(event) {\n // ACTION: disable another submission\n event.preventDefault();\n\n // ACTION: Reset any form validation errors'\n this.resetForm();\n\n this.otp = this.otpInput.value;\n\n const data = {\n country: this.country,\n id_number: this.idNumber,\n id_type: this.idType,\n otp: this.otp,\n partner_id: this.partnerId,\n session_id: this.sessionId,\n token: this.token,\n };\n const url = `${this.baseUrl}/totp_consent/otp`;\n\n try {\n this.toggleLoading();\n const response = await postData(url, data);\n const json = await response.json();\n this.toggleLoading();\n\n if (!response.ok) {\n this.handleActiveScreenErrors(json.error);\n } else {\n this.handleTotpConsentGrant(event);\n }\n } catch (error) {\n this.toggleLoading();\n this.handleActiveScreenErrors(error.message);\n }\n }\n\n toggleLoading() {\n const button = this.activeScreen.querySelector('button[type=\"submit\"]');\n const text = button.querySelector('.text');\n const arrow = button.querySelector('svg');\n const spinner = button.querySelector('.spinner');\n\n button.toggleAttribute('disabled');\n text.toggleAttribute('hidden');\n arrow.toggleAttribute('hidden');\n spinner.toggleAttribute('hidden');\n }\n\n setActiveScreen(screen) {\n this.activeScreen.hidden = true;\n screen.hidden = false;\n this.activeScreen = screen;\n }\n\n get baseUrl() {\n return this.getAttribute('base-url');\n }\n\n get country() {\n return this.getAttribute('country');\n }\n\n get idHint() {\n return this.getAttribute('id-hint') || 'Your BVN should be 11 digits long';\n }\n\n get idNumber() {\n return localStorage.getItem('idNumber');\n }\n\n get idRegex() {\n return this.getAttribute('id-regex');\n }\n\n get idType() {\n return this.getAttribute('id-type');\n }\n\n get idTypeLabel() {\n return this.getAttribute('id-type-label');\n }\n\n get partnerId() {\n return this.getAttribute('partner-id');\n }\n\n get partnerName() {\n return this.getAttribute('partner-name');\n }\n\n get token() {\n return this.getAttribute('token');\n }\n\n get themeColor() {\n return this.getAttribute('theme-color') || '#001096';\n }\n\n get hideBack() {\n return this.hasAttribute('hide-back');\n }\n\n get showNavigation() {\n return this.hasAttribute('show-navigation');\n }\n\n handleTotpConsentGrant() {\n const customEvent = new CustomEvent('end-user-consent.totp.granted', {\n detail: {\n consented: {\n contact_information: true,\n document_information: true,\n personal_details: true,\n },\n id_number: this.idNumber,\n session_id: this.sessionId,\n },\n });\n\n this.dispatchEvent(customEvent);\n }\n\n handleTotpConsentContactMethodsOutdated() {\n const tag = 'end-user-consent.totp.denied.contact-methods-outdated';\n const customEvent = new CustomEvent(tag, {\n detail: {\n data: {\n id_number: this.idNumber,\n session_id: this.sessionId,\n },\n message: tag,\n },\n });\n\n this.dispatchEvent(customEvent);\n }\n}\n\nif ('customElements' in window && !window.customElements.get('totp-consent')) {\n window.customElements.define('totp-consent', TotpConsent);\n}\n\nexport {\n // eslint-disable-next-line import/prefer-default-export\n TotpConsent,\n};\n"],"names":["postData","url","data","markup","mode","TotpConsent","name","updatedTemplate","updatedNode","CloseIframeButtons","button","referenceWindow","win","page","template","el","errors","field","input","errorDiv","error","submitButton","idNumber","validationConstraints","validate","event","validationErrors","response","json","node","text","arrow","spinner","screen","customEvent","tag"],"mappings":"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"}
|
package/dist/esm/combobox.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combobox.js","sources":["../../lib/components/combobox/src/Combobox.js"],"sourcesContent":["function generateId(prefix) {\r\n const id = [...Array(30)].map(() => Math.random().toString(36)[3]).join('');\r\n return `${prefix}-${id}`;\r\n}\r\n\r\n// check if element is visible in browser view port\r\nfunction isElementInView(element) {\r\n const bounding = element.getBoundingClientRect();\r\n\r\n return (\r\n bounding.top >= 0 &&\r\n bounding.left >= 0 &&\r\n bounding.bottom <=\r\n (window.innerHeight || document.documentElement.clientHeight) &&\r\n bounding.right <=\r\n (window.innerWidth || document.documentElement.clientWidth)\r\n );\r\n}\r\n\r\n// check if an element is currently scrollable\r\nfunction isScrollable(element) {\r\n return element && element.clientHeight < element.scrollHeight;\r\n}\r\n\r\n// ensure a given child element is within the parent's visible scroll area\r\n// if the child is not visible, scroll the parent\r\nfunction maintainScrollVisibility(activeElement, scrollParent) {\r\n const { offsetHeight, offsetTop } = activeElement;\r\n const { offsetHeight: parentOffsetHeight, scrollTop } = scrollParent;\r\n\r\n const isAbove = offsetTop < scrollTop;\r\n const isBelow = offsetTop + offsetHeight > scrollTop + parentOffsetHeight;\r\n\r\n if (isAbove) {\r\n scrollParent.scrollTo(0, offsetTop);\r\n } else if (isBelow) {\r\n scrollParent.scrollTo(0, offsetTop - parentOffsetHeight + offsetHeight);\r\n }\r\n}\r\n\r\nclass ComboboxRoot extends HTMLElement {\r\n constructor() {\r\n super();\r\n\r\n this.handleRoaming = this.handleRoaming.bind(this);\r\n }\r\n\r\n connectedCallback() {\r\n this.trigger = this.querySelector('smileid-combobox-trigger');\r\n\r\n document.addEventListener('click', this.handleRoaming);\r\n this.addEventListener('focusout', this.handleRoaming);\r\n this.addEventListener('blur', this.handleRoaming);\r\n }\r\n\r\n disconnectedCallback() {\r\n document.removeEventListener('click', this.handleRoaming);\r\n this.removeEventListener('focusout', this.handleRoaming);\r\n this.removeEventListener('blur', this.handleRoaming);\r\n }\r\n\r\n handleRoaming(event) {\r\n const target = event.relatedTarget || event.target;\r\n if (this.contains(target)) {\r\n return;\r\n }\r\n\r\n if (this.trigger.getAttribute('expanded') === 'true') {\r\n this.trigger.setAttribute('expanded', 'false');\r\n }\r\n }\r\n}\r\n\r\nclass ComboboxTrigger extends HTMLElement {\r\n constructor() {\r\n super();\r\n\r\n this.handleKeyUp = this.handleKeyUp.bind(this);\r\n this.handleKeyDown = this.handleKeyDown.bind(this);\r\n this.handleSelection = this.handleSelection.bind(this);\r\n\r\n this.toggleExpansionState = this.toggleExpansionState.bind(this);\r\n }\r\n\r\n get type() {\r\n return this.getAttribute('type') || 'text';\r\n }\r\n\r\n get label() {\r\n return this.getAttribute('label') || '';\r\n }\r\n\r\n get value() {\r\n return this.getAttribute('value') || '';\r\n }\r\n\r\n get disabled() {\r\n return this.hasAttribute('disabled');\r\n }\r\n\r\n connectedCallback() {\r\n if (!this.label) {\r\n throw new Error('<combobox-trigger>: a label attribute is required');\r\n }\r\n\r\n this.innerHTML = `${\r\n this.type === 'text'\r\n ? `\r\n <div>\r\n <input ${this.value ? `value=\"${this.value}\" ` : ''}${\r\n this.disabled ? ' disabled ' : ''\r\n }type=\"text\" placeholder=\"${this.label}\" />\r\n <button ${this.disabled ? 'disabled ' : ''}tabindex='-1' type='button'>\r\n <span class=\"visually-hidden\">Toggle</span>\r\n </button>\r\n </div>\r\n `\r\n : `<button ${this.disabled ? 'disabled ' : ''}type=\"button\">${\r\n this.value || this.label\r\n }</button>`\r\n }`;\r\n\r\n this.setAttribute('expanded', false);\r\n\r\n this.inputTrigger = this.querySelector('input');\r\n this.buttonTrigger = this.querySelector('button');\r\n\r\n this.buttonTrigger.setAttribute('aria-expanded', false);\r\n this.buttonTrigger.setAttribute('role', 'combobox');\r\n\r\n this.buttonTrigger.addEventListener('keydown', this.handleKeyDown);\r\n this.buttonTrigger.addEventListener('click', this.toggleExpansionState);\r\n\r\n if (this.inputTrigger) {\r\n this.inputTrigger.setAttribute('aria-expanded', false);\r\n this.inputTrigger.setAttribute('role', 'combobox');\r\n\r\n this.inputTrigger.addEventListener('keydown', this.handleKeyDown);\r\n this.inputTrigger.addEventListener('keyup', this.handleKeyUp);\r\n this.inputTrigger.addEventListener('change', (e) => e.stopPropagation());\r\n }\r\n\r\n this.listbox = this.parentElement.querySelector('smileid-combobox-listbox');\r\n\r\n this.options = Array.from(\r\n this.parentElement.querySelectorAll('smileid-combobox-option'),\r\n );\r\n this.options.forEach((node) => {\r\n node.addEventListener('combobox.option.select', this.handleSelection);\r\n });\r\n }\r\n\r\n disconnectedCallback() {\r\n this.buttonTrigger.removeEventListener('keydown', this.handleKeyDown);\r\n this.buttonTrigger.removeEventListener('click', this.toggleExpansionState);\r\n\r\n if (this.inputTrigger) {\r\n this.inputTrigger.removeEventListener('keydown', this.handleKeyDown);\r\n this.inputTrigger.removeEventListener('keyup', this.handleKeyUp);\r\n this.inputTrigger.removeEventListener('change', (e) =>\r\n e.stopPropagation(),\r\n );\r\n }\r\n\r\n if (this.options) {\r\n this.options.forEach((node) => {\r\n node.removeEventListener(\r\n 'combobox.option.select',\r\n this.handleSelection,\r\n );\r\n });\r\n }\r\n }\r\n\r\n handleKeyDown(event) {\r\n if (event.ctrlKey || event.shiftKey) {\r\n return;\r\n }\r\n\r\n const { key } = event;\r\n\r\n switch (key) {\r\n case 'Enter':\r\n case 'Space':\r\n case ' ':\r\n if (this.getAttribute('expanded') === 'true') {\r\n if (this.inputTrigger && (key === 'Space' || key === ' ')) {\r\n this.resetListbox();\r\n } else {\r\n event.preventDefault();\r\n const selectedOption = this.buttonTrigger.getAttribute(\r\n 'aria-activedescendant',\r\n );\r\n if (selectedOption) {\r\n document.getElementById(selectedOption).click();\r\n }\r\n }\r\n } else {\r\n event.preventDefault();\r\n this.toggleExpansionState();\r\n }\r\n break;\r\n case 'Esc':\r\n case 'Escape':\r\n event.preventDefault();\r\n if (this.getAttribute('expanded') === 'true') {\r\n this.toggleExpansionState();\r\n }\r\n break;\r\n case 'Down':\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n if (this.getAttribute('expanded') !== 'true') {\r\n this.toggleExpansionState();\r\n this.focusListbox('First');\r\n } else {\r\n this.focusListbox('Down');\r\n }\r\n break;\r\n case 'Up':\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n if (this.getAttribute('expanded') !== 'true') {\r\n this.toggleExpansionState();\r\n this.focusListbox('Last');\r\n } else {\r\n this.focusListbox('Up');\r\n }\r\n break;\r\n case 'Left':\r\n case 'ArrowLeft':\r\n case 'Right':\r\n case 'ArrowRight':\r\n case 'Home':\r\n case 'End':\r\n this.resetListbox();\r\n break;\r\n case 'Tab':\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n handleKeyUp(event) {\r\n const { key } = event;\r\n\r\n const isPrintableCharacter = (str) => str.length === 1 && str.match(/\\S| /);\r\n\r\n if (event.key === 'Escape' || event.key === 'Esc') {\r\n event.preventDefault();\r\n if (this.getAttribute('expanded') === 'true') {\r\n this.toggleExpansionState();\r\n } else if (this.inputTrigger) {\r\n this.inputTrigger.value = '';\r\n\r\n this.listbox.dispatchEvent(\r\n new CustomEvent('combobox.listbox.filter', { detail: '' }),\r\n );\r\n }\r\n }\r\n\r\n if (isPrintableCharacter(key) || key === 'Backspace') {\r\n this.resetListbox();\r\n this.filterListbox(event.target.value);\r\n }\r\n }\r\n\r\n toggleExpansionState() {\r\n const listboxIsExpanded = this.getAttribute('expanded') === 'true';\r\n this.setAttribute('expanded', !listboxIsExpanded);\r\n this.buttonTrigger.setAttribute('aria-expanded', !listboxIsExpanded);\r\n if (this.inputTrigger) {\r\n this.inputTrigger.setAttribute('aria-expanded', !listboxIsExpanded);\r\n }\r\n }\r\n\r\n handleSelection(event) {\r\n if (this.inputTrigger) {\r\n this.inputTrigger.value = event.detail.label;\r\n } else {\r\n this.buttonTrigger.textContent = event.detail.label;\r\n }\r\n\r\n this.toggleExpansionState();\r\n this.parentElement.dispatchEvent(\r\n new CustomEvent('combobox.change', {\r\n detail: {\r\n value: event.detail.value,\r\n },\r\n }),\r\n );\r\n }\r\n\r\n filterListbox(value) {\r\n if (this.getAttribute('expanded') !== 'true') {\r\n this.toggleExpansionState();\r\n }\r\n\r\n this.listbox.dispatchEvent(\r\n new CustomEvent('combobox.listbox.filter', { detail: value }),\r\n );\r\n }\r\n\r\n focusListbox(direction) {\r\n this.resetListbox();\r\n this.listbox.dispatchEvent(\r\n new CustomEvent('combobox.listbox.focus', {\r\n detail: {\r\n direction,\r\n },\r\n }),\r\n );\r\n }\r\n\r\n resetListbox() {\r\n this.listbox.dispatchEvent(new CustomEvent('combobox.listbox.reset'));\r\n }\r\n}\r\n\r\nclass ComboboxListbox extends HTMLElement {\r\n constructor() {\r\n super();\r\n\r\n this.handleFilter = this.handleFilter.bind(this);\r\n this.handleFocus = this.handleFocus.bind(this);\r\n this.handleReset = this.handleReset.bind(this);\r\n\r\n this.handleOptionSelection = this.handleOptionSelection.bind(this);\r\n }\r\n\r\n get emptyLabel() {\r\n return this.getAttribute('empty-label');\r\n }\r\n\r\n get emptyState() {\r\n return `\r\n <p id='empty-state' style=\"text-align: center;\">\r\n ${this.emptyLabel || 'No items'}\r\n </p>\r\n `;\r\n }\r\n\r\n connectedCallback() {\r\n this.setAttribute('role', 'listbox');\r\n this.setAttribute('id', generateId('listbox'));\r\n\r\n this.addEventListener('combobox.listbox.filter', this.handleFilter);\r\n this.addEventListener('combobox.listbox.focus', this.handleFocus);\r\n this.addEventListener('combobox.listbox.reset', this.handleReset);\r\n\r\n this.triggers = Array.from(\r\n this.parentElement.querySelectorAll(\r\n 'smileid-combobox-trigger input, smileid-combobox-trigger button',\r\n ),\r\n );\r\n this.triggers.forEach((node) =>\r\n node.setAttribute('aria-controls', this.getAttribute('id')),\r\n );\r\n\r\n this.optionNodes = Array.from(\r\n this.querySelectorAll('smileid-combobox-option'),\r\n );\r\n this.selectedNode =\r\n this.optionNodes.find(\r\n (node) =>\r\n !node.hasAttribute('hidden') && node.hasAttribute('aria-selected'),\r\n ) || this.optionNodes.filter((node) => !node.hasAttribute('hidden'))[0];\r\n this.selectedNode.setAttribute('tabindex', '0');\r\n\r\n this.optionNodes.forEach((node) => {\r\n node.addEventListener(\r\n 'combobox.option.select',\r\n this.handleOptionSelection,\r\n );\r\n });\r\n\r\n if (this.optionNodes.length === 0) {\r\n this.innerHTML = this.emptyState;\r\n }\r\n }\r\n\r\n disconnectedCallback() {\r\n this.removeEventListener('combobox.listbox.filter', this.handleFilter);\r\n this.removeEventListener('combobox.listbox.focus', this.handleFocus);\r\n this.removeEventListener('combobox.listbox.reset', this.handleReset);\r\n this.optionNodes.forEach((node) => {\r\n node.removeEventListener(\r\n 'combobox.option.select',\r\n this.handleOptionSelection,\r\n );\r\n });\r\n }\r\n\r\n static get observedAttributes() {\r\n return ['search-term'];\r\n }\r\n\r\n attributeChangedCallback(name, oldValue, newValue) {\r\n switch (name) {\r\n case 'search-term':\r\n if (oldValue && !newValue) {\r\n this.optionNodes.forEach((node) => {\r\n node.removeAttribute('hidden');\r\n });\r\n } else if (newValue) {\r\n this.filterNodes(newValue);\r\n }\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n filterNodes(searchTerm) {\r\n this.optionNodes.forEach((node) => {\r\n const value = node.getAttribute('value').toLowerCase();\r\n const label = node.getAttribute('label').toLowerCase();\r\n\r\n const containsSearchTerm =\r\n value.includes(searchTerm.toLowerCase()) ||\r\n label.includes(searchTerm.toLowerCase());\r\n\r\n if (containsSearchTerm) {\r\n node.removeAttribute('hidden');\r\n } else {\r\n node.setAttribute('hidden', true);\r\n }\r\n });\r\n\r\n const optionsVisible = this.optionNodes.find(\r\n (node) => !node.hasAttribute('hidden'),\r\n );\r\n const emptyState = this.querySelector('#empty-state');\r\n\r\n if (!optionsVisible && !emptyState) {\r\n this.insertAdjacentHTML('afterbegin', this.emptyState);\r\n } else if (optionsVisible && emptyState) {\r\n this.removeChild(emptyState);\r\n }\r\n }\r\n\r\n handleFilter(event) {\r\n const searchTerm = event.detail;\r\n this.setAttribute('search-term', searchTerm);\r\n }\r\n\r\n handleFocus(event) {\r\n this.setSelected(event.detail.direction);\r\n }\r\n\r\n handleReset() {\r\n this.optionNodes.forEach((node) => node.setAttribute('tabindex', '-1'));\r\n }\r\n\r\n handleOptionSelection(event) {\r\n const inputTrigger = this.triggers.filter(\r\n (node) => node.tagName === 'INPUT',\r\n )[0];\r\n\r\n if (inputTrigger) {\r\n this.setAttribute('search-term', event.detail.label);\r\n }\r\n }\r\n\r\n setSelected(direction) {\r\n const visibleOptions = this.optionNodes.filter(\r\n (node) => !node.hasAttribute('hidden'),\r\n );\r\n this.selectedNode.setAttribute('tabindex', '0');\r\n const currentIndex = visibleOptions.findIndex(\r\n (node) => node === this.selectedNode,\r\n );\r\n const lastIndex = visibleOptions.length - 1;\r\n\r\n let nextIndex;\r\n switch (direction) {\r\n case 'First':\r\n nextIndex = 0;\r\n break;\r\n case 'Last':\r\n nextIndex = lastIndex;\r\n break;\r\n case 'Up':\r\n if (currentIndex === 0) {\r\n nextIndex = lastIndex;\r\n } else {\r\n nextIndex = currentIndex - 1;\r\n }\r\n break;\r\n default:\r\n if (currentIndex === lastIndex) {\r\n nextIndex = 0;\r\n } else {\r\n nextIndex = currentIndex + 1;\r\n }\r\n break;\r\n }\r\n\r\n if (currentIndex !== nextIndex) {\r\n this.swapSelected(this.selectedNode, visibleOptions[nextIndex]);\r\n }\r\n }\r\n\r\n swapSelected(currentNode, newNode) {\r\n currentNode.setAttribute('tabindex', '-1');\r\n newNode.setAttribute('tabindex', '0');\r\n\r\n this.selectedNode = newNode;\r\n\r\n // ACTION: ensure the new option is in view\r\n if (isScrollable(this)) {\r\n maintainScrollVisibility(this.selectedNode, this);\r\n }\r\n\r\n // ACTION: scroll into view if node is not visible\r\n if (!isElementInView(newNode)) {\r\n newNode.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\r\n }\r\n\r\n this.triggers.forEach((node) =>\r\n node.setAttribute('aria-activedescendant', newNode.id),\r\n );\r\n }\r\n}\r\n\r\nclass ComboboxOption extends HTMLElement {\r\n connectedCallback() {\r\n this.setAttribute('role', 'option');\r\n this.setAttribute('tabindex', '-1');\r\n this.setAttribute('id', generateId('option'));\r\n\r\n this.options = Array.from(\r\n this.parentElement.querySelectorAll('smileid-combobox-option'),\r\n );\r\n this.addEventListener('click', this.select);\r\n }\r\n\r\n disconnectedCallback() {\r\n this.removeEventListener('click', this.select);\r\n }\r\n\r\n get value() {\r\n return this.getAttribute('value');\r\n }\r\n\r\n get label() {\r\n return this.getAttribute('label');\r\n }\r\n\r\n select() {\r\n const selectedOption = this.options.find((node) =>\r\n node.getAttribute('aria-selected'),\r\n );\r\n\r\n if (selectedOption) {\r\n selectedOption.removeAttribute('aria-selected');\r\n }\r\n\r\n this.setAttribute('aria-selected', true);\r\n\r\n this.dispatchEvent(\r\n new CustomEvent('combobox.option.select', {\r\n detail: {\r\n id: this.getAttribute('id'),\r\n label: this.label,\r\n value: this.value,\r\n },\r\n }),\r\n );\r\n }\r\n}\r\n\r\nconst Root = ComboboxRoot;\r\nconst Trigger = ComboboxTrigger;\r\nconst List = ComboboxListbox;\r\nconst Option = ComboboxOption;\r\n\r\nif (\r\n 'customElements' in window &&\r\n !window.customElements.get('smileid-combobox')\r\n) {\r\n window.customElements.define('smileid-combobox', Root);\r\n window.customElements.define('smileid-combobox-trigger', Trigger);\r\n window.customElements.define('smileid-combobox-listbox', List);\r\n window.customElements.define('smileid-combobox-option', Option);\r\n}\r\n\r\nexport { Root, Trigger, List, Option };\r\n"],"names":["generateId","prefix","id","isElementInView","element","bounding","isScrollable","maintainScrollVisibility","activeElement","scrollParent","offsetHeight","offsetTop","parentOffsetHeight","scrollTop","isAbove","isBelow","ComboboxRoot","event","target","ComboboxTrigger","e","node","key","selectedOption","isPrintableCharacter","str","listboxIsExpanded","value","direction","ComboboxListbox","name","oldValue","newValue","searchTerm","label","optionsVisible","emptyState","visibleOptions","currentIndex","lastIndex","nextIndex","currentNode","newNode","ComboboxOption","Root","Trigger","List","Option"],"mappings":"AAAA,SAASA,EAAWC,GAAQ;AAC1B,QAAMC,IAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,IAAI,MAAM,KAAK,OAAM,EAAG,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE;AAC1E,SAAO,GAAGD,CAAM,IAAIC,CAAE;AACxB;AAGA,SAASC,EAAgBC,GAAS;AAChC,QAAMC,IAAWD,EAAQ;AAEzB,SACEC,EAAS,OAAO,KAChBA,EAAS,QAAQ,KACjBA,EAAS,WACN,OAAO,eAAe,SAAS,gBAAgB,iBAClDA,EAAS,UACN,OAAO,cAAc,SAAS,gBAAgB;AAErD;AAGA,SAASC,EAAaF,GAAS;AAC7B,SAAOA,KAAWA,EAAQ,eAAeA,EAAQ;AACnD;AAIA,SAASG,EAAyBC,GAAeC,GAAc;AAC7D,QAAM,EAAE,cAAAC,GAAc,WAAAC,EAAW,IAAGH,GAC9B,EAAE,cAAcI,GAAoB,WAAAC,EAAS,IAAKJ,GAElDK,IAAUH,IAAYE,GACtBE,IAAUJ,IAAYD,IAAeG,IAAYD;AAEvD,EAAIE,IACFL,EAAa,SAAS,GAAGE,CAAS,IACzBI,KACTN,EAAa,SAAS,GAAGE,IAAYC,IAAqBF,CAAY;AAE1E;AAEA,MAAMM,UAAqB,YAAY;AAAA,EACrC,cAAc;AACZ,aAEA,KAAK,gBAAgB,KAAK,cAAc,KAAK,IAAI;AAAA,EAClD;AAAA,EAED,oBAAoB;AAClB,SAAK,UAAU,KAAK,cAAc,0BAA0B,GAE5D,SAAS,iBAAiB,SAAS,KAAK,aAAa,GACrD,KAAK,iBAAiB,YAAY,KAAK,aAAa,GACpD,KAAK,iBAAiB,QAAQ,KAAK,aAAa;AAAA,EACjD;AAAA,EAED,uBAAuB;AACrB,aAAS,oBAAoB,SAAS,KAAK,aAAa,GACxD,KAAK,oBAAoB,YAAY,KAAK,aAAa,GACvD,KAAK,oBAAoB,QAAQ,KAAK,aAAa;AAAA,EACpD;AAAA,EAED,cAAcC,GAAO;AACnB,UAAMC,IAASD,EAAM,iBAAiBA,EAAM;AAC5C,IAAI,KAAK,SAASC,CAAM,KAIpB,KAAK,QAAQ,aAAa,UAAU,MAAM,UAC5C,KAAK,QAAQ,aAAa,YAAY,OAAO;AAAA,EAEhD;AACH;AAEA,MAAMC,UAAwB,YAAY;AAAA,EACxC,cAAc;AACZ,aAEA,KAAK,cAAc,KAAK,YAAY,KAAK,IAAI,GAC7C,KAAK,gBAAgB,KAAK,cAAc,KAAK,IAAI,GACjD,KAAK,kBAAkB,KAAK,gBAAgB,KAAK,IAAI,GAErD,KAAK,uBAAuB,KAAK,qBAAqB,KAAK,IAAI;AAAA,EAChE;AAAA,EAED,IAAI,OAAO;AACT,WAAO,KAAK,aAAa,MAAM,KAAK;AAAA,EACrC;AAAA,EAED,IAAI,QAAQ;AACV,WAAO,KAAK,aAAa,OAAO,KAAK;AAAA,EACtC;AAAA,EAED,IAAI,QAAQ;AACV,WAAO,KAAK,aAAa,OAAO,KAAK;AAAA,EACtC;AAAA,EAED,IAAI,WAAW;AACb,WAAO,KAAK,aAAa,UAAU;AAAA,EACpC;AAAA,EAED,oBAAoB;AAClB,QAAI,CAAC,KAAK;AACR,YAAM,IAAI,MAAM,mDAAmD;AAGrE,SAAK,YAAY,GACf,KAAK,SAAS,SACV;AAAA;AAAA,mBAES,KAAK,QAAQ,UAAU,KAAK,KAAK,OAAO,EAAE,GACjD,KAAK,WAAW,eAAe,EAC3C,4BAAsC,KAAK,KAAK;AAAA,oBAC5B,KAAK,WAAW,cAAc,EAAE;AAAA;AAAA;AAAA;AAAA,UAK1C,WAAW,KAAK,WAAW,cAAc,EAAE,iBACzC,KAAK,SAAS,KAAK,KAC/B,WACA,IAEI,KAAK,aAAa,YAAY,EAAK,GAEnC,KAAK,eAAe,KAAK,cAAc,OAAO,GAC9C,KAAK,gBAAgB,KAAK,cAAc,QAAQ,GAEhD,KAAK,cAAc,aAAa,iBAAiB,EAAK,GACtD,KAAK,cAAc,aAAa,QAAQ,UAAU,GAElD,KAAK,cAAc,iBAAiB,WAAW,KAAK,aAAa,GACjE,KAAK,cAAc,iBAAiB,SAAS,KAAK,oBAAoB,GAElE,KAAK,iBACP,KAAK,aAAa,aAAa,iBAAiB,EAAK,GACrD,KAAK,aAAa,aAAa,QAAQ,UAAU,GAEjD,KAAK,aAAa,iBAAiB,WAAW,KAAK,aAAa,GAChE,KAAK,aAAa,iBAAiB,SAAS,KAAK,WAAW,GAC5D,KAAK,aAAa,iBAAiB,UAAU,CAACC,MAAMA,EAAE,gBAAe,CAAE,IAGzE,KAAK,UAAU,KAAK,cAAc,cAAc,0BAA0B,GAE1E,KAAK,UAAU,MAAM;AAAA,MACnB,KAAK,cAAc,iBAAiB,yBAAyB;AAAA,IACnE,GACI,KAAK,QAAQ,QAAQ,CAACC,MAAS;AAC7B,MAAAA,EAAK,iBAAiB,0BAA0B,KAAK,eAAe;AAAA,IAC1E,CAAK;AAAA,EACF;AAAA,EAED,uBAAuB;AACrB,SAAK,cAAc,oBAAoB,WAAW,KAAK,aAAa,GACpE,KAAK,cAAc,oBAAoB,SAAS,KAAK,oBAAoB,GAErE,KAAK,iBACP,KAAK,aAAa,oBAAoB,WAAW,KAAK,aAAa,GACnE,KAAK,aAAa,oBAAoB,SAAS,KAAK,WAAW,GAC/D,KAAK,aAAa;AAAA,MAAoB;AAAA,MAAU,CAACD,MAC/CA,EAAE,gBAAiB;AAAA,IAC3B,IAGQ,KAAK,WACP,KAAK,QAAQ,QAAQ,CAACC,MAAS;AAC7B,MAAAA,EAAK;AAAA,QACH;AAAA,QACA,KAAK;AAAA,MACf;AAAA,IACA,CAAO;AAAA,EAEJ;AAAA,EAED,cAAcJ,GAAO;AACnB,QAAIA,EAAM,WAAWA,EAAM;AACzB;AAGF,UAAM,EAAE,KAAAK,EAAK,IAAGL;AAEhB,YAAQK,GAAG;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,YAAI,KAAK,aAAa,UAAU,MAAM;AACpC,cAAI,KAAK,iBAAiBA,MAAQ,WAAWA,MAAQ;AACnD,iBAAK,aAAY;AAAA,eACZ;AACL,YAAAL,EAAM,eAAc;AACpB,kBAAMM,IAAiB,KAAK,cAAc;AAAA,cACxC;AAAA,YACd;AACY,YAAIA,KACF,SAAS,eAAeA,CAAc,EAAE,MAAK;AAAA,UAEhD;AAAA;AAED,UAAAN,EAAM,eAAc,GACpB,KAAK,qBAAoB;AAE3B;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,QAAAA,EAAM,eAAc,GAChB,KAAK,aAAa,UAAU,MAAM,UACpC,KAAK,qBAAoB;AAE3B;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,QAAAA,EAAM,eAAc,GAChB,KAAK,aAAa,UAAU,MAAM,UACpC,KAAK,qBAAoB,GACzB,KAAK,aAAa,OAAO,KAEzB,KAAK,aAAa,MAAM;AAE1B;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,QAAAA,EAAM,eAAc,GAChB,KAAK,aAAa,UAAU,MAAM,UACpC,KAAK,qBAAoB,GACzB,KAAK,aAAa,MAAM,KAExB,KAAK,aAAa,IAAI;AAExB;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,aAAK,aAAY;AACjB;AAAA,IAKH;AAAA,EACF;AAAA,EAED,YAAYA,GAAO;AACjB,UAAM,EAAE,KAAAK,EAAK,IAAGL,GAEVO,IAAuB,CAACC,MAAQA,EAAI,WAAW,KAAKA,EAAI,MAAM,MAAM;AAE1E,KAAIR,EAAM,QAAQ,YAAYA,EAAM,QAAQ,WAC1CA,EAAM,eAAc,GAChB,KAAK,aAAa,UAAU,MAAM,SACpC,KAAK,qBAAoB,IAChB,KAAK,iBACd,KAAK,aAAa,QAAQ,IAE1B,KAAK,QAAQ;AAAA,MACX,IAAI,YAAY,2BAA2B,EAAE,QAAQ,GAAE,CAAE;AAAA,IACnE,MAIQO,EAAqBF,CAAG,KAAKA,MAAQ,iBACvC,KAAK,aAAY,GACjB,KAAK,cAAcL,EAAM,OAAO,KAAK;AAAA,EAExC;AAAA,EAED,uBAAuB;AACrB,UAAMS,IAAoB,KAAK,aAAa,UAAU,MAAM;AAC5D,SAAK,aAAa,YAAY,CAACA,CAAiB,GAChD,KAAK,cAAc,aAAa,iBAAiB,CAACA,CAAiB,GAC/D,KAAK,gBACP,KAAK,aAAa,aAAa,iBAAiB,CAACA,CAAiB;AAAA,EAErE;AAAA,EAED,gBAAgBT,GAAO;AACrB,IAAI,KAAK,eACP,KAAK,aAAa,QAAQA,EAAM,OAAO,QAEvC,KAAK,cAAc,cAAcA,EAAM,OAAO,OAGhD,KAAK,qBAAoB,GACzB,KAAK,cAAc;AAAA,MACjB,IAAI,YAAY,mBAAmB;AAAA,QACjC,QAAQ;AAAA,UACN,OAAOA,EAAM,OAAO;AAAA,QACrB;AAAA,MACT,CAAO;AAAA,IACP;AAAA,EACG;AAAA,EAED,cAAcU,GAAO;AACnB,IAAI,KAAK,aAAa,UAAU,MAAM,UACpC,KAAK,qBAAoB,GAG3B,KAAK,QAAQ;AAAA,MACX,IAAI,YAAY,2BAA2B,EAAE,QAAQA,EAAK,CAAE;AAAA,IAClE;AAAA,EACG;AAAA,EAED,aAAaC,GAAW;AACtB,SAAK,aAAY,GACjB,KAAK,QAAQ;AAAA,MACX,IAAI,YAAY,0BAA0B;AAAA,QACxC,QAAQ;AAAA,UACN,WAAAA;AAAA,QACD;AAAA,MACT,CAAO;AAAA,IACP;AAAA,EACG;AAAA,EAED,eAAe;AACb,SAAK,QAAQ,cAAc,IAAI,YAAY,wBAAwB,CAAC;AAAA,EACrE;AACH;AAEA,MAAMC,UAAwB,YAAY;AAAA,EACxC,cAAc;AACZ,aAEA,KAAK,eAAe,KAAK,aAAa,KAAK,IAAI,GAC/C,KAAK,cAAc,KAAK,YAAY,KAAK,IAAI,GAC7C,KAAK,cAAc,KAAK,YAAY,KAAK,IAAI,GAE7C,KAAK,wBAAwB,KAAK,sBAAsB,KAAK,IAAI;AAAA,EAClE;AAAA,EAED,IAAI,aAAa;AACf,WAAO,KAAK,aAAa,aAAa;AAAA,EACvC;AAAA,EAED,IAAI,aAAa;AACf,WAAO;AAAA;AAAA,UAED,KAAK,cAAc,UAAU;AAAA;AAAA;AAAA,EAGpC;AAAA,EAED,oBAAoB;AAClB,SAAK,aAAa,QAAQ,SAAS,GACnC,KAAK,aAAa,MAAM7B,EAAW,SAAS,CAAC,GAE7C,KAAK,iBAAiB,2BAA2B,KAAK,YAAY,GAClE,KAAK,iBAAiB,0BAA0B,KAAK,WAAW,GAChE,KAAK,iBAAiB,0BAA0B,KAAK,WAAW,GAEhE,KAAK,WAAW,MAAM;AAAA,MACpB,KAAK,cAAc;AAAA,QACjB;AAAA,MACD;AAAA,IACP,GACI,KAAK,SAAS;AAAA,MAAQ,CAACqB,MACrBA,EAAK,aAAa,iBAAiB,KAAK,aAAa,IAAI,CAAC;AAAA,IAChE,GAEI,KAAK,cAAc,MAAM;AAAA,MACvB,KAAK,iBAAiB,yBAAyB;AAAA,IACrD,GACI,KAAK,eACH,KAAK,YAAY;AAAA,MACf,CAACA,MACC,CAACA,EAAK,aAAa,QAAQ,KAAKA,EAAK,aAAa,eAAe;AAAA,IACpE,KAAI,KAAK,YAAY,OAAO,CAACA,MAAS,CAACA,EAAK,aAAa,QAAQ,CAAC,EAAE,CAAC,GACxE,KAAK,aAAa,aAAa,YAAY,GAAG,GAE9C,KAAK,YAAY,QAAQ,CAACA,MAAS;AACjC,MAAAA,EAAK;AAAA,QACH;AAAA,QACA,KAAK;AAAA,MACb;AAAA,IACA,CAAK,GAEG,KAAK,YAAY,WAAW,MAC9B,KAAK,YAAY,KAAK;AAAA,EAEzB;AAAA,EAED,uBAAuB;AACrB,SAAK,oBAAoB,2BAA2B,KAAK,YAAY,GACrE,KAAK,oBAAoB,0BAA0B,KAAK,WAAW,GACnE,KAAK,oBAAoB,0BAA0B,KAAK,WAAW,GACnE,KAAK,YAAY,QAAQ,CAACA,MAAS;AACjC,MAAAA,EAAK;AAAA,QACH;AAAA,QACA,KAAK;AAAA,MACb;AAAA,IACA,CAAK;AAAA,EACF;AAAA,EAED,WAAW,qBAAqB;AAC9B,WAAO,CAAC,aAAa;AAAA,EACtB;AAAA,EAED,yBAAyBS,GAAMC,GAAUC,GAAU;AACjD,YAAQF,GAAI;AAAA,MACV,KAAK;AACH,QAAIC,KAAY,CAACC,IACf,KAAK,YAAY,QAAQ,CAACX,MAAS;AACjC,UAAAA,EAAK,gBAAgB,QAAQ;AAAA,QACzC,CAAW,IACQW,KACT,KAAK,YAAYA,CAAQ;AAE3B;AAAA,IAGH;AAAA,EACF;AAAA,EAED,YAAYC,GAAY;AACtB,SAAK,YAAY,QAAQ,CAACZ,MAAS;AACjC,YAAMM,IAAQN,EAAK,aAAa,OAAO,EAAE,YAAW,GAC9Ca,IAAQb,EAAK,aAAa,OAAO,EAAE,YAAW;AAMpD,MAHEM,EAAM,SAASM,EAAW,aAAa,KACvCC,EAAM,SAASD,EAAW,YAAa,CAAA,IAGvCZ,EAAK,gBAAgB,QAAQ,IAE7BA,EAAK,aAAa,UAAU,EAAI;AAAA,IAExC,CAAK;AAED,UAAMc,IAAiB,KAAK,YAAY;AAAA,MACtC,CAACd,MAAS,CAACA,EAAK,aAAa,QAAQ;AAAA,IAC3C,GACUe,IAAa,KAAK,cAAc,cAAc;AAEpD,IAAI,CAACD,KAAkB,CAACC,IACtB,KAAK,mBAAmB,cAAc,KAAK,UAAU,IAC5CD,KAAkBC,KAC3B,KAAK,YAAYA,CAAU;AAAA,EAE9B;AAAA,EAED,aAAanB,GAAO;AAClB,UAAMgB,IAAahB,EAAM;AACzB,SAAK,aAAa,eAAegB,CAAU;AAAA,EAC5C;AAAA,EAED,YAAYhB,GAAO;AACjB,SAAK,YAAYA,EAAM,OAAO,SAAS;AAAA,EACxC;AAAA,EAED,cAAc;AACZ,SAAK,YAAY,QAAQ,CAACI,MAASA,EAAK,aAAa,YAAY,IAAI,CAAC;AAAA,EACvE;AAAA,EAED,sBAAsBJ,GAAO;AAK3B,IAJqB,KAAK,SAAS;AAAA,MACjC,CAACI,MAASA,EAAK,YAAY;AAAA,IAC5B,EAAC,CAAC,KAGD,KAAK,aAAa,eAAeJ,EAAM,OAAO,KAAK;AAAA,EAEtD;AAAA,EAED,YAAYW,GAAW;AACrB,UAAMS,IAAiB,KAAK,YAAY;AAAA,MACtC,CAAChB,MAAS,CAACA,EAAK,aAAa,QAAQ;AAAA,IAC3C;AACI,SAAK,aAAa,aAAa,YAAY,GAAG;AAC9C,UAAMiB,IAAeD,EAAe;AAAA,MAClC,CAAChB,MAASA,MAAS,KAAK;AAAA,IAC9B,GACUkB,IAAYF,EAAe,SAAS;AAE1C,QAAIG;AACJ,YAAQZ,GAAS;AAAA,MACf,KAAK;AACH,QAAAY,IAAY;AACZ;AAAA,MACF,KAAK;AACH,QAAAA,IAAYD;AACZ;AAAA,MACF,KAAK;AACH,QAAID,MAAiB,IACnBE,IAAYD,IAEZC,IAAYF,IAAe;AAE7B;AAAA,MACF;AACE,QAAIA,MAAiBC,IACnBC,IAAY,IAEZA,IAAYF,IAAe;AAE7B;AAAA,IACH;AAED,IAAIA,MAAiBE,KACnB,KAAK,aAAa,KAAK,cAAcH,EAAeG,CAAS,CAAC;AAAA,EAEjE;AAAA,EAED,aAAaC,GAAaC,GAAS;AACjC,IAAAD,EAAY,aAAa,YAAY,IAAI,GACzCC,EAAQ,aAAa,YAAY,GAAG,GAEpC,KAAK,eAAeA,GAGhBpC,EAAa,IAAI,KACnBC,EAAyB,KAAK,cAAc,IAAI,GAI7CJ,EAAgBuC,CAAO,KAC1BA,EAAQ,eAAe,EAAE,UAAU,UAAU,OAAO,UAAS,CAAE,GAGjE,KAAK,SAAS;AAAA,MAAQ,CAACrB,MACrBA,EAAK,aAAa,yBAAyBqB,EAAQ,EAAE;AAAA,IAC3D;AAAA,EACG;AACH;AAEA,MAAMC,UAAuB,YAAY;AAAA,EACvC,oBAAoB;AAClB,SAAK,aAAa,QAAQ,QAAQ,GAClC,KAAK,aAAa,YAAY,IAAI,GAClC,KAAK,aAAa,MAAM3C,EAAW,QAAQ,CAAC,GAE5C,KAAK,UAAU,MAAM;AAAA,MACnB,KAAK,cAAc,iBAAiB,yBAAyB;AAAA,IACnE,GACI,KAAK,iBAAiB,SAAS,KAAK,MAAM;AAAA,EAC3C;AAAA,EAED,uBAAuB;AACrB,SAAK,oBAAoB,SAAS,KAAK,MAAM;AAAA,EAC9C;AAAA,EAED,IAAI,QAAQ;AACV,WAAO,KAAK,aAAa,OAAO;AAAA,EACjC;AAAA,EAED,IAAI,QAAQ;AACV,WAAO,KAAK,aAAa,OAAO;AAAA,EACjC;AAAA,EAED,SAAS;AACP,UAAMuB,IAAiB,KAAK,QAAQ;AAAA,MAAK,CAACF,MACxCA,EAAK,aAAa,eAAe;AAAA,IACvC;AAEI,IAAIE,KACFA,EAAe,gBAAgB,eAAe,GAGhD,KAAK,aAAa,iBAAiB,EAAI,GAEvC,KAAK;AAAA,MACH,IAAI,YAAY,0BAA0B;AAAA,QACxC,QAAQ;AAAA,UACN,IAAI,KAAK,aAAa,IAAI;AAAA,UAC1B,OAAO,KAAK;AAAA,UACZ,OAAO,KAAK;AAAA,QACb;AAAA,MACT,CAAO;AAAA,IACP;AAAA,EACG;AACH;AAEK,MAACqB,IAAO5B,GACP6B,IAAU1B,GACV2B,IAAOjB,GACPkB,IAASJ;AAGb,oBAAoB,UACpB,CAAC,OAAO,eAAe,IAAI,kBAAkB,MAE7C,OAAO,eAAe,OAAO,oBAAoBC,CAAI,GACrD,OAAO,eAAe,OAAO,4BAA4BC,CAAO,GAChE,OAAO,eAAe,OAAO,4BAA4BC,CAAI,GAC7D,OAAO,eAAe,OAAO,2BAA2BC,CAAM;"}
|
|
1
|
+
{"version":3,"file":"combobox.js","sources":["../../lib/components/combobox/src/Combobox.js"],"sourcesContent":["function generateId(prefix) {\n const id = [...Array(30)].map(() => Math.random().toString(36)[3]).join('');\n return `${prefix}-${id}`;\n}\n\n// check if element is visible in browser view port\nfunction isElementInView(element) {\n const bounding = element.getBoundingClientRect();\n\n return (\n bounding.top >= 0 &&\n bounding.left >= 0 &&\n bounding.bottom <=\n (window.innerHeight || document.documentElement.clientHeight) &&\n bounding.right <=\n (window.innerWidth || document.documentElement.clientWidth)\n );\n}\n\n// check if an element is currently scrollable\nfunction isScrollable(element) {\n return element && element.clientHeight < element.scrollHeight;\n}\n\n// ensure a given child element is within the parent's visible scroll area\n// if the child is not visible, scroll the parent\nfunction maintainScrollVisibility(activeElement, scrollParent) {\n const { offsetHeight, offsetTop } = activeElement;\n const { offsetHeight: parentOffsetHeight, scrollTop } = scrollParent;\n\n const isAbove = offsetTop < scrollTop;\n const isBelow = offsetTop + offsetHeight > scrollTop + parentOffsetHeight;\n\n if (isAbove) {\n scrollParent.scrollTo(0, offsetTop);\n } else if (isBelow) {\n scrollParent.scrollTo(0, offsetTop - parentOffsetHeight + offsetHeight);\n }\n}\n\nclass ComboboxRoot extends HTMLElement {\n constructor() {\n super();\n\n this.handleRoaming = this.handleRoaming.bind(this);\n }\n\n connectedCallback() {\n this.trigger = this.querySelector('smileid-combobox-trigger');\n\n document.addEventListener('click', this.handleRoaming);\n this.addEventListener('focusout', this.handleRoaming);\n this.addEventListener('blur', this.handleRoaming);\n }\n\n disconnectedCallback() {\n document.removeEventListener('click', this.handleRoaming);\n this.removeEventListener('focusout', this.handleRoaming);\n this.removeEventListener('blur', this.handleRoaming);\n }\n\n handleRoaming(event) {\n const target = event.relatedTarget || event.target;\n if (this.contains(target)) {\n return;\n }\n\n if (this.trigger.getAttribute('expanded') === 'true') {\n this.trigger.setAttribute('expanded', 'false');\n }\n }\n}\n\nclass ComboboxTrigger extends HTMLElement {\n constructor() {\n super();\n\n this.handleKeyUp = this.handleKeyUp.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleSelection = this.handleSelection.bind(this);\n\n this.toggleExpansionState = this.toggleExpansionState.bind(this);\n }\n\n get type() {\n return this.getAttribute('type') || 'text';\n }\n\n get label() {\n return this.getAttribute('label') || '';\n }\n\n get value() {\n return this.getAttribute('value') || '';\n }\n\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n connectedCallback() {\n if (!this.label) {\n throw new Error('<combobox-trigger>: a label attribute is required');\n }\n\n this.innerHTML = `${\n this.type === 'text'\n ? `\n <div>\n <input ${this.value ? `value=\"${this.value}\" ` : ''}${\n this.disabled ? ' disabled ' : ''\n }type=\"text\" placeholder=\"${this.label}\" />\n <button ${this.disabled ? 'disabled ' : ''}tabindex='-1' type='button'>\n <span class=\"visually-hidden\">Toggle</span>\n </button>\n </div>\n `\n : `<button ${this.disabled ? 'disabled ' : ''}type=\"button\">${\n this.value || this.label\n }</button>`\n }`;\n\n this.setAttribute('expanded', false);\n\n this.inputTrigger = this.querySelector('input');\n this.buttonTrigger = this.querySelector('button');\n\n this.buttonTrigger.setAttribute('aria-expanded', false);\n this.buttonTrigger.setAttribute('role', 'combobox');\n\n this.buttonTrigger.addEventListener('keydown', this.handleKeyDown);\n this.buttonTrigger.addEventListener('click', this.toggleExpansionState);\n\n if (this.inputTrigger) {\n this.inputTrigger.setAttribute('aria-expanded', false);\n this.inputTrigger.setAttribute('role', 'combobox');\n\n this.inputTrigger.addEventListener('keydown', this.handleKeyDown);\n this.inputTrigger.addEventListener('keyup', this.handleKeyUp);\n this.inputTrigger.addEventListener('change', (e) => e.stopPropagation());\n }\n\n this.listbox = this.parentElement.querySelector('smileid-combobox-listbox');\n\n this.options = Array.from(\n this.parentElement.querySelectorAll('smileid-combobox-option'),\n );\n this.options.forEach((node) => {\n node.addEventListener('combobox.option.select', this.handleSelection);\n });\n }\n\n disconnectedCallback() {\n this.buttonTrigger.removeEventListener('keydown', this.handleKeyDown);\n this.buttonTrigger.removeEventListener('click', this.toggleExpansionState);\n\n if (this.inputTrigger) {\n this.inputTrigger.removeEventListener('keydown', this.handleKeyDown);\n this.inputTrigger.removeEventListener('keyup', this.handleKeyUp);\n this.inputTrigger.removeEventListener('change', (e) =>\n e.stopPropagation(),\n );\n }\n\n if (this.options) {\n this.options.forEach((node) => {\n node.removeEventListener(\n 'combobox.option.select',\n this.handleSelection,\n );\n });\n }\n }\n\n handleKeyDown(event) {\n if (event.ctrlKey || event.shiftKey) {\n return;\n }\n\n const { key } = event;\n\n switch (key) {\n case 'Enter':\n case 'Space':\n case ' ':\n if (this.getAttribute('expanded') === 'true') {\n if (this.inputTrigger && (key === 'Space' || key === ' ')) {\n this.resetListbox();\n } else {\n event.preventDefault();\n const selectedOption = this.buttonTrigger.getAttribute(\n 'aria-activedescendant',\n );\n if (selectedOption) {\n document.getElementById(selectedOption).click();\n }\n }\n } else {\n event.preventDefault();\n this.toggleExpansionState();\n }\n break;\n case 'Esc':\n case 'Escape':\n event.preventDefault();\n if (this.getAttribute('expanded') === 'true') {\n this.toggleExpansionState();\n }\n break;\n case 'Down':\n case 'ArrowDown':\n event.preventDefault();\n if (this.getAttribute('expanded') !== 'true') {\n this.toggleExpansionState();\n this.focusListbox('First');\n } else {\n this.focusListbox('Down');\n }\n break;\n case 'Up':\n case 'ArrowUp':\n event.preventDefault();\n if (this.getAttribute('expanded') !== 'true') {\n this.toggleExpansionState();\n this.focusListbox('Last');\n } else {\n this.focusListbox('Up');\n }\n break;\n case 'Left':\n case 'ArrowLeft':\n case 'Right':\n case 'ArrowRight':\n case 'Home':\n case 'End':\n this.resetListbox();\n break;\n case 'Tab':\n break;\n default:\n break;\n }\n }\n\n handleKeyUp(event) {\n const { key } = event;\n\n const isPrintableCharacter = (str) => str.length === 1 && str.match(/\\S| /);\n\n if (event.key === 'Escape' || event.key === 'Esc') {\n event.preventDefault();\n if (this.getAttribute('expanded') === 'true') {\n this.toggleExpansionState();\n } else if (this.inputTrigger) {\n this.inputTrigger.value = '';\n\n this.listbox.dispatchEvent(\n new CustomEvent('combobox.listbox.filter', { detail: '' }),\n );\n }\n }\n\n if (isPrintableCharacter(key) || key === 'Backspace') {\n this.resetListbox();\n this.filterListbox(event.target.value);\n }\n }\n\n toggleExpansionState() {\n const listboxIsExpanded = this.getAttribute('expanded') === 'true';\n this.setAttribute('expanded', !listboxIsExpanded);\n this.buttonTrigger.setAttribute('aria-expanded', !listboxIsExpanded);\n if (this.inputTrigger) {\n this.inputTrigger.setAttribute('aria-expanded', !listboxIsExpanded);\n }\n }\n\n handleSelection(event) {\n if (this.inputTrigger) {\n this.inputTrigger.value = event.detail.label;\n } else {\n this.buttonTrigger.textContent = event.detail.label;\n }\n\n this.toggleExpansionState();\n this.parentElement.dispatchEvent(\n new CustomEvent('combobox.change', {\n detail: {\n value: event.detail.value,\n },\n }),\n );\n }\n\n filterListbox(value) {\n if (this.getAttribute('expanded') !== 'true') {\n this.toggleExpansionState();\n }\n\n this.listbox.dispatchEvent(\n new CustomEvent('combobox.listbox.filter', { detail: value }),\n );\n }\n\n focusListbox(direction) {\n this.resetListbox();\n this.listbox.dispatchEvent(\n new CustomEvent('combobox.listbox.focus', {\n detail: {\n direction,\n },\n }),\n );\n }\n\n resetListbox() {\n this.listbox.dispatchEvent(new CustomEvent('combobox.listbox.reset'));\n }\n}\n\nclass ComboboxListbox extends HTMLElement {\n constructor() {\n super();\n\n this.handleFilter = this.handleFilter.bind(this);\n this.handleFocus = this.handleFocus.bind(this);\n this.handleReset = this.handleReset.bind(this);\n\n this.handleOptionSelection = this.handleOptionSelection.bind(this);\n }\n\n get emptyLabel() {\n return this.getAttribute('empty-label');\n }\n\n get emptyState() {\n return `\n <p id='empty-state' style=\"text-align: center;\">\n ${this.emptyLabel || 'No items'}\n </p>\n `;\n }\n\n connectedCallback() {\n this.setAttribute('role', 'listbox');\n this.setAttribute('id', generateId('listbox'));\n\n this.addEventListener('combobox.listbox.filter', this.handleFilter);\n this.addEventListener('combobox.listbox.focus', this.handleFocus);\n this.addEventListener('combobox.listbox.reset', this.handleReset);\n\n this.triggers = Array.from(\n this.parentElement.querySelectorAll(\n 'smileid-combobox-trigger input, smileid-combobox-trigger button',\n ),\n );\n this.triggers.forEach((node) =>\n node.setAttribute('aria-controls', this.getAttribute('id')),\n );\n\n this.optionNodes = Array.from(\n this.querySelectorAll('smileid-combobox-option'),\n );\n this.selectedNode =\n this.optionNodes.find(\n (node) =>\n !node.hasAttribute('hidden') && node.hasAttribute('aria-selected'),\n ) || this.optionNodes.filter((node) => !node.hasAttribute('hidden'))[0];\n this.selectedNode.setAttribute('tabindex', '0');\n\n this.optionNodes.forEach((node) => {\n node.addEventListener(\n 'combobox.option.select',\n this.handleOptionSelection,\n );\n });\n\n if (this.optionNodes.length === 0) {\n this.innerHTML = this.emptyState;\n }\n }\n\n disconnectedCallback() {\n this.removeEventListener('combobox.listbox.filter', this.handleFilter);\n this.removeEventListener('combobox.listbox.focus', this.handleFocus);\n this.removeEventListener('combobox.listbox.reset', this.handleReset);\n this.optionNodes.forEach((node) => {\n node.removeEventListener(\n 'combobox.option.select',\n this.handleOptionSelection,\n );\n });\n }\n\n static get observedAttributes() {\n return ['search-term'];\n }\n\n attributeChangedCallback(name, oldValue, newValue) {\n switch (name) {\n case 'search-term':\n if (oldValue && !newValue) {\n this.optionNodes.forEach((node) => {\n node.removeAttribute('hidden');\n });\n } else if (newValue) {\n this.filterNodes(newValue);\n }\n break;\n default:\n break;\n }\n }\n\n filterNodes(searchTerm) {\n this.optionNodes.forEach((node) => {\n const value = node.getAttribute('value').toLowerCase();\n const label = node.getAttribute('label').toLowerCase();\n\n const containsSearchTerm =\n value.includes(searchTerm.toLowerCase()) ||\n label.includes(searchTerm.toLowerCase());\n\n if (containsSearchTerm) {\n node.removeAttribute('hidden');\n } else {\n node.setAttribute('hidden', true);\n }\n });\n\n const optionsVisible = this.optionNodes.find(\n (node) => !node.hasAttribute('hidden'),\n );\n const emptyState = this.querySelector('#empty-state');\n\n if (!optionsVisible && !emptyState) {\n this.insertAdjacentHTML('afterbegin', this.emptyState);\n } else if (optionsVisible && emptyState) {\n this.removeChild(emptyState);\n }\n }\n\n handleFilter(event) {\n const searchTerm = event.detail;\n this.setAttribute('search-term', searchTerm);\n }\n\n handleFocus(event) {\n this.setSelected(event.detail.direction);\n }\n\n handleReset() {\n this.optionNodes.forEach((node) => node.setAttribute('tabindex', '-1'));\n }\n\n handleOptionSelection(event) {\n const inputTrigger = this.triggers.filter(\n (node) => node.tagName === 'INPUT',\n )[0];\n\n if (inputTrigger) {\n this.setAttribute('search-term', event.detail.label);\n }\n }\n\n setSelected(direction) {\n const visibleOptions = this.optionNodes.filter(\n (node) => !node.hasAttribute('hidden'),\n );\n this.selectedNode.setAttribute('tabindex', '0');\n const currentIndex = visibleOptions.findIndex(\n (node) => node === this.selectedNode,\n );\n const lastIndex = visibleOptions.length - 1;\n\n let nextIndex;\n switch (direction) {\n case 'First':\n nextIndex = 0;\n break;\n case 'Last':\n nextIndex = lastIndex;\n break;\n case 'Up':\n if (currentIndex === 0) {\n nextIndex = lastIndex;\n } else {\n nextIndex = currentIndex - 1;\n }\n break;\n default:\n if (currentIndex === lastIndex) {\n nextIndex = 0;\n } else {\n nextIndex = currentIndex + 1;\n }\n break;\n }\n\n if (currentIndex !== nextIndex) {\n this.swapSelected(this.selectedNode, visibleOptions[nextIndex]);\n }\n }\n\n swapSelected(currentNode, newNode) {\n currentNode.setAttribute('tabindex', '-1');\n newNode.setAttribute('tabindex', '0');\n\n this.selectedNode = newNode;\n\n // ACTION: ensure the new option is in view\n if (isScrollable(this)) {\n maintainScrollVisibility(this.selectedNode, this);\n }\n\n // ACTION: scroll into view if node is not visible\n if (!isElementInView(newNode)) {\n newNode.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n\n this.triggers.forEach((node) =>\n node.setAttribute('aria-activedescendant', newNode.id),\n );\n }\n}\n\nclass ComboboxOption extends HTMLElement {\n connectedCallback() {\n this.setAttribute('role', 'option');\n this.setAttribute('tabindex', '-1');\n this.setAttribute('id', generateId('option'));\n\n this.options = Array.from(\n this.parentElement.querySelectorAll('smileid-combobox-option'),\n );\n this.addEventListener('click', this.select);\n }\n\n disconnectedCallback() {\n this.removeEventListener('click', this.select);\n }\n\n get value() {\n return this.getAttribute('value');\n }\n\n get label() {\n return this.getAttribute('label');\n }\n\n select() {\n const selectedOption = this.options.find((node) =>\n node.getAttribute('aria-selected'),\n );\n\n if (selectedOption) {\n selectedOption.removeAttribute('aria-selected');\n }\n\n this.setAttribute('aria-selected', true);\n\n this.dispatchEvent(\n new CustomEvent('combobox.option.select', {\n detail: {\n id: this.getAttribute('id'),\n label: this.label,\n value: this.value,\n },\n }),\n );\n }\n}\n\nconst Root = ComboboxRoot;\nconst Trigger = ComboboxTrigger;\nconst List = ComboboxListbox;\nconst Option = ComboboxOption;\n\nif (\n 'customElements' in window &&\n !window.customElements.get('smileid-combobox')\n) {\n window.customElements.define('smileid-combobox', Root);\n window.customElements.define('smileid-combobox-trigger', Trigger);\n window.customElements.define('smileid-combobox-listbox', List);\n window.customElements.define('smileid-combobox-option', Option);\n}\n\nexport { Root, Trigger, List, Option };\n"],"names":["generateId","prefix","id","isElementInView","element","bounding","isScrollable","maintainScrollVisibility","activeElement","scrollParent","offsetHeight","offsetTop","parentOffsetHeight","scrollTop","isAbove","isBelow","ComboboxRoot","event","target","ComboboxTrigger","e","node","key","selectedOption","isPrintableCharacter","str","listboxIsExpanded","value","direction","ComboboxListbox","name","oldValue","newValue","searchTerm","label","optionsVisible","emptyState","visibleOptions","currentIndex","lastIndex","nextIndex","currentNode","newNode","ComboboxOption","Root","Trigger","List","Option"],"mappings":"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"}
|
package/dist/esm/document.js
CHANGED
package/dist/esm/main.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { List as o, Option as t, Root as a, Trigger as s } from "./combobox.js";
|
|
2
|
-
import { D as m } from "./DocumentCaptureScreens-
|
|
2
|
+
import { D as m } from "./DocumentCaptureScreens-DmH2JZDA.js";
|
|
3
3
|
import { E as f } from "./EndUserConsent-D4fd1ovG.js";
|
|
4
4
|
import { N as i } from "./Navigation-CTjK6tLU.js";
|
|
5
|
-
import { S as u } from "./SelfieCaptureScreens-
|
|
5
|
+
import { S as u } from "./SelfieCaptureScreens-DbdN2zNk.js";
|
|
6
6
|
import { S as g } from "./SignaturePad-C7MtmT8m.js";
|
|
7
7
|
import { T as d } from "./TotpConsent-CQU5jQi4.js";
|
|
8
8
|
import { default as l } from "./smart-camera-web.js";
|
|
@@ -94,7 +94,7 @@ class a {
|
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
|
-
const o = "
|
|
97
|
+
const o = "11.0.1", i = {
|
|
98
98
|
version: o
|
|
99
99
|
};
|
|
100
100
|
export {
|
|
@@ -102,4 +102,4 @@ export {
|
|
|
102
102
|
a as S,
|
|
103
103
|
i as p
|
|
104
104
|
};
|
|
105
|
-
//# sourceMappingURL=package-
|
|
105
|
+
//# sourceMappingURL=package-bgeQiff6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-bgeQiff6.js","sources":["../../lib/domain/constants/src/Constants.js","../../lib/domain/camera/src/SmartCamera.js"],"sourcesContent":["/**\n * The type of image submitted in the job request\n * @readonly\n * @enum {number}\n */\nexport const IMAGE_TYPE = {\n /** ID_CARD_BACK_IMAGE_BASE64 Base64 encoded back of ID card image (.jpg or .png) */\n ID_CARD_BACK_IMAGE_BASE64: 7,\n /** ID_CARD_BACK_IMAGE_FILE Back of ID card image in .png or .jpg file format */\n ID_CARD_BACK_IMAGE_FILE: 5,\n /** ID_CARD_IMAGE_BASE64 Base64 encoded ID card image (.png or .jpg) */\n ID_CARD_IMAGE_BASE64: 3,\n /** ID_CARD_IMAGE_FILE ID card image in .png or .jpg file format */\n ID_CARD_IMAGE_FILE: 1,\n /** LIVENESS_IMAGE_BASE64 Base64 encoded liveness image (.jpg or .png) */\n LIVENESS_IMAGE_BASE64: 6,\n /** LIVENESS_IMAGE_FILE Liveness image in .png or .jpg file format */\n LIVENESS_IMAGE_FILE: 4,\n /** SELFIE_IMAGE_BASE64 Base64 encoded selfie image (.png or .jpg) */\n SELFIE_IMAGE_BASE64: 2,\n /** SELFIE_IMAGE_FILE Selfie image in .png or .jpg file format */\n SELFIE_IMAGE_FILE: 0,\n};\n\nexport const DEFAULT_NO_OF_LIVENESS_FRAMES = 8;\nexport const PORTRAIT_ID_PREVIEW_WIDTH = 396;\nexport const PORTRAIT_ID_PREVIEW_HEIGHT = 527;\n","class SmartCamera {\n static stream = null;\n\n static async getMedia(constraints) {\n SmartCamera.stream = await navigator.mediaDevices.getUserMedia(constraints);\n return SmartCamera.stream;\n }\n\n static environmentOptions = {\n facingMode: 'environment',\n height: {\n ideal: 1080,\n max: 1440,\n min: 720,\n },\n width: {\n ideal: 1920,\n max: 2560,\n min: 1280,\n },\n // NOTE: Special case for multi-camera Samsung devices (learnt from Acuant)\n // \"We found out that some triple camera Samsung devices (S10, S20, Note 20, etc) capture images blurry at edges.\n // Zooming to 2X, matching the telephoto lens, doesn't solve it completely but mitigates it.\"\n zoom: SmartCamera.isSamsungMultiCameraDevice() ? 2.0 : 1.0,\n };\n\n static stopMedia() {\n if (SmartCamera.stream) {\n SmartCamera.stream.getTracks().forEach((track) => track.stop());\n SmartCamera.stream = null;\n }\n }\n\n static async supportsAgentMode() {\n try {\n const devices = await navigator.mediaDevices.enumerateDevices();\n const videoDevices = devices.filter(\n (device) => device.kind === 'videoinput',\n );\n\n let hasBackCamera = false;\n\n videoDevices.forEach((device) => {\n // Check if the device label or device ID indicates a back camera\n if (\n device.label.toLowerCase().includes('back') ||\n device.label.toLowerCase().includes('rear')\n ) {\n hasBackCamera = true;\n return true;\n }\n return false;\n });\n\n return hasBackCamera;\n } catch (error) {\n console.warn('Error accessing media devices: ', error);\n return false;\n }\n }\n\n static isSamsungMultiCameraDevice() {\n const matchedModelNumber = navigator.userAgent.match(/SM-[N|G]\\d{3}/);\n if (!matchedModelNumber) {\n return false;\n }\n\n const modelNumber = parseInt(matchedModelNumber[0].match(/\\d{3}/)[0], 10);\n const smallerModelNumber = 970; // S10e\n return !Number.isNaN(modelNumber) && modelNumber >= smallerModelNumber;\n }\n\n static handleCameraError(e) {\n switch (e.name) {\n case 'NotAllowedError':\n case 'SecurityError':\n return `\n Looks like camera access was not granted, or was blocked by a browser\n level setting / extension. Please follow the prompt from the URL bar,\n or extensions, and enable access.\n You may need to refresh to start all over again\n `;\n case 'AbortError':\n return `\n Oops! Something happened, and we lost access to your stream.\n Please refresh to start all over again\n `;\n case 'NotReadableError':\n return `\n There seems to be a problem with your device's camera, or its connection.\n Please check this, and when resolved, try again. Or try another device.\n `;\n case 'NotFoundError':\n return `\n We are unable to find a video stream.\n You may need to refresh to start all over again\n `;\n case 'TypeError':\n return `\n This site is insecure, and as such cannot have access to your camera.\n Try to navigate to a secure version of this page, or contact the owner.\n `;\n default:\n return e.message;\n }\n }\n}\n\nexport default SmartCamera;\n"],"names":["IMAGE_TYPE","SmartCamera","constraints","track","videoDevices","device","hasBackCamera","error","matchedModelNumber","modelNumber"],"mappings":"AAKY,MAACA,IAAa;AAAA;AAAA,EAExB,2BAA2B;AAAA;AAAA,EAE3B,yBAAyB;AAAA;AAAA,EAEzB,sBAAsB;AAAA;AAAA,EAEtB,oBAAoB;AAAA;AAAA,EAEpB,uBAAuB;AAAA;AAAA,EAEvB,qBAAqB;AAAA;AAAA,EAErB,qBAAqB;AAAA;AAAA,EAErB,mBAAmB;AACrB;ACtBA,MAAMC,EAAY;AAAA,EAChB,OAAO,SAAS;AAAA,EAEhB,aAAa,SAASC,GAAa;AACjC,WAAAD,EAAY,SAAS,MAAM,UAAU,aAAa,aAAaC,CAAW,GACnED,EAAY;AAAA,EACrB;AAAA,EAEA,OAAO,qBAAqB;AAAA,IAC1B,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,OAAO;AAAA,MACP,KAAK;AAAA,MACL,KAAK;AAAA,IACX;AAAA,IACI,OAAO;AAAA,MACL,OAAO;AAAA,MACP,KAAK;AAAA,MACL,KAAK;AAAA,IACX;AAAA;AAAA;AAAA;AAAA,IAII,MAAMA,EAAY,2BAA0B,IAAK,IAAM;AAAA,EAC3D;AAAA,EAEE,OAAO,YAAY;AACjB,IAAIA,EAAY,WACdA,EAAY,OAAO,YAAY,QAAQ,CAACE,MAAUA,EAAM,MAAM,GAC9DF,EAAY,SAAS;AAAA,EAEzB;AAAA,EAEA,aAAa,oBAAoB;AAC/B,QAAI;AAEF,YAAMG,KADU,MAAM,UAAU,aAAa,iBAAgB,GAChC;AAAA,QAC3B,CAACC,MAAWA,EAAO,SAAS;AAAA,MACpC;AAEM,UAAIC,IAAgB;AAEpB,aAAAF,EAAa,QAAQ,CAACC,MAGlBA,EAAO,MAAM,cAAc,SAAS,MAAM,KAC1CA,EAAO,MAAM,YAAW,EAAG,SAAS,MAAM,KAE1CC,IAAgB,IACT,MAEF,EACR,GAEMA;AAAA,IACT,SAASC,GAAO;AACd,qBAAQ,KAAK,mCAAmCA,CAAK,GAC9C;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAO,6BAA6B;AAClC,UAAMC,IAAqB,UAAU,UAAU,MAAM,eAAe;AACpE,QAAI,CAACA;AACH,aAAO;AAGT,UAAMC,IAAc,SAASD,EAAmB,CAAC,EAAE,MAAM,OAAO,EAAE,CAAC,GAAG,EAAE;AAExE,WAAO,CAAC,OAAO,MAAMC,CAAW,KAAKA,KADV;AAAA,EAE7B;AAAA,EAEA,OAAO,kBAAkB,GAAG;AAC1B,YAAQ,EAAE,MAAI;AAAA,MACZ,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMT,KAAK;AACH,eAAO;AAAA;AAAA;AAAA;AAAA,MAIT,KAAK;AACH,eAAO;AAAA;AAAA;AAAA;AAAA,MAIT,KAAK;AACH,eAAO;AAAA;AAAA;AAAA;AAAA,MAIT,KAAK;AACH,eAAO;AAAA;AAAA;AAAA;AAAA,MAIT;AACE,eAAO,EAAE;AAAA,IACjB;AAAA,EACE;AACF;;;;"}
|
package/dist/esm/selfie.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { s as a } from "./styles-BOEZtbuc.js";
|
|
2
|
-
import { S as i, p as n } from "./package-
|
|
3
|
-
import "./DocumentCaptureScreens-
|
|
4
|
-
import "./SelfieCaptureScreens-
|
|
2
|
+
import { S as i, p as n } from "./package-bgeQiff6.js";
|
|
3
|
+
import "./DocumentCaptureScreens-DmH2JZDA.js";
|
|
4
|
+
import "./SelfieCaptureScreens-DbdN2zNk.js";
|
|
5
5
|
import "./PoweredBySmileId-CxbaihMu.js";
|
|
6
6
|
import "./Navigation-CTjK6tLU.js";
|
|
7
7
|
function o() {
|