@mattilsynet/design 3.2.8 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +26 -10
- package/mtds/app/app-toggle.js.map +1 -1
- package/mtds/app/app-toggle2.js +10 -26
- 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/breadcrumbs/breadcrumbs.d.ts +1 -1
- package/mtds/breadcrumbs/breadcrumbs.js.map +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/deprecations.js +6 -5
- package/mtds/deprecations.js.map +1 -1
- package/mtds/errorsummary/errorsummary.d.ts +1 -1
- package/mtds/errorsummary/errorsummary.js.map +1 -1
- package/mtds/field/field.d.ts +1 -1
- package/mtds/field/field.js.map +1 -1
- package/mtds/index.d.ts +1 -2
- package/mtds/index.iife.js +29 -18
- package/mtds/index.js +32 -37
- package/mtds/index.js.map +1 -1
- package/mtds/package.json.js +1 -1
- package/mtds/pagination/pagination.d.ts +1 -1
- package/mtds/pagination/pagination.js +9 -8
- package/mtds/pagination/pagination.js.map +1 -1
- package/mtds/styles.css +1 -1
- package/mtds/styles.json +23 -23
- package/mtds/styles.module.css.js +33 -33
- package/mtds/table/table-observer.js +26 -15
- package/mtds/table/table-observer.js.map +1 -1
- package/mtds/tabs/tabs.d.ts +1 -1
- package/mtds/tabs/tabs.js.map +1 -1
- package/mtds/tailwind.css +0 -1
- package/mtds/tooltip/tooltip-element.js +7 -6
- package/mtds/tooltip/tooltip-element.js.map +1 -1
- package/package.json +8 -6
- package/mtds/external/@u-elements/u-datalist/dist/u-datalist.js +0 -238
- package/mtds/external/@u-elements/u-datalist/dist/u-datalist.js.map +0 -1
- package/mtds/external/@u-elements/u-details/dist/u-details.js +0 -101
- package/mtds/external/@u-elements/u-details/dist/u-details.js.map +0 -1
- package/mtds/external/@u-elements/u-tabs/dist/u-tabs.js +0 -235
- package/mtds/external/@u-elements/u-tabs/dist/u-tabs.js.map +0 -1
package/mtds/ai/tabs.mdx
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { Meta, Canvas } from '@storybook/addon-docs/blocks';
|
|
2
|
+
import { Example, CssVariables } from '../../.storybook/blocks';
|
|
3
|
+
import * as stories from './tabs.stories';
|
|
4
|
+
import { Details } from '../react';
|
|
5
|
+
import { Flex } from '../react';
|
|
6
|
+
import styles from '../styles.module.css';
|
|
7
|
+
import { PencilSimpleIcon, ListMagnifyingGlassIcon, AddressBookTabsIcon, SquaresFourIcon } from '@phosphor-icons/react';
|
|
8
|
+
|
|
9
|
+
<Meta of={stories} />
|
|
10
|
+
|
|
11
|
+
# Tabs
|
|
12
|
+
>Tabs lar brukerne navigere mellom relaterte deler av innholdet, der én del vises om gangen. Dette er en effektiv måte å organisere og presentere relatert innhold på samme side.
|
|
13
|
+
|
|
14
|
+
## Kode
|
|
15
|
+
- Legg klassen `tabs` på elementet `<ds-tabs>`
|
|
16
|
+
- Bruk `aria-selected="true"` på fanen du ønsker skal være åpen når siden lastes
|
|
17
|
+
- Bruk `aria-disabled="true"` på faner som ikke skal være klikkbare
|
|
18
|
+
- **React?** Bruk `<Tabs>`, `<Tabs.List>`, `<Tabs.Tab>` og , `<Tabs.Panel>`
|
|
19
|
+
|
|
20
|
+
<Details>
|
|
21
|
+
<Details.Summary>Hva er `ds-tabs`?</Details.Summary>
|
|
22
|
+
|
|
23
|
+
[ds-tabs](https://u-elements.github.io/u-elements/elements/ds-tabs) er en del av prosjektet [u-elements](https://u-elements.github.io/u-elements)
|
|
24
|
+
som sikrer universell utforming. Dette lastes automatisk når du bruker `@mattilsynet/design`.
|
|
25
|
+
Du kan også hente inn tilhørende HTMLElement interface ved behov:
|
|
26
|
+
```
|
|
27
|
+
import {
|
|
28
|
+
UHTMLTabsElement,
|
|
29
|
+
UHTMLTabElement,
|
|
30
|
+
UHTMLTabListElement,
|
|
31
|
+
UHTMLTabPanelElement
|
|
32
|
+
} from '@mattilsynet/design'
|
|
33
|
+
```
|
|
34
|
+
</Details>
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
<Canvas of={stories.Default} />
|
|
38
|
+
|
|
39
|
+
## Skikk og bruk
|
|
40
|
+
<Flex data-items="350">
|
|
41
|
+
|
|
42
|
+
{/* Tekstmengde i Tabs */}
|
|
43
|
+
<Example data-color="success" text="Bruk korte beskrivende tekster i Tabs." zoom="80%">
|
|
44
|
+
<ds-tabs class={styles.tabs}>
|
|
45
|
+
<ds-tablist>
|
|
46
|
+
<ds-tab role="tab" aria-selected="true"> Oversikt </ds-tab>
|
|
47
|
+
<ds-tab> Detaljer</ds-tab>
|
|
48
|
+
<ds-tab> Kontakter </ds-tab>
|
|
49
|
+
</ds-tablist>
|
|
50
|
+
<ds-tabpanel> </ds-tabpanel>
|
|
51
|
+
<ds-tabpanel> </ds-tabpanel>
|
|
52
|
+
<ds-tabpanel> </ds-tabpanel>
|
|
53
|
+
</ds-tabs>
|
|
54
|
+
</Example>
|
|
55
|
+
|
|
56
|
+
<Example data-color="danger" text="Unngå lange tekster i Tabs. Tekst over flere linjer er ikke brukervennlig. Husk at Tabs være utfordrende å bruke på mobil" zoom="80%">
|
|
57
|
+
<ds-tabs class={styles.tabs}>
|
|
58
|
+
<ds-tablist>
|
|
59
|
+
<ds-tab role="tab" aria-selected="true"> Oversikt over nylige hendelser </ds-tab>
|
|
60
|
+
<ds-tab> Detaljer </ds-tab>
|
|
61
|
+
<ds-tab> Kontakter </ds-tab>
|
|
62
|
+
</ds-tablist>
|
|
63
|
+
<ds-tabpanel> </ds-tabpanel>
|
|
64
|
+
<ds-tabpanel> </ds-tabpanel>
|
|
65
|
+
<ds-tabpanel> </ds-tabpanel>
|
|
66
|
+
</ds-tabs>
|
|
67
|
+
</Example>
|
|
68
|
+
|
|
69
|
+
{/* Kun ikon i Tabs */}
|
|
70
|
+
<Example data-color="success" text="Tabs med bare ikoner bør kun brukes i ekspertløsninger. Bruk tooltip sammen med ikon." zoom="80%">
|
|
71
|
+
<ds-tabs class={styles.tabs}>
|
|
72
|
+
<ds-tablist>
|
|
73
|
+
<ds-tab role="tab" aria-selected="true" data-tooltip="Oversikt"><SquaresFourIcon/></ds-tab>
|
|
74
|
+
<ds-tab data-tooltip="Detaljer"><ListMagnifyingGlassIcon /></ds-tab>
|
|
75
|
+
<ds-tab data-tooltip="Kontakter"><AddressBookTabsIcon /></ds-tab>
|
|
76
|
+
</ds-tablist>
|
|
77
|
+
<ds-tabpanel> </ds-tabpanel>
|
|
78
|
+
<ds-tabpanel> </ds-tabpanel>
|
|
79
|
+
<ds-tabpanel> </ds-tabpanel>
|
|
80
|
+
</ds-tabs>
|
|
81
|
+
</Example>
|
|
82
|
+
|
|
83
|
+
<Example data-color="danger" text="Tabs med bare ikoner skal ha tooltip." zoom="80%">
|
|
84
|
+
<ds-tabs class={styles.tabs}>
|
|
85
|
+
<ds-tablist>
|
|
86
|
+
<ds-tab role="tab" aria-selected="true"><SquaresFourIcon /></ds-tab>
|
|
87
|
+
<ds-tab><ListMagnifyingGlassIcon /></ds-tab>
|
|
88
|
+
<ds-tab><AddressBookTabsIcon /></ds-tab>
|
|
89
|
+
</ds-tablist>
|
|
90
|
+
<ds-tabpanel> </ds-tabpanel>
|
|
91
|
+
<ds-tabpanel> </ds-tabpanel>
|
|
92
|
+
<ds-tabpanel> </ds-tabpanel>
|
|
93
|
+
</ds-tabs>
|
|
94
|
+
</Example>
|
|
95
|
+
</Flex>
|
|
96
|
+
|
|
97
|
+
## Gjenbruke panel
|
|
98
|
+
- Bruk `aria-controls="panel-ID"` for å gjenbruke samme panel for flere faner
|
|
99
|
+
<Canvas of={stories.WithReusePanel} />
|
|
100
|
+
|
|
101
|
+
## Størrelser
|
|
102
|
+
- Bruk `data-size="sm | md | lg"`
|
|
103
|
+
|
|
104
|
+
<Canvas of={stories.Sizes} />
|
|
105
|
+
|
|
106
|
+
<CssVariables component="tabs" />
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { PencilSimpleIcon } from "@phosphor-icons/react";
|
|
2
|
+
import type { Meta, StoryObj } from "@storybook/react-vite";
|
|
3
|
+
|
|
4
|
+
import { Card, Tabs } from "../react";
|
|
5
|
+
import styles from "../styles.module.css";
|
|
6
|
+
|
|
7
|
+
const meta = {
|
|
8
|
+
title: "Designsystem/Tabs",
|
|
9
|
+
} satisfies Meta;
|
|
10
|
+
|
|
11
|
+
export default meta;
|
|
12
|
+
type Story = StoryObj<typeof meta>;
|
|
13
|
+
|
|
14
|
+
const decorators: Story["decorators"] = [
|
|
15
|
+
(Story) => (
|
|
16
|
+
<div className={`${styles.body} ${styles.grid}`} style={{ padding: "2em" }}>
|
|
17
|
+
<style>
|
|
18
|
+
{
|
|
19
|
+
"body:not(:has(.sbdocs-content)) { background: var(--ds-color-background-default) }"
|
|
20
|
+
}
|
|
21
|
+
</style>
|
|
22
|
+
<Story />
|
|
23
|
+
</div>
|
|
24
|
+
),
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
export const Default: Story = {
|
|
28
|
+
parameters: {
|
|
29
|
+
layout: "padded",
|
|
30
|
+
},
|
|
31
|
+
render: () => (
|
|
32
|
+
<ds-tabs class={styles.tabs}>
|
|
33
|
+
<ds-tablist>
|
|
34
|
+
<ds-tab aria-selected="true">Tab 1</ds-tab>
|
|
35
|
+
<ds-tab>Tab 2</ds-tab>
|
|
36
|
+
<ds-tab>
|
|
37
|
+
<PencilSimpleIcon />
|
|
38
|
+
Tab 3
|
|
39
|
+
</ds-tab>
|
|
40
|
+
<ds-tab>Tab with very long content</ds-tab>
|
|
41
|
+
<ds-tab>Tab with very long content</ds-tab>
|
|
42
|
+
<ds-tab>Tab with very long content</ds-tab>
|
|
43
|
+
</ds-tablist>
|
|
44
|
+
<ds-tabpanel>
|
|
45
|
+
Panel 1 with <a href="#none">link</a>
|
|
46
|
+
</ds-tabpanel>
|
|
47
|
+
<ds-tabpanel>
|
|
48
|
+
Panel 2 with <a href="#none">link</a>
|
|
49
|
+
</ds-tabpanel>
|
|
50
|
+
<ds-tabpanel>
|
|
51
|
+
Panel 3 with <a href="#none">link</a>
|
|
52
|
+
</ds-tabpanel>
|
|
53
|
+
</ds-tabs>
|
|
54
|
+
),
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export const React: Story = {
|
|
58
|
+
render: () => (
|
|
59
|
+
<Tabs>
|
|
60
|
+
<Tabs.List>
|
|
61
|
+
<Tabs.Tab aria-selected="true">Tab 1</Tabs.Tab>
|
|
62
|
+
<Tabs.Tab>Tab 2</Tabs.Tab>
|
|
63
|
+
<Tabs.Tab>Tab 3</Tabs.Tab>
|
|
64
|
+
</Tabs.List>
|
|
65
|
+
<Tabs.Panel>
|
|
66
|
+
Panel 1 with <a href="#none">link</a>
|
|
67
|
+
</Tabs.Panel>
|
|
68
|
+
<Tabs.Panel>
|
|
69
|
+
Panel 2 with <a href="#none">link</a>
|
|
70
|
+
</Tabs.Panel>
|
|
71
|
+
<Tabs.Panel>
|
|
72
|
+
Panel 3 with <a href="#none">link</a>
|
|
73
|
+
</Tabs.Panel>
|
|
74
|
+
</Tabs>
|
|
75
|
+
),
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
export const Sizes: Story = {
|
|
79
|
+
render: () => (
|
|
80
|
+
<ds-tabs class={styles.tabs} data-size="sm">
|
|
81
|
+
<ds-tablist>
|
|
82
|
+
<ds-tab aria-selected="true">Tab 1</ds-tab>
|
|
83
|
+
<ds-tab>Tab 2</ds-tab>
|
|
84
|
+
<ds-tab>Tab 3</ds-tab>
|
|
85
|
+
</ds-tablist>
|
|
86
|
+
<ds-tabpanel>
|
|
87
|
+
Panel 1 with <a href="#none">link</a>
|
|
88
|
+
</ds-tabpanel>
|
|
89
|
+
<ds-tabpanel>
|
|
90
|
+
Panel 2 with <a href="#none">link</a>
|
|
91
|
+
</ds-tabpanel>
|
|
92
|
+
<ds-tabpanel>
|
|
93
|
+
Panel 3 with <a href="#none">link</a>
|
|
94
|
+
</ds-tabpanel>
|
|
95
|
+
</ds-tabs>
|
|
96
|
+
),
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
export const WithReusePanel: Story = {
|
|
100
|
+
decorators,
|
|
101
|
+
render: () => (
|
|
102
|
+
<ds-tabs class={styles.tabs}>
|
|
103
|
+
<ds-tablist>
|
|
104
|
+
<ds-tab aria-controls="my-panel" aria-selected="true">
|
|
105
|
+
Tab 1
|
|
106
|
+
</ds-tab>
|
|
107
|
+
<ds-tab aria-controls="my-panel">Tab 2</ds-tab>
|
|
108
|
+
<ds-tab aria-controls="my-panel">Tab 3</ds-tab>
|
|
109
|
+
</ds-tablist>
|
|
110
|
+
<ds-tabpanel id="my-panel" className={styles.card}>
|
|
111
|
+
My panel is used for all tabs!
|
|
112
|
+
</ds-tabpanel>
|
|
113
|
+
</ds-tabs>
|
|
114
|
+
),
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
export const WithCardPanels: Story = {
|
|
118
|
+
decorators,
|
|
119
|
+
render: () => (
|
|
120
|
+
<ds-tabs class={styles.tabs}>
|
|
121
|
+
<ds-tablist>
|
|
122
|
+
<ds-tab aria-selected="true">Tab 1</ds-tab>
|
|
123
|
+
<ds-tab>Tab 2</ds-tab>
|
|
124
|
+
<ds-tab>Tab 3</ds-tab>
|
|
125
|
+
</ds-tablist>
|
|
126
|
+
<ds-tabpanel className={styles.card}>
|
|
127
|
+
Panel 1 with <a href="#none">link</a>
|
|
128
|
+
</ds-tabpanel>
|
|
129
|
+
<ds-tabpanel className={styles.card}>
|
|
130
|
+
Panel 2 with <a href="#none">link</a>
|
|
131
|
+
</ds-tabpanel>
|
|
132
|
+
<ds-tabpanel className={styles.card}>
|
|
133
|
+
Panel 3 with <a href="#none">link</a>
|
|
134
|
+
</ds-tabpanel>
|
|
135
|
+
</ds-tabs>
|
|
136
|
+
),
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
export const ReactWithCardPanels: Story = {
|
|
140
|
+
decorators,
|
|
141
|
+
render: () => (
|
|
142
|
+
<Tabs>
|
|
143
|
+
<Tabs.List>
|
|
144
|
+
<Tabs.Tab aria-selected="true">Tab 1</Tabs.Tab>
|
|
145
|
+
<Tabs.Tab>Tab 2</Tabs.Tab>
|
|
146
|
+
<Tabs.Tab>Tab 3</Tabs.Tab>
|
|
147
|
+
</Tabs.List>
|
|
148
|
+
<Card as={Tabs.Panel}>
|
|
149
|
+
Panel 1 with <a href="#none">link</a>
|
|
150
|
+
</Card>
|
|
151
|
+
<Card as={Tabs.Panel}>
|
|
152
|
+
Panel 2 with <a href="#none">link</a>
|
|
153
|
+
</Card>
|
|
154
|
+
<Card as={Tabs.Panel}>
|
|
155
|
+
Panel 3 with <a href="#none">link</a>
|
|
156
|
+
</Card>
|
|
157
|
+
</Tabs>
|
|
158
|
+
),
|
|
159
|
+
};
|
package/mtds/ai/tag.mdx
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Meta, Canvas } from '@storybook/addon-docs/blocks';
|
|
2
|
+
import { Example, CssVariables } from '../../.storybook/blocks';
|
|
3
|
+
import * as stories from './tag.stories';
|
|
4
|
+
import { Flex, Prose } from '../react';
|
|
5
|
+
import styles from '../styles.module.css';
|
|
6
|
+
|
|
7
|
+
<Meta of={stories} />
|
|
8
|
+
|
|
9
|
+
# Tag
|
|
10
|
+
>Tags er merkelapper som kan brukes til å kategorisere elementer eller kommunisere fremdrift, status eller prosess. Tags kan gi brukeren et raskere overblikk over innholdet. Bruk tags når innholdet har mange kategorier og det er hensiktsmessig å kunne skille mellom dem. Tags er statiske merkelapper; de kan ikke klikkes på.
|
|
11
|
+
|
|
12
|
+
## Kode
|
|
13
|
+
- Bruk klassen `tag` på typisk `<span>`
|
|
14
|
+
<Canvas of={stories.Default} />
|
|
15
|
+
|
|
16
|
+
## Skikk og bruk
|
|
17
|
+
<Flex data-items="350">
|
|
18
|
+
{/* Tekstmengde i tag: */}
|
|
19
|
+
<Example data-color="success" text="Bruk korte konsiste ord i tags" zoom="100%">
|
|
20
|
+
<span className={styles.tag} data-color="success">Hest</span>
|
|
21
|
+
</Example>
|
|
22
|
+
|
|
23
|
+
<Example data-color="danger" text="Unngå lange tekster i tags. Prøv å begrense til maks et par ord" zoom="100%">
|
|
24
|
+
<span className={styles.tag} data-color="danger">Araberhest - Equus caballus arabicus</span>
|
|
25
|
+
</Example>
|
|
26
|
+
</Flex>
|
|
27
|
+
|
|
28
|
+
## Størrelser
|
|
29
|
+
- Bruk `data-size="sm | md | lg"`
|
|
30
|
+
- `sm` er standard størrelse
|
|
31
|
+
<Canvas of={stories.Sizes} />
|
|
32
|
+
|
|
33
|
+
## Farger og ikon
|
|
34
|
+
- Bruk `data-color="neutral | info | success | warning | danger"`
|
|
35
|
+
- Ikon følger automatisk med farge, med mindre du legger inn `<svg>` eller `data-icon="none"`
|
|
36
|
+
<Canvas of={stories.WithIcon} />
|
|
37
|
+
|
|
38
|
+
## Egenvalgt ikon
|
|
39
|
+
- Ikon forsvinner dersom du legger inn egen `<svg>` eller `data-icon="none"`
|
|
40
|
+
- [Ikon fra phosphoricons.com](https://phosphoricons.com/) kan legges før tekst
|
|
41
|
+
<Canvas of={stories.WithIconOverwrite} />
|
|
42
|
+
|
|
43
|
+
## Tooltip
|
|
44
|
+
- Bruk `data-tooltip="Hjelpetekst"`
|
|
45
|
+
- Bruk `data-tooltip-position="top | right | bottom | left"` for å endre plassering
|
|
46
|
+
- Teksten blir også automatisk tilgjengelig for skjermlesere
|
|
47
|
+
<Canvas of={stories.WithTooltip} />
|
|
48
|
+
|
|
49
|
+
<CssVariables component="tag" />
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { ShrimpIcon } from "@phosphor-icons/react";
|
|
2
|
+
import type { Meta, StoryObj } from "@storybook/react-vite";
|
|
3
|
+
import { Tag } from "../react";
|
|
4
|
+
import styles from "../styles.module.css";
|
|
5
|
+
|
|
6
|
+
const meta = {
|
|
7
|
+
title: "Designsystem/Tag",
|
|
8
|
+
decorators: [
|
|
9
|
+
(Story) => (
|
|
10
|
+
<span className={styles.flex}>
|
|
11
|
+
<Story />
|
|
12
|
+
</span>
|
|
13
|
+
),
|
|
14
|
+
],
|
|
15
|
+
} satisfies Meta;
|
|
16
|
+
|
|
17
|
+
export default meta;
|
|
18
|
+
type Story = StoryObj<typeof meta>;
|
|
19
|
+
|
|
20
|
+
export const Default: Story = {
|
|
21
|
+
render: () => (
|
|
22
|
+
<>
|
|
23
|
+
<span className={styles.tag} data-color="neutral">
|
|
24
|
+
Neutral
|
|
25
|
+
</span>
|
|
26
|
+
<span className={styles.tag} data-color="info">
|
|
27
|
+
Info
|
|
28
|
+
</span>
|
|
29
|
+
<span className={styles.tag} data-color="success">
|
|
30
|
+
Success
|
|
31
|
+
</span>
|
|
32
|
+
<span className={styles.tag} data-color="warning">
|
|
33
|
+
Warning
|
|
34
|
+
</span>
|
|
35
|
+
<span className={styles.tag} data-color="danger">
|
|
36
|
+
Danger
|
|
37
|
+
</span>
|
|
38
|
+
</>
|
|
39
|
+
),
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export const React: Story = {
|
|
43
|
+
render: () => (
|
|
44
|
+
<>
|
|
45
|
+
<Tag data-color="neutral">Neutral</Tag>
|
|
46
|
+
<Tag data-color="info">Info</Tag>
|
|
47
|
+
<Tag data-color="success">Success</Tag>
|
|
48
|
+
<Tag data-color="warning">Warning</Tag>
|
|
49
|
+
<Tag data-color="danger">Danger</Tag>
|
|
50
|
+
</>
|
|
51
|
+
),
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export const Sizes: Story = {
|
|
55
|
+
render: () => (
|
|
56
|
+
<>
|
|
57
|
+
<span className={styles.tag} data-size="sm">
|
|
58
|
+
Small
|
|
59
|
+
</span>
|
|
60
|
+
<span className={styles.tag} data-size="md">
|
|
61
|
+
Medium
|
|
62
|
+
</span>
|
|
63
|
+
<span className={styles.tag} data-size="lg">
|
|
64
|
+
Large
|
|
65
|
+
</span>
|
|
66
|
+
</>
|
|
67
|
+
),
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
export const WithIcon: Story = {
|
|
71
|
+
render: () => (
|
|
72
|
+
<>
|
|
73
|
+
<span className={styles.tag} data-color="info">
|
|
74
|
+
Info
|
|
75
|
+
</span>
|
|
76
|
+
<span className={styles.tag} data-color="success">
|
|
77
|
+
Success
|
|
78
|
+
</span>
|
|
79
|
+
<span className={styles.tag} data-color="warning">
|
|
80
|
+
Warning
|
|
81
|
+
</span>
|
|
82
|
+
<span className={styles.tag} data-color="danger">
|
|
83
|
+
Danger
|
|
84
|
+
</span>
|
|
85
|
+
</>
|
|
86
|
+
),
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export const WithIconOverwrite: Story = {
|
|
90
|
+
render: () => (
|
|
91
|
+
<>
|
|
92
|
+
<span className={styles.tag} data-color="success">
|
|
93
|
+
<ShrimpIcon />
|
|
94
|
+
Reke
|
|
95
|
+
</span>
|
|
96
|
+
<span className={styles.tag} data-color="info" data-icon="none">
|
|
97
|
+
Alle felter må fylles ut
|
|
98
|
+
</span>
|
|
99
|
+
</>
|
|
100
|
+
),
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
export const WithTooltip: Story = {
|
|
104
|
+
render: () => (
|
|
105
|
+
<>
|
|
106
|
+
<span className={styles.tag} data-tooltip="Ikke original" tabIndex={0}>
|
|
107
|
+
Bekreftet kopi
|
|
108
|
+
</span>
|
|
109
|
+
</>
|
|
110
|
+
),
|
|
111
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Meta, Canvas } from '@storybook/addon-docs/blocks';
|
|
2
|
+
import { Example, CssVariables } from '../../.storybook/blocks';
|
|
3
|
+
import { Alert, Flex } from '../react';
|
|
4
|
+
import styles from '../styles.module.css';
|
|
5
|
+
import * as stories from './toast.stories';
|
|
6
|
+
|
|
7
|
+
<Meta of={stories} />
|
|
8
|
+
|
|
9
|
+
# Toast
|
|
10
|
+
|
|
11
|
+
> Toasts gir korte oppdateringer om status.
|
|
12
|
+
De skal ikke forstyrre brukeropplevelsen og kan forsvinne automatisk
|
|
13
|
+
eller krysses ut.
|
|
14
|
+
|
|
15
|
+
<Alert data-color="warning">Unngå bruk av toast da dette kan skape tilgjengelighetsproblemer<br />[Lær mer om hvorfor og alternativer til toast →](https://primer.style/accessibility/patterns/accessible-notifications-and-messages/#toasts)</Alert>
|
|
16
|
+
|
|
17
|
+
## Kode
|
|
18
|
+
- **Javascript:** Kall `toast(content: string, options)` fra `@mattilsynet/design`
|
|
19
|
+
- **React:** Kall `toast(content: React.ReactNode, options)` fra `@mattilsynet/design/react`
|
|
20
|
+
- **HTML:** Bruk klassen `toast` på `<dialog open data-timeout="milliseconds: | false">`
|
|
21
|
+
<Canvas of={stories.Default} />
|
|
22
|
+
|
|
23
|
+
## Skikk og bruk
|
|
24
|
+
<Flex data-items="350">
|
|
25
|
+
{/* Viser toast med lange navn: */}
|
|
26
|
+
<Example data-color="success" data-variant="false" text="Bruk en kort, generisk og beskrivende setning i toast som bekrefter en handling." zoom="80%">
|
|
27
|
+
<div className={styles.alert} data-color="success">
|
|
28
|
+
Dokumentet er lagret
|
|
29
|
+
</div>
|
|
30
|
+
</Example>
|
|
31
|
+
<Example data-color="danger" data-variant="false" text="Unngå lange setninger og innhold som er viktig for brukeren. Husk at det er anbefalt at toasten forsvinner automatisk." zoom="80%">
|
|
32
|
+
<div className={styles.alert} data-color="success">
|
|
33
|
+
Helsesertifikat-til-Storbritannia123.pdf har blitt lastet ned på din datamaskin. Husk å signere dokumentet og send det til mottaker i løpet av en uke.
|
|
34
|
+
</div>
|
|
35
|
+
</Example>
|
|
36
|
+
</Flex>
|
|
37
|
+
|
|
38
|
+
## Automatisk lukking
|
|
39
|
+
- Toast skjules automatisk etter 3000 millisekunder nedtelling
|
|
40
|
+
- Hvis brukeren holder musepekeren over toasten, pauses den automatiske nedtellingen
|
|
41
|
+
- Du kan endre antall millisekunder, eller sette `false` får å gjøre toasten permanent
|
|
42
|
+
- Bruk `toast(content, { timeout })` eller `data-timeout` i HTML for å endre timeout
|
|
43
|
+
<Canvas of={stories.WithNoTimeout} />
|
|
44
|
+
|
|
45
|
+
## Programatisk oppdatering
|
|
46
|
+
- Funksjonen `toast()` returner en `id` som kan brukes for oppdateringer
|
|
47
|
+
- Bruk `toast(content, { id })` for å oppdatere en toast
|
|
48
|
+
<Canvas of={stories.WithUpdates} />
|
|
49
|
+
|
|
50
|
+
## Lasting / Promise
|
|
51
|
+
- Funksjonen `toast.promise()` kan brukes for å vise lasting, suksess og feil
|
|
52
|
+
- Bruk `toast(promise, { loading, success, error })`
|
|
53
|
+
<Canvas of={stories.WithPromise} />
|
|
54
|
+
|
|
55
|
+
## Lukkekryss
|
|
56
|
+
- Lukkekryss tegnes automatisk
|
|
57
|
+
- Bruk `toast(content, { closedby: 'none' })` eller `closedby="none"` i HTML for å skjule
|
|
58
|
+
- Bruk `command="close" commandfor="TOAST-ID"` en button inni for egendefinert lukke-knapp
|
|
59
|
+
<Canvas of={stories.WithCustomClose} />
|
|
60
|
+
|
|
61
|
+
## Farger
|
|
62
|
+
- Støtter `main | info | success | warning | danger | neutral` (hvor `main` er default)
|
|
63
|
+
- Ikon følger automatisk med farge, med mindre du setter `toast(content, { icon: false })` eller `data-icon="false"`
|
|
64
|
+
- Bruk `toast.success`, `toast.danger`, `toast.info`, `toast.warning` eller `toast.neutral`, *eller* bruk `toast(content, { color })` eller `data-color` i HTML for å endre farge
|
|
65
|
+
<Canvas of={stories.Colors} />
|
|
66
|
+
|
|
67
|
+
<CssVariables component="toast" />
|