diff --git a/packages/chakra-ui-colors/src/ThemeEditorPalette.tsx b/packages/chakra-ui-colors/src/ThemeEditorPalette.tsx index b4347fb..2f70c2b 100644 --- a/packages/chakra-ui-colors/src/ThemeEditorPalette.tsx +++ b/packages/chakra-ui-colors/src/ThemeEditorPalette.tsx @@ -1,6 +1,5 @@ -import React, { FC } from 'react' +import React, { FC, useCallback } from 'react' import { - BoxProps, useColorModeValue, Center, Text, @@ -9,7 +8,7 @@ import { Tooltip, SimpleGridProps, } from '@chakra-ui/react' -import { extend } from 'colord' +import { extend, colord } from 'colord' import namesPlugin from 'colord/plugins/names' import ThemeEditorPaletteDrawer from './ThemeEditorPaletteDrawer' @@ -39,6 +38,28 @@ const ThemeEditorPalette: FC = ({ const shadow = useColorModeValue('surface', 'surfaceDark') const borderColor = useColorModeValue('blackAlpha.100', 'whiteAlpha.100') + const complemetaryFontColor = useCallback( + (scale: number, key: number) => { + const shade = palette?.[scale] + + if (!shade) { + return token.indexOf('white') >= 0 ? 'gray.500' : palette[scale[9 - key]] + } + + const colordShade = colord(shade) + const brightness = colordShade.brightness() + + if (brightness > 0.71) { + const darkShade = colordShade.invert().darken(2) + return darkShade.toHex() + } else { + const lightShade = colordShade.invert().lighten(1) + return lightShade.toHex() + } + }, + [token, palette, scale] + ) + return ( <> = ({ > {showIndex && ( = 0 ? 'gray.500' : palette[scale[9 - key]]} + color={complemetaryFontColor(Number(paletteIndex), key)} size="xs" d={{ base: 'none', md: 'inline' }} > diff --git a/packages/chakra-ui-core/src/components/theme-editor/ThemeEditorDrawerFooter.tsx b/packages/chakra-ui-core/src/components/theme-editor/ThemeEditorDrawerFooter.tsx index cdcbf4b..a48fc33 100644 --- a/packages/chakra-ui-core/src/components/theme-editor/ThemeEditorDrawerFooter.tsx +++ b/packages/chakra-ui-core/src/components/theme-editor/ThemeEditorDrawerFooter.tsx @@ -20,6 +20,7 @@ export const ThemeEditorDrawerFooter: FC = ({ void } +export const InputGroupContext = createContext<{ + currentFontValue: any + setCurrentFontValue: React.Dispatch> +}>({ currentFontValue: '', setCurrentFontValue: () => undefined }) + const ThemeEditorFontSizesItem: FC = (props) => { const { sampleTitle = 'Lorem ipsum dolor sit', size, value, onChange } = props - const [currentValue, setCurrentValue] = useState(value) - - const cssValue = useMemo(() => { - return window && currentValue - ? (window as any).CSSStyleValue.parse('font-size', currentValue) - : undefined - }, [currentValue]) - - const handleSliderChange = useCallback( - (newValue: number) => { - setCurrentValue(`${newValue}${cssValue.unit}`) - }, - [cssValue.unit] - ) - - const handleInputChange = useCallback>( - (event) => { - setCurrentValue(`${event.target.value}${cssValue.unit}`) - }, - [cssValue.unit] - ) + const staticCssValue = useMemo(() => { + if (!window) { + return '0rem' + } else if (!value?.length) { + return '0rem' + } else { + return value + } + }, [value]) - const handleUnitChange = useCallback>( - (event) => { - if (cssValue.unit === 'px' && (event.target.value === 'em' || event.target.value === 'rem')) { - setCurrentValue(`${cssValue.value / 16}${event.target.value}`) - } else if ( - (cssValue.unit === 'em' || cssValue.unit === 'rem') && - event.target.value === 'px' - ) { - setCurrentValue(`${(cssValue.value * 16).toFixed(0)}${event.target.value}`) - } else { - setCurrentValue(`${cssValue.value}${event.target.value}`) - } - }, - [cssValue.unit, cssValue.value] - ) + const [currentValue, setCurrentValue] = useState(staticCssValue) useDebouncyEffect(() => onChange({ size, value: currentValue }), 500, [currentValue]) - useEffect(() => { - setCurrentValue(value) - }, [value]) - return ( {size} - - - - - - - - - - + + + { + const context = useContext(InputGroupContext) + const { currentFontValue, setCurrentFontValue } = context + + const fontSizeUnit = useMemo(() => { + const charactersList = Array.from(currentFontValue.matchAll(/[a-z]/g)) + const charactersSubstring = charactersList.toString().replaceAll(',', '') + + return charactersSubstring + }, [currentFontValue]) + + const fontSizeValue = useMemo(() => { + const numbersList = Array.from(currentFontValue.matchAll(/[^a-z]/g)) + let numbersSubstring = '' + numbersList.forEach((item) => { + numbersSubstring += item + }) + + const int = Number.isNaN(Number(numbersSubstring)) ? 0 : Number(numbersSubstring) + + return int + }, [currentFontValue]) + + const [isMouseOver, setIsMouseOver] = useState(false) + + return ( + setCurrentFontValue(`${value}${fontSizeUnit}`)} + onMouseOver={() => setIsMouseOver(true)} + onMouseLeave={() => setIsMouseOver(false)} + > + + + + + + ) +} diff --git a/packages/chakra-ui-font-sizes/src/base-components/InputFields.tsx b/packages/chakra-ui-font-sizes/src/base-components/InputFields.tsx new file mode 100644 index 0000000..c8b0ce9 --- /dev/null +++ b/packages/chakra-ui-font-sizes/src/base-components/InputFields.tsx @@ -0,0 +1,70 @@ +import { Flex, Input, Select } from '@chakra-ui/react' +import React, { useCallback, useContext, useMemo } from 'react' +import { InputGroupContext } from '../ThemeEditorFontSizesItem' + +export const InputFields = () => { + const context = useContext(InputGroupContext) + const { currentFontValue, setCurrentFontValue } = context + + const fontSizeUnit = useMemo(() => { + const charactersList = Array.from(currentFontValue.matchAll(/[a-z]/g)) + const charactersSubstring = charactersList.toString().replaceAll(',', '') + + return charactersSubstring + }, [currentFontValue]) + + const fontSizeValue = useMemo(() => { + const numbersList = Array.from(currentFontValue.matchAll(/[^a-z]/g)) + let numbersSubstring = '' + numbersList.forEach((item) => { + numbersSubstring += item + }) + + return numbersSubstring + }, [currentFontValue]) + + const handleUnitChange = useCallback>( + (event) => { + let newValue = '0rem' + if (fontSizeUnit === 'px' && (event.target.value === 'em' || event.target.value === 'rem')) { + newValue = `${Number(fontSizeValue) / 16}${event.target.value}` + } else { + newValue = `${fontSizeValue}${event.target.value}` + } + + setCurrentFontValue(newValue) + }, + [currentFontValue] + ) + + return ( + + + setCurrentFontValue(`${!e.target.value ? '' : e.target.value}${fontSizeUnit}`) + } + onWheel={(e) => e.currentTarget.blur()} + /> + + + ) +}