Skip to content

Commit

Permalink
all styling set
Browse files Browse the repository at this point in the history
  • Loading branch information
mmeigs committed Jul 31, 2024
1 parent 9247b70 commit 64d578c
Show file tree
Hide file tree
Showing 9 changed files with 342 additions and 103 deletions.
73 changes: 63 additions & 10 deletions src/components/DarkModeToggle/DarkModeToggle.tsx
Original file line number Diff line number Diff line change
@@ -1,19 +1,72 @@
import * as React from 'react';
import { ToggleButton, IconContainer } from './styled.elements';
import { ToggleButton, IconContainer, Placeholder } from './styled.elements';
import { SunSvg } from './SunSvg';
import { MoonSvg } from './MoonSvg';

interface DarkModeToggleProps {
interface DarkModeToggleState {
darkMode: boolean;
onToggle: () => void;
isMounted: boolean;
}

const DarkModeToggleComponent = ({ darkMode, onToggle }: DarkModeToggleProps) => {
return (
<ToggleButton onClick={onToggle}>
<IconContainer>{darkMode ? <MoonSvg /> : <SunSvg />}</IconContainer>
</ToggleButton>
export const DARK_THEME_CLASSNAME = 'dark-theme';
export const LIGHT_THEME_CLASSNAME = 'light-theme';
export const SYSTEM_THEME_CLASSNAME = 'system';

function changeClass(darkMode: 'dark-theme' | 'light-theme') {
const docClassList =
typeof window !== 'undefined' && window?.document?.documentElement?.classList;
if (!docClassList) return;
docClassList.add(darkMode);
const removeClassnames = new Set([
LIGHT_THEME_CLASSNAME,
DARK_THEME_CLASSNAME,
SYSTEM_THEME_CLASSNAME,
]);
removeClassnames.delete(darkMode);
removeClassnames.forEach(className => {
if (className !== darkMode) docClassList.remove(className);
});

const localStorageDarkMode = JSON.parse(localStorage.getItem('mongodb-docs') ?? '{}');
localStorage.setItem(
'mongodb-docs',
JSON.stringify({ ...localStorageDarkMode, theme: darkMode }),
);
};
}

export class DarkModeToggle extends React.Component<Record<string, never>, DarkModeToggleState> {
constructor(props) {
super(props);
this.state = { darkMode: false, isMounted: false };

this.onToggleDarkMode = this.onToggleDarkMode.bind(this);
}

export const DarkModeToggle = React.memo<DarkModeToggleProps>(DarkModeToggleComponent);
componentDidMount() {
let initialDarkMode = false;
if (typeof window !== 'undefined') {
const localStorageDarkMode = JSON.parse(localStorage?.getItem('mongodb-docs') ?? '{}')?.[
'theme'
];
initialDarkMode = localStorageDarkMode === 'dark-theme';
}
changeClass(initialDarkMode ? 'dark-theme' : 'light-theme');

this.setState({ darkMode: initialDarkMode, isMounted: true });
}

onToggleDarkMode() {
changeClass(this.state.darkMode ? 'light-theme' : 'dark-theme');
this.setState({ darkMode: !this.state.darkMode });
}

render() {
if (!this.state.isMounted) return <Placeholder />;

return (
<ToggleButton onClick={this.onToggleDarkMode}>
<IconContainer>{this.state.darkMode ? <MoonSvg /> : <SunSvg />}</IconContainer>
</ToggleButton>
);
}
}
6 changes: 1 addition & 5 deletions src/components/DarkModeToggle/MoonSvg.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,8 @@ export const MoonSvg = (): JSX.Element => (
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
viewBox="0 0 24 24"
viewBox="0 0 16 16"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
role="img"
aria-label="Moon Icon"
>
Expand Down
6 changes: 1 addition & 5 deletions src/components/DarkModeToggle/SunSvg.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,8 @@ export const SunSvg = (): JSX.Element => (
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
viewBox="0 0 24 24"
viewBox="0 0 16 16"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
role="img"
aria-label="Sun Icon"
>
Expand Down
18 changes: 17 additions & 1 deletion src/components/DarkModeToggle/styled.elements.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export const ToggleButton = styled.button`
background-color: rgba(255, 255, 255, 0);
height: 28px;
width: 28px;
color: rgb(193, 199, 198);
color: var(--button-color);
border-width: initial;
border-style: none;
border-color: initial;
Expand All @@ -28,6 +28,16 @@ export const ToggleButton = styled.button`
opacity: 0;
transform: scale(0.8);
}
&:hover {
color: var(--button-color-on-hover);
}
&:hover::before {
opacity: 1;
transform: scale(1);
background-color: var(--button-bg-on-hover);
}
`;

export const IconContainer = styled.div`
Expand All @@ -49,3 +59,9 @@ export const IconContainer = styled.div`
-webkit-justify-content: center;
justify-content: center;
`;

export const Placeholder = styled.div`
width: 16px;
height: 16px;
margin: 0 16px;
`;
66 changes: 4 additions & 62 deletions src/components/Redoc/Redoc.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import {
AbsoluteBorder,
ApiContentWrap,
BackgroundStub,
DarkModeSwitchContainer,
RedocWrap,
SideMenuTitle,
StyledHeader,
Expand All @@ -24,65 +23,16 @@ import {
import { SearchBox } from '../SearchBox/SearchBox';
import { StoreProvider } from '../StoreBuilder';
import { VersionSelector } from '../VersionSelector';
import { DarkModeToggle } from '../DarkModeToggle/DarkModeToggle';
import { createGlobalStyle } from 'styled-components';
import { IS_BROWSER } from '../../utils';
import { globalStyles } from '../../globalStyles';

export interface RedocProps {
store: AppStore;
}

let globalCss = '';
if (IS_BROWSER) {
globalCss = require('../../global.css');
globalCss = (typeof globalCss.toString === 'function' && globalCss.toString()) || '';
globalCss = globalCss === '[object Object]' ? '' : globalCss;
}

const GlobalCss = createGlobalStyle`${globalCss}`;

export const DARK_THEME_CLASSNAME = 'dark-theme';
export const LIGHT_THEME_CLASSNAME = 'light-theme';
export const SYSTEM_THEME_CLASSNAME = 'system';

function changeClass(darkMode: 'dark-theme' | 'light-theme') {
const docClassList =
typeof window !== 'undefined' && window?.document?.documentElement?.classList;
if (!docClassList) return;
docClassList.add(darkMode);
const removeClassnames = new Set([
LIGHT_THEME_CLASSNAME,
DARK_THEME_CLASSNAME,
SYSTEM_THEME_CLASSNAME,
]);
removeClassnames.delete(darkMode);
removeClassnames.forEach(className => {
if (className !== darkMode) docClassList.remove(className);
});

const localStorageDarkMode = JSON.parse(localStorage.getItem('mongodb-docs') ?? '{}');
localStorage.setItem(
'mongodb-docs',
JSON.stringify({ ...localStorageDarkMode, theme: darkMode }),
);
}

export class Redoc extends React.Component<RedocProps, { darkMode: boolean }> {
constructor(props) {
super(props);
let initialDarkMode = false;
if (typeof window !== 'undefined') {
const localStorageDarkMode = JSON.parse(localStorage?.getItem('mongodb-docs') ?? '{}')?.[
'theme'
];
initialDarkMode = localStorageDarkMode === 'dark-theme';
}
this.state = { darkMode: initialDarkMode };
changeClass(initialDarkMode ? 'dark-theme' : 'light-theme');

this.onToggleDarkMode = this.onToggleDarkMode.bind(this);
}
const GlobalCss = createGlobalStyle`${globalStyles}`;

export class Redoc extends React.Component<RedocProps, { darkMode: boolean; isMounted: boolean }> {
static propTypes = {
store: PropTypes.instanceOf(AppStore).isRequired,
};
Expand All @@ -95,11 +45,6 @@ export class Redoc extends React.Component<RedocProps, { darkMode: boolean }> {
this.props.store.dispose();
}

onToggleDarkMode() {
changeClass(this.state.darkMode ? 'light-theme' : 'dark-theme');
this.setState({ darkMode: !this.state.darkMode });
}

render() {
const {
store: { spec, menu, options, search, marker },
Expand All @@ -110,7 +55,7 @@ export class Redoc extends React.Component<RedocProps, { darkMode: boolean }> {
<ThemeProvider theme={options.theme}>
<StoreProvider value={store}>
<OptionsProvider value={options}>
{globalCss && <GlobalCss />}
{GlobalCss && <GlobalCss />}
<StyledHeader>
<UnifiedNav position="relative" property={{ name: 'DOCS', searchParams: [] }} />
</StyledHeader>
Expand All @@ -121,9 +66,6 @@ export class Redoc extends React.Component<RedocProps, { darkMode: boolean }> {
backNavigationPath={options.backNavigationPath}
siteTitle={options.siteTitle}
/>
<DarkModeSwitchContainer>
<DarkModeToggle darkMode={this.state.darkMode} onToggle={this.onToggleDarkMode} />
</DarkModeSwitchContainer>
<SideMenuTitle>
{store.spec.info.title}
{options.versionData && ` ${options.versionData.active.apiVersion}`}
Expand Down
7 changes: 0 additions & 7 deletions src/components/Redoc/styled.elements.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,5 @@
import styled, { media } from '../../styled-components';

export const DarkModeSwitchContainer = styled.div`
display: flex;
margin: 10px auto;
justify-content: space-between;
gap: 20px;
`;

export const StyledHeader = styled.header`
position: relative;
width: 100%;
Expand Down
21 changes: 13 additions & 8 deletions src/components/SideMenu/SideMenuBackButton.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import * as React from 'react';
import {
MenuItemLabel,
MenuItemLi,
MenuItemTitle,
MenuItemUl,
MenuLink,
MenuBreak,
MenuItemBackButtonLi,
MenuItemBackButtonContainer,
} from './styled.elements';
import { DarkModeToggle } from '../DarkModeToggle/DarkModeToggle';

interface SideMenuBackButtonProps {
backNavigationPath?: string;
Expand All @@ -24,13 +26,16 @@ export const SideMenuBackButton = ({ backNavigationPath, siteTitle }: SideMenuBa
return (
<>
<MenuItemUl expanded={true}>
<MenuItemLi depth={depth}>
<MenuLink href={href}>
<MenuItemLabel depth={depth} active={false} isBackButton={true}>
<MenuItemTitle>&#8592; {text}</MenuItemTitle>
</MenuItemLabel>
</MenuLink>
</MenuItemLi>
<MenuItemBackButtonLi>
<MenuItemBackButtonContainer>
<MenuLink href={href}>
<MenuItemLabel depth={depth} active={false} isBackButton={true}>
<MenuItemTitle>&#8592; {text}</MenuItemTitle>
</MenuItemLabel>
</MenuLink>
</MenuItemBackButtonContainer>
<DarkModeToggle />
</MenuItemBackButtonLi>
</MenuItemUl>
<MenuBreak />
</>
Expand Down
19 changes: 14 additions & 5 deletions src/components/SideMenu/styled.elements.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { palette } from '@leafygreen-ui/palette';
import { default as classnames } from 'classnames';
import { cssVar, darken } from 'polished';

Expand Down Expand Up @@ -65,6 +64,19 @@ export const MenuItemUl = styled.ul<{ expanded: boolean }>`
${props => (props.expanded ? '' : 'display: none;')};
`;

export const MenuItemBackButtonLi = styled.li`
list-style: none inside none;
padding: 0;
display: flex;
justify-content: space-between;
align-items: center;
`;

export const MenuItemBackButtonContainer = styled.div`
overflow: hidden;
text-overflow: ellipsis;
`;

export const MenuItemLi = styled.li<{ depth: number }>`
list-style: none inside none;
overflow: hidden;
Expand Down Expand Up @@ -124,10 +136,7 @@ export const MenuItemLabel = styled.label.attrs((props: MenuItemLabelType) => ({
${props => (props.deprecated && deprecatedCss) || ''};
&:hover {
color: ${props =>
props.isBackButton
? palette.gray.dark1
: menuItemActive(props.depth, props, 'activeTextColor')};
color: ${props => menuItemActive(props.depth, props, 'activeTextColor')};
background-color: var(--sidebar-hover);
}
Expand Down
Loading

0 comments on commit 64d578c

Please sign in to comment.