@mattilsynet/design 3.2.9 → 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/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/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,798 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DownloadSimpleIcon,
|
|
3
|
+
HeartIcon,
|
|
4
|
+
PaperPlaneRightIcon,
|
|
5
|
+
WarningIcon,
|
|
6
|
+
} from "@phosphor-icons/react";
|
|
7
|
+
import type { Meta, StoryObj } from "@storybook/react-vite";
|
|
8
|
+
import { useEffect } from "react";
|
|
9
|
+
import inspektor from "../../profilering/arbeidstoy/inspektor.png";
|
|
10
|
+
import {
|
|
11
|
+
Card,
|
|
12
|
+
Field,
|
|
13
|
+
Flex,
|
|
14
|
+
Grid,
|
|
15
|
+
Heading,
|
|
16
|
+
Info,
|
|
17
|
+
Ingress,
|
|
18
|
+
Input,
|
|
19
|
+
Muted,
|
|
20
|
+
Tag,
|
|
21
|
+
} from "../react";
|
|
22
|
+
import styles from "../styles.module.css";
|
|
23
|
+
|
|
24
|
+
const meta = {
|
|
25
|
+
title: "Designsystem/Typography",
|
|
26
|
+
decorators: [
|
|
27
|
+
(Story) => (
|
|
28
|
+
<div className={styles.grid}>
|
|
29
|
+
<Story />
|
|
30
|
+
</div>
|
|
31
|
+
),
|
|
32
|
+
],
|
|
33
|
+
} satisfies Meta;
|
|
34
|
+
|
|
35
|
+
export default meta;
|
|
36
|
+
type Story = StoryObj<typeof meta>;
|
|
37
|
+
|
|
38
|
+
export const Default: Story = {
|
|
39
|
+
render: () => (
|
|
40
|
+
<>
|
|
41
|
+
<p>Text default</p>
|
|
42
|
+
<p>
|
|
43
|
+
<small>Text muted</small>
|
|
44
|
+
</p>
|
|
45
|
+
<p>
|
|
46
|
+
<span className={styles.ingress}>Text ingress</span>
|
|
47
|
+
</p>
|
|
48
|
+
</>
|
|
49
|
+
),
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export const IngressStory: Story = {
|
|
53
|
+
name: "Ingress",
|
|
54
|
+
parameters: { showInOverview: true },
|
|
55
|
+
render: () => <span className={styles.ingress}>Text ingress</span>,
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export const MutedStory: Story = {
|
|
59
|
+
name: "Muted",
|
|
60
|
+
parameters: { showInOverview: true },
|
|
61
|
+
render: () => <small>Text muted</small>,
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
export const HeadingStory: Story = {
|
|
65
|
+
name: "Heading",
|
|
66
|
+
parameters: { showInOverview: true },
|
|
67
|
+
render: () => (
|
|
68
|
+
<>
|
|
69
|
+
{/**
|
|
70
|
+
* Du kan bruke <h1>, <h2>, <h3>, <h4>, <h5>, <h6> og andre HTML-elementer
|
|
71
|
+
* <h2> er kun brukt til demo
|
|
72
|
+
*/}
|
|
73
|
+
<h2 className={styles.heading} data-size="2xl">
|
|
74
|
+
Heading data-size="2xl"
|
|
75
|
+
</h2>
|
|
76
|
+
<h2 className={styles.heading} data-size="xl">
|
|
77
|
+
Heading data-size="xl"
|
|
78
|
+
</h2>
|
|
79
|
+
<h2 className={styles.heading} data-size="lg">
|
|
80
|
+
Heading data-size="lg"
|
|
81
|
+
</h2>
|
|
82
|
+
<h2 className={styles.heading} data-size="md">
|
|
83
|
+
Heading data-size="md"
|
|
84
|
+
</h2>
|
|
85
|
+
<h2 className={styles.heading} data-size="sm">
|
|
86
|
+
Heading data-size="sm"
|
|
87
|
+
</h2>
|
|
88
|
+
<h2 className={styles.heading} data-size="xs">
|
|
89
|
+
Heading data-size="xs"
|
|
90
|
+
</h2>
|
|
91
|
+
<h2 className={styles.heading} data-size="2xs">
|
|
92
|
+
Heading data-size="2xs"
|
|
93
|
+
</h2>
|
|
94
|
+
<h2 className={styles.heading} data-justify="center">
|
|
95
|
+
Heading data-justify="center"
|
|
96
|
+
</h2>
|
|
97
|
+
<h2 className={styles.heading}>
|
|
98
|
+
<HeartIcon /> Heading with icon
|
|
99
|
+
</h2>
|
|
100
|
+
</>
|
|
101
|
+
),
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
export const React: Story = {
|
|
105
|
+
render: () => (
|
|
106
|
+
<>
|
|
107
|
+
{/**
|
|
108
|
+
* Du kan bruke as="h1", as="h2", as="h3", as="h4", as="h5", as="h6".
|
|
109
|
+
*/}
|
|
110
|
+
<Heading data-size="2xl">Heading data-size="2xl"</Heading>
|
|
111
|
+
<Heading data-size="xl">Heading data-size="xl"</Heading>
|
|
112
|
+
<Heading data-size="lg">Heading data-size="lg"</Heading>
|
|
113
|
+
<Heading data-size="md">Heading data-size="md"</Heading>
|
|
114
|
+
<Heading data-size="sm">Heading data-size="sm"</Heading>
|
|
115
|
+
<Heading data-size="xs">Heading data-size="xs"</Heading>
|
|
116
|
+
<Heading data-size="2xs">Heading data-size="2xs"</Heading>
|
|
117
|
+
<p>Text default</p>
|
|
118
|
+
<p>
|
|
119
|
+
<Muted>Muted</Muted>
|
|
120
|
+
</p>
|
|
121
|
+
<p>
|
|
122
|
+
<Ingress>Ingress</Ingress>
|
|
123
|
+
</p>
|
|
124
|
+
</>
|
|
125
|
+
),
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
const CSS_PROSE = styles.prose.split(" ")[0];
|
|
129
|
+
const proseDecorator: Story["decorators"] = (Story) => {
|
|
130
|
+
useEffect(() => {
|
|
131
|
+
const prose = document.querySelector<HTMLElement>(`.${CSS_PROSE}`);
|
|
132
|
+
|
|
133
|
+
function draw() {
|
|
134
|
+
if (!prose) return;
|
|
135
|
+
const { offsetWidth: proseW } = prose;
|
|
136
|
+
|
|
137
|
+
// Calculate the height of 1 unit
|
|
138
|
+
prose.style.height = "var(--mtds-10)";
|
|
139
|
+
const mtds1 = prose.getBoundingClientRect().height / 10;
|
|
140
|
+
prose.removeAttribute("style");
|
|
141
|
+
|
|
142
|
+
const getInt = (el: Element | null | undefined, prop: string) =>
|
|
143
|
+
el
|
|
144
|
+
? Number.parseInt(getComputedStyle(el).getPropertyValue(prop), 10)
|
|
145
|
+
: 0;
|
|
146
|
+
|
|
147
|
+
Array.from(prose.children).forEach((self, index) => {
|
|
148
|
+
const selfStyle = getComputedStyle(self);
|
|
149
|
+
const prev = getInt(prose.children[index - 1], "margin-bottom");
|
|
150
|
+
const next = getInt(prose.children[index + 1], "margin-top");
|
|
151
|
+
const before = Number.parseInt(selfStyle.marginTop, 10);
|
|
152
|
+
const after = Number.parseInt(selfStyle.marginBottom, 10);
|
|
153
|
+
const style = (self as HTMLElement).style;
|
|
154
|
+
const font = getInt(self, "font-size");
|
|
155
|
+
|
|
156
|
+
style.setProperty("--after", `${after}px`);
|
|
157
|
+
style.setProperty("--before", `${before}px`);
|
|
158
|
+
style.setProperty("--width", `${proseW}px`);
|
|
159
|
+
|
|
160
|
+
if (before && before >= prev)
|
|
161
|
+
self.setAttribute(
|
|
162
|
+
"data-before",
|
|
163
|
+
`${font === before ? "1 line height" : `${Math.round(before / mtds1)} size token`} (${before}px)`,
|
|
164
|
+
);
|
|
165
|
+
if (after && after > next)
|
|
166
|
+
self.setAttribute(
|
|
167
|
+
"data-after",
|
|
168
|
+
`${font === after ? "1 line" : `${Math.round(after / mtds1)} size token`} (${after}px)`,
|
|
169
|
+
);
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
setTimeout(draw, 0); // Let sizing happen before drawing
|
|
174
|
+
window.addEventListener("resize", draw);
|
|
175
|
+
return () => window.removeEventListener("resize", draw);
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
return (
|
|
179
|
+
<div className={styles.body} style={{ paddingBlock: "5vw" }}>
|
|
180
|
+
<Grid data-center="md">
|
|
181
|
+
<style>{`
|
|
182
|
+
body:has(input[role="switch"]:checked) { --checked: "" }
|
|
183
|
+
body:has(input[role="switch"]:checked) .${CSS_PROSE} > :hover { --background: #88bbff4d }
|
|
184
|
+
body:not(:has(.sbdocs-content)) {
|
|
185
|
+
.${CSS_PROSE} { overflow: clip }
|
|
186
|
+
.${CSS_PROSE} > * {
|
|
187
|
+
position: relative;
|
|
188
|
+
background: var(--background, transparent);
|
|
189
|
+
box-shadow: 100px 0 var(--background, transparent), -100px 0 var(--background, transparent);
|
|
190
|
+
}
|
|
191
|
+
.${CSS_PROSE} > [data-before]::before,
|
|
192
|
+
.${CSS_PROSE} > [data-after]::after {
|
|
193
|
+
align-items: center;
|
|
194
|
+
background: linear-gradient(to top, var(--background, rgba(255, 165, 0, .3)), var(--background, rgba(255, 165, 0, .3)));
|
|
195
|
+
border-radius: 0 0 var(--ds-border-radius-lg) var(--ds-border-radius-lg);
|
|
196
|
+
box-sizing: border-box;
|
|
197
|
+
color: var(--mtds-color-text-default);
|
|
198
|
+
content: attr(data-after);
|
|
199
|
+
display: flex;
|
|
200
|
+
font: bold .75rem monospace;
|
|
201
|
+
height: var(--after);
|
|
202
|
+
inset: 100% 0 auto;
|
|
203
|
+
opacity: var(--checked, 0);
|
|
204
|
+
padding-inline: var(--ds-size-4);
|
|
205
|
+
position: absolute;
|
|
206
|
+
width: var(--width);
|
|
207
|
+
}
|
|
208
|
+
.${CSS_PROSE} > [data-before]::before {
|
|
209
|
+
background: linear-gradient(to bottom, var(--background, rgba(255, 165, 0, .3)), var(--background, rgba(255, 165, 0, .3)));
|
|
210
|
+
content: attr(data-before);
|
|
211
|
+
height: var(--before);
|
|
212
|
+
inset: auto 0 100%;
|
|
213
|
+
border-radius: var(--ds-border-radius-lg) var(--ds-border-radius-lg) 0 0;
|
|
214
|
+
}
|
|
215
|
+
.${CSS_PROSE} > [class*="heading"][data-before]::before {
|
|
216
|
+
content: attr(data-before) " due to heading size \\"" attr(data-size) "\\"";
|
|
217
|
+
}
|
|
218
|
+
.${CSS_PROSE} > :hover::before,
|
|
219
|
+
.${CSS_PROSE} > :hover::after {
|
|
220
|
+
background: #8bf
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
`}</style>
|
|
224
|
+
<Field>
|
|
225
|
+
<Field.Label>Vis avstander</Field.Label>
|
|
226
|
+
<Input type="checkbox" role="switch" />
|
|
227
|
+
</Field>
|
|
228
|
+
<Story />
|
|
229
|
+
</Grid>
|
|
230
|
+
</div>
|
|
231
|
+
);
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
export const Prose: Story = {
|
|
235
|
+
name: "Prose",
|
|
236
|
+
decorators: proseDecorator,
|
|
237
|
+
parameters: {
|
|
238
|
+
layout: "fullscreen",
|
|
239
|
+
showInOverview: true,
|
|
240
|
+
},
|
|
241
|
+
render: () => (
|
|
242
|
+
<div className={styles.prose}>
|
|
243
|
+
<h1 className={styles.heading} data-size="xl">
|
|
244
|
+
Her søker du om helsesertifikat for sjømat til Australia
|
|
245
|
+
</h1>
|
|
246
|
+
<p>
|
|
247
|
+
<span className={styles.ingress}>
|
|
248
|
+
Se hvilken løsning du skal bruke når du søker, hva sertifikatet koster
|
|
249
|
+
og når sertifikatkontoret holder åpent.
|
|
250
|
+
</span>
|
|
251
|
+
</p>
|
|
252
|
+
<p>
|
|
253
|
+
<small>Publisert 14.01.2025</small>
|
|
254
|
+
</p>
|
|
255
|
+
<h2 className={styles.heading} data-size="xs">
|
|
256
|
+
Innhold på denne siden
|
|
257
|
+
</h2>
|
|
258
|
+
<ol>
|
|
259
|
+
<li>Sertifikater i skjematjenesten</li>
|
|
260
|
+
<li>
|
|
261
|
+
Sertifikater som ikke ligger i eksportløsningen eller skjematjenesten
|
|
262
|
+
</li>
|
|
263
|
+
<li>Dette koster sertifikatet</li>
|
|
264
|
+
<li>Åpningstider for utstedelse av helsesertifikater</li>
|
|
265
|
+
</ol>
|
|
266
|
+
<h2 className={styles.heading} data-size="md">
|
|
267
|
+
Sertifikater i skjematjenesten
|
|
268
|
+
</h2>
|
|
269
|
+
<p>
|
|
270
|
+
Hvis du skal søke om helsesertifikat for eksport av sjømat til Australia
|
|
271
|
+
må du logge inn og fylle ut en søknad i Mattilsynets skjematjeneste.
|
|
272
|
+
</p>
|
|
273
|
+
<p>Logg inn her:</p>
|
|
274
|
+
<p>
|
|
275
|
+
<button
|
|
276
|
+
type="button"
|
|
277
|
+
className={styles.button}
|
|
278
|
+
data-variant="primary"
|
|
279
|
+
data-arrow
|
|
280
|
+
>
|
|
281
|
+
Mattilsynets skjematjeneste
|
|
282
|
+
</button>
|
|
283
|
+
</p>
|
|
284
|
+
<p>
|
|
285
|
+
Noen av sertifikatene har også krav om forhåndsmelding, fordi det
|
|
286
|
+
eksisterer noen fiskehelsekrav. Du søker også om forhåndsmelding i
|
|
287
|
+
Mattilsynets skjematjeneste. Det eksisterer en tilhørende egenerklæring,
|
|
288
|
+
som er en utfyllbar PDF. Denne egenerklæringen blir grunnlaget for
|
|
289
|
+
behandlingen av søknaden. Det skal lages en ny egenerklæring for hver ny
|
|
290
|
+
forhåndsmelding. Egenerklæringen lastes ned, fylles ut, signeres av hver
|
|
291
|
+
enkelt virksomhet hvor varene produseres og lastes opp sammen med
|
|
292
|
+
forhåndsmeldingen.
|
|
293
|
+
</p>
|
|
294
|
+
<div>
|
|
295
|
+
<span className={styles.tag} data-color="info" data-size="sm">
|
|
296
|
+
Alle feltene må fylles ut
|
|
297
|
+
</span>
|
|
298
|
+
</div>
|
|
299
|
+
<h2 className={styles.heading} data-size="sm">
|
|
300
|
+
Transportør
|
|
301
|
+
</h2>
|
|
302
|
+
<div className={styles.grid} data-gap="9">
|
|
303
|
+
<ds-field className={styles.field}>
|
|
304
|
+
<label>Ledetekst</label>
|
|
305
|
+
<p data-field="desciption">Beskrivelse</p>
|
|
306
|
+
<input type="text" className={styles.input} required />
|
|
307
|
+
</ds-field>
|
|
308
|
+
<ds-field className={styles.field}>
|
|
309
|
+
<label>Ledetekst</label>
|
|
310
|
+
<p data-field="desciption">Beskrivelse</p>
|
|
311
|
+
<input type="text" className={styles.input} required />
|
|
312
|
+
</ds-field>
|
|
313
|
+
</div>
|
|
314
|
+
<h2 className={styles.heading} data-size="md">
|
|
315
|
+
Mottaker
|
|
316
|
+
</h2>
|
|
317
|
+
<div className={styles.grid} data-gap="9">
|
|
318
|
+
<ds-field className={styles.field}>
|
|
319
|
+
<label>Beskriv bekymringen din</label>
|
|
320
|
+
<p data-field="desciption">
|
|
321
|
+
Skriv gjerne hva som har skjedd, hvor det skjedde, grunnen til
|
|
322
|
+
problemet og hvorfor du mener at dyrene ikke har det bra.
|
|
323
|
+
</p>
|
|
324
|
+
<textarea className={styles.input} required />
|
|
325
|
+
</ds-field>
|
|
326
|
+
<ds-field className={styles.field}>
|
|
327
|
+
<label>Antall dyr</label>
|
|
328
|
+
<input type="text" className={styles.input} />
|
|
329
|
+
</ds-field>
|
|
330
|
+
</div>
|
|
331
|
+
<h2 className={styles.heading} data-size="lg">
|
|
332
|
+
Helsesertifikat for sjømat
|
|
333
|
+
</h2>
|
|
334
|
+
<div className={styles.grid} data-gap="9">
|
|
335
|
+
<ds-field className={styles.field}>
|
|
336
|
+
<label>Velg dyr</label>
|
|
337
|
+
<input type="text" className={styles.input} required />
|
|
338
|
+
</ds-field>
|
|
339
|
+
<fieldset className={styles.fieldset}>
|
|
340
|
+
<legend>Hovedårsak til bekymring</legend>
|
|
341
|
+
<p data-field="desciption">Fellesbeskrivelse</p>
|
|
342
|
+
<ds-field className={styles.field}>
|
|
343
|
+
<input
|
|
344
|
+
type="radio"
|
|
345
|
+
className={styles.input}
|
|
346
|
+
name="my-radio"
|
|
347
|
+
required
|
|
348
|
+
defaultChecked
|
|
349
|
+
/>
|
|
350
|
+
<label>Alternativ 1</label>
|
|
351
|
+
<p data-field="desciption">Beskrivelse</p>
|
|
352
|
+
</ds-field>
|
|
353
|
+
<ds-field className={styles.field}>
|
|
354
|
+
<input
|
|
355
|
+
type="radio"
|
|
356
|
+
className={styles.input}
|
|
357
|
+
name="my-radio"
|
|
358
|
+
required
|
|
359
|
+
/>
|
|
360
|
+
<label>Alternativ 2</label>
|
|
361
|
+
<p data-field="desciption">Beskrivelse</p>
|
|
362
|
+
</ds-field>
|
|
363
|
+
</fieldset>
|
|
364
|
+
</div>
|
|
365
|
+
<h2 className={styles.heading} data-size="md">
|
|
366
|
+
Litt informasjon
|
|
367
|
+
</h2>
|
|
368
|
+
<table className={styles.table} aria-label="Example table" data-border>
|
|
369
|
+
<thead>
|
|
370
|
+
<tr>
|
|
371
|
+
<th>First name</th>
|
|
372
|
+
<th>Last name</th>
|
|
373
|
+
<th>Age</th>
|
|
374
|
+
<th>Visits</th>
|
|
375
|
+
</tr>
|
|
376
|
+
</thead>
|
|
377
|
+
<tbody>
|
|
378
|
+
<tr>
|
|
379
|
+
<td>Antoni</td>
|
|
380
|
+
<td>Foyston</td>
|
|
381
|
+
<td>74</td>
|
|
382
|
+
<td>128</td>
|
|
383
|
+
</tr>
|
|
384
|
+
<tr>
|
|
385
|
+
<td>Jenine</td>
|
|
386
|
+
<td>Healey</td>
|
|
387
|
+
<td>22</td>
|
|
388
|
+
<td>194</td>
|
|
389
|
+
</tr>
|
|
390
|
+
<tr>
|
|
391
|
+
<td>Leigh</td>
|
|
392
|
+
<td>Klein</td>
|
|
393
|
+
<td>26</td>
|
|
394
|
+
<td>114</td>
|
|
395
|
+
</tr>
|
|
396
|
+
<tr>
|
|
397
|
+
<td>Zara</td>
|
|
398
|
+
<td>Greenrodd</td>
|
|
399
|
+
<td>28</td>
|
|
400
|
+
<td>36</td>
|
|
401
|
+
</tr>
|
|
402
|
+
</tbody>
|
|
403
|
+
</table>
|
|
404
|
+
<p>
|
|
405
|
+
Fiskehelsekravene stilles av australske veterinærmyndigheter, og de
|
|
406
|
+
kommer i tillegg til norske regelverkskrav. Den som underskriver
|
|
407
|
+
egenerklæringen må forsikre seg om at varen er i henhold til Australias
|
|
408
|
+
krav for import før signering.
|
|
409
|
+
</p>
|
|
410
|
+
<ul>
|
|
411
|
+
<li>
|
|
412
|
+
<a href="#anchor">
|
|
413
|
+
Fiskehelsekrav for laksefiskprodukter til Australia
|
|
414
|
+
</a>
|
|
415
|
+
</li>
|
|
416
|
+
<li>
|
|
417
|
+
<a href="#anchor">
|
|
418
|
+
Slik søker du om helsesertifikat med forhåndsmelding
|
|
419
|
+
</a>
|
|
420
|
+
</li>
|
|
421
|
+
</ul>
|
|
422
|
+
<h2 className={styles.heading} data-size="md">
|
|
423
|
+
Oppdrettet laksefisk
|
|
424
|
+
</h2>
|
|
425
|
+
<h3 className={styles.heading} data-size="sm">
|
|
426
|
+
Forhåndsmelding
|
|
427
|
+
</h3>
|
|
428
|
+
<p>
|
|
429
|
+
Helsesertifikatene har krav om forhåndsmelding. Forhåndsmeldingen må
|
|
430
|
+
godkjennes før sertifikatet kan utstedes.
|
|
431
|
+
</p>
|
|
432
|
+
<h3 className={styles.heading} data-size="sm">
|
|
433
|
+
Helsesertifikater
|
|
434
|
+
</h3>
|
|
435
|
+
<ul>
|
|
436
|
+
<li>
|
|
437
|
+
<a href="#anchor">
|
|
438
|
+
1.1.75 Australia helsesertifikat laksefisk, engelsk, specimen
|
|
439
|
+
</a>
|
|
440
|
+
</li>
|
|
441
|
+
<li>
|
|
442
|
+
<a href="#anchor">
|
|
443
|
+
1.1.72 Australia helsesertifikat laksefisk for bearbeiding i
|
|
444
|
+
utlandet, engelsk, specimen
|
|
445
|
+
</a>
|
|
446
|
+
</li>
|
|
447
|
+
</ul>
|
|
448
|
+
<p>
|
|
449
|
+
Som produsent og eksportør må du kjenne til hvordan helsesertifikatene
|
|
450
|
+
for produktene dine skal fylles ut. Finn veiledning her:
|
|
451
|
+
</p>
|
|
452
|
+
<p>
|
|
453
|
+
<button
|
|
454
|
+
type="button"
|
|
455
|
+
className={styles.button}
|
|
456
|
+
data-variant="primary"
|
|
457
|
+
data-arrow
|
|
458
|
+
>
|
|
459
|
+
Krav til produsent
|
|
460
|
+
</button>
|
|
461
|
+
</p>
|
|
462
|
+
<h3 className={styles.heading} data-size="sm">
|
|
463
|
+
Egenerklæring
|
|
464
|
+
</h3>
|
|
465
|
+
<ul>
|
|
466
|
+
<li>
|
|
467
|
+
<a href="#anchor">
|
|
468
|
+
1.3.76 Australia, egenerklæring, pakker av laksefisk
|
|
469
|
+
</a>
|
|
470
|
+
</li>
|
|
471
|
+
</ul>
|
|
472
|
+
<p>
|
|
473
|
+
Utfylt erklæring må sendes inn sammen med forhåndsmeldingen. Du finner
|
|
474
|
+
egenerklæringen som utfyllbar PDF-fil i linken over.
|
|
475
|
+
</p>
|
|
476
|
+
<h2 className={styles.heading} data-size="md">
|
|
477
|
+
Villfanget fisk
|
|
478
|
+
</h2>
|
|
479
|
+
<h3 className={styles.heading} data-size="sm">
|
|
480
|
+
Helsesertifikat
|
|
481
|
+
</h3>
|
|
482
|
+
<ul>
|
|
483
|
+
<li>
|
|
484
|
+
<a href="#anchor">
|
|
485
|
+
1.1.94 Australia, sunnhetsattest, villfanget marin- og
|
|
486
|
+
ferskvannsfisk, engelsk, specimen
|
|
487
|
+
</a>
|
|
488
|
+
</li>
|
|
489
|
+
</ul>
|
|
490
|
+
<p>
|
|
491
|
+
Sertifikatet skal brukes på all villfanget fisk
|
|
492
|
+
(marine/ferskvannsorganismer) som skal eksporteres til Australia.
|
|
493
|
+
</p>
|
|
494
|
+
<p>
|
|
495
|
+
Vi gjør oppmerksom på at det står i sertifikatet at det kun skal være et
|
|
496
|
+
fiskeslag i forsendelsen. Det skal derfor utstedes et sertifikat per
|
|
497
|
+
fiskeslag.
|
|
498
|
+
</p>
|
|
499
|
+
<h2 className={styles.heading} data-size="md">
|
|
500
|
+
Reker
|
|
501
|
+
</h2>
|
|
502
|
+
<h3 className={styles.heading} data-size="sm">
|
|
503
|
+
Helsesertifikat
|
|
504
|
+
</h3>
|
|
505
|
+
<ul>
|
|
506
|
+
<li>
|
|
507
|
+
<a href="#anchor">1.1.95 Australia sunnhetsattest, reker, engelsk</a>
|
|
508
|
+
</li>
|
|
509
|
+
<li>
|
|
510
|
+
<a href="#anchor">Veiledning for utfylling av attest 1.1.95</a>
|
|
511
|
+
</li>
|
|
512
|
+
</ul>
|
|
513
|
+
<h2 className={styles.heading} data-size="md">
|
|
514
|
+
Lakserogn
|
|
515
|
+
</h2>
|
|
516
|
+
<h3 className={styles.heading} data-size="sm">
|
|
517
|
+
Helsesertifikater
|
|
518
|
+
</h3>
|
|
519
|
+
<div>
|
|
520
|
+
<details className={styles.details}>
|
|
521
|
+
<summary>Hva sier regelverket om lakserogn?</summary>
|
|
522
|
+
<div className={styles.prose}>
|
|
523
|
+
<p>
|
|
524
|
+
Sertifikatet kan utstedes for varmebehandlet rogn fra laksefisk,
|
|
525
|
+
til konsum, som er produsert i Norge.
|
|
526
|
+
</p>
|
|
527
|
+
<p>
|
|
528
|
+
Rognen kan komme fra hvilket som helst land, men den må være
|
|
529
|
+
varmebehandlet, i henhold til over angitt krav, av produsent i
|
|
530
|
+
Norge.
|
|
531
|
+
</p>
|
|
532
|
+
</div>
|
|
533
|
+
</details>
|
|
534
|
+
<details className={styles.details}>
|
|
535
|
+
<summary>Hva sier regelverket om lakserogn?</summary>
|
|
536
|
+
<div className={styles.prose}>
|
|
537
|
+
<p>
|
|
538
|
+
Sertifikatet kan utstedes for varmebehandlet rogn fra laksefisk,
|
|
539
|
+
til konsum, som er produsert i Norge.
|
|
540
|
+
</p>
|
|
541
|
+
<p>
|
|
542
|
+
Rognen kan komme fra hvilket som helst land, men den må være
|
|
543
|
+
varmebehandlet, i henhold til over angitt krav, av produsent i
|
|
544
|
+
Norge.
|
|
545
|
+
</p>
|
|
546
|
+
</div>
|
|
547
|
+
</details>
|
|
548
|
+
</div>
|
|
549
|
+
<h3 className={styles.heading} data-size="sm">
|
|
550
|
+
Overskrift
|
|
551
|
+
</h3>
|
|
552
|
+
<p>
|
|
553
|
+
Sertifikatet kan utstedes for varmebehandlet rogn fra laksefisk, til
|
|
554
|
+
konsum, som er produsert i Norge.
|
|
555
|
+
</p>
|
|
556
|
+
<p>
|
|
557
|
+
Sertifikatet krever at rognen må være varmebehandlet til en
|
|
558
|
+
kjernetemperatur på minimum 65°C i minimum 30 minutter.
|
|
559
|
+
</p>
|
|
560
|
+
<p>
|
|
561
|
+
Rognen kan komme fra hvilket som helst land, men den må være
|
|
562
|
+
varmebehandlet, i henhold til over angitt krav, av produsent i Norge.
|
|
563
|
+
</p>
|
|
564
|
+
<p>The quick brown fox jumps over the lazy dog</p>
|
|
565
|
+
<ul>
|
|
566
|
+
<li>
|
|
567
|
+
<a href="#anchor">
|
|
568
|
+
1.1.75 Australia helsesertifikat laksefisk, engelsk, specimen
|
|
569
|
+
</a>
|
|
570
|
+
</li>
|
|
571
|
+
</ul>
|
|
572
|
+
<p>
|
|
573
|
+
I så fall gjelder standard krav for 1.1.75 om opprinnelsesland,
|
|
574
|
+
forhåndsmelding og egenerklæring.
|
|
575
|
+
</p>
|
|
576
|
+
<figure>
|
|
577
|
+
<img src={inspektor} alt="" />
|
|
578
|
+
<figcaption>
|
|
579
|
+
Arbeidstøyet er en viktig del av vår visuelle identitet.
|
|
580
|
+
</figcaption>
|
|
581
|
+
</figure>
|
|
582
|
+
<h2 className={styles.heading} data-size="md">
|
|
583
|
+
Olje av laksefisk til humant konsum
|
|
584
|
+
</h2>
|
|
585
|
+
<h3 className={styles.heading} data-size="sm">
|
|
586
|
+
Forhåndsmelding
|
|
587
|
+
</h3>
|
|
588
|
+
<p>
|
|
589
|
+
Helsesertifikat har forhåndsmelding på grunn av fiskehelsekrav.
|
|
590
|
+
Forhåndsmeldingen må godkjennes før sertifikatet kan utstedes.
|
|
591
|
+
</p>
|
|
592
|
+
<h3 className={styles.heading} data-size="sm">
|
|
593
|
+
Helsesertifikat
|
|
594
|
+
</h3>
|
|
595
|
+
<ul>
|
|
596
|
+
<li>
|
|
597
|
+
<a href="#anchor">
|
|
598
|
+
1.1.93 Australia, sunnhetsattest olje av laksefisk, engelsk
|
|
599
|
+
</a>
|
|
600
|
+
</li>
|
|
601
|
+
</ul>
|
|
602
|
+
<h3 className={styles.heading} data-size="sm">
|
|
603
|
+
Egenerklæring
|
|
604
|
+
</h3>
|
|
605
|
+
<ul>
|
|
606
|
+
<li>
|
|
607
|
+
<a href="#anchor">
|
|
608
|
+
1.3.76 Australia, egenerklæring pakker av laksefisk, engelsk
|
|
609
|
+
</a>
|
|
610
|
+
</li>
|
|
611
|
+
</ul>
|
|
612
|
+
<p>
|
|
613
|
+
Utfylt erklæring må sendes inn sammen med forhåndsmeldingen. Du finner
|
|
614
|
+
egenerklæringen som utfyllbar PDF-fil i linken over.
|
|
615
|
+
</p>
|
|
616
|
+
<p>
|
|
617
|
+
Denne egenerklæringen blir grunnlaget for behandlingen av søknaden.
|
|
618
|
+
Egenerklæringen fylles ut og signeres av hver enkelt virksomhet hvor
|
|
619
|
+
varene produseres. Det skal lages en ny egenerklæring for hver ny
|
|
620
|
+
forhåndsmelding.
|
|
621
|
+
</p>
|
|
622
|
+
<p>
|
|
623
|
+
Fiskehelsekravene stilles av australske veterinærmyndigheter, og de
|
|
624
|
+
kommer i tillegg til norske regelverkskrav. Den som underskriver
|
|
625
|
+
egenerklæringen må forsikre seg om at varen er i henhold til Australias
|
|
626
|
+
krav for import før signering.
|
|
627
|
+
</p>
|
|
628
|
+
<ul>
|
|
629
|
+
<li>
|
|
630
|
+
<a href="#anchor">
|
|
631
|
+
Fiskehelsekrav for laksefiskprodukter til Australia
|
|
632
|
+
</a>
|
|
633
|
+
</li>
|
|
634
|
+
</ul>
|
|
635
|
+
<p>
|
|
636
|
+
Australia har gitt beskjed om at de i utgangspunktet ikke tillater
|
|
637
|
+
import av lakseolje i bulk på 25 liter eller mer. Dersom du likevel har
|
|
638
|
+
en australsk importør for dette produktet, anbefaler vi at du tar
|
|
639
|
+
kontakt med et kontor som utsteder sjømatsertifikater, som vil ta dette
|
|
640
|
+
videre med Mattilsynets Hovedkontor.
|
|
641
|
+
</p>
|
|
642
|
+
<p>
|
|
643
|
+
I del III. «Destination of the fish oil» finnes en linje for
|
|
644
|
+
«Consignments details». Her skal det refereres enten til
|
|
645
|
+
containernummer, bill of lading, fakturanummer, batch/serienummer eller
|
|
646
|
+
produksjonsdato.
|
|
647
|
+
</p>
|
|
648
|
+
<p>
|
|
649
|
+
Ved alle forsendelser er produsenten selv ansvarlig for å fylle ut en
|
|
650
|
+
«Manufacturer's declaration» på engelsk på eget brevpapir. Dette må
|
|
651
|
+
avklares med importøren før eksporten starter opp.
|
|
652
|
+
</p>
|
|
653
|
+
<h2 className={styles.heading} data-size="md">
|
|
654
|
+
Ikke-salmonid fiskeolje for humant konsum
|
|
655
|
+
</h2>
|
|
656
|
+
<h3 className={styles.heading} data-size="sm">
|
|
657
|
+
Helsesertifikat
|
|
658
|
+
</h3>
|
|
659
|
+
<ul>
|
|
660
|
+
<li>
|
|
661
|
+
<a href="#anchor">
|
|
662
|
+
1.1.278 Australia helsesertifikat, ikke-salmonid fiskeolje humant
|
|
663
|
+
konsum, engelsk
|
|
664
|
+
</a>
|
|
665
|
+
</li>
|
|
666
|
+
</ul>
|
|
667
|
+
<p>
|
|
668
|
+
Helsesertifikat for ikke-salmonid fiskeolje til humant konsum ligger
|
|
669
|
+
inne i Mattilsynets skjematjenester, men grunnet en feil i systemet må
|
|
670
|
+
du for tiden likevel sende det inn som PDF. Du får sertifikatet som
|
|
671
|
+
utfyllbar PDF-fil ved henvendelse til sertifikatkontoret.
|
|
672
|
+
</p>
|
|
673
|
+
<p>
|
|
674
|
+
Australia krever i utgangspunktet garanti for at det ikke finnes
|
|
675
|
+
salmonid materiale (dvs. fra laksefisk) i fiskeolje som de importerer.
|
|
676
|
+
Siden en slik garanti ikke kan gis, krever Australia at fiskeoljen
|
|
677
|
+
varmebehandles, og garanti for at fiskeoljen inneholder mindre enn 2 %
|
|
678
|
+
salmonid materiale. For slik fiskeolje skal sertifikat nr. 1.1.278
|
|
679
|
+
benyttes.
|
|
680
|
+
</p>
|
|
681
|
+
<p>
|
|
682
|
+
Australia krever ikke tilsvarende garantier for fiskeolje i
|
|
683
|
+
forpakningsenheter mindre enn 25 L, dersom de går til en «approved
|
|
684
|
+
arrangement class 4.1» for foredling i Australia.
|
|
685
|
+
</p>
|
|
686
|
+
</div>
|
|
687
|
+
),
|
|
688
|
+
};
|
|
689
|
+
|
|
690
|
+
// <figure style={{ marginInline: 0 }}>
|
|
691
|
+
// <img
|
|
692
|
+
// src={henvisninger}
|
|
693
|
+
// alt=""
|
|
694
|
+
// style={{ display: "block", marginBottom: "var(--mtds-2)" }}
|
|
695
|
+
// />
|
|
696
|
+
// <figcaption className={styles.muted}>
|
|
697
|
+
// Illustrasjon av hvordan du finner helsesertifikatene i Mattilsynets
|
|
698
|
+
// skjematjeneste.
|
|
699
|
+
// </figcaption>
|
|
700
|
+
// </figure>
|
|
701
|
+
|
|
702
|
+
export const InfoStory: Story = {
|
|
703
|
+
name: "Info",
|
|
704
|
+
parameters: { showInOverview: true },
|
|
705
|
+
render: () => (
|
|
706
|
+
<>
|
|
707
|
+
<div className={styles.info}>Informasjon</div>
|
|
708
|
+
<hr className={styles.divider} data-gap="5" />
|
|
709
|
+
<div className={styles.info}>
|
|
710
|
+
<strong>Fet ledetekst</strong>Og informasjon
|
|
711
|
+
</div>
|
|
712
|
+
<hr className={styles.divider} data-gap="5" />
|
|
713
|
+
<div className={styles.info}>
|
|
714
|
+
Ledetekst<strong>Og fet informasjon</strong>
|
|
715
|
+
</div>
|
|
716
|
+
<hr className={styles.divider} data-gap="5" />
|
|
717
|
+
<div className={styles.info}>
|
|
718
|
+
<HeartIcon />
|
|
719
|
+
Ikon og informasjon
|
|
720
|
+
</div>
|
|
721
|
+
<hr className={styles.divider} data-gap="5" />
|
|
722
|
+
<div className={styles.info}>
|
|
723
|
+
<HeartIcon /> <strong>Ikon og ledetekst</strong>
|
|
724
|
+
Og informasjon
|
|
725
|
+
</div>
|
|
726
|
+
<div className={styles.info}>
|
|
727
|
+
<HeartIcon /> Ikon og ledetekst
|
|
728
|
+
<strong>Og informasjon</strong>
|
|
729
|
+
</div>
|
|
730
|
+
<hr className={styles.divider} data-gap="5" />
|
|
731
|
+
<div className={styles.info} data-variant="circle">
|
|
732
|
+
<HeartIcon /> <strong>Sirkel og fet ledetekst</strong>
|
|
733
|
+
Og informasjon
|
|
734
|
+
</div>
|
|
735
|
+
<hr className={styles.divider} data-gap="5" />
|
|
736
|
+
<div className={styles.info} data-variant="circle">
|
|
737
|
+
<HeartIcon /> Sirkel og ledetekst
|
|
738
|
+
<strong>Og fet informasjon</strong>
|
|
739
|
+
</div>
|
|
740
|
+
<hr className={styles.divider} data-gap="5" />
|
|
741
|
+
<div className={styles.info} data-variant="circle" data-color="warning">
|
|
742
|
+
<WarningIcon /> Sirkel og ledetekst og farge
|
|
743
|
+
<strong>Og fet informasjon</strong>
|
|
744
|
+
</div>
|
|
745
|
+
<hr className={styles.divider} data-gap="5" />
|
|
746
|
+
<div className={styles.info}>
|
|
747
|
+
<i>🇳🇴</i>
|
|
748
|
+
Norge
|
|
749
|
+
</div>
|
|
750
|
+
<hr className={styles.divider} data-gap="5" />
|
|
751
|
+
Info i card:
|
|
752
|
+
<Card>
|
|
753
|
+
<Flex data-align="start">
|
|
754
|
+
<div data-self="300" data-fixed>
|
|
755
|
+
<Heading data-size="xs">KY.KELLI.815.493.00</Heading>
|
|
756
|
+
</div>
|
|
757
|
+
<Flex data-self="500">
|
|
758
|
+
<Flex data-self="500" data-align="start">
|
|
759
|
+
<Grid data-self="200">
|
|
760
|
+
<Info>
|
|
761
|
+
<PaperPlaneRightIcon />
|
|
762
|
+
Firmanavn AS
|
|
763
|
+
</Info>
|
|
764
|
+
<Info>
|
|
765
|
+
<i>🇳🇱</i> Nederland
|
|
766
|
+
</Info>
|
|
767
|
+
</Grid>
|
|
768
|
+
<Info data-self="300">
|
|
769
|
+
<DownloadSimpleIcon />
|
|
770
|
+
Bomsterlandet importerer bomster AS, Rogaland
|
|
771
|
+
</Info>
|
|
772
|
+
</Flex>
|
|
773
|
+
<Tag data-fixed data-color="info" data-icon="none">
|
|
774
|
+
Skal på tilsyn
|
|
775
|
+
</Tag>
|
|
776
|
+
</Flex>
|
|
777
|
+
</Flex>
|
|
778
|
+
</Card>
|
|
779
|
+
<hr className={styles.divider} data-gap="5" />
|
|
780
|
+
Info i flex:
|
|
781
|
+
<Flex>
|
|
782
|
+
<Info>
|
|
783
|
+
<strong>Avsender:</strong>
|
|
784
|
+
Firmanavn AS
|
|
785
|
+
</Info>
|
|
786
|
+
<Info>
|
|
787
|
+
<strong>Land:</strong>
|
|
788
|
+
Nederland
|
|
789
|
+
</Info>
|
|
790
|
+
<Info data-self="300">
|
|
791
|
+
<DownloadSimpleIcon />
|
|
792
|
+
<strong>Mottaker:</strong>
|
|
793
|
+
Bomsterlandet importerer bomster AS, Rogaland
|
|
794
|
+
</Info>
|
|
795
|
+
</Flex>
|
|
796
|
+
</>
|
|
797
|
+
),
|
|
798
|
+
};
|