@navikt/ds-react 0.19.8 → 0.19.11

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 (50) hide show
  1. package/_docs.json +20 -1
  2. package/cjs/form/Textarea.js +12 -4
  3. package/cjs/form/error-summary/ErrorSummary.js +4 -2
  4. package/cjs/loader/Loader.js +2 -2
  5. package/esm/form/Textarea.d.ts +4 -0
  6. package/esm/form/Textarea.js +12 -4
  7. package/esm/form/Textarea.js.map +1 -1
  8. package/esm/form/error-summary/ErrorSummary.js +4 -2
  9. package/esm/form/error-summary/ErrorSummary.js.map +1 -1
  10. package/esm/loader/Loader.d.ts +1 -1
  11. package/esm/loader/Loader.js +2 -2
  12. package/esm/loader/Loader.js.map +1 -1
  13. package/package.json +2 -2
  14. package/src/alert/alert.stories.tsx +9 -1
  15. package/src/form/Textarea.tsx +17 -2
  16. package/src/form/error-summary/ErrorSummary.tsx +9 -3
  17. package/src/form/stories/textarea.stories.tsx +10 -0
  18. package/src/guide-panel/guidepanel.stories.tsx +51 -0
  19. package/src/help-text/help-text.stories.tsx +53 -18
  20. package/src/link/link.stories.tsx +77 -0
  21. package/src/link-panel/link-panel.stories.tsx +57 -0
  22. package/src/loader/Loader.tsx +8 -4
  23. package/src/loader/loader.stories.tsx +79 -0
  24. package/src/modal/modal.stories.tsx +71 -38
  25. package/src/panel/{stories/panel.stories.tsx → panel.stories.tsx} +27 -5
  26. package/src/popover/popover.stories.tsx +126 -0
  27. package/src/table/stories/table-async.stories.tsx +1 -1
  28. package/src/table/stories/table-expandable.stories.tsx +89 -62
  29. package/src/table/stories/table.stories.tsx +73 -83
  30. package/src/tag/tag.stories.tsx +45 -0
  31. package/src/toggle-group/ToggleGroup.stories.tsx +63 -81
  32. package/src/typography/heading.stories.tsx +75 -0
  33. package/src/typography/typography.stories.tsx +184 -111
  34. package/src/guide-panel/stories/example.css +0 -13
  35. package/src/guide-panel/stories/guidepanel.stories.mdx +0 -81
  36. package/src/guide-panel/stories/guidepanel.stories.tsx +0 -68
  37. package/src/link/stories/link.stories.mdx +0 -26
  38. package/src/link/stories/link.stories.tsx +0 -53
  39. package/src/link-panel/stories/illustration.tsx +0 -125
  40. package/src/link-panel/stories/link-panel.stories.mdx +0 -110
  41. package/src/link-panel/stories/link-panel.stories.tsx +0 -51
  42. package/src/loader/stories/loader.stories.mdx +0 -65
  43. package/src/loader/stories/loader.stories.tsx +0 -69
  44. package/src/panel/stories/panel.stories.mdx +0 -42
  45. package/src/popover/stories/popover.stories.mdx +0 -23
  46. package/src/popover/stories/popover.stories.tsx +0 -56
  47. package/src/table/stories/table-hot.stories.tsx +0 -376
  48. package/src/table/stories/table.stories.mdx +0 -112
  49. package/src/tag/stories/tag.stories.mdx +0 -56
  50. package/src/tag/stories/tag.stories.tsx +0 -32
@@ -0,0 +1,57 @@
1
+ import { Meta } from "@storybook/react/types-6-0";
2
+ import React from "react";
3
+ import { LinkPanel } from "..";
4
+
5
+ export default {
6
+ title: "ds-react/LinkPanel",
7
+ component: LinkPanel,
8
+ argTypes: {
9
+ border: {
10
+ control: {
11
+ type: "boolean",
12
+ },
13
+ },
14
+ },
15
+ } as Meta;
16
+
17
+ export const Default = (props: any) => {
18
+ return (
19
+ <LinkPanel href="#" border={props?.border}>
20
+ <LinkPanel.Title>
21
+ Consectetur eu duis aliqua eu irure fugiat fugiat eu.
22
+ </LinkPanel.Title>
23
+ {props.description && (
24
+ <LinkPanel.Description>
25
+ Aliqua id aliquip Lorem esse
26
+ </LinkPanel.Description>
27
+ )}
28
+ </LinkPanel>
29
+ );
30
+ };
31
+
32
+ Default.args = {
33
+ description: false,
34
+ };
35
+
36
+ export const Description = () => {
37
+ return (
38
+ <LinkPanel href="#">
39
+ <LinkPanel.Title>
40
+ Consectetur eu duis aliqua eu irure fugiat fugiat eu.
41
+ </LinkPanel.Title>
42
+ <LinkPanel.Description>
43
+ Aliqua id aliquip Lorem esse
44
+ </LinkPanel.Description>
45
+ </LinkPanel>
46
+ );
47
+ };
48
+
49
+ export const NoBorder = () => {
50
+ return (
51
+ <LinkPanel href="#" border={false}>
52
+ <LinkPanel.Title>
53
+ Consectetur eu duis aliqua eu irure fugiat fugiat eu.
54
+ </LinkPanel.Title>
55
+ </LinkPanel>
56
+ );
57
+ };
@@ -8,7 +8,14 @@ export interface LoaderProps extends SVGProps<SVGSVGElement> {
8
8
  * 64px | 40px | 32px | 24px | 20px | 16px
9
9
  * @default "medium"
10
10
  */
11
- size?: "2xlarge" | "xlarge" | "large" | "medium" | "small" | "xsmall";
11
+ size?:
12
+ | "3xlarge"
13
+ | "2xlarge"
14
+ | "xlarge"
15
+ | "large"
16
+ | "medium"
17
+ | "small"
18
+ | "xsmall";
12
19
  /**
13
20
  * Title prop on svg
14
21
  * @default "venter..."
@@ -68,7 +75,6 @@ export const Loader = forwardRef<SVGSVGElement, LoaderProps>(
68
75
  cy="25"
69
76
  r="20"
70
77
  fill="none"
71
- strokeWidth="5"
72
78
  />
73
79
  <circle
74
80
  className="navds-loader__foreground"
@@ -77,9 +83,7 @@ export const Loader = forwardRef<SVGSVGElement, LoaderProps>(
77
83
  r="20"
78
84
  stroke={"var(--navds-global-color-gray-400)"}
79
85
  fill="none"
80
- strokeWidth="5"
81
86
  strokeDasharray="50 155"
82
- strokeLinecap="round"
83
87
  />
84
88
  </svg>
85
89
  );
@@ -0,0 +1,79 @@
1
+ import React from "react";
2
+ import { Loader } from "..";
3
+ import { Meta } from "@storybook/react/types-6-0";
4
+ export default {
5
+ title: "ds-react/Loader",
6
+ component: Loader,
7
+ argTypes: {
8
+ size: {
9
+ control: {
10
+ type: "radio",
11
+ options: [
12
+ "3xlarge",
13
+ "2xlarge",
14
+ "xlarge",
15
+ "large",
16
+ "medium",
17
+ "small",
18
+ "xsmall",
19
+ ],
20
+ },
21
+ },
22
+ variant: {
23
+ control: {
24
+ type: "radio",
25
+ options: ["neutral", "interaction", "inverted"],
26
+ },
27
+ },
28
+ },
29
+ } as Meta;
30
+
31
+ export const Default = (props: any) => {
32
+ return <Loader {...props} />;
33
+ };
34
+
35
+ Default.args = {
36
+ transparent: false,
37
+ };
38
+
39
+ export const Size = () => (
40
+ <div>
41
+ <Loader size="3xlarge" />
42
+ <Loader size="2xlarge" />
43
+ <Loader size="xlarge" />
44
+ <Loader size="large" />
45
+ <Loader size="medium" />
46
+ <Loader size="small" />
47
+ <Loader size="xsmall" />
48
+ </div>
49
+ );
50
+
51
+ export const Variant = () => (
52
+ <div className="colgap">
53
+ <div>
54
+ <Loader size="3xlarge" variant="neutral" />
55
+ <Loader size="3xlarge" variant="inverted" />
56
+ <Loader size="3xlarge" variant="interaction" />
57
+ </div>
58
+ <div style={{ backgroundColor: "#292929" }}>
59
+ <Loader size="3xlarge" variant="neutral" />
60
+ <Loader size="3xlarge" variant="inverted" />
61
+ <Loader size="3xlarge" variant="interaction" />
62
+ </div>
63
+ </div>
64
+ );
65
+
66
+ export const Transparent = () => (
67
+ <div className="colgap">
68
+ <div>
69
+ <Loader size="3xlarge" transparent variant="neutral" />
70
+ <Loader size="3xlarge" transparent variant="inverted" />
71
+ <Loader size="3xlarge" transparent variant="interaction" />
72
+ </div>
73
+ <div style={{ backgroundColor: "#292929" }}>
74
+ <Loader size="3xlarge" transparent variant="neutral" />
75
+ <Loader size="3xlarge" transparent variant="inverted" />
76
+ <Loader size="3xlarge" transparent variant="interaction" />
77
+ </div>
78
+ </div>
79
+ );
@@ -1,69 +1,102 @@
1
- import React, { useState } from "react";
2
- import { Modal } from "../..";
1
+ import React, { useEffect, useState } from "react";
2
+ import { BodyLong, Button, Heading, Modal } from "../..";
3
3
 
4
4
  export default {
5
- title: "ds-react/modal",
5
+ title: "ds-react/Modal",
6
6
  component: Modal,
7
+ parameters: {
8
+ chromatic: { delay: 1000 },
9
+ },
7
10
  };
8
11
 
9
- Modal.setAppElement("#root");
12
+ export const Default = (props) => {
13
+ const [open, setOpen] = useState(false);
10
14
 
11
- export const All = () => {
12
- const [open, setOpen] = useState(true);
13
- const [openTwo, setOpenTwo] = useState(false);
14
- const [openThree, setOpenThree] = useState(false);
15
+ useEffect(() => {
16
+ Modal.setAppElement("#root");
17
+ }, []);
15
18
 
16
19
  return (
17
20
  <>
18
- <button onClick={() => setOpen(true)}>Open modal</button>
21
+ <Button onClick={() => setOpen(true)}>Open</Button>
19
22
  <Modal
20
23
  open={open}
21
24
  onClose={() => setOpen(false)}
22
25
  aria-labelledby="header123"
26
+ {...props}
23
27
  >
24
28
  <Modal.Content>
25
- <h1 id="header123">Header</h1>
26
- <h2>subheader</h2>
27
- <p>Cupidatat irure ipsum veniam ad in esse.</p>
28
- <p>Cillum tempor pariatur amet ut laborum Lorem enim enim.</p>
29
+ <Heading spacing id="header123" level="1" size="large">
30
+ Header
31
+ </Heading>
32
+ <Heading spacing level="2" size="medium">
33
+ Header
34
+ </Heading>
35
+ <BodyLong>Voluptate laboris mollit dolore qui. Magna elit.</BodyLong>
29
36
  </Modal.Content>
30
37
  </Modal>
38
+ </>
39
+ );
40
+ };
41
+
42
+ Default.args = {
43
+ shouldCloseOnOverlayClick: true,
44
+ closeButton: true,
45
+ };
31
46
 
32
- <button onClick={() => setOpenTwo(true)}>
33
- Open modal,shouldCloseOnOverlayClick false{" "}
34
- </button>
47
+ export const Open = () => {
48
+ const [open, setOpen] = useState(null);
49
+
50
+ useEffect(() => {
51
+ Modal.setAppElement("#root");
52
+ }, []);
53
+
54
+ return (
55
+ <>
56
+ <Button onClick={() => setOpen(true)}>Open</Button>
35
57
  <Modal
36
- shouldCloseOnOverlayClick={false}
37
- open={openTwo}
38
- onClose={() => setOpenTwo(false)}
58
+ open={open ?? true}
59
+ onClose={() => setOpen(false)}
39
60
  aria-labelledby="header123"
40
61
  >
41
62
  <Modal.Content>
42
- <h1 id="header123">Header</h1>
43
- <h2>subheader</h2>
44
- <p>
45
- Cupidatat irure ipsum veniam ad in esse. Voluptate do nulla amet
46
- laboris ea ex aliquip. Dolore dolore reprehenderit sint esse commodo
47
- aliqua cupidatat incididunt proident laborum qui. Officia fugiat non
48
- anim cupidatat. Adipisicing ut aliqua cillum nulla elit. Mollit et
49
- id duis cupidatat labore magna consectetur et veniam tempor. In
50
- minim exercitation id irure velit sit dolor aliquip velit esse.
51
- Excepteur sint non minim nulla excepteur labore non magna eu.
52
- </p>
63
+ <Heading spacing id="header123" level="1" size="large">
64
+ Header
65
+ </Heading>
66
+ <Heading spacing level="2" size="medium">
67
+ Header
68
+ </Heading>
69
+ <BodyLong>Voluptate laboris mollit dolore qui. Magna elit.</BodyLong>
53
70
  </Modal.Content>
54
71
  </Modal>
55
- <button onClick={() => setOpenThree(true)}>
56
- Open modal without x-button
57
- </button>
72
+ </>
73
+ );
74
+ };
75
+
76
+ export const CloseButton = () => {
77
+ const [open, setOpen] = useState(true);
78
+
79
+ useEffect(() => {
80
+ Modal.setAppElement("#root");
81
+ }, []);
82
+
83
+ return (
84
+ <>
85
+ <Button onClick={() => setOpen(true)}>Open</Button>
58
86
  <Modal
59
- open={openThree}
87
+ open={open}
88
+ onClose={() => setOpen(false)}
89
+ aria-labelledby="header123"
60
90
  closeButton={false}
61
- onClose={() => setOpenThree(false)}
62
- aria-label="Min modal"
63
91
  >
64
92
  <Modal.Content>
65
- <p>Cupidatat irure ipsum veniam ad in esse.</p>
66
- <p>Cillum tempor pariatur amet ut laborum Lorem enim enim.</p>
93
+ <Heading spacing id="header123" level="1" size="large">
94
+ Header
95
+ </Heading>
96
+ <Heading spacing level="2" size="medium">
97
+ Header
98
+ </Heading>
99
+ <BodyLong>Voluptate laboris mollit dolore qui. Magna elit.</BodyLong>
67
100
  </Modal.Content>
68
101
  </Modal>
69
102
  </>
@@ -2,14 +2,37 @@ import React from "react";
2
2
  import { Panel } from "../index";
3
3
  import { Meta } from "@storybook/react/types-6-0";
4
4
  export default {
5
- title: "ds-react/panel",
5
+ title: "ds-react/Panel",
6
6
  component: Panel,
7
+ argTypes: {
8
+ border: {
9
+ defaultValue: true,
10
+ control: {
11
+ type: "boolean",
12
+ },
13
+ },
14
+ },
7
15
  } as Meta;
8
16
 
9
- export const All = () => {
17
+ export const Default = (props) => {
10
18
  return (
11
- <div>
12
- <h1>Panel</h1>
19
+ <Panel {...props}>
20
+ Eu quis exercitation voluptate ex. Aute irure esse occaecat minim
21
+ cupidatat velit minim duis sint culpa anim laboris. Consectetur nulla eu
22
+ commodo ea culpa velit commodo incididunt sunt ipsum. Amet anim
23
+ adipisicing minim ipsum do. Non laborum culpa reprehenderit est sint
24
+ officia quis excepteur. Fugiat eiusmod eiusmod commodo incididunt nisi
25
+ minim ex eu cupidatat quis ex. Lorem irure ea ea enim consectetur ea
26
+ aliqua cupidatat. Officia aute veniam aute exercitation ipsum aliqua
27
+ adipisicing. Est aliqua ad ullamco aute nostrud amet ea adipisicing
28
+ consequat id officia irure pariatur. Eu mollit amet culpa culpa velit.
29
+ </Panel>
30
+ );
31
+ };
32
+
33
+ export const Border = () => {
34
+ return (
35
+ <div className="colgap">
13
36
  <Panel>
14
37
  Eu quis exercitation voluptate ex. Aute irure esse occaecat minim
15
38
  cupidatat velit minim duis sint culpa anim laboris. Consectetur nulla eu
@@ -21,7 +44,6 @@ export const All = () => {
21
44
  adipisicing. Est aliqua ad ullamco aute nostrud amet ea adipisicing
22
45
  consequat id officia irure pariatur. Eu mollit amet culpa culpa velit.
23
46
  </Panel>
24
- <h2>With border</h2>
25
47
  <Panel border>
26
48
  Eu quis exercitation voluptate ex. Aute irure esse occaecat minim
27
49
  cupidatat velit minim duis sint culpa anim laboris. Consectetur nulla eu
@@ -0,0 +1,126 @@
1
+ import React, { useState } from "react";
2
+ import { Popover } from "../index";
3
+ import { placements } from "@popperjs/core";
4
+ import { Button } from "../button";
5
+
6
+ export default {
7
+ title: "ds-react/Popover",
8
+ component: Popover,
9
+ parameters: {
10
+ chromatic: { disable: true },
11
+ },
12
+ argTypes: {
13
+ open: {
14
+ control: {
15
+ type: "boolean",
16
+ },
17
+ },
18
+ arrow: {
19
+ control: {
20
+ type: "boolean",
21
+ },
22
+ },
23
+ offset: {
24
+ control: {
25
+ type: "number",
26
+ },
27
+ },
28
+ strategy: {
29
+ defaultValue: "fixed",
30
+ control: {
31
+ type: "radio",
32
+ options: ["fixed", "absolute"],
33
+ },
34
+ },
35
+ placement: {
36
+ defaultValue: "bottom",
37
+ control: {
38
+ type: "radio",
39
+ options: [
40
+ "bottom",
41
+ "right",
42
+ "left",
43
+ "top-start",
44
+ "top-end",
45
+ "bottom-start",
46
+ "bottom-end",
47
+ "right-start",
48
+ "right-end",
49
+ "left-start",
50
+ "left-end",
51
+ "auto",
52
+ "auto-start",
53
+ "auto-end",
54
+ ],
55
+ },
56
+ },
57
+ },
58
+ };
59
+
60
+ export const Default = (props: any) => {
61
+ const [anchorEl, setAnchorEl] = useState(null);
62
+ const [open, setOpen] = useState<boolean>(false);
63
+ return (
64
+ <>
65
+ <Button ref={(el) => setAnchorEl(el)} onClick={() => setOpen((x) => !x)}>
66
+ Open
67
+ </Button>
68
+ <Popover
69
+ {...props}
70
+ open={props.open ?? open}
71
+ anchorEl={anchorEl}
72
+ onClose={() => setOpen(false)}
73
+ >
74
+ <Popover.Content>
75
+ Velit in consequat Lorem sunt ut deserunt nostrud enim enim sint
76
+ cillum ad veniam.
77
+ </Popover.Content>
78
+ </Popover>
79
+ </>
80
+ );
81
+ };
82
+
83
+ const Template = (props) => {
84
+ const [anchorEl, setAnchorEl] = useState(null);
85
+
86
+ return (
87
+ <>
88
+ <Button ref={(el) => setAnchorEl(el)}>X</Button>
89
+ <Popover {...props} open anchorEl={anchorEl}>
90
+ <Popover.Content>
91
+ Velit in consequat Lorem
92
+ <br />
93
+ sunt Pariatur ullamco ullamco
94
+ </Popover.Content>
95
+ </Popover>
96
+ </>
97
+ );
98
+ };
99
+
100
+ export const Placement = () => {
101
+ return (
102
+ <div className="colgap" style={{ gap: "12rem" }}>
103
+ {placements.map((placement) => (
104
+ <Template key={placement} placement={placement} />
105
+ ))}
106
+ </div>
107
+ );
108
+ };
109
+
110
+ export const Arrow = () => {
111
+ return (
112
+ <div className="colgap" style={{ gap: "12rem" }}>
113
+ <Template arrow />
114
+ <Template arrow={false} />
115
+ </div>
116
+ );
117
+ };
118
+
119
+ export const Offset = () => {
120
+ return (
121
+ <div className="colgap" style={{ gap: "12rem" }}>
122
+ <Template arrow offset={30} />
123
+ <Template arrow={false} offset={30} />
124
+ </div>
125
+ );
126
+ };
@@ -5,7 +5,7 @@ import { Table } from "../index";
5
5
  import { Loader, Pagination, SortState } from "../..";
6
6
 
7
7
  export default {
8
- title: "ds-react/table",
8
+ title: "ds-react/Table",
9
9
  component: Table,
10
10
  parameters: {
11
11
  chromatic: { delay: 500 },
@@ -3,76 +3,73 @@ import { Table } from "..";
3
3
  import { Link } from "../..";
4
4
 
5
5
  export default {
6
- title: "ds-react/table",
6
+ title: "ds-react/Table",
7
7
  component: Table,
8
8
  };
9
9
 
10
10
  export const Expandable = () => {
11
- const [open, setOpen] = useState(false);
12
-
13
11
  return (
14
- <>
15
- <Table zebraStripes>
16
- <Table.Header>
17
- <Table.Row>
18
- {columns.map(({ key, name }) => (
19
- <Table.HeaderCell key={key}>{name}</Table.HeaderCell>
20
- ))}
21
- <Table.HeaderCell />
22
- </Table.Row>
23
- </Table.Header>
24
- <Table.Body>
25
- {data.map((data) => (
26
- <Table.ExpandableRow
27
- expansionDisabled={data.animal === "Sel"}
28
- content={data.content}
29
- key={data.name}
30
- togglePlacement="right"
31
- >
32
- {columns.map(({ key }) => (
33
- <Table.DataCell key={key}>{data[key]}</Table.DataCell>
34
- ))}
35
- </Table.ExpandableRow>
12
+ <Table zebraStripes>
13
+ <Table.Header>
14
+ <Table.Row>
15
+ {columns.map(({ key, name }) => (
16
+ <Table.HeaderCell key={key}>{name}</Table.HeaderCell>
36
17
  ))}
37
- </Table.Body>
38
- </Table>
39
- <h2>defaultOpen/controlled + small</h2>
40
- <Table size="small">
41
- <Table.Header>
42
- <Table.Row>
43
- <Table.HeaderCell />
44
- {columns.map(({ key, name }) => (
45
- <Table.HeaderCell key={key}>{name}</Table.HeaderCell>
18
+ <Table.HeaderCell />
19
+ </Table.Row>
20
+ </Table.Header>
21
+ <Table.Body>
22
+ {data.map((data) => (
23
+ <Table.ExpandableRow
24
+ expansionDisabled={data.animal === "Sel"}
25
+ content={data.content}
26
+ key={data.name}
27
+ togglePlacement="right"
28
+ >
29
+ {columns.map(({ key }) => (
30
+ <Table.DataCell key={key}>{data[key]}</Table.DataCell>
46
31
  ))}
47
- </Table.Row>
48
- </Table.Header>
49
- <Table.Body>
50
- {data.slice(0, 1).map((data) => (
51
- <Table.ExpandableRow
52
- content={data.content}
53
- key={data.name}
54
- defaultOpen
55
- >
56
- {columns.map(({ key }) => (
57
- <Table.DataCell key={key}>{data[key]}</Table.DataCell>
58
- ))}
59
- </Table.ExpandableRow>
60
- ))}
61
- {data.slice(1, 2).map((data) => (
62
- <Table.ExpandableRow
63
- content={data.content}
64
- key={data.name}
65
- open={open}
66
- onOpenChange={(open) => setOpen(open)}
67
- >
68
- {columns.map(({ key }) => (
69
- <Table.DataCell key={key}>{data[key]}</Table.DataCell>
70
- ))}
71
- </Table.ExpandableRow>
32
+ </Table.ExpandableRow>
33
+ ))}
34
+ </Table.Body>
35
+ </Table>
36
+ );
37
+ };
38
+
39
+ export const ExpandableSmall = () => {
40
+ const [open, setOpen] = useState(false);
41
+ return (
42
+ <Table size="small">
43
+ <Table.Header>
44
+ <Table.Row>
45
+ <Table.HeaderCell />
46
+ {columns.map(({ key, name }) => (
47
+ <Table.HeaderCell key={key}>{name}</Table.HeaderCell>
72
48
  ))}
73
- </Table.Body>
74
- </Table>
75
- </>
49
+ </Table.Row>
50
+ </Table.Header>
51
+ <Table.Body>
52
+ {data.slice(0, 1).map((data) => (
53
+ <Table.ExpandableRow content={data.content} key={data.name}>
54
+ {columns.map(({ key }) => (
55
+ <Table.DataCell key={key}>{data[key]}</Table.DataCell>
56
+ ))}
57
+ </Table.ExpandableRow>
58
+ ))}
59
+ {data.slice(1, 2).map((data) => (
60
+ <Table.ExpandableRow
61
+ content={data.content}
62
+ key={data.name}
63
+ open={open}
64
+ onOpenChange={(open) => setOpen(open)}
65
+ >
66
+ {columns.map(({ key }) => (
67
+ <Table.DataCell key={key}>{data[key]}</Table.DataCell>
68
+ ))}
69
+ </Table.ExpandableRow>
70
+ ))}
71
+ </Table.Body>
72
+ </Table>
76
73
  );
77
74
  };
78
75
 
@@ -200,3 +197,33 @@ const data = [
200
197
  ),
201
198
  },
202
199
  ];
200
+
201
+ export const ExpandableOpen = () => {
202
+ return (
203
+ <Table zebraStripes>
204
+ <Table.Header>
205
+ <Table.Row>
206
+ {columns.map(({ key, name }) => (
207
+ <Table.HeaderCell key={key}>{name}</Table.HeaderCell>
208
+ ))}
209
+ <Table.HeaderCell />
210
+ </Table.Row>
211
+ </Table.Header>
212
+ <Table.Body>
213
+ {data.map((data) => (
214
+ <Table.ExpandableRow
215
+ expansionDisabled={data.animal === "Sel"}
216
+ content={data.content}
217
+ key={data.name}
218
+ togglePlacement="right"
219
+ defaultOpen
220
+ >
221
+ {columns.map(({ key }) => (
222
+ <Table.DataCell key={key}>{data[key]}</Table.DataCell>
223
+ ))}
224
+ </Table.ExpandableRow>
225
+ ))}
226
+ </Table.Body>
227
+ </Table>
228
+ );
229
+ };