import Image from "next/image"; import Link from "next/link"; import { ArrowLeftIcon, ArrowUpRightIcon } from "lucide-react"; import type { ReactNode } from "react"; import { Badge } from "@/components/ui/badge"; import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; import { Button } from "@/components/ui/button"; import { Card, CardAction, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Separator } from "@/components/ui/separator"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { SiteFooter } from "@/components/public/site-footer"; import { SiteHeader } from "@/components/public/site-header"; import { ScrollableNav } from "@/components/public/scrollable-nav"; import { TeamArtifactIcon, TeamSearch } from "@/components/public/team-search"; import { GuideImageExport } from "@/components/public/guide-image-export"; import { ExportText } from "@/components/public/export-language"; import { WeaponImageExport } from "@/components/public/weapon-image-export"; import { WeaponDisplayMode, WeaponDisplayModeProvider } from "@/components/public/weapon-display-mode"; import { ArtifactImageExport } from "@/components/public/artifact-image-export"; import { GuideExportBranding } from "@/components/public/guide-export-branding"; import { ConstellationImage } from "@/components/public/constellation-image"; import { LunarisText } from "@/components/public/lunaris-text"; import { ConditionSwitcher } from "@/components/public/condition-switcher"; import { MaterialPoster } from "@/components/public/material-poster"; import { RichTextContent } from "@/components/rich-text-content"; import { LiveRefresh } from "@/components/live-refresh"; import { rarityGradientClass, rarityTextClass } from "@/lib/catalog/rarity"; import { elementIconFilter } from "@/lib/catalog/element"; import type { PublicGuide } from "@/lib/guides/queries"; import { artifactTierCount } from "@/lib/guides/artifacts"; import { navigationIconPath } from "@/lib/navigation"; import { normalizeTargetStat, recommendedStatElement, recommendedStatIconName, statPriorityColorClass, targetStatIconName, } from "@/lib/guides/stats"; import { normalizeTalentPriorities, talentRelationSymbol, } from "@/lib/guides/talents"; import { parseYouTubeUrl } from "@/lib/guides/youtube"; import { normalizeExtraRichText } from "@/lib/rich-text"; import { DEFAULT_EXTRA_SHEET_COLUMN_WIDTH, extraSheetUsedRange, } from "@/lib/guides/extra-sheet"; import { publicGuideSections } from "@/lib/guides/public-sections"; import { cn } from "@/lib/utils"; export function publicSections(guide: PublicGuide) { return publicGuideSections(guide); } function publicSectionTitle(slug: string, fallback: string): string { if (slug === "weapon") return "อาวุธ"; if (slug === "artifact") return "อาร์ติแฟกต์และค่าสถานะ"; if (slug === "constellations") return "กลุ่มดาว"; if (slug === "team") return "คำนวณทีม"; return fallback; } export function StructuredGuideShell({ guide, section, preview = false, }: { guide: PublicGuide; section?: string; preview?: boolean; }) { const sections = publicSections(guide); const baseHref = preview ? `/admin/${guide.characterKey}/preview` : `/${guide.slug}`; const currentPageTitle = section ? (sections.find((item) => item.slug === section)?.title ?? section) : "Overview"; return (
{preview ? (
Preview หน้านี้แสดงข้อมูลที่บันทึกล่าสุดและเปิดดูได้เฉพาะผู้ดูแล
) : null}
{guide.name}

{guide.name}

{currentPageTitle}

Overview {sections.map((item) => ( {navigationIconPath(item.slug) ? ( ) : null} {item.title} ))}
{section ? ( ) : ( )}
); } function GuideOverview({ guide, sections, }: { guide: PublicGuide; sections: ReturnType; }) { const youtubeVideos = guide.youtubeUrls.flatMap((url) => { const video = parseYouTubeUrl(url); return video ? [video] : []; }); return (

ภาพรวมแนวทาง

{guide.name}

{guide.overview}

อัปเดต {new Date(guide.publishedAt ?? guide.updatedAt).toLocaleDateString("th-TH")}
{`ไกด์
{guide.posterArtUrl || youtubeVideos.length ? ( <> {guide.posterArtUrl ? (
) : null} {youtubeVideos.length ? (
{youtubeVideos.map((youtubeVideo, index) => (