From 4e5bd8bf02291775aa29802ae56bbffb58a571d7 Mon Sep 17 00:00:00 2001 From: Mitchell McCaffrey Date: Mon, 24 May 2021 17:11:46 +1000 Subject: [PATCH] Add animation to group open --- src/components/map/MapTileGroup.js | 8 +- src/components/map/MapTiles.js | 2 + src/components/tile/SortableTile.js | 9 +- src/components/tile/SortableTiles.js | 37 ++----- src/components/tile/TilesContainer.js | 28 ++++- src/components/tile/TilesOverlay.js | 139 ++++++++++++++++++------- src/components/token/TokenBar.js | 2 +- src/components/token/TokenTileGroup.js | 4 +- src/components/token/TokenTiles.js | 2 + src/hooks/useResponsiveLayout.js | 11 +- src/modals/SelectMapModal.js | 2 +- src/modals/SelectTokensModal.js | 2 +- 12 files changed, 170 insertions(+), 76 deletions(-) diff --git a/src/components/map/MapTileGroup.js b/src/components/map/MapTileGroup.js index 91c334d..9ab54cb 100644 --- a/src/components/map/MapTileGroup.js +++ b/src/components/map/MapTileGroup.js @@ -16,9 +16,13 @@ function MapTileGroup({ group, maps, isSelected, onSelect, onDoubleClick }) { onSelect={() => onSelect(group.id)} onDoubleClick={onDoubleClick} > - + {maps.slice(0, 16).map((map) => ( - + ))} diff --git a/src/components/map/MapTiles.js b/src/components/map/MapTiles.js index aa841f2..d051fa7 100644 --- a/src/components/map/MapTiles.js +++ b/src/components/map/MapTiles.js @@ -13,6 +13,7 @@ function MapTiles({ maps, onMapEdit, onMapSelect, subgroup }) { const { groups, selectedGroupIds, + openGroupId, openGroupItems, selectMode, onGroupOpen, @@ -63,6 +64,7 @@ function MapTiles({ maps, onMapEdit, onMapSelect, subgroup }) { renderTile={renderTile} onTileSelect={onGroupSelect} disableGrouping={subgroup} + openGroupId={openGroupId} /> ); } diff --git a/src/components/tile/SortableTile.js b/src/components/tile/SortableTile.js index 1e3dc8e..bce4227 100644 --- a/src/components/tile/SortableTile.js +++ b/src/components/tile/SortableTile.js @@ -2,8 +2,9 @@ import React from "react"; import { Box } from "theme-ui"; import { useDroppable } from "@dnd-kit/core"; import { useSortable } from "@dnd-kit/sortable"; +import { animated, useSpring } from "react-spring"; -function Sortable({ id, disableGrouping, children }) { +function Sortable({ id, disableGrouping, hidden, children }) { const { attributes, listeners, @@ -48,8 +49,10 @@ function Sortable({ id, disableGrouping, children }) { over?.id === `__group__${id}` && active.id !== id ? "solid" : "none", }; + const { opacity } = useSpring({ opacity: hidden ? 0 : 1 }); + return ( - + - + ); } diff --git a/src/components/tile/SortableTiles.js b/src/components/tile/SortableTiles.js index 209d750..c6dcf63 100644 --- a/src/components/tile/SortableTiles.js +++ b/src/components/tile/SortableTiles.js @@ -11,12 +11,9 @@ import { } from "@dnd-kit/core"; import { SortableContext, arrayMove } from "@dnd-kit/sortable"; import { animated, useSpring, config } from "react-spring"; -import { Grid } from "theme-ui"; import { combineGroups, moveGroups } from "../../helpers/group"; -import useResponsiveLayout from "../../hooks/useResponsiveLayout"; - import SortableTile from "./SortableTile"; function SortableTiles({ @@ -25,9 +22,8 @@ function SortableTiles({ renderTile, onTileSelect, disableGrouping, + openGroupId, }) { - const layout = useResponsiveLayout(); - const mouseSensor = useSensor(MouseSensor, { activationConstraint: { delay: 250, tolerance: 5 }, }); @@ -105,27 +101,16 @@ function SortableTiles({ collisionDetection={closestCenter} > - onTileSelect()} - > - {groups.map((group) => ( - - {renderSortableGroup(group)} - - ))} - + {groups.map((group) => ( + + ))} {createPortal( {dragId && ( diff --git a/src/components/tile/TilesContainer.js b/src/components/tile/TilesContainer.js index 438e933..16714bc 100644 --- a/src/components/tile/TilesContainer.js +++ b/src/components/tile/TilesContainer.js @@ -1,14 +1,40 @@ import React from "react"; +import { Box, Grid } from "theme-ui"; import SimpleBar from "simplebar-react"; +import { useGroup } from "../../contexts/GroupContext"; + import useResponsiveLayout from "../../hooks/useResponsiveLayout"; function TilesContainer({ children }) { + const { onGroupSelect } = useGroup(); + const layout = useResponsiveLayout(); return ( - {children} + onGroupSelect()} + /> + + {children} + ); } diff --git a/src/components/tile/TilesOverlay.js b/src/components/tile/TilesOverlay.js index 1b37136..ad43c7b 100644 --- a/src/components/tile/TilesOverlay.js +++ b/src/components/tile/TilesOverlay.js @@ -1,48 +1,111 @@ -import React from "react"; -import { Box, Close } from "theme-ui"; +import React, { useState } from "react"; +import { Box, Close, Grid } from "theme-ui"; +import { useSpring, animated, config } from "react-spring"; +import ReactResizeDetector from "react-resize-detector"; +import SimpleBar from "simplebar-react"; import { useGroup } from "../../contexts/GroupContext"; -function TilesOverlay({ children }) { - const { openGroupId, onGroupClose } = useGroup(); +import useResponsiveLayout from "../../hooks/useResponsiveLayout"; - if (!openGroupId) { - return null; +function TilesOverlay({ children }) { + const { openGroupId, onGroupClose, onGroupSelect } = useGroup(); + + const openAnimation = useSpring({ + opacity: openGroupId ? 1 : 0, + transform: openGroupId ? "scale(1)" : "scale(0.95)", + config: config.gentle, + }); + + const [containerSize, setContinerSize] = useState(0); + function handleResize(width, height) { + const size = Math.min(width, height) - 16; + setContinerSize(size); } + const layout = useResponsiveLayout(); + return ( - onGroupClose()} - > - e.stopPropagation()} - p={3} - > - {children} - - onGroupClose()} - sx={{ position: "absolute", top: "16px", right: "16px" }} - /> - + <> + {openGroupId && ( + + )} + + openGroupId && onGroupClose()} + > + e.stopPropagation()} + > + onGroupSelect()} + /> + + + {children} + + + onGroupClose()} + sx={{ position: "absolute", top: 0, right: 0 }} + /> + + + + ); } diff --git a/src/components/token/TokenBar.js b/src/components/token/TokenBar.js index 2c11909..acfb395 100644 --- a/src/components/token/TokenBar.js +++ b/src/components/token/TokenBar.js @@ -57,7 +57,7 @@ function TokenBar({ onMapTokenStateCreate }) { height: "100%", width: "80px", minWidth: "80px", - overflowY: "scroll", + overflowY: "hidden", overflowX: "hidden", display: fullScreen ? "none" : "block", }} diff --git a/src/components/token/TokenTileGroup.js b/src/components/token/TokenTileGroup.js index 8c749d6..aa6133e 100644 --- a/src/components/token/TokenTileGroup.js +++ b/src/components/token/TokenTileGroup.js @@ -23,12 +23,12 @@ function TokenTileGroup({ onDoubleClick={onDoubleClick} columns="1fr 1fr" > - + {tokens.slice(0, 16).map((token) => ( ))} diff --git a/src/components/token/TokenTiles.js b/src/components/token/TokenTiles.js index daf7182..4296cb1 100644 --- a/src/components/token/TokenTiles.js +++ b/src/components/token/TokenTiles.js @@ -13,6 +13,7 @@ function TokenTiles({ tokens, onTokenEdit, subgroup }) { const { groups, selectedGroupIds, + openGroupId, openGroupItems, selectMode, onGroupOpen, @@ -68,6 +69,7 @@ function TokenTiles({ tokens, onTokenEdit, subgroup }) { renderTile={renderTile} onTileSelect={onGroupSelect} disableGrouping={subgroup} + openGroupId={openGroupId} /> ); } diff --git a/src/hooks/useResponsiveLayout.js b/src/hooks/useResponsiveLayout.js index 6cf41b7..3eb0e1c 100644 --- a/src/hooks/useResponsiveLayout.js +++ b/src/hooks/useResponsiveLayout.js @@ -27,9 +27,18 @@ function useResponsiveLayout() { ? "1fr 1fr 1fr" : "1fr 1fr"; + const groupGridTemplate = isLargeScreen ? "1fr 1fr 1fr" : "1fr 1fr"; + const tileContainerHeight = isLargeScreen ? "600px" : "400px"; - return { screenSize, modalSize, tileSize, gridTemplate, tileContainerHeight }; + return { + screenSize, + modalSize, + tileSize, + gridTemplate, + tileContainerHeight, + groupGridTemplate, + }; } export default useResponsiveLayout; diff --git a/src/modals/SelectMapModal.js b/src/modals/SelectMapModal.js index 46a733b..00e3d92 100644 --- a/src/modals/SelectMapModal.js +++ b/src/modals/SelectMapModal.js @@ -252,7 +252,7 @@ function SelectMapModal({ - + Edit or import a token - +