@ilo-org/react 0.13.0 → 0.14.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/.storybook/main.ts +41 -0
- package/.storybook/manager-head.html +92 -0
- package/.storybook/manager.ts +6 -0
- package/.storybook/preview-head.html +5 -0
- package/.storybook/preview.tsx +81 -0
- package/.storybook/styles.scss +25 -0
- package/.storybook/theme.ts +46 -0
- package/.turbo/turbo-build:lib.log +15 -0
- package/CHANGELOG.md +26 -0
- package/lib/cjs/components/Cards/CardGroup/CardGroup.js +0 -1
- package/lib/cjs/components/Cards/CardGroup/index.js +197 -160
- package/lib/cjs/components/Cards/FactlistCard/FactListCard.js +0 -1
- package/lib/cjs/components/Cards/FactlistCard/index.js +0 -1
- package/lib/cjs/components/Cards/TextCard/TextCard.js +1 -1
- package/lib/cjs/components/List/List.js +9 -11
- package/lib/cjs/components/List/ListItem.js +4 -7
- package/lib/cjs/components/List/index.js +1 -2
- package/lib/cjs/components/index.js +0 -1
- package/lib/cjs/index.js +0 -1
- package/lib/esm/components/Cards/CardGroup/CardGroup.js +0 -1
- package/lib/esm/components/Cards/CardGroup/index.js +197 -160
- package/lib/esm/components/Cards/FactlistCard/FactListCard.js +0 -1
- package/lib/esm/components/Cards/FactlistCard/index.js +0 -1
- package/lib/esm/components/Cards/TextCard/TextCard.js +1 -1
- package/lib/esm/components/List/List.js +10 -12
- package/lib/esm/components/List/ListItem.js +4 -7
- package/lib/esm/components/List/index.js +1 -2
- package/lib/esm/components/index.js +0 -1
- package/lib/esm/index.js +0 -1
- package/lib/types/react/src/components/List/List.props.d.ts +2 -9
- package/lib/types/react/src/components/List/ListItem.props.d.ts +0 -6
- package/lib/types/react/src/types/index.d.ts +0 -2
- package/package.json +32 -12
- package/public/fao-logo.svg +195 -0
- package/public/favicon.ico +0 -0
- package/public/hero.jpg +0 -0
- package/public/ilo-dg.jpg +0 -0
- package/public/ilo-headquarters.jpg +0 -0
- package/public/large.jpg +0 -0
- package/public/media-file-poster.jpg +0 -0
- package/public/medium.jpg +0 -0
- package/public/react.svg +8 -0
- package/public/small.jpg +0 -0
- package/public/unhcr-logo.svg +1 -0
- package/public/unicef-logo.png +0 -0
- package/public/video-example.mp4 +0 -0
- package/public/wfp-logo.svg +1 -0
- package/public/who-logo.svg +1 -0
- package/public/youtube-video-poster.avif +0 -0
- package/rollup.config.mjs +2 -0
- package/src/__tests__/Accordion.test.tsx +16 -0
- package/src/__tests__/Button.test.tsx +60 -0
- package/src/__tests__/Callout.test.tsx +43 -0
- package/src/__tests__/ContextMenu.test.tsx +19 -0
- package/src/__tests__/Dropdown.test.tsx +38 -0
- package/src/__tests__/Heading.test.tsx +51 -0
- package/src/__tests__/Image.test.tsx +21 -0
- package/src/__tests__/LinkList.test.tsx +17 -0
- package/src/__tests__/List.test.tsx +25 -0
- package/src/__tests__/Loading.test.tsx +33 -0
- package/src/__tests__/Notification.test.tsx +39 -0
- package/src/__tests__/Pagination.test.tsx +58 -0
- package/src/__tests__/Profile.test.tsx +48 -0
- package/src/__tests__/ReadMore.test.tsx +43 -0
- package/src/__tests__/RichText.test.tsx +16 -0
- package/src/__tests__/SearchField.test.tsx +35 -0
- package/src/__tests__/TableOfContents.test.tsx +12 -0
- package/src/__tests__/Tag.test.tsx +10 -0
- package/src/components/Cards/CardGroup/CardGroup.args.ts +205 -166
- package/src/components/Cards/TextCard/TextCard.tsx +1 -1
- package/src/components/List/List.props.ts +2 -10
- package/src/components/List/List.tsx +17 -22
- package/src/components/List/ListItem.props.ts +0 -7
- package/src/components/List/ListItem.tsx +6 -11
- package/src/setup.ts +6 -0
- package/src/stories/Accordion/Accordion.stories.tsx +145 -0
- package/src/stories/Breadcrumb/Breadcrumb.mdx +17 -0
- package/src/stories/Breadcrumb/Breadcrumb.stories.tsx +20 -0
- package/src/stories/Button/Button.mdx +94 -0
- package/src/stories/Button/Button.stories.tsx +68 -0
- package/src/stories/Callout/Callout.mdx +35 -0
- package/src/stories/Callout/Callout.stories.tsx +43 -0
- package/src/stories/Card/DataCard.stories.tsx +45 -0
- package/src/stories/Card/DetailCard.stories.tsx +41 -0
- package/src/stories/Card/FactlistCard.stories.tsx +48 -0
- package/src/stories/Card/FeatureCard.stories.tsx +56 -0
- package/src/stories/Card/MultilinkCard.stories.tsx +48 -0
- package/src/stories/Card/PromoCard.stories.tsx +48 -0
- package/src/stories/Card/StatCard.stories.tsx +45 -0
- package/src/stories/Card/TextCard.stories.tsx +45 -0
- package/src/stories/CardGroup/CardGroup.mdx +17 -0
- package/src/stories/CardGroup/CardGroup.stories.tsx +50 -0
- package/src/stories/Checkbox/Checkbox.stories.tsx +118 -0
- package/src/stories/ContextMenu/ContextMenu.stories.tsx +83 -0
- package/src/stories/DatePicker/DatePicker.stories.tsx +110 -0
- package/src/stories/Dropdown/Dropdown.stories.tsx +145 -0
- package/src/stories/Empty/Empty.stories.tsx +53 -0
- package/src/stories/Fieldset/Fieldset.stories.tsx +167 -0
- package/src/stories/FileUpload/FileUpload.stories.tsx +103 -0
- package/src/stories/Footer/Footer.mdx +17 -0
- package/src/stories/Footer/Footer.stories.tsx +15 -0
- package/src/stories/Form/Form.mdx +58 -0
- package/src/stories/Form/Form.stories.tsx +162 -0
- package/src/stories/GetStarted.mdx +57 -0
- package/src/stories/Heading/Heading.stories.tsx +193 -0
- package/src/stories/Hero/Hero.stories.tsx +68 -0
- package/src/stories/Image/Image.stories.tsx +50 -0
- package/src/stories/Link/Link.stories.tsx +81 -0
- package/src/stories/LinkList/LinkList.args.ts +190 -0
- package/src/stories/LinkList/LinkList.stories.tsx +60 -0
- package/src/stories/List/List.stories.tsx +167 -0
- package/src/stories/Loading/Loading.stories.tsx +97 -0
- package/src/stories/LocalNav/LocalNav.mdx +17 -0
- package/src/stories/LocalNav/LocalNav.stories.tsx +15 -0
- package/src/stories/Logo/Logo.stories.tsx +172 -0
- package/src/stories/LogoGrid/LogoGrid.stories.tsx +59 -0
- package/src/stories/Navigation/Navigation.mdx +17 -0
- package/src/stories/Navigation/Navigation.stories.tsx +15 -0
- package/src/stories/Notification/Notification.stories.tsx +187 -0
- package/src/stories/NumberPicker/NumberPicker.stories.tsx +69 -0
- package/src/stories/Pagination/Pagination.stories.tsx +86 -0
- package/src/stories/Profile/Profile.stories.tsx +64 -0
- package/src/stories/Radio/Radio.stories.tsx +232 -0
- package/src/stories/ReadMore/ReadMore.stories.tsx +59 -0
- package/src/stories/RichText/RichText.stories.tsx +63 -0
- package/src/stories/SearchField/SearchField.stories.tsx +91 -0
- package/src/stories/SocialMedia/SocialMedia.stories.tsx +60 -0
- package/src/stories/TableOfContents/TableOfContents.stories.tsx +55 -0
- package/src/stories/Tabs/Tabs.mdx +17 -0
- package/src/stories/Tabs/Tabs.stories.tsx +25 -0
- package/src/stories/Tag/Tag.stories.tsx +130 -0
- package/src/stories/TextInput/TextInput.stories.tsx +100 -0
- package/src/stories/Textarea/Textarea.stories.tsx +147 -0
- package/src/stories/Toggle/Toggle.stories.tsx +99 -0
- package/src/stories/Tooltip/Tooltip.stories.tsx +82 -0
- package/src/stories/Video/Video.stories.tsx +71 -0
- package/src/stories/Welcome.stories.mdx +37 -0
- package/src/stories/assets/code-brackets.svg +1 -0
- package/src/stories/assets/colors.svg +1 -0
- package/src/stories/assets/comments.svg +1 -0
- package/src/stories/assets/direction.svg +1 -0
- package/src/stories/assets/flow.svg +1 -0
- package/src/stories/assets/plugin.svg +1 -0
- package/src/stories/assets/repo.svg +1 -0
- package/src/stories/assets/stackalt.svg +1 -0
- package/src/stories/welcome.scss +133 -0
- package/src/types/index.ts +0 -2
- package/lib/cjs/ListCtx-14aa546f.js +0 -9
- package/lib/esm/ListCtx-da435fdf.js +0 -6
- package/lib/types/react/src/components/List/ListCtx.d.ts +0 -4
- package/src/components/List/ListCtx.ts +0 -7
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { StoryFn, Meta } from "@storybook/react";
|
|
2
|
+
import {
|
|
3
|
+
Title,
|
|
4
|
+
Description,
|
|
5
|
+
Primary,
|
|
6
|
+
ArgsTable,
|
|
7
|
+
Stories,
|
|
8
|
+
Subheading,
|
|
9
|
+
} from "@storybook/addon-docs";
|
|
10
|
+
import { Tag, TagSet } from "../../components/Tag";
|
|
11
|
+
import { TagProps } from "../../components/Tag/Tag.props";
|
|
12
|
+
import tagSetArgs from "../../components/Tag/TagSet.args";
|
|
13
|
+
import tagArgs from "../../components/Tag/Tag.args";
|
|
14
|
+
|
|
15
|
+
const themeDoc = `
|
|
16
|
+
By changing the \`type\` prop you can set the which kind of tag to use.
|
|
17
|
+
|
|
18
|
+
| Prop | Description |
|
|
19
|
+
|----------|-------------|
|
|
20
|
+
| \`anochor\` | The tag is a link. Useful for taxonomies that have landing pages. |
|
|
21
|
+
| \`button\` | The tag is a button. Useful for tags that are used to filter search results. |
|
|
22
|
+
| \`display\` | The tag is static (not clickable). Useful for displaying non-actionable info. |
|
|
23
|
+
`;
|
|
24
|
+
|
|
25
|
+
const TagMeta: Meta<typeof Tag> = {
|
|
26
|
+
title: "Components/User Interface/Tag",
|
|
27
|
+
tags: ["autodocs"],
|
|
28
|
+
component: Tag,
|
|
29
|
+
argTypes: {
|
|
30
|
+
type: {
|
|
31
|
+
options: ["anchor", "button", "display"],
|
|
32
|
+
control: { type: "select" },
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
parameters: {
|
|
36
|
+
docs: {
|
|
37
|
+
page: () => (
|
|
38
|
+
<>
|
|
39
|
+
<Title />
|
|
40
|
+
<Description>
|
|
41
|
+
The tag component creates an anchor tag with a specific theme.
|
|
42
|
+
</Description>
|
|
43
|
+
<Primary />
|
|
44
|
+
<Subheading>Types of tags</Subheading>
|
|
45
|
+
<Description>{themeDoc}</Description>
|
|
46
|
+
<Stories title="Examples"></Stories>
|
|
47
|
+
<Subheading>Default props</Subheading>
|
|
48
|
+
<ArgsTable />
|
|
49
|
+
</>
|
|
50
|
+
),
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export default TagMeta;
|
|
56
|
+
|
|
57
|
+
const DisplayTagTemplate: StoryFn<TagProps> = (args) => (
|
|
58
|
+
<TagSet {...tagSetArgs.tag} {...args}>
|
|
59
|
+
<Tag {...tagArgs.tag} type="display">
|
|
60
|
+
Economy
|
|
61
|
+
</Tag>
|
|
62
|
+
<Tag {...tagArgs.tag} id="tag2" type="display">
|
|
63
|
+
Trade
|
|
64
|
+
</Tag>
|
|
65
|
+
<Tag {...tagArgs.tag} id="tag3" type="display">
|
|
66
|
+
Statistics
|
|
67
|
+
</Tag>
|
|
68
|
+
<Tag {...tagArgs.tag} id="tag4" type="display">
|
|
69
|
+
Human rights
|
|
70
|
+
</Tag>
|
|
71
|
+
<Tag {...tagArgs.tag} id="tag5" type="display">
|
|
72
|
+
Employment
|
|
73
|
+
</Tag>
|
|
74
|
+
</TagSet>
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
const AnchorTagTemplate: StoryFn<TagProps> = (args) => (
|
|
78
|
+
<TagSet {...tagSetArgs.tag} {...args}>
|
|
79
|
+
<Tag {...tagArgs.tag} url="https://www.google.com/" type="anchor">
|
|
80
|
+
Economy
|
|
81
|
+
</Tag>
|
|
82
|
+
<Tag {...tagArgs.tag} id="tag2" url="https://www.google.com/" type="anchor">
|
|
83
|
+
Trade
|
|
84
|
+
</Tag>
|
|
85
|
+
<Tag {...tagArgs.tag} id="tag3" url="https://www.google.com/" type="anchor">
|
|
86
|
+
Statistics
|
|
87
|
+
</Tag>
|
|
88
|
+
<Tag {...tagArgs.tag} id="tag4" url="https://www.google.com/" type="anchor">
|
|
89
|
+
Human rights
|
|
90
|
+
</Tag>
|
|
91
|
+
<Tag {...tagArgs.tag} id="tag5" url="https://www.google.com/" type="anchor">
|
|
92
|
+
Employment
|
|
93
|
+
</Tag>
|
|
94
|
+
</TagSet>
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
const ButtonTagTemplate: StoryFn<TagProps> = (args) => (
|
|
98
|
+
<TagSet {...tagSetArgs.buttonTag} {...args}>
|
|
99
|
+
<Tag {...tagArgs.tag} id="tag1" url="https://www.google.com/" type="button">
|
|
100
|
+
Economy
|
|
101
|
+
</Tag>
|
|
102
|
+
<Tag {...tagArgs.tag} id="tag2" url="https://www.google.com/" type="button">
|
|
103
|
+
Trade
|
|
104
|
+
</Tag>
|
|
105
|
+
<Tag {...tagArgs.tag} id="tag3" url="https://www.google.com/" type="button">
|
|
106
|
+
Statistics
|
|
107
|
+
</Tag>
|
|
108
|
+
<Tag {...tagArgs.tag} id="tag4" url="https://www.google.com/" type="button">
|
|
109
|
+
Human rights
|
|
110
|
+
</Tag>
|
|
111
|
+
<Tag {...tagArgs.tag} id="tag5" url="https://www.google.com/" type="button">
|
|
112
|
+
Employment
|
|
113
|
+
</Tag>
|
|
114
|
+
</TagSet>
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
export const DisplayTag: StoryFn<TagProps> = DisplayTagTemplate.bind({});
|
|
118
|
+
|
|
119
|
+
export const AnchorTag: StoryFn<TagProps> = AnchorTagTemplate.bind({});
|
|
120
|
+
|
|
121
|
+
export const ButtonTag: StoryFn<TagProps> = ButtonTagTemplate.bind({});
|
|
122
|
+
|
|
123
|
+
DisplayTag.args = tagSetArgs.tag;
|
|
124
|
+
DisplayTag.storyName = "Display";
|
|
125
|
+
|
|
126
|
+
AnchorTag.args = tagSetArgs.tag;
|
|
127
|
+
AnchorTag.storyName = "Anchor";
|
|
128
|
+
|
|
129
|
+
ButtonTag.args = tagSetArgs.buttonTag;
|
|
130
|
+
ButtonTag.storyName = "Button";
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { TextInput, TextInputArgs } from "../../components/TextInput";
|
|
3
|
+
import {
|
|
4
|
+
ArgTypes,
|
|
5
|
+
Description,
|
|
6
|
+
Primary,
|
|
7
|
+
Stories,
|
|
8
|
+
Subheading,
|
|
9
|
+
Title,
|
|
10
|
+
} from "@storybook/blocks";
|
|
11
|
+
import { labelledFormFieldArgTypes } from "../../types/forms.args";
|
|
12
|
+
|
|
13
|
+
const TextInputMeta: Meta<typeof TextInput> = {
|
|
14
|
+
title: "Components/Forms/TextInput",
|
|
15
|
+
component: TextInput,
|
|
16
|
+
tags: ["autodocs"],
|
|
17
|
+
argTypes: {
|
|
18
|
+
pattern: {
|
|
19
|
+
description:
|
|
20
|
+
"Optional pattern attribute for phone numbers, zip codes, etc.",
|
|
21
|
+
control: "select",
|
|
22
|
+
options: ["email", "hidden", "password", "search", "tel", "text", "url"],
|
|
23
|
+
|
|
24
|
+
table: {
|
|
25
|
+
type: {
|
|
26
|
+
summary: "email | hidden | password | search | tel | text| url",
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
...labelledFormFieldArgTypes("HTMLTextAreaElement"),
|
|
31
|
+
},
|
|
32
|
+
parameters: {
|
|
33
|
+
docs: {
|
|
34
|
+
page: () => (
|
|
35
|
+
<>
|
|
36
|
+
<Title />
|
|
37
|
+
<Description>
|
|
38
|
+
The TextInput field provides a way for users with a single line of
|
|
39
|
+
text to enter into a form. Use this component for things like names,
|
|
40
|
+
email addresses, passwords and other short form fields.
|
|
41
|
+
</Description>
|
|
42
|
+
<Primary />
|
|
43
|
+
<ArgTypes of={TextInputMeta} />
|
|
44
|
+
<Stories />
|
|
45
|
+
</>
|
|
46
|
+
),
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export default TextInputMeta;
|
|
52
|
+
|
|
53
|
+
export const Basic: StoryObj<typeof TextInput> = {
|
|
54
|
+
args: TextInputArgs.basic,
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export const WithLabel: StoryObj<typeof TextInput> = {
|
|
58
|
+
args: TextInputArgs.basic,
|
|
59
|
+
render: (props) => <TextInput {...props} />,
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export const WithHelperText: StoryObj<typeof TextInput> = {
|
|
63
|
+
args: TextInputArgs.basic,
|
|
64
|
+
render: (props) => <TextInput {...props} />,
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export const Error: StoryObj<typeof TextInput> = {
|
|
68
|
+
args: TextInputArgs.haserror,
|
|
69
|
+
render: (props) => <TextInput {...props} />,
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
export const Disabled: StoryObj<typeof TextInput> = {
|
|
73
|
+
args: TextInputArgs.isdisabled,
|
|
74
|
+
render: (props) => <TextInput {...props} />,
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
export const WithToolTip: StoryObj<typeof TextInput> = {
|
|
78
|
+
args: TextInputArgs.basic,
|
|
79
|
+
render: (props) => <TextInput {...props} />,
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
export const Email: StoryObj<typeof TextInput> = {
|
|
83
|
+
args: TextInputArgs.email,
|
|
84
|
+
render: (props) => <TextInput {...props} />,
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export const Telephone: StoryObj<typeof TextInput> = {
|
|
88
|
+
args: TextInputArgs.telephone,
|
|
89
|
+
render: (props) => <TextInput {...props} />,
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
export const Password: StoryObj<typeof TextInput> = {
|
|
93
|
+
args: TextInputArgs.password,
|
|
94
|
+
render: (props) => <TextInput {...props} />,
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
export const URL: StoryObj<typeof TextInput> = {
|
|
98
|
+
args: TextInputArgs.url,
|
|
99
|
+
render: (props) => <TextInput {...props} />,
|
|
100
|
+
};
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { Textarea, TextareaArgs } from "../../components/Textarea";
|
|
3
|
+
import {
|
|
4
|
+
ArgTypes,
|
|
5
|
+
Description,
|
|
6
|
+
Primary,
|
|
7
|
+
Stories,
|
|
8
|
+
Subheading,
|
|
9
|
+
Title,
|
|
10
|
+
} from "@storybook/blocks";
|
|
11
|
+
import { labelledFormFieldArgTypes } from "../../types/forms.args";
|
|
12
|
+
|
|
13
|
+
const TextareaMeta: Meta<typeof Textarea> = {
|
|
14
|
+
title: "Components/Forms/Textarea",
|
|
15
|
+
component: Textarea,
|
|
16
|
+
tags: ["autodocs"],
|
|
17
|
+
argTypes: {
|
|
18
|
+
autocorrect: {
|
|
19
|
+
description:
|
|
20
|
+
"Activate automatic spelling correction and processing of text substitutions",
|
|
21
|
+
control: {
|
|
22
|
+
type: "select",
|
|
23
|
+
options: ["on", "off"],
|
|
24
|
+
},
|
|
25
|
+
table: {
|
|
26
|
+
type: {
|
|
27
|
+
summary: "on | off",
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
form: {
|
|
32
|
+
description:
|
|
33
|
+
"The id of the form element the Textarea belongs to if it's not nested inside the form.",
|
|
34
|
+
control: {
|
|
35
|
+
type: "text",
|
|
36
|
+
},
|
|
37
|
+
table: {
|
|
38
|
+
type: {
|
|
39
|
+
summary: "string",
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
maxlength: {
|
|
44
|
+
description: "The maximum number of characters that the user can enter.",
|
|
45
|
+
control: {
|
|
46
|
+
type: "number",
|
|
47
|
+
},
|
|
48
|
+
table: {
|
|
49
|
+
type: {
|
|
50
|
+
summary: "number",
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
minlength: {
|
|
55
|
+
description: "The minimum number of characters that the user can enter.",
|
|
56
|
+
control: {
|
|
57
|
+
type: "number",
|
|
58
|
+
},
|
|
59
|
+
table: {
|
|
60
|
+
type: {
|
|
61
|
+
summary: "number",
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
placeholder: {
|
|
66
|
+
description: "The placeholder text for the textarea",
|
|
67
|
+
control: {
|
|
68
|
+
type: "text",
|
|
69
|
+
},
|
|
70
|
+
table: {
|
|
71
|
+
type: {
|
|
72
|
+
summary: "string",
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
spellcheck: {
|
|
77
|
+
description:
|
|
78
|
+
"Specifies whether the textarea is subject to spellchecking by the underlying browser/OS",
|
|
79
|
+
control: {
|
|
80
|
+
type: "select",
|
|
81
|
+
options: [true, false, "default"],
|
|
82
|
+
},
|
|
83
|
+
table: {
|
|
84
|
+
type: {
|
|
85
|
+
summary: "true | false | 'default'",
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
wrap: {
|
|
90
|
+
description:
|
|
91
|
+
"Specifies how the text in a textarea is to be wrapped when submitted in a form",
|
|
92
|
+
control: {
|
|
93
|
+
type: "select",
|
|
94
|
+
options: ["hard", "soft", "off"],
|
|
95
|
+
},
|
|
96
|
+
table: {
|
|
97
|
+
type: {
|
|
98
|
+
summary: "'hard' | 'soft' | 'off'",
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
...labelledFormFieldArgTypes("HTMLTextAreaElement"),
|
|
103
|
+
},
|
|
104
|
+
parameters: {
|
|
105
|
+
docs: {
|
|
106
|
+
page: () => (
|
|
107
|
+
<>
|
|
108
|
+
<Title />
|
|
109
|
+
<Description>
|
|
110
|
+
The Textarea field provides a way for users with a multiple lines of
|
|
111
|
+
text to enter into a form. Use this component for things like
|
|
112
|
+
comments, descriptions, and other long form fields.
|
|
113
|
+
</Description>
|
|
114
|
+
<Primary />
|
|
115
|
+
<Subheading>Accessibility</Subheading>
|
|
116
|
+
<Description>
|
|
117
|
+
The Textarea component must have an `id` prop to map a label to the
|
|
118
|
+
form element.
|
|
119
|
+
</Description>
|
|
120
|
+
<ArgTypes of={TextareaMeta} />
|
|
121
|
+
<Stories />
|
|
122
|
+
</>
|
|
123
|
+
),
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
export default TextareaMeta;
|
|
129
|
+
|
|
130
|
+
export const Basic: StoryObj<typeof Textarea> = {
|
|
131
|
+
args: TextareaArgs.basic,
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
export const WithLabel: StoryObj<typeof Textarea> = {
|
|
135
|
+
args: TextareaArgs.basic,
|
|
136
|
+
render: (props) => <Textarea {...props} />,
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
export const WithError: StoryObj<typeof Textarea> = {
|
|
140
|
+
args: TextareaArgs.basic,
|
|
141
|
+
render: (props) => <Textarea {...props} error />,
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
export const disabled: StoryObj<typeof Textarea> = {
|
|
145
|
+
args: TextareaArgs.disabled,
|
|
146
|
+
render: (props) => <Textarea {...props} />,
|
|
147
|
+
};
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { Toggle, ToggleArgs } from "../../components/Toggle";
|
|
3
|
+
import {
|
|
4
|
+
ArgTypes,
|
|
5
|
+
Description,
|
|
6
|
+
Heading,
|
|
7
|
+
Primary,
|
|
8
|
+
Stories,
|
|
9
|
+
Title,
|
|
10
|
+
} from "@storybook/blocks";
|
|
11
|
+
import { labelledChoiceFieldArgTypes } from "../../types/forms.args";
|
|
12
|
+
|
|
13
|
+
const ToggleMeta: Meta<typeof Toggle> = {
|
|
14
|
+
title: "Components/Forms/Toggle",
|
|
15
|
+
component: Toggle,
|
|
16
|
+
tags: ["autodocs"],
|
|
17
|
+
argTypes: {
|
|
18
|
+
...labelledChoiceFieldArgTypes("HTMLInputElement"),
|
|
19
|
+
size: {
|
|
20
|
+
description: "The size of the toggle",
|
|
21
|
+
control: "select",
|
|
22
|
+
options: ["small", "medium", "large"],
|
|
23
|
+
table: {
|
|
24
|
+
defaultValue: { summary: "medium" },
|
|
25
|
+
type: {
|
|
26
|
+
summary: "small | medium | large",
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
onClick: {
|
|
31
|
+
description: "The click event handler",
|
|
32
|
+
table: {
|
|
33
|
+
type: {
|
|
34
|
+
summary: "(event: React.MouseEventHandler<HTMLInputElement>) => any",
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
parameters: {
|
|
40
|
+
docs: {
|
|
41
|
+
page: () => (
|
|
42
|
+
<>
|
|
43
|
+
<Title />
|
|
44
|
+
<Description>
|
|
45
|
+
The toggle component provides users with a switch they can use to
|
|
46
|
+
turn a single option on or off or alternate between two different
|
|
47
|
+
states.
|
|
48
|
+
</Description>
|
|
49
|
+
<Primary />
|
|
50
|
+
<Heading>Props</Heading>
|
|
51
|
+
<ArgTypes of={ToggleMeta} />
|
|
52
|
+
<Stories />
|
|
53
|
+
</>
|
|
54
|
+
),
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export default ToggleMeta;
|
|
60
|
+
|
|
61
|
+
export const Default: StoryObj<typeof Toggle> = {
|
|
62
|
+
args: ToggleArgs.Default,
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
export const DefaultChecked: StoryObj<typeof Toggle> = {
|
|
66
|
+
args: ToggleArgs.DefaultChecked,
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export const Disabled: StoryObj<typeof Toggle> = {
|
|
70
|
+
args: ToggleArgs.Disabled,
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
export const Helper: StoryObj<typeof Toggle> = {
|
|
74
|
+
args: ToggleArgs.Helper,
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
export const Tooltip: StoryObj<typeof Toggle> = {
|
|
78
|
+
args: ToggleArgs.Tooltip,
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
export const Error: StoryObj<typeof Toggle> = {
|
|
82
|
+
args: ToggleArgs.Error,
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export const Controlled: StoryObj<typeof Toggle> = {
|
|
86
|
+
args: ToggleArgs.Controlled,
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export const Small: StoryObj<typeof Toggle> = {
|
|
90
|
+
args: ToggleArgs.Small,
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
export const Medium: StoryObj<typeof Toggle> = {
|
|
94
|
+
args: ToggleArgs.Medium,
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
export const Large: StoryObj<typeof Toggle> = {
|
|
98
|
+
args: ToggleArgs.Large,
|
|
99
|
+
};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { StoryFn, Meta } from "@storybook/react";
|
|
2
|
+
import {
|
|
3
|
+
Title,
|
|
4
|
+
Description,
|
|
5
|
+
Primary,
|
|
6
|
+
ArgsTable,
|
|
7
|
+
Stories,
|
|
8
|
+
Subheading,
|
|
9
|
+
} from "@storybook/addon-docs";
|
|
10
|
+
import { Tooltip } from "../../components/Tooltip";
|
|
11
|
+
import { TooltipProps } from "../../components/Tooltip/Tooltip.props";
|
|
12
|
+
import tooltipArgs from "../../components/Tooltip/Tooltip.args";
|
|
13
|
+
|
|
14
|
+
const TooltipMeta: Meta<typeof Tooltip> = {
|
|
15
|
+
title: "Components/Feedback/Tooltip",
|
|
16
|
+
component: Tooltip,
|
|
17
|
+
tags: ["autodocs"],
|
|
18
|
+
argTypes: {
|
|
19
|
+
icon: {
|
|
20
|
+
options: [true, false],
|
|
21
|
+
control: { type: "boolean" },
|
|
22
|
+
},
|
|
23
|
+
theme: {
|
|
24
|
+
options: ["light", "dark"],
|
|
25
|
+
control: { type: "select" },
|
|
26
|
+
},
|
|
27
|
+
iconTheme: {
|
|
28
|
+
options: ["light", "dark"],
|
|
29
|
+
control: { type: "select" },
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
parameters: {
|
|
33
|
+
docs: {
|
|
34
|
+
page: () => (
|
|
35
|
+
<>
|
|
36
|
+
<Title />
|
|
37
|
+
<Description>
|
|
38
|
+
Tooltips display informative text when a user hovers over, focus on,
|
|
39
|
+
or taps an element.
|
|
40
|
+
</Description>
|
|
41
|
+
<Primary />
|
|
42
|
+
<Stories title="Examples"></Stories>
|
|
43
|
+
<Subheading>Default props</Subheading>
|
|
44
|
+
<ArgsTable />
|
|
45
|
+
</>
|
|
46
|
+
),
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export default TooltipMeta;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Tooltip Template
|
|
55
|
+
*
|
|
56
|
+
* create a Storybook template for this component
|
|
57
|
+
*
|
|
58
|
+
*@param (Object) args - props to be passed to the component
|
|
59
|
+
*/
|
|
60
|
+
const TooltipTemplate: StoryFn<TooltipProps> = (args) => (
|
|
61
|
+
<Tooltip {...args}>Hover over this to see a tooltip</Tooltip>
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Tooltip Instance
|
|
66
|
+
*
|
|
67
|
+
*/
|
|
68
|
+
export const Light: StoryFn<TooltipProps> = TooltipTemplate.bind({});
|
|
69
|
+
|
|
70
|
+
export const Dark: StoryFn<TooltipProps> = TooltipTemplate.bind({});
|
|
71
|
+
|
|
72
|
+
export const DarkIcon: StoryFn<TooltipProps> = TooltipTemplate.bind({});
|
|
73
|
+
|
|
74
|
+
// enumerate the props for the tooltip
|
|
75
|
+
Light.args = tooltipArgs.light;
|
|
76
|
+
Light.storyName = "Light";
|
|
77
|
+
|
|
78
|
+
Dark.args = tooltipArgs.dark;
|
|
79
|
+
Dark.storyName = "Dark";
|
|
80
|
+
|
|
81
|
+
DarkIcon.args = tooltipArgs.darkicon;
|
|
82
|
+
DarkIcon.storyName = "Icon";
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { StoryFn, Meta } from "@storybook/react";
|
|
2
|
+
import {
|
|
3
|
+
Title,
|
|
4
|
+
Description,
|
|
5
|
+
Primary,
|
|
6
|
+
ArgsTable,
|
|
7
|
+
Subheading,
|
|
8
|
+
} from "@storybook/addon-docs";
|
|
9
|
+
import { Video } from "../../components/Video";
|
|
10
|
+
import { VideoProps } from "../../components/Video/Video.props";
|
|
11
|
+
import videoArgs from "../../components/Video/Video.args";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Video Story
|
|
15
|
+
*
|
|
16
|
+
*/
|
|
17
|
+
const VideoMeta: Meta<typeof Video> = {
|
|
18
|
+
title: "Components/Media/Video",
|
|
19
|
+
tags: ["autodocs"],
|
|
20
|
+
component: Video,
|
|
21
|
+
argTypes: {},
|
|
22
|
+
parameters: {
|
|
23
|
+
docs: {
|
|
24
|
+
page: () => (
|
|
25
|
+
<>
|
|
26
|
+
<Title />
|
|
27
|
+
<Description>
|
|
28
|
+
The Video component displays a video, which can be either a media
|
|
29
|
+
file or an embed from a video hosting service like YouTube. It uses
|
|
30
|
+
[react-player](https://github.com/CookPete/react-player) under the
|
|
31
|
+
hood so look there for further documentation.
|
|
32
|
+
</Description>
|
|
33
|
+
<Primary />
|
|
34
|
+
<Subheading>Default props</Subheading>
|
|
35
|
+
<ArgsTable />
|
|
36
|
+
</>
|
|
37
|
+
),
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export default VideoMeta;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* VideoTemplate
|
|
46
|
+
*
|
|
47
|
+
* create a Storybook template for this component
|
|
48
|
+
*
|
|
49
|
+
*@param (Object) args - props to be passed to the component
|
|
50
|
+
*/
|
|
51
|
+
const VideoTemplate: StoryFn<VideoProps> = (args) => <Video {...args} />;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Video File Instance
|
|
55
|
+
*
|
|
56
|
+
*/
|
|
57
|
+
export const VideoFileMedia: StoryFn<VideoProps> = VideoTemplate.bind({});
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Video YouTube Instance
|
|
61
|
+
*
|
|
62
|
+
*/
|
|
63
|
+
export const VideoYTMedia: StoryFn<VideoProps> = VideoTemplate.bind({});
|
|
64
|
+
|
|
65
|
+
// enumerate the props for the video file option
|
|
66
|
+
VideoFileMedia.args = videoArgs.videofile;
|
|
67
|
+
VideoFileMedia.storyName = "Media file";
|
|
68
|
+
|
|
69
|
+
// enumerate the props for the video youtube option
|
|
70
|
+
VideoYTMedia.args = videoArgs.videoyt;
|
|
71
|
+
VideoYTMedia.storyName = "YouTube";
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Meta } from "@storybook/blocks";
|
|
2
|
+
import { Button } from "../components/Button";
|
|
3
|
+
import "./welcome.scss";
|
|
4
|
+
import { version } from "../../package.json";
|
|
5
|
+
|
|
6
|
+
<Meta title="Welcome" />
|
|
7
|
+
|
|
8
|
+
<div>
|
|
9
|
+
<div className="welcome">
|
|
10
|
+
<h1 className="welcome--title">ILO Design System</h1>
|
|
11
|
+
<h3 className="welcome--subtitle">
|
|
12
|
+
<img src="/react.svg" alt="React Icon" />
|
|
13
|
+
<span>React Components</span>
|
|
14
|
+
</h3>
|
|
15
|
+
<span className="welcome--version">v{version}</span>
|
|
16
|
+
<a
|
|
17
|
+
className="ilo--button ilo--button--large ilo--button--primary optionalclassName"
|
|
18
|
+
href="/?path=/docs/getting-started--overview"
|
|
19
|
+
target="true"
|
|
20
|
+
rel="noopener noreferrer"
|
|
21
|
+
>
|
|
22
|
+
<span className="link__label">Get started</span>
|
|
23
|
+
</a>
|
|
24
|
+
</div>
|
|
25
|
+
<div className="triangles">
|
|
26
|
+
<div
|
|
27
|
+
className="triangle triangle1"
|
|
28
|
+
onMouseOver={(e) => {
|
|
29
|
+
if (!e.target.classList.contains("spinning")) {
|
|
30
|
+
e.target.classList.add("spinning");
|
|
31
|
+
}
|
|
32
|
+
}}
|
|
33
|
+
></div>
|
|
34
|
+
<div className="triangle triangle2"></div>
|
|
35
|
+
<div className="triangle triangle3"></div>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48" version="1.1" viewBox="0 0 48 48"><title>illustration/code-brackets</title><g id="illustration/code-brackets" fill="none" fill-rule="evenodd" stroke="none" stroke-width="1"><path id="Combined-Shape" fill="#87E6E5" d="M11.4139325,12 C11.7605938,12 12,12.5059743 12,13.3779712 L12,17.4951758 L6.43502246,23.3839989 C5.85499251,23.9978337 5.85499251,25.0021663 6.43502246,25.6160011 L12,31.5048242 L12,35.6220288 C12,36.4939606 11.7605228,37 11.4139325,37 C11.2725831,37 11.1134406,36.9158987 10.9453839,36.7379973 L0.435022463,25.6160011 C-0.145007488,25.0021663 -0.145007488,23.9978337 0.435022463,23.3839989 L10.9453839,12.2620027 C11.1134051,12.0841663 11.2725831,12 11.4139325,12 Z M36.5860675,12 C36.7274169,12 36.8865594,12.0841013 37.0546161,12.2620027 L47.5649775,23.3839989 C48.1450075,23.9978337 48.1450075,25.0021663 47.5649775,25.6160011 L37.0546161,36.7379973 C36.8865949,36.9158337 36.7274169,37 36.5860675,37 C36.2394062,37 36,36.4940257 36,35.6220288 L36,31.5048242 L41.5649775,25.6160011 C42.1450075,25.0021663 42.1450075,23.9978337 41.5649775,23.3839989 L36,17.4951758 L36,13.3779712 C36,12.5060394 36.2394772,12 36.5860675,12 Z"/><rect id="Rectangle-7-Copy-5" width="35.57" height="4" x="5.009" y="22.662" fill="#A0DB77" rx="2" transform="translate(22.793959, 24.662305) rotate(-75.000000) translate(-22.793959, -24.662305)"/></g></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48" version="1.1" viewBox="0 0 48 48"><title>illustration/colors</title><g id="illustration/colors" fill="none" fill-rule="evenodd" stroke="none" stroke-width="1"><circle id="Oval" cx="23.763" cy="16.192" r="13.271" fill="#FC521F" opacity=".6"/><circle id="Oval-Copy" cx="15.468" cy="32.308" r="13.271" fill="#66BF3C" opacity=".6"/><path id="Combined-Shape" fill="#FF5F95" d="M15.4683651,19.0362231 C21.5434817,19.0362231 26.6652087,23.1181689 28.2404554,28.6889694 C26.8420385,29.1906678 25.3344184,29.4637769 23.7630101,29.4637769 C17.6878936,29.4637769 12.5661666,25.3818311 10.9909199,19.8110306 C12.3898993,19.3092302 13.8972501,19.0362231 15.4683651,19.0362231 Z"/><circle id="Oval-Copy-2" cx="32.532" cy="32.308" r="13.271" fill="#1EA7FD" opacity=".6"/><path id="Combined-Shape" fill="#87E6E5" d="M24.00025,22.1417324 C26.897967,24.5762286 28.7397972,28.2268506 28.7397972,32.3076552 C28.7397972,36.3884597 26.897967,40.0390817 24.00025,42.4735779 C21.1018087,40.038637 19.2602028,36.3882111 19.2602028,32.3076552 C19.2602028,28.2815316 21.0530043,24.6741393 23.8838362,22.2402492 Z"/><path id="Combined-Shape" fill="#FBD178" d="M32.5316349,19.0362231 C33.9415155,19.0362231 35.3000478,19.2560712 36.5748203,19.6633557 C35.0489179,25.3104816 29.8909911,29.4637769 23.7630101,29.4637769 C22.3527608,29.4637769 20.9938866,29.2438138 19.7188247,28.8363247 C21.2451195,23.1900077 26.403293,19.0362231 32.5316349,19.0362231 Z"/><path id="Combined-Shape" fill="#FFF" d="M24.00025,22.1417324 L24.0124326,22.1519799 C24.1747744,22.288701 24.3337918,22.4292434 24.4893463,22.5734686 L24.3896855,22.4820008 C24.4671836,22.552408 24.5438453,22.6237194 24.619654,22.6959185 L24.4893463,22.5734686 C24.5690639,22.6473803 24.6478719,22.7222591 24.7257519,22.7980864 L24.619654,22.6959185 C24.6907654,22.7636441 24.7611262,22.8321506 24.8307226,22.9014245 L24.7257519,22.7980864 C24.8120661,22.8821258 24.8972403,22.9673303 24.981249,23.0536745 L24.8307226,22.9014245 C24.9073006,22.9776475 24.9829531,23.0547994 25.0576619,23.132862 L25.057852,23.1330605 C25.3140855,23.4007967 25.559391,23.679459 25.7928375,23.9681079 L25.7230574,23.8825538 C25.7985998,23.9743942 25.8729325,24.0672672 25.9460311,24.1611484 L25.7928375,23.9681079 C25.8624256,24.0541514 25.93096,24.1410823 25.998421,24.228881 L25.9460311,24.1611484 C26.0074362,24.2400115 26.0679704,24.319586 26.1276194,24.3998576 L25.998421,24.228881 C26.0663495,24.317288 26.1331896,24.4065749 26.1989214,24.4967216 L26.1276194,24.3998576 C26.204848,24.5037867 26.2805926,24.6088841 26.3548219,24.7151187 L26.1989214,24.4967216 C26.2678555,24.59126 26.3355706,24.6867441 26.4020436,24.7831507 L26.3548219,24.7151187 C26.4130013,24.798383 26.4702498,24.8823459 26.5265523,24.9669921 L26.4020436,24.7831507 C26.4678788,24.8786322 26.5324956,24.9750187 26.5958716,25.0722875 L26.5959296,25.0723765 C26.736338,25.2878741 26.870709,25.5077955 26.9987399,25.7318073 L26.9410662,25.6319089 C26.9973106,25.7283602 27.0523736,25.8255849 27.1062352,25.9235633 L26.9987399,25.7318073 C27.0539848,25.8284676 27.1080492,25.9258895 27.1609136,26.0240532 L27.1606656,26.0235927 C27.2696676,26.2259984 27.3733426,26.4310837 27.4717677,26.6391379 L27.4715275,26.6386302 C27.5541941,26.8133735 27.6329386,26.9896914 27.7079006,27.1679911 C27.7630163,27.299081 27.8161443,27.431391 27.8671831,27.5647345 L27.804312,27.4036517 C27.8391482,27.4912057 27.8730792,27.5792182 27.9060936,27.6676774 L27.8671831,27.5647345 C27.906613,27.6677486 27.9447959,27.7713796 27.9817136,27.8756091 L27.9060936,27.6676774 C27.946474,27.7758735 27.9854831,27.884738 28.0230997,27.9942498 L27.9817136,27.8756091 C28.0144978,27.9681688 28.0462842,28.0612004 28.0770597,28.1546911 L28.0230997,27.9942498 C28.0618265,28.1069941 28.0990774,28.2204244 28.1348294,28.3345177 L28.0770597,28.1546911 C28.1112208,28.2584663 28.1441365,28.3628071 28.175789,28.4676958 L28.1756797,28.4673338 L28.2408136,28.6893554 C28.2284694,28.6937793 28.2161167,28.6981854 28.2037557,28.7025737 L28.2404554,28.6889694 C27.9517707,28.7925384 27.6584322,28.8863659 27.3608394,28.97006 L27.3609965,28.9702524 C27.0695498,29.0519815 26.7741843,29.1241944 26.4751174,29.1863314 L26.5385665,29.1730829 C26.3901218,29.2046704 26.2407589,29.2337757 26.0905233,29.2603535 L26.4751174,29.1863314 C26.3367402,29.215082 26.1975707,29.2416755 26.0576458,29.2660754 L26.0905233,29.2603535 C25.9366833,29.2875689 25.7819282,29.312134 25.6263069,29.334 L26.0576458,29.2660754 C25.9017815,29.2932549 25.7449801,29.3177127 25.5872928,29.3393985 L25.6263069,29.334 C25.493366,29.3526793 25.3597929,29.3693888 25.2256182,29.3840982 L25.5872928,29.3393985 C25.4326976,29.360659 25.277251,29.3792552 25.1210012,29.3951396 L25.2256182,29.3840982 C25.0570566,29.4025774 24.8875455,29.4178998 24.7171453,29.4300052 L25.1210012,29.3951396 C24.9661341,29.4108835 24.810478,29.4239634 24.6540799,29.4343333 L24.7171453,29.4300052 C24.5612618,29.4410793 24.4046342,29.4494611 24.2473088,29.4551045 L24.6540799,29.4343333 C24.5098436,29.4438967 24.3649762,29.4511552 24.2195147,29.4560724 L24.2473088,29.4551045 C24.0865878,29.4608697 23.9251385,29.4637769 23.7630101,29.4637769 L23.3130142,29.4562912 C23.2993121,29.4558347 23.2856153,29.4553574 23.2719237,29.4548593 C22.9596275,29.4434959 22.6502324,29.4213577 22.3439491,29.3888006 L22.3886972,29.3934808 C22.2468147,29.3788837 22.105595,29.3620515 21.9650736,29.3430199 L22.3439491,29.3888006 C22.1914515,29.3725905 22.0397254,29.3537976 21.8888152,29.3324664 L21.9650736,29.3430199 C21.8025527,29.3210088 21.6409661,29.2960557 21.4803691,29.2682161 L21.8888152,29.3324664 C21.7352182,29.3107553 21.5824665,29.2864149 21.4306071,29.2594919 L21.4803691,29.2682161 C21.3506285,29.2457255 21.2215338,29.221351 21.0931142,29.1951218 L21.4306071,29.2594919 C21.2772401,29.2323016 21.1247833,29.2024774 20.973285,29.1700676 L21.0931142,29.1951218 C20.9267071,29.1611338 20.7614335,29.1240315 20.5973571,29.0838786 L20.973285,29.1700676 C20.825476,29.138447 20.6785795,29.1043653 20.5326403,29.0678674 L20.5973571,29.0838786 C20.4596684,29.0501832 20.3228227,29.0143396 20.1868576,28.9763851 L20.5326403,29.0678674 C20.3930822,29.0329653 20.2543997,28.9958536 20.1166319,28.9565718 L20.1169729,28.956669 L19.7188247,28.8363247 L19.7188247,28.8363247 L19.7880988,28.5894836 C19.8166627,28.4914193 19.8463277,28.3938241 19.8770797,28.2967124 L19.8480041,28.389868 C19.888904,28.2573207 19.931824,28.1256601 19.9767281,27.9949221 L19.8770797,28.2967124 C19.9117081,28.1873592 19.9477148,28.0786191 19.9850793,27.9705124 L19.9853117,27.9700125 C20.1152243,27.5939638 20.2618428,27.2250995 20.4240731,26.8647811 L20.345088,27.0439391 C20.3899401,26.9402428 20.4360767,26.8372321 20.4834778,26.7349269 L20.4240731,26.8647811 C20.461061,26.78263 20.4988604,26.7009231 20.5374612,26.6196707 L20.4834778,26.7349269 C20.5344734,26.6248636 20.5869326,26.515617 20.6408302,26.4072119 L20.5374612,26.6196707 C20.5871241,26.5151329 20.6381134,26.4113474 20.6904074,26.308336 L20.6408302,26.4072119 C20.681671,26.3250682 20.7233378,26.2434076 20.7658197,26.1622412 L20.7658807,26.1619302 C20.8435258,26.013775 20.923959,25.866962 21.0070529,25.7218685 C21.2050227,25.3759931 21.4182299,25.0398756 21.6456589,24.7144306 L21.5286537,24.8848257 C21.5876708,24.7975143 21.6476996,24.7109431 21.7087233,24.6251289 L21.6456589,24.7144306 C21.6993229,24.6376387 21.7537788,24.5614411 21.8090146,24.4858495 L21.7087233,24.6251289 C21.7826333,24.5211934 21.8580028,24.4183683 21.9348018,24.3166836 L21.8090146,24.4858495 C21.8722751,24.3992759 21.9365587,24.3134973 22.0018475,24.2285315 L22.0016895,24.2288802 C22.3179789,23.8171232 22.6576794,23.4247699 23.0189296,23.053491 L22.8296293,23.2521975 C22.9033796,23.1732135 22.9780829,23.095131 23.0537208,23.0179683 L23.0189296,23.053491 C23.083529,22.9870982 23.1488175,22.9213793 23.2147836,22.8563459 L23.0537208,23.0179683 C23.131055,22.9390752 23.2093662,22.8611436 23.2886348,22.7841931 L23.2147836,22.8563459 C23.2821211,22.7899605 23.3501645,22.7242893 23.4189017,22.6593447 L23.2886348,22.7841931 C23.3852399,22.6904132 23.4832671,22.5980904 23.582681,22.5072602 L23.4189017,22.6593447 C23.4912637,22.5909753 23.5643945,22.523411 23.6382797,22.4566663 L23.582681,22.5072602 C23.6715916,22.4260264 23.7616113,22.3459865 23.8527148,22.2671658 L23.8525967,22.2671923 C23.8915062,22.2336043 23.9304941,22.2002638 23.9696766,22.1671464 L24.00025,22.1417324 Z"/></g></svg>
|