@redis-ui/components 43.0.2 → 43.2.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.
- package/dist/HighlightedIcon/HighlightedIcon.cjs +26 -0
- package/dist/HighlightedIcon/HighlightedIcon.d.ts +3 -0
- package/dist/HighlightedIcon/HighlightedIcon.js +26 -0
- package/dist/HighlightedIcon/HighlightedIcon.style.cjs +49 -0
- package/dist/HighlightedIcon/HighlightedIcon.style.d.ts +5 -0
- package/dist/HighlightedIcon/HighlightedIcon.style.js +47 -0
- package/dist/HighlightedIcon/HighlightedIcon.types.d.ts +8 -0
- package/dist/HighlightedIcon/index.d.ts +3 -0
- package/dist/Stepper/Stepper.cjs +14 -5
- package/dist/Stepper/Stepper.d.ts +2 -0
- package/dist/Stepper/Stepper.js +14 -5
- package/dist/Stepper/Stepper.utils.cjs +12 -0
- package/dist/Stepper/Stepper.utils.d.ts +2 -0
- package/dist/Stepper/Stepper.utils.js +12 -0
- package/dist/Stepper/components/Compose/Compose.d.ts +1 -0
- package/dist/Stepper/components/Step/Step.cjs +2 -0
- package/dist/Stepper/components/Step/Step.d.ts +1 -0
- package/dist/Stepper/components/Step/Step.js +2 -0
- package/dist/Stepper/components/Step/components/Compose/Compose.cjs +2 -9
- package/dist/Stepper/components/Step/components/Compose/Compose.js +2 -9
- package/dist/Stepper/components/Step/components/Separator/Separator.cjs +15 -0
- package/dist/Stepper/components/Step/components/Separator/Separator.d.ts +3 -0
- package/dist/Stepper/components/Step/components/Separator/Separator.js +15 -0
- package/dist/Stepper/components/Step/components/Separator/Separator.style.cjs +24 -0
- package/dist/Stepper/components/Step/components/Separator/Separator.style.d.ts +1 -0
- package/dist/Stepper/components/Step/components/Separator/Separator.style.js +22 -0
- package/dist/Stepper/components/Step/components/Separator/Separator.types.d.ts +5 -0
- package/dist/index.cjs +4 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +74 -70
- package/package.json +2 -2
- package/skills/redis-ui-components/SKILL.md +0 -2
- package/skills/redis-ui-components/references/ActionIconButton.md +96 -0
- package/skills/redis-ui-components/references/AppBar.md +161 -0
- package/skills/redis-ui-components/references/AppSelectionMenu.md +184 -0
- package/skills/redis-ui-components/references/AutoCompleteSelect.md +193 -0
- package/skills/redis-ui-components/references/Badge.md +77 -0
- package/skills/redis-ui-components/references/Banner.md +563 -0
- package/skills/redis-ui-components/references/BoxSelectionGroup.md +487 -0
- package/skills/redis-ui-components/references/Breadcrumbs.md +214 -0
- package/skills/redis-ui-components/references/ButtonGroup.md +126 -0
- package/skills/redis-ui-components/references/Card.md +56 -0
- package/skills/redis-ui-components/references/Checkbox.md +171 -0
- package/skills/redis-ui-components/references/Chip.md +154 -0
- package/skills/redis-ui-components/references/ChipList.md +307 -0
- package/skills/redis-ui-components/references/CopyToClipboardButton.md +47 -0
- package/skills/redis-ui-components/references/CountryFlag.md +57 -0
- package/skills/redis-ui-components/references/Drawer.md +298 -0
- package/skills/redis-ui-components/references/Filters.md +162 -0
- package/skills/redis-ui-components/references/FormField.md +678 -0
- package/skills/redis-ui-components/references/IconButton.md +63 -0
- package/skills/redis-ui-components/references/Input.md +295 -0
- package/skills/redis-ui-components/references/KeyValueList.md +501 -0
- package/skills/redis-ui-components/references/Label.md +238 -0
- package/skills/redis-ui-components/references/Link.md +402 -0
- package/skills/redis-ui-components/references/Loader.md +100 -0
- package/skills/redis-ui-components/references/Menu.md +988 -0
- package/skills/redis-ui-components/references/MidBar.md +358 -0
- package/skills/redis-ui-components/references/Modal.md +525 -0
- package/skills/redis-ui-components/references/MoreInfoIcon.md +119 -0
- package/skills/redis-ui-components/references/MultiSelect.md +558 -0
- package/skills/redis-ui-components/references/NumericInput.md +322 -0
- package/skills/redis-ui-components/references/Overflow.md +127 -0
- package/skills/redis-ui-components/references/Pagination.md +151 -0
- package/skills/redis-ui-components/references/PasswordInput.md +262 -0
- package/skills/redis-ui-components/references/Popover.md +868 -0
- package/skills/redis-ui-components/references/ProfileIcon.md +65 -0
- package/skills/redis-ui-components/references/ProgressBar.md +103 -0
- package/skills/redis-ui-components/references/QuantityCounter.md +555 -0
- package/skills/redis-ui-components/references/RadioGroup.md +265 -0
- package/skills/redis-ui-components/references/ScreenReaderAnnounce.md +147 -0
- package/skills/redis-ui-components/references/SearchBar.md +242 -0
- package/skills/redis-ui-components/references/SearchInput.md +213 -0
- package/skills/redis-ui-components/references/Section.md +349 -0
- package/skills/redis-ui-components/references/SideBar.md +468 -0
- package/skills/redis-ui-components/references/Slider.md +398 -0
- package/skills/redis-ui-components/references/Stepper.md +288 -0
- package/skills/redis-ui-components/references/Switch.md +193 -0
- package/skills/redis-ui-components/references/Tabs.md +383 -0
- package/skills/redis-ui-components/references/TextArea.md +139 -0
- package/skills/redis-ui-components/references/TextButton.md +217 -0
- package/skills/redis-ui-components/references/Toast.md +399 -0
- package/skills/redis-ui-components/references/ToggleButton.md +163 -0
- package/skills/redis-ui-components/references/Tooltip.md +636 -0
- package/skills/redis-ui-components/references/Typography.md +323 -0
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
# SideBar
|
|
2
|
+
|
|
3
|
+
Collapsible sidebar navigation with a header toggle, grouped items, scrollable middle content, and a footer area. The component is designed as a compound API so the header, items, splitters, and footer pieces can be composed as needed.
|
|
4
|
+
|
|
5
|
+
## Import
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
import { SideBar } from '@redislabsdev/redis-ui-components';
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Props
|
|
12
|
+
|
|
13
|
+
| Prop | Type | Default | Description |
|
|
14
|
+
|------|------|---------|-------------|
|
|
15
|
+
| isExpanded | `boolean` | *required* | Controls whether the sidebar is expanded or collapsed |
|
|
16
|
+
|
|
17
|
+
The component also accepts all `FlexGroupProps` except `direction`, which is fixed to a vertical sidebar layout.
|
|
18
|
+
|
|
19
|
+
## Sub-components
|
|
20
|
+
|
|
21
|
+
- `SideBar.SideBarLogo` - Renders the logo icon used inside the sidebar header.
|
|
22
|
+
- `SideBar.Header` - Header row with the expand/collapse toggle button and accessibility announcement.
|
|
23
|
+
- `SideBar.ItemsContainer` - Column container for sidebar items.
|
|
24
|
+
- `SideBar.ScrollContainer` - Flexible scrollable container for sidebar content.
|
|
25
|
+
- `SideBar.Split` - Flexible spacer used to distribute remaining vertical space.
|
|
26
|
+
- `SideBar.Divider` - Visual separator line.
|
|
27
|
+
- `SideBar.Button` - Root collapsible action button shown in the sidebar.
|
|
28
|
+
- `SideBar.Item` - Navigation item with tooltip support when collapsed.
|
|
29
|
+
- `SideBar.Item.Icon` - Icon slot for a sidebar item.
|
|
30
|
+
- `SideBar.Item.Text` - Text slot for a sidebar item.
|
|
31
|
+
- `SideBar.Item.Button` - Compact action button that is shown only when the sidebar is expanded.
|
|
32
|
+
- `SideBar.Footer` - Footer wrapper for metadata, links, and text.
|
|
33
|
+
- `SideBar.Footer.MetaData` - Footer metadata container.
|
|
34
|
+
- `SideBar.Footer.Link` - Footer link rendered as body text.
|
|
35
|
+
- `SideBar.Footer.Text` - Small footer text.
|
|
36
|
+
|
|
37
|
+
### SideBar.Header Props
|
|
38
|
+
|
|
39
|
+
| Prop | Type | Default | Description |
|
|
40
|
+
|------|------|---------|-------------|
|
|
41
|
+
| onToggle | `() => void` | *required* | Called when the header toggle button is pressed |
|
|
42
|
+
|
|
43
|
+
The header also accepts standard `HTMLAttributes<HTMLDivElement>`.
|
|
44
|
+
|
|
45
|
+
### SideBar.SideBarLogo Props
|
|
46
|
+
|
|
47
|
+
| Prop | Type | Default | Description |
|
|
48
|
+
|------|------|---------|-------------|
|
|
49
|
+
| logoIcon | `IconType` | *required* | Logo icon rendered inside the header |
|
|
50
|
+
|
|
51
|
+
The logo also accepts standard `HTMLAttributes<HTMLSpanElement>` except `children`.
|
|
52
|
+
|
|
53
|
+
### SideBar.ItemsContainer Props
|
|
54
|
+
|
|
55
|
+
This component inherits `FlexGroupProps` except `direction`. It renders a column list container with `gap="0"`, `flex="none"`, and `selfAlign="stretch"`.
|
|
56
|
+
|
|
57
|
+
### SideBar.ScrollContainer Props
|
|
58
|
+
|
|
59
|
+
This component inherits `FlexGroupProps` except `direction`. It renders a flexible column container with `gap="0"`, `flex="1"`, and `selfAlign="stretch"`.
|
|
60
|
+
|
|
61
|
+
### SideBar.Divider Props
|
|
62
|
+
|
|
63
|
+
| Prop | Type | Default | Description |
|
|
64
|
+
|------|------|---------|-------------|
|
|
65
|
+
| fullWidthWhenExpanded | `boolean` | - | Expands the divider to full width when the sidebar is expanded |
|
|
66
|
+
| noMargin | `boolean` | - | Removes vertical margins |
|
|
67
|
+
| fullWidth | `boolean` | - | Makes the divider span the full width |
|
|
68
|
+
|
|
69
|
+
The divider also accepts standard `HTMLAttributes<HTMLDivElement>` except `children`.
|
|
70
|
+
|
|
71
|
+
### SideBar.Item Props
|
|
72
|
+
|
|
73
|
+
| Prop | Type | Default | Description |
|
|
74
|
+
|------|------|---------|-------------|
|
|
75
|
+
| tooltipProps | `SideBarTooltipProps` | *required* | Tooltip configuration used when the sidebar is collapsed |
|
|
76
|
+
| isActive | `boolean` | `false` | Marks the item as the active route/item |
|
|
77
|
+
|
|
78
|
+
The item also accepts standard `HTMLAttributes<HTMLLIElement>`.
|
|
79
|
+
The tooltip text is used as the collapsed label and tooltip placement defaults to `right`.
|
|
80
|
+
|
|
81
|
+
### SideBar.Item.Icon Props
|
|
82
|
+
|
|
83
|
+
| Prop | Type | Default | Description |
|
|
84
|
+
|------|------|---------|-------------|
|
|
85
|
+
| icon | `IconType` | *required* | Icon rendered inside the item |
|
|
86
|
+
|
|
87
|
+
### SideBar.Item.Text Props
|
|
88
|
+
|
|
89
|
+
This slot inherits `TypographyBodyProps`. It renders a `Typography.Body` element with `component="span"`, `ellipsis`, and `tooltipOnEllipsis` enabled.
|
|
90
|
+
|
|
91
|
+
### SideBar.Item.Button Props
|
|
92
|
+
|
|
93
|
+
This slot inherits all `ActionIconButtonProps`, defaults `size` to `M`, and renders only while the sidebar is expanded.
|
|
94
|
+
|
|
95
|
+
### SideBar.Button Props
|
|
96
|
+
|
|
97
|
+
| Prop | Type | Default | Description |
|
|
98
|
+
|------|------|---------|-------------|
|
|
99
|
+
| tooltipProps | `SideBarTooltipProps` | *required* | Tooltip configuration used when the sidebar is collapsed |
|
|
100
|
+
| buttonExpandedContent | `React.ReactNode` | *required* | Content displayed while the sidebar is expanded |
|
|
101
|
+
| buttonCollapsedIcon | `IconType` | `PlusIcon` | Icon shown while the sidebar is collapsed |
|
|
102
|
+
|
|
103
|
+
The root button also inherits all `ButtonProps` from the base `Button` component.
|
|
104
|
+
The tooltip text is used as the collapsed label and tooltip placement defaults to `right`.
|
|
105
|
+
|
|
106
|
+
### SideBar.Footer Props
|
|
107
|
+
|
|
108
|
+
This footer wrapper inherits `ComposeElementProps`.
|
|
109
|
+
|
|
110
|
+
### SideBar.Footer.MetaData Props
|
|
111
|
+
|
|
112
|
+
| Prop | Type | Default | Description |
|
|
113
|
+
|------|------|---------|-------------|
|
|
114
|
+
| children | `React.ReactNode` | *required* | Footer metadata content |
|
|
115
|
+
|
|
116
|
+
The metadata container also accepts standard `HTMLAttributes<HTMLDivElement>` except `children`.
|
|
117
|
+
|
|
118
|
+
### SideBar.Footer.Link Props
|
|
119
|
+
|
|
120
|
+
| Prop | Type | Default | Description |
|
|
121
|
+
|------|------|---------|-------------|
|
|
122
|
+
| children | `React.ReactNode` | *required* | Footer link text |
|
|
123
|
+
|
|
124
|
+
The link also accepts standard `AnchorHTMLAttributes<HTMLAnchorElement>` except `children`.
|
|
125
|
+
|
|
126
|
+
### SideBar.Footer.Text Props
|
|
127
|
+
|
|
128
|
+
| Prop | Type | Default | Description |
|
|
129
|
+
|------|------|---------|-------------|
|
|
130
|
+
| children | `React.ReactNode` | *required* | Footer text content |
|
|
131
|
+
|
|
132
|
+
This slot inherits `TypographyBodyProps` except `children` and renders a small body-text footer line.
|
|
133
|
+
|
|
134
|
+
## Examples
|
|
135
|
+
|
|
136
|
+
### Playground
|
|
137
|
+
|
|
138
|
+
```tsx
|
|
139
|
+
import { SideBar } from '@redislabsdev/redis-ui-components';
|
|
140
|
+
import { ShardIcon } from '@redislabsdev/redis-ui-icons';
|
|
141
|
+
import { RedisIcon } from '@redislabsdev/redis-ui-icons/multicolor';
|
|
142
|
+
import { useArgState } from '../../helpers/useArgState';
|
|
143
|
+
|
|
144
|
+
const [expanded, onToggle] = useArgState({ arg: true, getNewState: (arg) => !arg });
|
|
145
|
+
|
|
146
|
+
<SideBar isExpanded={expanded}>
|
|
147
|
+
<SideBar.Header onToggle={onToggle}>
|
|
148
|
+
<SideBar.SideBarLogo logoIcon={RedisIcon} />
|
|
149
|
+
</SideBar.Header>
|
|
150
|
+
<SideBar.Item tooltipProps={{ text: 'tooltip' }}>
|
|
151
|
+
<SideBar.Item.Icon icon={ShardIcon} />
|
|
152
|
+
<SideBar.Item.Text>Item Text</SideBar.Item.Text>
|
|
153
|
+
</SideBar.Item>
|
|
154
|
+
<SideBar.Divider fullWidth />
|
|
155
|
+
<SideBar.Footer>
|
|
156
|
+
<SideBar.Footer.MetaData>Footer</SideBar.Footer.MetaData>
|
|
157
|
+
</SideBar.Footer>
|
|
158
|
+
</SideBar>
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### ComplexBar
|
|
162
|
+
|
|
163
|
+
> Complex example of application sidebar with most of the features.
|
|
164
|
+
> For details on the use of parts, please refer to the relevant documents.
|
|
165
|
+
|
|
166
|
+
```tsx
|
|
167
|
+
import { SideBar } from '@redislabsdev/redis-ui-components';
|
|
168
|
+
import { PlusIcon } from '@redislabsdev/redis-ui-icons';
|
|
169
|
+
import { useState } from 'react';
|
|
170
|
+
import { RedisIcon } from '@redislabsdev/redis-ui-icons/multicolor';
|
|
171
|
+
import { items } from './SideBar.data';
|
|
172
|
+
|
|
173
|
+
const [expanded, setExpanded] = useState(true);
|
|
174
|
+
const [activeLink, setActiveLink] = useState(items.top[0].content);
|
|
175
|
+
|
|
176
|
+
<SideBar isExpanded={expanded} style={{ maxHeight: '55rem', height: 'calc(100vh - 2rem)' }}>
|
|
177
|
+
<SideBar.Header onToggle={() => setExpanded(!expanded)}>
|
|
178
|
+
<SideBar.SideBarLogo logoIcon={RedisIcon} />
|
|
179
|
+
</SideBar.Header>
|
|
180
|
+
<SideBar.ScrollContainer>
|
|
181
|
+
<SideBar.ItemsContainer>
|
|
182
|
+
{items.top.map((item) => (
|
|
183
|
+
<SideBar.Item
|
|
184
|
+
isActive={item.content === activeLink}
|
|
185
|
+
onClick={() => setActiveLink(item.content)}
|
|
186
|
+
key={item.content}
|
|
187
|
+
tooltipProps={{ text: item.content, placement: 'right' }}
|
|
188
|
+
>
|
|
189
|
+
<SideBar.Item.Icon icon={item.icon} />
|
|
190
|
+
<SideBar.Item.Text>{item.content}</SideBar.Item.Text>
|
|
191
|
+
{item.hasButton && (
|
|
192
|
+
<SideBar.Item.Button
|
|
193
|
+
icon={PlusIcon}
|
|
194
|
+
variant="primary"
|
|
195
|
+
onClick={(e) => {
|
|
196
|
+
e.stopPropagation();
|
|
197
|
+
}}
|
|
198
|
+
title="New database"
|
|
199
|
+
/>
|
|
200
|
+
)}
|
|
201
|
+
</SideBar.Item>
|
|
202
|
+
))}
|
|
203
|
+
|
|
204
|
+
<SideBar.Divider />
|
|
205
|
+
|
|
206
|
+
{items.middle.map((item) => (
|
|
207
|
+
<SideBar.Item
|
|
208
|
+
isActive={item.content === activeLink}
|
|
209
|
+
onClick={() => setActiveLink(item.content)}
|
|
210
|
+
key={item.content}
|
|
211
|
+
tooltipProps={{ text: item.content, placement: 'right' }}
|
|
212
|
+
>
|
|
213
|
+
<SideBar.Item.Icon icon={item.icon} />
|
|
214
|
+
<SideBar.Item.Text>{item.content}</SideBar.Item.Text>
|
|
215
|
+
</SideBar.Item>
|
|
216
|
+
))}
|
|
217
|
+
</SideBar.ItemsContainer>
|
|
218
|
+
<SideBar.Split />
|
|
219
|
+
<SideBar.Divider fullWidth />
|
|
220
|
+
<SideBar.ItemsContainer>
|
|
221
|
+
{items.bottom.map((item) => (
|
|
222
|
+
<SideBar.Item
|
|
223
|
+
isActive={item.content === activeLink}
|
|
224
|
+
onClick={() => {
|
|
225
|
+
setActiveLink(item.content);
|
|
226
|
+
}}
|
|
227
|
+
key={item.content}
|
|
228
|
+
tooltipProps={{ text: item.content, placement: 'right' }}
|
|
229
|
+
>
|
|
230
|
+
<SideBar.Item.Icon icon={item.icon} />
|
|
231
|
+
<SideBar.Item.Text>{item.content}</SideBar.Item.Text>
|
|
232
|
+
</SideBar.Item>
|
|
233
|
+
))}
|
|
234
|
+
</SideBar.ItemsContainer>
|
|
235
|
+
</SideBar.ScrollContainer>
|
|
236
|
+
<SideBar.Footer>
|
|
237
|
+
<SideBar.Divider fullWidth />
|
|
238
|
+
<SideBar.Footer.MetaData>
|
|
239
|
+
<div>
|
|
240
|
+
<SideBar.Footer.Link href="/" target="_blank">
|
|
241
|
+
Terms
|
|
242
|
+
</SideBar.Footer.Link>
|
|
243
|
+
{' | '}
|
|
244
|
+
<SideBar.Footer.Link>Privacy</SideBar.Footer.Link>
|
|
245
|
+
</div>
|
|
246
|
+
<SideBar.Footer.Text>© 2022 Redis</SideBar.Footer.Text>
|
|
247
|
+
</SideBar.Footer.MetaData>
|
|
248
|
+
</SideBar.Footer>
|
|
249
|
+
</SideBar>
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
### HeaderAndFooter
|
|
253
|
+
|
|
254
|
+
> `Header` includes toggle button and. Set `onToggle` handler to switch expanded state.
|
|
255
|
+
> Add `SideBar.SideBarLogo` icon to show it in the `Header`.
|
|
256
|
+
>
|
|
257
|
+
> `Footer` can have any custom content, but default is `Footer.MetaData` container
|
|
258
|
+
> with optional `Footer.Link` and `Footer.Text` inside. Metadata is hidden in collapsed state.
|
|
259
|
+
|
|
260
|
+
```tsx
|
|
261
|
+
import { SideBar } from '@redislabsdev/redis-ui-components';
|
|
262
|
+
import { useState } from 'react';
|
|
263
|
+
import { RedisIcon } from '@redislabsdev/redis-ui-icons/multicolor';
|
|
264
|
+
import { StoryHList } from '../../helpers/Story.style';
|
|
265
|
+
|
|
266
|
+
const [expanded, setExpanded] = useState(true);
|
|
267
|
+
|
|
268
|
+
const content = (
|
|
269
|
+
<>
|
|
270
|
+
<SideBar.Header onToggle={() => setExpanded((val) => !val)}>
|
|
271
|
+
<SideBar.SideBarLogo logoIcon={RedisIcon} />
|
|
272
|
+
</SideBar.Header>
|
|
273
|
+
<SideBar.Footer>
|
|
274
|
+
<SideBar.Footer.MetaData>
|
|
275
|
+
<SideBar.Footer.Link>SideBar.Footer.Link</SideBar.Footer.Link>
|
|
276
|
+
<SideBar.Footer.Text>SideBar.Footer.Text</SideBar.Footer.Text>
|
|
277
|
+
</SideBar.Footer.MetaData>
|
|
278
|
+
</SideBar.Footer>
|
|
279
|
+
</>
|
|
280
|
+
);
|
|
281
|
+
|
|
282
|
+
<StoryHList $gap="3rem">
|
|
283
|
+
<SideBar isExpanded={expanded}>{content}</SideBar>
|
|
284
|
+
<SideBar isExpanded={!expanded}>{content}</SideBar>
|
|
285
|
+
</StoryHList>
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
### ScrollContainer
|
|
289
|
+
|
|
290
|
+
> `ScrollContainer` allows to scroll necessary parts of the bar content,
|
|
291
|
+
> when not enough vertical space.
|
|
292
|
+
> Regularly that are items between `Header` and `Footer`.
|
|
293
|
+
> Sometimes user can also want to include `Footer` to scrolling.
|
|
294
|
+
>
|
|
295
|
+
> It worth to use only one `ScrollContainer` in the bar.
|
|
296
|
+
|
|
297
|
+
```tsx
|
|
298
|
+
import { SideBar } from '@redislabsdev/redis-ui-components';
|
|
299
|
+
import { StoryHList } from '../../helpers/Story.style';
|
|
300
|
+
import { items } from './SideBar.data';
|
|
301
|
+
|
|
302
|
+
const simpleItemRender = (item, i) => (
|
|
303
|
+
<SideBar.Item key={item.content} tooltipProps={{ text: item.content, placement: 'right' }} isActive={!i}>
|
|
304
|
+
<SideBar.Item.Icon icon={item.icon} />
|
|
305
|
+
<SideBar.Item.Text>{item.content}</SideBar.Item.Text>
|
|
306
|
+
</SideBar.Item>
|
|
307
|
+
);
|
|
308
|
+
|
|
309
|
+
<StoryHList $gap="3rem" $align="start">
|
|
310
|
+
<SideBar isExpanded style={{ height: '10rem' }}>
|
|
311
|
+
<SideBar.ScrollContainer>
|
|
312
|
+
<SideBar.ItemsContainer>{items.top.map(simpleItemRender)}</SideBar.ItemsContainer>
|
|
313
|
+
</SideBar.ScrollContainer>
|
|
314
|
+
</SideBar>
|
|
315
|
+
<SideBar isExpanded style={{ height: '30rem' }}>
|
|
316
|
+
<SideBar.ScrollContainer>
|
|
317
|
+
<SideBar.ItemsContainer>{items.top.map(simpleItemRender)}</SideBar.ItemsContainer>
|
|
318
|
+
</SideBar.ScrollContainer>
|
|
319
|
+
</SideBar>
|
|
320
|
+
</StoryHList>
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
### SplitAndItemsContainer
|
|
324
|
+
|
|
325
|
+
> When too much vertical space is in the bar and user want to align part of the bar to the bottom,
|
|
326
|
+
> then `Split` can be used.
|
|
327
|
+
> If more than one `Split` is used, then all spaces are distributed equally.
|
|
328
|
+
>
|
|
329
|
+
> `Split` can be used under `SideBar` or under `ScrollContainer` without mixing.
|
|
330
|
+
>
|
|
331
|
+
> `ItemsContainer` simplifies grouping items and other elements.
|
|
332
|
+
|
|
333
|
+
```tsx
|
|
334
|
+
import { SideBar } from '@redislabsdev/redis-ui-components';
|
|
335
|
+
import { StoryHList } from '../../helpers/Story.style';
|
|
336
|
+
import { items } from './SideBar.data';
|
|
337
|
+
|
|
338
|
+
const simpleItemRender = (item, i) => (
|
|
339
|
+
<SideBar.Item key={item.content} tooltipProps={{ text: item.content, placement: 'right' }} isActive={!i}>
|
|
340
|
+
<SideBar.Item.Icon icon={item.icon} />
|
|
341
|
+
<SideBar.Item.Text>{item.content}</SideBar.Item.Text>
|
|
342
|
+
</SideBar.Item>
|
|
343
|
+
);
|
|
344
|
+
|
|
345
|
+
<StoryHList $gap="3rem" $align="stretch" style={{ height: '40rem' }}>
|
|
346
|
+
<SideBar isExpanded>
|
|
347
|
+
<SideBar.ScrollContainer>
|
|
348
|
+
<SideBar.ItemsContainer>{items.top.map(simpleItemRender)}</SideBar.ItemsContainer>
|
|
349
|
+
<SideBar.Split />
|
|
350
|
+
<SideBar.ItemsContainer>{items.bottom.map(simpleItemRender)}</SideBar.ItemsContainer>
|
|
351
|
+
</SideBar.ScrollContainer>
|
|
352
|
+
</SideBar>
|
|
353
|
+
<SideBar isExpanded>
|
|
354
|
+
<SideBar.ItemsContainer>{items.top.slice(0, 2).map(simpleItemRender)}</SideBar.ItemsContainer>
|
|
355
|
+
<SideBar.Split />
|
|
356
|
+
<SideBar.ItemsContainer>{items.middle.map(simpleItemRender)}</SideBar.ItemsContainer>
|
|
357
|
+
<SideBar.Split />
|
|
358
|
+
<SideBar.ItemsContainer>{items.bottom.map(simpleItemRender)}</SideBar.ItemsContainer>
|
|
359
|
+
</SideBar>
|
|
360
|
+
<SideBar isExpanded>
|
|
361
|
+
<SideBar.ScrollContainer>
|
|
362
|
+
<SideBar.ItemsContainer>{items.top.map(simpleItemRender)}</SideBar.ItemsContainer>
|
|
363
|
+
<SideBar.ItemsContainer>{items.bottom.map(simpleItemRender)}</SideBar.ItemsContainer>
|
|
364
|
+
</SideBar.ScrollContainer>
|
|
365
|
+
</SideBar>
|
|
366
|
+
</StoryHList>
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
### Button
|
|
370
|
+
|
|
371
|
+
> Collapsible `Button` can be used instead of `Item`
|
|
372
|
+
|
|
373
|
+
```tsx
|
|
374
|
+
import { SideBar } from '@redislabsdev/redis-ui-components';
|
|
375
|
+
import { ShardIcon } from '@redislabsdev/redis-ui-icons';
|
|
376
|
+
import { StoryHList } from '../../helpers/Story.style';
|
|
377
|
+
|
|
378
|
+
const button = (
|
|
379
|
+
<SideBar.Button
|
|
380
|
+
tooltipProps={{ text: 'Tooltip text' }}
|
|
381
|
+
buttonExpandedContent="Button text"
|
|
382
|
+
buttonCollapsedIcon={ShardIcon}
|
|
383
|
+
/>
|
|
384
|
+
);
|
|
385
|
+
|
|
386
|
+
<StoryHList $gap="3rem">
|
|
387
|
+
<SideBar isExpanded>
|
|
388
|
+
<SideBar.Divider fullWidth />
|
|
389
|
+
{button}
|
|
390
|
+
<SideBar.Divider fullWidth />
|
|
391
|
+
</SideBar>
|
|
392
|
+
<SideBar isExpanded={false}>
|
|
393
|
+
<SideBar.Divider fullWidth />
|
|
394
|
+
{button}
|
|
395
|
+
<SideBar.Divider fullWidth />
|
|
396
|
+
</SideBar>
|
|
397
|
+
</StoryHList>
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
### Divider
|
|
401
|
+
|
|
402
|
+
> Collapsible `Divider` can have vertical margins and take full width
|
|
403
|
+
|
|
404
|
+
```tsx
|
|
405
|
+
import { SideBar } from '@redislabsdev/redis-ui-components';
|
|
406
|
+
import { StoryHList } from '../../helpers/Story.style';
|
|
407
|
+
|
|
408
|
+
const content = (
|
|
409
|
+
<>
|
|
410
|
+
<SideBar.Item tooltipProps={{}}>
|
|
411
|
+
<SideBar.Item.Text>No vertical margins:</SideBar.Item.Text>
|
|
412
|
+
</SideBar.Item>
|
|
413
|
+
<SideBar.Divider noMargin />
|
|
414
|
+
<SideBar.Item tooltipProps={{}}>
|
|
415
|
+
<SideBar.Item.Text>Side padding (default):</SideBar.Item.Text>
|
|
416
|
+
</SideBar.Item>
|
|
417
|
+
<SideBar.Divider />
|
|
418
|
+
<SideBar.Item tooltipProps={{}}>
|
|
419
|
+
<SideBar.Item.Text>Full width:</SideBar.Item.Text>
|
|
420
|
+
</SideBar.Item>
|
|
421
|
+
<SideBar.Divider fullWidth />
|
|
422
|
+
<SideBar.Item tooltipProps={{}}>
|
|
423
|
+
<SideBar.Item.Text>Full width if expanded:</SideBar.Item.Text>
|
|
424
|
+
</SideBar.Item>
|
|
425
|
+
<SideBar.Divider fullWidthWhenExpanded />
|
|
426
|
+
</>
|
|
427
|
+
);
|
|
428
|
+
|
|
429
|
+
<StoryHList $gap="3rem">
|
|
430
|
+
<SideBar isExpanded>{content}</SideBar>
|
|
431
|
+
<SideBar isExpanded={false}>{content}</SideBar>
|
|
432
|
+
</StoryHList>
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
### Item Playground
|
|
436
|
+
|
|
437
|
+
```tsx
|
|
438
|
+
import { SideBar } from '@redislabsdev/redis-ui-components';
|
|
439
|
+
import { PlusIcon, ShardIcon } from '@redislabsdev/redis-ui-icons';
|
|
440
|
+
import { useState } from 'react';
|
|
441
|
+
|
|
442
|
+
const [expanded, setExpanded] = useState(true);
|
|
443
|
+
|
|
444
|
+
<SideBar isExpanded={expanded}>
|
|
445
|
+
<SideBar.Header onToggle={() => setExpanded((val) => !val)} />
|
|
446
|
+
<SideBar.Item tooltipProps={{ text: 'tooltip', placement: 'right' }} isActive={false}>
|
|
447
|
+
<SideBar.Item.Icon icon={ShardIcon} />
|
|
448
|
+
<SideBar.Item.Text>Item text</SideBar.Item.Text>
|
|
449
|
+
<SideBar.Item.Button
|
|
450
|
+
icon={PlusIcon}
|
|
451
|
+
onClick={(e) => e.stopPropagation()}
|
|
452
|
+
title="Plus button"
|
|
453
|
+
/>
|
|
454
|
+
</SideBar.Item>
|
|
455
|
+
</SideBar>
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
## Notes
|
|
459
|
+
|
|
460
|
+
- `SideBar` is a collapsible navigation shell with a fixed header/footer layout and grouped content in the middle.
|
|
461
|
+
- `SideBar.Header` needs an `onToggle` handler and should usually render `SideBar.SideBarLogo` inside it.
|
|
462
|
+
- `SideBar.Footer` is typically used with `Footer.MetaData`; that metadata area is hidden when the sidebar is collapsed.
|
|
463
|
+
- `SideBar.ScrollContainer` is intended for the middle content when vertical space is constrained, and the docs recommend using only one per sidebar.
|
|
464
|
+
- `SideBar.Split` can be used either directly under `SideBar` or under `SideBar.ScrollContainer`, but the two patterns should not be mixed.
|
|
465
|
+
- `SideBar.Divider` supports `noMargin`, `fullWidth`, and `fullWidthWhenExpanded` for layout tuning.
|
|
466
|
+
- `SideBar.Item` wraps collapsed items in a tooltip and exposes `Item.Icon`, `Item.Text`, and `Item.Button` for composition.
|
|
467
|
+
- `SideBar.Item.Button` only renders while the sidebar is expanded and defaults its size to `M`.
|
|
468
|
+
- `SideBar.Button` is the root collapsible action button, and it defaults to `PlusIcon` when no collapsed icon is provided.
|