Added Toggle UI component
This commit is contained in:
@@ -98,6 +98,9 @@ module.exports = {
|
|||||||
minHeight: {
|
minHeight: {
|
||||||
md: '28rem',
|
md: '28rem',
|
||||||
},
|
},
|
||||||
|
outline: {
|
||||||
|
gray: ['2px solid #3B3E4B', '8px'],
|
||||||
|
},
|
||||||
skew: {
|
skew: {
|
||||||
'-20': '-20deg',
|
'-20': '-20deg',
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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>
|
||||||
)
|
)
|
||||||
|
|||||||
33
app/web/src/components/Toggle/Toggle.tsx
Normal file
33
app/web/src/components/Toggle/Toggle.tsx
Normal 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
|
||||||
Reference in New Issue
Block a user