Board.jsx 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import React from "react";
  2. import { useTranslation } from "react-i18next";
  3. import { ItemList, SubscribeItemEvents } from "./Items";
  4. import Selector from "./Selector";
  5. import ActionPane from "./ActionPane";
  6. import CursorPane from "./Cursors/CursorPane";
  7. import PanZoomRotate from "./PanZoomRotate";
  8. import styled from "styled-components";
  9. import { useRecoilValue } from "recoil";
  10. import { BoardConfigAtom } from "./atoms";
  11. /*
  12. #2C3749 - #13131B
  13. background: radial-gradient(circle, #2c3749, #13131b 100%), url(/board.png);
  14. background-blend-mode: multiply;
  15. box-shadow: rgba(0, 0, 0, 0.19) 0px 10px 20px, rgba(0, 0, 0, 0.23) 0px 6px 6px,
  16. rgba(10, 37, 64, 0.35) 0px -2px 6px 0px inset;
  17. */
  18. const Placeholder = styled.p`
  19. position: fixed;
  20. top: 40vh;
  21. width: 100vw;
  22. text-align: center;
  23. color: hsl(0, 0%, 70%);
  24. `;
  25. const StyledBoard = styled.div.attrs(() => ({ className: "board" }))`
  26. position: relative;
  27. background: radial-gradient(
  28. circle,
  29. hsla(218, 30%, 40%, 0.7),
  30. hsla(218, 40%, 40%, 0.05) 100%
  31. ),
  32. url(/board.png);
  33. border: 1px solid transparent;
  34. width: ${({ size }) => size}px;
  35. height: ${({ size }) => size}px;
  36. border-radius: 2px;
  37. box-shadow: 0px 3px 6px #00000029;
  38. user-select: none;
  39. `;
  40. export const Board = ({ user, users, itemMap, moveFirst = true }) => {
  41. const { t } = useTranslation();
  42. const config = useRecoilValue(BoardConfigAtom);
  43. if (!config.size) {
  44. return <Placeholder>{t("Please select or load a game")}</Placeholder>;
  45. }
  46. return (
  47. <>
  48. <SubscribeItemEvents />
  49. <PanZoomRotate moveFirst={moveFirst}>
  50. <Selector moveFirst={moveFirst}>
  51. <ActionPane>
  52. <CursorPane user={user} users={users}>
  53. <StyledBoard size={config.size}>
  54. <ItemList itemMap={itemMap} />
  55. </StyledBoard>
  56. </CursorPane>
  57. </ActionPane>
  58. </Selector>
  59. </PanZoomRotate>
  60. </>
  61. );
  62. };
  63. export default Board;