選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

controls-panel.tsx 1.9KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /* eslint-disable @typescript-eslint/ban-ts-comment */
  2. import styled from 'styles'
  3. import React, { useRef } from 'react'
  4. import state, { useSelector } from 'state'
  5. import { X } from 'react-feather'
  6. import { breakpoints, IconButton } from 'components/shared'
  7. import * as Panel from '../panel'
  8. import Control from './control'
  9. import { deepCompareArrays } from 'utils'
  10. function handleClose() {
  11. state.send('CLOSED_CONTROLS')
  12. }
  13. const stopKeyboardPropagation = (e: KeyboardEvent | React.KeyboardEvent) =>
  14. e.stopPropagation()
  15. export default function ControlPanel(): JSX.Element {
  16. const rContainer = useRef<HTMLDivElement>(null)
  17. const isOpen = useSelector((s) => Object.keys(s.data.codeControls).length > 0)
  18. const codeControls = useSelector(
  19. (state) => Object.keys(state.data.codeControls),
  20. deepCompareArrays
  21. )
  22. if (codeControls.length === 0) {
  23. return null
  24. }
  25. return (
  26. <Panel.Root
  27. ref={rContainer}
  28. dir="ltr"
  29. data-bp-desktop
  30. variant="controls"
  31. isOpen={isOpen}
  32. onKeyDown={stopKeyboardPropagation}
  33. onKeyUp={stopKeyboardPropagation}
  34. >
  35. <Panel.Layout>
  36. <Panel.Header>
  37. <IconButton bp={breakpoints} size="small" onClick={handleClose}>
  38. <X />
  39. </IconButton>
  40. <h3>Controls</h3>
  41. </Panel.Header>
  42. <ControlsList>
  43. {codeControls.map((id) => (
  44. <Control key={id} id={id} />
  45. ))}
  46. </ControlsList>
  47. </Panel.Layout>
  48. </Panel.Root>
  49. )
  50. }
  51. const ControlsList = styled(Panel.Content, {
  52. padding: 12,
  53. display: 'grid',
  54. gridTemplateColumns: '1fr 4fr',
  55. gridAutoRows: '24px',
  56. alignItems: 'center',
  57. gridColumnGap: '8px',
  58. gridRowGap: '8px',
  59. '& input': {
  60. font: '$ui',
  61. fontSize: '$1',
  62. border: '1px solid $inputBorder',
  63. backgroundColor: '$input',
  64. color: '$text',
  65. height: '100%',
  66. padding: '0px 6px',
  67. },
  68. })