diff --git a/src/app/WardrobePage/OutfitControls.js b/src/app/WardrobePage/OutfitControls.js
index 7da6534..3309db7 100644
--- a/src/app/WardrobePage/OutfitControls.js
+++ b/src/app/WardrobePage/OutfitControls.js
@@ -13,18 +13,24 @@ import {
UnorderedList,
useClipboard,
useToast,
+ VStack,
} from "@chakra-ui/react";
import {
ArrowBackIcon,
CheckIcon,
DownloadIcon,
LinkIcon,
+ WarningTwoIcon,
} from "@chakra-ui/icons";
+import { FaBug } from "react-icons/fa";
import { MdPause, MdPlayArrow } from "react-icons/md";
import { Link } from "react-router-dom";
import { getBestImageUrlForLayer } from "../components/OutfitPreview";
-import HTML5Badge, { layerUsesHTML5 } from "../components/HTML5Badge";
+import HTML5Badge, {
+ GlitchBadgeLayout,
+ layerUsesHTML5,
+} from "../components/HTML5Badge";
import PosePicker from "./PosePicker";
import SpeciesColorPicker from "../components/SpeciesColorPicker";
import { loadImage, useLocalStorage } from "../util";
@@ -184,6 +190,8 @@ function OutfitControls({
justify="center"
>
+
+
@@ -272,6 +280,47 @@ function OutfitHTML5Badge({ appearance }) {
);
}
+function OutfitKnownGlitchesBadge({ appearance }) {
+ const glitchMessages = [];
+
+ const petHasStaticZone = appearance.petAppearance?.layers.some(
+ (l) => l.zone.id === "46"
+ );
+ const itemHasStaticZone = appearance.itemAppearances
+ ?.map((a) => a.layers)
+ .flat()
+ .some((l) => l.zone.id === "46");
+ if (petHasStaticZone && itemHasStaticZone) {
+ glitchMessages.push(
+
+ When you apply a Static-zone item to an Unconverted pet, it hides the
+ pet. This is a known bug on Neopets.com, so we reproduce it here, too.
+
+ );
+ }
+
+ if (glitchMessages.length === 0) {
+ return null;
+ }
+
+ return (
+
+
+ Known glitches
+
+ {glitchMessages}
+
+ }
+ >
+
+
+
+ );
+}
+
/**
* BackButton takes you back home, or to Your Outfits if this outfit is yours.
*/
diff --git a/src/app/components/HTML5Badge.js b/src/app/components/HTML5Badge.js
index 7e9a4fb..60e838e 100644
--- a/src/app/components/HTML5Badge.js
+++ b/src/app/components/HTML5Badge.js
@@ -3,14 +3,6 @@ import { Tooltip, useColorModeValue, Flex, Icon } from "@chakra-ui/react";
import { CheckCircleIcon, WarningTwoIcon } from "@chakra-ui/icons";
function HTML5Badge({ usesHTML5, isLoading, tooltipLabel }) {
- const greenBackground = useColorModeValue("green.100", "green.900");
- const greenBorderColor = useColorModeValue("green.600", "green.500");
- const greenTextColor = useColorModeValue("green.700", "white");
-
- const yellowBackground = useColorModeValue("yellow.100", "yellow.900");
- const yellowBorderColor = useColorModeValue("yellow.600", "yellow.500");
- const yellowTextColor = useColorModeValue("yellow.700", "white");
-
// `delayedUsesHTML5` stores the last known value of `usesHTML5`, when
// `isLoading` was `false`. This enables us to keep showing the badge, even
// when loading a new appearance - because it's unlikely the badge will
@@ -25,10 +17,8 @@ function HTML5Badge({ usesHTML5, isLoading, tooltipLabel }) {
if (delayedUsesHTML5 === true) {
return (
-
-
+
);
} else if (delayedUsesHTML5 === false) {
return (
-
-
+
);
} else {
// If no `usesHTML5` value has been provided yet, we're empty for now!
@@ -91,10 +79,23 @@ function HTML5Badge({ usesHTML5, isLoading, tooltipLabel }) {
}
}
-function HTML5BadgeLayout({ children, tooltipLabel, ...props }) {
+export function GlitchBadgeLayout({
+ hasGlitches = true,
+ children,
+ tooltipLabel,
+ ...props
+}) {
const [isHovered, setIsHovered] = React.useState(false);
const [isFocused, setIsFocused] = React.useState(false);
+ const greenBackground = useColorModeValue("green.100", "green.900");
+ const greenBorderColor = useColorModeValue("green.600", "green.500");
+ const greenTextColor = useColorModeValue("green.700", "white");
+
+ const yellowBackground = useColorModeValue("yellow.100", "yellow.900");
+ const yellowBorderColor = useColorModeValue("yellow.600", "yellow.500");
+ const yellowTextColor = useColorModeValue("yellow.700", "white");
+
return (