@felleslosninger/minid-elements 0.0.97 → 0.0.99

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 (88) hide show
  1. package/dist/components/alert.component.d.ts.map +1 -1
  2. package/dist/components/alert.js +44 -25
  3. package/dist/components/alert.js.map +1 -1
  4. package/dist/components/button.component.d.ts +4 -5
  5. package/dist/components/button.component.d.ts.map +1 -1
  6. package/dist/components/button.js +58 -53
  7. package/dist/components/button.js.map +1 -1
  8. package/dist/components/combobox.component.d.ts +1 -13
  9. package/dist/components/combobox.component.d.ts.map +1 -1
  10. package/dist/components/combobox.js +6 -17
  11. package/dist/components/combobox.js.map +1 -1
  12. package/dist/components/{modal.component.d.ts → dialog.component.d.ts} +15 -16
  13. package/dist/components/dialog.component.d.ts.map +1 -0
  14. package/dist/components/{modal.js → dialog.js} +41 -77
  15. package/dist/components/dialog.js.map +1 -0
  16. package/dist/components/dropdown.component.d.ts +4 -5
  17. package/dist/components/dropdown.component.d.ts.map +1 -1
  18. package/dist/components/dropdown.js +37 -57
  19. package/dist/components/dropdown.js.map +1 -1
  20. package/dist/components/heading.component.d.ts.map +1 -1
  21. package/dist/components/heading.js +9 -10
  22. package/dist/components/heading.js.map +1 -1
  23. package/dist/components/helptext.component.d.ts +1 -25
  24. package/dist/components/helptext.component.d.ts.map +1 -1
  25. package/dist/components/helptext.js +20 -48
  26. package/dist/components/helptext.js.map +1 -1
  27. package/dist/components/icon/icon.component.d.ts +1 -4
  28. package/dist/components/icon/icon.component.d.ts.map +1 -1
  29. package/dist/components/icon/icon.js +3 -12
  30. package/dist/components/icon/icon.js.map +1 -1
  31. package/dist/components/link.component.d.ts +0 -4
  32. package/dist/components/link.component.d.ts.map +1 -1
  33. package/dist/components/link.js +3 -22
  34. package/dist/components/link.js.map +1 -1
  35. package/dist/components/menu-item.component.d.ts +0 -3
  36. package/dist/components/menu-item.component.d.ts.map +1 -1
  37. package/dist/components/menu-item.js +25 -57
  38. package/dist/components/menu-item.js.map +1 -1
  39. package/dist/components/menu.component.d.ts +2 -11
  40. package/dist/components/menu.component.d.ts.map +1 -1
  41. package/dist/components/menu.js +12 -48
  42. package/dist/components/menu.js.map +1 -1
  43. package/dist/components/paragraph.component.d.ts.map +1 -1
  44. package/dist/components/paragraph.js +5 -6
  45. package/dist/components/paragraph.js.map +1 -1
  46. package/dist/components/phone-input.component.d.ts +3 -4
  47. package/dist/components/phone-input.component.d.ts.map +1 -1
  48. package/dist/components/phone-input.js +23 -62
  49. package/dist/components/phone-input.js.map +1 -1
  50. package/dist/components/popup.component.d.ts +2 -1
  51. package/dist/components/popup.component.d.ts.map +1 -1
  52. package/dist/components/popup.js +4 -0
  53. package/dist/components/popup.js.map +1 -1
  54. package/dist/components/radio-button.component.d.ts +0 -3
  55. package/dist/components/radio-button.component.d.ts.map +1 -1
  56. package/dist/components/radio-button.js.map +1 -1
  57. package/dist/components/radio.component.d.ts +0 -3
  58. package/dist/components/radio.component.d.ts.map +1 -1
  59. package/dist/components/radio.js +2 -5
  60. package/dist/components/radio.js.map +1 -1
  61. package/dist/components/textfield.component.d.ts +6 -29
  62. package/dist/components/textfield.component.d.ts.map +1 -1
  63. package/dist/components/textfield.js +55 -131
  64. package/dist/components/textfield.js.map +1 -1
  65. package/dist/components/tooltip.component.d.ts +4 -37
  66. package/dist/components/tooltip.component.d.ts.map +1 -1
  67. package/dist/components/tooltip.js +18 -34
  68. package/dist/components/tooltip.js.map +1 -1
  69. package/dist/designsystemet-tailwind.css +293 -474
  70. package/dist/index.css +0 -1355
  71. package/dist/index.d.ts +1 -2
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +3 -5
  74. package/dist/index.js.map +1 -1
  75. package/dist/mixins/tailwind.mixin.d.ts.map +1 -1
  76. package/dist/mixins/tailwind.mixin.js +3 -4
  77. package/dist/mixins/tailwind.mixin.js.map +1 -1
  78. package/dist/types/animation-name.d.ts +1 -1
  79. package/dist/types/animation-name.d.ts.map +1 -1
  80. package/dist/utilities/country-labels-no.d.ts +4 -0
  81. package/dist/utilities/country-labels-no.d.ts.map +1 -0
  82. package/dist/utilities/{countries.js → country-labels-no.js} +3 -3
  83. package/dist/utilities/{countries.js.map → country-labels-no.js.map} +1 -1
  84. package/package.json +10 -4
  85. package/dist/components/modal.component.d.ts.map +0 -1
  86. package/dist/components/modal.js.map +0 -1
  87. package/dist/utilities/countries.d.ts +0 -3
  88. package/dist/utilities/countries.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"link.js","sources":["../../src/components/link.component.ts"],"sourcesContent":["import { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { styled } from '../mixins/tailwind.mixin';\nimport './icon/icon.component';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'mid-link': MinidLink;\n }\n}\n\nconst styles = [\n css`\n .fds-link {\n align-items: baseline;\n }\n `,\n];\n\n@customElement('mid-link')\nexport class MinidLink extends styled(LitElement, styles) {\n @property()\n href?: string;\n\n /**\n * White text for dark backgrounds\n */\n @property({ type: Boolean })\n inverted = false;\n\n @property()\n target?: string;\n\n override render() {\n return html`\n <a\n class=\"${classMap({\n 'fds-link': true,\n 'fds-link--inverted': this.inverted,\n })}\"\n href=${ifDefined(this.href)}\n target=${ifDefined(this.target)}\n >\n <slot></slot>\n </a>\n `;\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAaA,MAAM,SAAS;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAKF;AAGO,IAAM,YAAN,cAAwB,OAAO,YAAY,MAAM,EAAE;AAAA,EAAnD,cAAA;AAAA,UAAA,GAAA,SAAA;AAQM,SAAA,WAAA;AAAA,EAAA;AAAA,EAKF,SAAS;AACT,WAAA;AAAA;AAAA,iBAEM,SAAS;AAAA,MAChB,YAAY;AAAA,MACZ,sBAAsB,KAAK;AAAA,IAAA,CAC5B,CAAC;AAAA,eACK,UAAU,KAAK,IAAI,CAAC;AAAA,iBAClB,UAAU,KAAK,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAMvC;AAzBE,gBAAA;AAAA,EADC,SAAS;AAAA,GADC,UAEX,WAAA,QAAA,CAAA;AAMA,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,QAAS,CAAA;AAAA,GAPhB,UAQX,WAAA,YAAA,CAAA;AAGA,gBAAA;AAAA,EADC,SAAS;AAAA,GAVC,UAWX,WAAA,UAAA,CAAA;AAXW,YAAN,gBAAA;AAAA,EADN,cAAc,UAAU;AAAA,GACZ,SAAA;"}
1
+ {"version":3,"file":"link.js","sources":["../../src/components/link.component.ts"],"sourcesContent":["import { html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { styled } from '../mixins/tailwind.mixin';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'mid-link': MinidLink;\n }\n}\n\n@customElement('mid-link')\nexport class MinidLink extends styled(LitElement) {\n @property()\n href?: string;\n\n @property()\n target?: string;\n\n override render() {\n return html`\n <a\n class=\"text-accent-subtle visited:text-link-visited focus-visible:bg-focus-outer inline-flex items-center gap-2 underline decoration-[.0625rem] underline-offset-[.27em] outline-0 focus-visible:text-white\"\n href=${ifDefined(this.href)}\n target=${ifDefined(this.target)}\n >\n <slot></slot>\n </a>\n `;\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAYO,IAAM,YAAN,cAAwB,OAAO,UAAU,EAAE;AAAA,EAOvC,SAAS;AACT,WAAA;AAAA;AAAA;AAAA,eAGI,UAAU,KAAK,IAAI,CAAC;AAAA,iBAClB,UAAU,KAAK,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAMvC;AAhBE,gBAAA;AAAA,EADC,SAAS;AAAA,GADC,UAEX,WAAA,QAAA,CAAA;AAGA,gBAAA;AAAA,EADC,SAAS;AAAA,GAJC,UAKX,WAAA,UAAA,CAAA;AALW,YAAN,gBAAA;AAAA,EADN,cAAc,UAAU;AAAA,GACZ,SAAA;"}
@@ -7,9 +7,6 @@ declare global {
7
7
  }
8
8
  declare const MinidMenuItem_base: typeof LitElement;
9
9
  export declare class MinidMenuItem extends MinidMenuItem_base {
10
- /**
11
- * @ignore
12
- */
13
10
  button: MinidButton;
14
11
  /**
15
12
  * If set, the interactive element will be an anchor element
@@ -1 +1 @@
1
- {"version":3,"file":"menu-item.component.d.ts","sourceRoot":"","sources":["../../src/components/menu-item.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAE,MAAM,KAAK,CAAC;AAI5C,OAAO,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,eAAe,EAAE,aAAa,CAAC;KAChC;CACF;;AA8BD,qBACa,aAAc,SAAQ,kBAAyB;IAC1D;;OAEG;IAEH,MAAM,EAAG,WAAW,CAAC;IAErB;;OAEG;IAEH,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAEzB;;OAEG;IAEH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IAEH,OAAO,EAAE,UAAU,GAAG,UAAU,CAAc;IAE9C;;OAEG;IAEH,MAAM,UAAS;IAEf,iBAAiB,IAAI,IAAI;IAKzB,KAAK,IAAI,IAAI;IAIb,SAAS,CAAC,MAAM,EAAE,OAAO;IAIhB,MAAM;CA+BhB"}
1
+ {"version":3,"file":"menu-item.component.d.ts","sourceRoot":"","sources":["../../src/components/menu-item.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,UAAU,EAAE,MAAM,KAAK,CAAC;AAIvC,OAAO,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,eAAe,EAAE,aAAa,CAAC;KAChC;CACF;;AAED,qBACa,aAAc,SAAQ,kBAAkB;IAEnD,MAAM,EAAG,WAAW,CAAC;IAErB;;OAEG;IAEH,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAEzB;;OAEG;IAEH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IAEH,OAAO,EAAE,UAAU,GAAG,UAAU,CAAc;IAE9C;;OAEG;IAEH,MAAM,UAAS;IAEf,iBAAiB,IAAI,IAAI;IAKzB,KAAK,IAAI,IAAI;IAIb,SAAS,CAAC,MAAM,EAAE,OAAO;IAIhB,MAAM;CA0BhB"}
@@ -1,4 +1,4 @@
1
- import { css, LitElement, html } from "lit";
1
+ import { LitElement, html } from "lit";
2
2
  import { query, property, customElement } from "lit/decorators.js";
3
3
  import { styled } from "../mixins/tailwind.mixin.js";
4
4
  import { ifDefined } from "lit/directives/if-defined.js";
@@ -14,35 +14,7 @@ var __decorateClass = (decorators, target, key, kind) => {
14
14
  if (kind && result) __defProp(target, key, result);
15
15
  return result;
16
16
  };
17
- const style = [
18
- css`
19
- :host[hidden] {
20
- display: none;
21
- }
22
-
23
- .active {
24
- --fds-focus-border-width: 3px;
25
- outline: var(--fds-focus-border-width) solid
26
- var(--fds-semantic-border-focus-outline);
27
- outline-offset: var(--fds-focus-border-width);
28
- box-shadow: 0 0 0 var(--fds-focus-border-width)
29
- var(--fds-semantic-border-focus-boxshadow);
30
- }
31
-
32
- .fds-dropdownmenu__item {
33
- display: flex;
34
- }
35
-
36
- mid-button::part(base) {
37
- justify-content: flex-start;
38
- }
39
-
40
- .button {
41
- display: block;
42
- }
43
- `
44
- ];
45
- let MinidMenuItem = class extends styled(LitElement, style) {
17
+ let MinidMenuItem = class extends styled(LitElement) {
46
18
  constructor() {
47
19
  super(...arguments);
48
20
  this.variant = "dropdown";
@@ -59,33 +31,29 @@ let MinidMenuItem = class extends styled(LitElement, style) {
59
31
  this.active = active;
60
32
  }
61
33
  render() {
62
- return this.variant === "dropdown" ? html`
63
- <mid-button
64
- class="button"
65
- variant="tertiary"
66
- href=${ifDefined(this.href)}
67
- fullwidth
68
- >
69
- <slot></slot>
70
- </mid-button>
71
- ` : html` <button
72
- class=${classMap({
73
- button: true,
74
- "fds-label": true,
75
- "fds-label--md": true,
76
- "fds-label--medium-weight": true,
77
- "fds-combobox__option__label": true,
78
- "fds-combobox__option": true,
79
- "fds-combobox__option--active": this.active
80
- })}
81
- variant="tertiary"
82
- href=${ifDefined(this.href)}
83
- fullwidth
84
- >
85
- <div class="col-span-2 flex items-center gap-2">
86
- <slot></slot>
87
- </div>
88
- </button>`;
34
+ if (this.variant === "combobox") {
35
+ return html` <button
36
+ class="${classMap({
37
+ "border-transparent": !this.active,
38
+ "bg-accent-tinted": this.active,
39
+ "border-accent-base": this.active
40
+ })} block w-full rounded border-l-[5px] px-3 py-2 font-medium"
41
+ href=${ifDefined(this.href)}
42
+ >
43
+ <div class="flex items-center gap-2">
44
+ <slot></slot>
45
+ </div>
46
+ </button>`;
47
+ }
48
+ return html`
49
+ <mid-button
50
+ class="flex w-full [&::part(base)]:justify-start"
51
+ variant="tertiary"
52
+ href=${ifDefined(this.href)}
53
+ >
54
+ <slot></slot>
55
+ </mid-button>
56
+ `;
89
57
  }
90
58
  };
91
59
  __decorateClass([
@@ -1 +1 @@
1
- {"version":3,"file":"menu-item.js","sources":["../../src/components/menu-item.component.ts"],"sourcesContent":["import { css, html, LitElement } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport { styled } from '../mixins/tailwind.mixin.ts';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport './button.component';\nimport { MinidButton } from './button.component';\nimport { classMap } from 'lit/directives/class-map.js';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'mid-menu-item': MinidMenuItem;\n }\n}\n\nconst style = [\n css`\n :host[hidden] {\n display: none;\n }\n\n .active {\n --fds-focus-border-width: 3px;\n outline: var(--fds-focus-border-width) solid\n var(--fds-semantic-border-focus-outline);\n outline-offset: var(--fds-focus-border-width);\n box-shadow: 0 0 0 var(--fds-focus-border-width)\n var(--fds-semantic-border-focus-boxshadow);\n }\n\n .fds-dropdownmenu__item {\n display: flex;\n }\n\n mid-button::part(base) {\n justify-content: flex-start;\n }\n\n .button {\n display: block;\n }\n `,\n];\n@customElement('mid-menu-item')\nexport class MinidMenuItem extends styled(LitElement, style) {\n /**\n * @ignore\n */\n @query('.button')\n button!: MinidButton;\n\n /**\n * If set, the interactive element will be an anchor element\n */\n @property()\n href: string | undefined;\n\n /**\n * The items value\n */\n @property()\n value?: string;\n\n /**\n * Controls which styling to use\n */\n @property()\n variant: 'combobox' | 'dropdown' = 'dropdown';\n\n /**\n * Used as a focus state. So the actual focus can be somewhere else\n */\n @property({ type: Boolean, reflect: true })\n active = false;\n\n connectedCallback(): void {\n super.connectedCallback();\n this.setAttribute('role', 'menuitem');\n }\n\n focus(): void {\n this.button.focus();\n }\n\n setActive(active: boolean) {\n this.active = active;\n }\n\n override render() {\n return this.variant === 'dropdown'\n ? html`\n <mid-button\n class=\"button\"\n variant=\"tertiary\"\n href=${ifDefined(this.href)}\n fullwidth\n >\n <slot></slot>\n </mid-button>\n `\n : html` <button\n class=${classMap({\n button: true,\n 'fds-label': true,\n 'fds-label--md': true,\n 'fds-label--medium-weight': true,\n 'fds-combobox__option__label': true,\n 'fds-combobox__option': true,\n 'fds-combobox__option--active': this.active,\n })}\n variant=\"tertiary\"\n href=${ifDefined(this.href)}\n fullwidth\n >\n <div class=\"col-span-2 flex items-center gap-2\">\n <slot></slot>\n </div>\n </button>`;\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAcA,MAAM,QAAQ;AAAA,EACZ;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;AA0BF;AAEO,IAAM,gBAAN,cAA4B,OAAO,YAAY,KAAK,EAAE;AAAA,EAAtD,cAAA;AAAA,UAAA,GAAA,SAAA;AAuB8B,SAAA,UAAA;AAM1B,SAAA,SAAA;AAAA,EAAA;AAAA,EAET,oBAA0B;AACxB,UAAM,kBAAkB;AACnB,SAAA,aAAa,QAAQ,UAAU;AAAA,EAAA;AAAA,EAGtC,QAAc;AACZ,SAAK,OAAO,MAAM;AAAA,EAAA;AAAA,EAGpB,UAAU,QAAiB;AACzB,SAAK,SAAS;AAAA,EAAA;AAAA,EAGP,SAAS;AACT,WAAA,KAAK,YAAY,aACpB;AAAA;AAAA;AAAA;AAAA,mBAIW,UAAU,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,YAM/B;AAAA,kBACU,SAAS;AAAA,MACf,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,4BAA4B;AAAA,MAC5B,+BAA+B;AAAA,MAC/B,wBAAwB;AAAA,MACxB,gCAAgC,KAAK;AAAA,IAAA,CACtC,CAAC;AAAA;AAAA,iBAEK,UAAU,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAQrC;AAtEE,gBAAA;AAAA,EADC,MAAM,SAAS;AAAA,GAJL,cAKX,WAAA,UAAA,CAAA;AAMA,gBAAA;AAAA,EADC,SAAS;AAAA,GAVC,cAWX,WAAA,QAAA,CAAA;AAMA,gBAAA;AAAA,EADC,SAAS;AAAA,GAhBC,cAiBX,WAAA,SAAA,CAAA;AAMA,gBAAA;AAAA,EADC,SAAS;AAAA,GAtBC,cAuBX,WAAA,WAAA,CAAA;AAMA,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,SAAS,SAAS,KAAM,CAAA;AAAA,GA5B/B,cA6BX,WAAA,UAAA,CAAA;AA7BW,gBAAN,gBAAA;AAAA,EADN,cAAc,eAAe;AAAA,GACjB,aAAA;"}
1
+ {"version":3,"file":"menu-item.js","sources":["../../src/components/menu-item.component.ts"],"sourcesContent":["import { html, LitElement } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport { styled } from '../mixins/tailwind.mixin.ts';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport './button.component';\nimport { MinidButton } from './button.component';\nimport { classMap } from 'lit/directives/class-map.js';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'mid-menu-item': MinidMenuItem;\n }\n}\n\n@customElement('mid-menu-item')\nexport class MinidMenuItem extends styled(LitElement) {\n @query('.button')\n button!: MinidButton;\n\n /**\n * If set, the interactive element will be an anchor element\n */\n @property()\n href: string | undefined;\n\n /**\n * The items value\n */\n @property()\n value?: string;\n\n /**\n * Controls which styling to use\n */\n @property()\n variant: 'combobox' | 'dropdown' = 'dropdown';\n\n /**\n * Used as a focus state. So the actual focus can be somewhere else\n */\n @property({ type: Boolean, reflect: true })\n active = false;\n\n connectedCallback(): void {\n super.connectedCallback();\n this.setAttribute('role', 'menuitem');\n }\n\n focus(): void {\n this.button.focus();\n }\n\n setActive(active: boolean) {\n this.active = active;\n }\n\n override render() {\n if (this.variant === 'combobox') {\n return html` <button\n class=\"${classMap({\n 'border-transparent': !this.active,\n 'bg-accent-tinted': this.active,\n 'border-accent-base': this.active,\n })} block w-full rounded border-l-[5px] px-3 py-2 font-medium\"\n href=${ifDefined(this.href)}\n >\n <div class=\"flex items-center gap-2\">\n <slot></slot>\n </div>\n </button>`;\n }\n\n return html`\n <mid-button\n class=\"flex w-full [&::part(base)]:justify-start\"\n variant=\"tertiary\"\n href=${ifDefined(this.href)}\n >\n <slot></slot>\n </mid-button>\n `;\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAeO,IAAM,gBAAN,cAA4B,OAAO,UAAU,EAAE;AAAA,EAA/C,cAAA;AAAA,UAAA,GAAA,SAAA;AAoB8B,SAAA,UAAA;AAM1B,SAAA,SAAA;AAAA,EAAA;AAAA,EAET,oBAA0B;AACxB,UAAM,kBAAkB;AACnB,SAAA,aAAa,QAAQ,UAAU;AAAA,EAAA;AAAA,EAGtC,QAAc;AACZ,SAAK,OAAO,MAAM;AAAA,EAAA;AAAA,EAGpB,UAAU,QAAiB;AACzB,SAAK,SAAS;AAAA,EAAA;AAAA,EAGP,SAAS;AACZ,QAAA,KAAK,YAAY,YAAY;AACxB,aAAA;AAAA,iBACI,SAAS;AAAA,QAChB,sBAAsB,CAAC,KAAK;AAAA,QAC5B,oBAAoB,KAAK;AAAA,QACzB,sBAAsB,KAAK;AAAA,MAAA,CAC5B,CAAC;AAAA,eACK,UAAU,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAQxB,WAAA;AAAA;AAAA;AAAA;AAAA,eAII,UAAU,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAMnC;AAjEE,gBAAA;AAAA,EADC,MAAM,SAAS;AAAA,GADL,cAEX,WAAA,UAAA,CAAA;AAMA,gBAAA;AAAA,EADC,SAAS;AAAA,GAPC,cAQX,WAAA,QAAA,CAAA;AAMA,gBAAA;AAAA,EADC,SAAS;AAAA,GAbC,cAcX,WAAA,SAAA,CAAA;AAMA,gBAAA;AAAA,EADC,SAAS;AAAA,GAnBC,cAoBX,WAAA,WAAA,CAAA;AAMA,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,SAAS,SAAS,KAAM,CAAA;AAAA,GAzB/B,cA0BX,WAAA,UAAA,CAAA;AA1BW,gBAAN,gBAAA;AAAA,EADN,cAAc,eAAe;AAAA,GACjB,aAAA;"}
@@ -10,18 +10,8 @@ declare const MinidMenu_base: typeof LitElement;
10
10
  * @event {{ detail: { item: MidMenuItem } }} mid-select - Emitted when a menu item is selected.
11
11
  */
12
12
  export declare class MinidMenu extends MinidMenu_base {
13
- #private;
14
- /**
15
- * @ignore
16
- */
17
13
  defaultSlot: HTMLSlotElement;
18
- /**
19
- * @ignore
20
- */
21
14
  filterInput: HTMLInputElement;
22
- /**
23
- * @ignore
24
- */
25
15
  itemList: HTMLUListElement;
26
16
  /**
27
17
  * Adds an input element that filters selectable menu items
@@ -35,7 +25,8 @@ export declare class MinidMenu extends MinidMenu_base {
35
25
  protected firstUpdated(): void;
36
26
  connectedCallback(): void;
37
27
  private handleClick;
38
- handleFilterItems(): void;
28
+ private handleFilterItems;
29
+ private scrollOptionIntoView;
39
30
  private handleKeyDown;
40
31
  private handleMouseDown;
41
32
  private handleSlotChange;
@@ -1 +1 @@
1
- {"version":3,"file":"menu.component.d.ts","sourceRoot":"","sources":["../../src/components/menu.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAW,MAAM,KAAK,CAAC;AAIrD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,UAAU,EAAE,SAAS,CAAC;KACvB;CACF;;AA2BD;;GAEG;AACH,qBACa,SAAU,SAAQ,cAA0B;;IACvD;;OAEG;IAEH,WAAW,EAAG,eAAe,CAAC;IAE9B;;OAEG;IAEH,WAAW,EAAG,gBAAgB,CAAC;IAE/B;;OAEG;IAEH,QAAQ,EAAG,gBAAgB,CAAC;IAE5B;;OAEG;IAEH,UAAU,UAAS;IAEnB;;OAEG;IAEH,OAAO,EAAE,UAAU,GAAG,UAAU,CAAc;IAG9C,aAAa,UAAS;IAEtB,SAAS,CAAC,YAAY,IAAI,IAAI;IAS9B,iBAAiB;IAKjB,OAAO,CAAC,WAAW;IAoCnB,iBAAiB;IAgBjB,OAAO,CAAC,aAAa;IAgDrB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,UAAU;IASlB;;;OAGG;IACH,MAAM,GAAI,UAAU,CAAC,IAAI,EAAE,aAAa,KAAK,OAAO,UAUlD;IAEF,WAAW;IAMX;;OAEG;IACH,qBAAqB;IAQrB,WAAW;IAQX;;;OAGG;IACH,cAAc;IAMd;;;OAGG;IACH,cAAc,CAAC,IAAI,EAAE,aAAa;IAUlC,gBAAgB;IAMP,MAAM;CAkDhB"}
1
+ {"version":3,"file":"menu.component.d.ts","sourceRoot":"","sources":["../../src/components/menu.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAW,MAAM,KAAK,CAAC;AAGrD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,UAAU,EAAE,SAAS,CAAC;KACvB;CACF;;AAWD;;GAEG;AACH,qBACa,SAAU,SAAQ,cAA0B;IAEvD,WAAW,EAAG,eAAe,CAAC;IAG9B,WAAW,EAAG,gBAAgB,CAAC;IAG/B,QAAQ,EAAG,gBAAgB,CAAC;IAE5B;;OAEG;IAEH,UAAU,UAAS;IAEnB;;OAEG;IAEH,OAAO,EAAE,UAAU,GAAG,UAAU,CAAc;IAG9C,aAAa,UAAS;IAEtB,SAAS,CAAC,YAAY,IAAI,IAAI;IAS9B,iBAAiB;IAKjB,OAAO,CAAC,WAAW;IAoCnB,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,aAAa;IAgDrB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,UAAU;IASlB;;;OAGG;IACH,MAAM,GAAI,UAAU,CAAC,IAAI,EAAE,aAAa,KAAK,OAAO,UAUlD;IAEF,WAAW;IAMX;;OAEG;IACH,qBAAqB;IAQrB,WAAW;IAQX;;;OAGG;IACH,cAAc;IAMd;;;OAGG;IACH,cAAc,CAAC,IAAI,EAAE,aAAa;IAUlC,gBAAgB;IAMP,MAAM;CAwChB"}
@@ -1,13 +1,9 @@
1
1
  import { css, LitElement, nothing, html } from "lit";
2
2
  import { query, property, state, customElement } from "lit/decorators.js";
3
- import { classMap } from "lit/directives/class-map.js";
4
3
  import { styled } from "../mixins/tailwind.mixin.js";
5
4
  import { scrollIntoView } from "../internal/scroll.js";
6
5
  var __defProp = Object.defineProperty;
7
6
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
8
- var __typeError = (msg) => {
9
- throw TypeError(msg);
10
- };
11
7
  var __decorateClass = (decorators, target, key, kind) => {
12
8
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
13
9
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
@@ -16,38 +12,17 @@ var __decorateClass = (decorators, target, key, kind) => {
16
12
  if (kind && result) __defProp(target, key, result);
17
13
  return result;
18
14
  };
19
- var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
20
- var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
21
- var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
22
- var _MinidMenu_instances, scrollOptionIntoView_fn;
23
15
  const styles = [
24
16
  css`
25
17
  :host {
26
18
  --max-height: none;
27
- }
28
-
29
- .panel {
30
- padding: 0;
31
- }
32
-
33
- ul {
34
- max-height: var(--max-height);
35
- overflow-y: auto;
36
- }
37
-
38
- .border-b {
39
- border-bottom: 1px solid var(--fds-semantic-border-input-default);
40
- }
41
-
42
- .filter-input:focus-visible {
43
- box-shadow: 0 0 0 3px #00347d;
19
+ --max-width: none;
44
20
  }
45
21
  `
46
22
  ];
47
23
  let MinidMenu = class extends styled(LitElement, styles) {
48
24
  constructor() {
49
25
  super(...arguments);
50
- __privateAdd(this, _MinidMenu_instances);
51
26
  this.searchable = false;
52
27
  this.variant = "dropdown";
53
28
  this.emptyItemList = false;
@@ -106,6 +81,9 @@ let MinidMenu = class extends styled(LitElement, styles) {
106
81
  this.emptyItemList = items.length === 0;
107
82
  this.setCurrentItem(items[0]);
108
83
  }
84
+ scrollOptionIntoView(item) {
85
+ scrollIntoView(item, this.itemList, "vertical", "auto");
86
+ }
109
87
  handleKeyDown(event) {
110
88
  if (event.key === "Enter" || event.key === " ") {
111
89
  const item = this.getCurrentItem();
@@ -135,7 +113,7 @@ let MinidMenu = class extends styled(LitElement, styles) {
135
113
  index = 0;
136
114
  }
137
115
  this.setCurrentItem(items[index]);
138
- __privateMethod(this, _MinidMenu_instances, scrollOptionIntoView_fn).call(this, items[index]);
116
+ this.scrollOptionIntoView(items[index]);
139
117
  if (!this.searchable) {
140
118
  items[index].focus();
141
119
  }
@@ -207,28 +185,16 @@ let MinidMenu = class extends styled(LitElement, styles) {
207
185
  }
208
186
  }
209
187
  render() {
210
- const combobox = this.variant === "combobox";
211
- const dropdown = this.variant === "dropdown";
212
188
  return html`
213
189
  <div
214
- class="${classMap({
215
- panel: true,
216
- "fds-dropdownmenu": dropdown,
217
- "fds-dropdownmenu--md": dropdown,
218
- "fds-box--md-shadow": combobox,
219
- "fds-box--default-border-color": combobox,
220
- "fds-box--md-border-radius": combobox,
221
- "fds-box--default-background": combobox,
222
- "fds-combobox__options-wrapper": combobox,
223
- "fds-combobox--md": combobox
224
- })}"
190
+ class="text-body-md text-neutral border-neutral-subtle rounded-md border shadow-md"
225
191
  >
226
192
  ${!this.searchable ? nothing : html`<div
227
- class="filter-search flex items-center gap-2 border-b p-2"
193
+ class="border-neutral-subtle flex items-center gap-2 border-b p-2"
228
194
  >
229
195
  <mid-icon
196
+ class="text-6"
230
197
  slot="prefix"
231
- class="text-2xl"
232
198
  library="system"
233
199
  name="magnifying-glass"
234
200
  >
@@ -236,11 +202,13 @@ let MinidMenu = class extends styled(LitElement, styles) {
236
202
  <input
237
203
  @input=${this.handleFilterItems}
238
204
  @keydown=${this.handleKeyDown}
239
- class="filter-input h-8 w-full rounded px-2"
205
+ class="filter-input border-neutral-subtle focus-visible:outline-focus-outer h-8 w-full rounded border px-2"
240
206
  type="search"
241
207
  />
242
208
  </div>`}
243
- <ul class="item-list p-2">
209
+ <ul
210
+ class="item-list max-h-(--max-height) max-w-(--max-width) overflow-y-auto px-2 py-3"
211
+ >
244
212
  <slot
245
213
  @slotchange=${this.handleSlotChange}
246
214
  @click=${this.handleClick}
@@ -253,10 +221,6 @@ let MinidMenu = class extends styled(LitElement, styles) {
253
221
  `;
254
222
  }
255
223
  };
256
- _MinidMenu_instances = /* @__PURE__ */ new WeakSet();
257
- scrollOptionIntoView_fn = function(item) {
258
- scrollIntoView(item, this.itemList, "vertical", "auto");
259
- };
260
224
  __decorateClass([
261
225
  query("slot")
262
226
  ], MinidMenu.prototype, "defaultSlot", 2);
@@ -1 +1 @@
1
- {"version":3,"file":"menu.js","sources":["../../src/components/menu.component.ts"],"sourcesContent":["import { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { styled } from '../mixins/tailwind.mixin.ts';\nimport { MinidMenuItem } from './menu-item.component';\nimport { scrollIntoView } from '../internal/scroll';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'mid-menu': MinidMenu;\n }\n}\n\nconst styles = [\n css`\n :host {\n --max-height: none;\n }\n\n .panel {\n padding: 0;\n }\n\n ul {\n max-height: var(--max-height);\n overflow-y: auto;\n }\n\n .border-b {\n border-bottom: 1px solid var(--fds-semantic-border-input-default);\n }\n\n .filter-input:focus-visible {\n box-shadow: 0 0 0 3px #00347d;\n }\n `,\n];\n\n/**\n * @event {{ detail: { item: MidMenuItem } }} mid-select - Emitted when a menu item is selected.\n */\n@customElement('mid-menu')\nexport class MinidMenu extends styled(LitElement, styles) {\n /**\n * @ignore\n */\n @query('slot')\n defaultSlot!: HTMLSlotElement;\n\n /**\n * @ignore\n */\n @query('.filter-input')\n filterInput!: HTMLInputElement;\n\n /**\n * @ignore\n */\n @query('.item-list')\n itemList!: HTMLUListElement;\n\n /**\n * Adds an input element that filters selectable menu items\n */\n @property({ type: Boolean })\n searchable = false;\n\n /**\n * Wether the menu should be styled as a dropdown or a combobox\n */\n @property()\n variant: 'combobox' | 'dropdown' = 'dropdown';\n\n @state()\n emptyItemList = false;\n\n protected firstUpdated(): void {\n this.getAllItems().forEach((item) => {\n item.variant = this.variant;\n item.addEventListener('mouseenter', () => {\n this.setCurrentItem(item);\n });\n });\n }\n\n connectedCallback() {\n super.connectedCallback();\n this.setAttribute('role', 'menu');\n }\n\n private handleClick(event: MouseEvent) {\n const menuItemTypes = ['menuitem', 'menuitemcheckbox'];\n\n const composedPath = event.composedPath();\n const target = composedPath.find((el) =>\n menuItemTypes.includes((el as HTMLElement)?.getAttribute?.('role') || '')\n );\n\n if (!target) return;\n\n const closestMenu = composedPath.find(\n (el) => (el as HTMLElement)?.getAttribute?.('role') === 'menu'\n );\n const clickHasSubmenu = closestMenu !== this;\n\n // Make sure we're the menu thats supposed to be handling the click event.\n if (clickHasSubmenu) {\n return;\n }\n\n // This isn't true. But we use it for TypeScript checks below.\n const item = target as MinidMenuItem;\n\n // if (item.type === 'checkbox') {\n // item.checked = !item.checked;\n // }\n\n this.dispatchEvent(\n new CustomEvent('mid-select', {\n bubbles: true,\n composed: true,\n detail: { item },\n })\n );\n }\n\n handleFilterItems() {\n this.filter((item) =>\n item.innerText\n .toLowerCase()\n .includes(this.filterInput.value.toLowerCase())\n );\n\n const items = this.getAllSelectableItems();\n this.emptyItemList = items.length === 0;\n this.setCurrentItem(items[0]);\n }\n\n #scrollOptionIntoView(item: MinidMenuItem): void {\n scrollIntoView(item, this.itemList, 'vertical', 'auto');\n }\n\n private handleKeyDown(event: KeyboardEvent) {\n // Make a selection when pressing enter or space\n if (event.key === 'Enter' || event.key === ' ') {\n const item = this.getCurrentItem();\n event.preventDefault();\n event.stopPropagation();\n\n // Simulate a click to support @click handlers on menu items that also work with the keyboard\n item?.click();\n }\n\n // Move the selection when pressing down or up\n else if (['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key)) {\n const items = this.getAllSelectableItems();\n const activeItem = this.getCurrentItem();\n let index = activeItem ? items.indexOf(activeItem) : 0;\n\n if (items.length > 0) {\n event.preventDefault();\n event.stopPropagation();\n\n if (event.key === 'ArrowDown') {\n index++;\n } else if (event.key === 'ArrowUp') {\n index--;\n } else if (event.key === 'Home') {\n index = 0;\n } else if (event.key === 'End') {\n index = items.length - 1;\n }\n\n if (index < 0) {\n index = items.length - 1;\n }\n if (index > items.length - 1) {\n index = 0;\n }\n\n this.setCurrentItem(items[index]);\n this.#scrollOptionIntoView(items[index]);\n\n if (!this.searchable) {\n items[index].focus();\n }\n }\n }\n }\n\n private handleMouseDown(event: MouseEvent) {\n const target = event.target as HTMLElement;\n\n if (this.isMenuItem(target)) {\n this.setCurrentItem(target as MinidMenuItem);\n }\n }\n\n private handleSlotChange() {\n const items = this.getAllSelectableItems();\n\n // Reset the roving tab index when the slotted items change\n if (items.length > 0) {\n this.setCurrentItem(items[0]);\n }\n }\n\n private isMenuItem(item: HTMLElement) {\n return (\n item.tagName.toLowerCase() === 'mid-menu-item' ||\n ['menuitem', 'menuitemcheckbox', 'menuitemradio'].includes(\n item.getAttribute('role') ?? ''\n )\n );\n }\n\n /**\n * Pass a filter function to enable/disable menu items in the menu\n * @type {(item: MinidMenuItem) => boolean}\n */\n filter = (filterFn: (item: MinidMenuItem) => boolean) => {\n this.getAllItems().forEach((item) => {\n if (filterFn(item)) {\n item.removeAttribute('hidden');\n item.removeAttribute('inert');\n } else {\n item.setAttribute('inert', 'true');\n item.setAttribute('hidden', 'true');\n }\n });\n };\n\n clearFilter() {\n this.filterInput.value = '';\n this.itemList.scrollTop = 0;\n this.filterInput.dispatchEvent(new Event('input'));\n }\n\n /**\n * @internal Gets all slotted menu items, ignoring dividers, headers, and other elements.\n */\n getAllSelectableItems() {\n return [\n ...(this.defaultSlot.assignedElements({\n flatten: true,\n }) as MinidMenuItem[]),\n ].filter((el) => !(el.inert || !this.isMenuItem(el)));\n }\n\n getAllItems() {\n return [\n ...(this.defaultSlot.assignedElements({\n flatten: true,\n }) as MinidMenuItem[]),\n ].filter((el) => this.isMenuItem(el));\n }\n\n /**\n * @internal Gets the current menu item, which is the menu item that has `tabindex=\"0\"` within the roving tab index.\n * The menu item may or may not have focus, but for keyboard interaction purposes it's considered the \"active\" item.\n */\n getCurrentItem() {\n return this.getAllSelectableItems().find(\n (i) => i.getAttribute('tabindex') === '0'\n );\n }\n\n /**\n * @internal Sets the current menu item to the specified element. This sets `tabindex=\"0\"` on the target element and\n * `tabindex=\"-1\"` to all other items. This method must be called prior to setting focus on a menu item.\n */\n setCurrentItem(item: MinidMenuItem) {\n const items = this.getAllSelectableItems();\n\n // Update tab indexes\n items.forEach((i) => {\n i.setActive(i === item);\n i.setAttribute('tabindex', i === item ? '0' : '-1');\n });\n }\n\n focusSearchField() {\n if (this.searchable) {\n this.filterInput.focus();\n }\n }\n\n override render() {\n const combobox = this.variant === 'combobox';\n const dropdown = this.variant === 'dropdown';\n return html`\n <div\n class=\"${classMap({\n panel: true,\n 'fds-dropdownmenu': dropdown,\n 'fds-dropdownmenu--md': dropdown,\n 'fds-box--md-shadow': combobox,\n 'fds-box--default-border-color': combobox,\n 'fds-box--md-border-radius': combobox,\n 'fds-box--default-background': combobox,\n 'fds-combobox__options-wrapper': combobox,\n 'fds-combobox--md': combobox,\n })}\"\n >\n ${!this.searchable\n ? nothing\n : html`<div\n class=\"filter-search flex items-center gap-2 border-b p-2\"\n >\n <mid-icon\n slot=\"prefix\"\n class=\"text-2xl\"\n library=\"system\"\n name=\"magnifying-glass\"\n >\n </mid-icon>\n <input\n @input=${this.handleFilterItems}\n @keydown=${this.handleKeyDown}\n class=\"filter-input h-8 w-full rounded px-2\"\n type=\"search\"\n />\n </div>`}\n <ul class=\"item-list p-2\">\n <slot\n @slotchange=${this.handleSlotChange}\n @click=${this.handleClick}\n @keydown=${this.handleKeyDown}\n @mousedown=${this.handleMouseDown}\n ></slot>\n ${this.emptyItemList\n ? html`<div class=\"p-2\">Fant ingen treff</div>`\n : nothing}\n </ul>\n </div>\n `;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"menu.js","sources":["../../src/components/menu.component.ts"],"sourcesContent":["import { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { styled } from '../mixins/tailwind.mixin.ts';\nimport { MinidMenuItem } from './menu-item.component';\nimport { scrollIntoView } from '../internal/scroll';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'mid-menu': MinidMenu;\n }\n}\n\nconst styles = [\n css`\n :host {\n --max-height: none;\n --max-width: none;\n }\n `,\n];\n\n/**\n * @event {{ detail: { item: MidMenuItem } }} mid-select - Emitted when a menu item is selected.\n */\n@customElement('mid-menu')\nexport class MinidMenu extends styled(LitElement, styles) {\n @query('slot')\n defaultSlot!: HTMLSlotElement;\n\n @query('.filter-input')\n filterInput!: HTMLInputElement;\n\n @query('.item-list')\n itemList!: HTMLUListElement;\n\n /**\n * Adds an input element that filters selectable menu items\n */\n @property({ type: Boolean })\n searchable = false;\n\n /**\n * Wether the menu should be styled as a dropdown or a combobox\n */\n @property()\n variant: 'combobox' | 'dropdown' = 'dropdown';\n\n @state()\n emptyItemList = false;\n\n protected firstUpdated(): void {\n this.getAllItems().forEach((item) => {\n item.variant = this.variant;\n item.addEventListener('mouseenter', () => {\n this.setCurrentItem(item);\n });\n });\n }\n\n connectedCallback() {\n super.connectedCallback();\n this.setAttribute('role', 'menu');\n }\n\n private handleClick(event: MouseEvent) {\n const menuItemTypes = ['menuitem', 'menuitemcheckbox'];\n\n const composedPath = event.composedPath();\n const target = composedPath.find((el) =>\n menuItemTypes.includes((el as HTMLElement)?.getAttribute?.('role') || '')\n );\n\n if (!target) return;\n\n const closestMenu = composedPath.find(\n (el) => (el as HTMLElement)?.getAttribute?.('role') === 'menu'\n );\n const clickHasSubmenu = closestMenu !== this;\n\n // Make sure we're the menu thats supposed to be handling the click event.\n if (clickHasSubmenu) {\n return;\n }\n\n // This isn't true. But we use it for TypeScript checks below.\n const item = target as MinidMenuItem;\n\n // if (item.type === 'checkbox') {\n // item.checked = !item.checked;\n // }\n\n this.dispatchEvent(\n new CustomEvent('mid-select', {\n bubbles: true,\n composed: true,\n detail: { item },\n })\n );\n }\n\n private handleFilterItems() {\n this.filter((item) =>\n item.innerText\n .toLowerCase()\n .includes(this.filterInput.value.toLowerCase())\n );\n\n const items = this.getAllSelectableItems();\n this.emptyItemList = items.length === 0;\n this.setCurrentItem(items[0]);\n }\n\n private scrollOptionIntoView(item: MinidMenuItem): void {\n scrollIntoView(item, this.itemList, 'vertical', 'auto');\n }\n\n private handleKeyDown(event: KeyboardEvent) {\n // Make a selection when pressing enter or space\n if (event.key === 'Enter' || event.key === ' ') {\n const item = this.getCurrentItem();\n event.preventDefault();\n event.stopPropagation();\n\n // Simulate a click to support @click handlers on menu items that also work with the keyboard\n item?.click();\n }\n\n // Move the selection when pressing down or up\n else if (['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key)) {\n const items = this.getAllSelectableItems();\n const activeItem = this.getCurrentItem();\n let index = activeItem ? items.indexOf(activeItem) : 0;\n\n if (items.length > 0) {\n event.preventDefault();\n event.stopPropagation();\n\n if (event.key === 'ArrowDown') {\n index++;\n } else if (event.key === 'ArrowUp') {\n index--;\n } else if (event.key === 'Home') {\n index = 0;\n } else if (event.key === 'End') {\n index = items.length - 1;\n }\n\n if (index < 0) {\n index = items.length - 1;\n }\n if (index > items.length - 1) {\n index = 0;\n }\n\n this.setCurrentItem(items[index]);\n this.scrollOptionIntoView(items[index]);\n\n if (!this.searchable) {\n items[index].focus();\n }\n }\n }\n }\n\n private handleMouseDown(event: MouseEvent) {\n const target = event.target as HTMLElement;\n\n if (this.isMenuItem(target)) {\n this.setCurrentItem(target as MinidMenuItem);\n }\n }\n\n private handleSlotChange() {\n const items = this.getAllSelectableItems();\n\n // Reset the roving tab index when the slotted items change\n if (items.length > 0) {\n this.setCurrentItem(items[0]);\n }\n }\n\n private isMenuItem(item: HTMLElement) {\n return (\n item.tagName.toLowerCase() === 'mid-menu-item' ||\n ['menuitem', 'menuitemcheckbox', 'menuitemradio'].includes(\n item.getAttribute('role') ?? ''\n )\n );\n }\n\n /**\n * Pass a filter function to enable/disable menu items in the menu\n * @type {(item: MinidMenuItem) => boolean}\n */\n filter = (filterFn: (item: MinidMenuItem) => boolean) => {\n this.getAllItems().forEach((item) => {\n if (filterFn(item)) {\n item.removeAttribute('hidden');\n item.removeAttribute('inert');\n } else {\n item.setAttribute('inert', 'true');\n item.setAttribute('hidden', 'true');\n }\n });\n };\n\n clearFilter() {\n this.filterInput.value = '';\n this.itemList.scrollTop = 0;\n this.filterInput.dispatchEvent(new Event('input'));\n }\n\n /**\n * @internal Gets all slotted menu items, ignoring dividers, headers, and other elements.\n */\n getAllSelectableItems() {\n return [\n ...(this.defaultSlot.assignedElements({\n flatten: true,\n }) as MinidMenuItem[]),\n ].filter((el) => !(el.inert || !this.isMenuItem(el)));\n }\n\n getAllItems() {\n return [\n ...(this.defaultSlot.assignedElements({\n flatten: true,\n }) as MinidMenuItem[]),\n ].filter((el) => this.isMenuItem(el));\n }\n\n /**\n * @internal Gets the current menu item, which is the menu item that has `tabindex=\"0\"` within the roving tab index.\n * The menu item may or may not have focus, but for keyboard interaction purposes it's considered the \"active\" item.\n */\n getCurrentItem() {\n return this.getAllSelectableItems().find(\n (i) => i.getAttribute('tabindex') === '0'\n );\n }\n\n /**\n * @internal Sets the current menu item to the specified element. This sets `tabindex=\"0\"` on the target element and\n * `tabindex=\"-1\"` to all other items. This method must be called prior to setting focus on a menu item.\n */\n setCurrentItem(item: MinidMenuItem) {\n const items = this.getAllSelectableItems();\n\n // Update tab indexes\n items.forEach((i) => {\n i.setActive(i === item);\n i.setAttribute('tabindex', i === item ? '0' : '-1');\n });\n }\n\n focusSearchField() {\n if (this.searchable) {\n this.filterInput.focus();\n }\n }\n\n override render() {\n return html`\n <div\n class=\"text-body-md text-neutral border-neutral-subtle rounded-md border shadow-md\"\n >\n ${!this.searchable\n ? nothing\n : html`<div\n class=\"border-neutral-subtle flex items-center gap-2 border-b p-2\"\n >\n <mid-icon\n class=\"text-6\"\n slot=\"prefix\"\n library=\"system\"\n name=\"magnifying-glass\"\n >\n </mid-icon>\n <input\n @input=${this.handleFilterItems}\n @keydown=${this.handleKeyDown}\n class=\"filter-input border-neutral-subtle focus-visible:outline-focus-outer h-8 w-full rounded border px-2\"\n type=\"search\"\n />\n </div>`}\n <ul\n class=\"item-list max-h-(--max-height) max-w-(--max-width) overflow-y-auto px-2 py-3\"\n >\n <slot\n @slotchange=${this.handleSlotChange}\n @click=${this.handleClick}\n @keydown=${this.handleKeyDown}\n @mousedown=${this.handleMouseDown}\n ></slot>\n ${this.emptyItemList\n ? html`<div class=\"p-2\">Fant ingen treff</div>`\n : nothing}\n </ul>\n </div>\n `;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"paragraph.component.d.ts","sourceRoot":"","sources":["../../src/components/paragraph.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,UAAU,EAAE,MAAM,KAAK,CAAC;AAKvC,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,eAAe,EAAE,cAAc,CAAC;KACjC;CACF;;AAED;;GAEG;AACH,qBACa,cAAe,SAAQ,mBAAkB;IACpD;;;;;;OAMG;IAEH,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAQ;IAEvC;;;OAGG;IAEH,OAAO,UAAS;IAEP,MAAM;CAchB"}
1
+ {"version":3,"file":"paragraph.component.d.ts","sourceRoot":"","sources":["../../src/components/paragraph.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,UAAU,EAAE,MAAM,KAAK,CAAC;AAKvC,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,eAAe,EAAE,cAAc,CAAC;KACjC;CACF;;AAED;;GAEG;AACH,qBACa,cAAe,SAAQ,mBAAkB;IACpD;;;;;;OAMG;IAEH,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAQ;IAEvC;;;OAGG;IAEH,OAAO,UAAS;IAEP,MAAM;CAahB"}
@@ -21,12 +21,11 @@ let MinidParagraph = class extends styled(LitElement) {
21
21
  render() {
22
22
  return html`<p
23
23
  class="${classMap({
24
- "fds-paragraph": true,
25
- "fds-paragraph--spacing": this.spacing,
26
- "fds-paragraph--xs": this.size === "xs",
27
- "fds-paragraph--sm": this.size === "sm",
28
- "fds-paragraph--md": this.size === "md",
29
- "fds-paragraph--lg": this.size === "lg"
24
+ "mb-2": this.spacing,
25
+ "text-body-xs": this.size === "xs",
26
+ "text-body-sm": this.size === "sm",
27
+ "text-body-md": this.size === "md",
28
+ "text-body-lg": this.size === "lg"
30
29
  })}"
31
30
  >
32
31
  <slot></slot>
@@ -1 +1 @@
1
- {"version":3,"file":"paragraph.js","sources":["../../src/components/paragraph.component.ts"],"sourcesContent":["import { html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { styled } from '../mixins/tailwind.mixin';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'mid-paragraph': MinidParagraph;\n }\n}\n\n/**\n * A paragraph\n */\n@customElement('mid-paragraph')\nexport class MinidParagraph extends styled(LitElement) {\n /**\n * `'xs' = 14px`\n * `'sm' = 16px`\n * `'md' = 18px`\n * `'lg' = 21px`\n * @default 'md'\n */\n @property()\n size: 'xs' | 'sm' | 'md' | 'lg' = 'md';\n\n /**\n * Add margin below element\n * @default false\n */\n @property({ type: Boolean })\n spacing = false;\n\n override render() {\n return html`<p\n class=\"${classMap({\n 'fds-paragraph': true,\n 'fds-paragraph--spacing': this.spacing,\n 'fds-paragraph--xs': this.size === 'xs',\n 'fds-paragraph--sm': this.size === 'sm',\n 'fds-paragraph--md': this.size === 'md',\n 'fds-paragraph--lg': this.size === 'lg',\n })}\"\n >\n <slot></slot>\n </p> `;\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAeO,IAAM,iBAAN,cAA6B,OAAO,UAAU,EAAE;AAAA,EAAhD,cAAA;AAAA,UAAA,GAAA,SAAA;AAS6B,SAAA,OAAA;AAOxB,SAAA,UAAA;AAAA,EAAA;AAAA,EAED,SAAS;AACT,WAAA;AAAA,eACI,SAAS;AAAA,MAChB,iBAAiB;AAAA,MACjB,0BAA0B,KAAK;AAAA,MAC/B,qBAAqB,KAAK,SAAS;AAAA,MACnC,qBAAqB,KAAK,SAAS;AAAA,MACnC,qBAAqB,KAAK,SAAS;AAAA,MACnC,qBAAqB,KAAK,SAAS;AAAA,IAAA,CACpC,CAAC;AAAA;AAAA;AAAA;AAAA,EAAA;AAKR;AAvBE,gBAAA;AAAA,EADC,SAAS;AAAA,GARC,eASX,WAAA,QAAA,CAAA;AAOA,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,QAAS,CAAA;AAAA,GAfhB,eAgBX,WAAA,WAAA,CAAA;AAhBW,iBAAN,gBAAA;AAAA,EADN,cAAc,eAAe;AAAA,GACjB,cAAA;"}
1
+ {"version":3,"file":"paragraph.js","sources":["../../src/components/paragraph.component.ts"],"sourcesContent":["import { html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { styled } from '../mixins/tailwind.mixin';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'mid-paragraph': MinidParagraph;\n }\n}\n\n/**\n * A paragraph\n */\n@customElement('mid-paragraph')\nexport class MinidParagraph extends styled(LitElement) {\n /**\n * `'xs' = 14px`\n * `'sm' = 16px`\n * `'md' = 18px`\n * `'lg' = 21px`\n * @default 'md'\n */\n @property()\n size: 'xs' | 'sm' | 'md' | 'lg' = 'md';\n\n /**\n * Add margin below element\n * @default false\n */\n @property({ type: Boolean })\n spacing = false;\n\n override render() {\n return html`<p\n class=\"${classMap({\n 'mb-2': this.spacing,\n 'text-body-xs': this.size === 'xs',\n 'text-body-sm': this.size === 'sm',\n 'text-body-md': this.size === 'md',\n 'text-body-lg': this.size === 'lg',\n })}\"\n >\n <slot></slot>\n </p> `;\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAeO,IAAM,iBAAN,cAA6B,OAAO,UAAU,EAAE;AAAA,EAAhD,cAAA;AAAA,UAAA,GAAA,SAAA;AAS6B,SAAA,OAAA;AAOxB,SAAA,UAAA;AAAA,EAAA;AAAA,EAED,SAAS;AACT,WAAA;AAAA,eACI,SAAS;AAAA,MAChB,QAAQ,KAAK;AAAA,MACb,gBAAgB,KAAK,SAAS;AAAA,MAC9B,gBAAgB,KAAK,SAAS;AAAA,MAC9B,gBAAgB,KAAK,SAAS;AAAA,MAC9B,gBAAgB,KAAK,SAAS;AAAA,IAAA,CAC/B,CAAC;AAAA;AAAA;AAAA;AAAA,EAAA;AAKR;AAtBE,gBAAA;AAAA,EADC,SAAS;AAAA,GARC,eASX,WAAA,QAAA,CAAA;AAOA,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,QAAS,CAAA;AAAA,GAfhB,eAgBX,WAAA,WAAA,CAAA;AAhBW,iBAAN,gBAAA;AAAA,EADN,cAAc,eAAe;AAAA,GACjB,cAAA;"}
@@ -1,5 +1,6 @@
1
1
  import { LitElement } from 'lit';
2
2
  import { CountryCode } from 'libphonenumber-js';
3
+ import { HasSlotController } from '../internal/slot';
3
4
  declare global {
4
5
  interface HTMLElementTagNameMap {
5
6
  'mid-phone-input': MinidPhoneInput;
@@ -14,16 +15,14 @@ declare const MinidPhoneInput_base: typeof LitElement & import('../types/mixin-c
14
15
  * @event {Event} mid-focus - Emitted after input gains focus
15
16
  *
16
17
  * @part base - Select the container outside the country button and phone number input
17
- * @part form-control - Select the container around the label and the inputs
18
+ * @part field - Select the container around the label and the inputs
18
19
  * @part label - Select the label element
19
20
  * @part country-button - Select the country button
20
21
  * @part input - Select the phone number input
21
22
  */
22
23
  export declare class MinidPhoneInput extends MinidPhoneInput_base {
23
24
  #private;
24
- /**
25
- * @ignore
26
- */
25
+ hasSlotControler: HasSlotController;
27
26
  input: HTMLInputElement;
28
27
  /**
29
28
  * The value of the phone number in E.164 format. Example: `"+4799999999"`
@@ -1 +1 @@
1
- {"version":3,"file":"phone-input.component.d.ts","sourceRoot":"","sources":["../../src/components/phone-input.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAW,MAAM,KAAK,CAAC;AAIrD,OAAO,EAIL,WAAW,EAEZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,uBAAuB,CAAC;AAU/B,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,iBAAiB,EAAE,eAAe,CAAC;KACpC;CACF;;AAuCD;;;;;;;;;;;;GAYG;AACH,qBACa,eAAgB,SAAQ,oBAEpC;;IAMC;;OAEG;IAEH,KAAK,EAAG,gBAAgB,CAAC;IAEzB;;;OAGG;IAEH,KAAK,SAAM;IAEX;;OAEG;IAEH,cAAc,SAAM;IAEpB;;OAEG;IAEH,WAAW,SAAM;IAEjB;;;OAGG;IAEH,KAAK,SAAM;IAEX;;OAEG;IAEH,SAAS,UAAS;IAElB;;OAEG;IAEH,OAAO,CAAC,EAAE,WAAW,CAAC;IAGtB,QAAQ,UAAS;IAEjB,kBAAkB;IAMlB,oBAAoB,CAAC,KAAK,EAAE,aAAa;IAQzC,iBAAiB,IAAI,IAAI;IAkBzB,IAAI,aAAa,yCAEhB;IAED,IAAI,cAAc,0CAEjB;IAED,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,QAAQ;IAkBhB,OAAO,CAAC,mBAAmB,CAkBzB;IAEF,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,iBAAiB;IAUzB,KAAK;IAWL,mBAAmB;IAmBV,MAAM;CA8EhB"}
1
+ {"version":3,"file":"phone-input.component.d.ts","sourceRoot":"","sources":["../../src/components/phone-input.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAE,MAAM,KAAK,CAAC;AAI5C,OAAO,EAIL,WAAW,EAEZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,uBAAuB,CAAC;AAS/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,iBAAiB,EAAE,eAAe,CAAC;KACpC;CACF;;AAUD;;;;;;;;;;;;GAYG;AACH,qBACa,eAAgB,SAAQ,oBAEpC;;IAKC,gBAAgB,oBAAwC;IAGxD,KAAK,EAAG,gBAAgB,CAAC;IAEzB;;;OAGG;IAEH,KAAK,SAAM;IAEX;;OAEG;IAEH,cAAc,SAAM;IAEpB;;OAEG;IAEH,WAAW,SAAM;IAEjB;;;OAGG;IAEH,KAAK,SAAM;IAEX;;OAEG;IAEH,SAAS,UAAS;IAElB;;OAEG;IAEH,OAAO,CAAC,EAAE,WAAW,CAAC;IAGtB,QAAQ,UAAS;IAEjB,kBAAkB;IAMlB,oBAAoB,CAAC,KAAK,EAAE,aAAa;IAQzC,iBAAiB,IAAI,IAAI;IAkBzB,IAAI,aAAa,yCAEhB;IAED,IAAI,cAAc,0CAEjB;IAED,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,QAAQ;IAkBhB,OAAO,CAAC,mBAAmB,CAkBzB;IAEF,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,iBAAiB;IAUzB,KAAK;IAWL,mBAAmB;IAmBV,MAAM;CAiEhB"}
@@ -1,4 +1,4 @@
1
- import { css, LitElement, nothing, html } from "lit";
1
+ import { css, LitElement, html } from "lit";
2
2
  import { query, property, state, customElement } from "lit/decorators.js";
3
3
  import { classMap } from "lit/directives/class-map.js";
4
4
  import { styled } from "../mixins/tailwind.mixin.js";
@@ -7,6 +7,7 @@ import "./icon/icon.js";
7
7
  import { templateParser, templateFormatter, onKeyDown, onChange } from "input-format";
8
8
  import { watch } from "../internal/watch.js";
9
9
  import { FormControllerMixin } from "../mixins/form-controller.mixin.js";
10
+ import { HasSlotController } from "../internal/slot.js";
10
11
  var __defProp = Object.defineProperty;
11
12
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
12
13
  var __typeError = (msg) => {
@@ -28,36 +29,7 @@ var _formatter, _skipCountryUpdate, _currentEvent, _currentTemplate;
28
29
  const styles = [
29
30
  css`
30
31
  :host {
31
- display: flex;
32
- }
33
-
34
- .country-code,
35
- .phone-number {
36
- outline: none;
37
- box-shadow: none;
38
- background-color: transparent;
39
- }
40
-
41
- .phone-number {
42
- border-top-left-radius: 0;
43
- border-bottom-left-radius: 0;
44
- }
45
-
46
- .country-code {
47
- border-right: 1px solid currentColor;
48
- }
49
-
50
- .country-button {
51
- border: 1px solid var(--fds-semantic-border-input-default);
52
- border-right: 0;
53
- border-top-left-radius: var(--fds-border_radius-medium);
54
- border-bottom-left-radius: var(--fds-border_radius-medium);
55
- }
56
-
57
- .fds-focus:focus-within,
58
- .fds-focus:focus-visible {
59
- outline: none;
60
- box-shadow: 0 0 0 3px #00347d;
32
+ display: block;
61
33
  }
62
34
  `
63
35
  ];
@@ -70,6 +42,7 @@ let MinidPhoneInput = class extends FormControllerMixin(
70
42
  __privateAdd(this, _skipCountryUpdate, false);
71
43
  __privateAdd(this, _currentEvent, new Event(""));
72
44
  __privateAdd(this, _currentTemplate, "");
45
+ this.hasSlotControler = new HasSlotController(this, "label");
73
46
  this.value = "";
74
47
  this.nationalnumber = "";
75
48
  this.countrycode = "";
@@ -209,41 +182,29 @@ let MinidPhoneInput = class extends FormControllerMixin(
209
182
  const lg = false;
210
183
  const md = true;
211
184
  const sm = false;
185
+ const hasLabelSlot = this.hasSlotControler.test("label");
186
+ const hasLabel = !!this.label || !!hasLabelSlot;
212
187
  return html`
213
188
  <div
214
- part="form-control"
189
+ part="field"
215
190
  class="${classMap({
216
- "form-control": true,
217
- "fds-paragraph": true,
218
- "fds-textfield": true,
219
- "flex-1": true,
220
- "fds-paragraph--sm": sm,
221
- "fds-paragraph--md": md,
222
- "fds-paragraph--lg": lg,
223
- "fds-textfield--sm": sm,
224
- "fds-textfield--md": md,
225
- "fds-textfield--lg": lg
226
- })}"
191
+ "text-body-sm": sm,
192
+ "text-body-md": md,
193
+ "text-body-lg": lg
194
+ })} grow"
227
195
  >
228
- ${!this.label ? nothing : html`<label
229
- part="label"
230
- for="input"
231
- class="${classMap({
232
- "sr-only": this.hidelabel,
233
- "fds-label": true,
234
- "fds-label--medium-weight": true,
235
- "fds-textfield__label": true,
236
- "fds-label--sm": sm,
237
- "fds-label--md": md,
238
- "fds-label--lg": lg
239
- })}"
240
- >
241
- ${this.label}
242
- </label>`}
243
- <div part="base" class="flex">
196
+ <label
197
+ for="input"
198
+ class="${classMap({
199
+ "sr-only": this.hidelabel || !hasLabel
200
+ })} mb-2 inline-flex items-center gap-1 font-medium"
201
+ >
202
+ <slot name="label"> ${this.label} </slot>
203
+ </label>
204
+ <div part="base" class="flex h-12">
244
205
  <button
245
206
  part="country-button"
246
- class="country-button fds-focus flex h-full items-center border pl-3"
207
+ class="border-neutral focus-visible:focus-ring flex h-full items-center rounded-l border border-r-0 pl-3"
247
208
  iconstyled
248
209
  variant="tertiary"
249
210
  @click=${this.handleCountryClick}
@@ -263,7 +224,7 @@ let MinidPhoneInput = class extends FormControllerMixin(
263
224
 
264
225
  <input
265
226
  id="input"
266
- class="phone-number fds-textfield__field fds-textfield__input fds-focus"
227
+ class="border-neutral p focus-visible:focus-ring grow rounded-r border px-3"
267
228
  part="phone-number"
268
229
  type="tel"
269
230
  autocomplete="tel"
@@ -284,7 +245,7 @@ _skipCountryUpdate = /* @__PURE__ */ new WeakMap();
284
245
  _currentEvent = /* @__PURE__ */ new WeakMap();
285
246
  _currentTemplate = /* @__PURE__ */ new WeakMap();
286
247
  __decorateClass([
287
- query(".phone-number")
248
+ query("#input")
288
249
  ], MinidPhoneInput.prototype, "input", 2);
289
250
  __decorateClass([
290
251
  property({ reflect: true })