Commit 6a14a62c authored by tom's avatar tom

smooth transition for Header and NavBar

parent 70921643
...@@ -3,6 +3,7 @@ import type { ComponentStyleConfig } from '@chakra-ui/theme'; ...@@ -3,6 +3,7 @@ import type { ComponentStyleConfig } from '@chakra-ui/theme';
import type { PartsStyleFunction, SystemStyleObject } from '@chakra-ui/theme-tools'; import type { PartsStyleFunction, SystemStyleObject } from '@chakra-ui/theme-tools';
import { getColor, mode } from '@chakra-ui/theme-tools'; import { getColor, mode } from '@chakra-ui/theme-tools';
import getDefaultFormColors from '../utils/getDefaultFormColors'; import getDefaultFormColors from '../utils/getDefaultFormColors';
import getDefaultTransitionProps from '../utils/getDefaultTransitionProps';
const sizes: Record<string, SystemStyleObject> = { const sizes: Record<string, SystemStyleObject> = {
md: { md: {
...@@ -17,13 +18,15 @@ const sizes: Record<string, SystemStyleObject> = { ...@@ -17,13 +18,15 @@ const sizes: Record<string, SystemStyleObject> = {
const variantOutline: PartsStyleFunction<typeof parts> = (props) => { const variantOutline: PartsStyleFunction<typeof parts> = (props) => {
const { theme } = props const { theme } = props
const { focusColor: fc, errorColor: ec } = getDefaultFormColors(props) const { focusColor: fc, errorColor: ec } = getDefaultFormColors(props);
const transitionProps = getDefaultTransitionProps();
return { return {
field: { field: {
border: '2px solid', border: '2px solid',
bg: 'inherit', bg: 'inherit',
borderColor: mode('gray.100', 'whiteAlpha.200')(props), borderColor: mode('gray.100', 'whiteAlpha.200')(props),
...transitionProps,
_hover: { _hover: {
borderColor: mode('gray.300', 'whiteAlpha.400')(props), borderColor: mode('gray.300', 'whiteAlpha.400')(props),
}, },
...@@ -51,6 +54,7 @@ const variantOutline: PartsStyleFunction<typeof parts> = (props) => { ...@@ -51,6 +54,7 @@ const variantOutline: PartsStyleFunction<typeof parts> = (props) => {
border: '2px solid', border: '2px solid',
borderColor: mode('gray.100', 'whiteAlpha.200')(props), borderColor: mode('gray.100', 'whiteAlpha.200')(props),
bg: mode('gray.100', 'whiteAlpha.200')(props), bg: mode('gray.100', 'whiteAlpha.200')(props),
...transitionProps,
}, },
} }
} }
......
import type { ComponentStyleConfig } from '@chakra-ui/theme'; import type { ComponentStyleConfig } from '@chakra-ui/theme';
import { mode } from '@chakra-ui/theme-tools'; import { mode } from '@chakra-ui/theme-tools';
import type { SystemStyleFunction } from '@chakra-ui/theme-tools'; import type { SystemStyleFunction, SystemStyleInterpolation } from '@chakra-ui/theme-tools';
import getDefaultTransitionProps from '../utils/getDefaultTransitionProps';
const baseStyle: SystemStyleInterpolation = {
...getDefaultTransitionProps(),
}
const variantPrimary: SystemStyleFunction = (props) => { const variantPrimary: SystemStyleFunction = (props) => {
return { return {
...@@ -32,6 +37,7 @@ const defaultProps = { ...@@ -32,6 +37,7 @@ const defaultProps = {
const Link: ComponentStyleConfig = { const Link: ComponentStyleConfig = {
variants, variants,
defaultProps, defaultProps,
baseStyle,
} }
export default Link; export default Link;
...@@ -3,6 +3,7 @@ import { type ThemeConfig } from '@chakra-ui/react'; ...@@ -3,6 +3,7 @@ import { type ThemeConfig } from '@chakra-ui/react';
const config: ThemeConfig = { const config: ThemeConfig = {
initialColorMode: 'system', initialColorMode: 'system',
useSystemColorMode: false, useSystemColorMode: false,
disableTransitionOnChange: false,
} }
export default config; export default config;
import type { StyleFunctionProps } from '@chakra-ui/theme-tools'; import type { StyleFunctionProps } from '@chakra-ui/theme-tools';
import { mode } from '@chakra-ui/theme-tools'; import { mode } from '@chakra-ui/theme-tools';
import getDefaultTransitionProps from './utils/getDefaultTransitionProps';
const global = (props: StyleFunctionProps) => ({ const global = (props: StyleFunctionProps) => ({
body: { body: {
bg: mode('white', 'black')(props), bg: mode('white', 'black')(props),
...getDefaultTransitionProps(),
}, },
}) })
......
export default function getDefaultTransitionProps() {
return {
transitionProperty: 'background-color, color, border-color',
transitionDuration: 'normal',
transitionTimingFunction: 'ease',
}
}
...@@ -27,8 +27,7 @@ export interface ColorModeTogglerProps ...@@ -27,8 +27,7 @@ export interface ColorModeTogglerProps
export const ColorModeToggler = forwardRef<ColorModeTogglerProps, 'input'>((props, ref) => { export const ColorModeToggler = forwardRef<ColorModeTogglerProps, 'input'>((props, ref) => {
const ownProps = omitThemingProps(props); const ownProps = omitThemingProps(props);
const { toggleColorMode, colorMode } = useColorMode(); const { toggleColorMode } = useColorMode();
const [ isOn, setMode ] = React.useState(colorMode === 'light');
const { const {
state, state,
...@@ -50,16 +49,9 @@ export const ColorModeToggler = forwardRef<ColorModeTogglerProps, 'input'>((prop ...@@ -50,16 +49,9 @@ export const ColorModeToggler = forwardRef<ColorModeTogglerProps, 'input'>((prop
transitionDuration: `${ TRANSITION_DURATION }ms`, transitionDuration: `${ TRANSITION_DURATION }ms`,
}), [ thumbBg ]) }), [ thumbBg ])
const handleInputChange = React.useCallback(() => {
// was not able to make transition while consuming flag value from chakra's useColorMode hook
// that's why there is a local state for toggler and this fancy window.setTimeout
setMode((isOn) => !isOn);
window.setTimeout(toggleColorMode, TRANSITION_DURATION);
}, [ toggleColorMode ]);
return ( return (
<chakra.label <chakra.label
{ ...getRootProps({ onChange: handleInputChange }) } { ...getRootProps({ onChange: toggleColorMode }) }
className={ styles.root } className={ styles.root }
> >
<input className={ styles.input } { ...getInputProps({}, ref) }/> <input className={ styles.input } { ...getInputProps({}, ref) }/>
...@@ -71,7 +63,7 @@ export const ColorModeToggler = forwardRef<ColorModeTogglerProps, 'input'>((prop ...@@ -71,7 +63,7 @@ export const ColorModeToggler = forwardRef<ColorModeTogglerProps, 'input'>((prop
<MoonIcon className={ styles.nightIcon } boxSize={ 4 } color={ useColorModeValue('blue.600', 'white') }/> <MoonIcon className={ styles.nightIcon } boxSize={ 4 } color={ useColorModeValue('blue.600', 'white') }/>
<chakra.div <chakra.div
className={ styles.thumb } className={ styles.thumb }
data-checked={ dataAttr(isOn) } data-checked={ dataAttr(state.isChecked) }
data-hover={ dataAttr(state.isHovered) } data-hover={ dataAttr(state.isHovered) }
__css={ thumbStyles } __css={ thumbStyles }
/> />
......
...@@ -6,6 +6,7 @@ import ghIcon from '../../icons/social/git.svg'; ...@@ -6,6 +6,7 @@ import ghIcon from '../../icons/social/git.svg';
import twIcon from '../../icons/social/tweet.svg'; import twIcon from '../../icons/social/tweet.svg';
import tgIcon from '../../icons/social/telega.svg'; import tgIcon from '../../icons/social/telega.svg';
import statsIcon from '../../icons/social/stats.svg'; import statsIcon from '../../icons/social/stats.svg';
import getDefaultTransitionProps from '../../theme/utils/getDefaultTransitionProps';
const SOCIAL_LINKS = [ const SOCIAL_LINKS = [
{ link: '#gh', icon: ghIcon }, { link: '#gh', icon: ghIcon },
...@@ -20,12 +21,13 @@ const NavFooter = () => { ...@@ -20,12 +21,13 @@ const NavFooter = () => {
as="footer" as="footer"
spacing={ 8 } spacing={ 8 }
borderTop="1px solid" borderTop="1px solid"
borderColor={ useColorModeValue('gray.200', 'whiteAlpha.200') } borderColor={ useColorModeValue('blackAlpha.200', 'whiteAlpha.200') }
paddingTop={ 8 } paddingTop={ 8 }
w="100%" w="100%"
alignItems="baseline" alignItems="baseline"
color="gray.500" color="gray.500"
fontSize="xs" fontSize="xs"
{ ...getDefaultTransitionProps() }
> >
<HStack> <HStack>
{ SOCIAL_LINKS.map(sl => { { SOCIAL_LINKS.map(sl => {
......
...@@ -8,20 +8,35 @@ import NavFooter from './NavFooter' ...@@ -8,20 +8,35 @@ import NavFooter from './NavFooter'
import logoIcon from '../../icons/logo.svg'; import logoIcon from '../../icons/logo.svg';
import networksIcon from '../../icons/networks.svg'; import networksIcon from '../../icons/networks.svg';
import getDefaultTransitionProps from '../../theme/utils/getDefaultTransitionProps';
const Navigation = () => { const Navigation = () => {
return ( return (
<VStack <VStack
alignItems="flex-start" alignItems="flex-start"
spacing={ 12 } spacing={ 12 }
borderRight="1px solid" borderRight="1px solid"
borderColor={ useColorModeValue('gray.200', 'whiteAlpha.200') } borderColor={ useColorModeValue('blackAlpha.200', 'whiteAlpha.200') }
px={ 10 } px={ 10 }
py={ 12 } py={ 12 }
width="300px" width="300px"
{ ...getDefaultTransitionProps() }
> >
<HStack as="header" justifyContent="space-between" w="100%" px={ 4 } mb={ 2 } h={ 10 } alignItems="center"> <HStack as="header" justifyContent="space-between" w="100%" px={ 4 } mb={ 2 } h={ 10 } alignItems="center">
<Icon as={ logoIcon } width="142px" height="26px" color={ useColorModeValue('blue.600', 'white') }/> <Icon
<Icon as={ networksIcon } width="20px" height="20px" color={ useColorModeValue('gray.500', 'white') }/> as={ logoIcon }
width="142px"
height="26px"
color={ useColorModeValue('blue.600', 'white') }
{ ...getDefaultTransitionProps() }
/>
<Icon
as={ networksIcon }
width="20px"
height="20px"
color={ useColorModeValue('gray.500', 'white') }
{ ...getDefaultTransitionProps() }
/>
</HStack> </HStack>
<MainNavigation/> <MainNavigation/>
<AccountNavigation/> <AccountNavigation/>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment