nve-designsystem 2.9.0 → 2.10.0

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.
@@ -1,53 +1,70 @@
1
- import { i as r } from "../../chunks/lit-element.js";
2
- const t = r`
3
- :host {
4
- --header-spacing: var(--spacing-x-large, 2rem);
5
- --body-spacing: var(--spacing-x-large, 2rem);
6
- --footer-spacing: var(--spacing-x-large, 2rem);
7
- --width: 40.625rem;
8
- }
1
+ import { i as o } from "../../chunks/lit-element.js";
2
+ const e = o`
3
+ :host {
4
+ --header-spacing: var(--spacing-x-large, 2rem);
5
+ --body-spacing: var(--spacing-x-large, 2rem);
6
+ --footer-spacing: var(--spacing-x-large, 2rem);
7
+ --width: 40.625rem;
8
+ }
9
9
 
10
- :host::part(footer), ::slotted([slot="footer"]) {
11
- display: flex;
12
- text-align: left;
13
- gap: 0.75rem;
10
+ :host::part(footer),
11
+ ::slotted([slot='footer']) {
12
+ display: flex;
13
+ text-align: left;
14
+ gap: 0.75rem;
15
+ }
16
+ :host::part(title),
17
+ ::slotted([slot='title']) {
18
+ display: flex;
19
+ align-items: center;
20
+ gap: 0.5rem;
21
+ position: relative;
22
+ color: var(--neutrals-foreground-primary, #00131c);
23
+ font: var(--header-small);
24
+ line-height: 130%;
25
+ padding: var(--spacing-x-large, 2rem);
26
+ }
14
27
 
15
- }
16
- :host::part(title), ::slotted([slot="title"]) {
17
- display: flex;
18
- align-items: center;
19
- gap: 0.5rem;
20
- position: relative;
21
- color: var(--neutrals-foreground-primary, #00131C);
22
- font: var(--header-small);
23
- line-height: 130%;
24
- padding: var(--spacing-x-large, 2rem);
25
- }
28
+ .dialog__title::before {
29
+ font-family: 'Material Symbols Sharp';
30
+ content: var(--title-icon);
31
+ }
26
32
 
27
- :host::part(title)::before {
28
- font-family: 'Material Symbols Outlined';
29
- content: var(--title-icon);
30
- }
33
+ .dialog__header-actions sl-icon-button,
34
+ .dialog__header-actions ::slotted(sl-icon-button) {
35
+ color: var(--neutrals-foreground-primary, #00131c);
36
+ font-family: Source Sans Pro;
37
+ font-size: 1.3rem;
38
+ font-style: normal;
39
+ font-weight: bold;
40
+ }
31
41
 
32
- .dialog__header-actions sl-icon-button, .dialog__header-actions ::slotted(sl-icon-button) {
33
- color: var(--neutrals-foreground-primary, #00131C);
34
- font-family: Source Sans Pro;
35
- font-size: 1.3rem;
36
- font-style: normal;
37
- font-weight: bold;
38
- }
42
+ :host::part(body),
43
+ ::slotted([slot='body']) {
44
+ color: var(--neutrals-foreground-primary, #00131c);
45
+ font: var(--body-medium-default);
46
+ line-height: 150%;
47
+ padding: 0 var(--spacing-x-large, 2rem) 0 var(--spacing-x-large, 2rem);
48
+ }
39
49
 
40
- :host::part(body), ::slotted([slot="body"]) {
41
- color: var(--neutrals-foreground-primary, #00131C);
42
- font: var(--body-medium-default);
43
- line-height: 150%;
44
- padding: 0 var(--spacing-x-large, 2rem) 0 var(--spacing-x-large, 2rem);
45
- }
50
+ .dialog__overlay {
51
+ background-color: rgba(13, 13, 14, 0.4);
52
+ }
46
53
 
47
- .dialog__overlay {
48
- background-color: rgba(13, 13, 14, 0.40);
49
- }
54
+ .dialog__header-actions nve-button,
55
+ .dialog__header-actions ::slotted(nve-button) {
56
+ flex: 0 0 auto;
57
+ display: flex;
58
+ align-items: center;
59
+ font-size: var(--sl-font-size-medium);
60
+ }
61
+
62
+ .dialog:not(.dialog--has-footer) {
63
+ .dialog__body {
64
+ padding-bottom: var(--body-spacing);
65
+ }
66
+ }
50
67
  `;
51
68
  export {
52
- t as default
69
+ e as default
53
70
  };
@@ -28,7 +28,7 @@ export default class NveDialog extends SlDialog {
28
28
  * Metoden søker først etter tittel-elementet i komponentens skygge-DOM.
29
29
  * Hvis tittel-elementet finnes og `icon`-egenskapen er satt, oppdateres
30
30
  * tittel-elementets stil for å inkludere det angitte ikonet.
31
- * Hvis `icon`-egenskapen ikke er satt, settes ikoninnholdet til 'none'
31
+ * Hvis `icon`-egenskapen ikke er satt, settes ikoninnholdet til null
32
32
  * for å unngå å skape unødvendig mellomrom i layouten.
33
33
  */
34
34
  updateIcon(): void;
@@ -5,10 +5,10 @@ import "../../chunks/chunk.YHLNUJ7P.js";
5
5
  import "../../chunks/chunk.4TUIT776.js";
6
6
  import { n as c, t as d } from "../../chunks/property.js";
7
7
  import u from "./nve-dialog-styles.js";
8
- var f = Object.defineProperty, h = Object.getOwnPropertyDescriptor, a = (e, o, i, r) => {
9
- for (var t = r > 1 ? void 0 : r ? h(o, i) : o, l = e.length - 1, n; l >= 0; l--)
10
- (n = e[l]) && (t = (r ? n(o, i, t) : n(t)) || t);
11
- return r && t && f(o, i, t), t;
8
+ var f = Object.defineProperty, h = Object.getOwnPropertyDescriptor, n = (e, o, l, r) => {
9
+ for (var t = r > 1 ? void 0 : r ? h(o, l) : o, i = e.length - 1, a; i >= 0; i--)
10
+ (a = e[i]) && (t = (r ? a(o, l, t) : a(t)) || t);
11
+ return r && t && f(o, l, t), t;
12
12
  };
13
13
  let s = class extends p {
14
14
  constructor() {
@@ -28,25 +28,25 @@ let s = class extends p {
28
28
  * Metoden søker først etter tittel-elementet i komponentens skygge-DOM.
29
29
  * Hvis tittel-elementet finnes og `icon`-egenskapen er satt, oppdateres
30
30
  * tittel-elementets stil for å inkludere det angitte ikonet.
31
- * Hvis `icon`-egenskapen ikke er satt, settes ikoninnholdet til 'none'
31
+ * Hvis `icon`-egenskapen ikke er satt, settes ikoninnholdet til null
32
32
  * for å unngå å skape unødvendig mellomrom i layouten.
33
33
  */
34
34
  updateIcon() {
35
35
  const e = this.shadowRoot?.querySelector(".dialog__title");
36
36
  if (e instanceof HTMLElement) {
37
- const o = this.icon ? `"${this.icon}"` : "none";
37
+ const o = this.icon ? `"${this.icon}"` : null;
38
38
  e.style.setProperty("--title-icon", o);
39
39
  }
40
40
  }
41
41
  };
42
42
  s.styles = [p.styles, u];
43
- a([
43
+ n([
44
44
  c({ type: String, reflect: !0 })
45
45
  ], s.prototype, "icon", 2);
46
- a([
46
+ n([
47
47
  c({ type: Boolean, reflect: !0 })
48
48
  ], s.prototype, "disableBackground", 2);
49
- s = a([
49
+ s = n([
50
50
  d("nve-dialog")
51
51
  ], s);
52
52
  export {
@@ -0,0 +1,34 @@
1
+ import { LitElement } from 'lit';
2
+ import { INveComponent } from '../../interfaces/NveComponent.interface';
3
+ /**
4
+ * En fane som kan brukes i en nve-tab-group.
5
+ * Fane har ingen egen utforming, den viser kun det som er inni.
6
+ * Hvis ikke angitt får fanen en unik id som kan brukes for å referere til den automatisk.
7
+ * @slot (prefix) - legg inn innhold som skal vises før hovedinnholdet
8
+ * @slot (standard) - legg inn fane teksten
9
+ * @slot (suffix) - legg inn innhold som skal vises etter hovedinnholdet
10
+ *
11
+ * @csspart base Topp-element
12
+ */
13
+ export default class NveTab extends LitElement implements INveComponent {
14
+ testId: string | undefined;
15
+ /** Navn på panelet, brukes for å referere til fanen i tab-gruppen */
16
+ panel: string | null;
17
+ /** Fane størrelse */
18
+ size: 'large' | 'small';
19
+ /** Om fanen skal ha bakgrunn */
20
+ background: boolean;
21
+ /** @internal */
22
+ private readonly attrId;
23
+ /** @internal */
24
+ private readonly componentId;
25
+ static styles: import('lit').CSSResult[];
26
+ connectedCallback(): void;
27
+ constructor();
28
+ render(): import('lit-html').TemplateResult<1>;
29
+ }
30
+ declare global {
31
+ interface HTMLElementTagNameMap {
32
+ 'nve-tab': NveTab;
33
+ }
34
+ }
@@ -0,0 +1,48 @@
1
+ import { a as d, x as c } from "../../chunks/lit-element.js";
2
+ import { n as a, t as b } from "../../chunks/property.js";
3
+ import h from "./nve-tab.styles.js";
4
+ import { e as u } from "../../chunks/class-map.js";
5
+ var f = Object.defineProperty, m = Object.getOwnPropertyDescriptor, r = (p, s, i, o) => {
6
+ for (var t = o > 1 ? void 0 : o ? m(s, i) : s, l = p.length - 1, n; l >= 0; l--)
7
+ (n = p[l]) && (t = (o ? n(s, i, t) : n(t)) || t);
8
+ return o && t && f(s, i, t), t;
9
+ };
10
+ let v = 0, e = class extends d {
11
+ constructor() {
12
+ super(), this.testId = void 0, this.panel = null, this.size = "large", this.background = !1, this.attrId = ++v, this.componentId = `nve-tab-${this.attrId}`, this.id = this.id.length > 0 ? this.id : this.componentId;
13
+ }
14
+ connectedCallback() {
15
+ super.connectedCallback(), this.setAttribute("role", "tab");
16
+ }
17
+ render() {
18
+ return c`
19
+ <div
20
+ part="base"
21
+ class=${u({ tab: !0, "tab--large": this.size === "large", "tab--background": this.background })}
22
+ >
23
+ <slot name="prefix"></slot>
24
+ <slot></slot>
25
+ <slot name="suffix"></slot>
26
+ </div>
27
+ `;
28
+ }
29
+ };
30
+ e.styles = [h];
31
+ r([
32
+ a({ type: String })
33
+ ], e.prototype, "testId", 2);
34
+ r([
35
+ a({ type: String })
36
+ ], e.prototype, "panel", 2);
37
+ r([
38
+ a({ type: String })
39
+ ], e.prototype, "size", 2);
40
+ r([
41
+ a({ type: Boolean })
42
+ ], e.prototype, "background", 2);
43
+ e = r([
44
+ b("nve-tab")
45
+ ], e);
46
+ export {
47
+ e as default
48
+ };
@@ -0,0 +1,2 @@
1
+ declare const _default: import('lit').CSSResult;
2
+ export default _default;
@@ -0,0 +1,77 @@
1
+ import { i as r } from "../../chunks/lit-element.js";
2
+ const e = r`
3
+ :host {
4
+ --border-bottom: 2px;
5
+ display: flex;
6
+ }
7
+
8
+ :host(:focus-visible) {
9
+ outline: none;
10
+ }
11
+
12
+ :host(:focus-visible) .tab {
13
+ outline: 2px solid var(--interactive-outlined-border-focus);
14
+ outline-offset: -12px;
15
+ }
16
+
17
+ .tab {
18
+ display: flex;
19
+ min-width: 100px;
20
+ padding: 11px 0px;
21
+ text-align: center;
22
+ width: fit-content;
23
+ flex-direction: row;
24
+ align-items: center;
25
+ justify-content: center;
26
+ gap: var(--spacing-xx-small);
27
+ border-radius: var(--border-radius-small) var(--border-radius-small) var(--border-radius-none)
28
+ var(--border-radius-none);
29
+ border-bottom: 2px solid transparent;
30
+ color: var(--neutrals-foreground-primary);
31
+ font: var(--label-medium);
32
+ cursor: pointer;
33
+ transition:
34
+ border-color 0.3s ease-in-out,
35
+ background 0.3s ease-in-out,
36
+ color 0.3s ease-in-out;
37
+ }
38
+
39
+ @media (prefers-reduced-motion: reduce) {
40
+ .tab {
41
+ border-bottom: 2px solid var(--brand-primary);
42
+ }
43
+ }
44
+
45
+ .tab--large {
46
+ padding: 18px 8px;
47
+ font: var(--label-medium);
48
+ }
49
+
50
+ .tab--background {
51
+ background: var(--neutrals-background-primary);
52
+ border-bottom: var(--border-bottom) solid transparent;
53
+ }
54
+
55
+ :host([aria-selected='false']) .tab {
56
+ border-bottom: var(--border-bottom) solid var(--neutrals-border-subtle);
57
+ font: var(--label-medium-light);
58
+ color: var(--neutrals-foreground-muted);
59
+ }
60
+
61
+ :host([aria-selected='false']) .tab:hover {
62
+ border-bottom: var(--border-bottom) solid var(--neutrals-border-default);
63
+ }
64
+
65
+ :host([aria-selected='false']) .tab.tab--background:hover {
66
+ border-bottom: var(--border-bottom) solid var(--neutrals-border-default);
67
+ }
68
+
69
+ :host([aria-selected='false']) .tab.tab--background {
70
+ background: var(--neutrals-background-secondary);
71
+ font: var(--label-medium-light);
72
+ color: var(--neutrals-foreground-muted);
73
+ }
74
+ `;
75
+ export {
76
+ e as default
77
+ };
@@ -0,0 +1,131 @@
1
+ import { LitElement } from 'lit';
2
+ import { INveComponent } from '../../interfaces/NveComponent.interface';
3
+ /**
4
+ * Fanegruppe som viser og styrer et sett med faner og tilhørende innholdspaneler.
5
+ * Håndterer navigasjon mellom faner, synkronisering av aktive faner og paneler, samt tilgjengelighetsegenskaper.
6
+ * Sporet 'nav' brukes for å legge til faner, og standardsporet brukes for innholdspaneler. Foreløpig støttes kun horisontal retning på fanene.
7
+ * Automatisk aktivering av faner (når man blar mellom fanene med tastatur) støttes ikke – det kan være uheldig fra et tilgjengelighetsperspektiv.
8
+ * For beste praksis, les mer i seksjonen om universell utforming.
9
+ *
10
+ * @event nve-tab-change Når aktiv fane endres.
11
+ *
12
+ * @csspart base Topp-element
13
+ * @csspart body Innholdet i tab gruppen
14
+ * @csspart button-backward-base Bakoverknapp kontainer
15
+ * @csspart button-forward-base Fremoverknapp kontainer
16
+ *
17
+ * @slot (nav) - legg inn faner her.
18
+ * @slot (standard) - legg inn paneler her.
19
+ * @cssproperty --scroll-button-background - farge på bakover og fremoverknappene. Standard er #fff og #1b1b1f for dark modus.
20
+ */
21
+ export default class NveTabGroup extends LitElement implements INveComponent {
22
+ testId: string | undefined;
23
+ /** Om tab gruppen skal ha bakgrunnsfarge */
24
+ background: boolean;
25
+ /** Størrelse på tab gruppen */
26
+ size: 'small' | 'large';
27
+ /** Den aktive fanen i tab gruppen */
28
+ activeTab: string | null;
29
+ /**
30
+ * @internal
31
+ * Om det er overflow i tab gruppen og bruker må scrolle */
32
+ private isOverflow;
33
+ /**
34
+ * @internal
35
+ * Om det er mulig å scrolle tilbake */
36
+ private canScrollBack;
37
+ /**
38
+ * @internal
39
+ * Om det er mulig å scrolle fremover */
40
+ private canScrollForward;
41
+ /**
42
+ * @internal
43
+ * Om tab-gruppe eller noen av tabbene har background egenskap som true */
44
+ private isBackground;
45
+ /** @internal */
46
+ private tabs;
47
+ /** @internal */
48
+ private panels;
49
+ /** @internal */
50
+ private resizeObserver?;
51
+ /** @internal */
52
+ private buttonContainerWidth;
53
+ static styles: import('lit').CSSResult[];
54
+ firstUpdated(): void;
55
+ updated(changedProps: Map<string, unknown>): Promise<void>;
56
+ connectedCallback(): void;
57
+ disconnectedCallback(): void;
58
+ constructor();
59
+ /**
60
+ * @internal
61
+ * Håndterer klikk på faner i tab gruppen.
62
+ * Setter aktiv fane basert på klikket element.
63
+ * @param event Klikkeventet.
64
+ */
65
+ handleClick(event: MouseEvent): void;
66
+ /**
67
+ * @internal
68
+ * Håndterer tastetrykk på faner i tab gruppen.
69
+ * Setter aktiv fane basert på tastetrykket.
70
+ * @param event Tastetrykk eventet.
71
+ */
72
+ handleKeyDown(event: KeyboardEvent): void;
73
+ /**
74
+ * Henter alle paneler i tab gruppen.
75
+ * @returns En liste over alle paneler i tab gruppen.
76
+ */
77
+ private getPanels;
78
+ /**
79
+ * Henter alle faner i tab gruppen.
80
+ * @returns En liste over alle faner i tab gruppen.
81
+ */
82
+ private getTabs;
83
+ /** Setter aria-selected og tabindex på fanene. Kun aktiv fane skal bli fokusert. Gjemmer inaktive paneller.
84
+ * Sender en nve-tab-change event med navnet på den aktive fanen.
85
+ * @param panelName Navnet på panelet som skal aktiveres.
86
+ */
87
+ private setActiveTab;
88
+ private updateIndicator;
89
+ /**
90
+ * Setter aria-controls og aria-labelledby attributter på faner og paneler.
91
+ * Dette er viktig for tilgjengelighet slik at skjermlesere kan forstå sammenhengen mellom faner og deres tilhørende paneler.
92
+ */
93
+ private setAriaLabels;
94
+ /**
95
+ * Oppdaterer faner og paneler i tab gruppen.
96
+ * Kalles når komponenten oppdateres eller når faner/paneler endres.
97
+ */
98
+ private syncTabsAndPanels;
99
+ /**
100
+ * Fjerner tabindex fra fremover scroll-knappen.
101
+ */
102
+ private removeTabIndexFromForwardScrollButton;
103
+ /**
104
+ * Fjerner tabindex fra bakover scroll-knappen.
105
+ */
106
+ private removeTabIndexFromBackwardScrollButton;
107
+ /**
108
+ * Sjekker om tab gruppen har overflow og oppdaterer tilstanden for scroll knappene.
109
+ * Kalles ved endring av størrelse på tab gruppen.
110
+ */
111
+ private checkOverflow;
112
+ /**
113
+ * Oppdaterer tilstanden for scroll knappene basert på gjeldende scroll posisjon.
114
+ * Kalles når brukeren scroller i tab gruppen.
115
+ */
116
+ private updateScrollState;
117
+ /**
118
+ * Ruller navigasjonslisten fremover. Flytter den siste fanen som er full synlig (den blir den første nå).
119
+ */
120
+ private scrollNavForward;
121
+ /**
122
+ * Ruller navigasjonslisten bakover. Flytter den første fanen som er full synlig (den blir den første nå).
123
+ */
124
+ private scrollNavBackward;
125
+ render(): import('lit-html').TemplateResult<1>;
126
+ }
127
+ declare global {
128
+ interface HTMLElementTagNameMap {
129
+ 'nve-tab-group': NveTabGroup;
130
+ }
131
+ }