@felleslosninger/minid-elements 0.0.99 → 0.0.101
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/alert.component.d.ts +2 -6
- package/dist/components/alert.component.d.ts.map +1 -1
- package/dist/components/alert.js +18 -58
- package/dist/components/alert.js.map +1 -1
- package/dist/components/button.component.d.ts +0 -1
- package/dist/components/button.component.d.ts.map +1 -1
- package/dist/components/button.js +4 -3
- package/dist/components/button.js.map +1 -1
- package/dist/components/checkbox.component.d.ts +46 -6
- package/dist/components/checkbox.component.d.ts.map +1 -1
- package/dist/components/checkbox.js +115 -87
- package/dist/components/checkbox.js.map +1 -1
- package/dist/components/code-input.component.d.ts +16 -15
- package/dist/components/code-input.component.d.ts.map +1 -1
- package/dist/components/code-input.js +105 -105
- package/dist/components/code-input.js.map +1 -1
- package/dist/components/combobox.component.d.ts +7 -10
- package/dist/components/combobox.component.d.ts.map +1 -1
- package/dist/components/combobox.js +1 -1
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/dialog.js +2 -2
- package/dist/components/dialog.js.map +1 -1
- package/dist/components/dropdown.component.d.ts +47 -3
- package/dist/components/dropdown.component.d.ts.map +1 -1
- package/dist/components/dropdown.js +262 -29
- package/dist/components/dropdown.js.map +1 -1
- package/dist/components/link.js +1 -1
- package/dist/components/link.js.map +1 -1
- package/dist/components/menu-item.component.d.ts +3 -0
- package/dist/components/menu-item.component.d.ts.map +1 -1
- package/dist/components/menu-item.js +20 -2
- package/dist/components/menu-item.js.map +1 -1
- package/dist/components/menu.component.d.ts +1 -1
- package/dist/components/menu.component.d.ts.map +1 -1
- package/dist/components/menu.js +5 -5
- package/dist/components/menu.js.map +1 -1
- package/dist/components/phone-input.component.d.ts +5 -3
- package/dist/components/phone-input.component.d.ts.map +1 -1
- package/dist/components/phone-input.js +23 -35
- package/dist/components/phone-input.js.map +1 -1
- package/dist/components/popup.component.d.ts +0 -1
- package/dist/components/popup.component.d.ts.map +1 -1
- package/dist/components/popup.js +1 -23
- package/dist/components/popup.js.map +1 -1
- package/dist/components/search.js +1 -1
- package/dist/components/search.js.map +1 -1
- package/dist/components/spinner.component.d.ts.map +1 -1
- package/dist/components/spinner.js +9 -1
- package/dist/components/spinner.js.map +1 -1
- package/dist/components/step-indicator.component.d.ts +14 -0
- package/dist/components/step-indicator.component.d.ts.map +1 -0
- package/dist/components/step-indicator.js +58 -0
- package/dist/components/step-indicator.js.map +1 -0
- package/dist/components/textfield.component.d.ts +1 -0
- package/dist/components/textfield.component.d.ts.map +1 -1
- package/dist/components/textfield.js +9 -7
- package/dist/components/textfield.js.map +1 -1
- package/dist/designsystemet-tailwind.css +1 -1
- package/dist/events/events.d.ts +2 -0
- package/dist/events/events.d.ts.map +1 -0
- package/dist/events/mid-select.d.ts +10 -0
- package/dist/events/mid-select.d.ts.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/mixins/form-controller.mixin.d.ts.map +1 -1
- package/dist/mixins/form-controller.mixin.js +0 -3
- package/dist/mixins/form-controller.mixin.js.map +1 -1
- package/dist/mixins/tailwind.mixin.js +2 -2
- package/package.json +17 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkbox.js","sources":["../../src/components/checkbox.component.ts"],"sourcesContent":["import { html, LitElement } from 'lit';\nimport {
|
|
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 'src/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 /** Gets the validity state object */\n\n /**\n * Checks for validity but does not show a validation message. Returns `true` when valid and `false` when invalid.\n */\n checkValidity() {\n return this.input.checkValidity();\n }\n\n /**\n * Checks for validity and shows the browser's validation message if the control is invalid.\n */\n reportValidity() {\n return this.input.reportValidity();\n }\n\n /**\n * Sets a custom validation message. The value provided will be shown to the user when the form is submitted. To clear\n * the custom validation message, call this method with an empty string.\n */\n setCustomValidity(message: string) {\n this.input.setCustomValidity(message);\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 console.log('invalid: ', this.invalid);\n\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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"}
|
|
@@ -7,9 +7,9 @@ declare global {
|
|
|
7
7
|
}
|
|
8
8
|
declare const MinidCodeInput_base: typeof LitElement & import('../types/mixin-constructor').Constructor<import('../mixins/form-controller.mixin').ConstraintsValidationMixinInterface>;
|
|
9
9
|
export declare class MinidCodeInput extends MinidCodeInput_base {
|
|
10
|
-
caretColor
|
|
11
|
-
caretHighlightColor
|
|
12
|
-
inputId
|
|
10
|
+
private readonly caretColor;
|
|
11
|
+
private readonly caretHighlightColor;
|
|
12
|
+
private readonly inputId;
|
|
13
13
|
inputRef: Ref<HTMLInputElement>;
|
|
14
14
|
value: string;
|
|
15
15
|
label: string;
|
|
@@ -23,31 +23,32 @@ export declare class MinidCodeInput extends MinidCodeInput_base {
|
|
|
23
23
|
/**
|
|
24
24
|
* Display custom error message, and force invalid state
|
|
25
25
|
*/
|
|
26
|
-
|
|
26
|
+
invalidmessage: string;
|
|
27
27
|
/**
|
|
28
28
|
* The length of the code input
|
|
29
29
|
*/
|
|
30
30
|
length: number;
|
|
31
|
-
|
|
31
|
+
fontsize: string;
|
|
32
32
|
renderError: boolean;
|
|
33
|
-
|
|
33
|
+
localErrorNode: Node | null;
|
|
34
34
|
constructor();
|
|
35
35
|
connectedCallback(): void;
|
|
36
36
|
_whenSettled(): Promise<void>;
|
|
37
37
|
disconnectedCallback(): void;
|
|
38
|
-
calcInputStyle
|
|
39
|
-
autoFillEventHandler
|
|
38
|
+
private calcInputStyle;
|
|
39
|
+
private autoFillEventHandler;
|
|
40
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;
|
|
41
48
|
firstUpdated(_changedProperties: PropertyValues): void;
|
|
42
|
-
focus(options?: FocusOptions): void;
|
|
43
|
-
onFocusOut(): void;
|
|
44
|
-
onFocusIn(): void;
|
|
45
49
|
updated(_changedProperties: PropertyValues): void;
|
|
50
|
+
focus(options?: FocusOptions): void;
|
|
46
51
|
setCustomValidity(error: string): void;
|
|
47
|
-
onClick(): void;
|
|
48
|
-
private handleKeydown;
|
|
49
|
-
handleSlotchange(e: Event): void;
|
|
50
|
-
_findErrorMessageNode(nodes: Node[]): Node | null;
|
|
51
52
|
render(): import('lit-html').TemplateResult<1>;
|
|
52
53
|
}
|
|
53
54
|
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,cAAc,EAAE,MAAM,KAAK,CAAC;AAE5D,OAAO,EAAkB,GAAG,EAAE,MAAM,uBAAuB,CAAC;
|
|
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;AAE5D,OAAO,EAAkB,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAM5D,OAAO,uBAAuB,CAAC;AAE/B,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,gBAAgB,EAAE,cAAc,CAAC;KAClC;CACF;;AAoDD,qBACa,cAAe,SAAQ,mBAEnC;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"}
|
|
@@ -6,6 +6,7 @@ import { live } from "lit/directives/live.js";
|
|
|
6
6
|
import { webOtpApiInit, webOtpApiClose } from "../utilities/web-otp-api.js";
|
|
7
7
|
import { styled } from "../mixins/tailwind.mixin.js";
|
|
8
8
|
import { ConstraintsValidationMixin } from "../mixins/form-controller.mixin.js";
|
|
9
|
+
import "./icon/icon.js";
|
|
9
10
|
var __defProp = Object.defineProperty;
|
|
10
11
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
11
12
|
var __decorateClass = (decorators, target, key, kind) => {
|
|
@@ -19,9 +20,10 @@ var __decorateClass = (decorators, target, key, kind) => {
|
|
|
19
20
|
const styles = [
|
|
20
21
|
css`
|
|
21
22
|
:host {
|
|
23
|
+
display: flex;
|
|
24
|
+
flex-direction: column;
|
|
22
25
|
container: otc / inline-size;
|
|
23
26
|
text-align: left;
|
|
24
|
-
width: 30rem;
|
|
25
27
|
--otc-background: white;
|
|
26
28
|
--otc-error-background: white;
|
|
27
29
|
--otc-length: 5;
|
|
@@ -39,6 +41,7 @@ const styles = [
|
|
|
39
41
|
letter-spacing: 2ch;
|
|
40
42
|
padding-block: 0.25ch;
|
|
41
43
|
padding-inline-start: calc(0.5ch * 1.5);
|
|
44
|
+
flex-grow: 1;
|
|
42
45
|
|
|
43
46
|
&:focus-visible:focus {
|
|
44
47
|
outline-style: none;
|
|
@@ -59,12 +62,6 @@ const styles = [
|
|
|
59
62
|
input.error {
|
|
60
63
|
background: var(--otc-error-background);
|
|
61
64
|
}
|
|
62
|
-
|
|
63
|
-
#error-box {
|
|
64
|
-
color: rgb(179, 38, 30);
|
|
65
|
-
font-size: 18px;
|
|
66
|
-
font-weight: 400;
|
|
67
|
-
}
|
|
68
65
|
`
|
|
69
66
|
];
|
|
70
67
|
let nextUniqueId = 0;
|
|
@@ -83,16 +80,33 @@ let MinidCodeInput = class extends ConstraintsValidationMixin(
|
|
|
83
80
|
this.required = false;
|
|
84
81
|
this.disabled = false;
|
|
85
82
|
this.inputmode = "numeric";
|
|
86
|
-
this.
|
|
83
|
+
this.invalidmessage = "";
|
|
87
84
|
this.length = 5;
|
|
88
|
-
this.
|
|
85
|
+
this.fontsize = "11.45cqw";
|
|
89
86
|
this.renderError = false;
|
|
90
|
-
this.
|
|
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
|
+
};
|
|
91
105
|
this.addEventListener("invalid", (e) => {
|
|
92
106
|
this.renderError = true;
|
|
93
|
-
if (this.
|
|
107
|
+
if (this.localErrorNode) {
|
|
94
108
|
e.preventDefault();
|
|
95
|
-
this.
|
|
109
|
+
this.localErrorNode.textContent = this.validationMessage || "Error";
|
|
96
110
|
}
|
|
97
111
|
});
|
|
98
112
|
}
|
|
@@ -126,7 +140,7 @@ let MinidCodeInput = class extends ConstraintsValidationMixin(
|
|
|
126
140
|
inputStyle?.setProperty("--otc-background", gradientStyle);
|
|
127
141
|
const gradientErrorStyle = `linear-gradient(90deg, var(--color-danger-surface-active) calc(${this.length}ch / 2), transparent 0) 0 0 / 3ch 100%`;
|
|
128
142
|
inputStyle?.setProperty("--otc-error-background", gradientErrorStyle);
|
|
129
|
-
inputStyle?.setProperty("--otc-width", this.
|
|
143
|
+
inputStyle?.setProperty("--otc-width", this.fontsize);
|
|
130
144
|
}
|
|
131
145
|
autoFillEventHandler(e) {
|
|
132
146
|
e.animationName === "onAutoFillStart" && (this.value = this.inputRef.value.value);
|
|
@@ -134,15 +148,7 @@ let MinidCodeInput = class extends ConstraintsValidationMixin(
|
|
|
134
148
|
get selectionEnd() {
|
|
135
149
|
return this.inputRef.value?.selectionEnd;
|
|
136
150
|
}
|
|
137
|
-
|
|
138
|
-
this.focus();
|
|
139
|
-
webOtpApiInit(this.renderRoot);
|
|
140
|
-
}
|
|
141
|
-
focus(options) {
|
|
142
|
-
const notMobile = !window.matchMedia("only screen and (max-width: 768px)").matches;
|
|
143
|
-
notMobile && this.inputRef.value?.focus(options);
|
|
144
|
-
}
|
|
145
|
-
onFocusOut() {
|
|
151
|
+
handleFocusOut() {
|
|
146
152
|
for (let i = 0; i < this.length; i++) {
|
|
147
153
|
this.inputRef.value?.style.setProperty(
|
|
148
154
|
`--char-${i + 1}-color`,
|
|
@@ -150,37 +156,12 @@ let MinidCodeInput = class extends ConstraintsValidationMixin(
|
|
|
150
156
|
);
|
|
151
157
|
}
|
|
152
158
|
}
|
|
153
|
-
|
|
154
|
-
const currentChar = this.value.length + 1;
|
|
155
|
-
this.inputRef.value?.style.setProperty(
|
|
156
|
-
`--char-${currentChar}-color`,
|
|
157
|
-
this.caretHighlightColor
|
|
158
|
-
);
|
|
159
|
-
}
|
|
160
|
-
updated(_changedProperties) {
|
|
161
|
-
for (let i = 0; i < this.length; i++) {
|
|
162
|
-
const color = i === this.value.length ? this.caretHighlightColor : this.caretColor;
|
|
163
|
-
this.inputRef.value?.style.setProperty(`--char-${i + 1}-color`, color);
|
|
164
|
-
}
|
|
165
|
-
if (_changedProperties.has("_forcedErrorMessage")) {
|
|
166
|
-
this.setCustomValidity(this._forcedErrorMessage);
|
|
167
|
-
}
|
|
168
|
-
this.setFormValue(this.value);
|
|
169
|
-
this.setValidity(
|
|
170
|
-
this.inputRef.value.validity,
|
|
171
|
-
this.inputRef.value.validationMessage,
|
|
172
|
-
this.inputRef.value
|
|
173
|
-
);
|
|
174
|
-
}
|
|
175
|
-
setCustomValidity(error) {
|
|
176
|
-
this.inputRef.value?.setCustomValidity(error);
|
|
177
|
-
}
|
|
178
|
-
onClick() {
|
|
159
|
+
handleClick() {
|
|
179
160
|
this.value = this.value.substring(0, this.selectionEnd || 0);
|
|
180
161
|
this.renderError = false;
|
|
181
162
|
this.setCustomValidity("");
|
|
182
|
-
if (this.
|
|
183
|
-
this.
|
|
163
|
+
if (this.localErrorNode) {
|
|
164
|
+
this.localErrorNode.textContent = "";
|
|
184
165
|
}
|
|
185
166
|
this.setFormValue(this.value);
|
|
186
167
|
this.setValidity({});
|
|
@@ -198,76 +179,95 @@ let MinidCodeInput = class extends ConstraintsValidationMixin(
|
|
|
198
179
|
handleSlotchange(e) {
|
|
199
180
|
const slot = e.target;
|
|
200
181
|
const childNodes = slot.assignedNodes({ flatten: true });
|
|
201
|
-
this.
|
|
202
|
-
if (this.
|
|
182
|
+
this.localErrorNode = this.findErrorMessageNode(childNodes);
|
|
183
|
+
if (this.localErrorNode && this.invalidmessage) {
|
|
203
184
|
this.renderError = true;
|
|
204
|
-
this.
|
|
185
|
+
this.localErrorNode.textContent = this.invalidmessage;
|
|
205
186
|
this.setValidity({});
|
|
206
187
|
}
|
|
207
188
|
}
|
|
208
|
-
|
|
189
|
+
findErrorMessageNode(nodes) {
|
|
209
190
|
for (const node of nodes) {
|
|
210
191
|
if (node instanceof Element && node.classList.contains("error-message")) {
|
|
211
192
|
return node;
|
|
212
193
|
}
|
|
213
194
|
const childNodesArray = Array.from(node.childNodes);
|
|
214
|
-
const foundNode = this.
|
|
195
|
+
const foundNode = this.findErrorMessageNode(childNodesArray);
|
|
215
196
|
if (foundNode) {
|
|
216
197
|
return foundNode;
|
|
217
198
|
}
|
|
218
199
|
}
|
|
219
200
|
return null;
|
|
220
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
|
+
}
|
|
221
228
|
render() {
|
|
222
229
|
return html`
|
|
223
|
-
<
|
|
224
|
-
|
|
225
|
-
class="${classMap({
|
|
230
|
+
<label
|
|
231
|
+
class="${classMap({
|
|
226
232
|
"sr-only": this.hidelabel,
|
|
227
|
-
"font-medium": true,
|
|
228
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
|
|
229
244
|
})}"
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
@focusout="${() => {
|
|
257
|
-
this.onFocusOut();
|
|
258
|
-
}}"
|
|
259
|
-
@focusin="${() => {
|
|
260
|
-
this.onFocusIn();
|
|
261
|
-
}}"
|
|
262
|
-
@keydown="${this.handleKeydown}"
|
|
263
|
-
@click="${this.onClick}"
|
|
264
|
-
?disabled="${this.disabled}"
|
|
265
|
-
?required="${this.required}"
|
|
266
|
-
minlength=${this.length}
|
|
267
|
-
maxlength="${this.length}"
|
|
268
|
-
/>
|
|
269
|
-
<slot name="error-message" @slotchange=${this.handleSlotchange}></slot>
|
|
270
|
-
</div>
|
|
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
271
|
`;
|
|
272
272
|
}
|
|
273
273
|
};
|
|
@@ -290,20 +290,20 @@ __decorateClass([
|
|
|
290
290
|
property({ type: String })
|
|
291
291
|
], MinidCodeInput.prototype, "inputmode", 2);
|
|
292
292
|
__decorateClass([
|
|
293
|
-
property(
|
|
294
|
-
], MinidCodeInput.prototype, "
|
|
293
|
+
property()
|
|
294
|
+
], MinidCodeInput.prototype, "invalidmessage", 2);
|
|
295
295
|
__decorateClass([
|
|
296
296
|
property({ type: Number })
|
|
297
297
|
], MinidCodeInput.prototype, "length", 2);
|
|
298
298
|
__decorateClass([
|
|
299
|
-
property(
|
|
300
|
-
], MinidCodeInput.prototype, "
|
|
299
|
+
property()
|
|
300
|
+
], MinidCodeInput.prototype, "fontsize", 2);
|
|
301
301
|
__decorateClass([
|
|
302
302
|
state()
|
|
303
303
|
], MinidCodeInput.prototype, "renderError", 2);
|
|
304
304
|
__decorateClass([
|
|
305
305
|
state()
|
|
306
|
-
], MinidCodeInput.prototype, "
|
|
306
|
+
], MinidCodeInput.prototype, "localErrorNode", 2);
|
|
307
307
|
MinidCodeInput = __decorateClass([
|
|
308
308
|
customElement("mid-code-input")
|
|
309
309
|
], MinidCodeInput);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-input.js","sources":["../../src/components/code-input.component.ts"],"sourcesContent":["import { css, html, LitElement, PropertyValues } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { createRef, ref, 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';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'mid-code-input': MinidCodeInput;\n }\n}\n\nconst styles = [\n css`\n :host {\n container: otc / inline-size;\n text-align: left;\n width: 30rem;\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\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 #error-box {\n color: rgb(179, 38, 30);\n font-size: 18px;\n font-weight: 400;\n }\n `,\n];\n\nlet nextUniqueId = 0;\n\n@customElement('mid-code-input')\nexport class MinidCodeInput extends ConstraintsValidationMixin(\n styled(LitElement, styles)\n) {\n caretColor = 'var(--color-neutral-surface-tinted)';\n caretHighlightColor = 'var(--color-accent-surface-active)';\n 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({ type: String, attribute: 'error-message' })\n _forcedErrorMessage = '';\n\n /**\n * The length of the code input\n */\n @property({ type: Number })\n length = 5;\n\n @property({ type: String, attribute: 'font-size' })\n fontSize = '3cqw';\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 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 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 firstUpdated(_changedProperties: PropertyValues) {\n this.focus();\n webOtpApiInit(this.renderRoot);\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 onFocusOut() {\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 onFocusIn() {\n const currentChar = this.value.length + 1;\n this.inputRef.value?.style.setProperty(\n `--char-${currentChar}-color`,\n this.caretHighlightColor\n );\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._forcedErrorMessage);\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 setCustomValidity(error: string) {\n this.inputRef!.value?.setCustomValidity(error);\n }\n\n onClick() {\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 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._forcedErrorMessage) {\n // display if slot set, and error override in effect\n this.renderError = true;\n this._localErrorNode.textContent = this._forcedErrorMessage;\n this.setValidity({} as ValidityState); // cancel built-in visual feedback\n }\n }\n\n _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 override render() {\n return html`\n <div class=\"flex flex-col\">\n <label\n class=\"${classMap({\n 'sr-only': this.hidelabel,\n 'font-medium': true,\n 'mb-2': !!this.label,\n })}\"\n for=\"${this.inputId}\"\n >${this.label}\n </label>\n <input\n ${ref(this.inputRef)}\n id=${this.inputId}\n class=\"${classMap({\n 'w-full': true,\n error: this._forcedErrorMessage,\n })}\"\n .value=${live(this.value)}\n autocomplete=\"${'one-time-code' as any}\"\n inputmode=${this.inputmode}\n @input=\"${(e: InputEvent) => {\n this.value = (e.target as HTMLInputElement).value;\n }}\"\n @change=\"${(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 @focusout=\"${() => {\n this.onFocusOut();\n }}\"\n @focusin=\"${() => {\n this.onFocusIn();\n }}\"\n @keydown=\"${this.handleKeydown}\"\n @click=\"${this.onClick}\"\n ?disabled=\"${this.disabled}\"\n ?required=\"${this.required}\"\n minlength=${this.length}\n maxlength=\"${this.length}\"\n />\n <slot name=\"error-message\" @slotchange=${this.handleSlotchange}></slot>\n </div>\n `;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"code-input.js","sources":["../../src/components/code-input.component.ts"],"sourcesContent":["import { css, html, LitElement, PropertyValues } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { createRef, ref, 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': MinidCodeInput;\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')\nexport class MinidCodeInput 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,8 +1,5 @@
|
|
|
1
|
-
import { LitElement
|
|
2
|
-
import { MinidPopup } from './popup.component';
|
|
1
|
+
import { LitElement } from 'lit';
|
|
3
2
|
import { MinidMenu } from '../components/menu.component';
|
|
4
|
-
import { MinidPhoneInput } from '../components/phone-input.component';
|
|
5
|
-
import { MinidTextfield } from '../components/textfield.component';
|
|
6
3
|
declare global {
|
|
7
4
|
interface HTMLElementTagNameMap {
|
|
8
5
|
'mid-combobox': MinidCombobox;
|
|
@@ -16,10 +13,10 @@ declare const MinidCombobox_base: typeof LitElement;
|
|
|
16
13
|
*/
|
|
17
14
|
export declare class MinidCombobox extends MinidCombobox_base {
|
|
18
15
|
private closeWatcher?;
|
|
19
|
-
popup
|
|
20
|
-
trigger
|
|
21
|
-
panel
|
|
22
|
-
triggerElements
|
|
16
|
+
private popup;
|
|
17
|
+
private trigger;
|
|
18
|
+
private panel;
|
|
19
|
+
private triggerElements;
|
|
23
20
|
/**
|
|
24
21
|
* By default, the combobox is closed when an item is selected. This attribute will keep it open instead. Useful for
|
|
25
22
|
* comboboxs that allow for multiple interactions.
|
|
@@ -44,14 +41,14 @@ export declare class MinidCombobox extends MinidCombobox_base {
|
|
|
44
41
|
*/
|
|
45
42
|
hoist: boolean;
|
|
46
43
|
disabled: boolean;
|
|
47
|
-
triggerElement
|
|
44
|
+
private triggerElement;
|
|
48
45
|
/**
|
|
49
46
|
* The combobox will close when the user interacts outside of this element (e.g. clicking). Useful for composing other
|
|
50
47
|
* components that use a combobox internally.
|
|
51
48
|
*/
|
|
52
49
|
containingElement?: HTMLElement;
|
|
53
50
|
connectedCallback(): void;
|
|
54
|
-
|
|
51
|
+
firstUpdated(): void;
|
|
55
52
|
disconnectedCallback(): void;
|
|
56
53
|
focusOnTrigger(): void;
|
|
57
54
|
getMenu(): MinidMenu | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combobox.component.d.ts","sourceRoot":"","sources":["../../src/components/combobox.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"combobox.component.d.ts","sourceRoot":"","sources":["../../src/components/combobox.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAE,MAAM,KAAK,CAAC;AAQ5C,OAAO,mBAAmB,CAAC;AAY3B,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAIzD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,cAAc,EAAE,aAAa,CAAC;KAC/B;CACF;;AAUD;;;;GAIG;AACH,qBACa,aAAc,SAAQ,kBAA0B;IAC3D,OAAO,CAAC,YAAY,CAAC,CAAe;IAGpC,OAAO,CAAC,KAAK,CAAc;IAG3B,OAAO,CAAC,OAAO,CAAmB;IAGlC,OAAO,CAAC,KAAK,CAAmB;IAGhC,OAAO,CAAC,eAAe,CAInB;IAEJ;;;OAGG;IAEH,gBAAgB,UAAS;IAEzB;;OAEG;IAEH,IAAI,UAAS;IAGb,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAQ;IAEhC;;OAEG;IAEH,QAAQ,SAAK;IAEb;;OAEG;IAEH,QAAQ,SAAK;IAEb;;;OAGG;IAEH,KAAK,UAAS;IAGd,QAAQ,UAAS;IAGjB,OAAO,CAAC,cAAc,CAAwD;IAE9E;;;OAGG;IAEH,iBAAiB,CAAC,EAAE,WAAW,CAAC;IAEhC,iBAAiB;IAQjB,YAAY,IAAI,IAAI;IAsBpB,oBAAoB;IAMpB,cAAc;IAUd,OAAO,IAID,SAAS,GACT,SAAS;IAGf,OAAO,CAAC,kBAAkB,CAWxB;IAEF,OAAO,CAAC,aAAa,CASnB;IAEF,OAAO,CAAC,qBAAqB,CA2C3B;IAEF,OAAO,CAAC,uBAAuB,CAM7B;IAEF,OAAO,CAAC,iBAAiB,CAiBvB;IAEF,kBAAkB;IAaZ,oBAAoB,CAAC,KAAK,EAAE,aAAa;IA4D/C,kBAAkB,CAAC,KAAK,EAAE,aAAa;IAOvC,uBAAuB;IAIvB;;;OAGG;IACH,UAAU;IAIV,gBAAgB;IAchB,mBAAmB;IAMnB;;OAEG;IACG,IAAI;IASV;;OAEG;IACG,IAAI;IAmBV,uBAAuB;IA0BjB,gBAAgB;IA0Cb,MAAM;CAuChB"}
|
|
@@ -103,7 +103,7 @@ let MinidCombobox = class extends styled(LitElement, styles) {
|
|
|
103
103
|
this.containingElement = this;
|
|
104
104
|
}
|
|
105
105
|
}
|
|
106
|
-
firstUpdated(
|
|
106
|
+
firstUpdated() {
|
|
107
107
|
const input = this.triggerElements[0];
|
|
108
108
|
if (input.tagName.toLowerCase() === "mid-phone-input") {
|
|
109
109
|
this.triggerElement = "mid-phone-input";
|