@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.
Files changed (90) hide show
  1. package/mtds/ai/AGENTS.md +892 -0
  2. package/mtds/ai/alert.mdx +63 -0
  3. package/mtds/ai/alert.stories.tsx +128 -0
  4. package/mtds/ai/analytics.mdx +185 -0
  5. package/mtds/ai/app.mdx +60 -0
  6. package/mtds/ai/app.stories.tsx +897 -0
  7. package/mtds/ai/atlas.mdx +82 -0
  8. package/mtds/ai/atlas.stories.tsx +424 -0
  9. package/mtds/ai/avatar.mdx +45 -0
  10. package/mtds/ai/avatar.stories.tsx +109 -0
  11. package/mtds/ai/badge.mdx +70 -0
  12. package/mtds/ai/badge.stories.tsx +122 -0
  13. package/mtds/ai/breadcrumbs.mdx +36 -0
  14. package/mtds/ai/breadcrumbs.stories.tsx +158 -0
  15. package/mtds/ai/button.mdx +179 -0
  16. package/mtds/ai/button.stories.tsx +440 -0
  17. package/mtds/ai/card.mdx +51 -0
  18. package/mtds/ai/card.stories.tsx +469 -0
  19. package/mtds/ai/chart.mdx +67 -0
  20. package/mtds/ai/chart.stories.tsx +519 -0
  21. package/mtds/ai/chip.mdx +71 -0
  22. package/mtds/ai/chip.stories.tsx +211 -0
  23. package/mtds/ai/details.mdx +33 -0
  24. package/mtds/ai/details.stories.tsx +91 -0
  25. package/mtds/ai/dialog.mdx +38 -0
  26. package/mtds/ai/dialog.stories.tsx +373 -0
  27. package/mtds/ai/divider.mdx +19 -0
  28. package/mtds/ai/divider.stories.tsx +50 -0
  29. package/mtds/ai/errorsummary.mdx +26 -0
  30. package/mtds/ai/errorsummary.stories.tsx +137 -0
  31. package/mtds/ai/field.mdx +86 -0
  32. package/mtds/ai/field.stories.tsx +863 -0
  33. package/mtds/ai/fieldset.mdx +126 -0
  34. package/mtds/ai/fieldset.stories.tsx +298 -0
  35. package/mtds/ai/fileupload.mdx +16 -0
  36. package/mtds/ai/fileupload.stories.tsx +126 -0
  37. package/mtds/ai/helptext.mdx +24 -0
  38. package/mtds/ai/helptext.stories.tsx +106 -0
  39. package/mtds/ai/input.mdx +223 -0
  40. package/mtds/ai/input.stories.tsx +352 -0
  41. package/mtds/ai/law.mdx +115 -0
  42. package/mtds/ai/law.stories.tsx +168 -0
  43. package/mtds/ai/layout.mdx +145 -0
  44. package/mtds/ai/layout.stories.tsx +443 -0
  45. package/mtds/ai/link.mdx +45 -0
  46. package/mtds/ai/link.stories.tsx +44 -0
  47. package/mtds/ai/logo.mdx +86 -0
  48. package/mtds/ai/logo.stories.tsx +146 -0
  49. package/mtds/ai/pagination.mdx +136 -0
  50. package/mtds/ai/pagination.stories.tsx +404 -0
  51. package/mtds/ai/popover.mdx +86 -0
  52. package/mtds/ai/popover.stories.tsx +355 -0
  53. package/mtds/ai/print.mdx +96 -0
  54. package/mtds/ai/print.stories.tsx +839 -0
  55. package/mtds/ai/progress.mdx +41 -0
  56. package/mtds/ai/progress.stories.tsx +141 -0
  57. package/mtds/ai/skeleton.mdx +26 -0
  58. package/mtds/ai/skeleton.stories.tsx +131 -0
  59. package/mtds/ai/spinner.mdx +26 -0
  60. package/mtds/ai/spinner.stories.tsx +72 -0
  61. package/mtds/ai/steps.mdx +37 -0
  62. package/mtds/ai/steps.stories.tsx +568 -0
  63. package/mtds/ai/table.mdx +124 -0
  64. package/mtds/ai/table.stories.tsx +1715 -0
  65. package/mtds/ai/tabs.mdx +106 -0
  66. package/mtds/ai/tabs.stories.tsx +159 -0
  67. package/mtds/ai/tag.mdx +49 -0
  68. package/mtds/ai/tag.stories.tsx +111 -0
  69. package/mtds/ai/toast.mdx +67 -0
  70. package/mtds/ai/toast.stories.tsx +215 -0
  71. package/mtds/ai/togglegroup.mdx +75 -0
  72. package/mtds/ai/togglegroup.stories.tsx +96 -0
  73. package/mtds/ai/tooltip.mdx +32 -0
  74. package/mtds/ai/tooltip.stories.tsx +34 -0
  75. package/mtds/ai/typography.mdx +67 -0
  76. package/mtds/ai/typography.stories.tsx +798 -0
  77. package/mtds/ai/validation.mdx +19 -0
  78. package/mtds/ai/validation.stories.tsx +45 -0
  79. package/mtds/atlas/atlas-element.js +1 -1
  80. package/mtds/chart/chart-lines.js +19 -19
  81. package/mtds/chart/chart-lines.js.map +1 -1
  82. package/mtds/chart/chart.css.js +16 -1
  83. package/mtds/chart/chart.css.js.map +1 -1
  84. package/mtds/chart/chart.stories.d.ts +1 -0
  85. package/mtds/index.iife.js +32 -17
  86. package/mtds/package.json.js +1 -1
  87. package/mtds/styles.css +1 -1
  88. package/mtds/table/table-observer.js +26 -15
  89. package/mtds/table/table-observer.js.map +1 -1
  90. 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
+ };