@navikt/ds-react 6.6.0 → 6.7.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/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/index.d.ts +1 -0
- package/cjs/index.js +4 -2
- 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/progress-bar/ProgressBar.d.ts +60 -0
- package/cjs/progress-bar/ProgressBar.js +76 -0
- package/cjs/progress-bar/ProgressBar.js.map +1 -0
- package/cjs/progress-bar/index.d.ts +1 -0
- package/cjs/progress-bar/index.js +10 -0
- package/cjs/progress-bar/index.js.map +1 -0
- package/cjs/typography/BodyLong.d.ts +7 -7
- package/cjs/typography/BodyLong.js +5 -5
- package/cjs/typography/BodyShort.d.ts +5 -5
- package/cjs/typography/BodyShort.js +3 -3
- package/cjs/typography/Detail.d.ts +5 -5
- package/cjs/typography/Detail.js +3 -3
- package/cjs/typography/ErrorMessage.d.ts +5 -5
- package/cjs/typography/ErrorMessage.js +3 -3
- package/cjs/typography/Heading.d.ts +6 -6
- package/cjs/typography/Heading.js +3 -3
- package/cjs/typography/Label.d.ts +5 -5
- package/cjs/typography/Label.js +3 -3
- package/cjs/typography/types.d.ts +3 -3
- 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/index.d.ts +1 -0
- package/esm/index.js +1 -0
- 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/progress-bar/ProgressBar.d.ts +60 -0
- package/esm/progress-bar/ProgressBar.js +47 -0
- package/esm/progress-bar/ProgressBar.js.map +1 -0
- package/esm/progress-bar/index.d.ts +1 -0
- package/esm/progress-bar/index.js +3 -0
- package/esm/progress-bar/index.js.map +1 -0
- package/esm/typography/BodyLong.d.ts +7 -7
- package/esm/typography/BodyLong.js +5 -5
- package/esm/typography/BodyShort.d.ts +5 -5
- package/esm/typography/BodyShort.js +3 -3
- package/esm/typography/Detail.d.ts +5 -5
- package/esm/typography/Detail.js +3 -3
- package/esm/typography/ErrorMessage.d.ts +5 -5
- package/esm/typography/ErrorMessage.js +3 -3
- package/esm/typography/Heading.d.ts +6 -6
- package/esm/typography/Heading.js +3 -3
- package/esm/typography/Label.d.ts +5 -5
- package/esm/typography/Label.js +3 -3
- package/esm/typography/types.d.ts +3 -3
- package/package.json +13 -3
- 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/index.ts +1 -0
- package/src/layout/stack/Spacer.tsx +1 -1
- package/src/progress-bar/ProgressBar.tsx +124 -0
- package/src/progress-bar/index.ts +2 -0
- package/src/typography/BodyLong.tsx +7 -7
- package/src/typography/BodyShort.tsx +5 -5
- package/src/typography/Detail.tsx +5 -5
- package/src/typography/ErrorMessage.tsx +5 -5
- package/src/typography/Heading.tsx +6 -6
- package/src/typography/Label.tsx +5 -5
- package/src/typography/types.ts +3 -3
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import React, { forwardRef } from "react";
|
|
2
|
+
import { Slot } from "../../util/Slot";
|
|
3
|
+
import { composeEventHandlers } from "../../util/composeEventHandlers";
|
|
4
|
+
import { useCollapsibleContext } from "../Collapsible.context";
|
|
5
|
+
|
|
6
|
+
export interface CollapsibleTriggerProps
|
|
7
|
+
extends Omit<
|
|
8
|
+
React.ButtonHTMLAttributes<HTMLButtonElement>,
|
|
9
|
+
"id" | "aria-controls" | "aria-expanded"
|
|
10
|
+
> {
|
|
11
|
+
/**
|
|
12
|
+
* When true, will render element as its child. This merges classes, styles and event handlers.
|
|
13
|
+
* @default false
|
|
14
|
+
*/
|
|
15
|
+
asChild?: boolean;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const CollapsibleTrigger = forwardRef<
|
|
19
|
+
HTMLButtonElement,
|
|
20
|
+
CollapsibleTriggerProps
|
|
21
|
+
>(({ children, asChild, onClick, ...rest }, ref) => {
|
|
22
|
+
const ctx = useCollapsibleContext();
|
|
23
|
+
|
|
24
|
+
const Comp = asChild ? Slot : "button";
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<Comp
|
|
28
|
+
ref={ref}
|
|
29
|
+
type="button"
|
|
30
|
+
data-state={ctx.state}
|
|
31
|
+
onClick={composeEventHandlers(onClick, ctx.onOpenToggle)}
|
|
32
|
+
{...rest}
|
|
33
|
+
id={ctx.triggerId}
|
|
34
|
+
aria-controls={ctx.open ? ctx.contentId : undefined}
|
|
35
|
+
aria-expanded={ctx.open}
|
|
36
|
+
>
|
|
37
|
+
{children}
|
|
38
|
+
</Comp>
|
|
39
|
+
);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
export default CollapsibleTrigger;
|
package/src/index.ts
CHANGED
|
@@ -59,6 +59,7 @@ export { Modal, type ModalProps } from "./modal";
|
|
|
59
59
|
export { Pagination, type PaginationProps } from "./pagination";
|
|
60
60
|
export { Popover, type PopoverProps } from "./popover";
|
|
61
61
|
export { Portal, type PortalProps } from "./portal";
|
|
62
|
+
export { ProgressBar, type ProgressBarProps } from "./progress-bar";
|
|
62
63
|
export { Provider, type ProviderProps } from "./provider";
|
|
63
64
|
export { ReadMore, type ReadMoreProps } from "./read-more";
|
|
64
65
|
export { Skeleton, type SkeletonProps } from "./skeleton";
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import cl from "clsx";
|
|
2
|
+
import React, { HTMLAttributes, forwardRef } from "react";
|
|
3
|
+
|
|
4
|
+
interface ProgressBarPropsBase
|
|
5
|
+
extends Omit<HTMLAttributes<HTMLDivElement>, "role"> {
|
|
6
|
+
/**
|
|
7
|
+
* Changes height.
|
|
8
|
+
* @default "medium"
|
|
9
|
+
*/
|
|
10
|
+
size?: "large" | "medium" | "small";
|
|
11
|
+
/**
|
|
12
|
+
* Current progress. When duration is set, value is ignored.
|
|
13
|
+
*/
|
|
14
|
+
value?: number;
|
|
15
|
+
/**
|
|
16
|
+
* Maximum progress.
|
|
17
|
+
* @default 100
|
|
18
|
+
*/
|
|
19
|
+
valueMax?: number;
|
|
20
|
+
/**
|
|
21
|
+
* Expected task duration in seconds.
|
|
22
|
+
* ProgressBar grows with a preset animation for {duration} seconds.
|
|
23
|
+
* After a 4 sec delay, it then shows an indeterminate animation.
|
|
24
|
+
* A duration of 0 will show an indeterminate animation immediately.
|
|
25
|
+
* Temporary removed to avoid conflicts when updating API
|
|
26
|
+
*/
|
|
27
|
+
//duration?: number;
|
|
28
|
+
/**
|
|
29
|
+
* String ID of the element that labels the progress bar.
|
|
30
|
+
* Not needed if `aria-label` is used.
|
|
31
|
+
*/
|
|
32
|
+
"aria-labelledby"?: string;
|
|
33
|
+
/**
|
|
34
|
+
* String value that labels the progress bar.
|
|
35
|
+
* Not needed if `aria-labelledby` is used.
|
|
36
|
+
*/
|
|
37
|
+
"aria-label"?: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export type ProgressBarProps = ProgressBarPropsBase &
|
|
41
|
+
(
|
|
42
|
+
| {
|
|
43
|
+
"aria-hidden": string;
|
|
44
|
+
}
|
|
45
|
+
| {
|
|
46
|
+
"aria-labelledby": string;
|
|
47
|
+
"aria-label"?: never;
|
|
48
|
+
}
|
|
49
|
+
| {
|
|
50
|
+
"aria-label": string;
|
|
51
|
+
"aria-labelledby"?: never;
|
|
52
|
+
}
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* ProgressBar
|
|
57
|
+
* A component for visualizing progression in a process.
|
|
58
|
+
*
|
|
59
|
+
* @see [📝 Documentation](https://aksel.nav.no/komponenter/core/progress-bar)
|
|
60
|
+
* @see 🏷️ {@link ProgressBarProps}
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* // For loading content with an approximate duration in sec.
|
|
64
|
+
* <ProgressBar duration={30} />
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* // As a step indicator for forms, questionnaires, etc.
|
|
68
|
+
* <ProgressBar value={2} valueMax={7} />
|
|
69
|
+
*/
|
|
70
|
+
export const ProgressBar = forwardRef<HTMLDivElement, ProgressBarProps>(
|
|
71
|
+
(
|
|
72
|
+
{
|
|
73
|
+
size = "medium",
|
|
74
|
+
value = 0,
|
|
75
|
+
valueMax = 100,
|
|
76
|
+
"aria-labelledby": ariaLabelledBy,
|
|
77
|
+
"aria-label": ariaLabel,
|
|
78
|
+
className,
|
|
79
|
+
...rest
|
|
80
|
+
},
|
|
81
|
+
ref,
|
|
82
|
+
) => {
|
|
83
|
+
const translate = 100 - (Math.round(value) / valueMax) * 100;
|
|
84
|
+
const duration = undefined;
|
|
85
|
+
|
|
86
|
+
return (
|
|
87
|
+
<div
|
|
88
|
+
ref={ref}
|
|
89
|
+
className={cl(
|
|
90
|
+
"navds-progress-bar",
|
|
91
|
+
`navds-progress-bar--${size}`,
|
|
92
|
+
className,
|
|
93
|
+
)}
|
|
94
|
+
aria-valuemax={duration ? 0 : Math.round(valueMax)}
|
|
95
|
+
aria-valuenow={duration ? 0 : Math.round(value)}
|
|
96
|
+
aria-valuetext={
|
|
97
|
+
duration
|
|
98
|
+
? "Fremdrift kan ikke beregnes"
|
|
99
|
+
: `${Math.round(value)} av ${Math.round(valueMax)}`
|
|
100
|
+
}
|
|
101
|
+
role="progressbar"
|
|
102
|
+
aria-labelledby={ariaLabelledBy}
|
|
103
|
+
aria-label={ariaLabel}
|
|
104
|
+
{...rest}
|
|
105
|
+
>
|
|
106
|
+
<div
|
|
107
|
+
className={cl("navds-progress-bar__foreground", {
|
|
108
|
+
"navds-progress-bar__foreground--indeterminate":
|
|
109
|
+
Number.isInteger(duration),
|
|
110
|
+
})}
|
|
111
|
+
style={{
|
|
112
|
+
"--__ac-progress-bar-duration": Number.isInteger(duration)
|
|
113
|
+
? `${duration}s`
|
|
114
|
+
: undefined,
|
|
115
|
+
"--__ac-progress-bar-delay": `${duration === 0 ? 0 : 4}s`,
|
|
116
|
+
"--__ac-progress-bar-translate": `-${translate}%`,
|
|
117
|
+
}}
|
|
118
|
+
/>
|
|
119
|
+
</div>
|
|
120
|
+
);
|
|
121
|
+
},
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
export default ProgressBar;
|
|
@@ -8,12 +8,12 @@ export interface BodyLongProps
|
|
|
8
8
|
extends TypoProps,
|
|
9
9
|
React.HTMLAttributes<HTMLParagraphElement> {
|
|
10
10
|
/**
|
|
11
|
-
* large: 20px, medium: 18px, small: 16px
|
|
11
|
+
* large: 20px, medium: 18px, small: 16px.
|
|
12
12
|
* @default "medium"
|
|
13
13
|
*/
|
|
14
14
|
size?: "large" | "medium" | "small";
|
|
15
15
|
/**
|
|
16
|
-
* Text
|
|
16
|
+
* Text.
|
|
17
17
|
*/
|
|
18
18
|
children: React.ReactNode;
|
|
19
19
|
}
|
|
@@ -27,11 +27,11 @@ export interface BodyLongProps
|
|
|
27
27
|
*
|
|
28
28
|
* @example
|
|
29
29
|
* ```jsx
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
30
|
+
* <BodyLong>
|
|
31
|
+
* Hvis du ikke bor sammen med begge foreldrene dine,
|
|
32
|
+
* kan du ha rett til barnebidrag fra en eller begge foreldre mens du
|
|
33
|
+
* fullfører videregående skole eller tilsvarende.
|
|
34
|
+
* </BodyLong>
|
|
35
35
|
* ```
|
|
36
36
|
*/
|
|
37
37
|
export const BodyLong: OverridableComponent<
|
|
@@ -8,12 +8,12 @@ export interface BodyShortProps
|
|
|
8
8
|
extends TypoProps,
|
|
9
9
|
React.HTMLAttributes<HTMLParagraphElement> {
|
|
10
10
|
/**
|
|
11
|
-
* large: 20px, medium: 18px, small: 16px
|
|
11
|
+
* large: 20px, medium: 18px, small: 16px.
|
|
12
12
|
* @default "medium"
|
|
13
13
|
*/
|
|
14
14
|
size?: "large" | "medium" | "small";
|
|
15
15
|
/**
|
|
16
|
-
* Paragraph text
|
|
16
|
+
* Paragraph text.
|
|
17
17
|
*/
|
|
18
18
|
children: React.ReactNode;
|
|
19
19
|
}
|
|
@@ -27,9 +27,9 @@ export interface BodyShortProps
|
|
|
27
27
|
*
|
|
28
28
|
* @example
|
|
29
29
|
* ```jsx
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
30
|
+
* <BodyShort>
|
|
31
|
+
* Du må gjøre en filtrering for å se brukere i listen.
|
|
32
|
+
* </BodyShort>
|
|
33
33
|
* ```
|
|
34
34
|
*/
|
|
35
35
|
export const BodyShort: OverridableComponent<
|
|
@@ -12,11 +12,11 @@ export interface DetailProps
|
|
|
12
12
|
*/
|
|
13
13
|
size?: "medium" | "small";
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
15
|
+
* Text.
|
|
16
16
|
*/
|
|
17
17
|
children: React.ReactNode;
|
|
18
18
|
/**
|
|
19
|
-
*
|
|
19
|
+
* ALL CAPS.
|
|
20
20
|
*/
|
|
21
21
|
uppercase?: boolean;
|
|
22
22
|
}
|
|
@@ -30,9 +30,9 @@ export interface DetailProps
|
|
|
30
30
|
*
|
|
31
31
|
* @example
|
|
32
32
|
* ```jsx
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
33
|
+
* <Detail>
|
|
34
|
+
* Du må gjøre en filtrering for å se brukere i listen.
|
|
35
|
+
* </Detail>
|
|
36
36
|
* ```
|
|
37
37
|
*/
|
|
38
38
|
export const Detail: OverridableComponent<DetailProps, HTMLParagraphElement> =
|
|
@@ -8,12 +8,12 @@ export interface ErrorMessageProps
|
|
|
8
8
|
extends Pick<TypoProps, "spacing">,
|
|
9
9
|
React.HTMLAttributes<HTMLParagraphElement> {
|
|
10
10
|
/**
|
|
11
|
-
* medium: 18px, small: 16px
|
|
11
|
+
* medium: 18px, small: 16px.
|
|
12
12
|
* @default "medium"
|
|
13
13
|
*/
|
|
14
14
|
size?: "medium" | "small";
|
|
15
15
|
/**
|
|
16
|
-
* Error text
|
|
16
|
+
* Error text.
|
|
17
17
|
*/
|
|
18
18
|
children: React.ReactNode;
|
|
19
19
|
}
|
|
@@ -27,9 +27,9 @@ export interface ErrorMessageProps
|
|
|
27
27
|
*
|
|
28
28
|
* @example
|
|
29
29
|
* ```jsx
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
30
|
+
* <ErrorMessage>
|
|
31
|
+
* Du må fylle ut: Oppgi årsaken til at du har ventet mer enn 6 måneder med å søke om refusjon
|
|
32
|
+
* </ErrorMessage>
|
|
33
33
|
* ```
|
|
34
34
|
*/
|
|
35
35
|
export const ErrorMessage: OverridableComponent<
|
|
@@ -8,16 +8,16 @@ export interface HeadingProps
|
|
|
8
8
|
extends Pick<TypoProps, "spacing" | "visuallyHidden" | "align" | "textColor">,
|
|
9
9
|
React.HTMLAttributes<HTMLHeadingElement> {
|
|
10
10
|
/**
|
|
11
|
-
* Heading level
|
|
11
|
+
* Heading level.
|
|
12
12
|
* @default "1"
|
|
13
13
|
*/
|
|
14
14
|
level?: "1" | "2" | "3" | "4" | "5" | "6";
|
|
15
15
|
/**
|
|
16
|
-
*
|
|
16
|
+
* xlarge: 40px, large: 32px, medium: 24px, small: 20px, xsmall: 18px.
|
|
17
17
|
*/
|
|
18
18
|
size: "xlarge" | "large" | "medium" | "small" | "xsmall";
|
|
19
19
|
/**
|
|
20
|
-
* Heading text
|
|
20
|
+
* Heading text.
|
|
21
21
|
*/
|
|
22
22
|
children: React.ReactNode;
|
|
23
23
|
}
|
|
@@ -31,9 +31,9 @@ export interface HeadingProps
|
|
|
31
31
|
*
|
|
32
32
|
* @example
|
|
33
33
|
* ```jsx
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
34
|
+
* <Heading level="1" size="xlarge">
|
|
35
|
+
* Hva kan vi hjelpe deg med?
|
|
36
|
+
* </Heading>
|
|
37
37
|
* ```
|
|
38
38
|
*/
|
|
39
39
|
export const Heading: OverridableComponent<HeadingProps, HTMLHeadingElement> =
|
package/src/typography/Label.tsx
CHANGED
|
@@ -8,12 +8,12 @@ export interface LabelProps
|
|
|
8
8
|
extends Omit<TypoProps, "weight" | "align" | "truncate">,
|
|
9
9
|
React.LabelHTMLAttributes<HTMLLabelElement> {
|
|
10
10
|
/**
|
|
11
|
-
* medium: 18px, small: 16px
|
|
11
|
+
* medium: 18px, small: 16px.
|
|
12
12
|
* @default "medium"
|
|
13
13
|
*/
|
|
14
14
|
size?: "medium" | "small";
|
|
15
15
|
/**
|
|
16
|
-
*
|
|
16
|
+
* Label text.
|
|
17
17
|
*/
|
|
18
18
|
children: React.ReactNode;
|
|
19
19
|
}
|
|
@@ -27,9 +27,9 @@ export interface LabelProps
|
|
|
27
27
|
*
|
|
28
28
|
* @example
|
|
29
29
|
* ```jsx
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
30
|
+
* <Label>
|
|
31
|
+
* Oppgi årsaken til at du har ventet mer enn 6 måneder med å søke om refusjon
|
|
32
|
+
* </Label>
|
|
33
33
|
* ```
|
|
34
34
|
*/
|
|
35
35
|
export const Label: OverridableComponent<LabelProps, HTMLLabelElement> =
|
package/src/typography/types.ts
CHANGED
|
@@ -12,15 +12,15 @@ export type TypoProps = {
|
|
|
12
12
|
*/
|
|
13
13
|
align?: "start" | "center" | "end";
|
|
14
14
|
/**
|
|
15
|
-
* Visually hide text. Text will still be accessible for screenreaders
|
|
15
|
+
* Visually hide text. Text will still be accessible for screenreaders.
|
|
16
16
|
*/
|
|
17
17
|
visuallyHidden?: boolean;
|
|
18
18
|
/**
|
|
19
|
-
* Adds spacing below text
|
|
19
|
+
* Adds spacing below text.
|
|
20
20
|
*/
|
|
21
21
|
spacing?: boolean;
|
|
22
22
|
/**
|
|
23
|
-
* Adjusts color
|
|
23
|
+
* Adjusts color.
|
|
24
24
|
*/
|
|
25
25
|
textColor?: "default" | "subtle";
|
|
26
26
|
};
|