Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

controls-panel.tsx 1.7KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /* eslint-disable @typescript-eslint/ban-ts-comment */
  2. import styled from "styles"
  3. import React, { useEffect, useRef } from "react"
  4. import state, { useSelector } from "state"
  5. import { X, Code, PlayCircle } 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/utils"
  10. export default function ControlPanel() {
  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 data-bp-desktop ref={rContainer} isOpen={isOpen}>
  19. {isOpen ? (
  20. <Panel.Layout>
  21. <Panel.Header>
  22. <IconButton onClick={() => state.send("CLOSED_CODE_PANEL")}>
  23. <X />
  24. </IconButton>
  25. <h3>Controls</h3>
  26. </Panel.Header>
  27. <ControlsList>
  28. {codeControls.map((id) => (
  29. <Control key={id} id={id} />
  30. ))}
  31. </ControlsList>
  32. </Panel.Layout>
  33. ) : (
  34. <IconButton onClick={() => state.send("OPENED_CODE_PANEL")}>
  35. <Code />
  36. </IconButton>
  37. )}
  38. </Panel.Root>
  39. )
  40. }
  41. const ControlsList = styled(Panel.Content, {
  42. padding: 12,
  43. display: "grid",
  44. gridTemplateColumns: "1fr 4fr",
  45. gridAutoRows: "24px",
  46. alignItems: "center",
  47. gridColumnGap: "8px",
  48. gridRowGap: "8px",
  49. "& input": {
  50. font: "$ui",
  51. fontSize: "$1",
  52. border: "1px solid $inputBorder",
  53. backgroundColor: "$input",
  54. color: "$text",
  55. height: "100%",
  56. padding: "0px 6px",
  57. },
  58. })