diff --git a/packages/website/public/media/patterns/api.svg b/packages/website/public/media/patterns/api.svg
new file mode 100644
index 000000000..92ed08562
--- /dev/null
+++ b/packages/website/public/media/patterns/api.svg
@@ -0,0 +1,3 @@
+
diff --git a/packages/website/public/media/patterns/avatars.svg b/packages/website/public/media/patterns/avatars.svg
new file mode 100644
index 000000000..e26584919
--- /dev/null
+++ b/packages/website/public/media/patterns/avatars.svg
@@ -0,0 +1,3 @@
+
diff --git a/packages/website/public/media/patterns/tanks.svg b/packages/website/public/media/patterns/tanks.svg
new file mode 100644
index 000000000..0a76ff759
--- /dev/null
+++ b/packages/website/public/media/patterns/tanks.svg
@@ -0,0 +1,3 @@
+
diff --git a/packages/website/public/assets/images/tools/api.webp b/packages/website/public/media/tools/banners/api.webp
similarity index 100%
rename from packages/website/public/assets/images/tools/api.webp
rename to packages/website/public/media/tools/banners/api.webp
diff --git a/packages/website/public/assets/images/tools/avatars.webp b/packages/website/public/media/tools/banners/avatars.webp
similarity index 100%
rename from packages/website/public/assets/images/tools/avatars.webp
rename to packages/website/public/media/tools/banners/avatars.webp
diff --git a/packages/website/public/assets/images/tools/changelogs.webp b/packages/website/public/media/tools/banners/changelogs.webp
similarity index 100%
rename from packages/website/public/assets/images/tools/changelogs.webp
rename to packages/website/public/media/tools/banners/changelogs.webp
diff --git a/packages/website/public/assets/images/tools/charts.webp b/packages/website/public/media/tools/banners/charts.webp
similarity index 100%
rename from packages/website/public/assets/images/tools/charts.webp
rename to packages/website/public/media/tools/banners/charts.webp
diff --git a/packages/website/public/assets/images/tools/compare.webp b/packages/website/public/media/tools/banners/compare.webp
similarity index 100%
rename from packages/website/public/assets/images/tools/compare.webp
rename to packages/website/public/media/tools/banners/compare.webp
diff --git a/packages/website/public/assets/images/tools/discord.webp b/packages/website/public/media/tools/banners/discord.webp
similarity index 100%
rename from packages/website/public/assets/images/tools/discord.webp
rename to packages/website/public/media/tools/banners/discord.webp
diff --git a/packages/website/public/assets/images/tools/embed.webp b/packages/website/public/media/tools/banners/embed.webp
similarity index 100%
rename from packages/website/public/assets/images/tools/embed.webp
rename to packages/website/public/media/tools/banners/embed.webp
diff --git a/packages/website/public/assets/images/tools/guesser.webp b/packages/website/public/media/tools/banners/guesser.webp
similarity index 100%
rename from packages/website/public/assets/images/tools/guesser.webp
rename to packages/website/public/media/tools/banners/guesser.webp
diff --git a/packages/website/public/assets/images/tools/mixer.webp b/packages/website/public/media/tools/banners/mixer.webp
similarity index 100%
rename from packages/website/public/assets/images/tools/mixer.webp
rename to packages/website/public/media/tools/banners/mixer.webp
diff --git a/packages/website/public/assets/images/tools/more.webp b/packages/website/public/media/tools/banners/more.webp
similarity index 100%
rename from packages/website/public/assets/images/tools/more.webp
rename to packages/website/public/media/tools/banners/more.webp
diff --git a/packages/website/public/assets/images/tools/performance.webp b/packages/website/public/media/tools/banners/performance.webp
similarity index 100%
rename from packages/website/public/assets/images/tools/performance.webp
rename to packages/website/public/media/tools/banners/performance.webp
diff --git a/packages/website/public/assets/images/tools/players.webp b/packages/website/public/media/tools/banners/players.webp
similarity index 100%
rename from packages/website/public/assets/images/tools/players.webp
rename to packages/website/public/media/tools/banners/players.webp
diff --git a/packages/website/public/assets/images/tools/playlist.webp b/packages/website/public/media/tools/banners/playlist.webp
similarity index 100%
rename from packages/website/public/assets/images/tools/playlist.webp
rename to packages/website/public/media/tools/banners/playlist.webp
diff --git a/packages/website/public/assets/images/tools/rating.webp b/packages/website/public/media/tools/banners/rating.webp
similarity index 100%
rename from packages/website/public/assets/images/tools/rating.webp
rename to packages/website/public/media/tools/banners/rating.webp
diff --git a/packages/website/public/assets/images/tools/session.webp b/packages/website/public/media/tools/banners/session.webp
similarity index 100%
rename from packages/website/public/assets/images/tools/session.webp
rename to packages/website/public/media/tools/banners/session.webp
diff --git a/packages/website/public/assets/images/tools/tanks.webp b/packages/website/public/media/tools/banners/tanks.webp
similarity index 100%
rename from packages/website/public/assets/images/tools/tanks.webp
rename to packages/website/public/media/tools/banners/tanks.webp
diff --git a/packages/website/public/assets/images/tools/tier-list.webp b/packages/website/public/media/tools/banners/tier-list.webp
similarity index 100%
rename from packages/website/public/assets/images/tools/tier-list.webp
rename to packages/website/public/media/tools/banners/tier-list.webp
diff --git a/packages/website/src/components/Flex/index.module.css b/packages/website/src/components/Flex/index.module.css
index 4a0203aab..fb60a78f2 100644
--- a/packages/website/src/components/Flex/index.module.css
+++ b/packages/website/src/components/Flex/index.module.css
@@ -1,3 +1,7 @@
.flex {
display: flex;
+
+ &[data-column="true"] {
+ flex-direction: column;
+ }
}
diff --git a/packages/website/src/components/Flex/index.tsx b/packages/website/src/components/Flex/index.tsx
index 7f14a4aca..dc2e6b180 100644
--- a/packages/website/src/components/Flex/index.tsx
+++ b/packages/website/src/components/Flex/index.tsx
@@ -5,14 +5,16 @@ import styles from "./index.module.css";
interface Props extends ComponentProps<"div"> {
gap?: Space;
+ column?: boolean;
}
-export function Flex({ children, className, gap, ...props }: Props) {
+export function Flex({ children, column, className, gap, ...props }: Props) {
return (
{children}
diff --git a/packages/website/src/components/Skeleton/index.module.css b/packages/website/src/components/Skeleton/index.module.css
new file mode 100644
index 000000000..c468ffd6b
--- /dev/null
+++ b/packages/website/src/components/Skeleton/index.module.css
@@ -0,0 +1,25 @@
+@keyframes skeleton-animation {
+ 0% {
+ background-color: var(--color-1);
+ }
+ 50% {
+ background-color: var(--color-2);
+ }
+ 100% {
+ background-color: var(--color-1);
+ }
+}
+
+.skeleton {
+ --color-1: var(--black-a5);
+ --color-2: var(--black-a4);
+
+ :global(:root.dark) & {
+ --color-1: var(--white-a3);
+ --color-2: var(--white-a2);
+ }
+
+ animation: skeleton-animation var(--duration-subtle) ease infinite;
+
+ border-radius: var(--space-2);
+}
diff --git a/packages/website/src/components/Skeleton/index.tsx b/packages/website/src/components/Skeleton/index.tsx
new file mode 100644
index 000000000..1a36b09b5
--- /dev/null
+++ b/packages/website/src/components/Skeleton/index.tsx
@@ -0,0 +1,9 @@
+import type { ComponentProps } from "react";
+import { classNames } from "../../ui/classNames";
+import styles from "./index.module.css";
+
+export interface SkeletonProps extends ComponentProps<"div"> {}
+
+export function Skeleton({ className, ...props }: SkeletonProps) {
+ return ;
+}
diff --git a/packages/website/src/components/TankCardSkeleton/index.module.css b/packages/website/src/components/TankCardSkeleton/index.module.css
new file mode 100644
index 000000000..44510e73e
--- /dev/null
+++ b/packages/website/src/components/TankCardSkeleton/index.module.css
@@ -0,0 +1,7 @@
+.icon {
+ /* height="5rem" */
+}
+
+.name {
+ /* height="1em" */
+}
diff --git a/packages/website/src/components/TankSearch/components/SkeletonTankCard.tsx b/packages/website/src/components/TankCardSkeleton/index.tsx
similarity index 52%
rename from packages/website/src/components/TankSearch/components/SkeletonTankCard.tsx
rename to packages/website/src/components/TankCardSkeleton/index.tsx
index 7784cf664..76559276a 100644
--- a/packages/website/src/components/TankSearch/components/SkeletonTankCard.tsx
+++ b/packages/website/src/components/TankCardSkeleton/index.tsx
@@ -1,11 +1,14 @@
import { memo, useRef } from "react";
-import { useIntersection } from "../../../hooks/useIntersection";
+import { useIntersection } from "../../hooks/useIntersection";
+import { Flex } from "../Flex";
+import { Skeleton } from "../Skeleton";
+import styles from "./index.module.css";
interface SkeletonTankCardProps {
onIntersection?: () => void;
}
-export const SkeletonTankCard = memo(
+export const TankCardSkeleton = memo(
({ onIntersection }: SkeletonTankCardProps) => {
const card = useRef(null!);
@@ -14,9 +17,9 @@ export const SkeletonTankCard = memo(
});
return (
-
-
-
+
+
+
);
},
diff --git a/packages/website/src/components/TankCardWrapper/index.module.css b/packages/website/src/components/TankCardWrapper/index.module.css
new file mode 100644
index 000000000..0c3b69244
--- /dev/null
+++ b/packages/website/src/components/TankCardWrapper/index.module.css
@@ -0,0 +1,7 @@
+.wrapper {
+ /* py="4"
+ columns="repeat(auto-fill, minmax(7rem, 1fr))"
+ flow="dense"
+ gap="4"
+ gapY="8" */
+}
diff --git a/packages/website/src/components/TankCardWrapper/index.tsx b/packages/website/src/components/TankCardWrapper/index.tsx
new file mode 100644
index 000000000..9a19d2f7c
--- /dev/null
+++ b/packages/website/src/components/TankCardWrapper/index.tsx
@@ -0,0 +1,10 @@
+import type { ComponentProps } from "react";
+import { classNames } from "../../ui/classNames";
+import styles from "./index.module.css";
+
+export function TankCardWrapper({
+ className,
+ ...props
+}: ComponentProps<"div">) {
+ return ;
+}
diff --git a/packages/website/src/components/TankSearch/components/RecentlyViewed.tsx b/packages/website/src/components/TankSearch/components/RecentlyViewed.tsx
index 96b3e071d..6ac16448e 100644
--- a/packages/website/src/components/TankSearch/components/RecentlyViewed.tsx
+++ b/packages/website/src/components/TankSearch/components/RecentlyViewed.tsx
@@ -6,7 +6,7 @@ import { TankFilters } from "../../../stores/tankFilters";
import { TankopediaPersistent } from "../../../stores/tankopediaPersistent";
import { TankSort } from "../../../stores/tankopediaSort";
import { TankCard } from "../../TankCard";
-import { TankCardWrapper } from "./TankCardWrapper";
+import { TankCardWrapper } from "../../TankCardWrapper";
const tankDefinitions = await api.tankDefinitions();
diff --git a/packages/website/src/components/TankSearch/components/TankCardWrapper.tsx b/packages/website/src/components/TankSearch/components/TankCardWrapper.tsx
deleted file mode 100644
index dbf290d3e..000000000
--- a/packages/website/src/components/TankSearch/components/TankCardWrapper.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-export function TankCardWrapper(props: GridProps) {
- return (
-
- );
-}
diff --git a/packages/website/src/components/TankSearch/index.tsx b/packages/website/src/components/TankSearch/index.tsx
index 8f73eddc1..845034b56 100644
--- a/packages/website/src/components/TankSearch/index.tsx
+++ b/packages/website/src/components/TankSearch/index.tsx
@@ -25,14 +25,14 @@ import type { MaybeSkeletonComponentProps } from "../../types/maybeSkeletonCompo
import { Callout } from "../Callout";
import { ExperimentIcon } from "../ExperimentIcon";
import { Link } from "../Link";
+import { TankCardWrapper } from "../TankCardWrapper";
import { TankSearchBar } from "../TankSearchBar";
import { TankSearchFilters } from "../TankSearchFilters";
import { Text } from "../Text";
import { TankSearchCard } from "./components/Card";
import { NoResults } from "./components/NoResults";
import { RecentlyViewed } from "./components/RecentlyViewed";
-import { SkeletonTankCard } from "./components/SkeletonTankCard";
-import { TankCardWrapper } from "./components/TankCardWrapper";
+import { TankCardSkeleton } from "../TankCardSkeleton";
import { MAX_RECENTLY_VIEWED } from "./constants";
import styles from "./index.module.css";
@@ -513,7 +513,7 @@ export const TankSearch = memo(
Math.min(PREVIEW_COUNT, sorted.length - loadedCards),
(index) => {
return (
- {
setLoadedCards((state) =>
@@ -538,7 +538,7 @@ export const TankSearch = memo(
skeleton ? DEFAULT_LOADED_CARDS : 10 + 10 * Math.random(),
),
(index) => (
-
+
),
)}
diff --git a/packages/website/src/components/TierList/Tiles.tsx b/packages/website/src/components/TierList/Tiles.tsx
index 1dabc0123..fa75715cb 100644
--- a/packages/website/src/components/TierList/Tiles.tsx
+++ b/packages/website/src/components/TierList/Tiles.tsx
@@ -6,8 +6,8 @@ import { api } from "../../core/blitzkit/api";
import { filterTanks } from "../../core/blitzkit/filterTanks";
import { TankFilters } from "../../stores/tankFilters";
import { TierList } from "../../stores/tierList";
-import { SkeletonTankCard } from "../TankSearch/components/SkeletonTankCard";
-import { TankCardWrapper } from "../TankSearch/components/TankCardWrapper";
+import { TankCardWrapper } from "../TankCardWrapper";
+import { TankCardSkeleton } from "../TankCardSkeleton";
import { TierListTile } from "./Tile";
const [tankDefinitions, gameDefinitions] = await Promise.all([
@@ -45,7 +45,7 @@ export function TierListTiles() {
{times(Math.min(PREVIEW_COUNT, sorted.length - loadedTiles), (index) => {
return (
- {
setLoadedTiles((state) => Math.min(state + 2, sorted.length));