@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.
- package/cjs/collapsible/Collapsible.context.d.ts +48 -0
- package/cjs/collapsible/Collapsible.context.js +10 -0
- package/cjs/collapsible/Collapsible.context.js.map +1 -0
- package/cjs/collapsible/Collapsible.d.ts +48 -0
- package/cjs/collapsible/Collapsible.js +91 -0
- package/cjs/collapsible/Collapsible.js.map +1 -0
- package/cjs/collapsible/Collapsible.types.d.ts +19 -0
- package/cjs/collapsible/Collapsible.types.js +3 -0
- package/cjs/collapsible/Collapsible.types.js.map +1 -0
- package/cjs/collapsible/index.d.ts +3 -0
- package/cjs/collapsible/index.js +14 -0
- package/cjs/collapsible/index.js.map +1 -0
- package/cjs/collapsible/parts/Collapsible.Content.d.ts +10 -0
- package/cjs/collapsible/parts/Collapsible.Content.js +48 -0
- package/cjs/collapsible/parts/Collapsible.Content.js.map +1 -0
- package/cjs/collapsible/parts/Collapsible.Trigger.d.ts +10 -0
- package/cjs/collapsible/parts/Collapsible.Trigger.js +49 -0
- package/cjs/collapsible/parts/Collapsible.Trigger.js.map +1 -0
- package/cjs/form/combobox/FilteredOptions/filteredOptionsContext.js +2 -4
- package/cjs/form/combobox/FilteredOptions/filteredOptionsContext.js.map +1 -1
- package/cjs/form/combobox/Input/Input.js +6 -1
- package/cjs/form/combobox/Input/Input.js.map +1 -1
- package/cjs/form/form-summary/FormSummary.d.ts +82 -0
- package/cjs/form/form-summary/FormSummary.js +81 -0
- package/cjs/form/form-summary/FormSummary.js.map +1 -0
- package/cjs/form/form-summary/FormSummaryAnswer.d.ts +11 -0
- package/cjs/form/form-summary/FormSummaryAnswer.js +25 -0
- package/cjs/form/form-summary/FormSummaryAnswer.js.map +1 -0
- package/cjs/form/form-summary/FormSummaryAnswers.d.ts +9 -0
- package/cjs/form/form-summary/FormSummaryAnswers.js +48 -0
- package/cjs/form/form-summary/FormSummaryAnswers.js.map +1 -0
- package/cjs/form/form-summary/FormSummaryEditLink.d.ts +17 -0
- package/cjs/form/form-summary/FormSummaryEditLink.js +49 -0
- package/cjs/form/form-summary/FormSummaryEditLink.js.map +1 -0
- package/cjs/form/form-summary/FormSummaryHeader.d.ts +9 -0
- package/cjs/form/form-summary/FormSummaryHeader.js +48 -0
- package/cjs/form/form-summary/FormSummaryHeader.js.map +1 -0
- package/cjs/form/form-summary/FormSummaryHeading.d.ts +14 -0
- package/cjs/form/form-summary/FormSummaryHeading.js +31 -0
- package/cjs/form/form-summary/FormSummaryHeading.js.map +1 -0
- package/cjs/form/form-summary/FormSummaryLabel.d.ts +6 -0
- package/cjs/form/form-summary/FormSummaryLabel.js +45 -0
- package/cjs/form/form-summary/FormSummaryLabel.js.map +1 -0
- package/cjs/form/form-summary/FormSummaryValue.d.ts +6 -0
- package/cjs/form/form-summary/FormSummaryValue.js +49 -0
- package/cjs/form/form-summary/FormSummaryValue.js.map +1 -0
- package/cjs/form/form-summary/index.d.ts +8 -0
- package/cjs/form/form-summary/index.js +24 -0
- package/cjs/form/form-summary/index.js.map +1 -0
- package/cjs/index.d.ts +3 -2
- package/cjs/index.js +5 -3
- package/cjs/index.js.map +1 -1
- package/cjs/layout/stack/Spacer.js +1 -1
- package/cjs/layout/stack/Spacer.js.map +1 -1
- package/cjs/util/hooks/descendants/descendant.js +10 -1
- package/cjs/util/hooks/descendants/descendant.js.map +1 -1
- package/cjs/util/hooks/descendants/useDescendant.js +0 -5
- package/cjs/util/hooks/descendants/useDescendant.js.map +1 -1
- package/esm/collapsible/Collapsible.context.d.ts +48 -0
- package/esm/collapsible/Collapsible.context.js +6 -0
- package/esm/collapsible/Collapsible.context.js.map +1 -0
- package/esm/collapsible/Collapsible.d.ts +48 -0
- package/esm/collapsible/Collapsible.js +62 -0
- package/esm/collapsible/Collapsible.js.map +1 -0
- package/esm/collapsible/Collapsible.types.d.ts +19 -0
- package/esm/collapsible/Collapsible.types.js +2 -0
- package/esm/collapsible/Collapsible.types.js.map +1 -0
- package/esm/collapsible/index.d.ts +3 -0
- package/esm/collapsible/index.js +5 -0
- package/esm/collapsible/index.js.map +1 -0
- package/esm/collapsible/parts/Collapsible.Content.d.ts +10 -0
- package/esm/collapsible/parts/Collapsible.Content.js +22 -0
- package/esm/collapsible/parts/Collapsible.Content.js.map +1 -0
- package/esm/collapsible/parts/Collapsible.Trigger.d.ts +10 -0
- package/esm/collapsible/parts/Collapsible.Trigger.js +23 -0
- package/esm/collapsible/parts/Collapsible.Trigger.js.map +1 -0
- package/esm/form/combobox/FilteredOptions/filteredOptionsContext.js +2 -4
- package/esm/form/combobox/FilteredOptions/filteredOptionsContext.js.map +1 -1
- package/esm/form/combobox/Input/Input.js +6 -1
- package/esm/form/combobox/Input/Input.js.map +1 -1
- package/esm/form/form-summary/FormSummary.d.ts +82 -0
- package/esm/form/form-summary/FormSummary.js +52 -0
- package/esm/form/form-summary/FormSummary.js.map +1 -0
- package/esm/form/form-summary/FormSummaryAnswer.d.ts +11 -0
- package/esm/form/form-summary/FormSummaryAnswer.js +19 -0
- package/esm/form/form-summary/FormSummaryAnswer.js.map +1 -0
- package/esm/form/form-summary/FormSummaryAnswers.d.ts +9 -0
- package/esm/form/form-summary/FormSummaryAnswers.js +19 -0
- package/esm/form/form-summary/FormSummaryAnswers.js.map +1 -0
- package/esm/form/form-summary/FormSummaryEditLink.d.ts +17 -0
- package/esm/form/form-summary/FormSummaryEditLink.js +20 -0
- package/esm/form/form-summary/FormSummaryEditLink.js.map +1 -0
- package/esm/form/form-summary/FormSummaryHeader.d.ts +9 -0
- package/esm/form/form-summary/FormSummaryHeader.js +19 -0
- package/esm/form/form-summary/FormSummaryHeader.js.map +1 -0
- package/esm/form/form-summary/FormSummaryHeading.d.ts +14 -0
- package/esm/form/form-summary/FormSummaryHeading.js +5 -0
- package/esm/form/form-summary/FormSummaryHeading.js.map +1 -0
- package/esm/form/form-summary/FormSummaryLabel.d.ts +6 -0
- package/esm/form/form-summary/FormSummaryLabel.js +19 -0
- package/esm/form/form-summary/FormSummaryLabel.js.map +1 -0
- package/esm/form/form-summary/FormSummaryValue.d.ts +6 -0
- package/esm/form/form-summary/FormSummaryValue.js +20 -0
- package/esm/form/form-summary/FormSummaryValue.js.map +1 -0
- package/esm/form/form-summary/index.d.ts +8 -0
- package/esm/form/form-summary/index.js +10 -0
- package/esm/form/form-summary/index.js.map +1 -0
- package/esm/index.d.ts +3 -2
- package/esm/index.js +2 -1
- package/esm/index.js.map +1 -1
- package/esm/layout/stack/Spacer.js +1 -1
- package/esm/layout/stack/Spacer.js.map +1 -1
- package/esm/util/hooks/descendants/descendant.js +10 -1
- package/esm/util/hooks/descendants/descendant.js.map +1 -1
- package/esm/util/hooks/descendants/useDescendant.js +0 -5
- package/esm/util/hooks/descendants/useDescendant.js.map +1 -1
- package/package.json +15 -4
- package/src/collapsible/Collapsible.context.tsx +32 -0
- package/src/collapsible/Collapsible.tsx +100 -0
- package/src/collapsible/Collapsible.types.ts +19 -0
- package/src/collapsible/index.ts +10 -0
- package/src/collapsible/parts/Collapsible.Content.tsx +39 -0
- package/src/collapsible/parts/Collapsible.Trigger.tsx +42 -0
- package/src/form/combobox/FilteredOptions/filteredOptionsContext.tsx +9 -1
- package/src/form/combobox/Input/Input.tsx +5 -0
- package/src/form/form-summary/FormSummary.tsx +106 -0
- package/src/form/form-summary/FormSummaryAnswer.tsx +27 -0
- package/src/form/form-summary/FormSummaryAnswers.tsx +25 -0
- package/src/form/form-summary/FormSummaryEditLink.tsx +35 -0
- package/src/form/form-summary/FormSummaryHeader.tsx +25 -0
- package/src/form/form-summary/FormSummaryHeading.tsx +23 -0
- package/src/form/form-summary/FormSummaryLabel.tsx +17 -0
- package/src/form/form-summary/FormSummaryValue.tsx +24 -0
- package/src/form/form-summary/index.ts +30 -0
- package/src/index.ts +16 -15
- package/src/layout/stack/Spacer.tsx +1 -1
- package/src/util/hooks/descendants/descendant.ts +15 -1
- package/src/util/hooks/descendants/useDescendant.tsx +0 -5
- package/src/accordion/accordion.stories.tsx +0 -286
- package/src/alert/alert.stories.tsx +0 -306
- package/src/button/button.stories.tsx +0 -185
- package/src/chat/chat.stories.tsx +0 -341
- package/src/chips/chips.stories.tsx +0 -260
- package/src/copybutton/copy-button.stories.tsx +0 -261
- package/src/date/datepicker/datepicker.stories.tsx +0 -614
- package/src/date/monthpicker/monthpicker.stories.tsx +0 -221
- package/src/dropdown/dropdown.stories.tsx +0 -124
- package/src/expansion-card/expansion-card.stories.tsx +0 -282
- package/src/form/checkbox/checkbox.stories.tsx +0 -281
- package/src/form/combobox/combobox.stories.tsx +0 -626
- package/src/form/confirmation-panel/confirmation-panel.stories.tsx +0 -128
- package/src/form/error-summary/error-summary.stories.tsx +0 -81
- package/src/form/fieldset/fieldset.stories.tsx +0 -157
- package/src/form/file-upload/file-upload-dropzone.stories.tsx +0 -123
- package/src/form/file-upload/file-upload-item.stories.tsx +0 -148
- package/src/form/file-upload/file-upload.stories.tsx +0 -248
- package/src/form/radio/radio.stories.tsx +0 -230
- package/src/form/search/search.stories.tsx +0 -238
- package/src/form/select/select.stories.tsx +0 -172
- package/src/form/switch/switch.stories.tsx +0 -171
- package/src/form/textarea/textarea.stories.tsx +0 -254
- package/src/form/textfield/text-field.stories.tsx +0 -143
- package/src/guide-panel/guidepanel.stories.tsx +0 -90
- package/src/help-text/help-text.stories.tsx +0 -91
- package/src/internal-header/header.stories.tsx +0 -229
- package/src/layout/bleed/Bleed.stories.tsx +0 -395
- package/src/layout/box/Box.stories.tsx +0 -380
- package/src/layout/grid/h-grid.stories.tsx +0 -122
- package/src/layout/page/Page.stories.tsx +0 -271
- package/src/layout/responsive/hide.stories.tsx +0 -80
- package/src/layout/responsive/show.stories.tsx +0 -80
- package/src/layout/sidemal-test/navno-sidemal.stories.tsx +0 -69
- package/src/layout/stack/stack.stories.tsx +0 -183
- package/src/link/stories/link.stories.tsx +0 -304
- package/src/link-panel/link-panel.stories.tsx +0 -59
- package/src/list/list.stories.tsx +0 -280
- package/src/loader/loader.stories.tsx +0 -82
- package/src/modal/modal.stories.tsx +0 -391
- package/src/pagination/pagination.stories.tsx +0 -110
- package/src/popover/popover.stories.tsx +0 -113
- package/src/portal/Portal.stories.tsx +0 -102
- package/src/read-more/readmore.stories.tsx +0 -91
- package/src/skeleton/skeleton.stories.tsx +0 -130
- package/src/stepper/stepper.stories.tsx +0 -200
- package/src/table/stories/table-1.stories.tsx +0 -292
- package/src/table/stories/table-2-expandable.stories.tsx +0 -298
- package/src/table/stories/table-3-async.stories.tsx +0 -179
- package/src/table/stories/tests/table.stories.tsx +0 -102
- package/src/tabs/Tabs.stories.tsx +0 -311
- package/src/tag/tag.stories.tsx +0 -126
- package/src/timeline/timeline.stories.tsx +0 -445
- package/src/toggle-group/ToggleGroup.stories.tsx +0 -198
- package/src/tooltip/tooltip.stories.tsx +0 -101
- package/src/typography/stories/bodylong.stories.tsx +0 -209
- package/src/typography/stories/bodyshort.stories.tsx +0 -208
- package/src/typography/stories/detail.stories.tsx +0 -115
- package/src/typography/stories/error-message.stories.tsx +0 -122
- package/src/typography/stories/heading.stories.tsx +0 -169
- package/src/typography/stories/label.stories.tsx +0 -131
- 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
|
-
};
|