選択できるのは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, Code } from 'react-feather'
  6. import { IconButton } from 'components/shared'
  7. import * as Panel from '../panel'
  8. import Control from './control'
  9. import { deepCompareArrays } from 'utils'
  10. export default function ControlPanel(): JSX.Element {
  11. const rContainer = useRef<HTMLDivElement>(null)
  12. const codeControls = useSelector(
  13. (state) => Object.keys(state.data.codeControls),
  14. deepCompareArrays
  15. )
  16. const isOpen = useSelector((s) => Object.keys(s.data.codeControls).length > 0)
  17. return (
  18. <Panel.Root
  19. dir="ltr"
  20. data-bp-desktop
  21. ref={rContainer}
  22. isOpen={isOpen}
  23. variant="controls"
  24. >
  25. {isOpen ? (
  26. <Panel.Layout>
  27. <Panel.Header>
  28. <IconButton
  29. bp={{ '@initial': 'mobile', '@sm': 'small' }}
  30. size="small"
  31. onClick={() => state.send('CLOSED_CODE_PANEL')}
  32. >
  33. <X />
  34. </IconButton>
  35. <h3>Controls</h3>
  36. </Panel.Header>
  37. <ControlsList>
  38. {codeControls.map((id) => (
  39. <Control key={id} id={id} />
  40. ))}
  41. </ControlsList>
  42. </Panel.Layout>
  43. ) : (
  44. <IconButton
  45. bp={{ '@initial': 'mobile', '@sm': 'small' }}
  46. size="small"
  47. onClick={() => state.send('OPENED_CODE_PANEL')}
  48. >
  49. <Code />
  50. </IconButton>
  51. )}
  52. </Panel.Root>
  53. )
  54. }
  55. const ControlsList = styled(Panel.Content, {
  56. padding: 12,
  57. display: 'grid',
  58. gridTemplateColumns: '1fr 4fr',
  59. gridAutoRows: '24px',
  60. alignItems: 'center',
  61. gridColumnGap: '8px',
  62. gridRowGap: '8px',
  63. '& input': {
  64. font: '$ui',
  65. fontSize: '$1',
  66. border: '1px solid $inputBorder',
  67. backgroundColor: '$input',
  68. color: '$text',
  69. height: '100%',
  70. padding: '0px 6px',
  71. },
  72. })