@mattilsynet/design 3.2.9 → 3.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/mtds/ai/AGENTS.md +892 -0
- package/mtds/ai/alert.mdx +63 -0
- package/mtds/ai/alert.stories.tsx +128 -0
- package/mtds/ai/analytics.mdx +185 -0
- package/mtds/ai/app.mdx +60 -0
- package/mtds/ai/app.stories.tsx +897 -0
- package/mtds/ai/atlas.mdx +82 -0
- package/mtds/ai/atlas.stories.tsx +424 -0
- package/mtds/ai/avatar.mdx +45 -0
- package/mtds/ai/avatar.stories.tsx +109 -0
- package/mtds/ai/badge.mdx +70 -0
- package/mtds/ai/badge.stories.tsx +122 -0
- package/mtds/ai/breadcrumbs.mdx +36 -0
- package/mtds/ai/breadcrumbs.stories.tsx +158 -0
- package/mtds/ai/button.mdx +179 -0
- package/mtds/ai/button.stories.tsx +440 -0
- package/mtds/ai/card.mdx +51 -0
- package/mtds/ai/card.stories.tsx +469 -0
- package/mtds/ai/chart.mdx +67 -0
- package/mtds/ai/chart.stories.tsx +519 -0
- package/mtds/ai/chip.mdx +71 -0
- package/mtds/ai/chip.stories.tsx +211 -0
- package/mtds/ai/details.mdx +33 -0
- package/mtds/ai/details.stories.tsx +91 -0
- package/mtds/ai/dialog.mdx +38 -0
- package/mtds/ai/dialog.stories.tsx +373 -0
- package/mtds/ai/divider.mdx +19 -0
- package/mtds/ai/divider.stories.tsx +50 -0
- package/mtds/ai/errorsummary.mdx +26 -0
- package/mtds/ai/errorsummary.stories.tsx +137 -0
- package/mtds/ai/field.mdx +86 -0
- package/mtds/ai/field.stories.tsx +863 -0
- package/mtds/ai/fieldset.mdx +126 -0
- package/mtds/ai/fieldset.stories.tsx +298 -0
- package/mtds/ai/fileupload.mdx +16 -0
- package/mtds/ai/fileupload.stories.tsx +126 -0
- package/mtds/ai/helptext.mdx +24 -0
- package/mtds/ai/helptext.stories.tsx +106 -0
- package/mtds/ai/input.mdx +223 -0
- package/mtds/ai/input.stories.tsx +352 -0
- package/mtds/ai/law.mdx +115 -0
- package/mtds/ai/law.stories.tsx +168 -0
- package/mtds/ai/layout.mdx +145 -0
- package/mtds/ai/layout.stories.tsx +443 -0
- package/mtds/ai/link.mdx +45 -0
- package/mtds/ai/link.stories.tsx +44 -0
- package/mtds/ai/logo.mdx +86 -0
- package/mtds/ai/logo.stories.tsx +146 -0
- package/mtds/ai/pagination.mdx +136 -0
- package/mtds/ai/pagination.stories.tsx +404 -0
- package/mtds/ai/popover.mdx +86 -0
- package/mtds/ai/popover.stories.tsx +355 -0
- package/mtds/ai/print.mdx +96 -0
- package/mtds/ai/print.stories.tsx +839 -0
- package/mtds/ai/progress.mdx +41 -0
- package/mtds/ai/progress.stories.tsx +141 -0
- package/mtds/ai/skeleton.mdx +26 -0
- package/mtds/ai/skeleton.stories.tsx +131 -0
- package/mtds/ai/spinner.mdx +26 -0
- package/mtds/ai/spinner.stories.tsx +72 -0
- package/mtds/ai/steps.mdx +37 -0
- package/mtds/ai/steps.stories.tsx +568 -0
- package/mtds/ai/table.mdx +124 -0
- package/mtds/ai/table.stories.tsx +1715 -0
- package/mtds/ai/tabs.mdx +106 -0
- package/mtds/ai/tabs.stories.tsx +159 -0
- package/mtds/ai/tag.mdx +49 -0
- package/mtds/ai/tag.stories.tsx +111 -0
- package/mtds/ai/toast.mdx +67 -0
- package/mtds/ai/toast.stories.tsx +215 -0
- package/mtds/ai/togglegroup.mdx +75 -0
- package/mtds/ai/togglegroup.stories.tsx +96 -0
- package/mtds/ai/tooltip.mdx +32 -0
- package/mtds/ai/tooltip.stories.tsx +34 -0
- package/mtds/ai/typography.mdx +67 -0
- package/mtds/ai/typography.stories.tsx +798 -0
- package/mtds/ai/validation.mdx +19 -0
- package/mtds/ai/validation.stories.tsx +45 -0
- package/mtds/app/app-observer.js +1 -1
- package/mtds/app/app-toggle.js +10 -26
- package/mtds/app/app-toggle.js.map +1 -1
- package/mtds/app/app-toggle2.js +26 -10
- package/mtds/app/app-toggle2.js.map +1 -1
- package/mtds/app/app.js +1 -1
- package/mtds/atlas/atlas-element.js +1 -1
- package/mtds/chart/chart-lines.js +19 -19
- package/mtds/chart/chart-lines.js.map +1 -1
- package/mtds/chart/chart.css.js +16 -1
- package/mtds/chart/chart.css.js.map +1 -1
- package/mtds/chart/chart.stories.d.ts +1 -0
- package/mtds/index.iife.js +32 -17
- package/mtds/index.js +21 -20
- package/mtds/index.js.map +1 -1
- package/mtds/package.json.js +1 -1
- package/mtds/styles.css +1 -1
- package/mtds/table/table-observer.js +26 -15
- package/mtds/table/table-observer.js.map +1 -1
- package/package.json +4 -2
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react-vite";
|
|
2
|
+
import { useEffect, useMemo, useRef, useState } from "react";
|
|
3
|
+
import {
|
|
4
|
+
fixLawHtml,
|
|
5
|
+
getLawChecked,
|
|
6
|
+
parseLawIds,
|
|
7
|
+
setLawChecked,
|
|
8
|
+
toggleLawChecked,
|
|
9
|
+
} from "../";
|
|
10
|
+
import { Flex, Law } from "../react";
|
|
11
|
+
import styles from "../styles.module.css";
|
|
12
|
+
import { vinforskriften } from "./vinforskriften-new";
|
|
13
|
+
|
|
14
|
+
// TODO: Søkefunksjon
|
|
15
|
+
// TODO: Kommentar/tilbakemeldingsfunksjon
|
|
16
|
+
// TODO: Må finnes kommentarfelt med fritekst i alle systemer uansett, for å kunne utbrodere
|
|
17
|
+
// ? defaultP eksempel Artikkel 9, Nr. 1, Avsnitt 2, https://lovdata.no/dokument/SF/forskrift/2013-01-13-60/ARTIKKEL_9#ARTIKKEL_9
|
|
18
|
+
|
|
19
|
+
const meta = {
|
|
20
|
+
title: "Designsystem/Law",
|
|
21
|
+
parameters: {
|
|
22
|
+
layout: "padded",
|
|
23
|
+
showInOverview: false,
|
|
24
|
+
},
|
|
25
|
+
decorators: [
|
|
26
|
+
(Story) => {
|
|
27
|
+
return (
|
|
28
|
+
<Flex
|
|
29
|
+
data-center="2xl"
|
|
30
|
+
data-gap="8"
|
|
31
|
+
data-items="300"
|
|
32
|
+
data-nowrap
|
|
33
|
+
id="flex"
|
|
34
|
+
>
|
|
35
|
+
<style>{`#flex:has([data-variant="view"]) pre strong { display: none }`}</style>
|
|
36
|
+
<Story />
|
|
37
|
+
<pre data-self="300" data-fixed style={SIDEBAR_STYLE}>
|
|
38
|
+
<strong>Valgte:</strong>
|
|
39
|
+
<div id="log"></div>
|
|
40
|
+
</pre>
|
|
41
|
+
</Flex>
|
|
42
|
+
);
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
} satisfies Meta;
|
|
46
|
+
|
|
47
|
+
const console = {
|
|
48
|
+
log: (laws: ReturnType<typeof parseLawIds>) => {
|
|
49
|
+
const log = document.getElementById("log") as HTMLElement;
|
|
50
|
+
log.textContent = laws.map(({ label }) => `\n- ${label}`).join("");
|
|
51
|
+
window.console.log(laws);
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export default meta;
|
|
56
|
+
type Story = StoryObj<typeof meta>;
|
|
57
|
+
|
|
58
|
+
const SIDEBAR_STYLE: React.CSSProperties = {
|
|
59
|
+
maxHeight: "calc(100vh - 32px)",
|
|
60
|
+
overflow: "auto",
|
|
61
|
+
fontFamily: "monospace",
|
|
62
|
+
whiteSpace: "pre-wrap",
|
|
63
|
+
position: "sticky",
|
|
64
|
+
fontSize: 14,
|
|
65
|
+
top: 16,
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export const Default: Story = {
|
|
69
|
+
parameters: {
|
|
70
|
+
showInOverview: false,
|
|
71
|
+
},
|
|
72
|
+
render: () => {
|
|
73
|
+
const lawElement = useRef<HTMLDivElement>(null);
|
|
74
|
+
|
|
75
|
+
// Avoid re-processing on every render:
|
|
76
|
+
const html = useMemo(() => ({ __html: fixLawHtml(vinforskriften) }), []);
|
|
77
|
+
|
|
78
|
+
// Sync checked state to Law component:
|
|
79
|
+
useEffect(() => {
|
|
80
|
+
const self = lawElement.current;
|
|
81
|
+
const onClick = ({ target }: Event) => {
|
|
82
|
+
if (target instanceof HTMLButtonElement) {
|
|
83
|
+
toggleLawChecked(target, self);
|
|
84
|
+
const checked = getLawChecked(self);
|
|
85
|
+
console.log(parseLawIds(checked, html.__html));
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
self?.addEventListener("click", onClick);
|
|
90
|
+
return () => self?.removeEventListener("click", onClick);
|
|
91
|
+
}, [html]);
|
|
92
|
+
|
|
93
|
+
// Render:
|
|
94
|
+
return (
|
|
95
|
+
<div
|
|
96
|
+
className={styles.law}
|
|
97
|
+
dangerouslySetInnerHTML={html}
|
|
98
|
+
ref={lawElement}
|
|
99
|
+
/>
|
|
100
|
+
);
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
export const React: Story = {
|
|
105
|
+
render: () => {
|
|
106
|
+
const [checkedIds, setCheckedIds] = useState<string[]>([]);
|
|
107
|
+
const lawElement = useRef<HTMLDivElement>(null);
|
|
108
|
+
|
|
109
|
+
// Avoid re-processing on every render:
|
|
110
|
+
const html = useMemo(() => ({ __html: fixLawHtml(vinforskriften) }), []);
|
|
111
|
+
|
|
112
|
+
// Sync checked state to Law component:
|
|
113
|
+
useEffect(() => {
|
|
114
|
+
setLawChecked(checkedIds, lawElement.current);
|
|
115
|
+
}, [checkedIds]);
|
|
116
|
+
|
|
117
|
+
// Render:
|
|
118
|
+
return (
|
|
119
|
+
<Law
|
|
120
|
+
dangerouslySetInnerHTML={html}
|
|
121
|
+
ref={lawElement}
|
|
122
|
+
onClick={(event) => {
|
|
123
|
+
if (event.target instanceof HTMLButtonElement) {
|
|
124
|
+
const id = event.target.value;
|
|
125
|
+
const checked = checkedIds.includes(id)
|
|
126
|
+
? checkedIds.filter((cid) => cid !== id)
|
|
127
|
+
: [...checkedIds, id];
|
|
128
|
+
|
|
129
|
+
setCheckedIds(checked);
|
|
130
|
+
console.log(parseLawIds(checked, html.__html));
|
|
131
|
+
}
|
|
132
|
+
}}
|
|
133
|
+
/>
|
|
134
|
+
);
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
export const VariantView: Story = {
|
|
139
|
+
render: () => {
|
|
140
|
+
// Avoid re-processing on every render:
|
|
141
|
+
const html = useMemo(() => ({ __html: fixLawHtml(vinforskriften) }), []);
|
|
142
|
+
|
|
143
|
+
// Render:
|
|
144
|
+
return (
|
|
145
|
+
<div
|
|
146
|
+
data-variant="view"
|
|
147
|
+
className={styles.law}
|
|
148
|
+
dangerouslySetInnerHTML={html}
|
|
149
|
+
/>
|
|
150
|
+
);
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
export const VariantReadOnly: Story = {
|
|
155
|
+
render: () => {
|
|
156
|
+
// Avoid re-processing on every render:
|
|
157
|
+
const html = useMemo(() => ({ __html: fixLawHtml(vinforskriften) }), []);
|
|
158
|
+
|
|
159
|
+
// Render:
|
|
160
|
+
return (
|
|
161
|
+
<div
|
|
162
|
+
data-variant="readonly"
|
|
163
|
+
className={styles.law}
|
|
164
|
+
dangerouslySetInnerHTML={html}
|
|
165
|
+
/>
|
|
166
|
+
);
|
|
167
|
+
},
|
|
168
|
+
};
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { Meta, Canvas } from '@storybook/addon-docs/blocks';
|
|
2
|
+
import { CssVariables, JumpTo } from '../../.storybook/blocks';
|
|
3
|
+
import { Alert, Button, Details, Popover, Table } from '../react.tsx';
|
|
4
|
+
import * as stories from './layout.stories';
|
|
5
|
+
|
|
6
|
+
<Meta of={stories} />
|
|
7
|
+
|
|
8
|
+
# Layout
|
|
9
|
+
> Layoutkomponenten organiserer og strukturerer innhold. Du kan bruke Flex, Grid, eller Prose for å sikre riktig flyt og oppsett.
|
|
10
|
+
|
|
11
|
+
<JumpTo />
|
|
12
|
+
|
|
13
|
+
## Typer layout
|
|
14
|
+
- Bruk `flex` når du trenger forskjellige bredder på barna
|
|
15
|
+
- Bruk `grid` når du trenger samme bredde på alle barna, eller alle elementer skal ligge under hverandre
|
|
16
|
+
- Bruk [`prose`](?path=/story/designsystem-typography--prose) når du har tekstlig innhold som skal ha god typografisk rytme
|
|
17
|
+
- Husk at du kan nøste `flex` og `grid` sammen for å få det beste fra begge verdener
|
|
18
|
+
|
|
19
|
+
<Details>
|
|
20
|
+
<Details.Summary>Hvorfor ikke bare bruke Tailwind eller vanilla CSS?</Details.Summary>
|
|
21
|
+
|
|
22
|
+
Det er fullt mulig å bruke Tailwind eller CSS. Det vi får med `flex` og `grid` er konsistent kode og luftbruk,
|
|
23
|
+
samt noen superpowers for responsivitet via vår egen `data-items` attributt.
|
|
24
|
+
</Details>
|
|
25
|
+
|
|
26
|
+
## Attributter
|
|
27
|
+
<Table data-fixed data-size="sm">
|
|
28
|
+
<thead style={{ position: 'sticky', top: 0, backgroundColor: 'var(--mtds-color-surface-default)' }}>
|
|
29
|
+
<tr>
|
|
30
|
+
<th>Attributt</th>
|
|
31
|
+
<th>Beskrivelse</th>
|
|
32
|
+
<th>Type</th>
|
|
33
|
+
<th>Standardverdi</th>
|
|
34
|
+
</tr>
|
|
35
|
+
</thead>
|
|
36
|
+
<tbody>
|
|
37
|
+
<tr>
|
|
38
|
+
<td>`data-items`</td>
|
|
39
|
+
<td>Minimumsbredde på barna. Sikrer at barn brekker til nye linjer for å ungå at de blir for smale.</td>
|
|
40
|
+
<td>`25`, `50`, `75`, `100`, `125`, `150`, `175`, `200`, `225`, `250`, `275`, `300`, `325`, `350`, `375`, `400`, `425`, `450`, `475`, `500`, `525`, `550`, `575`, `600`, `auto`, `full`</td>
|
|
41
|
+
<td></td>
|
|
42
|
+
</tr>
|
|
43
|
+
<tr>
|
|
44
|
+
<td>`data-self`</td>
|
|
45
|
+
<td>Kan *kun* brukes på barn av `Flex` for å sette minimumsbredde på enkeltbarn.</td>
|
|
46
|
+
<td>`25`, `50`, `75`, `100`, `125`, `150`, `175`, `200`, `225`, `250`, `275`, `300`, `325`, `350`, `375`, `400`, `425`, `450`, `475`, `500`, `525`, `550`, `575`, `600`, `auto`, `full`</td>
|
|
47
|
+
<td></td>
|
|
48
|
+
</tr>
|
|
49
|
+
<tr>
|
|
50
|
+
<td>`data-nowrap`</td>
|
|
51
|
+
<td>Hindrer barna i å flyte over flere linjer. Kan settes direkte på barn i `Flex`.</td>
|
|
52
|
+
<td>[Boolsk attributt](https://developer.mozilla.org/en-US/docs/Glossary/Boolean/HTML)</td>
|
|
53
|
+
<td></td>
|
|
54
|
+
</tr>
|
|
55
|
+
<tr>
|
|
56
|
+
<td>`data-fixed`</td>
|
|
57
|
+
<td>Hindrer barna i å vokse i bredden. Kan settes direkte på barn i `Flex`.</td>
|
|
58
|
+
<td>[Boolsk attributt](https://developer.mozilla.org/en-US/docs/Glossary/Boolean/HTML)</td>
|
|
59
|
+
<td></td>
|
|
60
|
+
</tr>
|
|
61
|
+
<tr>
|
|
62
|
+
<td>`data-gap`, `data-row-gap`, `data-colum-gap`</td>
|
|
63
|
+
<td>Avstand mellom barna. Bruker size tokens `--mtds-*`. Alias for [gap](https://developer.mozilla.org/en-US/docs/Web/CSS/gap)</td>
|
|
64
|
+
<td>`0`, `1`, `2`, `3`, `4`, `5`, `6`, `7`, `8`, `9`, `10`, `11`, `12`, `13`, `14`, `15`, `18`, `22`, `26`, `30`</td>
|
|
65
|
+
<td>`3`</td>
|
|
66
|
+
</tr>
|
|
67
|
+
<tr>
|
|
68
|
+
<td>`data-center`</td>
|
|
69
|
+
<td>Maksbredde og midtstilling komponenten.</td>
|
|
70
|
+
<td>`none`,<br />`sm` (max `640px`),<br />`md` (max `768px`),<br />`lg` (max `1024px`),<br />`xl` (max `1280px`),<br />`2xl` (max `1536px`)</td>
|
|
71
|
+
<td>`none`</td>
|
|
72
|
+
</tr>
|
|
73
|
+
<tr>
|
|
74
|
+
<td>`data-align`</td>
|
|
75
|
+
<td>Vertikal justering av barna. Alias for [align-items](https://developer.mozilla.org/en-US/docs/Web/CSS/align-items).</td>
|
|
76
|
+
<td>`normal`, `start`, `center`, `end`, `baseline`, `stretch`</td>
|
|
77
|
+
<td>`normal`</td>
|
|
78
|
+
</tr>
|
|
79
|
+
<tr>
|
|
80
|
+
<td>`data-align-content`</td>
|
|
81
|
+
<td>Vertikal justering av *alle* barna. Alias for [align-content](https://developer.mozilla.org/en-US/docs/Web/CSS/align-content).</td>
|
|
82
|
+
<td>`normal`, `start`, `center`, `end`, `baseline`, `stretch`, `space-around`, `space-between`, `space-evenly`</td>
|
|
83
|
+
<td>`normal`</td>
|
|
84
|
+
</tr>
|
|
85
|
+
<tr>
|
|
86
|
+
<td>`data-justify`</td>
|
|
87
|
+
<td>Horisontal justering av *alle* barna.<br />Hvis `flex`: Alias for [justify-content](https://developer.mozilla.org/en-US/docs/Web/CSS/justify-content)<br />Hvis `grid`: alias for [justify-items](https://developer.mozilla.org/en-US/docs/Web/CSS/justify-items)</td>
|
|
88
|
+
<td>`normal`, `start`, `center`, `end`, `baseline`, `stretch`, `space-around`, `space-between`, `space-evenly`</td>
|
|
89
|
+
<td>`normal`</td>
|
|
90
|
+
</tr>
|
|
91
|
+
<tr>
|
|
92
|
+
<td>`data-align-self`</td>
|
|
93
|
+
<td>Kan settes på barn av både `grid` og `flex`. Alias for [align-self](https://developer.mozilla.org/en-US/docs/Web/CSS/align-self)</td>
|
|
94
|
+
<td>`normal`, `start`, `center`, `end`, `stretch`</td>
|
|
95
|
+
<td>`normal`</td>
|
|
96
|
+
</tr>
|
|
97
|
+
<tr>
|
|
98
|
+
<td>`data-justify-self`</td>
|
|
99
|
+
<td>Kan settes på barn av både `grid` og `flex`. Alias for [justify-self](https://developer.mozilla.org/en-US/docs/Web/CSS/justify-self)</td>
|
|
100
|
+
<td>`normal`, `start`, `center`, `end`, `stretch`</td>
|
|
101
|
+
<td>`normal`</td>
|
|
102
|
+
</tr>
|
|
103
|
+
</tbody>
|
|
104
|
+
</Table>
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
## Flex
|
|
108
|
+
- Bruk `flex` når du trenger forskjellige bredder på barna
|
|
109
|
+
- Bruk heller `prose` eller `grid` når du skal ha <button type="button" data-popover="inline" popoverTarget="grid-stack">under hverandre</button>
|
|
110
|
+
|
|
111
|
+
<Popover id="grid-stack">...siden `flex-direction: column` kan ha uønskede<br />bieffekter på f.eks. `align-items`, `justify-content`</Popover>
|
|
112
|
+
<Canvas of={stories.FlexStory} />
|
|
113
|
+
|
|
114
|
+
## Grid
|
|
115
|
+
- Bruk `grid` når du trenger samme bredder på alle elementer
|
|
116
|
+
- Bruk `grid` *uten* `data-items` for å sette elementer under hverandre
|
|
117
|
+
<Canvas of={stories.GridStory} />
|
|
118
|
+
|
|
119
|
+
## Gap
|
|
120
|
+
- Bruk `data-gap="0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|18|22|26|30"` (`3` er default)
|
|
121
|
+
- Bruk `data-row-gap` eller `data-column-gap` for å individuellt gap i hver retning
|
|
122
|
+
<Canvas of={stories.Gap} />
|
|
123
|
+
|
|
124
|
+
## Center
|
|
125
|
+
- Bruk `data-center="sm | md | lg | xl | 2xl"` for å sentrere innholdet
|
|
126
|
+
- Elementet vil allid ha minimum `5vw` luft på venste og høyre side
|
|
127
|
+
- Vi bruker hovedsakelig `2xl` som hoved container for innhold
|
|
128
|
+
<div className="sbdocs-canvas-thumbnail">
|
|
129
|
+
<Button data-arrow data-variant="primary" href="?path=/story/designsystem-layout--center">Se center i egen visning</Button>
|
|
130
|
+
<Canvas className="sbdocs-canvas--max-height" of={stories.Center} />
|
|
131
|
+
</div>
|
|
132
|
+
|
|
133
|
+
## Align
|
|
134
|
+
- `data-align="normal | start | center | end | stretch"` (`normal` er default) setter vertikal plassering med [align-items](https://developer.mozilla.org/en-US/docs/Web/CSS/align-items)
|
|
135
|
+
<Canvas of={stories.Align} />
|
|
136
|
+
|
|
137
|
+
## Justify
|
|
138
|
+
- `data-justify="start | center | end | space-between | space-around | space-evenly"` setter horisontal plassering med [justify-content](https://developer.mozilla.org/en-US/docs/Web/CSS/justify-content)
|
|
139
|
+
<Canvas of={stories.Justify} />
|
|
140
|
+
|
|
141
|
+
## AlignContent
|
|
142
|
+
- `data-align-content="start | center | end | space-between | space-around | space-evenly"` setter vertikal plassering over flere rader med [align-content](https://developer.mozilla.org/en-US/docs/Web/CSS/align-content)
|
|
143
|
+
<Canvas of={stories.AlignContent} />
|
|
144
|
+
|
|
145
|
+
<CssVariables component="layout" />
|