@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,568 @@
1
+ import { FilePlusIcon, HandshakeIcon, HeartIcon } from "@phosphor-icons/react";
2
+ import type { Meta, StoryObj } from "@storybook/react-vite";
3
+ import { Flex, Grid, Steps } from "../react";
4
+ import styles from "../styles.module.css";
5
+
6
+ const meta = {
7
+ title: "Designsystem/Steps",
8
+ parameters: {
9
+ layout: "padded",
10
+ },
11
+ decorators: [
12
+ (Story) => (
13
+ <Grid data-gap="14">
14
+ <Story />
15
+ </Grid>
16
+ ),
17
+ ],
18
+ } satisfies Meta;
19
+
20
+ export default meta;
21
+ type Story = StoryObj<typeof meta>;
22
+
23
+ export const Default: Story = {
24
+ render: () => (
25
+ <ol className={styles.steps}>
26
+ <li>
27
+ <mark>
28
+ <HeartIcon />
29
+ </mark>
30
+ <strong>Steg 1</strong>
31
+ <br />
32
+ <small>Beskrivelse</small>
33
+ </li>
34
+ <li>
35
+ <mark />
36
+ <strong>Steg 2</strong>
37
+ <br />
38
+ <small>Donec et odio</small>
39
+ </li>
40
+ <li aria-current="step" data-color="danger">
41
+ <mark />
42
+ <strong>Steg 3</strong>
43
+ </li>
44
+ <li>
45
+ <mark />
46
+ <strong>Steg 4</strong>
47
+ </li>
48
+ <li>
49
+ <mark />
50
+ <strong>Steg 5</strong>
51
+ </li>
52
+ </ol>
53
+ ),
54
+ };
55
+
56
+ export const React: Story = {
57
+ render: () => (
58
+ <Steps>
59
+ <li>
60
+ <mark />
61
+ <strong>Steg 1</strong>
62
+ </li>
63
+ <li>
64
+ <mark />
65
+ <strong>Steg 2</strong>
66
+ </li>
67
+ <li aria-current="step">
68
+ <mark />
69
+ <strong>Steg 3</strong>
70
+ </li>
71
+ <li>
72
+ <mark />
73
+ <strong>Steg 4</strong>
74
+ </li>
75
+ </Steps>
76
+ ),
77
+ };
78
+
79
+ export const WithStateComplete: Story = {
80
+ render: () => (
81
+ <ol className={styles.steps} data-state="complete">
82
+ <li>
83
+ <mark />
84
+ <strong>Steg 1</strong>
85
+ <br />
86
+ <small>Beskrivelse</small>
87
+ </li>
88
+ <li>
89
+ <mark />
90
+ <strong>Steg 2</strong>
91
+ <br />
92
+ <small>Donec et odio</small>
93
+ </li>
94
+ <li>
95
+ <mark />
96
+ <strong>Steg 3</strong>
97
+ </li>
98
+ <li>
99
+ <mark />
100
+ <strong>Steg 4</strong>
101
+ </li>
102
+ <li>
103
+ <mark />
104
+ <strong>Steg 5</strong>
105
+ </li>
106
+ </ol>
107
+ ),
108
+ };
109
+
110
+ export const WithDirection: Story = {
111
+ render: () => (
112
+ <Flex data-items="500" data-gap="14">
113
+ <Grid style={{ flexBasis: "100%" }}>
114
+ <strong>
115
+ With <code>data-direction="right"</code>:
116
+ </strong>
117
+ <ol className={styles.steps} data-direction="right">
118
+ <li>
119
+ <mark>
120
+ <HeartIcon />
121
+ </mark>
122
+ <strong>Steg 1</strong> Beskrivelse
123
+ </li>
124
+ <li data-color="danger">
125
+ <mark />
126
+ <strong>Steg 2</strong>
127
+ </li>
128
+ <li aria-current="step">
129
+ <mark />
130
+ <strong>Steg 3</strong>
131
+ </li>
132
+ <li>
133
+ <mark />
134
+ <strong>Steg 4</strong>
135
+ </li>
136
+ <li>
137
+ <mark />
138
+ <strong>Steg 5</strong>
139
+ </li>
140
+ </ol>
141
+ </Grid>
142
+ <Grid>
143
+ <strong>
144
+ With <code>data-direction="down"</code>:
145
+ </strong>
146
+ <ol className={styles.steps} data-direction="down">
147
+ <li>
148
+ <mark>
149
+ <HeartIcon />
150
+ </mark>
151
+ <strong>Steg 1</strong> Beskrivelse
152
+ </li>
153
+ <li data-color="danger">
154
+ <mark />
155
+ <strong>Steg 2</strong>
156
+ <br />
157
+ Donec sagittis et odio in consequat. Nullam rutrum erat in euismod
158
+ scelerisque. Nullam imperdiet lorem mauris, ut dapibus sem efficitur
159
+ a. Proin nec vulputate erat. Proin venenatis aliquam justo at
160
+ venenatis. Proin pharetra turpis sem, et consectetur nunc fringilla
161
+ vitae. Morbi molestie eleifend libero, et posuere magna semper non.
162
+ Nullam dictum massa non nibh sagittis vestibulum.
163
+ </li>
164
+ <li aria-current="step">
165
+ <mark />
166
+ <strong>Steg 3</strong>
167
+ </li>
168
+ <li>
169
+ <mark />
170
+ <strong>Steg 4</strong>
171
+ </li>
172
+ <li>
173
+ <mark />
174
+ <strong>Steg 5</strong>
175
+ </li>
176
+ </ol>
177
+ </Grid>
178
+ <Grid>
179
+ <strong>
180
+ With <code>data-direction="up"</code>:
181
+ </strong>
182
+ <ol className={styles.steps} data-direction="up">
183
+ <li>
184
+ <mark>
185
+ <HeartIcon />
186
+ </mark>
187
+ <strong>Steg 5</strong> Beskrivelse
188
+ </li>
189
+ <li>
190
+ <mark />
191
+ <strong>Steg 4</strong>
192
+ <br />
193
+ Donec sagittis et odio in consequat. Nullam rutrum erat in euismod
194
+ scelerisque. Nullam imperdiet lorem mauris, ut dapibus sem efficitur
195
+ a. Proin nec vulputate erat. Proin venenatis aliquam justo at
196
+ venenatis. Proin pharetra turpis sem, et consectetur nunc fringilla
197
+ vitae. Morbi molestie eleifend libero, et posuere magna semper non.
198
+ Nullam dictum massa non nibh sagittis vestibulum.
199
+ </li>
200
+ <li aria-current="step">
201
+ <mark />
202
+ <strong>Steg 3</strong>
203
+ </li>
204
+ <li>
205
+ <mark />
206
+ <strong>Steg 2</strong>
207
+ </li>
208
+ <li>
209
+ <mark />
210
+ <strong>Steg 1</strong>
211
+ </li>
212
+ </ol>
213
+ </Grid>
214
+ </Flex>
215
+ ),
216
+ };
217
+
218
+ export const WithFade: Story = {
219
+ render: () => (
220
+ <>
221
+ <strong>
222
+ No <code>data-fade</code>:
223
+ </strong>
224
+ <ol className={styles.steps}>
225
+ <li>
226
+ <mark />
227
+ <strong>Steg 1</strong>
228
+ </li>
229
+ <li aria-current="step">
230
+ <mark />
231
+ <strong>Steg 2</strong>
232
+ </li>
233
+ <li>
234
+ <mark />
235
+ <strong>Steg 3</strong>
236
+ </li>
237
+ </ol>
238
+ <strong>
239
+ With <code>data-fade</code>:
240
+ </strong>
241
+ <ol className={styles.steps} data-fade>
242
+ <li>
243
+ <mark />
244
+ <strong>Steg 1</strong>
245
+ </li>
246
+ <li aria-current="step">
247
+ <mark />
248
+ <strong>Steg 2</strong>
249
+ </li>
250
+ <li>
251
+ <mark />
252
+ <strong>Steg 3</strong>
253
+ </li>
254
+ </ol>
255
+ <strong>
256
+ With <code>data-fade="start"</code>:
257
+ </strong>
258
+ <ol className={styles.steps} data-fade="start">
259
+ <li>
260
+ <mark />
261
+ <strong>Steg 1</strong>
262
+ </li>
263
+ <li aria-current="step">
264
+ <mark />
265
+ <strong>Steg 2</strong>
266
+ </li>
267
+ <li>
268
+ <mark />
269
+ <strong>Steg 3</strong>
270
+ </li>
271
+ </ol>
272
+ <strong>
273
+ With <code>data-fade="end"</code>:
274
+ </strong>
275
+ <ol className={styles.steps} data-fade="end">
276
+ <li>
277
+ <mark />
278
+ <strong>Steg 1</strong>
279
+ </li>
280
+ <li aria-current="step">
281
+ <mark />
282
+ <strong>Steg 2</strong>
283
+ </li>
284
+ <li>
285
+ <mark />
286
+ <strong>Steg 3</strong>
287
+ </li>
288
+ </ol>
289
+ </>
290
+ ),
291
+ };
292
+
293
+ export const WithFadeAndDirection: Story = {
294
+ render: () => (
295
+ <Flex data-items="500" data-gap="14">
296
+ <Grid data-gap="14">
297
+ <strong>
298
+ With <code>data-direction="down"</code> and <code>data-fade</code>:
299
+ </strong>
300
+ <ol className={styles.steps} data-fade data-direction="down">
301
+ <li>
302
+ <mark />
303
+ <strong>Steg 1</strong>
304
+ </li>
305
+ <li aria-current="step">
306
+ <mark />
307
+ <strong>Steg 2</strong>
308
+ </li>
309
+ <li>
310
+ <mark />
311
+ <strong>Steg 3</strong>
312
+ </li>
313
+ </ol>
314
+ <strong>
315
+ With <code>data-direction="down"</code> and{" "}
316
+ <code>data-fade="start"</code>:
317
+ </strong>
318
+ <ol className={styles.steps} data-fade="start" data-direction="down">
319
+ <li>
320
+ <mark />
321
+ <strong>Steg 1</strong>
322
+ </li>
323
+ <li aria-current="step">
324
+ <mark />
325
+ <strong>Steg 2</strong>
326
+ </li>
327
+ <li>
328
+ <mark />
329
+ <strong>Steg 3</strong>
330
+ </li>
331
+ </ol>
332
+ <strong>
333
+ With <code>data-direction="down"</code> and{" "}
334
+ <code>data-fade="end"</code>:
335
+ </strong>
336
+ <ol className={styles.steps} data-fade="end" data-direction="down">
337
+ <li>
338
+ <mark />
339
+ <strong>Steg 1</strong>
340
+ </li>
341
+ <li aria-current="step">
342
+ <mark />
343
+ <strong>Steg 2</strong>
344
+ </li>
345
+ <li>
346
+ <mark />
347
+ <strong>Steg 3</strong>
348
+ </li>
349
+ </ol>
350
+ </Grid>
351
+ <Grid data-gap="14">
352
+ <strong>
353
+ With <code>data-direction="up"</code> and <code>data-fade</code>:
354
+ </strong>
355
+ <ol className={styles.steps} data-fade data-direction="up">
356
+ <li>
357
+ <mark />
358
+ <strong>Steg 3</strong>
359
+ </li>
360
+ <li aria-current="step">
361
+ <mark />
362
+ <strong>Steg 2</strong>
363
+ </li>
364
+ <li>
365
+ <mark />
366
+ <strong>Steg 1</strong>
367
+ </li>
368
+ </ol>
369
+ <strong>
370
+ With <code>data-direction="up"</code> and{" "}
371
+ <code>data-fade="start"</code>:
372
+ </strong>
373
+ <ol className={styles.steps} data-fade="start" data-direction="up">
374
+ <li>
375
+ <mark />
376
+ <strong>Steg 3</strong>
377
+ </li>
378
+ <li aria-current="step">
379
+ <mark />
380
+ <strong>Steg 2</strong>
381
+ </li>
382
+ <li>
383
+ <mark />
384
+ <strong>Steg 1</strong>
385
+ </li>
386
+ </ol>
387
+ <strong>
388
+ With <code>data-direction="up"</code> and <code>data-fade="end"</code>
389
+ :
390
+ </strong>
391
+ <ol className={styles.steps} data-fade="end" data-direction="up">
392
+ <li>
393
+ <mark />
394
+ <strong>Steg 3</strong>
395
+ </li>
396
+ <li aria-current="step">
397
+ <mark />
398
+ <strong>Steg 2</strong>
399
+ </li>
400
+ <li>
401
+ <mark />
402
+ <strong>Steg 1</strong>
403
+ </li>
404
+ </ol>
405
+ </Grid>
406
+ </Flex>
407
+ ),
408
+ };
409
+
410
+ export const WithColors: Story = {
411
+ render: () => (
412
+ <ol className={styles.steps}>
413
+ <li>
414
+ <mark />
415
+ <strong>Steg 1</strong>
416
+ <br />
417
+ <small>Beskrivelse</small>
418
+ </li>
419
+ <li data-color="danger">
420
+ <mark />
421
+ <strong>Steg 2</strong>
422
+ <br />
423
+ <small>Donec et odio</small>
424
+ </li>
425
+ <li aria-current="step">
426
+ <mark />
427
+ <strong>Steg 3</strong>
428
+ </li>
429
+ <li data-color="warning">
430
+ <mark />
431
+ <strong>Steg 4</strong>
432
+ </li>
433
+ <li>
434
+ <mark />
435
+ <strong>Steg 5</strong>
436
+ </li>
437
+ </ol>
438
+ ),
439
+ };
440
+
441
+ export const WithVariantFilled: Story = {
442
+ render: () => (
443
+ <>
444
+ <ol className={styles.steps} data-variant="filled">
445
+ <li>
446
+ <mark />
447
+ <strong>Steg 1</strong>
448
+ <br />
449
+ <small>Beskrivelse</small>
450
+ </li>
451
+ <li aria-current="step">
452
+ <mark />
453
+ <strong>Steg 2</strong>
454
+ <br />
455
+ <small>Donec et odio</small>
456
+ </li>
457
+ <li>
458
+ <mark />
459
+ <strong>Steg 3</strong>
460
+ </li>
461
+ </ol>
462
+ <ol className={styles.steps} data-variant="filled" data-direction="down">
463
+ <li>
464
+ <mark />
465
+ <strong>Steg 1</strong>
466
+ <br />
467
+ <small>Beskrivelse</small>
468
+ </li>
469
+ <li data-color="danger" aria-current="step">
470
+ <mark />
471
+ <strong>Steg 2</strong>
472
+ <br />
473
+ <small>Donec et odio</small>
474
+ </li>
475
+ <li>
476
+ <mark />
477
+ <strong>Steg 3</strong>
478
+ </li>
479
+ </ol>
480
+ <ol className={styles.steps} data-variant="filled" data-direction="up">
481
+ <li>
482
+ <mark />
483
+ <strong>Steg 1</strong>
484
+ <br />
485
+ <small>Beskrivelse</small>
486
+ </li>
487
+ <li data-color="danger" aria-current="step">
488
+ <mark />
489
+ <strong>Steg 2</strong>
490
+ <br />
491
+ <small>Donec et odio</small>
492
+ </li>
493
+ <li data-color="danger">
494
+ <mark />
495
+ <strong>Steg 3</strong>
496
+ </li>
497
+ </ol>
498
+ </>
499
+ ),
500
+ };
501
+
502
+ export const WithInteraction: Story = {
503
+ render: () => (
504
+ <ol className={styles.steps}>
505
+ <li>
506
+ <a href="#none">
507
+ <mark />
508
+ <strong>Steg 1</strong>
509
+ <br />
510
+ <small>Beskrivelse</small>
511
+ </a>
512
+ </li>
513
+ <li>
514
+ <a href="#none">
515
+ <mark />
516
+ <strong>Steg 2</strong>
517
+ <br />
518
+ <small>Donec et odio</small>
519
+ </a>
520
+ </li>
521
+ <li aria-current="step">
522
+ <button type="button">
523
+ <mark />
524
+ <strong>Steg 3</strong>
525
+ </button>
526
+ </li>
527
+ <li>
528
+ <button type="button">
529
+ <mark />
530
+ <strong>Steg 4</strong>
531
+ </button>
532
+ </li>
533
+ </ol>
534
+ ),
535
+ };
536
+
537
+ export const Timeline: Story = {
538
+ parameters: { showInOverview: true },
539
+ render: () => (
540
+ <ol className={styles.steps} data-direction="up">
541
+ <li data-color="main">
542
+ <mark>
543
+ <HeartIcon />
544
+ </mark>
545
+ <strong>06.04.2025</strong> Enighet om løsning
546
+ </li>
547
+ <li data-color="main">
548
+ <mark>
549
+ <HandshakeIcon />
550
+ </mark>
551
+ <strong>05.04.2025</strong> Oppfølgingsmøte gjennomført
552
+ <br />
553
+ Donec sagittis et odio in consequat. Nullam rutrum erat in euismod
554
+ scelerisque. Nullam imperdiet lorem mauris, ut dapibus sem efficitur a.
555
+ Proin nec vulputate erat. Proin venenatis aliquam justo at venenatis.
556
+ Proin pharetra turpis sem, et consectetur nunc fringilla vitae. Morbi
557
+ molestie eleifend libero, et posuere magna semper non. Nullam dictum
558
+ massa non nibh sagittis vestibulum.
559
+ </li>
560
+ <li data-color="main">
561
+ <mark>
562
+ <FilePlusIcon />
563
+ </mark>
564
+ <strong>01.02.2025</strong> Sak opprettet
565
+ </li>
566
+ </ol>
567
+ ),
568
+ };
@@ -0,0 +1,124 @@
1
+ import { Meta, Canvas } from '@storybook/addon-docs/blocks';
2
+ import { Example, CssVariables, JumpTo } from '../../.storybook/blocks';
3
+ import { Button } from "../react";
4
+ import * as stories from './table.stories';
5
+ import { Flex } from '../react';
6
+ import styles from '../styles.module.css';
7
+
8
+ <Meta of={stories} />
9
+
10
+ # Table
11
+ >Table brukes for å vise strukturert informasjon på en ryddig og oversiktlig måte. Tabeller kan gjøre det enklere for brukerne å skanne og sammenligne informasjon.
12
+
13
+ <JumpTo />
14
+
15
+ ## Kode
16
+ - Legg klassen `table` på `<table>`
17
+ - Bruk `<thead>` med `<tr><th>` som barn for topplinje
18
+ - Bruk `<tbody>` med `<tr><td>` som barn for rader
19
+ - Bruk `aria-label` for å navngi tabellen for skjermlesere
20
+ - Bruk `data-nowrap` hvor du vil på tabellen, rader eller celler for å hindre linjeskift
21
+ <Canvas of={stories.Default} />
22
+
23
+ ## Horisontale titler
24
+ - Bruk `<th scope="row">` som første barn i en rad for å få horisontal overskrift
25
+ <Canvas of={stories.WithHorizontalTitles} />
26
+
27
+ ## Låste bredder
28
+ - Tabeller tilpasser kolonnebredder automatisk etter innhold
29
+ - Dette kan være upraktisk når innholdet endrer seg/sorteres/pagineres
30
+ - Bruk `data-fixed` på `<table>` for låste bredder. **OBS:** Fungerer ikke med [mobil scroll](#mobil-scroll)
31
+ - Bruk evt. `style="width: X"` på `<th>` for å sette bredde på gitte kolonner
32
+ <Canvas of={stories.WithFixedWidths} />
33
+
34
+ ## Numeriske verdier
35
+ - Bruk `data-numeric` for tall med lik bredde.
36
+ <Canvas of={stories.WithNumericValues} />
37
+
38
+ ## Tekstjustering
39
+ - Bruk `data-justify="start | center | end"` for å justere tekstplassering.
40
+ <Canvas of={stories.WithJustify} />
41
+
42
+ ## Vertikal justering av innhold
43
+ - Bruk `data-align="start | center"` for å vertikalt justere innhold (`start` er default)
44
+ <Canvas of={stories.WithAlign} />
45
+
46
+ ## Sortering
47
+ - Bruk `<th aria-sort="none | ascending | descending | other">`
48
+ - Bruk `<button type="button">` i `<th>` for sorting
49
+ - Bruk [TanStack Table](https://tanstack.com/table/latest) eller annen valgfri kode for å utføre sorteringen
50
+ - **React?** Bruk `<Table.ThSortable aria-sort={} onClick={}>` for automisk knapp og støtte for flere verdier i `aria-sort` : `"acending" | "asc" | "desc" | "descending" | "down" | "false" | "none" | "up" | false | null`. Dersom **onClick er undefined**, vil en vanlig `<th>` uten sortering rendres.
51
+ - Se også [låste bredder](#laste-bredder)
52
+ <Canvas of={stories.SortableSimple} />
53
+
54
+ ## Bunnlinje
55
+ - Bruk `<tfoot>` med `<tr><th>` som barn for bunnlinje
56
+ <Canvas of={stories.WithFooter} />
57
+
58
+ ## Størrelser
59
+ - Bruk `data-size="sm | md | lg"`
60
+ <Canvas of={stories.Sizes} />
61
+
62
+ ## Ekspandering
63
+ - Legg `<button aria-expanded="true | false">` som barn av `td` eller `th`
64
+ - Legg til en rad etter `<tr><td colspan="x">`, hvor `x` er antall kolonner
65
+ <Canvas of={stories.ExpandableSimple} />
66
+
67
+ ## Checkbox
68
+ - Legg et [Field](/designsystem/field/) med `<input type="checkbox">` og `<label>` i første celle
69
+ <Canvas of={stories.CheckableSimple} />
70
+
71
+ ## Rad med handling
72
+ - Legg `data-clickdelegatefor="TARGET-ID"` på en `<tr>`, hvor `TARGET-ID` er `id` til en knapp, lenke eller checkbox inni raden
73
+ <Canvas of={stories.ClickableSimple} />
74
+
75
+ ## Paginering
76
+ - Tabell kan brukes sammen med [Pagination](/designsystem/pagination/)
77
+ <Canvas of={stories.PaginatableSimple} />
78
+
79
+ ## Mobil: Scroll
80
+ - Plasser tabellen inni en `<figure>` for å få scroll på mobil
81
+ - Bruk `data-nowrap` hvor du vil på tabellen, rader eller celler for å hindre linjeskift
82
+ <div className="sbdocs-canvas-thumbnail">
83
+ <Button data-arrow data-variant="primary" href="?path=/story/designsystem-table--mobile-scroll">Se scroll tabell i egen visning</Button>
84
+ <Canvas className="sbdocs-canvas--max-height" of={stories.MobileDivided} />
85
+ </div>
86
+
87
+ ## Mobile: Divided
88
+ - Legg `data-mobile="divided"` på `<table>` for todelt visning opp til `768px`
89
+ - Bruk `data-mobile-size="768"` for å sette egen breakpoint
90
+ - Bruk `data-mobile-source="self"` for breakpoint basert på egen størrelse - ikke viewport
91
+ <div className="sbdocs-canvas-thumbnail">
92
+ <Button data-arrow data-variant="primary" href="?path=/story/designsystem-table--mobile-divided">Se divided tabell i egen visning</Button>
93
+ <Canvas className="sbdocs-canvas--max-height" of={stories.MobileDivided} />
94
+ </div>
95
+
96
+ ## Mobile: Spaced
97
+ - Legg `data-mobile="spaced"` på `<table>` for todelt visning opp til `768px`
98
+ - Bruk `data-mobile-size="768"` for å sette egen breakpoint
99
+ - Bruk `data-mobile-source="self"` for breakpoint basert på egen størrelse - ikke viewport
100
+ <div className="sbdocs-canvas-thumbnail">
101
+ <Button data-arrow data-variant="primary" href="?path=/story/designsystem-table--mobile-spaced">Se spaced tabell i egen visning</Button>
102
+ <Canvas className="sbdocs-canvas--max-height" of={stories.MobileSpaced} />
103
+ </div>
104
+
105
+ ## Mobile: Stacked
106
+ - Legg `data-mobile="stacked"` på `<table>` for stablet visning opp til `768px`
107
+ - Bruk `data-mobile-size="768"` for å sette egen breakpoint
108
+ - Bruk `data-mobile-source="self"` for breakpoint basert på egen størrelse - ikke viewport
109
+ <div className="sbdocs-canvas-thumbnail">
110
+ <Button data-arrow data-variant="primary" href="?path=/story/designsystem-table--mobile-stacked">Se stacked tabell i egen visning</Button>
111
+ <Canvas className="sbdocs-canvas--max-height" of={stories.MobileStacked} />
112
+ </div>
113
+
114
+ ## Kant rundt
115
+ - Legg `data-border="true"` på `<table>` for å få kant rundt tabellen
116
+ - **Merk:** Skal hovedsakelig kun brukes når tabell ligger rett på gåsunge bakgrunn
117
+ <Canvas of={stories.WithBorderAround} />
118
+
119
+ ## Uten kant
120
+ - Legg `data-border="false"` på `<table>` for å fjerne alle `border` linjer
121
+ - **Merk:** Skal hovedsakelig kun brukes når tabell har kun to kolonner
122
+ <Canvas of={stories.WithoutBorders} />
123
+
124
+ <CssVariables component="table" exclude="zebra,sticky,hover,sorted" />