@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,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 &rarr; Inspiser &rarr; 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
@@ -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" />