@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,86 @@
|
|
|
1
|
+
import { Meta, Canvas } from '@storybook/addon-docs/blocks';
|
|
2
|
+
import { Example, CssVariables, JumpTo } from '../../.storybook/blocks';
|
|
3
|
+
import * as stories from './popover.stories';
|
|
4
|
+
import { Flex, Prose } from '../react';
|
|
5
|
+
import styles from '../styles.module.css';
|
|
6
|
+
|
|
7
|
+
<Meta of={stories} />
|
|
8
|
+
|
|
9
|
+
# Popover
|
|
10
|
+
> Popover vises over andre elementer i grensesnittet og er koblet til et spesifikt element. Den brukes til å vise tilleggsinformasjon, interaktive elementer eller korte forklaringer uten å navigere bort fra siden. Popover kan brukes som en utvidet løsning når tooltip ikke strekker til.
|
|
11
|
+
|
|
12
|
+
<JumpTo />
|
|
13
|
+
|
|
14
|
+
## Kode
|
|
15
|
+
- Legg klassen `popover`, attributten `popover` og `id` på `<div>` eller `<menu>`
|
|
16
|
+
- Legg `popovertarget="ID"` på typisk `<button>` som trigger element
|
|
17
|
+
- Plassiering vil automatisk tilpasse seg scroll og tilgjengelig plass
|
|
18
|
+
|
|
19
|
+
> **Merk:** I React 19 kan du skrive `popoverTarget` og `popoverTargetAction`. Eldre versjoner av React krever `popovertarget` og `popovertargetaction`
|
|
20
|
+
|
|
21
|
+
<Canvas of={stories.Default} />
|
|
22
|
+
|
|
23
|
+
## Skikk og bruk
|
|
24
|
+
<Flex data-items="350">
|
|
25
|
+
|
|
26
|
+
{/* Lange tekster */}
|
|
27
|
+
<Example data-color="success" text="Innhold i popover bør være kort og konsist (trykk for å se)." zoom="100%">
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
Vi bruker{" "} <button popoverTarget="pop-inline-1" type="button" data-popover="inline">
|
|
31
|
+
design tokens </button>{" "} for å sikre at vi har en konsistent design.
|
|
32
|
+
|
|
33
|
+
<div popover="auto" id="pop-inline-1" className={styles.popover}> Design tokens er en samling av variabler som definerer designet i et
|
|
34
|
+
designsystem. </div>
|
|
35
|
+
|
|
36
|
+
</Example>
|
|
37
|
+
|
|
38
|
+
<Example data-color="danger" text="Unngå lange tekster i popover (trykk for å se)." zoom="100%">
|
|
39
|
+
|
|
40
|
+
Vi bruker{" "} <button popoverTarget="pop-inline-2" type="button" data-popover="inline">
|
|
41
|
+
design tokens </button>{" "} for å sikre at vi har en konsistent design.
|
|
42
|
+
|
|
43
|
+
<div popover="auto" id="pop-inline-2" className={styles.popover}> Design tokens er navngitte variabler (navn-verdi-par) som representerer grunnleggende designattributter som farger, typografi, mellomrom, skygger og animasjoner. De fungerer som et "enkelt kilde til sannhet" som kan brukes på tvers av ulike plattformer, teknologier og designverktøy for å opprettholde et enhetlig og konsistent utseende i digitale produkter. Ved å erstatte hardkodede verdier med tokens, kan design og kode holdes synkronisert, noe som forenkler vedlikehold og gir skalerbarhet for designsystemer. </div>
|
|
44
|
+
|
|
45
|
+
</Example>
|
|
46
|
+
|
|
47
|
+
</Flex>
|
|
48
|
+
|
|
49
|
+
## Nedtrekksmeny / Dropdown
|
|
50
|
+
- Bruk `<menu>` med `<li><button type="button">` eller ` <li><a>` som barn
|
|
51
|
+
- Dersom du legger `<a>` inni en `popover`, vil den automatsk lukke popoveren på klikk, med mindre du setter `popovertargetaction="show"` eller kjører `event.preventDefault()` på `onClick`
|
|
52
|
+
|
|
53
|
+
<Canvas of={stories.Dropdown} />
|
|
54
|
+
|
|
55
|
+
## Placement
|
|
56
|
+
- Bruk `data-placement="top | top-start | top-end | right | right-start | right-end | bottom | bottom-start | bottom-end | left | left-start | left-end"` for å plassere popoveren
|
|
57
|
+
- Popover vil alltid legge seg der det er plass i skjermbildet
|
|
58
|
+
<Canvas of={stories.Placement} />
|
|
59
|
+
|
|
60
|
+
## Lukkeknapp
|
|
61
|
+
- Bruk `popovertargetaction="hide"` på `<button>` (eller `<a>` dersom du lager en SPA) for å lage lukkeknapp:
|
|
62
|
+
<Canvas of={stories.WithClose} />
|
|
63
|
+
|
|
64
|
+
## Tekst inline
|
|
65
|
+
- Bruk `data-popover="inline"` på `<button>` for popover fra brødtekst:
|
|
66
|
+
<Canvas of={stories.WithTextInline} />
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
## Pil
|
|
71
|
+
- Bruk `data-arrow` på `<button>` for å få ikon:
|
|
72
|
+
<Canvas of={stories.WithArrow} />
|
|
73
|
+
|
|
74
|
+
## Egendefinert ikon
|
|
75
|
+
- Du kan vise/skjule innhold ved bruke attributten `data-pressed="true | false"` på barn:
|
|
76
|
+
<Canvas of={stories.WithIcon} />
|
|
77
|
+
|
|
78
|
+
## Skillelinje
|
|
79
|
+
- Bruk `<li><hr />` i `<menu>` for å få skillelinje:
|
|
80
|
+
<Canvas of={stories.WithDivider} />
|
|
81
|
+
|
|
82
|
+
## Scroll
|
|
83
|
+
- Bruk `data-overscroll="contain"` for å holde popover høyde innen skjermbildet:
|
|
84
|
+
<Canvas of={stories.WithOverscroll} />
|
|
85
|
+
|
|
86
|
+
<CssVariables component="popover" />
|
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
import { ListIcon, XIcon } from "@phosphor-icons/react";
|
|
2
|
+
import type { Meta, StoryObj } from "@storybook/react-vite";
|
|
3
|
+
import { useId } from "react";
|
|
4
|
+
import { Button, Field, Input, Popover } from "../react";
|
|
5
|
+
import styles from "../styles.module.css";
|
|
6
|
+
|
|
7
|
+
const meta = {
|
|
8
|
+
title: "Designsystem/Popover",
|
|
9
|
+
} satisfies Meta;
|
|
10
|
+
|
|
11
|
+
export default meta;
|
|
12
|
+
type Story = StoryObj<typeof meta>;
|
|
13
|
+
|
|
14
|
+
const range = Array.from(Array(10), (_, num) => num + 1);
|
|
15
|
+
|
|
16
|
+
export const Default: Story = {
|
|
17
|
+
render: function Render() {
|
|
18
|
+
const popId = useId();
|
|
19
|
+
|
|
20
|
+
return (
|
|
21
|
+
<>
|
|
22
|
+
<button
|
|
23
|
+
className={styles.button}
|
|
24
|
+
data-arrow
|
|
25
|
+
data-variant="secondary"
|
|
26
|
+
popoverTarget={popId}
|
|
27
|
+
type="button"
|
|
28
|
+
>
|
|
29
|
+
Knapp
|
|
30
|
+
</button>
|
|
31
|
+
<menu popover="auto" id={popId} className={styles.popover}>
|
|
32
|
+
{range.map((num) => (
|
|
33
|
+
<li key={num}>
|
|
34
|
+
<button
|
|
35
|
+
className={styles.button}
|
|
36
|
+
popoverTargetAction="hide"
|
|
37
|
+
type="button"
|
|
38
|
+
>
|
|
39
|
+
Knapp {num}
|
|
40
|
+
</button>
|
|
41
|
+
</li>
|
|
42
|
+
))}
|
|
43
|
+
</menu>
|
|
44
|
+
</>
|
|
45
|
+
);
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export const React: Story = {
|
|
50
|
+
render: function Render() {
|
|
51
|
+
const popId = useId();
|
|
52
|
+
const popInlineId = useId();
|
|
53
|
+
const popLabelId = useId();
|
|
54
|
+
|
|
55
|
+
return (
|
|
56
|
+
<>
|
|
57
|
+
<Button popoverTarget={popId} data-variant="secondary" data-arrow>
|
|
58
|
+
Knapp
|
|
59
|
+
</Button>
|
|
60
|
+
<Popover as="menu" id={popId}>
|
|
61
|
+
{range.map((num) => (
|
|
62
|
+
<li key={num}>
|
|
63
|
+
<Button>Knapp {num}</Button>
|
|
64
|
+
</li>
|
|
65
|
+
))}
|
|
66
|
+
</Popover>
|
|
67
|
+
<br />
|
|
68
|
+
<p>
|
|
69
|
+
En{" "}
|
|
70
|
+
<button
|
|
71
|
+
type="button"
|
|
72
|
+
data-popover="inline"
|
|
73
|
+
popoverTarget={popInlineId}
|
|
74
|
+
>
|
|
75
|
+
popover i test
|
|
76
|
+
</button>
|
|
77
|
+
</p>
|
|
78
|
+
<Popover id={popInlineId}>Popover i tekst</Popover>
|
|
79
|
+
<br />
|
|
80
|
+
<Field>
|
|
81
|
+
<Field.Label>
|
|
82
|
+
Et{" "}
|
|
83
|
+
<button
|
|
84
|
+
type="button"
|
|
85
|
+
data-popover="inline"
|
|
86
|
+
popoverTarget={popLabelId}
|
|
87
|
+
>
|
|
88
|
+
vanskelig ord
|
|
89
|
+
</button>{" "}
|
|
90
|
+
i ledetekst
|
|
91
|
+
</Field.Label>
|
|
92
|
+
<Popover id={popLabelId}>
|
|
93
|
+
Legg popover elementet <i>etter</i> label elementet (ikke inni), for
|
|
94
|
+
å oppnå semantisk riktig HTML
|
|
95
|
+
</Popover>
|
|
96
|
+
<Input />
|
|
97
|
+
</Field>
|
|
98
|
+
</>
|
|
99
|
+
);
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
export const Dropdown: Story = {
|
|
104
|
+
render: function Render() {
|
|
105
|
+
const popId = useId();
|
|
106
|
+
|
|
107
|
+
return (
|
|
108
|
+
<>
|
|
109
|
+
<button
|
|
110
|
+
popoverTarget={popId}
|
|
111
|
+
type="button"
|
|
112
|
+
className={styles.button}
|
|
113
|
+
data-variant="secondary"
|
|
114
|
+
data-arrow
|
|
115
|
+
>
|
|
116
|
+
Knapp
|
|
117
|
+
</button>
|
|
118
|
+
<menu popover="auto" id={popId} className={styles.popover}>
|
|
119
|
+
<li>
|
|
120
|
+
<a href="#none" className={styles.button}>
|
|
121
|
+
Knapp 1
|
|
122
|
+
</a>
|
|
123
|
+
</li>
|
|
124
|
+
<li>
|
|
125
|
+
<a href="#none" className={styles.button}>
|
|
126
|
+
Knapp 2
|
|
127
|
+
</a>
|
|
128
|
+
</li>
|
|
129
|
+
<li>
|
|
130
|
+
<a
|
|
131
|
+
href="#none"
|
|
132
|
+
className={styles.button}
|
|
133
|
+
popoverTargetAction="show"
|
|
134
|
+
>
|
|
135
|
+
Knapp 3
|
|
136
|
+
</a>
|
|
137
|
+
</li>
|
|
138
|
+
</menu>
|
|
139
|
+
</>
|
|
140
|
+
);
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
export const Placement: Story = {
|
|
145
|
+
render: () => (
|
|
146
|
+
<>
|
|
147
|
+
<button
|
|
148
|
+
popoverTarget="pop-2"
|
|
149
|
+
type="button"
|
|
150
|
+
className={styles.button}
|
|
151
|
+
data-variant="primary"
|
|
152
|
+
>
|
|
153
|
+
Knapp
|
|
154
|
+
</button>
|
|
155
|
+
<div
|
|
156
|
+
className={styles.popover}
|
|
157
|
+
data-placement="top"
|
|
158
|
+
id="pop-2"
|
|
159
|
+
popover="auto"
|
|
160
|
+
>
|
|
161
|
+
<div className={styles.grid}>
|
|
162
|
+
<p>Er du sikker på at du vil avslutte uten å lagre?</p>
|
|
163
|
+
<div className={styles.flex}>
|
|
164
|
+
<button
|
|
165
|
+
type="button"
|
|
166
|
+
className={styles.button}
|
|
167
|
+
data-variant="primary"
|
|
168
|
+
>
|
|
169
|
+
Lagre
|
|
170
|
+
</button>
|
|
171
|
+
<button
|
|
172
|
+
popoverTarget="pop-2"
|
|
173
|
+
popoverTargetAction="hide"
|
|
174
|
+
type="button"
|
|
175
|
+
className={styles.button}
|
|
176
|
+
data-variant="secondary"
|
|
177
|
+
>
|
|
178
|
+
Avbryt
|
|
179
|
+
</button>
|
|
180
|
+
</div>
|
|
181
|
+
</div>
|
|
182
|
+
</div>
|
|
183
|
+
</>
|
|
184
|
+
),
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
export const WithClose: Story = {
|
|
188
|
+
render: () => (
|
|
189
|
+
<>
|
|
190
|
+
<button
|
|
191
|
+
popoverTarget="pop-3"
|
|
192
|
+
type="button"
|
|
193
|
+
className={styles.button}
|
|
194
|
+
data-variant="primary"
|
|
195
|
+
>
|
|
196
|
+
Knapp
|
|
197
|
+
</button>
|
|
198
|
+
<div popover="auto" id="pop-3" className={styles.popover}>
|
|
199
|
+
<button
|
|
200
|
+
popoverTargetAction="hide"
|
|
201
|
+
type="button"
|
|
202
|
+
className={styles.button}
|
|
203
|
+
data-variant="secondary"
|
|
204
|
+
>
|
|
205
|
+
Lukk
|
|
206
|
+
</button>
|
|
207
|
+
</div>
|
|
208
|
+
</>
|
|
209
|
+
),
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
export const WithTextInline: Story = {
|
|
213
|
+
parameters: { showInOverview: true },
|
|
214
|
+
render: () => (
|
|
215
|
+
<>
|
|
216
|
+
Vi bruker{" "}
|
|
217
|
+
<button popoverTarget="pop-inline" type="button" data-popover="inline">
|
|
218
|
+
design tokens
|
|
219
|
+
</button>{" "}
|
|
220
|
+
for å sikre at vi har en konsistent design.
|
|
221
|
+
<div popover="auto" id="pop-inline" className={styles.popover}>
|
|
222
|
+
Design tokens er en samling av variabler som definerer designet i et
|
|
223
|
+
designsystem.
|
|
224
|
+
</div>
|
|
225
|
+
<br />
|
|
226
|
+
<br />
|
|
227
|
+
<ds-field className={styles.field}>
|
|
228
|
+
<label>
|
|
229
|
+
Et{" "}
|
|
230
|
+
<button popoverTarget="pop-label" type="button" data-popover="inline">
|
|
231
|
+
vanskelig ord
|
|
232
|
+
</button>{" "}
|
|
233
|
+
i ledetekst
|
|
234
|
+
</label>
|
|
235
|
+
<div popover="auto" id="pop-label" className={styles.popover}>
|
|
236
|
+
Legg popover elementet <i>etter</i> label elementet (ikke inni), for å
|
|
237
|
+
oppnå semantisk riktig HTML
|
|
238
|
+
</div>
|
|
239
|
+
<input className={styles.input} />
|
|
240
|
+
</ds-field>
|
|
241
|
+
</>
|
|
242
|
+
),
|
|
243
|
+
};
|
|
244
|
+
|
|
245
|
+
export const WithArrow: Story = {
|
|
246
|
+
render: () => (
|
|
247
|
+
<>
|
|
248
|
+
<button
|
|
249
|
+
className={styles.button}
|
|
250
|
+
data-arrow
|
|
251
|
+
popoverTarget="pop-4"
|
|
252
|
+
type="button"
|
|
253
|
+
>
|
|
254
|
+
Knapp
|
|
255
|
+
</button>
|
|
256
|
+
<div popover="auto" id="pop-4" className={styles.popover}>
|
|
257
|
+
Innhold
|
|
258
|
+
</div>
|
|
259
|
+
</>
|
|
260
|
+
),
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
export const WithIcon: Story = {
|
|
264
|
+
render: () => (
|
|
265
|
+
<>
|
|
266
|
+
<button className={styles.button} popoverTarget="pop-icon" type="button">
|
|
267
|
+
Knapp
|
|
268
|
+
<ListIcon data-pressed="false" />
|
|
269
|
+
<XIcon data-pressed="true" />
|
|
270
|
+
</button>
|
|
271
|
+
<div popover="auto" id="pop-icon" className={styles.popover}>
|
|
272
|
+
Innhold
|
|
273
|
+
</div>
|
|
274
|
+
</>
|
|
275
|
+
),
|
|
276
|
+
};
|
|
277
|
+
|
|
278
|
+
export const WithDivider: Story = {
|
|
279
|
+
render: function Render() {
|
|
280
|
+
const popId = useId();
|
|
281
|
+
|
|
282
|
+
return (
|
|
283
|
+
<>
|
|
284
|
+
<button
|
|
285
|
+
popoverTarget={popId}
|
|
286
|
+
type="button"
|
|
287
|
+
className={styles.button}
|
|
288
|
+
data-variant="secondary"
|
|
289
|
+
data-arrow
|
|
290
|
+
>
|
|
291
|
+
Knapp
|
|
292
|
+
</button>
|
|
293
|
+
<menu popover="auto" id={popId} className={styles.popover}>
|
|
294
|
+
<li>
|
|
295
|
+
<button type="button" className={styles.button}>
|
|
296
|
+
Knapp 1
|
|
297
|
+
</button>
|
|
298
|
+
</li>
|
|
299
|
+
<li>
|
|
300
|
+
<button type="button" className={styles.button}>
|
|
301
|
+
Knapp 2
|
|
302
|
+
</button>
|
|
303
|
+
</li>
|
|
304
|
+
<li>
|
|
305
|
+
<hr className={styles.divider} />
|
|
306
|
+
</li>
|
|
307
|
+
<li>
|
|
308
|
+
<button type="button" className={styles.button}>
|
|
309
|
+
Knapp 3
|
|
310
|
+
</button>
|
|
311
|
+
</li>
|
|
312
|
+
<li>
|
|
313
|
+
<button type="button" className={styles.button}>
|
|
314
|
+
Knapp 4
|
|
315
|
+
</button>
|
|
316
|
+
</li>
|
|
317
|
+
</menu>
|
|
318
|
+
</>
|
|
319
|
+
);
|
|
320
|
+
},
|
|
321
|
+
};
|
|
322
|
+
|
|
323
|
+
export const WithOverscroll: Story = {
|
|
324
|
+
render: function Render() {
|
|
325
|
+
const popId = useId();
|
|
326
|
+
|
|
327
|
+
return (
|
|
328
|
+
<>
|
|
329
|
+
<button
|
|
330
|
+
popoverTarget={popId}
|
|
331
|
+
type="button"
|
|
332
|
+
className={styles.button}
|
|
333
|
+
data-variant="secondary"
|
|
334
|
+
data-arrow
|
|
335
|
+
>
|
|
336
|
+
Overscroll
|
|
337
|
+
</button>
|
|
338
|
+
<menu
|
|
339
|
+
popover="auto"
|
|
340
|
+
id={popId}
|
|
341
|
+
className={styles.popover}
|
|
342
|
+
data-overscroll="contain"
|
|
343
|
+
>
|
|
344
|
+
{Array.from({ length: 20 }, (_, i) => i).map((num) => (
|
|
345
|
+
<li key={num}>
|
|
346
|
+
<button type="button" className={styles.button}>
|
|
347
|
+
Knapp {num + 1}
|
|
348
|
+
</button>
|
|
349
|
+
</li>
|
|
350
|
+
))}
|
|
351
|
+
</menu>
|
|
352
|
+
</>
|
|
353
|
+
);
|
|
354
|
+
},
|
|
355
|
+
};
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { Meta, Canvas } from '@storybook/addon-docs/blocks';
|
|
2
|
+
import { Example, CssVariables, JumpTo } from '../../.storybook/blocks';
|
|
3
|
+
import * as stories from './print.stories';
|
|
4
|
+
import { Button } from '../react';
|
|
5
|
+
import styles from '../styles.module.css';
|
|
6
|
+
|
|
7
|
+
<Meta of={stories} />
|
|
8
|
+
|
|
9
|
+
# Print (Eksperimentell)
|
|
10
|
+
> Print brukes for å lage PDF eller utskriftsvennlige rapporter og dokumenter med Mattilsynets designprofil.
|
|
11
|
+
> I nettleser får du en A4-forhåndsvisning, og ved PDF/utskrift får du sidetall, bunnlinje og kontrollerte sideskift som unngår brudd i bilder, lister og tabeller.
|
|
12
|
+
|
|
13
|
+
<JumpTo />
|
|
14
|
+
|
|
15
|
+
## Kode
|
|
16
|
+
- All HTML du lager, kan sendes til Mattilsynets [HTML-til-PDF-tjeneste](https://github.com/Mattilsynet/html-to-pdf)
|
|
17
|
+
- Koden legges automatisk i `<body>`, så du trenger ikke lage head, meta osv selv.
|
|
18
|
+
- Tjenesten bruker headless Chrome, så bruk Chromes print-preview ved lokal testing
|
|
19
|
+
- Alle bilder må inlines som `base64`-urler så de blir en del av HTML-strengen
|
|
20
|
+
- All CSS og fonter må også inlines, dette hjelper designsystemet med slik:
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
// Import CSS as text if using Vite
|
|
24
|
+
import css from '@mattilsynet/design/styles.css?raw';
|
|
25
|
+
|
|
26
|
+
// ...or import css with pure Node:
|
|
27
|
+
import path from "node:path";
|
|
28
|
+
import fs from "node:fs";
|
|
29
|
+
|
|
30
|
+
const cssPath = path.resolve(process.cwd(), 'node_modules/@mattilsynet/design/mtds/styles.css');
|
|
31
|
+
const css = fs.readFileSync(cssPath, 'utf8');
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
<div id="my-print">
|
|
35
|
+
<style>
|
|
36
|
+
{css}
|
|
37
|
+
:root {
|
|
38
|
+
--mtdsc-print-office: 'ditt kontor'; /* Required */
|
|
39
|
+
--mtdsc-print-department: 'din avdeling'; /* Required */
|
|
40
|
+
--mtdsc-print-classification: none; /* Optional, remove to get "Unntatt offentlighet" */
|
|
41
|
+
|
|
42
|
+
--mtdsc-print-back-tagline: none; /* Optional, if using data-variant="back" */
|
|
43
|
+
--mtdsc-print-back-footer: none; /* Optional, if using data-variant="back" */
|
|
44
|
+
}
|
|
45
|
+
</style>
|
|
46
|
+
<section className="print">
|
|
47
|
+
innhold her
|
|
48
|
+
</section>
|
|
49
|
+
</div>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Brevmal
|
|
53
|
+
|
|
54
|
+
- For å legge inn mottaker, lag en `<address>` og `<dl>` inne i en `<div>`:
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
<div>
|
|
58
|
+
<address>
|
|
59
|
+
Eksempelstedet AS
|
|
60
|
+
<br />Uendeligveien 999
|
|
61
|
+
<br />0000 Sted
|
|
62
|
+
</address>
|
|
63
|
+
<dl>
|
|
64
|
+
<dt>Vår ref:</dt><dd>2004/12345</dd>
|
|
65
|
+
<dt>Dato:</dt><dd>01.01.2024</dd>
|
|
66
|
+
<dt>Org.nr:</dt><dd>123456789</dd>
|
|
67
|
+
</dl>
|
|
68
|
+
</div>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
<div className="sbdocs-canvas-thumbnail">
|
|
72
|
+
<Button data-arrow data-variant="primary" target="_blank" href="/iframe.html?globals=&id=designsystem-print--brevmal">Se brevmal i ny fane</Button>
|
|
73
|
+
<Canvas of={stories.Brevmal} />
|
|
74
|
+
</div>
|
|
75
|
+
|
|
76
|
+
## Rapportmal
|
|
77
|
+
- Legg til en `<section className="print" data-variant="front">` for forside
|
|
78
|
+
- Legg til en `<section className="print" data-variant="back">` for bakside
|
|
79
|
+
|
|
80
|
+
<div className="sbdocs-canvas-thumbnail">
|
|
81
|
+
<Button data-arrow data-variant="primary" target="_blank" href="/iframe.html?globals=&id=designsystem-print--rapportmal">Se rapportmal i ny fane</Button>
|
|
82
|
+
<Canvas of={stories.Rapportmal} />
|
|
83
|
+
</div>
|
|
84
|
+
|
|
85
|
+
<CssVariables component='print' />
|
|
86
|
+
|
|
87
|
+
## Vedtak
|
|
88
|
+
- Det finnes mye, godt utarbeidet materiale for hvordan vedtak skal utformes, og det er viktig at vi følger dette så langt det lar seg gjøre. [Se rapportkvalitet →](https://mattilsynet.sharepoint.com/:f:/r/sites/TVRTilsyn/Delte%20dokumenter/Rapportkvalitet/Oppl%C3%A6ring%20Nytt%20oppsett%20i%20MATS?csf=1&web=1&e=94K1gM)
|
|
89
|
+
- Designsystemet har foreløpig ingen spesifikke komponenter for vedtak, men har heller kodet opp et eksempel foreløpig.
|
|
90
|
+
|
|
91
|
+
<div className="sbdocs-canvas-thumbnail">
|
|
92
|
+
<Button data-arrow data-variant="primary" target="_blank" href="/iframe.html?globals=&id=designsystem-print--vedtak">Se vedtak i ny fane</Button>
|
|
93
|
+
<Canvas of={stories.Rapportmal} />
|
|
94
|
+
</div>
|
|
95
|
+
|
|
96
|
+
<CssVariables component='print' />
|