diff --git a/.agents/skills/fuzzy-search/SKILL.md b/.agents/skills/fuzzy-search/SKILL.md
index 0bfe9ab..02eee85 100644
--- a/.agents/skills/fuzzy-search/SKILL.md
+++ b/.agents/skills/fuzzy-search/SKILL.md
@@ -13,7 +13,7 @@ Use this project’s shared search implementation for finding entities by name o
- Attempt fuzzy matching only when the entire eligible collection has no direct results. Do not decide fallback independently for each item.
- Restrict fuzzy candidates to names, aliases, and individual whitespace-separated words. Keep overview prose and internal keys available for existing direct searches, but exclude them from fuzzy candidates.
- Normalize with NFC, trim, lowercase, and compare Unicode code points. Keep queries shorter than four code points strict.
-- Use bounded optimal-string-alignment Damerau–Levenshtein distance, including adjacent transpositions. Allow one edit for 4–7 code points and two for longer queries, capped at 25% of query length. Rank by edit distance with stable source-order ties.
+- Use bounded optimal-string-alignment Damerau-Levenshtein distance, including adjacent transpositions. Allow one edit for 4-7 code points and two for longer queries, capped at 25% of query length. Rank by edit distance with stable source-order ties.
- Empty queries return the eligible collection. Display fuzzy results without an explanatory message.
## Reuse the project implementation
diff --git a/Plan.md b/Plan.md
index 89999a8..ec35715 100644
--- a/Plan.md
+++ b/Plan.md
@@ -20,11 +20,11 @@ Remove Guide moves content to a recoverable Trash before permanent deletion.
## Structured content
-- Weapons: catalog weapon, R1–R5, overall percent and/or personal percent.
+- Weapons: catalog weapon, R1-R5, overall percent and/or personal percent.
- Artifacts: multiple named ranking groups, one-set or two-set rows, percent,
up to two main stats per slot, ordered substats, targets, NA/E/Q priority and
levels, and an optional note.
-- Constellations: C1–C6 description and cumulative performance against C0=100%.
+- Constellations: C1-C6 description and cumulative performance against C0=100%.
- Team Calc: multiple four-character teams, raw damage, calculated member
shares, rotation duration, total DPS, and combo text.
- Extra: multiple sections of image-first rows with heading, short body, an
diff --git a/app/admin/[character]/page.tsx b/app/admin/[character]/page.tsx
index c85a5dd..cb5724f 100644
--- a/app/admin/[character]/page.tsx
+++ b/app/admin/[character]/page.tsx
@@ -19,7 +19,7 @@ import { navigationIconPath } from "@/lib/navigation";
const sections = [
{ slug: "weapon", title: "Weapons", description: "จัดอันดับอาวุธ Refinement และเปอร์เซ็นต์" },
{ slug: "artifact", title: "Artifacts & Stats", description: "ชุด Artifact, Main/Sub Stats และ Talent" },
- { slug: "constellations", title: "Constellations", description: "รายละเอียด C1–C6 และเปอร์เซ็นต์สะสม" },
+ { slug: "constellations", title: "Constellations", description: "รายละเอียด C1-C6 และเปอร์เซ็นต์สะสม" },
{ slug: "team", title: "Team Calc", description: "ตัวละคร 4 ตัว Damage share, DPS และ Combo" },
];
diff --git a/app/analytics/page.tsx b/app/analytics/page.tsx
new file mode 100644
index 0000000..889cef1
--- /dev/null
+++ b/app/analytics/page.tsx
@@ -0,0 +1,45 @@
+import type { Metadata } from "next";
+import { Suspense } from "react";
+import { connection } from "next/server";
+
+import { AnalyticsDashboard } from "@/components/public/analytics-dashboard";
+import { SiteFooter } from "@/components/public/site-footer";
+import { SiteHeader } from "@/components/public/site-header";
+import { Skeleton } from "@/components/ui/skeleton";
+import { getCachedPublicAnalytics } from "@/lib/cache/analytics";
+
+export const metadata: Metadata = {
+ title: "วิเคราะห์ข้อมูล",
+ description: "อันดับตัวละคร อาวุธ และอาร์ติแฟกต์ที่ใช้และแนะนำบ่อยที่สุดในไกด์สาธารณะ พร้อมเลือกข้อมูล Stygian",
+};
+
+async function AnalyticsContent() {
+ await connection();
+ return ;
+}
+
+function AnalyticsSkeleton() {
+ return
+
+
+ {Array.from({ length: 6 }, (_, index) => )}
+
+
+ {Array.from({ length: 3 }, (_, index) => )}
+
+
;
+}
+
+export default function AnalyticsPage() {
+ return ;
+}
diff --git a/app/sitemap.ts b/app/sitemap.ts
index fb6bec7..9b8cf66 100644
--- a/app/sitemap.ts
+++ b/app/sitemap.ts
@@ -11,6 +11,7 @@ export default async function sitemap(): Promise {
return [
{ url: siteUrl },
{ url: `${siteUrl}/stygian` },
+ { url: `${siteUrl}/analytics` },
...guides.map((guide) => ({
url: `${siteUrl}/${encodeURIComponent(guide.slug)}`,
})),
diff --git a/components/admin/constellation-image-generator.tsx b/components/admin/constellation-image-generator.tsx
index 1458689..0c7c4db 100644
--- a/components/admin/constellation-image-generator.tsx
+++ b/components/admin/constellation-image-generator.tsx
@@ -101,7 +101,7 @@ export function ConstellationImageGenerator({
ข้อมูล Constellation
- กรอกดาเมจสะสม C1–C6 เทียบกับ C0 ที่ 100%
+ กรอกดาเมจสะสม C1-C6 เทียบกับ C0 ที่ 100%