import Image from "@/components/ui/resilient-image"; import localFont from "next/font/local"; import Link from "next/link"; import { ArrowUpRightIcon } from "lucide-react"; import { Fragment, type ReactNode } from "react"; import { Badge } from "@/components/ui/badge"; import { ComparisonContext } from "@/components/public/comparison-context"; 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 { GuidePageShell, publicSectionTitle } from "@/components/public/guide-page-shell"; 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 { 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, extraSheetMergeMap, } from "@/lib/guides/extra-sheet"; import { publicGuideSections } from "@/lib/guides/public-sections"; import { cn } from "@/lib/utils"; import { commentNavigationSection } from "@/lib/comments/navigation"; const kanitSemiBold = localFont({ src: "../../public/Kanit-SemiBold.ttf", weight: "600", }); export function publicSections(guide: PublicGuide) { return publicGuideSections(guide); } export function StructuredGuideShell({ guide, section, preview = false, }: { guide: PublicGuide; section?: string; preview?: boolean; }) { const guideSections = publicSections(guide); const sections = preview ? guideSections : [...guideSections, commentNavigationSection(guide.id)]; const baseHref = preview ? `/admin/${guide.characterKey}/preview` : `/${guide.slug}`; return ( {section ? ( ) : ( )} ); } function GuideOverview({ guide, sections, baseHref, }: { guide: PublicGuide; sections: ReturnType; baseHref: string; }) { 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) => (