@navikt/ds-react 6.5.0 → 6.6.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 (153) hide show
  1. package/cjs/form/combobox/FilteredOptions/filteredOptionsContext.js +2 -4
  2. package/cjs/form/combobox/FilteredOptions/filteredOptionsContext.js.map +1 -1
  3. package/cjs/form/combobox/Input/Input.js +6 -1
  4. package/cjs/form/combobox/Input/Input.js.map +1 -1
  5. package/cjs/form/form-summary/FormSummary.d.ts +82 -0
  6. package/cjs/form/form-summary/FormSummary.js +81 -0
  7. package/cjs/form/form-summary/FormSummary.js.map +1 -0
  8. package/cjs/form/form-summary/FormSummaryAnswer.d.ts +11 -0
  9. package/cjs/form/form-summary/FormSummaryAnswer.js +25 -0
  10. package/cjs/form/form-summary/FormSummaryAnswer.js.map +1 -0
  11. package/cjs/form/form-summary/FormSummaryAnswers.d.ts +9 -0
  12. package/cjs/form/form-summary/FormSummaryAnswers.js +48 -0
  13. package/cjs/form/form-summary/FormSummaryAnswers.js.map +1 -0
  14. package/cjs/form/form-summary/FormSummaryEditLink.d.ts +17 -0
  15. package/cjs/form/form-summary/FormSummaryEditLink.js +49 -0
  16. package/cjs/form/form-summary/FormSummaryEditLink.js.map +1 -0
  17. package/cjs/form/form-summary/FormSummaryHeader.d.ts +9 -0
  18. package/cjs/form/form-summary/FormSummaryHeader.js +48 -0
  19. package/cjs/form/form-summary/FormSummaryHeader.js.map +1 -0
  20. package/cjs/form/form-summary/FormSummaryHeading.d.ts +14 -0
  21. package/cjs/form/form-summary/FormSummaryHeading.js +31 -0
  22. package/cjs/form/form-summary/FormSummaryHeading.js.map +1 -0
  23. package/cjs/form/form-summary/FormSummaryLabel.d.ts +6 -0
  24. package/cjs/form/form-summary/FormSummaryLabel.js +45 -0
  25. package/cjs/form/form-summary/FormSummaryLabel.js.map +1 -0
  26. package/cjs/form/form-summary/FormSummaryValue.d.ts +6 -0
  27. package/cjs/form/form-summary/FormSummaryValue.js +49 -0
  28. package/cjs/form/form-summary/FormSummaryValue.js.map +1 -0
  29. package/cjs/form/form-summary/index.d.ts +8 -0
  30. package/cjs/form/form-summary/index.js +24 -0
  31. package/cjs/form/form-summary/index.js.map +1 -0
  32. package/cjs/index.d.ts +3 -2
  33. package/cjs/index.js +5 -3
  34. package/cjs/index.js.map +1 -1
  35. package/cjs/util/hooks/descendants/descendant.js +10 -1
  36. package/cjs/util/hooks/descendants/descendant.js.map +1 -1
  37. package/cjs/util/hooks/descendants/useDescendant.js +0 -5
  38. package/cjs/util/hooks/descendants/useDescendant.js.map +1 -1
  39. package/esm/form/combobox/FilteredOptions/filteredOptionsContext.js +2 -4
  40. package/esm/form/combobox/FilteredOptions/filteredOptionsContext.js.map +1 -1
  41. package/esm/form/combobox/Input/Input.js +6 -1
  42. package/esm/form/combobox/Input/Input.js.map +1 -1
  43. package/esm/form/form-summary/FormSummary.d.ts +82 -0
  44. package/esm/form/form-summary/FormSummary.js +52 -0
  45. package/esm/form/form-summary/FormSummary.js.map +1 -0
  46. package/esm/form/form-summary/FormSummaryAnswer.d.ts +11 -0
  47. package/esm/form/form-summary/FormSummaryAnswer.js +19 -0
  48. package/esm/form/form-summary/FormSummaryAnswer.js.map +1 -0
  49. package/esm/form/form-summary/FormSummaryAnswers.d.ts +9 -0
  50. package/esm/form/form-summary/FormSummaryAnswers.js +19 -0
  51. package/esm/form/form-summary/FormSummaryAnswers.js.map +1 -0
  52. package/esm/form/form-summary/FormSummaryEditLink.d.ts +17 -0
  53. package/esm/form/form-summary/FormSummaryEditLink.js +20 -0
  54. package/esm/form/form-summary/FormSummaryEditLink.js.map +1 -0
  55. package/esm/form/form-summary/FormSummaryHeader.d.ts +9 -0
  56. package/esm/form/form-summary/FormSummaryHeader.js +19 -0
  57. package/esm/form/form-summary/FormSummaryHeader.js.map +1 -0
  58. package/esm/form/form-summary/FormSummaryHeading.d.ts +14 -0
  59. package/esm/form/form-summary/FormSummaryHeading.js +5 -0
  60. package/esm/form/form-summary/FormSummaryHeading.js.map +1 -0
  61. package/esm/form/form-summary/FormSummaryLabel.d.ts +6 -0
  62. package/esm/form/form-summary/FormSummaryLabel.js +19 -0
  63. package/esm/form/form-summary/FormSummaryLabel.js.map +1 -0
  64. package/esm/form/form-summary/FormSummaryValue.d.ts +6 -0
  65. package/esm/form/form-summary/FormSummaryValue.js +20 -0
  66. package/esm/form/form-summary/FormSummaryValue.js.map +1 -0
  67. package/esm/form/form-summary/index.d.ts +8 -0
  68. package/esm/form/form-summary/index.js +10 -0
  69. package/esm/form/form-summary/index.js.map +1 -0
  70. package/esm/index.d.ts +3 -2
  71. package/esm/index.js +2 -1
  72. package/esm/index.js.map +1 -1
  73. package/esm/util/hooks/descendants/descendant.js +10 -1
  74. package/esm/util/hooks/descendants/descendant.js.map +1 -1
  75. package/esm/util/hooks/descendants/useDescendant.js +0 -5
  76. package/esm/util/hooks/descendants/useDescendant.js.map +1 -1
  77. package/package.json +15 -4
  78. package/src/form/combobox/FilteredOptions/filteredOptionsContext.tsx +9 -1
  79. package/src/form/combobox/Input/Input.tsx +5 -0
  80. package/src/form/form-summary/FormSummary.tsx +106 -0
  81. package/src/form/form-summary/FormSummaryAnswer.tsx +27 -0
  82. package/src/form/form-summary/FormSummaryAnswers.tsx +25 -0
  83. package/src/form/form-summary/FormSummaryEditLink.tsx +35 -0
  84. package/src/form/form-summary/FormSummaryHeader.tsx +25 -0
  85. package/src/form/form-summary/FormSummaryHeading.tsx +23 -0
  86. package/src/form/form-summary/FormSummaryLabel.tsx +17 -0
  87. package/src/form/form-summary/FormSummaryValue.tsx +24 -0
  88. package/src/form/form-summary/index.ts +30 -0
  89. package/src/index.ts +16 -15
  90. package/src/util/hooks/descendants/descendant.ts +15 -1
  91. package/src/util/hooks/descendants/useDescendant.tsx +0 -5
  92. package/src/accordion/accordion.stories.tsx +0 -286
  93. package/src/alert/alert.stories.tsx +0 -306
  94. package/src/button/button.stories.tsx +0 -185
  95. package/src/chat/chat.stories.tsx +0 -341
  96. package/src/chips/chips.stories.tsx +0 -260
  97. package/src/copybutton/copy-button.stories.tsx +0 -261
  98. package/src/date/datepicker/datepicker.stories.tsx +0 -614
  99. package/src/date/monthpicker/monthpicker.stories.tsx +0 -221
  100. package/src/dropdown/dropdown.stories.tsx +0 -124
  101. package/src/expansion-card/expansion-card.stories.tsx +0 -282
  102. package/src/form/checkbox/checkbox.stories.tsx +0 -281
  103. package/src/form/combobox/combobox.stories.tsx +0 -626
  104. package/src/form/confirmation-panel/confirmation-panel.stories.tsx +0 -128
  105. package/src/form/error-summary/error-summary.stories.tsx +0 -81
  106. package/src/form/fieldset/fieldset.stories.tsx +0 -157
  107. package/src/form/file-upload/file-upload-dropzone.stories.tsx +0 -123
  108. package/src/form/file-upload/file-upload-item.stories.tsx +0 -148
  109. package/src/form/file-upload/file-upload.stories.tsx +0 -248
  110. package/src/form/radio/radio.stories.tsx +0 -230
  111. package/src/form/search/search.stories.tsx +0 -238
  112. package/src/form/select/select.stories.tsx +0 -172
  113. package/src/form/switch/switch.stories.tsx +0 -171
  114. package/src/form/textarea/textarea.stories.tsx +0 -254
  115. package/src/form/textfield/text-field.stories.tsx +0 -143
  116. package/src/guide-panel/guidepanel.stories.tsx +0 -90
  117. package/src/help-text/help-text.stories.tsx +0 -91
  118. package/src/internal-header/header.stories.tsx +0 -229
  119. package/src/layout/bleed/Bleed.stories.tsx +0 -395
  120. package/src/layout/box/Box.stories.tsx +0 -380
  121. package/src/layout/grid/h-grid.stories.tsx +0 -122
  122. package/src/layout/page/Page.stories.tsx +0 -271
  123. package/src/layout/responsive/hide.stories.tsx +0 -80
  124. package/src/layout/responsive/show.stories.tsx +0 -80
  125. package/src/layout/sidemal-test/navno-sidemal.stories.tsx +0 -69
  126. package/src/layout/stack/stack.stories.tsx +0 -183
  127. package/src/link/stories/link.stories.tsx +0 -304
  128. package/src/link-panel/link-panel.stories.tsx +0 -59
  129. package/src/list/list.stories.tsx +0 -280
  130. package/src/loader/loader.stories.tsx +0 -82
  131. package/src/modal/modal.stories.tsx +0 -391
  132. package/src/pagination/pagination.stories.tsx +0 -110
  133. package/src/popover/popover.stories.tsx +0 -113
  134. package/src/portal/Portal.stories.tsx +0 -102
  135. package/src/read-more/readmore.stories.tsx +0 -91
  136. package/src/skeleton/skeleton.stories.tsx +0 -130
  137. package/src/stepper/stepper.stories.tsx +0 -200
  138. package/src/table/stories/table-1.stories.tsx +0 -292
  139. package/src/table/stories/table-2-expandable.stories.tsx +0 -298
  140. package/src/table/stories/table-3-async.stories.tsx +0 -179
  141. package/src/table/stories/tests/table.stories.tsx +0 -102
  142. package/src/tabs/Tabs.stories.tsx +0 -311
  143. package/src/tag/tag.stories.tsx +0 -126
  144. package/src/timeline/timeline.stories.tsx +0 -445
  145. package/src/toggle-group/ToggleGroup.stories.tsx +0 -198
  146. package/src/tooltip/tooltip.stories.tsx +0 -101
  147. package/src/typography/stories/bodylong.stories.tsx +0 -209
  148. package/src/typography/stories/bodyshort.stories.tsx +0 -208
  149. package/src/typography/stories/detail.stories.tsx +0 -115
  150. package/src/typography/stories/error-message.stories.tsx +0 -122
  151. package/src/typography/stories/heading.stories.tsx +0 -169
  152. package/src/typography/stories/label.stories.tsx +0 -131
  153. package/src/util/hooks/descendants/descendant.stories.tsx +0 -147
@@ -1,179 +0,0 @@
1
- import React, { useState } from "react";
2
- import useSWR from "swr";
3
- import { Loader } from "../../loader";
4
- import { Pagination } from "../../pagination";
5
- import Table from "../Table";
6
- import { SortState } from "../types";
7
- import peopleJson from "./people.json";
8
-
9
- export default {
10
- title: "ds-react/Table",
11
- component: Table,
12
- parameters: {
13
- chromatic: { disable: true },
14
- },
15
- };
16
-
17
- const rowsPerPage = 10;
18
-
19
- const queryString = (obj: Record<string, number | string | undefined>) =>
20
- Object.keys(obj)
21
- .filter((key) => obj[key] !== undefined)
22
- .map((key) => key + "=" + obj[key])
23
- .join("&");
24
-
25
- const updateData = async (url: string) => {
26
- const newUrl = new URL(`https://www.example.com/${url}`);
27
- const comparator = (
28
- a: Record<string, string | number | null>,
29
- b: Record<string, string | number | null>,
30
- orderBy: string,
31
- ) => {
32
- if ((b[orderBy] ?? "") < (a[orderBy] ?? "")) {
33
- return -1;
34
- }
35
- if ((b[orderBy] ?? "") > (a[orderBy] ?? "")) {
36
- return 1;
37
- }
38
- return 0;
39
- };
40
-
41
- const page = Number(newUrl.searchParams.get("page"));
42
- const sort = newUrl.searchParams.get("sort");
43
-
44
- await new Promise((resolve) =>
45
- setTimeout(resolve, Math.round(Math.random() * (1000 - 200) + 200)),
46
- );
47
-
48
- return {
49
- count: peopleJson.length,
50
- results: peopleJson
51
- .slice()
52
- .sort((a, b) => {
53
- if (sort) {
54
- const [orderBy, direction] = sort.split(":");
55
- return direction === "ascending"
56
- ? comparator(b, a, orderBy)
57
- : comparator(a, b, orderBy);
58
- }
59
- return 1;
60
- })
61
- .slice((page - 1) * rowsPerPage, page * rowsPerPage),
62
- };
63
- };
64
-
65
- export const Async = () => {
66
- const [page, setPage] = useState(1);
67
- const [sort, setSort] = useState<SortState>();
68
-
69
- const { data } = useSWR(
70
- `/people?${queryString({
71
- page,
72
- sort: sort ? `${sort.orderBy}:${sort.direction}` : undefined,
73
- })}`,
74
- (url) => updateData(url),
75
- );
76
-
77
- if (!data) {
78
- return <Loader size="2xlarge" />;
79
- }
80
-
81
- const { results: people, count } = data;
82
-
83
- type ColumnsType = {
84
- key: keyof (typeof people)[0];
85
- name: string;
86
- width: number;
87
- sortable?: boolean;
88
- value?: (person: (typeof people)[0]) => string | undefined;
89
- };
90
- const columns: ColumnsType[] = [
91
- { key: "name", name: "Name", width: 154 },
92
- { key: "height", name: "Height", width: 108 },
93
- { key: "mass", name: "Mass", width: 95 },
94
- {
95
- key: "birth_year",
96
- name: "Birth year",
97
- value: (person) =>
98
- person.birth_year !== null ? `${person.birth_year}BBY` : undefined,
99
- width: 133,
100
- },
101
- { key: "eye_color", name: "Eye color", width: 127 },
102
- { key: "gender", name: "Gender", width: 113, sortable: false },
103
- { key: "hair_color", name: "Hair color", width: 132 },
104
- { key: "skin_color", name: "Skin color", width: 133 },
105
- ];
106
-
107
- return (
108
- <div
109
- style={{
110
- display: "flex",
111
- flexDirection: "column",
112
- gap: 16,
113
- }}
114
- >
115
- <div style={{ overflow: "auto" }}>
116
- <Table
117
- style={{ width: "initial" }}
118
- sort={sort}
119
- onSortChange={(sortKey) =>
120
- setSort(
121
- !sortKey ||
122
- (sort?.orderBy === sortKey && sort.direction === "descending")
123
- ? undefined
124
- : {
125
- orderBy: sortKey,
126
- direction:
127
- sort?.direction === "ascending"
128
- ? "descending"
129
- : "ascending",
130
- },
131
- )
132
- }
133
- >
134
- <Table.Header>
135
- <Table.Row>
136
- {columns.map(({ key, name, width, sortable = true }) => (
137
- <Table.ColumnHeader
138
- style={{ width, minWidth: width, maxWidth: width }}
139
- key={key}
140
- sortable={sortable}
141
- sortKey={key}
142
- >
143
- {name}
144
- </Table.ColumnHeader>
145
- ))}
146
- </Table.Row>
147
- </Table.Header>
148
- <Table.Body>
149
- {people.map((person) => (
150
- <Table.Row key={person.name}>
151
- {columns.map(({ key, width, value }) => (
152
- <Table.DataCell
153
- style={{
154
- width,
155
- minWidth: width,
156
- maxWidth: width,
157
- overflow: "hidden",
158
- whiteSpace: "nowrap",
159
- textOverflow: "ellipsis",
160
- }}
161
- title={person[key]?.toString()}
162
- key={key}
163
- >
164
- {value ? value(person) : person[key]}
165
- </Table.DataCell>
166
- ))}
167
- </Table.Row>
168
- ))}
169
- </Table.Body>
170
- </Table>
171
- </div>
172
- <Pagination
173
- page={page}
174
- onPageChange={setPage}
175
- count={Math.ceil(count / rowsPerPage)}
176
- />
177
- </div>
178
- );
179
- };
@@ -1,102 +0,0 @@
1
- import { expect, fn, userEvent, within } from "@storybook/test";
2
- import React from "react";
3
- import Table from "../../Table";
4
-
5
- export default {
6
- title: "ds-react/Table/Tests",
7
- component: Table,
8
- parameters: {
9
- chromatic: { disable: true },
10
- },
11
- };
12
-
13
- export const ClickableRowTest = {
14
- render: ({ onOpenChange }) => {
15
- return (
16
- <>
17
- <Table zebraStripes>
18
- <Table.Header>
19
- <Table.Row>
20
- <Table.HeaderCell aria-hidden />
21
- <Table.HeaderCell aria-hidden />
22
- <Table.HeaderCell aria-hidden />
23
- <Table.HeaderCell aria-hidden />
24
- <Table.HeaderCell aria-hidden />
25
- <Table.HeaderCell aria-hidden />
26
- </Table.Row>
27
- </Table.Header>
28
- <Table.Body>
29
- <Table.ExpandableRow
30
- content={<div>placeholder row 2</div>}
31
- togglePlacement="right"
32
- data-testid="row1"
33
- expandOnRowClick
34
- onOpenChange={onOpenChange}
35
- >
36
- <Table.DataCell>
37
- <div data-testid="cell1">Should be clickable</div>
38
- </Table.DataCell>
39
- <Table.DataCell data-testid="cell2">
40
- Should also be clickable
41
- </Table.DataCell>
42
-
43
- <Table.DataCell>
44
- <button data-testid="cell3">Should not be clickable</button>
45
- </Table.DataCell>
46
- <Table.DataCell>
47
- <div>
48
- <div>
49
- <button data-testid="cell4">
50
- Nested should not be clickable
51
- </button>
52
- </div>
53
- </div>
54
- </Table.DataCell>
55
- <Table.DataCell>
56
- <div>
57
- <div>
58
- <button data-testid="cell4">
59
- <span>2x nested should not be clickable</span>
60
- </button>
61
- </div>
62
- </div>
63
- </Table.DataCell>
64
- </Table.ExpandableRow>
65
- </Table.Body>
66
- </Table>
67
- </>
68
- );
69
- },
70
- args: {
71
- onOpenChange: fn(),
72
- },
73
- play: async ({ canvasElement, args }) => {
74
- args.onOpenChange.mockClear();
75
- const canvas = within(canvasElement);
76
-
77
- const cell1 = canvas.getByText("Should be clickable");
78
- const cell2 = canvas.getByText("Should also be clickable");
79
- const cell3 = canvas.getByText("Should not be clickable");
80
- const cell4 = canvas.getByText("Nested should not be clickable");
81
- const cell5 = canvas.getByText("2x nested should not be clickable");
82
-
83
- await userEvent.click(cell1);
84
- expect(args.onOpenChange.mock.calls).toHaveLength(1);
85
- await userEvent.click(cell1);
86
- expect(args.onOpenChange.mock.calls).toHaveLength(2);
87
-
88
- await userEvent.click(cell2);
89
- expect(args.onOpenChange.mock.calls).toHaveLength(3);
90
- await userEvent.click(cell2);
91
- expect(args.onOpenChange.mock.calls).toHaveLength(4);
92
-
93
- await userEvent.click(cell3);
94
- expect(args.onOpenChange.mock.calls).toHaveLength(4);
95
-
96
- await userEvent.click(cell4);
97
- expect(args.onOpenChange.mock.calls).toHaveLength(4);
98
-
99
- await userEvent.click(cell5);
100
- expect(args.onOpenChange.mock.calls).toHaveLength(4);
101
- },
102
- };
@@ -1,311 +0,0 @@
1
- import { Meta, StoryObj } from "@storybook/react";
2
- import React, { useState } from "react";
3
- import { DishwasherIcon, FreezerIcon, MugIcon } from "@navikt/aksel-icons";
4
- import { Tabs } from ".";
5
- import { VStack } from "../layout/stack";
6
-
7
- export default {
8
- title: "ds-react/Tabs",
9
- component: Tabs,
10
- argTypes: {
11
- size: {
12
- options: ["medium", "small"],
13
- control: {
14
- type: "radio",
15
- },
16
- },
17
- iconPosition: {
18
- options: ["top", "left"],
19
- control: {
20
- type: "radio",
21
- },
22
- },
23
- },
24
- parameters: {
25
- chromatic: { disable: true },
26
- },
27
- } satisfies Meta<typeof Tabs>;
28
-
29
- type Story = StoryObj<typeof Tabs>;
30
-
31
- const Panel = () => (
32
- <>
33
- <Tabs.Panel
34
- value="test1"
35
- className="panel"
36
- style={{ background: "var(--a-gray-50)", height: 100 }}
37
- >
38
- Innholdspanel for Skap-tab
39
- </Tabs.Panel>
40
- <Tabs.Panel
41
- value="test2"
42
- className="panel"
43
- style={{
44
- background: "var(--a-green-50)",
45
- height: 100,
46
- }}
47
- >
48
- Innholdspanel for Oppvaskmaskin-tab
49
- </Tabs.Panel>
50
- <Tabs.Panel
51
- value="test3"
52
- className="panel"
53
- style={{ background: "var(--a-red-50)", height: 100 }}
54
- >
55
- Innholdspanel for Fryser-tab
56
- </Tabs.Panel>
57
- <style>{`.panel[data-state="active"] { display:grid; place-content: center;}`}</style>
58
- </>
59
- );
60
-
61
- export const Default: Story = {
62
- render: (props) => {
63
- return (
64
- <Tabs
65
- defaultValue="test2"
66
- size={props?.size}
67
- selectionFollowsFocus={props?.selectionFollowsFocus}
68
- loop={props?.loop}
69
- iconPosition={props?.iconPosition}
70
- >
71
- <Tabs.List>
72
- <Tabs.Tab value="test1" icon={<MugIcon aria-hidden />} label="Skap" />
73
- <Tabs.Tab
74
- value="test2"
75
- label="Oppvaskmaskin"
76
- icon={<DishwasherIcon aria-hidden />}
77
- />
78
- <Tabs.Tab
79
- value="test3"
80
- icon={<FreezerIcon aria-hidden />}
81
- label="Fryser"
82
- />
83
- </Tabs.List>
84
- <Panel />
85
- </Tabs>
86
- );
87
- },
88
-
89
- args: {
90
- selectionFollowsFocus: false,
91
- loop: false,
92
- },
93
- };
94
-
95
- export const Small = () => (
96
- <Tabs defaultValue="test2" size="small">
97
- <Tabs.List>
98
- <Tabs.Tab value="test1" icon={<MugIcon aria-hidden />} label="Skap" />
99
- <Tabs.Tab
100
- value="test2"
101
- label="Oppvaskmaskin"
102
- icon={<DishwasherIcon aria-hidden />}
103
- />
104
- <Tabs.Tab
105
- value="test3"
106
- icon={<FreezerIcon aria-hidden />}
107
- label="Fryser"
108
- />
109
- </Tabs.List>
110
- <Panel />
111
- </Tabs>
112
- );
113
-
114
- export const Controlled = () => {
115
- const [activeValue, setActiveValue] = useState("test1");
116
- return (
117
- <Tabs value={activeValue} onChange={setActiveValue}>
118
- <Tabs.List>
119
- <Tabs.Tab value="test1" icon={<MugIcon aria-hidden />} label="Skap" />
120
- <Tabs.Tab
121
- value="test2"
122
- label="Oppvaskmaskin"
123
- icon={<DishwasherIcon aria-hidden />}
124
- />
125
- <Tabs.Tab
126
- value="test3"
127
- icon={<FreezerIcon aria-hidden />}
128
- label="Fryser"
129
- />
130
- </Tabs.List>
131
- <Panel />
132
- </Tabs>
133
- );
134
- };
135
-
136
- export const IconPosition = () => (
137
- <VStack gap="4">
138
- <Tabs defaultValue="test2" size="small">
139
- <Tabs.List>
140
- <Tabs.Tab value="test1" icon={<MugIcon aria-hidden />} label="Skap" />
141
- <Tabs.Tab
142
- value="test2"
143
- label="Oppvaskmaskin"
144
- icon={<DishwasherIcon aria-hidden />}
145
- />
146
- <Tabs.Tab
147
- value="test3"
148
- icon={<FreezerIcon aria-hidden />}
149
- label="Fryser"
150
- />
151
- </Tabs.List>
152
- <Panel />
153
- </Tabs>
154
- <Tabs defaultValue="test2" size="small" iconPosition="top">
155
- <Tabs.List style={{ margin: "0 auto" }}>
156
- <Tabs.Tab value="test1" icon={<MugIcon aria-hidden />} label="Skap" />
157
- <Tabs.Tab
158
- value="test2"
159
- label="Oppvaskmaskin"
160
- icon={<DishwasherIcon aria-hidden />}
161
- />
162
- <Tabs.Tab
163
- value="test3"
164
- icon={<FreezerIcon aria-hidden />}
165
- label="Fryser"
166
- />
167
- </Tabs.List>
168
- <Panel />
169
- </Tabs>
170
- </VStack>
171
- );
172
-
173
- export const Icon = () => (
174
- <VStack gap="4">
175
- <Tabs defaultValue="test2">
176
- <Tabs.List style={{ margin: "0 auto" }}>
177
- <Tabs.Tab value="test1" icon={<MugIcon title="Skap" />} />
178
- <Tabs.Tab
179
- value="test2"
180
- icon={<DishwasherIcon title="Oppvaskmaskin" />}
181
- />
182
- <Tabs.Tab value="test3" icon={<FreezerIcon title="Fryser" />} />
183
- </Tabs.List>
184
- <Panel />
185
- </Tabs>
186
- <Tabs defaultValue="test2" size="small" iconPosition="top">
187
- <Tabs.List style={{ margin: "0 auto" }}>
188
- <Tabs.Tab value="test1" icon={<MugIcon title="Skap" />} />
189
- <Tabs.Tab
190
- value="test2"
191
- icon={<DishwasherIcon title="Oppvaskmaskin" />}
192
- />
193
- <Tabs.Tab value="test3" icon={<FreezerIcon title="Fryser" />} />
194
- </Tabs.List>
195
- <Panel />
196
- </Tabs>
197
- </VStack>
198
- );
199
-
200
- export const Overflow = () => (
201
- <Tabs defaultValue="test2" style={{ maxWidth: 300 }}>
202
- <Tabs.List>
203
- <Tabs.Tab value="test1" icon={<MugIcon aria-hidden />} label="Skap" />
204
- <Tabs.Tab
205
- value="test2"
206
- label="Oppvaskmaskin"
207
- icon={<DishwasherIcon aria-hidden />}
208
- />
209
- <Tabs.Tab
210
- value="test3"
211
- icon={<FreezerIcon aria-hidden />}
212
- label="Fryser"
213
- />
214
- </Tabs.List>
215
- <Panel />
216
- </Tabs>
217
- );
218
-
219
- export const Fill = () => (
220
- <Tabs defaultValue="test2" fill>
221
- <Tabs.List>
222
- <Tabs.Tab value="test1" icon={<MugIcon aria-hidden />} label="Skap" />
223
- <Tabs.Tab
224
- value="test2"
225
- icon={<DishwasherIcon aria-hidden />}
226
- label="Oppvaskmaskin"
227
- />
228
- <Tabs.Tab
229
- value="test3"
230
- icon={<FreezerIcon aria-hidden />}
231
- label="Fryser"
232
- />
233
- </Tabs.List>
234
- <Panel />
235
- </Tabs>
236
- );
237
-
238
- Fill.parameters = {
239
- layout: "fullscreen",
240
- };
241
-
242
- export const CustomIds = () => (
243
- <Tabs defaultValue="test2">
244
- <Tabs.List>
245
- <Tabs.Tab
246
- value="test1"
247
- label="Skap"
248
- id="custom-tabid-1"
249
- aria-controls="custom-tabpanelid-1"
250
- />
251
- <Tabs.Tab
252
- value="test2"
253
- label="Oppvaskmaskin"
254
- id="custom-tabid-2"
255
- aria-controls="custom-tabpanelid-2"
256
- />
257
- </Tabs.List>
258
- <Tabs.Panel
259
- value="test1"
260
- className="panel"
261
- id="custom-tabpanelid-1"
262
- aria-labelledby="custom-tabid-1"
263
- >
264
- Innholdspanel for Skap-tab
265
- </Tabs.Panel>
266
- <Tabs.Panel
267
- value="test2"
268
- className="panel"
269
- id="custom-tabpanelid-2"
270
- aria-labelledby="custom-tabid-2"
271
- >
272
- Innholdspanel for Oppvaskmaskin-tab
273
- </Tabs.Panel>
274
- </Tabs>
275
- );
276
-
277
- export const Chromatic = {
278
- render: () => (
279
- <VStack gap="6" align="center">
280
- <div>
281
- <h2>Small</h2>
282
- <Small />
283
- </div>
284
- <div>
285
- <h2>Controlled</h2>
286
- <Controlled />
287
- </div>
288
- <div>
289
- <h2>IconPosition</h2>
290
- <IconPosition />
291
- </div>
292
- <div>
293
- <h2>Icon</h2>
294
- <Icon />
295
- </div>
296
- <div>
297
- <h2>Overflow</h2>
298
- <Overflow />
299
- </div>
300
- <div>
301
- <h2>Fill</h2>
302
- <div style={{ minWidth: 600 }}>
303
- <Fill />
304
- </div>
305
- </div>
306
- </VStack>
307
- ),
308
- parameters: {
309
- chromatic: { disable: false, delay: 300 },
310
- },
311
- };