@vibe/core 4.2.5 → 4.3.0-alpha-9bd83.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/dist/metadata/accessibility/Accordion.md +10 -0
- package/dist/metadata/accessibility/AlertBanner.md +9 -0
- package/dist/metadata/accessibility/Avatar.md +12 -0
- package/dist/metadata/accessibility/AvatarGroup.md +6 -0
- package/dist/metadata/accessibility/BreadcrumbsBar.md +10 -0
- package/dist/metadata/accessibility/Button.md +13 -0
- package/dist/metadata/accessibility/ButtonGroup.md +9 -0
- package/dist/metadata/accessibility/Checkbox.md +13 -0
- package/dist/metadata/accessibility/Chips.md +10 -0
- package/dist/metadata/accessibility/Combobox.md +6 -0
- package/dist/metadata/accessibility/DropdownBasicDropdown.md +10 -0
- package/dist/metadata/accessibility/IconButton.md +26 -0
- package/dist/metadata/accessibility/Info.md +12 -0
- package/dist/metadata/accessibility/Link.md +8 -0
- package/dist/metadata/accessibility/List.md +11 -0
- package/dist/metadata/accessibility/Menu.md +10 -0
- package/dist/metadata/accessibility/MenuButton.md +6 -0
- package/dist/metadata/accessibility/MenuItem.md +8 -0
- package/dist/metadata/accessibility/Modal.md +35 -0
- package/dist/metadata/accessibility/NumberField.md +9 -0
- package/dist/metadata/accessibility/RadioButton.md +11 -0
- package/dist/metadata/accessibility/Search.md +10 -0
- package/dist/metadata/accessibility/Tabs.md +10 -0
- package/dist/metadata/accessibility/TextArea.md +17 -0
- package/dist/metadata/accessibility/TextField.md +16 -0
- package/dist/metadata/accessibility/Toast.md +4 -0
- package/dist/metadata/accessibility/Toggle.md +7 -0
- package/dist/metadata/accessibility/Tooltip.md +11 -0
- package/dist/metadata/components.json +20940 -0
- package/dist/metadata/examples/Accordion.md +136 -0
- package/dist/metadata/examples/AlertBanner.md +85 -0
- package/dist/metadata/examples/AttentionBox.md +267 -0
- package/dist/metadata/examples/Avatar.md +118 -0
- package/dist/metadata/examples/AvatarGroup.md +390 -0
- package/dist/metadata/examples/Badge.md +59 -0
- package/dist/metadata/examples/BaseInput.md +2 -0
- package/dist/metadata/examples/BaseList.md +342 -0
- package/dist/metadata/examples/Box.md +208 -0
- package/dist/metadata/examples/BreadcrumbItem.md +54 -0
- package/dist/metadata/examples/BreadcrumbsBar.md +64 -0
- package/dist/metadata/examples/Button.md +174 -0
- package/dist/metadata/examples/ButtonGroup.md +180 -0
- package/dist/metadata/examples/Checkbox.md +24 -0
- package/dist/metadata/examples/Chips.md +192 -0
- package/dist/metadata/examples/Clickable.md +31 -0
- package/dist/metadata/examples/ColorPicker.md +2 -0
- package/dist/metadata/examples/Combobox.md +438 -0
- package/dist/metadata/examples/Counter.md +188 -0
- package/dist/metadata/examples/DatePicker.md +43 -0
- package/dist/metadata/examples/Dialog.md +521 -0
- package/dist/metadata/examples/DialogContentContainer.md +18 -0
- package/dist/metadata/examples/Divider.md +50 -0
- package/dist/metadata/examples/DropdownBasicDropdown.md +479 -0
- package/dist/metadata/examples/DropdownBoxMode.md +218 -0
- package/dist/metadata/examples/EditableHeading.md +33 -0
- package/dist/metadata/examples/EditableText.md +36 -0
- package/dist/metadata/examples/EmptyState.md +192 -0
- package/dist/metadata/examples/ExpandCollapse.md +77 -0
- package/dist/metadata/examples/Flex.md +916 -0
- package/dist/metadata/examples/Heading.md +124 -0
- package/dist/metadata/examples/HiddenText.md +8 -0
- package/dist/metadata/examples/Icon.md +67 -0
- package/dist/metadata/examples/IconButton.md +141 -0
- package/dist/metadata/examples/Info.md +80 -0
- package/dist/metadata/examples/Label.md +109 -0
- package/dist/metadata/examples/Link.md +52 -0
- package/dist/metadata/examples/List.md +125 -0
- package/dist/metadata/examples/ListItem.md +42 -0
- package/dist/metadata/examples/Loader.md +148 -0
- package/dist/metadata/examples/Menu.md +141 -0
- package/dist/metadata/examples/MenuButton.md +127 -0
- package/dist/metadata/examples/MenuDivider.md +35 -0
- package/dist/metadata/examples/MenuGridItem.md +65 -0
- package/dist/metadata/examples/MenuItem.md +98 -0
- package/dist/metadata/examples/MenuItemButton.md +42 -0
- package/dist/metadata/examples/MenuTitle.md +25 -0
- package/dist/metadata/examples/ModalBasicLayout.md +400 -0
- package/dist/metadata/examples/ModalMediaLayout.md +240 -0
- package/dist/metadata/examples/ModalSideBySideLayout.md +313 -0
- package/dist/metadata/examples/MultiStepIndicator.md +189 -0
- package/dist/metadata/examples/NumberField.md +68 -0
- package/dist/metadata/examples/ProgressBar.md +152 -0
- package/dist/metadata/examples/RadioButton.md +41 -0
- package/dist/metadata/examples/Search.md +24 -0
- package/dist/metadata/examples/Skeleton.md +161 -0
- package/dist/metadata/examples/Slider.md +109 -0
- package/dist/metadata/examples/SplitButton.md +120 -0
- package/dist/metadata/examples/Steps.md +106 -0
- package/dist/metadata/examples/Table.md +449 -0
- package/dist/metadata/examples/Tabs.md +241 -0
- package/dist/metadata/examples/Text.md +188 -0
- package/dist/metadata/examples/TextArea.md +28 -0
- package/dist/metadata/examples/TextField.md +119 -0
- package/dist/metadata/examples/TextWithHighlight.md +2 -0
- package/dist/metadata/examples/ThemeProvider.md +47 -0
- package/dist/metadata/examples/Tipseen.md +111 -0
- package/dist/metadata/examples/Toast.md +127 -0
- package/dist/metadata/examples/Toggle.md +38 -0
- package/dist/metadata/examples/Tooltip.md +53 -0
- package/dist/metadata/examples/VirtualizedGrid.md +54 -0
- package/dist/metadata/examples/VirtualizedList.md +50 -0
- package/dist/metadata/examples/useGridKeyboardNavigationContext.md +61 -0
- package/dist/mocked_classnames/scripts/build-all-metadata.d.ts +1 -0
- package/dist/mocked_classnames/scripts/extract-accessibility.d.ts +4 -0
- package/dist/mocked_classnames/scripts/extract-examples.d.ts +3 -0
- package/dist/scripts/build-all-metadata.d.ts +1 -0
- package/dist/scripts/extract-accessibility.d.ts +4 -0
- package/dist/scripts/extract-examples.d.ts +3 -0
- package/package.json +12 -10
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Storybook Code Examples
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
```tsx
|
|
6
|
+
<div style={{
|
|
7
|
+
padding: "40px 0 0 50px"
|
|
8
|
+
}}>
|
|
9
|
+
<Tooltip id="overview-tooltip" {...args} open middleware={storyMiddleware} hideWhenReferenceHidden>
|
|
10
|
+
<div id="overview-tooltip-trigger" />
|
|
11
|
+
</Tooltip>
|
|
12
|
+
</div>
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Positions
|
|
16
|
+
|
|
17
|
+
```tsx
|
|
18
|
+
return <Flex gap={16}>
|
|
19
|
+
<div style={{
|
|
20
|
+
padding: "0 64px 68px 0",
|
|
21
|
+
margin: "0 32px"
|
|
22
|
+
}}>
|
|
23
|
+
<Tooltip id="position-top-tooltip" middleware={storyMiddleware} hideWhenReferenceHidden content="Top" shouldShowOnMount position="bottom" open>
|
|
24
|
+
<div />
|
|
25
|
+
</Tooltip>
|
|
26
|
+
</div>
|
|
27
|
+
<div style={{
|
|
28
|
+
padding: "50px 0 0 0",
|
|
29
|
+
margin: "0 32px"
|
|
30
|
+
}}>
|
|
31
|
+
<Tooltip id="position-bottom-tooltip" middleware={storyMiddleware} hideWhenReferenceHidden content="Bottom" shouldShowOnMount open>
|
|
32
|
+
<div />
|
|
33
|
+
</Tooltip>
|
|
34
|
+
</div>
|
|
35
|
+
<div style={{
|
|
36
|
+
padding: "0 32px 8px 32px",
|
|
37
|
+
margin: "0 32px"
|
|
38
|
+
}}>
|
|
39
|
+
<Tooltip id="position-left-tooltip" middleware={storyMiddleware} hideWhenReferenceHidden content="Left" position="right" shouldShowOnMount open>
|
|
40
|
+
<div />
|
|
41
|
+
</Tooltip>
|
|
42
|
+
</div>
|
|
43
|
+
<div style={{
|
|
44
|
+
padding: "0 64px 8px 64px",
|
|
45
|
+
margin: "0 64px"
|
|
46
|
+
}}>
|
|
47
|
+
<Tooltip id="position-right-tooltip" middleware={storyMiddleware} hideWhenReferenceHidden content="Right" position="left" shouldShowOnMount open>
|
|
48
|
+
<div />
|
|
49
|
+
</Tooltip>
|
|
50
|
+
</div>
|
|
51
|
+
</Flex>;
|
|
52
|
+
```
|
|
53
|
+
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Storybook Code Examples
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
```tsx
|
|
6
|
+
const virtualizedGridTemplate = (args: VirtualizedGridProps) => {
|
|
7
|
+
const [scrollToId, setScrollToId] = useState(null);
|
|
8
|
+
const [lastScrolledId, setLastScrolledId] = useState(null);
|
|
9
|
+
const [scrollToDisabled, setScrollToDisabled] = useState(false);
|
|
10
|
+
const [nextScrollToId, setNextScrollToId] = useState(ITEMS_COUNT - 1);
|
|
11
|
+
const getColumnWidth = useCallback(() => {
|
|
12
|
+
return 100;
|
|
13
|
+
}, []);
|
|
14
|
+
const getRowHeight = useCallback(() => {
|
|
15
|
+
return 50;
|
|
16
|
+
}, []);
|
|
17
|
+
const items = useMemo(() => {
|
|
18
|
+
return generateItems(50, 100, ITEMS_COUNT);
|
|
19
|
+
}, []);
|
|
20
|
+
const onClickToScroll = useCallback(() => {
|
|
21
|
+
setScrollToId(nextScrollToId);
|
|
22
|
+
setLastScrolledId("");
|
|
23
|
+
setScrollToDisabled(true);
|
|
24
|
+
}, [setScrollToId, setScrollToDisabled, nextScrollToId]);
|
|
25
|
+
const onScrollToFinished = useCallback(() => {
|
|
26
|
+
setLastScrolledId(nextScrollToId);
|
|
27
|
+
setScrollToId(null);
|
|
28
|
+
setNextScrollToId(Math.round(Math.random() * items.length));
|
|
29
|
+
setScrollToDisabled(false);
|
|
30
|
+
}, [nextScrollToId, items, setNextScrollToId, setLastScrolledId]);
|
|
31
|
+
return <Flex align="center" style={{
|
|
32
|
+
width: 430,
|
|
33
|
+
height: 300,
|
|
34
|
+
overflow: "hidden"
|
|
35
|
+
}}>
|
|
36
|
+
<div style={{
|
|
37
|
+
width: "430px",
|
|
38
|
+
height: "100%"
|
|
39
|
+
}}>
|
|
40
|
+
<VirtualizedGrid scrollToId={scrollToId} items={items} itemRenderer={itemRenderer} getColumnWidth={getColumnWidth} getRowHeight={getRowHeight} onScrollToFinished={onScrollToFinished} {...args} />
|
|
41
|
+
</div>
|
|
42
|
+
<Flex direction="column" align="center">
|
|
43
|
+
<Button size="medium" kind="primary" onClick={onClickToScroll} disabled={scrollToDisabled}>
|
|
44
|
+
{`Scroll to Item ${nextScrollToId}`}
|
|
45
|
+
</Button>
|
|
46
|
+
<div style={{
|
|
47
|
+
marginTop: 16,
|
|
48
|
+
opacity: lastScrolledId ? 1 : 0
|
|
49
|
+
}}>{`Scrolled to Item ${lastScrolledId}`}</div>
|
|
50
|
+
</Flex>
|
|
51
|
+
</Flex>;
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Storybook Code Examples
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
```tsx
|
|
6
|
+
const virtualizedListTemplate = (args: VirtualizedListItem) => {
|
|
7
|
+
const itemRenderer = useCallback((item: VirtualizedListItem, index: number, style: React.CSSProperties) => {
|
|
8
|
+
const backgroundColor = index % 2 === 0 ? "#e1e1e1" : "#f8f8f0";
|
|
9
|
+
return <div key={index} style={style}>
|
|
10
|
+
<Flex align="center" justify="center" style={{
|
|
11
|
+
backgroundColor,
|
|
12
|
+
height: item.height
|
|
13
|
+
}}>
|
|
14
|
+
{item.value as React.ReactNode}
|
|
15
|
+
</Flex>
|
|
16
|
+
</div>;
|
|
17
|
+
}, []);
|
|
18
|
+
return <Flex align="start" gap="large" style={{
|
|
19
|
+
width: "100%"
|
|
20
|
+
}} direction="row">
|
|
21
|
+
<Flex align="center" style={{
|
|
22
|
+
width: 330,
|
|
23
|
+
height: 300,
|
|
24
|
+
overflow: "hidden"
|
|
25
|
+
}}>
|
|
26
|
+
<div style={{
|
|
27
|
+
width: 200,
|
|
28
|
+
height: "100%"
|
|
29
|
+
}}>
|
|
30
|
+
<Heading type="h3">Vertical List</Heading>
|
|
31
|
+
<VirtualizedList {...args} items={generateItems(30, 1000, "vertical")} itemRenderer={itemRenderer} getItemSize={item => item.height} />
|
|
32
|
+
</div>
|
|
33
|
+
</Flex>
|
|
34
|
+
<Flex align="center" style={{
|
|
35
|
+
flexGrow: 1,
|
|
36
|
+
height: 300,
|
|
37
|
+
overflow: "hidden"
|
|
38
|
+
}}>
|
|
39
|
+
<div style={{
|
|
40
|
+
height: "100%",
|
|
41
|
+
width: "100%"
|
|
42
|
+
}}>
|
|
43
|
+
<Heading type="h3">Horizontal List</Heading>
|
|
44
|
+
<VirtualizedList {...args} items={generateItems(100, 1000, "horizontal")} itemRenderer={itemRenderer} getItemSize={item => item.width} layout="horizontal" />
|
|
45
|
+
</div>
|
|
46
|
+
</Flex>
|
|
47
|
+
</Flex>;
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Storybook Code Examples
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
```tsx
|
|
6
|
+
const wrapperRef = useRef(null);
|
|
7
|
+
const leftElRef = useRef(null);
|
|
8
|
+
const rightElRef = useRef(null);
|
|
9
|
+
const keyboardContext = useGridKeyboardNavigationContext([{
|
|
10
|
+
leftElement: leftElRef,
|
|
11
|
+
rightElement: rightElRef
|
|
12
|
+
}], wrapperRef);
|
|
13
|
+
return <GridKeyboardNavigationContext.Provider value={keyboardContext}>
|
|
14
|
+
<Flex ref={wrapperRef}>
|
|
15
|
+
<DummyNavigableGrid ref={leftElRef} itemsCount={15} numberOfItemsInLine={4} itemPrefix="L" />
|
|
16
|
+
<DummyNavigableGrid ref={rightElRef} itemsCount={7} numberOfItemsInLine={2} itemPrefix="R" />
|
|
17
|
+
</Flex>
|
|
18
|
+
</GridKeyboardNavigationContext.Provider>;
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Disabled Elements
|
|
22
|
+
|
|
23
|
+
```tsx
|
|
24
|
+
const wrapperRef = useRef(null);
|
|
25
|
+
const topElRef = useRef(null);
|
|
26
|
+
const middleElRef = useRef(null);
|
|
27
|
+
const bottomElRef = useRef(null);
|
|
28
|
+
const keyboardContext = useGridKeyboardNavigationContext([{
|
|
29
|
+
topElement: topElRef,
|
|
30
|
+
bottomElement: middleElRef
|
|
31
|
+
}, {
|
|
32
|
+
topElement: middleElRef,
|
|
33
|
+
bottomElement: bottomElRef
|
|
34
|
+
}], wrapperRef);
|
|
35
|
+
return <GridKeyboardNavigationContext.Provider value={keyboardContext}>
|
|
36
|
+
<Flex ref={wrapperRef} direction="column" justify="center" className="use-grid-keyboard-dummy-grid-wrapper">
|
|
37
|
+
<DummyNavigableGrid ref={topElRef} itemsCount={3} numberOfItemsInLine={3} itemPrefix="T" />
|
|
38
|
+
<DummyNavigableGrid ref={middleElRef} itemsCount={3} numberOfItemsInLine={3} itemPrefix="M" disabled />
|
|
39
|
+
<DummyNavigableGrid ref={bottomElRef} itemsCount={3} numberOfItemsInLine={3} itemPrefix="B" />
|
|
40
|
+
</Flex>
|
|
41
|
+
</GridKeyboardNavigationContext.Provider>;
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Multiple Depths
|
|
45
|
+
|
|
46
|
+
```tsx
|
|
47
|
+
const wrapperRef = useRef(null);
|
|
48
|
+
const topElRef = useRef(null);
|
|
49
|
+
const bottomElRef = useRef(null);
|
|
50
|
+
const keyboardContext = useGridKeyboardNavigationContext([{
|
|
51
|
+
topElement: topElRef,
|
|
52
|
+
bottomElement: bottomElRef
|
|
53
|
+
}], wrapperRef);
|
|
54
|
+
return <GridKeyboardNavigationContext.Provider value={keyboardContext}>
|
|
55
|
+
<Flex id="twoGridLayoutsWrapper" ref={wrapperRef} direction="column" tabIndex={-1}>
|
|
56
|
+
<LayoutWithInnerKeyboardNavigation id="gridLayoutTop" itemPrefix="T" ref={topElRef} />
|
|
57
|
+
<LayoutWithInnerKeyboardNavigation id="gridLayoutBottom" itemPrefix="B" ref={bottomElRef} />
|
|
58
|
+
</Flex>
|
|
59
|
+
</GridKeyboardNavigationContext.Provider>;
|
|
60
|
+
```
|
|
61
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibe/core",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.3.0-alpha-9bd83.0",
|
|
4
4
|
"description": "Official monday.com UI resources for application development in React.js",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
"build": "yarn build:esm && yarn build:mocked-classnames && yarn build:metadata",
|
|
81
81
|
"build:esm": "rollup -c",
|
|
82
82
|
"build:mocked-classnames": "[ \"$SKIP_RELEASE_ARTIFACTS\" = \"true\" ] || mock_classnames=on rollup -c",
|
|
83
|
-
"build:metadata": "[ \"$SKIP_RELEASE_ARTIFACTS\" = \"true\" ] || tsx src/scripts/
|
|
83
|
+
"build:metadata": "[ \"$SKIP_RELEASE_ARTIFACTS\" = \"true\" ] || tsx src/scripts/build-all-metadata.ts",
|
|
84
84
|
"link-local": "npm link && npm start",
|
|
85
85
|
"plop": "plop",
|
|
86
86
|
"lint": "eslint \"./src/**/*.{js,jsx,ts,tsx}\"",
|
|
@@ -91,20 +91,20 @@
|
|
|
91
91
|
"dependencies": {
|
|
92
92
|
"@floating-ui/react-dom": "^2.1.2",
|
|
93
93
|
"@vibe/base": "4.0.3",
|
|
94
|
-
"@vibe/button": "4.0.
|
|
94
|
+
"@vibe/button": "4.0.3",
|
|
95
95
|
"@vibe/clickable": "4.0.3",
|
|
96
|
-
"@vibe/dialog": "4.1.
|
|
96
|
+
"@vibe/dialog": "4.1.0",
|
|
97
97
|
"@vibe/hooks": "4.0.3",
|
|
98
98
|
"@vibe/icon": "4.0.3",
|
|
99
|
-
"@vibe/icon-button": "4.0.
|
|
100
|
-
"@vibe/icons": "4.
|
|
101
|
-
"@vibe/layer": "4.0.
|
|
99
|
+
"@vibe/icon-button": "4.0.3",
|
|
100
|
+
"@vibe/icons": "4.0.2",
|
|
101
|
+
"@vibe/layer": "4.0.3",
|
|
102
102
|
"@vibe/layout": "4.0.3",
|
|
103
103
|
"@vibe/loader": "4.0.3",
|
|
104
104
|
"@vibe/shared": "4.0.3",
|
|
105
105
|
"@vibe/style": "4.0.0",
|
|
106
|
-
"@vibe/tooltip": "4.0.
|
|
107
|
-
"@vibe/typography": "4.0.
|
|
106
|
+
"@vibe/tooltip": "4.0.3",
|
|
107
|
+
"@vibe/typography": "4.0.3",
|
|
108
108
|
"browserslist-config-monday": "1.0.6",
|
|
109
109
|
"classnames": "^2.5.1",
|
|
110
110
|
"date-fns": "^2.30.0",
|
|
@@ -123,6 +123,7 @@
|
|
|
123
123
|
"devDependencies": {
|
|
124
124
|
"@babel/core": "^7.23.2",
|
|
125
125
|
"@babel/eslint-parser": "^7.16.5",
|
|
126
|
+
"@babel/generator": "^7.24.4",
|
|
126
127
|
"@babel/parser": "^7.24.4",
|
|
127
128
|
"@babel/plugin-proposal-class-properties": "^7.16.5",
|
|
128
129
|
"@babel/plugin-proposal-private-methods": "^7.18.6",
|
|
@@ -134,6 +135,7 @@
|
|
|
134
135
|
"@babel/preset-react": "^7.16.5",
|
|
135
136
|
"@babel/preset-typescript": "^7.23.3",
|
|
136
137
|
"@babel/standalone": "^7.24.4",
|
|
138
|
+
"@babel/traverse": "^7.24.4",
|
|
137
139
|
"@babel/types": "^7.24.0",
|
|
138
140
|
"@hot-loader/react-dom": "^16.13.0",
|
|
139
141
|
"@jest/transform": "^29.7.0",
|
|
@@ -273,5 +275,5 @@
|
|
|
273
275
|
"browserslist": [
|
|
274
276
|
"extends browserslist-config-monday"
|
|
275
277
|
],
|
|
276
|
-
"gitHead": "
|
|
278
|
+
"gitHead": "74af140b25c3ace0b7424009773c904eee11643c"
|
|
277
279
|
}
|