diff --git a/src/app/WardrobePage/index.js b/src/app/WardrobePage/index.js index 2c66f9a..1f5b1a8 100644 --- a/src/app/WardrobePage/index.js +++ b/src/app/WardrobePage/index.js @@ -63,6 +63,7 @@ function WardrobePage() { pose={outfitState.pose} appearanceId={outfitState.appearanceId} wornItemIds={outfitState.wornItemIds} + engine="canvas" /> } controls={ diff --git a/src/app/components/OutfitPreview.js b/src/app/components/OutfitPreview.js index 7bbd038..1a2ed5c 100644 --- a/src/app/components/OutfitPreview.js +++ b/src/app/components/OutfitPreview.js @@ -1,6 +1,8 @@ import React from "react"; import { Box, DarkMode, Flex, Text } from "@chakra-ui/core"; import { WarningIcon } from "@chakra-ui/icons"; +import { css, cx } from "emotion"; +import { CSSTransition, TransitionGroup } from "react-transition-group"; import HangerSpinner from "./HangerSpinner"; import useOutfitAppearance from "./useOutfitAppearance"; @@ -29,6 +31,7 @@ function OutfitPreview({ placeholder, loadingDelayMs, spinnerVariant, + engine = "images", }) { const { loading, error, visibleLayers } = useOutfitAppearance({ speciesId, @@ -61,7 +64,8 @@ function OutfitPreview({ placeholder={placeholder} loadingDelayMs={loadingDelayMs} spinnerVariant={spinnerVariant} - doAnimations + engine={engine} + doTransitions /> ); } @@ -76,7 +80,8 @@ export function OutfitLayers({ placeholder, loadingDelayMs = 500, spinnerVariant = "overlay", - doAnimations = false, + doTransitions = false, + engine = "images", }) { // NOTE: I couldn't find an official NPM source for this that worked with // Webpack, and I didn't want to rely on random people's ports, and I @@ -137,19 +142,82 @@ export function OutfitLayers({ )} - {!scriptsLoading && ( - - + { + // TODO: A bit of a mess in here! Extract these out? + engine === "canvas" ? ( + !scriptsLoading && ( + + + {visibleLayers.map((layer) => ( + + ))} + + + ) + ) : ( + {visibleLayers.map((layer) => ( - + classNames={css` + &-exit { + opacity: 1; + } + + &-exit-active { + opacity: 0; + transition: opacity 0.2s; + } + `} + timeout={200} + > + + finishes preloading and + // applies the src to the underlying . + className={cx( + css` + object-fit: contain; + max-width: 100%; + max-height: 100%; + + &.do-animations { + animation: fade-in 0.2s; + } + + @keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + `, + doTransitions && "do-animations" + )} + // This sets up the cache to not need to reload images during + // download! + // TODO: Re-enable this once we get our change into Chakra + // main. For now, this will make Downloads a bit slower, which + // is fine! + // crossOrigin="Anonymous" + /> + + ))} - - - )} + + ) + }