Added Toggle UI component

This commit is contained in:
Frank Johnson
2021-10-11 22:39:16 -04:00
parent 0fda7ebbbb
commit ea2671baa1
3 changed files with 75 additions and 34 deletions

View File

@@ -98,6 +98,9 @@ module.exports = {
minHeight: { minHeight: {
md: '28rem', md: '28rem',
}, },
outline: {
gray: ['2px solid #3B3E4B', '8px'],
},
skew: { skew: {
'-20': '-20deg', '-20': '-20deg',
}, },

View File

@@ -3,6 +3,8 @@ import { SvgNames } from 'src/components/Svg/Svg'
import { useIdeContext } from 'src/helpers/hooks/useIdeContext' import { useIdeContext } from 'src/helpers/hooks/useIdeContext'
import { createRemoveUpdate, updateTree } from 'react-mosaic-component' import { createRemoveUpdate, updateTree } from 'react-mosaic-component'
import type { MosaicPath } from 'react-mosaic-component' import type { MosaicPath } from 'react-mosaic-component'
import Toggle from 'src/components/Toggle'
interface SidebarConfigType { interface SidebarConfigType {
name: string name: string
icon: SvgNames icon: SvgNames
@@ -151,41 +153,44 @@ const settingsConfig: settingsConfig[] = [
}, [state.layout]) }, [state.layout])
return ( return (
<div className="p-2"> <div className="p-2">
<li <li className="list-none select-none">
className="grid items-center my-2" <label
style={{ gridTemplateColumns: 'auto 4rem' }} className="grid items-center my-2 cursor-pointer"
> style={{ gridTemplateColumns: '1fr auto' }}
<div className="text-sm">Visible</div> >
<input <span>Visible</span>
type="checkbox" <Toggle
onChange={(newValue) => { offLabel="Hide"
if (consolePath) { onLabel="Show"
const newTree = updateTree(state.layout, [ onChange={(newValue) => {
createRemoveUpdate(state.layout, consolePath), if (consolePath) {
]) const newTree = updateTree(state.layout, [
thunkDispatch({ type: 'setLayout', payload: newTree }) createRemoveUpdate(state.layout, consolePath),
} else { ])
// Split 'Viewer' panel to add console back in thunkDispatch({ type: 'setLayout', payload: newTree })
const viewerPath = getPathById(state.layout, 'Viewer') } else {
const newTree = { ...state.layout } // Split 'Viewer' panel to add console back in
let temp = newTree const viewerPath = getPathById(state.layout, 'Viewer')
viewerPath.forEach((name) => { const newTree = { ...state.layout }
if (newTree[name] === 'Viewer') { let temp = newTree
newTree[name] = { viewerPath.forEach((name) => {
direction: 'column', if (newTree[name] === 'Viewer') {
first: 'Viewer', newTree[name] = {
second: 'Console', direction: 'column',
splitPercentage: 70, first: 'Viewer',
second: 'Console',
splitPercentage: 70,
}
return
} }
return temp = { ...newTree[name] }
} })
temp = { ...newTree[name] } thunkDispatch({ type: 'setLayout', payload: newTree })
}) }
thunkDispatch({ type: 'setLayout', payload: newTree }) }}
} checked={!!consolePath}
}} />
checked={!!consolePath} </label>
/>
</li> </li>
</div> </div>
) )

View File

@@ -0,0 +1,33 @@
const Toggle = ({ offLabel = 'off', onLabel = 'on', checked, onChange }) => {
return (
<div className="flex items-center text-sm cursor-pointer font-light">
<span className={!checked && 'text-ch-gray-500'}>{offLabel}</span>
<div
className={
'mx-2 w-7 h-4 p-1 rounded-full border border-ch-gray-300 relative ' +
(checked && 'border-ch-gray-500')
}
>
<div
className="w-2.5 h-2.5 rounded-full bg-ch-pink-300 absolute transition-transform duration-75"
style={{
left: '50%',
top: '50%',
transform: checked
? 'translate(-100%, -50%)'
: 'translate(0%, -50%)',
}}
></div>
</div>
<span className={checked && 'text-ch-gray-500'}>{onLabel}</span>
<input
className="sr-only"
type="checkbox"
onChange={onChange}
checked={checked}
/>
</div>
)
}
export default Toggle