From 900fb21e28f14f44127ec2ce9ba0a78707aafecb Mon Sep 17 00:00:00 2001 From: malingranly Date: Fri, 22 May 2026 15:33:42 +0200 Subject: [PATCH 01/15] feature(nve-layout): layoutkomponenter --- doc-site/.vitepress/config.mts | 16 ++++++++++++++++ doc-site/layout/box-layout.md | 1 + doc-site/layout/center-layout.md | 1 + doc-site/layout/cluster-layout.md | 1 + doc-site/layout/columnist-layout.md | 1 + doc-site/layout/cover-layout.md | 1 + doc-site/layout/grid-layout.md | 1 + doc-site/layout/layout-oversikt.md | 21 +++++++++++++++++++++ doc-site/layout/sidebar-layout.md | 1 + doc-site/layout/stack-layout.md | 1 + doc-site/layout/wrapper-layout.md | 1 + 11 files changed, 46 insertions(+) create mode 100644 doc-site/layout/box-layout.md create mode 100644 doc-site/layout/center-layout.md create mode 100644 doc-site/layout/cluster-layout.md create mode 100644 doc-site/layout/columnist-layout.md create mode 100644 doc-site/layout/cover-layout.md create mode 100644 doc-site/layout/grid-layout.md create mode 100644 doc-site/layout/layout-oversikt.md create mode 100644 doc-site/layout/sidebar-layout.md create mode 100644 doc-site/layout/stack-layout.md create mode 100644 doc-site/layout/wrapper-layout.md diff --git a/doc-site/.vitepress/config.mts b/doc-site/.vitepress/config.mts index c5fc43cc..ecc9f99e 100644 --- a/doc-site/.vitepress/config.mts +++ b/doc-site/.vitepress/config.mts @@ -12,6 +12,17 @@ const componentsLinks = componentFiles.map((file) => { return { text: name, link: `/components/${name}` }; }); +// Henter navn på alle filene i 'layout' mappe +const layoutFiles = fs.readdirSync(path.resolve(__dirname, '../layout')); + +// Generer sidebar layout lenker (ekskluder oversiktssida) +const layoutLinks = layoutFiles + .filter((file) => path.basename(file, path.extname(file)) !== 'layout-oversikt') + .map((file) => { + const name = path.basename(file, path.extname(file)); + return { text: name, link: `/layout/${name}` }; + }); + const figmaIcon = { svg: 'Figma.logoCreated using Figma', }; @@ -32,6 +43,7 @@ export default defineConfig({ nav: [ { text: 'Introduksjon', link: '/introduction/home' }, { text: 'Komponenter', link: `/components/Komponentoversikt.html` }, + { text: 'Layout', link: '/layout/layout-oversikt' }, { component: 'ThemeSelect' }, ], outlineTitle: 'På denne sida', @@ -74,6 +86,10 @@ export default defineConfig({ ], }, { text: 'Komponenter', items: componentsLinks }, + { + text: 'Layout', + items: [{ text: 'Layout-komponenter', link: '/layout/layout-oversikt' }, ...layoutLinks], + }, ], socialLinks: [ { icon: 'github', link: 'https://github.com/NVE/Designsystem', ariaLabel: 'Link til kildekoden i Github' }, diff --git a/doc-site/layout/box-layout.md b/doc-site/layout/box-layout.md new file mode 100644 index 00000000..2436f01e --- /dev/null +++ b/doc-site/layout/box-layout.md @@ -0,0 +1 @@ +# Box diff --git a/doc-site/layout/center-layout.md b/doc-site/layout/center-layout.md new file mode 100644 index 00000000..160a1609 --- /dev/null +++ b/doc-site/layout/center-layout.md @@ -0,0 +1 @@ +# Center diff --git a/doc-site/layout/cluster-layout.md b/doc-site/layout/cluster-layout.md new file mode 100644 index 00000000..f5e4f182 --- /dev/null +++ b/doc-site/layout/cluster-layout.md @@ -0,0 +1 @@ +# Cluster diff --git a/doc-site/layout/columnist-layout.md b/doc-site/layout/columnist-layout.md new file mode 100644 index 00000000..1ce579e7 --- /dev/null +++ b/doc-site/layout/columnist-layout.md @@ -0,0 +1 @@ +# Columnist diff --git a/doc-site/layout/cover-layout.md b/doc-site/layout/cover-layout.md new file mode 100644 index 00000000..2f4b5193 --- /dev/null +++ b/doc-site/layout/cover-layout.md @@ -0,0 +1 @@ +# Cover diff --git a/doc-site/layout/grid-layout.md b/doc-site/layout/grid-layout.md new file mode 100644 index 00000000..ee8abf42 --- /dev/null +++ b/doc-site/layout/grid-layout.md @@ -0,0 +1 @@ +# Grid diff --git a/doc-site/layout/layout-oversikt.md b/doc-site/layout/layout-oversikt.md new file mode 100644 index 00000000..58674367 --- /dev/null +++ b/doc-site/layout/layout-oversikt.md @@ -0,0 +1,21 @@ + + +Layout-komponentene er strukturelle byggeklosser basert på prinsippene fra [Every Layout](https://every-layout.dev/). +De håndterer plassering og fordeling av innhold uten å binde seg til visuell stil og kan kombineres fritt for å bygge opp sider og seksjoner. + +## Når skal du bruke layout-komponenter? + +Bruk layout-komponentene når du vil: + +- Stable elementer vertikalt med konsistent mellomrom (`stack-layout`) +- Sentrere innhold horisontalt (`center-layout`) +- Gruppere elementer horisontalt med automatisk linjebryting (`cluster-layout`) +- Bygge to-kolonne-oppsett med en fast sidespalte (`sidebar-layout`) +- Lage et responsivt rutenett (`grid-layout` / `columnist-layout`) +- Pakke inn innhold med maks-bredde og sentrering (`wrapper-layout`) +- Gi et element definert padding og bakgrunn (`box-layout`) +- Fylle tilgjengelig høyde med et fremhevet midtelement (`cover-layout`) + +## Prinsipper + +Layout-komponentene har ingen farger, fonter eller annen visuell stil – de styrer kun struktur og plassering. De er ment å kombineres, og bryr seg ikke om hva som ligger inni dem. diff --git a/doc-site/layout/sidebar-layout.md b/doc-site/layout/sidebar-layout.md new file mode 100644 index 00000000..84358119 --- /dev/null +++ b/doc-site/layout/sidebar-layout.md @@ -0,0 +1 @@ +# Sidebar diff --git a/doc-site/layout/stack-layout.md b/doc-site/layout/stack-layout.md new file mode 100644 index 00000000..71000824 --- /dev/null +++ b/doc-site/layout/stack-layout.md @@ -0,0 +1 @@ +# Stack diff --git a/doc-site/layout/wrapper-layout.md b/doc-site/layout/wrapper-layout.md new file mode 100644 index 00000000..68aefdeb --- /dev/null +++ b/doc-site/layout/wrapper-layout.md @@ -0,0 +1 @@ +# Wrapper From b69efe90005fb78bb56400d633f15438042e007c Mon Sep 17 00:00:00 2001 From: malingranly Date: Fri, 29 May 2026 16:01:35 +0200 Subject: [PATCH 02/15] lagt til box, stack og grid layout samt dokumentasjon og eksempler --- doc-site/layout/box-layout.md | 97 ++++++++- doc-site/layout/grid-layout.md | 141 +++++++++++- doc-site/layout/layout-oversikt.md | 6 +- doc-site/layout/stack-layout.md | 204 +++++++++++++++++- .../box-layout/box-layout.component.ts | 51 +++++ .../box-layout/box-layout.styles.ts | 42 ++++ .../grid-layout/grid-layout.component.ts | 56 +++++ .../grid-layout/grid-layout.styles.ts | 43 ++++ .../stack-layout/stack-layout.component.ts | 61 ++++++ .../stack-layout/stack-layout.styles.ts | 44 ++++ src/nve-designsystem.ts | 3 + 11 files changed, 744 insertions(+), 4 deletions(-) create mode 100644 src/components/box-layout/box-layout.component.ts create mode 100644 src/components/box-layout/box-layout.styles.ts create mode 100644 src/components/grid-layout/grid-layout.component.ts create mode 100644 src/components/grid-layout/grid-layout.styles.ts create mode 100644 src/components/stack-layout/stack-layout.component.ts create mode 100644 src/components/stack-layout/stack-layout.styles.ts diff --git a/doc-site/layout/box-layout.md b/doc-site/layout/box-layout.md index 2436f01e..2947644e 100644 --- a/doc-site/layout/box-layout.md +++ b/doc-site/layout/box-layout.md @@ -1 +1,96 @@ -# Box +# box-layout + +`box-layout` pakker innhold i en boks med konsistent padding. + +I de aller fleste tilfeller skal du bruke `size`. `size` er knyttet direkte til spacing-tokenene i designsystemet og sikrer at paddingen er konsistent på tvers av sider og komponenter. + +## Størrelse + +`size` setter padding rundt innholdet ved bruk av et spacing-token. Hvis `size` ikke er satt, brukes `medium` som standard. + + + +```html + +
+
+ +
+
+ +
+
+``` + +
+ +## Padding + +`padding` setter padding som en eksakt CSS-verdi. Brukes kun når du trenger en verdi som ikke finnes blant tokenene. + + + +```html + +
+
+ +
+
+ +
+
+``` + +
+ +Bruk size i stedet når du jobber med designsystemets avstander. Padding er ment for unntakstilfeller der du må ha en helt spesifikk og ikke-tokenbasert verdi. + +## Nøsting + +Bokser kan nøstes for å bygge opp et hierarki av padding. + + + +```html + + +
+
+
+``` + +
+ +## Eksempel på bruk + +En boks med konsistent padding rundt en tekst. + + + +```html + + Innhold med jevn padding rundt. + +``` + + + +Samme innhold uten `box-layout` hvor teksten ligger helt inntil kanten. + + + +```html +
+ Innhold med null padding rundt. +
+``` + +
+ +## Egenskaper + +| Egenskap | Type | Standard | Beskrivelse | +| --------- | --------------- | -------- | ----------------------------------------------------------------------------------------- | +| `size` | `BoxLayoutSize` | `medium` | Tokenbasert padding. Mapper til `--spacing-`. Autoutfylling i editoren. | +| `padding` | `string` | – | Eksakt CSS-lengde (`"12px"`, `"1.25rem"`). Skal **ikke** brukes for tokens – bruk `size`. | diff --git a/doc-site/layout/grid-layout.md b/doc-site/layout/grid-layout.md index ee8abf42..ebf85693 100644 --- a/doc-site/layout/grid-layout.md +++ b/doc-site/layout/grid-layout.md @@ -1 +1,140 @@ -# Grid +# grid-layout + +`grid-layout` lager et responsivt rutenett som automatisk bryter til nye linjer basert på en minste kolonnebredde. + +I de aller fleste tilfeller skal du bruke `size` for mellomrom. `size` er knyttet direkte til spacing-tokenene i designsystemet og sikrer at avstandene er konsistente på tvers av sider og komponenter. + +## Minste kolonnebredde + +`min` bestemmer hvor smal en kolonne kan bli før rutenettet bryter til ny linje. Standard er `250px`. + + + + + +```html +
+ +
+
+
+
+
+
+
+
+``` + +
+ +## Størrelse + +`size` setter mellomrommet mellom rutene ved bruk av et spacing-token. Hvis `size` ikke er satt, brukes `medium` som standard. + + + +```html + +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+``` + +
+ +## Mellomrom + +`gap` setter mellomrommet som en eksakt CSS-verdi. Brukes kun når du trenger en verdi som ikke finnes blant tokenene. + + + +```html + +
+
+
+
+
+``` + +
+ +Bruk size i stedet når du jobber med designsystemets avstander. Gap er ment for unntakstilfeller der du må ha en helt spesifikk og ikke-tokenbasert verdi. + +## Egenskaper + +| Egenskap | Type | Standard | Beskrivelse | +| -------- | ---------------- | -------- | ----------------------------------------------------------------------------------------- | +| `min` | `string` | `250px` | Minste kolonnebredde før rutenettet bryter til ny linje. | +| `size` | `GridLayoutSize` | `medium` | Tokenbasert mellomrom. Mapper til `--spacing-`. Autoutfylling i editoren. | +| `gap` | `string` | – | Eksakt CSS-lengde (`"12px"`, `"1.25rem"`). Skal **ikke** brukes for tokens – bruk `size`. | diff --git a/doc-site/layout/layout-oversikt.md b/doc-site/layout/layout-oversikt.md index 58674367..a4cc4633 100644 --- a/doc-site/layout/layout-oversikt.md +++ b/doc-site/layout/layout-oversikt.md @@ -3,6 +3,10 @@ Layout-komponentene er strukturelle byggeklosser basert på prinsippene fra [Every Layout](https://every-layout.dev/). De håndterer plassering og fordeling av innhold uten å binde seg til visuell stil og kan kombineres fritt for å bygge opp sider og seksjoner. +## Hvorfor bruke dem? + +Du slipper å skrive egen CSS for vanlige oppsett, og avstander hentes fra designsystemets tokens. Det gir konsistente sider, raskere utvikling og mindre vedlikehold når designet endres. + ## Når skal du bruke layout-komponenter? Bruk layout-komponentene når du vil: @@ -18,4 +22,4 @@ Bruk layout-komponentene når du vil: ## Prinsipper -Layout-komponentene har ingen farger, fonter eller annen visuell stil – de styrer kun struktur og plassering. De er ment å kombineres, og bryr seg ikke om hva som ligger inni dem. +Layout-komponentene har ingen farger, fonter eller annen visuell stil, de styrer kun struktur og plassering. De er ment å kombineres, og bryr seg ikke om hva som ligger inni dem. diff --git a/doc-site/layout/stack-layout.md b/doc-site/layout/stack-layout.md index 71000824..95698ba8 100644 --- a/doc-site/layout/stack-layout.md +++ b/doc-site/layout/stack-layout.md @@ -1 +1,203 @@ -# Stack +# stack-layout + +`stack-layout` stabler barn-elementer vertikalt med mellomrom. + +I de aller fleste tilfeller skal du bruke `size`. `size` er knyttet direkte til spacing-tokenene i designsystemet og er det som sikrer at avstandene er konsistente på tvers av sider og komponenter. + +## Størrelse + +`size` setter avstanden mellom barn-elementene ved bruk av et spacing-token. + + + +```html + +
+
+
+
+ +
+
+
+
+ +
+
+
+
+``` + +
+ +## Mellomrom + +`gap` setter avstanden mellom barn-elementene som en eksakt CSS-verdi. Brukes kun når du trenger en verdi som ikke finnes blant tokenene. + + + +```html + +
+
+
+
+ +
+
+
+
+ +
+
+
+
+``` + +
+ +Bruk size i stedet når du jobber med designsystemets avstander. Gap og space er ment for unntakstilfeller der du må ha en helt spesifikk og ikke-tokenbasert verdi. + +## Justering + +`justify` styrer hvordan barn-elementene fordeles vertikalt. Tilsvarer CSS-egenskapen `justify-content`. + + + +```html + +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+``` + +
+ +## Alias for mellomrom + +`space` er et alias for `gap`. Brukes hvis `gap`-attributtet kolliderer med annen styling. + + + +```html + +
+
+
+
+``` + +
+ +## Nøsting + +Stacks kan nøstes for å bygge opp et hierarki av avstander. + + + +```html + + +
+
+
+
+ +
+
+
+
+``` + +
+ +## Eksempel på bruk + +Med `stack-layout` får du konsistent avstand fra et token, uten egen CSS. + + + +```html + + + + + Send inn + +``` + + + +Uten `stack-layout` klistrer elementene seg sammen og må styles individuelt for å få luft mellom seg. + + + +```html +
+ + + + Send inn +
+``` + +
+ +## Egenskaper + +| Egenskap | Type | Standard | Beskrivelse | +| --------- | ---------------------------------- | ------------ | ----------------------------------------------------------------------------------------- | +| `size` | `StackLayoutSize` | – | Tokenbasert mellomrom. Mapper til `--spacing-`. Autoutfylling i editoren. | +| `gap` | `string` | – | Eksakt CSS-lengde (`"12px"`, `"1.25rem"`). Skal **ikke** brukes for tokens – bruk `size`. | +| `space` | `string` | – | Alias for `gap` med samme regler. | +| `justify` | `string` (`justify-content`-verdi) | `flex-start` | Fordeling langs den vertikale aksen. | diff --git a/src/components/box-layout/box-layout.component.ts b/src/components/box-layout/box-layout.component.ts new file mode 100644 index 00000000..e1379fbe --- /dev/null +++ b/src/components/box-layout/box-layout.component.ts @@ -0,0 +1,51 @@ +import { customElement, property } from 'lit/decorators.js'; +import styles from './box-layout.styles'; +import { LitElement, html } from 'lit'; + +/** + * Pakker innhold i en boks med konsistent padding. + * Basert på Box-primitiven fra Every Layout. + * + * Bruk fortrinnsvis `size` (mapper til spacing-tokens i designsystemet). + * Bruk kun `padding` når en eksakt, ikke-tokenbasert verdi er nødvendig. + * + * @property {string} padding - Eksakt CSS-lengde, f.eks. "12px" eller "1.25rem". Skal IKKE brukes for token-verdier – bruk `size` til det. + * @property {Size} size - Forhåndsdefinert tokenbasert størrelse. + */ +export type BoxLayoutSize = + | 'none' + | '2x-small' + | 'x-small' + | 'small' + | 'medium' + | 'large' + | 'x-large' + | '2x-large' + | '3x-large' + | '4x-large' + | '5x-large'; + +@customElement('box-layout') +export default class BoxLayout extends LitElement { + static styles = [styles]; + + /** Eksakt CSS-lengde, f.eks. "12px" eller "1.25rem". Skal IKKE brukes for token-verdier – bruk `size` til det. */ + @property({ type: String, reflect: true }) padding?: string; + + /** Forhåndsdefinert tokenbasert padding. Mapper til `--spacing-`. */ + @property({ type: String, reflect: true }) size?: BoxLayoutSize; + + updated() { + if (this.padding !== undefined) this.style.setProperty('--_box-padding', this.padding); + } + + render() { + return html``; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'box-layout': BoxLayout; + } +} diff --git a/src/components/box-layout/box-layout.styles.ts b/src/components/box-layout/box-layout.styles.ts new file mode 100644 index 00000000..c428d3b9 --- /dev/null +++ b/src/components/box-layout/box-layout.styles.ts @@ -0,0 +1,42 @@ +import { css } from 'lit'; + +export default css` + :host { + display: block; + padding: var(--_box-padding, var(--spacing-medium)); + } + + :host([size='none']) { + --_box-padding: var(--spacing-none); + } + :host([size='2x-small']) { + --_box-padding: var(--spacing-2x-small); + } + :host([size='x-small']) { + --_box-padding: var(--spacing-x-small); + } + :host([size='small']) { + --_box-padding: var(--spacing-small); + } + :host([size='medium']) { + --_box-padding: var(--spacing-medium); + } + :host([size='large']) { + --_box-padding: var(--spacing-large); + } + :host([size='x-large']) { + --_box-padding: var(--spacing-x-large); + } + :host([size='2x-large']) { + --_box-padding: var(--spacing-2x-large); + } + :host([size='3x-large']) { + --_box-padding: var(--spacing-3x-large); + } + :host([size='4x-large']) { + --_box-padding: var(--spacing-4x-large); + } + :host([size='5x-large']) { + --_box-padding: var(--spacing-5x-large); + } +`; diff --git a/src/components/grid-layout/grid-layout.component.ts b/src/components/grid-layout/grid-layout.component.ts new file mode 100644 index 00000000..1c10cabe --- /dev/null +++ b/src/components/grid-layout/grid-layout.component.ts @@ -0,0 +1,56 @@ +import { customElement, property } from 'lit/decorators.js'; +import styles from './grid-layout.styles'; +import { LitElement, html } from 'lit'; + +/** + * Et responsivt rutenett som automatisk bryter til nye linjer basert på en minste kolonnebredde. + * Basert på Grid-primitiven fra Every Layout. + * + * Bruk fortrinnsvis `size` (mapper til spacing-tokens i designsystemet). + * Bruk kun `gap` når en eksakt, ikke-tokenbasert verdi er nødvendig. + * + * @property {string} min - Minste kolonnebredde, f.eks. "250px" eller "16rem". Bestemmer når rutenettet bryter til ny linje. + * @property {string} gap - Eksakt CSS-lengde, f.eks. "12px" eller "1.25rem". Skal IKKE brukes for token-verdier – bruk `size` til det. + * @property {Size} size - Forhåndsdefinert tokenbasert mellomrom. + */ +export type GridLayoutSize = + | 'none' + | '2x-small' + | 'x-small' + | 'small' + | 'medium' + | 'large' + | 'x-large' + | '2x-large' + | '3x-large' + | '4x-large' + | '5x-large'; + +@customElement('grid-layout') +export default class GridLayout extends LitElement { + static styles = [styles]; + + /** Minste kolonnebredde. Bestemmer når rutenettet bryter til ny linje. Standard: 250px. */ + @property({ type: String, reflect: true }) min: string = '250px'; + + /** Eksakt CSS-lengde for mellomrom. Skal IKKE brukes for token-verdier – bruk `size` til det. */ + @property({ type: String, reflect: true }) gap?: string; + + /** Forhåndsdefinert tokenbasert mellomrom. Mapper til `--spacing-`. */ + @property({ type: String, reflect: true }) size?: GridLayoutSize; + + updated() { + if (this.gap !== undefined) this.style.setProperty('--_grid-gap', this.gap); + this.style.setProperty('--_grid-min', this.min); + } + + render() { + return html``; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'grid-layout': GridLayout; + } +} diff --git a/src/components/grid-layout/grid-layout.styles.ts b/src/components/grid-layout/grid-layout.styles.ts new file mode 100644 index 00000000..fb836182 --- /dev/null +++ b/src/components/grid-layout/grid-layout.styles.ts @@ -0,0 +1,43 @@ +import { css } from 'lit'; + +export default css` + :host { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(var(--_grid-min, 250px), 1fr)); + gap: var(--_grid-gap, var(--spacing-medium)); + } + + :host([size='none']) { + --_grid-gap: var(--spacing-none); + } + :host([size='2x-small']) { + --_grid-gap: var(--spacing-2x-small); + } + :host([size='x-small']) { + --_grid-gap: var(--spacing-x-small); + } + :host([size='small']) { + --_grid-gap: var(--spacing-small); + } + :host([size='medium']) { + --_grid-gap: var(--spacing-medium); + } + :host([size='large']) { + --_grid-gap: var(--spacing-large); + } + :host([size='x-large']) { + --_grid-gap: var(--spacing-x-large); + } + :host([size='2x-large']) { + --_grid-gap: var(--spacing-2x-large); + } + :host([size='3x-large']) { + --_grid-gap: var(--spacing-3x-large); + } + :host([size='4x-large']) { + --_grid-gap: var(--spacing-4x-large); + } + :host([size='5x-large']) { + --_grid-gap: var(--spacing-5x-large); + } +`; diff --git a/src/components/stack-layout/stack-layout.component.ts b/src/components/stack-layout/stack-layout.component.ts new file mode 100644 index 00000000..6f221b29 --- /dev/null +++ b/src/components/stack-layout/stack-layout.component.ts @@ -0,0 +1,61 @@ +import { customElement, property } from 'lit/decorators.js'; +import styles from './stack-layout.styles'; +import { LitElement, html } from 'lit'; + +/** + * Stabler barn-elementer vertikalt med konsistent mellomrom. + * Basert på Stack-primitiven fra Every Layout. + * + * Bruk fortrinnsvis `size` (mapper til spacing-tokens i designsystemet). + * Bruk kun `gap`/`space` når en eksakt, ikke-tokenbasert verdi er nødvendig. + * + * @property {string} gap - Eksakt CSS-lengde, f.eks. "12px" eller "1.25rem". Skal IKKE brukes for token-verdier – bruk `size` til det. + * @property {string} space - Alias for gap. Brukes hvis gap ikke er satt. + * @property {Size} size - Forhåndsdefinert tokenbasert størrelse. + * @property {string} justify - justify-content-verdi. Standard: flex-start. + */ +export type StackLayoutSize = + | 'none' + | '2x-small' + | 'x-small' + | 'small' + | 'medium' + | 'large' + | 'x-large' + | '2x-large' + | '3x-large' + | '4x-large' + | '5x-large'; + +@customElement('stack-layout') +export default class StackLayout extends LitElement { + static styles = [styles]; + + /** Eksakt CSS-lengde, f.eks. "12px" eller "1.25rem". Skal IKKE brukes for token-verdier – bruk `size` til det. */ + @property({ type: String, reflect: true }) gap?: string; + + /** Alias for gap – brukes hvis gap ikke er satt. */ + @property({ type: String, reflect: true }) space?: string; + + /** Forhåndsdefinert tokenbasert størrelse. Mapper til `--spacing-`. */ + @property({ type: String, reflect: true }) size?: StackLayoutSize; + + /** justify-content på flex-containeren. Standard: flex-start. */ + @property({ type: String, reflect: true }) justify: string = 'flex-start'; + + updated() { + const spacing = this.gap ?? this.space; + if (spacing !== undefined) this.style.setProperty('--_stack-gap', spacing); + this.style.setProperty('--_stack-justify', this.justify); + } + + render() { + return html``; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'stack-layout': StackLayout; + } +} diff --git a/src/components/stack-layout/stack-layout.styles.ts b/src/components/stack-layout/stack-layout.styles.ts new file mode 100644 index 00000000..2093f5eb --- /dev/null +++ b/src/components/stack-layout/stack-layout.styles.ts @@ -0,0 +1,44 @@ +import { css } from 'lit'; + +export default css` + :host { + display: flex; + flex-direction: column; + gap: var(--_stack-gap, var(--spacing-medium)); + justify-content: var(--_stack-justify, flex-start); + } + + :host([size='none']) { + --_stack-gap: var(--spacing-none); + } + :host([size='2x-small']) { + --_stack-gap: var(--spacing-2x-small); + } + :host([size='x-small']) { + --_stack-gap: var(--spacing-x-small); + } + :host([size='small']) { + --_stack-gap: var(--spacing-small); + } + :host([size='medium']) { + --_stack-gap: var(--spacing-medium); + } + :host([size='large']) { + --_stack-gap: var(--spacing-large); + } + :host([size='x-large']) { + --_stack-gap: var(--spacing-x-large); + } + :host([size='2x-large']) { + --_stack-gap: var(--spacing-2x-large); + } + :host([size='3x-large']) { + --_stack-gap: var(--spacing-3x-large); + } + :host([size='4x-large']) { + --_stack-gap: var(--spacing-4x-large); + } + :host([size='5x-large']) { + --_stack-gap: var(--spacing-5x-large); + } +`; diff --git a/src/nve-designsystem.ts b/src/nve-designsystem.ts index d3660f55..f3d24dcd 100644 --- a/src/nve-designsystem.ts +++ b/src/nve-designsystem.ts @@ -4,6 +4,9 @@ export { default as NveAccordion } from './components/nve-accordion/nve-accordio export { default as NveAccordionItem } from './components/nve-accordion-item/nve-accordion-item.component'; export { default as NveAlert } from './components/nve-alert/nve-alert.component'; export { default as NveBadge } from './components/nve-badge/nve-badge.component'; +export { default as BoxLayout } from './components/box-layout/box-layout.component'; +export { default as GridLayout } from './components/grid-layout/grid-layout.component'; +export { default as StackLayout } from './components/stack-layout/stack-layout.component'; export { default as NveButton } from './components/nve-button/nve-button.component'; export { default as NveCarousel } from './components/nve-carousel/nve-carousel.component'; export { default as NveCarouselItem } from './components/nve-carousel-item/nve-carousel-item.component'; From 513d6eb4df0a658b4c57c05ce29d3981f204ec0c Mon Sep 17 00:00:00 2001 From: malingranly Date: Fri, 5 Jun 2026 13:29:07 +0200 Subject: [PATCH 03/15] la til cluster layout og forenklet ekseplene litt --- doc-site/layout/box-layout.md | 57 ++++-- doc-site/layout/center-layout.md | 1 - doc-site/layout/cluster-layout.md | 172 +++++++++++++++++- doc-site/layout/columnist-layout.md | 1 - doc-site/layout/cover-layout.md | 1 - doc-site/layout/grid-layout.md | 29 ++- doc-site/layout/layout-oversikt.md | 1 - doc-site/layout/sidebar-layout.md | 1 - doc-site/layout/stack-layout.md | 16 +- doc-site/layout/wrapper-layout.md | 1 - .../box-layout/box-layout.component.ts | 17 ++ .../box-layout/box-layout.styles.ts | 35 ++++ .../cluster-layout.component.ts | 61 +++++++ .../cluster-layout/cluster-layout.styles.ts | 45 +++++ src/nve-designsystem.ts | 1 + 15 files changed, 405 insertions(+), 34 deletions(-) delete mode 100644 doc-site/layout/center-layout.md delete mode 100644 doc-site/layout/columnist-layout.md delete mode 100644 doc-site/layout/cover-layout.md delete mode 100644 doc-site/layout/sidebar-layout.md delete mode 100644 doc-site/layout/wrapper-layout.md create mode 100644 src/components/cluster-layout/cluster-layout.component.ts create mode 100644 src/components/cluster-layout/cluster-layout.styles.ts diff --git a/doc-site/layout/box-layout.md b/doc-site/layout/box-layout.md index 2947644e..27208d2f 100644 --- a/doc-site/layout/box-layout.md +++ b/doc-site/layout/box-layout.md @@ -11,13 +11,13 @@ I de aller fleste tilfeller skal du bruke `size`. `size` er knyttet direkte til ```html - +
- +
- +
``` @@ -31,13 +31,13 @@ I de aller fleste tilfeller skal du bruke `size`. `size` er knyttet direkte til ```html - +
- +
- +
``` @@ -46,6 +46,34 @@ I de aller fleste tilfeller skal du bruke `size`. `size` er knyttet direkte til Bruk size i stedet når du jobber med designsystemets avstander. Padding er ment for unntakstilfeller der du må ha en helt spesifikk og ikke-tokenbasert verdi. +## Bakgrunn + +`background` setter en tokenbasert bakgrunnsfarge på boksen. Verdiene mapper til feedback-fargene i designsystemet. + + + +```html + + neutral + + + info + + + success + + + warning + + + error + +``` + + + +Trenger du en farge som ikke finnes blant tokenene, kan du fortsatt sette bakgrunn via style-attributtet. Foretrekk likevel background-propen for konsistens. + ## Nøsting Bokser kan nøstes for å bygge opp et hierarki av padding. @@ -53,8 +81,8 @@ Bokser kan nøstes for å bygge opp et hierarki av padding. ```html - - + +
@@ -69,7 +97,7 @@ En boks med konsistent padding rundt en tekst. ```html - + Innhold med jevn padding rundt. ``` @@ -81,7 +109,7 @@ Samme innhold uten `box-layout` hvor teksten ligger helt inntil kanten. ```html -
+
Innhold med null padding rundt.
``` @@ -90,7 +118,8 @@ Samme innhold uten `box-layout` hvor teksten ligger helt inntil kanten. ## Egenskaper -| Egenskap | Type | Standard | Beskrivelse | -| --------- | --------------- | -------- | ----------------------------------------------------------------------------------------- | -| `size` | `BoxLayoutSize` | `medium` | Tokenbasert padding. Mapper til `--spacing-`. Autoutfylling i editoren. | -| `padding` | `string` | – | Eksakt CSS-lengde (`"12px"`, `"1.25rem"`). Skal **ikke** brukes for tokens – bruk `size`. | +| Egenskap | Type | Standard | Beskrivelse | +| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ----------------------------------------------------------------------------------------- | +| `size` | `'none' \| '2x-small' \| 'x-small' \| 'small' \| 'medium' \| 'large' \| 'x-large' \| '2x-large' \| '3x-large' \| '4x-large' \| '5x-large'` | `medium` | Tokenbasert padding. Mapper til `--spacing-`. Autoutfylling i editoren. | +| `padding` | `string` | – | Eksakt CSS-lengde (`"12px"`, `"1.25rem"`). Skal **ikke** brukes for tokens – bruk `size`. | +| `background` | `'none' \| 'neutral' \| 'neutral-subtle' \| 'info' \| 'info-subtle' \| 'success' \| 'success-subtle' \| 'warning' \| 'warning-subtle' \| 'error' \| 'error-subtle'` | `none` | Tokenbasert bakgrunnsfarge. Mapper til `--color-feedback-background-*`. | diff --git a/doc-site/layout/center-layout.md b/doc-site/layout/center-layout.md deleted file mode 100644 index 160a1609..00000000 --- a/doc-site/layout/center-layout.md +++ /dev/null @@ -1 +0,0 @@ -# Center diff --git a/doc-site/layout/cluster-layout.md b/doc-site/layout/cluster-layout.md index f5e4f182..fdd8fde8 100644 --- a/doc-site/layout/cluster-layout.md +++ b/doc-site/layout/cluster-layout.md @@ -1 +1,171 @@ -# Cluster +# cluster-layout + +`cluster-layout` grupperer barn-elementer horisontalt med konsistent mellomrom og automatisk linjebryting. Brukes typisk for knappegrupper, tag-lister og navigasjon. + +I de aller fleste tilfeller skal du bruke `size`. `size` er knyttet direkte til spacing-tokenene i designsystemet og sikrer at avstandene er konsistente på tvers av sider og komponenter. + +## Størrelse + +`size` setter avstanden mellom barn-elementene ved bruk av et spacing-token. Hvis `size` ikke er satt, brukes `medium` som standard. + + + +```html + +
+
+
+
+ +
+
+
+
+ +
+
+
+
+``` + +
+ +## Mellomrom + +`gap` setter avstanden mellom barn-elementene som en eksakt CSS-verdi. Brukes kun når du trenger en verdi som ikke finnes blant tokenene. + + + +```html + +
+
+
+
+``` + +
+ +Bruk size i stedet når du jobber med designsystemets avstander. Gap er ment for unntakstilfeller der du må ha en helt spesifikk og ikke-tokenbasert verdi. + +## Justering + +`justify` styrer hvordan barn-elementene fordeles horisontalt. Tilsvarer CSS-egenskapen `justify-content`. + + + +```html + +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+``` + +
+ +## Vertikal justering + +`align` styrer hvordan barn-elementene plasseres vertikalt når de har ulik høyde. Tilsvarer CSS-egenskapen `align-items`. Standard er `center`. + + + +```html + +
+
+
+
+ +
+
+
+
+ +
+
+
+
+``` + +
+ +## Eksempel på bruk + +En knapperad som automatisk bryter til ny linje på smalere skjermer. + + + +```html +
+ + Lagre + Forhåndsvis + Avbryt + +
+``` + +
+ +Til sammenligning, samme knapper i en vanlig `
` uten `cluster-layout`. Det er ingen mellomrom mellom knappene, og når de bryter til ny linje, klistrer de seg sammen. + + + +```html +
+ Lagre + Forhåndsvis + Avbryt +
+``` + +
+ +## Egenskaper + +| Egenskap | Type | Standard | Beskrivelse | +| --------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ------------ | ----------------------------------------------------------------------------------------- | +| `size` | `'none' \| '2x-small' \| 'x-small' \| 'small' \| 'medium' \| 'large' \| 'x-large' \| '2x-large' \| '3x-large' \| '4x-large' \| '5x-large'` | `medium` | Tokenbasert mellomrom. Mapper til `--spacing-`. Autoutfylling i editoren. | +| `gap` | `string` | – | Eksakt CSS-lengde (`"12px"`, `"1.25rem"`). Skal **ikke** brukes for tokens – bruk `size`. | +| `justify` | `string` | `flex-start` | `justify-content`-verdi. | +| `align` | `string` | `center` | `align-items`-verdi. | diff --git a/doc-site/layout/columnist-layout.md b/doc-site/layout/columnist-layout.md deleted file mode 100644 index 1ce579e7..00000000 --- a/doc-site/layout/columnist-layout.md +++ /dev/null @@ -1 +0,0 @@ -# Columnist diff --git a/doc-site/layout/cover-layout.md b/doc-site/layout/cover-layout.md deleted file mode 100644 index 2f4b5193..00000000 --- a/doc-site/layout/cover-layout.md +++ /dev/null @@ -1 +0,0 @@ -# Cover diff --git a/doc-site/layout/grid-layout.md b/doc-site/layout/grid-layout.md index ebf85693..b288f4cb 100644 --- a/doc-site/layout/grid-layout.md +++ b/doc-site/layout/grid-layout.md @@ -131,10 +131,29 @@ I de aller fleste tilfeller skal du bruke `size` for mellomrom. `size` er knytte Bruk size i stedet når du jobber med designsystemets avstander. Gap er ment for unntakstilfeller der du må ha en helt spesifikk og ikke-tokenbasert verdi. +## Eksempel på bruk + +Et responsivt rutenett med navigasjonskort som tilpasser antall kolonner etter tilgjengelig plass. + + + +```html + + + + + + + + +``` + + + ## Egenskaper -| Egenskap | Type | Standard | Beskrivelse | -| -------- | ---------------- | -------- | ----------------------------------------------------------------------------------------- | -| `min` | `string` | `250px` | Minste kolonnebredde før rutenettet bryter til ny linje. | -| `size` | `GridLayoutSize` | `medium` | Tokenbasert mellomrom. Mapper til `--spacing-`. Autoutfylling i editoren. | -| `gap` | `string` | – | Eksakt CSS-lengde (`"12px"`, `"1.25rem"`). Skal **ikke** brukes for tokens – bruk `size`. | +| Egenskap | Type | Standard | Beskrivelse | +| -------- | ------------------------------------------------------------------------------------------------------------------------------------------ | -------- | ----------------------------------------------------------------------------------------- | +| `min` | `string` | `250px` | Minste kolonnebredde før rutenettet bryter til ny linje. | +| `size` | `'none' \| '2x-small' \| 'x-small' \| 'small' \| 'medium' \| 'large' \| 'x-large' \| '2x-large' \| '3x-large' \| '4x-large' \| '5x-large'` | `medium` | Tokenbasert mellomrom. Mapper til `--spacing-`. Autoutfylling i editoren. | +| `gap` | `string` | – | Eksakt CSS-lengde (`"12px"`, `"1.25rem"`). Skal **ikke** brukes for tokens – bruk `size`. | diff --git a/doc-site/layout/layout-oversikt.md b/doc-site/layout/layout-oversikt.md index a4cc4633..9a63ebe4 100644 --- a/doc-site/layout/layout-oversikt.md +++ b/doc-site/layout/layout-oversikt.md @@ -12,7 +12,6 @@ Du slipper å skrive egen CSS for vanlige oppsett, og avstander hentes fra desig Bruk layout-komponentene når du vil: - Stable elementer vertikalt med konsistent mellomrom (`stack-layout`) -- Sentrere innhold horisontalt (`center-layout`) - Gruppere elementer horisontalt med automatisk linjebryting (`cluster-layout`) - Bygge to-kolonne-oppsett med en fast sidespalte (`sidebar-layout`) - Lage et responsivt rutenett (`grid-layout` / `columnist-layout`) diff --git a/doc-site/layout/sidebar-layout.md b/doc-site/layout/sidebar-layout.md deleted file mode 100644 index 84358119..00000000 --- a/doc-site/layout/sidebar-layout.md +++ /dev/null @@ -1 +0,0 @@ -# Sidebar diff --git a/doc-site/layout/stack-layout.md b/doc-site/layout/stack-layout.md index 95698ba8..ae8295c0 100644 --- a/doc-site/layout/stack-layout.md +++ b/doc-site/layout/stack-layout.md @@ -16,7 +16,7 @@ I de aller fleste tilfeller skal du bruke `size`. `size` er knyttet direkte til
- +
@@ -168,7 +168,7 @@ Med `stack-layout` får du konsistent avstand fra et token, uten egen CSS. ```html - + @@ -195,9 +195,9 @@ Uten `stack-layout` klistrer elementene seg sammen og må styles individuelt for ## Egenskaper -| Egenskap | Type | Standard | Beskrivelse | -| --------- | ---------------------------------- | ------------ | ----------------------------------------------------------------------------------------- | -| `size` | `StackLayoutSize` | – | Tokenbasert mellomrom. Mapper til `--spacing-`. Autoutfylling i editoren. | -| `gap` | `string` | – | Eksakt CSS-lengde (`"12px"`, `"1.25rem"`). Skal **ikke** brukes for tokens – bruk `size`. | -| `space` | `string` | – | Alias for `gap` med samme regler. | -| `justify` | `string` (`justify-content`-verdi) | `flex-start` | Fordeling langs den vertikale aksen. | +| Egenskap | Type | Standard | Beskrivelse | +| --------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ------------ | ----------------------------------------------------------------------------------------- | +| `size` | `'none' \| '2x-small' \| 'x-small' \| 'small' \| 'medium' \| 'large' \| 'x-large' \| '2x-large' \| '3x-large' \| '4x-large' \| '5x-large'` | – | Tokenbasert mellomrom. Mapper til `--spacing-`. Autoutfylling i editoren. | +| `gap` | `string` | – | Eksakt CSS-lengde (`"12px"`, `"1.25rem"`). Skal **ikke** brukes for tokens – bruk `size`. | +| `space` | `string` | – | Alias for `gap` med samme regler. | +| `justify` | `string` (`justify-content`-verdi) | `flex-start` | Fordeling langs den vertikale aksen. | diff --git a/doc-site/layout/wrapper-layout.md b/doc-site/layout/wrapper-layout.md deleted file mode 100644 index 68aefdeb..00000000 --- a/doc-site/layout/wrapper-layout.md +++ /dev/null @@ -1 +0,0 @@ -# Wrapper diff --git a/src/components/box-layout/box-layout.component.ts b/src/components/box-layout/box-layout.component.ts index e1379fbe..01316930 100644 --- a/src/components/box-layout/box-layout.component.ts +++ b/src/components/box-layout/box-layout.component.ts @@ -11,6 +11,7 @@ import { LitElement, html } from 'lit'; * * @property {string} padding - Eksakt CSS-lengde, f.eks. "12px" eller "1.25rem". Skal IKKE brukes for token-verdier – bruk `size` til det. * @property {Size} size - Forhåndsdefinert tokenbasert størrelse. + * @property {BoxLayoutBackground} background - Forhåndsdefinert tokenbasert bakgrunnsfarge. */ export type BoxLayoutSize = | 'none' @@ -25,6 +26,19 @@ export type BoxLayoutSize = | '4x-large' | '5x-large'; +export type BoxLayoutBackground = + | 'none' + | 'neutral' + | 'neutral-subtle' + | 'info' + | 'info-subtle' + | 'success' + | 'success-subtle' + | 'warning' + | 'warning-subtle' + | 'error' + | 'error-subtle'; + @customElement('box-layout') export default class BoxLayout extends LitElement { static styles = [styles]; @@ -35,6 +49,9 @@ export default class BoxLayout extends LitElement { /** Forhåndsdefinert tokenbasert padding. Mapper til `--spacing-`. */ @property({ type: String, reflect: true }) size?: BoxLayoutSize; + /** Forhåndsdefinert tokenbasert bakgrunnsfarge. Mapper til `--color-feedback-background-*`. */ + @property({ type: String, reflect: true }) background?: BoxLayoutBackground; + updated() { if (this.padding !== undefined) this.style.setProperty('--_box-padding', this.padding); } diff --git a/src/components/box-layout/box-layout.styles.ts b/src/components/box-layout/box-layout.styles.ts index c428d3b9..7198c39e 100644 --- a/src/components/box-layout/box-layout.styles.ts +++ b/src/components/box-layout/box-layout.styles.ts @@ -4,6 +4,7 @@ export default css` :host { display: block; padding: var(--_box-padding, var(--spacing-medium)); + background: var(--_box-background, transparent); } :host([size='none']) { @@ -39,4 +40,38 @@ export default css` :host([size='5x-large']) { --_box-padding: var(--spacing-5x-large); } + + :host([background='none']) { + --_box-background: transparent; + } + :host([background='neutral']) { + --_box-background: var(--color-feedback-background-default-neutral); + } + :host([background='neutral-subtle']) { + --_box-background: var(--color-feedback-background-subtle-neutral); + } + :host([background='info']) { + --_box-background: var(--color-feedback-background-default-info); + } + :host([background='info-subtle']) { + --_box-background: var(--color-feedback-background-subtle-info); + } + :host([background='success']) { + --_box-background: var(--color-feedback-background-default-success); + } + :host([background='success-subtle']) { + --_box-background: var(--color-feedback-background-subtle-success); + } + :host([background='warning']) { + --_box-background: var(--color-feedback-background-default-warning); + } + :host([background='warning-subtle']) { + --_box-background: var(--color-feedback-background-subtle-warning); + } + :host([background='error']) { + --_box-background: var(--color-feedback-background-default-error); + } + :host([background='error-subtle']) { + --_box-background: var(--color-feedback-background-subtle-error); + } `; diff --git a/src/components/cluster-layout/cluster-layout.component.ts b/src/components/cluster-layout/cluster-layout.component.ts new file mode 100644 index 00000000..e4dc83dd --- /dev/null +++ b/src/components/cluster-layout/cluster-layout.component.ts @@ -0,0 +1,61 @@ +import { customElement, property } from 'lit/decorators.js'; +import styles from './cluster-layout.styles'; +import { LitElement, html } from 'lit'; + +/** + * Grupperer barn-elementer horisontalt med automatisk linjebryting. + * Basert på Cluster-primitiven fra Every Layout. + * + * Bruk fortrinnsvis `size` (mapper til spacing-tokens i designsystemet). + * Bruk kun `gap` når en eksakt, ikke-tokenbasert verdi er nødvendig. + * + * @property {string} gap - Eksakt CSS-lengde, f.eks. "12px" eller "1.25rem". Skal IKKE brukes for token-verdier – bruk `size` til det. + * @property {Size} size - Forhåndsdefinert tokenbasert mellomrom. + * @property {string} justify - justify-content-verdi. Standard: flex-start. + * @property {string} align - align-items-verdi. Standard: center. + */ +export type ClusterLayoutSize = + | 'none' + | '2x-small' + | 'x-small' + | 'small' + | 'medium' + | 'large' + | 'x-large' + | '2x-large' + | '3x-large' + | '4x-large' + | '5x-large'; + +@customElement('cluster-layout') +export default class ClusterLayout extends LitElement { + static styles = [styles]; + + /** Eksakt CSS-lengde for mellomrom. Skal IKKE brukes for token-verdier – bruk `size` til det. */ + @property({ type: String, reflect: true }) gap?: string; + + /** Forhåndsdefinert tokenbasert mellomrom. Mapper til `--spacing-`. */ + @property({ type: String, reflect: true }) size?: ClusterLayoutSize; + + /** justify-content på flex-containeren. Standard: flex-start. */ + @property({ type: String, reflect: true }) justify: string = 'flex-start'; + + /** align-items på flex-containeren. Standard: center. */ + @property({ type: String, reflect: true }) align: string = 'center'; + + updated() { + if (this.gap !== undefined) this.style.setProperty('--_cluster-gap', this.gap); + this.style.setProperty('--_cluster-justify', this.justify); + this.style.setProperty('--_cluster-align', this.align); + } + + render() { + return html``; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'cluster-layout': ClusterLayout; + } +} diff --git a/src/components/cluster-layout/cluster-layout.styles.ts b/src/components/cluster-layout/cluster-layout.styles.ts new file mode 100644 index 00000000..a0f82fea --- /dev/null +++ b/src/components/cluster-layout/cluster-layout.styles.ts @@ -0,0 +1,45 @@ +import { css } from 'lit'; + +export default css` + :host { + display: flex; + flex-wrap: wrap; + gap: var(--_cluster-gap, var(--spacing-medium)); + justify-content: var(--_cluster-justify, flex-start); + align-items: var(--_cluster-align, center); + } + + :host([size='none']) { + --_cluster-gap: var(--spacing-none); + } + :host([size='2x-small']) { + --_cluster-gap: var(--spacing-2x-small); + } + :host([size='x-small']) { + --_cluster-gap: var(--spacing-x-small); + } + :host([size='small']) { + --_cluster-gap: var(--spacing-small); + } + :host([size='medium']) { + --_cluster-gap: var(--spacing-medium); + } + :host([size='large']) { + --_cluster-gap: var(--spacing-large); + } + :host([size='x-large']) { + --_cluster-gap: var(--spacing-x-large); + } + :host([size='2x-large']) { + --_cluster-gap: var(--spacing-2x-large); + } + :host([size='3x-large']) { + --_cluster-gap: var(--spacing-3x-large); + } + :host([size='4x-large']) { + --_cluster-gap: var(--spacing-4x-large); + } + :host([size='5x-large']) { + --_cluster-gap: var(--spacing-5x-large); + } +`; diff --git a/src/nve-designsystem.ts b/src/nve-designsystem.ts index f3d24dcd..1b4b95a9 100644 --- a/src/nve-designsystem.ts +++ b/src/nve-designsystem.ts @@ -5,6 +5,7 @@ export { default as NveAccordionItem } from './components/nve-accordion-item/nve export { default as NveAlert } from './components/nve-alert/nve-alert.component'; export { default as NveBadge } from './components/nve-badge/nve-badge.component'; export { default as BoxLayout } from './components/box-layout/box-layout.component'; +export { default as ClusterLayout } from './components/cluster-layout/cluster-layout.component'; export { default as GridLayout } from './components/grid-layout/grid-layout.component'; export { default as StackLayout } from './components/stack-layout/stack-layout.component'; export { default as NveButton } from './components/nve-button/nve-button.component'; From d8da1da2e29ff3f3a49f03031b22118517a352fc Mon Sep 17 00:00:00 2001 From: malingranly Date: Fri, 5 Jun 2026 14:48:28 +0200 Subject: [PATCH 04/15] =?UTF-8?q?endret=20litt=20p=C3=A5=20beskrivelser?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/box-layout/box-layout.component.ts | 4 ++-- src/components/cluster-layout/cluster-layout.component.ts | 6 +++--- src/components/grid-layout/grid-layout.component.ts | 2 +- src/components/stack-layout/stack-layout.component.ts | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/components/box-layout/box-layout.component.ts b/src/components/box-layout/box-layout.component.ts index 01316930..5b2de2bd 100644 --- a/src/components/box-layout/box-layout.component.ts +++ b/src/components/box-layout/box-layout.component.ts @@ -3,13 +3,13 @@ import styles from './box-layout.styles'; import { LitElement, html } from 'lit'; /** - * Pakker innhold i en boks med konsistent padding. + * Pakker innhold i en boks med padding. * Basert på Box-primitiven fra Every Layout. * * Bruk fortrinnsvis `size` (mapper til spacing-tokens i designsystemet). * Bruk kun `padding` når en eksakt, ikke-tokenbasert verdi er nødvendig. * - * @property {string} padding - Eksakt CSS-lengde, f.eks. "12px" eller "1.25rem". Skal IKKE brukes for token-verdier – bruk `size` til det. + * @property {string} padding - Eksakt CSS-lengde, f.eks. "12px" eller "1.25rem". Skal ikke brukes for token-verdier, bruk heller `size`. * @property {Size} size - Forhåndsdefinert tokenbasert størrelse. * @property {BoxLayoutBackground} background - Forhåndsdefinert tokenbasert bakgrunnsfarge. */ diff --git a/src/components/cluster-layout/cluster-layout.component.ts b/src/components/cluster-layout/cluster-layout.component.ts index e4dc83dd..fcaaa607 100644 --- a/src/components/cluster-layout/cluster-layout.component.ts +++ b/src/components/cluster-layout/cluster-layout.component.ts @@ -6,10 +6,10 @@ import { LitElement, html } from 'lit'; * Grupperer barn-elementer horisontalt med automatisk linjebryting. * Basert på Cluster-primitiven fra Every Layout. * - * Bruk fortrinnsvis `size` (mapper til spacing-tokens i designsystemet). + * Bruk `size` (mapper til spacing-tokens i designsystemet). * Bruk kun `gap` når en eksakt, ikke-tokenbasert verdi er nødvendig. * - * @property {string} gap - Eksakt CSS-lengde, f.eks. "12px" eller "1.25rem". Skal IKKE brukes for token-verdier – bruk `size` til det. + * @property {string} gap - Eksakt CSS-lengde, f.eks. "12px" eller "1.25rem". Skal ikke brukes for token-verdier, bruk heller `size`. * @property {Size} size - Forhåndsdefinert tokenbasert mellomrom. * @property {string} justify - justify-content-verdi. Standard: flex-start. * @property {string} align - align-items-verdi. Standard: center. @@ -31,7 +31,7 @@ export type ClusterLayoutSize = export default class ClusterLayout extends LitElement { static styles = [styles]; - /** Eksakt CSS-lengde for mellomrom. Skal IKKE brukes for token-verdier – bruk `size` til det. */ + /** Eksakt CSS-lengde for mellomrom. Skal ikke brukes for token-verdier, bruk heller `size`. */ @property({ type: String, reflect: true }) gap?: string; /** Forhåndsdefinert tokenbasert mellomrom. Mapper til `--spacing-`. */ diff --git a/src/components/grid-layout/grid-layout.component.ts b/src/components/grid-layout/grid-layout.component.ts index 1c10cabe..6b4a8ef4 100644 --- a/src/components/grid-layout/grid-layout.component.ts +++ b/src/components/grid-layout/grid-layout.component.ts @@ -10,7 +10,7 @@ import { LitElement, html } from 'lit'; * Bruk kun `gap` når en eksakt, ikke-tokenbasert verdi er nødvendig. * * @property {string} min - Minste kolonnebredde, f.eks. "250px" eller "16rem". Bestemmer når rutenettet bryter til ny linje. - * @property {string} gap - Eksakt CSS-lengde, f.eks. "12px" eller "1.25rem". Skal IKKE brukes for token-verdier – bruk `size` til det. + * @property {string} gap - Eksakt CSS-lengde, f.eks. "12px" eller "1.25rem". Skal ikke brukes for token-verdier, bruk heller `size`. * @property {Size} size - Forhåndsdefinert tokenbasert mellomrom. */ export type GridLayoutSize = diff --git a/src/components/stack-layout/stack-layout.component.ts b/src/components/stack-layout/stack-layout.component.ts index 6f221b29..577fd70e 100644 --- a/src/components/stack-layout/stack-layout.component.ts +++ b/src/components/stack-layout/stack-layout.component.ts @@ -6,10 +6,10 @@ import { LitElement, html } from 'lit'; * Stabler barn-elementer vertikalt med konsistent mellomrom. * Basert på Stack-primitiven fra Every Layout. * - * Bruk fortrinnsvis `size` (mapper til spacing-tokens i designsystemet). + * Bruk `size` (mapper til spacing-tokens i designsystemet). * Bruk kun `gap`/`space` når en eksakt, ikke-tokenbasert verdi er nødvendig. * - * @property {string} gap - Eksakt CSS-lengde, f.eks. "12px" eller "1.25rem". Skal IKKE brukes for token-verdier – bruk `size` til det. + * @property {string} gap - Eksakt CSS-lengde, f.eks. "12px" eller "1.25rem". Skal ikke brukes for token-verdier, bruk heller `size`. * @property {string} space - Alias for gap. Brukes hvis gap ikke er satt. * @property {Size} size - Forhåndsdefinert tokenbasert størrelse. * @property {string} justify - justify-content-verdi. Standard: flex-start. From 1d223a966a0c9396f6b4fd73cb514fada34deb7c Mon Sep 17 00:00:00 2001 From: malingranly Date: Fri, 5 Jun 2026 14:58:13 +0200 Subject: [PATCH 05/15] removed unused colorlist component --- doc-site/.vitepress/theme/index.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/doc-site/.vitepress/theme/index.ts b/doc-site/.vitepress/theme/index.ts index 6345c103..b67ab444 100644 --- a/doc-site/.vitepress/theme/index.ts +++ b/doc-site/.vitepress/theme/index.ts @@ -16,7 +16,6 @@ import LinkButton from './components/LinkButton.vue'; import PageHeader from './components/PageHeader.vue'; import ComponentOverview from './components/ComponentOverview.vue'; import ThemeSelect from './components/ThemeSelect.vue'; -import ColorList from './components/ColorList.vue'; import TypographyTable from './components/TypographyTable.vue'; import { cssTokenState } from './cssTokenState'; import { useCurrentTheme, Theme } from './composables/useCurrentTheme'; @@ -97,7 +96,6 @@ export default { app.component('PageHeader', PageHeader); app.component('ComponentOverview', ComponentOverview); app.component('ThemeSelect', ThemeSelect); - app.component('ColorList', ColorList); app.component('TypographyTable', TypographyTable); app.component('NveTableDemo', NveTableDemo); From 63f5c36d3e582db0e1408f961cac33e7b6f8f7c5 Mon Sep 17 00:00:00 2001 From: malingranly Date: Fri, 5 Jun 2026 15:02:09 +0200 Subject: [PATCH 06/15] fjernet tekst som ikke trengtes --- doc-site/layout/layout-oversikt.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/doc-site/layout/layout-oversikt.md b/doc-site/layout/layout-oversikt.md index 9a63ebe4..7c88e3bd 100644 --- a/doc-site/layout/layout-oversikt.md +++ b/doc-site/layout/layout-oversikt.md @@ -13,11 +13,8 @@ Bruk layout-komponentene når du vil: - Stable elementer vertikalt med konsistent mellomrom (`stack-layout`) - Gruppere elementer horisontalt med automatisk linjebryting (`cluster-layout`) -- Bygge to-kolonne-oppsett med en fast sidespalte (`sidebar-layout`) -- Lage et responsivt rutenett (`grid-layout` / `columnist-layout`) -- Pakke inn innhold med maks-bredde og sentrering (`wrapper-layout`) +- Lage et responsivt rutenett (`grid-layout`) - Gi et element definert padding og bakgrunn (`box-layout`) -- Fylle tilgjengelig høyde med et fremhevet midtelement (`cover-layout`) ## Prinsipper From 47bb92b064c0ac3b1241411c39220e2bde64c932 Mon Sep 17 00:00:00 2001 From: malingranly Date: Fri, 12 Jun 2026 12:08:47 +0200 Subject: [PATCH 07/15] =?UTF-8?q?lagt=20til=20tydeligere=20eksmpel=20p?= =?UTF-8?q?=C3=A5=20kombinering=20av=20bruk.=20fjerne=20size=20og=20byttet?= =?UTF-8?q?=20med=20gap/padding?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc-site/layout/box-layout.md | 45 +++------- doc-site/layout/cluster-layout.md | 55 ++++--------- doc-site/layout/grid-layout.md | 52 +++--------- doc-site/layout/layout-oversikt.md | 27 ++++++ doc-site/layout/stack-layout.md | 82 ++++--------------- .../box-layout/box-layout.component.ts | 18 ++-- .../box-layout/box-layout.styles.ts | 70 ++++++++-------- .../cluster-layout.component.ts | 14 +--- .../cluster-layout/cluster-layout.styles.ts | 46 +++++------ .../grid-layout/grid-layout.component.ts | 14 +--- .../grid-layout/grid-layout.styles.ts | 46 +++++------ .../stack-layout/stack-layout.component.ts | 21 ++--- .../stack-layout/stack-layout.styles.ts | 46 +++++------ 13 files changed, 206 insertions(+), 330 deletions(-) diff --git a/doc-site/layout/box-layout.md b/doc-site/layout/box-layout.md index 27208d2f..b2731184 100644 --- a/doc-site/layout/box-layout.md +++ b/doc-site/layout/box-layout.md @@ -2,50 +2,28 @@ `box-layout` pakker innhold i en boks med konsistent padding. -I de aller fleste tilfeller skal du bruke `size`. `size` er knyttet direkte til spacing-tokenene i designsystemet og sikrer at paddingen er konsistent på tvers av sider og komponenter. - -## Størrelse - -`size` setter padding rundt innholdet ved bruk av et spacing-token. Hvis `size` ikke er satt, brukes `medium` som standard. - - - -```html - -
-
- -
-
- -
-
-``` - -
+I de aller fleste tilfeller skal du bruke `padding`. `padding` er knyttet direkte til spacing-tokenene i designsystemet og sikrer at paddingen er konsistent på tvers av sider og komponenter. ## Padding -`padding` setter padding som en eksakt CSS-verdi. Brukes kun når du trenger en verdi som ikke finnes blant tokenene. +`padding` setter padding rundt innholdet ved bruk av et spacing-token. Hvis `padding` ikke er satt, brukes `medium` som standard. ```html - +
- +
- +
```
-Bruk size i stedet når du jobber med designsystemets avstander. Padding er ment for unntakstilfeller der du må ha en helt spesifikk og ikke-tokenbasert verdi. - ## Bakgrunn `background` setter en tokenbasert bakgrunnsfarge på boksen. Verdiene mapper til feedback-fargene i designsystemet. @@ -81,8 +59,8 @@ Bokser kan nøstes for å bygge opp et hierarki av padding. ```html - - + +
@@ -118,8 +96,7 @@ Samme innhold uten `box-layout` hvor teksten ligger helt inntil kanten. ## Egenskaper -| Egenskap | Type | Standard | Beskrivelse | -| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ----------------------------------------------------------------------------------------- | -| `size` | `'none' \| '2x-small' \| 'x-small' \| 'small' \| 'medium' \| 'large' \| 'x-large' \| '2x-large' \| '3x-large' \| '4x-large' \| '5x-large'` | `medium` | Tokenbasert padding. Mapper til `--spacing-`. Autoutfylling i editoren. | -| `padding` | `string` | – | Eksakt CSS-lengde (`"12px"`, `"1.25rem"`). Skal **ikke** brukes for tokens – bruk `size`. | -| `background` | `'none' \| 'neutral' \| 'neutral-subtle' \| 'info' \| 'info-subtle' \| 'success' \| 'success-subtle' \| 'warning' \| 'warning-subtle' \| 'error' \| 'error-subtle'` | `none` | Tokenbasert bakgrunnsfarge. Mapper til `--color-feedback-background-*`. | +| Egenskap | Type | Standard | Beskrivelse | +| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ------------------------------------------------------------------------------ | +| `padding` | `'none' \| '2x-small' \| 'x-small' \| 'small' \| 'medium' \| 'large' \| 'x-large' \| '2x-large' \| '3x-large' \| '4x-large' \| '5x-large'` | `medium` | Tokenbasert padding. Mapper til `--spacing-`. Autoutfylling i editoren. | +| `background` | `'none' \| 'neutral' \| 'neutral-subtle' \| 'info' \| 'info-subtle' \| 'success' \| 'success-subtle' \| 'warning' \| 'warning-subtle' \| 'error' \| 'error-subtle'` | `none` | Tokenbasert bakgrunnsfarge. Mapper til `--color-feedback-background-*`. | diff --git a/doc-site/layout/cluster-layout.md b/doc-site/layout/cluster-layout.md index fdd8fde8..867cd2e3 100644 --- a/doc-site/layout/cluster-layout.md +++ b/doc-site/layout/cluster-layout.md @@ -2,16 +2,16 @@ `cluster-layout` grupperer barn-elementer horisontalt med konsistent mellomrom og automatisk linjebryting. Brukes typisk for knappegrupper, tag-lister og navigasjon. -I de aller fleste tilfeller skal du bruke `size`. `size` er knyttet direkte til spacing-tokenene i designsystemet og sikrer at avstandene er konsistente på tvers av sider og komponenter. +I de aller fleste tilfeller skal du bruke `gap`. `gap` er knyttet direkte til spacing-tokenene i designsystemet og sikrer at avstandene er konsistente på tvers av sider og komponenter. -## Størrelse +## Mellomrom -`size` setter avstanden mellom barn-elementene ved bruk av et spacing-token. Hvis `size` ikke er satt, brukes `medium` som standard. +`gap` setter avstanden mellom barn-elementene ved bruk av et spacing-token. Hvis `gap` ikke er satt, brukes `medium` som standard. ```html - +
@@ -21,23 +21,7 @@ I de aller fleste tilfeller skal du bruke `size`. `size` er knyttet direkte til
- -
-
-
-
-``` - -
- -## Mellomrom - -`gap` setter avstanden mellom barn-elementene som en eksakt CSS-verdi. Brukes kun når du trenger en verdi som ikke finnes blant tokenene. - - - -```html - +
@@ -46,8 +30,6 @@ I de aller fleste tilfeller skal du bruke `size`. `size` er knyttet direkte til
-Bruk size i stedet når du jobber med designsystemets avstander. Gap er ment for unntakstilfeller der du må ha en helt spesifikk og ikke-tokenbasert verdi. - ## Justering `justify` styrer hvordan barn-elementene fordeles horisontalt. Tilsvarer CSS-egenskapen `justify-content`. @@ -57,7 +39,7 @@ I de aller fleste tilfeller skal du bruke `size`. `size` er knyttet direkte til ```html
@@ -65,7 +47,7 @@ I de aller fleste tilfeller skal du bruke `size`. `size` er knyttet direkte til
@@ -73,7 +55,7 @@ I de aller fleste tilfeller skal du bruke `size`. `size` er knyttet direkte til
@@ -81,7 +63,7 @@ I de aller fleste tilfeller skal du bruke `size`. `size` er knyttet direkte til
@@ -100,7 +82,7 @@ I de aller fleste tilfeller skal du bruke `size`. `size` er knyttet direkte til ```html
@@ -109,7 +91,7 @@ I de aller fleste tilfeller skal du bruke `size`. `size` er knyttet direkte til
@@ -118,7 +100,7 @@ I de aller fleste tilfeller skal du bruke `size`. `size` er knyttet direkte til
@@ -137,7 +119,7 @@ En knapperad som automatisk bryter til ny linje på smalere skjermer. ```html
- + Lagre Forhåndsvis Avbryt @@ -163,9 +145,8 @@ Til sammenligning, samme knapper i en vanlig `
` uten `cluster-layout`. Det ## Egenskaper -| Egenskap | Type | Standard | Beskrivelse | -| --------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ------------ | ----------------------------------------------------------------------------------------- | -| `size` | `'none' \| '2x-small' \| 'x-small' \| 'small' \| 'medium' \| 'large' \| 'x-large' \| '2x-large' \| '3x-large' \| '4x-large' \| '5x-large'` | `medium` | Tokenbasert mellomrom. Mapper til `--spacing-`. Autoutfylling i editoren. | -| `gap` | `string` | – | Eksakt CSS-lengde (`"12px"`, `"1.25rem"`). Skal **ikke** brukes for tokens – bruk `size`. | -| `justify` | `string` | `flex-start` | `justify-content`-verdi. | -| `align` | `string` | `center` | `align-items`-verdi. | +| Egenskap | Type | Standard | Beskrivelse | +| --------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ------------ | -------------------------------------------------------------------------------- | +| `gap` | `'none' \| '2x-small' \| 'x-small' \| 'small' \| 'medium' \| 'large' \| 'x-large' \| '2x-large' \| '3x-large' \| '4x-large' \| '5x-large'` | `medium` | Tokenbasert mellomrom. Mapper til `--spacing-`. Autoutfylling i editoren. | +| `justify` | `string` | `flex-start` | `justify-content`-verdi. | +| `align` | `string` | `center` | `align-items`-verdi. | diff --git a/doc-site/layout/grid-layout.md b/doc-site/layout/grid-layout.md index b288f4cb..c6ea18d7 100644 --- a/doc-site/layout/grid-layout.md +++ b/doc-site/layout/grid-layout.md @@ -2,7 +2,7 @@ `grid-layout` lager et responsivt rutenett som automatisk bryter til nye linjer basert på en minste kolonnebredde. -I de aller fleste tilfeller skal du bruke `size` for mellomrom. `size` er knyttet direkte til spacing-tokenene i designsystemet og sikrer at avstandene er konsistente på tvers av sider og komponenter. +I de aller fleste tilfeller skal du bruke `gap` for mellomrom. `gap` er knyttet direkte til spacing-tokenene i designsystemet og sikrer at avstandene er konsistente på tvers av sider og komponenter. ## Minste kolonnebredde @@ -39,15 +39,15 @@ I de aller fleste tilfeller skal du bruke `size` for mellomrom. `size` er knytte -## Størrelse +## Mellomrom -`size` setter mellomrommet mellom rutene ved bruk av et spacing-token. Hvis `size` ikke er satt, brukes `medium` som standard. +`gap` setter mellomrommet mellom rutene ved bruk av et spacing-token. Hvis `gap` ikke er satt, brukes `medium` som standard. ```html @@ -79,7 +79,7 @@ I de aller fleste tilfeller skal du bruke `size` for mellomrom. `size` er knytte >
@@ -100,37 +100,6 @@ I de aller fleste tilfeller skal du bruke `size` for mellomrom. `size` er knytte -## Mellomrom - -`gap` setter mellomrommet som en eksakt CSS-verdi. Brukes kun når du trenger en verdi som ikke finnes blant tokenene. - - - -```html - -
-
-
-
-
-``` - -
- -Bruk size i stedet når du jobber med designsystemets avstander. Gap er ment for unntakstilfeller der du må ha en helt spesifikk og ikke-tokenbasert verdi. - ## Eksempel på bruk Et responsivt rutenett med navigasjonskort som tilpasser antall kolonner etter tilgjengelig plass. @@ -138,7 +107,7 @@ Et responsivt rutenett med navigasjonskort som tilpasser antall kolonner etter t ```html - + @@ -152,8 +121,7 @@ Et responsivt rutenett med navigasjonskort som tilpasser antall kolonner etter t ## Egenskaper -| Egenskap | Type | Standard | Beskrivelse | -| -------- | ------------------------------------------------------------------------------------------------------------------------------------------ | -------- | ----------------------------------------------------------------------------------------- | -| `min` | `string` | `250px` | Minste kolonnebredde før rutenettet bryter til ny linje. | -| `size` | `'none' \| '2x-small' \| 'x-small' \| 'small' \| 'medium' \| 'large' \| 'x-large' \| '2x-large' \| '3x-large' \| '4x-large' \| '5x-large'` | `medium` | Tokenbasert mellomrom. Mapper til `--spacing-`. Autoutfylling i editoren. | -| `gap` | `string` | – | Eksakt CSS-lengde (`"12px"`, `"1.25rem"`). Skal **ikke** brukes for tokens – bruk `size`. | +| Egenskap | Type | Standard | Beskrivelse | +| -------- | ------------------------------------------------------------------------------------------------------------------------------------------ | -------- | -------------------------------------------------------------------------------- | +| `min` | `string` | `250px` | Minste kolonnebredde før rutenettet bryter til ny linje. | +| `gap` | `'none' \| '2x-small' \| 'x-small' \| 'small' \| 'medium' \| 'large' \| 'x-large' \| '2x-large' \| '3x-large' \| '4x-large' \| '5x-large'` | `medium` | Tokenbasert mellomrom. Mapper til `--spacing-`. Autoutfylling i editoren. | diff --git a/doc-site/layout/layout-oversikt.md b/doc-site/layout/layout-oversikt.md index 7c88e3bd..e288508f 100644 --- a/doc-site/layout/layout-oversikt.md +++ b/doc-site/layout/layout-oversikt.md @@ -19,3 +19,30 @@ Bruk layout-komponentene når du vil: ## Prinsipper Layout-komponentene har ingen farger, fonter eller annen visuell stil, de styrer kun struktur og plassering. De er ment å kombineres, og bryr seg ikke om hva som ligger inni dem. + +## Eksempel på bruk + +Layout-komponentene er laget for å kombineres. Et kontaktskjema er et typisk eksempel som bruker alle fire: `box-layout` gir kortet ramme og padding, `stack-layout` stabler feltene vertikalt, `grid-layout` legger fornavn og etternavn ved siden av hverandre og bryter til en kolonne på smale skjermer. `cluster-layout` plasserer knappene nederst. + + + +```html + + + Kontakt oss +

Fyll ut skjemaet, så tar vi kontakt så raskt vi kan.

+ + + + + + + + Avbryt + Send + +
+
+``` + +
diff --git a/doc-site/layout/stack-layout.md b/doc-site/layout/stack-layout.md index ae8295c0..f681ef19 100644 --- a/doc-site/layout/stack-layout.md +++ b/doc-site/layout/stack-layout.md @@ -2,52 +2,26 @@ `stack-layout` stabler barn-elementer vertikalt med mellomrom. -I de aller fleste tilfeller skal du bruke `size`. `size` er knyttet direkte til spacing-tokenene i designsystemet og er det som sikrer at avstandene er konsistente på tvers av sider og komponenter. - -## Størrelse - -`size` setter avstanden mellom barn-elementene ved bruk av et spacing-token. - - - -```html - -
-
-
-
- -
-
-
-
- -
-
-
-
-``` - -
+I de aller fleste tilfeller skal du bruke `gap`. `gap` er knyttet direkte til spacing-tokenene i designsystemet og er det som sikrer at avstandene er konsistente på tvers av sider og komponenter. ## Mellomrom -`gap` setter avstanden mellom barn-elementene som en eksakt CSS-verdi. Brukes kun når du trenger en verdi som ikke finnes blant tokenene. +`gap` setter avstanden mellom barn-elementene ved bruk av et spacing-token. ```html - +
- +
- +
@@ -56,8 +30,6 @@ I de aller fleste tilfeller skal du bruke `size`. `size` er knyttet direkte til
-Bruk size i stedet når du jobber med designsystemets avstander. Gap og space er ment for unntakstilfeller der du må ha en helt spesifikk og ikke-tokenbasert verdi. - ## Justering `justify` styrer hvordan barn-elementene fordeles vertikalt. Tilsvarer CSS-egenskapen `justify-content`. @@ -67,7 +39,7 @@ I de aller fleste tilfeller skal du bruke `size`. `size` er knyttet direkte til ```html
@@ -76,7 +48,7 @@ I de aller fleste tilfeller skal du bruke `size`. `size` er knyttet direkte til
@@ -85,7 +57,7 @@ I de aller fleste tilfeller skal du bruke `size`. `size` er knyttet direkte til
@@ -94,7 +66,7 @@ I de aller fleste tilfeller skal du bruke `size`. `size` er knyttet direkte til
@@ -103,7 +75,7 @@ I de aller fleste tilfeller skal du bruke `size`. `size` er knyttet direkte til
@@ -112,7 +84,7 @@ I de aller fleste tilfeller skal du bruke `size`. `size` er knyttet direkte til
@@ -123,22 +95,6 @@ I de aller fleste tilfeller skal du bruke `size`. `size` er knyttet direkte til
-## Alias for mellomrom - -`space` er et alias for `gap`. Brukes hvis `gap`-attributtet kolliderer med annen styling. - - - -```html - -
-
-
-
-``` - -
- ## Nøsting Stacks kan nøstes for å bygge opp et hierarki av avstander. @@ -146,13 +102,13 @@ Stacks kan nøstes for å bygge opp et hierarki av avstander. ```html - - + +
- +
@@ -195,9 +151,7 @@ Uten `stack-layout` klistrer elementene seg sammen og må styles individuelt for ## Egenskaper -| Egenskap | Type | Standard | Beskrivelse | -| --------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ------------ | ----------------------------------------------------------------------------------------- | -| `size` | `'none' \| '2x-small' \| 'x-small' \| 'small' \| 'medium' \| 'large' \| 'x-large' \| '2x-large' \| '3x-large' \| '4x-large' \| '5x-large'` | – | Tokenbasert mellomrom. Mapper til `--spacing-`. Autoutfylling i editoren. | -| `gap` | `string` | – | Eksakt CSS-lengde (`"12px"`, `"1.25rem"`). Skal **ikke** brukes for tokens – bruk `size`. | -| `space` | `string` | – | Alias for `gap` med samme regler. | -| `justify` | `string` (`justify-content`-verdi) | `flex-start` | Fordeling langs den vertikale aksen. | +| Egenskap | Type | Standard | Beskrivelse | +| --------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ------------ | -------------------------------------------------------------------------------- | +| `gap` | `'none' \| '2x-small' \| 'x-small' \| 'small' \| 'medium' \| 'large' \| 'x-large' \| '2x-large' \| '3x-large' \| '4x-large' \| '5x-large'` | `medium` | Tokenbasert mellomrom. Mapper til `--spacing-`. Autoutfylling i editoren. | +| `justify` | `string` (`justify-content`-verdi) | `flex-start` | Fordeling langs den vertikale aksen. | diff --git a/src/components/box-layout/box-layout.component.ts b/src/components/box-layout/box-layout.component.ts index 5b2de2bd..70e8cd32 100644 --- a/src/components/box-layout/box-layout.component.ts +++ b/src/components/box-layout/box-layout.component.ts @@ -6,14 +6,13 @@ import { LitElement, html } from 'lit'; * Pakker innhold i en boks med padding. * Basert på Box-primitiven fra Every Layout. * - * Bruk fortrinnsvis `size` (mapper til spacing-tokens i designsystemet). - * Bruk kun `padding` når en eksakt, ikke-tokenbasert verdi er nødvendig. + * Padding styres av `padding` og er låst til spacing-tokenene i designsystemet. + * Bakgrunnsfarge styres av `background` og er låst til feedback-fargetokenene. * - * @property {string} padding - Eksakt CSS-lengde, f.eks. "12px" eller "1.25rem". Skal ikke brukes for token-verdier, bruk heller `size`. - * @property {Size} size - Forhåndsdefinert tokenbasert størrelse. + * @property {BoxLayoutPadding} padding - Forhåndsdefinert tokenbasert padding. * @property {BoxLayoutBackground} background - Forhåndsdefinert tokenbasert bakgrunnsfarge. */ -export type BoxLayoutSize = +export type BoxLayoutPadding = | 'none' | '2x-small' | 'x-small' @@ -43,19 +42,12 @@ export type BoxLayoutBackground = export default class BoxLayout extends LitElement { static styles = [styles]; - /** Eksakt CSS-lengde, f.eks. "12px" eller "1.25rem". Skal IKKE brukes for token-verdier – bruk `size` til det. */ - @property({ type: String, reflect: true }) padding?: string; - /** Forhåndsdefinert tokenbasert padding. Mapper til `--spacing-`. */ - @property({ type: String, reflect: true }) size?: BoxLayoutSize; + @property({ type: String, reflect: true }) padding?: BoxLayoutPadding; /** Forhåndsdefinert tokenbasert bakgrunnsfarge. Mapper til `--color-feedback-background-*`. */ @property({ type: String, reflect: true }) background?: BoxLayoutBackground; - updated() { - if (this.padding !== undefined) this.style.setProperty('--_box-padding', this.padding); - } - render() { return html``; } diff --git a/src/components/box-layout/box-layout.styles.ts b/src/components/box-layout/box-layout.styles.ts index 7198c39e..81ea3060 100644 --- a/src/components/box-layout/box-layout.styles.ts +++ b/src/components/box-layout/box-layout.styles.ts @@ -3,75 +3,75 @@ import { css } from 'lit'; export default css` :host { display: block; - padding: var(--_box-padding, var(--spacing-medium)); - background: var(--_box-background, transparent); + padding: var(--spacing-medium); + background: transparent; } - :host([size='none']) { - --_box-padding: var(--spacing-none); + :host([padding='none']) { + padding: var(--spacing-none); } - :host([size='2x-small']) { - --_box-padding: var(--spacing-2x-small); + :host([padding='2x-small']) { + padding: var(--spacing-2x-small); } - :host([size='x-small']) { - --_box-padding: var(--spacing-x-small); + :host([padding='x-small']) { + padding: var(--spacing-x-small); } - :host([size='small']) { - --_box-padding: var(--spacing-small); + :host([padding='small']) { + padding: var(--spacing-small); } - :host([size='medium']) { - --_box-padding: var(--spacing-medium); + :host([padding='medium']) { + padding: var(--spacing-medium); } - :host([size='large']) { - --_box-padding: var(--spacing-large); + :host([padding='large']) { + padding: var(--spacing-large); } - :host([size='x-large']) { - --_box-padding: var(--spacing-x-large); + :host([padding='x-large']) { + padding: var(--spacing-x-large); } - :host([size='2x-large']) { - --_box-padding: var(--spacing-2x-large); + :host([padding='2x-large']) { + padding: var(--spacing-2x-large); } - :host([size='3x-large']) { - --_box-padding: var(--spacing-3x-large); + :host([padding='3x-large']) { + padding: var(--spacing-3x-large); } - :host([size='4x-large']) { - --_box-padding: var(--spacing-4x-large); + :host([padding='4x-large']) { + padding: var(--spacing-4x-large); } - :host([size='5x-large']) { - --_box-padding: var(--spacing-5x-large); + :host([padding='5x-large']) { + padding: var(--spacing-5x-large); } :host([background='none']) { - --_box-background: transparent; + background: transparent; } :host([background='neutral']) { - --_box-background: var(--color-feedback-background-default-neutral); + background: var(--color-feedback-background-default-neutral); } :host([background='neutral-subtle']) { - --_box-background: var(--color-feedback-background-subtle-neutral); + background: var(--color-feedback-background-subtle-neutral); } :host([background='info']) { - --_box-background: var(--color-feedback-background-default-info); + background: var(--color-feedback-background-default-info); } :host([background='info-subtle']) { - --_box-background: var(--color-feedback-background-subtle-info); + background: var(--color-feedback-background-subtle-info); } :host([background='success']) { - --_box-background: var(--color-feedback-background-default-success); + background: var(--color-feedback-background-default-success); } :host([background='success-subtle']) { - --_box-background: var(--color-feedback-background-subtle-success); + background: var(--color-feedback-background-subtle-success); } :host([background='warning']) { - --_box-background: var(--color-feedback-background-default-warning); + background: var(--color-feedback-background-default-warning); } :host([background='warning-subtle']) { - --_box-background: var(--color-feedback-background-subtle-warning); + background: var(--color-feedback-background-subtle-warning); } :host([background='error']) { - --_box-background: var(--color-feedback-background-default-error); + background: var(--color-feedback-background-default-error); } :host([background='error-subtle']) { - --_box-background: var(--color-feedback-background-subtle-error); + background: var(--color-feedback-background-subtle-error); } `; diff --git a/src/components/cluster-layout/cluster-layout.component.ts b/src/components/cluster-layout/cluster-layout.component.ts index fcaaa607..2e4a735f 100644 --- a/src/components/cluster-layout/cluster-layout.component.ts +++ b/src/components/cluster-layout/cluster-layout.component.ts @@ -6,15 +6,13 @@ import { LitElement, html } from 'lit'; * Grupperer barn-elementer horisontalt med automatisk linjebryting. * Basert på Cluster-primitiven fra Every Layout. * - * Bruk `size` (mapper til spacing-tokens i designsystemet). - * Bruk kun `gap` når en eksakt, ikke-tokenbasert verdi er nødvendig. + * Mellomrommet styres av `gap` og er låst til spacing-tokenene i designsystemet. * - * @property {string} gap - Eksakt CSS-lengde, f.eks. "12px" eller "1.25rem". Skal ikke brukes for token-verdier, bruk heller `size`. - * @property {Size} size - Forhåndsdefinert tokenbasert mellomrom. + * @property {ClusterLayoutGap} gap - Forhåndsdefinert tokenbasert mellomrom. * @property {string} justify - justify-content-verdi. Standard: flex-start. * @property {string} align - align-items-verdi. Standard: center. */ -export type ClusterLayoutSize = +export type ClusterLayoutGap = | 'none' | '2x-small' | 'x-small' @@ -31,11 +29,8 @@ export type ClusterLayoutSize = export default class ClusterLayout extends LitElement { static styles = [styles]; - /** Eksakt CSS-lengde for mellomrom. Skal ikke brukes for token-verdier, bruk heller `size`. */ - @property({ type: String, reflect: true }) gap?: string; - /** Forhåndsdefinert tokenbasert mellomrom. Mapper til `--spacing-`. */ - @property({ type: String, reflect: true }) size?: ClusterLayoutSize; + @property({ type: String, reflect: true }) gap?: ClusterLayoutGap; /** justify-content på flex-containeren. Standard: flex-start. */ @property({ type: String, reflect: true }) justify: string = 'flex-start'; @@ -44,7 +39,6 @@ export default class ClusterLayout extends LitElement { @property({ type: String, reflect: true }) align: string = 'center'; updated() { - if (this.gap !== undefined) this.style.setProperty('--_cluster-gap', this.gap); this.style.setProperty('--_cluster-justify', this.justify); this.style.setProperty('--_cluster-align', this.align); } diff --git a/src/components/cluster-layout/cluster-layout.styles.ts b/src/components/cluster-layout/cluster-layout.styles.ts index a0f82fea..3d682f69 100644 --- a/src/components/cluster-layout/cluster-layout.styles.ts +++ b/src/components/cluster-layout/cluster-layout.styles.ts @@ -4,42 +4,42 @@ export default css` :host { display: flex; flex-wrap: wrap; - gap: var(--_cluster-gap, var(--spacing-medium)); + gap: var(--spacing-medium); justify-content: var(--_cluster-justify, flex-start); align-items: var(--_cluster-align, center); } - :host([size='none']) { - --_cluster-gap: var(--spacing-none); + :host([gap='none']) { + gap: var(--spacing-none); } - :host([size='2x-small']) { - --_cluster-gap: var(--spacing-2x-small); + :host([gap='2x-small']) { + gap: var(--spacing-2x-small); } - :host([size='x-small']) { - --_cluster-gap: var(--spacing-x-small); + :host([gap='x-small']) { + gap: var(--spacing-x-small); } - :host([size='small']) { - --_cluster-gap: var(--spacing-small); + :host([gap='small']) { + gap: var(--spacing-small); } - :host([size='medium']) { - --_cluster-gap: var(--spacing-medium); + :host([gap='medium']) { + gap: var(--spacing-medium); } - :host([size='large']) { - --_cluster-gap: var(--spacing-large); + :host([gap='large']) { + gap: var(--spacing-large); } - :host([size='x-large']) { - --_cluster-gap: var(--spacing-x-large); + :host([gap='x-large']) { + gap: var(--spacing-x-large); } - :host([size='2x-large']) { - --_cluster-gap: var(--spacing-2x-large); + :host([gap='2x-large']) { + gap: var(--spacing-2x-large); } - :host([size='3x-large']) { - --_cluster-gap: var(--spacing-3x-large); + :host([gap='3x-large']) { + gap: var(--spacing-3x-large); } - :host([size='4x-large']) { - --_cluster-gap: var(--spacing-4x-large); + :host([gap='4x-large']) { + gap: var(--spacing-4x-large); } - :host([size='5x-large']) { - --_cluster-gap: var(--spacing-5x-large); + :host([gap='5x-large']) { + gap: var(--spacing-5x-large); } `; diff --git a/src/components/grid-layout/grid-layout.component.ts b/src/components/grid-layout/grid-layout.component.ts index 6b4a8ef4..8afa23b1 100644 --- a/src/components/grid-layout/grid-layout.component.ts +++ b/src/components/grid-layout/grid-layout.component.ts @@ -6,14 +6,12 @@ import { LitElement, html } from 'lit'; * Et responsivt rutenett som automatisk bryter til nye linjer basert på en minste kolonnebredde. * Basert på Grid-primitiven fra Every Layout. * - * Bruk fortrinnsvis `size` (mapper til spacing-tokens i designsystemet). - * Bruk kun `gap` når en eksakt, ikke-tokenbasert verdi er nødvendig. + * Mellomrommet styres av `gap` og er låst til spacing-tokenene i designsystemet. * * @property {string} min - Minste kolonnebredde, f.eks. "250px" eller "16rem". Bestemmer når rutenettet bryter til ny linje. - * @property {string} gap - Eksakt CSS-lengde, f.eks. "12px" eller "1.25rem". Skal ikke brukes for token-verdier, bruk heller `size`. - * @property {Size} size - Forhåndsdefinert tokenbasert mellomrom. + * @property {GridLayoutGap} gap - Forhåndsdefinert tokenbasert mellomrom. */ -export type GridLayoutSize = +export type GridLayoutGap = | 'none' | '2x-small' | 'x-small' @@ -33,14 +31,10 @@ export default class GridLayout extends LitElement { /** Minste kolonnebredde. Bestemmer når rutenettet bryter til ny linje. Standard: 250px. */ @property({ type: String, reflect: true }) min: string = '250px'; - /** Eksakt CSS-lengde for mellomrom. Skal IKKE brukes for token-verdier – bruk `size` til det. */ - @property({ type: String, reflect: true }) gap?: string; - /** Forhåndsdefinert tokenbasert mellomrom. Mapper til `--spacing-`. */ - @property({ type: String, reflect: true }) size?: GridLayoutSize; + @property({ type: String, reflect: true }) gap?: GridLayoutGap; updated() { - if (this.gap !== undefined) this.style.setProperty('--_grid-gap', this.gap); this.style.setProperty('--_grid-min', this.min); } diff --git a/src/components/grid-layout/grid-layout.styles.ts b/src/components/grid-layout/grid-layout.styles.ts index fb836182..99ba5ce8 100644 --- a/src/components/grid-layout/grid-layout.styles.ts +++ b/src/components/grid-layout/grid-layout.styles.ts @@ -4,40 +4,40 @@ export default css` :host { display: grid; grid-template-columns: repeat(auto-fit, minmax(var(--_grid-min, 250px), 1fr)); - gap: var(--_grid-gap, var(--spacing-medium)); + gap: var(--spacing-medium); } - :host([size='none']) { - --_grid-gap: var(--spacing-none); + :host([gap='none']) { + gap: var(--spacing-none); } - :host([size='2x-small']) { - --_grid-gap: var(--spacing-2x-small); + :host([gap='2x-small']) { + gap: var(--spacing-2x-small); } - :host([size='x-small']) { - --_grid-gap: var(--spacing-x-small); + :host([gap='x-small']) { + gap: var(--spacing-x-small); } - :host([size='small']) { - --_grid-gap: var(--spacing-small); + :host([gap='small']) { + gap: var(--spacing-small); } - :host([size='medium']) { - --_grid-gap: var(--spacing-medium); + :host([gap='medium']) { + gap: var(--spacing-medium); } - :host([size='large']) { - --_grid-gap: var(--spacing-large); + :host([gap='large']) { + gap: var(--spacing-large); } - :host([size='x-large']) { - --_grid-gap: var(--spacing-x-large); + :host([gap='x-large']) { + gap: var(--spacing-x-large); } - :host([size='2x-large']) { - --_grid-gap: var(--spacing-2x-large); + :host([gap='2x-large']) { + gap: var(--spacing-2x-large); } - :host([size='3x-large']) { - --_grid-gap: var(--spacing-3x-large); + :host([gap='3x-large']) { + gap: var(--spacing-3x-large); } - :host([size='4x-large']) { - --_grid-gap: var(--spacing-4x-large); + :host([gap='4x-large']) { + gap: var(--spacing-4x-large); } - :host([size='5x-large']) { - --_grid-gap: var(--spacing-5x-large); + :host([gap='5x-large']) { + gap: var(--spacing-5x-large); } `; diff --git a/src/components/stack-layout/stack-layout.component.ts b/src/components/stack-layout/stack-layout.component.ts index 577fd70e..9a69e8f8 100644 --- a/src/components/stack-layout/stack-layout.component.ts +++ b/src/components/stack-layout/stack-layout.component.ts @@ -6,15 +6,12 @@ import { LitElement, html } from 'lit'; * Stabler barn-elementer vertikalt med konsistent mellomrom. * Basert på Stack-primitiven fra Every Layout. * - * Bruk `size` (mapper til spacing-tokens i designsystemet). - * Bruk kun `gap`/`space` når en eksakt, ikke-tokenbasert verdi er nødvendig. + * Mellomrommet styres av `gap` og er låst til spacing-tokenene i designsystemet. * - * @property {string} gap - Eksakt CSS-lengde, f.eks. "12px" eller "1.25rem". Skal ikke brukes for token-verdier, bruk heller `size`. - * @property {string} space - Alias for gap. Brukes hvis gap ikke er satt. - * @property {Size} size - Forhåndsdefinert tokenbasert størrelse. + * @property {StackLayoutGap} gap - Forhåndsdefinert tokenbasert mellomrom. * @property {string} justify - justify-content-verdi. Standard: flex-start. */ -export type StackLayoutSize = +export type StackLayoutGap = | 'none' | '2x-small' | 'x-small' @@ -31,21 +28,13 @@ export type StackLayoutSize = export default class StackLayout extends LitElement { static styles = [styles]; - /** Eksakt CSS-lengde, f.eks. "12px" eller "1.25rem". Skal IKKE brukes for token-verdier – bruk `size` til det. */ - @property({ type: String, reflect: true }) gap?: string; - - /** Alias for gap – brukes hvis gap ikke er satt. */ - @property({ type: String, reflect: true }) space?: string; - - /** Forhåndsdefinert tokenbasert størrelse. Mapper til `--spacing-`. */ - @property({ type: String, reflect: true }) size?: StackLayoutSize; + /** Forhåndsdefinert tokenbasert mellomrom. Mapper til `--spacing-`. */ + @property({ type: String, reflect: true }) gap?: StackLayoutGap; /** justify-content på flex-containeren. Standard: flex-start. */ @property({ type: String, reflect: true }) justify: string = 'flex-start'; updated() { - const spacing = this.gap ?? this.space; - if (spacing !== undefined) this.style.setProperty('--_stack-gap', spacing); this.style.setProperty('--_stack-justify', this.justify); } diff --git a/src/components/stack-layout/stack-layout.styles.ts b/src/components/stack-layout/stack-layout.styles.ts index 2093f5eb..9892fa5e 100644 --- a/src/components/stack-layout/stack-layout.styles.ts +++ b/src/components/stack-layout/stack-layout.styles.ts @@ -4,41 +4,41 @@ export default css` :host { display: flex; flex-direction: column; - gap: var(--_stack-gap, var(--spacing-medium)); + gap: var(--spacing-medium); justify-content: var(--_stack-justify, flex-start); } - :host([size='none']) { - --_stack-gap: var(--spacing-none); + :host([gap='none']) { + gap: var(--spacing-none); } - :host([size='2x-small']) { - --_stack-gap: var(--spacing-2x-small); + :host([gap='2x-small']) { + gap: var(--spacing-2x-small); } - :host([size='x-small']) { - --_stack-gap: var(--spacing-x-small); + :host([gap='x-small']) { + gap: var(--spacing-x-small); } - :host([size='small']) { - --_stack-gap: var(--spacing-small); + :host([gap='small']) { + gap: var(--spacing-small); } - :host([size='medium']) { - --_stack-gap: var(--spacing-medium); + :host([gap='medium']) { + gap: var(--spacing-medium); } - :host([size='large']) { - --_stack-gap: var(--spacing-large); + :host([gap='large']) { + gap: var(--spacing-large); } - :host([size='x-large']) { - --_stack-gap: var(--spacing-x-large); + :host([gap='x-large']) { + gap: var(--spacing-x-large); } - :host([size='2x-large']) { - --_stack-gap: var(--spacing-2x-large); + :host([gap='2x-large']) { + gap: var(--spacing-2x-large); } - :host([size='3x-large']) { - --_stack-gap: var(--spacing-3x-large); + :host([gap='3x-large']) { + gap: var(--spacing-3x-large); } - :host([size='4x-large']) { - --_stack-gap: var(--spacing-4x-large); + :host([gap='4x-large']) { + gap: var(--spacing-4x-large); } - :host([size='5x-large']) { - --_stack-gap: var(--spacing-5x-large); + :host([gap='5x-large']) { + gap: var(--spacing-5x-large); } `; From a85c13f9121075a30ea3262975181cd90cb9b75d Mon Sep 17 00:00:00 2001 From: malingranly Date: Fri, 12 Jun 2026 12:40:18 +0200 Subject: [PATCH 08/15] fikset mappestruktur og navngivning --- doc-site/.vitepress/config.mts | 2 +- doc-site/.vitepress/theme/index.ts | 2 +- doc-site/layout/layout-oversikt.md | 28 ++++----- doc-site/layout/{box-layout.md => nve-box.md} | 52 ++++++++-------- .../{cluster-layout.md => nve-cluster.md} | 50 ++++++++-------- .../layout/{grid-layout.md => nve-grid.md} | 24 ++++---- .../layout/{stack-layout.md => nve-stack.md} | 60 +++++++++---------- .../nve-box/nve-box.component.ts} | 8 +-- .../nve-box/nve-box.styles.ts} | 0 .../nve-cluster/nve-cluster.component.ts} | 8 +-- .../nve-cluster/nve-cluster.styles.ts} | 0 .../nve-grid/nve-grid.component.ts} | 8 +-- .../nve-grid/nve-grid.styles.ts} | 0 .../nve-stack/nve-stack.component.ts} | 8 +-- .../nve-stack/nve-stack.styles.ts} | 0 src/nve-designsystem.ts | 8 +-- 16 files changed, 128 insertions(+), 130 deletions(-) rename doc-site/layout/{box-layout.md => nve-box.md} (75%) rename doc-site/layout/{cluster-layout.md => nve-cluster.md} (86%) rename doc-site/layout/{grid-layout.md => nve-grid.md} (93%) rename doc-site/layout/{stack-layout.md => nve-stack.md} (83%) rename src/components/{box-layout/box-layout.component.ts => layouts/nve-box/nve-box.component.ts} (90%) rename src/components/{box-layout/box-layout.styles.ts => layouts/nve-box/nve-box.styles.ts} (100%) rename src/components/{cluster-layout/cluster-layout.component.ts => layouts/nve-cluster/nve-cluster.component.ts} (89%) rename src/components/{cluster-layout/cluster-layout.styles.ts => layouts/nve-cluster/nve-cluster.styles.ts} (100%) rename src/components/{grid-layout/grid-layout.component.ts => layouts/nve-grid/nve-grid.component.ts} (88%) rename src/components/{grid-layout/grid-layout.styles.ts => layouts/nve-grid/nve-grid.styles.ts} (100%) rename src/components/{stack-layout/stack-layout.component.ts => layouts/nve-stack/nve-stack.component.ts} (87%) rename src/components/{stack-layout/stack-layout.styles.ts => layouts/nve-stack/nve-stack.styles.ts} (100%) diff --git a/doc-site/.vitepress/config.mts b/doc-site/.vitepress/config.mts index c26f5f0b..8cea5556 100644 --- a/doc-site/.vitepress/config.mts +++ b/doc-site/.vitepress/config.mts @@ -72,7 +72,7 @@ export default defineConfig({ { text: 'Commit-meldinger', link: '/introduction/forDesigner/commitMessages' }, ], }, - { + { text: 'Designelementer', items: [ { text: 'Tokens', link: '/introduction/designelementer/tokens' }, diff --git a/doc-site/.vitepress/theme/index.ts b/doc-site/.vitepress/theme/index.ts index b67ab444..3aa5f32a 100644 --- a/doc-site/.vitepress/theme/index.ts +++ b/doc-site/.vitepress/theme/index.ts @@ -69,7 +69,7 @@ export default { if (!import.meta.env.SSR) { // siden VitePress bygges via SSR, vi må sikre at våre web komponenter lastes ned i nettleseren bare // derfor importerer vi alle komponenter når miljø ikke er SSR - const components = import.meta.glob('../../../src/components/*/*.component.ts'); + const components = import.meta.glob('../../../src/components/**/*.component.ts'); // Lese inn nve_theme.css for å hente ut css variabler const styles = import.meta.glob('./styles/nve_theme.css', { query: '?raw', import: 'default' }); diff --git a/doc-site/layout/layout-oversikt.md b/doc-site/layout/layout-oversikt.md index e288508f..57c8be85 100644 --- a/doc-site/layout/layout-oversikt.md +++ b/doc-site/layout/layout-oversikt.md @@ -11,10 +11,10 @@ Du slipper å skrive egen CSS for vanlige oppsett, og avstander hentes fra desig Bruk layout-komponentene når du vil: -- Stable elementer vertikalt med konsistent mellomrom (`stack-layout`) -- Gruppere elementer horisontalt med automatisk linjebryting (`cluster-layout`) -- Lage et responsivt rutenett (`grid-layout`) -- Gi et element definert padding og bakgrunn (`box-layout`) +- Stable elementer vertikalt med konsistent mellomrom (`nve-stack`) +- Gruppere elementer horisontalt med automatisk linjebryting (`nve-cluster`) +- Lage et responsivt rutenett (`nve-grid`) +- Gi et element definert padding og bakgrunn (`nve-box`) ## Prinsipper @@ -22,27 +22,27 @@ Layout-komponentene har ingen farger, fonter eller annen visuell stil, de styrer ## Eksempel på bruk -Layout-komponentene er laget for å kombineres. Et kontaktskjema er et typisk eksempel som bruker alle fire: `box-layout` gir kortet ramme og padding, `stack-layout` stabler feltene vertikalt, `grid-layout` legger fornavn og etternavn ved siden av hverandre og bryter til en kolonne på smale skjermer. `cluster-layout` plasserer knappene nederst. +Layout-komponentene er laget for å kombineres. Et kontaktskjema er et typisk eksempel som bruker alle fire: `nve-box` gir kortet ramme og padding, `nve-stack` stabler feltene vertikalt, `nve-grid` legger fornavn og etternavn ved siden av hverandre og bryter til en kolonne på smale skjermer. `nve-cluster` plasserer knappene nederst. ```html - - + + Kontakt oss

Fyll ut skjemaet, så tar vi kontakt så raskt vi kan.

- + - + - - Avbryt + + Avbryt Send - -
-
+ + + ```
diff --git a/doc-site/layout/box-layout.md b/doc-site/layout/nve-box.md similarity index 75% rename from doc-site/layout/box-layout.md rename to doc-site/layout/nve-box.md index b2731184..9386e09d 100644 --- a/doc-site/layout/box-layout.md +++ b/doc-site/layout/nve-box.md @@ -1,6 +1,6 @@ -# box-layout +# nve-box -`box-layout` pakker innhold i en boks med konsistent padding. +`nve-box` pakker innhold i en boks med konsistent padding. I de aller fleste tilfeller skal du bruke `padding`. `padding` er knyttet direkte til spacing-tokenene i designsystemet og sikrer at paddingen er konsistent på tvers av sider og komponenter. @@ -11,15 +11,15 @@ I de aller fleste tilfeller skal du bruke `padding`. `padding` er knyttet direkt ```html - +
-
- + +
-
- + +
-
+ ```
@@ -31,27 +31,25 @@ I de aller fleste tilfeller skal du bruke `padding`. `padding` er knyttet direkt ```html - + neutral - - + + info - - + + success - - + + warning - - + + error - + ``` -Trenger du en farge som ikke finnes blant tokenene, kan du fortsatt sette bakgrunn via style-attributtet. Foretrekk likevel background-propen for konsistens. - ## Nøsting Bokser kan nøstes for å bygge opp et hierarki av padding. @@ -59,11 +57,11 @@ Bokser kan nøstes for å bygge opp et hierarki av padding. ```html - - + +
-
-
+ + ```
@@ -75,14 +73,14 @@ En boks med konsistent padding rundt en tekst. ```html - + Innhold med jevn padding rundt. - + ``` -Samme innhold uten `box-layout` hvor teksten ligger helt inntil kanten. +Samme innhold uten `nve-box` hvor teksten ligger helt inntil kanten. diff --git a/doc-site/layout/cluster-layout.md b/doc-site/layout/nve-cluster.md similarity index 86% rename from doc-site/layout/cluster-layout.md rename to doc-site/layout/nve-cluster.md index 867cd2e3..cf22c03d 100644 --- a/doc-site/layout/cluster-layout.md +++ b/doc-site/layout/nve-cluster.md @@ -1,6 +1,6 @@ -# cluster-layout +# nve-cluster -`cluster-layout` grupperer barn-elementer horisontalt med konsistent mellomrom og automatisk linjebryting. Brukes typisk for knappegrupper, tag-lister og navigasjon. +`nve-cluster` grupperer barn-elementer horisontalt med konsistent mellomrom og automatisk linjebryting. Brukes typisk for knappegrupper, tag-lister og navigasjon. I de aller fleste tilfeller skal du bruke `gap`. `gap` er knyttet direkte til spacing-tokenene i designsystemet og sikrer at avstandene er konsistente på tvers av sider og komponenter. @@ -11,21 +11,21 @@ I de aller fleste tilfeller skal du bruke `gap`. `gap` er knyttet direkte til sp ```html - +
-
- + +
-
- + +
-
+ ```
@@ -37,38 +37,38 @@ I de aller fleste tilfeller skal du bruke `gap`. `gap` er knyttet direkte til sp ```html -
-
- +
-
- +
-
- +
-
+ ```
@@ -80,7 +80,7 @@ I de aller fleste tilfeller skal du bruke `gap`. `gap` er knyttet direkte til sp ```html -
-
- +
- - +
- + ```
@@ -119,17 +119,17 @@ En knapperad som automatisk bryter til ny linje på smalere skjermer. ```html
- + Lagre Forhåndsvis Avbryt - +
```
-Til sammenligning, samme knapper i en vanlig `
` uten `cluster-layout`. Det er ingen mellomrom mellom knappene, og når de bryter til ny linje, klistrer de seg sammen. +Til sammenligning, samme knapper i en vanlig `
` uten `nve-cluster`. Det er ingen mellomrom mellom knappene, og når de bryter til ny linje, klistrer de seg sammen. diff --git a/doc-site/layout/grid-layout.md b/doc-site/layout/nve-grid.md similarity index 93% rename from doc-site/layout/grid-layout.md rename to doc-site/layout/nve-grid.md index c6ea18d7..143ba063 100644 --- a/doc-site/layout/grid-layout.md +++ b/doc-site/layout/nve-grid.md @@ -1,6 +1,6 @@ -# grid-layout +# nve-grid -`grid-layout` lager et responsivt rutenett som automatisk bryter til nye linjer basert på en minste kolonnebredde. +`nve-grid` lager et responsivt rutenett som automatisk bryter til nye linjer basert på en minste kolonnebredde. I de aller fleste tilfeller skal du bruke `gap` for mellomrom. `gap` er knyttet direkte til spacing-tokenene i designsystemet og sikrer at avstandene er konsistente på tvers av sider og komponenter. @@ -14,7 +14,7 @@ I de aller fleste tilfeller skal du bruke `gap` for mellomrom. `gap` er knyttet ```html
- +
@@ -33,7 +33,7 @@ I de aller fleste tilfeller skal du bruke `gap` for mellomrom. `gap` er knyttet
-
+
``` @@ -46,7 +46,7 @@ I de aller fleste tilfeller skal du bruke `gap` for mellomrom. `gap` er knyttet ```html -
- - + +
@@ -77,8 +77,8 @@ I de aller fleste tilfeller skal du bruke `gap` for mellomrom. `gap` er knyttet
-
- +
- + ```
@@ -107,14 +107,14 @@ Et responsivt rutenett med navigasjonskort som tilpasser antall kolonner etter t ```html - + - + ``` diff --git a/doc-site/layout/stack-layout.md b/doc-site/layout/nve-stack.md similarity index 83% rename from doc-site/layout/stack-layout.md rename to doc-site/layout/nve-stack.md index f681ef19..a8940f55 100644 --- a/doc-site/layout/stack-layout.md +++ b/doc-site/layout/nve-stack.md @@ -1,6 +1,6 @@ -# stack-layout +# nve-stack -`stack-layout` stabler barn-elementer vertikalt med mellomrom. +`nve-stack` stabler barn-elementer vertikalt med mellomrom. I de aller fleste tilfeller skal du bruke `gap`. `gap` er knyttet direkte til spacing-tokenene i designsystemet og er det som sikrer at avstandene er konsistente på tvers av sider og komponenter. @@ -11,21 +11,21 @@ I de aller fleste tilfeller skal du bruke `gap`. `gap` er knyttet direkte til sp ```html - +
-
- + +
-
- + +
-
+ ```
@@ -37,7 +37,7 @@ I de aller fleste tilfeller skal du bruke `gap`. `gap` er knyttet direkte til sp ```html -
-
- +
-
- +
-
- +
-
- +
-
- +
-
+ ```
@@ -102,39 +102,39 @@ Stacks kan nøstes for å bygge opp et hierarki av avstander. ```html - - + +
-
- + +
-
-
+ + ```
## Eksempel på bruk -Med `stack-layout` får du konsistent avstand fra et token, uten egen CSS. +Med `nve-stack` får du konsistent avstand fra et token, uten egen CSS. ```html - + Send inn - + ``` -Uten `stack-layout` klistrer elementene seg sammen og må styles individuelt for å få luft mellom seg. +Uten `nve-stack` klistrer elementene seg sammen og må styles individuelt for å få luft mellom seg. diff --git a/src/components/box-layout/box-layout.component.ts b/src/components/layouts/nve-box/nve-box.component.ts similarity index 90% rename from src/components/box-layout/box-layout.component.ts rename to src/components/layouts/nve-box/nve-box.component.ts index 70e8cd32..07dc56c1 100644 --- a/src/components/box-layout/box-layout.component.ts +++ b/src/components/layouts/nve-box/nve-box.component.ts @@ -1,5 +1,5 @@ import { customElement, property } from 'lit/decorators.js'; -import styles from './box-layout.styles'; +import styles from './nve-box.styles'; import { LitElement, html } from 'lit'; /** @@ -38,8 +38,8 @@ export type BoxLayoutBackground = | 'error' | 'error-subtle'; -@customElement('box-layout') -export default class BoxLayout extends LitElement { +@customElement('nve-box') +export default class NveBox extends LitElement { static styles = [styles]; /** Forhåndsdefinert tokenbasert padding. Mapper til `--spacing-`. */ @@ -55,6 +55,6 @@ export default class BoxLayout extends LitElement { declare global { interface HTMLElementTagNameMap { - 'box-layout': BoxLayout; + 'nve-box': NveBox; } } diff --git a/src/components/box-layout/box-layout.styles.ts b/src/components/layouts/nve-box/nve-box.styles.ts similarity index 100% rename from src/components/box-layout/box-layout.styles.ts rename to src/components/layouts/nve-box/nve-box.styles.ts diff --git a/src/components/cluster-layout/cluster-layout.component.ts b/src/components/layouts/nve-cluster/nve-cluster.component.ts similarity index 89% rename from src/components/cluster-layout/cluster-layout.component.ts rename to src/components/layouts/nve-cluster/nve-cluster.component.ts index 2e4a735f..c1850752 100644 --- a/src/components/cluster-layout/cluster-layout.component.ts +++ b/src/components/layouts/nve-cluster/nve-cluster.component.ts @@ -1,5 +1,5 @@ import { customElement, property } from 'lit/decorators.js'; -import styles from './cluster-layout.styles'; +import styles from './nve-cluster.styles'; import { LitElement, html } from 'lit'; /** @@ -25,8 +25,8 @@ export type ClusterLayoutGap = | '4x-large' | '5x-large'; -@customElement('cluster-layout') -export default class ClusterLayout extends LitElement { +@customElement('nve-cluster') +export default class NveCluster extends LitElement { static styles = [styles]; /** Forhåndsdefinert tokenbasert mellomrom. Mapper til `--spacing-`. */ @@ -50,6 +50,6 @@ export default class ClusterLayout extends LitElement { declare global { interface HTMLElementTagNameMap { - 'cluster-layout': ClusterLayout; + 'nve-cluster': NveCluster; } } diff --git a/src/components/cluster-layout/cluster-layout.styles.ts b/src/components/layouts/nve-cluster/nve-cluster.styles.ts similarity index 100% rename from src/components/cluster-layout/cluster-layout.styles.ts rename to src/components/layouts/nve-cluster/nve-cluster.styles.ts diff --git a/src/components/grid-layout/grid-layout.component.ts b/src/components/layouts/nve-grid/nve-grid.component.ts similarity index 88% rename from src/components/grid-layout/grid-layout.component.ts rename to src/components/layouts/nve-grid/nve-grid.component.ts index 8afa23b1..b12d14f2 100644 --- a/src/components/grid-layout/grid-layout.component.ts +++ b/src/components/layouts/nve-grid/nve-grid.component.ts @@ -1,5 +1,5 @@ import { customElement, property } from 'lit/decorators.js'; -import styles from './grid-layout.styles'; +import styles from './nve-grid.styles'; import { LitElement, html } from 'lit'; /** @@ -24,8 +24,8 @@ export type GridLayoutGap = | '4x-large' | '5x-large'; -@customElement('grid-layout') -export default class GridLayout extends LitElement { +@customElement('nve-grid') +export default class NveGrid extends LitElement { static styles = [styles]; /** Minste kolonnebredde. Bestemmer når rutenettet bryter til ny linje. Standard: 250px. */ @@ -45,6 +45,6 @@ export default class GridLayout extends LitElement { declare global { interface HTMLElementTagNameMap { - 'grid-layout': GridLayout; + 'nve-grid': NveGrid; } } diff --git a/src/components/grid-layout/grid-layout.styles.ts b/src/components/layouts/nve-grid/nve-grid.styles.ts similarity index 100% rename from src/components/grid-layout/grid-layout.styles.ts rename to src/components/layouts/nve-grid/nve-grid.styles.ts diff --git a/src/components/stack-layout/stack-layout.component.ts b/src/components/layouts/nve-stack/nve-stack.component.ts similarity index 87% rename from src/components/stack-layout/stack-layout.component.ts rename to src/components/layouts/nve-stack/nve-stack.component.ts index 9a69e8f8..af549c2a 100644 --- a/src/components/stack-layout/stack-layout.component.ts +++ b/src/components/layouts/nve-stack/nve-stack.component.ts @@ -1,5 +1,5 @@ import { customElement, property } from 'lit/decorators.js'; -import styles from './stack-layout.styles'; +import styles from './nve-stack.styles'; import { LitElement, html } from 'lit'; /** @@ -24,8 +24,8 @@ export type StackLayoutGap = | '4x-large' | '5x-large'; -@customElement('stack-layout') -export default class StackLayout extends LitElement { +@customElement('nve-stack') +export default class NveStack extends LitElement { static styles = [styles]; /** Forhåndsdefinert tokenbasert mellomrom. Mapper til `--spacing-`. */ @@ -45,6 +45,6 @@ export default class StackLayout extends LitElement { declare global { interface HTMLElementTagNameMap { - 'stack-layout': StackLayout; + 'nve-stack': NveStack; } } diff --git a/src/components/stack-layout/stack-layout.styles.ts b/src/components/layouts/nve-stack/nve-stack.styles.ts similarity index 100% rename from src/components/stack-layout/stack-layout.styles.ts rename to src/components/layouts/nve-stack/nve-stack.styles.ts diff --git a/src/nve-designsystem.ts b/src/nve-designsystem.ts index 1b4b95a9..8032b671 100644 --- a/src/nve-designsystem.ts +++ b/src/nve-designsystem.ts @@ -4,10 +4,10 @@ export { default as NveAccordion } from './components/nve-accordion/nve-accordio export { default as NveAccordionItem } from './components/nve-accordion-item/nve-accordion-item.component'; export { default as NveAlert } from './components/nve-alert/nve-alert.component'; export { default as NveBadge } from './components/nve-badge/nve-badge.component'; -export { default as BoxLayout } from './components/box-layout/box-layout.component'; -export { default as ClusterLayout } from './components/cluster-layout/cluster-layout.component'; -export { default as GridLayout } from './components/grid-layout/grid-layout.component'; -export { default as StackLayout } from './components/stack-layout/stack-layout.component'; +export { default as NveBox } from './components/layouts/nve-box/nve-box.component'; +export { default as NveCluster } from './components/layouts/nve-cluster/nve-cluster.component'; +export { default as NveGrid } from './components/layouts/nve-grid/nve-grid.component'; +export { default as NveStack } from './components/layouts/nve-stack/nve-stack.component'; export { default as NveButton } from './components/nve-button/nve-button.component'; export { default as NveCarousel } from './components/nve-carousel/nve-carousel.component'; export { default as NveCarouselItem } from './components/nve-carousel-item/nve-carousel-item.component'; From aae4c2f71e3cb47dc609cf41be8d8bfa490f8d68 Mon Sep 17 00:00:00 2001 From: malingranly Date: Fri, 12 Jun 2026 14:48:19 +0200 Subject: [PATCH 09/15] fikset litt kommentarer --- custom-elements-manifest.config.js | 2 +- doc-site/layout/layout-oversikt.md | 2 +- doc-site/layout/nve-box.md | 40 +++++------ .../layouts/nve-box/nve-box.component.ts | 62 +++++++--------- .../layouts/nve-box/nve-box.styles.ts | 68 ------------------ .../nve-cluster/nve-cluster.component.ts | 24 +++---- .../layouts/nve-cluster/nve-cluster.styles.ts | 56 ++++----------- .../layouts/nve-grid/nve-grid.component.ts | 24 +++---- .../layouts/nve-grid/nve-grid.styles.ts | 52 +++----------- src/components/layouts/nve-layout-base.ts | 71 +++++++++++++++++++ .../layouts/nve-layout-gap.styles.ts | 51 +++++++++++++ .../layouts/nve-stack/nve-stack.component.ts | 24 +++---- .../layouts/nve-stack/nve-stack.styles.ts | 54 ++++---------- src/nve-designsystem.ts | 1 + 14 files changed, 228 insertions(+), 303 deletions(-) create mode 100644 src/components/layouts/nve-layout-base.ts create mode 100644 src/components/layouts/nve-layout-gap.styles.ts diff --git a/custom-elements-manifest.config.js b/custom-elements-manifest.config.js index 6eea69d8..04902a84 100644 --- a/custom-elements-manifest.config.js +++ b/custom-elements-manifest.config.js @@ -35,7 +35,7 @@ const cemInheritancePluginOptions = { }; export default { - globs: ['src/components/**/*.component.ts'], + globs: ['src/components/**/*.component.ts', 'src/components/layouts/nve-layout-base.ts'], exclude: ['**/*.styles.ts', '**/*.test.ts'], dependencies: true, plugins: [ diff --git a/doc-site/layout/layout-oversikt.md b/doc-site/layout/layout-oversikt.md index 57c8be85..fefb027f 100644 --- a/doc-site/layout/layout-oversikt.md +++ b/doc-site/layout/layout-oversikt.md @@ -27,7 +27,7 @@ Layout-komponentene er laget for å kombineres. Et kontaktskjema er et typisk ek ```html - + Kontakt oss

Fyll ut skjemaet, så tar vi kontakt så raskt vi kan.

diff --git a/doc-site/layout/nve-box.md b/doc-site/layout/nve-box.md index 9386e09d..ed5a8e34 100644 --- a/doc-site/layout/nve-box.md +++ b/doc-site/layout/nve-box.md @@ -11,13 +11,13 @@ I de aller fleste tilfeller skal du bruke `padding`. `padding` er knyttet direkt ```html - +
- +
- +
``` @@ -26,25 +26,19 @@ I de aller fleste tilfeller skal du bruke `padding`. `padding` er knyttet direkt ## Bakgrunn -`background` setter en tokenbasert bakgrunnsfarge på boksen. Verdiene mapper til feedback-fargene i designsystemet. +`background` setter en tokenbasert bakgrunnsfarge på boksen. ```html - - neutral + + - - info + + - - success - - - warning - - - error + + ``` @@ -57,8 +51,8 @@ Bokser kan nøstes for å bygge opp et hierarki av padding. ```html - - + +
@@ -73,7 +67,7 @@ En boks med konsistent padding rundt en tekst. ```html - + Innhold med jevn padding rundt. ``` @@ -94,7 +88,7 @@ Samme innhold uten `nve-box` hvor teksten ligger helt inntil kanten. ## Egenskaper -| Egenskap | Type | Standard | Beskrivelse | -| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ------------------------------------------------------------------------------ | -| `padding` | `'none' \| '2x-small' \| 'x-small' \| 'small' \| 'medium' \| 'large' \| 'x-large' \| '2x-large' \| '3x-large' \| '4x-large' \| '5x-large'` | `medium` | Tokenbasert padding. Mapper til `--spacing-`. Autoutfylling i editoren. | -| `background` | `'none' \| 'neutral' \| 'neutral-subtle' \| 'info' \| 'info-subtle' \| 'success' \| 'success-subtle' \| 'warning' \| 'warning-subtle' \| 'error' \| 'error-subtle'` | `none` | Tokenbasert bakgrunnsfarge. Mapper til `--color-feedback-background-*`. | +| Egenskap | Type | Standard | Beskrivelse | +| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------ | -------- | --------------------------------------------------- | +| `padding` | `'none' \| '2x-small' \| 'x-small' \| 'small' \| 'medium' \| 'large' \| 'x-large' \| '2x-large' \| '3x-large' \| '4x-large' \| '5x-large'` | `medium` | Tokenbasert padding. Mapper til `--spacing-` | +| `background` | Eksempel: `--color-brand-background-primary` | `none` | Tokenbasert bakgrunnsfarge. | diff --git a/src/components/layouts/nve-box/nve-box.component.ts b/src/components/layouts/nve-box/nve-box.component.ts index 07dc56c1..823763c4 100644 --- a/src/components/layouts/nve-box/nve-box.component.ts +++ b/src/components/layouts/nve-box/nve-box.component.ts @@ -1,52 +1,42 @@ import { customElement, property } from 'lit/decorators.js'; import styles from './nve-box.styles'; -import { LitElement, html } from 'lit'; +import { html, PropertyValues } from 'lit'; +import { NveLayoutBase, SpacingToken } from '../nve-layout-base'; /** - * Pakker innhold i en boks med padding. + * Pakker innhold i en boks med padding og bakgrunnsfarge. * Basert på Box-primitiven fra Every Layout. * - * Padding styres av `padding` og er låst til spacing-tokenene i designsystemet. - * Bakgrunnsfarge styres av `background` og er låst til feedback-fargetokenene. + * Arver padding/margin-props fra NveLayoutBase. + * Bakgrunnsfarge styres av `background` og tar hele token-stien etter `--color-`. + * Eks: `background="--color-feedback-background-default-info"` → `var(--color-feedback-background-default-info)` + * Eks: `background="--color-brand-background-primary"` → `var(--color-brand-background-primary)` * - * @property {BoxLayoutPadding} padding - Forhåndsdefinert tokenbasert padding. - * @property {BoxLayoutBackground} background - Forhåndsdefinert tokenbasert bakgrunnsfarge. + * @property {SpacingToken} padding - Tokenbasert padding (arvet). Standard: medium. + * @property {string} background - Tokenbasert bakgrunnsfarge. Tar token-stien etter `--color-`. */ -export type BoxLayoutPadding = - | 'none' - | '2x-small' - | 'x-small' - | 'small' - | 'medium' - | 'large' - | 'x-large' - | '2x-large' - | '3x-large' - | '4x-large' - | '5x-large'; - -export type BoxLayoutBackground = - | 'none' - | 'neutral' - | 'neutral-subtle' - | 'info' - | 'info-subtle' - | 'success' - | 'success-subtle' - | 'warning' - | 'warning-subtle' - | 'error' - | 'error-subtle'; +export type BoxLayoutPadding = SpacingToken; @customElement('nve-box') -export default class NveBox extends LitElement { +export default class NveBox extends NveLayoutBase { static styles = [styles]; - /** Forhåndsdefinert tokenbasert padding. Mapper til `--spacing-`. */ - @property({ type: String, reflect: true }) padding?: BoxLayoutPadding; + /** Tokenbasert bakgrunnsfarge. Skriv hele CSS-variabelnavnet, f.eks. `--color-feedback-background-default-info`. */ + @property({ type: String, reflect: true }) background?: string; - /** Forhåndsdefinert tokenbasert bakgrunnsfarge. Mapper til `--color-feedback-background-*`. */ - @property({ type: String, reflect: true }) background?: BoxLayoutBackground; + override updated(changedProperties: PropertyValues) { + super.updated(changedProperties); + if ( + changedProperties.has('background') && + (changedProperties.get('background') !== undefined || this.background !== undefined) + ) { + if (this.background !== undefined) { + this.style.setProperty('background', `var(${this.background})`); + } else { + this.style.removeProperty('background'); + } + } + } render() { return html``; diff --git a/src/components/layouts/nve-box/nve-box.styles.ts b/src/components/layouts/nve-box/nve-box.styles.ts index 81ea3060..828026c8 100644 --- a/src/components/layouts/nve-box/nve-box.styles.ts +++ b/src/components/layouts/nve-box/nve-box.styles.ts @@ -6,72 +6,4 @@ export default css` padding: var(--spacing-medium); background: transparent; } - - :host([padding='none']) { - padding: var(--spacing-none); - } - :host([padding='2x-small']) { - padding: var(--spacing-2x-small); - } - :host([padding='x-small']) { - padding: var(--spacing-x-small); - } - :host([padding='small']) { - padding: var(--spacing-small); - } - :host([padding='medium']) { - padding: var(--spacing-medium); - } - :host([padding='large']) { - padding: var(--spacing-large); - } - :host([padding='x-large']) { - padding: var(--spacing-x-large); - } - :host([padding='2x-large']) { - padding: var(--spacing-2x-large); - } - :host([padding='3x-large']) { - padding: var(--spacing-3x-large); - } - :host([padding='4x-large']) { - padding: var(--spacing-4x-large); - } - :host([padding='5x-large']) { - padding: var(--spacing-5x-large); - } - - :host([background='none']) { - background: transparent; - } - :host([background='neutral']) { - background: var(--color-feedback-background-default-neutral); - } - :host([background='neutral-subtle']) { - background: var(--color-feedback-background-subtle-neutral); - } - :host([background='info']) { - background: var(--color-feedback-background-default-info); - } - :host([background='info-subtle']) { - background: var(--color-feedback-background-subtle-info); - } - :host([background='success']) { - background: var(--color-feedback-background-default-success); - } - :host([background='success-subtle']) { - background: var(--color-feedback-background-subtle-success); - } - :host([background='warning']) { - background: var(--color-feedback-background-default-warning); - } - :host([background='warning-subtle']) { - background: var(--color-feedback-background-subtle-warning); - } - :host([background='error']) { - background: var(--color-feedback-background-default-error); - } - :host([background='error-subtle']) { - background: var(--color-feedback-background-subtle-error); - } `; diff --git a/src/components/layouts/nve-cluster/nve-cluster.component.ts b/src/components/layouts/nve-cluster/nve-cluster.component.ts index c1850752..72ad89ad 100644 --- a/src/components/layouts/nve-cluster/nve-cluster.component.ts +++ b/src/components/layouts/nve-cluster/nve-cluster.component.ts @@ -1,33 +1,24 @@ import { customElement, property } from 'lit/decorators.js'; import styles from './nve-cluster.styles'; -import { LitElement, html } from 'lit'; +import { html, PropertyValues } from 'lit'; +import { NveLayoutBase, SpacingToken } from '../nve-layout-base'; /** * Grupperer barn-elementer horisontalt med automatisk linjebryting. * Basert på Cluster-primitiven fra Every Layout. * * Mellomrommet styres av `gap` og er låst til spacing-tokenene i designsystemet. + * Arver padding/margin-props fra NveLayoutBase. * * @property {ClusterLayoutGap} gap - Forhåndsdefinert tokenbasert mellomrom. * @property {string} justify - justify-content-verdi. Standard: flex-start. * @property {string} align - align-items-verdi. Standard: center. */ -export type ClusterLayoutGap = - | 'none' - | '2x-small' - | 'x-small' - | 'small' - | 'medium' - | 'large' - | 'x-large' - | '2x-large' - | '3x-large' - | '4x-large' - | '5x-large'; +export type ClusterLayoutGap = SpacingToken; @customElement('nve-cluster') -export default class NveCluster extends LitElement { - static styles = [styles]; +export default class NveCluster extends NveLayoutBase { + static styles = [...styles]; /** Forhåndsdefinert tokenbasert mellomrom. Mapper til `--spacing-`. */ @property({ type: String, reflect: true }) gap?: ClusterLayoutGap; @@ -38,7 +29,8 @@ export default class NveCluster extends LitElement { /** align-items på flex-containeren. Standard: center. */ @property({ type: String, reflect: true }) align: string = 'center'; - updated() { + override updated(changedProperties: PropertyValues) { + super.updated(changedProperties); this.style.setProperty('--_cluster-justify', this.justify); this.style.setProperty('--_cluster-align', this.align); } diff --git a/src/components/layouts/nve-cluster/nve-cluster.styles.ts b/src/components/layouts/nve-cluster/nve-cluster.styles.ts index 3d682f69..4d40136f 100644 --- a/src/components/layouts/nve-cluster/nve-cluster.styles.ts +++ b/src/components/layouts/nve-cluster/nve-cluster.styles.ts @@ -1,45 +1,15 @@ import { css } from 'lit'; +import { gapStyles } from '../nve-layout-gap.styles'; -export default css` - :host { - display: flex; - flex-wrap: wrap; - gap: var(--spacing-medium); - justify-content: var(--_cluster-justify, flex-start); - align-items: var(--_cluster-align, center); - } - - :host([gap='none']) { - gap: var(--spacing-none); - } - :host([gap='2x-small']) { - gap: var(--spacing-2x-small); - } - :host([gap='x-small']) { - gap: var(--spacing-x-small); - } - :host([gap='small']) { - gap: var(--spacing-small); - } - :host([gap='medium']) { - gap: var(--spacing-medium); - } - :host([gap='large']) { - gap: var(--spacing-large); - } - :host([gap='x-large']) { - gap: var(--spacing-x-large); - } - :host([gap='2x-large']) { - gap: var(--spacing-2x-large); - } - :host([gap='3x-large']) { - gap: var(--spacing-3x-large); - } - :host([gap='4x-large']) { - gap: var(--spacing-4x-large); - } - :host([gap='5x-large']) { - gap: var(--spacing-5x-large); - } -`; +export default [ + gapStyles, + css` + :host { + display: flex; + flex-wrap: wrap; + gap: var(--spacing-medium); + justify-content: var(--_cluster-justify, flex-start); + align-items: var(--_cluster-align, center); + } + `, +]; diff --git a/src/components/layouts/nve-grid/nve-grid.component.ts b/src/components/layouts/nve-grid/nve-grid.component.ts index b12d14f2..9ff31da4 100644 --- a/src/components/layouts/nve-grid/nve-grid.component.ts +++ b/src/components/layouts/nve-grid/nve-grid.component.ts @@ -1,32 +1,23 @@ import { customElement, property } from 'lit/decorators.js'; import styles from './nve-grid.styles'; -import { LitElement, html } from 'lit'; +import { html, PropertyValues } from 'lit'; +import { NveLayoutBase, SpacingToken } from '../nve-layout-base'; /** * Et responsivt rutenett som automatisk bryter til nye linjer basert på en minste kolonnebredde. * Basert på Grid-primitiven fra Every Layout. * * Mellomrommet styres av `gap` og er låst til spacing-tokenene i designsystemet. + * Arver padding/margin-props fra NveLayoutBase. * * @property {string} min - Minste kolonnebredde, f.eks. "250px" eller "16rem". Bestemmer når rutenettet bryter til ny linje. * @property {GridLayoutGap} gap - Forhåndsdefinert tokenbasert mellomrom. */ -export type GridLayoutGap = - | 'none' - | '2x-small' - | 'x-small' - | 'small' - | 'medium' - | 'large' - | 'x-large' - | '2x-large' - | '3x-large' - | '4x-large' - | '5x-large'; +export type GridLayoutGap = SpacingToken; @customElement('nve-grid') -export default class NveGrid extends LitElement { - static styles = [styles]; +export default class NveGrid extends NveLayoutBase { + static styles = [...styles]; /** Minste kolonnebredde. Bestemmer når rutenettet bryter til ny linje. Standard: 250px. */ @property({ type: String, reflect: true }) min: string = '250px'; @@ -34,7 +25,8 @@ export default class NveGrid extends LitElement { /** Forhåndsdefinert tokenbasert mellomrom. Mapper til `--spacing-`. */ @property({ type: String, reflect: true }) gap?: GridLayoutGap; - updated() { + override updated(changedProperties: PropertyValues) { + super.updated(changedProperties); this.style.setProperty('--_grid-min', this.min); } diff --git a/src/components/layouts/nve-grid/nve-grid.styles.ts b/src/components/layouts/nve-grid/nve-grid.styles.ts index 99ba5ce8..7b9092dc 100644 --- a/src/components/layouts/nve-grid/nve-grid.styles.ts +++ b/src/components/layouts/nve-grid/nve-grid.styles.ts @@ -1,43 +1,13 @@ import { css } from 'lit'; +import { gapStyles } from '../nve-layout-gap.styles'; -export default css` - :host { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(var(--_grid-min, 250px), 1fr)); - gap: var(--spacing-medium); - } - - :host([gap='none']) { - gap: var(--spacing-none); - } - :host([gap='2x-small']) { - gap: var(--spacing-2x-small); - } - :host([gap='x-small']) { - gap: var(--spacing-x-small); - } - :host([gap='small']) { - gap: var(--spacing-small); - } - :host([gap='medium']) { - gap: var(--spacing-medium); - } - :host([gap='large']) { - gap: var(--spacing-large); - } - :host([gap='x-large']) { - gap: var(--spacing-x-large); - } - :host([gap='2x-large']) { - gap: var(--spacing-2x-large); - } - :host([gap='3x-large']) { - gap: var(--spacing-3x-large); - } - :host([gap='4x-large']) { - gap: var(--spacing-4x-large); - } - :host([gap='5x-large']) { - gap: var(--spacing-5x-large); - } -`; +export default [ + gapStyles, + css` + :host { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(var(--_grid-min, 250px), 1fr)); + gap: var(--spacing-medium); + } + `, +]; diff --git a/src/components/layouts/nve-layout-base.ts b/src/components/layouts/nve-layout-base.ts new file mode 100644 index 00000000..0d662c1c --- /dev/null +++ b/src/components/layouts/nve-layout-base.ts @@ -0,0 +1,71 @@ +import { LitElement, PropertyValues } from 'lit'; +import { property } from 'lit/decorators.js'; + +/** + * Felles spacing-tokens brukt av alle layout-komponenter. + * Mapper direkte til `--spacing-` i designsystemet. + */ +export type SpacingToken = + | 'none' + | '2x-small' + | 'x-small' + | 'small' + | 'medium' + | 'large' + | 'x-large' + | '2x-large' + | '3x-large' + | '4x-large' + | '5x-large'; + +/** + * Basisklasse for alle layout-komponenter. + * Gir felles props for padding og margin låst til spacing-tokenene i designsystemet. + * + * Rekkefølge for overstyringsregler: + * `padding` settes først, deretter `padding-block` og `padding-inline`. + * Samme prinsipp gjelder for `margin`. + */ +export class NveLayoutBase extends LitElement { + /** Tokenbasert padding på alle sider. */ + @property({ type: String, reflect: true }) padding?: SpacingToken; + + /** Tokenbasert margin på alle sider. */ + @property({ type: String, reflect: true }) margin?: SpacingToken; + + /** Tokenbasert padding i blokk-retning (topp og bunn). Overstyrer `padding` i blokk-retning. */ + @property({ type: String, reflect: true, attribute: 'padding-block' }) paddingBlock?: SpacingToken; + + /** Tokenbasert padding i inline-retning (venstre og høyre). Overstyrer `padding` i inline-retning. */ + @property({ type: String, reflect: true, attribute: 'padding-inline' }) paddingInline?: SpacingToken; + + /** Tokenbasert margin i blokk-retning (topp og bunn). Overstyrer `margin` i blokk-retning. */ + @property({ type: String, reflect: true, attribute: 'margin-block' }) marginBlock?: SpacingToken; + + /** Tokenbasert margin i inline-retning (venstre og høyre). Overstyrer `margin` i inline-retning. */ + @property({ type: String, reflect: true, attribute: 'margin-inline' }) marginInline?: SpacingToken; + + private _applySpacingProp(cssProp: string, value?: SpacingToken) { + if (value !== undefined) { + this.style.setProperty(cssProp, `var(--spacing-${value})`); + } else { + this.style.removeProperty(cssProp); + } + } + + protected override updated(changedProperties: PropertyValues) { + super.updated(changedProperties); + // Sjekk om prop faktisk har endret seg fra en satt verdi, slik at vi ikke fjerner + // inline-stiler brukeren har satt via style-attributtet ved første render. + const changed = (key: string) => + changedProperties.has(key) && + (changedProperties.get(key) !== undefined || (this as Record)[key] !== undefined); + + if (changed('padding')) this._applySpacingProp('padding', this.padding); + if (changed('margin')) this._applySpacingProp('margin', this.margin); + if (changed('paddingBlock')) this._applySpacingProp('padding-block', this.paddingBlock); + if (changed('paddingInline')) this._applySpacingProp('padding-inline', this.paddingInline); + if (changed('marginBlock')) this._applySpacingProp('margin-block', this.marginBlock); + if (changed('marginInline')) this._applySpacingProp('margin-inline', this.marginInline); + } +} diff --git a/src/components/layouts/nve-layout-gap.styles.ts b/src/components/layouts/nve-layout-gap.styles.ts new file mode 100644 index 00000000..a994e074 --- /dev/null +++ b/src/components/layouts/nve-layout-gap.styles.ts @@ -0,0 +1,51 @@ +import { css } from 'lit'; + +/** + * Delt gap-attributt-selector-stiler for layout-komponenter som eksponerer en `gap`-prop. + * Brukes av nve-stack, nve-cluster og nve-grid. + */ +export const gapStyles = css` + :host([gap='none']) { + gap: var(--spacing-none); + } + + :host([gap='2x-small']) { + gap: var(--spacing-2x-small); + } + + :host([gap='x-small']) { + gap: var(--spacing-x-small); + } + + :host([gap='small']) { + gap: var(--spacing-small); + } + + :host([gap='medium']) { + gap: var(--spacing-medium); + } + + :host([gap='large']) { + gap: var(--spacing-large); + } + + :host([gap='x-large']) { + gap: var(--spacing-x-large); + } + + :host([gap='2x-large']) { + gap: var(--spacing-2x-large); + } + + :host([gap='3x-large']) { + gap: var(--spacing-3x-large); + } + + :host([gap='4x-large']) { + gap: var(--spacing-4x-large); + } + + :host([gap='5x-large']) { + gap: var(--spacing-5x-large); + } +`; diff --git a/src/components/layouts/nve-stack/nve-stack.component.ts b/src/components/layouts/nve-stack/nve-stack.component.ts index af549c2a..6af261e2 100644 --- a/src/components/layouts/nve-stack/nve-stack.component.ts +++ b/src/components/layouts/nve-stack/nve-stack.component.ts @@ -1,32 +1,23 @@ import { customElement, property } from 'lit/decorators.js'; import styles from './nve-stack.styles'; -import { LitElement, html } from 'lit'; +import { html, PropertyValues } from 'lit'; +import { NveLayoutBase, SpacingToken } from '../nve-layout-base'; /** * Stabler barn-elementer vertikalt med konsistent mellomrom. * Basert på Stack-primitiven fra Every Layout. * * Mellomrommet styres av `gap` og er låst til spacing-tokenene i designsystemet. + * Arver padding/margin-props fra NveLayoutBase. * * @property {StackLayoutGap} gap - Forhåndsdefinert tokenbasert mellomrom. * @property {string} justify - justify-content-verdi. Standard: flex-start. */ -export type StackLayoutGap = - | 'none' - | '2x-small' - | 'x-small' - | 'small' - | 'medium' - | 'large' - | 'x-large' - | '2x-large' - | '3x-large' - | '4x-large' - | '5x-large'; +export type StackLayoutGap = SpacingToken; @customElement('nve-stack') -export default class NveStack extends LitElement { - static styles = [styles]; +export default class NveStack extends NveLayoutBase { + static styles = [...styles]; /** Forhåndsdefinert tokenbasert mellomrom. Mapper til `--spacing-`. */ @property({ type: String, reflect: true }) gap?: StackLayoutGap; @@ -34,7 +25,8 @@ export default class NveStack extends LitElement { /** justify-content på flex-containeren. Standard: flex-start. */ @property({ type: String, reflect: true }) justify: string = 'flex-start'; - updated() { + override updated(changedProperties: PropertyValues) { + super.updated(changedProperties); this.style.setProperty('--_stack-justify', this.justify); } diff --git a/src/components/layouts/nve-stack/nve-stack.styles.ts b/src/components/layouts/nve-stack/nve-stack.styles.ts index 9892fa5e..643452a9 100644 --- a/src/components/layouts/nve-stack/nve-stack.styles.ts +++ b/src/components/layouts/nve-stack/nve-stack.styles.ts @@ -1,44 +1,14 @@ import { css } from 'lit'; +import { gapStyles } from '../nve-layout-gap.styles'; -export default css` - :host { - display: flex; - flex-direction: column; - gap: var(--spacing-medium); - justify-content: var(--_stack-justify, flex-start); - } - - :host([gap='none']) { - gap: var(--spacing-none); - } - :host([gap='2x-small']) { - gap: var(--spacing-2x-small); - } - :host([gap='x-small']) { - gap: var(--spacing-x-small); - } - :host([gap='small']) { - gap: var(--spacing-small); - } - :host([gap='medium']) { - gap: var(--spacing-medium); - } - :host([gap='large']) { - gap: var(--spacing-large); - } - :host([gap='x-large']) { - gap: var(--spacing-x-large); - } - :host([gap='2x-large']) { - gap: var(--spacing-2x-large); - } - :host([gap='3x-large']) { - gap: var(--spacing-3x-large); - } - :host([gap='4x-large']) { - gap: var(--spacing-4x-large); - } - :host([gap='5x-large']) { - gap: var(--spacing-5x-large); - } -`; +export default [ + gapStyles, + css` + :host { + display: flex; + flex-direction: column; + gap: var(--spacing-medium); + justify-content: var(--_stack-justify, flex-start); + } + `, +]; diff --git a/src/nve-designsystem.ts b/src/nve-designsystem.ts index 8032b671..b7cc6c57 100644 --- a/src/nve-designsystem.ts +++ b/src/nve-designsystem.ts @@ -4,6 +4,7 @@ export { default as NveAccordion } from './components/nve-accordion/nve-accordio export { default as NveAccordionItem } from './components/nve-accordion-item/nve-accordion-item.component'; export { default as NveAlert } from './components/nve-alert/nve-alert.component'; export { default as NveBadge } from './components/nve-badge/nve-badge.component'; +export { NveLayoutBase, type SpacingToken } from './components/layouts/nve-layout-base'; export { default as NveBox } from './components/layouts/nve-box/nve-box.component'; export { default as NveCluster } from './components/layouts/nve-cluster/nve-cluster.component'; export { default as NveGrid } from './components/layouts/nve-grid/nve-grid.component'; From a6a0076d52efb74e1423ceae9f50bee3f363caf7 Mon Sep 17 00:00:00 2001 From: malingranly Date: Fri, 12 Jun 2026 15:09:10 +0200 Subject: [PATCH 10/15] laget union types for justify og gap --- src/components/layouts/nve-box/nve-box.component.ts | 8 +++----- .../layouts/nve-cluster/nve-cluster.component.ts | 11 ++++++----- src/components/layouts/nve-layout-base.ts | 12 ++++++++++++ .../layouts/nve-stack/nve-stack.component.ts | 4 ++-- src/nve-designsystem.ts | 8 ++++++-- 5 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/components/layouts/nve-box/nve-box.component.ts b/src/components/layouts/nve-box/nve-box.component.ts index 823763c4..8891708b 100644 --- a/src/components/layouts/nve-box/nve-box.component.ts +++ b/src/components/layouts/nve-box/nve-box.component.ts @@ -8,12 +8,10 @@ import { NveLayoutBase, SpacingToken } from '../nve-layout-base'; * Basert på Box-primitiven fra Every Layout. * * Arver padding/margin-props fra NveLayoutBase. - * Bakgrunnsfarge styres av `background` og tar hele token-stien etter `--color-`. - * Eks: `background="--color-feedback-background-default-info"` → `var(--color-feedback-background-default-info)` - * Eks: `background="--color-brand-background-primary"` → `var(--color-brand-background-primary)` + * Bakgrunnsfarge styres av `background`. * * @property {SpacingToken} padding - Tokenbasert padding (arvet). Standard: medium. - * @property {string} background - Tokenbasert bakgrunnsfarge. Tar token-stien etter `--color-`. + * @property {string} background - Tokenbasert bakgrunnsfarge. */ export type BoxLayoutPadding = SpacingToken; @@ -21,7 +19,7 @@ export type BoxLayoutPadding = SpacingToken; export default class NveBox extends NveLayoutBase { static styles = [styles]; - /** Tokenbasert bakgrunnsfarge. Skriv hele CSS-variabelnavnet, f.eks. `--color-feedback-background-default-info`. */ + /** Tokenbasert bakgrunnsfarge. */ @property({ type: String, reflect: true }) background?: string; override updated(changedProperties: PropertyValues) { diff --git a/src/components/layouts/nve-cluster/nve-cluster.component.ts b/src/components/layouts/nve-cluster/nve-cluster.component.ts index 72ad89ad..b7f412d1 100644 --- a/src/components/layouts/nve-cluster/nve-cluster.component.ts +++ b/src/components/layouts/nve-cluster/nve-cluster.component.ts @@ -1,7 +1,7 @@ import { customElement, property } from 'lit/decorators.js'; import styles from './nve-cluster.styles'; import { html, PropertyValues } from 'lit'; -import { NveLayoutBase, SpacingToken } from '../nve-layout-base'; +import { NveLayoutBase, SpacingToken, LayoutJustify } from '../nve-layout-base'; /** * Grupperer barn-elementer horisontalt med automatisk linjebryting. @@ -11,10 +11,11 @@ import { NveLayoutBase, SpacingToken } from '../nve-layout-base'; * Arver padding/margin-props fra NveLayoutBase. * * @property {ClusterLayoutGap} gap - Forhåndsdefinert tokenbasert mellomrom. - * @property {string} justify - justify-content-verdi. Standard: flex-start. - * @property {string} align - align-items-verdi. Standard: center. + * @property {LayoutJustify} justify - justify-content-verdi. Standard: flex-start. + * @property {ClusterAlign} align - align-items-verdi. Standard: center. */ export type ClusterLayoutGap = SpacingToken; +export type ClusterAlign = 'flex-start' | 'flex-end' | 'center' | 'baseline' | 'stretch' | 'start' | 'end'; @customElement('nve-cluster') export default class NveCluster extends NveLayoutBase { @@ -24,10 +25,10 @@ export default class NveCluster extends NveLayoutBase { @property({ type: String, reflect: true }) gap?: ClusterLayoutGap; /** justify-content på flex-containeren. Standard: flex-start. */ - @property({ type: String, reflect: true }) justify: string = 'flex-start'; + @property({ type: String, reflect: true }) justify: LayoutJustify = 'flex-start'; /** align-items på flex-containeren. Standard: center. */ - @property({ type: String, reflect: true }) align: string = 'center'; + @property({ type: String, reflect: true }) align: ClusterAlign = 'center'; override updated(changedProperties: PropertyValues) { super.updated(changedProperties); diff --git a/src/components/layouts/nve-layout-base.ts b/src/components/layouts/nve-layout-base.ts index 0d662c1c..6ad27afa 100644 --- a/src/components/layouts/nve-layout-base.ts +++ b/src/components/layouts/nve-layout-base.ts @@ -18,6 +18,18 @@ export type SpacingToken = | '4x-large' | '5x-large'; +export type LayoutJustify = + | 'flex-start' + | 'flex-end' + | 'center' + | 'space-between' + | 'space-around' + | 'space-evenly' + | 'start' + | 'end' + | 'left' + | 'right'; + /** * Basisklasse for alle layout-komponenter. * Gir felles props for padding og margin låst til spacing-tokenene i designsystemet. diff --git a/src/components/layouts/nve-stack/nve-stack.component.ts b/src/components/layouts/nve-stack/nve-stack.component.ts index 6af261e2..c2e6c1cf 100644 --- a/src/components/layouts/nve-stack/nve-stack.component.ts +++ b/src/components/layouts/nve-stack/nve-stack.component.ts @@ -1,7 +1,7 @@ import { customElement, property } from 'lit/decorators.js'; import styles from './nve-stack.styles'; import { html, PropertyValues } from 'lit'; -import { NveLayoutBase, SpacingToken } from '../nve-layout-base'; +import { NveLayoutBase, SpacingToken, LayoutJustify } from '../nve-layout-base'; /** * Stabler barn-elementer vertikalt med konsistent mellomrom. @@ -23,7 +23,7 @@ export default class NveStack extends NveLayoutBase { @property({ type: String, reflect: true }) gap?: StackLayoutGap; /** justify-content på flex-containeren. Standard: flex-start. */ - @property({ type: String, reflect: true }) justify: string = 'flex-start'; + @property({ type: String, reflect: true }) justify: LayoutJustify = 'flex-start'; override updated(changedProperties: PropertyValues) { super.updated(changedProperties); diff --git a/src/nve-designsystem.ts b/src/nve-designsystem.ts index b7cc6c57..dc67ae2c 100644 --- a/src/nve-designsystem.ts +++ b/src/nve-designsystem.ts @@ -4,9 +4,13 @@ export { default as NveAccordion } from './components/nve-accordion/nve-accordio export { default as NveAccordionItem } from './components/nve-accordion-item/nve-accordion-item.component'; export { default as NveAlert } from './components/nve-alert/nve-alert.component'; export { default as NveBadge } from './components/nve-badge/nve-badge.component'; -export { NveLayoutBase, type SpacingToken } from './components/layouts/nve-layout-base'; +export { NveLayoutBase, type SpacingToken, type LayoutJustify } from './components/layouts/nve-layout-base'; export { default as NveBox } from './components/layouts/nve-box/nve-box.component'; -export { default as NveCluster } from './components/layouts/nve-cluster/nve-cluster.component'; +export { + default as NveCluster, + type ClusterLayoutGap, + type ClusterAlign, +} from './components/layouts/nve-cluster/nve-cluster.component'; export { default as NveGrid } from './components/layouts/nve-grid/nve-grid.component'; export { default as NveStack } from './components/layouts/nve-stack/nve-stack.component'; export { default as NveButton } from './components/nve-button/nve-button.component'; From d839bdbacf05e827db813a06deab20e5cb68f5ea Mon Sep 17 00:00:00 2001 From: malingranly Date: Fri, 12 Jun 2026 15:35:37 +0200 Subject: [PATCH 11/15] lagt til bedre visualisering av hvordan komponenten jobber sammen --- .../assets/images/layout-visualisering.png | Bin 0 -> 237006 bytes doc-site/layout/layout-oversikt.md | 6 ++++++ 2 files changed, 6 insertions(+) create mode 100644 doc-site/assets/images/layout-visualisering.png diff --git a/doc-site/assets/images/layout-visualisering.png b/doc-site/assets/images/layout-visualisering.png new file mode 100644 index 0000000000000000000000000000000000000000..efde39d13448388432577a43dc2a01ed5bf145ea GIT binary patch literal 237006 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%0Ap`NT&j~TM_!61jlUrJU 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

cJe(*DS8S-Y-)3@(+ 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 F{}1a18{Gf^ literal 0 HcmV?d00001 diff --git a/doc-site/layout/layout-oversikt.md b/doc-site/layout/layout-oversikt.md index fefb027f..0c0a90d5 100644 --- a/doc-site/layout/layout-oversikt.md +++ b/doc-site/layout/layout-oversikt.md @@ -46,3 +46,9 @@ Layout-komponentene er laget for å kombineres. Et kontaktskjema er et typisk ek ``` + +Visualisering av layoutkomponentene (Grid, Stack, Cluster og Box) i Designsystemet. + +## Felles spacing-props + +Alle layout-komponenter arver `padding`, `margin`, `padding-block`, `padding-inline`, `margin-block` og `margin-inline` fra en basis layoutklasse. Verdiene er låst til spacing-tokenene i designsystemet. From 85da30cb970450f0c8318f4d50224cce7a96045f Mon Sep 17 00:00:00 2001 From: malingranly Date: Fri, 12 Jun 2026 15:50:47 +0200 Subject: [PATCH 12/15] endret grid styles til 100% i stedet for 250px --- src/components/layouts/nve-grid/nve-grid.styles.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/layouts/nve-grid/nve-grid.styles.ts b/src/components/layouts/nve-grid/nve-grid.styles.ts index 7b9092dc..eab1ec72 100644 --- a/src/components/layouts/nve-grid/nve-grid.styles.ts +++ b/src/components/layouts/nve-grid/nve-grid.styles.ts @@ -6,7 +6,7 @@ export default [ css` :host { display: grid; - grid-template-columns: repeat(auto-fit, minmax(var(--_grid-min, 250px), 1fr)); + grid-template-columns: repeat(auto-fit, minmax(min(var(--_grid-min, 250px), 100%), 1fr)); gap: var(--spacing-medium); } `, From 71f2bc3d9e3d4ffa9fa988a9e0bb34ddab3ac9dc Mon Sep 17 00:00:00 2001 From: malingranly Date: Fri, 12 Jun 2026 16:07:02 +0200 Subject: [PATCH 13/15] la til begrunnelse for valg i beslutninger-filen --- beslutninger.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/beslutninger.md b/beslutninger.md index e2d5d68e..41e55f26 100644 --- a/beslutninger.md +++ b/beslutninger.md @@ -5,6 +5,18 @@ Vi skriver også om hvilke alternativer som ble vurdert og hvorfor enkelte alter Vi sorterer valgene etter tidspunkt for når de ble gjort, med de siste valgene øverst. +## Layout-komponenter (juni 2026) + +Layout-komponentene (`nve-stack`, `nve-cluster`, `nve-grid`, `nve-box`) er strukturelle byggeklosser basert på prinsippene fra [Every Layout](https://every-layout.dev/). + +Fordelen med layout-komponenter er at man slipper å gjenta den samme layout CSS-en overalt i applikasjonen. Vanlige oppsett som vertikal stabling, horisontal gruppering og rutenett løses med en tag. + +En av ulempene med layout-komponenter er at de legger til et ekstra lag i DOM-en, og at man må sette seg inn i Every Layout for å bruke dem riktig. + +Komponentene for layout brukes frivillig, og er kun ment som et hjelpeverktøy for de som vil bruke dem. Trenger man egendefinert CSS eller andre verdier enn spacing tokens fra Designsystemet, kan man ikke bruke disse komponentene og må definere egen CSS. + +Hovedformålet med disse er å gjøre applikasjonene responsive og forbedre utvikleropplevelsen. + ## Versjonering på pakkenivå fremfor komponentnivå (desember 2025) Versjonering på komponentnivå ville tillatt team å oppdatere kun de komponentene de trenger uten å måtte ta inn hele pakken. Dette kan virke attraktivt, men skaper flere utfordringer enn fordeler. From 8da98533e525b23f69c2c36b6fadff99870f1173 Mon Sep 17 00:00:00 2001 From: malingranly Date: Fri, 12 Jun 2026 16:37:28 +0200 Subject: [PATCH 14/15] oppdatert egenskaper til alle docs --- doc-site/layout/layout-oversikt.md | 2 +- doc-site/layout/nve-box.md | 56 ++++++++++++------- doc-site/layout/nve-cluster.md | 16 ++++-- doc-site/layout/nve-grid.md | 26 ++++----- doc-site/layout/nve-stack.md | 14 +++-- .../layouts/nve-box/nve-box.component.ts | 10 +++- src/nve-designsystem.ts | 2 +- 7 files changed, 79 insertions(+), 47 deletions(-) diff --git a/doc-site/layout/layout-oversikt.md b/doc-site/layout/layout-oversikt.md index 0c0a90d5..8e7c4fcb 100644 --- a/doc-site/layout/layout-oversikt.md +++ b/doc-site/layout/layout-oversikt.md @@ -27,7 +27,7 @@ Layout-komponentene er laget for å kombineres. Et kontaktskjema er et typisk ek ```html - + Kontakt oss

Fyll ut skjemaet, så tar vi kontakt så raskt vi kan.

diff --git a/doc-site/layout/nve-box.md b/doc-site/layout/nve-box.md index ed5a8e34..6e59dea8 100644 --- a/doc-site/layout/nve-box.md +++ b/doc-site/layout/nve-box.md @@ -11,14 +11,14 @@ I de aller fleste tilfeller skal du bruke `padding`. `padding` er knyttet direkt ```html - -
+ +
- -
+ +
- -
+ +
``` @@ -26,19 +26,28 @@ I de aller fleste tilfeller skal du bruke `padding`. `padding` er knyttet direkt ## Bakgrunn -`background` setter en tokenbasert bakgrunnsfarge på boksen. +`background` setter en tokenbasert bakgrunnsfarge på boksen. Gyldige verdier kommer fra neutrals background-tokensene. ```html - - + + canvas + + + primary + + + primary-contrast - + secondary - - + + secondary-dim + + + tertiary-dim ``` @@ -51,9 +60,9 @@ Bokser kan nøstes for å bygge opp et hierarki av padding. ```html - - -
+ + +
``` @@ -67,7 +76,7 @@ En boks med konsistent padding rundt en tekst. ```html - + Innhold med jevn padding rundt. ``` @@ -79,7 +88,7 @@ Samme innhold uten `nve-box` hvor teksten ligger helt inntil kanten. ```html -
+
Innhold med null padding rundt.
``` @@ -88,7 +97,12 @@ Samme innhold uten `nve-box` hvor teksten ligger helt inntil kanten. ## Egenskaper -| Egenskap | Type | Standard | Beskrivelse | -| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------ | -------- | --------------------------------------------------- | -| `padding` | `'none' \| '2x-small' \| 'x-small' \| 'small' \| 'medium' \| 'large' \| 'x-large' \| '2x-large' \| '3x-large' \| '4x-large' \| '5x-large'` | `medium` | Tokenbasert padding. Mapper til `--spacing-` | -| `background` | Eksempel: `--color-brand-background-primary` | `none` | Tokenbasert bakgrunnsfarge. | +| Egenskap | Type | Standard | Beskrivelse | +| ---------------- | --------------- | -------- | ---------------------------------------------------------------------------------------- | +| `background` | `BoxBackground` | — | Tokenbasert bakgrunnsfarge. Gyldige verdier er `--color-neutrals-background-*`-tokenene. | +| `padding` | `SpacingToken` | `medium` | Tokenbasert padding på alle sider. Visuell standard er `medium` via CSS. | +| `padding-block` | `SpacingToken` | — | Overstyrer `padding` i blokk-retning (topp/bunn). | +| `padding-inline` | `SpacingToken` | — | Overstyrer `padding` i inline-retning (venstre/høyre). | +| `margin` | `SpacingToken` | — | Tokenbasert margin på alle sider. | +| `margin-block` | `SpacingToken` | — | Overstyrer `margin` i blokk-retning (topp/bunn). | +| `margin-inline` | `SpacingToken` | — | Overstyrer `margin` i inline-retning (venstre/høyre). | diff --git a/doc-site/layout/nve-cluster.md b/doc-site/layout/nve-cluster.md index cf22c03d..f99104a5 100644 --- a/doc-site/layout/nve-cluster.md +++ b/doc-site/layout/nve-cluster.md @@ -145,8 +145,14 @@ Til sammenligning, samme knapper i en vanlig `
` uten `nve-cluster`. Det er ## Egenskaper -| Egenskap | Type | Standard | Beskrivelse | -| --------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ------------ | -------------------------------------------------------------------------------- | -| `gap` | `'none' \| '2x-small' \| 'x-small' \| 'small' \| 'medium' \| 'large' \| 'x-large' \| '2x-large' \| '3x-large' \| '4x-large' \| '5x-large'` | `medium` | Tokenbasert mellomrom. Mapper til `--spacing-`. Autoutfylling i editoren. | -| `justify` | `string` | `flex-start` | `justify-content`-verdi. | -| `align` | `string` | `center` | `align-items`-verdi. | +| Egenskap | Type | Standard | Beskrivelse | +| ---------------- | --------------- | ------------ | ----------------------------------------------------------------------------------------- | +| `gap` | `SpacingToken` | `medium` | Tokenbasert mellomrom mellom barn-elementer. | +| `justify` | `LayoutJustify` | `flex-start` | Horisontal fordeling av barn-elementer. Gyldige verdier er CSS `justify-content`-verdier. | +| `align` | `ClusterAlign` | `center` | Vertikal justering av barn-elementer. Gyldige verdier er CSS `align-items`-verdier. | +| `padding` | `SpacingToken` | — | Tokenbasert padding på alle sider. | +| `padding-block` | `SpacingToken` | — | Overstyrer `padding` i blokk-retning (topp/bunn). | +| `padding-inline` | `SpacingToken` | — | Overstyrer `padding` i inline-retning (venstre/høyre). | +| `margin` | `SpacingToken` | — | Tokenbasert margin på alle sider. | +| `margin-block` | `SpacingToken` | — | Overstyrer `margin` i blokk-retning (topp/bunn). | +| `margin-inline` | `SpacingToken` | — | Overstyrer `margin` i inline-retning (venstre/høyre). | diff --git a/doc-site/layout/nve-grid.md b/doc-site/layout/nve-grid.md index 143ba063..f031acb6 100644 --- a/doc-site/layout/nve-grid.md +++ b/doc-site/layout/nve-grid.md @@ -46,11 +46,7 @@ I de aller fleste tilfeller skal du bruke `gap` for mellomrom. `gap` er knyttet ```html - +
@@ -78,11 +74,7 @@ I de aller fleste tilfeller skal du bruke `gap` for mellomrom. `gap` er knyttet style="min-height: 80px; background: var(--color-feedback-background-default-info); border: 4px solid var(--color-feedback-background-subtle-neutral)" >
- +
@@ -121,7 +113,13 @@ Et responsivt rutenett med navigasjonskort som tilpasser antall kolonner etter t ## Egenskaper -| Egenskap | Type | Standard | Beskrivelse | -| -------- | ------------------------------------------------------------------------------------------------------------------------------------------ | -------- | -------------------------------------------------------------------------------- | -| `min` | `string` | `250px` | Minste kolonnebredde før rutenettet bryter til ny linje. | -| `gap` | `'none' \| '2x-small' \| 'x-small' \| 'small' \| 'medium' \| 'large' \| 'x-large' \| '2x-large' \| '3x-large' \| '4x-large' \| '5x-large'` | `medium` | Tokenbasert mellomrom. Mapper til `--spacing-`. Autoutfylling i editoren. | +| Egenskap | Type | Standard | Beskrivelse | +| ---------------- | -------------- | -------- | --------------------------------------------------------------------------------------- | +| `min` | `string` | `250px` | Minste kolonnebredde før rutenettet bryter til ny linje (f.eks. `250px` eller `16rem`). | +| `gap` | `SpacingToken` | `medium` | Tokenbasert mellomrom mellom kolonner og rader. | +| `padding` | `SpacingToken` | — | Tokenbasert padding på alle sider. | +| `padding-block` | `SpacingToken` | — | Overstyrer `padding` i blokk-retning (topp/bunn). | +| `padding-inline` | `SpacingToken` | — | Overstyrer `padding` i inline-retning (venstre/høyre). | +| `margin` | `SpacingToken` | — | Tokenbasert margin på alle sider. | +| `margin-block` | `SpacingToken` | — | Overstyrer `margin` i blokk-retning (topp/bunn). | +| `margin-inline` | `SpacingToken` | — | Overstyrer `margin` i inline-retning (venstre/høyre). | diff --git a/doc-site/layout/nve-stack.md b/doc-site/layout/nve-stack.md index a8940f55..b3755d51 100644 --- a/doc-site/layout/nve-stack.md +++ b/doc-site/layout/nve-stack.md @@ -151,7 +151,13 @@ Uten `nve-stack` klistrer elementene seg sammen og må styles individuelt for å ## Egenskaper -| Egenskap | Type | Standard | Beskrivelse | -| --------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ------------ | -------------------------------------------------------------------------------- | -| `gap` | `'none' \| '2x-small' \| 'x-small' \| 'small' \| 'medium' \| 'large' \| 'x-large' \| '2x-large' \| '3x-large' \| '4x-large' \| '5x-large'` | `medium` | Tokenbasert mellomrom. Mapper til `--spacing-`. Autoutfylling i editoren. | -| `justify` | `string` (`justify-content`-verdi) | `flex-start` | Fordeling langs den vertikale aksen. | +| Egenskap | Type | Standard | Beskrivelse | +| ---------------- | --------------- | ------------ | -------------------------------------------------------------------------------------- | +| `gap` | `SpacingToken` | `medium` | Tokenbasert mellomrom mellom barn-elementer. | +| `justify` | `LayoutJustify` | `flex-start` | Fordeling langs den vertikale aksen. Gyldige verdier er CSS `justify-content`-verdier. | +| `padding` | `SpacingToken` | — | Tokenbasert padding på alle sider. | +| `padding-block` | `SpacingToken` | — | Overstyrer `padding` i blokk-retning (topp/bunn). | +| `padding-inline` | `SpacingToken` | — | Overstyrer `padding` i inline-retning (venstre/høyre). | +| `margin` | `SpacingToken` | — | Tokenbasert margin på alle sider. | +| `margin-block` | `SpacingToken` | — | Overstyrer `margin` i blokk-retning (topp/bunn). | +| `margin-inline` | `SpacingToken` | — | Overstyrer `margin` i inline-retning (venstre/høyre). | diff --git a/src/components/layouts/nve-box/nve-box.component.ts b/src/components/layouts/nve-box/nve-box.component.ts index 8891708b..9f12fa6a 100644 --- a/src/components/layouts/nve-box/nve-box.component.ts +++ b/src/components/layouts/nve-box/nve-box.component.ts @@ -15,12 +15,20 @@ import { NveLayoutBase, SpacingToken } from '../nve-layout-base'; */ export type BoxLayoutPadding = SpacingToken; +export type BoxBackground = + | '--color-neutrals-background-canvas' + | '--color-neutrals-background-primary' + | '--color-neutrals-background-primary-contrast' + | '--color-neutrals-background-secondary' + | '--color-neutrals-background-secondary-dim' + | '--color-neutrals-background-tertiary-dim'; + @customElement('nve-box') export default class NveBox extends NveLayoutBase { static styles = [styles]; /** Tokenbasert bakgrunnsfarge. */ - @property({ type: String, reflect: true }) background?: string; + @property({ type: String, reflect: true }) background?: BoxBackground; override updated(changedProperties: PropertyValues) { super.updated(changedProperties); diff --git a/src/nve-designsystem.ts b/src/nve-designsystem.ts index dc67ae2c..0582f3d0 100644 --- a/src/nve-designsystem.ts +++ b/src/nve-designsystem.ts @@ -5,7 +5,7 @@ export { default as NveAccordionItem } from './components/nve-accordion-item/nve export { default as NveAlert } from './components/nve-alert/nve-alert.component'; export { default as NveBadge } from './components/nve-badge/nve-badge.component'; export { NveLayoutBase, type SpacingToken, type LayoutJustify } from './components/layouts/nve-layout-base'; -export { default as NveBox } from './components/layouts/nve-box/nve-box.component'; +export { default as NveBox, type BoxBackground } from './components/layouts/nve-box/nve-box.component'; export { default as NveCluster, type ClusterLayoutGap, From c9819ac30c693c5df14d01960456bd081fc0b9cb Mon Sep 17 00:00:00 2001 From: malingranly Date: Fri, 12 Jun 2026 16:42:59 +0200 Subject: [PATCH 15/15] oppdaterte filsti for bilde --- doc-site/layout/layout-oversikt.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc-site/layout/layout-oversikt.md b/doc-site/layout/layout-oversikt.md index 8e7c4fcb..8c2889ab 100644 --- a/doc-site/layout/layout-oversikt.md +++ b/doc-site/layout/layout-oversikt.md @@ -47,7 +47,7 @@ Layout-komponentene er laget for å kombineres. Et kontaktskjema er et typisk ek -Visualisering av layoutkomponentene (Grid, Stack, Cluster og Box) i Designsystemet. +Visualisering av layoutkomponentene (Grid, Stack, Cluster og Box) i Designsystemet. ## Felles spacing-props