@navikt/ds-react 6.5.0 → 6.6.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 (200) hide show
  1. package/cjs/collapsible/Collapsible.context.d.ts +48 -0
  2. package/cjs/collapsible/Collapsible.context.js +10 -0
  3. package/cjs/collapsible/Collapsible.context.js.map +1 -0
  4. package/cjs/collapsible/Collapsible.d.ts +48 -0
  5. package/cjs/collapsible/Collapsible.js +91 -0
  6. package/cjs/collapsible/Collapsible.js.map +1 -0
  7. package/cjs/collapsible/Collapsible.types.d.ts +19 -0
  8. package/cjs/collapsible/Collapsible.types.js +3 -0
  9. package/cjs/collapsible/Collapsible.types.js.map +1 -0
  10. package/cjs/collapsible/index.d.ts +3 -0
  11. package/cjs/collapsible/index.js +14 -0
  12. package/cjs/collapsible/index.js.map +1 -0
  13. package/cjs/collapsible/parts/Collapsible.Content.d.ts +10 -0
  14. package/cjs/collapsible/parts/Collapsible.Content.js +48 -0
  15. package/cjs/collapsible/parts/Collapsible.Content.js.map +1 -0
  16. package/cjs/collapsible/parts/Collapsible.Trigger.d.ts +10 -0
  17. package/cjs/collapsible/parts/Collapsible.Trigger.js +49 -0
  18. package/cjs/collapsible/parts/Collapsible.Trigger.js.map +1 -0
  19. package/cjs/form/combobox/FilteredOptions/filteredOptionsContext.js +2 -4
  20. package/cjs/form/combobox/FilteredOptions/filteredOptionsContext.js.map +1 -1
  21. package/cjs/form/combobox/Input/Input.js +6 -1
  22. package/cjs/form/combobox/Input/Input.js.map +1 -1
  23. package/cjs/form/form-summary/FormSummary.d.ts +82 -0
  24. package/cjs/form/form-summary/FormSummary.js +81 -0
  25. package/cjs/form/form-summary/FormSummary.js.map +1 -0
  26. package/cjs/form/form-summary/FormSummaryAnswer.d.ts +11 -0
  27. package/cjs/form/form-summary/FormSummaryAnswer.js +25 -0
  28. package/cjs/form/form-summary/FormSummaryAnswer.js.map +1 -0
  29. package/cjs/form/form-summary/FormSummaryAnswers.d.ts +9 -0
  30. package/cjs/form/form-summary/FormSummaryAnswers.js +48 -0
  31. package/cjs/form/form-summary/FormSummaryAnswers.js.map +1 -0
  32. package/cjs/form/form-summary/FormSummaryEditLink.d.ts +17 -0
  33. package/cjs/form/form-summary/FormSummaryEditLink.js +49 -0
  34. package/cjs/form/form-summary/FormSummaryEditLink.js.map +1 -0
  35. package/cjs/form/form-summary/FormSummaryHeader.d.ts +9 -0
  36. package/cjs/form/form-summary/FormSummaryHeader.js +48 -0
  37. package/cjs/form/form-summary/FormSummaryHeader.js.map +1 -0
  38. package/cjs/form/form-summary/FormSummaryHeading.d.ts +14 -0
  39. package/cjs/form/form-summary/FormSummaryHeading.js +31 -0
  40. package/cjs/form/form-summary/FormSummaryHeading.js.map +1 -0
  41. package/cjs/form/form-summary/FormSummaryLabel.d.ts +6 -0
  42. package/cjs/form/form-summary/FormSummaryLabel.js +45 -0
  43. package/cjs/form/form-summary/FormSummaryLabel.js.map +1 -0
  44. package/cjs/form/form-summary/FormSummaryValue.d.ts +6 -0
  45. package/cjs/form/form-summary/FormSummaryValue.js +49 -0
  46. package/cjs/form/form-summary/FormSummaryValue.js.map +1 -0
  47. package/cjs/form/form-summary/index.d.ts +8 -0
  48. package/cjs/form/form-summary/index.js +24 -0
  49. package/cjs/form/form-summary/index.js.map +1 -0
  50. package/cjs/index.d.ts +3 -2
  51. package/cjs/index.js +5 -3
  52. package/cjs/index.js.map +1 -1
  53. package/cjs/layout/stack/Spacer.js +1 -1
  54. package/cjs/layout/stack/Spacer.js.map +1 -1
  55. package/cjs/util/hooks/descendants/descendant.js +10 -1
  56. package/cjs/util/hooks/descendants/descendant.js.map +1 -1
  57. package/cjs/util/hooks/descendants/useDescendant.js +0 -5
  58. package/cjs/util/hooks/descendants/useDescendant.js.map +1 -1
  59. package/esm/collapsible/Collapsible.context.d.ts +48 -0
  60. package/esm/collapsible/Collapsible.context.js +6 -0
  61. package/esm/collapsible/Collapsible.context.js.map +1 -0
  62. package/esm/collapsible/Collapsible.d.ts +48 -0
  63. package/esm/collapsible/Collapsible.js +62 -0
  64. package/esm/collapsible/Collapsible.js.map +1 -0
  65. package/esm/collapsible/Collapsible.types.d.ts +19 -0
  66. package/esm/collapsible/Collapsible.types.js +2 -0
  67. package/esm/collapsible/Collapsible.types.js.map +1 -0
  68. package/esm/collapsible/index.d.ts +3 -0
  69. package/esm/collapsible/index.js +5 -0
  70. package/esm/collapsible/index.js.map +1 -0
  71. package/esm/collapsible/parts/Collapsible.Content.d.ts +10 -0
  72. package/esm/collapsible/parts/Collapsible.Content.js +22 -0
  73. package/esm/collapsible/parts/Collapsible.Content.js.map +1 -0
  74. package/esm/collapsible/parts/Collapsible.Trigger.d.ts +10 -0
  75. package/esm/collapsible/parts/Collapsible.Trigger.js +23 -0
  76. package/esm/collapsible/parts/Collapsible.Trigger.js.map +1 -0
  77. package/esm/form/combobox/FilteredOptions/filteredOptionsContext.js +2 -4
  78. package/esm/form/combobox/FilteredOptions/filteredOptionsContext.js.map +1 -1
  79. package/esm/form/combobox/Input/Input.js +6 -1
  80. package/esm/form/combobox/Input/Input.js.map +1 -1
  81. package/esm/form/form-summary/FormSummary.d.ts +82 -0
  82. package/esm/form/form-summary/FormSummary.js +52 -0
  83. package/esm/form/form-summary/FormSummary.js.map +1 -0
  84. package/esm/form/form-summary/FormSummaryAnswer.d.ts +11 -0
  85. package/esm/form/form-summary/FormSummaryAnswer.js +19 -0
  86. package/esm/form/form-summary/FormSummaryAnswer.js.map +1 -0
  87. package/esm/form/form-summary/FormSummaryAnswers.d.ts +9 -0
  88. package/esm/form/form-summary/FormSummaryAnswers.js +19 -0
  89. package/esm/form/form-summary/FormSummaryAnswers.js.map +1 -0
  90. package/esm/form/form-summary/FormSummaryEditLink.d.ts +17 -0
  91. package/esm/form/form-summary/FormSummaryEditLink.js +20 -0
  92. package/esm/form/form-summary/FormSummaryEditLink.js.map +1 -0
  93. package/esm/form/form-summary/FormSummaryHeader.d.ts +9 -0
  94. package/esm/form/form-summary/FormSummaryHeader.js +19 -0
  95. package/esm/form/form-summary/FormSummaryHeader.js.map +1 -0
  96. package/esm/form/form-summary/FormSummaryHeading.d.ts +14 -0
  97. package/esm/form/form-summary/FormSummaryHeading.js +5 -0
  98. package/esm/form/form-summary/FormSummaryHeading.js.map +1 -0
  99. package/esm/form/form-summary/FormSummaryLabel.d.ts +6 -0
  100. package/esm/form/form-summary/FormSummaryLabel.js +19 -0
  101. package/esm/form/form-summary/FormSummaryLabel.js.map +1 -0
  102. package/esm/form/form-summary/FormSummaryValue.d.ts +6 -0
  103. package/esm/form/form-summary/FormSummaryValue.js +20 -0
  104. package/esm/form/form-summary/FormSummaryValue.js.map +1 -0
  105. package/esm/form/form-summary/index.d.ts +8 -0
  106. package/esm/form/form-summary/index.js +10 -0
  107. package/esm/form/form-summary/index.js.map +1 -0
  108. package/esm/index.d.ts +3 -2
  109. package/esm/index.js +2 -1
  110. package/esm/index.js.map +1 -1
  111. package/esm/layout/stack/Spacer.js +1 -1
  112. package/esm/layout/stack/Spacer.js.map +1 -1
  113. package/esm/util/hooks/descendants/descendant.js +10 -1
  114. package/esm/util/hooks/descendants/descendant.js.map +1 -1
  115. package/esm/util/hooks/descendants/useDescendant.js +0 -5
  116. package/esm/util/hooks/descendants/useDescendant.js.map +1 -1
  117. package/package.json +15 -4
  118. package/src/collapsible/Collapsible.context.tsx +32 -0
  119. package/src/collapsible/Collapsible.tsx +100 -0
  120. package/src/collapsible/Collapsible.types.ts +19 -0
  121. package/src/collapsible/index.ts +10 -0
  122. package/src/collapsible/parts/Collapsible.Content.tsx +39 -0
  123. package/src/collapsible/parts/Collapsible.Trigger.tsx +42 -0
  124. package/src/form/combobox/FilteredOptions/filteredOptionsContext.tsx +9 -1
  125. package/src/form/combobox/Input/Input.tsx +5 -0
  126. package/src/form/form-summary/FormSummary.tsx +106 -0
  127. package/src/form/form-summary/FormSummaryAnswer.tsx +27 -0
  128. package/src/form/form-summary/FormSummaryAnswers.tsx +25 -0
  129. package/src/form/form-summary/FormSummaryEditLink.tsx +35 -0
  130. package/src/form/form-summary/FormSummaryHeader.tsx +25 -0
  131. package/src/form/form-summary/FormSummaryHeading.tsx +23 -0
  132. package/src/form/form-summary/FormSummaryLabel.tsx +17 -0
  133. package/src/form/form-summary/FormSummaryValue.tsx +24 -0
  134. package/src/form/form-summary/index.ts +30 -0
  135. package/src/index.ts +16 -15
  136. package/src/layout/stack/Spacer.tsx +1 -1
  137. package/src/util/hooks/descendants/descendant.ts +15 -1
  138. package/src/util/hooks/descendants/useDescendant.tsx +0 -5
  139. package/src/accordion/accordion.stories.tsx +0 -286
  140. package/src/alert/alert.stories.tsx +0 -306
  141. package/src/button/button.stories.tsx +0 -185
  142. package/src/chat/chat.stories.tsx +0 -341
  143. package/src/chips/chips.stories.tsx +0 -260
  144. package/src/copybutton/copy-button.stories.tsx +0 -261
  145. package/src/date/datepicker/datepicker.stories.tsx +0 -614
  146. package/src/date/monthpicker/monthpicker.stories.tsx +0 -221
  147. package/src/dropdown/dropdown.stories.tsx +0 -124
  148. package/src/expansion-card/expansion-card.stories.tsx +0 -282
  149. package/src/form/checkbox/checkbox.stories.tsx +0 -281
  150. package/src/form/combobox/combobox.stories.tsx +0 -626
  151. package/src/form/confirmation-panel/confirmation-panel.stories.tsx +0 -128
  152. package/src/form/error-summary/error-summary.stories.tsx +0 -81
  153. package/src/form/fieldset/fieldset.stories.tsx +0 -157
  154. package/src/form/file-upload/file-upload-dropzone.stories.tsx +0 -123
  155. package/src/form/file-upload/file-upload-item.stories.tsx +0 -148
  156. package/src/form/file-upload/file-upload.stories.tsx +0 -248
  157. package/src/form/radio/radio.stories.tsx +0 -230
  158. package/src/form/search/search.stories.tsx +0 -238
  159. package/src/form/select/select.stories.tsx +0 -172
  160. package/src/form/switch/switch.stories.tsx +0 -171
  161. package/src/form/textarea/textarea.stories.tsx +0 -254
  162. package/src/form/textfield/text-field.stories.tsx +0 -143
  163. package/src/guide-panel/guidepanel.stories.tsx +0 -90
  164. package/src/help-text/help-text.stories.tsx +0 -91
  165. package/src/internal-header/header.stories.tsx +0 -229
  166. package/src/layout/bleed/Bleed.stories.tsx +0 -395
  167. package/src/layout/box/Box.stories.tsx +0 -380
  168. package/src/layout/grid/h-grid.stories.tsx +0 -122
  169. package/src/layout/page/Page.stories.tsx +0 -271
  170. package/src/layout/responsive/hide.stories.tsx +0 -80
  171. package/src/layout/responsive/show.stories.tsx +0 -80
  172. package/src/layout/sidemal-test/navno-sidemal.stories.tsx +0 -69
  173. package/src/layout/stack/stack.stories.tsx +0 -183
  174. package/src/link/stories/link.stories.tsx +0 -304
  175. package/src/link-panel/link-panel.stories.tsx +0 -59
  176. package/src/list/list.stories.tsx +0 -280
  177. package/src/loader/loader.stories.tsx +0 -82
  178. package/src/modal/modal.stories.tsx +0 -391
  179. package/src/pagination/pagination.stories.tsx +0 -110
  180. package/src/popover/popover.stories.tsx +0 -113
  181. package/src/portal/Portal.stories.tsx +0 -102
  182. package/src/read-more/readmore.stories.tsx +0 -91
  183. package/src/skeleton/skeleton.stories.tsx +0 -130
  184. package/src/stepper/stepper.stories.tsx +0 -200
  185. package/src/table/stories/table-1.stories.tsx +0 -292
  186. package/src/table/stories/table-2-expandable.stories.tsx +0 -298
  187. package/src/table/stories/table-3-async.stories.tsx +0 -179
  188. package/src/table/stories/tests/table.stories.tsx +0 -102
  189. package/src/tabs/Tabs.stories.tsx +0 -311
  190. package/src/tag/tag.stories.tsx +0 -126
  191. package/src/timeline/timeline.stories.tsx +0 -445
  192. package/src/toggle-group/ToggleGroup.stories.tsx +0 -198
  193. package/src/tooltip/tooltip.stories.tsx +0 -101
  194. package/src/typography/stories/bodylong.stories.tsx +0 -209
  195. package/src/typography/stories/bodyshort.stories.tsx +0 -208
  196. package/src/typography/stories/detail.stories.tsx +0 -115
  197. package/src/typography/stories/error-message.stories.tsx +0 -122
  198. package/src/typography/stories/heading.stories.tsx +0 -169
  199. package/src/typography/stories/label.stories.tsx +0 -131
  200. 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
- };