-
+
@@ -136,7 +161,7 @@ export function StructuredDirectory({ guides }: { guides: GuideCard[] }) {
/>
-
-
elementIconUrls[option] ? : null} onChange={(values) => setParam("element", values.join(","))} />
- {
- const src = weaponTypeIconPath(option);
- return src ? : null;
- }} onChange={(values) => setParam("weapon", values.join(","))} />
- } optionText={(option) => option} onChange={(values) => setParam("rarity", values.join(","))} />
+
+
+ }>
+ ตัวกรอง{activeFilters.length ? ` (${activeFilters.length})` : ""}
+
+
+ ตัวกรองไกด์เลือกธาตุ อาวุธ หรือจำนวนดาว
+ {filterControls(true)}
+
+
+ }>ดู {filtered.length} ไกด์
+
+
+
+
+ {filterControls(false)}
+
+ พบ {filtered.length} ไกด์
+ {activeFilters.map((filter) => )}
+ {activeFilters.length ? : null}
@@ -163,30 +204,32 @@ export function StructuredDirectory({ guides }: { guides: GuideCard[] }) {
prefetch={false}
className="group rounded-xl outline-none focus-visible:ring-2 focus-visible:ring-ring"
>
-
-
+
+
-
- {guide.name}
+
+
+ {guide.name}
+
+ {guide.overview}
+
+
0 ? undefined : "invisible"}
+ className={(presence?.byGuide[guide.id] ?? 0) > 0 ? "hidden sm:block" : "hidden sm:block sm:invisible"}
>
{presence?.byGuide[guide.id] ?? 0} คน
-
- {guide.overview}
-
@@ -196,8 +239,9 @@ export function StructuredDirectory({ guides }: { guides: GuideCard[] }) {
ไม่พบไกด์
- ลองค้นหาด้วยชื่อตัวละครอื่น
+ ลองค้นหาด้วยชื่อตัวละครอื่น หรือล้างตัวกรอง
+
)}
@@ -211,6 +255,7 @@ function GuideToggleFilter({
optionLabels = {},
optionIcon,
optionText,
+ showLabels = false,
onChange,
}: {
label: string;
@@ -219,14 +264,16 @@ function GuideToggleFilter({
optionLabels?: Record;
optionIcon?: (value: string) => ReactNode;
optionText?: (value: string) => string;
+ showLabels?: boolean;
onChange: (value: string[]) => void;
}) {
return (
-
-
+
+ {showLabels ?
{label}
: null}
+
{options.map((option) => (
- {optionIcon?.(option)}{optionText?.(option)}
+ {optionIcon?.(option)}{showLabels ? optionLabels[option] ?? option : optionText?.(option)}
))}
diff --git a/components/public/structured-guide.tsx b/components/public/structured-guide.tsx
index fb8fd18..c9ed54a 100644
--- a/components/public/structured-guide.tsx
+++ b/components/public/structured-guide.tsx
@@ -713,7 +713,7 @@ function ArtifactSectionContent({
return (
-
+
Artifacts & Stats
@@ -750,12 +750,12 @@ function ArtifactSectionContent({
{" "}
-
+
{exporting ? recommendedCards : (
condition.name || `เงื่อนไข ${index + 1}`)} iconUrls={recommendedConditions.map((condition) => condition.iconUrl)}>
{recommendedCards}
diff --git a/components/public/stygian-guide.tsx b/components/public/stygian-guide.tsx
index 238b9a6..8c1bea1 100644
--- a/components/public/stygian-guide.tsx
+++ b/components/public/stygian-guide.tsx
@@ -109,12 +109,12 @@ export function StygianGuide({ schedule, catalog }: { schedule: Schedule; catalo
{([105, 110] as const).map((level) => (
-
+
{[0, 1, 2].map((position) => {
const boss = schedule.bosses.find((candidate) => candidate.level === level && candidate.position === position);
const label = boss?.name ?? `Boss ${position + 1}`;
const positionLabel = ["บน", "กลาง", "ล่าง"][position];
- return
+ return
;
})}
diff --git a/components/stygian/stygian-boss-display.tsx b/components/stygian/stygian-boss-display.tsx
index ccc904e..b26db28 100644
--- a/components/stygian/stygian-boss-display.tsx
+++ b/components/stygian/stygian-boss-display.tsx
@@ -81,7 +81,7 @@ export function StygianBossTab({
width={256}
height={256}
sizes="256px"
- className="size-64 shrink-0 object-contain"
+ className="size-20 shrink-0 object-contain sm:size-32 lg:size-48"
priority={priority}
/>
) : (
@@ -131,6 +131,7 @@ export function StygianBossCard({
+ {children}
Boss overview
@@ -156,7 +157,6 @@ export function StygianBossCard({
))}
- {children}
diff --git a/tests/public-performance.test.ts b/tests/public-performance.test.ts
index 726ec03..06842db 100644
--- a/tests/public-performance.test.ts
+++ b/tests/public-performance.test.ts
@@ -26,7 +26,7 @@ describe("public rendering performance", () => {
expect(page).not.toContain("export const instant = false");
expect(page).toContain("async function DirectoryContent()");
expect(page).toContain("await connection()");
- expect(page).toContain('fallback={}");
});
it("isolates request-time header authentication", async () => {