@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.
Files changed (98) 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/app/app-observer.js +1 -1
  80. package/mtds/app/app-toggle.js +10 -26
  81. package/mtds/app/app-toggle.js.map +1 -1
  82. package/mtds/app/app-toggle2.js +26 -10
  83. package/mtds/app/app-toggle2.js.map +1 -1
  84. package/mtds/app/app.js +1 -1
  85. package/mtds/atlas/atlas-element.js +1 -1
  86. package/mtds/chart/chart-lines.js +19 -19
  87. package/mtds/chart/chart-lines.js.map +1 -1
  88. package/mtds/chart/chart.css.js +16 -1
  89. package/mtds/chart/chart.css.js.map +1 -1
  90. package/mtds/chart/chart.stories.d.ts +1 -0
  91. package/mtds/index.iife.js +32 -17
  92. package/mtds/index.js +21 -20
  93. package/mtds/index.js.map +1 -1
  94. package/mtds/package.json.js +1 -1
  95. package/mtds/styles.css +1 -1
  96. package/mtds/table/table-observer.js +26 -15
  97. package/mtds/table/table-observer.js.map +1 -1
  98. package/package.json +4 -2
@@ -0,0 +1,168 @@
1
+ import type { Meta, StoryObj } from "@storybook/react-vite";
2
+ import { useEffect, useMemo, useRef, useState } from "react";
3
+ import {
4
+ fixLawHtml,
5
+ getLawChecked,
6
+ parseLawIds,
7
+ setLawChecked,
8
+ toggleLawChecked,
9
+ } from "../";
10
+ import { Flex, Law } from "../react";
11
+ import styles from "../styles.module.css";
12
+ import { vinforskriften } from "./vinforskriften-new";
13
+
14
+ // TODO: Søkefunksjon
15
+ // TODO: Kommentar/tilbakemeldingsfunksjon
16
+ // TODO: Må finnes kommentarfelt med fritekst i alle systemer uansett, for å kunne utbrodere
17
+ // ? defaultP eksempel Artikkel 9, Nr. 1, Avsnitt 2, https://lovdata.no/dokument/SF/forskrift/2013-01-13-60/ARTIKKEL_9#ARTIKKEL_9
18
+
19
+ const meta = {
20
+ title: "Designsystem/Law",
21
+ parameters: {
22
+ layout: "padded",
23
+ showInOverview: false,
24
+ },
25
+ decorators: [
26
+ (Story) => {
27
+ return (
28
+ <Flex
29
+ data-center="2xl"
30
+ data-gap="8"
31
+ data-items="300"
32
+ data-nowrap
33
+ id="flex"
34
+ >
35
+ <style>{`#flex:has([data-variant="view"]) pre strong { display: none }`}</style>
36
+ <Story />
37
+ <pre data-self="300" data-fixed style={SIDEBAR_STYLE}>
38
+ <strong>Valgte:</strong>
39
+ <div id="log"></div>
40
+ </pre>
41
+ </Flex>
42
+ );
43
+ },
44
+ ],
45
+ } satisfies Meta;
46
+
47
+ const console = {
48
+ log: (laws: ReturnType<typeof parseLawIds>) => {
49
+ const log = document.getElementById("log") as HTMLElement;
50
+ log.textContent = laws.map(({ label }) => `\n- ${label}`).join("");
51
+ window.console.log(laws);
52
+ },
53
+ };
54
+
55
+ export default meta;
56
+ type Story = StoryObj<typeof meta>;
57
+
58
+ const SIDEBAR_STYLE: React.CSSProperties = {
59
+ maxHeight: "calc(100vh - 32px)",
60
+ overflow: "auto",
61
+ fontFamily: "monospace",
62
+ whiteSpace: "pre-wrap",
63
+ position: "sticky",
64
+ fontSize: 14,
65
+ top: 16,
66
+ };
67
+
68
+ export const Default: Story = {
69
+ parameters: {
70
+ showInOverview: false,
71
+ },
72
+ render: () => {
73
+ const lawElement = useRef<HTMLDivElement>(null);
74
+
75
+ // Avoid re-processing on every render:
76
+ const html = useMemo(() => ({ __html: fixLawHtml(vinforskriften) }), []);
77
+
78
+ // Sync checked state to Law component:
79
+ useEffect(() => {
80
+ const self = lawElement.current;
81
+ const onClick = ({ target }: Event) => {
82
+ if (target instanceof HTMLButtonElement) {
83
+ toggleLawChecked(target, self);
84
+ const checked = getLawChecked(self);
85
+ console.log(parseLawIds(checked, html.__html));
86
+ }
87
+ };
88
+
89
+ self?.addEventListener("click", onClick);
90
+ return () => self?.removeEventListener("click", onClick);
91
+ }, [html]);
92
+
93
+ // Render:
94
+ return (
95
+ <div
96
+ className={styles.law}
97
+ dangerouslySetInnerHTML={html}
98
+ ref={lawElement}
99
+ />
100
+ );
101
+ },
102
+ };
103
+
104
+ export const React: Story = {
105
+ render: () => {
106
+ const [checkedIds, setCheckedIds] = useState<string[]>([]);
107
+ const lawElement = useRef<HTMLDivElement>(null);
108
+
109
+ // Avoid re-processing on every render:
110
+ const html = useMemo(() => ({ __html: fixLawHtml(vinforskriften) }), []);
111
+
112
+ // Sync checked state to Law component:
113
+ useEffect(() => {
114
+ setLawChecked(checkedIds, lawElement.current);
115
+ }, [checkedIds]);
116
+
117
+ // Render:
118
+ return (
119
+ <Law
120
+ dangerouslySetInnerHTML={html}
121
+ ref={lawElement}
122
+ onClick={(event) => {
123
+ if (event.target instanceof HTMLButtonElement) {
124
+ const id = event.target.value;
125
+ const checked = checkedIds.includes(id)
126
+ ? checkedIds.filter((cid) => cid !== id)
127
+ : [...checkedIds, id];
128
+
129
+ setCheckedIds(checked);
130
+ console.log(parseLawIds(checked, html.__html));
131
+ }
132
+ }}
133
+ />
134
+ );
135
+ },
136
+ };
137
+
138
+ export const VariantView: Story = {
139
+ render: () => {
140
+ // Avoid re-processing on every render:
141
+ const html = useMemo(() => ({ __html: fixLawHtml(vinforskriften) }), []);
142
+
143
+ // Render:
144
+ return (
145
+ <div
146
+ data-variant="view"
147
+ className={styles.law}
148
+ dangerouslySetInnerHTML={html}
149
+ />
150
+ );
151
+ },
152
+ };
153
+
154
+ export const VariantReadOnly: Story = {
155
+ render: () => {
156
+ // Avoid re-processing on every render:
157
+ const html = useMemo(() => ({ __html: fixLawHtml(vinforskriften) }), []);
158
+
159
+ // Render:
160
+ return (
161
+ <div
162
+ data-variant="readonly"
163
+ className={styles.law}
164
+ dangerouslySetInnerHTML={html}
165
+ />
166
+ );
167
+ },
168
+ };
@@ -0,0 +1,145 @@
1
+ import { Meta, Canvas } from '@storybook/addon-docs/blocks';
2
+ import { CssVariables, JumpTo } from '../../.storybook/blocks';
3
+ import { Alert, Button, Details, Popover, Table } from '../react.tsx';
4
+ import * as stories from './layout.stories';
5
+
6
+ <Meta of={stories} />
7
+
8
+ # Layout
9
+ > Layoutkomponenten organiserer og strukturerer innhold. Du kan bruke Flex, Grid, eller Prose for å sikre riktig flyt og oppsett.
10
+
11
+ <JumpTo />
12
+
13
+ ## Typer layout
14
+ - Bruk `flex` når du trenger forskjellige bredder på barna
15
+ - Bruk `grid` når du trenger samme bredde på alle barna, eller alle elementer skal ligge under hverandre
16
+ - Bruk [`prose`](?path=/story/designsystem-typography--prose) når du har tekstlig innhold som skal ha god typografisk rytme
17
+ - Husk at du kan nøste `flex` og `grid` sammen for å få det beste fra begge verdener
18
+
19
+ <Details>
20
+ <Details.Summary>Hvorfor ikke bare bruke Tailwind eller vanilla CSS?</Details.Summary>
21
+
22
+ Det er fullt mulig å bruke Tailwind eller CSS. Det vi får med `flex` og `grid` er konsistent kode og luftbruk,
23
+ samt noen superpowers for responsivitet via vår egen `data-items` attributt.
24
+ </Details>
25
+
26
+ ## Attributter
27
+ <Table data-fixed data-size="sm">
28
+ <thead style={{ position: 'sticky', top: 0, backgroundColor: 'var(--mtds-color-surface-default)' }}>
29
+ <tr>
30
+ <th>Attributt</th>
31
+ <th>Beskrivelse</th>
32
+ <th>Type</th>
33
+ <th>Standardverdi</th>
34
+ </tr>
35
+ </thead>
36
+ <tbody>
37
+ <tr>
38
+ <td>`data-items`</td>
39
+ <td>Minimumsbredde på barna. Sikrer at barn brekker til nye linjer for å ungå at de blir for smale.</td>
40
+ <td>`25`, `50`, `75`, `100`, `125`, `150`, `175`, `200`, `225`, `250`, `275`, `300`, `325`, `350`, `375`, `400`, `425`, `450`, `475`, `500`, `525`, `550`, `575`, `600`, `auto`, `full`</td>
41
+ <td></td>
42
+ </tr>
43
+ <tr>
44
+ <td>`data-self`</td>
45
+ <td>Kan *kun* brukes på barn av `Flex` for å sette minimumsbredde på enkeltbarn.</td>
46
+ <td>`25`, `50`, `75`, `100`, `125`, `150`, `175`, `200`, `225`, `250`, `275`, `300`, `325`, `350`, `375`, `400`, `425`, `450`, `475`, `500`, `525`, `550`, `575`, `600`, `auto`, `full`</td>
47
+ <td></td>
48
+ </tr>
49
+ <tr>
50
+ <td>`data-nowrap`</td>
51
+ <td>Hindrer barna i å flyte over flere linjer. Kan settes direkte på barn i `Flex`.</td>
52
+ <td>[Boolsk attributt](https://developer.mozilla.org/en-US/docs/Glossary/Boolean/HTML)</td>
53
+ <td></td>
54
+ </tr>
55
+ <tr>
56
+ <td>`data-fixed`</td>
57
+ <td>Hindrer barna i å vokse i bredden. Kan settes direkte på barn i `Flex`.</td>
58
+ <td>[Boolsk attributt](https://developer.mozilla.org/en-US/docs/Glossary/Boolean/HTML)</td>
59
+ <td></td>
60
+ </tr>
61
+ <tr>
62
+ <td>`data-gap`, `data-row-gap`, `data-colum-gap`</td>
63
+ <td>Avstand mellom barna. Bruker size tokens `--mtds-*`. Alias for [gap](https://developer.mozilla.org/en-US/docs/Web/CSS/gap)</td>
64
+ <td>`0`, `1`, `2`, `3`, `4`, `5`, `6`, `7`, `8`, `9`, `10`, `11`, `12`, `13`, `14`, `15`, `18`, `22`, `26`, `30`</td>
65
+ <td>`3`</td>
66
+ </tr>
67
+ <tr>
68
+ <td>`data-center`</td>
69
+ <td>Maksbredde og midtstilling komponenten.</td>
70
+ <td>`none`,<br />`sm` (max `640px`),<br />`md` (max `768px`),<br />`lg` (max `1024px`),<br />`xl` (max `1280px`),<br />`2xl` (max `1536px`)</td>
71
+ <td>`none`</td>
72
+ </tr>
73
+ <tr>
74
+ <td>`data-align`</td>
75
+ <td>Vertikal justering av barna. Alias for [align-items](https://developer.mozilla.org/en-US/docs/Web/CSS/align-items).</td>
76
+ <td>`normal`, `start`, `center`, `end`, `baseline`, `stretch`</td>
77
+ <td>`normal`</td>
78
+ </tr>
79
+ <tr>
80
+ <td>`data-align-content`</td>
81
+ <td>Vertikal justering av *alle* barna. Alias for [align-content](https://developer.mozilla.org/en-US/docs/Web/CSS/align-content).</td>
82
+ <td>`normal`, `start`, `center`, `end`, `baseline`, `stretch`, `space-around`, `space-between`, `space-evenly`</td>
83
+ <td>`normal`</td>
84
+ </tr>
85
+ <tr>
86
+ <td>`data-justify`</td>
87
+ <td>Horisontal justering av *alle* barna.<br />Hvis `flex`: Alias for [justify-content](https://developer.mozilla.org/en-US/docs/Web/CSS/justify-content)<br />Hvis `grid`: alias for [justify-items](https://developer.mozilla.org/en-US/docs/Web/CSS/justify-items)</td>
88
+ <td>`normal`, `start`, `center`, `end`, `baseline`, `stretch`, `space-around`, `space-between`, `space-evenly`</td>
89
+ <td>`normal`</td>
90
+ </tr>
91
+ <tr>
92
+ <td>`data-align-self`</td>
93
+ <td>Kan settes på barn av både `grid` og `flex`. Alias for [align-self](https://developer.mozilla.org/en-US/docs/Web/CSS/align-self)</td>
94
+ <td>`normal`, `start`, `center`, `end`, `stretch`</td>
95
+ <td>`normal`</td>
96
+ </tr>
97
+ <tr>
98
+ <td>`data-justify-self`</td>
99
+ <td>Kan settes på barn av både `grid` og `flex`. Alias for [justify-self](https://developer.mozilla.org/en-US/docs/Web/CSS/justify-self)</td>
100
+ <td>`normal`, `start`, `center`, `end`, `stretch`</td>
101
+ <td>`normal`</td>
102
+ </tr>
103
+ </tbody>
104
+ </Table>
105
+
106
+
107
+ ## Flex
108
+ - Bruk `flex` når du trenger forskjellige bredder på barna
109
+ - Bruk heller `prose` eller `grid` når du skal ha <button type="button" data-popover="inline" popoverTarget="grid-stack">under hverandre</button>
110
+
111
+ <Popover id="grid-stack">...siden `flex-direction: column` kan ha uønskede<br />bieffekter på f.eks. `align-items`, `justify-content`</Popover>
112
+ <Canvas of={stories.FlexStory} />
113
+
114
+ ## Grid
115
+ - Bruk `grid` når du trenger samme bredder på alle elementer
116
+ - Bruk `grid` *uten* `data-items` for å sette elementer under hverandre
117
+ <Canvas of={stories.GridStory} />
118
+
119
+ ## Gap
120
+ - Bruk `data-gap="0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|18|22|26|30"` (`3` er default)
121
+ - Bruk `data-row-gap` eller `data-column-gap` for å individuellt gap i hver retning
122
+ <Canvas of={stories.Gap} />
123
+
124
+ ## Center
125
+ - Bruk `data-center="sm | md | lg | xl | 2xl"` for å sentrere innholdet
126
+ - Elementet vil allid ha minimum `5vw` luft på venste og høyre side
127
+ - Vi bruker hovedsakelig `2xl` som hoved container for innhold
128
+ <div className="sbdocs-canvas-thumbnail">
129
+ <Button data-arrow data-variant="primary" href="?path=/story/designsystem-layout--center">Se center i egen visning</Button>
130
+ <Canvas className="sbdocs-canvas--max-height" of={stories.Center} />
131
+ </div>
132
+
133
+ ## Align
134
+ - `data-align="normal | start | center | end | stretch"` (`normal` er default) setter vertikal plassering med [align-items](https://developer.mozilla.org/en-US/docs/Web/CSS/align-items)
135
+ <Canvas of={stories.Align} />
136
+
137
+ ## Justify
138
+ - `data-justify="start | center | end | space-between | space-around | space-evenly"` setter horisontal plassering med [justify-content](https://developer.mozilla.org/en-US/docs/Web/CSS/justify-content)
139
+ <Canvas of={stories.Justify} />
140
+
141
+ ## AlignContent
142
+ - `data-align-content="start | center | end | space-between | space-around | space-evenly"` setter vertikal plassering over flere rader med [align-content](https://developer.mozilla.org/en-US/docs/Web/CSS/align-content)
143
+ <Canvas of={stories.AlignContent} />
144
+
145
+ <CssVariables component="layout" />