@redocly/theme 0.9.12 → 0.9.14

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.
Files changed (38) hide show
  1. package/lib/Markdown/MarkdownWrapper.js +7 -7
  2. package/lib/Sidebar/FooterWrapper.d.ts +2 -2
  3. package/lib/Sidebar/FooterWrapper.js +6 -3
  4. package/lib/Sidebar/SidebarLayout.d.ts +6 -3
  5. package/lib/Sidebar/SidebarLayout.js +55 -7
  6. package/lib/Sidebar/index.d.ts +1 -0
  7. package/lib/Sidebar/index.js +1 -0
  8. package/lib/SidebarActions/ChangeViewButton.d.ts +8 -0
  9. package/lib/SidebarActions/ChangeViewButton.js +14 -0
  10. package/lib/SidebarActions/CollapseSidebarButton.d.ts +7 -0
  11. package/lib/SidebarActions/CollapseSidebarButton.js +13 -0
  12. package/lib/SidebarActions/SidebarActions.d.ts +20 -0
  13. package/lib/SidebarActions/SidebarActions.js +26 -0
  14. package/lib/SidebarActions/ToggleRightPanelButton.d.ts +7 -0
  15. package/lib/SidebarActions/ToggleRightPanelButton.js +13 -0
  16. package/lib/SidebarActions/index.d.ts +1 -0
  17. package/lib/SidebarActions/index.js +7 -0
  18. package/lib/SidebarActions/styled.d.ts +17 -0
  19. package/lib/SidebarActions/styled.js +124 -0
  20. package/lib/config.d.ts +774 -1814
  21. package/lib/config.js +271 -213
  22. package/lib/globalStyle.js +1 -2
  23. package/lib/index.d.ts +1 -0
  24. package/lib/index.js +1 -0
  25. package/package.json +6 -7
  26. package/src/Markdown/MarkdownWrapper.tsx +1 -1
  27. package/src/Sidebar/FooterWrapper.tsx +7 -4
  28. package/src/Sidebar/SidebarLayout.tsx +66 -18
  29. package/src/Sidebar/index.ts +1 -0
  30. package/src/SidebarActions/ChangeViewButton.tsx +20 -0
  31. package/src/SidebarActions/CollapseSidebarButton.tsx +21 -0
  32. package/src/SidebarActions/SidebarActions.tsx +64 -0
  33. package/src/SidebarActions/ToggleRightPanelButton.tsx +21 -0
  34. package/src/SidebarActions/index.tsx +1 -0
  35. package/src/SidebarActions/styled.tsx +157 -0
  36. package/src/config.ts +334 -222
  37. package/src/globalStyle.ts +1 -2
  38. package/src/index.ts +1 -0
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React, { useEffect } from 'react';
2
2
  import styled from 'styled-components';
3
3
 
4
4
  import { Sidebar } from '@theme/Sidebar/Sidebar';
@@ -13,26 +13,49 @@ import { useThemeConfig } from '@theme/hooks/useThemeConfig';
13
13
  import { MobileSidebarIcon } from './MobileSidebarIcon';
14
14
 
15
15
  interface SidebarLayoutProps {
16
- versions: React.ReactNode;
17
- menu: React.ReactNode;
16
+ versions?: React.ReactNode;
17
+ menu?: React.ReactNode;
18
18
  backLink?: {
19
19
  label: string;
20
20
  slug: string;
21
21
  };
22
22
  footer?: React.ReactNode;
23
+ actions?: React.ReactNode;
23
24
  header?: React.ReactNode;
24
25
  growContent?: boolean;
26
+ collapsed?: boolean;
27
+ onToggleMenu?: (isOpen: boolean) => void;
25
28
  }
26
29
 
30
+ const StyledFooterWrapper = styled(FooterWrapper)`
31
+ display: none;
32
+
33
+ ${({ theme }) => theme.mediaQueries?.medium} {
34
+ display: flex;
35
+ }
36
+ `;
37
+
27
38
  export function SidebarLayout({
28
39
  versions,
29
40
  menu,
30
41
  footer,
31
42
  header,
32
43
  growContent,
44
+ collapsed,
45
+ onToggleMenu,
33
46
  }: SidebarLayoutProps): JSX.Element | null {
34
47
  const [isOpen, setIsOpen] = useMobileMenu();
35
- const toggleMenu = () => setIsOpen(!isOpen);
48
+ const [mappedCollapsed, setMappedCollapsed] = React.useState(collapsed);
49
+
50
+ useEffect(() => {
51
+ setMappedCollapsed(collapsed && !isOpen);
52
+ }, [isOpen, collapsed, setMappedCollapsed]);
53
+
54
+ const toggleMenu = () => {
55
+ onToggleMenu?.(!isOpen);
56
+ setIsOpen(!isOpen);
57
+ };
58
+
36
59
  const { search, sidebar } = useThemeConfig();
37
60
 
38
61
  if (sidebar?.hide) {
@@ -40,20 +63,45 @@ export function SidebarLayout({
40
63
  }
41
64
 
42
65
  return (
43
- <Wrapper data-component-name="Sidebar/SidebarLayout">
44
- <MobileSidebarButton opened={isOpen} onClick={toggleMenu}>
45
- <MobileSidebarIcon />
46
- </MobileSidebarButton>
47
-
48
- {!search?.hide && search?.placement === 'sidebar' ? <SidebarSearch /> : null}
49
- <Sidebar animate={true} opened={isOpen}>
50
- {header ? <HeaderWrapper>{header}</HeaderWrapper> : null}
51
- {versions}
52
- <MenuContainer growContent={growContent}>{menu}</MenuContainer>
53
- {footer ? <FooterWrapper>{footer}</FooterWrapper> : null}
54
- </Sidebar>
55
- </Wrapper>
66
+ <>
67
+ {mappedCollapsed ? (
68
+ footer ? (
69
+ <Wrapper collapsed={true}>
70
+ <StyledFooterWrapper data-component-name="Sidebar/FooterWrapper" collapsed={true}>
71
+ {footer}
72
+ </StyledFooterWrapper>
73
+ <MobileSidebarButton opened={isOpen} onClick={toggleMenu}>
74
+ <MobileSidebarIcon />
75
+ </MobileSidebarButton>
76
+ </Wrapper>
77
+ ) : null
78
+ ) : (
79
+ <Wrapper data-component-name="Sidebar/SidebarLayout">
80
+ <MobileSidebarButton opened={isOpen} onClick={toggleMenu}>
81
+ <MobileSidebarIcon />
82
+ </MobileSidebarButton>
83
+ {!search?.hide && search?.placement === 'sidebar' ? <SidebarSearch /> : null}
84
+ <Sidebar animate={true} opened={isOpen}>
85
+ {header ? <HeaderWrapper>{header}</HeaderWrapper> : null}
86
+ {versions ? <>{versions}</> : null}
87
+ <MenuContainer growContent={growContent}>{menu}</MenuContainer>
88
+ {footer && !isOpen ? (
89
+ <FooterWrapper data-component-name="Sidebar/FooterWrapper">{footer}</FooterWrapper>
90
+ ) : null}
91
+ </Sidebar>
92
+ </Wrapper>
93
+ )}
94
+ </>
56
95
  );
57
96
  }
58
97
 
59
- const Wrapper = styled.div``;
98
+ const Wrapper = styled.div<{ collapsed?: boolean }>`
99
+ ${({ collapsed }) =>
100
+ collapsed &&
101
+ `
102
+ display: flex;
103
+ flex-direction: column;
104
+ justify-content: flex-end;
105
+ border-right: 1px solid var(--sidebar-border-color);
106
+ `}
107
+ `;
@@ -13,6 +13,7 @@ export * from '@theme/Sidebar/MenuItemLabel';
13
13
  export * from '@theme/Sidebar/MenuLink';
14
14
  export * from '@theme/Sidebar/MenuLinkItem';
15
15
  export * from '@theme/Sidebar/MobileSidebarButton';
16
+ export * from '@theme/Sidebar/MobileSidebarIcon';
16
17
  export * from '@theme/Sidebar/Separator';
17
18
  export * from '@theme/Sidebar/SeparatorItem';
18
19
  export * from '@theme/Sidebar/Sidebar';
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+
3
+ import { LayoutVariant } from './SidebarActions';
4
+ import { StyledChangeViewButton, ChangeViewSvgRow, ChangeViewSvgColumn } from './styled';
5
+
6
+ interface ChangeViewButtonProps {
7
+ layout: LayoutVariant;
8
+ onClick: () => void;
9
+ }
10
+
11
+ export const ChangeViewButton = ({
12
+ layout,
13
+ onClick,
14
+ }: ChangeViewButtonProps): JSX.Element | null => {
15
+ return (
16
+ <StyledChangeViewButton title="Change layout" onClick={onClick}>
17
+ {layout === LayoutVariant.STACKED ? <ChangeViewSvgRow /> : <ChangeViewSvgColumn />}
18
+ </StyledChangeViewButton>
19
+ );
20
+ };
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+
3
+ import { StyledToggleRightPanelButton, HideLeftPanelSVG, ShowLeftPanelSVG } from './styled';
4
+
5
+ interface CollapseSidebarButtonProps {
6
+ initialValue: boolean;
7
+ onClick: () => void;
8
+ }
9
+ export const CollapseSidebarButton = ({
10
+ initialValue,
11
+ onClick,
12
+ }: CollapseSidebarButtonProps): JSX.Element => {
13
+ return (
14
+ <StyledToggleRightPanelButton
15
+ title={initialValue ? 'Show sidebar' : 'Hide sidebar'}
16
+ onClick={onClick}
17
+ >
18
+ {initialValue ? <HideLeftPanelSVG /> : <ShowLeftPanelSVG />}
19
+ </StyledToggleRightPanelButton>
20
+ );
21
+ };
@@ -0,0 +1,64 @@
1
+ import React from 'react';
2
+
3
+ import { ChangeViewButton } from './ChangeViewButton';
4
+ import { ToggleRightPanelButton } from './ToggleRightPanelButton';
5
+ import { CollapseSidebarButton } from './CollapseSidebarButton';
6
+ import { ControlsWrap, ControlsWrapChangeLayoutButtons } from './styled';
7
+
8
+ export enum LayoutVariant {
9
+ STACKED = 'stacked',
10
+ THREE_PANEL = 'three-panel',
11
+ }
12
+
13
+ interface SidebarActionsProps {
14
+ showChangeLayoutButton: boolean;
15
+ showRightPanelToggle: boolean;
16
+ layout: LayoutVariant;
17
+ initialShowRightPanelToggle: boolean;
18
+ collapsedSidebar: boolean;
19
+ isOpenapiDocs: boolean;
20
+ hideCollapseSidebarButton?: boolean;
21
+ onChangeRightPanelViewClick: () => void;
22
+ onChangeViewClick: () => void;
23
+ onChangeCollapseSidebarClick: () => void;
24
+ requestAccessButton?: React.ReactElement | null;
25
+ }
26
+
27
+ export const SidebarActions = ({
28
+ showChangeLayoutButton,
29
+ showRightPanelToggle,
30
+ layout,
31
+ initialShowRightPanelToggle,
32
+ hideCollapseSidebarButton = false,
33
+ collapsedSidebar,
34
+ isOpenapiDocs,
35
+ onChangeRightPanelViewClick,
36
+ onChangeViewClick,
37
+ onChangeCollapseSidebarClick,
38
+ requestAccessButton,
39
+ }: SidebarActionsProps) => {
40
+ return (
41
+ <ControlsWrap isOpenapiDocs={isOpenapiDocs} isCollapsed={collapsedSidebar}>
42
+ {isOpenapiDocs && (
43
+ <ControlsWrapChangeLayoutButtons isCollapsed={collapsedSidebar}>
44
+ {initialShowRightPanelToggle && (
45
+ <ToggleRightPanelButton
46
+ showRightPanelToggle={showRightPanelToggle}
47
+ onClick={onChangeRightPanelViewClick}
48
+ />
49
+ )}
50
+ {showChangeLayoutButton && showRightPanelToggle && (
51
+ <ChangeViewButton layout={layout} onClick={onChangeViewClick} />
52
+ )}
53
+ </ControlsWrapChangeLayoutButtons>
54
+ )}
55
+ {!collapsedSidebar && requestAccessButton}
56
+ {!hideCollapseSidebarButton && (
57
+ <CollapseSidebarButton
58
+ initialValue={collapsedSidebar}
59
+ onClick={onChangeCollapseSidebarClick}
60
+ />
61
+ )}
62
+ </ControlsWrap>
63
+ );
64
+ };
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+
3
+ import { StyledToggleRightPanelButton, HideRightPanelSVG, ShowRightPanelSVG } from './styled';
4
+
5
+ interface ToggleRightPanelButtonProps {
6
+ showRightPanelToggle: boolean;
7
+ onClick: () => void;
8
+ }
9
+ export const ToggleRightPanelButton = ({
10
+ showRightPanelToggle,
11
+ onClick,
12
+ }: ToggleRightPanelButtonProps): JSX.Element => {
13
+ return (
14
+ <StyledToggleRightPanelButton
15
+ title={showRightPanelToggle ? 'Hide samples' : 'Show samples'}
16
+ onClick={onClick}
17
+ >
18
+ {showRightPanelToggle ? <HideRightPanelSVG /> : <ShowRightPanelSVG />}
19
+ </StyledToggleRightPanelButton>
20
+ );
21
+ };
@@ -0,0 +1 @@
1
+ export { SidebarActions, LayoutVariant } from './SidebarActions';
@@ -0,0 +1,157 @@
1
+ import React from 'react';
2
+ import styled, { css } from 'styled-components';
3
+
4
+ export const ShowLeftPanelSVG = styled(() => (
5
+ <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
6
+ <path
7
+ d="M4.375 7L8.75 2.625L9.3625 3.2375L5.6 7L9.3625 10.7625L8.75 11.375L4.375 7Z"
8
+ fill="var(--color-emphasis-400)"
9
+ />
10
+ </svg>
11
+ ))`
12
+ position: absolute;
13
+ `;
14
+
15
+ export const HideLeftPanelSVG = styled(() => (
16
+ <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
17
+ <path
18
+ d="M9.62495 7L5.24995 11.375L4.63745 10.7625L8.39995 7L4.63745 3.2375L5.24995 2.625L9.62495 7Z"
19
+ fill="var(--color-emphasis-400)"
20
+ />
21
+ </svg>
22
+ ))`
23
+ position: absolute;
24
+ `;
25
+
26
+ export const StyledToggleRightPanelButton = styled.a`
27
+ display: flex;
28
+ justify-content: center;
29
+ align-items: center;
30
+ cursor: pointer;
31
+ z-index: 1;
32
+ /* Rectangle 201 */
33
+ border-radius: var(--border-radius);
34
+ padding: var(--spacing-unit);
35
+
36
+ &:hover {
37
+ background-color: var(--sidebar-item-active-background-color);
38
+ }
39
+ `;
40
+
41
+ export const HideRightPanelSVG = styled(() => (
42
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
43
+ <path
44
+ d="M14 2H2C1.73478 2 1.48043 2.10536 1.29289 2.29289C1.10536 2.48043 1 2.73478 1 3V13C1 13.2652 1.10536 13.5196 1.29289 13.7071C1.48043 13.8946 1.73478 14 2 14H14C14.2652 14 14.5196 13.8946 14.7071 13.7071C14.8946 13.5196 15 13.2652 15 13V3C15 2.73478 14.8946 2.48043 14.7071 2.29289C14.5196 2.10536 14.2652 2 14 2V2ZM2 3H10V13H2V3Z"
45
+ fill="var(--color-emphasis-400)"
46
+ />
47
+ </svg>
48
+ ))`
49
+ position: absolute;
50
+ `;
51
+
52
+ export const ShowRightPanelSVG = styled(() => (
53
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
54
+ <path
55
+ d="M14 2H2C1.73478 2 1.48043 2.10536 1.29289 2.29289C1.10536 2.48043 1 2.73478 1 3V13C1 13.2652 1.10536 13.5196 1.29289 13.7071C1.48043 13.8946 1.73478 14 2 14H14C14.2652 14 14.5196 13.8946 14.7071 13.7071C14.8946 13.5196 15 13.2652 15 13V3C15 2.73478 14.8946 2.48043 14.7071 2.29289C14.5196 2.10536 14.2652 2 14 2V2ZM2 3H10V13H2V3ZM14 13H11V3H14V13Z"
56
+ fill="var(--color-emphasis-400)"
57
+ />
58
+ </svg>
59
+ ))`
60
+ position: absolute;
61
+ `;
62
+
63
+ export const StyledChangeViewButton = styled.a`
64
+ display: flex;
65
+ position: relative;
66
+ justify-content: center;
67
+ align-items: center;
68
+ cursor: pointer;
69
+ border-radius: var(--border-radius);
70
+ z-index: 1;
71
+ /* Rectangle 201 */
72
+ padding: var(--spacing-unit);
73
+
74
+ &:hover {
75
+ background-color: var(--sidebar-item-active-background-color);
76
+ }
77
+ `;
78
+
79
+ export const ChangeViewSvgRow = styled(() => (
80
+ <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
81
+ <path
82
+ d="M1.75 2.625L12.25 2.625L12.25 1.75L1.75 1.75L1.75 2.625Z"
83
+ fill="var(--color-emphasis-400)"
84
+ />
85
+ <path
86
+ d="M1.75 5.6875L12.25 5.6875L12.25 4.8125L1.75 4.8125L1.75 5.6875Z"
87
+ fill="var(--color-emphasis-400)"
88
+ />
89
+ <path
90
+ d="M2.625 11.375L2.625 8.75L11.375 8.75L11.375 11.375L2.625 11.375ZM2.625 12.25L11.375 12.25C11.6071 12.25 11.8296 12.1578 11.9937 11.9937C12.1578 11.8296 12.25 11.6071 12.25 11.375L12.25 8.75C12.25 8.51794 12.1578 8.29538 11.9937 8.13128C11.8296 7.96719 11.6071 7.875 11.375 7.875L2.625 7.875C2.39294 7.875 2.17038 7.96719 2.00628 8.13128C1.84219 8.29538 1.75 8.51793 1.75 8.75L1.75 11.375C1.75 11.6071 1.84219 11.8296 2.00628 11.9937C2.17038 12.1578 2.39294 12.25 2.625 12.25Z"
91
+ fill="var(--color-emphasis-400)"
92
+ />
93
+ </svg>
94
+ ))`
95
+ position: absolute;
96
+ `;
97
+
98
+ export const ChangeViewSvgColumn = styled(() => (
99
+ <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
100
+ <path
101
+ d="M2.625 12.25L2.625 1.75L1.75 1.75L1.75 12.25L2.625 12.25Z"
102
+ fill="var(--color-emphasis-400)"
103
+ />
104
+ <path
105
+ d="M5.6875 12.25L5.6875 1.75L4.8125 1.75L4.8125 12.25L5.6875 12.25Z"
106
+ fill="var(--color-emphasis-400)"
107
+ />
108
+ <path
109
+ d="M11.375 11.375L8.75 11.375L8.75 2.625L11.375 2.625L11.375 11.375ZM12.25 11.375L12.25 2.625C12.25 2.39294 12.1578 2.17038 11.9937 2.00628C11.8296 1.84219 11.6071 1.75 11.375 1.75L8.75 1.75C8.51794 1.75 8.29538 1.84219 8.13128 2.00628C7.96719 2.17038 7.875 2.39294 7.875 2.625L7.875 11.375C7.875 11.6071 7.96719 11.8296 8.13128 11.9937C8.29538 12.1578 8.51794 12.25 8.75 12.25L11.375 12.25C11.6071 12.25 11.8296 12.1578 11.9937 11.9937C12.1578 11.8296 12.25 11.6071 12.25 11.375Z"
110
+ fill="var(--color-emphasis-400)"
111
+ />
112
+ </svg>
113
+ ))`
114
+ position: absolute;
115
+ `;
116
+
117
+ export const ControlsWrap = styled.span<{
118
+ iconCount?: number;
119
+ isCollapsed?: boolean;
120
+ isOpenapiDocs?: boolean;
121
+ }>`
122
+ display: none;
123
+ justify-content: ${({ isOpenapiDocs }) => (isOpenapiDocs ? 'space-between' : 'flex-end')};
124
+ bottom: 0;
125
+ flex-direction: row;
126
+ gap: var(--spacing-unit);
127
+ align-items: center;
128
+ margin-left: '15px';
129
+ z-index: 2;
130
+ background: var(--sidebar-background-color);
131
+
132
+ ${({ isCollapsed }) =>
133
+ isCollapsed &&
134
+ css`
135
+ flex-direction: column;
136
+ gap: 10px;
137
+ padding-bottom: 10px;
138
+ `}
139
+
140
+ ${({ theme }) => css`
141
+ ${theme.mediaQueries[theme.showAtBreakpoint.sidebar]} {
142
+ display: flex;
143
+ }
144
+
145
+ ${theme.mediaQueries.print} {
146
+ display: none;
147
+ }
148
+ `}
149
+ `;
150
+
151
+ export const ControlsWrapChangeLayoutButtons = styled.span<{ isCollapsed?: boolean }>`
152
+ display: flex;
153
+ bottom: 0;
154
+ flex-direction: ${({ isCollapsed }) => (isCollapsed ? 'column-reverse' : 'row')};
155
+ gap: ${({ isCollapsed }) => (isCollapsed ? '10px' : 'var(--spacing-unit)')};
156
+ align-items: center;
157
+ `;