UNPKG

use-theme-editor

Version:

Zero configuration CSS variables based theme editor

59 lines (55 loc) 2.13 kB
import React, {useContext, useState} from 'react'; import {ACTIONS, ROOT_SCOPE} from '../../hooks/useThemeEditor'; import {ThemeEditorContext} from '../ThemeEditor'; import {Checkbox} from '../controls/Checkbox'; import {ToggleButton} from '../controls/ToggleButton'; import { TextControl } from '../controls/TextControl'; export const CustomVariableInput = () => { const [displayed, setDisplayed] = useState(false); const {dispatch, scopes} = useContext(ThemeEditorContext); const theme = scopes[ROOT_SCOPE] || {}; const [overwriteExisting, setOverwriteExisting] = useState(false); const [name, setName] = useState(''); const [value, setValue] = useState(''); const varExists = name in theme; const isValidName = /^--[a-zA-Z0-9][a-zA-Z0-9_-]+/.test(name); return <div style={{marginBottom: '8px'}}> <ToggleButton controls={[displayed, setDisplayed]}> Custom variable </ToggleButton> {displayed && <div> <form onSubmit={event => { dispatch({type: ACTIONS.set, payload: {name, value}}); event.preventDefault(); return false; } } > <TextControl value={name || '--'} onChange={(value) => { setName(value.replace(' ', '-').replace(/^-*/, '--')); }} /> <br/> <TextControl required value={value} onChange={setValue}/> <button disabled={!isValidName || value === theme[name] || !overwriteExisting && varExists} title={!varExists ? 'Add new variable' : theme[name] === value ? 'Variable already has this value' : `Overwrite existing value of ${theme[name]}`} >Add </button> </form> {varExists && <div> <button onClick={() => { dispatch({type: ACTIONS.unset, payload: {name}}); }}>Unset</button> <Checkbox controls={[overwriteExisting, setOverwriteExisting]}> Confirm overwrite existing </Checkbox> <div> Current value: {theme[name]} </div> </div>} </div>} </div>; };