@felleslosninger/minid-elements 0.0.110 → 0.0.111
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/checkbox.component.d.ts +0 -14
- package/dist/components/checkbox.component.d.ts.map +1 -1
- package/dist/components/checkbox.js +1 -21
- package/dist/components/checkbox.js.map +1 -1
- package/dist/components/code-input-old.component.d.ts +55 -0
- package/dist/components/code-input-old.component.d.ts.map +1 -0
- package/dist/components/code-input-old.js +313 -0
- package/dist/components/code-input-old.js.map +1 -0
- package/dist/components/code-input.component.d.ts +59 -33
- package/dist/components/code-input.component.d.ts.map +1 -1
- package/dist/components/code-input.js +244 -230
- package/dist/components/code-input.js.map +1 -1
- package/dist/components/dropdown.js +1 -1
- package/dist/components/dropdown.js.map +1 -1
- package/dist/components/menu.component.d.ts.map +1 -1
- package/dist/components/menu.js +1 -3
- package/dist/components/menu.js.map +1 -1
- package/dist/components/textfield.component.d.ts +0 -1
- package/dist/components/textfield.component.d.ts.map +1 -1
- package/dist/components/textfield.js +0 -3
- package/dist/components/textfield.js.map +1 -1
- package/dist/designsystemet-tailwind.css +43 -13
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/mixins/validators.js +2 -2
- package/dist/mixins/validators.js.map +1 -1
- package/package.json +2 -1
- package/dist/components/code-input-2.component.d.ts +0 -15
- package/dist/components/code-input-2.component.d.ts.map +0 -1
- package/dist/components/code-input-2.js +0 -82
- package/dist/components/code-input-2.js.map +0 -1
|
@@ -39,20 +39,6 @@ export declare class MinidCheckbox extends MinidCheckbox_base {
|
|
|
39
39
|
* Removes focus from the checkbox.
|
|
40
40
|
*/
|
|
41
41
|
blur(): void;
|
|
42
|
-
/** Gets the validity state object */
|
|
43
|
-
/**
|
|
44
|
-
* Checks for validity but does not show a validation message. Returns `true` when valid and `false` when invalid.
|
|
45
|
-
*/
|
|
46
|
-
checkValidity(): boolean;
|
|
47
|
-
/**
|
|
48
|
-
* Checks for validity and shows the browser's validation message if the control is invalid.
|
|
49
|
-
*/
|
|
50
|
-
reportValidity(): boolean;
|
|
51
|
-
/**
|
|
52
|
-
* Sets a custom validation message. The value provided will be shown to the user when the form is submitted. To clear
|
|
53
|
-
* the custom validation message, call this method with an empty string.
|
|
54
|
-
*/
|
|
55
|
-
setCustomValidity(message: string): void;
|
|
56
42
|
handleStateChange(): void;
|
|
57
43
|
render(): import('lit-html').TemplateResult<1>;
|
|
58
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkbox.component.d.ts","sourceRoot":"","sources":["../../src/components/checkbox.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,UAAU,EAAE,MAAM,KAAK,CAAC;AAKvC,OAAO,0BAA0B,CAAC;AAMlC,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,cAAc,EAAE,aAAa,CAAC;KAC/B;CACF;;AAED;;GAEG;AAEH,qBACa,aAAc,SAAQ,kBAAoC;IAErE,OAAO,CAAC,KAAK,CAAoB;IAEjC;;OAEG;IAEH,IAAI,SAAM;IAEV;;OAEG;IAEH,KAAK,SAAQ;IAGb,OAAO,UAAS;IAGhB,QAAQ,UAAS;IAGjB,QAAQ,UAAS;IAGjB,OAAO,UAAS;IAGhB,QAAQ,UAAS;IAEjB,MAAM,KAAK,qBAAqB,qDAE/B;IAED,qBAAqB,IAAI,OAAO;IAIhC,IAAI,gBAAgB,qBAEnB;IAED,OAAO,CAAC,WAAW;IAMnB;;OAEG;IACH,KAAK;IAIL;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY;IAI5B;;OAEG;IACH,IAAI;
|
|
1
|
+
{"version":3,"file":"checkbox.component.d.ts","sourceRoot":"","sources":["../../src/components/checkbox.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,UAAU,EAAE,MAAM,KAAK,CAAC;AAKvC,OAAO,0BAA0B,CAAC;AAMlC,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,cAAc,EAAE,aAAa,CAAC;KAC/B;CACF;;AAED;;GAEG;AAEH,qBACa,aAAc,SAAQ,kBAAoC;IAErE,OAAO,CAAC,KAAK,CAAoB;IAEjC;;OAEG;IAEH,IAAI,SAAM;IAEV;;OAEG;IAEH,KAAK,SAAQ;IAGb,OAAO,UAAS;IAGhB,QAAQ,UAAS;IAGjB,QAAQ,UAAS;IAGjB,OAAO,UAAS;IAGhB,QAAQ,UAAS;IAEjB,MAAM,KAAK,qBAAqB,qDAE/B;IAED,qBAAqB,IAAI,OAAO;IAIhC,IAAI,gBAAgB,qBAEnB;IAED,OAAO,CAAC,WAAW;IAMnB;;OAEG;IACH,KAAK;IAIL;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY;IAI5B;;OAEG;IACH,IAAI;IAKJ,iBAAiB;IAKR,MAAM;CA8ChB"}
|
|
@@ -60,26 +60,6 @@ let MinidCheckbox = class extends FormControlMixin(styled(LitElement)) {
|
|
|
60
60
|
blur() {
|
|
61
61
|
this.input.blur();
|
|
62
62
|
}
|
|
63
|
-
/** Gets the validity state object */
|
|
64
|
-
/**
|
|
65
|
-
* Checks for validity but does not show a validation message. Returns `true` when valid and `false` when invalid.
|
|
66
|
-
*/
|
|
67
|
-
checkValidity() {
|
|
68
|
-
return this.input.checkValidity();
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Checks for validity and shows the browser's validation message if the control is invalid.
|
|
72
|
-
*/
|
|
73
|
-
reportValidity() {
|
|
74
|
-
return this.input.reportValidity();
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Sets a custom validation message. The value provided will be shown to the user when the form is submitted. To clear
|
|
78
|
-
* the custom validation message, call this method with an empty string.
|
|
79
|
-
*/
|
|
80
|
-
setCustomValidity(message) {
|
|
81
|
-
this.input.setCustomValidity(message);
|
|
82
|
-
}
|
|
83
63
|
handleStateChange() {
|
|
84
64
|
this.setValue(this.value);
|
|
85
65
|
}
|
|
@@ -110,7 +90,7 @@ let MinidCheckbox = class extends FormControlMixin(styled(LitElement)) {
|
|
|
110
90
|
?disabled=${this.disabled}
|
|
111
91
|
?checked=${this.checked}
|
|
112
92
|
?readonly=${this.readonly}
|
|
113
|
-
|
|
93
|
+
?required=${this.required}
|
|
114
94
|
@click=${this.handleClick}
|
|
115
95
|
/>
|
|
116
96
|
${this.checked ? html`<mid-icon
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkbox.js","sources":["../../src/components/checkbox.component.ts"],"sourcesContent":["import { html, LitElement } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { live } from 'lit/directives/live.js';\nimport { styled } from '../mixins/tailwind.mixin';\nimport './icon/icon.component.ts';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { FormControlMixin } from '../mixins/form-control.mixin.ts';\nimport { watch } from '../internal/watch.ts';\nimport { requiredValidator } from '../mixins/validators.ts';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'mid-checkbox': MinidCheckbox;\n }\n}\n\n/**\n *\n */\n\n@customElement('mid-checkbox')\nexport class MinidCheckbox extends FormControlMixin(styled(LitElement)) {\n @query('input[type=\"checkbox\"]')\n private input!: HTMLInputElement;\n\n /**\n * The name of the checkbox, submitted as a name/value pair with form data.\n */\n @property()\n name = '';\n\n /**\n * The current value of the checkbox, submitted as a name/value pair with form data.\n */\n @property()\n value = 'on';\n\n @property({ type: Boolean })\n checked = false;\n\n @property({ type: Boolean })\n disabled = false;\n\n @property({ type: Boolean })\n readonly = false;\n\n @property({ type: Boolean })\n invalid = false;\n\n @property({ type: Boolean, reflect: true })\n required = false;\n\n static get formControlValidators() {\n return [requiredValidator];\n }\n\n shouldFormValueUpdate(): boolean {\n return this.checked;\n }\n\n get validationTarget() {\n return this.input;\n }\n\n private handleClick() {\n this.checked = !this.checked;\n // this.indeterminate = false;\n this.dispatchEvent(new Event('mid-change'));\n }\n\n /**\n * Simulates a click on the checkbox.\n */\n click() {\n this.input.click();\n }\n\n /**\n * Sets focus on the checkbox.\n */\n focus(options?: FocusOptions) {\n this.input.focus(options);\n }\n\n /**\n * Removes focus from the checkbox.\n */\n blur() {\n this.input.blur();\n }\n\n
|
|
1
|
+
{"version":3,"file":"checkbox.js","sources":["../../src/components/checkbox.component.ts"],"sourcesContent":["import { html, LitElement } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { live } from 'lit/directives/live.js';\nimport { styled } from '../mixins/tailwind.mixin';\nimport './icon/icon.component.ts';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { FormControlMixin } from '../mixins/form-control.mixin.ts';\nimport { watch } from '../internal/watch.ts';\nimport { requiredValidator } from '../mixins/validators.ts';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'mid-checkbox': MinidCheckbox;\n }\n}\n\n/**\n *\n */\n\n@customElement('mid-checkbox')\nexport class MinidCheckbox extends FormControlMixin(styled(LitElement)) {\n @query('input[type=\"checkbox\"]')\n private input!: HTMLInputElement;\n\n /**\n * The name of the checkbox, submitted as a name/value pair with form data.\n */\n @property()\n name = '';\n\n /**\n * The current value of the checkbox, submitted as a name/value pair with form data.\n */\n @property()\n value = 'on';\n\n @property({ type: Boolean })\n checked = false;\n\n @property({ type: Boolean })\n disabled = false;\n\n @property({ type: Boolean })\n readonly = false;\n\n @property({ type: Boolean })\n invalid = false;\n\n @property({ type: Boolean, reflect: true })\n required = false;\n\n static get formControlValidators() {\n return [requiredValidator];\n }\n\n shouldFormValueUpdate(): boolean {\n return this.checked;\n }\n\n get validationTarget() {\n return this.input;\n }\n\n private handleClick() {\n this.checked = !this.checked;\n // this.indeterminate = false;\n this.dispatchEvent(new Event('mid-change'));\n }\n\n /**\n * Simulates a click on the checkbox.\n */\n click() {\n this.input.click();\n }\n\n /**\n * Sets focus on the checkbox.\n */\n focus(options?: FocusOptions) {\n this.input.focus(options);\n }\n\n /**\n * Removes focus from the checkbox.\n */\n blur() {\n this.input.blur();\n }\n\n @watch(['checked', 'value'])\n handleStateChange() {\n // this.input.indeterminate = this.indeterminate; // force a sync update\n this.setValue(this.value);\n }\n\n override render() {\n return html`\n <label\n class=\"${classMap({\n 'opacity-disabled': this.disabled,\n 'cursor-not-allowed': this.disabled,\n })} grid grid-cols-[auto_1fr] gap-2\"\n >\n <span\n class=\"${classMap({\n 'bg-accent-base': !this.readonly && this.checked && !this.invalid,\n 'bg-danger-base': !this.readonly && this.checked && this.invalid,\n 'border-accent-base':\n !this.readonly && this.checked && !this.invalid,\n 'border-neutral': !this.readonly && !this.checked && !this.invalid,\n 'border-danger-base': !this.readonly && this.invalid,\n 'border-neutral-subtle': this.readonly,\n 'bg-neutral-surface-tinted': this.readonly,\n })} focus-within:focus-ring inline-flex size-6 shrink-0 items-center justify-center rounded-sm border-2\"\n >\n <input\n class=\"pointer-events-none appearance-none\"\n type=\"checkbox\"\n value=${ifDefined(this.value)}\n .checked=${live(this.checked)}\n ?disabled=${this.disabled}\n ?checked=${this.checked}\n ?readonly=${this.readonly}\n ?required=${this.required}\n @click=${this.handleClick}\n />\n ${this.checked\n ? html`<mid-icon\n class=\"${classMap({\n 'text-accent-base-contrast': this.checked && !this.readonly,\n })} size-6 shrink-0 scale-125\"\n name=\"checkmark\"\n ></mid-icon>`\n : ''}\n </span>\n <div part=\"label\">\n <slot></slot>\n </div>\n </label>\n `;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { LitElement, PropertyValues } from 'lit';
|
|
2
|
+
import { Ref } from 'lit/directives/ref.js';
|
|
3
|
+
declare global {
|
|
4
|
+
interface HTMLElementTagNameMap {
|
|
5
|
+
'mid-code-input-old': MinidCodeInputOld;
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
declare const MinidCodeInputOld_base: typeof LitElement & import('../types/mixin-constructor').Constructor<import('../mixins/form-controller.mixin').ConstraintsValidationMixinInterface>;
|
|
9
|
+
export declare class MinidCodeInputOld extends MinidCodeInputOld_base {
|
|
10
|
+
private readonly caretColor;
|
|
11
|
+
private readonly caretHighlightColor;
|
|
12
|
+
private readonly inputId;
|
|
13
|
+
inputRef: Ref<HTMLInputElement>;
|
|
14
|
+
value: string;
|
|
15
|
+
label: string;
|
|
16
|
+
/**
|
|
17
|
+
* Visually hides `label` (still available for screen readers)
|
|
18
|
+
*/
|
|
19
|
+
hidelabel: boolean;
|
|
20
|
+
required: boolean;
|
|
21
|
+
disabled: boolean;
|
|
22
|
+
inputmode: string;
|
|
23
|
+
/**
|
|
24
|
+
* Display custom error message, and force invalid state
|
|
25
|
+
*/
|
|
26
|
+
invalidmessage: string;
|
|
27
|
+
/**
|
|
28
|
+
* The length of the code input
|
|
29
|
+
*/
|
|
30
|
+
length: number;
|
|
31
|
+
fontsize: string;
|
|
32
|
+
renderError: boolean;
|
|
33
|
+
localErrorNode: Node | null;
|
|
34
|
+
constructor();
|
|
35
|
+
connectedCallback(): void;
|
|
36
|
+
_whenSettled(): Promise<void>;
|
|
37
|
+
disconnectedCallback(): void;
|
|
38
|
+
private calcInputStyle;
|
|
39
|
+
private autoFillEventHandler;
|
|
40
|
+
get selectionEnd(): number | null | undefined;
|
|
41
|
+
private handleFocusOut;
|
|
42
|
+
private handleFocusIn;
|
|
43
|
+
private handleClick;
|
|
44
|
+
private handleKeydown;
|
|
45
|
+
private handleChange;
|
|
46
|
+
private handleSlotchange;
|
|
47
|
+
private findErrorMessageNode;
|
|
48
|
+
firstUpdated(_changedProperties: PropertyValues): void;
|
|
49
|
+
updated(_changedProperties: PropertyValues): void;
|
|
50
|
+
focus(options?: FocusOptions): void;
|
|
51
|
+
setCustomValidity(error: string): void;
|
|
52
|
+
render(): import('lit-html').TemplateResult<1>;
|
|
53
|
+
}
|
|
54
|
+
export {};
|
|
55
|
+
//# sourceMappingURL=code-input-old.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-input-old.component.d.ts","sourceRoot":"","sources":["../../src/components/code-input-old.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAEjE,OAAO,EAAkB,KAAK,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAMjE,OAAO,uBAAuB,CAAC;AAE/B,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,oBAAoB,EAAE,iBAAiB,CAAC;KACzC;CACF;;AAoDD,qBACa,iBAAkB,SAAQ,sBAEtC;IACC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyC;IACpE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAwC;IAC5E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;IAEvD,QAAQ,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAe;IAGrD,KAAK,SAAM;IAGX,KAAK,SAAM;IAEX;;OAEG;IAEH,SAAS,UAAS;IAGlB,QAAQ,UAAS;IAGjB,QAAQ,UAAS;IAGjB,SAAS,SAAa;IAEtB;;OAEG;IAEH,cAAc,SAAM;IAEpB;;OAEG;IAEH,MAAM,SAAK;IAGX,QAAQ,SAAc;IAGtB,WAAW,UAAS;IAGpB,cAAc,EAAE,IAAI,GAAG,IAAI,CAAQ;;IAa1B,iBAAiB;IAKpB,YAAY;IAST,oBAAoB;IAQ7B,OAAO,CAAC,cAAc;IAkBtB,OAAO,CAAC,oBAAoB;IAK5B,IAAI,YAAY,8BAEf;IAED,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,aAAa,CAMnB;IAEF,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,YAAY,CASlB;IAEF,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,oBAAoB;IAc5B,YAAY,CAAC,kBAAkB,EAAE,cAAc;IAK/C,OAAO,CAAC,kBAAkB,EAAE,cAAc,GAAG,IAAI;IAmBjD,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY;IAM5B,iBAAiB,CAAC,KAAK,EAAE,MAAM;IAItB,MAAM;CA6ChB"}
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import { css, LitElement, html } from "lit";
|
|
2
|
+
import { property, state, customElement } from "lit/decorators.js";
|
|
3
|
+
import { createRef, ref } from "lit/directives/ref.js";
|
|
4
|
+
import { classMap } from "lit/directives/class-map.js";
|
|
5
|
+
import { live } from "lit/directives/live.js";
|
|
6
|
+
import { webOtpApiClose, webOtpApiInit } from "../utilities/web-otp-api.js";
|
|
7
|
+
import { styled } from "../mixins/tailwind.mixin.js";
|
|
8
|
+
import { ConstraintsValidationMixin } from "../mixins/form-controller.mixin.js";
|
|
9
|
+
import "./icon/icon.js";
|
|
10
|
+
var __defProp = Object.defineProperty;
|
|
11
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
12
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
13
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
14
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
15
|
+
if (decorator = decorators[i])
|
|
16
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
17
|
+
if (kind && result) __defProp(target, key, result);
|
|
18
|
+
return result;
|
|
19
|
+
};
|
|
20
|
+
const styles = [
|
|
21
|
+
css`
|
|
22
|
+
:host {
|
|
23
|
+
display: flex;
|
|
24
|
+
flex-direction: column;
|
|
25
|
+
container: otc / inline-size;
|
|
26
|
+
text-align: left;
|
|
27
|
+
--otc-background: white;
|
|
28
|
+
--otc-error-background: white;
|
|
29
|
+
--otc-length: 5;
|
|
30
|
+
--otc-width: 11.45cqw;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
input {
|
|
34
|
+
all: unset;
|
|
35
|
+
background: var(--otc-background);
|
|
36
|
+
caret-color: transparent;
|
|
37
|
+
clip-path: inset(0% 1ch 0% 0%);
|
|
38
|
+
font-family: ui-monospace, monospace;
|
|
39
|
+
font-size: var(--otc-width);
|
|
40
|
+
inline-size: calc(var(--otc-length) * 3ch);
|
|
41
|
+
letter-spacing: 2ch;
|
|
42
|
+
padding-block: 0.25ch;
|
|
43
|
+
padding-inline-start: calc(0.5ch * 1.5);
|
|
44
|
+
flex-grow: 1;
|
|
45
|
+
|
|
46
|
+
&:focus-visible:focus {
|
|
47
|
+
outline-style: none;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
&:-webkit-autofill {
|
|
51
|
+
animation-name: onAutoFillStart;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
@keyframes onAutoFillStart {
|
|
56
|
+
from {
|
|
57
|
+
}
|
|
58
|
+
to {
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
input.error {
|
|
63
|
+
background: var(--otc-error-background);
|
|
64
|
+
}
|
|
65
|
+
`
|
|
66
|
+
];
|
|
67
|
+
let nextUniqueId = 0;
|
|
68
|
+
let MinidCodeInputOld = class extends ConstraintsValidationMixin(
|
|
69
|
+
styled(LitElement, styles)
|
|
70
|
+
) {
|
|
71
|
+
constructor() {
|
|
72
|
+
super();
|
|
73
|
+
this.caretColor = "var(--color-neutral-surface-tinted)";
|
|
74
|
+
this.caretHighlightColor = "var(--color-accent-surface-active)";
|
|
75
|
+
this.inputId = `mid-code-input-${nextUniqueId++}`;
|
|
76
|
+
this.inputRef = createRef();
|
|
77
|
+
this.value = "";
|
|
78
|
+
this.label = "";
|
|
79
|
+
this.hidelabel = false;
|
|
80
|
+
this.required = false;
|
|
81
|
+
this.disabled = false;
|
|
82
|
+
this.inputmode = "numeric";
|
|
83
|
+
this.invalidmessage = "";
|
|
84
|
+
this.length = 5;
|
|
85
|
+
this.fontsize = "11.45cqw";
|
|
86
|
+
this.renderError = false;
|
|
87
|
+
this.localErrorNode = null;
|
|
88
|
+
this.handleFocusIn = () => {
|
|
89
|
+
const currentChar = this.value.length + 1;
|
|
90
|
+
this.inputRef.value?.style.setProperty(
|
|
91
|
+
`--char-${currentChar}-color`,
|
|
92
|
+
this.caretHighlightColor
|
|
93
|
+
);
|
|
94
|
+
};
|
|
95
|
+
this.handleChange = (e) => {
|
|
96
|
+
this.value = e.target.value;
|
|
97
|
+
this.dispatchEvent(
|
|
98
|
+
new Event("input", {
|
|
99
|
+
bubbles: true,
|
|
100
|
+
cancelable: true,
|
|
101
|
+
composed: true
|
|
102
|
+
})
|
|
103
|
+
);
|
|
104
|
+
};
|
|
105
|
+
this.addEventListener("invalid", (e) => {
|
|
106
|
+
this.renderError = true;
|
|
107
|
+
if (this.localErrorNode) {
|
|
108
|
+
e.preventDefault();
|
|
109
|
+
this.localErrorNode.textContent = this.validationMessage || "Error";
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
connectedCallback() {
|
|
114
|
+
super.connectedCallback();
|
|
115
|
+
this._whenSettled();
|
|
116
|
+
}
|
|
117
|
+
async _whenSettled() {
|
|
118
|
+
await this.updateComplete;
|
|
119
|
+
this.inputRef.value?.addEventListener(
|
|
120
|
+
"animationstart",
|
|
121
|
+
this.autoFillEventHandler.bind(this)
|
|
122
|
+
);
|
|
123
|
+
this.calcInputStyle();
|
|
124
|
+
}
|
|
125
|
+
disconnectedCallback() {
|
|
126
|
+
webOtpApiClose();
|
|
127
|
+
this.inputRef.value?.removeEventListener(
|
|
128
|
+
"animationstart",
|
|
129
|
+
this.autoFillEventHandler.bind(this)
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
calcInputStyle() {
|
|
133
|
+
const inputStyle = this.inputRef.value?.style;
|
|
134
|
+
inputStyle?.setProperty("--otc-length", this.length.toString());
|
|
135
|
+
let gradientStyle = "linear-gradient(90deg, ";
|
|
136
|
+
for (let i = 0; i < this.length; i++) {
|
|
137
|
+
gradientStyle += `var(--char-${i + 1}-color) ${i ? i * 3 + "ch" : "0"} ${i * 3 + 2.5}ch, transparent ${i * 3 + 2.5}ch ${i * 3 + 3}ch${i + 1 < this.length ? ", " : ""}`;
|
|
138
|
+
}
|
|
139
|
+
gradientStyle += `) no-repeat 0 0 / ${this.length * 3}ch 100%`;
|
|
140
|
+
inputStyle?.setProperty("--otc-background", gradientStyle);
|
|
141
|
+
const gradientErrorStyle = `linear-gradient(90deg, var(--color-danger-surface-active) calc(${this.length}ch / 2), transparent 0) 0 0 / 3ch 100%`;
|
|
142
|
+
inputStyle?.setProperty("--otc-error-background", gradientErrorStyle);
|
|
143
|
+
inputStyle?.setProperty("--otc-width", this.fontsize);
|
|
144
|
+
}
|
|
145
|
+
autoFillEventHandler(e) {
|
|
146
|
+
e.animationName === "onAutoFillStart" && (this.value = this.inputRef.value.value);
|
|
147
|
+
}
|
|
148
|
+
get selectionEnd() {
|
|
149
|
+
return this.inputRef.value?.selectionEnd;
|
|
150
|
+
}
|
|
151
|
+
handleFocusOut() {
|
|
152
|
+
for (let i = 0; i < this.length; i++) {
|
|
153
|
+
this.inputRef.value?.style.setProperty(
|
|
154
|
+
`--char-${i + 1}-color`,
|
|
155
|
+
this.caretColor
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
handleClick() {
|
|
160
|
+
this.value = this.value.substring(0, this.selectionEnd || 0);
|
|
161
|
+
this.renderError = false;
|
|
162
|
+
this.setCustomValidity("");
|
|
163
|
+
if (this.localErrorNode) {
|
|
164
|
+
this.localErrorNode.textContent = "";
|
|
165
|
+
}
|
|
166
|
+
this.setFormValue(this.value);
|
|
167
|
+
this.setValidity({});
|
|
168
|
+
}
|
|
169
|
+
handleKeydown(event) {
|
|
170
|
+
const hasModifier = event.metaKey || event.ctrlKey || event.shiftKey || event.altKey;
|
|
171
|
+
if (event.key === "Enter" && !hasModifier) {
|
|
172
|
+
setTimeout(() => {
|
|
173
|
+
if (!event.defaultPrevented && !event.isComposing) {
|
|
174
|
+
this.internals.form?.requestSubmit();
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
handleSlotchange(e) {
|
|
180
|
+
const slot = e.target;
|
|
181
|
+
const childNodes = slot.assignedNodes({ flatten: true });
|
|
182
|
+
this.localErrorNode = this.findErrorMessageNode(childNodes);
|
|
183
|
+
if (this.localErrorNode && this.invalidmessage) {
|
|
184
|
+
this.renderError = true;
|
|
185
|
+
this.localErrorNode.textContent = this.invalidmessage;
|
|
186
|
+
this.setValidity({});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
findErrorMessageNode(nodes) {
|
|
190
|
+
for (const node of nodes) {
|
|
191
|
+
if (node instanceof Element && node.classList.contains("error-message")) {
|
|
192
|
+
return node;
|
|
193
|
+
}
|
|
194
|
+
const childNodesArray = Array.from(node.childNodes);
|
|
195
|
+
const foundNode = this.findErrorMessageNode(childNodesArray);
|
|
196
|
+
if (foundNode) {
|
|
197
|
+
return foundNode;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
firstUpdated(_changedProperties) {
|
|
203
|
+
this.focus();
|
|
204
|
+
webOtpApiInit(this.renderRoot);
|
|
205
|
+
}
|
|
206
|
+
updated(_changedProperties) {
|
|
207
|
+
for (let i = 0; i < this.length; i++) {
|
|
208
|
+
const color = i === this.value.length ? this.caretHighlightColor : this.caretColor;
|
|
209
|
+
this.inputRef.value?.style.setProperty(`--char-${i + 1}-color`, color);
|
|
210
|
+
}
|
|
211
|
+
if (_changedProperties.has("_forcedErrorMessage")) {
|
|
212
|
+
this.setCustomValidity(this.invalidmessage);
|
|
213
|
+
}
|
|
214
|
+
this.setFormValue(this.value);
|
|
215
|
+
this.setValidity(
|
|
216
|
+
this.inputRef.value.validity,
|
|
217
|
+
this.inputRef.value.validationMessage,
|
|
218
|
+
this.inputRef.value
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
focus(options) {
|
|
222
|
+
const notMobile = !window.matchMedia("only screen and (max-width: 768px)").matches;
|
|
223
|
+
notMobile && this.inputRef.value?.focus(options);
|
|
224
|
+
}
|
|
225
|
+
setCustomValidity(error) {
|
|
226
|
+
this.inputRef.value?.setCustomValidity(error);
|
|
227
|
+
}
|
|
228
|
+
render() {
|
|
229
|
+
return html`
|
|
230
|
+
<label
|
|
231
|
+
class="${classMap({
|
|
232
|
+
"sr-only": this.hidelabel,
|
|
233
|
+
"mb-2": !!this.label
|
|
234
|
+
})} font-medium"
|
|
235
|
+
for="${this.inputId}"
|
|
236
|
+
>${this.label}
|
|
237
|
+
</label>
|
|
238
|
+
<input
|
|
239
|
+
${ref(this.inputRef)}
|
|
240
|
+
id=${this.inputId}
|
|
241
|
+
.value="${live(this.value)}"
|
|
242
|
+
class="${classMap({
|
|
243
|
+
error: this.invalidmessage
|
|
244
|
+
})}"
|
|
245
|
+
autocomplete="${"one-time-code"}"
|
|
246
|
+
inputmode="${this.inputmode}"
|
|
247
|
+
@input="${this.handleChange}"
|
|
248
|
+
@change="${this.handleChange}"
|
|
249
|
+
@focusout="${this.handleFocusOut}"
|
|
250
|
+
@focusin="${this.handleFocusIn}"
|
|
251
|
+
@keydown="${this.handleKeydown}"
|
|
252
|
+
@click="${this.handleClick}"
|
|
253
|
+
minlength="${this.length}"
|
|
254
|
+
maxlength="${this.length}"
|
|
255
|
+
?disabled="${this.disabled}"
|
|
256
|
+
?required="${this.required}"
|
|
257
|
+
/>
|
|
258
|
+
<slot name="error-message" @slotchange=${this.handleSlotchange}>
|
|
259
|
+
<div
|
|
260
|
+
class="text-danger-subtle mt-2 flex gap-1"
|
|
261
|
+
aria-live="polite"
|
|
262
|
+
?hidden=${!this.invalidmessage}
|
|
263
|
+
>
|
|
264
|
+
<mid-icon
|
|
265
|
+
name="xmark-octagon-fill"
|
|
266
|
+
class="mt-1 min-h-5 min-w-5"
|
|
267
|
+
></mid-icon>
|
|
268
|
+
${this.invalidmessage}
|
|
269
|
+
</div>
|
|
270
|
+
</slot>
|
|
271
|
+
`;
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
__decorateClass([
|
|
275
|
+
property({ type: String, reflect: true })
|
|
276
|
+
], MinidCodeInputOld.prototype, "value", 2);
|
|
277
|
+
__decorateClass([
|
|
278
|
+
property()
|
|
279
|
+
], MinidCodeInputOld.prototype, "label", 2);
|
|
280
|
+
__decorateClass([
|
|
281
|
+
property({ type: Boolean })
|
|
282
|
+
], MinidCodeInputOld.prototype, "hidelabel", 2);
|
|
283
|
+
__decorateClass([
|
|
284
|
+
property({ type: Boolean })
|
|
285
|
+
], MinidCodeInputOld.prototype, "required", 2);
|
|
286
|
+
__decorateClass([
|
|
287
|
+
property({ type: Boolean })
|
|
288
|
+
], MinidCodeInputOld.prototype, "disabled", 2);
|
|
289
|
+
__decorateClass([
|
|
290
|
+
property({ type: String })
|
|
291
|
+
], MinidCodeInputOld.prototype, "inputmode", 2);
|
|
292
|
+
__decorateClass([
|
|
293
|
+
property()
|
|
294
|
+
], MinidCodeInputOld.prototype, "invalidmessage", 2);
|
|
295
|
+
__decorateClass([
|
|
296
|
+
property({ type: Number })
|
|
297
|
+
], MinidCodeInputOld.prototype, "length", 2);
|
|
298
|
+
__decorateClass([
|
|
299
|
+
property()
|
|
300
|
+
], MinidCodeInputOld.prototype, "fontsize", 2);
|
|
301
|
+
__decorateClass([
|
|
302
|
+
state()
|
|
303
|
+
], MinidCodeInputOld.prototype, "renderError", 2);
|
|
304
|
+
__decorateClass([
|
|
305
|
+
state()
|
|
306
|
+
], MinidCodeInputOld.prototype, "localErrorNode", 2);
|
|
307
|
+
MinidCodeInputOld = __decorateClass([
|
|
308
|
+
customElement("mid-code-input-old")
|
|
309
|
+
], MinidCodeInputOld);
|
|
310
|
+
export {
|
|
311
|
+
MinidCodeInputOld
|
|
312
|
+
};
|
|
313
|
+
//# sourceMappingURL=code-input-old.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-input-old.js","sources":["../../src/components/code-input-old.component.ts"],"sourcesContent":["import { css, html, LitElement, type PropertyValues } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { createRef, ref, type Ref } from 'lit/directives/ref.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { live } from 'lit/directives/live.js';\nimport { webOtpApiClose, webOtpApiInit } from '../utilities/web-otp-api';\nimport { styled } from '../mixins/tailwind.mixin';\nimport { ConstraintsValidationMixin } from '../mixins/form-controller.mixin';\nimport './icon/icon.component';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'mid-code-input-old': MinidCodeInputOld;\n }\n}\n\nconst styles = [\n css`\n :host {\n display: flex;\n flex-direction: column;\n container: otc / inline-size;\n text-align: left;\n --otc-background: white;\n --otc-error-background: white;\n --otc-length: 5;\n --otc-width: 11.45cqw;\n }\n\n input {\n all: unset;\n background: var(--otc-background);\n caret-color: transparent;\n clip-path: inset(0% 1ch 0% 0%);\n font-family: ui-monospace, monospace;\n font-size: var(--otc-width);\n inline-size: calc(var(--otc-length) * 3ch);\n letter-spacing: 2ch;\n padding-block: 0.25ch;\n padding-inline-start: calc(0.5ch * 1.5);\n flex-grow: 1;\n\n &:focus-visible:focus {\n outline-style: none;\n }\n\n &:-webkit-autofill {\n animation-name: onAutoFillStart;\n }\n }\n\n @keyframes onAutoFillStart {\n from {\n }\n to {\n }\n }\n\n input.error {\n background: var(--otc-error-background);\n }\n `,\n];\n\nlet nextUniqueId = 0;\n\n@customElement('mid-code-input-old')\nexport class MinidCodeInputOld extends ConstraintsValidationMixin(\n styled(LitElement, styles)\n) {\n private readonly caretColor = 'var(--color-neutral-surface-tinted)';\n private readonly caretHighlightColor = 'var(--color-accent-surface-active)';\n private readonly inputId = `mid-code-input-${nextUniqueId++}`;\n\n public inputRef: Ref<HTMLInputElement> = createRef();\n\n @property({ type: String, reflect: true })\n value = '';\n\n @property()\n label = '';\n\n /**\n * Visually hides `label` (still available for screen readers)\n */\n @property({ type: Boolean })\n hidelabel = false;\n\n @property({ type: Boolean })\n required = false;\n\n @property({ type: Boolean })\n disabled = false;\n\n @property({ type: String })\n inputmode = 'numeric';\n\n /**\n * Display custom error message, and force invalid state\n */\n @property()\n invalidmessage = '';\n\n /**\n * The length of the code input\n */\n @property({ type: Number })\n length = 5;\n\n @property()\n fontsize = '11.45cqw';\n\n @state()\n renderError = false;\n\n @state()\n localErrorNode: Node | null = null;\n\n constructor() {\n super();\n this.addEventListener('invalid', (e) => {\n this.renderError = true;\n if (this.localErrorNode) {\n e.preventDefault();\n this.localErrorNode.textContent = this.validationMessage || 'Error';\n }\n });\n }\n\n override connectedCallback() {\n super.connectedCallback();\n this._whenSettled();\n }\n\n async _whenSettled() {\n await this.updateComplete;\n this.inputRef.value?.addEventListener(\n 'animationstart',\n this.autoFillEventHandler.bind(this)\n );\n this.calcInputStyle();\n }\n\n override disconnectedCallback() {\n webOtpApiClose();\n this.inputRef.value?.removeEventListener(\n 'animationstart',\n this.autoFillEventHandler.bind(this)\n );\n }\n\n private calcInputStyle() {\n const inputStyle = this.inputRef.value?.style;\n\n inputStyle?.setProperty('--otc-length', this.length.toString());\n\n let gradientStyle = 'linear-gradient(90deg, ';\n for (let i = 0; i < this.length; i++) {\n gradientStyle += `var(--char-${i + 1}-color) ${i ? i * 3 + 'ch' : '0'} ${i * 3 + 2.5}ch, transparent ${i * 3 + 2.5}ch ${i * 3 + 3}ch${i + 1 < this.length ? ', ' : ''}`;\n }\n gradientStyle += `) no-repeat 0 0 / ${this.length * 3}ch 100%`;\n inputStyle?.setProperty('--otc-background', gradientStyle);\n\n const gradientErrorStyle = `linear-gradient(90deg, var(--color-danger-surface-active) calc(${this.length}ch / 2), transparent 0) 0 0 / 3ch 100%`;\n inputStyle?.setProperty('--otc-error-background', gradientErrorStyle);\n\n inputStyle?.setProperty('--otc-width', this.fontsize);\n }\n\n private autoFillEventHandler(e: AnimationEvent) {\n e.animationName === 'onAutoFillStart' &&\n (this.value = (this.inputRef.value as HTMLInputElement).value);\n }\n\n get selectionEnd() {\n return this.inputRef.value?.selectionEnd;\n }\n\n private handleFocusOut() {\n for (let i = 0; i < this.length; i++) {\n this.inputRef.value?.style.setProperty(\n `--char-${i + 1}-color`,\n this.caretColor\n );\n }\n }\n\n private handleFocusIn = () => {\n const currentChar = this.value.length + 1;\n this.inputRef.value?.style.setProperty(\n `--char-${currentChar}-color`,\n this.caretHighlightColor\n );\n };\n\n private handleClick() {\n this.value = this.value.substring(0, this.selectionEnd || 0);\n\n this.renderError = false;\n this.setCustomValidity('');\n if (this.localErrorNode) {\n this.localErrorNode.textContent = '';\n }\n\n this.setFormValue(this.value);\n this.setValidity({} as ValidityState);\n }\n\n private handleKeydown(event: KeyboardEvent) {\n const hasModifier =\n event.metaKey || event.ctrlKey || event.shiftKey || event.altKey;\n\n // Pressing enter when focused on an input should submit the form like a native input, but we wait a tick before\n // submitting to allow users to cancel the keydown event if they need to\n if (event.key === 'Enter' && !hasModifier) {\n setTimeout(() => {\n //\n // When using an Input Method Editor (IME), pressing enter will cause the form to submit unexpectedly. One way\n // to check for this is to look at event.isComposing, which will be true when the IME is open.\n if (!event.defaultPrevented && !event.isComposing) {\n this.internals.form?.requestSubmit();\n }\n });\n }\n }\n\n private handleChange = (e: Event) => {\n this.value = (e.target as HTMLInputElement).value;\n this.dispatchEvent(\n new Event('input', {\n bubbles: true,\n cancelable: true,\n composed: true,\n })\n );\n };\n\n private handleSlotchange(e: Event) {\n const slot = e.target as HTMLSlotElement;\n const childNodes = slot.assignedNodes({ flatten: true });\n\n this.localErrorNode = this.findErrorMessageNode(childNodes);\n if (this.localErrorNode && this.invalidmessage) {\n // display if slot set, and error override in effect\n this.renderError = true;\n this.localErrorNode.textContent = this.invalidmessage;\n this.setValidity({} as ValidityState); // cancel built-in visual feedback\n }\n }\n\n private findErrorMessageNode(nodes: Node[]): Node | null {\n for (const node of nodes) {\n if (node instanceof Element && node.classList.contains('error-message')) {\n return node;\n }\n const childNodesArray = Array.from(node.childNodes);\n const foundNode = this.findErrorMessageNode(childNodesArray);\n if (foundNode) {\n return foundNode;\n }\n }\n return null;\n }\n\n firstUpdated(_changedProperties: PropertyValues) {\n this.focus();\n webOtpApiInit(this.renderRoot);\n }\n\n updated(_changedProperties: PropertyValues): void {\n for (let i = 0; i < this.length; i++) {\n const color =\n i === this.value.length ? this.caretHighlightColor : this.caretColor;\n this.inputRef.value?.style.setProperty(`--char-${i + 1}-color`, color);\n }\n\n if (_changedProperties.has('_forcedErrorMessage')) {\n this.setCustomValidity(this.invalidmessage);\n }\n\n this.setFormValue(this.value);\n this.setValidity(\n this.inputRef.value!.validity,\n this.inputRef.value!.validationMessage,\n this.inputRef!.value\n );\n }\n\n focus(options?: FocusOptions) {\n const notMobile = !window.matchMedia('only screen and (max-width: 768px)')\n .matches;\n notMobile && this.inputRef.value?.focus(options);\n }\n\n setCustomValidity(error: string) {\n this.inputRef!.value?.setCustomValidity(error);\n }\n\n override render() {\n return html`\n <label\n class=\"${classMap({\n 'sr-only': this.hidelabel,\n 'mb-2': !!this.label,\n })} font-medium\"\n for=\"${this.inputId}\"\n >${this.label}\n </label>\n <input\n ${ref(this.inputRef)}\n id=${this.inputId}\n .value=\"${live(this.value)}\"\n class=\"${classMap({\n error: this.invalidmessage,\n })}\"\n autocomplete=\"${'one-time-code' as any}\"\n inputmode=\"${this.inputmode}\"\n @input=\"${this.handleChange}\"\n @change=\"${this.handleChange}\"\n @focusout=\"${this.handleFocusOut}\"\n @focusin=\"${this.handleFocusIn}\"\n @keydown=\"${this.handleKeydown}\"\n @click=\"${this.handleClick}\"\n minlength=\"${this.length}\"\n maxlength=\"${this.length}\"\n ?disabled=\"${this.disabled}\"\n ?required=\"${this.required}\"\n />\n <slot name=\"error-message\" @slotchange=${this.handleSlotchange}>\n <div\n class=\"text-danger-subtle mt-2 flex gap-1\"\n aria-live=\"polite\"\n ?hidden=${!this.invalidmessage}\n >\n <mid-icon\n name=\"xmark-octagon-fill\"\n class=\"mt-1 min-h-5 min-w-5\"\n ></mid-icon>\n ${this.invalidmessage}\n </div>\n </slot>\n `;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,54 +1,80 @@
|
|
|
1
1
|
import { LitElement, PropertyValues } from 'lit';
|
|
2
|
-
import { Ref } from 'lit/directives/ref.js';
|
|
3
2
|
declare global {
|
|
4
3
|
interface HTMLElementTagNameMap {
|
|
5
4
|
'mid-code-input': MinidCodeInput;
|
|
6
5
|
}
|
|
7
6
|
}
|
|
8
|
-
declare const MinidCodeInput_base:
|
|
7
|
+
declare const MinidCodeInput_base: import('../types/mixin-constructor.ts').Constructor<import('../types/form-control.ts').FormControlInterface> & typeof LitElement;
|
|
8
|
+
/**
|
|
9
|
+
*
|
|
10
|
+
* @event mid-change - Emitted when a change to the input value is comitted by the user
|
|
11
|
+
* @event mid-input - Emitted when the input element recieves input
|
|
12
|
+
* @event {detail: { validity: ValidityState }} mid-invalid-hide - Emitted when the error message should be hidden
|
|
13
|
+
* @event {detail: { validity: ValidityState }} mid-invalid-show - Emitted when the error message should be shown
|
|
14
|
+
*
|
|
15
|
+
* @slot label - The input's label if you need to use HTML. Alternatively, you can use the `label` attribute.
|
|
16
|
+
*
|
|
17
|
+
* @csspart input-container - The wrapper around the input elements. This can be used to adjust font-size.
|
|
18
|
+
*
|
|
19
|
+
*/
|
|
9
20
|
export declare class MinidCodeInput extends MinidCodeInput_base {
|
|
10
|
-
private
|
|
11
|
-
private readonly
|
|
12
|
-
private readonly
|
|
13
|
-
|
|
21
|
+
#private;
|
|
22
|
+
private readonly hasSlotControler;
|
|
23
|
+
private readonly labelId;
|
|
24
|
+
private inputElements;
|
|
14
25
|
value: string;
|
|
15
26
|
label: string;
|
|
27
|
+
type: 'number' | 'text';
|
|
16
28
|
/**
|
|
17
|
-
*
|
|
29
|
+
* For displaying appropriate virtual keyboard
|
|
18
30
|
*/
|
|
19
|
-
|
|
20
|
-
|
|
31
|
+
inputmode: 'numeric' | 'text';
|
|
32
|
+
/**
|
|
33
|
+
* Adjusts the font-size of the code inputs
|
|
34
|
+
*/
|
|
35
|
+
size: 'sm' | 'md' | 'lg';
|
|
36
|
+
/**
|
|
37
|
+
* Number of input characters or digits
|
|
38
|
+
*/
|
|
39
|
+
length: number;
|
|
21
40
|
disabled: boolean;
|
|
22
|
-
inputmode: string;
|
|
23
41
|
/**
|
|
24
|
-
*
|
|
42
|
+
* Focuses the first input element on page load
|
|
43
|
+
*/
|
|
44
|
+
autofocus: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* The minimum length of input that will be considered valid.
|
|
47
|
+
*/
|
|
48
|
+
minlength?: number;
|
|
49
|
+
/**
|
|
50
|
+
* Error message to display when the input is invalid, also activates invalid styling
|
|
25
51
|
*/
|
|
26
52
|
invalidmessage: string;
|
|
27
53
|
/**
|
|
28
|
-
*
|
|
54
|
+
* Visually hides `label` (still available for screen readers)
|
|
29
55
|
*/
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
private
|
|
40
|
-
get
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
private
|
|
56
|
+
hidelabel: boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Makes the input required
|
|
59
|
+
*/
|
|
60
|
+
required: boolean;
|
|
61
|
+
/**
|
|
62
|
+
* A regular expression pattern to validate input against.
|
|
63
|
+
*/
|
|
64
|
+
pattern?: string;
|
|
65
|
+
private internalValues;
|
|
66
|
+
static get formControlValidators(): import('../types/validator.type.ts').Validator[];
|
|
67
|
+
get validationTarget(): HTMLInputElement | null;
|
|
68
|
+
protected firstUpdated(_changedProperties: PropertyValues): void;
|
|
69
|
+
private handleFocus;
|
|
70
|
+
private handleBlur;
|
|
44
71
|
private handleKeydown;
|
|
45
|
-
private
|
|
46
|
-
private
|
|
47
|
-
private
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
setCustomValidity(error: string): void;
|
|
72
|
+
private handleInput;
|
|
73
|
+
private handlePaste;
|
|
74
|
+
private updateValueAndEmit;
|
|
75
|
+
private valueVisualUpdate;
|
|
76
|
+
handleLengthChange(): void;
|
|
77
|
+
handleValueChange(): void;
|
|
52
78
|
render(): import('lit-html').TemplateResult<1>;
|
|
53
79
|
}
|
|
54
80
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-input.component.d.ts","sourceRoot":"","sources":["../../src/components/code-input.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"code-input.component.d.ts","sourceRoot":"","sources":["../../src/components/code-input.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAE,cAAc,EAAE,MAAM,KAAK,CAAC;AAQ5D,OAAO,0BAA0B,CAAC;AASlC,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,gBAAgB,EAAE,cAAc,CAAC;KAClC;CACF;;AAqBD;;;;;;;;;;;GAWG;AACH,qBACa,cAAe,SAAQ,mBAEnC;;IACC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAwC;IAEzE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4C;IAGpE,OAAO,CAAC,aAAa,CAAgC;IAGrD,KAAK,SAAM;IAGX,KAAK,SAAM;IAGX,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAU;IAEjC;;OAEG;IAEH,SAAS,EAAE,SAAS,GAAG,MAAM,CAAU;IAEvC;;OAEG;IAEH,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAQ;IAEhC;;OAEG;IAEH,MAAM,SAAK;IAGX,QAAQ,UAAS;IAEjB;;OAEG;IAEH,SAAS,UAAS;IAElB;;OAEG;IAEH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IAEH,cAAc,SAAM;IAEpB;;OAEG;IAEH,SAAS,UAAS;IAElB;;OAEG;IAEH,QAAQ,UAAS;IAEjB;;OAEG;IAEH,OAAO,CAAC,EAAE,MAAM,CAAC;IAGjB,OAAO,CAAC,cAAc,CAAuC;IAE7D,MAAM,KAAK,qBAAqB,qDAO/B;IAED,IAAI,gBAAgB,4BAEnB;IAED,SAAS,CAAC,YAAY,CAAC,kBAAkB,EAAE,cAAc,GAAG,IAAI;IAIhE,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,aAAa;IAgDrB,OAAO,CAAC,WAAW;IAyBnB,OAAO,CAAC,WAAW;IA4BnB,OAAO,CAAC,kBAAkB;IAuB1B,OAAO,CAAC,iBAAiB;IAQzB,kBAAkB;IAMlB,iBAAiB;IAWR,MAAM;CAiEhB"}
|