@navikt/ds-react 2.9.8 → 3.0.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.
- package/_docs.json +101 -0
- package/cjs/accordion/Accordion.js +8 -2
- package/cjs/accordion/AccordionContent.js +3 -3
- package/cjs/accordion/AccordionContext.js +10 -0
- package/cjs/accordion/AccordionHeader.js +14 -12
- package/cjs/accordion/AccordionItem.js +18 -5
- package/cjs/alert/Alert.js +5 -5
- package/cjs/chips/Removable.js +2 -2
- package/cjs/chips/Toggle.js +2 -2
- package/cjs/date/DateInput.js +2 -2
- package/cjs/date/datepicker/caption/Caption.js +3 -3
- package/cjs/date/datepicker/caption/DropdownCaption.js +3 -3
- package/cjs/date/monthpicker/MonthCaption.js +3 -3
- package/cjs/expansion-card/ExpansionCard.js +1 -1
- package/cjs/expansion-card/ExpansionCardDescription.js +1 -1
- package/cjs/form/Select.js +2 -2
- package/cjs/form/Switch.js +2 -2
- package/cjs/form/search/Search.js +3 -3
- package/cjs/form/search/SearchButton.js +2 -2
- package/cjs/help-text/HelpText.js +3 -3
- package/cjs/help-text/HelpTextIcon.js +20 -0
- package/cjs/link-panel/LinkPanel.js +2 -2
- package/cjs/modal/Modal.js +2 -2
- package/cjs/pagination/Pagination.js +4 -4
- package/cjs/read-more/ReadMore.js +5 -7
- package/cjs/stepper/Step.js +4 -2
- package/cjs/table/ColumnHeader.js +2 -2
- package/cjs/table/ExpandableRow.js +2 -3
- package/cjs/tabs/TabList.js +2 -2
- package/esm/accordion/Accordion.d.ts +12 -0
- package/esm/accordion/Accordion.js +8 -2
- package/esm/accordion/Accordion.js.map +1 -1
- package/esm/accordion/AccordionContent.js +3 -3
- package/esm/accordion/AccordionContent.js.map +1 -1
- package/esm/accordion/AccordionContext.d.ts +8 -0
- package/esm/accordion/AccordionContext.js +8 -0
- package/esm/accordion/AccordionContext.js.map +1 -0
- package/esm/accordion/AccordionHeader.js +14 -12
- package/esm/accordion/AccordionHeader.js.map +1 -1
- package/esm/accordion/AccordionItem.js +19 -6
- package/esm/accordion/AccordionItem.js.map +1 -1
- package/esm/alert/Alert.js +5 -5
- package/esm/alert/Alert.js.map +1 -1
- package/esm/chips/Removable.js +2 -2
- package/esm/chips/Removable.js.map +1 -1
- package/esm/chips/Toggle.js +2 -2
- package/esm/chips/Toggle.js.map +1 -1
- package/esm/date/DateInput.js +2 -2
- package/esm/date/DateInput.js.map +1 -1
- package/esm/date/datepicker/caption/Caption.js +3 -3
- package/esm/date/datepicker/caption/Caption.js.map +1 -1
- package/esm/date/datepicker/caption/DropdownCaption.js +3 -3
- package/esm/date/datepicker/caption/DropdownCaption.js.map +1 -1
- package/esm/date/monthpicker/MonthCaption.js +3 -3
- package/esm/date/monthpicker/MonthCaption.js.map +1 -1
- package/esm/expansion-card/ExpansionCard.js +1 -1
- package/esm/expansion-card/ExpansionCard.js.map +1 -1
- package/esm/expansion-card/ExpansionCardDescription.js +1 -1
- package/esm/expansion-card/ExpansionCardDescription.js.map +1 -1
- package/esm/form/Fieldset/useFieldset.d.ts +1 -1
- package/esm/form/Select.js +2 -2
- package/esm/form/Select.js.map +1 -1
- package/esm/form/Switch.js +2 -2
- package/esm/form/Switch.js.map +1 -1
- package/esm/form/checkbox/useCheckbox.d.ts +1 -1
- package/esm/form/radio/useRadio.d.ts +1 -1
- package/esm/form/search/Search.js +3 -3
- package/esm/form/search/Search.js.map +1 -1
- package/esm/form/search/SearchButton.js +2 -2
- package/esm/form/search/SearchButton.js.map +1 -1
- package/esm/form/useFormField.d.ts +1 -1
- package/esm/help-text/HelpText.js +3 -3
- package/esm/help-text/HelpText.js.map +1 -1
- package/esm/help-text/HelpTextIcon.d.ts +5 -0
- package/esm/help-text/HelpTextIcon.js +14 -0
- package/esm/help-text/HelpTextIcon.js.map +1 -0
- package/esm/link-panel/LinkPanel.js +2 -2
- package/esm/link-panel/LinkPanel.js.map +1 -1
- package/esm/modal/Modal.js +2 -2
- package/esm/modal/Modal.js.map +1 -1
- package/esm/pagination/Pagination.js +4 -4
- package/esm/pagination/Pagination.js.map +1 -1
- package/esm/read-more/ReadMore.js +5 -7
- package/esm/read-more/ReadMore.js.map +1 -1
- package/esm/stepper/Step.js +4 -2
- package/esm/stepper/Step.js.map +1 -1
- package/esm/table/ColumnHeader.js +2 -2
- package/esm/table/ColumnHeader.js.map +1 -1
- package/esm/table/ExpandableRow.js +2 -3
- package/esm/table/ExpandableRow.js.map +1 -1
- package/esm/tabs/TabList.js +3 -3
- package/esm/tabs/TabList.js.map +1 -1
- package/esm/util/index.d.ts +1 -1
- package/package.json +3 -3
- package/src/accordion/Accordion.tsx +43 -3
- package/src/accordion/AccordionContent.tsx +14 -11
- package/src/accordion/AccordionContext.tsx +15 -0
- package/src/accordion/AccordionHeader.tsx +20 -20
- package/src/accordion/AccordionItem.tsx +25 -6
- package/src/accordion/accordion.stories.tsx +217 -16
- package/src/alert/Alert.tsx +9 -9
- package/src/button/button.stories.tsx +8 -8
- package/src/chips/Removable.tsx +2 -2
- package/src/chips/Toggle.tsx +2 -2
- package/src/date/DateInput.tsx +2 -2
- package/src/date/datepicker/caption/Caption.tsx +3 -3
- package/src/date/datepicker/caption/DropdownCaption.tsx +3 -3
- package/src/date/monthpicker/MonthCaption.tsx +3 -3
- package/src/expansion-card/ExpansionCard.tsx +1 -1
- package/src/expansion-card/ExpansionCardDescription.tsx +1 -1
- package/src/form/Select.tsx +3 -2
- package/src/form/Switch.tsx +4 -5
- package/src/form/search/Search.tsx +6 -3
- package/src/form/search/SearchButton.tsx +2 -2
- package/src/help-text/HelpText.tsx +3 -6
- package/src/help-text/HelpTextIcon.tsx +45 -0
- package/src/link/link.stories.tsx +7 -5
- package/src/link-panel/LinkPanel.tsx +3 -2
- package/src/list/list.stories.tsx +9 -9
- package/src/modal/Modal.tsx +4 -3
- package/src/pagination/Pagination.tsx +5 -4
- package/src/read-more/ReadMore.tsx +14 -11
- package/src/read-more/readmore.stories.tsx +5 -2
- package/src/stepper/Step.tsx +22 -5
- package/src/stepper/stepper.stories.tsx +1 -3
- package/src/table/ColumnHeader.tsx +8 -4
- package/src/table/ExpandableRow.tsx +2 -6
- package/src/tabs/TabList.tsx +4 -4
- package/src/tabs/Tabs.stories.tsx +49 -25
- package/src/toggle-group/ToggleGroup.stories.tsx +12 -7
package/esm/tabs/TabList.js
CHANGED
|
@@ -9,11 +9,11 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
9
9
|
}
|
|
10
10
|
return t;
|
|
11
11
|
};
|
|
12
|
-
import {
|
|
12
|
+
import { ChevronLeftIcon, ChevronRightIcon } from "@navikt/aksel-icons";
|
|
13
13
|
import { TabsList } from "@radix-ui/react-tabs";
|
|
14
14
|
import cl from "clsx";
|
|
15
15
|
import React, { forwardRef, useContext, useEffect, useMemo, useRef, useState, } from "react";
|
|
16
|
-
import {
|
|
16
|
+
import { debounce, mergeRefs } from "..";
|
|
17
17
|
import { TabsContext } from "./Tabs";
|
|
18
18
|
export const TabList = forwardRef((_a, ref) => {
|
|
19
19
|
var { className } = _a, rest = __rest(_a, ["className"]);
|
|
@@ -71,7 +71,7 @@ export const TabList = forwardRef((_a, ref) => {
|
|
|
71
71
|
if (!listRef.current)
|
|
72
72
|
return;
|
|
73
73
|
listRef.current.scrollLeft += dir * 100;
|
|
74
|
-
} }, dir === -1 ? (React.createElement(
|
|
74
|
+
} }, dir === -1 ? (React.createElement(ChevronLeftIcon, { title: "scroll tilbake" })) : (React.createElement(ChevronRightIcon, { title: "scroll neste" }))));
|
|
75
75
|
const showSteppers = displayScroll.end || displayScroll.start;
|
|
76
76
|
return (React.createElement("div", { className: "navds-tabs__tablist-wrapper" },
|
|
77
77
|
showSteppers && (React.createElement(ScrollButton, { dir: -1, hidden: !displayScroll.start })),
|
package/esm/tabs/TabList.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TabList.js","sourceRoot":"","sources":["../../src/tabs/TabList.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"TabList.js","sourceRoot":"","sources":["../../src/tabs/TabList.tsx"],"names":[],"mappings":"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"}
|
package/esm/util/index.d.ts
CHANGED
|
@@ -9,5 +9,5 @@ export interface ListenerT {
|
|
|
9
9
|
addEventListener(name: string, handler: (event?: any) => void, ...args: any[]): any;
|
|
10
10
|
removeEventListener(name: string, handler: (event?: any) => void, ...args: any[]): any;
|
|
11
11
|
}
|
|
12
|
-
export declare const useEventListener: <T extends ListenerT>(name: Parameters<ListenerT["addEventListener"]>[0], handler: Parameters<ListenerT["addEventListener"]>[1], target?:
|
|
12
|
+
export declare const useEventListener: <T extends ListenerT>(name: Parameters<ListenerT["addEventListener"]>[0], handler: Parameters<ListenerT["addEventListener"]>[1], target?: T | Window | null) => void;
|
|
13
13
|
export declare const composeEventHandlers: <E>(originalEventHandler?: ((event: E) => void) | undefined, ourEventHandler?: ((event: E) => void) | undefined) => (event: E) => void;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@navikt/ds-react",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "Aksel react-components for NAV designsystem",
|
|
5
5
|
"author": "Aksel | NAV designsystem team",
|
|
6
6
|
"license": "MIT",
|
|
@@ -38,8 +38,8 @@
|
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
40
|
"@floating-ui/react": "0.17.0",
|
|
41
|
-
"@navikt/aksel-icons": "^
|
|
42
|
-
"@navikt/ds-icons": "^
|
|
41
|
+
"@navikt/aksel-icons": "^3.0.0",
|
|
42
|
+
"@navikt/ds-icons": "^3.0.0",
|
|
43
43
|
"@radix-ui/react-tabs": "1.0.0",
|
|
44
44
|
"@radix-ui/react-toggle-group": "1.0.0",
|
|
45
45
|
"clsx": "^1.2.1",
|
|
@@ -3,6 +3,7 @@ import React, { forwardRef } from "react";
|
|
|
3
3
|
import AccordionItem, { AccordionItemType } from "./AccordionItem";
|
|
4
4
|
import AccordionContent, { AccordionContentType } from "./AccordionContent";
|
|
5
5
|
import AccordionHeader, { AccordionHeaderType } from "./AccordionHeader";
|
|
6
|
+
import { AccordionContext } from "./AccordionContext";
|
|
6
7
|
|
|
7
8
|
interface AccordionComponent
|
|
8
9
|
extends React.ForwardRefExoticComponent<
|
|
@@ -14,6 +15,18 @@ interface AccordionComponent
|
|
|
14
15
|
}
|
|
15
16
|
|
|
16
17
|
export interface AccordionProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
18
|
+
/**
|
|
19
|
+
* @default 'default'
|
|
20
|
+
*/
|
|
21
|
+
variant?: "default" | "neutral";
|
|
22
|
+
/**
|
|
23
|
+
* @default 'large'
|
|
24
|
+
*/
|
|
25
|
+
headingSize?: "large" | "medium" | "small" | "xsmall";
|
|
26
|
+
/**
|
|
27
|
+
* @default "medium"
|
|
28
|
+
*/
|
|
29
|
+
size?: "large" | "medium" | "small";
|
|
17
30
|
/**
|
|
18
31
|
* Instances of Accordion.Item
|
|
19
32
|
*/
|
|
@@ -21,9 +34,36 @@ export interface AccordionProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
|
21
34
|
}
|
|
22
35
|
|
|
23
36
|
export const Accordion = forwardRef<HTMLDivElement, AccordionProps>(
|
|
24
|
-
(
|
|
25
|
-
|
|
26
|
-
|
|
37
|
+
(
|
|
38
|
+
{
|
|
39
|
+
className,
|
|
40
|
+
variant = "default",
|
|
41
|
+
headingSize = "medium",
|
|
42
|
+
size = "medium",
|
|
43
|
+
...rest
|
|
44
|
+
},
|
|
45
|
+
ref
|
|
46
|
+
) => {
|
|
47
|
+
return (
|
|
48
|
+
<AccordionContext.Provider
|
|
49
|
+
value={{
|
|
50
|
+
variant,
|
|
51
|
+
headingSize,
|
|
52
|
+
size,
|
|
53
|
+
}}
|
|
54
|
+
>
|
|
55
|
+
<div
|
|
56
|
+
{...rest}
|
|
57
|
+
className={cl(
|
|
58
|
+
"navds-accordion",
|
|
59
|
+
className,
|
|
60
|
+
`navds-accordion--${size}`
|
|
61
|
+
)}
|
|
62
|
+
ref={ref}
|
|
63
|
+
/>
|
|
64
|
+
</AccordionContext.Provider>
|
|
65
|
+
);
|
|
66
|
+
}
|
|
27
67
|
) as AccordionComponent;
|
|
28
68
|
|
|
29
69
|
Accordion.Header = AccordionHeader;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import cl from "clsx";
|
|
2
2
|
import React, { forwardRef, useContext } from "react";
|
|
3
|
-
import AnimateHeight from "../util/AnimateHeight";
|
|
4
3
|
import { BodyLong } from "../typography/BodyLong";
|
|
5
4
|
import { AccordionItemContext } from "./AccordionItem";
|
|
6
5
|
|
|
@@ -28,16 +27,20 @@ const AccordionContent: AccordionContentType = forwardRef(
|
|
|
28
27
|
}
|
|
29
28
|
|
|
30
29
|
return (
|
|
31
|
-
<
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
30
|
+
<BodyLong
|
|
31
|
+
{...rest}
|
|
32
|
+
as="div"
|
|
33
|
+
ref={ref}
|
|
34
|
+
className={cl(
|
|
35
|
+
"navds-accordion__content",
|
|
36
|
+
{
|
|
37
|
+
"navds-accordion__content--closed": !context.open,
|
|
38
|
+
},
|
|
39
|
+
className
|
|
40
|
+
)}
|
|
41
|
+
>
|
|
42
|
+
{children}
|
|
43
|
+
</BodyLong>
|
|
41
44
|
);
|
|
42
45
|
}
|
|
43
46
|
);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createContext } from "react";
|
|
2
|
+
|
|
3
|
+
export type AccordionContextProps = {
|
|
4
|
+
variant?: "default" | "neutral";
|
|
5
|
+
headingSize?: "large" | "medium" | "small" | "xsmall";
|
|
6
|
+
size?: "large" | "medium" | "small";
|
|
7
|
+
openItems?: number[];
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export const AccordionContext = createContext<AccordionContextProps | null>({
|
|
11
|
+
variant: "default",
|
|
12
|
+
headingSize: "small",
|
|
13
|
+
size: "medium",
|
|
14
|
+
openItems: [],
|
|
15
|
+
});
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { Expand, ExpandFilled } from "@navikt/ds-icons";
|
|
2
1
|
import cl from "clsx";
|
|
3
2
|
import React, { forwardRef, useContext } from "react";
|
|
4
3
|
import { Heading } from "../typography/Heading";
|
|
4
|
+
import { AccordionContext } from "./AccordionContext";
|
|
5
5
|
import { AccordionItemContext } from "./AccordionItem";
|
|
6
|
+
import { ChevronDownIcon } from "@navikt/aksel-icons";
|
|
6
7
|
|
|
7
8
|
export interface AccordionHeaderProps
|
|
8
9
|
extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
@@ -18,43 +19,42 @@ export type AccordionHeaderType = React.ForwardRefExoticComponent<
|
|
|
18
19
|
|
|
19
20
|
const AccordionHeader: AccordionHeaderType = forwardRef(
|
|
20
21
|
({ children, className, onClick, ...rest }, ref) => {
|
|
21
|
-
const
|
|
22
|
+
const itemContext = useContext(AccordionItemContext);
|
|
23
|
+
const accordionContext = useContext(AccordionContext);
|
|
22
24
|
|
|
23
|
-
if (
|
|
25
|
+
if (accordionContext === null || itemContext === null) {
|
|
24
26
|
console.error(
|
|
25
|
-
"<Accordion.Header> has to be used within an <Accordion.Item>"
|
|
27
|
+
"<Accordion.Header> has to be used within an <Accordion.Item>, which in turn must be within an <Accordion>"
|
|
26
28
|
);
|
|
27
29
|
return null;
|
|
28
30
|
}
|
|
29
31
|
|
|
30
|
-
const handleClick = (
|
|
31
|
-
e: React.MouseEvent<HTMLButtonElement, MouseEvent>
|
|
32
|
-
) => {
|
|
33
|
-
context.toggleOpen();
|
|
34
|
-
onClick && onClick(e);
|
|
35
|
-
};
|
|
36
|
-
|
|
37
32
|
return (
|
|
38
33
|
<button
|
|
39
|
-
{...rest}
|
|
40
34
|
ref={ref}
|
|
35
|
+
{...rest}
|
|
41
36
|
className={cl("navds-accordion__header", className)}
|
|
37
|
+
onClick={(e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
|
|
38
|
+
itemContext.toggleOpen();
|
|
39
|
+
onClick && onClick(e);
|
|
40
|
+
}}
|
|
41
|
+
aria-expanded={itemContext.open}
|
|
42
42
|
type="button"
|
|
43
|
-
onClick={handleClick}
|
|
44
|
-
aria-expanded={context.open}
|
|
45
43
|
>
|
|
44
|
+
<div className="navds-accordion__icon-wrapper">
|
|
45
|
+
<ChevronDownIcon
|
|
46
|
+
className="navds-accordion__header-chevron"
|
|
47
|
+
title="Vis mer"
|
|
48
|
+
aria-hidden
|
|
49
|
+
/>
|
|
50
|
+
</div>
|
|
46
51
|
<Heading
|
|
47
|
-
size="small"
|
|
52
|
+
size={accordionContext.headingSize ?? "small"}
|
|
48
53
|
as="span"
|
|
49
54
|
className="navds-accordion__header-content"
|
|
50
55
|
>
|
|
51
56
|
{children}
|
|
52
57
|
</Heading>
|
|
53
|
-
<Expand aria-hidden className="navds-accordion__expand-icon" />
|
|
54
|
-
<ExpandFilled
|
|
55
|
-
aria-hidden
|
|
56
|
-
className="navds-accordion__expand-icon navds-accordion__expand-icon--filled"
|
|
57
|
-
/>
|
|
58
58
|
</button>
|
|
59
59
|
);
|
|
60
60
|
}
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import cl from "clsx";
|
|
2
|
-
import React, {
|
|
2
|
+
import React, {
|
|
3
|
+
createContext,
|
|
4
|
+
forwardRef,
|
|
5
|
+
useContext,
|
|
6
|
+
useRef,
|
|
7
|
+
useState,
|
|
8
|
+
} from "react";
|
|
9
|
+
import { AccordionContext } from "./AccordionContext";
|
|
3
10
|
|
|
4
11
|
export interface AccordionItemProps
|
|
5
12
|
extends React.HTMLAttributes<HTMLDivElement> {
|
|
@@ -38,11 +45,27 @@ const AccordionItem: AccordionItemType = forwardRef(
|
|
|
38
45
|
ref
|
|
39
46
|
) => {
|
|
40
47
|
const [internalOpen, setInternalOpen] = useState<boolean>(defaultOpen);
|
|
48
|
+
const context = useContext(AccordionContext);
|
|
49
|
+
|
|
50
|
+
const [_open, _setOpen] = useState(defaultOpen);
|
|
51
|
+
const shouldAnimate = useRef<boolean>(!(Boolean(open) || defaultOpen));
|
|
52
|
+
const handleOpen = () => {
|
|
53
|
+
if (open === undefined) {
|
|
54
|
+
const newOpen = !_open;
|
|
55
|
+
_setOpen(newOpen);
|
|
56
|
+
setInternalOpen(newOpen);
|
|
57
|
+
} else {
|
|
58
|
+
setInternalOpen(!open);
|
|
59
|
+
}
|
|
60
|
+
shouldAnimate.current = true;
|
|
61
|
+
};
|
|
41
62
|
|
|
42
63
|
return (
|
|
43
64
|
<div
|
|
44
65
|
className={cl("navds-accordion__item", className, {
|
|
45
66
|
"navds-accordion__item--open": open ?? internalOpen,
|
|
67
|
+
"navds-accordion__item--neutral": context?.variant === "neutral",
|
|
68
|
+
"navds-accordion__item--no-animation": !shouldAnimate.current,
|
|
46
69
|
})}
|
|
47
70
|
ref={ref}
|
|
48
71
|
{...rest}
|
|
@@ -50,11 +73,7 @@ const AccordionItem: AccordionItemType = forwardRef(
|
|
|
50
73
|
<AccordionItemContext.Provider
|
|
51
74
|
value={{
|
|
52
75
|
open: open ?? internalOpen,
|
|
53
|
-
toggleOpen:
|
|
54
|
-
if (open === undefined) {
|
|
55
|
-
setInternalOpen((iOpen) => !iOpen);
|
|
56
|
-
}
|
|
57
|
-
},
|
|
76
|
+
toggleOpen: handleOpen,
|
|
58
77
|
}}
|
|
59
78
|
>
|
|
60
79
|
{children}
|
|
@@ -2,7 +2,8 @@ import React, { useState } from "react";
|
|
|
2
2
|
import AccordionContent from "./AccordionContent";
|
|
3
3
|
import AccordionHeader from "./AccordionHeader";
|
|
4
4
|
import AccordionItem from "./AccordionItem";
|
|
5
|
-
import { Accordion } from ".";
|
|
5
|
+
import { Accordion, AccordionProps } from ".";
|
|
6
|
+
import { Table } from "..";
|
|
6
7
|
|
|
7
8
|
export default {
|
|
8
9
|
title: "ds-react/Accordion",
|
|
@@ -12,6 +13,39 @@ export default {
|
|
|
12
13
|
AccordionContent,
|
|
13
14
|
AccordionHeader,
|
|
14
15
|
},
|
|
16
|
+
decorators: [
|
|
17
|
+
(Story) => (
|
|
18
|
+
<div
|
|
19
|
+
style={{
|
|
20
|
+
width: "600px",
|
|
21
|
+
minHeight: "100vh",
|
|
22
|
+
padding: "10rem 0",
|
|
23
|
+
display: "flex",
|
|
24
|
+
flexDirection: "column",
|
|
25
|
+
gap: "1rem",
|
|
26
|
+
}}
|
|
27
|
+
>
|
|
28
|
+
<Story />
|
|
29
|
+
</div>
|
|
30
|
+
),
|
|
31
|
+
],
|
|
32
|
+
argTypes: {
|
|
33
|
+
variant: {
|
|
34
|
+
options: ["default", "neutral"],
|
|
35
|
+
control: { type: "select" },
|
|
36
|
+
},
|
|
37
|
+
headingSize: {
|
|
38
|
+
options: ["large", "medium", "small", "xsmall"],
|
|
39
|
+
control: { type: "select" },
|
|
40
|
+
},
|
|
41
|
+
size: {
|
|
42
|
+
options: ["large", "medium", "small"],
|
|
43
|
+
control: { type: "select" },
|
|
44
|
+
},
|
|
45
|
+
nItems: {
|
|
46
|
+
control: { type: "number" },
|
|
47
|
+
},
|
|
48
|
+
},
|
|
15
49
|
};
|
|
16
50
|
|
|
17
51
|
const Content = () => (
|
|
@@ -32,9 +66,25 @@ const Content = () => (
|
|
|
32
66
|
</Accordion.Content>
|
|
33
67
|
);
|
|
34
68
|
|
|
69
|
+
const SmallContent = () => (
|
|
70
|
+
<Accordion.Content>
|
|
71
|
+
Magna aliquip aliquip fugiat nostrud <a href="#Lorem">Lorem est</a> pariatur
|
|
72
|
+
veniam officia laboris voluptate officia pariatur.ex anim
|
|
73
|
+
</Accordion.Content>
|
|
74
|
+
);
|
|
75
|
+
|
|
35
76
|
const Item = (props) => {
|
|
36
77
|
const [open, setOpen] = useState(false);
|
|
37
78
|
|
|
79
|
+
if (props.defaultOpen) {
|
|
80
|
+
return (
|
|
81
|
+
<Accordion.Item defaultOpen={props.defaultOpen}>
|
|
82
|
+
<Accordion.Header>Accordion header text</Accordion.Header>
|
|
83
|
+
<SmallContent />
|
|
84
|
+
</Accordion.Item>
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
38
88
|
return props.controlled ? (
|
|
39
89
|
<Accordion.Item open={open}>
|
|
40
90
|
<Accordion.Header onClick={() => setOpen(!open)}>
|
|
@@ -51,11 +101,11 @@ const Item = (props) => {
|
|
|
51
101
|
};
|
|
52
102
|
|
|
53
103
|
export const Default = {
|
|
54
|
-
render: (props) => {
|
|
104
|
+
render: ({ nItems, ...props }) => {
|
|
55
105
|
return (
|
|
56
106
|
<div style={{ width: 500 }}>
|
|
57
|
-
<Accordion>
|
|
58
|
-
{[...Array(
|
|
107
|
+
<Accordion {...props}>
|
|
108
|
+
{[...Array(nItems ? nItems : 2)].map((_, y) => (
|
|
59
109
|
<Item key={y} {...props} />
|
|
60
110
|
))}
|
|
61
111
|
</Accordion>
|
|
@@ -64,18 +114,62 @@ export const Default = {
|
|
|
64
114
|
},
|
|
65
115
|
|
|
66
116
|
args: {
|
|
67
|
-
controlled: false,
|
|
117
|
+
controlled: "false",
|
|
68
118
|
nItems: 2,
|
|
119
|
+
variant: "default",
|
|
120
|
+
headingSize: "medium",
|
|
121
|
+
size: "medium",
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
export const DefaultOpen = {
|
|
126
|
+
render: ({ nItems, openItems, ...props }) => {
|
|
127
|
+
return (
|
|
128
|
+
<div style={{ width: 500 }}>
|
|
129
|
+
<Accordion {...props}>
|
|
130
|
+
{[...Array(nItems ? nItems : 2)].map((_, y) => (
|
|
131
|
+
<Item key={y} defaultOpen={openItems.includes(y)} {...props} />
|
|
132
|
+
))}
|
|
133
|
+
</Accordion>
|
|
134
|
+
</div>
|
|
135
|
+
);
|
|
136
|
+
},
|
|
137
|
+
|
|
138
|
+
args: {
|
|
139
|
+
openItems: [1, 2],
|
|
140
|
+
controlled: "false",
|
|
141
|
+
nItems: 5,
|
|
142
|
+
variant: "neutral",
|
|
143
|
+
headingSize: "large",
|
|
69
144
|
},
|
|
70
145
|
};
|
|
71
146
|
|
|
72
|
-
export const
|
|
147
|
+
export const Variants = {
|
|
148
|
+
render: () => {
|
|
149
|
+
return (
|
|
150
|
+
<div style={{ width: 500 }} className="colgap">
|
|
151
|
+
<Accordion>
|
|
152
|
+
{[...Array(2)].map((_, y) => (
|
|
153
|
+
<Item key={y} defaultOpen />
|
|
154
|
+
))}
|
|
155
|
+
</Accordion>
|
|
156
|
+
<Accordion variant="neutral">
|
|
157
|
+
{[...Array(2)].map((_, y) => (
|
|
158
|
+
<Item key={y} defaultOpen />
|
|
159
|
+
))}
|
|
160
|
+
</Accordion>
|
|
161
|
+
</div>
|
|
162
|
+
);
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
export const Controlled = (props) => {
|
|
73
167
|
const [open, setOpen] = useState(false);
|
|
74
168
|
const [open2, setOpen2] = useState(false);
|
|
75
169
|
|
|
76
170
|
return (
|
|
77
171
|
<div style={{ width: 500 }}>
|
|
78
|
-
<Accordion>
|
|
172
|
+
<Accordion {...props}>
|
|
79
173
|
<Accordion.Item open={open}>
|
|
80
174
|
<Accordion.Header onClick={() => setOpen(!open)}>
|
|
81
175
|
Accordion header text
|
|
@@ -93,17 +187,124 @@ export const Controlled = () => {
|
|
|
93
187
|
);
|
|
94
188
|
};
|
|
95
189
|
|
|
96
|
-
export const
|
|
97
|
-
|
|
98
|
-
|
|
190
|
+
export const WithTable = {
|
|
191
|
+
render: (props) => {
|
|
192
|
+
const ExampleTable = () => {
|
|
193
|
+
return (
|
|
194
|
+
<Table>
|
|
195
|
+
<Table.Header>
|
|
196
|
+
<Table.Row>
|
|
197
|
+
<Table.HeaderCell>ID</Table.HeaderCell>
|
|
198
|
+
<Table.HeaderCell>Fornavn</Table.HeaderCell>
|
|
199
|
+
<Table.HeaderCell>Etternavn</Table.HeaderCell>
|
|
200
|
+
<Table.HeaderCell>Rolle</Table.HeaderCell>
|
|
201
|
+
</Table.Row>
|
|
202
|
+
</Table.Header>
|
|
203
|
+
<Table.Body>
|
|
204
|
+
<Table.Row>
|
|
205
|
+
<Table.HeaderCell>1</Table.HeaderCell>
|
|
206
|
+
<Table.DataCell>Jean-Luc</Table.DataCell>
|
|
207
|
+
<Table.DataCell>Picard</Table.DataCell>
|
|
208
|
+
<Table.DataCell>Kaptein</Table.DataCell>
|
|
209
|
+
</Table.Row>
|
|
210
|
+
<Table.Row>
|
|
211
|
+
<Table.HeaderCell>2</Table.HeaderCell>
|
|
212
|
+
<Table.DataCell>William</Table.DataCell>
|
|
213
|
+
<Table.DataCell>Riker</Table.DataCell>
|
|
214
|
+
<Table.DataCell>Kommandør</Table.DataCell>
|
|
215
|
+
</Table.Row>
|
|
216
|
+
<Table.Row>
|
|
217
|
+
<Table.HeaderCell>3</Table.HeaderCell>
|
|
218
|
+
<Table.DataCell>Geordi</Table.DataCell>
|
|
219
|
+
<Table.DataCell>La Forge</Table.DataCell>
|
|
220
|
+
<Table.DataCell>Sjefsingeniør</Table.DataCell>
|
|
221
|
+
</Table.Row>
|
|
222
|
+
</Table.Body>
|
|
223
|
+
</Table>
|
|
224
|
+
);
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
const ContentWithTable = () => {
|
|
228
|
+
return (
|
|
229
|
+
<Accordion.Content>
|
|
230
|
+
<ExampleTable />
|
|
231
|
+
</Accordion.Content>
|
|
232
|
+
);
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
return (
|
|
236
|
+
<div style={{ width: 500 }}>
|
|
237
|
+
<Accordion {...props}>
|
|
238
|
+
<Accordion.Item>
|
|
239
|
+
<Accordion.Header>Table of people</Accordion.Header>
|
|
240
|
+
<ContentWithTable />
|
|
241
|
+
</Accordion.Item>
|
|
242
|
+
<Accordion.Item>
|
|
243
|
+
<Accordion.Header>Table of people</Accordion.Header>
|
|
244
|
+
<ContentWithTable />
|
|
245
|
+
</Accordion.Item>
|
|
246
|
+
</Accordion>
|
|
247
|
+
</div>
|
|
248
|
+
);
|
|
249
|
+
},
|
|
250
|
+
|
|
251
|
+
args: {
|
|
252
|
+
variant: "default",
|
|
253
|
+
headingSize: "large",
|
|
254
|
+
},
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
const SingleHeaderAccordion = ({
|
|
258
|
+
size = "medium",
|
|
259
|
+
headingSize = "medium",
|
|
260
|
+
}: Partial<AccordionProps>) => {
|
|
261
|
+
return (
|
|
262
|
+
<Accordion size={size} headingSize={headingSize}>
|
|
99
263
|
<Accordion.Item>
|
|
100
|
-
<Accordion.Header>
|
|
101
|
-
<Content
|
|
264
|
+
<Accordion.Header>{`${size} size + ${headingSize} heading`}</Accordion.Header>
|
|
265
|
+
<Accordion.Content>a</Accordion.Content>
|
|
102
266
|
</Accordion.Item>
|
|
103
267
|
<Accordion.Item>
|
|
104
|
-
<Accordion.Header>
|
|
105
|
-
<Content
|
|
268
|
+
<Accordion.Header>{`${size} size + ${headingSize} heading`}</Accordion.Header>
|
|
269
|
+
<Accordion.Content>a</Accordion.Content>
|
|
106
270
|
</Accordion.Item>
|
|
107
271
|
</Accordion>
|
|
108
|
-
|
|
109
|
-
|
|
272
|
+
);
|
|
273
|
+
};
|
|
274
|
+
|
|
275
|
+
type sizesType = "large" | "medium" | "small";
|
|
276
|
+
type headingSizesType = "large" | "medium" | "small" | "xsmall";
|
|
277
|
+
const sizes: sizesType[] = ["large", "medium", "small"];
|
|
278
|
+
const headingSizes: headingSizesType[] = ["large", "medium", "small", "xsmall"]; // enum this?!
|
|
279
|
+
|
|
280
|
+
export const Size = {
|
|
281
|
+
render: ({ ...props }) => {
|
|
282
|
+
return (
|
|
283
|
+
<div style={{ width: 500 }} className="colgap">
|
|
284
|
+
{sizes.map((element) => (
|
|
285
|
+
<SingleHeaderAccordion size={element} {...props} />
|
|
286
|
+
))}
|
|
287
|
+
</div>
|
|
288
|
+
);
|
|
289
|
+
},
|
|
290
|
+
|
|
291
|
+
args: {
|
|
292
|
+
variant: "neutral",
|
|
293
|
+
},
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
export const HeadingSize = {
|
|
297
|
+
render: ({ ...props }) => {
|
|
298
|
+
return (
|
|
299
|
+
<div style={{ width: 500 }} className="colgap">
|
|
300
|
+
{headingSizes.map((element) => (
|
|
301
|
+
<SingleHeaderAccordion headingSize={element} {...props} />
|
|
302
|
+
))}
|
|
303
|
+
</div>
|
|
304
|
+
);
|
|
305
|
+
},
|
|
306
|
+
|
|
307
|
+
args: {
|
|
308
|
+
variant: "neutral",
|
|
309
|
+
},
|
|
310
|
+
};
|
package/src/alert/Alert.tsx
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
} from "@navikt/
|
|
2
|
+
InformationSquareFillIcon,
|
|
3
|
+
CheckmarkCircleFillIcon,
|
|
4
|
+
ExclamationmarkTriangleFillIcon,
|
|
5
|
+
XMarkOctagonFillIcon,
|
|
6
|
+
} from "@navikt/aksel-icons";
|
|
7
7
|
import cl from "clsx";
|
|
8
8
|
import React, { forwardRef } from "react";
|
|
9
9
|
import { BodyLong } from "../typography/BodyLong";
|
|
@@ -37,13 +37,13 @@ export interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
|
37
37
|
const Icon = ({ variant, ...props }) => {
|
|
38
38
|
switch (variant) {
|
|
39
39
|
case "error":
|
|
40
|
-
return <
|
|
40
|
+
return <XMarkOctagonFillIcon title="Feil" {...props} />;
|
|
41
41
|
case "warning":
|
|
42
|
-
return <
|
|
42
|
+
return <ExclamationmarkTriangleFillIcon title="Advarsel" {...props} />;
|
|
43
43
|
case "info":
|
|
44
|
-
return <
|
|
44
|
+
return <InformationSquareFillIcon title="Informasjon" {...props} />;
|
|
45
45
|
case "success":
|
|
46
|
-
return <
|
|
46
|
+
return <CheckmarkCircleFillIcon title="Suksess" {...props} />;
|
|
47
47
|
default:
|
|
48
48
|
return null;
|
|
49
49
|
}
|