@superdispatch/ui-lab 0.19.0 → 0.20.2

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-src/index.js CHANGED
@@ -17,7 +17,9 @@ export * from "./navbar/NavbarItem.js";
17
17
  export * from "./navbar/NavbarList.js";
18
18
  export * from "./navbar/NavbarMenu.js";
19
19
  export * from "./sidebar/Sidebar.js";
20
+ export * from "./sidebar/SidebarBackButton.js";
20
21
  export * from "./sidebar/SidebarContainer.js";
22
+ export * from "./sidebar/SidebarContent.js";
21
23
  export * from "./sidebar/SidebarDivider.js";
22
24
  export * from "./sidebar/SidebarMenuItem.js";
23
25
  export * from "./sidebar/SidebarMenuItemAction.js";
@@ -20,12 +20,12 @@ var NavbarAccordionRoot = /*#__PURE__*/styled(Accordion).withConfig({
20
20
  var {
21
21
  gutter
22
22
  } = _ref;
23
- return css(["width:100%;color:#c2c4c9;font-size:14px;font-weight:400;line-height:20px;text-decoration:none;outline:none;cursor:pointer;background-color:#1b2638;margin-top:", ";&:hover,&[aria-current]{background-color:#2f394a;color:", ";}&.MuiAccordion-root:before{background-color:#1b2638;}&.MuiPaper-elevation0{border:0px;}&&.MuiAccordionSummary-root.Mui-expanded{margin-top:", ";max-height:40px;min-height:40px;}"], gutter ? '16px' : '0', Color.White, gutter ? '16px' : '0');
23
+ return css(["width:100%;color:#c2c4c9;font-size:14px;font-weight:400;line-height:20px;text-decoration:none;outline:none;cursor:pointer;background-color:#1b2638;margin-top:", ";&[aria-current]{background-color:#2f394a;color:", ";}&.MuiAccordion-root:before{background-color:#1b2638;}&.MuiPaper-elevation0{border:0px;}&.MuiAccordion-root.Mui-expanded{margin-top:", ";}"], gutter ? '16px' : '0', Color.White, gutter ? '16px' : '0');
24
24
  });
25
25
  var NavbarAccordionSummary = /*#__PURE__*/styled(AccordionSummary).withConfig({
26
26
  displayName: "NavbarAccordion__NavbarAccordionSummary",
27
27
  componentId: "SD__sc-1s7g3kw-2"
28
- })(["border-left:4px solid transparent;padding-left:20px;&.MuiAccordionSummary-root{max-height:40px;min-height:40px;}&:hover,&[data-active='true']{border-left-color:", ";}&[data-expanded='false']{.MuiAccordionSummary-expandIcon{display:none;}}"], Color.Blue300);
28
+ })(["border-left:4px solid transparent;padding-left:20px;&.MuiAccordionSummary-root{max-height:40px;min-height:40px;}&:hover,&[data-active='true']{background-color:#2f394a;border-left-color:", ";}&[data-expanded='false']{.MuiAccordionSummary-expandIcon{display:none;}}"], Color.Blue300);
29
29
  var IconWrapper = /*#__PURE__*/styled.div.withConfig({
30
30
  displayName: "NavbarAccordion__IconWrapper",
31
31
  componentId: "SD__sc-1s7g3kw-3"
@@ -13,7 +13,7 @@ export var NavbarLabel = /*#__PURE__*/styled.span.withConfig({
13
13
  var NavbarItemRoot = /*#__PURE__*/styled.div.withConfig({
14
14
  displayName: "NavbarItem__NavbarItemRoot",
15
15
  componentId: "SD__sc-1pvzq3w-2"
16
- })(["width:100%;display:flex;align-items:center;color:#c2c4c9;font-size:14px;font-weight:400;line-height:20px;text-decoration:none;outline:none;cursor:pointer;padding:8px 16px;border-left:4px solid transparent;&:hover,&[aria-current]{background-color:#2f394a;color:", ";border-left-color:", ";}&[data-active='true']{border-left-color:", ";}"], Color.White, Color.Blue300, Color.Blue300);
16
+ })(["width:100%;display:flex;align-items:center;color:#c2c4c9;font-size:14px;font-weight:400;line-height:20px;text-decoration:none;outline:none;cursor:pointer;padding:8px 16px;border-left:4px solid transparent;&:hover,&[aria-current]{background-color:#2f394a;color:", ";border-left-color:", ";}&[data-active='true']{background-color:#2f394a;border-left-color:", ";}"], Color.White, Color.Blue300, Color.Blue300);
17
17
  var IconWrapper = /*#__PURE__*/styled.div.withConfig({
18
18
  displayName: "NavbarItem__IconWrapper",
19
19
  componentId: "SD__sc-1pvzq3w-3"
@@ -7,7 +7,7 @@ import { jsxs as _jsxs } from "react/jsx-runtime";
7
7
  var SidebarRoot = /*#__PURE__*/styled.aside.withConfig({
8
8
  displayName: "Sidebar__SidebarRoot",
9
9
  componentId: "SD__sc-b77o22-0"
10
- })(["top:0;position:sticky;overflow-y:auto;overflow-x:hidden;width:240px;height:100vh;background-color:", ";border-right:1px solid ", ";"], Color.White, Color.Silver400);
10
+ })(["top:0;position:sticky;overflow-y:auto;overflow-x:hidden;height:100vh;background-color:", ";border-right:1px solid ", ";"], Color.White, Color.Silver400);
11
11
  var SidebarHeader = /*#__PURE__*/styled.div.withConfig({
12
12
  displayName: "Sidebar__SidebarHeader",
13
13
  componentId: "SD__sc-b77o22-1"
@@ -0,0 +1,38 @@
1
+ import _objectSpread from "@babel/runtime/helpers/objectSpread2";
2
+ import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
3
+ var _excluded = ["onClick", "children"];
4
+ import { IconButton } from '@material-ui/core';
5
+ import { ArrowBack } from '@material-ui/icons';
6
+ import { useCollapseBreakpoint } from '@superdispatch/ui';
7
+ import { useSidebarContext } from "./SidebarContainer.js";
8
+ import { jsx as _jsx } from "react/jsx-runtime";
9
+ export function SidebarBackButton(_ref) {
10
+ var {
11
+ onClick: _onClick,
12
+ children = /*#__PURE__*/_jsx(ArrowBack, {
13
+ fontSize: "small"
14
+ })
15
+ } = _ref,
16
+ props = _objectWithoutProperties(_ref, _excluded);
17
+
18
+ var isCollapsed = useCollapseBreakpoint('sm');
19
+ var {
20
+ openSidebar
21
+ } = useSidebarContext();
22
+
23
+ if (!isCollapsed) {
24
+ return null;
25
+ }
26
+
27
+ return /*#__PURE__*/_jsx(IconButton, _objectSpread(_objectSpread({}, props), {}, {
28
+ size: "small",
29
+ onClick: event => {
30
+ _onClick === null || _onClick === void 0 ? void 0 : _onClick(event);
31
+
32
+ if (!event.isDefaultPrevented()) {
33
+ openSidebar();
34
+ }
35
+ },
36
+ children: children
37
+ }));
38
+ }
@@ -1,25 +1,59 @@
1
- import { forwardRef } from 'react';
1
+ import { useCollapseBreakpoint } from '@superdispatch/ui';
2
+ import { createContext, forwardRef, useContext, useMemo, useState } from 'react';
2
3
  import styled from 'styled-components';
3
4
  import { jsx as _jsx } from "react/jsx-runtime";
4
5
  import { jsxs as _jsxs } from "react/jsx-runtime";
5
- var SidebarContainerRoot = /*#__PURE__*/styled.div.withConfig({
6
- displayName: "SidebarContainer__SidebarContainerRoot",
6
+ var Context = /*#__PURE__*/createContext(null);
7
+ export function useSidebarContext() {
8
+ var context = useContext(Context);
9
+
10
+ if (!context) {
11
+ throw new Error('SidebarContext is used outside Provider');
12
+ }
13
+
14
+ return context;
15
+ }
16
+ var SidebarContainerSidebar = /*#__PURE__*/styled.div.withConfig({
17
+ displayName: "SidebarContainer__SidebarContainerSidebar",
7
18
  componentId: "SD__sc-uibj1m-0"
8
- })(["display:flex;height:inherit;max-height:inherit;min-height:inherit;"]);
19
+ })(["height:inherit;max-height:inherit;min-height:inherit;width:240px;"]);
9
20
  var SidebarContainerContent = /*#__PURE__*/styled.div.withConfig({
10
21
  displayName: "SidebarContainer__SidebarContainerContent",
11
22
  componentId: "SD__sc-uibj1m-1"
12
- })(["height:inherit;max-height:inherit;min-height:inherit;width:calc(100% - 240px);min-width:calc(100% - 240px);max-width:calc(100% - 240px);"]);
23
+ })(["height:inherit;max-height:inherit;min-height:inherit;"]);
24
+ var SidebarContainerRoot = /*#__PURE__*/styled.div.withConfig({
25
+ displayName: "SidebarContainer__SidebarContainerRoot",
26
+ componentId: "SD__sc-uibj1m-2"
27
+ })(["display:flex;height:inherit;max-height:inherit;min-height:inherit;& ", "{width:calc(100% - 240px);min-width:calc(100% - 240px);max-width:calc(100% - 240px);}&[data-visibility='sidebar'] ", "{width:100%;}&[data-visibility='sidebar'] ", "{display:none;}&[data-visibility='content'] ", "{display:none;}&[data-visibility='content'] ", "{width:100%;max-width:unset;}"], SidebarContainerContent, SidebarContainerSidebar, SidebarContainerContent, SidebarContainerSidebar, SidebarContainerContent);
13
28
  export var SidebarContainer = /*#__PURE__*/forwardRef((_ref, ref) => {
14
29
  var {
15
30
  sidebar,
16
31
  children
17
32
  } = _ref;
18
- return /*#__PURE__*/_jsxs(SidebarContainerRoot, {
19
- ref: ref,
20
- children: [sidebar, /*#__PURE__*/_jsx(SidebarContainerContent, {
21
- children: children
22
- })]
33
+ var isCollapsed = useCollapseBreakpoint('sm');
34
+ var [visibilityState, setVisibilityState] = useState('sidebar');
35
+ var visibility = isCollapsed ? visibilityState : 'both';
36
+ var context = useMemo(() => {
37
+ return {
38
+ openSidebar: () => {
39
+ setVisibilityState('sidebar');
40
+ },
41
+ openSidebarContent: () => {
42
+ setVisibilityState('content');
43
+ }
44
+ };
45
+ }, []);
46
+ return /*#__PURE__*/_jsx(Context.Provider, {
47
+ value: context,
48
+ children: /*#__PURE__*/_jsxs(SidebarContainerRoot, {
49
+ ref: ref,
50
+ "data-visibility": visibility,
51
+ children: [/*#__PURE__*/_jsx(SidebarContainerSidebar, {
52
+ children: sidebar
53
+ }), /*#__PURE__*/_jsx(SidebarContainerContent, {
54
+ children: children
55
+ })]
56
+ })
23
57
  });
24
58
  });
25
59
  if (process.env.NODE_ENV !== "production") SidebarContainer.displayName = "SidebarContainer";
@@ -0,0 +1,103 @@
1
+ import { AppBar, Toolbar } from '@material-ui/core';
2
+ import { Column, Columns, Stack } from '@superdispatch/ui';
3
+ import { useLayoutEffect, useRef } from 'react';
4
+ import styled, { css } from 'styled-components';
5
+ import { Box } from "../box/Box.js";
6
+ import { TextBox } from "../text-box/TextBox.js";
7
+ import { SidebarBackButton } from "./SidebarBackButton.js";
8
+ import { useSidebarContext } from "./SidebarContainer.js";
9
+ import { jsx as _jsx } from "react/jsx-runtime";
10
+ import { jsxs as _jsxs } from "react/jsx-runtime";
11
+ var SidebarAppBar = /*#__PURE__*/styled(AppBar).withConfig({
12
+ displayName: "SidebarContent__SidebarAppBar",
13
+ componentId: "SD__sc-zpgf61-0"
14
+ })(_ref => {
15
+ var {
16
+ theme
17
+ } = _ref;
18
+ return css(["", "{&&{border-left:transparent;}}"], theme.breakpoints.up('sm'));
19
+ });
20
+ var ToolbarContent = /*#__PURE__*/styled.div.withConfig({
21
+ displayName: "SidebarContent__ToolbarContent",
22
+ componentId: "SD__sc-zpgf61-1"
23
+ })(["flex:1;padding:16px;"]);
24
+ export function SidebarContent(_ref2) {
25
+ var {
26
+ dense,
27
+ action,
28
+ title,
29
+ children,
30
+ onBack,
31
+ openOnMount,
32
+ closeOnUnmount
33
+ } = _ref2;
34
+ var isOpenedOnMount = useRef(false);
35
+ var isClosedOnMount = useRef(false);
36
+ var {
37
+ openSidebarContent,
38
+ openSidebar
39
+ } = useSidebarContext();
40
+ useLayoutEffect(() => {
41
+ if (openOnMount) {
42
+ if (isOpenedOnMount.current) {
43
+ // eslint-disable-next-line no-console
44
+ console.warn('[SidebarContent]: "openOnMount" should not change during lifecycle of the component.');
45
+ } else {
46
+ isOpenedOnMount.current = true;
47
+ openSidebarContent();
48
+ }
49
+ }
50
+ }, [openOnMount, openSidebarContent]);
51
+ useLayoutEffect(() => {
52
+ return () => {
53
+ if (closeOnUnmount) {
54
+ if (isClosedOnMount.current) {
55
+ // eslint-disable-next-line no-console
56
+ console.warn('[SidebarContent]: "closeOnUnmount" should not change during lifecycle of the component.');
57
+ } else {
58
+ isClosedOnMount.current = true;
59
+ openSidebar();
60
+ }
61
+ }
62
+ };
63
+ }, [openSidebar, closeOnUnmount]);
64
+ return /*#__PURE__*/_jsxs(Stack, {
65
+ space: "none",
66
+ children: [/*#__PURE__*/_jsx(SidebarAppBar, {
67
+ children: /*#__PURE__*/_jsx(Toolbar, {
68
+ disableGutters: true,
69
+ children: /*#__PURE__*/_jsx(ToolbarContent, {
70
+ children: /*#__PURE__*/_jsxs(Columns, {
71
+ align: ['top', 'center'],
72
+ space: "small",
73
+ children: [/*#__PURE__*/_jsx(Column, {
74
+ width: "content",
75
+ children: /*#__PURE__*/_jsx(SidebarBackButton, {
76
+ onClick: onBack
77
+ })
78
+ }), /*#__PURE__*/_jsx(Column, {
79
+ children: /*#__PURE__*/_jsxs(Columns, {
80
+ space: "small",
81
+ collapseBelow: "tablet",
82
+ reverse: [true, false],
83
+ align: ['bottom', 'center'],
84
+ children: [/*#__PURE__*/_jsx(Column, {
85
+ children: /*#__PURE__*/_jsx(TextBox, {
86
+ variant: "heading-2",
87
+ children: title
88
+ })
89
+ }), action && /*#__PURE__*/_jsx(Column, {
90
+ width: "content",
91
+ children: action
92
+ })]
93
+ })
94
+ })]
95
+ })
96
+ })
97
+ })
98
+ }), /*#__PURE__*/_jsx(Box, {
99
+ padding: dense ? 'none' : ['small', 'medium'],
100
+ children: children
101
+ })]
102
+ });
103
+ }
@@ -1,9 +1,10 @@
1
1
  import { ButtonBase } from '@material-ui/core';
2
2
  import { OpenInNew } from '@material-ui/icons';
3
- import { Color, Column, Columns, Inline } from '@superdispatch/ui';
3
+ import { Color, Column, Columns, Inline, mergeRefs } from '@superdispatch/ui';
4
4
  import { forwardRef, useLayoutEffect, useRef, useState } from 'react';
5
5
  import styled, { css } from 'styled-components';
6
6
  import { TextBox } from "../text-box/TextBox.js";
7
+ import { useSidebarContext } from "./SidebarContainer.js";
7
8
  import { SidebarMenuItemContextProvider } from "./SidebarMenuItemContext.js";
8
9
  import { jsx as _jsx } from "react/jsx-runtime";
9
10
  import { jsxs as _jsxs } from "react/jsx-runtime";
@@ -29,36 +30,60 @@ export var SidebarMenuItem = /*#__PURE__*/forwardRef((_ref2, ref) => {
29
30
  var {
30
31
  action,
31
32
  avatar,
32
- onClick,
33
+ onClick: _onClick,
33
34
  external,
34
35
  children,
35
36
  disabled,
36
37
  selected,
37
38
  secondaryActions,
38
- badge: badgeProp
39
+ badge: badgeProp,
40
+ openContentOnClick
39
41
  } = _ref2;
40
42
  var [hovered, setHovered] = useState(false);
43
+ var rootRef = useRef(null);
41
44
  var actionsRef = useRef(null);
42
45
  var actionsPlaceholderRef = useRef(null);
46
+ var {
47
+ openSidebarContent
48
+ } = useSidebarContext();
49
+ var {
50
+ matches: isHoverSupported
51
+ } = matchMedia('(hover: hover)');
43
52
  useLayoutEffect(() => {
44
53
  if (actionsRef.current && actionsPlaceholderRef.current) {
45
54
  actionsPlaceholderRef.current.style.width = "".concat(Math.max(0, actionsRef.current.offsetWidth - 8), "px");
46
55
  }
47
56
  });
57
+ useLayoutEffect(() => {
58
+ var rootNode = rootRef.current;
59
+
60
+ if (rootNode) {
61
+ if (isHoverSupported) {
62
+ rootNode.addEventListener('mouseenter', () => {
63
+ setHovered(true);
64
+ });
65
+ rootNode.addEventListener('mouseleave', () => {
66
+ setHovered(false);
67
+ });
68
+ } else {
69
+ setHovered(true);
70
+ }
71
+ }
72
+ }, [isHoverSupported]);
48
73
  var badge = !badgeProp || !Number.isFinite(badgeProp) ? null : badgeProp > 999 ? '999+' : badgeProp;
49
74
  return /*#__PURE__*/_jsxs(SidebarMenuItemRoot, {
50
- ref: ref,
75
+ ref: mergeRefs(ref, rootRef),
51
76
  hasAvatar: !!avatar,
52
- onMouseEnter: () => {
53
- setHovered(true);
54
- },
55
- onMouseLeave: () => {
56
- setHovered(false);
57
- },
58
77
  children: [/*#__PURE__*/_jsx(ButtonBase, {
59
- onClick: onClick,
60
78
  disabled: disabled,
61
79
  "aria-current": selected,
80
+ onClick: event => {
81
+ _onClick === null || _onClick === void 0 ? void 0 : _onClick(event);
82
+
83
+ if (!event.isDefaultPrevented() && openContentOnClick) {
84
+ openSidebarContent();
85
+ }
86
+ },
62
87
  children: /*#__PURE__*/_jsxs(Columns, {
63
88
  align: "center",
64
89
  space: "xsmall",
@@ -35,6 +35,7 @@ export var SidebarMenuItemAvatar = /*#__PURE__*/forwardRef((_ref, ref) => {
35
35
  color: "primary",
36
36
  checked: value,
37
37
  disabled: disabled,
38
+ onClick: stopPropagation,
38
39
  onMouseDown: stopPropagation,
39
40
  onTouchStart: stopPropagation,
40
41
  onChange: (_, checked) => {
@@ -4,7 +4,7 @@ import { CSSTransition } from 'react-transition-group';
4
4
  import { CSSTransitionProps } from 'react-transition-group/CSSTransition';
5
5
  import { SpaceProp, NegativeSpaceProp, ResponsiveProp, ColorProp } from '@superdispatch/ui';
6
6
  import { Property } from 'csstype';
7
- import { ButtonBaseProps, AvatarProps, TooltipProps } from '@material-ui/core';
7
+ import { ButtonBaseProps, AvatarProps, IconButtonProps, TooltipProps } from '@material-ui/core';
8
8
  import { FileRejection } from 'react-dropzone';
9
9
  import { StyledComponent, DefaultTheme } from 'styled-components';
10
10
 
@@ -289,12 +289,30 @@ interface SidebarProps {
289
289
  }
290
290
  declare const Sidebar: ForwardRefExoticComponent<SidebarProps & RefAttributes<HTMLDivElement>>;
291
291
 
292
+ declare function SidebarBackButton({ onClick, children, ...props }: IconButtonProps): ReactElement | null;
293
+
294
+ interface SidebarContext {
295
+ openSidebar: () => void;
296
+ openSidebarContent: () => void;
297
+ }
298
+ declare function useSidebarContext(): SidebarContext;
292
299
  interface SidebarContainerProps {
293
300
  sidebar: ReactChild;
294
301
  children?: ReactNode;
295
302
  }
296
303
  declare const SidebarContainer: ForwardRefExoticComponent<SidebarContainerProps & RefAttributes<HTMLDivElement>>;
297
304
 
305
+ interface SidebarContentProps {
306
+ dense?: boolean;
307
+ title: ReactNode;
308
+ children: ReactNode;
309
+ action?: ReactNode;
310
+ openOnMount?: boolean;
311
+ closeOnUnmount?: boolean;
312
+ onBack?: (event: MouseEvent<HTMLButtonElement>) => void;
313
+ }
314
+ declare function SidebarContent({ dense, action, title, children, onBack, openOnMount, closeOnUnmount, }: SidebarContentProps): ReactElement;
315
+
298
316
 
299
317
  declare const SidebarDivider: ForwardRefExoticComponent<RefAttributes<HTMLDivElement>>;
300
318
 
@@ -307,6 +325,7 @@ interface SidebarMenuItemProps {
307
325
  action?: ReactNode;
308
326
  avatar?: ReactNode;
309
327
  children?: ReactNode;
328
+ openContentOnClick?: boolean;
310
329
  secondaryActions?: ReactNode;
311
330
  }
312
331
  declare const SidebarMenuItem: ForwardRefExoticComponent<SidebarMenuItemProps & RefAttributes<HTMLDivElement>>;
@@ -351,4 +370,4 @@ interface TextBoxProps {
351
370
  }
352
371
  declare const TextBox: ForwardRefExoticComponent<TextBoxProps & RefAttributes<HTMLElement>>;
353
372
 
354
- export { Alert, AlertProps, AlertSeverityProp, AnchorButton, AnchorButtonProps, Banner, BorderRadiusProp, BorderWidthProp, Box, BoxProps, Button, ButtonArea, ButtonAreaProps, ButtonProps, ButtonSizeProp, ButtonVariantProp, Container, ContainerProps, DescriptionItem, DescriptionItemProps, FileDropZone, FileDropZoneProps, FileListItem, FileListItemProps, LinkComponentProps, LinkedText, LinkedTextProps, MarginProp, MultilineText, MultilineTextProps, Navbar, NavbarAccordionOptions, NavbarAvatar, NavbarBadge, NavbarBottomBar, NavbarBottomBarItem, NavbarItem, NavbarItemOptions, NavbarItemProps, NavbarLabel, NavbarList, NavbarMenu, NavbarMenuItem, NavbarMenuItemOption, Sidebar, SidebarContainer, SidebarContainerProps, SidebarDivider, SidebarMenuItem, SidebarMenuItemAction, SidebarMenuItemActionProps, SidebarMenuItemAvatar, SidebarMenuItemAvatarProps, SidebarMenuItemProps, SidebarProps, SidebarSubheader, SidebarSubheaderProps, TextAlignProp, TextBox, TextBoxProps, TextColorProp, TextDisplayProp, TextVariantProp, formatBytes, toBytes, useNavbarContext };
373
+ export { Alert, AlertProps, AlertSeverityProp, AnchorButton, AnchorButtonProps, Banner, BorderRadiusProp, BorderWidthProp, Box, BoxProps, Button, ButtonArea, ButtonAreaProps, ButtonProps, ButtonSizeProp, ButtonVariantProp, Container, ContainerProps, DescriptionItem, DescriptionItemProps, FileDropZone, FileDropZoneProps, FileListItem, FileListItemProps, LinkComponentProps, LinkedText, LinkedTextProps, MarginProp, MultilineText, MultilineTextProps, Navbar, NavbarAccordionOptions, NavbarAvatar, NavbarBadge, NavbarBottomBar, NavbarBottomBarItem, NavbarItem, NavbarItemOptions, NavbarItemProps, NavbarLabel, NavbarList, NavbarMenu, NavbarMenuItem, NavbarMenuItemOption, Sidebar, SidebarBackButton, SidebarContainer, SidebarContainerProps, SidebarContent, SidebarContentProps, SidebarDivider, SidebarMenuItem, SidebarMenuItemAction, SidebarMenuItemActionProps, SidebarMenuItemAvatar, SidebarMenuItemAvatarProps, SidebarMenuItemProps, SidebarProps, SidebarSubheader, SidebarSubheaderProps, TextAlignProp, TextBox, TextBoxProps, TextColorProp, TextDisplayProp, TextVariantProp, formatBytes, toBytes, useNavbarContext, useSidebarContext };