@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,248 +0,0 @@
1
- import { Meta, StoryFn, StoryObj } from "@storybook/react";
2
- import React, { useEffect, useState } from "react";
3
- import { UploadIcon } from "@navikt/aksel-icons";
4
- import { UNSAFE_FileUpload as FileUpload, FileUploadItemProps } from ".";
5
- import { Alert } from "../../alert";
6
- import { Button } from "../../button";
7
- import { VStack } from "../../layout/stack";
8
- import { Heading } from "../../typography";
9
- import {
10
- FileObject,
11
- FileRejected,
12
- FileRejectionReason,
13
- } from "./FileUpload.types";
14
-
15
- const meta: Meta<typeof FileUpload.Dropzone> = {
16
- title: "ds-react/FileUpload",
17
- component: FileUpload.Dropzone,
18
- };
19
-
20
- export default meta;
21
-
22
- const MAX_FILES = 3;
23
- const MAX_SIZE_MB = 1;
24
- const MAX_SIZE = MAX_SIZE_MB * 1024 * 1024;
25
-
26
- const CustomItem = ({
27
- index,
28
- onDelete,
29
- ...props
30
- }: FileUploadItemProps & {
31
- index: number;
32
- onDelete: (event: React.MouseEvent<HTMLButtonElement>) => void;
33
- }) => {
34
- const [loading, setLoading] = useState(true);
35
-
36
- useEffect(() => {
37
- setTimeout(
38
- () => {
39
- setLoading(false);
40
- },
41
- 1700 * index + 1,
42
- );
43
- }, [index]);
44
-
45
- return (
46
- <FileUpload.Item
47
- {...props}
48
- status={loading ? "uploading" : "idle"}
49
- button={{
50
- action: "delete",
51
- onClick: onDelete,
52
- }}
53
- as="li"
54
- />
55
- );
56
- };
57
-
58
- export const Default: StoryFn = () => {
59
- const [files, setFiles] = useState<FileObject[]>([]);
60
-
61
- function addFiles(filesToAdd: FileObject[]) {
62
- setFiles([...files, ...filesToAdd]);
63
- }
64
-
65
- function removeFile(fileToRemove: FileObject) {
66
- setFiles(files.filter((file) => file !== fileToRemove));
67
- }
68
-
69
- const acceptedFiles = files.filter((file) => !file.error);
70
- const rejectedFiles = files.filter((f): f is FileRejected => f.error);
71
-
72
- return (
73
- <FileUpload style={{ width: 500, maxWidth: "100%", margin: "0 auto" }}>
74
- <VStack gap="6">
75
- <FileUpload.Dropzone
76
- label="Last opp filer til søknaden"
77
- description={`Maks størrelse ${MAX_SIZE_MB} MB`}
78
- accept=".doc,.docx,.xls,.xlsx,.pdf"
79
- maxSizeInBytes={MAX_SIZE}
80
- fileLimit={{ max: MAX_FILES, current: acceptedFiles.length }}
81
- onSelect={addFiles}
82
- />
83
-
84
- {getListError(acceptedFiles) && (
85
- <Alert variant="error">{getListError(acceptedFiles)}</Alert>
86
- )}
87
-
88
- {acceptedFiles.length > 0 && (
89
- <VStack gap="2">
90
- <Heading level="3" size="xsmall">
91
- {`Vedlegg (${acceptedFiles.length} av maks ${MAX_FILES})`}
92
- </Heading>
93
- <VStack as="ul" gap="3">
94
- {acceptedFiles.map((file, index) => (
95
- <CustomItem
96
- key={index}
97
- index={index}
98
- file={file.file}
99
- onDelete={() => removeFile(file)}
100
- />
101
- ))}
102
- </VStack>
103
- </VStack>
104
- )}
105
- {rejectedFiles.length > 0 && (
106
- <VStack gap="2">
107
- <Heading level="3" size="xsmall">
108
- Vedlegg med feil
109
- </Heading>
110
- <VStack as="ul" gap="3">
111
- {rejectedFiles.map((rejected, index) => (
112
- <CustomItem
113
- key={index}
114
- index={index}
115
- file={rejected.file}
116
- error={errors[rejected.reasons[0]]}
117
- onDelete={() => removeFile(rejected)}
118
- />
119
- ))}
120
- </VStack>
121
- </VStack>
122
- )}
123
- </VStack>
124
- </FileUpload>
125
- );
126
- };
127
- Default.parameters = {
128
- chromatic: { disable: true },
129
- layout: "padded",
130
- };
131
-
132
- const errors: Record<FileRejectionReason, string> = {
133
- fileType: "Filformatet støttes ikke",
134
- fileSize: `Filen er større enn ${MAX_SIZE_MB} MB`,
135
- };
136
-
137
- function getListError(acceptedFiles: FileObject[]) {
138
- const filesTooMany = acceptedFiles.length - MAX_FILES;
139
- if (filesTooMany === 1)
140
- return "Du har lagt ved en fil for mye, vennligst fjern en fil";
141
- if (filesTooMany > 1)
142
- return `Du har lagt ved ${filesTooMany} filer for mye, vennligst fjern ${filesTooMany} filer`;
143
- }
144
-
145
- export const Single: StoryFn = () => {
146
- const [files, setFiles] = useState<FileObject[]>([]);
147
-
148
- function addFiles(filesToAdd: FileObject[]) {
149
- setFiles(filesToAdd);
150
- }
151
-
152
- function removeFile() {
153
- setFiles([]);
154
- }
155
-
156
- return (
157
- <VStack gap="6" style={{ width: 500, maxWidth: "100%" }}>
158
- <FileUpload.Dropzone
159
- label="Last opp fil til søknaden"
160
- description={`Maks størrelse ${MAX_SIZE_MB} MB`}
161
- accept=".doc,.docx,.xls,.xlsx,.pdf"
162
- maxSizeInBytes={MAX_SIZE}
163
- fileLimit={{ max: 1, current: files.length }}
164
- multiple={false}
165
- onSelect={addFiles}
166
- />
167
- {files.map((file) => (
168
- <FileUpload.Item
169
- key={file.file.name}
170
- file={file.file}
171
- error={file.error ? errors[file.reasons[0]] : undefined}
172
- button={{
173
- action: "delete",
174
- onClick: removeFile,
175
- }}
176
- />
177
- ))}
178
- </VStack>
179
- );
180
- };
181
- Single.parameters = { chromatic: { disable: true } };
182
-
183
- export const Translation = () => (
184
- <FileUpload
185
- translations={{
186
- dropzone: {
187
- dragAndDropMultiple: "Dra og slipp bilder i format .png",
188
- buttonMultiple: "Velg bilder",
189
- or: "eventuelt",
190
- disabled: "Du kan ikke laste opp flere bilder",
191
- },
192
- item: {
193
- deleteButtonTitle: "Slett bilde",
194
- downloading: "Laster bilde...",
195
- uploading: "Laster opp bilde...",
196
- retryButtonTitle: "Last opp bilde på nytt",
197
- },
198
- }}
199
- >
200
- <VStack gap="3" style={{ width: 500, maxWidth: "100%" }}>
201
- <FileUpload.Dropzone label="Last opp bilder" onSelect={console.log} />
202
- <FileUpload.Item
203
- file={{ name: "eksempel.png", size: 200000 }}
204
- button={{
205
- action: "delete",
206
- onClick: () => null,
207
- }}
208
- />
209
- <FileUpload.Item
210
- file={{ name: "eksempel.png", size: 200000 }}
211
- button={{
212
- action: "retry",
213
- onClick: () => null,
214
- }}
215
- />
216
- <FileUpload.Item
217
- file={{ name: "eksempel.png", size: 200000 }}
218
- status="downloading"
219
- />
220
- <FileUpload.Item
221
- file={{ name: "eksempel.png", size: 200000 }}
222
- status="uploading"
223
- />
224
- <FileUpload.Item
225
- file={{ name: "eksempel.png", size: 200000 }}
226
- status="uploading"
227
- translations={{ uploading: "Sender bilde..." }}
228
- />
229
- </VStack>
230
- </FileUpload>
231
- );
232
-
233
- export const TriggerWithButton: StoryObj<typeof FileUpload.Trigger> = {
234
- render: (props) => {
235
- return (
236
- <FileUpload.Trigger {...props} onSelect={console.log}>
237
- <Button variant="secondary" icon={<UploadIcon aria-hidden />}>
238
- Last opp filer
239
- </Button>
240
- </FileUpload.Trigger>
241
- );
242
- },
243
- args: {
244
- multiple: true,
245
- accept: "",
246
- maxSizeInBytes: 0,
247
- },
248
- };
@@ -1,230 +0,0 @@
1
- import { Meta, StoryObj } from "@storybook/react";
2
- import React, { useState } from "react";
3
- import { Accordion } from "../../accordion";
4
- import AccordionContent from "../../accordion/AccordionContent";
5
- import AccordionHeader from "../../accordion/AccordionHeader";
6
- import AccordionItem from "../../accordion/AccordionItem";
7
- import Radio from "./Radio";
8
- import RadioGroup from "./RadioGroup";
9
-
10
- const meta: Meta<typeof Radio> = {
11
- title: "ds-react/Radio",
12
- component: Radio,
13
- argTypes: {
14
- size: {
15
- options: ["medium", "small"],
16
- control: { type: "radio" },
17
- },
18
- },
19
- parameters: {
20
- chromatic: { disable: true },
21
- },
22
- };
23
- export default meta;
24
-
25
- type Story = StoryObj<typeof Radio>;
26
-
27
- export const Default = (props) => {
28
- const [state, setState] = useState("radio1");
29
-
30
- return (
31
- <RadioGroup
32
- legend={props.legend}
33
- description={props.description}
34
- value={props.controlled ? state : undefined}
35
- onChange={props.controlled ? setState : undefined}
36
- hideLegend={props.hideLegend}
37
- error={props.error ? "Errormelding" : undefined}
38
- size={props?.size}
39
- >
40
- <Radio value="radio1">{props.children || "Apple"}</Radio>
41
- <Radio
42
- value="radio2"
43
- description={props.radioDescription ? "Orange description" : undefined}
44
- >
45
- {props.children || "Orange"}
46
- </Radio>
47
- <Radio value="radio3">{props.children || "Banana"}</Radio>
48
- <Radio value="radio4">{props.children || "Melon"}</Radio>
49
- </RadioGroup>
50
- );
51
- };
52
-
53
- Default.args = {
54
- controlled: false,
55
- error: false,
56
- size: "medium",
57
- legend: "Legend-tekst",
58
- radioDescription: false,
59
- hideLegend: false,
60
- children: "",
61
- description: "",
62
- };
63
-
64
- export const Group = () => (
65
- <RadioGroup legend="Group legend" defaultValue="tekst2">
66
- <Radio value="tekst">Radiotekst</Radio>
67
- <Radio value="tekst2">Radiotekst</Radio>
68
- </RadioGroup>
69
- );
70
-
71
- export const GroupError = () => {
72
- const [isValueSelected, setValueSelected] = useState(false);
73
- return (
74
- <>
75
- <button>Stop her</button>
76
- <RadioGroup
77
- legend="Velg din aldersgruppe"
78
- description="Informasjonen blir brukt for å gi deg bedre søketreff."
79
- error={!isValueSelected ? "Du må velge en aldersgruppe" : undefined}
80
- >
81
- <Radio onChange={() => setValueSelected(true)} value="0-20">
82
- 0-20 år
83
- </Radio>
84
- <Radio
85
- onChange={() => setValueSelected(true)}
86
- value="21-45"
87
- description="Gjelder fra året man blir 21"
88
- >
89
- 21-45 år
90
- </Radio>
91
- <Radio onChange={() => setValueSelected(true)} value="46-100">
92
- 46-100 år
93
- </Radio>
94
- </RadioGroup>
95
- </>
96
- );
97
- };
98
-
99
- export const GroupSmall = () => (
100
- <RadioGroup legend="Group legend" defaultValue="tekst2" size="small">
101
- <Radio value="tekst">Radiotekst</Radio>
102
- <Radio value="tekst2">Radiotekst</Radio>
103
- </RadioGroup>
104
- );
105
-
106
- export const GroupDescription = () => (
107
- <RadioGroup
108
- legend="Group legend"
109
- defaultValue="tekst2"
110
- description="Group description"
111
- >
112
- <Radio value="tekst" description="textdesc">
113
- Radiotekst
114
- </Radio>
115
- <Radio value="tekst2">Radiotekst</Radio>
116
- </RadioGroup>
117
- );
118
-
119
- export const UUDemo = () => (
120
- <div className="colgap">
121
- <RadioGroup
122
- legend="Hvilken frukt vil du ha?"
123
- description="Du kan bare velge en frukt"
124
- defaultValue="eple"
125
- readOnly
126
- >
127
- <Radio value="eple">Eple</Radio>
128
- <Radio value="banan" description="Bananer er importert fra X">
129
- Banan
130
- </Radio>
131
- <Radio value="druer">Druer</Radio>
132
- </RadioGroup>
133
- <RadioGroup
134
- legend="Når har du ferie?"
135
- defaultValue="1"
136
- readOnly
137
- error="du må velge en ferie"
138
- >
139
- <Radio value="1">August</Radio>
140
- <Radio value="2">Juli</Radio>
141
- <Radio value="3">Juni</Radio>
142
- </RadioGroup>
143
- </div>
144
- );
145
-
146
- /**
147
- * Added to test bug where Radio labels are sometimes omitted from accessibility tree in Chrome when inside of an Accordion.
148
- * It was not possible to replicate using a Storybook-test.
149
- *
150
- * See https://nav-it.slack.com/archives/C7NE7A8UF/p1695723000232659
151
- */
152
- export const TestInsideAccordion = () => (
153
- <Accordion>
154
- <AccordionItem>
155
- <AccordionHeader>Åpne for å velge</AccordionHeader>
156
- <AccordionContent>
157
- <RadioGroup legend="Velg én">
158
- <Radio value="1">Første valg</Radio>
159
- <Radio value="2">Andre valg</Radio>
160
- <Radio value="3">Tredje valg</Radio>
161
- </RadioGroup>
162
- </AccordionContent>
163
- </AccordionItem>
164
- </Accordion>
165
- );
166
-
167
- export const Readonly = () => (
168
- <div className="colgap">
169
- <RadioGroup
170
- legend="Hvilken frukt liker du?"
171
- defaultValue={["banan"]}
172
- readOnly
173
- >
174
- <Radio value="banan">Banan</Radio>
175
- <Radio value="eple">Eple</Radio>
176
- <Radio value="druer">Druer</Radio>
177
- </RadioGroup>
178
- <RadioGroup
179
- legend="Hvilken frukt liker du?"
180
- error="feilmelding"
181
- defaultValue="eple"
182
- readOnly
183
- >
184
- <Radio value="eple">Eple</Radio>
185
- <Radio value="banan">Banan</Radio>
186
- </RadioGroup>
187
- </div>
188
- );
189
-
190
- export const Chromatic: Story = {
191
- render: () => (
192
- <div>
193
- <div>
194
- <h2>Default</h2>
195
- <Default />
196
- </div>
197
- <div>
198
- <h2>Group</h2>
199
- <Group />
200
- </div>
201
- <div>
202
- <h2>GroupError</h2>
203
- <GroupError />
204
- </div>
205
- <div>
206
- <h2>GroupSmall</h2>
207
- <GroupSmall />
208
- </div>
209
- <div>
210
- <h2>GroupDescription</h2>
211
- <GroupDescription />
212
- </div>
213
- <div>
214
- <h2>UUDemo</h2>
215
- <UUDemo />
216
- </div>
217
- <div>
218
- <h2>TestInsideAccordion</h2>
219
- <TestInsideAccordion />
220
- </div>
221
- <div>
222
- <h2>Readonly</h2>
223
- <Readonly />
224
- </div>
225
- </div>
226
- ),
227
- parameters: {
228
- chromatic: { disable: false },
229
- },
230
- };
@@ -1,238 +0,0 @@
1
- import { Meta, StoryObj } from "@storybook/react";
2
- import React, { useState } from "react";
3
- import Search from "./Search";
4
-
5
- export default {
6
- title: "ds-react/Search",
7
- component: Search,
8
- argTypes: {
9
- clearButton: {
10
- control: {
11
- type: "boolean",
12
- },
13
- },
14
- size: {
15
- control: {
16
- type: "radio",
17
- options: ["medium", "small"],
18
- },
19
- },
20
- variant: {
21
- control: {
22
- type: "radio",
23
- options: ["primary", "secondary", "simple"],
24
- },
25
- },
26
- error: {
27
- control: {
28
- type: "text",
29
- },
30
- },
31
- },
32
- parameters: {
33
- chromatic: { disable: true },
34
- },
35
- } as Meta;
36
-
37
- type Story = StoryObj<typeof Search>;
38
-
39
- export const Default = (props) => {
40
- const [state, setState] = useState("");
41
- return (
42
- <div data-theme={props.darkmode ? "dark" : "light"}>
43
- <Search
44
- value={props.controlled ? state : undefined}
45
- onChange={props.controlled ? setState : undefined}
46
- label="Søk"
47
- size={props.size}
48
- clearButton={props.clearButton}
49
- variant={props.variant}
50
- hideLabel={props.hideLabel}
51
- error={props.error}
52
- onSearchClick={console.log}
53
- />
54
- </div>
55
- );
56
- };
57
- Default.args = {
58
- controlled: false,
59
- darkmode: false,
60
- hideLabel: true,
61
- };
62
-
63
- export const Small = () => (
64
- <div className="rowgap">
65
- <div className="colgap">
66
- <Search label="Søk" size="small" />
67
- <Search label="Søk" variant="secondary" size="small" />
68
- <Search label="Søk" variant="simple" size="small" />
69
- </div>
70
- <div className="colgap" data-theme="dark">
71
- <Search label="Søk" size="small" />
72
- <Search label="Søk" variant="secondary" size="small" />
73
- <Search label="Søk" variant="simple" size="small" />
74
- </div>
75
- </div>
76
- );
77
-
78
- export const Variants = () => (
79
- <div className="rowgap">
80
- <div className="colgap">
81
- <Search label="Søk" />
82
- <Search label="Søk" variant="secondary" />
83
- <Search label="Søk" variant="simple" />
84
- </div>
85
- <div className="colgap" data-theme="dark">
86
- <Search label="Søk" />
87
- <Search label="Søk" variant="secondary" />
88
- <Search label="Søk" variant="simple" />
89
- </div>
90
- </div>
91
- );
92
-
93
- export const ErrorVariants = () => (
94
- <div className="rowgap">
95
- <div className="colgap">
96
- <Search error="errormsg" label="Søk" />
97
- <Search error="errormsg" label="Søk" variant="secondary" />
98
- <Search error="errormsg" label="Søk" variant="simple" />
99
- </div>
100
- <div className="colgap" data-theme="dark">
101
- <Search error="errormsg" label="Søk" />
102
- <Search error="errormsg" label="Søk" variant="secondary" />
103
- <Search error="errormsg" label="Søk" variant="simple" />
104
- </div>
105
- </div>
106
- );
107
-
108
- export const Placeholder = () => (
109
- <div className="rowgap">
110
- <div className="colgap">
111
- <Search label="Søk" placeholder="Søk" />
112
- </div>
113
- <div className="colgap" data-theme="dark">
114
- <Search label="Søk" placeholder="Søk" />
115
- </div>
116
- </div>
117
- );
118
-
119
- export const Text = () => (
120
- <div className="rowgap">
121
- <div className="colgap">
122
- <Search label="Søk" value="Søketekst" />
123
- <Search label="Søk" variant="secondary" value="Søketekst" />
124
- <Search label="Søk" variant="simple" value="Søketekst" />
125
- </div>
126
- <div className="colgap" data-theme="dark">
127
- <Search label="Søk" value="Søketekst" />
128
- <Search label="Søk" variant="secondary" value="Søketekst" />
129
- <Search label="Søk" variant="simple" value="Søketekst" />
130
- </div>
131
- </div>
132
- );
133
-
134
- export const WLabel = () => (
135
- <div className="rowgap">
136
- <div className="colgap">
137
- <Search label="Label søk" variant="simple" hideLabel={false} />
138
- <Search
139
- label="Label søk"
140
- description="Description søk"
141
- variant="simple"
142
- hideLabel={false}
143
- />
144
- </div>
145
- <div className="colgap" data-theme="dark">
146
- <Search label="Label søk" variant="simple" hideLabel={false} />
147
- <Search
148
- label="Label søk"
149
- description="Description søk"
150
- variant="simple"
151
- hideLabel={false}
152
- />
153
- </div>
154
- </div>
155
- );
156
-
157
- export const NoClearButton = () => (
158
- <div className="colgap">
159
- <Search label="Label søk" clearButton={false} value="søketekst" />
160
- <Search
161
- label="Label søk"
162
- variant="simple"
163
- clearButton={false}
164
- value="søketekst"
165
- />
166
- </div>
167
- );
168
-
169
- export const HtmlSize = () => (
170
- <div className="colgap">
171
- <Search
172
- label="Lorem ipsum dolor sit amet"
173
- description="Saepe laborum delectus officia perferendis quaerat excepturi possimus hic enim dicta assumenda."
174
- hideLabel={false}
175
- htmlSize="20"
176
- />
177
- <Search
178
- label="Lorem ipsum dolor sit amet"
179
- description="Saepe laborum delectus officia perferendis quaerat excepturi possimus hic enim dicta assumenda."
180
- hideLabel={false}
181
- htmlSize="20"
182
- variant="secondary"
183
- />
184
- <Search
185
- label="Lorem ipsum dolor sit amet"
186
- description="Saepe laborum delectus officia perferendis quaerat excepturi possimus hic enim dicta assumenda."
187
- hideLabel={false}
188
- htmlSize="20"
189
- variant="simple"
190
- />
191
- </div>
192
- );
193
-
194
- export const Chromatic: Story = {
195
- render: (...props) => (
196
- <div>
197
- <div>
198
- <h2>Default</h2>
199
- <Default {...props} />
200
- </div>
201
- <div>
202
- <h2>Small</h2>
203
- <Small />
204
- </div>
205
- <div>
206
- <h2>Variants</h2>
207
- <Variants />
208
- </div>
209
- <div>
210
- <h2>ErrorVariants</h2>
211
- <ErrorVariants />
212
- </div>
213
- <div>
214
- <h2>Placeholder</h2>
215
- <Placeholder />
216
- </div>
217
- <div>
218
- <h2>Text</h2>
219
- <Text />
220
- </div>
221
- <div>
222
- <h2>WLabel</h2>
223
- <WLabel />
224
- </div>
225
- <div>
226
- <h2>NoClearButton</h2>
227
- <NoClearButton />
228
- </div>
229
- <div>
230
- <h2>HtmlSize</h2>
231
- <HtmlSize />
232
- </div>
233
- </div>
234
- ),
235
- parameters: {
236
- chromatic: { disable: false },
237
- },
238
- };