@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,70 @@
|
|
|
1
|
+
import { Meta, Canvas } from '@storybook/addon-docs/blocks';
|
|
2
|
+
import { Example, CssVariables } from '../../.storybook/blocks';
|
|
3
|
+
import * as stories from './badge.stories';
|
|
4
|
+
import { Flex } from '../react';
|
|
5
|
+
import styles from '../styles.module.css';
|
|
6
|
+
import { EnvelopeIcon } from '@phosphor-icons/react';
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
<Meta of={stories} />
|
|
10
|
+
|
|
11
|
+
# Badge
|
|
12
|
+
|
|
13
|
+
> Badge er en ikke-interaktiv komponent som viser status med eller uten tall.
|
|
14
|
+
|
|
15
|
+
## Kode
|
|
16
|
+
- Legg klassen `badge` på typisk `span` eller bruk `<Badge>` komponenten i React
|
|
17
|
+
- Legg innhold inni attributten `data-badge`
|
|
18
|
+
<Canvas of={stories.Default} />
|
|
19
|
+
|
|
20
|
+
## Skikk og bruk
|
|
21
|
+
|
|
22
|
+
<Flex data-items="350">
|
|
23
|
+
{/* Innhold i Badge: */}
|
|
24
|
+
<Example data-color="success" text="Bruk bare tall i badge." zoom="100%">
|
|
25
|
+
<button type="button" className={styles.button} data-variant="secondary"><EnvelopeIcon />E-post <span className={styles.badge} data-badge="2"></span></button>
|
|
26
|
+
</Example>
|
|
27
|
+
<Example data-color="danger" text="Unngå å bruke tekst i badge, bruk heller tag-komponenten hvis det er behov for tekst." zoom="100%">
|
|
28
|
+
<button type="button" className={styles.button} data-variant="secondary"> <EnvelopeIcon />E-post <span className={styles.badge} data-badge="Trehundreogtjuefire"></span></button>
|
|
29
|
+
</Example>
|
|
30
|
+
|
|
31
|
+
{/* Flere Badger: */}
|
|
32
|
+
<Example data-color="success" text="Bruk én badge i sammenheng med et element." zoom="100%">
|
|
33
|
+
<button type="button" className={styles.button} data-variant="secondary"><EnvelopeIcon />E-post <span className={styles.badge} data-badge="2"></span></button>
|
|
34
|
+
</Example>
|
|
35
|
+
<Example data-color="danger" text="Unngå bruk av flere badges samtidig. Det kan skape forvirring." zoom="100%">
|
|
36
|
+
<button type="button" className={styles.button} data-variant="secondary"> <EnvelopeIcon />E-post <span className={styles.badge} data-badge="42"></span><span className={styles.badge} data-badge="98"></span></button>
|
|
37
|
+
</Example>
|
|
38
|
+
|
|
39
|
+
{/* Badge brukes i en kontekst: */}
|
|
40
|
+
<Example data-color="success" text="Bruk badge i en kontekst." zoom="100%">
|
|
41
|
+
<ds-tabs class={styles.tabs} data-size="sm">
|
|
42
|
+
<ds-tablist>
|
|
43
|
+
<ds-tab role="tab" aria-selected="true"><div className={styles.flex} data-gap="2">Kjøtt <span className={styles.badge} data-badge="2"></span></div></ds-tab>
|
|
44
|
+
<ds-tab>Fisk</ds-tab>
|
|
45
|
+
<ds-tab>Grønnsaker</ds-tab>
|
|
46
|
+
</ds-tablist>
|
|
47
|
+
</ds-tabs>
|
|
48
|
+
</Example>
|
|
49
|
+
<Example data-color="danger" text="Badge skal aldri stå alene." zoom="100%">
|
|
50
|
+
<span className={styles.badge} data-badge="Firehundreogfemtito"></span>
|
|
51
|
+
</Example>
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
</Flex>
|
|
56
|
+
|
|
57
|
+
## Farger
|
|
58
|
+
- Bruk `data-color` for å endre farge
|
|
59
|
+
<Canvas of={stories.Color} />
|
|
60
|
+
|
|
61
|
+
## Inni element
|
|
62
|
+
- Knapper og overskifter kan være forelder til `badge`
|
|
63
|
+
<Canvas of={stories.InElement} />
|
|
64
|
+
|
|
65
|
+
## Rundt element
|
|
66
|
+
- Dersom `badge` har elementer inni, vil den plassere seg i top-høyre hjørne
|
|
67
|
+
- Bruk `--mtdsc-badge-offset` om du trenger å flytte badge innover i elementet
|
|
68
|
+
<Canvas of={stories.WithPosition} />
|
|
69
|
+
|
|
70
|
+
<CssVariables component="badge" />
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { EnvelopeIcon } from "@phosphor-icons/react";
|
|
2
|
+
import type { Meta, StoryObj } from "@storybook/react-vite";
|
|
3
|
+
import { Badge } from "../react";
|
|
4
|
+
import styles from "../styles.module.css";
|
|
5
|
+
|
|
6
|
+
const meta = {
|
|
7
|
+
title: "Designsystem/Badge",
|
|
8
|
+
decorators: [
|
|
9
|
+
(Story) => (
|
|
10
|
+
<div className={styles.flex}>
|
|
11
|
+
<Story />
|
|
12
|
+
</div>
|
|
13
|
+
),
|
|
14
|
+
],
|
|
15
|
+
} satisfies Meta;
|
|
16
|
+
|
|
17
|
+
export default meta;
|
|
18
|
+
type Story = StoryObj<typeof meta>;
|
|
19
|
+
|
|
20
|
+
export const Default: Story = {
|
|
21
|
+
render: () => <span className={styles.badge} data-badge="2"></span>,
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export const React: Story = {
|
|
25
|
+
render: () => (
|
|
26
|
+
<>
|
|
27
|
+
<Badge data-badge="2"></Badge>
|
|
28
|
+
<Badge>
|
|
29
|
+
<EnvelopeIcon />
|
|
30
|
+
</Badge>
|
|
31
|
+
</>
|
|
32
|
+
),
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export const Color: Story = {
|
|
36
|
+
render: () => (
|
|
37
|
+
<>
|
|
38
|
+
<span className={styles.badge} data-badge="2"></span>
|
|
39
|
+
<span className={styles.badge} data-badge="2" data-color="danger"></span>
|
|
40
|
+
</>
|
|
41
|
+
),
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export const InElement: Story = {
|
|
45
|
+
render: () => (
|
|
46
|
+
<div>
|
|
47
|
+
<h2>
|
|
48
|
+
Under behandling <span className={styles.badge} data-badge="9"></span>
|
|
49
|
+
</h2>
|
|
50
|
+
<div className={styles.flex}>
|
|
51
|
+
<button
|
|
52
|
+
type="button"
|
|
53
|
+
className={styles.button}
|
|
54
|
+
data-variant="secondary"
|
|
55
|
+
>
|
|
56
|
+
<EnvelopeIcon />
|
|
57
|
+
E-post <span className={styles.badge} data-badge="99+"></span>
|
|
58
|
+
</button>
|
|
59
|
+
<button type="button" className={styles.button} data-variant="primary">
|
|
60
|
+
<EnvelopeIcon />
|
|
61
|
+
E-post <span className={styles.badge} data-badge="99+"></span>
|
|
62
|
+
</button>
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
),
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export const WithPosition: Story = {
|
|
69
|
+
render: () => (
|
|
70
|
+
<>
|
|
71
|
+
<button type="button" className={styles.button}>
|
|
72
|
+
E-post{" "}
|
|
73
|
+
<span className={styles.badge}>
|
|
74
|
+
<EnvelopeIcon />
|
|
75
|
+
</span>
|
|
76
|
+
</button>
|
|
77
|
+
<button type="button" className={styles.button}>
|
|
78
|
+
E-post{" "}
|
|
79
|
+
<span className={styles.badge} data-badge="2">
|
|
80
|
+
<EnvelopeIcon />
|
|
81
|
+
</span>
|
|
82
|
+
</button>
|
|
83
|
+
<button type="button" className={styles.button}>
|
|
84
|
+
E-post{" "}
|
|
85
|
+
<span className={styles.badge} data-color="danger">
|
|
86
|
+
<EnvelopeIcon />
|
|
87
|
+
</span>
|
|
88
|
+
</button>
|
|
89
|
+
<button type="button" className={styles.button}>
|
|
90
|
+
E-post{" "}
|
|
91
|
+
<span className={styles.badge} data-badge="2" data-color="danger">
|
|
92
|
+
<EnvelopeIcon />
|
|
93
|
+
</span>
|
|
94
|
+
</button>
|
|
95
|
+
</>
|
|
96
|
+
),
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
export const Sizes: Story = {
|
|
100
|
+
render: () => (
|
|
101
|
+
<div className={styles.prose}>
|
|
102
|
+
<button type="button" className={styles.button} data-size="sm">
|
|
103
|
+
E-post{" "}
|
|
104
|
+
<span className={styles.badge} data-badge="2">
|
|
105
|
+
<EnvelopeIcon />
|
|
106
|
+
</span>
|
|
107
|
+
</button>
|
|
108
|
+
<button type="button" className={styles.button} data-size="md">
|
|
109
|
+
E-post{" "}
|
|
110
|
+
<span className={styles.badge} data-badge="2">
|
|
111
|
+
<EnvelopeIcon />
|
|
112
|
+
</span>
|
|
113
|
+
</button>
|
|
114
|
+
<button type="button" className={styles.button} data-size="lg">
|
|
115
|
+
E-post{" "}
|
|
116
|
+
<span className={styles.badge} data-badge="2">
|
|
117
|
+
<EnvelopeIcon />
|
|
118
|
+
</span>
|
|
119
|
+
</button>
|
|
120
|
+
</div>
|
|
121
|
+
),
|
|
122
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Meta, Canvas } from '@storybook/addon-docs/blocks';
|
|
2
|
+
import { CssVariables } from '../../.storybook/blocks';
|
|
3
|
+
import * as stories from './breadcrumbs.stories';
|
|
4
|
+
|
|
5
|
+
<Meta of={stories} />
|
|
6
|
+
|
|
7
|
+
# Breadcrumbs
|
|
8
|
+
|
|
9
|
+
> Brukes til å hjelpe brukerne med å forstå hvor de er i en struktur, for eksempel på en nettside.
|
|
10
|
+
|
|
11
|
+
## Kode
|
|
12
|
+
- Bruk klassen `breadcrumbs` på `<ds-breadcrumbs>`
|
|
13
|
+
- Legg `<ol>` inni, med `<li><a>` som barn
|
|
14
|
+
- Siste `<a>` får automatisk `aria-current="page"`
|
|
15
|
+
- Hvis `<a>` ligger direkte i `<nav>` vil denne være [tilbakeknapp](#tilbakeknapp)
|
|
16
|
+
- **React?** Bruk `<Breadcrumbs>`, `<ol>`, `<li>` og `<a>`
|
|
17
|
+
|
|
18
|
+
<Canvas of={stories.Default} />
|
|
19
|
+
|
|
20
|
+
## Tilbakeknapp
|
|
21
|
+
- Tilbakeknapp vises alltid dersom kun `<a>` er barn av `<nav>`
|
|
22
|
+
- Tilbakeknapp vises kun på mobil dersom `<a>` og `<ol>` er barn av `<nav>`
|
|
23
|
+
|
|
24
|
+
<Canvas of={stories.WithBackbutton} />
|
|
25
|
+
|
|
26
|
+
## Størrelser
|
|
27
|
+
- Bruk `data-size="sm | md | lg"`
|
|
28
|
+
|
|
29
|
+
<Canvas of={stories.Sizes} />
|
|
30
|
+
|
|
31
|
+
## Uten lenker
|
|
32
|
+
- Bruk `<div>` istedenfor `<nav>` og `<span>` istedenfor `<a>`
|
|
33
|
+
|
|
34
|
+
<Canvas of={stories.WithoutLinks} />
|
|
35
|
+
|
|
36
|
+
<CssVariables component="breadcrumbs" />
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react-vite";
|
|
2
|
+
import { Breadcrumbs } from "../react";
|
|
3
|
+
import styles from "../styles.module.css";
|
|
4
|
+
|
|
5
|
+
const meta = {
|
|
6
|
+
title: "Designsystem/Breadcrumbs",
|
|
7
|
+
decorators: [
|
|
8
|
+
(Story) => (
|
|
9
|
+
<div className={styles.grid}>
|
|
10
|
+
<Story />
|
|
11
|
+
</div>
|
|
12
|
+
),
|
|
13
|
+
],
|
|
14
|
+
} satisfies Meta;
|
|
15
|
+
|
|
16
|
+
export default meta;
|
|
17
|
+
type Story = StoryObj<typeof meta>;
|
|
18
|
+
|
|
19
|
+
export const Default: Story = {
|
|
20
|
+
render: () => (
|
|
21
|
+
<ds-breadcrumbs className={styles.breadcrumbs} aria-label="Du er her:">
|
|
22
|
+
<a href="#none" aria-label="Tilbake til Nivå 3">
|
|
23
|
+
Nivå 3
|
|
24
|
+
</a>
|
|
25
|
+
<ol>
|
|
26
|
+
<li>
|
|
27
|
+
<a href="#none">Nivå 1</a>
|
|
28
|
+
</li>
|
|
29
|
+
<li>
|
|
30
|
+
<a href="#none">Nivå 2</a>
|
|
31
|
+
</li>
|
|
32
|
+
<li>
|
|
33
|
+
<a href="#none">Nivå 3</a>
|
|
34
|
+
</li>
|
|
35
|
+
<li>
|
|
36
|
+
<a href="#none">Nivå 4</a>
|
|
37
|
+
</li>
|
|
38
|
+
</ol>
|
|
39
|
+
</ds-breadcrumbs>
|
|
40
|
+
),
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export const React: Story = {
|
|
44
|
+
render: () => (
|
|
45
|
+
<Breadcrumbs aria-label="Du er her:">
|
|
46
|
+
<a href="#none" aria-label="Tilbake til Nivå 3">
|
|
47
|
+
Nivå 3
|
|
48
|
+
</a>
|
|
49
|
+
<ol>
|
|
50
|
+
<li>
|
|
51
|
+
<a href="#none">Nivå 1</a>
|
|
52
|
+
</li>
|
|
53
|
+
<li>
|
|
54
|
+
<a href="#none">Nivå 2</a>
|
|
55
|
+
</li>
|
|
56
|
+
<li>
|
|
57
|
+
<a href="#none">Nivå 3</a>
|
|
58
|
+
</li>
|
|
59
|
+
<li>
|
|
60
|
+
<a href="#none">Nivå 4</a>
|
|
61
|
+
</li>
|
|
62
|
+
</ol>
|
|
63
|
+
</Breadcrumbs>
|
|
64
|
+
),
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export const WithBackbutton: Story = {
|
|
68
|
+
render: () => (
|
|
69
|
+
<>
|
|
70
|
+
Tilbakeknapp på både mobil og desktop:
|
|
71
|
+
<ds-breadcrumbs className={styles.breadcrumbs} aria-label="Du er her:">
|
|
72
|
+
<a href="#none" aria-label="Tilbake til Nivå 3">
|
|
73
|
+
Nivå 3
|
|
74
|
+
</a>
|
|
75
|
+
</ds-breadcrumbs>
|
|
76
|
+
<br />
|
|
77
|
+
Tilbakeknapp på kun mobil:
|
|
78
|
+
<ds-breadcrumbs className={styles.breadcrumbs} aria-label="Du er her:">
|
|
79
|
+
<a href="#none" aria-label="Tilbake til Nivå 3">
|
|
80
|
+
Nivå 3
|
|
81
|
+
</a>
|
|
82
|
+
<ol>
|
|
83
|
+
<li>
|
|
84
|
+
<a href="#none">Nivå 1</a>
|
|
85
|
+
</li>
|
|
86
|
+
<li>
|
|
87
|
+
<a href="#none">Nivå 2</a>
|
|
88
|
+
</li>
|
|
89
|
+
<li>
|
|
90
|
+
<a href="#none">Nivå 3</a>
|
|
91
|
+
</li>
|
|
92
|
+
<li>
|
|
93
|
+
<a href="#none">Nivå 4</a>
|
|
94
|
+
</li>
|
|
95
|
+
</ol>
|
|
96
|
+
</ds-breadcrumbs>
|
|
97
|
+
<br />
|
|
98
|
+
Ingen tilbakeknapp:
|
|
99
|
+
<ds-breadcrumbs className={styles.breadcrumbs} aria-label="Du er her:">
|
|
100
|
+
<ol>
|
|
101
|
+
<li>
|
|
102
|
+
<a href="#none">Nivå 1</a>
|
|
103
|
+
</li>
|
|
104
|
+
<li>
|
|
105
|
+
<a href="#none">
|
|
106
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit
|
|
107
|
+
</a>
|
|
108
|
+
</li>
|
|
109
|
+
<li>
|
|
110
|
+
<a href="#none">Nivå 3</a>
|
|
111
|
+
</li>
|
|
112
|
+
<li>
|
|
113
|
+
<a href="#none">Nivå 4</a>
|
|
114
|
+
</li>
|
|
115
|
+
</ol>
|
|
116
|
+
</ds-breadcrumbs>
|
|
117
|
+
</>
|
|
118
|
+
),
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
export const Sizes: Story = {
|
|
122
|
+
render: () => (
|
|
123
|
+
<>
|
|
124
|
+
<ds-breadcrumbs className={styles.breadcrumbs} data-size="sm">
|
|
125
|
+
<a href="#none" aria-label="Tilbake til Nivå 3">
|
|
126
|
+
Nivå 3
|
|
127
|
+
</a>
|
|
128
|
+
<ol>
|
|
129
|
+
<li>
|
|
130
|
+
<a href="#none">Nivå 1</a>
|
|
131
|
+
</li>
|
|
132
|
+
<li>
|
|
133
|
+
<a href="#none">Nivå 2</a>
|
|
134
|
+
</li>
|
|
135
|
+
<li>
|
|
136
|
+
<a href="#none">Nivå 3</a>
|
|
137
|
+
</li>
|
|
138
|
+
<li>
|
|
139
|
+
<a href="#none">Nivå 4</a>
|
|
140
|
+
</li>
|
|
141
|
+
</ol>
|
|
142
|
+
</ds-breadcrumbs>
|
|
143
|
+
</>
|
|
144
|
+
),
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
export const WithoutLinks: Story = {
|
|
148
|
+
render: () => (
|
|
149
|
+
<ds-breadcrumbs className={styles.breadcrumbs} aria-label="Du er her:">
|
|
150
|
+
<ol>
|
|
151
|
+
<li>Nivå 1</li>
|
|
152
|
+
<li>Nivå 2</li>
|
|
153
|
+
<li>Lorem ipsum dolor sit amet, consectetur adipiscing elit</li>
|
|
154
|
+
<li>Nivå 4</li>
|
|
155
|
+
</ol>
|
|
156
|
+
</ds-breadcrumbs>
|
|
157
|
+
),
|
|
158
|
+
};
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { Meta, Canvas } from '@storybook/addon-docs/blocks';
|
|
2
|
+
import { Example, CssVariables } from '../../.storybook/blocks';
|
|
3
|
+
import { HeartIcon, StarIcon } from '@phosphor-icons/react';
|
|
4
|
+
import { Flex } from '../react';
|
|
5
|
+
import * as stories from './button.stories';
|
|
6
|
+
import styles from '../styles.module.css';
|
|
7
|
+
import { Alert } from '../react';
|
|
8
|
+
|
|
9
|
+
<Meta of={stories} />
|
|
10
|
+
|
|
11
|
+
# Button
|
|
12
|
+
|
|
13
|
+
> Knapper lar brukeren utføre en handling.
|
|
14
|
+
|
|
15
|
+
## Kode
|
|
16
|
+
- Legg klassen `button` på typisk `<button>` eller `<a>`
|
|
17
|
+
- Husk `type="button"` hvis en `<button>` gjør noe annet enn å sende skjema
|
|
18
|
+
- Bruk `data-variant="primary | secondary | tertiary"`
|
|
19
|
+
- **Merk:** `data-variant="tertiary"` er default siden dette benyttes mest, men for å sikre god universell utforming må knappen da inneholde enten ikon og tekst, eller plasseres ved andre knapper.
|
|
20
|
+
- **Next.js og lenke?** Bruk `<Button as={Link} to={url}>` for å hvor `Link` hentes fra Next.js.
|
|
21
|
+
<Alert data-color="warning">
|
|
22
|
+
**Viktig:** Dersom en knapp innholder personopplysninger, for eksempel navn, må du sette `data-analytics-name=""` for å unngå personopplysninger i analyse-logger
|
|
23
|
+
</Alert>
|
|
24
|
+
<Canvas of={stories.Default} />
|
|
25
|
+
|
|
26
|
+
## Skikk og bruk
|
|
27
|
+
|
|
28
|
+
<Flex data-items="350">
|
|
29
|
+
{/* Viser knapp med lange navn: */}
|
|
30
|
+
<Example data-color="success" text="Bruk korte beskrivende navn på knapper" zoom="100%">
|
|
31
|
+
<button type="button" className={styles.button} data-variant="primary">Lagre</button>
|
|
32
|
+
</Example>
|
|
33
|
+
<Example data-color="danger" text="Lange tekster og flere handlinger på samme knapp bør unngås." zoom="100%">
|
|
34
|
+
<button type="button" className={styles.button} data-variant="primary">Lagre og send inn skjemaet</button>
|
|
35
|
+
</Example>
|
|
36
|
+
|
|
37
|
+
{/* Viser tertiærknapp som står alene: */}
|
|
38
|
+
<Example data-color="success" text="Tertiærknapp bør alltid stå sammen med en primærknapp eller sekundærknapp, eller inneholde ikon" zoom="100%">
|
|
39
|
+
<div className={styles.flex}>
|
|
40
|
+
<button type="button" className={styles.button} data-variant="secondary">Lagre</button>
|
|
41
|
+
<button type="button" className={styles.button} data-variant="tertiary">Avbryt</button>
|
|
42
|
+
</div>
|
|
43
|
+
</Example>
|
|
44
|
+
<Example data-color="danger" text="Unngå å bruke tertiærknapp alene. Vurdér å bruke en sekundærknapp istedenfor eller legg til et ikon" zoom="100%">
|
|
45
|
+
<button type="button" className={styles.button} data-variant="tertiary">Avbryt</button>
|
|
46
|
+
</Example>
|
|
47
|
+
|
|
48
|
+
{/* Viser tertiærknapp med ikon: */}
|
|
49
|
+
<Example data-color="success" text="Tertiærknapp alene kan brukes med et ikon" zoom="100%">
|
|
50
|
+
<button type="button" className={styles.button} data-variant="tertiary"><StarIcon />Favoritt</button>
|
|
51
|
+
</Example>
|
|
52
|
+
<Example data-color="danger" text="Tertiærknapp alene bør brukes med et ikon" zoom="100%">
|
|
53
|
+
<button type="button" className={styles.button} data-variant="tertiary">Favoritt</button>
|
|
54
|
+
</Example>
|
|
55
|
+
|
|
56
|
+
{/* Viser knapp med konsistent størrelse: */}
|
|
57
|
+
<Example data-color="success" text="Bruk konsistente størrelser på knapper" zoom="100%">
|
|
58
|
+
<div className={styles.flex}>
|
|
59
|
+
<button type="button" className={styles.button} data-variant="primary">Lagre</button>
|
|
60
|
+
<button type="button" className={styles.button} data-variant="tertiary">Avbryt</button>
|
|
61
|
+
</div>
|
|
62
|
+
</Example>
|
|
63
|
+
<Example data-color="danger" text="Unngå ulike størrelser på knapper" zoom="100%">
|
|
64
|
+
<div className={styles.flex}>
|
|
65
|
+
<button type="button" className={styles.button} data-variant="primary" data-size='sm'>Lagre</button>
|
|
66
|
+
<button type="button" className={styles.button} data-variant="secondary" data-size='lg'>Avbryt</button>
|
|
67
|
+
</div>
|
|
68
|
+
</Example>
|
|
69
|
+
|
|
70
|
+
{/* Viser knapp med bare ikon: */}
|
|
71
|
+
<Example data-color="success" text="Button kan brukes med bare ikon. Da må den ha en beskrivende tooltip" zoom="100%">
|
|
72
|
+
<button type="button" className={styles.button} data-variant="tertiary" data-tooltip="Hjelpetekst"><StarIcon /></button>
|
|
73
|
+
</Example>
|
|
74
|
+
<Example data-color="danger" text="Når button bare inneholder et ikon skal den ha en beskrivende tooltip " zoom="100%">
|
|
75
|
+
<button type="button" className={styles.button} data-variant="tertiary"><StarIcon /></button>
|
|
76
|
+
</Example>
|
|
77
|
+
|
|
78
|
+
{/* Samme fargevariant i en gruppe: */}
|
|
79
|
+
<Example data-color="success" text="Buttons skal ha samme fargestil innenfor en gruppe" zoom="100%">
|
|
80
|
+
<div className={styles.flex}>
|
|
81
|
+
<button type="button" className={styles.button} data-variant="primary">Lagre</button>
|
|
82
|
+
<button type="button" className={styles.button} data-variant="tertiary">Avbryt</button>
|
|
83
|
+
</div>
|
|
84
|
+
</Example>
|
|
85
|
+
<Example data-color="danger" text="Unngå å blande fargestil på knapper i samme gruppe" zoom="100%">
|
|
86
|
+
<div className={styles.flex}>
|
|
87
|
+
<button type="button" className={styles.button} data-variant="primary" data-color='danger'>Lagre</button>
|
|
88
|
+
<button type="button" className={styles.button} data-variant="tertiary" data-color='info'>Avbryt</button>
|
|
89
|
+
</div>
|
|
90
|
+
</Example>
|
|
91
|
+
|
|
92
|
+
{/* Stor forbokstav: */}
|
|
93
|
+
<Example data-color="success" text="Bruk stor forbokstav og resten små (sentence case) for best mulig lesbarhet" zoom="100%">
|
|
94
|
+
<button type="button" className={styles.button} data-variant="primary">Send søknad</button>
|
|
95
|
+
</Example>
|
|
96
|
+
<Example data-color="danger" text="Ikke bruk store bokstaver eller en blanding av små og store bokstaver i en knapp" zoom="100%">
|
|
97
|
+
<div className={styles.prose}>
|
|
98
|
+
<button type="button" className={styles.button} data-variant="primary">SEND SØKNAD</button>
|
|
99
|
+
<button type="button" className={styles.button} data-variant="primary">Send Søknad</button>
|
|
100
|
+
<button type="button" className={styles.button} data-variant="primary">send søknad</button>
|
|
101
|
+
</div>
|
|
102
|
+
</Example>
|
|
103
|
+
|
|
104
|
+
{/* Kun én call to action: */}
|
|
105
|
+
<Example data-color="success" text="En side skal bare ha én call to action-button" zoom="100%">
|
|
106
|
+
<div className={styles.button}>
|
|
107
|
+
<button type="button" className={styles.button} data-variant="primary">Ferdig</button>
|
|
108
|
+
<button type="button" className={styles.button} data-variant="secondary">Avbryt</button>
|
|
109
|
+
</div>
|
|
110
|
+
</Example>
|
|
111
|
+
<Example data-color="danger" text="Aldri bruk flere call to action-knapper sammen" zoom="100%">
|
|
112
|
+
<div className={styles.button}>
|
|
113
|
+
<button type="button" className={styles.button} data-variant="primary">Ferdig</button>
|
|
114
|
+
<button type="button" className={styles.button} data-variant="primary">Avbryt</button>
|
|
115
|
+
</div>
|
|
116
|
+
</Example>
|
|
117
|
+
|
|
118
|
+
</Flex>
|
|
119
|
+
|
|
120
|
+
## Størrelser
|
|
121
|
+
- Bruk `data-size="sm | md | lg"`
|
|
122
|
+
<Canvas of={stories.Sizes} />
|
|
123
|
+
|
|
124
|
+
## Farger
|
|
125
|
+
- Bruk `data-color="danger"` for å få rød knapp
|
|
126
|
+
<Canvas of={stories.Colors} />
|
|
127
|
+
|
|
128
|
+
## Innhold på en linje
|
|
129
|
+
- Bruk `<span data-nowrap>` rundt tekst dersom du ønsker å tvinge tekst til en linje
|
|
130
|
+
<Canvas of={stories.Nowrap} />
|
|
131
|
+
|
|
132
|
+
## Innholdsplassering
|
|
133
|
+
- Bruk `data-justify="start | center | end"` (`center` er default når *ikke* i `<menu>`)
|
|
134
|
+
<Canvas of={stories.Justify} />
|
|
135
|
+
|
|
136
|
+
## Pil og popover
|
|
137
|
+
- Legg på `data-arrow` (høyrestilt) eller `data-arrow="left | right"`
|
|
138
|
+
- Lasteindikator vil erstatte pil dersom disse kombineres
|
|
139
|
+
- Kombiner `popovertarget` + `data-arrow` for chevron
|
|
140
|
+
<Canvas of={stories.WithArrows} />
|
|
141
|
+
|
|
142
|
+
## Ikoner
|
|
143
|
+
- [Ikon fra phosphoricons.com](https://phosphoricons.com/) kan legges før eller etter tekst
|
|
144
|
+
<Canvas of={stories.WithIcons} />
|
|
145
|
+
|
|
146
|
+
## Spinner
|
|
147
|
+
- For `<button>`: Legg på `<button aria-busy="true" disabled`
|
|
148
|
+
- For `<a>`: Legg på `<a aria-busy="true" tabindex="-1"`
|
|
149
|
+
- Lasteindikator vil erstatte pil dersom disse kombineres
|
|
150
|
+
<Canvas of={stories.WithSpinner} />
|
|
151
|
+
|
|
152
|
+
## Full bredde
|
|
153
|
+
- Bruk `data-self="full"`
|
|
154
|
+
<Canvas of={stories.WithFullWidth} />
|
|
155
|
+
|
|
156
|
+
## Handlingsmeny
|
|
157
|
+
- Bruk `aria-label="Knappetekst her"` i stedet for innhold
|
|
158
|
+
- Da får du automatisk ikon for handlingsmeny <svg aria-hidden="ture" width="1em" height="1em" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"/><circle cx="128" cy="128" r="16"/><circle cx="60" cy="128" r="16"/><circle cx="196" cy="128" r="16"/></svg>
|
|
159
|
+
|
|
160
|
+
<Canvas of={stories.WithMenu} />
|
|
161
|
+
|
|
162
|
+
## Pressed
|
|
163
|
+
- Bruk `<button>` med `aria-pressed="true"`
|
|
164
|
+
- Du kan vise/skjule innhold ved bruke attributten `data-pressed="true | false"` på barn
|
|
165
|
+
- **Merk:** Dersom neste element er `popover`, vil `data-pressed="true | false"` også fungere
|
|
166
|
+
<Canvas of={stories.Pressed} />
|
|
167
|
+
|
|
168
|
+
## Tooltip
|
|
169
|
+
- Bruk `data-tooltip="Hjelpetekst"`
|
|
170
|
+
- Bruk `data-tooltip-position="top | right | bottom | left"` for å endre plassering
|
|
171
|
+
- Teksten blir også automatisk tilgjengelig for skjermlesere
|
|
172
|
+
<Canvas of={stories.WithTooltip} />
|
|
173
|
+
|
|
174
|
+
## I meny
|
|
175
|
+
- Legger du `button` i `<menu><li>` vil knappene ha samme bredde og venstrestilt tekst
|
|
176
|
+
- Ved bruk av `aria-pressed="true"` (for `button`) eller `aria-current="page"` (for lenke) indikeres aktivt valg i menyen
|
|
177
|
+
<Canvas of={stories.InMenu} />
|
|
178
|
+
|
|
179
|
+
<CssVariables component="button" />
|