diff --git a/changelog.md b/changelog.md
index 729aa5a..68b88da 100644
--- a/changelog.md
+++ b/changelog.md
@@ -50,3 +50,7 @@
2025-11-08 move wiki data loading into a built workspace dependency and add provider tests wiki-data-reader item-optimizer/src/itemDataProvider.ts item-optimizer/src/__tests__
2025-11-08 add wiki snapshot refresh + parser/update scripts with hero ingestion wiki-data-reader/scripts wiki-data-reader/snapshots
2025-11-09 fetch remote item icon URLs from wiki snapshots and remove local PNGs wiki-data-reader/scripts item-optimizer/src
+
+2025-12-18 add mobile tap-to-toggle detail previews in Item Gallery item-optimizer/src/components/ItemGallery.tsx
+2025-12-19 clamp tooltip position and anchor mobile taps to item bounds item-optimizer/src/components/ItemGallery.tsx item-optimizer/src/utils/tooltipUtils.ts
+2025-12-20 keep Item Gallery detail sticky on mobile and disable tooltip taps item-optimizer/src/components/ItemGallery.tsx
diff --git a/item-optimizer/src/components/ItemGallery.tsx b/item-optimizer/src/components/ItemGallery.tsx
index b1752b6..da3a2c5 100644
--- a/item-optimizer/src/components/ItemGallery.tsx
+++ b/item-optimizer/src/components/ItemGallery.tsx
@@ -1,4 +1,4 @@
-import { useState, useMemo } from "react";
+import { useEffect, useMemo, useState, type MouseEvent } from "react";
import { useAppDispatch, useAppSelector } from "../hooks";
import { clearTooltip, setTooltip } from "../slices/tooltipSlice";
import type { Item, ItemOverride } from "../types";
@@ -36,6 +36,24 @@ export default function ItemGallery({ items, heroes, attrTypes }: Props) {
const dispatch = useAppDispatch();
const overrideVersion = useAppSelector((s) => s.input.present.overrideVersion);
const overrides = useMemo(loadLocalOverrides, [overrideVersion]);
+ const isMobile = useMemo(() => {
+ if (typeof window === "undefined") return false;
+ if (window.matchMedia?.("(pointer: coarse)")?.matches) return true;
+ return window.innerWidth < 640;
+ }, []);
+
+ useEffect(() => {
+ return () => {
+ dispatch(clearTooltip());
+ };
+ }, [dispatch]);
+
+ function handleItemClick(it: Item) {
+ setSelected(it);
+ if (isMobile) {
+ dispatch(clearTooltip());
+ }
+ }
const filtered = items.filter(
(it) =>
@@ -47,7 +65,12 @@ export default function ItemGallery({ items, heroes, attrTypes }: Props) {
Configuration
-
+
{selected && (
@@ -210,10 +233,20 @@ export default function ItemGallery({ items, heroes, attrTypes }: Props) {