@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,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
- };