Skip to content

Commit

Permalink
feat: replace ColorSchemeProvider and add the new page (#677)
Browse files Browse the repository at this point in the history
  • Loading branch information
jzempel authored Jan 17, 2025
1 parent 4d39b0b commit 0738039
Show file tree
Hide file tree
Showing 10 changed files with 299 additions and 242 deletions.
2 changes: 2 additions & 0 deletions content/nav/components.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
title: Containers
- title: Theming
items:
- id: /components/color-scheme-provider
title: Color scheme provider
- id: /components/palette
title: Palette
- id: /components/theme-object
Expand Down
196 changes: 98 additions & 98 deletions package-lock.json

Large diffs are not rendered by default.

42 changes: 21 additions & 21 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,27 +35,27 @@
"@zendeskgarden/container-utilities": "2.0.2",
"@zendeskgarden/css-bedrock": "10.0.1",
"@zendeskgarden/eslint-config": "44.0.1",
"@zendeskgarden/react-accordions": "9.4.0",
"@zendeskgarden/react-avatars": "9.4.0",
"@zendeskgarden/react-breadcrumbs": "9.4.0",
"@zendeskgarden/react-buttons": "9.4.0",
"@zendeskgarden/react-chrome": "9.4.0",
"@zendeskgarden/react-colorpickers": "9.4.0",
"@zendeskgarden/react-datepickers": "9.4.0",
"@zendeskgarden/react-draggable": "9.4.0",
"@zendeskgarden/react-dropdowns": "9.4.0",
"@zendeskgarden/react-forms": "9.4.0",
"@zendeskgarden/react-grid": "9.4.0",
"@zendeskgarden/react-loaders": "9.4.0",
"@zendeskgarden/react-modals": "9.4.0",
"@zendeskgarden/react-notifications": "9.4.0",
"@zendeskgarden/react-pagination": "9.4.0",
"@zendeskgarden/react-tables": "9.4.0",
"@zendeskgarden/react-tabs": "9.4.0",
"@zendeskgarden/react-tags": "9.4.0",
"@zendeskgarden/react-theming": "9.4.0",
"@zendeskgarden/react-tooltips": "9.4.0",
"@zendeskgarden/react-typography": "9.4.0",
"@zendeskgarden/react-accordions": "9.5.1",
"@zendeskgarden/react-avatars": "9.5.1",
"@zendeskgarden/react-breadcrumbs": "9.5.1",
"@zendeskgarden/react-buttons": "9.5.1",
"@zendeskgarden/react-chrome": "9.5.1",
"@zendeskgarden/react-colorpickers": "9.5.1",
"@zendeskgarden/react-datepickers": "9.5.1",
"@zendeskgarden/react-draggable": "9.5.1",
"@zendeskgarden/react-dropdowns": "9.5.1",
"@zendeskgarden/react-forms": "9.5.1",
"@zendeskgarden/react-grid": "9.5.1",
"@zendeskgarden/react-loaders": "9.5.1",
"@zendeskgarden/react-modals": "9.5.1",
"@zendeskgarden/react-notifications": "9.5.1",
"@zendeskgarden/react-pagination": "9.5.1",
"@zendeskgarden/react-tables": "9.5.1",
"@zendeskgarden/react-tabs": "9.5.1",
"@zendeskgarden/react-tags": "9.5.1",
"@zendeskgarden/react-theming": "9.5.1",
"@zendeskgarden/react-tooltips": "9.5.1",
"@zendeskgarden/react-typography": "9.5.1",
"@zendeskgarden/scripts": "2.4.3",
"@zendeskgarden/stylelint-config": "22.0.0",
"@zendeskgarden/svg-icons": "7.5.0",
Expand Down
2 changes: 1 addition & 1 deletion react-components
Submodule react-components updated 341 files
46 changes: 24 additions & 22 deletions src/components/Provider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,16 @@
* found at http://www.apache.org/licenses/LICENSE-2.0.
*/

import React, { FC, PropsWithChildren, useEffect, useMemo } from 'react';
import React, { FC, PropsWithChildren, useEffect } from 'react';
import { HydrationProvider, useHydrated } from 'react-hydration-provider';
import { ThemeProvider, DEFAULT_THEME } from '@zendeskgarden/react-theming';
import {
ThemeProvider,
DEFAULT_THEME,
useColorScheme,
ColorSchemeProvider
} from '@zendeskgarden/react-theming';
import { ToastProvider } from '@zendeskgarden/react-notifications';
import { MarkdownProvider } from './MarkdownProvider';
import { ColorScheme, ColorSchemeContext } from './useColorSchemeContext';
import { useColorScheme } from './useColorScheme';

const toastPlacement = {
'top-end': { style: { top: DEFAULT_THEME.space.base * 3 } }
Expand Down Expand Up @@ -42,26 +45,25 @@ const Wrapper: FC<PropsWithChildren> = ({ children }) => {
);
};

export const Provider: FC<PropsWithChildren> = ({ children }) => {
const { isSystem, colorScheme, setColorScheme } = useColorScheme();
const ThemedProvider: FC<PropsWithChildren> = ({ children }) => {
const { colorScheme } = useColorScheme();
const theme = { ...DEFAULT_THEME, colors: { ...DEFAULT_THEME.colors, base: colorScheme } };

const contextValue = useMemo(
() => ({ colorScheme: isSystem ? 'system' : (colorScheme as ColorScheme), setColorScheme }),
[isSystem, colorScheme, setColorScheme]
);

return (
<HydrationProvider>
<ColorSchemeContext.Provider value={contextValue}>
<ThemeProvider theme={theme}>
<Wrapper>
<ToastProvider placementProps={toastPlacement} zIndex={5}>
<MarkdownProvider>{children}</MarkdownProvider>
</ToastProvider>
</Wrapper>
</ThemeProvider>
</ColorSchemeContext.Provider>
</HydrationProvider>
<ThemeProvider theme={theme}>
<Wrapper>
<ToastProvider placementProps={toastPlacement} zIndex={5}>
<MarkdownProvider>{children}</MarkdownProvider>
</ToastProvider>
</Wrapper>
</ThemeProvider>
);
};

export const Provider: FC<PropsWithChildren> = ({ children }) => (
<HydrationProvider>
<ColorSchemeProvider>
<ThemedProvider>{children}</ThemedProvider>
</ColorSchemeProvider>
</HydrationProvider>
);
64 changes: 0 additions & 64 deletions src/components/useColorScheme.ts

This file was deleted.

29 changes: 0 additions & 29 deletions src/components/useColorSchemeContext.ts

This file was deleted.

79 changes: 79 additions & 0 deletions src/examples/color-scheme-provider/ColorSchemeProviderDefault.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
/**
* Copyright Zendesk, Inc.
*
* Use of this source code is governed under the Apache License, Version 2.0
* found at http://www.apache.org/licenses/LICENSE-2.0.
*/

import React from 'react';
import { useTheme } from 'styled-components';
import {
ColorScheme,
ColorSchemeProvider,
DEFAULT_THEME,
ThemeProvider,
useColorScheme,
useDocument
} from '@zendeskgarden/react-theming';
import { Body, Chrome, Header } from '@zendeskgarden/react-chrome';
import { IMenuProps, Item, ItemGroup, Menu } from '@zendeskgarden/react-dropdowns';
import { IconButton } from '@zendeskgarden/react-buttons';
import { ReactComponent as DarkIcon } from '@zendeskgarden/svg-icons/src/16/moon-stroke.svg';
import { ReactComponent as LightIcon } from '@zendeskgarden/svg-icons/src/16/sun-stroke.svg';
import { ReactComponent as SystemIcon } from '@zendeskgarden/svg-icons/src/16/monitor-stroke.svg';

const ThemedExample = () => {
const { colorScheme, isSystem, setColorScheme } = useColorScheme();
const theme = useTheme() || DEFAULT_THEME;
const doc = useDocument();

const handleColorSchemeChange: IMenuProps['onChange'] = changes => {
if (changes.value) {
setColorScheme(changes.value as ColorScheme);
}
};

return (
<ThemeProvider theme={{ ...theme, colors: { ...theme.colors, base: colorScheme } }}>
<Chrome isFluid style={{ height: 80 }}>
<Body>
<Header isStandalone>
<Header.ItemWrapper>
<Menu
appendToNode={doc ? doc.body : undefined}
button={props => (
<IconButton {...props} focusInset>
{colorScheme === 'dark' ? <DarkIcon /> : <LightIcon />}
</IconButton>
)}
onChange={handleColorSchemeChange}
placement="bottom-end"
selectedItems={[{ value: isSystem ? 'system' : colorScheme }]}
>
<ItemGroup aria-label="Switch theme" type="radio">
<Item icon={<LightIcon />} value="light">
Light
</Item>
<Item icon={<DarkIcon />} value="dark">
Dark
</Item>
<Item icon={<SystemIcon />} isSelected value="system">
System
</Item>
</ItemGroup>
</Menu>
</Header.ItemWrapper>
</Header>
</Body>
</Chrome>
</ThemeProvider>
);
};

const Example = () => (
<ColorSchemeProvider colorSchemeKey="color-scheme-example">
<ThemedExample />
</ColorSchemeProvider>
);

export default Example;
16 changes: 9 additions & 7 deletions src/layouts/Root/components/Header.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

import React, { useState, HTMLAttributes, useRef, useEffect, ChangeEventHandler } from 'react';
import styled, { css, DefaultTheme, ThemeProps, useTheme } from 'styled-components';
import { getColor, mediaQuery } from '@zendeskgarden/react-theming';
import { ColorScheme, getColor, mediaQuery, useColorScheme } from '@zendeskgarden/react-theming';
import { IconButton } from '@zendeskgarden/react-buttons';
import { IMenuProps, Item, ItemGroup, Menu } from '@zendeskgarden/react-dropdowns';
import { ReactComponent as SearchStroke } from '@zendeskgarden/svg-icons/src/16/search-stroke.svg';
Expand All @@ -18,7 +18,6 @@ import { ReactComponent as DarkIcon } from '@zendeskgarden/svg-icons/src/16/moon
import { ReactComponent as SystemIcon } from '@zendeskgarden/svg-icons/src/16/monitor-stroke.svg';
import { ReactComponent as GardenIcon } from '@zendeskgarden/svg-icons/src/26/garden.svg';
import { ReactComponent as GardenWordmark } from '@zendeskgarden/svg-icons/src/26/wordmark-garden.svg';
import { ColorScheme, useColorSchemeContext } from 'components/useColorSchemeContext';
import MaxWidthLayout from 'layouts/MaxWidth';
import { SearchInput } from './SearchInput';
import { Link, StyledNavigationLink } from './StyledNavigationLink';
Expand Down Expand Up @@ -174,7 +173,7 @@ const StyledMobileNavLink = styled(StyledNavigationLink).attrs({ partiallyActive
`;

const MobileNav: React.FC = () => {
const { colorScheme, setColorScheme } = useColorSchemeContext();
const { colorScheme, isSystem, setColorScheme } = useColorScheme();

const handleColorSchemeChange: ChangeEventHandler<HTMLSelectElement> = event => {
setColorScheme(event.target.value as ColorScheme);
Expand Down Expand Up @@ -208,7 +207,11 @@ const MobileNav: React.FC = () => {
`}
>
<Field.Label isRegular>Switch themes</Field.Label>
<Select defaultValue="system" value={colorScheme} onChange={handleColorSchemeChange}>
<Select
defaultValue="system"
value={isSystem ? 'system' : colorScheme}
onChange={handleColorSchemeChange}
>
<option value="light">Light</option>
<option value="dark">Dark</option>
<option value="system">System</option>
Expand All @@ -219,8 +222,7 @@ const MobileNav: React.FC = () => {
};

const DesktopNav: React.FC = () => {
const { colorScheme, setColorScheme } = useColorSchemeContext();

const { colorScheme, isSystem, setColorScheme } = useColorScheme();
const theme = useTheme();

const handleColorSchemeChange: IMenuProps['onChange'] = changes => {
Expand Down Expand Up @@ -266,7 +268,7 @@ const DesktopNav: React.FC = () => {
)}
onChange={handleColorSchemeChange}
placement="bottom-end"
selectedItems={[{ value: colorScheme }]}
selectedItems={[{ value: isSystem ? 'system' : colorScheme }]}
>
<ItemGroup aria-label="Switch theme" type="radio">
<Item icon={<LightIcon />} value="light">
Expand Down
Loading

0 comments on commit 0738039

Please sign in to comment.