{"id":34970,"date":"2026-06-03T21:46:17","date_gmt":"2026-06-04T03:46:17","guid":{"rendered":"https:\/\/join-us.esf.edu.hk\/?page_id=34970"},"modified":"2026-06-04T20:27:57","modified_gmt":"2026-06-05T02:27:57","slug":"earlyyearsnewapproach","status":"publish","type":"page","link":"https:\/\/join-us.esf.edu.hk\/zh-hant\/earlyyearsnewapproach\/","title":{"rendered":"\u82f1\u57fa\u5e7c\u5152\u6559\u80b2\u7684\u65b0\u65b9\u5f0f"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"34970\" class=\"elementor elementor-34970\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9d87b37 e-con-full e-flex e-con e-parent\" data-id=\"9d87b37\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-e14d245 e-con-full e-flex e-con e-child\" data-id=\"e14d245\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-738c831 e-con-full e-flex e-con e-child\" data-id=\"738c831\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-052a92d elementor-widget elementor-widget-text-editor\" data-id=\"052a92d\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<h2 style=\"font-size: 45px; line-height: 1.2;\"><b>\u8b93\u6bcf\u4e00\u523b\u90fd<\/b><b><span style=\"color: #890234;\">\u6709\u610f\u7fa9<\/span><\/b><\/h2><p><span style=\"font-weight: 400;\">\u5b69\u5b50\u5728\u8ab2\u5802\u4e0a\u7684\u6642\u5149\uff0c\u662f\u4ed6\u5011\u767c\u6398\u8208\u8da3\u3001\u638c\u63e1\u65b0\u6280\u80fd\u3001\u57f9\u990a\u5b78\u7fd2\u71b1\u60c5\u7684\u7d55\u4f73\u6a5f\u6703\u3002\u6211\u5011\u5168\u65b0\u7684K1\u81f3Y13\u4e00\u689d\u9f8d\u8ab2\u7a0b\uff0c\u80fd\u8b93\u5b69\u5b50\u5145\u5206\u5229\u7528\u6bcf\u4e00\u523b\u3002<br \/><\/span><\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-e5bc109 e-con-full e-flex e-con e-child\" data-id=\"e5bc109\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-bbf9fb7 elementor-widget elementor-widget-button\" data-id=\"bbf9fb7\" data-element_type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/join-us.esf.edu.hk\/zh-hant\/admissions\/\" target=\"_blank\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">\u5982\u4f55\u7533\u8acb<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-623431d elementor-button-info elementor-widget elementor-widget-button\" data-id=\"623431d\" data-element_type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/join-us.esf.edu.hk\/wp-content\/uploads\/2026\/06\/260604-ESF-pathway-TC-v3.pdf%20\" target=\"_blank\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">\u4e0b\u8f09\u6307\u5357<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-b1049c1 e-con-full e-flex e-con e-child\" data-id=\"b1049c1\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2259f72 elementor-widget__width-inherit elementor-widget elementor-widget-jet-video\" data-id=\"2259f72\" data-element_type=\"widget\" data-widget_type=\"jet-video.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<div class=\"elementor-jet-video jet-elements\">\n<div class=\"jet-video jet-video--fa5-compat jet-video-aspect-ratio jet-video-aspect-ratio--16-9\" data-settings=\"{&quot;lightbox&quot;:false,&quot;autoplay&quot;:false}\"><iframe class=\"jet-video-iframe\" allowfullscreen allow=\"autoplay;encrypted-media\" title=\"youtube\u8996\u983b\u64ad\u653e\u5668\" data-lazy-load=\"https:\/\/www.youtube.com\/embed\/uAOBW_eMjO4?feature=oembed&amp;start&amp;end&amp;wmode=opaque&amp;autoplay=0&amp;loop=0&amp;controls=1&amp;mute=0&amp;rel=0&amp;modestbranding=0\"><\/iframe>\n<div class=\"jet-video__overlay jet-video__overlay--custom-bg\" style=\"background-image: url(https:\/\/join-us.esf.edu.hk\/wp-content\/uploads\/2026\/06\/WhatsApp-Image-2026-05-28-at-12.54.46.jpeg);\">\n<div class=\"jet-video__play-button\" role=\"button\" tabindex=\"0\" aria-label=\"Video play button\"><span class=\"jet-elements-icon jet-video__play-button-icon\"><i aria-hidden=\"true\" class=\"fas fa-play\"><\/i><\/span>\t<span class=\"elementor-screen-only\">Play Video<\/span>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-295e227 elementor-widget elementor-widget-text-editor\" data-id=\"295e227\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div style=\"font-size: 0.7em;\">\u77ed\u7247\uff1a\u82f1\u57fa\u5e7c\u5152\u6559\u80b2\u7684\u65b0\u65b9\u91dd<\/div>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-1d5d880 e-flex e-con-boxed e-con e-parent\" data-id=\"1d5d880\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6455d30 elementor-widget elementor-widget-text-editor\" data-id=\"6455d30\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<h2><span style=\"font-weight: 400;\">\u5353\u8d8a<\/span><span style=\"font-weight: 400;\">\u5e7c\u5152<\/span><span style=\"font-weight: 400;\">\u6559\u80b2\u4e4b\u9858\u666f<\/span><\/h2>\n<p style=\"margin-bottom: 0.2em;\">\u6211\u5011\u91cd\u65b0\u8a2d\u8a08\u4e86\u5b78\u6821\u67b6\u69cb\uff0c\u65e8\u5728\u8b93\u5bb6\u9577\u5b89\u5fc3\uff0c\u70ba\u5b78\u751f\u63d0\u4f9bK1\u81f3Y13\u7684\u570b\u969b\u9802\u5c16\u6559\u80b2\u3002<\/p>\n<br>\n<p style=\"margin-bottom: 0.2em;\">2026\u5e749\u6708\u8d77\uff0c\u5bb6\u9577\u70ba\u5b50\u5973\u5831\u8b80\u82f1\u57fa\u5e7c\u7a1a\u5712K1\u6642\uff0c\u5c07\u7372\u77e5\u6240\u5c6c\u7684\u76f8\u95dc\u5c0f\u5b78\u3002<\/p>\n<p style=\"margin-bottom: 0.2em;\">\u5b50\u5973\u5728\u5e7c\u7a1a\u5712\u7562\u696d\u5f8c\uff0c\u53ef\u78ba\u4fdd\u7372\u76f8\u95dc\u5c0f\u5b78\u7684\u5b78\u4f4d\u3002<\/p>\n<p style=\"margin-bottom: 0.2em;\">\u4e2d\u5b78\u5df2\u8207\u5c0f\u5b78\u929c\u63a5\uff0c\u5bb6\u9577\u80fd\u5c0d\u5b69\u5b50K1\u5230Y13\u7684\u6559\u80b2\u8def\u5f91\u5b8c\u5168\u653e\u5fc3\u3002<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c3b25e2 e-flex e-con-boxed e-con e-parent\" data-id=\"c3b25e2\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-53a9bdb elementor-widget elementor-widget-html\" data-id=\"53a9bdb\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<!-- ============================================================\n     ESF \"All-Through Pathway\" benefits cards \u2014 BILINGUAL\n     Self-contained + scoped under .esf-benefits so it is safe to\n     paste straight into an Elementor HTML widget.\n\n     LANGUAGE LOGIC:\n     - If window.location.href contains \"zh-hant\"  -> Traditional Chinese\n     - Otherwise                                   -> English\n     Both languages live in data-en \/ data-zh attributes; a small\n     scoped script picks the right one at load.\n\n     PREVIEW TIP: to force a language while testing (e.g. inside the\n     Elementor editor where the URL has no \/zh-hant\/), set\n     FORCE_LANG below to 'zh' or 'en'. Leave it null in production.\n     ============================================================ -->\n<section class=\"esf-benefits\" aria-label=\"Benefits of the ESF all-through pathway\">\n  <style>\n    .esf-benefits{\n      \/* ---- design tokens (edit here) ---- *\/\n      --esf-maroon:#8b1538;\n      --esf-blush:#fbe9ee;\n      --esf-heading:#2b2a3d;\n      --esf-body:#4b4b55;\n      --esf-card-bg:#ffffff;\n      --esf-card-border:#e6e6ea;\n      --esf-card-border-hover:#d6b3bf;\n      --esf-radius:18px;\n      --esf-gap:24px;\n      \/* CJK fonts appended so Traditional Chinese headings\/body render cleanly on HK devices *\/\n      --esf-serif:\"Georgia\",\"Times New Roman\",\"Noto Serif HK\",\"Noto Serif TC\",\"Source Han Serif HK\",serif;\n      --esf-sans:-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"PingFang HK\",\"Noto Sans HK\",\"Microsoft JhengHei\",Helvetica,Arial,sans-serif;\n\n      box-sizing:border-box;\n      display:grid;\n      grid-template-columns:repeat(4,minmax(0,1fr));\n      gap:var(--esf-gap);\n      max-width:1280px;\n      margin-inline:auto;\n      padding:8px;\n    }\n    .esf-benefits *{box-sizing:border-box;}\n\n    .esf-benefits .esf-card{\n      background:var(--esf-card-bg);\n      border:1px solid var(--esf-card-border);\n      border-radius:var(--esf-radius);\n      padding:30px 26px;\n      display:flex;\n      flex-direction:column;\n      transition:transform .25s ease, box-shadow .25s ease, border-color .25s ease;\n      opacity:0;\n      transform:translateY(14px);\n      animation:esf-rise .55s ease forwards;\n    }\n    .esf-benefits .esf-card:nth-child(1){animation-delay:.05s;}\n    .esf-benefits .esf-card:nth-child(2){animation-delay:.13s;}\n    .esf-benefits .esf-card:nth-child(3){animation-delay:.21s;}\n    .esf-benefits .esf-card:nth-child(4){animation-delay:.29s;}\n\n    .esf-benefits .esf-card:hover{\n      transform:translateY(-4px);\n      border-color:var(--esf-card-border-hover);\n      box-shadow:0 14px 30px -18px rgba(139,21,56,.45);\n    }\n\n    .esf-benefits .esf-icon{\n      width:56px;\n      height:56px;\n      border-radius:14px;\n      background:var(--esf-blush);\n      color:var(--esf-maroon);\n      display:flex;\n      align-items:center;\n      justify-content:center;\n      margin-bottom:22px;\n      flex:0 0 auto;\n    }\n    .esf-benefits .esf-icon svg{width:28px;height:28px;display:block;}\n\n    .esf-benefits .esf-card h3{\n      font-family:var(--esf-serif);\n      font-weight:700;\n      font-size:1.4rem;\n      line-height:1.25;\n      color:var(--esf-heading);\n      margin:0 0 14px;\n    }\n    .esf-benefits .esf-card p{\n      font-family:var(--esf-sans);\n      font-size:1rem;\n      line-height:1.55;\n      color:var(--esf-body);\n      margin:0;\n    }\n\n    @keyframes esf-rise{to{opacity:1;transform:translateY(0);}}\n    @media (prefers-reduced-motion:reduce){\n      .esf-benefits .esf-card{animation:none;opacity:1;transform:none;}\n    }\n\n    \/* ---- responsive: 4 -> 2 -> 1 ---- *\/\n    @media (max-width:1024px){\n      .esf-benefits{grid-template-columns:repeat(2,minmax(0,1fr));}\n    }\n    @media (max-width:600px){\n      .esf-benefits{grid-template-columns:1fr;}\n    }\n  <\/style>\n\n  <!-- Card 1 -->\n  <article class=\"esf-card\">\n    <span class=\"esf-icon\" aria-hidden=\"true\">\n      <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M23 12l-2.44-2.79.34-3.69-3.61-.82-1.89-3.2L12 2.96 8.6 1.5 6.71 4.69 3.1 5.5l.34 3.7L1 12l2.44 2.79-.34 3.7 3.61.82 1.89 3.2L12 21.04l3.4 1.46 1.89-3.19 3.61-.82-.34-3.69L23 12zm-12.91 4.72l-3.8-3.81 1.48-1.48 2.32 2.33 5.85-5.87 1.48 1.48-7.33 7.35z\"\/><\/svg>\n    <\/span>\n    <h3 data-en=\"Absolute Certainty\" data-zh=\"\u7d55\u5c0d\u4fdd\u969c\"><\/h3>\n    <p data-en=\"Enjoy a guaranteed primary and secondary place for your child if they enrol in an ESF kindergarten.\"\n       data-zh=\"\u53ea\u8981\u5165\u8b80\u82f1\u57fa\u5e7c\u7a1a\u5712\uff0c\u5373\u53ef\u78ba\u4fdd\u5c0f\u5b78\u548c\u4e2d\u5b78\u5b78\u4f4d\u3002\"><\/p>\n  <\/article>\n\n  <!-- Card 2 -->\n  <article class=\"esf-card\">\n    <span class=\"esf-icon\" aria-hidden=\"true\">\n      <img decoding=\"async\" src=\"https:\/\/join-us.esf.edu.hk\/wp-content\/uploads\/2026\/05\/2_seamless_journey_route.svg\" alt=\"\" width=\"28\" height=\"28\">\n    <\/span>\n    <h3 data-en=\"Seamless Journey\" data-zh=\"\u7121\u7e2b\u929c\u63a5\"><\/h3>\n    <p data-en=\"The transition between phases will be better managed than ever before \u2013 as our teachers take collaboration to the next level.\"\n       data-zh=\"\u5404\u5b78\u6bb5\u7684\u904e\u6e21\u6bd4\u4ee5\u5f80\u66f4\u52a0\u9806\u66a2\uff0c\u6559\u5e2b\u9593\u9054\u6210\u66f4\u9ad8\u6c34\u6e96\u7684\u5354\u4f5c\u3002\"><\/p>\n  <\/article>\n\n  <!-- Card 3 -->\n  <article class=\"esf-card\">\n    <span class=\"esf-icon\" aria-hidden=\"true\">\n      <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 12.75c1.63 0 3.07.39 4.24.9 1.08.48 1.76 1.56 1.76 2.73V18H6v-1.61c0-1.18.68-2.26 1.76-2.73 1.17-.52 2.61-.91 4.24-.91zM4 13c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm1.13 1.1c-.37-.06-.74-.1-1.13-.1-.99 0-1.93.21-2.78.58A2.01 2.01 0 0 0 0 16.43V18h4.5v-1.61c0-.83.23-1.61.63-2.29zM20 13c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm4 3.43c0-.81-.48-1.53-1.22-1.85A6.95 6.95 0 0 0 20 14c-.39 0-.76.04-1.13.1.4.68.63 1.46.63 2.29V18H24v-1.57zM12 6c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3z\"\/><\/svg>\n    <\/span>\n    <h3 data-en=\"Resources Shared Across Schools\" data-zh=\"\u8de8\u6821\u8cc7\u6e90\u5171\u4eab\"><\/h3>\n    <p data-en=\"Your child will have access to specialists and support teachers whatever school they attend.\"\n       data-zh=\"\u7121\u8ad6\u5c31\u8b80\u54ea\u6240\u5b78\u6821\uff0c\u90fd\u80fd\u7372\u5f97\u5c08\u79d1\u53ca\u8f14\u5c0e\u6559\u5e2b\u7684\u652f\u6301\u3002\"><\/p>\n  <\/article>\n\n  <!-- Card 4 -->\n  <article class=\"esf-card\">\n    <span class=\"esf-icon\" aria-hidden=\"true\">\n      <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M1 21h4V9H1v12zm22-11c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06L14.17 1 7.59 7.59C7.22 7.95 7 8.45 7 9v10c0 1.1.9 2 2 2h9c.83 0 1.54-.5 1.84-1.22l3.02-7.05c.09-.23.14-.47.14-.73v-2z\"\/><\/svg>\n    <\/span>\n    <h3 data-en=\"One Amazing Community\" data-zh=\"\u975e\u51e1\u7684\u4e00\u9ad4\u5316\u793e\u7fa4\"><\/h3>\n    <p data-en=\"Be a part of a true all-through education system.\"\n       data-zh=\"\u6210\u70ba\u771f\u6b63\u4e00\u689d\u9f8d\u6559\u80b2\u7cfb\u7d71\u7684\u4e00\u54e1\u3002\"><\/p>\n  <\/article>\n\n  <script>\n    (function () {\n      \/\/ --- preview override: set to 'zh' or 'en' to force; null = auto-detect from URL ---\n      var FORCE_LANG = null;\n\n      var isZh = FORCE_LANG\n        ? FORCE_LANG === 'zh'\n        : window.location.href.toLowerCase().indexOf('zh-hant') !== -1;\n\n      \/\/ Scope to this widget instance (supports multiple on one page).\n      var root = (document.currentScript && document.currentScript.closest('.esf-benefits'))\n        || document.querySelector('.esf-benefits');\n      if (!root) return;\n\n      root.setAttribute('lang', isZh ? 'zh-Hant' : 'en');\n\n      var nodes = root.querySelectorAll('[data-en]');\n      for (var i = 0; i < nodes.length; i++) {\n        var el = nodes[i];\n        var text = isZh ? el.getAttribute('data-zh') : el.getAttribute('data-en');\n        if (text != null) el.textContent = text;\n      }\n    })();\n  <\/script>\n<\/section>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-a820dee e-con-full e-flex e-con e-parent\" data-id=\"a820dee\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d936b68 elementor-widget-mobile__width-inherit elementor-hidden-tablet elementor-hidden-mobile elementor-widget elementor-widget-text-editor\" data-id=\"d936b68\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<h2 style=\"color: #000000;\"><b>K1\u7684\u6559\u80b2\u8def\u5f91 (2027\/28\u5b78\u5e74\u958b\u59cb)<\/b><\/h2><p><span style=\"font-weight: 400; color: #000000;\">\u5c0b\u627e\u9069\u5408\u4f60\u7684\u5e7c\u7a1a\u5712\u53ca\u76f8\u95dc\u5c0f\u5b78\u548c\u4e2d\u5b78\u3002<\/span><br \/><span style=\"font-weight: 400; color: #000000;\">*\u9ede\u64ca\u4efb\u4f55\u5b78\u6821\uff0c\u67e5\u770b\u6559\u80b2\u8def\u5f91\u53ca\u5b78\u6821\u8a73\u60c5\u3002<\/span><\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b204e2f elementor-widget__width-initial elementor-widget-tablet__width-inherit elementor-widget-mobile__width-inherit elementor-widget elementor-widget-html\" data-id=\"b204e2f\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<!DOCTYPE html>\n<html lang=\"zh-Hant\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>ESF School Pathways<\/title>\n<!-- DM Sans (via the provided Adobe Typekit kit) -->\n<link rel=\"stylesheet\" href=\"https:\/\/use.typekit.net\/ofo8umg.css\">\n<style>\n  :root{\n    --esf-red: #8B1A3C;\n    --esf-red-dark: #6B1230;\n    --line-red: #A53552;\n    --card-bg: #EDE6D9;\n    --card-bg-alt: #E0D9CA;\n    --card-border: #D9CDB5;\n    --btn-brown: #8B7355;\n    --btn-brown-hover: #6F5A42;\n    --text-dark: #2A2A2A;\n    --text-muted: #555;\n    --bg: #FFFFFF;\n    --dim: 0.18;\n    --transition: all 0.3s ease;\n  }\n  \/* Neutralise any host-page CSS variables \/ inherited padding on the widget root *\/\n  .esfp-root{\n    --padding-left: 0 !important;\n    --padding-right: 0 !important;\n    --padding-top: 0 !important;\n    --padding-bottom: 0 !important;\n    --content-padding: 0 !important;\n    --gutter: 0 !important;\n    --container-padding: 0 !important;\n    padding: 0 !important;\n    margin: 0 auto !important;\n    width: 100% !important;\n    max-width: 100% !important;\n    box-sizing: border-box;\n  }\n  .esfp-root *{ box-sizing: border-box; margin: 0; padding: 0; }\n  .esfp-root body{\n    \/* Global typeface: DM Sans (from Adobe Typekit). Typekit ships it under\n       the `dm-sans` family name; falls back to the Google-Fonts name and\n       system sans if the kit isn't reachable. *\/\n    font-family: 'dm-sans', 'DM Sans', 'Helvetica Neue', 'Segoe UI', Arial, sans-serif;\n    background: var(--bg);\n    color: var(--text-dark);\n    padding: 24px;\n    min-width: 1200px;\n  }\n\n  \/* ============== CHART HEADER (legend only, right-aligned) ============== *\/\n  .esfp-root .chart-header{\n    max-width: 1200px;\n    margin: 0 auto 24px;\n    display: flex;\n    justify-content: flex-end;\n  }\n  .esfp-root .chart-header-right{\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    gap: 16px;\n  }\n  .esfp-root .reset-btn{\n    flex-shrink: 0;\n    white-space: nowrap;\n    align-self: center;\n    background: var(--esf-red);\n    color: white;\n    border: none;\n    padding: 7px 16px;\n    border-radius: 100px;\n    font-size: 12px;\n    cursor: pointer;\n    transition: var(--transition);\n    opacity: 0;\n    pointer-events: none;\n    z-index: 50;\n    box-shadow: 0 4px 12px rgba(139, 26, 60, 0.25);\n  }\n  .esfp-root .reset-btn.show{ opacity: 1; pointer-events: auto; }\n  .esfp-root .reset-btn:hover{ background: var(--esf-red-dark); }\n\n  .esfp-root .chart{\n    max-width: 1200px;\n    margin: 0 auto;\n    position: relative;\n  }\n\n  \/* ============== CHART LEGEND (header, right side) ============== *\/\n  .esfp-root .chart-legend{\n    display: flex;\n    flex-direction: column;\n    gap: 4px;\n    font-size: 11px;\n    color: var(--text-muted);\n    line-height: 1.3;\n    align-items: stretch;\n    min-width: 360px;\n  }\n  .esfp-root .legend-row{\n    display: grid;\n    grid-template-columns: 44px 1fr;\n    align-items: center;\n    gap: 10px;\n  }\n  .esfp-root .legend-swatch{\n    width: 44px;\n    height: 14px;\n    position: relative;\n    display: flex;\n    align-items: center;\n  }\n  .esfp-root .legend-swatch::before{\n    content: '';\n    position: absolute;\n    left: 0;\n    right: 0;\n    top: 50%;\n    transform: translateY(-50%);\n    height: 0;\n    border-top-width: 2px;\n    border-top-style: solid;\n  }\n  \/* Guaranteed swatch shows three stacked red lines (matching the image) \u2014 each\n     P\u2192S destination has its own colour, all under the same \"Guaranteed\" type. *\/\n  .esfp-root .legend-row.guaranteed .legend-swatch{\n    flex-direction: column;\n    justify-content: center;\n    gap: 2px;\n  }\n  .esfp-root .legend-row.guaranteed .legend-swatch::before{ display: none; }\n  .esfp-root .legend-row.guaranteed .legend-swatch::after{\n    content: '';\n    display: block;\n    height: 14px;\n    background:\n      linear-gradient(to bottom,\n        #B48196 0, #B48196 2px,\n        transparent 2px, transparent 3px,\n        #A85A6F 3px, #A85A6F 5px,\n        transparent 5px, transparent 6px,\n        #358A7D 6px, #358A7D 8px,\n        transparent 8px, transparent 9px,\n        #2C6B93 9px, #2C6B93 11px,\n        transparent 11px, transparent 12px,\n        #F0A922 12px, #F0A922 14px);\n    width: 100%;\n  }\n  .esfp-root .legend-row.central .legend-swatch::before{\n    border-top-color: #833849;\n    border-top-style: dashed;\n  }\n  .esfp-root .legend-row.review .legend-swatch::before{\n    border-top-color: #C2B399;\n    border-top-style: dashed;\n  }\n  .esfp-root .legend-label{\n    color: var(--esf-red);\n    font-weight: 600;\n    font-style: italic;\n    font-size: 11px;\n  }\n  .esfp-root .legend-row.review .legend-label{\n    color: var(--text-muted);\n    font-weight: 500;\n    font-style: italic;\n  }\n\n  .esfp-root .connections{\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n    pointer-events: none;\n    z-index: 1;\n  }\n  .esfp-root .connections path{\n    fill: none;\n    stroke: var(--line-red);\n    stroke-width: 2.4;\n    opacity: 0.85;\n    transition: stroke-width 0.4s ease, opacity 0.4s ease, stroke 0.4s ease;\n  }\n  \/* === COLOUR-CODED PATHWAY TYPES === *\/\n  \/* 1. Guaranteed Pathway \u2014 base red (P\u2192S arrows override by destination below) *\/\n  .esfp-root .connections path.line-guaranteed{\n    stroke: var(--line-red);\n    stroke-dasharray: none;\n  }\n  \/* 2. Central Allocation \u2014 dashed dark wine (Hillside \/ West Kowloon \/ Wu Kai Sha \/ Tsing Yi) *\/\n  .esfp-root .connections path.line-central{\n    stroke: #833849;\n    stroke-dasharray: 5 4;\n  }\n  \/* 3. Placement \/ Admission & Review Process \u2014 dashed warm beige (Renaissance KG \u2192 Sarah Roe) *\/\n  .esfp-root .connections path.line-review{\n    stroke: #C2B399;\n    stroke-dasharray: 6 5;\n    stroke-width: 2.6;\n  }\n  \/* Destination-coded colours for Primary\u2192Secondary arrows.\n     South Island confirmed by user as #B48196; remaining four are best-read\n     approximations from the JPEG and can be tweaked. *\/\n  .esfp-root .connections path[data-to=\"s-southisland\"]{ stroke: #B48196; }\n  .esfp-root .connections path[data-to=\"s-island\"]{ stroke: #A85A6F; }\n  .esfp-root .connections path[data-to=\"s-westisland\"]{ stroke: #358A7D; }\n  .esfp-root .connections path[data-to=\"s-kgv\"]{ stroke: #2C6B93; }\n  .esfp-root .connections path[data-to=\"s-shatincollege\"]{ stroke: #F0A922; }\n\n  .esfp-root .connections path.highlighted{\n    stroke-width: 4;\n    opacity: 1;\n    filter: drop-shadow(0 0 4px rgba(139, 26, 60, 0.35));\n  }\n  .esfp-root .connections path.highlighted.line-guaranteed{ stroke: var(--esf-red-dark); }\n  .esfp-root .connections path.highlighted.line-central{ stroke: #5C2231; }\n  .esfp-root .connections path.highlighted.line-review{ stroke: #8E7E63; }\n  \/* Highlighted P\u2192S keeps its destination hue but goes darker \/ saturated *\/\n  .esfp-root .connections path.highlighted[data-to=\"s-southisland\"]{ stroke: #8B5B6E; }\n  .esfp-root .connections path.highlighted[data-to=\"s-island\"]{ stroke: #823E54; }\n  .esfp-root .connections path.highlighted[data-to=\"s-westisland\"]{ stroke: #1F5C53; }\n  .esfp-root .connections path.highlighted[data-to=\"s-kgv\"]{ stroke: #1A4D6C; }\n  .esfp-root .connections path.highlighted[data-to=\"s-shatincollege\"]{ stroke: #B07F18; }\n  .esfp-root .connections path.dimmed{\n    opacity: 0.06;\n  }\n\n  \/* Arrowheads rendered as DOM elements so they can sit ABOVE cards (z-index 3) *\/\n  .esfp-root .line-arrow{\n    position: absolute;\n    width: 13px;\n    height: 10px;\n    background: var(--line-red);\n    clip-path: polygon(50% 100%, 0 0, 100% 0);\n    margin-left: -6.5px;\n    margin-top: -10px;\n    pointer-events: none;\n    z-index: 4;\n    opacity: 0.9;\n    transition: background 0.4s ease,\n                width 0.3s ease,\n                height 0.3s ease,\n                margin 0.3s ease,\n                opacity 0.4s ease,\n                filter 0.3s ease;\n  }\n  \/* Arrow colour matches each line type *\/\n  .esfp-root .line-arrow.line-guaranteed{ background: var(--line-red); }\n  .esfp-root .line-arrow.line-central{ background: #833849; }\n  .esfp-root .line-arrow.line-review{ background: #C2B399; }\n  \/* Destination-coded arrowhead colour for Primary\u2192Secondary (matches paths above) *\/\n  .esfp-root .line-arrow[data-to=\"s-southisland\"]{ background: #B48196; }\n  .esfp-root .line-arrow[data-to=\"s-island\"]{ background: #A85A6F; }\n  .esfp-root .line-arrow[data-to=\"s-westisland\"]{ background: #358A7D; }\n  .esfp-root .line-arrow[data-to=\"s-kgv\"]{ background: #2C6B93; }\n  .esfp-root .line-arrow[data-to=\"s-shatincollege\"]{ background: #F0A922; }\n  .esfp-root .line-arrow.highlighted{\n    width: 17px;\n    height: 13px;\n    margin-left: -8.5px;\n    margin-top: -13px;\n    opacity: 1;\n    filter: drop-shadow(0 0 3px rgba(139, 26, 60, 0.45));\n  }\n  .esfp-root .line-arrow.highlighted.line-guaranteed{ background: var(--esf-red-dark); }\n  .esfp-root .line-arrow.highlighted.line-central{ background: #5C2231; }\n  .esfp-root .line-arrow.highlighted.line-review{ background: #8E7E63; }\n  \/* Highlighted destination-coded arrows go darker *\/\n  .esfp-root .line-arrow.highlighted[data-to=\"s-southisland\"]{ background: #8B5B6E; }\n  .esfp-root .line-arrow.highlighted[data-to=\"s-island\"]{ background: #823E54; }\n  .esfp-root .line-arrow.highlighted[data-to=\"s-westisland\"]{ background: #1F5C53; }\n  .esfp-root .line-arrow.highlighted[data-to=\"s-kgv\"]{ background: #1A4D6C; }\n  .esfp-root .line-arrow.highlighted[data-to=\"s-shatincollege\"]{ background: #B07F18; }\n  .esfp-root .line-arrow.dimmed{\n    opacity: 0.06;\n  }\n\n  .esfp-root .tier-banner{\n    background: var(--esf-red);\n    color: white;\n    padding: 14px 20px;\n    text-align: center;\n    font-size: 15px;\n    font-weight: 700;\n    border-radius: 10px;\n    position: relative;\n    z-index: 2;\n  }\n  .esfp-root .tier-subnote,\n  .esfp-root .tier-subnote *{\n    \/* \"At least 70% non-local students with overseas passports (excluding BNO)\"\n       and \"At least 70% students must hold Hong Kong Permanent Residency\"\n       both render in bold weight (700) in #822940. *\/\n    font-weight: 700;\n  }\n  .esfp-root .tier-subnote{\n    background: white;\n    border: 1.5px solid var(--esf-red);\n    padding: 10px 20px;\n    text-align: center;\n    font-size: 12px;\n    color: #822940;\n    margin-top: 6px;\n    border-radius: 10px;\n    position: relative;\n    z-index: 2;\n  }\n\n  .esfp-root .tier-row{ position: relative; z-index: 2; }\n\n  \/* Kindergarten tier *\/\n  .esfp-root .tier-kg-banners{\n    display: grid;\n    grid-template-columns: 9fr 3fr;\n    gap: 24px;\n    margin-bottom: 8px;\n  }\n  .esfp-root .tier-kg{\n    display: grid;\n    grid-template-columns: 9fr 3fr;\n    gap: 24px;\n    margin-bottom: 24px;\n  }\n  .esfp-root .kg-grid{\n    display: grid;\n    grid-template-columns: repeat(5, 1fr);\n    gap: 10px;\n  }\n  .esfp-root .kg-grid-single{ display: grid; grid-template-columns: 1fr; }\n\n  \/* Primary banner row *\/\n  .esfp-root .primary-banner-row{\n    display: grid;\n    grid-template-columns: 9fr 3fr;\n    gap: 24px;\n    margin-top: 60px;\n  }\n  \/* Inside the right 3fr cell: red banner spans all 3 columns (full width),\n     but the HKPR subtitle below only covers the first 2 (Discovery + Renaissance).\n     Sarah Roe (column 3) gets the banner but not the HKPR rule. *\/\n  .esfp-root .at-banner-row{\n    display: grid;\n    grid-template-columns: repeat(3, 1fr);\n    column-gap: 6px;\n    row-gap: 6px;\n    position: relative;\n    top: 50px;               \/* nudge the All Through banner + box lower *\/\n  }\n  .esfp-root .at-banner-full{\n    grid-column: 1 \/ -1;   \/* span all 3 columns *\/\n  }\n  .esfp-root .at-subnote-twothirds{\n    grid-column: 1 \/ span 2; \/* cover Discovery + Renaissance only *\/\n    margin-top: 0;\n    min-height: 84px;        \/* taller box \u2014 the Tsing Yi feeder arrow lands on it *\/\n    display: flex;\n    align-items: center;\n    justify-content: center;\n  }\n\n  \/* Primary tier \u2014 simplified name-only cards *\/\n  .esfp-root .primary-allthrough-row{\n    display: grid;\n    grid-template-columns: 9fr 3fr;\n    gap: 24px;\n    margin-top: 50px;\n  }\n  .esfp-root .primary-grid{\n    display: grid;\n    grid-template-columns: repeat(9, 1fr);\n    gap: 6px;\n  }\n  .esfp-root .allthrough-grid{\n    display: grid;\n    grid-template-columns: repeat(3, 1fr);\n    gap: 6px;\n    position: relative;\n    top: 50px;               \/* push All Through cards lower \u2192 longer drops from the box *\/\n  }\n\n  \/* Unified school name card \u2014 KG-style for ALL tiers (KG \/ Primary \/ All-Through \/ Secondary) *\/\n  .esfp-root .name-card{\n    background: white;\n    border: 1.5px solid var(--esf-red);\n    border-radius: 8px;\n    padding: 14px 10px;\n    cursor: pointer;\n    text-align: center;\n    font-size: 11.5px;\n    color: var(--esf-red);\n    font-weight: 600;\n    line-height: 1.3;\n    min-height: 60px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    transition: var(--transition);\n    position: relative;\n    z-index: 2;\n  }\n  .esfp-root .name-card:hover{\n    background: #FFF5F0;\n    transform: translateY(-2px);\n    box-shadow: 0 4px 12px rgba(139, 26, 60, 0.15);\n  }\n\n  \/* Secondary row \u2014 spans only the 9fr Primary column.\n     The 3fr All-Through column above stays empty here (its tall cards\n     visually own that vertical band, like the image). *\/\n  .esfp-root .secondary-row{\n    display: grid;\n    grid-template-columns: 9fr 3fr;\n    gap: 24px;\n    margin-top: 80px;\n  }\n  .esfp-root .secondary-col{ grid-column: 1; }\n  .esfp-root .secondary-banner-grid{\n    display: grid;\n    grid-template-columns: repeat(5, 1fr);\n    gap: 10px;\n    margin-bottom: 10px;\n  }\n  .esfp-root .secondary-cards-grid{\n    display: grid;\n    grid-template-columns: repeat(5, 1fr);\n    gap: 10px;\n  }\n  .esfp-root .allthrough-banner-grid{\n    display: grid;\n    grid-template-columns: repeat(3, 1fr);\n    gap: 10px;\n    margin-bottom: 10px;\n  }\n  .esfp-root .allthrough-cards-grid{\n    display: grid;\n    grid-template-columns: repeat(3, 1fr);\n    gap: 10px;\n  }\n\n  \/* Info icon hint on detail cards *\/\n  .esfp-root .info-hint{\n    position: absolute;\n    top: 5px;\n    right: 5px;\n    width: 16px;\n    height: 16px;\n    border-radius: 50%;\n    background: var(--esf-red);\n    color: white;\n    font-size: 10px;\n    font-weight: 700;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    opacity: 0.7;\n    transition: var(--transition);\n    cursor: pointer;\n    z-index: 3;\n    font-family: Georgia, serif;\n    font-style: italic;\n  }\n  .esfp-root .info-hint:hover{\n    opacity: 1;\n    transform: scale(1.2);\n    background: var(--esf-red-dark);\n    box-shadow: 0 2px 6px rgba(139, 26, 60, 0.4);\n  }\n  .esfp-root .name-card:hover .info-hint,\n.esfp-root .secondary-card:hover .info-hint{ opacity: 1; transform: scale(1.15); }\n\n  \/* Secondary tier \u2014 now uses KG-style (white bg, red border, red text) *\/\n  .esfp-root .secondary-card{\n    background: white;\n    color: var(--esf-red);\n    text-align: center;\n    padding: 14px 10px;\n    border: 1.5px solid var(--esf-red);\n    border-radius: 8px;\n    cursor: pointer;\n    font-size: 11.5px;\n    font-weight: 600;\n    line-height: 1.3;\n    min-height: 60px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    transition: var(--transition);\n    position: relative;\n    z-index: 2;\n  }\n  .esfp-root .secondary-card:hover{\n    background: #FFF5F0;\n    transform: translateY(-2px);\n    box-shadow: 0 4px 12px rgba(139, 26, 60, 0.15);\n  }\n\n  \/* Full-width banner spanning all secondary cards (cleaner than 5 narrow repeats) *\/\n  .esfp-root .secondary-banner-full{\n    background: var(--esf-red);\n    color: white;\n    padding: 13px 20px;\n    text-align: center;\n    font-size: 14px;\n    font-weight: 700;\n    border-radius: 10px;\n    margin-bottom: 12px;\n    position: relative;\n    z-index: 2;\n  }\n\n  \/* Legacy classes kept for back-compat but no longer used *\/\n  .esfp-root .secondary-banner-small{\n    background: var(--esf-red);\n    color: white;\n    padding: 10px 16px;\n    font-size: 13px;\n    font-weight: 500;\n    text-align: center;\n    border-radius: 2px;\n    position: relative;\n    z-index: 2;\n  }\n\n  \/* Selection state *\/\n  .esfp-root .clickable.dimmed{ opacity: var(--dim); }\n  .esfp-root .clickable.highlighted{\n    box-shadow: 0 0 0 2.5px var(--esf-red), 0 6px 20px rgba(139, 26, 60, 0.2);\n    transform: translateY(-2px);\n    z-index: 3;\n  }\n  .esfp-root .clickable.selected{\n    box-shadow: 0 0 0 3px var(--esf-red-dark), 0 8px 24px rgba(139, 26, 60, 0.3);\n    transform: translateY(-3px);\n    z-index: 3;\n    animation: pulse-glow 1.8s ease-in-out infinite;\n  }\n  .esfp-root .clickable{\n    transition: opacity 0.22s cubic-bezier(0.4, 0, 0.2, 1),\n                transform 0.3s cubic-bezier(0.4, 0, 0.2, 1),\n                box-shadow 0.3s cubic-bezier(0.4, 0, 0.2, 1),\n                background 0.3s ease,\n                border-color 0.3s ease;\n  }\n  @keyframes pulse-glow {\n    0%, 100% {\n      box-shadow: 0 0 0 3px var(--esf-red-dark),\n                  0 8px 24px rgba(139, 26, 60, 0.3),\n                  0 0 0 0 rgba(139, 26, 60, 0.4);\n    }\n    50% {\n      box-shadow: 0 0 0 4px var(--esf-red-dark),\n                  0 10px 28px rgba(139, 26, 60, 0.4),\n                  0 0 0 10px rgba(139, 26, 60, 0);\n    }\n  }\n\n  \/* Staggered cascade \u2014 applied via class added by JS *\/\n  .esfp-root .clickable.cascade-enter{\n    animation: cascade-pop 0.55s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;\n  }\n  @keyframes cascade-pop {\n    0%   { transform: translateY(10px) scale(0.92); }\n    55%  { transform: translateY(-7px) scale(1.07); }\n    100% { transform: translateY(-2px) scale(1); }\n  }\n\n  \/* Connection lines TRACE themselves from source \u2192 target on highlight *\/\n  .esfp-root .connections path.cascade-line{\n    stroke-dasharray: var(--draw-length);\n    stroke-dashoffset: var(--draw-length);\n    animation: line-draw 0.6s cubic-bezier(0.4, 0, 0.2, 1) forwards;\n  }\n  @keyframes line-draw {\n    0% {\n      stroke-dashoffset: var(--draw-length);\n      stroke-width: 1.5;\n      filter: drop-shadow(0 0 0 transparent);\n    }\n    60% {\n      stroke-width: 4.5;\n      filter: drop-shadow(0 0 8px rgba(139, 26, 60, 0.55));\n    }\n    100% {\n      stroke-dashoffset: 0;\n      stroke-width: 3;\n      filter: drop-shadow(0 0 4px rgba(139, 26, 60, 0.35));\n    }\n  }\n\n  \/* Arrow appears AFTER its line finishes drawing *\/\n  .esfp-root .line-arrow.cascade-line{\n    animation: arrow-pop 0.4s 0.45s ease-out forwards;\n    opacity: 0;\n    transform: scale(0.2);\n  }\n  @keyframes arrow-pop {\n    0%   { opacity: 0; transform: scale(0.2); }\n    60%  { opacity: 1; transform: scale(1.45); }\n    100% { opacity: 1; transform: scale(1); }\n  }\n\n  \/* ============== MODAL ============== *\/\n  .esfp-root .modal-backdrop{\n    position: fixed;\n    inset: 0;\n    background: rgba(20, 8, 14, 0.55);\n    backdrop-filter: blur(3px);\n    z-index: 100;\n    opacity: 0;\n    pointer-events: none;\n    transition: opacity 0.25s ease;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    padding: 24px;\n  }\n  .esfp-root .modal-backdrop.open{\n    opacity: 1;\n    pointer-events: auto;\n  }\n  .esfp-root .modal{\n    background: var(--card-bg);\n    border-radius: 6px;\n    max-width: 480px;\n    width: 100%;\n    max-height: 90vh;\n    overflow-y: auto;\n    padding: 28px 32px;\n    box-shadow: 0 24px 60px rgba(0,0,0,0.3);\n    transform: scale(0.95);\n    transition: transform 0.25s ease;\n    position: relative;\n  }\n  .esfp-root .modal-backdrop.open .modal{ transform: scale(1); }\n  .esfp-root .modal-close{\n    position: absolute;\n    top: 14px;\n    right: 14px;\n    width: 32px;\n    height: 32px;\n    border: none;\n    background: #F8D749;\n    color: #263E46;\n    cursor: pointer;\n    border-radius: 50%;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    padding: 0;\n    box-shadow: 0 2px 6px rgba(0, 0, 0, 0.12);\n    transition: background 0.2s, transform 0.15s;\n    z-index: 2;\n    user-select: none;\n  }\n  .esfp-root .modal-close svg{ display: block; }\n  .esfp-root .modal-close:hover{\n    background: #E6C32E;\n    transform: scale(1.06);\n  }\n  .esfp-root .modal-close:focus-visible{\n    outline: 3px solid rgba(38, 62, 70, 0.35);\n    outline-offset: 2px;\n  }\n\n  .esfp-root .modal-school-name{\n    color: var(--esf-red);\n    font-size: 22px;\n    font-weight: 700;\n    margin-bottom: 4px;\n    padding-right: 56px;\n    line-height: 1.25;\n  }\n  .esfp-root .modal-school-tier{\n    color: var(--text-muted);\n    font-size: 12px;\n    text-transform: uppercase;\n    letter-spacing: 1px;\n    margin-bottom: 20px;\n  }\n  .esfp-root .modal-fields{\n    display: grid;\n    grid-template-columns: 140px 1fr;\n    gap: 10px 16px;\n    font-size: 13px;\n    margin-bottom: 20px;\n  }\n  .esfp-root .modal-fields .label{\n    color: var(--text-muted);\n    font-size: 11px;\n    padding-top: 2px;\n  }\n  .esfp-root .modal-fields .value{\n    color: var(--text-dark);\n    font-weight: 600;\n  }\n  .esfp-root .modal-fields .value.curriculum{\n    color: var(--esf-red);\n    font-weight: 700;\n  }\n\n  .esfp-root .modal-actions{\n    display: flex;\n    flex-direction: column;\n    gap: 8px;\n    margin-bottom: 20px;\n  }\n  .esfp-root .modal-btn,\n.esfp-root a.modal-btn,\n.esfp-root a.modal-btn:link,\n.esfp-root a.modal-btn:visited{\n    display: block;\n    width: 100%;\n    box-sizing: border-box;\n    background: #F8D749;\n    color: #263E46;\n    text-align: center;\n    padding: 10px 14px;\n    border-radius: 20px;\n    font-family: inherit;\n    font-size: 12px;\n    font-weight: 600;\n    line-height: 1.2;\n    cursor: pointer;\n    text-decoration: none;\n    transition: background 0.2s;\n    border: none;\n    -webkit-appearance: none;\n            appearance: none;\n  }\n  .esfp-root .modal-btn:hover,\n.esfp-root a.modal-btn:hover{ background: #E6C32E; color: #263E46; }\n\n  .esfp-root .modal-enquiry{\n    padding-top: 16px;\n    border-top: 1.5px solid rgba(139, 26, 60, 0.15);\n  }\n  .esfp-root .modal-enquiry-label{\n    color: var(--esf-red);\n    font-size: 12px;\n    font-weight: 700;\n    margin-bottom: 6px;\n    text-transform: uppercase;\n    letter-spacing: 0.5px;\n  }\n  .esfp-root .modal-enquiry-phone{\n    color: #1a1a1a;\n    font-size: 14px;\n    font-weight: 600;\n    margin-bottom: 2px;\n  }\n  .esfp-root .modal-enquiry-email{\n    color: #1a73e8;\n    font-size: 13px;\n    text-decoration: underline;\n  }\n  .esfp-root .modal-enquiry-email:hover{\n    color: #1558b8;\n  }\n\n  .esfp-root .modal-pathway-note{\n    margin-top: 18px;\n    padding: 10px 14px;\n    background: rgba(139, 26, 60, 0.06);\n    border-left: 3px solid var(--esf-red);\n    font-size: 12px;\n    color: var(--text-muted);\n    border-radius: 2px;\n  }\n\n  \/* ============== MOBILE VIEW ============== *\/\n  \/* Hidden by default \u2014 only appears below the breakpoint *\/\n  .esfp-root #mobileView{ display: none; }\n\n  @media (max-width: 768px) {\n    \/* Host-page (Elementor) wrapper: set its padding on mobile. *\/\n    .elementor-34352 .elementor-element.elementor-element-e58bca0{\n      padding: 20px !important;\n    }\n    .esfp-root body{\n      min-width: 0;\n      padding: 0;\n      background: #FAF7F2;\n    }\n    .esfp-root .chart-header,\n.esfp-root .chart,\n.esfp-root .reset-btn{ display: none !important; }\n\n    .esfp-root #mobileView{\n      display: block;\n      min-height: 100vh;\n      width: 100%;\n      max-width: 100%;\n      margin: 0 auto;\n      background: white;\n      box-shadow: 0 0 24px rgba(0,0,0,0.06);\n    }\n\n    \/* Sticky top app bar *\/\n    .esfp-root .mob-appbar{\n      position: sticky;\n      top: 0;\n      z-index: 30;\n      background: var(--esf-red);\n      color: white;\n      padding: 14px 20px;\n      display: flex;\n      align-items: center;\n      gap: 12px;\n      box-shadow: 0 2px 8px rgba(139, 26, 60, 0.2);\n    }\n    .esfp-root .mob-back{\n      background: #F8D749;\n      border: none;\n      color: #263E46;\n      width: 36px;\n      height: 36px;\n      border-radius: 50%;\n      font-size: 18px;\n      font-weight: 700;\n      cursor: pointer;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      transition: background 0.2s, transform 0.15s;\n      flex-shrink: 0;\n      box-shadow: 0 2px 6px rgba(0, 0, 0, 0.18);\n      padding: 0;\n    }\n    .esfp-root .mob-back:hover{\n      background: #E6C32E;\n      transform: scale(1.06);\n    }\n    .esfp-root .mob-back svg{ display: block; }\n    .esfp-root .mob-back[hidden]{ display: none; }\n    .esfp-root .mob-titles{ flex: 1; min-width: 0; }\n    .esfp-root .mob-title{\n      font-size: 15px;\n      font-weight: 600;\n      line-height: 1.2;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n    }\n    .esfp-root .mob-subtitle{\n      font-size: 11px;\n      opacity: 0.85;\n      margin-top: 2px;\n      font-weight: 400;\n    }\n\n    \/* ===== Mobile legend (browse view) ===== *\/\n    .esfp-root .mob-legend{\n      background: white;\n      padding: 12px 16px;\n      border-bottom: 1px solid #F0EBE0;\n      display: flex;\n      flex-direction: column;\n      gap: 6px;\n    }\n    .esfp-root .mob-legend-title{\n      font-size: 10px;\n      letter-spacing: 1.2px;\n      text-transform: uppercase;\n      color: var(--text-muted);\n      font-weight: 600;\n      margin-bottom: 4px;\n    }\n    .esfp-root .mob-legend-row{\n      display: grid;\n      grid-template-columns: 36px 1fr;\n      gap: 10px;\n      align-items: center;\n    }\n    .esfp-root .mob-legend-swatch{\n      width: 36px;\n      height: 12px;\n      position: relative;\n    }\n    .esfp-root .mob-legend-swatch::before{\n      content: '';\n      position: absolute;\n      left: 0;\n      right: 0;\n      top: 50%;\n      transform: translateY(-50%);\n      border-top-width: 2px;\n      border-top-style: solid;\n    }\n    .esfp-root .mob-legend-row.guaranteed .mob-legend-swatch::before{\n      border-top-color: var(--line-red);\n    }\n    .esfp-root .mob-legend-row.central .mob-legend-swatch::before{\n      border-top-color: #833849;\n      border-top-style: dashed;\n    }\n    .esfp-root .mob-legend-row.review .mob-legend-swatch::before{\n      border-top-color: #C2B399;\n      border-top-style: dashed;\n    }\n    .esfp-root .mob-legend-label{\n      font-size: 11px;\n      color: var(--text-dark);\n      font-weight: 500;\n      line-height: 1.3;\n    }\n\n    \/* ===== Mobile pathway: connection-type badge between steps ===== *\/\n    .esfp-root .mob-tl-edge{\n      margin: 0 0 10px 0;       \/* clears the timeline dot, breathes above the card *\/\n      padding: 5px 14px;        \/* more comfortable inner padding *\/\n      font-size: 10px;\n      font-weight: 700;\n      letter-spacing: 0.8px;\n      text-transform: uppercase;\n      border-radius: 999px;     \/* full pill *\/\n      display: inline-block;\n      line-height: 1.2;\n    }\n    .esfp-root .mob-tl-edge.edge-guaranteed{\n      background: rgba(165, 53, 82, 0.12);\n      color: var(--esf-red-dark);\n    }\n    .esfp-root .mob-tl-edge.edge-central{\n      background: rgba(131, 56, 73, 0.14);\n      color: #833849;\n    }\n    .esfp-root .mob-tl-edge.edge-review{\n      background: rgba(194, 179, 153, 0.3);\n      color: #8E7E63;\n    }\n\n    \/* ===== Hero ===== *\/\n    .esfp-root .mob-hero{\n      background: linear-gradient(135deg, var(--esf-red) 0%, var(--esf-red-dark) 100%);\n      color: white;\n      padding: 24px 22px 32px;\n      position: relative;\n      overflow: hidden;\n    }\n    .esfp-root .mob-hero::before{\n      content: '';\n      position: absolute;\n      top: -60px;\n      right: -40px;\n      width: 200px;\n      height: 200px;\n      border-radius: 50%;\n      background: rgba(255,255,255,0.04);\n    }\n    .esfp-root .mob-hero::after{\n      content: '';\n      position: absolute;\n      bottom: -80px;\n      left: -30px;\n      width: 160px;\n      height: 160px;\n      border-radius: 50%;\n      background: rgba(255,255,255,0.03);\n    }\n    .esfp-root .mob-hero-eyebrow{\n      font-size: 10px;\n      letter-spacing: 2px;\n      text-transform: uppercase;\n      opacity: 0.75;\n      margin-bottom: 8px;\n      font-weight: 500;\n    }\n    .esfp-root .mob-hero-title{\n      font-size: 26px;\n      font-weight: 700;\n      line-height: 1.15;\n      letter-spacing: -0.4px;\n      margin-bottom: 10px;\n      position: relative;\n      z-index: 1;\n    }\n    .esfp-root .mob-hero-sub{\n      font-size: 13px;\n      opacity: 0.9;\n      line-height: 1.45;\n      position: relative;\n      z-index: 1;\n      max-width: 320px;\n    }\n    .esfp-root .mob-hero-stats{\n      display: flex;\n      gap: 20px;\n      margin-top: 18px;\n      position: relative;\n      z-index: 1;\n    }\n    .esfp-root .mob-hero-stat{\n      display: flex;\n      flex-direction: column;\n    }\n    .esfp-root .mob-hero-stat-num{\n      font-size: 22px;\n      font-weight: 700;\n      line-height: 1;\n    }\n    .esfp-root .mob-hero-stat-label{\n      font-size: 10px;\n      opacity: 0.8;\n      text-transform: uppercase;\n      letter-spacing: 1px;\n      margin-top: 4px;\n    }\n\n    \/* ===== Sticky tabs ===== *\/\n    .esfp-root .mob-tabs{\n      position: sticky;\n      top: 62px;\n      z-index: 20;\n      background: white;\n      padding: 12px 16px;\n      border-bottom: 1px solid #F0EBE0;\n      overflow-x: auto;\n      -webkit-overflow-scrolling: touch;\n      scrollbar-width: none;\n    }\n    .esfp-root .mob-tabs::-webkit-scrollbar{ display: none; }\n    .esfp-root .mob-tabs-inner{\n      display: flex;\n      gap: 8px;\n      min-width: max-content;\n    }\n    .esfp-root .mob-tab{\n      background: #F5EFE2;\n      border: 1.5px solid transparent;\n      color: var(--esf-red-dark);\n      padding: 9px 16px;\n      border-radius: 100px;\n      font-size: 13px;\n      font-weight: 600;\n      cursor: pointer;\n      white-space: nowrap;\n      transition: all 0.2s;\n      display: flex;\n      align-items: center;\n      gap: 6px;\n    }\n    .esfp-root .mob-tab:active{ transform: scale(0.96); }\n    .esfp-root .mob-tab.active{\n      background: var(--esf-red);\n      color: white;\n      border-color: var(--esf-red);\n    }\n    .esfp-root .mob-tab-count{\n      background: rgba(0,0,0,0.08);\n      color: inherit;\n      font-size: 11px;\n      padding: 1px 7px;\n      border-radius: 10px;\n      font-weight: 700;\n    }\n    .esfp-root .mob-tab.active .mob-tab-count{\n      background: rgba(255,255,255,0.25);\n    }\n\n    \/* ===== Tier panels ===== *\/\n    .esfp-root .mob-tier-panel{\n      padding: 20px 16px 40px;\n    }\n    .esfp-root .mob-tier-panel[hidden]{ display: none; }\n    .esfp-root .mob-tier-heading{\n      display: flex;\n      align-items: baseline;\n      justify-content: space-between;\n      margin-bottom: 14px;\n    }\n    .esfp-root .mob-tier-heading-title{\n      font-size: 17px;\n      font-weight: 700;\n      color: var(--text-dark);\n    }\n    .esfp-root .mob-tier-heading-sub{\n      font-size: 11px;\n      color: var(--text-muted);\n      font-weight: 500;\n    }\n\n    \/* ===== School cards (replaces flat list rows) ===== *\/\n    .esfp-root .mob-card-grid{\n      display: grid;\n      grid-template-columns: 1fr;\n      gap: 10px;\n    }\n    .esfp-root .mob-card{\n      background: white;\n      border: 1px solid #EDE6D9;\n      border-radius: 10px;\n      padding: 14px 16px;\n      cursor: pointer;\n      transition: all 0.15s;\n      position: relative;\n      overflow: hidden;\n      display: flex;\n      align-items: center;\n      gap: 12px;\n    }\n    .esfp-root .mob-card:active{\n      transform: scale(0.98);\n      background: #FAF5EE;\n    }\n    .esfp-root .mob-card-accent{\n      width: 4px;\n      height: 36px;\n      border-radius: 4px;\n      flex-shrink: 0;\n    }\n    .esfp-root .mob-card[data-tier=\"kg\"] .mob-card-accent{ background: #D4A5B5; }\n    .esfp-root .mob-card[data-tier=\"primary\"] .mob-card-accent{ background: var(--btn-brown); }\n    .esfp-root .mob-card[data-tier=\"allthrough\"] .mob-card-accent{ background: #6B4F36; }\n    .esfp-root .mob-card[data-tier=\"secondary\"] .mob-card-accent{ background: var(--esf-red); }\n\n    .esfp-root .mob-card-body{ flex: 1; min-width: 0; }\n    .esfp-root .mob-card-name{\n      font-size: 14px;\n      font-weight: 600;\n      color: var(--text-dark);\n      line-height: 1.3;\n    }\n    .esfp-root .mob-card-meta{\n      font-size: 11px;\n      color: var(--text-muted);\n      margin-top: 4px;\n      display: flex;\n      align-items: center;\n      gap: 6px;\n    }\n    .esfp-root .mob-card-arrow{\n      color: var(--esf-red);\n      font-size: 18px;\n      opacity: 0.4;\n      flex-shrink: 0;\n      transition: all 0.2s;\n    }\n    .esfp-root .mob-card:hover .mob-card-arrow,\n.esfp-root .mob-card:active .mob-card-arrow{\n      opacity: 1;\n      transform: translateX(2px);\n    }\n\n    \/* ===== Pathway view ===== *\/\n    .esfp-root .mob-pathway{\n      padding: 20px 0 90px 20px;\n    }\n    .esfp-root .mob-pathway-intro{\n      font-size: 13px;\n      color: var(--text-muted);\n      margin-bottom: 24px;\n      line-height: 1.45;\n    }\n    .esfp-root .mob-pathway-intro strong{ color: var(--esf-red); }\n\n    .esfp-root .mob-timeline{\n      position: relative;\n      padding-left: 20px;\n      padding-right: 16px;\n    }\n    .esfp-root .mob-timeline::before{\n      content: '';\n      position: absolute;\n      left: 6px;\n      top: 16px;\n      bottom: 16px;\n      width: 2px;\n      background: var(--esf-red);\n      opacity: 0.4;\n    }\n\n    .esfp-root .mob-tl-group{\n      position: relative;\n      margin-bottom: 28px;\n      opacity: 0;\n      transform: translateX(-12px);\n      animation: tl-slide-in 0.45s cubic-bezier(0.4, 0, 0.2, 1) forwards;\n    }\n    .esfp-root .mob-tl-group:nth-child(1){ animation-delay: 0ms; }\n    .esfp-root .mob-tl-group:nth-child(2){ animation-delay: 120ms; }\n    .esfp-root .mob-tl-group:nth-child(3){ animation-delay: 240ms; }\n    .esfp-root .mob-tl-group:nth-child(4){ animation-delay: 360ms; }\n    @keyframes tl-slide-in {\n      to { opacity: 1; transform: translateX(0); }\n    }\n    .esfp-root .mob-tl-group:last-child{ margin-bottom: 0; }\n    .esfp-root .mob-tl-dot{\n      position: absolute;\n      left: -20px;\n      top: 14px;\n      width: 14px;\n      height: 14px;\n      border-radius: 50%;\n      background: white;\n      border: 3px solid var(--esf-red);\n      z-index: 2;\n    }\n    .esfp-root .mob-tl-group.is-current .mob-tl-dot{\n      background: var(--esf-red);\n      box-shadow: 0 0 0 4px rgba(139, 26, 60, 0.2);\n    }\n    .esfp-root .mob-tl-tier{\n      font-size: 10px;\n      font-weight: 700;\n      letter-spacing: 1.2px;\n      text-transform: uppercase;\n      color: var(--esf-red);\n      margin-bottom: 8px;\n    }\n    .esfp-root .mob-tl-cards{\n      display: flex;\n      flex-direction: column;\n      gap: 8px;\n    }\n    .esfp-root .mob-tl-card{\n      background: var(--card-bg);\n      border: 1px solid var(--card-border);\n      border-radius: 6px;\n      padding: 14px 16px;\n      cursor: pointer;\n      transition: all 0.15s;\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      gap: 12px;\n    }\n    .esfp-root .mob-tl-card:active{ transform: scale(0.98); }\n    .esfp-root .mob-tl-card.is-current{\n      background: var(--esf-red);\n      border-color: var(--esf-red);\n    }\n    .esfp-root .mob-tl-card.is-current .mob-tl-card-name{ color: white; }\n    .esfp-root .mob-tl-card.is-current .mob-tl-card-tap{ color: rgba(255,255,255,0.7); }\n\n    .esfp-root .mob-tl-card-name{\n      font-size: 14px;\n      font-weight: 600;\n      color: var(--esf-red);\n      line-height: 1.3;\n      flex: 1;\n    }\n    .esfp-root .mob-tl-card-tap{\n      font-size: 10px;\n      color: var(--text-muted);\n      font-style: italic;\n    }\n\n    .esfp-root .mob-tl-empty{\n      font-size: 12px;\n      color: var(--text-muted);\n      font-style: italic;\n      padding: 8px 0;\n    }\n\n    \/* Section dividers \u2014 used when the selected node has multiple complete\n       pathways. Each section gets its own internal timeline line so paths\n       read as parallel branches instead of one merged tier list. *\/\n    .esfp-root .mob-timeline.has-sections{\n      padding-left: 0;\n    }\n    .esfp-root .mob-timeline.has-sections::before{\n      display: none;\n    }\n    .esfp-root .mob-tl-section{\n      position: relative;\n      padding-left: 20px;\n      padding-top: 4px;\n      margin-bottom: 32px;\n      opacity: 0;\n      transform: translateY(8px);\n      animation: tl-slide-in 0.45s cubic-bezier(0.4, 0, 0.2, 1) forwards;\n    }\n    .esfp-root .mob-tl-section:last-child{ margin-bottom: 8px; }\n    .esfp-root .mob-tl-section::before{\n      content: '';\n      position: absolute;\n      left: 6px;\n      top: 38px;\n      bottom: 16px;\n      width: 2px;\n      background: var(--esf-red);\n      opacity: 0.4;\n    }\n    .esfp-root .mob-tl-section-label{\n      font-size: 11px;\n      font-weight: 700;\n      letter-spacing: 1.5px;\n      text-transform: uppercase;\n      color: var(--esf-red);\n      margin-bottom: 14px;\n      padding: 6px 12px;\n      background: rgba(139, 26, 60, 0.08);\n      border-radius: 4px;\n      display: inline-block;\n      margin-left: -28px;\n    }\n    .esfp-root .mob-tl-section .mob-tl-group{\n      animation: none;\n      opacity: 1;\n      transform: none;\n    }\n\n    \/* Modal on mobile \u2014 bottom sheet style *\/\n    .esfp-root .modal-backdrop{\n      align-items: flex-end;\n      padding: 0;\n    }\n    .esfp-root .modal{\n      max-width: 100%;\n      width: 100%;\n      max-height: 88vh;\n      border-radius: 16px 16px 0 0;\n      padding: 24px 22px 82px;\n      transform: translateY(20px);\n    }\n    .esfp-root .modal-backdrop.open .modal{ transform: translateY(0); }\n    .esfp-root .modal::before{\n      content: '';\n      display: block;\n      width: 40px;\n      height: 4px;\n      background: rgba(139, 26, 60, 0.2);\n      border-radius: 2px;\n      margin: -8px auto 14px;\n    }\n    .esfp-root .modal-school-name{ font-size: 19px; }\n    .esfp-root .modal-fields{\n      grid-template-columns: 1fr;\n      gap: 0;\n    }\n    .esfp-root .modal-fields .label{\n      margin-top: 12px;\n      font-size: 10px;\n      text-transform: uppercase;\n      letter-spacing: 0.8px;\n    }\n    .esfp-root .modal-fields .label:first-child{ margin-top: 0; }\n    .esfp-root .modal-pathway-note{ display: none; }\n  }\n<\/style>\n<\/head>\n<body>\n<div class=\"esfp-root\">\n\n\n<!-- Image-style chart header -->\n<div class=\"chart-header\">\n  <div class=\"chart-header-right\">\n    <button class=\"reset-btn\" id=\"resetBtn\">Reset View<\/button>\n    <div class=\"chart-legend\" aria-label=\"Pathway legend\">\n      <div class=\"legend-row guaranteed\">\n        <div class=\"legend-swatch\"><\/div>\n        <div class=\"legend-label\">Guaranteed Pathway<\/div>\n      <\/div>\n      <div class=\"legend-row central\">\n        <div class=\"legend-swatch\"><\/div>\n        <div class=\"legend-label\">Central Allocation<\/div>\n      <\/div>\n      <div class=\"legend-row review\">\n        <div class=\"legend-swatch\"><\/div>\n        <div class=\"legend-label\">Placement is decided through the Admission and Review Process<\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<div class=\"chart\" id=\"chart\">\n  <svg class=\"connections\" id=\"svgConn\"><\/svg>\n\n  <!-- KG banners -->\n  <div class=\"tier-kg-banners\">\n    <div class=\"tier-banner\">Kindergarten (K1 - K2)<\/div>\n    <div class=\"tier-banner\">Kindergarten (K1 - K2)<\/div>\n  <\/div>\n\n  <!-- KG cards -->\n  <div class=\"tier-kg\">\n    <div class=\"kg-grid\">\n      <div class=\"name-card clickable\" data-id=\"kg-quarrybay\">ESF Quarry Bay School Kindergarten<span class=\"info-hint\">i<\/span><\/div>\n      <div class=\"name-card clickable\" data-id=\"kg-hillside\">ESF Hillside International Kindergarten<span class=\"info-hint\">i<\/span><\/div>\n      <div class=\"name-card clickable\" data-id=\"kg-westkowloon\">ESF West Kowloon Kindergarten<span class=\"info-hint\">i<\/span><\/div>\n      <div class=\"name-card clickable\" data-id=\"kg-wukaisha\">ESF Wu Kai Sha International Kindergarten<span class=\"info-hint\">i<\/span><\/div>\n      <div class=\"name-card clickable\" data-id=\"kg-tsingyi\">ESF Tsing Yi International Kindergarten<span class=\"info-hint\">i<\/span><\/div>\n    <\/div>\n    <div class=\"kg-grid-single\">\n      <div class=\"name-card clickable\" data-id=\"kg-renaissance\">ESF Renaissance College Kindergarten<span class=\"info-hint\">i<\/span><\/div>\n    <\/div>\n  <\/div>\n\n  <!-- Primary \/ All-Through banners.\n       The All-Through banner + subtitle covers ONLY Discovery + Renaissance\n       (2 of the 3 columns). Sarah Roe sits in its own column to the right\n       with no banner\/subtitle above (per the source image \u2014 she's exempt\n       from the HK Permanent Residency rule). -->\n  <div class=\"primary-banner-row\">\n    <div>\n      <div class=\"tier-banner\">Primary (Y1 - Y6)<\/div>\n      <div class=\"tier-subnote\">At least 70% non-local students with overseas passports (excluding BNO)<\/div>\n    <\/div>\n    <div class=\"at-banner-row\">\n      <!-- Red \"All Through (Y1 - Y13)\" banner spans all 3 AT columns (full width) -->\n      <div class=\"tier-banner at-banner-full\">All Through (Y1 - Y13)<\/div>\n      <!-- HKPR subtitle only covers Discovery + Renaissance (2 of 3 columns) -->\n      <div class=\"tier-subnote at-subnote-twothirds\">At least 70% students must hold Hong Kong Permanent Residency<\/div>\n    <\/div>\n  <\/div>\n\n  <!-- Primary + All-Through name-only cards (details open in modal) -->\n  <div class=\"primary-allthrough-row\">\n    <div class=\"primary-grid\">\n      <div class=\"name-card primary clickable\" data-id=\"p-quarrybay\">ESF Quarry Bay School<span class=\"info-hint\">i<\/span><\/div>\n      <div class=\"name-card primary clickable\" data-id=\"p-bradbury\">ESF Bradbury School<span class=\"info-hint\">i<\/span><\/div>\n      <div class=\"name-card primary clickable\" data-id=\"p-glenealy\">ESF Glenealy School<span class=\"info-hint\">i<\/span><\/div>\n      <div class=\"name-card primary clickable\" data-id=\"p-peak\">ESF Peak School<span class=\"info-hint\">i<\/span><\/div>\n      <div class=\"name-card primary clickable\" data-id=\"p-kennedy\">ESF Kennedy School<span class=\"info-hint\">i<\/span><\/div>\n      <div class=\"name-card primary clickable\" data-id=\"p-clearwaterbay\">ESF Clearwater Bay School<span class=\"info-hint\">i<\/span><\/div>\n      <div class=\"name-card primary clickable\" data-id=\"p-shatinjr\">ESF Sha Tin Junior School<span class=\"info-hint\">i<\/span><\/div>\n      <div class=\"name-card primary clickable\" data-id=\"p-beaconhill\">ESF Beacon Hill School<span class=\"info-hint\">i<\/span><\/div>\n      <div class=\"name-card primary clickable\" data-id=\"p-kowloonjr\">ESF Kowloon Junior School<span class=\"info-hint\">i<\/span><\/div>\n    <\/div>\n    <div class=\"allthrough-grid\">\n      <div class=\"name-card allthrough clickable\" data-id=\"at-discovery\">ESF Discovery College<span class=\"info-hint\">i<\/span><\/div>\n      <div class=\"name-card allthrough clickable\" data-id=\"at-renaissance\">ESF Renaissance College<span class=\"info-hint\">i<\/span><\/div>\n      <div class=\"name-card allthrough clickable\" data-id=\"at-jockeyclub\">ESF Jockey Club Sarah Roe School<span class=\"info-hint\">i<\/span><\/div>\n    <\/div>\n  <\/div>\n\n  <!-- Secondary tier \u2014 bottom row spans only the 9fr Primary column;\n       All-Through schools remain represented by their tall cards above\n       (matching the image's single-tall-box layout). -->\n  <div class=\"secondary-row\">\n    <div class=\"secondary-col\">\n      <div class=\"secondary-banner-grid\">\n        <div class=\"secondary-banner-full\">Secondary (Y7 - Y13)<\/div>\n        <div class=\"secondary-banner-full\">Secondary (Y7 - Y13)<\/div>\n        <div class=\"secondary-banner-full\">Secondary (Y7 - Y13)<\/div>\n        <div class=\"secondary-banner-full\">Secondary (Y7 - Y13)<\/div>\n        <div class=\"secondary-banner-full\">Secondary (Y7 - Y13)<\/div>\n      <\/div>\n      <div class=\"secondary-cards-grid\">\n        <div class=\"secondary-card clickable\" data-id=\"s-southisland\">ESF South Island School<span class=\"info-hint\">i<\/span><\/div>\n        <div class=\"secondary-card clickable\" data-id=\"s-island\">ESF Island School<span class=\"info-hint\">i<\/span><\/div>\n        <div class=\"secondary-card clickable\" data-id=\"s-westisland\">ESF West Island School<span class=\"info-hint\">i<\/span><\/div>\n        <div class=\"secondary-card clickable\" data-id=\"s-kgv\">ESF King George V School<span class=\"info-hint\">i<\/span><\/div>\n        <div class=\"secondary-card clickable\" data-id=\"s-shatincollege\">ESF Sha Tin College<span class=\"info-hint\">i<\/span><\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n<\/div>\n\n<!-- ============== MOBILE VIEW (\u2264768px) ============== -->\n<div id=\"mobileView\">\n  <div class=\"mob-appbar\">\n    <div class=\"mob-back\" id=\"mobBack\" hidden role=\"button\" tabindex=\"0\" aria-label=\"Back\">\n      <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" aria-hidden=\"true\" focusable=\"false\">\n        <path d=\"M15 5 L7 12 L15 19 M7 12 L20 12\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"\/>\n      <\/svg>\n    <\/div>\n    <div class=\"mob-titles\">\n      <div class=\"mob-title\" id=\"mobTitle\"><\/div>\n      <div class=\"mob-subtitle\" id=\"mobSubtitle\"><\/div>\n    <\/div>\n  <\/div>\n\n  <!-- Browse view -->\n  <div id=\"mobBrowse\">\n    <!-- Hero -->\n    <div class=\"mob-hero\">\n      <div class=\"mob-hero-title\">Educational Pathway for K1 in 2027\/28 and onwards<\/div>\n      <div class=\"mob-hero-sub\">Find your kindergarten and its associated primary and secondary schools.<\/div>\n      <div class=\"mob-hero-sub\">*Click any school to check out the pathway and school details.<\/div>\n      <div class=\"mob-hero-stats\">\n        <div class=\"mob-hero-stat\">\n          <div class=\"mob-hero-stat-num\">23<\/div>\n          <div class=\"mob-hero-stat-label\">Schools<\/div>\n        <\/div>\n        <div class=\"mob-hero-stat\">\n          <div class=\"mob-hero-stat-num\">K1\u2013Y13<\/div>\n          <div class=\"mob-hero-stat-label\">Year range<\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <!-- Sticky tabs -->\n    <div class=\"mob-tabs\">\n      <div class=\"mob-tabs-inner\" id=\"mobTabsInner\">\n        <button class=\"mob-tab active\" data-tab=\"kg\">Kindergarten <span class=\"mob-tab-count\">6<\/span><\/button>\n        <button class=\"mob-tab\" data-tab=\"primary\">Primary <span class=\"mob-tab-count\">9<\/span><\/button>\n        <button class=\"mob-tab\" data-tab=\"allthrough\">All-Through <span class=\"mob-tab-count\">3<\/span><\/button>\n        <button class=\"mob-tab\" data-tab=\"secondary\">Secondary <span class=\"mob-tab-count\">5<\/span><\/button>\n      <\/div>\n    <\/div>\n\n    <!-- Tier panels (only one visible at a time) -->\n    <div class=\"mob-tier-panel\" data-panel=\"kg\">\n      <div class=\"mob-tier-heading\">\n        <div class=\"mob-tier-heading-title\">Kindergarten<\/div>\n        <div class=\"mob-tier-heading-sub\">K1\u2013K2<\/div>\n      <\/div>\n      <div class=\"mob-card-grid\" id=\"mobListKg\"><\/div>\n    <\/div>\n\n    <div class=\"mob-tier-panel\" data-panel=\"primary\" hidden>\n      <div class=\"mob-tier-heading\">\n        <div class=\"mob-tier-heading-title\">Primary<\/div>\n        <div class=\"mob-tier-heading-sub\">Y1\u2013Y6<\/div>\n      <\/div>\n      <div class=\"mob-card-grid\" id=\"mobListPrimary\"><\/div>\n    <\/div>\n\n    <div class=\"mob-tier-panel\" data-panel=\"allthrough\" hidden>\n      <div class=\"mob-tier-heading\">\n        <div class=\"mob-tier-heading-title\">All-Through<\/div>\n        <div class=\"mob-tier-heading-sub\">Y1\u2013Y13<\/div>\n      <\/div>\n      <div class=\"mob-card-grid\" id=\"mobListAllthrough\"><\/div>\n    <\/div>\n\n    <div class=\"mob-tier-panel\" data-panel=\"secondary\" hidden>\n      <div class=\"mob-tier-heading\">\n        <div class=\"mob-tier-heading-title\">Secondary<\/div>\n        <div class=\"mob-tier-heading-sub\">Y7\u2013Y13<\/div>\n      <\/div>\n      <div class=\"mob-card-grid\" id=\"mobListSecondary\"><\/div>\n    <\/div>\n  <\/div>\n\n  <!-- Pathway view -->\n  <div id=\"mobPathway\" hidden>\n    <div class=\"mob-pathway\">\n      <div class=\"mob-pathway-intro\" id=\"mobPathwayIntro\"><\/div>\n      <div class=\"mob-timeline\" id=\"mobTimeline\"><\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- ============== MODAL ============== -->\n<div class=\"modal-backdrop\" id=\"modalBackdrop\">\n  <div class=\"modal\" id=\"modal\" role=\"dialog\" aria-modal=\"true\">\n    <div class=\"modal-close\" id=\"modalClose\" role=\"button\" tabindex=\"0\" aria-label=\"Close\">\n      <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" aria-hidden=\"true\" focusable=\"false\">\n        <path d=\"M5 5 L19 19 M19 5 L5 19\" stroke=\"currentColor\" stroke-width=\"2.6\" stroke-linecap=\"round\" fill=\"none\"\/>\n      <\/svg>\n    <\/div>\n    <div class=\"modal-school-name\" id=\"modalName\"><\/div>\n    <div class=\"modal-school-tier\" id=\"modalTier\"><\/div>\n    <div class=\"modal-fields\" id=\"modalFields\"><\/div>\n    <div class=\"modal-actions\" id=\"modalActions\"><\/div>\n    <div class=\"modal-enquiry\" id=\"modalEnquiry\"><\/div>\n  <\/div>\n<\/div>\n\n<script>\n  \/\/ ============================================\n  \/\/ SCHOOL DETAILS DATABASE\n  \/\/ ============================================\n  const SCHOOL_DETAILS = {\n    'kg-hillside': {\n      name: 'ESF Hillside International Kindergarten', tier: 'Kindergarten (K1\u2013K2)',\n      location: '43B Stubbs Road, Wan Chai', founded: '1999', students: '384', classes: '',\n      curriculum: 'IB PYP',\n      zh: { name: '\u82f1\u57fa\u66c9\u65b0\u570b\u969b\u5e7c\u7a1a\u5712', tier: '\u5e7c\u7a1a\u5712 (K1 - K2)', location: '\u9999\u6e2f\u53f8\u5f92\u62d4\u905343B\u865f', students: '384', classes: '', curriculum: '\u570b\u969b\u6587\u6191\u5c0f\u5b78\u8ab2\u7a0b' },\n      phone: '(+852) 2540 0066', email: 'kinder@hillside.edu.hk',\n      urls: { website: 'https:\/\/www.hillside.esf.edu.hk', tour: 'https:\/\/youtu.be\/9c13y3TZJrM', bus: 'https:\/\/school.kcm.com.hk\/esfhs\/' },\n    },\n    'kg-tsingyi': {\n      name: 'ESF Tsing Yi International Kindergarten', tier: 'Kindergarten (K1\u2013K2)',\n      location: 'Maritime Square, 33 Tsing King Road, Tsing Yi', founded: '1999', students: '392', classes: '',\n      curriculum: 'IB PYP',\n      zh: { name: '\u82f1\u57fa\u9752\u8863\u570b\u969b\u5e7c\u7a1a\u5712', tier: '\u5e7c\u7a1a\u5712 (K1 - K2)', location: '\u9999\u6e2f\u9752\u8863\u9752\u656c\u8def33\u865f\u5730\u4e0b\u53ca\u95a3\u6a13', students: '392', classes: '', curriculum: '\u570b\u969b\u6587\u6191\u5c0f\u5b78\u8ab2\u7a0b' },\n      phone: '(+852) 2436 3355', email: 'kinder@tyk.edu.hk',\n      urls: { website: 'https:\/\/www.tyk.esf.edu.hk', tour: 'https:\/\/youtu.be\/pD4ENHBVn3c', bus: 'https:\/\/www.esf.edu.hk\/wp-content\/uploads\/2025\/12\/Tsing-Yi-ESF-bus-route-Nov2025.pdf' },\n    },\n    'kg-wukaisha': {\n      name: 'ESF Wu Kai Sha International Kindergarten', tier: 'Kindergarten (K1\u2013K2)',\n      location: 'Level 1, 599 Sai Sha Road, Ma On Shan', founded: '2009', students: '350', classes: '',\n      curriculum: 'IB PYP',\n      zh: { name: '\u82f1\u57fa\u70cf\u6eaa\u6c99\u570b\u969b\u5e7c\u7a1a\u5712', tier: '\u5e7c\u7a1a\u5712 (K1 - K2)', location: '\u9999\u6e2f\u6c99\u7530\u99ac\u978d\u5c71\u897f\u6c99\u8def599\u865fL1', students: '350', classes: '', curriculum: '\u570b\u969b\u6587\u6191\u5c0f\u5b78\u8ab2\u7a0b' },\n      phone: '(+852) 2435 5291', email: 'kinder@wksk.edu.hk',\n      urls: { website: 'https:\/\/www.wksk.esf.edu.hk', tour: 'https:\/\/youtu.be\/PxGT0GbXRrY?si=fDerlJ1glxPgEiZ-', bus: 'https:\/\/www.esf.edu.hk\/wp-content\/uploads\/2025\/12\/Wu-Kai-Sha-ESF-bus-route-Nov2025-.pdf' },\n    },\n    'kg-renaissance': {\n      name: 'ESF Renaissance College Kindergarten', tier: 'Kindergarten (K1\u2013K2)',\n      location: 'Shop No. G01, G\/F, GO PARK 2, 8 Hoi Ying Road, New Territories', founded: 'Open in August 2026', students: '300', classes: '',\n      curriculum: 'IB PYP - English\/Dual Language Stream',\n      zh: { name: '\u82f1\u57fa\u5553\u65b0\u66f8\u9662\u5e7c\u7a1a\u5712', tier: '\u5e7c\u7a1a\u5712 (K1 - K2)', location: '\u9999\u6e2f\u6d77\u6620\u8def8\u865fG01', founded: '\u5c07\u65bc2026\u5e748\u6708\u958b\u5e55', students: '300', curriculum: '\u570b\u969b\u6587\u6191\u5c0f\u5b78\u8ab2\u7a0b - \u82f1\u8a9e\/\u96d9\u8a9e' },\n      phone: '(+852) 3977 5500', email: 'info@rchkk.edu.hk',\n      urls: { website: 'https:\/\/www.rchkk.esf.edu.hk', tour: 'https:\/\/www.youtube.com\/watch?v=GUXEYTuYb-Q', bus: null },\n    },\n    'kg-quarrybay': {\n      name: 'ESF Quarry Bay School Kindergarten', tier: 'Kindergarten (K1\u2013K2)',\n      location: '14 Hong Yue Street, Quarry Bay', founded: 'Open in August 2026', students: '200', classes: '',\n      curriculum: 'IB PYP',\n      zh: { name: '\u82f1\u57fa\u9c02\u9b5a\u6d8c\u5c0f\u5b78\u5e7c\u7a1a\u5712', tier: '\u5e7c\u7a1a\u5712 (K1 - K2)', location: '\u9999\u6e2f\u9c02\u9b5a\u6d8c\u5eb7\u6109\u885714\u865f', founded: '\u5c07\u65bc2026\u5e748\u6708\u958b\u5e55', students: '200', curriculum: '\u570b\u969b\u6587\u6191\u5c0f\u5b78\u8ab2\u7a0b' },\n      phone: '(+852) 3582 1900', email: 'kinder@qbsk.edu.hk',\n      urls: { website: 'https:\/\/www.qbsk.esf.edu.hk', tour: 'https:\/\/www.youtube.com\/watch?v=Nx5q1VrpGWw', bus: null },\n    },\n    'kg-westkowloon': {\n      name: 'ESF West Kowloon Kindergarten', tier: 'Kindergarten (K1\u2013K2)',\n      location: 'Unit 1 & 2, UG\/F, The Long Beach, No. 8 Hoi Fai Road', founded: 'Open in August 2026', students: '200', classes: '',\n      curriculum: 'IB PYP - English\/Dual Language Stream',\n      zh: { name: '\u82f1\u57fa\u897f\u4e5d\u9f8d\u5e7c\u7a1a\u5712', tier: '\u5e7c\u7a1a\u5712 (K1 - K2)', location: '\u9999\u6e2f\u4e5d\u9f8d\u6d77\u8f1d\u90538\u865fUG', founded: '\u5c07\u65bc2026\u5e748\u6708\u958b\u5e55', students: '200', curriculum: '\u570b\u969b\u6587\u6191\u5c0f\u5b78\u8ab2\u7a0b - \u82f1\u8a9e\/\u96d9\u8a9e' },\n      phone: '(+852) 3588 0988', email: 'info@wkk.edu.hk',\n      urls: { website: 'https:\/\/www.wkk.esf.edu.hk', tour: 'https:\/\/youtu.be\/B3c6hOsGZQo', bus: null },\n    },\n    'p-beaconhill': {\n      name: 'ESF Beacon Hill School', tier: 'Primary (Y1\u2013Y6)',\n      location: '23 Ede Road, Kowloon Tong', founded: '1967', students: '540', classes: '3',\n      curriculum: 'IB PYP',\n      zh: { name: '\u82f1\u57fa\u7562\u67b6\u5c71\u5c0f\u5b78', tier: '\u5c0f\u5b78 (Y1 - Y6)', location: '\u9999\u6e2f\u4e5d\u9f8d\u5858\u7fa9\u5fb7\u905323\u865f', students: '540', classes: '3', curriculum: '\u570b\u969b\u6587\u6191\u5c0f\u5b78\u8ab2\u7a0b' },\n      phone: '(+852) 2336 5221', email: 'bhs@bhs.edu.hk',\n      urls: { website: 'https:\/\/www.beaconhill.esf.edu.hk', tour: 'https:\/\/youtu.be\/6ibhqckzexA?si=mAviNP3g0iL2AUGG', bus: 'https:\/\/www.esf.edu.hk\/wp-content\/uploads\/2025\/12\/BHS-2025-26_proposed-schedule-route-jul2025.pdf' },\n    },\n    'p-bradbury': {\n      name: 'ESF Bradbury School', tier: 'Primary (Y1\u2013Y6)',\n      location: '43C Stubbs Road, Mid-Levels East', founded: '1992', students: '720', classes: '4 - 5',\n      curriculum: 'IB PYP',\n      zh: { name: '\u82f1\u57fa\u767d\u666e\u7406\u5c0f\u5b78', tier: '\u5c0f\u5b78 (Y1 - Y6)', location: '\u9999\u6e2f\u53f8\u5f92\u62d4\u905343\u865fC', students: '720', classes: '4 - 5', curriculum: '\u570b\u969b\u6587\u6191\u5c0f\u5b78\u8ab2\u7a0b' },\n      phone: '(+852) 2574 8249', email: 'enquiries@bradbury.edu.hk',\n      urls: { website: 'https:\/\/www.bradbury.esf.edu.hk', tour: 'https:\/\/www.youtube.com\/watch?v=KDLsmxxqVd4&list=PL0Jwa25708diDKz70ZuJZBZyid9Rvv4c6&index=10', bus: 'https:\/\/school.kcm.com.hk\/bradbury\/' },\n    },\n    'p-clearwaterbay': {\n      name: 'ESF Clearwater Bay School', tier: 'Primary (Y1\u2013Y6)',\n      location: 'DD 229, Lot 235, Clearwater Bay Road, Clearwater Bay', founded: '1992', students: '720', classes: '4',\n      curriculum: 'IB PYP',\n      zh: { name: '\u82f1\u57fa\u6e05\u6c34\u7063\u5c0f\u5b78', tier: '\u5c0f\u5b78 (Y1 - Y6)', location: '\u9999\u6e2f\u4e5d\u9f8d\u6e05\u6c34\u7063\u9053DD229\u5730\u6bb5235\u865f', students: '720', classes: '4', curriculum: '\u570b\u969b\u6587\u6191\u5c0f\u5b78\u8ab2\u7a0b' },\n      phone: '(+852) 2358 3221', email: 'info@cwbs.edu.hk',\n      urls: { website: 'https:\/\/www.cwbs.esf.edu.hk', tour: 'https:\/\/www.youtube.com\/watch?v=e20TQ7f1F6Y&list=PL0Jwa25708diDKz70ZuJZBZyid9Rvv4c6&index=12', bus: 'https:\/\/www.esf.edu.hk\/wp-content\/uploads\/2025\/12\/CWBS-Bus-List-2025-26-jun2025.pdf' },\n    },\n    'p-glenealy': {\n      name: 'ESF Glenealy School', tier: 'Primary (Y1\u2013Y6)',\n      location: '7 Hornsey Road, Mid-levels', founded: '1959', students: '360', classes: '2',\n      curriculum: 'IB PYP',\n      zh: { name: '\u82f1\u57fa\u5df1\u9023\u62ff\u5c0f\u5b78', tier: '\u5c0f\u5b78 (Y1 - Y6)', location: '\u9999\u6e2f\u534a\u5c71\u9999\u96ea\u90537\u865f', students: '360', classes: '2', curriculum: '\u570b\u969b\u6587\u6191\u5c0f\u5b78\u8ab2\u7a0b' },\n      phone: '(+852) 2522 1919', email: 'enquiry@glenealy.edu.hk',\n      urls: { website: 'https:\/\/www.glenealy.esf.edu.hk', tour: null, bus: 'https:\/\/school.kcm.com.hk\/gjs\/' },\n    },\n    'p-kennedy': {\n      name: 'ESF Kennedy School', tier: 'Primary (Y1\u2013Y6)',\n      location: '19 Sha Wan Drive, Pokfulam, Hong Kong', founded: '1961', students: '900', classes: '5',\n      curriculum: 'IB PYP',\n      zh: { name: '\u82f1\u57fa\u5805\u5c3c\u5730\u5c0f\u5b78', tier: '\u5c0f\u5b78 (Y1 - Y6)', location: '\u9999\u6e2f\u8584\u6276\u6797\u6c99\u7063\u5f9119\u865f', students: '900', classes: '5', curriculum: '\u570b\u969b\u6587\u6191\u5c0f\u5b78\u8ab2\u7a0b' },\n      phone: '(+852) 2579 5600', email: 'admissions@kennedy.edu.hk',\n      urls: { website: 'https:\/\/www.kennedy.esf.edu.hk', tour: 'https:\/\/www.youtube.com\/watch?v=ntp5_3CoXZ8&list=PL0Jwa25708diDKz70ZuJZBZyid9Rvv4c6&index=3', bus: 'https:\/\/school.kcm.com.hk\/kennedy\/' },\n    },\n    'p-kowloonjr': {\n      name: 'ESF Kowloon Junior School', tier: 'Primary (Y1\u2013Y6)',\n      location: '20 Perth Street, Homantin', founded: '1902', students: '900', classes: '5',\n      curriculum: 'IB PYP',\n      zh: { name: '\u82f1\u57fa\u4e5d\u9f8d\u5c0f\u5b78', tier: '\u5c0f\u5b78 (Y1 - Y6)', location: '\u9999\u6e2f\u4f55\u6587\u7530\u5df4\u5bcc\u885720\u865f', students: '900', classes: '5', curriculum: '\u570b\u969b\u6587\u6191\u5c0f\u5b78\u8ab2\u7a0b' },\n      phone: '(+852) 3765 8700', email: 'office@kjs.edu.hk',\n      urls: { website: 'https:\/\/www.kjs.esf.edu.hk', tour: 'https:\/\/youtu.be\/wkaL0INEcE0', bus: 'https:\/\/www.esf.edu.hk\/wp-content\/uploads\/2025\/12\/KJS-Bus-schedule-2025-2026-aug2025.pdf' },\n    },\n    'p-peak': {\n      name: 'ESF Peak School', tier: 'Primary (Y1\u2013Y6)',\n      location: '20 Plunketts Road, The Peak', founded: '1911', students: '360', classes: '2',\n      curriculum: 'IB PYP',\n      zh: { name: '\u82f1\u57fa\u5c71\u9802\u5c0f\u5b78', tier: '\u5c0f\u5b78 (Y1 - Y6)', location: '\u9999\u6e2f\u5c71\u9802\u8cd3\u5409\u905320\u865f', students: '360', classes: '2', curriculum: '\u570b\u969b\u6587\u6191\u5c0f\u5b78\u8ab2\u7a0b' },\n      phone: '(+852) 2849 7211', email: 'admissions@peakschool.edu.hk',\n      urls: { website: 'https:\/\/www.ps.esf.edu.hk', tour: 'https:\/\/youtu.be\/tlV3RxJE4eo', bus: 'https:\/\/school.kcm.com.hk\/peakschool\/' },\n    },\n    'p-quarrybay': {\n      name: 'ESF Quarry Bay School', tier: 'Primary (Y1\u2013Y6)',\n      location: '6 Hau Yuen Path, Braemar Hill', founded: '1926', students: '720', classes: '4',\n      curriculum: 'IB PYP',\n      zh: { name: '\u82f1\u57fa\u9c02\u9b5a\u6d8c\u5c0f\u5b78', tier: '\u5c0f\u5b78 (Y1 - Y6)', location: '\u9999\u6e2f\u5317\u89d2\u5bf6\u99ac\u5c71\u6821\u5712\u5f916\u865f', students: '720', classes: '4', curriculum: '\u570b\u969b\u6587\u6191\u5c0f\u5b78\u8ab2\u7a0b' },\n      phone: '(+852) 2566 4242', email: 'office@qbs.edu.hk',\n      urls: { website: 'https:\/\/www.qbs.esf.edu.hk', tour: 'https:\/\/www.youtube.com\/watch?v=Z0nutI2V3tM&list=PL0Jwa25708diDKz70ZuJZBZyid9Rvv4c6&index=7', bus: 'https:\/\/www.esf.edu.hk\/wp-content\/uploads\/2025\/12\/QBS-Bus-schedule-2025-2026-aug2025.pdf' },\n    },\n    'p-shatinjr': {\n      name: 'ESF Sha Tin Junior School', tier: 'Primary (Y1\u2013Y6)',\n      location: '3A Lai Wo Lane, Fo Tan', founded: '1988', students: '900', classes: '5',\n      curriculum: 'IB PYP',\n      zh: { name: '\u82f1\u57fa\u6c99\u7530\u5c0f\u5b78', tier: '\u5c0f\u5b78 (Y1 - Y6)', location: '\u9999\u6e2f\u6c99\u7530\u706b\u70ad\u9e97\u79be\u91cc3\u865fA', students: '900', classes: '5', curriculum: '\u570b\u969b\u6587\u6191\u5c0f\u5b78\u8ab2\u7a0b' },\n      phone: '(+852) 2692 2721', email: 'info@sjs.edu.hk',\n      urls: { website: 'https:\/\/www.sjs.esf.edu.hk', tour: 'https:\/\/youtu.be\/rD877b5wh5g', bus: 'https:\/\/www.esf.edu.hk\/wp-content\/uploads\/2025\/12\/SJS-route-list-from-web-page-Term-2-Jan-March-2026.pdf' },\n    },\n    'at-discovery': {\n      name: 'ESF Discovery College', tier: 'All-Through (Y1\u2013Y13)',\n      location: '38 Siena Avenue, Discovery Bay', founded: '2008', students: '1,470', classes: '4',\n      curriculum: 'Y1 - Y6: IB PYP\\nY7 - Y11: IB MYP\\nY12 - Y13: IBDP\/IBCP',\n      zh: { name: '\u82f1\u57fa\u667a\u65b0\u66f8\u9662', tier: '\u4e00\u689d\u9f8d\u5b78\u6821 (Y1 - Y13)', location: '\u9999\u6e2f\u5927\u5dbc\u5c71\u6109\u666f\u7063\u6f84\u6e56\u7554\u8def38\u865f', students: '1,470', classes: '4', curriculum: 'Y1 - Y6: \u570b\u969b\u6587\u6191\u5c0f\u5b78\u8ab2\u7a0b\\nY7 - Y11: \u570b\u969b\u6587\u6191\u4e2d\u5b78\u8ab2\u7a0b\\nY12 - Y13: \u570b\u969b\u6587\u6191\u5927\u5b78\u9810\u79d1\u8ab2\u7a0b\/\u570b\u969b\u6587\u6191\u8077\u696d\u76f8\u95dc\u8ab2\u7a0b' },\n      phone: '(+852) 3969 1000', email: 'office@discovery.edu.hk',\n      urls: { website: 'https:\/\/www.discovery.esf.edu.hk', tour: 'https:\/\/www.youtube.com\/watch?v=qBqXz1gLWcI&list=PL0Jwa25708diDKz70ZuJZBZyid9Rvv4c6&index=8', bus: 'https:\/\/school.kcm.com.hk\/discovery\/' },\n    },\n    'at-renaissance': {\n      name: 'ESF Renaissance College', tier: 'All-Through (Y1\u2013Y13)',\n      location: '5 Hang Ming Street, Ma On Shan', founded: '2006', students: '2,127', classes: '6',\n      curriculum: 'Y1 - Y6: IB PYP\\nY7 - Y11: IB MYP\\nY12 - Y13: IBDP\/IBCP',\n      zh: { name: '\u82f1\u57fa\u5553\u65b0\u66f8\u9662', tier: '\u4e00\u689d\u9f8d\u5b78\u6821 (Y1 - Y13)', location: '\u9999\u6e2f\u99ac\u978d\u5c71\u6046\u660e\u88575\u865f', students: '2,127', classes: '6', curriculum: 'Y1 - Y6: \u570b\u969b\u6587\u6191\u5c0f\u5b78\u8ab2\u7a0b\\nY7 - Y11: \u570b\u969b\u6587\u6191\u4e2d\u5b78\u8ab2\u7a0b\\nY12 - Y13: \u570b\u969b\u6587\u6191\u5927\u5b78\u9810\u79d1\u8ab2\u7a0b\/\u570b\u969b\u6587\u6191\u8077\u696d\u76f8\u95dc\u8ab2\u7a0b' },\n      phone: '(+852) 3556 3556', email: 'admissions@rchk.edu.hk',\n      urls: { website: 'https:\/\/www.rchk.esf.edu.hk', tour: 'https:\/\/youtu.be\/Lcqqzy0o0Bs', bus: 'https:\/\/school.kcm.com.hk\/rchk\/' },\n    },\n    'at-jockeyclub': {\n      name: 'ESF Jockey Club Sarah Roe School', tier: 'All-Through (Y1\u2013Y13)',\n      location: '2B Tin Kwong Rd, Ho Man Tin', founded: '1986', students: '70', classes: '6',\n      curriculum: 'Bespoke curriculum\\nAll secondary-aged students access accredited ASDAN courses',\n      zh: { name: '\u82f1\u57fa\u8cfd\u99ac\u6703\u5584\u6a02\u5b78\u6821', tier: '\u4e00\u689d\u9f8d\u5b78\u6821 (Y1 - Y13)', location: '\u9999\u6e2f\u4f55\u6587\u7530\u5929\u5149\u90532B', students: '70', classes: '6', curriculum: '\u8a02\u88fd\u8ab2\u7a0b \u6240\u6709\u7b26\u5408\u4e2d\u5b78\u5e74\u9f61\u7684\u5b78\u751f\u6703\u4fee\u8b80\u82f1\u570b\u7d20\u8cea\u6559\u80b2\u767c\u5c55\u8a8d\u8b49\u4e2d\u5fc3\u7684\u8ab2\u7a0b', website: 'https:\/\/jcsrs.esf.edu.hk\/zh\/' },\n      phone: '(+852) 2761 9893', email: 'office@jcsrs.edu.hk',\n      urls: { website: 'https:\/\/jcsrs.esf.edu.hk\/en\/', tour: null, bus: null },\n    },\n    's-island': {\n      name: 'ESF Island School', tier: 'Secondary (Y7\u2013Y13)',\n      location: '20 Borrett Road, Mid-Levels', founded: '1967', students: '1,357', classes: '6 - 12',\n      curriculum: 'Y7-Y9: IBMYP + Elements Courses\\nY10-Y11: GCSE\/IGCSE\\nY12-Y17: IBDP\/IBC\/BTEC',\n      zh: { name: '\u82f1\u57fa\u6e2f\u5cf6\u4e2d\u5b78', tier: '\u4e2d\u5b78 (Y7 - Y13)', location: '\u9999\u6e2f\u534a\u5c71\u6ce2\u8001\u905320\u865f', students: '1,357', classes: '6 - 12', curriculum: 'Y7-Y9: \u570b\u969b\u6587\u6191\u4e2d\u5b78\u8ab2\u7a0b + \u57fa\u790e\u8ab2\u7a0b\\nY10-Y11: \u4e2d\u5b78\u6559\u80b2\u666e\u901a\u8b49\u66f8\/ \u570b\u969b\u4e2d\u5b78\u6559\u80b2\u666e\u901a\u8b49\u66f8\\nY12-Y17: \u570b\u969b\u6587\u6191\u5927\u5b78\u9810\u79d1\u8ab2\u7a0b\/\u570b\u969b\u6587\u6191\u8077\u696d\u76f8\u95dc\u8ab2\u7a0b\/\u82f1\u570b\u5546\u696d\u8207\u6280\u8853\u6559\u80b2\u59d4\u54e1\u6703\u8ab2\u7a0b' },\n      phone: '(+852) 2524 7135', email: 'school@online.island.edu.hk',\n      urls: { website: 'https:\/\/www.island.esf.edu.hk', tour: 'https:\/\/www.youtube.com\/watch?v=Sg7cfHUFvmY&list=PL0Jwa25708diDKz70ZuJZBZyid9Rvv4c6&index=17', bus: 'https:\/\/school.kcm.com.hk\/island\/' },\n    },\n    's-kgv': {\n      name: 'ESF King George V School', tier: 'Secondary (Y7\u2013Y13)',\n      location: '2 Tin Kwong Road, Homantin', founded: '1902', students: '1,950', classes: '14-16',\n      curriculum: 'Y7-Y9: IBMYP\\nY10-Y11: GCSE\/IGCSE\\nY12-Y13: IBDP\/IBCP\/BTEC',\n      zh: { name: '\u82f1\u57fa\u82f1\u7687\u4f50\u6cbb\u4e94\u4e16\u5b78\u6821', tier: '\u4e2d\u5b78 (Y7 - Y13)', location: '\u9999\u6e2f\u4f55\u6587\u7530\u5929\u5149\u90532\u865f', students: '1,950', classes: '14 - 16', curriculum: 'Y7-Y9: \u570b\u969b\u6587\u6191\u4e2d\u5b78\u8ab2\u7a0b\\nY10-Y11: \u4e2d\u5b78\u6559\u80b2\u666e\u901a\u8b49\u66f8\/ \u570b\u969b\u4e2d\u5b78\u6559\u80b2\u666e\u901a\u8b49\u66f8\\nY12-Y13: \u570b\u969b\u6587\u6191\u5927\u5b78\u9810\u79d1\u8ab2\u7a0b\/\u570b\u969b\u6587\u6191\u8077\u696d\u76f8\u95dc\u8ab2\u7a0b\/\u82f1\u570b\u5546\u696d\u8207\u6280\u8853\u6559\u80b2\u59d4\u54e1\u6703\u8ab2\u7a0b' },\n      phone: '(+852) 2711 3029', email: 'office@kgv.edu.hk',\n      urls: { website: 'https:\/\/www.kgv.esf.edu.hk', tour: 'https:\/\/www.youtube.com\/watch?v=JEXh46ZWngM', bus: 'https:\/\/kgv.esf.edu.hk\/parent\/communications\/bus_information\/' },\n    },\n    's-shatincollege': {\n      name: 'ESF Sha Tin College', tier: 'Secondary (Y7\u2013Y13)',\n      location: '3 Lai Wo Lane, Fo Tan', founded: '1982', students: '1,262', classes: '8',\n      curriculum: 'Y7-Y9: IBMYP\\nY10-Y11: IGCSE\\nY12-Y13: IBDP\/IBCP',\n      zh: { name: '\u82f1\u57fa\u6c99\u7530\u5b78\u9662', tier: '\u4e2d\u5b78 (Y7 - Y13)', location: '\u9999\u6e2f\u6c99\u7530\u7a57\u79be\u8def\u9e97\u79be\u91cc3\u865f', students: '1,262', classes: '8', curriculum: 'Y7-Y9: \u570b\u969b\u6587\u6191\u4e2d\u5b78\u8ab2\u7a0b\\nY10-Y11: \u570b\u969b\u4e2d\u5b78\u6559\u80b2\u666e\u901a\u8b49\u66f8\\nY12-Y13: \u570b\u969b\u6587\u6191\u5927\u5b78\u9810\u79d1\u8ab2\u7a0b\/\u570b\u969b\u6587\u6191\u8077\u696d\u76f8\u95dc\u8ab2\u7a0b' },\n      phone: '(+852) 2699 1811', email: 'info@shatincollege.edu.hk',\n      urls: { website: 'https:\/\/www.shatincollege.esf.edu.hk', tour: 'https:\/\/youtu.be\/eCR1jXy9zgc', bus: 'https:\/\/www.esf.edu.hk\/wp-content\/uploads\/2025\/12\/STC-route-list-from-web-page-Term-2-Jan-March-2026.pdf' },\n    },\n    's-southisland': {\n      name: 'ESF South Island School', tier: 'Secondary (Y7\u2013Y13)',\n      location: '50 Nam Fung Road, Aberdeen', founded: '1977', students: '1,421', classes: '6',\n      curriculum: 'Y7-Y9: IBMYP\\nY10-Y11: GCSE\/IGCSE\\nY12-Y16: IBDP\/IBCP\/BTEC',\n      zh: { name: '\u82f1\u57fa\u5357\u5cf6\u4e2d\u5b78', tier: '\u4e2d\u5b78 (Y7 - Y13)', location: '\u9999\u6e2f\u9999\u6e2f\u4ed4\u5357\u98a8\u905350\u865f', students: '1,421', classes: '6', curriculum: 'Y7-Y9: \u570b\u969b\u6587\u6191\u4e2d\u5b78\u8ab2\u7a0b\\nY10-Y11: \u4e2d\u5b78\u6559\u80b2\u666e\u901a\u8b49\u66f8\/ \u570b\u969b\u4e2d\u5b78\u6559\u80b2\u666e\u901a\u8b49\u66f8\\nY12-Y16: \u570b\u969b\u6587\u6191\u5927\u5b78\u9810\u79d1\u8ab2\u7a0b\/\u570b\u969b\u6587\u6191\u8077\u696d\u76f8\u95dc\u8ab2\u7a0b\/\u82f1\u570b\u5546\u696d\u8207\u6280\u8853\u6559\u80b2\u59d4\u54e1\u6703\u8ab2\u7a0b' },\n      phone: '(+852) 2555 9313', email: 'sis@sis.edu.hk',\n      urls: { website: 'https:\/\/www.sis.esf.edu.hk', tour: 'https:\/\/www.youtube.com\/watch?v=WEsPoVV6uVU&list=PL0Jwa25708diDKz70ZuJZBZyid9Rvv4c6&index=16', bus: 'https:\/\/school.kcm.com.hk\/sisland\/' },\n    },\n    's-westisland': {\n      name: 'ESF West Island School', tier: 'Secondary (Y7\u2013Y13)',\n      location: '250 Victoria Road, Pokfulam', founded: '1991', students: '1,228', classes: '6',\n      curriculum: 'Y7-Y9: IBMYP\\nY10-Y11: GCSE\/IGCSE\\nY12-Y13: IBDP\/IBCP\/BTEC',\n      zh: { name: '\u82f1\u57fa\u897f\u5cf6\u4e2d\u5b78', tier: '\u4e2d\u5b78 (Y7 - Y13)', location: '\u9999\u6e2f\u8584\u6276\u6797\u57df\u591a\u5229\u9053250\u865f', students: '1,228', classes: '6', curriculum: 'Y7-Y9: \u570b\u969b\u6587\u6191\u4e2d\u5b78\u8ab2\u7a0b\\nY10-Y11: \u4e2d\u5b78\u6559\u80b2\u666e\u901a\u8b49\u66f8\/ \u570b\u969b\u4e2d\u5b78\u6559\u80b2\u666e\u901a\u8b49\u66f8\\nY12-Y13: \u570b\u969b\u6587\u6191\u5927\u5b78\u9810\u79d1\u8ab2\u7a0b\/\u570b\u969b\u6587\u6191\u8077\u696d\u76f8\u95dc\u8ab2\u7a0b\/\u82f1\u570b\u5546\u696d\u8207\u6280\u8853\u6559\u80b2\u59d4\u54e1\u6703\u8ab2\u7a0b' },\n      phone: '(+852) 2819 1962', email: 'wis@wis.edu.hk',\n      urls: { website: 'https:\/\/www.wis.esf.edu.hk', tour: null, bus: 'https:\/\/school.kcm.com.hk\/wis\/' },\n    },\n  };\n\n  \/\/ ============================================\n  \/\/ LANGUAGE  (URL contains \"zh-hant\" \u2192 Traditional Chinese).\n  \/\/ All content is sourced verbatim from the Excel fact sheet (CN sheets).\n  \/\/ Anything the Excel does not provide stays in its English form.\n  \/\/ ============================================\n  const LANG = 'zh';  \/\/ Chinese-only build\n\n  function getDetail(id){\n    const d = SCHOOL_DETAILS[id];\n    if (!d) return null;\n    const z = (LANG === 'zh' && d.zh) ? d.zh : {};\n    const pick = (k) => (z[k] != null && z[k] !== '') ? z[k] : d[k];\n    \/\/ urls are shared, but a zh entry may override the website (e.g. \/zh\/ page)\n    const urls = Object.assign({}, d.urls || {});\n    if (z.website) urls.website = z.website;\n    return {\n      name: pick('name'), tier: pick('tier'), location: pick('location'),\n      founded: pick('founded'), students: pick('students'), classes: pick('classes'),\n      curriculum: pick('curriculum'), phone: d.phone, email: d.email, urls,\n    };\n  }\n\n  const I18N = {\n    en: { location:'Location', founded:'Founded', students:'Target Places', classes:'Classes per Grade',\n          curriculum:'Curriculum', enquiry:'Enquiry', tour:'School Video',\n          bus:'2025-26 School Bus Services', website:'School Website' },\n    zh: { location:'\u5730\u5740', founded:'\u5275\u7acb\u5e74\u4efd', students:'\u76ee\u6a19\u5b78\u4f4d', classes:'\u6bcf\u7d1a\u5e73\u5747\u73ed\u5225\u6578\u91cf',\n          curriculum:'\u8ab2\u7a0b', enquiry:'\u62db\u751f\u67e5\u8a62', tour:'\u5b78\u6821\u77ed\u7247',\n          bus:'2025\/26 \u6821\u8eca\u670d\u52d9', website:'\u7db2\u7ad9' },\n  };\n  const L = I18N[LANG];\n\n  \/\/ Banner + student-composition wording per language (from the Excel CN sheets)\n  const BANNERS_ZH = { kg:'\u5e7c\u7a1a\u5712 (K1 - K2)', primary:'\u5c0f\u5b78 (Y1 - Y6)', allthrough:'\u4e00\u689d\u9f8d\u5b78\u6821 (Y1 - Y13)', secondary:'\u4e2d\u5b78 (Y7 - Y13)' };\n  const COMP_ZH = {\n    overseas:'\u81f3\u5c11\u9304\u53d670%\u6301\u6709\u6d77\u5916\u8b77\u7167\u7684\u975e\u672c\u5730\u5b78\u751f\uff08\u4e0d\u5305\u62ec\u9999\u6e2f\u7279\u5225\u884c\u653f\u5340\u53ca\u82f1\u570b\u570b\u6c11\uff08\u6d77\u5916\uff09\u8b77\u7167\uff09',\n    hkpr:'\u81f3\u5c11\u9304\u53d670%\u6301\u6709\u9999\u6e2f\u6c38\u4e45\u6027\u5c45\u6c11\u8eab\u4efd\u7684\u5b78\u751f',\n  };\n\n  function applyLanguage(){\n    if (LANG !== 'zh') return;\n    document.documentElement.lang = 'zh-Hant';\n    \/\/ Desktop cards: replace the school name (keep the \"i\" info hint)\n    document.querySelectorAll('.esfp-root [data-id]').forEach(card => {\n      const d = getDetail(card.dataset.id);\n      if (!d) return;\n      const hint = card.querySelector('.info-hint');\n      card.textContent = d.name;\n      if (hint) card.appendChild(hint);\n    });\n    \/\/ Tier banners\n    document.querySelectorAll('.tier-kg-banners .tier-banner').forEach(b => b.textContent = BANNERS_ZH.kg);\n    const pb = document.querySelector('.primary-banner-row .tier-banner:not(.at-banner-full)');\n    if (pb) pb.textContent = BANNERS_ZH.primary;\n    const atb = document.querySelector('.at-banner-full');\n    if (atb) atb.textContent = BANNERS_ZH.allthrough;\n    document.querySelectorAll('.secondary-banner-full').forEach(b => b.textContent = BANNERS_ZH.secondary);\n    \/\/ Student-composition subnotes\n    const sn = document.querySelector('.primary-banner-row .tier-subnote:not(.at-subnote-twothirds)');\n    if (sn) sn.textContent = COMP_ZH.overseas;\n    const atn = document.querySelector('.at-subnote-twothirds');\n    if (atn) atn.textContent = COMP_ZH.hkpr;\n    \/\/ Pathway legend (desktop)\n    const legendZh = {\n      guaranteed: '\u4fdd\u8b49\u5347\u8b80\u8def\u5f91',\n      central:    '\u4e2d\u592e\u5206\u914d\u8def\u5f91',\n      review:     '\u5b78\u4f4d\u5b89\u6392\u9700\u6839\u64da\u62db\u751f\u548c\u5be9\u67e5\u6d41\u7a0b\u8a55\u4f30',\n    };\n    document.querySelectorAll('.legend-row').forEach(row => {\n      const key = ['guaranteed','central','review'].find(k => row.classList.contains(k));\n      const label = row.querySelector('.legend-label');\n      if (key && label) label.textContent = legendZh[key];\n    });\n    \/\/ Reset button\n    const rb = document.getElementById('resetBtn');\n    if (rb) rb.textContent = '\u91cd\u8a2d\u6aa2\u8996';\n    \/\/ Mobile hero intro\n    const ht = document.querySelector('.mob-hero-title');\n    if (ht) ht.textContent = 'K1\u7684\u6559\u80b2\u8def\u5f91 (2027\/28\u5b78\u5e74\u958b\u59cb)';\n    const subs = document.querySelectorAll('.mob-hero-sub');\n    if (subs[0]) subs[0].textContent = '\u5c0b\u627e\u9069\u5408\u4f60\u7684\u5e7c\u7a1a\u5712\u53ca\u76f8\u95dc\u5c0f\u5b78\u548c\u4e2d\u5b78\u3002';\n    if (subs[1]) subs[1].textContent = '*\u9ede\u64ca\u4efb\u4f55\u5b78\u6821\uff0c\u67e5\u770b\u6559\u80b2\u8def\u5f91\u53ca\u5b78\u6821\u8a73\u60c5\u3002';\n    \/\/ Mobile hero stat labels\n    const statZh = { 'Schools':'\u5b78\u6821', 'Year range':'\u5e74\u7d1a\u7bc4\u570d' };\n    document.querySelectorAll('.mob-hero-stat-label').forEach(el => {\n      const k = el.textContent.trim();\n      if (statZh[k]) el.textContent = statZh[k];\n    });\n    \/\/ Mobile tab labels + tier headings\n    const tabZh = { kg:'\u5e7c\u7a1a\u5712', primary:'\u5c0f\u5b78', allthrough:'\u4e00\u689d\u9f8d', secondary:'\u4e2d\u5b78' };\n    document.querySelectorAll('.mob-tab').forEach(t => {\n      const c = t.querySelector('.mob-tab-count');\n      t.textContent = (tabZh[t.dataset.tab] || t.textContent.trim()) + ' ';\n      if (c) t.appendChild(c);\n    });\n    const headZh = { 'Kindergarten':'\u5e7c\u7a1a\u5712', 'Primary':'\u5c0f\u5b78', 'All-Through':'\u4e00\u689d\u9f8d', 'Secondary':'\u4e2d\u5b78' };\n    document.querySelectorAll('.mob-tier-heading-title').forEach(h => {\n      const k = h.textContent.trim(); if (headZh[k]) h.textContent = headZh[k];\n    });\n    \/\/ Mobile pathway tier labels\n    Object.assign(TIER_LABELS, { kg:'\u5e7c\u7a1a\u5712 \u00b7 K1\u2013K2', primary:'\u5c0f\u5b78 \u00b7 Y1\u2013Y6', allthrough:'\u4e00\u689d\u9f8d \u00b7 Y1\u2013Y13', secondary:'\u4e2d\u5b78 \u00b7 Y7\u2013Y13' });\n  }\n\n  \/\/ ============================================\n  \/\/ PATHWAY GRAPH \u2014 each edge declares its line type:\n  \/\/   guaranteed: solid red (1:1 KG \u2192 matched primary; primary \u2192 associated secondary)\n  \/\/   central:    dashed pink (KG \u2192 multiple primaries, central allocation pool)\n  \/\/   review:     dashed grey (KG \u2192 All-Through college, decided via Admission & Review)\n  \/\/ ============================================\n  const FEEDS_TYPED = {\n    \/\/ KG \u2192 Primary\n    'kg-quarrybay':    [['p-quarrybay', 'guaranteed']],\n    'kg-hillside':     [['p-bradbury', 'central'], ['p-glenealy', 'central'], ['p-peak', 'central']],\n    'kg-westkowloon':  [['p-kennedy', 'central'], ['p-clearwaterbay', 'central']],\n    'kg-wukaisha':     [['p-shatinjr', 'central'], ['p-beaconhill', 'central']],\n    'kg-tsingyi':      [['p-beaconhill', 'central'], ['p-kowloonjr', 'central'], ['at-discovery', 'central']],\n    \/\/ Renaissance KG \u2192 Renaissance College is a solid red Guaranteed Pathway\n    \/\/ (1:1 feed). The line to Sarah Roe is DECORATIVE only: it stays drawn\n    \/\/ (anchored visually to the \"All Through\" banner above her column) but it\n    \/\/ is NOT part of the click-highlight graph \u2014 so clicking RCK only lights\n    \/\/ up RC, and clicking JCSRS does not light up RCK.\n    'kg-renaissance':  [\n      ['at-renaissance', 'guaranteed'],\n      ['at-jockeyclub', 'review', { decorative: true }],\n    ],\n    \/\/ Primary \u2192 Secondary (official ESF associated secondary list \u2014 Guaranteed Pathway)\n    'p-bradbury':      [['s-southisland', 'guaranteed']],\n    'p-quarrybay':     [['s-southisland', 'guaranteed']],\n    'p-glenealy':      [['s-island', 'guaranteed']],\n    'p-peak':          [['s-island', 'guaranteed']],\n    'p-kennedy':       [['s-westisland', 'guaranteed']],\n    'p-beaconhill':    [['s-island', 'guaranteed']],\n    'p-kowloonjr':     [['s-kgv', 'guaranteed']],\n    'p-clearwaterbay': [['s-kgv', 'guaranteed']],\n    'p-shatinjr':      [['s-shatincollege', 'guaranteed']],\n    \/\/ All-Through schools have no separate secondary cards in this layout \u2014\n    \/\/ their tall cards above already cover the Y1\u2013Y13 range (matches the image).\n  };\n\n  \/\/ Build simple FEEDS (id-only) for pathway traversal. DECORATIVE edges are\n  \/\/ omitted here so the click-highlight graph doesn't follow them \u2014 they only\n  \/\/ exist visually (still rendered by drawConnections via the full CONNECTIONS\n  \/\/ list below).\n  const FEEDS = {};\n  Object.entries(FEEDS_TYPED).forEach(([from, edges]) => {\n    FEEDS[from] = edges\n      .filter(([, , opts]) => !(opts && opts.decorative))\n      .map(([to]) => to);\n  });\n\n  const REVERSE = {};\n  Object.entries(FEEDS).forEach(([from, tos]) => {\n    tos.forEach(to => { (REVERSE[to] = REVERSE[to] || []).push(from); });\n  });\n\n  \/\/ Connection id \u2192 line type, for fast lookup when drawing\/highlighting.\n  \/\/ CONNECTIONS keeps EVERY edge (decorative ones included) so the visual line\n  \/\/ to Sarah Roe still gets drawn.\n  const CONNECTION_TYPES = {};\n  const CONNECTIONS = [];\n  Object.entries(FEEDS_TYPED).forEach(([from, edges]) => {\n    edges.forEach(([to, type, opts]) => {\n      const id = `${from}__${to}`;\n      CONNECTIONS.push({ from, to, id, type, decorative: !!(opts && opts.decorative) });\n      CONNECTION_TYPES[id] = type;\n    });\n  });\n\n  \/\/ ============================================\n  \/\/ DRAW ORTHOGONAL CONNECTIONS + DOM ARROWHEADS\n  \/\/ ============================================\n  function drawConnections() {\n    const svg = document.getElementById('svgConn');\n    const chart = document.getElementById('chart');\n    const chartRect = chart.getBoundingClientRect();\n\n    svg.setAttribute('width', chartRect.width);\n    svg.setAttribute('height', chartRect.height);\n    svg.innerHTML = '';\n\n    \/\/ Clear any existing arrowhead divs from previous draws\n    chart.querySelectorAll('.line-arrow').forEach(a => a.remove());\n\n    \/\/ Pre-compute Y-ranges of any banner that could block horizontal connectors.\n    \/\/ These sit at z-index 2 and would hide a horizontal SVG segment routed through them.\n    const blockingBanners = Array.from(\n      chart.querySelectorAll('.tier-banner, .secondary-banner-full, .tier-subnote')\n    ).map(el => {\n      const r = el.getBoundingClientRect();\n      return { top: r.top - chartRect.top, bottom: r.bottom - chartRect.top };\n    });\n\n    \/\/ ---- PASS 1: measure every connection's endpoints ----\n    \/\/ Special-case: the Renaissance-KG \u2192 Sarah Roe edge is logically present\n    \/\/ (so highlighting still works in both directions), but the drawn line\n    \/\/ visually originates from the \"All Through (Y1 - Y13)\" banner directly\n    \/\/ above Sarah Roe's column \u2014 matches the source-image convention.\n    const SPECIAL_FROM_BANNER = new Set(['kg-renaissance__at-jockeyclub']);\n    const atBanner = chart.querySelector('.at-banner-full');\n\n    \/\/ Primary\u2192Secondary arrows land on the Secondary BANNER (not the card) \u2014\n    \/\/ matching the designer image and giving the drop a longer run. Each\n    \/\/ banner shares its column centre with the secondary card below it.\n    const SECONDARY_ORDER = ['s-southisland', 's-island', 's-westisland', 's-kgv', 's-shatincollege'];\n    const secondaryBanners = Array.from(\n      chart.querySelectorAll('.secondary-banner-grid .secondary-banner-full')\n    );\n\n    const segments = [];\n    CONNECTIONS.forEach(conn => {\n      \/\/ Tsing Yi \u2192 Discovery is drawn specially (via the HKPR box) below.\n      if (conn.id === 'kg-tsingyi__at-discovery') return;\n      const fromEl = document.querySelector(`[data-id=\"${conn.from}\"]`);\n      const toEl = document.querySelector(`[data-id=\"${conn.to}\"]`);\n      if (!fromEl || !toEl) return;\n\n      \/\/ Target = the secondary banner if this is a Primary\u2192Secondary edge,\n      \/\/ otherwise the destination card itself.\n      const secIdx = SECONDARY_ORDER.indexOf(conn.to);\n      const targetRect = (secIdx >= 0 && secondaryBanners[secIdx])\n        ? secondaryBanners[secIdx].getBoundingClientRect()\n        : toEl.getBoundingClientRect();\n\n      const x2 = targetRect.left + targetRect.width \/ 2 - chartRect.left;\n      const y2 = targetRect.top - chartRect.top - 4;\n\n      let x1, y1;\n      if (SPECIAL_FROM_BANNER.has(conn.id) && atBanner) {\n        \/\/ Drop straight out of the bottom of the banner, in Sarah Roe's column.\n        const bannerRect = atBanner.getBoundingClientRect();\n        x1 = x2;                                          \/\/ same column as target\n        y1 = bannerRect.bottom - chartRect.top;\n      } else {\n        const fromRect = fromEl.getBoundingClientRect();\n        x1 = fromRect.left + fromRect.width \/ 2 - chartRect.left;\n        y1 = fromRect.bottom - chartRect.top;\n      }\n\n      segments.push({ conn, x1, y1, x2, y2 });\n    });\n\n    \/\/ ---- PASS 1.5: spread overlapping arrow drops on shared destinations ----\n    \/\/ When two or more lines terminate at the same card (e.g. Wu Kai Sha and\n    \/\/ Tsing Yi both feed Beacon Hill), their final vertical drops would land\n    \/\/ on the exact same x and visually merge into one arrow. Spread them\n    \/\/ symmetrically around the card centre so each incoming line gets its\n    \/\/ own column. The trunk still merges them on the shared horizontal Y;\n    \/\/ the spread only affects the last vertical segment + arrowhead.\n    const X_SPREAD = 26;  \/\/ gap between adjacent incoming arrows\n    const byDest = {};\n    segments.forEach(s => {\n      (byDest[s.conn.to] = byDest[s.conn.to] || []).push(s);\n    });\n    Object.values(byDest).forEach(group => {\n      if (group.length <= 1) return;\n      \/\/ Primary\u2192Secondary lines that share a destination MERGE into a single\n      \/\/ arrow (matching the designer image) \u2014 so keep the same x2 and let them\n      \/\/ converge on one vertical drop. Only KG\u2192Primary convergences (e.g.\n      \/\/ Beacon Hill fed by two KGs) get spread into separate arrows.\n      if (group[0].conn.to.startsWith('s-')) return;\n      group.sort((a, b) => a.x1 - b.x1);                     \/\/ left-most source first\n      const startOffset = -((group.length - 1) * X_SPREAD) \/ 2;\n      group.forEach((s, i) => {\n        const dx = startOffset + i * X_SPREAD;\n        \/\/ Decorative banner-anchored lines keep x1=x2 \u2014 they're already\n        \/\/ single-source. Skip those.\n        if (s.conn.decorative) return;\n        s.x2 += dx;\n      });\n    });\n\n    \/\/ ---- PASS 2: shared-trunk horizontal routing ----\n    \/\/ Match the source-image: every line in the same tier transition shares\n    \/\/ ONE horizontal trunk, placed just ABOVE the destination cards. That\n    \/\/ means each connector falls straight down from its source (through any\n    \/\/ banner in the way), then fans out at the last moment right above the\n    \/\/ destination row \u2014 the \"joint\u4f4d\u4fc2\u53bb\u5230primary school\u4e0a\u9762\u5148\u5206\u958b\" look.\n    const TRANSITION_KEY = s => `${Math.round(s.y1)}_${Math.round(s.y2)}`;\n    const groups = {};\n    segments.forEach(s => {\n      s.horizontal = Math.abs(s.x2 - s.x1) > 2;\n      if (!s.horizontal) return;\n      (groups[TRANSITION_KEY(s)] = groups[TRANSITION_KEY(s)] || []).push(s);\n    });\n\n    const TRUNK_FROM_DEST = 32;  \/\/ gap above destination card top (longer arrow drop)\n    const BANNER_CLEAR     = 6;  \/\/ minimum gap below any blocking banner\n    const SOURCE_FLOOR     = 10; \/\/ don't crowd the source row either\n\n    Object.values(groups).forEach(group => {\n      const sample = group[0];\n      const banner = blockingBanners.find(b => b.top > sample.y1 + 2 && b.top < sample.y2);\n\n      \/\/ Primary\u2192Secondary routing \u2014 nested \"staircase\" per the designer image.\n      \/\/ Each secondary gets its OWN horizontal rail. All feeders of that\n      \/\/ secondary drop to its rail and merge into one spine that descends into\n      \/\/ the banner. Rails are ordered by reach: the secondary whose feeders\n      \/\/ come from furthest away (Island, fed by Beacon Hill on the far right)\n      \/\/ gets the HIGHEST rail, so its long run sits up top and its spine drops\n      \/\/ cleanly over everything; the most-vertical destination (West Island,\n      \/\/ fed by the aligned Kennedy) sits lowest. Result: tidy concentric\n      \/\/ brackets instead of tangled crossings.\n      const isToSecondary = group.every(s => s.conn.to.startsWith('s-'));\n      if (isToSecondary) {\n        const destSpan = {};\n        group.forEach(s => {\n          destSpan[s.conn.to] = Math.max(destSpan[s.conn.to] || 0, Math.abs(s.x2 - s.x1));\n        });\n        const dests = [...new Set(group.map(s => s.conn.to))]\n          .sort((a, b) => destSpan[a] - destSpan[b]);   \/\/ smallest reach first (lowest rail)\n        const gapBot = sample.y2 - 18;                   \/\/ lowest rail, just above banners\n        const gapTop = sample.y1 + 18;                   \/\/ highest rail, just under primaries\n        const n = dests.length;\n        const railOf = {};\n        dests.forEach((d, i) => {\n          const t = n > 1 ? i \/ (n - 1) : 0;             \/\/ 0 \u2192 bottom, 1 \u2192 top\n          railOf[d] = gapBot - t * (gapBot - gapTop);\n        });\n        group.forEach(s => { s.midY = railOf[s.conn.to]; });\n        return;\n      }\n\n      \/\/ KG\u2192Primary \/ KG\u2192All-Through: single shared trunk hugging the\n      \/\/ destination cards (the \"joint above primary\" look).\n      let trunkY = sample.y2 - TRUNK_FROM_DEST;\n      if (banner) trunkY = Math.max(trunkY, banner.bottom + BANNER_CLEAR);\n      trunkY = Math.max(trunkY, sample.y1 + SOURCE_FLOOR);\n      group.forEach(s => { s.midY = trunkY; });\n    });\n\n    \/\/ Straight-down (no horizontal offset) connectors keep a simple midpoint.\n    segments.forEach(s => {\n      if (!s.horizontal) s.midY = s.y1 + (s.y2 - s.y1) * 0.5;\n    });\n\n    \/\/ ---- DRAW ----\n    segments.forEach(({ conn, x1, y1, x2, y2, midY }) => {\n      const d = `M ${x1} ${y1} L ${x1} ${midY} L ${x2} ${midY} L ${x2} ${y2}`;\n      const typeClass = `line-${conn.type || 'guaranteed'}`;\n\n      \/\/ Line path (sits behind cards at z-index 1)\n      const path = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'path');\n      path.setAttribute('d', d);\n      path.setAttribute('data-connection', conn.id);\n      path.setAttribute('data-type', conn.type);\n      path.setAttribute('data-to', conn.to);\n      path.setAttribute('data-from', conn.from);\n      path.classList.add(typeClass);\n      svg.appendChild(path);\n\n      \/\/ Measure path length so the trace animation knows how far to draw\n      const length = path.getTotalLength();\n      path.style.setProperty('--draw-length', length);\n\n      \/\/ Arrowhead DOM element (sits above cards at z-index 4)\n      const arrow = document.createElement('div');\n      arrow.className = `line-arrow ${typeClass}`;\n      arrow.setAttribute('data-connection', conn.id);\n      arrow.setAttribute('data-type', conn.type);\n      arrow.setAttribute('data-to', conn.to);\n      arrow.setAttribute('data-from', conn.from);\n      arrow.style.left = `${x2}px`;\n      arrow.style.top = `${y2}px`;\n      chart.appendChild(arrow);\n    });\n\n    \/\/ ---- Special render: Tsing Yi \u2192 Discovery via the HKPR box ----\n    \/\/ The \"kg-tsingyi__at-discovery\" feeder is drawn as TWO dashed segments:\n    \/\/   1. Tsing Yi \u2192 arrow pointing INTO the box's left edge, at its vertical\n    \/\/      middle (a sideways arrow \u2014 no text crossing)\n    \/\/   2. the box  \u2192 arrow dropping onto the ESF Discovery College card\n    \/\/ Both segments share the same data-connection, so click-highlighting the\n    \/\/ Discovery pathway still lights up the whole run.\n    (function drawDiscoveryViaBox(){\n      const conn = CONNECTIONS.find(c => c.id === 'kg-tsingyi__at-discovery');\n      if (!conn) return;\n      const fromEl = document.querySelector('[data-id=\"kg-tsingyi\"]');\n      const boxEl  = chart.querySelector('.at-subnote-twothirds');\n      const toEl   = document.querySelector('[data-id=\"at-discovery\"]');\n      if (!fromEl || !boxEl || !toEl) return;\n\n      \/\/ Clean up any overlay left from earlier experiments.\n      const oldOverlay = chart.querySelector('#svgConnOverlay');\n      if (oldOverlay) oldOverlay.remove();\n\n      const fr = fromEl.getBoundingClientRect();\n      const br = boxEl.getBoundingClientRect();\n      const tr = toEl.getBoundingClientRect();\n\n      const x1       = fr.left + fr.width \/ 2 - chartRect.left;\n      const y1       = fr.bottom - chartRect.top;\n      const discX    = tr.left + tr.width \/ 2 - chartRect.left;   \/\/ Discovery column centre\n      const boxLeftX = br.left - chartRect.left;\n      const boxTopY  = br.top - chartRect.top;\n      const boxBot   = br.bottom - chartRect.top;\n      \/\/ Enter the box at the SAME y-axis as the Kowloon Junior feeder (the\n      \/\/ other Tsing Yi branch), clamped to stay on the box.\n      const kjSeg = segments.find(s => s.conn.id === 'kg-tsingyi__p-kowloonjr');\n      let boxMidY = kjSeg ? kjSeg.midY : (boxTopY + br.height \/ 2 + 16);\n      boxMidY = Math.max(boxTopY + 10, Math.min(boxMidY, boxBot - 8));\n\n      const typeClass = `line-${conn.type}`;\n      const addPath = (d) => {\n        const p = document.createElementNS('http:\/\/www.w3.org\/2000\/svg', 'path');\n        p.setAttribute('d', d);\n        p.setAttribute('data-connection', conn.id);\n        p.setAttribute('data-type', conn.type);\n        p.setAttribute('data-to', conn.to);\n        p.setAttribute('data-from', conn.from);\n        p.classList.add(typeClass);\n        svg.appendChild(p);\n        p.style.setProperty('--draw-length', p.getTotalLength());\n      };\n      const addArrow = (x, y, dir) => {\n        const a = document.createElement('div');\n        a.className = `line-arrow ${typeClass}`;\n        a.setAttribute('data-connection', conn.id);\n        a.setAttribute('data-type', conn.type);\n        a.setAttribute('data-to', conn.to);\n        a.setAttribute('data-from', conn.from);\n        a.style.left = `${x}px`;\n        a.style.top = `${y}px`;\n        if (dir === 'right') {            \/\/ sideways (right-pointing) arrowhead\n          a.style.width = '10px';\n          a.style.height = '13px';\n          a.style.clipPath = 'polygon(100% 50%, 0 0, 0 100%)';\n          a.style.marginLeft = '-10px';\n          a.style.marginTop = '-6.5px';\n        }\n        chart.appendChild(a);\n      };\n\n      \/\/ Segment 1 \u2014 Tsing Yi \u2192 into the box's left edge at its vertical middle.\n      \/\/ (No arrowhead \u2014 the line just meets the box.)\n      addPath(`M ${x1} ${y1} L ${x1} ${boxMidY} L ${boxLeftX} ${boxMidY}`);\n\n      \/\/ Segment 2 \u2014 the box \u2192 Discovery card (straight dashed drop, like old.html)\n      const arrow2Y = tr.top - chartRect.top - 4;\n      addPath(`M ${discX} ${boxBot} L ${discX} ${arrow2Y}`);\n      addArrow(discX, arrow2Y, 'down');\n    })();\n  }\n\n  \/\/ ============================================\n  \/\/ PATHWAY HIGHLIGHTING\n  \/\/ ============================================\n  function getPathway(id) {\n    const nodes = new Set([id]);\n    const connections = new Set();\n    function down(n) {\n      (FEEDS[n] || []).forEach(next => {\n        connections.add(`${n}__${next}`);\n        if (!nodes.has(next)) { nodes.add(next); down(next); }\n      });\n    }\n    function up(n) {\n      (REVERSE[n] || []).forEach(prev => {\n        connections.add(`${prev}__${n}`);\n        if (!nodes.has(prev)) { nodes.add(prev); up(prev); }\n      });\n    }\n    down(id); up(id);\n\n    \/\/ Light up DECORATIVE lines that visually terminate at the selected node\n    \/\/ (e.g. the line into ESF Jockey Club Sarah Roe School visually comes\n    \/\/ from the \"All Through (Y1 - Y13)\" banner). The originating node is NOT\n    \/\/ added to the pathway \u2014 only the line \u2014 so the selection visually\n    \/\/ \"points to the banner area\" rather than back to RCK.\n    CONNECTIONS.forEach(conn => {\n      if (conn.decorative && conn.to === id) {\n        connections.add(conn.id);\n      }\n    });\n\n    return { nodes, connections };\n  }\n\n  \/\/ Enumerate every complete root-to-leaf path that passes through `id`.\n  \/\/ Used by the mobile pathway view so each branch can be shown as its own\n  \/\/ self-contained chain (KG \u2192 Primary \u2192 Secondary), making the parent-child\n  \/\/ relationship explicit instead of relying on tier grouping.\n  function computeCompletePaths(id) {\n    function walkUp(n) {\n      const parents = REVERSE[n] || [];\n      if (parents.length === 0) return [[n]];\n      const out = [];\n      parents.forEach(p => walkUp(p).forEach(prefix => out.push([...prefix, n])));\n      return out;\n    }\n    function walkDown(n) {\n      const children = FEEDS[n] || [];\n      if (children.length === 0) return [[n]];\n      const out = [];\n      children.forEach(c => walkDown(c).forEach(suffix => out.push([n, ...suffix])));\n      return out;\n    }\n    const ups = walkUp(id);\n    const downs = walkDown(id);\n    const all = [];\n    ups.forEach(up => downs.forEach(down => all.push([...up, ...down.slice(1)])));\n\n    \/\/ The through-train colleges appear twice in the graph: once as `at-*`\n    \/\/ (Primary-level all-through) and again as `s-*college` (Secondary-level\n    \/\/ all-through). They're the same school. Trim the trailing duplicate so\n    \/\/ mobile pathways don't show \"Discovery College\" twice in a row.\n    \/\/ No tails to trim \u2014 all-through schools no longer have duplicate secondary nodes.\n    const allThroughTail = {};\n    return all.map(path => {\n      if (path.length >= 2 && allThroughTail[path[path.length - 2]] === path[path.length - 1]) {\n        return path.slice(0, -1);\n      }\n      return path;\n    });\n  }\n\n  let selectedId = null;\n  let cascadeTimeouts = [];\n  const allClickables = document.querySelectorAll('.clickable');\n\n  function tierOf(id) {\n    if (id.startsWith('kg-')) return 'kg';\n    if (id.startsWith('p-')) return 'primary';\n    if (id.startsWith('at-')) return 'allthrough';\n    if (id.startsWith('s-')) return 'secondary';\n    return 'unknown';\n  }\n\n  function highlight(id) {\n    \/\/ Cancel any pending cascade from previous selection\n    cascadeTimeouts.forEach(t => clearTimeout(t));\n    cascadeTimeouts = [];\n\n    selectedId = id;\n    const { nodes, connections } = getPathway(id);\n\n    \/\/ Step 1: dim everything first (smooth fade \u2014 fast, so it becomes visible quickly)\n    allClickables.forEach(el => {\n      el.classList.remove('highlighted', 'selected', 'cascade-enter');\n      el.classList.add('dimmed');\n    });\n    document.querySelectorAll('[data-connection]').forEach(p => {\n      p.classList.remove('highlighted', 'cascade-line');\n      p.classList.add('dimmed');\n    });\n\n    \/\/ Step 2: cascade highlight tier-by-tier (KG \u2192 Primary \u2192 All-Through \u2192 Secondary)\n    const tierOrder = ['kg', 'primary', 'allthrough', 'secondary'];\n    const INITIAL_DELAY = 180;  \/\/ wait for dim to be visible\n    const TIER_DELAY = 220;     \/\/ pace between tiers\n\n    tierOrder.forEach((tier, idx) => {\n      const t = setTimeout(() => {\n        \/\/ Light up nodes in this tier that are part of the pathway\n        allClickables.forEach(el => {\n          const nodeId = el.dataset.id;\n          if (!nodeId || !nodes.has(nodeId) || tierOf(nodeId) !== tier) return;\n          el.classList.remove('dimmed', 'cascade-enter');\n          \/\/ Force reflow so the animation restarts each cascade\n          void el.offsetWidth;\n          el.classList.add('cascade-enter');\n          if (nodeId === id) el.classList.add('selected');\n          else el.classList.add('highlighted');\n        });\n\n        \/\/ Light up the connections that LEAD INTO this tier.\n        \/\/ Dashed types (central\/review) skip the trace animation, otherwise\n        \/\/ it would temporarily override stroke-dasharray and erase the dashes.\n        document.querySelectorAll('[data-connection]').forEach(p => {\n          if (!connections.has(p.dataset.connection)) return;\n          const [, toId] = p.dataset.connection.split('__');\n          if (tierOf(toId) === tier) {\n            p.classList.remove('dimmed', 'cascade-line');\n            void p.offsetWidth;\n            p.classList.add('highlighted');\n            const isDashed = p.classList.contains('line-central') || p.classList.contains('line-review');\n            if (!isDashed) p.classList.add('cascade-line');\n          }\n        });\n      }, INITIAL_DELAY + idx * TIER_DELAY);\n      cascadeTimeouts.push(t);\n    });\n\n    document.getElementById('resetBtn').classList.add('show');\n  }\n\n  function reset() {\n    cascadeTimeouts.forEach(t => clearTimeout(t));\n    cascadeTimeouts = [];\n    selectedId = null;\n    allClickables.forEach(el => el.classList.remove('highlighted', 'dimmed', 'selected', 'cascade-enter'));\n    document.querySelectorAll('[data-connection]').forEach(p => {\n      p.classList.remove('highlighted', 'dimmed', 'cascade-line');\n    });\n    document.getElementById('resetBtn').classList.remove('show');\n  }\n\n  \/\/ ============================================\n  \/\/ MODAL\n  \/\/ ============================================\n  const modalBackdrop = document.getElementById('modalBackdrop');\n  const modalName = document.getElementById('modalName');\n  const modalTier = document.getElementById('modalTier');\n  const modalFields = document.getElementById('modalFields');\n  const modalActions = document.getElementById('modalActions');\n  const modalEnquiry = document.getElementById('modalEnquiry');\n\n  function openModal(id) {\n    const d = getDetail(id);\n    if (!d) return;\n\n    modalName.textContent = d.name;\n    modalTier.textContent = d.tier;\n\n    \/\/ Only render fields the Excel actually provides (skip blanks).\n    const rows = [\n      [L.location,   d.location,   false],\n      [L.founded,    d.founded,    false],\n      [L.students,   d.students,   false],\n      [L.classes,    d.classes,    false],\n      [L.curriculum, d.curriculum, true ],\n    ].filter(([, v]) => v != null && String(v).trim() !== '');\n    modalFields.innerHTML = rows.map(([label, v, isCurr]) =>\n      `<div class=\"label\">${label}<\/div><div class=\"value${isCurr ? ' curriculum' : ''}\">${isCurr ? String(v).replace(\/\\n\/g, '<br>') : v}<\/div>`\n    ).join('');\n\n    \/\/ Only show a button when the Excel has a real link for it.\n    const urls = d.urls || {};\n    const btns = [];\n    if (urls.tour)    btns.push([L.tour,    urls.tour]);\n    if (urls.bus)     btns.push([L.bus,     urls.bus]);\n    if (urls.website) btns.push([L.website, urls.website]);\n    modalActions.innerHTML = btns.map(([label, href]) =>\n      `<a class=\"modal-btn\" href=\"${href}\" target=\"_blank\" rel=\"noopener noreferrer\">${label}<\/a>`\n    ).join('');\n\n    let enq = `<div class=\"modal-enquiry-label\">${L.enquiry}<\/div>`;\n    if (d.phone && String(d.phone).trim()) enq += `<div class=\"modal-enquiry-phone\">${d.phone}<\/div>`;\n    if (d.email && String(d.email).trim()) enq += `<a class=\"modal-enquiry-email\" href=\"mailto:${d.email}\">${d.email}<\/a>`;\n    modalEnquiry.innerHTML = enq;\n\n    modalBackdrop.classList.add('open');\n  }\n\n  function closeModal() {\n    modalBackdrop.classList.remove('open');\n  }\n\n  const modalCloseEl = document.getElementById('modalClose');\n  modalCloseEl.addEventListener('click', closeModal);\n  modalCloseEl.addEventListener('keydown', (e) => {\n    if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); closeModal(); }\n  });\n  modalBackdrop.addEventListener('click', (e) => {\n    if (e.target === modalBackdrop) closeModal();\n  });\n  document.addEventListener('keydown', (e) => {\n    if (e.key === 'Escape' && modalBackdrop.classList.contains('open')) closeModal();\n  });\n\n  \/\/ ============================================\n  \/\/ CLICK HANDLER\n  \/\/ Card body \u2192 pathway highlight\n  \/\/ Info icon \u2192 modal popup (stop propagation so card click doesn't also fire)\n  \/\/ ============================================\n  allClickables.forEach(el => {\n    el.addEventListener('click', (e) => {\n      e.stopPropagation();\n      const id = el.dataset.id;\n      if (!id) return;\n      if (selectedId === id) reset();\n      else highlight(id);\n    });\n  });\n\n  document.querySelectorAll('.info-hint').forEach(icon => {\n    icon.addEventListener('click', (e) => {\n      e.stopPropagation();\n      const card = icon.closest('.clickable');\n      if (card && SCHOOL_DETAILS[card.dataset.id]) {\n        openModal(card.dataset.id);\n      }\n    });\n  });\n\n  document.getElementById('resetBtn').addEventListener('click', reset);\n\n  \/\/ ============================================\n  \/\/ MOBILE VIEW\n  \/\/ ============================================\n  const MOBILE_SCHOOLS = {\n    kg: [\n      { id: 'kg-quarrybay', name: 'ESF Quarry Bay School Kindergarten' },\n      { id: 'kg-hillside', name: 'ESF Hillside International Kindergarten' },\n      { id: 'kg-westkowloon', name: 'ESF West Kowloon Kindergarten' },\n      { id: 'kg-wukaisha', name: 'ESF Wu Kai Sha International Kindergarten' },\n      { id: 'kg-tsingyi', name: 'ESF Tsing Yi International Kindergarten' },\n      { id: 'kg-renaissance', name: 'ESF Renaissance College Kindergarten' },\n    ],\n    primary: [\n      { id: 'p-quarrybay', name: 'ESF Quarry Bay School', meta: 'Braemar Hill \u00b7 1926' },\n      { id: 'p-bradbury', name: 'ESF Bradbury School', meta: 'Mid-Levels East \u00b7 1992' },\n      { id: 'p-glenealy', name: 'ESF Glenealy School', meta: 'Mid-Levels \u00b7 1959' },\n      { id: 'p-peak', name: 'ESF Peak School', meta: 'The Peak \u00b7 1911' },\n      { id: 'p-kennedy', name: 'ESF Kennedy School', meta: 'Pokfulam \u00b7 1961' },\n      { id: 'p-clearwaterbay', name: 'ESF Clearwater Bay School', meta: 'Clearwater Bay \u00b7 1992' },\n      { id: 'p-shatinjr', name: 'ESF Sha Tin Junior School', meta: 'Fo Tan \u00b7 1988' },\n      { id: 'p-beaconhill', name: 'ESF Beacon Hill School', meta: 'Kowloon Tong \u00b7 1967' },\n      { id: 'p-kowloonjr', name: 'ESF Kowloon Junior School', meta: 'Homantin \u00b7 1902' },\n    ],\n    allthrough: [\n      { id: 'at-discovery', name: 'ESF Discovery College', meta: 'Discovery Bay \u00b7 2008' },\n      { id: 'at-renaissance', name: 'ESF Renaissance College', meta: 'Ma On Shan \u00b7 2006' },\n      { id: 'at-jockeyclub', name: 'ESF Jockey Club Sarah Roe School', meta: 'Homantin \u00b7 1986' },\n    ],\n    secondary: [\n      { id: 's-southisland', name: 'ESF South Island School' },\n      { id: 's-island', name: 'ESF Island School' },\n      { id: 's-westisland', name: 'ESF West Island School' },\n      { id: 's-kgv', name: 'ESF King George V School' },\n      { id: 's-shatincollege', name: 'ESF Sha Tin College' },\n    ],\n  };\n\n  const TIER_LABELS = {\n    kg: 'Kindergarten \u00b7 K1\u2013K2',\n    primary: 'Primary \u00b7 Y1\u2013Y6',\n    allthrough: 'All-Through \u00b7 Y1\u2013Y13',\n    secondary: 'Secondary \u00b7 Y7\u2013Y13',\n  };\n\n  \/\/ Build a lookup table: id \u2192 tier\n  const ID_TO_TIER = {};\n  Object.entries(MOBILE_SCHOOLS).forEach(([tier, list]) => {\n    list.forEach(s => { ID_TO_TIER[s.id] = tier; });\n  });\n\n  \/\/ Render browse lists\n  function renderMobileBrowse() {\n    const listTargets = {\n      kg: 'mobListKg',\n      primary: 'mobListPrimary',\n      allthrough: 'mobListAllthrough',\n      secondary: 'mobListSecondary',\n    };\n    Object.entries(MOBILE_SCHOOLS).forEach(([tier, list]) => {\n      const container = document.getElementById(listTargets[tier]);\n      container.innerHTML = list.map(s => {\n        let metaText = s.meta || '';\n        \/\/ Hide the address (district) for primary cards \u2014 keep just the year.\n        if (tier === 'primary' && metaText.includes('\u00b7')) metaText = metaText.split('\u00b7').pop().trim();\n        return `\n        <div class=\"mob-card\" data-mob-id=\"${s.id}\" data-tier=\"${tier}\">\n          <div class=\"mob-card-accent\"><\/div>\n          <div class=\"mob-card-body\">\n            <div class=\"mob-card-name\">${(getDetail(s.id) || {}).name || s.name}<\/div>\n          <\/div>\n          <div class=\"mob-card-arrow\">\u203a<\/div>\n        <\/div>\n      `;\n      }).join('');\n    });\n\n    \/\/ Wire up taps\n    document.querySelectorAll('.mob-card').forEach(item => {\n      item.addEventListener('click', () => {\n        showMobilePathway(item.dataset.mobId);\n      });\n    });\n\n    \/\/ Wire up tab switching\n    document.querySelectorAll('.mob-tab').forEach(tab => {\n      tab.addEventListener('click', () => {\n        const target = tab.dataset.tab;\n        document.querySelectorAll('.mob-tab').forEach(t => t.classList.toggle('active', t === tab));\n        document.querySelectorAll('.mob-tier-panel').forEach(p => {\n          p.hidden = (p.dataset.panel !== target);\n        });\n      });\n    });\n  }\n\n  \/\/ Render pathway timeline for selected school\n  function showMobilePathway(selectedId) {\n    const { nodes } = getPathway(selectedId);\n    const selectedName = findSchoolName(selectedId);\n    const paths = computeCompletePaths(selectedId);\n\n    \/\/ Build timeline HTML \u2014 each complete pathway gets its own section so the\n    \/\/ parent-child relationship is unambiguous. (Previously every primary and\n    \/\/ every secondary appeared in flat tier rows, losing which primary leads\n    \/\/ to which secondary \u2014 same logical issue as the desktop X-crossing.)\n    const timeline = document.getElementById('mobTimeline');\n    const multiPath = paths.length > 1;\n\n    const EDGE_LABELS = (LANG === 'zh') ? {\n      guaranteed: '\u4fdd\u8b49\u5347\u8b80\u8def\u5f91',\n      central:    '\u4e2d\u592e\u5206\u914d\u8def\u5f91',\n      review:     '\u62db\u751f\u548c\u5be9\u67e5\u6d41\u7a0b',\n    } : {\n      guaranteed: 'Guaranteed Pathway',\n      central:    'Central Allocation',\n      review:     'Admission & Review',\n    };\n\n    timeline.innerHTML = paths.map((path, pathIdx) => {\n      const steps = path.map((id, stepIdx) => {\n        const tier = ID_TO_TIER[id];\n        const isCurrent = id === selectedId;\n        const hasDetails = !!SCHOOL_DETAILS[id];\n\n        \/\/ Show how we got from the previous step to this one (skip the first step).\n        let edgeBadge = '';\n        if (stepIdx > 0) {\n          const edgeId = `${path[stepIdx - 1]}__${id}`;\n          const edgeType = CONNECTION_TYPES[edgeId];\n          if (edgeType && EDGE_LABELS[edgeType]) {\n            edgeBadge = `<div class=\"mob-tl-edge edge-${edgeType}\">${EDGE_LABELS[edgeType]}<\/div>`;\n          }\n        }\n\n        return `\n          <div class=\"mob-tl-group ${isCurrent ? 'is-current' : ''}\">\n            <div class=\"mob-tl-dot\"><\/div>\n            <div class=\"mob-tl-tier\">${TIER_LABELS[tier]}<\/div>\n            ${edgeBadge}\n            <div class=\"mob-tl-cards\">\n              <div class=\"mob-tl-card ${isCurrent ? 'is-current' : ''}\" data-mob-tl-id=\"${id}\">\n                <div class=\"mob-tl-card-name\">${findSchoolName(id)}<\/div>\n              <\/div>\n            <\/div>\n          <\/div>\n        `;\n      }).join('');\n\n      if (!multiPath) return steps;\n\n      const label = `Pathway ${String.fromCharCode(65 + pathIdx)}`;\n      return `\n        <div class=\"mob-tl-section\" style=\"animation-delay:${pathIdx * 120}ms\">\n          <div class=\"mob-tl-section-label\">${label}<\/div>\n          ${steps}\n        <\/div>\n      `;\n    }).join('');\n\n    timeline.classList.toggle('has-sections', multiPath);\n\n    \/\/ Wire up timeline card taps (open modal if details exist)\n    timeline.querySelectorAll('.mob-tl-card').forEach(c => {\n      c.addEventListener('click', () => {\n        const id = c.dataset.mobTlId;\n        if (SCHOOL_DETAILS[id]) openModal(id);\n      });\n    });\n\n    \/\/ Update header & toggle views\n    document.getElementById('mobTitle').textContent = selectedName;\n    document.getElementById('mobSubtitle').textContent = TIER_LABELS[ID_TO_TIER[selectedId]];\n    document.getElementById('mobPathwayIntro').innerHTML = '';\n    document.getElementById('mobBack').hidden = false;\n    document.getElementById('mobBrowse').hidden = true;\n    document.getElementById('mobPathway').hidden = false;\n  }\n\n  function findSchoolName(id) {\n    const d = getDetail(id);\n    if (d) return d.name;\n    for (const tier of Object.keys(MOBILE_SCHOOLS)) {\n      const found = MOBILE_SCHOOLS[tier].find(s => s.id === id);\n      if (found) return found.name;\n    }\n    return id;\n  }\n\n  function exitMobilePathway() {\n    document.getElementById('mobTitle').textContent = '';\n    document.getElementById('mobSubtitle').textContent = '';\n    document.getElementById('mobBack').hidden = true;\n    document.getElementById('mobBrowse').hidden = false;\n    document.getElementById('mobPathway').hidden = true;\n  }\n\n  const mobBackEl = document.getElementById('mobBack');\n  mobBackEl.addEventListener('click', exitMobilePathway);\n  mobBackEl.addEventListener('keydown', (e) => {\n    if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); exitMobilePathway(); }\n  });\n\n  \/\/ Initial render\n  applyLanguage();\n  renderMobileBrowse();\n\n  window.addEventListener('load', () => setTimeout(drawConnections, 50));\n  window.addEventListener('resize', () => {\n    drawConnections();\n    if (selectedId) highlight(selectedId);\n  });\n<\/script>\n\n\n<\/div>\n<\/body>\n<\/html>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-ee698a7 e-flex e-con-boxed e-con e-parent\" data-id=\"ee698a7\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-6ca6f4c e-con-full e-flex e-con e-child\" data-id=\"6ca6f4c\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2200cec elementor-widget elementor-widget-text-editor\" data-id=\"2200cec\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<h2><b>\u5e38\u898b\u554f\u984c<\/b><\/h2>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-214a7b2 e-con-full e-flex e-con e-child\" data-id=\"214a7b2\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-838f657 online-app-tabs elementor-widget__width-initial e-n-tabs-mobile elementor-widget elementor-widget-n-tabs\" data-id=\"838f657\" data-element_type=\"widget\" data-settings=\"{&quot;tabs_justify_horizontal&quot;:&quot;stretch&quot;,&quot;horizontal_scroll&quot;:&quot;disable&quot;}\" data-widget_type=\"nested-tabs.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"e-n-tabs\" data-widget-number=\"137950807\" aria-label=\"Tabs. Open items with Enter or Space, close with Escape and navigate using the Arrow keys.\">\n\t\t\t<div class=\"e-n-tabs-heading\" role=\"tablist\">\n\t\t\t\t\t<button id=\"e-n-tab-title-1379508071\" class=\"e-n-tab-title\" aria-selected=\"true\" data-tab-index=\"1\" role=\"tab\" tabindex=\"0\" aria-controls=\"e-n-tab-content-1379508071\" style=\"--n-tabs-title-order: 1;\">\n\t\t\t\t\t\t<span class=\"e-n-tab-title-text\">\n\t\t\t\t\t\t\t<\/span>\n\t\t<\/button>\n\t\t\t\t\t<\/div>\n\t\t\t<div class=\"e-n-tabs-content\">\n\t\t\t\t<div id=\"e-n-tab-content-1379508071\" role=\"tabpanel\" aria-labelledby=\"e-n-tab-title-1379508071\" data-tab-index=\"1\" style=\"--n-tabs-title-order: 1;\" class=\"e-active elementor-element elementor-element-0ce8c14 e-flex e-con-boxed e-con e-child\" data-id=\"0ce8c14\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-bf8ecf8 elementor-widget elementor-widget-accordion\" data-id=\"bf8ecf8\" data-element_type=\"widget\" data-widget_type=\"accordion.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"elementor-accordion\">\n\t\t\t\t\t\t\t<div class=\"elementor-accordion-item\">\n\t\t\t\t\t<div id=\"elementor-tab-title-2001\" class=\"elementor-tab-title\" data-tab=\"1\" role=\"button\" aria-controls=\"elementor-tab-content-2001\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon elementor-accordion-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon-opened\"><i class=\"fas fa-caret-down\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-accordion-title\" tabindex=\"0\">\u4ec0\u9ebc\u662f\u300c\u76f8\u95dc\u5b78\u6821\u6a21\u5f0f\u300d\uff1f\u5c0d\u6211\u7684\u5b69\u5b50\u6709\u4f55\u76ca\u8655\uff1f<\/a>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t<div id=\"elementor-tab-content-2001\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"1\" role=\"region\" aria-labelledby=\"elementor-tab-title-2001\"><p><span style=\"font-weight: 400;\">\u76f8\u95dc\u5b78\u6821\u6a21\u5f0f\u662f\u300c<\/span><span style=\"font-weight: 400;\">\u4e00\u689d\u9f8d<\/span><span style=\"font-weight: 400;\">\u300d\u7684\u53e6\u4e00\u8868\u8ff0\uff0c\u6307\u67d0\u4e9b\u82f1\u57fa\u5b78\u6821\u5f7c\u6b64\u76f8\u9023\uff0c\u5b69\u5b50\u53ef\u5728\u76f8\u95dc\u5b78\u6821\u9593\u5347\u5b78\u3002\u56e0\u6b64\uff0c\u7576\u5165\u8b80\u82f1\u57fa\u5e7c\u7a1a\u5712\u6642\uff0c\u4f60\u4fbf\u80fd\u77e5\u66c9\u5b69\u5b50\u5c07\u5347\u8b80\u7684\u5c0f\u5b78\u548c\u4e2d\u5b78\u3002<\/span><\/p><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-accordion-item\">\n\t\t\t\t\t<div id=\"elementor-tab-title-2002\" class=\"elementor-tab-title\" data-tab=\"2\" role=\"button\" aria-controls=\"elementor-tab-content-2002\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon elementor-accordion-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon-opened\"><i class=\"fas fa-caret-down\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-accordion-title\" tabindex=\"0\">\u6b64\u6a21\u5f0f\u5982\u4f55\u6539\u5584\u5e7c\u7a1a\u5712\u5230\u5c0f\u5b78\u7684\u904e\u6e21\uff1f<\/a>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t<div id=\"elementor-tab-content-2002\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"2\" role=\"region\" aria-labelledby=\"elementor-tab-title-2002\"><p><span style=\"font-weight: 400;\">\u76f8\u95dc\u5b78\u6821\u7684\u6821\u9577\u5011\u73fe\u7dca\u5bc6\u5408\u4f5c\uff0c\u63a8\u52d5\u8ab2\u7a0b\u929c\u63a5\u548c\u793e\u4ea4\u652f\u6301\u3002\u5305\u62ec\u806f\u5408\u904a\u6232\u3001\u5171\u4eab\u5c08\u5bb6\u652f\u6301\uff0c\u53caK2\u5b78\u751f\u7684\u5c0f\u5b78\u6559\u5ba4\u9ad4\u9a57\u65e5\u3002<\/span><\/p><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-accordion-item\">\n\t\t\t\t\t<div id=\"elementor-tab-title-2003\" class=\"elementor-tab-title\" data-tab=\"3\" role=\"button\" aria-controls=\"elementor-tab-content-2003\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon elementor-accordion-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon-opened\"><i class=\"fas fa-caret-down\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-accordion-title\" tabindex=\"0\">\u300c\u4e00\u500b\u82f1\u57fa\u300d\u793e\u7fa4\u5c0d\u5bb6\u9577\u6709\u4f55\u76ca\u8655\uff1f<\/a>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t<div id=\"elementor-tab-content-2003\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"3\" role=\"region\" aria-labelledby=\"elementor-tab-title-2003\"><p><span style=\"font-weight: 400;\">\u9664\u5b78\u751f\u53d7\u76ca\u4ee5\u5916\uff0c\u5bb6\u9577\u4e5f\u80fd\u52a0\u5165\u7d42\u751f\u53d7\u7528\u7684\u793e\u7fa4\u3002\u4f60\u53ef\u4ee5\u4eab\u6709\u8de8\u6821\u5de5\u4f5c\u574a\u3001\u7d71\u4e00\u7684\u5bb6\u9577\u7aef\uff0c\u53ca\u4e00\u81f4\u7684\u6e9d\u901a\u65b9\u5f0f\uff0c\u5f9e\u800c\u7c21\u5316\u672a\u4f8615\u5e74\u53c3\u8207\u5b50\u5973\u6559\u80b2\u7684\u6d41\u7a0b\u3002<\/span><span style=\"font-weight: 400;\"><br \/><\/span><\/p><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-accordion-item\">\n\t\t\t\t\t<div id=\"elementor-tab-title-2004\" class=\"elementor-tab-title\" data-tab=\"4\" role=\"button\" aria-controls=\"elementor-tab-content-2004\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon elementor-accordion-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon-opened\"><i class=\"fas fa-caret-down\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-accordion-title\" tabindex=\"0\">\u6211\u61c9\u4f55\u6642\u70ba\u5b69\u5b50\u7533\u8acbK1\uff1f<\/a>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t<div id=\"elementor-tab-content-2004\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"4\" role=\"region\" aria-labelledby=\"elementor-tab-title-2004\"><p><span style=\"font-weight: 400;\">K1\u7684\u7533\u8acb\u6642\u9593\u70ba\u5165\u5b78\u524d\u4e00\u5e74\u76849\u67081\u81f330\u65e5\uff0c\u6b21\u5e748\u6708\u958b\u5b78\u3002\u6b64\u7533\u8acb\u671f\u70ba\u300c9\u6708\u4e2d\u592e\u7533\u8acb\u300d\u3002<\/span><\/p><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-accordion-item\">\n\t\t\t\t\t<div id=\"elementor-tab-title-2005\" class=\"elementor-tab-title\" data-tab=\"5\" role=\"button\" aria-controls=\"elementor-tab-content-2005\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon elementor-accordion-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon-opened\"><i class=\"fas fa-caret-down\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-accordion-title\" tabindex=\"0\">\u65b0\u7684\u76f8\u95dc\u5c0f\u5b78\u5c07\u9069\u7528\u65bc\u54ea\u4e9b\u5e74\u4efd\u51fa\u751f\u7684\u5b69\u5b50\uff1f<\/a>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t<div id=\"elementor-tab-content-2005\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"5\" role=\"region\" aria-labelledby=\"elementor-tab-title-2005\"><p><span style=\"font-weight: 400;\">2024\u5e74\u51fa\u751f\u7684\u5b69\u5b50\u5c07\u6210\u70ba\u65b0\u6a21\u5f0f\u7684\u9996\u6279\u5b78\u751f\u3002\u4ed6\u5011\u5c07\u65bc2029\u5e748\u6708\u5347\u8b80Year 1\u3002<\/span><\/p><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-accordion-item\">\n\t\t\t\t\t<div id=\"elementor-tab-title-2006\" class=\"elementor-tab-title\" data-tab=\"6\" role=\"button\" aria-controls=\"elementor-tab-content-2006\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon elementor-accordion-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon-opened\"><i class=\"fas fa-caret-down\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-accordion-title\" tabindex=\"0\">\u5982\u679c\u932f\u904e\u4e869\u6708\u4e2d\u592e\u62db\u751f\u7533\u8acb\u671f\uff0c\u8a72\u600e\u9ebc\u8fa6\uff1f<\/a>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t<div id=\"elementor-tab-content-2006\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"6\" role=\"region\" aria-labelledby=\"elementor-tab-title-2006\"><p><span style=\"font-weight: 400;\">\u4ecd\u53ef\u63d0\u4ea4\u7533\u8acb\uff0c\u4f46\u6703\u88ab\u5217\u5165\u5019\u88dc\u540d\u55ae\uff0c\u6392\u5728\u6e96\u6642\u7533\u8acb\u8005\u4e4b\u5f8c\u3002<\/span><\/p><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-accordion-item\">\n\t\t\t\t\t<div id=\"elementor-tab-title-2007\" class=\"elementor-tab-title\" data-tab=\"7\" role=\"button\" aria-controls=\"elementor-tab-content-2007\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon elementor-accordion-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon-opened\"><i class=\"fas fa-caret-down\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-accordion-title\" tabindex=\"0\">\u5c0d\u65bc\u9700\u8981\u5b78\u7fd2\u652f\u63f4\u6216\u7279\u6b8a\u6559\u80b2\u7684\u5b69\u5b50\uff0c\u904e\u6e21\u6d41\u7a0b\u662f\u5426\u4e0d\u540c\uff1f<\/a>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t<div id=\"elementor-tab-content-2007\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"7\" role=\"region\" aria-labelledby=\"elementor-tab-title-2007\"><p><span style=\"font-weight: 400;\">\u662f\u7684\u3002\u5c0d\u65bc\u9700\u8981\u984d\u5916\u5b78\u7fd2\u652f\u63f4\u7684\u5b78\u7ae5\uff0c\u6211\u5011\u8a2d\u6709\u5c08\u9580\u4e14\u9ad8\u5ea6\u5354\u4f5c\u7684\u6d41\u7a0b\uff0c\u4ee5\u78ba\u4fdd\u9806\u5229\u5347\u8b80Year 1\u3002\u5e7c\u7a1a\u5712\u5718\u968a\u6703\u5728K1\u5b78\u5e74\u8207\u5bb6\u9577\u5bc6\u5207\u5408\u4f5c\uff0c\u4ee5\u8b58\u5225\u4efb\u4f55\u652f\u63f4\u9700\u6c42\u3002\u5c0d\u65bc\u9700\u8981\u66f4\u9ad8\u7a0b\u5ea6\u652f\u63f4\u7684\u5b78\u7ae5\uff0c\u6211\u5011\u6703\u5728K2\u5b78\u5e74\u88fd\u5b9a\u5f37\u5316\u904e\u6e21\u7b56\u7565\uff0c\u7531\u5c08\u696d\u5718\u968a\u70ba\u5b69\u5b50\u88fd\u5b9a\u500b\u4eba\u5316\u7684\u5c0f\u5b78\u5347\u5b78\u8def\u5f91\u3002<\/span><\/p><p><span style=\"font-weight: 400;\">\u5982\u679c\u50cf\u82f1\u57fa\u8cfd\u99ac\u6703\u5584\u6a02\u5b78\u6821(JCSRS)\u9019\u6a23\u7684\u7279\u6b8a\u74b0\u5883\uff0c\u6700\u80fd\u6eff\u8db3\u5b69\u5b50\u7684\u9700\u6c42\uff0c\u5c08\u9580\u7684\u8a55\u5be9\u5c0f\u7d44\u5c07\u8a55\u4f30\u6700\u4f73\u5b89\u7f6e\u65b9\u6848\u3002\u8acb\u6ce8\u610f\uff0c\u82f1\u57fa\u8cfd\u99ac\u6703\u5584\u6a02\u5b78\u6821\u7684\u5b78\u984d\u8996\u60c5\u6cc1\u800c\u5b9a\u3002<\/span><\/p><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-accordion-item\">\n\t\t\t\t\t<div id=\"elementor-tab-title-2008\" class=\"elementor-tab-title\" data-tab=\"8\" role=\"button\" aria-controls=\"elementor-tab-content-2008\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon elementor-accordion-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon-opened\"><i class=\"fas fa-caret-down\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-accordion-title\" tabindex=\"0\">\u6211\u53ef\u4ee5\u9078\u64c7\u5b69\u5b50\u5c31\u8b80\u54ea\u6240\u82f1\u57fa\u5c0f\u5b78\u55ce\uff1f<\/a>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t<div id=\"elementor-tab-content-2008\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"8\" role=\"region\" aria-labelledby=\"elementor-tab-title-2008\"><p><span style=\"font-weight: 400;\">\u5bb6\u9577\u9700\u8003\u616e\u6240\u9078\u5c0f\u5b78\u7684\u76f8\u95dc\u5e7c\u7a1a\u5712\u3002\u5728K2\u5b78\u5e74\u958b\u59cb\u6642\uff0c\u5bb6\u9577\u9700\u586b\u5beb\u5347\u5b78\u8868\u683c\uff0c\u4ee5\u78ba\u8a8d\u4e0b\u4e00\u5b78\u5e74Y1\u540d\u984d\u3002\u5bb6\u9577\u53ef\u6839\u64da\u5728\u8b80\u82f1\u57fa\u5e7c\u7a1a\u5712\u7684\u76f8\u95dc\u5c0f\u5b78\uff0c\u586b\u5beb\u5fd7\u9858\u9806\u5e8f\u3002\u9664\u76f4\u5347\u76f8\u95dc\u5c0f\u5b78\u7684\u5e7c\u7a1a\u5712\u4ee5\u5916\uff0c\u4e0d\u80fd\u4fdd\u8b49\u4e00\u5b9a\u9032\u5165\u7b2c\u4e00\u5fd7\u9858\u5c0f\u5b78<\/span><\/p><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-accordion-item\">\n\t\t\t\t\t<div id=\"elementor-tab-title-2009\" class=\"elementor-tab-title\" data-tab=\"9\" role=\"button\" aria-controls=\"elementor-tab-content-2009\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon elementor-accordion-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon-opened\"><i class=\"fas fa-caret-down\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-accordion-title\" tabindex=\"0\">\u80fd\u5426\u9078\u64c7\u8207\u5e7c\u7a1a\u5712\u4e0d\u76f8\u95dc\u7684\u82f1\u57fa\u5c0f\u5b78\uff1f<\/a>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t<div id=\"elementor-tab-content-2009\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"9\" role=\"region\" aria-labelledby=\"elementor-tab-title-2009\"><p><span style=\"font-weight: 400;\">\u7121\u6cd5\u9078\u64c7\u8207\u5b69\u5b50\u5e7c\u7a1a\u5712\u4e0d\u76f8\u95dc\u7684\u5c0f\u5b78\u3002\u7372\u4fdd\u8b49\u7684Y1\u5b78\u4f4d\u50c5\u9650\u65bc\u76f8\u95dc\u5b78\u6821\u3002<\/span><\/p><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-accordion-item\">\n\t\t\t\t\t<div id=\"elementor-tab-title-20010\" class=\"elementor-tab-title\" data-tab=\"10\" role=\"button\" aria-controls=\"elementor-tab-content-20010\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon elementor-accordion-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon-opened\"><i class=\"fas fa-caret-down\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-accordion-title\" tabindex=\"0\">\u4f55\u6642\u80fd\u77e5\u9053\u5b69\u5b50\u5c07\u5c31\u8b80\u54ea\u6240\u82f1\u57fa\u5c0f\u5b78\uff1f<\/a>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t<div id=\"elementor-tab-content-20010\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"10\" role=\"region\" aria-labelledby=\"elementor-tab-title-20010\"><p><span style=\"font-weight: 400;\">\u82f1\u57faK2\u5bb6\u9577\u5c07\u65bc10\u6708\u5e95\/11\u6708\u521d\u6536\u5230\u4e0b\u4e00\u5b78\u5e74\u5c0f\u5b78\u6d3e\u4f4d\u901a\u77e5\u3002<\/span><\/p><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-accordion-item\">\n\t\t\t\t\t<div id=\"elementor-tab-title-20011\" class=\"elementor-tab-title\" data-tab=\"11\" role=\"button\" aria-controls=\"elementor-tab-content-20011\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon elementor-accordion-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon-opened\"><i class=\"fas fa-caret-down\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-accordion-title\" tabindex=\"0\">\u82e5\u5144\u5f1f\u59ca\u59b9\u5c31\u8b80\u975e\u76f8\u95dc\u5c0f\u5b78\uff0c\u6211\u7684\u5e7c\u5b50K2\u5347\u8b80Y1\u6642\uff0c\u80fd\u5426\u8f49\u5165\u5144\u5f1f\u59ca\u59b9\u7684\u5b78\u6821\uff1f<\/a>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t<div id=\"elementor-tab-content-20011\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"11\" role=\"region\" aria-labelledby=\"elementor-tab-title-20011\"><p><span style=\"font-weight: 400;\">Y1\u7684\u4fdd\u8b49\u5b78\u984d\u50c5\u9650\u65bc\u5176\u5e7c\u7a1a\u5712\u7684\u76f8\u95dc\u5c0f\u5b78\u3002\u5728\u5176\u5e7c\u7a1a\u5712\u6240\u6709\u512a\u5148\u5152\u7ae5\u5347\u5b78\u5f8c\uff0cY1\u5b78\u984d\u975e\u5e38\u6709\u9650\uff0c\u56e0\u6b64\u7121\u6cd5\u4fdd\u8b49\u3002<\/span><\/p><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-accordion-item\">\n\t\t\t\t\t<div id=\"elementor-tab-title-20012\" class=\"elementor-tab-title\" data-tab=\"12\" role=\"button\" aria-controls=\"elementor-tab-content-20012\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon elementor-accordion-icon-left\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon-closed\"><i class=\"fas fa-caret-right\"><\/i><\/span>\n\t\t\t\t\t\t\t\t<span class=\"elementor-accordion-icon-opened\"><i class=\"fas fa-caret-down\"><\/i><\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-accordion-title\" tabindex=\"0\">\u6bcf\u9593\u5e7c\u7a1a\u5712\u7684\u5b78\u751f\u5347\u8b80\u76f8\u95dc\u5c0f\u5b78\u7684\u73ed\u5225\u6578\u91cf\u5206\u914d\u5982\u4f55\uff1f\u54ea\u4e00\u5e74\u51fa\u751f\u7684\u5b78\u751f\u6703\u662f\u7b2c\u4e00\u6279\u53d7\u5f71\u97ff\uff1f<\/a>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t<div id=\"elementor-tab-content-20012\" class=\"elementor-tab-content elementor-clearfix\" data-tab=\"12\" role=\"region\" aria-labelledby=\"elementor-tab-title-20012\"><p style=\"margin: 0 0 6px;\"><span style=\"font-weight: 400;\">\u57282024\u5e74\u51fa\u751f\u65bc2028\u5e749\u6708\u5831\u540d\uff0c\u4e26\u57282029\u5e74\u5165\u8b80Y1\u7684\u5b78\u751f\uff0c\u5c07\u6703\u6309\u4ee5\u4e0b\u73ed\u5225\u6578\u91cf\u5206\u914d\u81f3\u76f8\u95dc\u5c0f\u5b78\u3002\u591a\u65bc\u4e00\u9593\u76f8\u95dc\u5c0f\u5b78\u7684\u5e7c\u7a1a\u5712\u7562\u696d\u751f\uff0c\u5c07\u6703\u6309\u7167\u512a\u5148\u6b0a\u3001\u96fb\u8166\u96a8\u6a5f\u751f\u6210\u865f\u78bc\uff0c\u4ee5\u53ca\u6559\u80b2\u5c40\u7684\u8981\u6c42\uff08\u5982\u6709\u9700\u8981\uff09\u9032\u884c\u4e2d\u592e\u5206\u914d\u76f8\u95dc\u5c0f\u5b78\u5b78\u4f4d\u3002<\/span><\/p><table style=\"border-collapse: collapse; width: 100%; font-size: 14px;\"><tbody><tr><td style=\"border: 1px solid #ccc; padding: 6px 6px; line-height: 1.25; vertical-align: top; font-weight: 600; white-space: nowrap;\">\u70cf\u6eaa\u6c99\u570b\u969b\u5e7c\u7a1a\u5712<\/td><td style=\"border: 1px solid #ccc; padding: 6px 6px; line-height: 1.25; vertical-align: top;\">\u6c99\u7530\u5c0f\u5b78 &#8211; 5\u73ed<br \/>\u7562\u67b6\u5c71\u5c0f\u5b78 &#8211; 2\u73ed<\/td><\/tr><tr><td style=\"border: 1px solid #ccc; padding: 6px 6px; line-height: 1.25; vertical-align: top; font-weight: 600; white-space: nowrap;\">\u66c9\u65b0\u570b\u969b\u5e7c\u7a1a\u5712<\/td><td style=\"border: 1px solid #ccc; padding: 6px 6px; line-height: 1.25; vertical-align: top;\">\u767d\u666e\u7406\u5c0f\u5b78 &#8211; 4\u73ed<br \/>\u5df1\u9023\u62ff\u5c0f\u5b78\u3001\u5c71\u9802\u5c0f\u5b78 &#8211; \u51714\u73ed<\/td><\/tr><tr><td style=\"border: 1px solid #ccc; padding: 6px 6px; line-height: 1.25; vertical-align: top; font-weight: 600; white-space: nowrap;\">\u9752\u8863\u570b\u969b\u5e7c\u7a1a\u5712<\/td><td style=\"border: 1px solid #ccc; padding: 6px 6px; line-height: 1.25; vertical-align: top;\">\u4e5d\u9f8d\u5c0f\u5b78 &#8211; 5\u73ed<br \/>\u7562\u67b6\u5c71\u5c0f\u5b78\u3001\u667a\u65b0\u66f8\u9662 &#8211; \u51713\u73ed<\/td><\/tr><tr><td style=\"border: 1px solid #ccc; padding: 6px 6px; line-height: 1.25; vertical-align: top; font-weight: 600; white-space: nowrap;\">\u897f\u4e5d\u9f8d\u5e7c\u7a1a\u5712<\/td><td style=\"border: 1px solid #ccc; padding: 6px 6px; line-height: 1.25; vertical-align: top;\">\u6e05\u6c34\u7063\u5c0f\u5b78 &#8211; 4\u73ed<br \/>\u5805\u5c3c\u5730\u5c0f\u5b78 &#8211; 2\u73ed<\/td><\/tr><tr><td style=\"border: 1px solid #ccc; padding: 6px 6px; line-height: 1.25; vertical-align: top; font-weight: 600; white-space: nowrap;\">\u9c02\u9b5a\u6d8c\u5c0f\u5b78\u5e7c\u7a1a\u5712<\/td><td style=\"border: 1px solid #ccc; padding: 6px 6px; line-height: 1.25; vertical-align: top;\">\u9c02\u9b5a\u6d8c\u5c0f\u5b78 &#8211; 4\u73ed<\/td><\/tr><tr><td style=\"border: 1px solid #ccc; padding: 6px 6px; line-height: 1.25; vertical-align: top; font-weight: 600; white-space: nowrap;\">\u5553\u65b0\u66f8\u9662\u5e7c\u7a1a\u5712<\/td><td style=\"border: 1px solid #ccc; padding: 6px 6px; line-height: 1.25; vertical-align: top;\">\u5553\u65b0\u66f8\u9662 &#8211; 6\u73ed<\/td><\/tr><\/tbody><\/table><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t<script type=\"application\/ld+json\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@type\":\"FAQPage\",\"mainEntity\":[{\"@type\":\"Question\",\"name\":\"\\u4ec0\\u9ebc\\u662f\\u300c\\u76f8\\u95dc\\u5b78\\u6821\\u6a21\\u5f0f\\u300d\\uff1f\\u5c0d\\u6211\\u7684\\u5b69\\u5b50\\u6709\\u4f55\\u76ca\\u8655\\uff1f\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p><span style=\\\"font-weight: 400;\\\">\\u76f8\\u95dc\\u5b78\\u6821\\u6a21\\u5f0f\\u662f\\u300c<\\\/span><span style=\\\"font-weight: 400;\\\">\\u4e00\\u689d\\u9f8d<\\\/span><span style=\\\"font-weight: 400;\\\">\\u300d\\u7684\\u53e6\\u4e00\\u8868\\u8ff0\\uff0c\\u6307\\u67d0\\u4e9b\\u82f1\\u57fa\\u5b78\\u6821\\u5f7c\\u6b64\\u76f8\\u9023\\uff0c\\u5b69\\u5b50\\u53ef\\u5728\\u76f8\\u95dc\\u5b78\\u6821\\u9593\\u5347\\u5b78\\u3002\\u56e0\\u6b64\\uff0c\\u7576\\u5165\\u8b80\\u82f1\\u57fa\\u5e7c\\u7a1a\\u5712\\u6642\\uff0c\\u4f60\\u4fbf\\u80fd\\u77e5\\u66c9\\u5b69\\u5b50\\u5c07\\u5347\\u8b80\\u7684\\u5c0f\\u5b78\\u548c\\u4e2d\\u5b78\\u3002<\\\/span><\\\/p>\"}},{\"@type\":\"Question\",\"name\":\"\\u6b64\\u6a21\\u5f0f\\u5982\\u4f55\\u6539\\u5584\\u5e7c\\u7a1a\\u5712\\u5230\\u5c0f\\u5b78\\u7684\\u904e\\u6e21\\uff1f\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p><span style=\\\"font-weight: 400;\\\">\\u76f8\\u95dc\\u5b78\\u6821\\u7684\\u6821\\u9577\\u5011\\u73fe\\u7dca\\u5bc6\\u5408\\u4f5c\\uff0c\\u63a8\\u52d5\\u8ab2\\u7a0b\\u929c\\u63a5\\u548c\\u793e\\u4ea4\\u652f\\u6301\\u3002\\u5305\\u62ec\\u806f\\u5408\\u904a\\u6232\\u3001\\u5171\\u4eab\\u5c08\\u5bb6\\u652f\\u6301\\uff0c\\u53caK2\\u5b78\\u751f\\u7684\\u5c0f\\u5b78\\u6559\\u5ba4\\u9ad4\\u9a57\\u65e5\\u3002<\\\/span><\\\/p>\"}},{\"@type\":\"Question\",\"name\":\"\\u300c\\u4e00\\u500b\\u82f1\\u57fa\\u300d\\u793e\\u7fa4\\u5c0d\\u5bb6\\u9577\\u6709\\u4f55\\u76ca\\u8655\\uff1f\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p><span style=\\\"font-weight: 400;\\\">\\u9664\\u5b78\\u751f\\u53d7\\u76ca\\u4ee5\\u5916\\uff0c\\u5bb6\\u9577\\u4e5f\\u80fd\\u52a0\\u5165\\u7d42\\u751f\\u53d7\\u7528\\u7684\\u793e\\u7fa4\\u3002\\u4f60\\u53ef\\u4ee5\\u4eab\\u6709\\u8de8\\u6821\\u5de5\\u4f5c\\u574a\\u3001\\u7d71\\u4e00\\u7684\\u5bb6\\u9577\\u7aef\\uff0c\\u53ca\\u4e00\\u81f4\\u7684\\u6e9d\\u901a\\u65b9\\u5f0f\\uff0c\\u5f9e\\u800c\\u7c21\\u5316\\u672a\\u4f8615\\u5e74\\u53c3\\u8207\\u5b50\\u5973\\u6559\\u80b2\\u7684\\u6d41\\u7a0b\\u3002<\\\/span><span style=\\\"font-weight: 400;\\\"><br \\\/><\\\/span><\\\/p>\"}},{\"@type\":\"Question\",\"name\":\"\\u6211\\u61c9\\u4f55\\u6642\\u70ba\\u5b69\\u5b50\\u7533\\u8acbK1\\uff1f\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p><span style=\\\"font-weight: 400;\\\">K1\\u7684\\u7533\\u8acb\\u6642\\u9593\\u70ba\\u5165\\u5b78\\u524d\\u4e00\\u5e74\\u76849\\u67081\\u81f330\\u65e5\\uff0c\\u6b21\\u5e748\\u6708\\u958b\\u5b78\\u3002\\u6b64\\u7533\\u8acb\\u671f\\u70ba\\u300c9\\u6708\\u4e2d\\u592e\\u7533\\u8acb\\u300d\\u3002<\\\/span><\\\/p>\"}},{\"@type\":\"Question\",\"name\":\"\\u65b0\\u7684\\u76f8\\u95dc\\u5c0f\\u5b78\\u5c07\\u9069\\u7528\\u65bc\\u54ea\\u4e9b\\u5e74\\u4efd\\u51fa\\u751f\\u7684\\u5b69\\u5b50\\uff1f\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p><span style=\\\"font-weight: 400;\\\">2024\\u5e74\\u51fa\\u751f\\u7684\\u5b69\\u5b50\\u5c07\\u6210\\u70ba\\u65b0\\u6a21\\u5f0f\\u7684\\u9996\\u6279\\u5b78\\u751f\\u3002\\u4ed6\\u5011\\u5c07\\u65bc2029\\u5e748\\u6708\\u5347\\u8b80Year 1\\u3002<\\\/span><\\\/p>\"}},{\"@type\":\"Question\",\"name\":\"\\u5982\\u679c\\u932f\\u904e\\u4e869\\u6708\\u4e2d\\u592e\\u62db\\u751f\\u7533\\u8acb\\u671f\\uff0c\\u8a72\\u600e\\u9ebc\\u8fa6\\uff1f\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p><span style=\\\"font-weight: 400;\\\">\\u4ecd\\u53ef\\u63d0\\u4ea4\\u7533\\u8acb\\uff0c\\u4f46\\u6703\\u88ab\\u5217\\u5165\\u5019\\u88dc\\u540d\\u55ae\\uff0c\\u6392\\u5728\\u6e96\\u6642\\u7533\\u8acb\\u8005\\u4e4b\\u5f8c\\u3002<\\\/span><\\\/p>\"}},{\"@type\":\"Question\",\"name\":\"\\u5c0d\\u65bc\\u9700\\u8981\\u5b78\\u7fd2\\u652f\\u63f4\\u6216\\u7279\\u6b8a\\u6559\\u80b2\\u7684\\u5b69\\u5b50\\uff0c\\u904e\\u6e21\\u6d41\\u7a0b\\u662f\\u5426\\u4e0d\\u540c\\uff1f\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p><span style=\\\"font-weight: 400;\\\">\\u662f\\u7684\\u3002\\u5c0d\\u65bc\\u9700\\u8981\\u984d\\u5916\\u5b78\\u7fd2\\u652f\\u63f4\\u7684\\u5b78\\u7ae5\\uff0c\\u6211\\u5011\\u8a2d\\u6709\\u5c08\\u9580\\u4e14\\u9ad8\\u5ea6\\u5354\\u4f5c\\u7684\\u6d41\\u7a0b\\uff0c\\u4ee5\\u78ba\\u4fdd\\u9806\\u5229\\u5347\\u8b80Year 1\\u3002\\u5e7c\\u7a1a\\u5712\\u5718\\u968a\\u6703\\u5728K1\\u5b78\\u5e74\\u8207\\u5bb6\\u9577\\u5bc6\\u5207\\u5408\\u4f5c\\uff0c\\u4ee5\\u8b58\\u5225\\u4efb\\u4f55\\u652f\\u63f4\\u9700\\u6c42\\u3002\\u5c0d\\u65bc\\u9700\\u8981\\u66f4\\u9ad8\\u7a0b\\u5ea6\\u652f\\u63f4\\u7684\\u5b78\\u7ae5\\uff0c\\u6211\\u5011\\u6703\\u5728K2\\u5b78\\u5e74\\u88fd\\u5b9a\\u5f37\\u5316\\u904e\\u6e21\\u7b56\\u7565\\uff0c\\u7531\\u5c08\\u696d\\u5718\\u968a\\u70ba\\u5b69\\u5b50\\u88fd\\u5b9a\\u500b\\u4eba\\u5316\\u7684\\u5c0f\\u5b78\\u5347\\u5b78\\u8def\\u5f91\\u3002<\\\/span><\\\/p><p><span style=\\\"font-weight: 400;\\\">\\u5982\\u679c\\u50cf\\u82f1\\u57fa\\u8cfd\\u99ac\\u6703\\u5584\\u6a02\\u5b78\\u6821(JCSRS)\\u9019\\u6a23\\u7684\\u7279\\u6b8a\\u74b0\\u5883\\uff0c\\u6700\\u80fd\\u6eff\\u8db3\\u5b69\\u5b50\\u7684\\u9700\\u6c42\\uff0c\\u5c08\\u9580\\u7684\\u8a55\\u5be9\\u5c0f\\u7d44\\u5c07\\u8a55\\u4f30\\u6700\\u4f73\\u5b89\\u7f6e\\u65b9\\u6848\\u3002\\u8acb\\u6ce8\\u610f\\uff0c\\u82f1\\u57fa\\u8cfd\\u99ac\\u6703\\u5584\\u6a02\\u5b78\\u6821\\u7684\\u5b78\\u984d\\u8996\\u60c5\\u6cc1\\u800c\\u5b9a\\u3002<\\\/span><\\\/p>\"}},{\"@type\":\"Question\",\"name\":\"\\u6211\\u53ef\\u4ee5\\u9078\\u64c7\\u5b69\\u5b50\\u5c31\\u8b80\\u54ea\\u6240\\u82f1\\u57fa\\u5c0f\\u5b78\\u55ce\\uff1f\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p><span style=\\\"font-weight: 400;\\\">\\u5bb6\\u9577\\u9700\\u8003\\u616e\\u6240\\u9078\\u5c0f\\u5b78\\u7684\\u76f8\\u95dc\\u5e7c\\u7a1a\\u5712\\u3002\\u5728K2\\u5b78\\u5e74\\u958b\\u59cb\\u6642\\uff0c\\u5bb6\\u9577\\u9700\\u586b\\u5beb\\u5347\\u5b78\\u8868\\u683c\\uff0c\\u4ee5\\u78ba\\u8a8d\\u4e0b\\u4e00\\u5b78\\u5e74Y1\\u540d\\u984d\\u3002\\u5bb6\\u9577\\u53ef\\u6839\\u64da\\u5728\\u8b80\\u82f1\\u57fa\\u5e7c\\u7a1a\\u5712\\u7684\\u76f8\\u95dc\\u5c0f\\u5b78\\uff0c\\u586b\\u5beb\\u5fd7\\u9858\\u9806\\u5e8f\\u3002\\u9664\\u76f4\\u5347\\u76f8\\u95dc\\u5c0f\\u5b78\\u7684\\u5e7c\\u7a1a\\u5712\\u4ee5\\u5916\\uff0c\\u4e0d\\u80fd\\u4fdd\\u8b49\\u4e00\\u5b9a\\u9032\\u5165\\u7b2c\\u4e00\\u5fd7\\u9858\\u5c0f\\u5b78<\\\/span><\\\/p>\"}},{\"@type\":\"Question\",\"name\":\"\\u80fd\\u5426\\u9078\\u64c7\\u8207\\u5e7c\\u7a1a\\u5712\\u4e0d\\u76f8\\u95dc\\u7684\\u82f1\\u57fa\\u5c0f\\u5b78\\uff1f\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p><span style=\\\"font-weight: 400;\\\">\\u7121\\u6cd5\\u9078\\u64c7\\u8207\\u5b69\\u5b50\\u5e7c\\u7a1a\\u5712\\u4e0d\\u76f8\\u95dc\\u7684\\u5c0f\\u5b78\\u3002\\u7372\\u4fdd\\u8b49\\u7684Y1\\u5b78\\u4f4d\\u50c5\\u9650\\u65bc\\u76f8\\u95dc\\u5b78\\u6821\\u3002<\\\/span><\\\/p>\"}},{\"@type\":\"Question\",\"name\":\"\\u4f55\\u6642\\u80fd\\u77e5\\u9053\\u5b69\\u5b50\\u5c07\\u5c31\\u8b80\\u54ea\\u6240\\u82f1\\u57fa\\u5c0f\\u5b78\\uff1f\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p><span style=\\\"font-weight: 400;\\\">\\u82f1\\u57faK2\\u5bb6\\u9577\\u5c07\\u65bc10\\u6708\\u5e95\\\/11\\u6708\\u521d\\u6536\\u5230\\u4e0b\\u4e00\\u5b78\\u5e74\\u5c0f\\u5b78\\u6d3e\\u4f4d\\u901a\\u77e5\\u3002<\\\/span><\\\/p>\"}},{\"@type\":\"Question\",\"name\":\"\\u82e5\\u5144\\u5f1f\\u59ca\\u59b9\\u5c31\\u8b80\\u975e\\u76f8\\u95dc\\u5c0f\\u5b78\\uff0c\\u6211\\u7684\\u5e7c\\u5b50K2\\u5347\\u8b80Y1\\u6642\\uff0c\\u80fd\\u5426\\u8f49\\u5165\\u5144\\u5f1f\\u59ca\\u59b9\\u7684\\u5b78\\u6821\\uff1f\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p><span style=\\\"font-weight: 400;\\\">Y1\\u7684\\u4fdd\\u8b49\\u5b78\\u984d\\u50c5\\u9650\\u65bc\\u5176\\u5e7c\\u7a1a\\u5712\\u7684\\u76f8\\u95dc\\u5c0f\\u5b78\\u3002\\u5728\\u5176\\u5e7c\\u7a1a\\u5712\\u6240\\u6709\\u512a\\u5148\\u5152\\u7ae5\\u5347\\u5b78\\u5f8c\\uff0cY1\\u5b78\\u984d\\u975e\\u5e38\\u6709\\u9650\\uff0c\\u56e0\\u6b64\\u7121\\u6cd5\\u4fdd\\u8b49\\u3002<\\\/span><\\\/p>\"}},{\"@type\":\"Question\",\"name\":\"\\u6bcf\\u9593\\u5e7c\\u7a1a\\u5712\\u7684\\u5b78\\u751f\\u5347\\u8b80\\u76f8\\u95dc\\u5c0f\\u5b78\\u7684\\u73ed\\u5225\\u6578\\u91cf\\u5206\\u914d\\u5982\\u4f55\\uff1f\\u54ea\\u4e00\\u5e74\\u51fa\\u751f\\u7684\\u5b78\\u751f\\u6703\\u662f\\u7b2c\\u4e00\\u6279\\u53d7\\u5f71\\u97ff\\uff1f\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"<p style=\\\"margin: 0 0 6px;\\\"><span style=\\\"font-weight: 400;\\\">\\u57282024\\u5e74\\u51fa\\u751f\\u65bc2028\\u5e749\\u6708\\u5831\\u540d\\uff0c\\u4e26\\u57282029\\u5e74\\u5165\\u8b80Y1\\u7684\\u5b78\\u751f\\uff0c\\u5c07\\u6703\\u6309\\u4ee5\\u4e0b\\u73ed\\u5225\\u6578\\u91cf\\u5206\\u914d\\u81f3\\u76f8\\u95dc\\u5c0f\\u5b78\\u3002\\u591a\\u65bc\\u4e00\\u9593\\u76f8\\u95dc\\u5c0f\\u5b78\\u7684\\u5e7c\\u7a1a\\u5712\\u7562\\u696d\\u751f\\uff0c\\u5c07\\u6703\\u6309\\u7167\\u512a\\u5148\\u6b0a\\u3001\\u96fb\\u8166\\u96a8\\u6a5f\\u751f\\u6210\\u865f\\u78bc\\uff0c\\u4ee5\\u53ca\\u6559\\u80b2\\u5c40\\u7684\\u8981\\u6c42\\uff08\\u5982\\u6709\\u9700\\u8981\\uff09\\u9032\\u884c\\u4e2d\\u592e\\u5206\\u914d\\u76f8\\u95dc\\u5c0f\\u5b78\\u5b78\\u4f4d\\u3002<\\\/span><\\\/p><table style=\\\"border-collapse: collapse; width: 100%; font-size: 14px;\\\"><tbody><tr><td style=\\\"border: 1px solid #ccc; padding: 6px 6px; line-height: 1.25; vertical-align: top; font-weight: 600; white-space: nowrap;\\\">\\u70cf\\u6eaa\\u6c99\\u570b\\u969b\\u5e7c\\u7a1a\\u5712<\\\/td><td style=\\\"border: 1px solid #ccc; padding: 6px 6px; line-height: 1.25; vertical-align: top;\\\">\\u6c99\\u7530\\u5c0f\\u5b78 &#8211; 5\\u73ed<br \\\/>\\u7562\\u67b6\\u5c71\\u5c0f\\u5b78 &#8211; 2\\u73ed<\\\/td><\\\/tr><tr><td style=\\\"border: 1px solid #ccc; padding: 6px 6px; line-height: 1.25; vertical-align: top; font-weight: 600; white-space: nowrap;\\\">\\u66c9\\u65b0\\u570b\\u969b\\u5e7c\\u7a1a\\u5712<\\\/td><td style=\\\"border: 1px solid #ccc; padding: 6px 6px; line-height: 1.25; vertical-align: top;\\\">\\u767d\\u666e\\u7406\\u5c0f\\u5b78 &#8211; 4\\u73ed<br \\\/>\\u5df1\\u9023\\u62ff\\u5c0f\\u5b78\\u3001\\u5c71\\u9802\\u5c0f\\u5b78 &#8211; \\u51714\\u73ed<\\\/td><\\\/tr><tr><td style=\\\"border: 1px solid #ccc; padding: 6px 6px; line-height: 1.25; vertical-align: top; font-weight: 600; white-space: nowrap;\\\">\\u9752\\u8863\\u570b\\u969b\\u5e7c\\u7a1a\\u5712<\\\/td><td style=\\\"border: 1px solid #ccc; padding: 6px 6px; line-height: 1.25; vertical-align: top;\\\">\\u4e5d\\u9f8d\\u5c0f\\u5b78 &#8211; 5\\u73ed<br \\\/>\\u7562\\u67b6\\u5c71\\u5c0f\\u5b78\\u3001\\u667a\\u65b0\\u66f8\\u9662 &#8211; \\u51713\\u73ed<\\\/td><\\\/tr><tr><td style=\\\"border: 1px solid #ccc; padding: 6px 6px; line-height: 1.25; vertical-align: top; font-weight: 600; white-space: nowrap;\\\">\\u897f\\u4e5d\\u9f8d\\u5e7c\\u7a1a\\u5712<\\\/td><td style=\\\"border: 1px solid #ccc; padding: 6px 6px; line-height: 1.25; vertical-align: top;\\\">\\u6e05\\u6c34\\u7063\\u5c0f\\u5b78 &#8211; 4\\u73ed<br \\\/>\\u5805\\u5c3c\\u5730\\u5c0f\\u5b78 &#8211; 2\\u73ed<\\\/td><\\\/tr><tr><td style=\\\"border: 1px solid #ccc; padding: 6px 6px; line-height: 1.25; vertical-align: top; font-weight: 600; white-space: nowrap;\\\">\\u9c02\\u9b5a\\u6d8c\\u5c0f\\u5b78\\u5e7c\\u7a1a\\u5712<\\\/td><td style=\\\"border: 1px solid #ccc; padding: 6px 6px; line-height: 1.25; vertical-align: top;\\\">\\u9c02\\u9b5a\\u6d8c\\u5c0f\\u5b78 &#8211; 4\\u73ed<\\\/td><\\\/tr><tr><td style=\\\"border: 1px solid #ccc; padding: 6px 6px; line-height: 1.25; vertical-align: top; font-weight: 600; white-space: nowrap;\\\">\\u5553\\u65b0\\u66f8\\u9662\\u5e7c\\u7a1a\\u5712<\\\/td><td style=\\\"border: 1px solid #ccc; padding: 6px 6px; line-height: 1.25; vertical-align: top;\\\">\\u5553\\u65b0\\u66f8\\u9662 &#8211; 6\\u73ed<\\\/td><\\\/tr><\\\/tbody><\\\/table>\"}}]}<\/script>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c010f12 e-flex e-con-boxed e-con e-parent\" data-id=\"c010f12\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-601af2c e-con-full e-flex e-con e-child\" data-id=\"601af2c\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-054f32b elementor-widget elementor-widget-html\" data-id=\"054f32b\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>ESF Admissions Tabs<\/title>\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Roboto+Slab:wght@500;700&family=Mulish:wght@400;500;600;700&display=swap\" rel=\"stylesheet\">\n<style>\n  \/* ===== ESF Admissions Tabs \u2014 block-scoped, collision-proof ===== *\/\n  \/* Tokens live on the block root so they never leak out or get overridden by a global :root *\/\n  .esfadm-q7v2 {\n    --esfadm-maroon:        #880234;   \/* button fills, active tab, K1 accent bar *\/\n    --esfadm-maroon-dark:   #6A0228;   \/* button hover *\/\n    --esfadm-maroon-text:   #74082F;   \/* eyebrow \/ small-caps labels *\/\n    --esfadm-ink:           #1B191A;   \/* headings + dates *\/\n    --esfadm-body:          #565455;   \/* lead paragraphs *\/\n    --esfadm-muted:         #8A8788;   \/* time text, italic note *\/\n    --esfadm-link:          #2A62B7;   \/* email links *\/\n    --esfadm-panel-border:  #DED8DA;   \/* content panel + contact cards *\/\n    --esfadm-card-border:   #D9D7D8;   \/* webinar cards *\/\n    --esfadm-highlight:     #F5E6E9;   \/* hotline + K1 window blocks *\/\n    --esfadm-radius:        4px;\n    \/* CJK (Traditional Chinese, HK) fallbacks appended so zh-hant renders cleanly *\/\n    --esfadm-font-head:     'Roboto Slab', Georgia, 'Times New Roman', 'Noto Serif HK', 'PingFang HK', 'Microsoft JhengHei', serif;\n    --esfadm-font-body:     'Mulish', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang HK', 'Microsoft JhengHei', 'Noto Sans HK', sans-serif;\n\n    max-width: 1180px;\n    margin: 0 auto 40px;\n    padding: 0 24px;\n    font-family: var(--esfadm-font-body);\n    color: var(--esfadm-body);\n    -webkit-font-smoothing: antialiased;\n  }\n  .esfadm-q7v2, .esfadm-q7v2 * { box-sizing: border-box; }\n\n  \/* ---------- Intro header ---------- *\/\n  .esfadm-q7v2__intro {\n    text-align: center;\n    margin: 0 0 28px;\n  }\n  .esfadm-q7v2__intro-title {\n    font-family: var(--esfadm-font-head);\n    font-weight: 700;\n    font-size: 2.6rem;\n    line-height: 1.2;\n    color: var(--esfadm-ink);\n    margin: 0 0 12px;\n  }\n  .esfadm-q7v2__intro-title b { font-weight: 700; }\n  .esfadm-q7v2__intro-sub {\n    display: block;\n    font-size: 1.12rem;\n    line-height: 1.6;\n    color: var(--esfadm-body);\n  }\n\n  \/* ---------- Tab strip ---------- *\/\n  .esfadm-q7v2__list {\n    display: flex;\n    gap: 10px;\n    flex-wrap: wrap;\n    position: relative;\n    z-index: 2;\n  }\n  .esfadm-q7v2__tab {\n    flex: 1 1 0;\n    min-width: 180px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    gap: 12px;\n    padding: 18px 20px;\n    background: #ffffff;\n    color: var(--esfadm-maroon);\n    border: 2px solid var(--esfadm-maroon);\n    border-radius: 3px;\n    font-family: var(--esfadm-font-body);\n    font-size: 1.35rem;\n    font-weight: 700;\n    line-height: 1.2;\n    text-align: center;\n    cursor: pointer;\n    user-select: none;\n    transition: background .18s ease, color .18s ease, box-shadow .18s ease;\n  }\n  .esfadm-q7v2__tab:hover { background: #fbf3f6; }\n  .esfadm-q7v2__tab[aria-selected=\"true\"] {\n    background: var(--esfadm-maroon);\n    color: #ffffff;\n    box-shadow: 0 6px 14px -6px rgba(136, 2, 52, .55);\n  }\n  .esfadm-q7v2__tab:focus-visible {\n    outline: 3px solid rgba(136, 2, 52, .35);\n    outline-offset: 2px;\n  }\n  .esfadm-q7v2__caret {\n    flex: 0 0 auto;\n    width: 12px;\n    height: 12px;\n    fill: currentColor;\n    transition: transform .2s ease;\n  }\n  .esfadm-q7v2__tab[aria-selected=\"true\"] .esfadm-q7v2__caret { transform: rotate(90deg); }\n\n  \/* ---------- Panels ---------- *\/\n  .esfadm-q7v2__panel {\n    border: 1px solid var(--esfadm-panel-border);\n    border-top: none;\n    background: #ffffff;\n    padding: 56px 60px 64px;\n    animation: esfadmFade .25s ease;\n    margin-top: 20px;\n  }\n  .esfadm-q7v2__panel[hidden] { display: none; }\n  @keyframes esfadmFade { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: none; } }\n\n  .esfadm-q7v2__title {\n    font-family: var(--esfadm-font-head);\n    font-weight: 700;\n    font-size: 2.4rem;\n    line-height: 1.2;\n    color: var(--esfadm-ink);\n    margin: 0 0 18px;\n    padding-bottom: 16px;\n  }\n  .esfadm-q7v2__lead {\n    font-size: 1.12rem;\n    line-height: 1.6;\n    max-width: 760px;\n    margin: 0 0 36px;\n    color: var(--esfadm-body);\n  }\n\n  \/* ---------- CTA (button \/ link) ---------- *\/\n  .esfadm-q7v2__cta {\n    display: inline-block;\n    background: var(--esfadm-maroon);\n    color: #ffffff;\n    text-decoration: none;\n    font-weight: 700;\n    font-size: 1rem;\n    padding: 16px 30px;\n    border-radius: var(--esfadm-radius);\n    cursor: pointer;\n    user-select: none;\n    transition: background .18s ease, transform .08s ease;\n  }\n  .esfadm-q7v2__cta:hover { background: var(--esfadm-maroon-dark); }\n  .esfadm-q7v2__cta:active { transform: translateY(1px); }\n  .esfadm-q7v2__cta:focus-visible { outline: 3px solid rgba(136, 2, 52, .35); outline-offset: 2px; }\n  .esfadm-q7v2__cta--sm { padding: 12px 24px; font-size: .95rem; }\n\n  \/* ---------- Webinar cards ---------- *\/\n  .esfadm-q7v2__cards {\n    display: grid;\n    grid-template-columns: repeat(3, 1fr);\n    gap: 30px;\n    margin-top: 12px;\n  }\n  .esfadm-q7v2__card {\n    border: 1px solid var(--esfadm-card-border);\n    border-radius: 12px;\n    padding: 40px 34px;\n    text-align: left;\n    display: flex;\n    flex-direction: column;\n    align-items: flex-start;\n  }\n  .esfadm-q7v2__eyebrow {\n    font-size: .82rem;\n    font-weight: 700;\n    letter-spacing: .08em;\n    text-transform: uppercase;\n    color: var(--esfadm-maroon-text);\n    margin: 0 0 18px;\n  }\n  .esfadm-q7v2__date {\n    font-family: var(--esfadm-font-head);\n    font-weight: 700;\n    font-size: 1.7rem;\n    color: var(--esfadm-ink);\n    margin: 0 0 14px;\n  }\n  .esfadm-q7v2__time {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    color: var(--esfadm-muted);\n    font-size: 1.05rem;\n    margin-bottom: 28px;\n  }\n  .esfadm-q7v2__time-icon { width: 18px; height: 18px; stroke: var(--esfadm-muted); flex: 0 0 auto; }\n\n  \/* ---------- Highlight blocks ---------- *\/\n  .esfadm-q7v2__box {\n    background: var(--esfadm-highlight);\n    border-radius: var(--esfadm-radius);\n    padding: 26px 32px;\n    max-width: 760px;\n    margin: 0 0 34px;\n  }\n  .esfadm-q7v2__box--bar { border-left: 5px solid var(--esfadm-maroon); }\n  .esfadm-q7v2__box .esfadm-q7v2__eyebrow { margin-bottom: 10px; }\n  .esfadm-q7v2__box-value {\n    font-family: var(--esfadm-font-head);\n    font-weight: 700;\n    font-size: 1.7rem;\n    color: var(--esfadm-ink);\n  }\n  .esfadm-q7v2__note {\n    font-style: italic;\n    color: var(--esfadm-muted);\n    font-size: .95rem;\n    margin-top: 26px;\n  }\n\n  \/* ---------- Contact grid ---------- *\/\n  .esfadm-q7v2__contacts {\n    display: grid;\n    grid-template-columns: repeat(2, minmax(0, 360px));\n    gap: 22px;\n    margin: 0 0 36px;\n  }\n  .esfadm-q7v2__contact {\n    border: 1px solid var(--esfadm-panel-border);\n    border-radius: var(--esfadm-radius);\n    padding: 22px 26px;\n  }\n  .esfadm-q7v2__contact .esfadm-q7v2__eyebrow { margin-bottom: 12px; }\n  .esfadm-q7v2__contact-link {\n    color: var(--esfadm-link);\n    text-decoration: none;\n    word-break: break-all;\n    font-size: 1.02rem;\n    cursor: pointer;\n  }\n  .esfadm-q7v2__contact-link:hover { text-decoration: underline; }\n  .esfadm-q7v2__contact-link:focus-visible { outline: 2px solid rgba(42, 98, 183, .5); outline-offset: 2px; }\n\n  \/* ---------- Responsive ---------- *\/\n  @media (max-width: 860px) {\n    .esfadm-q7v2__panel { padding: 40px 28px 48px; }\n    .esfadm-q7v2__intro-title { font-size: 2rem; }\n    .esfadm-q7v2__title { font-size: 2rem; }\n    .esfadm-q7v2__cards { grid-template-columns: 1fr; }\n    .esfadm-q7v2__contacts { grid-template-columns: 1fr; }\n    .esfadm-q7v2__tab { flex: 1 1 100%; font-size: 1.15rem; padding: 15px; }\n  }\n<\/style>\n<\/head>\n<body>\n\n<div class=\"esfadm-q7v2\">\n\n  <!-- Intro header -->\n  <div class=\"esfadm-q7v2__intro\">\n    <h2 class=\"esfadm-q7v2__intro-title\"><b data-zh=\"\u7acb\u5373\u958b\u5c55\u82f1\u57fa\u6559\u80b2\u4e4b\u65c5\">Begin Their Journey Today<\/b><\/h2>\n    <span class=\"esfadm-q7v2__intro-sub\" style=\"font-weight: 400;\" data-zh=\"\u63a2\u7d22\u6211\u5011\u7684\u8cc7\u6e90\uff0c\u627e\u5230\u9069\u5408\u7684\u9053\u8def\u3002\">Explore our resources and find the right path for your family.<\/span>\n  <\/div>\n\n  <!-- Tab strip -->\n  <div class=\"esfadm-q7v2__list\" role=\"tablist\" aria-label=\"ESF admissions\">\n    <div class=\"esfadm-q7v2__tab\" role=\"tab\" id=\"esfadm-tab-webinar\"  aria-controls=\"esfadm-panel-webinar\"  aria-selected=\"true\"  tabindex=\"0\">\n      <span data-zh=\"\u7db2\u4e0a\u8b1b\u5ea7\">Webinar<\/span> <svg class=\"esfadm-q7v2__caret\" viewBox=\"0 0 10 10\" aria-hidden=\"true\"><path d=\"M2 1 L8 5 L2 9 Z\"\/><\/svg>\n    <\/div>\n    <div class=\"esfadm-q7v2__tab\" role=\"tab\" id=\"esfadm-tab-opendays\" aria-controls=\"esfadm-panel-opendays\" aria-selected=\"false\" tabindex=\"-1\">\n      <span data-zh=\"\u5b78\u6821\u958b\u653e\u65e5\">Schools&rsquo; Open Days<\/span> <svg class=\"esfadm-q7v2__caret\" viewBox=\"0 0 10 10\" aria-hidden=\"true\"><path d=\"M2 1 L8 5 L2 9 Z\"\/><\/svg>\n    <\/div>\n    <div class=\"esfadm-q7v2__tab\" role=\"tab\" id=\"esfadm-tab-enquiry\"  aria-controls=\"esfadm-panel-enquiry\"  aria-selected=\"false\" tabindex=\"-1\">\n      <span data-zh=\"\u7acb\u5373\u67e5\u8a62\">Enquire Now<\/span> <svg class=\"esfadm-q7v2__caret\" viewBox=\"0 0 10 10\" aria-hidden=\"true\"><path d=\"M2 1 L8 5 L2 9 Z\"\/><\/svg>\n    <\/div>\n    <div class=\"esfadm-q7v2__tab\" role=\"tab\" id=\"esfadm-tab-apply\"    aria-controls=\"esfadm-panel-apply\"    aria-selected=\"false\" tabindex=\"-1\">\n      <span data-zh=\"\u7acb\u5373\u7533\u8acb\">Apply<\/span> <svg class=\"esfadm-q7v2__caret\" viewBox=\"0 0 10 10\" aria-hidden=\"true\"><path d=\"M2 1 L8 5 L2 9 Z\"\/><\/svg>\n    <\/div>\n  <\/div>\n\n  <!-- Webinar -->\n  <div class=\"esfadm-q7v2__panel\" role=\"tabpanel\" id=\"esfadm-panel-webinar\" aria-labelledby=\"esfadm-tab-webinar\" tabindex=\"0\">\n    <div class=\"esfadm-q7v2__title\" role=\"heading\" aria-level=\"2\" data-zh=\"\u63a2\u7d22\u82f1\u57fa\u5b78\u6821\u8207\u8ab2\u7a0b\">Exploring ESF Schools and Curriculum<\/div>\n    <div class=\"esfadm-q7v2__lead\" data-zh=\"\u6b61\u8fce\u53c3\u52a0\u6211\u5011\u5373\u5c07\u8209\u8fa6\u7684\u7db2\u4e0a\u8b1b\u5ea7\uff0c\u6df1\u5165\u4e86\u89e3\u5404\u5b78\u6bb5\u7684\u6559\u80b2\u6b77\u7a0b\u3002\u6211\u5011\u7684\u5c08\u5bb6\u5c07\u4ecb\u7d39\u6559\u5b78\u65b9\u6cd5\u7684\u8f49\u8b8a\uff0c\u53ca\u65b0\u6a21\u5f0f\u5982\u4f55\u5be6\u73fe\u7121\u7e2b\u929c\u63a5\u3002\">Join our upcoming webinars to learn more about the educational journey at each level. Our experts will discuss pedagogical shifts and the seamless transitions provided by the new strategy.<\/div>\n    <div class=\"esfadm-q7v2__cards\">\n      <div class=\"esfadm-q7v2__card\">\n        <div class=\"esfadm-q7v2__eyebrow\" data-zh=\"\u5e7c\u7a1a\u5712\">Kindergarten<\/div>\n        <div class=\"esfadm-q7v2__date\" data-zh=\"2026\u5e746\u670811\u65e5\">11 June 2026<\/div>\n        <div class=\"esfadm-q7v2__time\"><svg class=\"esfadm-q7v2__time-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M12 7v5l3 2\"\/><\/svg> <span data-zh=\"\u665a\u4e0a7\u81f38\u6642\">7 &ndash; 8 pm<\/span><\/div>\n        <div class=\"esfadm-q7v2__cta esfadm-q7v2__cta--sm\" role=\"link\" tabindex=\"0\" data-esfadm-href=\"https:\/\/esf-learning.zoom.us\/webinar\/register\/5017788404813\/WN_JyukGSwyRzyLA0Qt6j7yow#\/\" data-zh=\"\u7acb\u5373\u5831\u540d\">Register Now<\/div>\n      <\/div>\n      <div class=\"esfadm-q7v2__card\">\n        <div class=\"esfadm-q7v2__eyebrow\" data-zh=\"\u5c0f\u5b78\">Primary<\/div>\n        <div class=\"esfadm-q7v2__date\" data-zh=\"2026\u5e746\u67089\u65e5\">9 June 2026<\/div>\n        <div class=\"esfadm-q7v2__time\"><svg class=\"esfadm-q7v2__time-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M12 7v5l3 2\"\/><\/svg> <span data-zh=\"\u665a\u4e0a7\u81f38\u6642\">7 &ndash; 8 pm<\/span><\/div>\n        <div class=\"esfadm-q7v2__cta esfadm-q7v2__cta--sm\" role=\"link\" tabindex=\"0\" data-esfadm-href=\"https:\/\/esf-learning.zoom.us\/webinar\/register\/1717788411362\/WN_XQHv_z98TX2-MPtWcDEtYA#\/registration\" data-zh=\"\u7acb\u5373\u5831\u540d\">Register Now<\/div>\n      <\/div>\n      <div class=\"esfadm-q7v2__card\">\n        <div class=\"esfadm-q7v2__eyebrow\" data-zh=\"\u4e2d\u5b78\">Secondary<\/div>\n        <div class=\"esfadm-q7v2__date\" data-zh=\"2026\u5e746\u670810\u65e5\">10 June 2026<\/div>\n        <div class=\"esfadm-q7v2__time\"><svg class=\"esfadm-q7v2__time-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M12 7v5l3 2\"\/><\/svg> <span data-zh=\"\u665a\u4e0a7\u81f38\u6642\">7 &ndash; 8 pm<\/span><\/div>\n        <div class=\"esfadm-q7v2__cta esfadm-q7v2__cta--sm\" role=\"link\" tabindex=\"0\" data-esfadm-href=\"https:\/\/esf-learning.zoom.us\/webinar\/register\/6917788416795\/WN_HFTh-qWQSEicgBxnjrrMug#\/registration\" data-zh=\"\u7acb\u5373\u5831\u540d\">Register Now<\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- Schools' Open Days -->\n  <div class=\"esfadm-q7v2__panel\" role=\"tabpanel\" id=\"esfadm-panel-opendays\" aria-labelledby=\"esfadm-tab-opendays\" tabindex=\"0\" hidden>\n    <div class=\"esfadm-q7v2__title\" role=\"heading\" aria-level=\"2\" data-zh=\"\u53c3\u89c0\u5b78\u6821\">Visit Our Schools<\/div>\n    <div class=\"esfadm-q7v2__lead\" data-zh=\"\u6b61\u8fce\u89aa\u8eab\u9ad4\u9a57\u6211\u5011\u7684\u5b78\u7fd2\u74b0\u5883\uff0c\u8207\u6821\u9577\u53ca\u5b78\u6821\u5718\u968a\u898b\u9762\uff0c\u4e86\u89e3\u5404\u6821\u5982\u4f55\u5408\u4f5c\uff0c\u70ba\u5b69\u5b50\u6253\u9020\u7121\u7e2b\u929c\u63a5\u7684\u5b78\u7fd2\u6b77\u7a0b\u3002\">Experience our learning environments firsthand. Meet the Principals and school team, see how our schools collaborate to create a seamless transition for your child.<\/div>\n    <div class=\"esfadm-q7v2__cta\" role=\"link\" tabindex=\"0\" data-esfadm-href=\"https:\/\/join-us.esf.edu.hk\/zh-hant\/parent-information-sessions\/\" data-zh=\"\u67e5\u770b\u65e5\u7a0b\">View Schedule<\/div>\n  <\/div>\n\n  <!-- Enquiry Now  ->  Speak with Admissions -->\n  <div class=\"esfadm-q7v2__panel\" role=\"tabpanel\" id=\"esfadm-panel-enquiry\" aria-labelledby=\"esfadm-tab-enquiry\" tabindex=\"0\" hidden>\n    <div class=\"esfadm-q7v2__title\" role=\"heading\" aria-level=\"2\" data-zh=\"\u806f\u7d61\u62db\u751f\u5718\u968a\">Speak with Admissions<\/div>\n    <div class=\"esfadm-q7v2__lead\" data-zh=\"\u5c0d\u65b0\u7684\u76f8\u95dc\u5b78\u6821\u6a21\u5f0f\u3001\u512a\u5148\u9304\u53d6\u6216\u7533\u8acb\u6d41\u7a0b\u6709\u4efb\u4f55\u7591\u554f\uff1f\u6211\u5011\u7684\u5c08\u696d\u62db\u751f\u5718\u968a\u5c07\u70ba\u4f60\u63d0\u4f9b\u5354\u52a9\uff0c\u898f\u5283\u5b69\u5b50\u7684\u6559\u80b2\u4e4b\u65c5\u3002\">Have specific questions about the new associated school model, priority, or the application process? Our dedicated admissions team is here to help you navigate your child's educational journey.<\/div>\n    <div class=\"esfadm-q7v2__box\">\n      <div class=\"esfadm-q7v2__eyebrow\" data-zh=\"\u96fb\u8a71\">Hotline<\/div>\n      <div class=\"esfadm-q7v2__box-value\">+852 3762 2411<\/div>\n    <\/div>\n    <div class=\"esfadm-q7v2__contacts\">\n      <div class=\"esfadm-q7v2__contact\">\n        <div class=\"esfadm-q7v2__eyebrow\" data-zh=\"\u5e7c\u7a1a\u5712\">Kindergarten<\/div>\n        <div class=\"esfadm-q7v2__contact-link\" role=\"link\" tabindex=\"0\" data-esfadm-href=\"mailto:kindergarten.admissions@esfcentre.edu.hk\">kindergarten.admissions@esfcentre.edu.hk<\/div>\n      <\/div>\n      <div class=\"esfadm-q7v2__contact\">\n        <div class=\"esfadm-q7v2__eyebrow\" data-zh=\"\u5c0f\u5b78\">Primary<\/div>\n        <div class=\"esfadm-q7v2__contact-link\" role=\"link\" tabindex=\"0\" data-esfadm-href=\"mailto:primary.admissions@esfcentre.edu.hk\">primary.admissions@esfcentre.edu.hk<\/div>\n      <\/div>\n      <div class=\"esfadm-q7v2__contact\">\n        <div class=\"esfadm-q7v2__eyebrow\" data-zh=\"\u4e2d\u5b78\">Secondary<\/div>\n        <div class=\"esfadm-q7v2__contact-link\" role=\"link\" tabindex=\"0\" data-esfadm-href=\"mailto:secondary.admissions@esfcentre.edu.hk\">secondary.admissions@esfcentre.edu.hk<\/div>\n      <\/div>\n    <\/div>\n    <div class=\"esfadm-q7v2__cta\" role=\"link\" tabindex=\"0\" data-esfadm-href=\"https:\/\/join-us.esf.edu.hk\/zh-hant\/enquiry-form\/\" data-zh=\"\u63d0\u4ea4\u67e5\u8a62\u8868\u683c\">Submit Your Enquiry Form<\/div>\n  <\/div>\n\n  <!-- Apply  ->  Secure Your Place -->\n  <div class=\"esfadm-q7v2__panel\" role=\"tabpanel\" id=\"esfadm-panel-apply\" aria-labelledby=\"esfadm-tab-apply\" tabindex=\"0\" hidden>\n    <div class=\"esfadm-q7v2__title\" role=\"heading\" aria-level=\"2\" data-zh=\"\u99ac\u4e0a\u884c\u52d5\">Secure Your Place<\/div>\n    <div class=\"esfadm-q7v2__lead\" data-zh=\"\u6e96\u5099\u597d\u52a0\u5165\u82f1\u57fa\u5927\u5bb6\u5ead\u4e86\u55ce\uff1f\u5831\u8b802027\/28\u5b78\u5e74K1\u7684\u4e2d\u592e\u62db\u751f\u7533\u8acb\u65bc2026\u5e749\u67081-30\u65e5\u958b\u653e\u3002\u7acb\u5373\u4e86\u89e3\u5982\u4f55\u7533\u8acb\uff0c\u958b\u555fK1\u5230Year 13\u7684\u4e00\u689d\u9f8d\u6559\u80b2\u4e4b\u65c5\u3002\">Ready to join the ESF family? Our central application is open for K1 entries from 1 &ndash; 30 September 2026. Start your application to begin your child&rsquo;s through-train experience from K1 to Year 13.<\/div>\n    <div class=\"esfadm-q7v2__box esfadm-q7v2__box--bar\">\n      <div class=\"esfadm-q7v2__eyebrow\" data-zh=\"K1 \u4e2d\u592e\u7533\u8acb\u6642\u6bb5\">K1 Application Window<\/div>\n      <div class=\"esfadm-q7v2__box-value\" data-zh=\"2026\u5e749\u67081-30\u65e5\">1 &ndash; 30 September 2026<\/div>\n    <\/div>\n    <div class=\"esfadm-q7v2__cta\" role=\"link\" tabindex=\"0\" data-esfadm-href=\"https:\/\/join-us.esf.edu.hk\/zh-hant\/admissions\/\" data-zh=\"\u5982\u4f55\u7533\u8acb?\">How To Apply?<\/div>\n    <div class=\"esfadm-q7v2__note\" data-zh=\"*\u7533\u8acb2027\/28\u5b78\u5e74\">*Applying for academic year 2027\/28<\/div>\n  <\/div>\n\n<\/div>\n\n<script>\n  (function () {\n    var root = document.querySelector('.esfadm-q7v2');\n    if (!root) return;\n\n    \/* ----- Language: zh-hant anywhere in the URL switches to Traditional Chinese ----- *\/\n    var isZh = \/zh-hant\/i.test(window.location.href);\n    if (isZh) {\n      root.setAttribute('lang', 'zh-Hant');\n      Array.prototype.forEach.call(root.querySelectorAll('[data-zh]'), function (el) {\n        var zh = el.getAttribute('data-zh');\n        if (zh != null && zh !== '') el.textContent = zh;\n      });\n    }\n\n    \/* ----- Tabs (roving tabindex) ----- *\/\n    var tabs   = Array.prototype.slice.call(root.querySelectorAll('.esfadm-q7v2__tab'));\n    var panels = Array.prototype.slice.call(root.querySelectorAll('.esfadm-q7v2__panel'));\n\n    function activate(tab, focus) {\n      tabs.forEach(function (t) {\n        var on = (t === tab);\n        t.setAttribute('aria-selected', String(on));\n        t.setAttribute('tabindex', on ? '0' : '-1');\n      });\n      panels.forEach(function (p) {\n        p.hidden = (p.id !== tab.getAttribute('aria-controls'));\n      });\n      if (focus) tab.focus();\n    }\n\n    tabs.forEach(function (tab, i) {\n      tab.addEventListener('click', function () { activate(tab); });\n      tab.addEventListener('keydown', function (e) {\n        var next = null;\n        if (e.key === 'Enter' || e.key === ' ' || e.key === 'Spacebar') { e.preventDefault(); activate(tab); return; }\n        if (e.key === 'ArrowRight' || e.key === 'ArrowDown') next = tabs[(i + 1) % tabs.length];\n        else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') next = tabs[(i - 1 + tabs.length) % tabs.length];\n        else if (e.key === 'Home') next = tabs[0];\n        else if (e.key === 'End') next = tabs[tabs.length - 1];\n        if (next) { e.preventDefault(); activate(next, true); }\n      });\n    });\n\n    \/* ----- CTA \/ email \"links\" (div with role=link) ----- *\/\n  function go(el) {\n  var href = el.getAttribute('data-esfadm-href');\n  if (!href || href === '#') return;\n  \/\/ mailto: links should hand off to the OS mail client, not spawn a blank tab\n  if (\/^mailto:\/i.test(href)) {\n    window.location.href = href;\n    return;\n  }\n  window.open(href, '_blank', 'noopener,noreferrer');\n}\n    root.querySelectorAll('[data-esfadm-href]').forEach(function (el) {\n      el.addEventListener('click', function () { go(el); });\n      el.addEventListener('keydown', function (e) {\n        if (e.key === 'Enter' || e.key === ' ' || e.key === 'Spacebar') { e.preventDefault(); go(el); }\n      });\n    });\n  })();\n<\/script>\n\n<\/body>\n<\/html>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\u8b93\u6bcf\u4e00\u523b\u90fd\u6709\u610f\u7fa9 \u5b69\u5b50\u5728\u8ab2\u5802\u4e0a\u7684\u6642\u5149\uff0c\u662f\u4ed6\u5011\u767c\u6398\u8208\u8da3\u3001\u638c\u63e1\u65b0\u6280\u80fd\u3001\u57f9\u990a\u5b78\u7fd2\u71b1\u60c5\u7684\u7d55\u4f73\u6a5f\u6703\u3002\u6211\u5011\u5168\u65b0\u7684K1\u81f3Y1 [&hellip;]<\/p>\n","protected":false},"author":15,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-34970","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u82f1\u57fa\u5e7c\u5152\u6559\u80b2\u7684\u65b0\u65b9\u5f0f - English Schools Foundation | 22 International Schools in HK<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/join-us.esf.edu.hk\/zh-hant\/earlyyearsnewapproach\/\" \/>\n<meta property=\"og:locale\" content=\"zh_TW\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u82f1\u57fa\u5e7c\u5152\u6559\u80b2\u7684\u65b0\u65b9\u5f0f - English Schools Foundation | 22 International Schools in HK\" \/>\n<meta property=\"og:description\" content=\"\u8b93\u6bcf\u4e00\u523b\u90fd\u6709\u610f\u7fa9 \u5b69\u5b50\u5728\u8ab2\u5802\u4e0a\u7684\u6642\u5149\uff0c\u662f\u4ed6\u5011\u767c\u6398\u8208\u8da3\u3001\u638c\u63e1\u65b0\u6280\u80fd\u3001\u57f9\u990a\u5b78\u7fd2\u71b1\u60c5\u7684\u7d55\u4f73\u6a5f\u6703\u3002\u6211\u5011\u5168\u65b0\u7684K1\u81f3Y1 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/join-us.esf.edu.hk\/zh-hant\/earlyyearsnewapproach\/\" \/>\n<meta property=\"og:site_name\" content=\"English Schools Foundation | 22 International Schools in HK\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/English.Schools.Foundation\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-05T02:27:57+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/join-us.esf.edu.hk\/wp-content\/uploads\/2026\/05\/2_seamless_journey_route.svg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u9810\u4f30\u95b1\u8b80\u6642\u9593\" \/>\n\t<meta name=\"twitter:data1\" content=\"3 \u5206\u9418\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/join-us.esf.edu.hk\/zh-hant\/earlyyearsnewapproach\/\",\"url\":\"https:\/\/join-us.esf.edu.hk\/zh-hant\/earlyyearsnewapproach\/\",\"name\":\"\u82f1\u57fa\u5e7c\u5152\u6559\u80b2\u7684\u65b0\u65b9\u5f0f - English Schools Foundation | 22 International Schools in HK\",\"isPartOf\":{\"@id\":\"https:\/\/join-us.esf.edu.hk\/zh-hant\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/join-us.esf.edu.hk\/zh-hant\/earlyyearsnewapproach\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/join-us.esf.edu.hk\/zh-hant\/earlyyearsnewapproach\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/join-us.esf.edu.hk\/wp-content\/uploads\/2026\/05\/2_seamless_journey_route.svg\",\"datePublished\":\"2026-06-04T03:46:17+00:00\",\"dateModified\":\"2026-06-05T02:27:57+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/join-us.esf.edu.hk\/zh-hant\/earlyyearsnewapproach\/#breadcrumb\"},\"inLanguage\":\"zh-TW\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/join-us.esf.edu.hk\/zh-hant\/earlyyearsnewapproach\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-TW\",\"@id\":\"https:\/\/join-us.esf.edu.hk\/zh-hant\/earlyyearsnewapproach\/#primaryimage\",\"url\":\"https:\/\/join-us.esf.edu.hk\/wp-content\/uploads\/2026\/05\/2_seamless_journey_route.svg\",\"contentUrl\":\"https:\/\/join-us.esf.edu.hk\/wp-content\/uploads\/2026\/05\/2_seamless_journey_route.svg\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/join-us.esf.edu.hk\/zh-hant\/earlyyearsnewapproach\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/join-us.esf.edu.hk\/zh-hant\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u82f1\u57fa\u5e7c\u5152\u6559\u80b2\u7684\u65b0\u65b9\u5f0f\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/join-us.esf.edu.hk\/zh-hant\/#website\",\"url\":\"https:\/\/join-us.esf.edu.hk\/zh-hant\/\",\"name\":\"English Schools Foundation | 22 International Schools in HK\",\"description\":\"Offering a world class education from K1 to Year 13\",\"publisher\":{\"@id\":\"https:\/\/join-us.esf.edu.hk\/zh-hant\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/join-us.esf.edu.hk\/zh-hant\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-TW\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/join-us.esf.edu.hk\/zh-hant\/#organization\",\"name\":\"English Schools Foundation\",\"alternateName\":\"ESF\",\"url\":\"https:\/\/join-us.esf.edu.hk\/zh-hant\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-TW\",\"@id\":\"https:\/\/join-us.esf.edu.hk\/zh-hant\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/join-us.esf.edu.hk\/wp-content\/uploads\/2023\/07\/esf-logo-wt.svg\",\"contentUrl\":\"https:\/\/join-us.esf.edu.hk\/wp-content\/uploads\/2023\/07\/esf-logo-wt.svg\",\"width\":616.09,\"height\":158.48,\"caption\":\"English Schools Foundation\"},\"image\":{\"@id\":\"https:\/\/join-us.esf.edu.hk\/zh-hant\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/English.Schools.Foundation\",\"https:\/\/www.instagram.com\/esf_englishschoolsfoundation\/\",\"https:\/\/www.youtube.com\/@esfcommunications\",\"https:\/\/hk.linkedin.com\/company\/esf-education\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u82f1\u57fa\u5e7c\u5152\u6559\u80b2\u7684\u65b0\u65b9\u5f0f - English Schools Foundation | 22 International Schools in HK","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/join-us.esf.edu.hk\/zh-hant\/earlyyearsnewapproach\/","og_locale":"zh_TW","og_type":"article","og_title":"\u82f1\u57fa\u5e7c\u5152\u6559\u80b2\u7684\u65b0\u65b9\u5f0f - English Schools Foundation | 22 International Schools in HK","og_description":"\u8b93\u6bcf\u4e00\u523b\u90fd\u6709\u610f\u7fa9 \u5b69\u5b50\u5728\u8ab2\u5802\u4e0a\u7684\u6642\u5149\uff0c\u662f\u4ed6\u5011\u767c\u6398\u8208\u8da3\u3001\u638c\u63e1\u65b0\u6280\u80fd\u3001\u57f9\u990a\u5b78\u7fd2\u71b1\u60c5\u7684\u7d55\u4f73\u6a5f\u6703\u3002\u6211\u5011\u5168\u65b0\u7684K1\u81f3Y1 [&hellip;]","og_url":"https:\/\/join-us.esf.edu.hk\/zh-hant\/earlyyearsnewapproach\/","og_site_name":"English Schools Foundation | 22 International Schools in HK","article_publisher":"https:\/\/www.facebook.com\/English.Schools.Foundation","article_modified_time":"2026-06-05T02:27:57+00:00","og_image":[{"url":"https:\/\/join-us.esf.edu.hk\/wp-content\/uploads\/2026\/05\/2_seamless_journey_route.svg"}],"twitter_card":"summary_large_image","twitter_misc":{"\u9810\u4f30\u95b1\u8b80\u6642\u9593":"3 \u5206\u9418"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/join-us.esf.edu.hk\/zh-hant\/earlyyearsnewapproach\/","url":"https:\/\/join-us.esf.edu.hk\/zh-hant\/earlyyearsnewapproach\/","name":"\u82f1\u57fa\u5e7c\u5152\u6559\u80b2\u7684\u65b0\u65b9\u5f0f - English Schools Foundation | 22 International Schools in HK","isPartOf":{"@id":"https:\/\/join-us.esf.edu.hk\/zh-hant\/#website"},"primaryImageOfPage":{"@id":"https:\/\/join-us.esf.edu.hk\/zh-hant\/earlyyearsnewapproach\/#primaryimage"},"image":{"@id":"https:\/\/join-us.esf.edu.hk\/zh-hant\/earlyyearsnewapproach\/#primaryimage"},"thumbnailUrl":"https:\/\/join-us.esf.edu.hk\/wp-content\/uploads\/2026\/05\/2_seamless_journey_route.svg","datePublished":"2026-06-04T03:46:17+00:00","dateModified":"2026-06-05T02:27:57+00:00","breadcrumb":{"@id":"https:\/\/join-us.esf.edu.hk\/zh-hant\/earlyyearsnewapproach\/#breadcrumb"},"inLanguage":"zh-TW","potentialAction":[{"@type":"ReadAction","target":["https:\/\/join-us.esf.edu.hk\/zh-hant\/earlyyearsnewapproach\/"]}]},{"@type":"ImageObject","inLanguage":"zh-TW","@id":"https:\/\/join-us.esf.edu.hk\/zh-hant\/earlyyearsnewapproach\/#primaryimage","url":"https:\/\/join-us.esf.edu.hk\/wp-content\/uploads\/2026\/05\/2_seamless_journey_route.svg","contentUrl":"https:\/\/join-us.esf.edu.hk\/wp-content\/uploads\/2026\/05\/2_seamless_journey_route.svg"},{"@type":"BreadcrumbList","@id":"https:\/\/join-us.esf.edu.hk\/zh-hant\/earlyyearsnewapproach\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/join-us.esf.edu.hk\/zh-hant\/"},{"@type":"ListItem","position":2,"name":"\u82f1\u57fa\u5e7c\u5152\u6559\u80b2\u7684\u65b0\u65b9\u5f0f"}]},{"@type":"WebSite","@id":"https:\/\/join-us.esf.edu.hk\/zh-hant\/#website","url":"https:\/\/join-us.esf.edu.hk\/zh-hant\/","name":"English Schools Foundation | 22 International Schools in HK","description":"Offering a world class education from K1 to Year 13","publisher":{"@id":"https:\/\/join-us.esf.edu.hk\/zh-hant\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/join-us.esf.edu.hk\/zh-hant\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-TW"},{"@type":"Organization","@id":"https:\/\/join-us.esf.edu.hk\/zh-hant\/#organization","name":"English Schools Foundation","alternateName":"ESF","url":"https:\/\/join-us.esf.edu.hk\/zh-hant\/","logo":{"@type":"ImageObject","inLanguage":"zh-TW","@id":"https:\/\/join-us.esf.edu.hk\/zh-hant\/#\/schema\/logo\/image\/","url":"https:\/\/join-us.esf.edu.hk\/wp-content\/uploads\/2023\/07\/esf-logo-wt.svg","contentUrl":"https:\/\/join-us.esf.edu.hk\/wp-content\/uploads\/2023\/07\/esf-logo-wt.svg","width":616.09,"height":158.48,"caption":"English Schools Foundation"},"image":{"@id":"https:\/\/join-us.esf.edu.hk\/zh-hant\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/English.Schools.Foundation","https:\/\/www.instagram.com\/esf_englishschoolsfoundation\/","https:\/\/www.youtube.com\/@esfcommunications","https:\/\/hk.linkedin.com\/company\/esf-education"]}]}},"_links":{"self":[{"href":"https:\/\/join-us.esf.edu.hk\/zh-hant\/wp-json\/wp\/v2\/pages\/34970"}],"collection":[{"href":"https:\/\/join-us.esf.edu.hk\/zh-hant\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/join-us.esf.edu.hk\/zh-hant\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/join-us.esf.edu.hk\/zh-hant\/wp-json\/wp\/v2\/users\/15"}],"replies":[{"embeddable":true,"href":"https:\/\/join-us.esf.edu.hk\/zh-hant\/wp-json\/wp\/v2\/comments?post=34970"}],"version-history":[{"count":127,"href":"https:\/\/join-us.esf.edu.hk\/zh-hant\/wp-json\/wp\/v2\/pages\/34970\/revisions"}],"predecessor-version":[{"id":35300,"href":"https:\/\/join-us.esf.edu.hk\/zh-hant\/wp-json\/wp\/v2\/pages\/34970\/revisions\/35300"}],"wp:attachment":[{"href":"https:\/\/join-us.esf.edu.hk\/zh-hant\/wp-json\/wp\/v2\/media?parent=34970"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}