tldraw/components/controls-panel/controls-panel.tsx

82 lines
2.1 KiB
TypeScript
Raw Normal View History

2021-05-17 10:01:11 +00:00
/* eslint-disable @typescript-eslint/ban-ts-comment */
import styled from 'styles'
2021-06-21 21:35:28 +00:00
import React, { useRef } from 'react'
import state, { useSelector } from 'state'
2021-06-21 21:35:28 +00:00
import { X, Code } from 'react-feather'
import { breakpoints, IconButton } from 'components/shared'
import * as Panel from '../panel'
import Control from './control'
2021-06-24 08:18:14 +00:00
import { deepCompareArrays } from 'utils'
2021-05-17 10:01:11 +00:00
function openCodePanel() {
state.send('CLOSED_CODE_PANEL')
}
function closeCodePanel() {
state.send('OPENED_CODE_PANEL')
}
const stopKeyboardPropagation = (e: KeyboardEvent | React.KeyboardEvent) =>
e.stopPropagation()
2021-06-21 21:35:28 +00:00
export default function ControlPanel(): JSX.Element {
2021-05-17 10:01:11 +00:00
const rContainer = useRef<HTMLDivElement>(null)
const isOpen = useSelector((s) => Object.keys(s.data.codeControls).length > 0)
2021-05-17 10:01:11 +00:00
const codeControls = useSelector(
(state) => Object.keys(state.data.codeControls),
deepCompareArrays
)
return (
<Panel.Root
ref={rContainer}
dir="ltr"
data-bp-desktop
variant="controls"
isOpen={isOpen}
onKeyDown={stopKeyboardPropagation}
onKeyUp={stopKeyboardPropagation}
>
2021-05-17 10:01:11 +00:00
{isOpen ? (
<Panel.Layout>
<Panel.Header>
<IconButton bp={breakpoints} size="small" onClick={closeCodePanel}>
2021-05-17 10:01:11 +00:00
<X />
</IconButton>
<h3>Controls</h3>
</Panel.Header>
<ControlsList>
{codeControls.map((id) => (
<Control key={id} id={id} />
))}
</ControlsList>
</Panel.Layout>
) : (
<IconButton bp={breakpoints} size="small" onClick={openCodePanel}>
2021-05-17 10:01:11 +00:00
<Code />
</IconButton>
)}
</Panel.Root>
)
}
const ControlsList = styled(Panel.Content, {
padding: 12,
display: 'grid',
gridTemplateColumns: '1fr 4fr',
gridAutoRows: '24px',
alignItems: 'center',
gridColumnGap: '8px',
gridRowGap: '8px',
2021-05-17 10:01:11 +00:00
'& input': {
font: '$ui',
fontSize: '$1',
border: '1px solid $inputBorder',
backgroundColor: '$input',
color: '$text',
height: '100%',
padding: '0px 6px',
2021-05-17 10:01:11 +00:00
},
})