/* =========================================================
   THÁCH THỨC LỤC ĐỊA MỚI — Nội dung sách (blog version)
   Sáu nhân vật chính, 22 page highlight cho blog reader.
   ========================================================= */

const CHARACTERS = {
  aldric: {
    id: "aldric",
    name: "Aldric — Vị Lãnh Chúa Cựu Địa",
    epithet: "Người đã thắng đủ để có quyền chọn rời cuộc chơi",
    tag: "Race · I · The Early Champion",
    age: 58,
    short:
      "Founder thế hệ đầu, IPO/exit đã xong. Có vốn, có uy tín, có quyền chọn không học AI — nhưng vẫn chọn học.",
    portrait: "aldric-portrait.webp",
    portraitAlt:
      "Một quý ông tóc bạc 58 tuổi, áo choàng nâu đồng có hoa văn dòng họ, một tay cầm đồng tiền vàng cổ có hai mặt, đứng trước cửa sổ thành Tarsen, ánh hoàng hôn vàng chiếu nửa mặt",
    stats: [
      ["Vốn Tích Lũy", 95],
      ["Uy Tín", 90],
      ["Phán Đoán", 88],
      ["Học Cái Mới", 45],
      ["Hành Động Trực Tiếp", 50],
    ],
    skills: [
      {
        name: "Cổ Thị Trí Tuệ",
        cost: "WIS · 60",
        desc: "Đọc chu kỳ thị trường cũ chính xác như xem bản đồ quen.",
      },
      {
        name: "Triệu Vàng Lửa",
        cost: "GLD · 40",
        desc: "Biến vốn tích lũy thành đầu tư cho thế hệ tiếp.",
      },
      {
        name: "Trao Vương Miện",
        cost: "EGO · 100",
        desc: "Biết khi nào bước xuống, biết trao cho ai. Skill đắt nhất.",
      },
    ],
    realWorld:
      "Đại diện cho founder 55–65 tuổi đã exit/IPO, hoặc CEO sắp về hưu. Có quyền chọn không bước qua Cổng Lửa, nhưng vinh quang mới của họ là biết trao kiếm cho đúng người, không phải tự cầm tiếp.",
    color: "gold",
  },

  brennon: {
    id: "brennon",
    name: "Brennon — Cựu Binh Mắc Kẹt",
    epithet: "Người có 21 năm vàng cũ, đang học cách nung lại",
    tag: "Race · II · The Trapped Veteran",
    age: 46,
    short:
      "Chỉ huy đội tuần 21 năm. Có kinh nghiệm, network, uy tín. Chưa đủ tài sản để exit. Nhân vật trung tâm cảm xúc của sách.",
    portrait: "brennon-portrait.webp",
    portraitAlt:
      "Người đàn ông 46 tuổi, râu vài ngày, mặt mệt mỏi nhưng kiên định, áo giáp da nâu vá nhiều chỗ, một bên vai đeo sổ tay da nâu cũ, ngực có viên pha lê Lửa Đỏ phát sáng yếu, đứng trước bóng Cổng Lửa xanh",
    stats: [
      ["Kinh Nghiệm", 92],
      ["Hiểu Khách Hàng", 90],
      ["Network 21 Năm", 85],
      ["AI Skill (đang lên)", 70],
      ["Khả Năng Học Lại", 75],
    ],
    skills: [
      {
        name: "Ký Ức Trận Mạc",
        cost: "MEM · 30",
        desc: "Lưu trữ 542 trận đánh trong sổ tay da. Mỗi tình huống mới đều có tham chiếu cũ.",
      },
      {
        name: "Rèn Niềm Tin Cũ",
        cost: "TRU · 50",
        desc: "Quay lại network 200 người sau 21 năm. 3–5% trở thành khách hàng class mới.",
      },
      {
        name: "Thợ Rèn Quy Trình",
        cost: "STA · 45",
        desc: "Class mới unlock ở Chương 10 — kết hợp Lửa Vàng (kinh nghiệm) với Lửa Xanh (workflow).",
      },
    ],
    realWorld:
      "Đại diện cho độc giả lý tưởng của sách — người 40–55 tuổi có chuyên môn 10+ năm, đang cảm thấy lệch nhịp với thời cuộc. Hành trình của Brennon chạy xuyên suốt 10/12 chương. Nếu bạn khóc ở Chương 6 (Đêm Dài), bạn là Brennon.",
    color: "red-wine",
  },

  kael: {
    id: "kael",
    name: "Kael — Kẻ Khai Phá Tân Địa",
    epithet: "Người chuyển map sớm, mày mò trong sương mù 21 ngày",
    tag: "Race · III · The New Map Explorer",
    age: 32,
    short:
      "Không phải founder. Không phải con quan. Học AI sớm hơn cộng đồng 18 tháng. Đi cùng Lyra (29t, Data Seer) trong cả hành trình.",
    portrait: "kael-portrait.webp",
    portraitAlt:
      "Người đàn ông 32 tuổi tóc đen undercut, một vết sẹo nhỏ trên lông mày trái, áo khoác xanh kỹ thuật với găng tay AI phát sáng, hông đeo hai viên pha lê (đỏ + tím), tay cầm mảnh kim loại xanh nhỏ, đứng trong rừng phát quang của Tân Địa",
    stats: [
      ["Tốc Độ Học", 95],
      ["Tinh Thần Thử Nghiệm", 92],
      ["AI Operation", 90],
      ["Domain Depth (cũ)", 55],
      ["Patience Với Người Chậm", 50],
    ],
    skills: [
      {
        name: "Câu Hỏi Đúng",
        cost: "INT · 25",
        desc: "Đốt Lửa Đỏ bằng câu hỏi rõ — không bằng câu lệnh. Kỹ năng prompting cốt lõi.",
      },
      {
        name: "Test Nhanh, Fail Nhanh",
        cost: "ACT · 20",
        desc: "Thử nghiệm 10 biến thể/tuần, đo lường tỉnh táo, iterate liên tục.",
      },
      {
        name: "Vẽ Bản Đồ Trống",
        cost: "WIS · 40",
        desc: "Tự khai phá vùng chưa có hướng dẫn. Mỗi thất bại = một mảnh bản đồ mới.",
      },
    ],
    realWorld:
      "Đại diện cho người 28–38 tuổi đã chuyển sang AI consultancy / AI freelance / AI workflow design. Họ thắng nhờ học trong sương mù, không vì chắc chắn. Class mục tiêu thường là AI Business Architect hoặc Workflow Smith.",
    color: "electric-blue",
  },

  sora: {
    id: "sora",
    name: "Sora — Tân Thủ Không Có Làng Cũ",
    epithet: "Sinh ra trong Tân Địa, không bao giờ thấy Cựu Địa",
    tag: "Race · IV · The Newborn Player",
    age: 22,
    short:
      "Gen Z AI-native. Tốc độ học công cụ vô địch. Thiếu kinh nghiệm thực chiến và domain depth. Chương 9 vừa thoát Lâu Đài Ảo — chính cô tự cứa cổ tay để biết đâu là thật.",
    portrait: "sora-portrait.webp",
    portraitAlt:
      "Cô gái 22 tuổi tóc đen ngắn có một lọn xanh điện ở mai trái, áo trắng-bạc kỹ thuật, vòng tay AI phát sáng cyan, một vết cứa nhỏ trên cổ tay trái còn mới, ánh mắt cảnh giác nhưng không sợ, đứng giữa rừng pha lê của Tân Địa",
    stats: [
      ["Tốc Độ Học Tool", 95],
      ["AI Native Reflex", 92],
      ["Phán Đoán (đang xây)", 55],
      ["Network", 30],
      ["Domain Depth", 35],
    ],
    skills: [
      {
        name: "Phân Biệt Thật-Giả",
        cost: "PER · 50",
        desc: "Đếm khoảng trống giữa các câu nói. Mấy người diễn không có khoảng trống.",
      },
      {
        name: "Tầm Nhìn Số",
        cost: "INT · 35",
        desc: "Đọc dashboard nhanh hơn cảm xúc. Không bị số xấu nhất thời lừa.",
      },
      {
        name: "Đau Thật Hơn Sướng Giả",
        cost: "WIL · 80",
        desc: "Chọn vết cứa thật thay vinh quang giả. Skill đặc trưng của thế hệ AI-native tỉnh táo.",
      },
    ],
    realWorld:
      "Đại diện cho Gen Z mới ra trường trong thời AI. Có công cụ tốt nhất lịch sử, nhưng phải cạnh tranh với cả ba thế hệ trên đang học AI. Lợi thế: không bị quá khứ kéo. Rủi ro: nếu thiếu chuyên môn nền, AI khuếch đại sự rỗng.",
    color: "silver-cyan",
  },

  heskel: {
    id: "heskel",
    name: "Heskel — Kẻ Giữ Cổng",
    epithet: "Người không bước qua, nhưng cũng không cho ai bước qua",
    tag: "Race · V · The Gate Blocker",
    age: 60,
    short:
      "Bá tước Cựu Địa. Bạn thân Brennon thời 17 tuổi. Đã đi xem Tân Địa 12 năm trước, sợ, quay về, và từ đó dành cả đời ngăn người khác đi. Người chọn nói dối vì sợ, không phải kẻ ác đơn giản.",
    portrait: "heskel-portrait.webp",
    portraitAlt:
      "Người đàn ông 60 tuổi gầy, mặt sắc lạnh, tóc bạc chải gel, ria mép tỉa cẩn thận, áo choàng dài đen pha tím với viền bạc, gậy đầu bạc, một cuộn giấy có dấu sáp đen lộ ra trong tay áo, đứng dưới ánh nến vàng trong đại sảnh thành Tarsen",
    stats: [
      ["Vị Thế Cũ", 90],
      ["Mạng Lưới Chính Trị", 85],
      ["Tài Hùng Biện", 88],
      ["Niềm Tin Vào Tương Lai", 10],
      ["Khả Năng Đổi Ý", 5],
    ],
    skills: [
      {
        name: "Gieo Sợ Hãi",
        cost: "VOI · 30",
        desc: "Lời nói có vị thế cũ trợ lực — dễ chạm vào nỗi sợ thầm kín của người nghe.",
      },
      {
        name: "Mỏ Neo Vị Thế",
        cost: "REP · 50",
        desc: "Dùng danh hiệu cũ thay vì lập luận. 'Tôi đã làm ngành này 40 năm' = đe dọa bằng vị thế.",
      },
      {
        name: "Chắn Cổng",
        cost: "FEA · 70",
        desc: "Đứng giữa cổng, không bước nhưng không cho ai bước. Vũ khí: cuộn giấy đen liệt kê kẻ phản bội.",
      },
    ],
    realWorld:
      "Đại diện cho lực cản tinh thần mà mọi người chuyển map đều gặp. Đời thực: KOL cũ sợ mất relevance, lãnh đạo cũ không học lại, người thân lo lắng diễn đạt thành phản đối. Quan trọng: Heskel không phải kẻ ác đơn giản — ông sợ một thế giới mà ông không quan trọng.",
    color: "dark-violet",
  },

  mentor: {
    id: "mentor",
    name: "Vị Thầy Câm",
    epithet: "Người để lại đủ câu hỏi đúng để học trò tự tìm câu trả lời",
    tag: "Race · VI · The Silent Mentor",
    age: null,
    short:
      "Không tên. Tuổi không rõ. Xuất hiện 4 lần trong cả sách. Mỗi lần để lại một mảnh giấy gấp tư với một câu duy nhất. Đại diện cho mentor thực chiến không quảng bá rầm rộ.",
    portrait: "mentor-portrait.webp",
    portraitAlt:
      "Bóng người trong áo choàng dài xám tro pha xanh thẫm, mũ trùm kéo xuống chỉ thấy bộ râu bạc và nửa khuôn mặt trầm tĩnh, một tay cầm gậy gỗ ô liu cũ, tay áo phải có mảnh giấy gấp tư lộ ra, đứng trong sương xanh ở rìa Tân Địa, ánh sáng xanh nhạt phát từ trong người ông",
    stats: [
      ["Tri Thức Cả Hai Map", 100],
      ["Sự Im Lặng", 100],
      ["Đặt Câu Hỏi Đúng", 100],
      ["Tự Quảng Bá", 0],
      ["Có Mặt Đúng Lúc", 100],
    ],
    skills: [
      {
        name: "Mảnh Giấy Gấp Tư",
        cost: "—",
        desc: "Một câu duy nhất, đặt đúng người, đúng lúc. Mỗi mảnh = một bản lề cuộc đời.",
      },
      {
        name: "Bước Đi Vô Hình",
        cost: "—",
        desc: "Vào quán rượu lúc Brennon tuyệt vọng nhất. Đi mất không ai thấy.",
      },
      {
        name: "Câu Hỏi Đánh Thức",
        cost: "—",
        desc: "Không cho câu trả lời. Đặt câu hỏi đúng — học trò tự đến đích.",
      },
    ],
    realWorld:
      "Cách tìm mentor như Vị Thầy Câm: KHÔNG hỏi 'ai dạy AI tốt nhất?'. HỎI: 'ai đã làm thật và không tự khoe?'. Người đó thường đứng đâu đó giữa hai map — đã đi qua, không cần ai biết.",
    color: "ash-grey",
  },
};

/* Hover preview map (charlink id -> { name, tag, hint }) */
const PREVIEWS = {
  aldric:  { name: "Aldric",      tag: "The Early Champion",     hint: "Đã thắng đủ để có quyền chọn rời cuộc chơi." },
  brennon: { name: "Brennon",     tag: "The Trapped Veteran",    hint: "21 năm vàng cũ, đang học cách nung lại." },
  kael:    { name: "Kael",        tag: "The New Map Explorer",   hint: "Học AI sớm 18 tháng. Đi cùng Lyra." },
  sora:    { name: "Sora",        tag: "The Newborn Player",     hint: "Gen Z AI-native, vừa thoát Lâu Đài Ảo." },
  heskel:  { name: "Heskel",      tag: "The Gate Blocker",       hint: "Người chọn nói dối vì sợ." },
  mentor:  { name: "Vị Thầy Câm", tag: "The Silent Mentor",      hint: "Một câu duy nhất, đúng người, đúng lúc." },
};

/* ===== Chapter index — 12 chương, một số có "highlight" page riêng ===== */
const CHAPTERS = {
  ch1: {
    id: "ch1",
    num: "I",
    title: "Vàng Cũ Sáng Lần Cuối",
    quote: "Cánh đồng đẹp nhất là cánh đồng cuối cùng của một thời kỳ.",
    scene: "ch1-tarsen-sunset.webp",
    sceneAlt:
      "Cánh đồng lúa vàng Tarsen lúc hoàng hôn, một người chiến binh trung niên đứng ở bìa đồng nhìn về phía Đông nơi có một ngôi sao xanh nhạt vừa hiện ra trên trời, ánh sáng vàng đồng cinematic",
    fullRef: "05_CHAPTER_01.md",
    contentKey: "ch1",
  },
  ch2: {
    id: "ch2",
    num: "II",
    title: "Mùa Đông Không Tan",
    quote: "Mùa đông này không có tuyết. Nó là một mùa của những cái cũ không còn nuôi sống.",
    scene: null,
    sceneAlt: "",
    fullRef: "06_CHAPTER_02.md",
    contentKey: "ch2",
  },
  ch3: {
    id: "ch3",
    num: "III",
    title: "Người Đi Rừng & Mảnh Kim Loại Xanh",
    quote: "Người đi rừng không bao giờ cầm bản đồ. Họ học đọc cây, đọc gió, đọc dấu chân.",
    scene: null,
    sceneAlt: "",
    fullRef: "07_CHAPTER_03.md",
    contentKey: "ch3",
  },
  ch4: {
    id: "ch4",
    num: "IV",
    title: "Phân Hóa",
    quote: "Không phải ai cũng bước qua cùng lúc. Đó không phải bi kịch — đó là sự thật.",
    scene: null,
    sceneAlt: "",
    fullRef: "08_CHAPTER_04.md",
    contentKey: "ch4",
  },
  ch5: {
    id: "ch5",
    num: "V",
    title: "Cú Bước Đầu Tiên",
    quote: "Bước đầu tiên không phải bước lớn. Là bước có thật.",
    scene: null,
    sceneAlt: "",
    fullRef: "09_CHAPTER_05.md",
    contentKey: "ch5",
  },
  ch6: {
    id: "ch6",
    num: "VI",
    title: "Đêm Dài Của Cựu Binh",
    quote: "Khó nhất không phải học AI. Khó nhất là chấp nhận kinh nghiệm cũ không bảo đảm chiến thắng nữa.",
    scene: "ch6-tavern.webp",
    sceneAlt:
      "Quán rượu cũ lúc 3 giờ sáng, Brennon ngồi một mình ở góc bàn gỗ, cốc rượu cạn, ngọn nến sắp tắt, một bóng người trong áo choàng xám-xanh ngồi đối diện đặt lên bàn mảnh kim loại xanh và mảnh giấy gấp tư, ánh nến chiaroscuro",
    fullRef: "10_CHAPTER_06.md",
    contentKey: "ch6",
  },
  ch7: {
    id: "ch7",
    num: "VII",
    title: "Bước Qua",
    quote: "Cổng không khoá. Cái khoá ở trong người.",
    scene: null,
    sceneAlt: "",
    fullRef: "11_CHAPTER_07.md",
    contentKey: "ch7",
  },
  ch8: {
    id: "ch8",
    num: "VIII",
    title: "Trận Quái Lặp",
    quote: "AI không giết nghề. Nó giết phần lặp lại của nghề.",
    scene: "ch8-quai-lap.webp",
    sceneAlt:
      "Một làng kế toán nhỏ bị bao vây bởi khối khổng lồ làm bằng giấy tờ, sổ sách, email cuộn vào nhau cao bằng hai tầng nhà, Brennon và Kael đứng ở giữa làng với Lửa Đỏ và Lửa Xanh phát sáng trong tay, dân làng dính giấy ở khắp nơi",
    fullRef: "12_CHAPTER_08.md",
    contentKey: "ch8",
  },
  ch9: {
    id: "ch9",
    num: "IX",
    title: "Lâu Đài Ảo",
    quote: "AI khuếch đại cả chuyên môn lẫn ảo tưởng. Chọn cái nào để khuếch đại là quyết định của bạn.",
    scene: "ch9-mirage-castle.webp",
    sceneAlt:
      "Một lâu đài pha lê lộng lẫy đối xứng tuyệt đối giữa thung lũng phát sáng, bên trong có nhiều người mặc áo sang trọng tự xưng AI Expert, Sora 22 tuổi đứng ở giữa sảnh tự cứa nhẹ cổ tay trái bằng mảnh kim loại xanh, lâu đài bắt đầu vỡ ở các góc",
    fullRef: "13_CHAPTER_09.md",
    contentKey: "ch9",
  },
  ch10: {
    id: "ch10",
    num: "X",
    title: "Cây Lửa",
    quote: "Năm nhánh, năm loại lửa. Đốt sai một nhánh — cả cây chết.",
    scene: null,
    sceneAlt: "",
    fullRef: "14_CHAPTER_10.md",
    contentKey: "ch10",
  },
  ch11: {
    id: "ch11",
    num: "XI",
    title: "Vương Quốc Băng",
    quote: "Doanh nghiệp không chết vì thiếu người chăm chỉ. Nó chết vì hệ thống đã đóng băng.",
    scene: "ch11-frozen-kingdom.webp",
    sceneAlt:
      "Một vương quốc lớn phủ băng, kiến trúc lộng lẫy nhưng đóng băng giữa chuyển động, Aldric già hơn đang tháo vương miện đặt xuống ghế đá rồi đặt đồng tiền vàng cổ hai mặt lên trên, băng bắt đầu tan ở các bức tường để lộ ánh sáng vàng",
    fullRef: "15_CHAPTER_11.md",
    contentKey: "ch11",
  },
  ch12: {
    id: "ch12",
    num: "XII",
    title: "Vinh Quang Mới",
    quote: "Vinh quang mới không ồn ào. Nó là một mảnh giấy gấp tư đặt đúng người, đúng lúc.",
    scene: null,
    sceneAlt: "",
    fullRef: "16_CHAPTER_12.md",
    contentKey: "ch12",
  },
};

/* ===== Phụ lục — 5 appendix ===== */
const APPENDICES = {
  appA: {
    id: "appA",
    code: "A",
    title: "Cây Lửa — Skill Tree Đầy Đủ",
    sub: "5 nhánh, 35 skill, lộ trình mở khóa",
    fullRef: "17_PHU_LUC_A_CAY_LUA.md",
    contentKey: "appA",
  },
  appB: {
    id: "appB",
    code: "B",
    title: "Class Catalog — 12 Class Mới Trong Thời AI",
    sub: "Combo, lộ trình, mức lương, prompt tạo hình",
    fullRef: "18_PHU_LUC_B_CLASS_CATALOG.md",
    contentKey: "appB",
  },
  appC: {
    id: "appC",
    code: "C",
    title: "Quest Pack 30 Ngày",
    sub: "Lộ trình thực hành từ Apprentice đến Builder",
    fullRef: "19_PHU_LUC_C_QUEST_PACK_30_NGAY.md",
    contentKey: "appC",
  },
  appD: {
    id: "appD",
    code: "D",
    title: "Bảng Thuật Ngữ Việt-Anh",
    sub: "Khái niệm dùng xuyên suốt sách",
    fullRef: "20_PHU_LUC_D_THUAT_NGU.md",
    contentKey: "appD",
  },
  appE: {
    id: "appE",
    code: "E",
    title: 'Bài Kiểm Tra "Tôi Đang Ở Map Nào?"',
    sub: "20 câu hỏi theo khung ADKAR + Radar Chart cá nhân",
    fullRef: "21_PHU_LUC_E_BAI_KIEM_TRA.md",
    contentKey: "appE",
  },
};

/* ===== Page array (highlights + 12 full chapters + 5 appendices) =====
   Layout (1-indexed for human readability — see folio in TOC):
     1–2   Bìa trước + Lời mở
     3–4   Mục lục
     5–6   Bản đồ hai lục địa
     7–8   Prologue
     9     Giới thiệu 6 nhân vật
     10–15 6 character cards
     16–17 Cây Lửa + 12 class
     18–20 3 chapter highlights (ch8, ch9, ch11)
     21    Bài kiểm tra ADKAR
     22    Closing
     23    Mục lục Toàn Văn
     24–35 12 full chapters
     36    Phụ lục — intro
     37–41 5 appendices
============================================================================ */
const PAGES = [
  /*  0 */ { kind: "cover-front",    chapter: "cover",     title: "Bìa trước" },
  /*  1 */ { kind: "cover-back",     chapter: "cover",     title: "Lời mở" },

  /*  2 */ { kind: "toc-left",       chapter: "toc",       title: "Mục lục" },
  /*  3 */ { kind: "toc-right",      chapter: "toc",       title: "Mục lục (tiếp)" },

  /*  4 */ { kind: "map-left",       chapter: "map",       title: "Bản đồ hai lục địa" },
  /*  5 */ { kind: "map-right",      chapter: "map",       title: "Chú giải" },

  /*  6 */ { kind: "prologue-1",     chapter: "prologue",  title: "Vàng Cũ Sáng Lần Cuối" },
  /*  7 */ { kind: "prologue-2",     chapter: "prologue",  title: "Bạn đang ở map nào?" },

  /*  8 */ { kind: "characters-intro", chapter: "characters", title: "Sáu người chơi của vương quốc" },
  /*  9 */ { kind: "character-card", character: "aldric",  chapter: "characters", title: "Aldric" },
  /* 10 */ { kind: "character-card", character: "brennon", chapter: "characters", title: "Brennon" },
  /* 11 */ { kind: "character-card", character: "kael",    chapter: "characters", title: "Kael" },
  /* 12 */ { kind: "character-card", character: "sora",    chapter: "characters", title: "Sora" },
  /* 13 */ { kind: "character-card", character: "heskel",  chapter: "characters", title: "Heskel" },
  /* 14 */ { kind: "character-card", character: "mentor",  chapter: "characters", title: "Vị Thầy Câm" },

  /* 15 */ { kind: "theory-1",       chapter: "theory",    title: "Cây Lửa — 5 nhánh kỹ năng" },
  /* 16 */ { kind: "theory-2",       chapter: "theory",    title: "12 class mới trong thời AI" },

  /* 17 */ { kind: "chapter-highlight", chapterId: "ch8",  chapter: "story", title: "Trận Quái Lặp" },
  /* 18 */ { kind: "chapter-highlight", chapterId: "ch9",  chapter: "story", title: "Trận Lâu Đài Ảo" },
  /* 19 */ { kind: "chapter-highlight", chapterId: "ch11", chapter: "story", title: "Trận Vương Quốc Băng" },

  /* 20 */ { kind: "radar-test",     chapter: "test",      title: "Bài kiểm tra ADKAR" },
  /* 21 */ { kind: "closing",        chapter: "closing",   title: "Còn bạn — bạn đang ở map nào?" },

  /* 22 */ { kind: "fulltext-intro", chapter: "fulltext",  title: "Toàn Văn — 12 Chương + 5 Phụ Lục" },

  /* 23 */ { kind: "chapter-full",   chapterId: "ch1",  chapter: "fulltext", title: "Chương 1 · Vàng Cũ Sáng Lần Cuối" },
  /* 24 */ { kind: "chapter-full",   chapterId: "ch2",  chapter: "fulltext", title: "Chương 2 · Mùa Đông Không Tan" },
  /* 25 */ { kind: "chapter-full",   chapterId: "ch3",  chapter: "fulltext", title: "Chương 3 · Người Đi Rừng & Mảnh Kim Loại Xanh" },
  /* 26 */ { kind: "chapter-full",   chapterId: "ch4",  chapter: "fulltext", title: "Chương 4 · Phân Hóa" },
  /* 27 */ { kind: "chapter-full",   chapterId: "ch5",  chapter: "fulltext", title: "Chương 5 · Cú Bước Đầu Tiên" },
  /* 28 */ { kind: "chapter-full",   chapterId: "ch6",  chapter: "fulltext", title: "Chương 6 · Đêm Dài Của Cựu Binh" },
  /* 29 */ { kind: "chapter-full",   chapterId: "ch7",  chapter: "fulltext", title: "Chương 7 · Bước Qua" },
  /* 30 */ { kind: "chapter-full",   chapterId: "ch8",  chapter: "fulltext", title: "Chương 8 · Trận Quái Lặp" },
  /* 31 */ { kind: "chapter-full",   chapterId: "ch9",  chapter: "fulltext", title: "Chương 9 · Lâu Đài Ảo" },
  /* 32 */ { kind: "chapter-full",   chapterId: "ch10", chapter: "fulltext", title: "Chương 10 · Cây Lửa" },
  /* 33 */ { kind: "chapter-full",   chapterId: "ch11", chapter: "fulltext", title: "Chương 11 · Vương Quốc Băng" },
  /* 34 */ { kind: "chapter-full",   chapterId: "ch12", chapter: "fulltext", title: "Chương 12 · Vinh Quang Mới" },

  /* 35 */ { kind: "appendix-intro", chapter: "appendix",  title: "Phụ Lục — 5 quyển kèm" },
  /* 36 */ { kind: "appendix-full",  appendixId: "appA",   chapter: "appendix", title: "Phụ Lục A · Cây Lửa Skill Tree" },
  /* 37 */ { kind: "appendix-full",  appendixId: "appB",   chapter: "appendix", title: "Phụ Lục B · Class Catalog" },
  /* 38 */ { kind: "appendix-full",  appendixId: "appC",   chapter: "appendix", title: "Phụ Lục C · Quest Pack 30 Ngày" },
  /* 39 */ { kind: "appendix-full",  appendixId: "appD",   chapter: "appendix", title: "Phụ Lục D · Thuật Ngữ Việt-Anh" },
  /* 40 */ { kind: "appendix-full",  appendixId: "appE",   chapter: "appendix", title: "Phụ Lục E · Bài Kiểm Tra Map" },
];

/* ===== TOC structure ===== */
const TOC = [
  { chapter: "prologue", label: "Lời Tiên Tri",                   roman: "I",   page: 6 },
  { chapter: "map",      label: "Bản Đồ Hai Lục Địa",             roman: "II",  page: 4 },
  { chapter: "characters", label: "Sáu Người Chơi",               roman: "III", page: 8, subs: [
      { label: "— Aldric · Lãnh Chúa Cựu Địa", page: 9,  id: "aldric" },
      { label: "— Brennon · Cựu Binh Mắc Kẹt", page: 10, id: "brennon" },
      { label: "— Kael · Kẻ Khai Phá",         page: 11, id: "kael" },
      { label: "— Sora · Tân Thủ AI-Native",   page: 12, id: "sora" },
      { label: "— Heskel · Kẻ Giữ Cổng",       page: 13, id: "heskel" },
      { label: "— Vị Thầy Câm",                page: 14, id: "mentor" },
  ]},
  { chapter: "theory",   label: "Cây Lửa & Class Mới",            roman: "IV",  page: 15 },
  { chapter: "story",    label: "Ba Trận Đánh Lớn",               roman: "V",   page: 17, subs: [
      { label: "— Trận Quái Lặp",         page: 17, chid: "ch8" },
      { label: "— Trận Lâu Đài Ảo",       page: 18, chid: "ch9" },
      { label: "— Trận Vương Quốc Băng",  page: 19, chid: "ch11" },
  ]},
  { chapter: "test",     label: "Bạn Đang Ở Map Nào?",            roman: "VI",  page: 20 },
  { chapter: "fulltext", label: "Toàn Văn 12 Chương",             roman: "VII", page: 22, subs: [
      { label: "— Ch.1 · Vàng Cũ Sáng Lần Cuối",            page: 23, chfull: "ch1" },
      { label: "— Ch.2 · Mùa Đông Không Tan",               page: 24, chfull: "ch2" },
      { label: "— Ch.3 · Người Đi Rừng & Kim Loại Xanh",    page: 25, chfull: "ch3" },
      { label: "— Ch.4 · Phân Hóa",                         page: 26, chfull: "ch4" },
      { label: "— Ch.5 · Cú Bước Đầu Tiên",                 page: 27, chfull: "ch5" },
      { label: "— Ch.6 · Đêm Dài Của Cựu Binh",             page: 28, chfull: "ch6" },
      { label: "— Ch.7 · Bước Qua",                         page: 29, chfull: "ch7" },
      { label: "— Ch.8 · Trận Quái Lặp",                    page: 30, chfull: "ch8" },
      { label: "— Ch.9 · Lâu Đài Ảo",                       page: 31, chfull: "ch9" },
      { label: "— Ch.10 · Cây Lửa",                         page: 32, chfull: "ch10" },
      { label: "— Ch.11 · Vương Quốc Băng",                 page: 33, chfull: "ch11" },
      { label: "— Ch.12 · Vinh Quang Mới",                  page: 34, chfull: "ch12" },
  ]},
  { chapter: "appendix", label: "Phụ Lục",                        roman: "VIII", page: 35, subs: [
      { label: "— A · Cây Lửa Skill Tree",         page: 36, appfull: "appA" },
      { label: "— B · Class Catalog",              page: 37, appfull: "appB" },
      { label: "— C · Quest Pack 30 Ngày",         page: 38, appfull: "appC" },
      { label: "— D · Thuật Ngữ Việt-Anh",         page: 39, appfull: "appD" },
      { label: "— E · Bài Kiểm Tra Map",           page: 40, appfull: "appE" },
  ]},
];

const TOTAL_PAGES = PAGES.length;

/* Backward-compat alias for old code that referenced RACES */
const RACES = CHARACTERS;

Object.assign(window, {
  PAGES, CHARACTERS, RACES, TOC, PREVIEWS, CHAPTERS, APPENDICES, TOTAL_PAGES,
});
