@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.
- package/dist/components/alert.component.d.ts.map +1 -1
- package/dist/components/alert.js +44 -25
- package/dist/components/alert.js.map +1 -1
- package/dist/components/button.component.d.ts +4 -5
- package/dist/components/button.component.d.ts.map +1 -1
- package/dist/components/button.js +58 -53
- package/dist/components/button.js.map +1 -1
- package/dist/components/combobox.component.d.ts +1 -13
- package/dist/components/combobox.component.d.ts.map +1 -1
- package/dist/components/combobox.js +6 -17
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/{modal.component.d.ts → dialog.component.d.ts} +15 -16
- package/dist/components/dialog.component.d.ts.map +1 -0
- package/dist/components/{modal.js → dialog.js} +41 -77
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/dropdown.component.d.ts +4 -5
- package/dist/components/dropdown.component.d.ts.map +1 -1
- package/dist/components/dropdown.js +37 -57
- package/dist/components/dropdown.js.map +1 -1
- package/dist/components/heading.component.d.ts.map +1 -1
- package/dist/components/heading.js +9 -10
- package/dist/components/heading.js.map +1 -1
- package/dist/components/helptext.component.d.ts +1 -25
- package/dist/components/helptext.component.d.ts.map +1 -1
- package/dist/components/helptext.js +20 -48
- package/dist/components/helptext.js.map +1 -1
- package/dist/components/icon/icon.component.d.ts +1 -4
- package/dist/components/icon/icon.component.d.ts.map +1 -1
- package/dist/components/icon/icon.js +3 -12
- package/dist/components/icon/icon.js.map +1 -1
- package/dist/components/link.component.d.ts +0 -4
- package/dist/components/link.component.d.ts.map +1 -1
- package/dist/components/link.js +3 -22
- package/dist/components/link.js.map +1 -1
- package/dist/components/menu-item.component.d.ts +0 -3
- package/dist/components/menu-item.component.d.ts.map +1 -1
- package/dist/components/menu-item.js +25 -57
- package/dist/components/menu-item.js.map +1 -1
- package/dist/components/menu.component.d.ts +2 -11
- package/dist/components/menu.component.d.ts.map +1 -1
- package/dist/components/menu.js +12 -48
- package/dist/components/menu.js.map +1 -1
- package/dist/components/paragraph.component.d.ts.map +1 -1
- package/dist/components/paragraph.js +5 -6
- package/dist/components/paragraph.js.map +1 -1
- package/dist/components/phone-input.component.d.ts +3 -4
- package/dist/components/phone-input.component.d.ts.map +1 -1
- package/dist/components/phone-input.js +23 -62
- package/dist/components/phone-input.js.map +1 -1
- package/dist/components/popup.component.d.ts +2 -1
- package/dist/components/popup.component.d.ts.map +1 -1
- package/dist/components/popup.js +4 -0
- package/dist/components/popup.js.map +1 -1
- package/dist/components/radio-button.component.d.ts +0 -3
- package/dist/components/radio-button.component.d.ts.map +1 -1
- package/dist/components/radio-button.js.map +1 -1
- package/dist/components/radio.component.d.ts +0 -3
- package/dist/components/radio.component.d.ts.map +1 -1
- package/dist/components/radio.js +2 -5
- package/dist/components/radio.js.map +1 -1
- package/dist/components/textfield.component.d.ts +6 -29
- package/dist/components/textfield.component.d.ts.map +1 -1
- package/dist/components/textfield.js +55 -131
- package/dist/components/textfield.js.map +1 -1
- package/dist/components/tooltip.component.d.ts +4 -37
- package/dist/components/tooltip.component.d.ts.map +1 -1
- package/dist/components/tooltip.js +18 -34
- package/dist/components/tooltip.js.map +1 -1
- package/dist/designsystemet-tailwind.css +293 -474
- package/dist/index.css +0 -1355
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -5
- package/dist/index.js.map +1 -1
- package/dist/mixins/tailwind.mixin.d.ts.map +1 -1
- package/dist/mixins/tailwind.mixin.js +3 -4
- package/dist/mixins/tailwind.mixin.js.map +1 -1
- package/dist/types/animation-name.d.ts +1 -1
- package/dist/types/animation-name.d.ts.map +1 -1
- package/dist/utilities/country-labels-no.d.ts +4 -0
- package/dist/utilities/country-labels-no.d.ts.map +1 -0
- package/dist/utilities/{countries.js → country-labels-no.js} +3 -3
- package/dist/utilities/{countries.js.map → country-labels-no.js.map} +1 -1
- package/package.json +10 -4
- package/dist/components/modal.component.d.ts.map +0 -1
- package/dist/components/modal.js.map +0 -1
- package/dist/utilities/countries.d.ts +0 -3
- 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 {
|
|
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;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu-item.component.d.ts","sourceRoot":"","sources":["../../src/components/menu-item.component.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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 {
|
|
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
|
|
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;
|
|
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"}
|
package/dist/components/menu.js
CHANGED
|
@@ -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
|
-
|
|
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="
|
|
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="
|
|
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
|
|
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;
|
|
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
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
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 '
|
|
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
|
|
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,
|
|
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,
|
|
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:
|
|
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="
|
|
189
|
+
part="field"
|
|
215
190
|
class="${classMap({
|
|
216
|
-
"
|
|
217
|
-
"
|
|
218
|
-
"
|
|
219
|
-
|
|
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
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
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="
|
|
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="
|
|
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("
|
|
248
|
+
query("#input")
|
|
288
249
|
], MinidPhoneInput.prototype, "input", 2);
|
|
289
250
|
__decorateClass([
|
|
290
251
|
property({ reflect: true })
|