@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.
Files changed (71) hide show
  1. package/dist/components/alert.component.d.ts +2 -6
  2. package/dist/components/alert.component.d.ts.map +1 -1
  3. package/dist/components/alert.js +18 -58
  4. package/dist/components/alert.js.map +1 -1
  5. package/dist/components/button.component.d.ts +0 -1
  6. package/dist/components/button.component.d.ts.map +1 -1
  7. package/dist/components/button.js +4 -3
  8. package/dist/components/button.js.map +1 -1
  9. package/dist/components/checkbox.component.d.ts +46 -6
  10. package/dist/components/checkbox.component.d.ts.map +1 -1
  11. package/dist/components/checkbox.js +115 -87
  12. package/dist/components/checkbox.js.map +1 -1
  13. package/dist/components/code-input.component.d.ts +16 -15
  14. package/dist/components/code-input.component.d.ts.map +1 -1
  15. package/dist/components/code-input.js +105 -105
  16. package/dist/components/code-input.js.map +1 -1
  17. package/dist/components/combobox.component.d.ts +7 -10
  18. package/dist/components/combobox.component.d.ts.map +1 -1
  19. package/dist/components/combobox.js +1 -1
  20. package/dist/components/combobox.js.map +1 -1
  21. package/dist/components/dialog.js +2 -2
  22. package/dist/components/dialog.js.map +1 -1
  23. package/dist/components/dropdown.component.d.ts +47 -3
  24. package/dist/components/dropdown.component.d.ts.map +1 -1
  25. package/dist/components/dropdown.js +262 -29
  26. package/dist/components/dropdown.js.map +1 -1
  27. package/dist/components/link.js +1 -1
  28. package/dist/components/link.js.map +1 -1
  29. package/dist/components/menu-item.component.d.ts +3 -0
  30. package/dist/components/menu-item.component.d.ts.map +1 -1
  31. package/dist/components/menu-item.js +20 -2
  32. package/dist/components/menu-item.js.map +1 -1
  33. package/dist/components/menu.component.d.ts +1 -1
  34. package/dist/components/menu.component.d.ts.map +1 -1
  35. package/dist/components/menu.js +5 -5
  36. package/dist/components/menu.js.map +1 -1
  37. package/dist/components/phone-input.component.d.ts +5 -3
  38. package/dist/components/phone-input.component.d.ts.map +1 -1
  39. package/dist/components/phone-input.js +23 -35
  40. package/dist/components/phone-input.js.map +1 -1
  41. package/dist/components/popup.component.d.ts +0 -1
  42. package/dist/components/popup.component.d.ts.map +1 -1
  43. package/dist/components/popup.js +1 -23
  44. package/dist/components/popup.js.map +1 -1
  45. package/dist/components/search.js +1 -1
  46. package/dist/components/search.js.map +1 -1
  47. package/dist/components/spinner.component.d.ts.map +1 -1
  48. package/dist/components/spinner.js +9 -1
  49. package/dist/components/spinner.js.map +1 -1
  50. package/dist/components/step-indicator.component.d.ts +14 -0
  51. package/dist/components/step-indicator.component.d.ts.map +1 -0
  52. package/dist/components/step-indicator.js +58 -0
  53. package/dist/components/step-indicator.js.map +1 -0
  54. package/dist/components/textfield.component.d.ts +1 -0
  55. package/dist/components/textfield.component.d.ts.map +1 -1
  56. package/dist/components/textfield.js +9 -7
  57. package/dist/components/textfield.js.map +1 -1
  58. package/dist/designsystemet-tailwind.css +1 -1
  59. package/dist/events/events.d.ts +2 -0
  60. package/dist/events/events.d.ts.map +1 -0
  61. package/dist/events/mid-select.d.ts +10 -0
  62. package/dist/events/mid-select.d.ts.map +1 -0
  63. package/dist/index.d.ts +3 -1
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +3 -1
  66. package/dist/index.js.map +1 -1
  67. package/dist/mixins/form-controller.mixin.d.ts.map +1 -1
  68. package/dist/mixins/form-controller.mixin.js +0 -3
  69. package/dist/mixins/form-controller.mixin.js.map +1 -1
  70. package/dist/mixins/tailwind.mixin.js +2 -2
  71. 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 {\n customElement,\n property,\n query,\n queryAssignedNodes,\n} from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { styled } from '../mixins/tailwind.mixin';\nimport { FormControllerMixin } from '../mixins/form-controller.mixin.ts';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'mid-checkbox': MinidCheckbox;\n }\n}\n\n@customElement('mid-checkbox')\nexport class MinidCheckbox extends FormControllerMixin(styled(LitElement)) {\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: String })\n size: 'sm' | 'md' | 'lg' = 'md';\n\n @query('.fds-checkbox__description')\n checkboxDescriptionElement!: HTMLDivElement;\n\n @queryAssignedNodes({ slot: 'description', flatten: true })\n descriptionNodes?: NodeListOf<HTMLElement>;\n\n #handleChange(event: Event) {\n this.checked = (event.target as HTMLInputElement).checked;\n if (this.checked) {\n this.setFormValue('on', 'checked');\n } else {\n this.setFormValue(null);\n }\n this.dispatchEvent(new Event('change', { bubbles: true, composed: true }));\n }\n\n #handleClick(event: Event) {\n if (this.readonly) {\n event.preventDefault();\n }\n }\n\n #updateDescriptionHidden() {\n this.checkboxDescriptionElement.style.display = !this.descriptionNodes\n ?.length\n ? 'none'\n : 'block';\n }\n\n protected firstUpdated() {\n this.#updateDescriptionHidden();\n }\n\n override render() {\n const sm = this.size === 'sm';\n const md = this.size === 'md';\n const lg = this.size === 'lg';\n\n return html`\n <div\n class=\"${classMap({\n 'fds-checkbox': true,\n 'fds-paragraph': true,\n 'fds-checkbox--readonly': this.readonly,\n 'fds-paragraph--sm': sm,\n 'fds-checkbox--sm': sm,\n 'fds-paragraph--md': md,\n 'fds-checkbox--md': md,\n 'fds-paragraph--lg': lg,\n 'fds-checkbox--lg': lg,\n })}\"\n >\n <input\n id=\"checkbox\"\n class=\"fds-checkbox__input\"\n type=\"checkbox\"\n @change=${this.#handleChange}\n @click=${this.#handleClick}\n ?disabled=${this.disabled}\n ?checked=${this.checked}\n ?readonly=${this.readonly}\n />\n <label\n for=\"checkbox\"\n class=${classMap({\n 'fds-label': true,\n 'fds-checkbox__label': true,\n 'fds-label--regular-weight': true,\n 'fds-label--sm': sm,\n 'fds-label--md': md,\n 'fds-label--lg': lg,\n })}\n >\n <slot></slot>\n </label>\n <div\n class=\"${classMap({\n 'fds-paragraph': true,\n 'fds-checkbox__description': true,\n 'fds-paragraph--sm': sm,\n 'fds-paragraph--md': md,\n 'fds-paragraph--lg': lg,\n })}\"\n >\n <slot\n name=\"description\"\n @slotchange=${this.#updateDescriptionHidden}\n ></slot>\n </div>\n </div>\n `;\n }\n}\n"],"names":[],"mappings":"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"}
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":";;;;;;;;;;;;;;;;;;;;AAsBO,IAAM,gBAAN,cAA4B,iBAAiB,OAAO,UAAU,CAAC,EAAE;AAAA,EAAjE,cAAA;AAAA,UAAA,GAAA,SAAA;AAQE,SAAA,OAAA;AAMC,SAAA,QAAA;AAGE,SAAA,UAAA;AAGC,SAAA,WAAA;AAGA,SAAA,WAAA;AAGD,SAAA,UAAA;AAGC,SAAA,WAAA;AAAA,EAAA;AAAA,EAEX,WAAW,wBAAwB;AACjC,WAAO,CAAC,iBAAiB;AAAA,EAAA;AAAA,EAG3B,wBAAiC;AAC/B,WAAO,KAAK;AAAA,EAAA;AAAA,EAGd,IAAI,mBAAmB;AACrB,WAAO,KAAK;AAAA,EAAA;AAAA,EAGN,cAAc;AACf,SAAA,UAAU,CAAC,KAAK;AAErB,SAAK,cAAc,IAAI,MAAM,YAAY,CAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAM5C,QAAQ;AACN,SAAK,MAAM,MAAM;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMnB,MAAM,SAAwB;AACvB,SAAA,MAAM,MAAM,OAAO;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAM1B,OAAO;AACL,SAAK,MAAM,KAAK;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQlB,gBAAgB;AACP,WAAA,KAAK,MAAM,cAAc;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMlC,iBAAiB;AACR,WAAA,KAAK,MAAM,eAAe;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOnC,kBAAkB,SAAiB;AAC5B,SAAA,MAAM,kBAAkB,OAAO;AAAA,EAAA;AAAA,EAItC,oBAAoB;AAEb,SAAA,SAAS,KAAK,KAAK;AAAA,EAAA;AAAA,EAGjB,SAAS;AACR,YAAA,IAAI,aAAa,KAAK,OAAO;AAE9B,WAAA;AAAA;AAAA,iBAEM,SAAS;AAAA,MAChB,oBAAoB,KAAK;AAAA,MACzB,sBAAsB,KAAK;AAAA,IAAA,CAC5B,CAAC;AAAA;AAAA;AAAA,mBAGS,SAAS;AAAA,MAChB,kBAAkB,CAAC,KAAK,YAAY,KAAK,WAAW,CAAC,KAAK;AAAA,MAC1D,kBAAkB,CAAC,KAAK,YAAY,KAAK,WAAW,KAAK;AAAA,MACzD,sBACE,CAAC,KAAK,YAAY,KAAK,WAAW,CAAC,KAAK;AAAA,MAC1C,kBAAkB,CAAC,KAAK,YAAY,CAAC,KAAK,WAAW,CAAC,KAAK;AAAA,MAC3D,sBAAsB,CAAC,KAAK,YAAY,KAAK;AAAA,MAC7C,yBAAyB,KAAK;AAAA,MAC9B,6BAA6B,KAAK;AAAA,IAAA,CACnC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,oBAKQ,UAAU,KAAK,KAAK,CAAC;AAAA,uBAClB,KAAK,KAAK,OAAO,CAAC;AAAA,wBACjB,KAAK,QAAQ;AAAA,uBACd,KAAK,OAAO;AAAA,wBACX,KAAK,QAAQ;AAAA,wBACb,KAAK,QAAQ;AAAA,qBAChB,KAAK,WAAW;AAAA;AAAA,YAEzB,KAAK,UACH;AAAA,yBACW,SAAS;AAAA,MAChB,6BAA6B,KAAK,WAAW,CAAC,KAAK;AAAA,IAAA,CACpD,CAAC;AAAA;AAAA,8BAGJ,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAQhB;AAlJU,gBAAA;AAAA,EADP,MAAM,wBAAwB;AAAA,GADpB,cAEH,WAAA,SAAA,CAAA;AAMR,gBAAA;AAAA,EADC,SAAS;AAAA,GAPC,cAQX,WAAA,QAAA,CAAA;AAMA,gBAAA;AAAA,EADC,SAAS;AAAA,GAbC,cAcX,WAAA,SAAA,CAAA;AAGA,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,QAAS,CAAA;AAAA,GAhBhB,cAiBX,WAAA,WAAA,CAAA;AAGA,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,QAAS,CAAA;AAAA,GAnBhB,cAoBX,WAAA,YAAA,CAAA;AAGA,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,QAAS,CAAA;AAAA,GAtBhB,cAuBX,WAAA,YAAA,CAAA;AAGA,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,QAAS,CAAA;AAAA,GAzBhB,cA0BX,WAAA,WAAA,CAAA;AAGA,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,SAAS,SAAS,KAAM,CAAA;AAAA,GA5B/B,cA6BX,WAAA,YAAA,CAAA;AAkEA,gBAAA;AAAA,EADC,MAAM,CAAC,WAAW,OAAO,CAAC;AAAA,GA9FhB,cA+FX,WAAA,qBAAA,CAAA;AA/FW,gBAAN,gBAAA;AAAA,EADN,cAAc,cAAc;AAAA,GAChB,aAAA;"}
@@ -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: string;
11
- caretHighlightColor: string;
12
- inputId: string;
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
- _forcedErrorMessage: string;
26
+ invalidmessage: string;
27
27
  /**
28
28
  * The length of the code input
29
29
  */
30
30
  length: number;
31
- fontSize: string;
31
+ fontsize: string;
32
32
  renderError: boolean;
33
- _localErrorNode: Node | null;
33
+ localErrorNode: Node | null;
34
34
  constructor();
35
35
  connectedCallback(): void;
36
36
  _whenSettled(): Promise<void>;
37
37
  disconnectedCallback(): void;
38
- calcInputStyle(): void;
39
- autoFillEventHandler(e: AnimationEvent): void;
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;AAO5D,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,gBAAgB,EAAE,cAAc,CAAC;KAClC;CACF;;AAwDD,qBACa,cAAe,SAAQ,mBAEnC;IACC,UAAU,SAAyC;IACnD,mBAAmB,SAAwC;IAC3D,OAAO,SAAsC;IAEtC,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,mBAAmB,SAAM;IAEzB;;OAEG;IAEH,MAAM,SAAK;IAGX,QAAQ,SAAU;IAGlB,WAAW,UAAS;IAGpB,eAAe,EAAE,IAAI,GAAG,IAAI,CAAQ;;IAa3B,iBAAiB;IAKpB,YAAY;IAST,oBAAoB;IAQ7B,cAAc;IAkBd,oBAAoB,CAAC,CAAC,EAAE,cAAc;IAKtC,IAAI,YAAY,8BAEf;IAED,YAAY,CAAC,kBAAkB,EAAE,cAAc;IAK/C,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY;IAM5B,UAAU;IASV,SAAS;IAQT,OAAO,CAAC,kBAAkB,EAAE,cAAc,GAAG,IAAI;IAmBjD,iBAAiB,CAAC,KAAK,EAAE,MAAM;IAI/B,OAAO;IAaP,OAAO,CAAC,aAAa;IAkBrB,gBAAgB,CAAC,CAAC,EAAE,KAAK;IAazB,qBAAqB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI;IAcxC,MAAM;CAoDhB"}
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._forcedErrorMessage = "";
83
+ this.invalidmessage = "";
87
84
  this.length = 5;
88
- this.fontSize = "3cqw";
85
+ this.fontsize = "11.45cqw";
89
86
  this.renderError = false;
90
- this._localErrorNode = null;
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._localErrorNode) {
107
+ if (this.localErrorNode) {
94
108
  e.preventDefault();
95
- this._localErrorNode.textContent = this.validationMessage || "Error";
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.fontSize);
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
- firstUpdated(_changedProperties) {
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
- onFocusIn() {
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._localErrorNode) {
183
- this._localErrorNode.textContent = "";
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._localErrorNode = this._findErrorMessageNode(childNodes);
202
- if (this._localErrorNode && this._forcedErrorMessage) {
182
+ this.localErrorNode = this.findErrorMessageNode(childNodes);
183
+ if (this.localErrorNode && this.invalidmessage) {
203
184
  this.renderError = true;
204
- this._localErrorNode.textContent = this._forcedErrorMessage;
185
+ this.localErrorNode.textContent = this.invalidmessage;
205
186
  this.setValidity({});
206
187
  }
207
188
  }
208
- _findErrorMessageNode(nodes) {
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._findErrorMessageNode(childNodesArray);
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
- <div class="flex flex-col">
224
- <label
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
- for="${this.inputId}"
231
- >${this.label}
232
- </label>
233
- <input
234
- ${ref(this.inputRef)}
235
- id=${this.inputId}
236
- class="${classMap({
237
- "w-full": true,
238
- error: this._forcedErrorMessage
239
- })}"
240
- .value=${live(this.value)}
241
- autocomplete="${"one-time-code"}"
242
- inputmode=${this.inputmode}
243
- @input="${(e) => {
244
- this.value = e.target.value;
245
- }}"
246
- @change="${(e) => {
247
- this.value = e.target.value;
248
- this.dispatchEvent(
249
- new Event("input", {
250
- bubbles: true,
251
- cancelable: true,
252
- composed: true
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({ type: String, attribute: "error-message" })
294
- ], MinidCodeInput.prototype, "_forcedErrorMessage", 2);
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({ type: String, attribute: "font-size" })
300
- ], MinidCodeInput.prototype, "fontSize", 2);
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, "_localErrorNode", 2);
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":";;;;;;;;;;;;;;;;;;;AAgBA,MAAM,SAAS;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6CF;AAEA,IAAI,eAAe;AAGZ,IAAM,iBAAN,cAA6B;AAAA,EAClC,OAAO,YAAY,MAAM;AAC3B,EAAE;AAAA,EAiDA,cAAc;AACN,UAAA;AAjDR,SAAiB,aAAa;AAC9B,SAAiB,sBAAsB;AACtB,SAAA,UAAU,kBAAkB,cAAc;AAE3D,SAAO,WAAkC,UAAU;AAG3C,SAAA,QAAA;AAGA,SAAA,QAAA;AAMI,SAAA,YAAA;AAGD,SAAA,WAAA;AAGA,SAAA,WAAA;AAGC,SAAA,YAAA;AAMK,SAAA,iBAAA;AAMR,SAAA,SAAA;AAGE,SAAA,WAAA;AAGG,SAAA,cAAA;AAGgB,SAAA,iBAAA;AAuE9B,SAAQ,gBAAgB,MAAM;AACtB,YAAA,cAAc,KAAK,MAAM,SAAS;AACnC,WAAA,SAAS,OAAO,MAAM;AAAA,QACzB,UAAU,WAAW;AAAA,QACrB,KAAK;AAAA,MACP;AAAA,IACF;AAiCQ,SAAA,eAAe,CAAC,MAAa;AAC9B,WAAA,QAAS,EAAE,OAA4B;AACvC,WAAA;AAAA,QACH,IAAI,MAAM,SAAS;AAAA,UACjB,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,UAAU;AAAA,QACX,CAAA;AAAA,MACH;AAAA,IACF;AAnHO,SAAA,iBAAiB,WAAW,CAAC,MAAM;AACtC,WAAK,cAAc;AACnB,UAAI,KAAK,gBAAgB;AACvB,UAAE,eAAe;AACZ,aAAA,eAAe,cAAc,KAAK,qBAAqB;AAAA,MAAA;AAAA,IAC9D,CACD;AAAA,EAAA;AAAA,EAGM,oBAAoB;AAC3B,UAAM,kBAAkB;AACxB,SAAK,aAAa;AAAA,EAAA;AAAA,EAGpB,MAAM,eAAe;AACnB,UAAM,KAAK;AACX,SAAK,SAAS,OAAO;AAAA,MACnB;AAAA,MACA,KAAK,qBAAqB,KAAK,IAAI;AAAA,IACrC;AACA,SAAK,eAAe;AAAA,EAAA;AAAA,EAGb,uBAAuB;AACf,mBAAA;AACf,SAAK,SAAS,OAAO;AAAA,MACnB;AAAA,MACA,KAAK,qBAAqB,KAAK,IAAI;AAAA,IACrC;AAAA,EAAA;AAAA,EAGM,iBAAiB;AACjB,UAAA,aAAa,KAAK,SAAS,OAAO;AAExC,gBAAY,YAAY,gBAAgB,KAAK,OAAO,UAAU;AAE9D,QAAI,gBAAgB;AACpB,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACnB,uBAAA,cAAc,IAAI,CAAC,WAAW,IAAI,IAAI,IAAI,OAAO,GAAG,IAAI,IAAI,IAAI,GAAG,mBAAmB,IAAI,IAAI,GAAG,MAAM,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,KAAK,SAAS,OAAO,EAAE;AAAA,IAAA;AAEtJ,qBAAA,qBAAqB,KAAK,SAAS,CAAC;AACzC,gBAAA,YAAY,oBAAoB,aAAa;AAEnD,UAAA,qBAAqB,kEAAkE,KAAK,MAAM;AAC5F,gBAAA,YAAY,0BAA0B,kBAAkB;AAExD,gBAAA,YAAY,eAAe,KAAK,QAAQ;AAAA,EAAA;AAAA,EAG9C,qBAAqB,GAAmB;AAC9C,MAAE,kBAAkB,sBACjB,KAAK,QAAS,KAAK,SAAS,MAA2B;AAAA,EAAA;AAAA,EAG5D,IAAI,eAAe;AACV,WAAA,KAAK,SAAS,OAAO;AAAA,EAAA;AAAA,EAGtB,iBAAiB;AACvB,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAC/B,WAAA,SAAS,OAAO,MAAM;AAAA,QACzB,UAAU,IAAI,CAAC;AAAA,QACf,KAAK;AAAA,MACP;AAAA,IAAA;AAAA,EACF;AAAA,EAWM,cAAc;AACpB,SAAK,QAAQ,KAAK,MAAM,UAAU,GAAG,KAAK,gBAAgB,CAAC;AAE3D,SAAK,cAAc;AACnB,SAAK,kBAAkB,EAAE;AACzB,QAAI,KAAK,gBAAgB;AACvB,WAAK,eAAe,cAAc;AAAA,IAAA;AAG/B,SAAA,aAAa,KAAK,KAAK;AACvB,SAAA,YAAY,EAAmB;AAAA,EAAA;AAAA,EAG9B,cAAc,OAAsB;AAC1C,UAAM,cACJ,MAAM,WAAW,MAAM,WAAW,MAAM,YAAY,MAAM;AAI5D,QAAI,MAAM,QAAQ,WAAW,CAAC,aAAa;AACzC,iBAAW,MAAM;AAIf,YAAI,CAAC,MAAM,oBAAoB,CAAC,MAAM,aAAa;AAC5C,eAAA,UAAU,MAAM,cAAc;AAAA,QAAA;AAAA,MACrC,CACD;AAAA,IAAA;AAAA,EACH;AAAA,EAcM,iBAAiB,GAAU;AACjC,UAAM,OAAO,EAAE;AACf,UAAM,aAAa,KAAK,cAAc,EAAE,SAAS,MAAM;AAElD,SAAA,iBAAiB,KAAK,qBAAqB,UAAU;AACtD,QAAA,KAAK,kBAAkB,KAAK,gBAAgB;AAE9C,WAAK,cAAc;AACd,WAAA,eAAe,cAAc,KAAK;AAClC,WAAA,YAAY,EAAmB;AAAA,IAAA;AAAA,EACtC;AAAA,EAGM,qBAAqB,OAA4B;AACvD,eAAW,QAAQ,OAAO;AACxB,UAAI,gBAAgB,WAAW,KAAK,UAAU,SAAS,eAAe,GAAG;AAChE,eAAA;AAAA,MAAA;AAET,YAAM,kBAAkB,MAAM,KAAK,KAAK,UAAU;AAC5C,YAAA,YAAY,KAAK,qBAAqB,eAAe;AAC3D,UAAI,WAAW;AACN,eAAA;AAAA,MAAA;AAAA,IACT;AAEK,WAAA;AAAA,EAAA;AAAA,EAGT,aAAa,oBAAoC;AAC/C,SAAK,MAAM;AACX,kBAAc,KAAK,UAAU;AAAA,EAAA;AAAA,EAG/B,QAAQ,oBAA0C;AAChD,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,QACJ,MAAM,KAAK,MAAM,SAAS,KAAK,sBAAsB,KAAK;AACvD,WAAA,SAAS,OAAO,MAAM,YAAY,UAAU,IAAI,CAAC,UAAU,KAAK;AAAA,IAAA;AAGnE,QAAA,mBAAmB,IAAI,qBAAqB,GAAG;AAC5C,WAAA,kBAAkB,KAAK,cAAc;AAAA,IAAA;AAGvC,SAAA,aAAa,KAAK,KAAK;AACvB,SAAA;AAAA,MACH,KAAK,SAAS,MAAO;AAAA,MACrB,KAAK,SAAS,MAAO;AAAA,MACrB,KAAK,SAAU;AAAA,IACjB;AAAA,EAAA;AAAA,EAGF,MAAM,SAAwB;AAC5B,UAAM,YAAY,CAAC,OAAO,WAAW,oCAAoC,EACtE;AACH,iBAAa,KAAK,SAAS,OAAO,MAAM,OAAO;AAAA,EAAA;AAAA,EAGjD,kBAAkB,OAAe;AAC1B,SAAA,SAAU,OAAO,kBAAkB,KAAK;AAAA,EAAA;AAAA,EAGtC,SAAS;AACT,WAAA;AAAA;AAAA,iBAEM,SAAS;AAAA,MAChB,WAAW,KAAK;AAAA,MAChB,QAAQ,CAAC,CAAC,KAAK;AAAA,IAAA,CAChB,CAAC;AAAA,eACK,KAAK,OAAO;AAAA,WAChB,KAAK,KAAK;AAAA;AAAA;AAAA,UAGX,IAAI,KAAK,QAAQ,CAAC;AAAA,aACf,KAAK,OAAO;AAAA,kBACP,KAAK,KAAK,KAAK,CAAC;AAAA,iBACjB,SAAS;AAAA,MAChB,OAAO,KAAK;AAAA,IAAA,CACb,CAAC;AAAA,wBACc,eAAsB;AAAA,qBACzB,KAAK,SAAS;AAAA,kBACjB,KAAK,YAAY;AAAA,mBAChB,KAAK,YAAY;AAAA,qBACf,KAAK,cAAc;AAAA,oBACpB,KAAK,aAAa;AAAA,oBAClB,KAAK,aAAa;AAAA,kBACpB,KAAK,WAAW;AAAA,qBACb,KAAK,MAAM;AAAA,qBACX,KAAK,MAAM;AAAA,qBACX,KAAK,QAAQ;AAAA,qBACb,KAAK,QAAQ;AAAA;AAAA,+CAEa,KAAK,gBAAgB;AAAA;AAAA;AAAA;AAAA,oBAIhD,CAAC,KAAK,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAM5B,KAAK,cAAc;AAAA;AAAA;AAAA;AAAA,EAAA;AAK/B;AA1QE,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,SAAS,KAAM,CAAA;AAAA,GAT9B,eAUX,WAAA,SAAA,CAAA;AAGA,gBAAA;AAAA,EADC,SAAS;AAAA,GAZC,eAaX,WAAA,SAAA,CAAA;AAMA,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,QAAS,CAAA;AAAA,GAlBhB,eAmBX,WAAA,aAAA,CAAA;AAGA,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,QAAS,CAAA;AAAA,GArBhB,eAsBX,WAAA,YAAA,CAAA;AAGA,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,QAAS,CAAA;AAAA,GAxBhB,eAyBX,WAAA,YAAA,CAAA;AAGA,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,OAAQ,CAAA;AAAA,GA3Bf,eA4BX,WAAA,aAAA,CAAA;AAMA,gBAAA;AAAA,EADC,SAAS;AAAA,GAjCC,eAkCX,WAAA,kBAAA,CAAA;AAMA,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,OAAQ,CAAA;AAAA,GAvCf,eAwCX,WAAA,UAAA,CAAA;AAGA,gBAAA;AAAA,EADC,SAAS;AAAA,GA1CC,eA2CX,WAAA,YAAA,CAAA;AAGA,gBAAA;AAAA,EADC,MAAM;AAAA,GA7CI,eA8CX,WAAA,eAAA,CAAA;AAGA,gBAAA;AAAA,EADC,MAAM;AAAA,GAhDI,eAiDX,WAAA,kBAAA,CAAA;AAjDW,iBAAN,gBAAA;AAAA,EADN,cAAc,gBAAgB;AAAA,GAClB,cAAA;"}
@@ -1,8 +1,5 @@
1
- import { LitElement, PropertyValues } from 'lit';
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: MinidPopup;
20
- trigger: HTMLSlotElement;
21
- panel: HTMLSlotElement;
22
- triggerElements: (MinidTextfield | MinidPhoneInput | HTMLInputElement)[];
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: 'mid-textfield' | 'mid-phone-input';
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
- protected firstUpdated(_changedProperties: PropertyValues): void;
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,cAAc,EAAE,MAAM,KAAK,CAAC;AAQ5D,OAAO,mBAAmB,CAAC;AAE3B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAU/C,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAEnE,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,KAAK,EAAG,UAAU,CAAC;IAGnB,OAAO,EAAG,eAAe,CAAC;IAG1B,KAAK,EAAG,eAAe,CAAC;IAGxB,eAAe,EAAG,CAAC,cAAc,GAAG,eAAe,GAAG,gBAAgB,CAAC,EAAE,CAAC;IAE1E;;;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,cAAc,EAAE,eAAe,GAAG,iBAAiB,CAAmB;IAEtE;;;OAGG;IAEH,iBAAiB,CAAC,EAAE,WAAW,CAAC;IAEhC,iBAAiB;IAQjB,SAAS,CAAC,YAAY,CAAC,kBAAkB,EAAE,cAAc,GAAG,IAAI;IAsBhE,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"}
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(_changedProperties) {
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";