@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,63 @@
|
|
|
1
|
+
import { Meta, Canvas } from '@storybook/addon-docs/blocks';
|
|
2
|
+
import { CssVariables, Example } from '../../.storybook/blocks';
|
|
3
|
+
import { Flex } from '../react';
|
|
4
|
+
import styles from '../styles.module.css';
|
|
5
|
+
import * as stories from './alert.stories';
|
|
6
|
+
|
|
7
|
+
<Meta of={stories} />
|
|
8
|
+
|
|
9
|
+
# Alert
|
|
10
|
+
> Alert tiltrekker brukerens oppmerksomhet til viktige opplysninger og varsler. Komponenten har flere varianter du kan bruke for å tilpasse den til budskapet i varselet.
|
|
11
|
+
|
|
12
|
+
## Kode
|
|
13
|
+
- Legg klassen `alert` på `<output>` eller `<div>` eller bruk `<Alert>` komponenten i React
|
|
14
|
+
- Bruk `<div role="alert">` ved kritiske feil og `<output>` ved andre varsel
|
|
15
|
+
<Canvas of={stories.Default} />
|
|
16
|
+
|
|
17
|
+
## Skikk og bruk
|
|
18
|
+
<Flex data-items="350">
|
|
19
|
+
|
|
20
|
+
<Example data-color="success" text="Skriv kort og konsist i alerts" zoom="100%">
|
|
21
|
+
<output className={styles.alert}>
|
|
22
|
+
Det er lange køer for å bestille pass om dagen, det kan være lurt å bestille i god tid før du skal reise.
|
|
23
|
+
</output>
|
|
24
|
+
</Example>
|
|
25
|
+
<Example data-color="danger" text="Unngå lange tekster i alerts" zoom="100%">
|
|
26
|
+
<output className={styles.alert}>
|
|
27
|
+
For å ivareta en helhetlig oppfølging av innbyggere som mottar flere typer offentlige tjenester,
|
|
28
|
+
har vi opprettet et eget koordinerende team som inkluderer representanter fra helse, sosial, NAV og teknisk etat.
|
|
29
|
+
Hensikten er å etablere et samlet kontaktpunkt for brukere med sammensatte behov,
|
|
30
|
+
slik at de slipper å navigere mellom ulike kontorer og etater på egen hånd.
|
|
31
|
+
I praksis betyr dette at en brukers sak kan drøftes i fellesmøter der alle relevante fagpersoner er til stede,
|
|
32
|
+
noe som gir bedre informasjonsflyt og mer tilpassede løsninger.
|
|
33
|
+
Et typisk eksempel kan være en person med nedsatt funksjonsevne og mangelfull boligtilpasning,
|
|
34
|
+
som samtidig har behov for sosialhjelp og helsetjenester.
|
|
35
|
+
Tidligere ville vedkommende måtte oppsøke NAV for økonomisk støtte,
|
|
36
|
+
eget kontor for ergoterapi og enda en avdeling for kommunale boligtjenester.
|
|
37
|
+
Resultatet ble ofte ulike vedtak som ikke henger sammen, og tidkrevende oppfølging.
|
|
38
|
+
</output>
|
|
39
|
+
</Example>
|
|
40
|
+
</Flex>
|
|
41
|
+
|
|
42
|
+
## Farger og ikon
|
|
43
|
+
- Bruk `data-color="info | success | warning | danger | neutral"`
|
|
44
|
+
<Canvas of={stories.Colors} />
|
|
45
|
+
|
|
46
|
+
## Størrelser
|
|
47
|
+
- Bruk `data-size="sm | md | lg"`
|
|
48
|
+
<Canvas of={stories.Sizes} />
|
|
49
|
+
|
|
50
|
+
## Med tittel
|
|
51
|
+
- Legg `h2`, `h3` eller `h4` som første element
|
|
52
|
+
<Canvas of={stories.WithTitle} />
|
|
53
|
+
|
|
54
|
+
## Med lukkeknapp
|
|
55
|
+
- Legg en tom `<button type="button" aria-label="Lukk">` som siste element
|
|
56
|
+
<Canvas of={stories.WithClose} />
|
|
57
|
+
|
|
58
|
+
## Med knapper
|
|
59
|
+
- Legg en `flex` med knapper inni
|
|
60
|
+
- Det er valgfritt om første knapp skal være `primary` eller `secondary`
|
|
61
|
+
<Canvas of={stories.WithButtons} />
|
|
62
|
+
|
|
63
|
+
<CssVariables component="alert" />
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react-vite";
|
|
2
|
+
import { Alert } from "../react";
|
|
3
|
+
import styles from "../styles.module.css";
|
|
4
|
+
|
|
5
|
+
const meta = {
|
|
6
|
+
title: "Designsystem/Alert",
|
|
7
|
+
decorators: [
|
|
8
|
+
(Story) => (
|
|
9
|
+
<div className={styles.grid}>
|
|
10
|
+
<Story />
|
|
11
|
+
</div>
|
|
12
|
+
),
|
|
13
|
+
],
|
|
14
|
+
} satisfies Meta;
|
|
15
|
+
|
|
16
|
+
export default meta;
|
|
17
|
+
type Story = StoryObj<typeof meta>;
|
|
18
|
+
|
|
19
|
+
export const Default: Story = {
|
|
20
|
+
render: () => (
|
|
21
|
+
<output className={styles.alert}>
|
|
22
|
+
Info ipsum dolor sit amet, consectetur adipiscing elit. Vivamus in
|
|
23
|
+
tincidunt ipsum. Morbi et consequat felis, quis finibus quam.
|
|
24
|
+
</output>
|
|
25
|
+
),
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export const React: Story = {
|
|
29
|
+
render: () => (
|
|
30
|
+
<Alert>
|
|
31
|
+
Info ipsum dolor sit amet, consectetur adipiscing elit. Vivamus in
|
|
32
|
+
tincidunt ipsum. Morbi et consequat felis, quis finibus quam.
|
|
33
|
+
</Alert>
|
|
34
|
+
),
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export const Colors: Story = {
|
|
38
|
+
render: () => (
|
|
39
|
+
<>
|
|
40
|
+
<output className={styles.alert}>
|
|
41
|
+
Info ipsum dolor sit amet, consectetur adipiscing elit. Vivamus in
|
|
42
|
+
tincidunt ipsum. Morbi et consequat felis, quis finibus quam.
|
|
43
|
+
</output>
|
|
44
|
+
<output className={styles.alert} data-color="success">
|
|
45
|
+
Success ipsum dolor sit amet, consectetur adipiscing elit. Vivamus in
|
|
46
|
+
tincidunt ipsum. Morbi et consequat felis, quis finibus quam.
|
|
47
|
+
</output>
|
|
48
|
+
<output className={styles.alert} data-color="warning">
|
|
49
|
+
Warning ipsum dolor sit amet, consectetur adipiscing elit. Vivamus in
|
|
50
|
+
tincidunt ipsum. Morbi et consequat felis, quis finibus quam.
|
|
51
|
+
</output>
|
|
52
|
+
<div role="alert">
|
|
53
|
+
<div className={styles.alert} data-color="danger">
|
|
54
|
+
Danger ipsum dolor sit amet, consectetur adipiscing elit. Vivamus in
|
|
55
|
+
tincidunt ipsum. Morbi et consequat felis, quis finibus quam.
|
|
56
|
+
</div>
|
|
57
|
+
</div>
|
|
58
|
+
<output className={styles.alert} data-color="neutral">
|
|
59
|
+
Neutral ipsum dolor sit amet, consectetur adipiscing elit. Vivamus in
|
|
60
|
+
tincidunt ipsum. Morbi et consequat felis, quis finibus quam.
|
|
61
|
+
</output>
|
|
62
|
+
</>
|
|
63
|
+
),
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export const Sizes: Story = {
|
|
67
|
+
render: () => (
|
|
68
|
+
<>
|
|
69
|
+
<output className={styles.alert} data-size="sm">
|
|
70
|
+
Info ipsum dolor sit amet, consectetur adipiscing elit. Vivamus in
|
|
71
|
+
tincidunt ipsum. Morbi et consequat felis, quis finibus quam.
|
|
72
|
+
</output>
|
|
73
|
+
<output className={styles.alert} data-size="md">
|
|
74
|
+
Info ipsum dolor sit amet, consectetur adipiscing elit. Vivamus in
|
|
75
|
+
tincidunt ipsum. Morbi et consequat felis, quis finibus quam.
|
|
76
|
+
</output>
|
|
77
|
+
<output className={styles.alert} data-size="lg">
|
|
78
|
+
Info ipsum dolor sit amet, consectetur adipiscing elit. Vivamus in
|
|
79
|
+
tincidunt ipsum. Morbi et consequat felis, quis finibus quam.
|
|
80
|
+
</output>
|
|
81
|
+
</>
|
|
82
|
+
),
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export const WithTitle: Story = {
|
|
86
|
+
render: () => (
|
|
87
|
+
<output className={styles.alert}>
|
|
88
|
+
<h2>Har du husket å bestille passtime?</h2>
|
|
89
|
+
<p>
|
|
90
|
+
Det er lange køer for å bestille pass om dagen, det kan være lurt å
|
|
91
|
+
bestille i god tid før du skal reise.
|
|
92
|
+
</p>
|
|
93
|
+
</output>
|
|
94
|
+
),
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
export const WithClose: Story = {
|
|
98
|
+
render: () => (
|
|
99
|
+
<output className={styles.alert}>
|
|
100
|
+
<h2>Har du husket å bestille passtime?</h2>
|
|
101
|
+
<p>
|
|
102
|
+
Det er lange køer for å bestille pass om dagen, det kan være lurt å
|
|
103
|
+
bestille i god tid før du skal reise.
|
|
104
|
+
</p>
|
|
105
|
+
<button type="button" aria-label="Lukk"></button>
|
|
106
|
+
</output>
|
|
107
|
+
),
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
export const WithButtons: Story = {
|
|
111
|
+
render: () => (
|
|
112
|
+
<output className={styles.alert}>
|
|
113
|
+
<h2>Har du husket å bestille passtime?</h2>
|
|
114
|
+
<p>
|
|
115
|
+
Det er lange køer for å bestille pass om dagen, det kan være lurt å
|
|
116
|
+
bestille i god tid før du skal reise.
|
|
117
|
+
</p>
|
|
118
|
+
<div className={styles.flex}>
|
|
119
|
+
<a href="#none" className={styles.button} data-variant="secondary">
|
|
120
|
+
Prøv igjen
|
|
121
|
+
</a>
|
|
122
|
+
<a href="#none" className={styles.button}>
|
|
123
|
+
Kontakt oss
|
|
124
|
+
</a>
|
|
125
|
+
</div>
|
|
126
|
+
</output>
|
|
127
|
+
),
|
|
128
|
+
};
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { Meta } from '@storybook/addon-docs/blocks';
|
|
2
|
+
import { ChartBarIcon } from '@phosphor-icons/react';
|
|
3
|
+
import { JumpTo } from '../../.storybook/blocks';
|
|
4
|
+
import { Alert, Button, Popover, Prose, Details, Table } from '../react';
|
|
5
|
+
import { HeartIcon } from '@phosphor-icons/react';
|
|
6
|
+
|
|
7
|
+
<Meta title="Designsystem/Analyse" />
|
|
8
|
+
# <ChartBarIcon /> Analyse
|
|
9
|
+
|
|
10
|
+
> Å forstå bruksmønster er viktig for å kunne forbedre og videreutvikle Mattilsynet tjenester.
|
|
11
|
+
> For å ivareta personvern og sikre at bruksdata kan forstås likt på tvers av tjenester, har vi en felles analysestandard.
|
|
12
|
+
|
|
13
|
+
<JumpTo />
|
|
14
|
+
|
|
15
|
+
{/* https://matomo.org/faq/tag-manager/how-to-use-the-clicked-data-attribute-variable/ */}
|
|
16
|
+
|
|
17
|
+
## Oppsett
|
|
18
|
+
- Bruk funksjonen `analytics` for å logge til [Mattilsynets analyseverktøy](https://mattilsynet.matomo.cloud/)
|
|
19
|
+
- Hver applikasjon trenger en `matomoId` - dette har teamet, eller dere kan [be om å få en](https://mattilsynet-hq.slack.com/archives/C03FAJ7N1EU)
|
|
20
|
+
- Husk å sette `enabled: false` for test-miljøer (`localhost` er *default* av)
|
|
21
|
+
- Husk å sette `consent: 'custom'` dersom du har implementert eget [samtykkebanner](https://www.datatilsynet.no/personvern-pa-ulike-omrader/internett-og-apper/bruk-av-informasjonskapsler-og-andre-sporingsteknologier/)
|
|
22
|
+
- **Køsystem:** Hvis `init` ikke er kjørt, vil alle `analytics`-kall legges i kø og vente på `init`
|
|
23
|
+
- **React?** Husk `"use client"` i filer som bruker `analytics`
|
|
24
|
+
- **Sette opp analyse for første gang?** [Snakk med oss i designsystem](https://mattilsynet-hq.slack.com/archives/C03FAJ7N1EU), så hjelper vi til <HeartIcon style={{ verticalAlign: -3 }} />
|
|
25
|
+
|
|
26
|
+
<Details>
|
|
27
|
+
<Details.Summary>Hva gjør `analytics` som jeg ikke får ved å bruke Matomo direkte?</Details.Summary>
|
|
28
|
+
|
|
29
|
+
Mattilsynet bruker for tiden [Matomo](https://matomo.org/) som analyseverktøy, og `analytics` er en wrapper rundt Matomos [JavaScript API](https://developer.matomo.org/guides/tracking-javascript-guide). Dette gir oss:
|
|
30
|
+
- en felles standard for hvordan vi logger data
|
|
31
|
+
- en felles [melding om informasjonskapsler i henhold til Ekomloven](https://www.datatilsynet.no/personvern-pa-ulike-omrader/internett-og-apper/bruk-av-informasjonskapsler-og-andre-sporingsteknologier/8.-bruk-klare-og-enkle-formuleringer-i-knapper-eller-tilsvarende-losninger/)
|
|
32
|
+
- automatisk [logging av en rekke hendelser](#automatisk-analyse)
|
|
33
|
+
- automatisk [logging av utgående lenker og nedlastingsknapper](https://developer.matomo.org/guides/tracking-javascript-guide#download-and-outlink-tracking)
|
|
34
|
+
- deaktivert [heatmap and session recording](https://developer.matomo.org/guides/heatmap-session-recording/setup) fordi dette krever samtykke ([kan overstyres](#matomo-funksjoner))
|
|
35
|
+
- mulighet for å enkelt bytte ut Matomo eller legge til flere analysetjenester på sikt
|
|
36
|
+
|
|
37
|
+
</Details>
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
import { analytics } from '@mattilsynet/design';
|
|
41
|
+
|
|
42
|
+
analytics('init', {
|
|
43
|
+
matomoId: string | number, // Required (if no matomoTagManagerId): Your site ID
|
|
44
|
+
matomoTagManagerId: string, // Required (if no matomoId): Your container ID
|
|
45
|
+
enabled?: boolean | 'debug', // 'debug' console.logs only, default is true unless localhost
|
|
46
|
+
consent?: 'custom' | true, // Use 'custom' if you have implemented your own cookie consent
|
|
47
|
+
});
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Sidevisninger
|
|
51
|
+
- Send en `pageview` hver gang en side laster
|
|
52
|
+
- **Single Page Application?** Send også `pageview` ved navigering - <Button data-popover="inline" popoverTarget="example-react-router">se eksempel med react router</Button>
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
analytics('pageview', {
|
|
56
|
+
title?: string, // Optional: document.title is default
|
|
57
|
+
url?: string, // Optional: location.href is default
|
|
58
|
+
});
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
<Popover id="example-react-router">
|
|
62
|
+
<Prose>
|
|
63
|
+
**Eksempel med React Router:**
|
|
64
|
+
```TSX
|
|
65
|
+
function MyApp (){
|
|
66
|
+
return (
|
|
67
|
+
<BrowserRouter>
|
|
68
|
+
<TrackPageview />
|
|
69
|
+
{/* YOUR ROUTES HERE */}
|
|
70
|
+
</BrowserRouter>
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function TrackPageview() {
|
|
75
|
+
const location = useLocation();
|
|
76
|
+
useEffect(() => analytics('pageview'), [location]);
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
</Prose>
|
|
81
|
+
</Popover>
|
|
82
|
+
|
|
83
|
+
## Hendelser
|
|
84
|
+
- Send en `event` når du ønsker å lære om brukerens adferd
|
|
85
|
+
- Dette kan være f.eks. ved scroll, filtering, trykk, etc
|
|
86
|
+
- Husk å aldri sende inn personopplysninger
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
analytics('event', {
|
|
90
|
+
category: string, // Required: The category of the event, e.g., 'video', 'link', 'form'
|
|
91
|
+
action: string, // Required: The action performed, e.g., 'play', 'click', 'submit'
|
|
92
|
+
name?: string, // Optional: The name of the item interacted with, e.g., video title, form name
|
|
93
|
+
value?: number, // Optional: A numeric value associated with the event, e.g., product price, video completion percentage
|
|
94
|
+
});
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Automatisk analyse
|
|
98
|
+
- Ved å benytte `analytics`, loggføres `submit`, `click` og `change` hendelser automatisk
|
|
99
|
+
- Bruk `data-analytics="ignore"` på elementer (eller foreldre til elementer) for å deaktivere logging på et element
|
|
100
|
+
- Bruk `data-analytics-category`, `data-analytics-action` og/eller `data-analytics-name` på elementer hvis du ønsker å overstyre standardverdier - <Button data-popover="inline" popoverTarget="example-data-attributes">se eksempler</Button>
|
|
101
|
+
- **Merk:** `data-analytics-category` satt på `form` arves automatisk av alle skjema elementer, så du slipper å sette kategori på hvert enkelt input
|
|
102
|
+
- **Merk:** `submit` vil kun fungere dersom du benytter standard `<form>` element
|
|
103
|
+
|
|
104
|
+
<Popover id="example-data-attributes">
|
|
105
|
+
```HTML
|
|
106
|
+
<!-- Overstyr navn så vi unngår å logge personopplysninger: -->
|
|
107
|
+
<a href="/profil" data-analytics-name="Brukernavn">Navn navnesen</a>
|
|
108
|
+
|
|
109
|
+
<!-- Overstyr kategori for å enklere skille hendelser i loggen: -->
|
|
110
|
+
<input data-analytics-category="Filter" type="range" name="vekt" />
|
|
111
|
+
|
|
112
|
+
<!-- Overstyr kategori og handling: -->
|
|
113
|
+
<button data-analytics-category="Filter" data-analytics-action="reset">Nullstill filter</button>
|
|
114
|
+
|
|
115
|
+
<!-- Ignorer element helt: -->
|
|
116
|
+
<u-details>
|
|
117
|
+
<u-summary data-analytics="ignore">Ignorer dette åpne/lukk-området</u-summary>
|
|
118
|
+
</u-details>
|
|
119
|
+
|
|
120
|
+
<!-- Ignorer område helt: -->
|
|
121
|
+
<div data-analytics="ignore">
|
|
122
|
+
<button type="button">Ignorer alle disse knappene</button>
|
|
123
|
+
<button type="button">Ignorer alle disse knappene</button>
|
|
124
|
+
<button type="button">Ignorer alle disse knappene</button>
|
|
125
|
+
</div>
|
|
126
|
+
```
|
|
127
|
+
</Popover>
|
|
128
|
+
|
|
129
|
+
<Alert data-color="warning">
|
|
130
|
+
**Viktig:** Dersom elementer innholder personopplysninger, for eksempel navn i en knapp, må du sette `data-analytics-name=""` for å unngå personopplysninger i loggene
|
|
131
|
+
</Alert>
|
|
132
|
+
|
|
133
|
+
<Table data-size="sm">
|
|
134
|
+
<thead>
|
|
135
|
+
<tr><th>Category</th><th>Action</th><th>Name</th></tr>
|
|
136
|
+
</thead>
|
|
137
|
+
<tbody>
|
|
138
|
+
<tr><td>`Breadcrumbs`</td><td>`navigate`</td><td>Breadcrumb text</td></tr>
|
|
139
|
+
<tr><td>`Button`</td><td>`click`</td><td>Button text</td></tr>
|
|
140
|
+
<tr><td>`Card`</td><td>`click` | `navigate`</td><td>Card heading or text</td></tr>
|
|
141
|
+
<tr><td>`Chip`</td><td>`click` | `remove`</td><td>Chip text</td></tr>
|
|
142
|
+
<tr><td>`Details`</td><td>`open`</td><td>Summary text</td></tr>
|
|
143
|
+
<tr><td>`Dialog`</td><td>`open`</td><td>Heading text</td></tr>
|
|
144
|
+
<tr><td>`Expand`</td><td>`open`</td><td>Button text</td></tr>
|
|
145
|
+
<tr><td>`Form`</td><td>`change` | `submit`</td><td>Relevant label, legend or heading</td></tr>
|
|
146
|
+
<tr><td>`HelpText`</td><td>`open`</td><td>Aria label text</td></tr>
|
|
147
|
+
<tr><td>`Link`</td><td>`navigate` | `anchor` | `email` | `download`</td><td>Link text</td></tr>
|
|
148
|
+
<tr><td>`Map Marker`</td><td>`open`</td><td>Marker label</td></tr>
|
|
149
|
+
<tr><td>`Pagination`</td><td>`navigate`</td><td>Pagination item text</td></tr>
|
|
150
|
+
<tr><td>`Popover`</td><td>`open`</td><td>Opener button text</td></tr>
|
|
151
|
+
<tr><td>`Sidebar`</td><td>`minimize` | `expand`</td><td>Toggle text</td></tr>
|
|
152
|
+
<tr><td>`Tab`</td><td>`navigate`</td><td>Tab text</td></tr>
|
|
153
|
+
<tr><td>`Table`</td><td>`sort`</td><td>Column heading text</td></tr>
|
|
154
|
+
</tbody>
|
|
155
|
+
</Table>
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
## Søk
|
|
159
|
+
- Send en `search` for å forstå hva brukerne leter etter
|
|
160
|
+
|
|
161
|
+
```
|
|
162
|
+
analytics('search', {
|
|
163
|
+
query: string, // Required: The text user searched for
|
|
164
|
+
category?: string, // Optional: The category the search was performed in
|
|
165
|
+
results?: number, // Optional: The number of results returned
|
|
166
|
+
});
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## Matomo-funksjoner
|
|
170
|
+
- Mattilsynets analysetjeneste [Matomo har flere funksjoner](https://developer.matomo.org/guides/tracking-javascript-guide), men
|
|
171
|
+
disse krever ofte konfigurasjon (som [A/B testing](https://developer.matomo.org/guides/ab-tests/browser)), samtykke (som [heatmap og session recording](https://developer.matomo.org/guides/heatmap-session-recording/setup)) eller kan negativt påvirke ytelse (som [content impressions](https://developer.matomo.org/guides/tracking-javascript-guide#track-all-content-impressions-within-a-page)).
|
|
172
|
+
- Disse funksjonene er derfor kun tilgjengelig bruk av `analytics('matomo', [...args])`, som er identisk med [Matomos javascript API](https://developer.matomo.org/guides/tracking-javascript-guide) `_paq.push([...args])`.
|
|
173
|
+
|
|
174
|
+
**Eksempel for å aktivere heatmap og session recording:**
|
|
175
|
+
|
|
176
|
+
```
|
|
177
|
+
analytics('matomo', ['HeatmapSessionRecording::enable']);
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## Debugging
|
|
181
|
+
- Du kan til en hver tid skru på "debug", for å se hva som blir logget
|
|
182
|
+
- Debug er kun aktivt på den siden du aktiverer det på - det vil automatisk være av igjen dersom du endrer url eller laster siden på nytt
|
|
183
|
+
1. Åpne console i nettleseren (Høyreklikk → Inspiser → Console)
|
|
184
|
+
2. Lim inn `window._mtdsTracking.enabled = 'debug'` i console og trykk enter
|
|
185
|
+
3. Alt `analytics` blir nå synlig i console istedefor å sendes til Matomo
|
package/mtds/ai/app.mdx
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Meta, Canvas } from '@storybook/addon-docs/blocks';
|
|
2
|
+
import { CssVariables } from '../../.storybook/blocks';
|
|
3
|
+
import * as stories from './app.stories';
|
|
4
|
+
import { Button, Popover } from '../react';
|
|
5
|
+
|
|
6
|
+
<Meta of={stories} />
|
|
7
|
+
|
|
8
|
+
# App
|
|
9
|
+
> App er en forhåndsdefinert layoutkomponent som gir et enkelt startpunkt å bygge videre på når du skal tegne eller utvikle en ny applikasjon.
|
|
10
|
+
|
|
11
|
+
## Kode
|
|
12
|
+
- Bruk klassen `app` på typisk `<body>` eller et element inni
|
|
13
|
+
- Legg inn `<header>`, `<dialog role="navigation">` (for sidemeny), `<main>` og evt. `<footer>`
|
|
14
|
+
- Alle elemetene er valgfrie, og kan grupperes i `<div>`-er for [island-architecture](https://www.patterns.dev/vanilla/islands-architecture/)
|
|
15
|
+
- Bruk `data-app-expanded="mobile | desktop"` på elementer ønsker å vise noe kun på en skjermstørrelse (f.eks kun vise sideområde-knapp på mobil)
|
|
16
|
+
- **React?** Bruk `App`, `App.Header`, `App.Sidebar`, `App.Sticky`, `App.Toggle`, `App.Main` og `App.Footer`
|
|
17
|
+
- **Next.js?** Bruk `<App.Script>` i `<head>` for å tegne minimert/ekspanert sidemeny uten <button type="button" data-popover="inline" popoverTarget='fouc'>FOUC</button><Popover id="fouc">Flash of unstyled content</Popover>
|
|
18
|
+
<div className="sbdocs-canvas-thumbnail">
|
|
19
|
+
<Button data-arrow data-variant="primary" target="_blank" href="/iframe.html?globals=&id=designsystem-app--default">Se app i ny fane</Button>
|
|
20
|
+
<Canvas of={stories.Default} />
|
|
21
|
+
</div>
|
|
22
|
+
|
|
23
|
+
## Ekspander og minimer sideområde
|
|
24
|
+
- Legg en `<button>` med klassen `button` og `command="show-modal" commandfor="mtds-sidebar"` før `<dialog role="navigation" id="mtds-sidebar">` for å få automatisk ekspandering/minimering av sideområde
|
|
25
|
+
- Bruk `data-app-expanded="true | false"` på elementer for å vises/skjules basert på ekspandert/minimert sideområde
|
|
26
|
+
- Visning huskes automatisk mellom sidevisninger ved bruk av `localStorage`
|
|
27
|
+
- **React?** Bruk `App.Toggle`
|
|
28
|
+
<div className="sbdocs-canvas-thumbnail">
|
|
29
|
+
<Button data-arrow data-variant="primary" target="_blank" href="/iframe.html?globals=&id=designsystem-app--default">Se ekspandering i ny fane</Button>
|
|
30
|
+
<Canvas of={stories.Default} />
|
|
31
|
+
</div>
|
|
32
|
+
|
|
33
|
+
## Sticky sideområde
|
|
34
|
+
- Legg en `<div>` med klassen `sticky` rundt alt innholdet inni `<dialog role="navigation">`
|
|
35
|
+
- Dette gir deg en avansert implementasjon av sticky, som tar hensyn til scroll-retning
|
|
36
|
+
<div className="sbdocs-canvas-thumbnail">
|
|
37
|
+
<Button data-arrow data-variant="primary" target="_blank" href="/iframe.html?globals=&id=designsystem-app--with-complex-content">Se sticky i ny fane</Button>
|
|
38
|
+
<Canvas of={stories.Default} />
|
|
39
|
+
</div>
|
|
40
|
+
|
|
41
|
+
## Mobil bunnmeny
|
|
42
|
+
- Bruk `data-variant="mobilebar"` på `.app` for å få en mobil bunnmeny
|
|
43
|
+
- Burde kun benyttes om du har 5 menypunkter eller færre
|
|
44
|
+
- Titler, skillelinjer og elementer med `data-app-expanded="false"` skjules
|
|
45
|
+
<div className="sbdocs-canvas-thumbnail">
|
|
46
|
+
<Button data-arrow data-variant="primary" href="/iframe.html?globals=&id=designsystem-app--with-mobile-bar">Se mobilebar i egen visning</Button>
|
|
47
|
+
<Canvas of={stories.WithMobileBar} />
|
|
48
|
+
</div>
|
|
49
|
+
|
|
50
|
+
## Programatisk ekspander/minimer
|
|
51
|
+
- Bruk `import { toggleAppExpand } from '@mattilsynet/design';`
|
|
52
|
+
- `toggleAppExpand()` veksler mellom ekspandert og minimert
|
|
53
|
+
- `toggleAppExpand(true)` tvinger ekspandert
|
|
54
|
+
- `toggleAppExpand(false)` tvinger minimert
|
|
55
|
+
<div className="sbdocs-canvas-thumbnail">
|
|
56
|
+
<Button data-arrow data-variant="primary" target="_blank" href="/iframe.html?globals=&id=designsystem-app--with-complex-content">Se programatisk ekspander/minimer</Button>
|
|
57
|
+
<Canvas of={stories.WithCustomToggle} />
|
|
58
|
+
</div>
|
|
59
|
+
|
|
60
|
+
<CssVariables component="app" />
|