@patternfly/react-core 4.250.1 → 4.250.3
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/CHANGELOG.md +19 -0
- package/dist/umd/react-core.min.css +58 -58
- package/package.json +2 -2
- package/src/components/Banner/__tests__/Banner.test.tsx +88 -23
- package/src/components/Banner/__tests__/__snapshots__/Banner.test.tsx.snap +2 -83
- package/src/components/Menu/examples/MenuWithDrilldown.tsx +1 -1
- package/src/components/Menu/examples/MenuWithDrilldownBreadcrumbs.tsx +3 -1
- package/src/components/Menu/examples/MenuWithDrilldownSubmenuFunctions.tsx +1 -1
- package/src/components/Sidebar/examples/Sidebar.md +6 -83
- package/src/components/Sidebar/examples/SidebarBasic.tsx +24 -0
- package/src/components/Sidebar/examples/SidebarPanelRightGutter.tsx +24 -0
- package/src/components/Sidebar/examples/SidebarResponsivePanel.tsx +25 -0
- package/src/components/Sidebar/examples/SidebarStack.tsx +24 -0
- package/src/components/Sidebar/examples/SidebarStaticPanel.tsx +25 -0
- package/src/components/Sidebar/examples/SidebarStickyPanel.tsx +25 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,25 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## 4.250.3 (2022-10-12)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @patternfly/react-core
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
## [4.250.2](https://github.com/patternfly/patternfly-react/compare/@patternfly/react-core@4.250.1...@patternfly/react-core@4.250.2) (2022-10-10)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
### Bug Fixes
|
|
18
|
+
|
|
19
|
+
* **Menu:** fixed height issue with drilldown examples ([#8033](https://github.com/patternfly/patternfly-react/issues/8033)) ([c0583b5](https://github.com/patternfly/patternfly-react/commit/c0583b530310b3d89be222e58fe926ecc6dd8d99))
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
6
25
|
## [4.250.1](https://github.com/patternfly/patternfly-react/compare/@patternfly/react-core@4.250.0...@patternfly/react-core@4.250.1) (2022-10-05)
|
|
7
26
|
|
|
8
27
|
**Note:** Version bump only for package @patternfly/react-core
|
|
@@ -22792,6 +22792,52 @@ svg.pf-c-spinner.pf-m-xl {
|
|
|
22792
22792
|
--pf-c-tooltip__arrow--Height: 0.9375rem;
|
|
22793
22793
|
}
|
|
22794
22794
|
|
|
22795
|
+
.pf-c-number-input .pf-c-form-control {
|
|
22796
|
+
appearance: textfield;
|
|
22797
|
+
}
|
|
22798
|
+
|
|
22799
|
+
.pf-c-number-input .pf-c-form-control::-webkit-inner-spin-button, .pf-c-number-input .pf-c-form-control::-webkit-outer-spin-button {
|
|
22800
|
+
appearance: none;
|
|
22801
|
+
margin: 0;
|
|
22802
|
+
}
|
|
22803
|
+
|
|
22804
|
+
.pf-c-number-input {
|
|
22805
|
+
--pf-c-number-input__unit--c-input-group--MarginLeft: var(--pf-global--spacer--sm);
|
|
22806
|
+
--pf-c-number-input__icon--FontSize: var(--pf-global--FontSize--xs);
|
|
22807
|
+
--pf-c-number-input--c-form-control--width-base: calc(var(--pf-global--spacer--sm) * 2 + var(--pf-global--BorderWidth--sm) * 2);
|
|
22808
|
+
--pf-c-number-input--c-form-control--width-icon: 0px;
|
|
22809
|
+
--pf-c-number-input--m-status--c-form-control--width-icon: var(--pf-global--spacer--xl);
|
|
22810
|
+
--pf-c-number-input--c-form-control--width-chars: 4;
|
|
22811
|
+
--pf-c-number-input--c-form-control--Width:
|
|
22812
|
+
calc(
|
|
22813
|
+
calc(
|
|
22814
|
+
var(--pf-c-number-input--c-form-control--width-base) + var(--pf-c-number-input--c-form-control--width-chars) * 1ch
|
|
22815
|
+
) + var(--pf-c-number-input--c-form-control--width-icon)
|
|
22816
|
+
);
|
|
22817
|
+
display: inline-flex;
|
|
22818
|
+
align-items: center;
|
|
22819
|
+
}
|
|
22820
|
+
|
|
22821
|
+
.pf-c-number-input.pf-m-status {
|
|
22822
|
+
--pf-c-number-input--c-form-control--width-icon: var(--pf-c-number-input--m-status--c-form-control--width-icon);
|
|
22823
|
+
}
|
|
22824
|
+
|
|
22825
|
+
.pf-c-number-input .pf-c-form-control {
|
|
22826
|
+
display: inline-flex;
|
|
22827
|
+
width: var(--pf-c-number-input--c-form-control--Width);
|
|
22828
|
+
text-align: right;
|
|
22829
|
+
}
|
|
22830
|
+
|
|
22831
|
+
.pf-c-input-group + .pf-c-number-input__unit,
|
|
22832
|
+
.pf-c-number-input__unit + .pf-c-input-group {
|
|
22833
|
+
margin-left: var(--pf-c-number-input__unit--c-input-group--MarginLeft);
|
|
22834
|
+
}
|
|
22835
|
+
|
|
22836
|
+
.pf-c-number-input__icon {
|
|
22837
|
+
display: flex;
|
|
22838
|
+
font-size: var(--pf-c-number-input__icon--FontSize);
|
|
22839
|
+
}
|
|
22840
|
+
|
|
22795
22841
|
.pf-c-tree-view {
|
|
22796
22842
|
--pf-c-tree-view--PaddingTop: var(--pf-global--spacer--sm);
|
|
22797
22843
|
--pf-c-tree-view--PaddingBottom: var(--pf-global--spacer--sm);
|
|
@@ -23882,52 +23928,6 @@ label.pf-c-tree-view__node-text {
|
|
|
23882
23928
|
color: var(--pf-global--Color--100);
|
|
23883
23929
|
}
|
|
23884
23930
|
|
|
23885
|
-
.pf-c-number-input .pf-c-form-control {
|
|
23886
|
-
appearance: textfield;
|
|
23887
|
-
}
|
|
23888
|
-
|
|
23889
|
-
.pf-c-number-input .pf-c-form-control::-webkit-inner-spin-button, .pf-c-number-input .pf-c-form-control::-webkit-outer-spin-button {
|
|
23890
|
-
appearance: none;
|
|
23891
|
-
margin: 0;
|
|
23892
|
-
}
|
|
23893
|
-
|
|
23894
|
-
.pf-c-number-input {
|
|
23895
|
-
--pf-c-number-input__unit--c-input-group--MarginLeft: var(--pf-global--spacer--sm);
|
|
23896
|
-
--pf-c-number-input__icon--FontSize: var(--pf-global--FontSize--xs);
|
|
23897
|
-
--pf-c-number-input--c-form-control--width-base: calc(var(--pf-global--spacer--sm) * 2 + var(--pf-global--BorderWidth--sm) * 2);
|
|
23898
|
-
--pf-c-number-input--c-form-control--width-icon: 0px;
|
|
23899
|
-
--pf-c-number-input--m-status--c-form-control--width-icon: var(--pf-global--spacer--xl);
|
|
23900
|
-
--pf-c-number-input--c-form-control--width-chars: 4;
|
|
23901
|
-
--pf-c-number-input--c-form-control--Width:
|
|
23902
|
-
calc(
|
|
23903
|
-
calc(
|
|
23904
|
-
var(--pf-c-number-input--c-form-control--width-base) + var(--pf-c-number-input--c-form-control--width-chars) * 1ch
|
|
23905
|
-
) + var(--pf-c-number-input--c-form-control--width-icon)
|
|
23906
|
-
);
|
|
23907
|
-
display: inline-flex;
|
|
23908
|
-
align-items: center;
|
|
23909
|
-
}
|
|
23910
|
-
|
|
23911
|
-
.pf-c-number-input.pf-m-status {
|
|
23912
|
-
--pf-c-number-input--c-form-control--width-icon: var(--pf-c-number-input--m-status--c-form-control--width-icon);
|
|
23913
|
-
}
|
|
23914
|
-
|
|
23915
|
-
.pf-c-number-input .pf-c-form-control {
|
|
23916
|
-
display: inline-flex;
|
|
23917
|
-
width: var(--pf-c-number-input--c-form-control--Width);
|
|
23918
|
-
text-align: right;
|
|
23919
|
-
}
|
|
23920
|
-
|
|
23921
|
-
.pf-c-input-group + .pf-c-number-input__unit,
|
|
23922
|
-
.pf-c-number-input__unit + .pf-c-input-group {
|
|
23923
|
-
margin-left: var(--pf-c-number-input__unit--c-input-group--MarginLeft);
|
|
23924
|
-
}
|
|
23925
|
-
|
|
23926
|
-
.pf-c-number-input__icon {
|
|
23927
|
-
display: flex;
|
|
23928
|
-
font-size: var(--pf-c-number-input__icon--FontSize);
|
|
23929
|
-
}
|
|
23930
|
-
|
|
23931
23931
|
.pf-c-draggable {
|
|
23932
23932
|
--pf-c-draggable--Cursor: auto;
|
|
23933
23933
|
--pf-c-draggable--m-dragging--Cursor: grabbing;
|
|
@@ -27636,6 +27636,18 @@ label.pf-c-tree-view__node-text {
|
|
|
27636
27636
|
grid-gap: var(--pf-l-grid--m-gutter--GridGap);
|
|
27637
27637
|
}
|
|
27638
27638
|
|
|
27639
|
+
.pf-l-level {
|
|
27640
|
+
--pf-l-level--m-gutter--MarginRight: var(--pf-global--gutter);
|
|
27641
|
+
display: flex;
|
|
27642
|
+
flex-wrap: wrap;
|
|
27643
|
+
align-items: center;
|
|
27644
|
+
justify-content: space-between;
|
|
27645
|
+
}
|
|
27646
|
+
|
|
27647
|
+
.pf-l-level.pf-m-gutter > *:not(:last-child) {
|
|
27648
|
+
margin-right: var(--pf-l-level--m-gutter--MarginRight);
|
|
27649
|
+
}
|
|
27650
|
+
|
|
27639
27651
|
.pf-l-split {
|
|
27640
27652
|
--pf-l-split--m-gutter--MarginRight: var(--pf-global--gutter);
|
|
27641
27653
|
display: flex;
|
|
@@ -27655,18 +27667,6 @@ label.pf-c-tree-view__node-text {
|
|
|
27655
27667
|
margin-right: var(--pf-l-split--m-gutter--MarginRight);
|
|
27656
27668
|
}
|
|
27657
27669
|
|
|
27658
|
-
.pf-l-level {
|
|
27659
|
-
--pf-l-level--m-gutter--MarginRight: var(--pf-global--gutter);
|
|
27660
|
-
display: flex;
|
|
27661
|
-
flex-wrap: wrap;
|
|
27662
|
-
align-items: center;
|
|
27663
|
-
justify-content: space-between;
|
|
27664
|
-
}
|
|
27665
|
-
|
|
27666
|
-
.pf-l-level.pf-m-gutter > *:not(:last-child) {
|
|
27667
|
-
margin-right: var(--pf-l-level--m-gutter--MarginRight);
|
|
27668
|
-
}
|
|
27669
|
-
|
|
27670
27670
|
.pf-l-stack {
|
|
27671
27671
|
--pf-l-stack--m-gutter--MarginBottom: var(--pf-global--gutter);
|
|
27672
27672
|
display: flex;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@patternfly/react-core",
|
|
3
|
-
"version": "4.250.
|
|
3
|
+
"version": "4.250.3",
|
|
4
4
|
"description": "This library provides a set of common React components for use with the PatternFly reference implementation.",
|
|
5
5
|
"main": "dist/js/index.js",
|
|
6
6
|
"module": "dist/esm/index.js",
|
|
@@ -70,5 +70,5 @@
|
|
|
70
70
|
"react": "^16.8 || ^17 || ^18",
|
|
71
71
|
"react-dom": "^16.8 || ^17 || ^18"
|
|
72
72
|
},
|
|
73
|
-
"gitHead": "
|
|
73
|
+
"gitHead": "5daeed558b92f13887c4ae278c2356abe2d22bae"
|
|
74
74
|
}
|
|
@@ -1,27 +1,92 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { render, screen } from '@testing-library/react';
|
|
1
3
|
import { Banner } from '../Banner';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
<Banner
|
|
9
|
-
variant={variant as 'default' | 'info' | 'success' | 'warning' | 'danger'}
|
|
10
|
-
aria-label={variant}
|
|
11
|
-
screenReaderText={`${variant} banner`}
|
|
12
|
-
>
|
|
13
|
-
{variant} Banner
|
|
14
|
-
</Banner>
|
|
15
|
-
);
|
|
16
|
-
expect(asFragment()).toMatchSnapshot();
|
|
17
|
-
});
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
test(`sticky banner`, () => {
|
|
21
|
-
const { asFragment } = render(
|
|
22
|
-
<Banner aria-label="sticky" isSticky>
|
|
23
|
-
Sticky Banner
|
|
24
|
-
</Banner>
|
|
4
|
+
|
|
5
|
+
test('Renders without children', () => {
|
|
6
|
+
render(
|
|
7
|
+
<div data-testid="banner">
|
|
8
|
+
<Banner />
|
|
9
|
+
</div>
|
|
25
10
|
);
|
|
11
|
+
expect(screen.getByTestId('banner').firstChild).toBeVisible();
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
test('Renders children', () => {
|
|
15
|
+
render(<Banner>Test</Banner>);
|
|
16
|
+
expect(screen.getByText('Test')).toBeVisible();
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
test('Renders with class name pf-c-banner', () => {
|
|
20
|
+
render(<Banner>Test</Banner>);
|
|
21
|
+
expect(screen.getByText('Test')).toHaveClass('pf-c-banner');
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test('Renders with custom class name when className prop is provided', () => {
|
|
25
|
+
render(<Banner className="custom-class">Test</Banner>);
|
|
26
|
+
expect(screen.getByText('Test')).toHaveClass('custom-class');
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test('Renders without any modifier class when variant prop is not passed', () => {
|
|
30
|
+
render(<Banner>Test</Banner>);
|
|
31
|
+
expect(screen.getByText('Test')).toHaveClass('pf-c-banner', { exact: true });
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test('Renders with class name pf-m-success when "success" is passed to variant prop', () => {
|
|
35
|
+
render(<Banner variant="success">Test</Banner>);
|
|
36
|
+
expect(screen.getByText('Test')).toHaveClass('pf-m-success');
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test('Renders with class name pf-m-danger when "danger" is passed to variant prop', () => {
|
|
40
|
+
render(<Banner variant="danger">Test</Banner>);
|
|
41
|
+
expect(screen.getByText('Test')).toHaveClass('pf-m-danger');
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test('Renders with class name pf-m-warning when "warning" is passed to variant prop', () => {
|
|
45
|
+
render(<Banner variant="warning">Test</Banner>);
|
|
46
|
+
expect(screen.getByText('Test')).toHaveClass('pf-m-warning');
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
test('Renders with class name pf-m-info when "info" is passed to variant prop', () => {
|
|
50
|
+
render(<Banner variant="info">Test</Banner>);
|
|
51
|
+
expect(screen.getByText('Test')).toHaveClass('pf-m-info');
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test('Renders pf-u-screen-reader class by default for screenReaderText', () => {
|
|
55
|
+
render(<Banner>Test</Banner>);
|
|
56
|
+
expect(screen.getByText('default banner')).toHaveClass('pf-u-screen-reader', { exact: true });
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test('Renders screenReaderText as "default banner" by default', () => {
|
|
60
|
+
render(<Banner>Test</Banner>);
|
|
61
|
+
expect(screen.getByText('default banner')).toBeInTheDocument();
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
test('Renders screenReaderText as "success banner" when variant="success"', () => {
|
|
65
|
+
render(<Banner variant="success">Test</Banner>);
|
|
66
|
+
expect(screen.getByText('success banner')).toBeInTheDocument();
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
test('Renders custom screenReaderText passed via prop', () => {
|
|
70
|
+
render(<Banner screenReaderText="Custom screen reader text">Test</Banner>);
|
|
71
|
+
expect(screen.getByText('Custom screen reader text')).toBeInTheDocument();
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
test('Renders without pf-m-sticky by default', () => {
|
|
75
|
+
render(<Banner>Test</Banner>);
|
|
76
|
+
expect(screen.getByText('Test')).not.toHaveClass('pf-m-sticky');
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test('Renders with class name pf-m-sticky when isSticky prop is passed', () => {
|
|
80
|
+
render(<Banner isSticky>Test</Banner>);
|
|
81
|
+
expect(screen.getByText('Test')).toHaveClass('pf-m-sticky');
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
test('Renders with inherited element props spread to the component', () => {
|
|
85
|
+
render(<Banner aria-label="Test label">Test</Banner>);
|
|
86
|
+
expect(screen.getByText('Test')).toHaveAccessibleName('Test label');
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
test('Matches the snapshot', () => {
|
|
90
|
+
const { asFragment } = render(<Banner>Test</Banner>);
|
|
26
91
|
expect(asFragment()).toMatchSnapshot();
|
|
27
92
|
});
|
|
@@ -1,60 +1,11 @@
|
|
|
1
1
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
2
|
|
|
3
|
-
exports[`
|
|
3
|
+
exports[`Matches the snapshot 1`] = `
|
|
4
4
|
<DocumentFragment>
|
|
5
5
|
<div
|
|
6
|
-
aria-label="danger"
|
|
7
|
-
class="pf-c-banner pf-m-danger"
|
|
8
|
-
>
|
|
9
|
-
danger Banner
|
|
10
|
-
<span
|
|
11
|
-
class="pf-u-screen-reader"
|
|
12
|
-
>
|
|
13
|
-
danger banner
|
|
14
|
-
</span>
|
|
15
|
-
</div>
|
|
16
|
-
</DocumentFragment>
|
|
17
|
-
`;
|
|
18
|
-
|
|
19
|
-
exports[`default banner 1`] = `
|
|
20
|
-
<DocumentFragment>
|
|
21
|
-
<div
|
|
22
|
-
aria-label="default"
|
|
23
6
|
class="pf-c-banner"
|
|
24
7
|
>
|
|
25
|
-
|
|
26
|
-
<span
|
|
27
|
-
class="pf-u-screen-reader"
|
|
28
|
-
>
|
|
29
|
-
default banner
|
|
30
|
-
</span>
|
|
31
|
-
</div>
|
|
32
|
-
</DocumentFragment>
|
|
33
|
-
`;
|
|
34
|
-
|
|
35
|
-
exports[`info banner 1`] = `
|
|
36
|
-
<DocumentFragment>
|
|
37
|
-
<div
|
|
38
|
-
aria-label="info"
|
|
39
|
-
class="pf-c-banner pf-m-info"
|
|
40
|
-
>
|
|
41
|
-
info Banner
|
|
42
|
-
<span
|
|
43
|
-
class="pf-u-screen-reader"
|
|
44
|
-
>
|
|
45
|
-
info banner
|
|
46
|
-
</span>
|
|
47
|
-
</div>
|
|
48
|
-
</DocumentFragment>
|
|
49
|
-
`;
|
|
50
|
-
|
|
51
|
-
exports[`sticky banner 1`] = `
|
|
52
|
-
<DocumentFragment>
|
|
53
|
-
<div
|
|
54
|
-
aria-label="sticky"
|
|
55
|
-
class="pf-c-banner pf-m-sticky"
|
|
56
|
-
>
|
|
57
|
-
Sticky Banner
|
|
8
|
+
Test
|
|
58
9
|
<span
|
|
59
10
|
class="pf-u-screen-reader"
|
|
60
11
|
>
|
|
@@ -63,35 +14,3 @@ exports[`sticky banner 1`] = `
|
|
|
63
14
|
</div>
|
|
64
15
|
</DocumentFragment>
|
|
65
16
|
`;
|
|
66
|
-
|
|
67
|
-
exports[`success banner 1`] = `
|
|
68
|
-
<DocumentFragment>
|
|
69
|
-
<div
|
|
70
|
-
aria-label="success"
|
|
71
|
-
class="pf-c-banner pf-m-success"
|
|
72
|
-
>
|
|
73
|
-
success Banner
|
|
74
|
-
<span
|
|
75
|
-
class="pf-u-screen-reader"
|
|
76
|
-
>
|
|
77
|
-
success banner
|
|
78
|
-
</span>
|
|
79
|
-
</div>
|
|
80
|
-
</DocumentFragment>
|
|
81
|
-
`;
|
|
82
|
-
|
|
83
|
-
exports[`warning banner 1`] = `
|
|
84
|
-
<DocumentFragment>
|
|
85
|
-
<div
|
|
86
|
-
aria-label="warning"
|
|
87
|
-
class="pf-c-banner pf-m-warning"
|
|
88
|
-
>
|
|
89
|
-
warning Banner
|
|
90
|
-
<span
|
|
91
|
-
class="pf-u-screen-reader"
|
|
92
|
-
>
|
|
93
|
-
warning banner
|
|
94
|
-
</span>
|
|
95
|
-
</div>
|
|
96
|
-
</DocumentFragment>
|
|
97
|
-
`;
|
|
@@ -26,7 +26,7 @@ export const MenuWithDrilldown: React.FunctionComponent = () => {
|
|
|
26
26
|
};
|
|
27
27
|
|
|
28
28
|
const setHeight = (menuId: string, height: number) => {
|
|
29
|
-
if (menuHeights[menuId] === undefined) {
|
|
29
|
+
if (menuHeights[menuId] === undefined || (menuId !== 'drilldown-rootMenu' && menuHeights[menuId] !== height)) {
|
|
30
30
|
setMenuHeights({ ...menuHeights, [menuId]: height });
|
|
31
31
|
}
|
|
32
32
|
};
|
|
@@ -55,11 +55,13 @@ export const MenuWithDrilldownBreadcrumbs: React.FunctionComponent = () => {
|
|
|
55
55
|
setDrilldownPath(pathSansLast);
|
|
56
56
|
setActiveMenu(toMenuId);
|
|
57
57
|
};
|
|
58
|
+
|
|
58
59
|
const setHeight = (menuId: string, height: number) => {
|
|
59
|
-
if (
|
|
60
|
+
if (menuHeights[menuId] === undefined || (menuId !== 'breadcrumbs-rootMenu' && menuHeights[menuId] !== height)) {
|
|
60
61
|
setMenuHeights({ ...menuHeights, [menuId]: height });
|
|
61
62
|
}
|
|
62
63
|
};
|
|
64
|
+
|
|
63
65
|
const drillIn = (fromMenuId: string, toMenuId: string, pathId: string) => {
|
|
64
66
|
setMenuDrilledIn([...menuDrilledIn, fromMenuId]);
|
|
65
67
|
setDrilldownPath([...drilldownPath, pathId]);
|
|
@@ -26,7 +26,7 @@ export const MenuWithDrilldownSubmenuFunctions: React.FunctionComponent = () =>
|
|
|
26
26
|
};
|
|
27
27
|
|
|
28
28
|
const setHeight = (menuId: string, height: number) => {
|
|
29
|
-
if (menuHeights[menuId] === undefined) {
|
|
29
|
+
if (menuHeights[menuId] === undefined || (menuId !== 'functions-rootMenu' && menuHeights[menuId] !== height)) {
|
|
30
30
|
setMenuHeights({ ...menuHeights, [menuId]: height });
|
|
31
31
|
}
|
|
32
32
|
};
|
|
@@ -7,105 +7,28 @@ propComponents: ['Sidebar', 'SidebarContent', 'SidebarPanel']
|
|
|
7
7
|
|
|
8
8
|
## Examples
|
|
9
9
|
### Basic
|
|
10
|
-
```
|
|
11
|
-
import React from 'react';
|
|
12
|
-
import { Sidebar, SidebarContent, SidebarPanel } from '@patternfly/react-core';
|
|
13
|
-
|
|
14
|
-
<Sidebar>
|
|
15
|
-
<SidebarPanel>
|
|
16
|
-
Sidebar panel
|
|
17
|
-
</SidebarPanel>
|
|
18
|
-
<SidebarContent>
|
|
19
|
-
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse dapibus nulla id augue dictum commodo. Donec mollis arcu massa, sollicitudin venenatis est rutrum vitae. Integer pulvinar ligula at augue mollis, ac pulvinar arcu semper. Maecenas nisi lorem, malesuada ac lectus nec, porta pretium neque. Ut convallis libero sit amet metus mattis, vel facilisis lorem malesuada. Duis consectetur ante sit amet magna efficitur, a interdum leo vulputate.</p>
|
|
20
|
-
<p>Praesent at odio nec sapien ultrices tincidunt in non mauris. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis consectetur nisl quis facilisis faucibus. Sed eu bibendum risus. Suspendisse porta euismod tortor, at elementum odio suscipit sed. Cras eget ultrices urna, ac feugiat lectus. Integer a pharetra velit, in imperdiet mi. Phasellus vel hendrerit velit. Vestibulum ut augue vitae erat vulputate bibendum a ut magna.</p>
|
|
21
|
-
</SidebarContent>
|
|
22
|
-
</Sidebar>
|
|
10
|
+
```ts file="./SidebarBasic.tsx"
|
|
23
11
|
```
|
|
24
12
|
|
|
25
13
|
### Stack
|
|
26
|
-
```
|
|
27
|
-
import React from 'react';
|
|
28
|
-
import { Sidebar, SidebarContent, SidebarPanel } from '@patternfly/react-core';
|
|
29
|
-
|
|
30
|
-
<Sidebar orientation="stack">
|
|
31
|
-
<SidebarPanel>
|
|
32
|
-
Sidebar panel stacked on top
|
|
33
|
-
</SidebarPanel>
|
|
34
|
-
<SidebarContent>
|
|
35
|
-
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse dapibus nulla id augue dictum commodo. Donec mollis arcu massa, sollicitudin venenatis est rutrum vitae. Integer pulvinar ligula at augue mollis, ac pulvinar arcu semper. Maecenas nisi lorem, malesuada ac lectus nec, porta pretium neque. Ut convallis libero sit amet metus mattis, vel facilisis lorem malesuada. Duis consectetur ante sit amet magna efficitur, a interdum leo vulputate.</p>
|
|
36
|
-
<p>Praesent at odio nec sapien ultrices tincidunt in non mauris. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis consectetur nisl quis facilisis faucibus. Sed eu bibendum risus. Suspendisse porta euismod tortor, at elementum odio suscipit sed. Cras eget ultrices urna, ac feugiat lectus. Integer a pharetra velit, in imperdiet mi. Phasellus vel hendrerit velit. Vestibulum ut augue vitae erat vulputate bibendum a ut magna.</p>
|
|
37
|
-
</SidebarContent>
|
|
38
|
-
</Sidebar>
|
|
14
|
+
```ts file="./SidebarStack.tsx"
|
|
39
15
|
```
|
|
40
16
|
|
|
41
17
|
### Panel right with gutter
|
|
42
|
-
```
|
|
43
|
-
import React from 'react';
|
|
44
|
-
import { Sidebar, SidebarContent, SidebarPanel } from '@patternfly/react-core';
|
|
45
|
-
|
|
46
|
-
<Sidebar isPanelRight hasGutter>
|
|
47
|
-
<SidebarPanel>
|
|
48
|
-
Sidebar panel on the right
|
|
49
|
-
</SidebarPanel>
|
|
50
|
-
<SidebarContent>
|
|
51
|
-
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse dapibus nulla id augue dictum commodo. Donec mollis arcu massa, sollicitudin venenatis est rutrum vitae. Integer pulvinar ligula at augue mollis, ac pulvinar arcu semper. Maecenas nisi lorem, malesuada ac lectus nec, porta pretium neque. Ut convallis libero sit amet metus mattis, vel facilisis lorem malesuada. Duis consectetur ante sit amet magna efficitur, a interdum leo vulputate.</p>
|
|
52
|
-
<p>Praesent at odio nec sapien ultrices tincidunt in non mauris. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis consectetur nisl quis facilisis faucibus. Sed eu bibendum risus. Suspendisse porta euismod tortor, at elementum odio suscipit sed. Cras eget ultrices urna, ac feugiat lectus. Integer a pharetra velit, in imperdiet mi. Phasellus vel hendrerit velit. Vestibulum ut augue vitae erat vulputate bibendum a ut magna.</p>
|
|
53
|
-
</SidebarContent>
|
|
54
|
-
</Sidebar>
|
|
18
|
+
```ts file="./SidebarPanelRightGutter.tsx"
|
|
55
19
|
```
|
|
56
20
|
|
|
57
21
|
### Sticky panel
|
|
58
22
|
A `tabIndex` should be added to the `Sidebar` when there is scrollable content in order for the overflow content to be accessible by keyboard.
|
|
59
|
-
```
|
|
60
|
-
import React from 'react';
|
|
61
|
-
import { Sidebar, SidebarContent, SidebarPanel } from '@patternfly/react-core';
|
|
62
|
-
|
|
63
|
-
<Sidebar style={{ height: '200px', overflow: 'auto' }} tabIndex={0}>
|
|
64
|
-
<SidebarPanel variant="sticky">
|
|
65
|
-
Sticky sidebar panel
|
|
66
|
-
</SidebarPanel>
|
|
67
|
-
<SidebarContent>
|
|
68
|
-
<p>Scroll me!</p>
|
|
69
|
-
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse dapibus nulla id augue dictum commodo. Donec mollis arcu massa, sollicitudin venenatis est rutrum vitae. Integer pulvinar ligula at augue mollis, ac pulvinar arcu semper. Maecenas nisi lorem, malesuada ac lectus nec, porta pretium neque. Ut convallis libero sit amet metus mattis, vel facilisis lorem malesuada. Duis consectetur ante sit amet magna efficitur, a interdum leo vulputate.</p>
|
|
70
|
-
<p>Praesent at odio nec sapien ultrices tincidunt in non mauris. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis consectetur nisl quis facilisis faucibus. Sed eu bibendum risus. Suspendisse porta euismod tortor, at elementum odio suscipit sed. Cras eget ultrices urna, ac feugiat lectus. Integer a pharetra velit, in imperdiet mi. Phasellus vel hendrerit velit. Vestibulum ut augue vitae erat vulputate bibendum a ut magna.</p>
|
|
71
|
-
</SidebarContent>
|
|
72
|
-
</Sidebar>
|
|
23
|
+
```ts file="./SidebarStickyPanel.tsx"
|
|
73
24
|
```
|
|
74
25
|
|
|
75
26
|
### Static panel
|
|
76
27
|
A `tabIndex` should be added to the `Sidebar` when there is scrollable content in order for the overflow content to be accessible by keyboard.
|
|
77
|
-
```
|
|
78
|
-
import React from 'react';
|
|
79
|
-
import { Sidebar, SidebarContent, SidebarPanel } from '@patternfly/react-core';
|
|
80
|
-
|
|
81
|
-
<Sidebar style={{ height: '200px', overflow: 'auto' }} tabIndex={0}>
|
|
82
|
-
<SidebarPanel variant="static">
|
|
83
|
-
Static sidebar panel
|
|
84
|
-
</SidebarPanel>
|
|
85
|
-
<SidebarContent>
|
|
86
|
-
<p>Scroll me!</p>
|
|
87
|
-
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse dapibus nulla id augue dictum commodo. Donec mollis arcu massa, sollicitudin venenatis est rutrum vitae. Integer pulvinar ligula at augue mollis, ac pulvinar arcu semper. Maecenas nisi lorem, malesuada ac lectus nec, porta pretium neque. Ut convallis libero sit amet metus mattis, vel facilisis lorem malesuada. Duis consectetur ante sit amet magna efficitur, a interdum leo vulputate.</p>
|
|
88
|
-
<p>Praesent at odio nec sapien ultrices tincidunt in non mauris. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis consectetur nisl quis facilisis faucibus. Sed eu bibendum risus. Suspendisse porta euismod tortor, at elementum odio suscipit sed. Cras eget ultrices urna, ac feugiat lectus. Integer a pharetra velit, in imperdiet mi. Phasellus vel hendrerit velit. Vestibulum ut augue vitae erat vulputate bibendum a ut magna.</p>
|
|
89
|
-
</SidebarContent>
|
|
90
|
-
</Sidebar>
|
|
28
|
+
```ts file="./SidebarStaticPanel.tsx"
|
|
91
29
|
```
|
|
92
30
|
|
|
93
31
|
### Responsive panel width
|
|
94
32
|
A `tabIndex` should be added to the `Sidebar` when there is scrollable content in order for the overflow content to be accessible by keyboard.
|
|
95
|
-
```
|
|
96
|
-
import React from 'react';
|
|
97
|
-
import { Sidebar, SidebarContent, SidebarPanel } from '@patternfly/react-core';
|
|
98
|
-
|
|
99
|
-
<Sidebar style={{ height: '200px', overflow: 'auto' }} tabIndex={0}>
|
|
100
|
-
<SidebarPanel width={{ default: 'width_50', lg: 'width_33', xl: 'width_75' }}>
|
|
101
|
-
Sidebar panel
|
|
102
|
-
</SidebarPanel>
|
|
103
|
-
<SidebarContent>
|
|
104
|
-
<p>Resize me!</p>
|
|
105
|
-
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse dapibus nulla id augue dictum commodo. Donec mollis arcu massa, sollicitudin venenatis est rutrum vitae. Integer pulvinar ligula at augue mollis, ac pulvinar arcu semper. Maecenas nisi lorem, malesuada ac lectus nec, porta pretium neque. Ut convallis libero sit amet metus mattis, vel facilisis lorem malesuada. Duis consectetur ante sit amet magna efficitur, a interdum leo vulputate.</p>
|
|
106
|
-
<p>Praesent at odio nec sapien ultrices tincidunt in non mauris. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis consectetur nisl quis facilisis faucibus. Sed eu bibendum risus. Suspendisse porta euismod tortor, at elementum odio suscipit sed. Cras eget ultrices urna, ac feugiat lectus. Integer a pharetra velit, in imperdiet mi. Phasellus vel hendrerit velit. Vestibulum ut augue vitae erat vulputate bibendum a ut magna.</p>
|
|
107
|
-
</SidebarContent>
|
|
108
|
-
</Sidebar>
|
|
33
|
+
```ts file="./SidebarResponsivePanel.tsx"
|
|
109
34
|
```
|
|
110
|
-
|
|
111
|
-
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Sidebar, SidebarContent, SidebarPanel } from '@patternfly/react-core';
|
|
3
|
+
|
|
4
|
+
export const SidebarBasic: React.FunctionComponent = () => (
|
|
5
|
+
<Sidebar>
|
|
6
|
+
<SidebarPanel>Sidebar panel</SidebarPanel>
|
|
7
|
+
<SidebarContent>
|
|
8
|
+
<p>
|
|
9
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse dapibus nulla id augue dictum commodo.
|
|
10
|
+
Donec mollis arcu massa, sollicitudin venenatis est rutrum vitae. Integer pulvinar ligula at augue mollis, ac
|
|
11
|
+
pulvinar arcu semper. Maecenas nisi lorem, malesuada ac lectus nec, porta pretium neque. Ut convallis libero sit
|
|
12
|
+
amet metus mattis, vel facilisis lorem malesuada. Duis consectetur ante sit amet magna efficitur, a interdum leo
|
|
13
|
+
vulputate.
|
|
14
|
+
</p>
|
|
15
|
+
<p>
|
|
16
|
+
Praesent at odio nec sapien ultrices tincidunt in non mauris. Orci varius natoque penatibus et magnis dis
|
|
17
|
+
parturient montes, nascetur ridiculus mus. Duis consectetur nisl quis facilisis faucibus. Sed eu bibendum risus.
|
|
18
|
+
Suspendisse porta euismod tortor, at elementum odio suscipit sed. Cras eget ultrices urna, ac feugiat lectus.
|
|
19
|
+
Integer a pharetra velit, in imperdiet mi. Phasellus vel hendrerit velit. Vestibulum ut augue vitae erat
|
|
20
|
+
vulputate bibendum a ut magna.
|
|
21
|
+
</p>
|
|
22
|
+
</SidebarContent>
|
|
23
|
+
</Sidebar>
|
|
24
|
+
);
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Sidebar, SidebarContent, SidebarPanel } from '@patternfly/react-core';
|
|
3
|
+
|
|
4
|
+
export const SidebarPanelRightGutter: React.FunctionComponent = () => (
|
|
5
|
+
<Sidebar isPanelRight hasGutter>
|
|
6
|
+
<SidebarPanel>Sidebar panel on the right</SidebarPanel>
|
|
7
|
+
<SidebarContent>
|
|
8
|
+
<p>
|
|
9
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse dapibus nulla id augue dictum commodo.
|
|
10
|
+
Donec mollis arcu massa, sollicitudin venenatis est rutrum vitae. Integer pulvinar ligula at augue mollis, ac
|
|
11
|
+
pulvinar arcu semper. Maecenas nisi lorem, malesuada ac lectus nec, porta pretium neque. Ut convallis libero sit
|
|
12
|
+
amet metus mattis, vel facilisis lorem malesuada. Duis consectetur ante sit amet magna efficitur, a interdum leo
|
|
13
|
+
vulputate.
|
|
14
|
+
</p>
|
|
15
|
+
<p>
|
|
16
|
+
Praesent at odio nec sapien ultrices tincidunt in non mauris. Orci varius natoque penatibus et magnis dis
|
|
17
|
+
parturient montes, nascetur ridiculus mus. Duis consectetur nisl quis facilisis faucibus. Sed eu bibendum risus.
|
|
18
|
+
Suspendisse porta euismod tortor, at elementum odio suscipit sed. Cras eget ultrices urna, ac feugiat lectus.
|
|
19
|
+
Integer a pharetra velit, in imperdiet mi. Phasellus vel hendrerit velit. Vestibulum ut augue vitae erat
|
|
20
|
+
vulputate bibendum a ut magna.
|
|
21
|
+
</p>
|
|
22
|
+
</SidebarContent>
|
|
23
|
+
</Sidebar>
|
|
24
|
+
);
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Sidebar, SidebarContent, SidebarPanel } from '@patternfly/react-core';
|
|
3
|
+
|
|
4
|
+
export const SidebarResponsivePanel: React.FunctionComponent = () => (
|
|
5
|
+
<Sidebar style={{ height: '200px', overflow: 'auto' }} tabIndex={0}>
|
|
6
|
+
<SidebarPanel width={{ default: 'width_50', lg: 'width_33', xl: 'width_75' }}>Sidebar panel</SidebarPanel>
|
|
7
|
+
<SidebarContent>
|
|
8
|
+
<p>Resize me!</p>
|
|
9
|
+
<p>
|
|
10
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse dapibus nulla id augue dictum commodo.
|
|
11
|
+
Donec mollis arcu massa, sollicitudin venenatis est rutrum vitae. Integer pulvinar ligula at augue mollis, ac
|
|
12
|
+
pulvinar arcu semper. Maecenas nisi lorem, malesuada ac lectus nec, porta pretium neque. Ut convallis libero sit
|
|
13
|
+
amet metus mattis, vel facilisis lorem malesuada. Duis consectetur ante sit amet magna efficitur, a interdum leo
|
|
14
|
+
vulputate.
|
|
15
|
+
</p>
|
|
16
|
+
<p>
|
|
17
|
+
Praesent at odio nec sapien ultrices tincidunt in non mauris. Orci varius natoque penatibus et magnis dis
|
|
18
|
+
parturient montes, nascetur ridiculus mus. Duis consectetur nisl quis facilisis faucibus. Sed eu bibendum risus.
|
|
19
|
+
Suspendisse porta euismod tortor, at elementum odio suscipit sed. Cras eget ultrices urna, ac feugiat lectus.
|
|
20
|
+
Integer a pharetra velit, in imperdiet mi. Phasellus vel hendrerit velit. Vestibulum ut augue vitae erat
|
|
21
|
+
vulputate bibendum a ut magna.
|
|
22
|
+
</p>
|
|
23
|
+
</SidebarContent>
|
|
24
|
+
</Sidebar>
|
|
25
|
+
);
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Sidebar, SidebarContent, SidebarPanel } from '@patternfly/react-core';
|
|
3
|
+
|
|
4
|
+
export const SidebarStack: React.FunctionComponent = () => (
|
|
5
|
+
<Sidebar orientation="stack">
|
|
6
|
+
<SidebarPanel>Sidebar panel stacked on top</SidebarPanel>
|
|
7
|
+
<SidebarContent>
|
|
8
|
+
<p>
|
|
9
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse dapibus nulla id augue dictum commodo.
|
|
10
|
+
Donec mollis arcu massa, sollicitudin venenatis est rutrum vitae. Integer pulvinar ligula at augue mollis, ac
|
|
11
|
+
pulvinar arcu semper. Maecenas nisi lorem, malesuada ac lectus nec, porta pretium neque. Ut convallis libero sit
|
|
12
|
+
amet metus mattis, vel facilisis lorem malesuada. Duis consectetur ante sit amet magna efficitur, a interdum leo
|
|
13
|
+
vulputate.
|
|
14
|
+
</p>
|
|
15
|
+
<p>
|
|
16
|
+
Praesent at odio nec sapien ultrices tincidunt in non mauris. Orci varius natoque penatibus et magnis dis
|
|
17
|
+
parturient montes, nascetur ridiculus mus. Duis consectetur nisl quis facilisis faucibus. Sed eu bibendum risus.
|
|
18
|
+
Suspendisse porta euismod tortor, at elementum odio suscipit sed. Cras eget ultrices urna, ac feugiat lectus.
|
|
19
|
+
Integer a pharetra velit, in imperdiet mi. Phasellus vel hendrerit velit. Vestibulum ut augue vitae erat
|
|
20
|
+
vulputate bibendum a ut magna.
|
|
21
|
+
</p>
|
|
22
|
+
</SidebarContent>
|
|
23
|
+
</Sidebar>
|
|
24
|
+
);
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Sidebar, SidebarContent, SidebarPanel } from '@patternfly/react-core';
|
|
3
|
+
|
|
4
|
+
export const SidebarStaticPanel: React.FunctionComponent = () => (
|
|
5
|
+
<Sidebar style={{ height: '200px', overflow: 'auto' }} tabIndex={0}>
|
|
6
|
+
<SidebarPanel variant="static">Static sidebar panel</SidebarPanel>
|
|
7
|
+
<SidebarContent>
|
|
8
|
+
<p>Scroll me!</p>
|
|
9
|
+
<p>
|
|
10
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse dapibus nulla id augue dictum commodo.
|
|
11
|
+
Donec mollis arcu massa, sollicitudin venenatis est rutrum vitae. Integer pulvinar ligula at augue mollis, ac
|
|
12
|
+
pulvinar arcu semper. Maecenas nisi lorem, malesuada ac lectus nec, porta pretium neque. Ut convallis libero sit
|
|
13
|
+
amet metus mattis, vel facilisis lorem malesuada. Duis consectetur ante sit amet magna efficitur, a interdum leo
|
|
14
|
+
vulputate.
|
|
15
|
+
</p>
|
|
16
|
+
<p>
|
|
17
|
+
Praesent at odio nec sapien ultrices tincidunt in non mauris. Orci varius natoque penatibus et magnis dis
|
|
18
|
+
parturient montes, nascetur ridiculus mus. Duis consectetur nisl quis facilisis faucibus. Sed eu bibendum risus.
|
|
19
|
+
Suspendisse porta euismod tortor, at elementum odio suscipit sed. Cras eget ultrices urna, ac feugiat lectus.
|
|
20
|
+
Integer a pharetra velit, in imperdiet mi. Phasellus vel hendrerit velit. Vestibulum ut augue vitae erat
|
|
21
|
+
vulputate bibendum a ut magna.
|
|
22
|
+
</p>
|
|
23
|
+
</SidebarContent>
|
|
24
|
+
</Sidebar>
|
|
25
|
+
);
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Sidebar, SidebarContent, SidebarPanel } from '@patternfly/react-core';
|
|
3
|
+
|
|
4
|
+
export const SidebarStickyPanel: React.FunctionComponent = () => (
|
|
5
|
+
<Sidebar style={{ height: '200px', overflow: 'auto' }} tabIndex={0}>
|
|
6
|
+
<SidebarPanel variant="sticky">Sticky sidebar panel</SidebarPanel>
|
|
7
|
+
<SidebarContent>
|
|
8
|
+
<p>Scroll me!</p>
|
|
9
|
+
<p>
|
|
10
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse dapibus nulla id augue dictum commodo.
|
|
11
|
+
Donec mollis arcu massa, sollicitudin venenatis est rutrum vitae. Integer pulvinar ligula at augue mollis, ac
|
|
12
|
+
pulvinar arcu semper. Maecenas nisi lorem, malesuada ac lectus nec, porta pretium neque. Ut convallis libero sit
|
|
13
|
+
amet metus mattis, vel facilisis lorem malesuada. Duis consectetur ante sit amet magna efficitur, a interdum leo
|
|
14
|
+
vulputate.
|
|
15
|
+
</p>
|
|
16
|
+
<p>
|
|
17
|
+
Praesent at odio nec sapien ultrices tincidunt in non mauris. Orci varius natoque penatibus et magnis dis
|
|
18
|
+
parturient montes, nascetur ridiculus mus. Duis consectetur nisl quis facilisis faucibus. Sed eu bibendum risus.
|
|
19
|
+
Suspendisse porta euismod tortor, at elementum odio suscipit sed. Cras eget ultrices urna, ac feugiat lectus.
|
|
20
|
+
Integer a pharetra velit, in imperdiet mi. Phasellus vel hendrerit velit. Vestibulum ut augue vitae erat
|
|
21
|
+
vulputate bibendum a ut magna.
|
|
22
|
+
</p>
|
|
23
|
+
</SidebarContent>
|
|
24
|
+
</Sidebar>
|
|
25
|
+
);
|