@patternfly/react-core 4.247.0 → 4.247.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,301 @@
1
+ import React from 'react';
2
+ import {
3
+ ApplicationLauncher,
4
+ ApplicationLauncherItem,
5
+ Avatar,
6
+ Brand,
7
+ Breadcrumb,
8
+ BreadcrumbItem,
9
+ Button,
10
+ ButtonVariant,
11
+ Card,
12
+ CardBody,
13
+ Divider,
14
+ Dropdown,
15
+ DropdownGroup,
16
+ DropdownItem,
17
+ DropdownToggle,
18
+ Gallery,
19
+ GalleryItem,
20
+ KebabToggle,
21
+ Masthead,
22
+ MastheadBrand,
23
+ MastheadContent,
24
+ MastheadMain,
25
+ MastheadToggle,
26
+ Nav,
27
+ NavItem,
28
+ NavList,
29
+ Page,
30
+ PageBreadcrumb,
31
+ PageGroup,
32
+ PageSection,
33
+ PageSectionVariants,
34
+ PageSidebar,
35
+ PageToggleButton,
36
+ SkipToContent,
37
+ Text,
38
+ TextContent,
39
+ Toolbar,
40
+ ToolbarContent,
41
+ ToolbarGroup,
42
+ ToolbarItem
43
+ } from '@patternfly/react-core';
44
+ import BarsIcon from '@patternfly/react-icons/dist/esm/icons/bars-icon';
45
+ import BellIcon from '@patternfly/react-icons/dist/esm/icons/bell-icon';
46
+ import CogIcon from '@patternfly/react-icons/dist/esm/icons/cog-icon';
47
+ import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';
48
+ import QuestionCircleIcon from '@patternfly/react-icons/dist/esm/icons/question-circle-icon';
49
+ import imgAvatar from '@patternfly/react-core/src/components/Avatar/examples/avatarImg.svg';
50
+
51
+ interface NavOnSelectProps {
52
+ groupId: number | string;
53
+ itemId: number | string;
54
+ to: string;
55
+ event: React.FormEvent<HTMLInputElement>;
56
+ }
57
+
58
+ export const PageStickySectionGroupAlternate: React.FunctionComponent = () => {
59
+ const [isDropdownOpen, setIsDropdownOpen] = React.useState(false);
60
+ const [isKebabDropdownOpen, setIsKebabDropdownOpen] = React.useState(false);
61
+ const [isFullKebabDropdownOpen, setIsFullKebabDropdownOpen] = React.useState(false);
62
+ const [isAppLauncherOpen, setIsAppLauncherOpen] = React.useState(false);
63
+ const [activeItem, setActiveItem] = React.useState(1);
64
+
65
+ const onNavSelect = (selectedItem: NavOnSelectProps) => {
66
+ typeof selectedItem.itemId === 'number' && setActiveItem(selectedItem.itemId);
67
+ };
68
+
69
+ const onDropdownToggle = (isOpen: boolean) => {
70
+ setIsDropdownOpen(isOpen);
71
+ };
72
+
73
+ const onDropdownSelect = () => {
74
+ setIsDropdownOpen(!isDropdownOpen);
75
+ };
76
+
77
+ const onKebabDropdownToggle = (isOpen: boolean) => {
78
+ setIsKebabDropdownOpen(isOpen);
79
+ };
80
+
81
+ const onKebabDropdownSelect = () => {
82
+ setIsKebabDropdownOpen(!isKebabDropdownOpen);
83
+ };
84
+
85
+ const onFullKebabDropdownToggle = (isOpen: boolean) => {
86
+ setIsFullKebabDropdownOpen(isOpen);
87
+ };
88
+
89
+ const onFullKebabDropdownSelect = () => {
90
+ setIsFullKebabDropdownOpen(!isFullKebabDropdownOpen);
91
+ };
92
+
93
+ const onAppLauncherToggle = (isOpen: boolean) => {
94
+ setIsAppLauncherOpen(isOpen);
95
+ };
96
+
97
+ const onAppLauncherSelect = () => {
98
+ setIsAppLauncherOpen(!isAppLauncherOpen);
99
+ };
100
+
101
+ const kebabDropdownItems = [
102
+ <DropdownItem key="settings">
103
+ <CogIcon /> Settings
104
+ </DropdownItem>,
105
+ <DropdownItem key="help">
106
+ <HelpIcon /> Help
107
+ </DropdownItem>
108
+ ];
109
+
110
+ const userDropdownItems = [
111
+ <DropdownGroup key="group 2">
112
+ <DropdownItem key="group 2 profile">My profile</DropdownItem>
113
+ <DropdownItem key="group 2 user" component="button">
114
+ User management
115
+ </DropdownItem>
116
+ <DropdownItem key="group 2 logout">Logout</DropdownItem>
117
+ </DropdownGroup>
118
+ ];
119
+
120
+ const fullKebabDropdownItems = [
121
+ <DropdownGroup key="group 2">
122
+ <DropdownItem key="group 2 profile">My profile</DropdownItem>
123
+ <DropdownItem key="group 2 user" component="button">
124
+ User management
125
+ </DropdownItem>
126
+ <DropdownItem key="group 2 logout">Logout</DropdownItem>
127
+ </DropdownGroup>,
128
+ <Divider key="divider" />,
129
+ <DropdownItem key="settings">
130
+ <CogIcon /> Settings
131
+ </DropdownItem>,
132
+ <DropdownItem key="help">
133
+ <HelpIcon /> Help
134
+ </DropdownItem>
135
+ ];
136
+
137
+ const appLauncherItems = [
138
+ <ApplicationLauncherItem key="application_1a" href="#">
139
+ Application 1 (anchor link)
140
+ </ApplicationLauncherItem>,
141
+ <ApplicationLauncherItem key="application_2a" component="button" onClick={() => alert('Clicked item 2')}>
142
+ Application 2 (button with onClick)
143
+ </ApplicationLauncherItem>
144
+ ];
145
+
146
+ const headerToolbar = (
147
+ <Toolbar id="toolbar" isFullHeight isStatic>
148
+ <ToolbarContent>
149
+ <ToolbarGroup
150
+ variant="icon-button-group"
151
+ alignment={{ default: 'alignRight' }}
152
+ spacer={{ default: 'spacerNone', md: 'spacerMd' }}
153
+ >
154
+ <ToolbarItem>
155
+ <Button aria-label="Notifications" variant={ButtonVariant.plain} icon={<BellIcon />} />
156
+ </ToolbarItem>
157
+ <ToolbarGroup variant="icon-button-group" visibility={{ default: 'hidden', lg: 'visible' }}>
158
+ <ToolbarItem visibility={{ default: 'hidden', md: 'hidden', lg: 'visible' }}>
159
+ <ApplicationLauncher
160
+ onSelect={onAppLauncherSelect}
161
+ onToggle={onAppLauncherToggle}
162
+ isOpen={isAppLauncherOpen}
163
+ items={appLauncherItems}
164
+ />
165
+ </ToolbarItem>
166
+ <ToolbarItem>
167
+ <Button aria-label="Settings" variant={ButtonVariant.plain} icon={<CogIcon />} />
168
+ </ToolbarItem>
169
+ <ToolbarItem>
170
+ <Button aria-label="Help" variant={ButtonVariant.plain} icon={<QuestionCircleIcon />} />
171
+ </ToolbarItem>
172
+ </ToolbarGroup>
173
+ <ToolbarItem visibility={{ default: 'hidden', md: 'visible', lg: 'hidden' }}>
174
+ <Dropdown
175
+ isPlain
176
+ position="right"
177
+ onSelect={onKebabDropdownSelect}
178
+ toggle={<KebabToggle onToggle={onKebabDropdownToggle} />}
179
+ isOpen={isKebabDropdownOpen}
180
+ dropdownItems={kebabDropdownItems}
181
+ />
182
+ </ToolbarItem>
183
+ <ToolbarItem visibility={{ md: 'hidden' }}>
184
+ <Dropdown
185
+ isPlain
186
+ position="right"
187
+ onSelect={onFullKebabDropdownSelect}
188
+ toggle={<KebabToggle onToggle={onFullKebabDropdownToggle} />}
189
+ isOpen={isFullKebabDropdownOpen}
190
+ dropdownItems={fullKebabDropdownItems}
191
+ />
192
+ </ToolbarItem>
193
+ </ToolbarGroup>
194
+ <ToolbarItem visibility={{ default: 'hidden', md: 'visible' }}>
195
+ <Dropdown
196
+ isFullHeight
197
+ onSelect={onDropdownSelect}
198
+ isOpen={isDropdownOpen}
199
+ toggle={
200
+ <DropdownToggle icon={<Avatar src={imgAvatar} alt="Avatar" />} onToggle={onDropdownToggle}>
201
+ Ned Username
202
+ </DropdownToggle>
203
+ }
204
+ dropdownItems={userDropdownItems}
205
+ />
206
+ </ToolbarItem>
207
+ </ToolbarContent>
208
+ </Toolbar>
209
+ );
210
+
211
+ const masthead = (
212
+ <Masthead>
213
+ <MastheadToggle>
214
+ <PageToggleButton variant="plain" aria-label="Global navigation">
215
+ <BarsIcon />
216
+ </PageToggleButton>
217
+ </MastheadToggle>
218
+ <MastheadMain>
219
+ <MastheadBrand>
220
+ <Brand
221
+ widths={{ default: '180px', md: '180px', '2xl': '220px' }}
222
+ src="/assets/images/logo__pf--reverse--base.png"
223
+ alt="Fallback patternFly default logo"
224
+ >
225
+ <source media="(min-width: 768px)" srcSet="/assets/images/logo__pf--reverse-on-md.svg" />
226
+ <source srcSet="/assets/images/logo__pf--reverse--base.svg" />
227
+ </Brand>
228
+ </MastheadBrand>
229
+ </MastheadMain>
230
+ <MastheadContent>{headerToolbar}</MastheadContent>
231
+ </Masthead>
232
+ );
233
+
234
+ const pageNav = (
235
+ <Nav onSelect={onNavSelect}>
236
+ <NavList>
237
+ <NavItem itemId={0} isActive={activeItem === 0} to="#system-panel">
238
+ System panel
239
+ </NavItem>
240
+ <NavItem itemId={1} isActive={activeItem === 1} to="#policy">
241
+ Policy
242
+ </NavItem>
243
+ <NavItem itemId={2} isActive={activeItem === 2} to="#auth">
244
+ Authentication
245
+ </NavItem>
246
+ <NavItem itemId={3} isActive={activeItem === 3} to="#network">
247
+ Network services
248
+ </NavItem>
249
+ <NavItem itemId={4} isActive={activeItem === 4} to="#server">
250
+ Server
251
+ </NavItem>
252
+ </NavList>
253
+ </Nav>
254
+ );
255
+
256
+ const sidebar = <PageSidebar nav={pageNav} />;
257
+
258
+ const mainContainerId = 'main-content';
259
+
260
+ const pageSkipToContent = <SkipToContent href={`#${mainContainerId}`}>Skip to content</SkipToContent>;
261
+
262
+ return (
263
+ <Page
264
+ header={masthead}
265
+ sidebar={sidebar}
266
+ isManagedSidebar
267
+ skipToContent={pageSkipToContent}
268
+ mainContainerId={mainContainerId}
269
+ >
270
+ <PageGroup stickyOnBreakpoint={{ default: 'top' }}>
271
+ <PageBreadcrumb>
272
+ <Breadcrumb>
273
+ <BreadcrumbItem>Section home</BreadcrumbItem>
274
+ <BreadcrumbItem to="#">Section title</BreadcrumbItem>
275
+ <BreadcrumbItem to="#">Section title</BreadcrumbItem>
276
+ <BreadcrumbItem to="#" isActive>
277
+ Section landing
278
+ </BreadcrumbItem>
279
+ </Breadcrumb>
280
+ </PageBreadcrumb>
281
+ <PageSection variant={PageSectionVariants.light} isWidthLimited>
282
+ <TextContent>
283
+ <Text component="h1">Main title</Text>
284
+ <Text component="p">This is a full page demo.</Text>
285
+ </TextContent>
286
+ </PageSection>{' '}
287
+ </PageGroup>
288
+ <PageSection>
289
+ <Gallery hasGutter>
290
+ {Array.apply(0, Array(50)).map((x, i) => (
291
+ <GalleryItem key={i}>
292
+ <Card>
293
+ <CardBody>This is a card</CardBody>
294
+ </Card>
295
+ </GalleryItem>
296
+ ))}
297
+ </Gallery>
298
+ </PageSection>
299
+ </Page>
300
+ );
301
+ };
@@ -0,0 +1,293 @@
1
+ import React from 'react';
2
+ import {
3
+ ApplicationLauncher,
4
+ ApplicationLauncherItem,
5
+ Avatar,
6
+ Brand,
7
+ Breadcrumb,
8
+ BreadcrumbItem,
9
+ Button,
10
+ ButtonVariant,
11
+ Card,
12
+ CardBody,
13
+ Divider,
14
+ Dropdown,
15
+ DropdownGroup,
16
+ DropdownItem,
17
+ DropdownToggle,
18
+ Gallery,
19
+ GalleryItem,
20
+ KebabToggle,
21
+ Nav,
22
+ NavItem,
23
+ NavList,
24
+ Page,
25
+ PageHeader,
26
+ PageHeaderTools,
27
+ PageHeaderToolsGroup,
28
+ PageHeaderToolsItem,
29
+ PageSection,
30
+ PageSectionVariants,
31
+ PageSidebar,
32
+ SkipToContent,
33
+ Text,
34
+ TextContent
35
+ } from '@patternfly/react-core';
36
+ import BellIcon from '@patternfly/react-icons/dist/esm/icons/bell-icon';
37
+ import CogIcon from '@patternfly/react-icons/dist/esm/icons/cog-icon';
38
+ import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';
39
+ import QuestionCircleIcon from '@patternfly/react-icons/dist/esm/icons/question-circle-icon';
40
+ import imgAvatar from '@patternfly/react-core/src/components/Avatar/examples/avatarImg.svg';
41
+
42
+ interface NavOnSelectProps {
43
+ groupId: number | string;
44
+ itemId: number | string;
45
+ to: string;
46
+ event: React.FormEvent<HTMLInputElement>;
47
+ }
48
+
49
+ export const PageStickySectionGroupUsingPageHeader: React.FunctionComponent = () => {
50
+ const [isDropdownOpen, setIsDropdownOpen] = React.useState(false);
51
+ const [isKebabDropdownOpen, setIsKebabDropdownOpen] = React.useState(false);
52
+ const [isFullKebabDropdownOpen, setIsFullKebabDropdownOpen] = React.useState(false);
53
+ const [isAppLauncherOpen, setIsAppLauncherOpen] = React.useState(false);
54
+ const [activeItem, setActiveItem] = React.useState(1);
55
+
56
+ const onNavSelect = (selectedItem: NavOnSelectProps) => {
57
+ typeof selectedItem.itemId === 'number' && setActiveItem(selectedItem.itemId);
58
+ };
59
+
60
+ const onDropdownToggle = (isOpen: boolean) => {
61
+ setIsDropdownOpen(isOpen);
62
+ };
63
+
64
+ const onDropdownSelect = () => {
65
+ setIsDropdownOpen(!isDropdownOpen);
66
+ };
67
+
68
+ const onKebabDropdownToggle = (isOpen: boolean) => {
69
+ setIsKebabDropdownOpen(isOpen);
70
+ };
71
+
72
+ const onKebabDropdownSelect = () => {
73
+ setIsKebabDropdownOpen(!isKebabDropdownOpen);
74
+ };
75
+
76
+ const onFullKebabDropdownToggle = (isOpen: boolean) => {
77
+ setIsFullKebabDropdownOpen(isOpen);
78
+ };
79
+
80
+ const onFullKebabDropdownSelect = () => {
81
+ setIsFullKebabDropdownOpen(!isFullKebabDropdownOpen);
82
+ };
83
+
84
+ const onAppLauncherToggle = (isOpen: boolean) => {
85
+ setIsAppLauncherOpen(isOpen);
86
+ };
87
+
88
+ const onAppLauncherSelect = () => {
89
+ setIsAppLauncherOpen(!isAppLauncherOpen);
90
+ };
91
+
92
+ const dashboardBreadcrumb = (
93
+ <Breadcrumb>
94
+ <BreadcrumbItem>Section home</BreadcrumbItem>
95
+ <BreadcrumbItem to="#">Section title</BreadcrumbItem>
96
+ <BreadcrumbItem to="#">Section title</BreadcrumbItem>
97
+ <BreadcrumbItem to="#" isActive>
98
+ Section landing
99
+ </BreadcrumbItem>
100
+ </Breadcrumb>
101
+ );
102
+
103
+ const kebabDropdownItems = [
104
+ <DropdownItem key="settings">
105
+ <CogIcon /> Settings
106
+ </DropdownItem>,
107
+ <DropdownItem key="help">
108
+ <HelpIcon /> Help
109
+ </DropdownItem>
110
+ ];
111
+
112
+ const fullKebabDropdownItems = [
113
+ <DropdownGroup key="group 2">
114
+ <DropdownItem key="group 2 profile">My profile</DropdownItem>
115
+ <DropdownItem key="group 2 user" component="button">
116
+ User management
117
+ </DropdownItem>
118
+ <DropdownItem key="group 2 logout">Logout</DropdownItem>
119
+ </DropdownGroup>,
120
+ <Divider key="divider" />,
121
+ <DropdownItem key="settings">
122
+ <CogIcon /> Settings
123
+ </DropdownItem>,
124
+ <DropdownItem key="help">
125
+ <HelpIcon /> Help
126
+ </DropdownItem>
127
+ ];
128
+
129
+ const userDropdownItems = [
130
+ <DropdownGroup key="group 2">
131
+ <DropdownItem key="group 2 profile">My profile</DropdownItem>
132
+ <DropdownItem key="group 2 user" component="button">
133
+ User management
134
+ </DropdownItem>
135
+ <DropdownItem key="group 2 logout">Logout</DropdownItem>
136
+ </DropdownGroup>
137
+ ];
138
+
139
+ const appLauncherItems = [
140
+ <ApplicationLauncherItem key="application_1a" href="#">
141
+ Application 1 (anchor link)
142
+ </ApplicationLauncherItem>,
143
+ <ApplicationLauncherItem key="application_2a" component="button" onClick={() => alert('Clicked item 2')}>
144
+ Application 2 (button with onClick)
145
+ </ApplicationLauncherItem>
146
+ ];
147
+
148
+ const pageNav = (
149
+ <Nav onSelect={onNavSelect}>
150
+ <NavList>
151
+ <NavItem itemId={0} isActive={activeItem === 0} to="#system-panel">
152
+ System panel
153
+ </NavItem>
154
+ <NavItem itemId={1} isActive={activeItem === 1} to="#policy">
155
+ Policy
156
+ </NavItem>
157
+ <NavItem itemId={2} isActive={activeItem === 2} to="#auth">
158
+ Authentication
159
+ </NavItem>
160
+ <NavItem itemId={3} isActive={activeItem === 3} to="#network">
161
+ Network services
162
+ </NavItem>
163
+ <NavItem itemId={4} isActive={activeItem === 4} to="#server">
164
+ Server
165
+ </NavItem>
166
+ </NavList>
167
+ </Nav>
168
+ );
169
+
170
+ const sidebar = <PageSidebar nav={pageNav} />;
171
+
172
+ const mainContainerId = 'main-content';
173
+
174
+ const pageSkipToContent = <SkipToContent href={`#${mainContainerId}`}>Skip to content</SkipToContent>;
175
+
176
+ const headerTools = (
177
+ <PageHeaderTools>
178
+ <PageHeaderToolsGroup>
179
+ <PageHeaderToolsItem>
180
+ <Button aria-label="Notifications" variant={ButtonVariant.plain} icon={<BellIcon />} />
181
+ </PageHeaderToolsItem>
182
+ <PageHeaderToolsGroup visibility={{ default: 'hidden', lg: 'visible' }}>
183
+ <PageHeaderToolsItem visibility={{ default: 'hidden', md: 'hidden', lg: 'visible' }}>
184
+ <ApplicationLauncher
185
+ onSelect={onAppLauncherSelect}
186
+ onToggle={onAppLauncherToggle}
187
+ isOpen={isAppLauncherOpen}
188
+ items={appLauncherItems}
189
+ />
190
+ </PageHeaderToolsItem>
191
+ <PageHeaderToolsItem>
192
+ <Button aria-label="Settings" variant={ButtonVariant.plain} icon={<CogIcon />} />
193
+ </PageHeaderToolsItem>
194
+ <PageHeaderToolsItem>
195
+ <Button aria-label="Help" variant={ButtonVariant.plain} icon={<QuestionCircleIcon />} />
196
+ </PageHeaderToolsItem>
197
+ </PageHeaderToolsGroup>
198
+ <PageHeaderToolsItem visibility={{ default: 'hidden', md: 'visible', lg: 'hidden' }}>
199
+ <Dropdown
200
+ isPlain
201
+ position="right"
202
+ onSelect={onKebabDropdownSelect}
203
+ toggle={<KebabToggle onToggle={onKebabDropdownToggle} />}
204
+ isOpen={isKebabDropdownOpen}
205
+ dropdownItems={kebabDropdownItems}
206
+ />
207
+ </PageHeaderToolsItem>
208
+ <PageHeaderToolsItem visibility={{ md: 'hidden' }}>
209
+ <Dropdown
210
+ isPlain
211
+ position="right"
212
+ onSelect={onFullKebabDropdownSelect}
213
+ toggle={<KebabToggle onToggle={onFullKebabDropdownToggle} />}
214
+ isOpen={isFullKebabDropdownOpen}
215
+ dropdownItems={fullKebabDropdownItems}
216
+ />
217
+ </PageHeaderToolsItem>
218
+ </PageHeaderToolsGroup>
219
+ <PageHeaderToolsItem
220
+ visibility={{ default: 'hidden', md: 'visible' }} /** this user dropdown is hidden on mobile sizes */
221
+ >
222
+ <Avatar src={imgAvatar} alt="Avatar" />
223
+ </PageHeaderToolsItem>
224
+ <PageHeaderToolsItem
225
+ visibility={{ default: 'hidden', md: 'visible' }} /** this user dropdown is hidden on mobile sizes */
226
+ >
227
+ <Dropdown
228
+ isPlain
229
+ position="right"
230
+ onSelect={onDropdownSelect}
231
+ isOpen={isDropdownOpen}
232
+ toggle={<DropdownToggle onToggle={onDropdownToggle}>Ned Username</DropdownToggle>}
233
+ dropdownItems={userDropdownItems}
234
+ />
235
+ </PageHeaderToolsItem>
236
+ </PageHeaderTools>
237
+ );
238
+
239
+ const pageHeader = (
240
+ <PageHeader
241
+ logo={
242
+ <Brand
243
+ widths={{ default: '180px', md: '180px', '2xl': '220px' }}
244
+ src="/assets/images/logo__pf--reverse--base.png"
245
+ alt="Fallback patternFly default logo"
246
+ >
247
+ <source media="(min-width: 768px)" srcSet="/assets/images/logo__pf--reverse-on-md.svg" />
248
+ <source srcSet="/assets/images/logo__pf--reverse--base.svg" />
249
+ </Brand>
250
+ }
251
+ headerTools={headerTools}
252
+ showNavToggle
253
+ />
254
+ );
255
+
256
+ return (
257
+ <Page
258
+ header={pageHeader}
259
+ sidebar={sidebar}
260
+ isManagedSidebar
261
+ skipToContent={pageSkipToContent}
262
+ breadcrumb={dashboardBreadcrumb}
263
+ mainContainerId={mainContainerId}
264
+ isBreadcrumbWidthLimited
265
+ isBreadcrumbGrouped
266
+ additionalGroupedContent={
267
+ <PageSection variant={PageSectionVariants.light} isWidthLimited>
268
+ <TextContent>
269
+ <Text component="h1">Main title</Text>
270
+ <Text component="p">This is a full page demo.</Text>
271
+ </TextContent>
272
+ </PageSection>
273
+ }
274
+ groupProps={{
275
+ stickyOnBreakpoint: {
276
+ default: 'top'
277
+ }
278
+ }}
279
+ >
280
+ <PageSection>
281
+ <Gallery hasGutter>
282
+ {Array.apply(0, Array(50)).map((x, i) => (
283
+ <GalleryItem key={i}>
284
+ <Card>
285
+ <CardBody>This is a card</CardBody>
286
+ </Card>
287
+ </GalleryItem>
288
+ ))}
289
+ </Gallery>
290
+ </PageSection>
291
+ </Page>
292
+ );
293
+ };