@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,469 @@
1
+ import {
2
+ CalendarDotsIcon,
3
+ ClockIcon,
4
+ DownloadSimpleIcon,
5
+ HourglassHighIcon,
6
+ ListChecksIcon,
7
+ MapPinIcon,
8
+ PaperPlaneRightIcon,
9
+ SmileyMehIcon,
10
+ UploadSimpleIcon,
11
+ } from "@phosphor-icons/react";
12
+ import type { Meta, StoryObj } from "@storybook/react-vite";
13
+ import {
14
+ Card,
15
+ Flex,
16
+ Grid,
17
+ Group,
18
+ Heading,
19
+ Info,
20
+ Input,
21
+ Prose,
22
+ Tag,
23
+ } from "../react";
24
+ import styles from "../styles.module.css";
25
+
26
+ const meta = {
27
+ title: "Designsystem/Card og Group",
28
+ id: "designsystem-card",
29
+ parameters: {
30
+ layout: "fullscreen",
31
+ },
32
+ decorators: [
33
+ (Story) => (
34
+ <div
35
+ className={`${styles.body} ${styles.grid}`}
36
+ style={{ padding: "2em" }}
37
+ >
38
+ <style>
39
+ {
40
+ "html:not(:has(.sbdocs-content)) { background: var(--ds-color-background-default) }"
41
+ }
42
+ </style>
43
+ <Story />
44
+ </div>
45
+ ),
46
+ ],
47
+ } satisfies Meta;
48
+
49
+ export default meta;
50
+ type Story = StoryObj<typeof meta>;
51
+
52
+ const radius = ["sm", "md", "lg", "xl"] as const;
53
+ const paddings = [
54
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 18, 22, 26, 30,
55
+ ];
56
+
57
+ export const Default: Story = {
58
+ render: () => <div className={styles.card}>Card</div>,
59
+ };
60
+
61
+ export const React: Story = {
62
+ render: () => (
63
+ <>
64
+ <Card>Card</Card>
65
+ <Card href="#">Lenke</Card>
66
+ <Card as="button" onClick={() => alert("Click!")}>
67
+ Knapp
68
+ </Card>
69
+ <Group>
70
+ <Grid data-gap="1">
71
+ <Card>Card in group</Card>
72
+ <Card>Card in group</Card>
73
+ <Card>Card in group</Card>
74
+ </Grid>
75
+ </Group>
76
+ </>
77
+ ),
78
+ };
79
+
80
+ export const Padding: Story = {
81
+ render: () => (
82
+ <Grid>
83
+ <strong>Padding:</strong>
84
+ {paddings.map((pad) => (
85
+ <div key={pad} className={styles.card} data-pad={pad}>
86
+ data-pad="{pad}"
87
+ </div>
88
+ ))}
89
+ <strong>Fluid padding (try resizing screen):</strong>
90
+ {paddings.map((pad) => (
91
+ <div key={pad} className={styles.card} data-pad={`2-${pad}`}>
92
+ data-pad="2-{pad}"
93
+ </div>
94
+ ))}
95
+ </Grid>
96
+ ),
97
+ };
98
+
99
+ export const Radius: Story = {
100
+ render: () => (
101
+ <>
102
+ {radius.map((value) => (
103
+ <div key={value} className={styles.card} data-radius={value}>
104
+ data-radius="{value}"
105
+ </div>
106
+ ))}
107
+ </>
108
+ ),
109
+ };
110
+
111
+ export const Interactive: Story = {
112
+ render: () => (
113
+ <>
114
+ <a href="#anchor" className={styles.card}>
115
+ As link
116
+ </a>
117
+ <button type="button" className={styles.card}>
118
+ As button
119
+ </button>
120
+ <div data-clickdelegatefor="my-link" className={styles.card}>
121
+ <div className={styles.prose}>
122
+ <a id="my-link" href="#anchor">
123
+ With data-clickdelegatefor targeting link
124
+ </a>
125
+ <button type="button" className={styles.button}>
126
+ Inner button with other function
127
+ </button>
128
+ </div>
129
+ </div>
130
+ </>
131
+ ),
132
+ };
133
+
134
+ export const Responsive: Story = {
135
+ render: () => (
136
+ <>
137
+ Grupperte eksempler:
138
+ <a href="#anchor" className={styles.card}>
139
+ <div className={styles.flex}>
140
+ <h2 data-size="md" data-self="250" data-fixed>
141
+ 123456789
142
+ </h2>
143
+ <div className={styles.flex} data-self="500" data-items="100">
144
+ <div className={styles.grid} data-items="100">
145
+ <div className={styles.info}>
146
+ <CalendarDotsIcon />
147
+ <span>06.12.2024</span>
148
+ </div>
149
+ <div className={styles.info}>
150
+ <ClockIcon />
151
+ 19:37
152
+ </div>
153
+ </div>
154
+ <div className={styles.grid} data-items="100">
155
+ <div className={styles.info}>
156
+ <UploadSimpleIcon />
157
+ Groene Tuin
158
+ </div>
159
+ <div className={styles.info}>
160
+ <i>🇫🇷</i>
161
+ Frankrike
162
+ </div>
163
+ </div>
164
+ <div className={styles.grid} data-self="500" data-items="250">
165
+ <div className={styles.info}>
166
+ <DownloadSimpleIcon />
167
+ Blomquist Blomster AS
168
+ </div>
169
+ <div className={styles.info}>
170
+ <ListChecksIcon />
171
+ Daucus carota, Hydrangea paniculata, +4
172
+ </div>
173
+ </div>
174
+ </div>
175
+ </div>
176
+ </a>
177
+ <Card>
178
+ <Flex data-align="start">
179
+ <Info data-self="250" data-fixed>
180
+ <small>Opprettet 01.01.1970</small>
181
+ <Heading data-size="2xs">KY.KELLI.815.493.00</Heading>
182
+ </Info>
183
+ <Flex data-self="500">
184
+ <Flex data-self="500" data-align="start">
185
+ <Grid data-self="200">
186
+ <Info>
187
+ <PaperPlaneRightIcon />
188
+ Firmanavn AS
189
+ </Info>
190
+ <Info>
191
+ <i>🇳🇱</i> Nederland
192
+ </Info>
193
+ </Grid>
194
+ <Info data-self="300">
195
+ <DownloadSimpleIcon />
196
+ Bomsterlandet importerer bomster AS, Rogaland
197
+ </Info>
198
+ </Flex>
199
+ <Tag data-fixed data-color="info" data-icon="none">
200
+ Skal på tilsyn
201
+ </Tag>
202
+ </Flex>
203
+ </Flex>
204
+ </Card>
205
+ <div className={styles.card}>
206
+ <div className={styles.flex} data-align="center">
207
+ <h2 data-size="md" data-self="250" data-fixed>
208
+ Bambus
209
+ </h2>
210
+ <div
211
+ className={styles.flex}
212
+ data-self="500"
213
+ data-items="150"
214
+ data-align="center"
215
+ >
216
+ <div className={styles.grid} data-items="150">
217
+ <div className={styles.info}>
218
+ <MapPinIcon />
219
+ Grunerlokka, Oslo
220
+ </div>
221
+ <div className={styles.info}>
222
+ <ClockIcon />
223
+ 12.00 - 22.00
224
+ </div>
225
+ </div>
226
+ <div className={styles.grid} data-items="150">
227
+ <div className={styles.info}>
228
+ <SmileyMehIcon />
229
+ 06.01.2024
230
+ </div>
231
+ <div className={styles.info}>
232
+ <HourglassHighIcon />
233
+ 107.02.2020
234
+ </div>
235
+ </div>
236
+ <button
237
+ type="button"
238
+ className={styles.button}
239
+ data-variant="secondary"
240
+ data-nowrap
241
+ data-fixed
242
+ data-arrow
243
+ >
244
+ Planlegg tur
245
+ </button>
246
+ </div>
247
+ </div>
248
+ </div>
249
+ <div className={styles.card}>
250
+ <div className={styles.flex} data-align="center">
251
+ <h2 data-size="md" data-self="250" data-fixed>
252
+ Burgern
253
+ </h2>
254
+ <div
255
+ className={styles.flex}
256
+ data-self="500"
257
+ data-items="150"
258
+ data-align="center"
259
+ >
260
+ <div className={styles.grid} data-items="150">
261
+ <div className={styles.info}>
262
+ <MapPinIcon />
263
+ Sentrum, Oslo
264
+ </div>
265
+ <div className={styles.info}>
266
+ <ClockIcon />
267
+ 14.00 - 22.00{" "}
268
+ <span
269
+ className={styles.tag}
270
+ data-size="sm"
271
+ data-color="info"
272
+ data-icon="none"
273
+ >
274
+ Kveld
275
+ </span>
276
+ </div>
277
+ </div>
278
+ <div className={styles.grid} data-items="150">
279
+ <div className={styles.info}>
280
+ <SmileyMehIcon />
281
+ 14.06.2022
282
+ </div>
283
+ <div className={styles.info}>
284
+ <HourglassHighIcon />
285
+ 13.02.2023
286
+ </div>
287
+ </div>
288
+ <button
289
+ type="button"
290
+ className={styles.button}
291
+ data-variant="secondary"
292
+ data-nowrap
293
+ data-fixed
294
+ data-arrow
295
+ >
296
+ Planlegg tur
297
+ </button>
298
+ </div>
299
+ </div>
300
+ </div>
301
+ <div className={styles.card}>
302
+ <div className={styles.flex} data-align="center">
303
+ <h2 data-size="md" data-self="250" data-fixed>
304
+ Den lekke tomat
305
+ </h2>
306
+ <div
307
+ className={styles.flex}
308
+ data-self="500"
309
+ data-items="150"
310
+ data-align="center"
311
+ >
312
+ <div className={styles.grid} data-items="150">
313
+ <div className={styles.info}>
314
+ <MapPinIcon />
315
+ Sagene, Oslo
316
+ </div>
317
+ <div className={styles.info}>
318
+ <ClockIcon />
319
+ 11.00 - 22.00
320
+ </div>
321
+ </div>
322
+ <div className={styles.grid} data-items="150">
323
+ <div className={styles.info}>
324
+ <SmileyMehIcon />
325
+ 08.01.2024
326
+ </div>
327
+ <div className={styles.info}>
328
+ <HourglassHighIcon />
329
+ 23.03.2025
330
+ </div>
331
+ </div>
332
+ <button
333
+ type="button"
334
+ className={styles.button}
335
+ data-variant="secondary"
336
+ data-nowrap
337
+ data-fixed
338
+ data-arrow
339
+ >
340
+ Planlegg tur
341
+ </button>
342
+ </div>
343
+ </div>
344
+ </div>
345
+ Ikke gruppert eksempel:
346
+ <div className={styles.card}>
347
+ <div className={styles.flex} data-items="150">
348
+ <h2 data-size="md">Ananasen</h2>
349
+ <div className={styles.info}>
350
+ <MapPinIcon />
351
+ Loren, Oslo
352
+ </div>
353
+ <div className={styles.info}>
354
+ <ClockIcon />
355
+ 13.00 - 22.00
356
+ </div>
357
+ <div className={styles.info}>
358
+ <SmileyMehIcon />
359
+ 06.01.2023
360
+ </div>
361
+ <div className={styles.info}>
362
+ <HourglassHighIcon />
363
+ 07.04.2025
364
+ </div>
365
+ <button
366
+ type="button"
367
+ className={styles.button}
368
+ data-variant="secondary"
369
+ data-arrow
370
+ >
371
+ Planlegg tur
372
+ </button>
373
+ </div>
374
+ </div>
375
+ </>
376
+ ),
377
+ };
378
+
379
+ // export const Expandable: Story = {
380
+ // render: () => (
381
+ // <u-details className={styles.card}>
382
+ // <u-summary className={styles.flex} data-align="center">
383
+ // <h2 data-size="md" data-self="250" data-fixed>
384
+ // 123456789
385
+ // </h2>
386
+ // <span className={styles.flex} data-self="500" data-items="100">
387
+ // <span className={styles.grid} data-items="100">
388
+ // <div className={styles.info}>
389
+ // <CalendarDotsIcon />
390
+ // 06.12.2024
391
+ // </span>
392
+ // <div className={styles.info}>
393
+ // <ClockIcon />
394
+ // 19:37
395
+ // </span>
396
+ // </span>
397
+ // <span className={styles.grid} data-items="100">
398
+ // <div className={styles.info}>
399
+ // <UploadSimpleIcon />
400
+ // Groene Tuin
401
+ // </span>
402
+ // <div className={styles.info}>
403
+ // <i>🇫🇷</i>
404
+ // Frankrike
405
+ // </span>
406
+ // </span>
407
+ // <span className={styles.grid} data-self="500" data-items="250">
408
+ // <div className={styles.info}>
409
+ // <DownloadSimpleIcon />
410
+ // Blomquist Blomster AS
411
+ // </span>
412
+ // <div className={styles.info}>
413
+ // <ListChecksIcon />
414
+ // Daucus carota, Hydrangea paniculata, +4
415
+ // </span>
416
+ // </span>
417
+ // </span>
418
+ // </u-summary>
419
+ // <div>Hei</div>
420
+ // </u-details>
421
+ // ),
422
+ // };
423
+
424
+ export const GroupStory: Story = {
425
+ name: "Group",
426
+ parameters: { showInOverview: true },
427
+ render: () => (
428
+ <div className={styles.group}>
429
+ <div className={styles.grid} data-gap="1">
430
+ <div className={styles.card}>Card</div>
431
+ <div className={styles.card}>Card</div>
432
+ <div className={styles.card}>Card</div>
433
+ </div>
434
+ </div>
435
+ ),
436
+ };
437
+
438
+ export const WithInput: Story = {
439
+ render: () => (
440
+ <Grid data-items="400" data-fixed>
441
+ <Card as="label">
442
+ <Prose>
443
+ <Heading>
444
+ <Input type="radio" name="radio-card" />
445
+ Velg dette kortet
446
+ </Heading>
447
+ <p>
448
+ Quisque vitae nibh quis dui lobortis consectetur. Vivamus sed nisl
449
+ quis enim venenatis hendrerit eu vitae mauris. Praesent at commodo
450
+ libero.
451
+ </p>
452
+ </Prose>
453
+ </Card>
454
+ <Card as="label">
455
+ <Prose>
456
+ <Heading>
457
+ <Input type="radio" name="radio-card" />
458
+ Velg dette kortet
459
+ </Heading>
460
+ <p>
461
+ Quisque vitae nibh quis dui lobortis consectetur. Vivamus sed nisl
462
+ quis enim venenatis hendrerit eu vitae mauris. Praesent at commodo
463
+ libero.
464
+ </p>
465
+ </Prose>
466
+ </Card>
467
+ </Grid>
468
+ ),
469
+ };
@@ -0,0 +1,67 @@
1
+ import { Meta, Canvas } from '@storybook/addon-docs/blocks';
2
+ import { CssVariables, JumpTo } from '../../.storybook/blocks';
3
+ import { Button, Grid } from '../react';
4
+ import * as stories from './chart.stories';
5
+
6
+ <Meta of={stories} />
7
+
8
+ # Chart
9
+
10
+ <JumpTo />
11
+
12
+ <Button style={{ marginBlock: '0 -1em' }} href="?path=/docs/identitet-infografikk--docs" data-variant="secondary" data-arrow>Se også Infografikk-generator</Button>
13
+
14
+ ## Kode
15
+ - Bruk elementet `<mtds-chart>`
16
+ - Bruk `data-variant="column | column-stacked | bar | bar-stacked | line | area | doughnut"`
17
+ - Sett inn en tabell som inneholder:
18
+ - Første rad med grupperings-ledetekster
19
+ - Andre rad og utover med dataserier, hvor første kolonne er dataserie-tittel
20
+ - **Merk:** Bruk av `thead`, `tbody` eller `th` er valgfritt - radene parses uansett
21
+ - **React?** Du kan alternativt sende inn data som en array via `data`-prop
22
+ <Canvas of={stories.Default} />
23
+
24
+ ## Stående stolpediagram
25
+ - Bruk `data-variant="column"` for stående søylediagram
26
+ - Bruk `data-variant="column-stacked"` for stablet gruppering
27
+ <Grid data-items="300"><Canvas sourceState='none' of={stories.Column} /><Canvas sourceState='none' of={stories.ColumnStacked} /></Grid>
28
+
29
+ ## Liggende stolpediagram
30
+ - Bruk `data-variant="bar"` for liggende søylediagram
31
+ - Bruk `data-variant="bar-stacked"` for stablet gruppering
32
+ <Grid data-items="300"><Canvas sourceState='none' of={stories.Bar} /><Canvas sourceState='none' of={stories.BarStacked} /></Grid>
33
+
34
+ ## Linjediagram
35
+ - Bruk `data-variant="line"` for linjediagram eller `data-variant="area"` for fylt linjediagram
36
+ <Grid data-items="300"><Canvas sourceState='none' of={stories.Line} /><Canvas sourceState='none' of={stories.Area} /></Grid>
37
+
38
+ ## Kakediagram
39
+ - Bruk `data-variant="pie"` eller `data-variant="doughnut"` for Kakediagram
40
+ <Grid data-items="300"><Canvas sourceState='none' of={stories.Pie} /><Canvas sourceState='none' of={stories.Doughnut} /></Grid>
41
+
42
+ ## Skjule elementer
43
+ - Bruk `data-legend="false"` for å skjule legend
44
+ - Bruk `data-dots="false"` for å skjule dotter i `data-variant="line | area"`
45
+ - Bruk `data-steps="false"` for å skjule steg-tekster
46
+ - Bruk `data-labels="false"` for å skjule grupperings-lekster
47
+ <Grid data-items="300"><Canvas sourceState='none' of={stories.WithLegendDisabled} /><Canvas sourceState='none' of={stories.WithDotsDisabled} /></Grid>
48
+
49
+ <CssVariables component='chart' />
50
+
51
+ Du kan med andre ord styre hvilket dataset som har hvilken farge, ved å f.eks gjøre:
52
+
53
+ ```css
54
+ /* Forskjellig farge for hver gruppe */
55
+ .my-chart {
56
+ --mtdsc-chart-color-1: var(--mtds-color-charts-chart-c);
57
+ --mtdsc-chart-color-2: var(--mtds-color-charts-chart-b);
58
+ --mtdsc-chart-color-3: var(--mtds-color-charts-chart-a);
59
+ }
60
+
61
+ /* Forskjellig farge for hver verdi i samme gruppe: */
62
+ .my-chart {
63
+ --mtdsc-chart-color-1-1: var(--mtds-color-charts-chart-c);
64
+ --mtdsc-chart-color-1-2: var(--mtds-color-charts-chart-b);
65
+ --mtdsc-chart-color-1-3: var(--mtds-color-charts-chart-a);
66
+ }
67
+ ```