{"id":6,"date":"2026-04-19T04:33:27","date_gmt":"2026-04-19T04:33:27","guid":{"rendered":"https:\/\/crm.whitepigeon.com.np\/?page_id=6"},"modified":"2026-04-19T04:35:24","modified_gmt":"2026-04-19T04:35:24","slug":"crm","status":"publish","type":"page","link":"https:\/\/crm.whitepigeon.com.np\/?page_id=6","title":{"rendered":"CRM"},"content":{"rendered":"<p><!DOCTYPE html><br \/>\n<html lang=\"en\"><br \/>\n<head><br \/>\n<meta charset=\"UTF-8\"><br \/>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><br \/>\n<title>White Pigeon \u2014 Country Management System<\/title>\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Plus+Jakarta+Sans:wght@300;400;500;600;700&#038;family=Playfair+Display:wght@600&#038;display=swap\" rel=\"stylesheet\">\n<style>\n:root {\n  --primary: #1a3a5c;\n  --primary-light: #2557a7;\n  --accent: #e8a020;\n  --accent-light: #fef3dc;\n  --success: #16a34a;\n  --success-light: #dcfce7;\n  --danger: #dc2626;\n  --danger-light: #fee2e2;\n  --warning: #d97706;\n  --warning-light: #fef3c7;\n  --purple: #7c3aed;\n  --purple-light: #ede9fe;\n  --teal: #0d9488;\n  --teal-light: #ccfbf1;\n  --bg: #f4f6fa;\n  --surface: #ffffff;\n  --surface2: #f8f9fc;\n  --border: #e2e8f0;\n  --border-strong: #cbd5e1;\n  --text: #0f172a;\n  --text2: #475569;\n  --text3: #94a3b8;\n  --sidebar-w: 260px;\n  --radius: 12px;\n  --radius-sm: 8px;\n  --shadow: 0 1px 3px rgba(0,0,0,.08), 0 4px 12px rgba(0,0,0,.04);\n  --shadow-md: 0 4px 16px rgba(0,0,0,.1), 0 1px 4px rgba(0,0,0,.06);\n}<\/p>\n<p>* { box-sizing: border-box; margin: 0; padding: 0; }<\/p>\n<p>body {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  background: var(--bg);\n  color: var(--text);\n  font-size: 14px;\n  line-height: 1.6;\n  overflow-x: hidden;\n}<\/p>\n<p>\/* \u2500\u2500 LAYOUT \u2500\u2500 *\/\n.app { display: flex; min-height: 100vh; }<\/p>\n<p>\/* \u2500\u2500 SIDEBAR \u2500\u2500 *\/\n.sidebar {\n  width: var(--sidebar-w);\n  min-width: var(--sidebar-w);\n  background: var(--primary);\n  display: flex;\n  flex-direction: column;\n  position: fixed;\n  top: 0; left: 0;\n  height: 100vh;\n  z-index: 100;\n  transition: transform .3s ease;\n}<\/p>\n<p>.sidebar-brand {\n  padding: 20px 18px 16px;\n  border-bottom: 1px solid rgba(255,255,255,.1);\n  display: flex; align-items: center; gap: 12px;\n}\n.brand-logo {\n  width: 40px; height: 40px;\n  background: var(--accent);\n  border-radius: 10px;\n  display: flex; align-items: center; justify-content: center;\n  font-size: 20px; flex-shrink: 0;\n}\n.brand-text .name { font-size: 13px; font-weight: 700; color: #fff; letter-spacing: .02em; }\n.brand-text .sub { font-size: 10px; color: rgba(255,255,255,.5); margin-top: 1px; }<\/p>\n<p>.sb-search-wrap { padding: 12px 14px; border-bottom: 1px solid rgba(255,255,255,.08); }\n.sb-search {\n  width: 100%; padding: 8px 12px;\n  background: rgba(255,255,255,.1);\n  border: 1px solid rgba(255,255,255,.15);\n  border-radius: var(--radius-sm);\n  color: #fff; font-size: 12px; outline: none;\n  font-family: inherit;\n  transition: background .2s;\n}\n.sb-search::placeholder { color: rgba(255,255,255,.4); }\n.sb-search:focus { background: rgba(255,255,255,.18); }<\/p>\n<p>.sb-section-label {\n  padding: 12px 16px 6px;\n  font-size: 10px; font-weight: 700;\n  color: rgba(255,255,255,.35);\n  letter-spacing: .1em; text-transform: uppercase;\n}<\/p>\n<p>.country-list { flex: 1; overflow-y: auto; padding: 4px 10px; }\n.country-list::-webkit-scrollbar { width: 4px; }\n.country-list::-webkit-scrollbar-thumb { background: rgba(255,255,255,.15); border-radius: 4px; }<\/p>\n<p>.ci {\n  display: flex; align-items: center; gap: 10px;\n  padding: 8px 10px;\n  border-radius: var(--radius-sm);\n  cursor: pointer; margin-bottom: 2px;\n  transition: background .15s;\n  position: relative;\n}\n.ci:hover { background: rgba(255,255,255,.1); }\n.ci.active { background: rgba(255,255,255,.18); }\n.ci.active::before {\n  content: '';\n  position: absolute; left: 0; top: 50%;\n  transform: translateY(-50%);\n  width: 3px; height: 20px;\n  background: var(--accent);\n  border-radius: 0 3px 3px 0;\n}\n.ci-flag { font-size: 18px; width: 26px; text-align: center; flex-shrink: 0; }\n.ci-name { font-size: 12px; font-weight: 500; color: rgba(255,255,255,.9); flex: 1; }\n.ci-badge {\n  font-size: 9px; font-weight: 600;\n  background: rgba(255,255,255,.15);\n  color: rgba(255,255,255,.7);\n  padding: 2px 6px; border-radius: 10px;\n}\n.ci.active .ci-badge { background: var(--accent); color: var(--primary); }<\/p>\n<p>.sb-add-btn {\n  margin: 10px;\n  padding: 9px;\n  border: 1px dashed rgba(255,255,255,.25);\n  border-radius: var(--radius-sm);\n  background: transparent;\n  color: rgba(255,255,255,.6);\n  font-size: 12px; cursor: pointer;\n  width: calc(100% - 20px);\n  text-align: center;\n  transition: all .2s;\n  font-family: inherit;\n}\n.sb-add-btn:hover { background: rgba(255,255,255,.08); color: #fff; }<\/p>\n<p>\/* \u2500\u2500 MAIN \u2500\u2500 *\/\n.main { margin-left: var(--sidebar-w); flex: 1; display: flex; flex-direction: column; min-width: 0; }<\/p>\n<p>\/* \u2500\u2500 TOPBAR \u2500\u2500 *\/\n.topbar {\n  background: var(--surface);\n  border-bottom: 1px solid var(--border);\n  padding: 0 24px;\n  display: flex; align-items: center; gap: 12px;\n  min-height: 60px;\n  position: sticky; top: 0; z-index: 50;\n  box-shadow: var(--shadow);\n  flex-wrap: wrap;\n  gap: 8px;\n}\n.topbar-left { display: flex; align-items: center; gap: 12px; flex: 1; min-width: 0; }\n.topbar-flag { font-size: 28px; }\n.topbar-info .title { font-size: 16px; font-weight: 700; color: var(--text); }\n.topbar-info .sub { font-size: 11px; color: var(--text3); }<\/p>\n<p>.tab-bar {\n  display: flex; gap: 2px;\n  background: var(--bg);\n  padding: 4px;\n  border-radius: var(--radius-sm);\n  flex-wrap: wrap;\n}\n.tab {\n  padding: 6px 14px;\n  border-radius: 6px;\n  border: none; background: transparent;\n  font-size: 12px; font-weight: 500;\n  cursor: pointer; color: var(--text2);\n  white-space: nowrap;\n  transition: all .15s;\n  font-family: inherit;\n}\n.tab:hover { background: var(--surface); color: var(--text); }\n.tab.active {\n  background: var(--surface);\n  color: var(--primary);\n  box-shadow: 0 1px 4px rgba(0,0,0,.1);\n}\n.tab.active::after {\n  content: '';\n  display: block;\n  width: 100%; height: 2px;\n  background: var(--primary);\n  border-radius: 2px;\n  margin-top: 2px;\n}<\/p>\n<p>.topbar-actions { display: flex; gap: 8px; }<\/p>\n<p>\/* \u2500\u2500 BUTTONS \u2500\u2500 *\/\n.btn {\n  padding: 7px 14px;\n  border-radius: var(--radius-sm);\n  border: 1px solid var(--border-strong);\n  background: var(--surface);\n  color: var(--text);\n  font-size: 12px; font-weight: 500;\n  cursor: pointer;\n  display: inline-flex; align-items: center; gap: 6px;\n  transition: all .15s;\n  font-family: inherit;\n  white-space: nowrap;\n}\n.btn:hover { background: var(--bg); box-shadow: var(--shadow); }\n.btn-primary { background: var(--primary); color: #fff; border-color: var(--primary); }\n.btn-primary:hover { background: var(--primary-light); border-color: var(--primary-light); box-shadow: 0 4px 12px rgba(26,58,92,.3); }\n.btn-accent { background: var(--accent); color: var(--primary); border-color: var(--accent); font-weight: 600; }\n.btn-accent:hover { background: #d4911c; box-shadow: 0 4px 12px rgba(232,160,32,.3); }\n.btn-success { background: var(--success); color: #fff; border-color: var(--success); }\n.btn-success:hover { background: #15803d; }\n.btn-danger { background: transparent; color: var(--danger); border: none; padding: 4px 8px; }\n.btn-danger:hover { background: var(--danger-light); border-radius: 6px; }\n.btn-sm { padding: 5px 10px; font-size: 11px; }\n.btn-xs { padding: 3px 8px; font-size: 10px; border-radius: 6px; }<\/p>\n<p>\/* \u2500\u2500 CONTENT AREA \u2500\u2500 *\/\n.content { flex: 1; overflow-y: auto; padding: 24px; background: var(--bg); }<\/p>\n<p>\/* \u2500\u2500 CARDS \u2500\u2500 *\/\n.card {\n  background: var(--surface);\n  border: 1px solid var(--border);\n  border-radius: var(--radius);\n  padding: 20px;\n  margin-bottom: 16px;\n  box-shadow: var(--shadow);\n}\n.card-header {\n  display: flex; align-items: center; gap: 10px;\n  margin-bottom: 16px;\n  padding-bottom: 14px;\n  border-bottom: 1px solid var(--border);\n}\n.card-title { font-size: 14px; font-weight: 700; color: var(--text); flex: 1; }\n.card-icon {\n  width: 32px; height: 32px;\n  border-radius: 8px;\n  display: flex; align-items: center; justify-content: center;\n  font-size: 15px; flex-shrink: 0;\n}<\/p>\n<p>\/* \u2500\u2500 FORM ELEMENTS \u2500\u2500 *\/\n.form-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 14px; }\n.form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }\n.field { display: flex; flex-direction: column; gap: 5px; }\n.field.full { grid-column: 1 \/ -1; }\n.label {\n  font-size: 11px; font-weight: 600;\n  color: var(--text2); text-transform: uppercase; letter-spacing: .05em;\n}\n.inp {\n  padding: 9px 12px;\n  border: 1.5px solid var(--border);\n  border-radius: var(--radius-sm);\n  font-size: 13px; color: var(--text);\n  background: var(--surface);\n  outline: none; width: 100%;\n  transition: border-color .15s, box-shadow .15s;\n  font-family: inherit;\n}\n.inp:focus { border-color: var(--primary-light); box-shadow: 0 0 0 3px rgba(37,87,167,.1); }\n.inp::placeholder { color: var(--text3); }\nselect.inp { cursor: pointer; }\ntextarea.inp { min-height: 80px; resize: vertical; line-height: 1.5; }<\/p>\n<p>\/* \u2500\u2500 STATS \u2500\u2500 *\/\n.stats-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(110px, 1fr)); gap: 12px; margin-bottom: 16px; }\n.stat-card {\n  background: var(--surface);\n  border: 1px solid var(--border);\n  border-radius: var(--radius);\n  padding: 14px 16px;\n  text-align: center;\n  box-shadow: var(--shadow);\n  transition: transform .2s;\n}\n.stat-card:hover { transform: translateY(-1px); box-shadow: var(--shadow-md); }\n.stat-val { font-size: 20px; font-weight: 700; color: var(--primary); font-family: 'Playfair Display', serif; }\n.stat-lbl { font-size: 11px; color: var(--text3); margin-top: 3px; font-weight: 500; }<\/p>\n<p>\/* \u2500\u2500 BADGES \u2500\u2500 *\/\n.badge {\n  display: inline-flex; align-items: center; gap: 4px;\n  padding: 3px 10px;\n  border-radius: 20px;\n  font-size: 11px; font-weight: 600;\n}\n.badge-blue { background: #dbeafe; color: #1e40af; }\n.badge-green { background: var(--success-light); color: var(--success); }\n.badge-red { background: var(--danger-light); color: var(--danger); }\n.badge-amber { background: var(--warning-light); color: var(--warning); }\n.badge-purple { background: var(--purple-light); color: var(--purple); }\n.badge-teal { background: var(--teal-light); color: var(--teal); }\n.badge-gray { background: #f1f5f9; color: var(--text2); }<\/p>\n<p>\/* \u2500\u2500 INTAKE CHIPS \u2500\u2500 *\/\n.intake-grid { display: flex; flex-wrap: wrap; gap: 6px; }\n.intake-chip {\n  padding: 5px 14px;\n  border-radius: 20px;\n  font-size: 11px; font-weight: 600;\n  border: 1.5px solid var(--border-strong);\n  color: var(--text2);\n  cursor: pointer; background: var(--surface);\n  transition: all .15s; user-select: none;\n}\n.intake-chip:hover { border-color: var(--teal); color: var(--teal); }\n.intake-chip.active {\n  background: var(--teal);\n  border-color: var(--teal);\n  color: #fff;\n}<\/p>\n<p>\/* \u2500\u2500 CHECKLIST \u2500\u2500 *\/\n.check-section { margin-bottom: 20px; }\n.check-section-hdr {\n  display: flex; align-items: center; gap: 8px;\n  padding: 10px 14px;\n  background: var(--surface2);\n  border-radius: var(--radius-sm) var(--radius-sm) 0 0;\n  border: 1px solid var(--border);\n  border-bottom: none;\n}\n.check-section-title { font-size: 13px; font-weight: 700; flex: 1; color: var(--text); }\n.check-section-count { font-size: 11px; color: var(--text3); font-weight: 500; }\n.check-items { border: 1px solid var(--border); border-radius: 0 0 var(--radius-sm) var(--radius-sm); overflow: hidden; }\n.check-item {\n  display: flex; align-items: center; gap: 10px;\n  padding: 10px 14px;\n  border-bottom: 1px solid var(--border);\n  background: var(--surface);\n  transition: background .1s;\n}\n.check-item:last-child { border-bottom: none; }\n.check-item:hover { background: var(--surface2); }\n.check-cb { width: 16px; height: 16px; cursor: pointer; accent-color: var(--primary); flex-shrink: 0; }\n.check-text-input {\n  flex: 1; border: none; background: transparent;\n  font-size: 13px; color: var(--text);\n  outline: none; font-family: inherit;\n}\n.check-item.done .check-text-input { text-decoration: line-through; color: var(--text3); }\n.add-item-row {\n  display: flex; gap: 8px;\n  padding: 8px 14px;\n  background: var(--surface2);\n  border: 1px solid var(--border);\n  border-top: none;\n  border-radius: 0 0 var(--radius-sm) var(--radius-sm);\n}\n.add-item-inp {\n  flex: 1; padding: 6px 10px;\n  border: 1.5px dashed var(--border-strong);\n  border-radius: 6px;\n  font-size: 12px; color: var(--text);\n  background: var(--surface);\n  outline: none; font-family: inherit;\n}\n.add-item-inp:focus { border-color: var(--primary-light); border-style: solid; }<\/p>\n<p>\/* \u2500\u2500 PROGRESS BAR \u2500\u2500 *\/\n.prog-wrap { margin-bottom: 4px; }\n.prog-label { display: flex; justify-content: space-between; font-size: 11px; color: var(--text3); margin-bottom: 5px; }\n.prog-bar {\n  height: 6px; border-radius: 3px;\n  background: var(--border);\n  overflow: hidden;\n}\n.prog-fill {\n  height: 100%; border-radius: 3px;\n  background: linear-gradient(90deg, var(--primary-light), var(--accent));\n  transition: width .4s ease;\n}<\/p>\n<p>\/* \u2500\u2500 PROCESS STAGES \u2500\u2500 *\/\n.stage-card {\n  background: var(--surface);\n  border: 1px solid var(--border);\n  border-radius: var(--radius);\n  margin-bottom: 10px;\n  overflow: hidden;\n  box-shadow: var(--shadow);\n  transition: box-shadow .2s;\n}\n.stage-card:hover { box-shadow: var(--shadow-md); }\n.stage-hdr {\n  display: flex; align-items: center; gap: 12px;\n  padding: 14px 16px;\n  cursor: pointer;\n  user-select: none;\n}\n.stage-num {\n  width: 30px; height: 30px;\n  border-radius: 50%;\n  display: flex; align-items: center; justify-content: center;\n  font-size: 12px; font-weight: 700;\n  flex-shrink: 0;\n}\n.stage-info { flex: 1; min-width: 0; }\n.stage-name { font-size: 13px; font-weight: 700; }\n.stage-meta { font-size: 11px; color: var(--text3); margin-top: 2px; }\n.stage-status-badge { flex-shrink: 0; }\n.stage-chevron { color: var(--text3); font-size: 12px; flex-shrink: 0; transition: transform .2s; }\n.stage-chevron.open { transform: rotate(180deg); }\n.stage-body {\n  padding: 0 16px 16px;\n  border-top: 1px solid var(--border);\n  display: none;\n}\n.stage-body.open { display: block; }<\/p>\n<p>\/* \u2500\u2500 UNIVERSITY CARDS \u2500\u2500 *\/\n.uni-card {\n  background: var(--surface);\n  border: 1px solid var(--border);\n  border-radius: var(--radius);\n  padding: 16px;\n  margin-bottom: 12px;\n  box-shadow: var(--shadow);\n  transition: box-shadow .2s, transform .2s;\n}\n.uni-card:hover { box-shadow: var(--shadow-md); transform: translateY(-1px); }\n.uni-hdr { display: flex; align-items: flex-start; gap: 12px; margin-bottom: 12px; }\n.uni-avatar {\n  width: 42px; height: 42px;\n  border-radius: 10px;\n  background: var(--primary);\n  display: flex; align-items: center; justify-content: center;\n  font-size: 14px; font-weight: 700;\n  color: #fff; flex-shrink: 0;\n  font-family: 'Playfair Display', serif;\n}\n.uni-name { font-size: 14px; font-weight: 700; color: var(--text); }\n.uni-location { font-size: 12px; color: var(--text3); margin-top: 3px; }\n.uni-meta-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); gap: 10px; margin-top: 10px; }\n.uni-meta-item .uni-meta-lbl { font-size: 10px; color: var(--text3); font-weight: 600; text-transform: uppercase; letter-spacing: .05em; margin-bottom: 3px; }\n.uni-meta-item .uni-meta-val { font-size: 12px; font-weight: 600; color: var(--text); }\n.uni-courses-wrap { margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--border); }\n.uni-courses-lbl { font-size: 10px; color: var(--text3); font-weight: 600; text-transform: uppercase; letter-spacing: .05em; margin-bottom: 6px; }\n.course-chip {\n  display: inline-block; padding: 3px 10px;\n  background: var(--accent-light); color: var(--warning);\n  border-radius: 20px; font-size: 11px; font-weight: 600;\n  margin: 2px;\n}\n.uni-notes { margin-top: 10px; padding: 8px 12px; background: var(--surface2); border-radius: 6px; font-size: 12px; color: var(--text2); border-left: 3px solid var(--accent); }<\/p>\n<p>\/* \u2500\u2500 WHY STUDY SECTION \u2500\u2500 *\/\n.why-card {\n  background: linear-gradient(135deg, var(--primary) 0%, var(--primary-light) 100%);\n  border-radius: var(--radius);\n  padding: 24px;\n  color: #fff;\n  margin-bottom: 16px;\n  position: relative;\n  overflow: hidden;\n}\n.why-card::before {\n  content: '';\n  position: absolute; top: -40px; right: -40px;\n  width: 160px; height: 160px;\n  border-radius: 50%;\n  background: rgba(255,255,255,.06);\n}\n.why-card::after {\n  content: '';\n  position: absolute; bottom: -20px; left: -20px;\n  width: 100px; height: 100px;\n  border-radius: 50%;\n  background: rgba(232,160,32,.15);\n}\n.why-title { font-family: 'Playfair Display', serif; font-size: 20px; margin-bottom: 8px; }\n.why-text { font-size: 13px; color: rgba(255,255,255,.85); line-height: 1.7; }<\/p>\n<p>\/* \u2500\u2500 IMAGE UPLOAD \u2500\u2500 *\/\n.image-upload-area {\n  border: 2px dashed var(--border-strong);\n  border-radius: var(--radius-sm);\n  padding: 20px;\n  text-align: center;\n  cursor: pointer;\n  transition: all .2s;\n  background: var(--surface2);\n}\n.image-upload-area:hover { border-color: var(--primary-light); background: #f0f5ff; }\n.image-upload-area.has-image { border-style: solid; border-color: var(--border); padding: 0; overflow: hidden; }\n.upload-img { width: 100%; max-height: 200px; object-fit: cover; border-radius: var(--radius-sm); display: block; }\n.upload-hint { font-size: 12px; color: var(--text3); margin-top: 6px; }<\/p>\n<p>\/* \u2500\u2500 WELCOME SCREEN \u2500\u2500 *\/\n.welcome {\n  display: flex; flex-direction: column;\n  align-items: center; justify-content: center;\n  min-height: calc(100vh - 60px);\n  padding: 40px;\n  text-align: center;\n  background: var(--bg);\n}\n.welcome-emoji { font-size: 64px; margin-bottom: 20px; opacity: .6; }\n.welcome-title { font-family: 'Playfair Display', serif; font-size: 28px; color: var(--primary); margin-bottom: 10px; }\n.welcome-sub { font-size: 14px; color: var(--text3); max-width: 380px; line-height: 1.7; }\n.welcome-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 12px; margin-top: 32px; max-width: 600px; }\n.welcome-feat { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 16px 12px; text-align: center; box-shadow: var(--shadow); }\n.welcome-feat-icon { font-size: 24px; margin-bottom: 8px; }\n.welcome-feat-label { font-size: 11px; font-weight: 700; color: var(--text); }\n.welcome-feat-sub { font-size: 10px; color: var(--text3); margin-top: 3px; }<\/p>\n<p>\/* \u2500\u2500 MODAL \u2500\u2500 *\/\n.modal-overlay {\n  position: fixed; inset: 0;\n  background: rgba(15,23,42,.55);\n  display: flex; align-items: center; justify-content: center;\n  z-index: 1000; padding: 16px;\n  backdrop-filter: blur(4px);\n}\n.modal {\n  background: var(--surface);\n  border-radius: var(--radius);\n  padding: 24px;\n  width: 100%; max-width: 560px;\n  max-height: 90vh; overflow-y: auto;\n  box-shadow: 0 20px 60px rgba(0,0,0,.2);\n  animation: modalIn .2s ease;\n}\n@keyframes modalIn { from { opacity: 0; transform: scale(.95) translateY(10px); } to { opacity: 1; transform: none; } }\n.modal-header { display: flex; align-items: center; gap: 10px; margin-bottom: 20px; }\n.modal-title { font-size: 16px; font-weight: 700; flex: 1; }\n.modal-close { background: none; border: none; font-size: 18px; cursor: pointer; color: var(--text3); padding: 4px 8px; border-radius: 6px; }\n.modal-close:hover { background: var(--bg); color: var(--text); }\n.modal-footer { display: flex; gap: 8px; justify-content: flex-end; margin-top: 20px; padding-top: 16px; border-top: 1px solid var(--border); }<\/p>\n<p>\/* \u2500\u2500 EMPTY STATE \u2500\u2500 *\/\n.empty-state {\n  text-align: center; padding: 40px 20px;\n  color: var(--text3);\n}\n.empty-icon { font-size: 40px; margin-bottom: 12px; opacity: .5; }\n.empty-title { font-size: 14px; font-weight: 700; color: var(--text2); margin-bottom: 6px; }\n.empty-sub { font-size: 12px; line-height: 1.6; }<\/p>\n<p>\/* \u2500\u2500 MOBILE MENU TOGGLE \u2500\u2500 *\/\n.mob-menu-btn {\n  display: none;\n  background: none; border: none;\n  font-size: 22px; cursor: pointer;\n  padding: 4px 8px; color: var(--text);\n}\n.sidebar-overlay { display: none; position: fixed; inset: 0; background: rgba(0,0,0,.4); z-index: 99; }<\/p>\n<p>\/* \u2500\u2500 TOAST \u2500\u2500 *\/\n.toast {\n  position: fixed; bottom: 24px; right: 24px;\n  background: var(--text); color: #fff;\n  padding: 10px 18px;\n  border-radius: 10px;\n  font-size: 13px; font-weight: 500;\n  z-index: 9999;\n  box-shadow: var(--shadow-md);\n  animation: toastIn .25s ease;\n}\n.toast.success { background: var(--success); }\n.toast.error { background: var(--danger); }\n@keyframes toastIn { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: none; } }<\/p>\n<p>\/* \u2500\u2500 DIVIDER \u2500\u2500 *\/\n.divider { height: 1px; background: var(--border); margin: 16px 0; }<\/p>\n<p>\/* \u2500\u2500 RESPONSIVE \u2500\u2500 *\/\n@media (max-width: 768px) {\n  .sidebar { transform: translateX(-100%); }\n  .sidebar.open { transform: translateX(0); }\n  .sidebar-overlay.open { display: block; }\n  .main { margin-left: 0; }\n  .mob-menu-btn { display: block; }\n  .topbar { padding: 0 14px; }\n  .tab-bar { display: grid; grid-template-columns: repeat(3, 1fr); gap: 2px; }\n  .tab.active::after { display: none; }\n  .content { padding: 14px; }\n  .form-grid { grid-template-columns: 1fr; }\n  .form-row { grid-template-columns: 1fr; }\n  .stats-row { grid-template-columns: repeat(2, 1fr); }\n  .uni-meta-grid { grid-template-columns: 1fr 1fr; }\n}\n@media (max-width: 480px) {\n  .tab-bar { grid-template-columns: repeat(2, 1fr); }\n  .stats-row { grid-template-columns: 1fr 1fr; }\n  .topbar-info .title { font-size: 13px; }\n}<\/p>\n<p>\/* \u2500\u2500 SECTION-SPECIFIC \u2500\u2500 *\/\n.req-summary-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 12px; }\n.req-summary-item { background: var(--surface2); border-radius: var(--radius-sm); padding: 12px 14px; }\n.req-summary-lbl { font-size: 10px; font-weight: 600; color: var(--text3); text-transform: uppercase; letter-spacing: .05em; margin-bottom: 5px; }\n.req-summary-val { font-size: 13px; font-weight: 600; color: var(--text); }<\/p>\n<p>.info-banner {\n  background: #eff6ff; border: 1px solid #bfdbfe;\n  border-radius: var(--radius-sm); padding: 12px 14px;\n  font-size: 12px; color: #1e40af; margin-bottom: 16px;\n  display: flex; gap: 8px; align-items: flex-start;\n}\n<\/style>\n<p><\/head><br \/>\n<body><\/p>\n<div class=\"app\">\n  <!-- SIDEBAR --><\/p>\n<aside class=\"sidebar\" id=\"sidebar\">\n<div class=\"sidebar-brand\">\n<div class=\"brand-logo\">\ud83d\udd4a\ufe0f<\/div>\n<div class=\"brand-text\">\n<div class=\"name\">White Pigeon<\/div>\n<div class=\"sub\">Country Management<\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"sb-search-wrap\">\n      <input class=\"sb-search\" type=\"text\" placeholder=\"\ud83d\udd0d  Search countries...\" id=\"sb-search\" oninput=\"filterSB()\">\n    <\/div>\n<div class=\"sb-section-label\">Destinations<\/div>\n<div class=\"country-list\" id=\"country-list\"><\/div>\n<p>    <button class=\"sb-add-btn\" onclick=\"openAddCountryModal()\">\uff0b Add New Country<\/button><br \/>\n  <\/aside>\n<div class=\"sidebar-overlay\" id=\"sb-overlay\" onclick=\"closeSidebar()\"><\/div>\n<p>  <!-- MAIN --><br \/>\n  <main class=\"main\"><br \/>\n    <!-- TOPBAR --><\/p>\n<div class=\"topbar\" id=\"topbar\" style=\"display:none\">\n      <button class=\"mob-menu-btn\" onclick=\"openSidebar()\">\u2630<\/button><\/p>\n<div class=\"topbar-left\">\n<div class=\"topbar-flag\" id=\"tp-flag\"><\/div>\n<div class=\"topbar-info\">\n<div class=\"title\" id=\"tp-title\"><\/div>\n<div class=\"sub\" id=\"tp-sub\"><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"tab-bar\" id=\"tab-bar\">\n        <button class=\"tab active\" data-tab=\"overview\" onclick=\"setTab('overview',this)\">\ud83c\udf0d Overview<\/button><br \/>\n        <button class=\"tab\" data-tab=\"requirements\" onclick=\"setTab('requirements',this)\">\ud83d\udccb Requirements<\/button><br \/>\n        <button class=\"tab\" data-tab=\"universities\" onclick=\"setTab('universities',this)\">\ud83c\udfdb\ufe0f Universities<\/button><br \/>\n        <button class=\"tab\" data-tab=\"checklist\" onclick=\"setTab('checklist',this)\">\u2705 Checklist<\/button><br \/>\n        <button class=\"tab\" data-tab=\"process\" onclick=\"setTab('process',this)\">\ud83d\uddc2\ufe0f Visa Process<\/button>\n      <\/div>\n<div class=\"topbar-actions\">\n        <button class=\"btn btn-sm\" onclick=\"exportCSV()\" title=\"Export data to CSV\">\u2b07 Export<\/button>\n      <\/div>\n<\/p><\/div>\n<p>    <!-- WELCOME \/ CONTENT --><\/p>\n<div id=\"welcome-screen\">\n<div class=\"welcome\">\n<div class=\"welcome-emoji\">\ud83c\udf0d<\/div>\n<div class=\"welcome-title\">Country Management System<\/div>\n<div class=\"welcome-sub\">Select a country from the sidebar to view and manage documentation, visa processes, university listings, and more.<\/div>\n<div class=\"welcome-cards\">\n<div class=\"welcome-feat\">\n<div class=\"welcome-feat-icon\">\ud83d\udccb<\/div>\n<div class=\"welcome-feat-label\">Document Checklists<\/div>\n<div class=\"welcome-feat-sub\">Track all required documents<\/div>\n<\/div>\n<div class=\"welcome-feat\">\n<div class=\"welcome-feat-icon\">\ud83d\uddc2\ufe0f<\/div>\n<div class=\"welcome-feat-label\">Visa Process<\/div>\n<div class=\"welcome-feat-sub\">Stage-by-stage tracking<\/div>\n<\/div>\n<div class=\"welcome-feat\">\n<div class=\"welcome-feat-icon\">\ud83c\udfdb\ufe0f<\/div>\n<div class=\"welcome-feat-label\">Universities<\/div>\n<div class=\"welcome-feat-sub\">Fees, courses &#038; details<\/div>\n<\/div>\n<div class=\"welcome-feat\">\n<div class=\"welcome-feat-icon\">\u2b07<\/div>\n<div class=\"welcome-feat-label\">Export to Sheet<\/div>\n<div class=\"welcome-feat-sub\">Download CSV anytime<\/div>\n<\/div><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"content\" id=\"tab-content\" style=\"display:none\"><\/div>\n<p>  <\/main>\n<\/div>\n<p><!-- MODAL CONTAINER --><\/p>\n<div id=\"modal-container\"><\/div>\n<p><script>\n\/\/ \u2500\u2500\u2500 STATE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst COUNTRIES_DEFAULT = [\n  {id:'uk',name:'United Kingdom',flag:'\ud83c\uddec\ud83c\udde7'},{id:'spain',name:'Spain',flag:'\ud83c\uddea\ud83c\uddf8'},\n  {id:'netherlands',name:'Netherlands',flag:'\ud83c\uddf3\ud83c\uddf1'},{id:'italy',name:'Italy',flag:'\ud83c\uddee\ud83c\uddf9'},\n  {id:'georgia',name:'Georgia',flag:'\ud83c\uddec\ud83c\uddea'},{id:'france',name:'France',flag:'\ud83c\uddeb\ud83c\uddf7'},\n  {id:'germany',name:'Germany',flag:'\ud83c\udde9\ud83c\uddea'},{id:'lithuania',name:'Lithuania',flag:'\ud83c\uddf1\ud83c\uddf9'},\n  {id:'australia',name:'Australia',flag:'\ud83c\udde6\ud83c\uddfa'},{id:'canada',name:'Canada',flag:'\ud83c\udde8\ud83c\udde6'},\n  {id:'ireland',name:'Ireland',flag:'\ud83c\uddee\ud83c\uddea'},{id:'newzealand',name:'New Zealand',flag:'\ud83c\uddf3\ud83c\uddff'},\n  {id:'finland',name:'Finland',flag:'\ud83c\uddeb\ud83c\uddee'},{id:'hungary',name:'Hungary',flag:'\ud83c\udded\ud83c\uddfa'},\n  {id:'malta',name:'Malta',flag:'\ud83c\uddf2\ud83c\uddf9'}\n];\nconst INTAKE_OPTIONS = ['Jan\u2013Feb','Mar\u2013Apr','May\u2013Jun','Jul\u2013Aug','Sep\u2013Oct','Nov\u2013Dec'];\nconst STAGE_COLORS = [\n  {bg:'#dbeafe',text:'#1e40af',dot:'#3b82f6'},\n  {bg:'#ede9fe',text:'#6d28d9',dot:'#8b5cf6'},\n  {bg:'#dcfce7',text:'#15803d',dot:'#22c55e'},\n  {bg:'#fef3c7',text:'#92400e',dot:'#f59e0b'},\n  {bg:'#fee2e2',text:'#991b1b',dot:'#ef4444'},\n  {bg:'#ccfbf1',text:'#134e4a',dot:'#14b8a6'},\n  {bg:'#fce7f3',text:'#9d174d',dot:'#ec4899'},\n];<\/p>\n<p>let ST = { countries: [], data: {}, sel: null, tab: 'overview' };<\/p>\n<p>\/\/ \u2500\u2500\u2500 STORAGE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction saveToStorage() {\n  try {\n    localStorage.setItem('wp_cms_countries', JSON.stringify(ST.countries));\n    localStorage.setItem('wp_cms_data', JSON.stringify(ST.data));\n  } catch(e) { showToast('Storage error: ' + e.message, 'error'); }\n}<\/p>\n<p>function loadFromStorage() {\n  try {\n    const c = localStorage.getItem('wp_cms_countries');\n    const d = localStorage.getItem('wp_cms_data');\n    ST.countries = c ? JSON.parse(c) : COUNTRIES_DEFAULT.map(x => ({...x}));\n    ST.data = d ? JSON.parse(d) : {};\n  } catch(e) {\n    ST.countries = COUNTRIES_DEFAULT.map(x => ({...x}));\n    ST.data = {};\n  }\n}<\/p>\n<p>\/\/ \u2500\u2500\u2500 DEFAULT COUNTRY DATA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction getCountryData(id) {\n  if (!ST.data[id]) {\n    ST.data[id] = {\n      overview: { capital:'', language:'', currency:'', population:'', tuitionRange:'', whyStudy:'', intakes:[], coverImage:'' },\n      requirements: { moiAccepted:'', ielts:'', pte:'', ugMin:'', pgMin:'', gapAccepted:'yes', gapYears:'', notes:'' },\n      universities: [],\n      checklist: { personal:[], academic:[], financial:[], visa:[] },\n      process: []\n    };\n  }\n  return ST.data[id];\n}<\/p>\n<p>\/\/ \u2500\u2500\u2500 PREFILL DATA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction prefillAll() {\n  prefillSpain(); prefillNetherlands(); prefillGeorgia(); prefillGermany();\n}<\/p>\n<p>function prefillSpain() {\n  if (ST.data['spain']?.overview?.capital) return;\n  const d = getCountryData('spain');\n  d.overview = { capital:'Madrid', language:'Spanish', currency:'EUR (\u20ac)', population:'47 million', tuitionRange:'\u20ac5,000 \u2013 \u20ac12,000 \/ year', whyStudy:'Spain offers an unbeatable combination of world-class education, rich cultural heritage, and an exceptional quality of life. With affordable tuition fees, a warm Mediterranean climate, and universities ranked among Europe\\'s finest, Spain is a top destination for international students seeking both academic excellence and life-changing experiences.', intakes:['Sep\u2013Oct','Jan\u2013Feb','Mar\u2013Apr'], coverImage:'' };\n  d.requirements = { moiAccepted:'conditional', ielts:'6.0 overall (no band < 5.5)', pte:'50 overall', ugMin:'50% \/ 2.8 GPA', pgMin:'55% \/ 3.0 GPA', gapAccepted:'yes', gapYears:'5 years', notes:'Some universities may accept MOI letters from previous institutions in lieu of IELTS\/PTE. Spanish language courses may be required for some programs.' };\n  d.universities = [\n    { name:'Universidad Complutense de Madrid', location:'Madrid', duration:\"Bachelor's 4 yrs \/ Master's 2 yrs\", fees:'\u20ac6,500\/year', type:\"Both\", courses:'Business Administration, Law, Medicine, Engineering, Arts, Humanities, Social Sciences', notes:'One of Europe\\'s largest and most prestigious universities with over 800 years of history.' },\n    { name:'University of Barcelona', location:'Barcelona', duration:\"Bachelor's 4 yrs \/ Master's 1\u20132 yrs\", fees:'\u20ac5,800\/year', type:\"Both\", courses:'Economics, Social Sciences, Chemistry, Biology, Philosophy, Fine Arts', notes:'Top research university. Located in one of Europe\\'s most vibrant cities.' }\n  ];\n  d.checklist = {\n    personal:[{text:'Valid passport (6+ months validity)',checked:false},{text:'2 recent passport-size photos',checked:false},{text:'Birth certificate (attested &#038; notarized)',checked:false},{text:'Police clearance certificate',checked:false},{text:'Medical fitness certificate',checked:false}],\n    academic:[{text:'SLC\/SEE mark sheets &#038; certificates',checked:false},{text:'+2\/A-Level transcripts &#038; certificates',checked:false},{text:'Bachelor degree &#038; transcripts (if PG)',checked:false},{text:'IELTS\/PTE score report',checked:false},{text:'MOI letter from previous institution (if applicable)',checked:false},{text:'Statement of Purpose (SOP)',checked:false}],\n    financial:[{text:'Bank statement (last 6 months)',checked:false},{text:'Bank balance certificate (min NPR 10 lakhs)',checked:false},{text:'Sponsorship letter from guardian',checked:false},{text:'Tax clearance certificate of sponsor',checked:false},{text:'Income proof \/ salary certificate of sponsor',checked:false}],\n    visa:[{text:'Completed visa application form (Schengen D)',checked:false},{text:'University offer \/ admission letter',checked:false},{text:'Proof of tuition fee payment',checked:false},{text:'Accommodation confirmation letter',checked:false},{text:'Travel health insurance (min \u20ac30,000 coverage)',checked:false},{text:'VFS appointment confirmation',checked:false},{text:'Flight itinerary',checked:false}]\n  };\n  d.process = [\n    { name:'Initial Consultation', desc:'First meeting with student to assess profile, choose universities and suitable courses.', status:'pending', checklist:[{text:'Profile assessment completed',checked:false},{text:'University shortlist prepared',checked:false},{text:'Course selection finalized',checked:false}], created:'16\/04\/2026' },\n    { name:'Application Submission', desc:'Prepare and submit university applications with all required academic documents.', status:'pending', checklist:[{text:'Application form filled',checked:false},{text:'Academic documents compiled',checked:false},{text:'Application submitted to university',checked:false},{text:'Application fee paid',checked:false}], created:'16\/04\/2026' },\n    { name:'Offer Letter Received', desc:'University reviews application and issues conditional or unconditional offer letter.', status:'pending', checklist:[{text:'Offer letter received from university',checked:false},{text:'Offer letter terms reviewed',checked:false},{text:'Student accepts offer',checked:false}], created:'16\/04\/2026' },\n    { name:'Visa File Preparation', desc:'Prepare complete visa documentation file with all required supporting documents.', status:'pending', checklist:[{text:'All documents verified and certified',checked:false},{text:'Bank statement arranged',checked:false},{text:'Health insurance arranged',checked:false},{text:'Visa application form filled',checked:false},{text:'Accommodation proof arranged',checked:false}], created:'16\/04\/2026' },\n    { name:'Visa Application Submitted', desc:'Submit complete visa application at VFS or Spanish Embassy.', status:'pending', checklist:[{text:'VFS appointment booked',checked:false},{text:'Biometrics submitted',checked:false},{text:'All documents submitted',checked:false},{text:'Visa fee paid',checked:false}], created:'16\/04\/2026' },\n    { name:'Visa Outcome', desc:'Final visa decision received from the Spanish Embassy.', status:'pending', checklist:[{text:'Visa decision received',checked:false},{text:'Student notified of outcome',checked:false},{text:'Pre-departure briefing done (if approved)',checked:false}], created:'16\/04\/2026' }\n  ];\n  ST.data['spain'] = d;\n}\n\nfunction prefillNetherlands() {\n  if (ST.data['netherlands']?.overview?.capital) return;\n  const d = getCountryData('netherlands');\n  d.overview = { capital:'Amsterdam', language:'Dutch (English widely spoken)', currency:'EUR (\u20ac)', population:'17.9 million', tuitionRange:'\u20ac8,000 \u2013 \u20ac20,000 \/ year', whyStudy:'The Netherlands is renowned for its world-class universities, innovative and practical teaching methods, and an excellent quality of life. With a diverse range of English-taught programs, a multicultural environment, and strong industry connections, the Netherlands offers outstanding career prospects and a truly international student experience.', intakes:['Sep\u2013Oct','Feb\u2013Mar'], coverImage:'' };\n  d.requirements = { moiAccepted:'no', ielts:'6.0\u20136.5 (no band < 5.5)', pte:'55 overall', ugMin:'2.6 GPA \/ 50%', pgMin:'50%+', gapAccepted:'yes', gapYears:'3 yrs UG \/ 5 yrs PG', notes:'IELTS 6.5 (no band < 6.0) required for some courses. Interview is required after receiving conditional offer letter. NOC must be applied within 14 days of offer.' };\n  d.universities = [\n    { name:'University of Europe for Applied Sciences', location:'Amsterdam', duration:\"Bachelor's 3 yrs \/ Master's 1.5 yrs\", fees:'\u20ac9,800\/year', type:'Both', courses:'Business Administration, Marketing, Communications, Hospitality Management, International Management, Data Science', notes:'Direct partner university. Strong industry placements.' },\n    { name:'Wittenborg University of Applied Sciences', location:'Amsterdam \/ Apeldoorn', duration:\"Bachelor's 3\u20134 yrs \/ Master's 1.5 yrs\", fees:'\u20ac8,500\/year', type:'Both', courses:'Business, Hotel Management, Hospitality, International Business, Education', notes:'Very student-friendly. Multiple intakes available.' },\n    { name:'Webster University Leiden', location:'Leiden', duration:\"Bachelor's 4 yrs\", fees:'\u20ac16,500\/year', type:\"Bachelor's\", courses:'International Relations, Business Administration, Psychology, Media Communications', notes:'American-style education. Small class sizes.' }\n  ];\n  d.checklist = {\n    personal:[{text:'Valid passport',checked:false},{text:'Passport-size photo (digital)',checked:false},{text:'Signature on white paper or digital signature',checked:false}],\n    academic:[{text:'All academic mark sheets &#038; certificates',checked:false},{text:'LOR (Letter of Recommendation)',checked:false},{text:'Updated CV \/ Resume',checked:false},{text:'IELTS\/PTE score report',checked:false},{text:'University application form',checked:false},{text:'Statement of Purpose (SOP)',checked:false}],\n    financial:[{text:'EUR 13,500 block amount OR 1 month bank statement',checked:false},{text:'Bank account must be minimum 6 months old',checked:false},{text:'EUR 500 visa processing fee',checked:false},{text:'Tuition fee deposit confirmation',checked:false}],\n    visa:[{text:'Conditional offer letter',checked:false},{text:'Unconditional offer letter (post-interview)',checked:false},{text:'NOC (No Objection Certificate)',checked:false},{text:'MVV \/ E-Visa approval from IND',checked:false},{text:'Residence permit application',checked:false}]\n  };\n  d.process = [\n    { name:'Application &#038; Contract Signing', desc:'Submit complete application. Student signs study contract. University issues conditional offer letter.', status:'pending', checklist:[{text:'Application submitted with all documents',checked:false},{text:'Study contract signed by student',checked:false},{text:'Conditional offer letter received',checked:false}], created:'16\/04\/2026' },\n    { name:'Interview Preparation &#038; Clearance', desc:'Consultancy provides interview preparation. Student attends and passes the interview.', status:'pending', checklist:[{text:'Interview preparation session done',checked:false},{text:'Student attended interview',checked:false},{text:'Interview cleared successfully',checked:false}], created:'16\/04\/2026' },\n    { name:'Unconditional Offer &#038; NOC', desc:'University issues unconditional offer. NOC applied. Initial fee paid within 14 days.', status:'pending', checklist:[{text:'Unconditional offer letter received',checked:false},{text:'NOC applied',checked:false},{text:'Initial tuition fee paid within 14 days',checked:false},{text:'EUR 500 visa processing fee paid',checked:false}], created:'16\/04\/2026' },\n    { name:'Financial Requirements', desc:'Student must fulfill financial requirements via block amount or bank statement.', status:'pending', checklist:[{text:'EUR 13,500 block amount transferred to university OR bank statement submitted',checked:false},{text:'Tuition fee deposited as per university instruction',checked:false}], created:'16\/04\/2026' },\n    { name:'Visa Application &#038; Approval', desc:'University submits visa application to IND (Dutch Immigration) on behalf of student.', status:'pending', checklist:[{text:'Visa application submitted by university to IND',checked:false},{text:'MVV \/ E-Visa approval received',checked:false}], created:'16\/04\/2026' },\n    { name:'Embassy Appointment &#038; Biometrics', desc:'Book New Delhi embassy appointment, submit biometrics, and collect passport.', status:'pending', checklist:[{text:'New Delhi embassy appointment booked',checked:false},{text:'Biometrics submitted at appointment',checked:false},{text:'Passport with MVV visa collected (Kathmandu)',checked:false}], created:'16\/04\/2026' },\n    { name:'Pre-Departure &#038; Departure', desc:'Final arrangements before flying to the Netherlands.', status:'pending', checklist:[{text:'Birth certificate attested from MOFA',checked:false},{text:'Air ticket booked',checked:false},{text:'Accommodation arranged',checked:false},{text:'Health insurance purchased',checked:false},{text:'Residence permit card applied',checked:false},{text:'Student departs to Netherlands',checked:false}], created:'16\/04\/2026' }\n  ];\n  ST.data['netherlands'] = d;\n}\n\nfunction prefillGeorgia() {\n  if (ST.data['georgia']?.overview?.capital) return;\n  const d = getCountryData('georgia');\n  d.overview = { capital:'Tbilisi', language:'Georgian (English instruction available)', currency:'GEL (Georgian Lari)', population:'3.7 million', tuitionRange:'USD 3,500 \u2013 USD 6,500 \/ year', whyStudy:'Georgia is an emerging European education hub offering affordable, internationally recognized degrees taught entirely in English \u2014 with no IELTS or PTE required. Located at the crossroads of Europe and Asia, Georgia combines modern academic facilities with flexible work rights and multiple intake periods every two months, making it ideal for Nepali students seeking quick, accessible pathways to global education.', intakes:['Jan\u2013Feb','Mar\u2013Apr','May\u2013Jun','Jul\u2013Aug','Sep\u2013Oct','Nov\u2013Dec'], coverImage:'' };\n  d.requirements = { moiAccepted:'yes', ielts:'Not required', pte:'Not required', ugMin:'40%', pgMin:'40%', gapAccepted:'yes', gapYears:'10 years', notes:'No IELTS or PTE required. Age limit up to 35 years accepted. Multiple intakes available every 2 months. Part-time work allowed up to 20 hours per week.' };\n  d.universities = [\n    { name:'University of Georgia (UG)', location:'Tbilisi', duration:'3\u20136 years (depending on program)', fees:'USD 4,000 \u2013 6,500\/year', type:'Both + Medical', courses:'Medicine (MD), Dentistry, Business Administration, IT, Civil Engineering, Computer Engineering, Communication Engineering, Nursing, Pharmacy, Philosophy', notes:'Primary recruitment partner. Multiple intakes every 2 months.' },\n    { name:'Tbilisi State Medical University (TSMU)', location:'Tbilisi', duration:'6 years (MD), 5 years (Dentistry)', fees:'USD 6,000 \u2013 6,500\/year', type:'Medical', courses:'Medicine (MD), Dentistry', notes:'Highly reputed medical university. CEE required to practice in Nepal.' },\n    { name:'Georgian National University (SEU)', location:'Tbilisi', duration:'3\u20134 years', fees:'USD 3,500\/year', type:\"Bachelor's\", courses:'Business, IT, Law, Social Sciences, Tourism', notes:'Affordable option with English-track programs.' },\n    { name:'Caucasus University', location:'Tbilisi', duration:'3\u20134 years', fees:'USD 4,000\/year', type:'Both', courses:'Business Administration, IT, Law, Media, Architecture', notes:'Modern campus facilities.' }\n  ];\n  d.checklist = {\n    personal:[{text:'Valid passport',checked:false},{text:'Passport-size photo',checked:false},{text:'Police clearance report',checked:false},{text:'Self-introduction video recording',checked:false}],\n    academic:[{text:'Academic certificates &#038; transcripts',checked:false},{text:'Documents verified by NEB \/ HSEB \/ MOFA',checked:false},{text:'Simple CV',checked:false}],\n    financial:[{text:'Bank statement (last 3\u20136 months)',checked:false},{text:'Bank balance certificate (minimum NPR 12 lakhs)',checked:false},{text:'Ward relationship &#038; sponsorship proof document',checked:false}],\n    visa:[{text:'Accommodation letter from university',checked:false},{text:'Invitation letter (EQE)',checked:false},{text:'Medical insurance certificate',checked:false},{text:'VFS appointment booking confirmation',checked:false},{text:'Visa application form submitted via VFS Nepal',checked:false}]\n  };\n  d.process = [\n    { name:'Offer Letter Issued', desc:'University reviews submitted documents and issues offer letter.', status:'pending', checklist:[{text:'Academic documents submitted to university',checked:false},{text:'Offer letter received',checked:false},{text:'Course and university confirmed by student',checked:false}], created:'16\/04\/2026' },\n    { name:'Fee Payment', desc:'Student pays tuition and application fee (USD 170 application fee).', status:'pending', checklist:[{text:'Application fee paid (USD 170)',checked:false},{text:'Initial tuition fee paid',checked:false},{text:'Payment receipts obtained',checked:false}], created:'16\/04\/2026' },\n    { name:'Invitation Letter (EQE)', desc:'University prepares documents and EQE invitation letter is issued (approx. 30 days).', status:'pending', checklist:[{text:'Documents sent to university for EQE processing',checked:false},{text:'EQE invitation letter received (approx. 30 days)',checked:false}], created:'16\/04\/2026' },\n    { name:'Visa Application via VFS', desc:'All visa documents prepared by consultancy and submitted through VFS Nepal.', status:'pending', checklist:[{text:'All visa documents prepared by consultancy',checked:false},{text:'VFS appointment booked',checked:false},{text:'Visa application submitted at VFS Nepal',checked:false}], created:'16\/04\/2026' },\n    { name:'Visa Approval &#038; Departure', desc:'Visa approved by Georgian Embassy. Remaining fees paid and student departs.', status:'pending', checklist:[{text:'Visa approved',checked:false},{text:'Student notified of visa approval',checked:false},{text:'Remaining tuition &#038; agency fees paid',checked:false},{text:'Air ticket booked',checked:false},{text:'Student departs to Georgia',checked:false}], created:'16\/04\/2026' }\n  ];\n  ST.data['georgia'] = d;\n}\n\nfunction prefillGermany() {\n  if (ST.data['germany']?.overview?.capital) return;\n  const d = getCountryData('germany');\n  d.overview = { capital:'Berlin', language:'German (English-taught programs available)', currency:'EUR (\u20ac)', population:'84 million', tuitionRange:'\u20ac8,000 \u2013 \u20ac15,000 \/ year', whyStudy:'Germany is one of the world\\'s leading study destinations, offering access to top universities, Fortune 500 employers like BMW, Siemens, and Volkswagen, and an 18-month post-study work visa. With 25+ partner universities, affordable tuition, and the right to work 120 full days per year at \u20ac12.82\/hour minimum wage, Germany provides an unmatched return on educational investment.', intakes:['Sep\u2013Oct','Mar\u2013Apr'], coverImage:'' };\n  d.requirements = { moiAccepted:'no', ielts:\"6.0 UG (no band < 5.5) \/ 6.5 PG (no band < 6.0)\", pte:'Not specified', ugMin:'2.8 GPA (SEE + SLC required)', pgMin:'2.8 GPA in relevant field', gapAccepted:'yes', gapYears:'Not specified', notes:'Some programs require 13 years of total education. Work experience may be required for PG programs. Rolling intakes available at select partner universities. No fixed application deadline.' };\n  d.universities = [\n    { name:'SRH University Berlin', location:'Berlin', duration:\"Bachelor's 3 yrs \/ Master's 1.5 yrs\", fees:'\u20ac9,800\/year', type:'Both', courses:'Business Management, Engineering, Health Sciences, Media &#038; Communication, Psychology', notes:'Strong industry partnerships in Berlin.' },\n    { name:'IU International University', location:'Berlin \/ Multiple cities', duration:\"Bachelor's 3 yrs \/ Master's 1.5 yrs\", fees:'\u20ac8,280\/year', type:'Both', courses:'Business, IT, Marketing, Tourism Management, Logistics, Psychology, Engineering', notes:'Largest private university in Germany. Online + on-campus options.' },\n    { name:'Munich Business School', location:'Munich', duration:\"Bachelor's 3.5 yrs \/ Master's 1.5 yrs\", fees:'\u20ac15,000\/year', type:'Both', courses:'International Business, Finance, Entrepreneurship, Innovation Management', notes:'Premium business school in Bavaria.' },\n    { name:'Constructor University', location:'Hamburg', duration:\"Bachelor's 3 yrs \/ Master's 2 yrs\", fees:'\u20ac12,000\/year', type:'Both', courses:'Computer Science, Business Administration, Life Sciences, Physics, Mathematics', notes:'100% English. International campus environment.' },\n    { name:'GISMA University of Applied Sciences', location:'Berlin \/ Potsdam', duration:\"Bachelor's 3 yrs \/ Master's 1 yr\", fees:'\u20ac8,500\/year', type:'Both', courses:'Business, Data Science, Finance, Project Management, Digital Marketing', notes:'Fast-track programs available.' }\n  ];\n  d.checklist = {\n    personal:[{text:'Valid passport (12+ months validity)',checked:false},{text:'Recent passport-size photo',checked:false}],\n    academic:[{text:'Academic mark sheets &#038; certificates (SEE + SLC)',checked:false},{text:'IELTS \/ TOEFL score report',checked:false},{text:'Statement of Purpose (SOP)',checked:false},{text:'University acceptance \/ visa letter',checked:false},{text:'CV \/ Resume',checked:false}],\n    financial:[{text:'Blocked account confirmation \u2013 approx. \u20ac12,005 (Fintiba \/ Coracle \/ Expatrio)',checked:false},{text:'Health insurance certificate (complimentary with blocked account)',checked:false}],\n    visa:[{text:'Registered on Germany Consular Portal (digital.diplo.de\/studium)',checked:false},{text:'Entry Form + VIDEX visa application filled online',checked:false},{text:'All documents uploaded to portal',checked:false},{text:'VFS appointment scheduled',checked:false},{text:'Visa fee paid (\u20ac75)',checked:false},{text:'Biometrics submitted at VFS Visa Centre',checked:false}]\n  };\n  d.process = [\n    { name:'Consular Portal Registration', desc:'Register at digital.diplo.de\/studium. Portal verification alone takes 1\u20132 weeks \u2014 apply early!', status:'pending', checklist:[{text:'Account created on Germany Consular Portal',checked:false},{text:'Email verified (takes 1\u20132 weeks)',checked:false}], created:'16\/04\/2026' },\n    { name:'VIDEX Application', desc:'Fill the Entry Form and complete the VIDEX (German visa application) form online.', status:'pending', checklist:[{text:'Entry form filled completely',checked:false},{text:'VIDEX visa application completed',checked:false}], created:'16\/04\/2026' },\n    { name:'Document Upload', desc:'Upload all required documents per the checklist on the consular portal.', status:'pending', checklist:[{text:'Passport uploaded',checked:false},{text:'Academic documents uploaded',checked:false},{text:'IELTS \/ TOEFL uploaded',checked:false},{text:'SOP uploaded',checked:false},{text:'Blocked account confirmation uploaded',checked:false},{text:'Health insurance uploaded',checked:false}], created:'16\/04\/2026' },\n    { name:'VFS Appointment &#038; Biometrics', desc:'Schedule VFS appointment, pay visa fee (\u20ac75), and submit biometrics at the Visa Centre.', status:'pending', checklist:[{text:'VFS appointment scheduled',checked:false},{text:'Visa fee paid (\u20ac75)',checked:false},{text:'Biometrics submitted at Visa Centre',checked:false}], created:'16\/04\/2026' },\n    { name:'Visa Decision', desc:'Visa decision is typically received within 4\u20138 weeks.', status:'pending', checklist:[{text:'Visa decision received',checked:false},{text:'Student notified of outcome',checked:false},{text:'Pre-departure briefing completed',checked:false}], created:'16\/04\/2026' }\n  ];\n  ST.data['germany'] = d;\n}\n\n\/\/ \u2500\u2500\u2500 SIDEBAR \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction renderSidebar(filter = '') {\n  const fl = filter.toLowerCase();\n  const list = document.getElementById('country-list');\n  const filtered = ST.countries.filter(c => c.name.toLowerCase().includes(fl));\n  if (filtered.length === 0) {\n    list.innerHTML = '<\/p>\n<div style=\"text-align:center;padding:20px;color:rgba(255,255,255,.4);font-size:12px;\">No countries found<\/div>\n<p>';\n    return;\n  }\n  list.innerHTML = filtered.map(c => {\n    const d = ST.data[c.id];\n    const unis = d?.universities?.length || 0;\n    const isActive = ST.sel === c.id;\n    return `<\/p>\n<div class=\"ci${isActive ? ' active' : ''}\" onclick=\"selectCountry('${c.id}')\">\n<div class=\"ci-flag\">${c.flag || '\ud83c\udf0d'}<\/div>\n<div class=\"ci-name\">${esc(c.name)}<\/div>\n<p>      ${unis ? `<\/p>\n<div class=\"ci-badge\">${unis}<\/div>\n<p>` : ''}\n    <\/p><\/div>\n<p>`;\n  }).join('');\n}\nfunction filterSB() { renderSidebar(document.getElementById('sb-search').value); }\nfunction openSidebar() {\n  document.getElementById('sidebar').classList.add('open');\n  document.getElementById('sb-overlay').classList.add('open');\n}\nfunction closeSidebar() {\n  document.getElementById('sidebar').classList.remove('open');\n  document.getElementById('sb-overlay').classList.remove('open');\n}<\/p>\n<p>\/\/ \u2500\u2500\u2500 COUNTRY SELECT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction selectCountry(id) {\n  ST.sel = id;\n  ST.tab = 'overview';\n  closeSidebar();\n  renderSidebar(document.getElementById('sb-search').value);\n  const c = ST.countries.find(x => x.id === id);\n  const d = getCountryData(id);\n  document.getElementById('topbar').style.display = 'flex';\n  document.getElementById('welcome-screen').style.display = 'none';\n  document.getElementById('tab-content').style.display = 'block';\n  document.getElementById('tp-flag').textContent = c.flag || '\ud83c\udf0d';\n  document.getElementById('tp-title').textContent = c.name;\n  document.getElementById('tp-sub').textContent = d.overview.capital ? `Capital: ${d.overview.capital}` : 'Click Overview to add details';\n  document.querySelectorAll('.tab').forEach(t => t.classList.toggle('active', t.dataset.tab === 'overview'));\n  renderTab();\n}<\/p>\n<p>function setTab(tab, el) {\n  ST.tab = tab;\n  document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));\n  el.classList.add('active');\n  renderTab();\n}<\/p>\n<p>function renderTab() {\n  const id = ST.sel;\n  const d = getCountryData(id);\n  const tc = document.getElementById('tab-content');\n  if (ST.tab === 'overview') tc.innerHTML = renderOverview(d, id);\n  else if (ST.tab === 'requirements') tc.innerHTML = renderRequirements(d, id);\n  else if (ST.tab === 'universities') tc.innerHTML = renderUniversities(d, id);\n  else if (ST.tab === 'checklist') tc.innerHTML = renderChecklist(d, id);\n  else if (ST.tab === 'process') tc.innerHTML = renderProcess(d, id);\n}<\/p>\n<p>\/\/ \u2500\u2500\u2500 OVERVIEW TAB \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction renderOverview(d, id) {\n  const o = d.overview;\n  const intakeHtml = INTAKE_OPTIONS.map(m =>\n    `<span class=\"intake-chip${(o.intakes||[]).includes(m) ? ' active' : ''}\" onclick=\"toggleIntake('${id}','${m}',this)\">${m}<\/span>`\n  ).join('');<\/p>\n<p>  return `<\/p>\n<div class=\"stats-row\">\n<div class=\"stat-card\">\n<div class=\"stat-val\">${esc(o.capital)||'\u2014'}<\/div>\n<div class=\"stat-lbl\">Capital<\/div>\n<\/div>\n<div class=\"stat-card\">\n<div class=\"stat-val\">${esc(o.currency)||'\u2014'}<\/div>\n<div class=\"stat-lbl\">Currency<\/div>\n<\/div>\n<div class=\"stat-card\">\n<div class=\"stat-val\">${esc(o.population)||'\u2014'}<\/div>\n<div class=\"stat-lbl\">Population<\/div>\n<\/div>\n<div class=\"stat-card\">\n<div class=\"stat-val\">${d.universities?.length||0}<\/div>\n<div class=\"stat-lbl\">Universities<\/div>\n<\/div><\/div>\n<p>  ${o.whyStudy ? `<\/p>\n<div class=\"why-card\">\n    ${o.coverImage ? `<img decoding=\"async\" src=\"${esc(o.coverImage)}\" style=\"width:100%;max-height:180px;object-fit:cover;border-radius:8px;margin-bottom:14px;\" onerror=\"this.style.display='none'\">` : ''}<\/p>\n<div class=\"why-title\">Why Study in ${esc(ST.countries.find(c=>c.id===id)?.name||'')}?<\/div>\n<div class=\"why-text\">${esc(o.whyStudy)}<\/div>\n<p>    ${o.tuitionRange ? `<\/p>\n<div style=\"margin-top:12px;padding:8px 14px;background:rgba(255,255,255,.15);border-radius:8px;font-size:13px;font-weight:600;\">\ud83d\udcb0 Tuition: ${esc(o.tuitionRange)}<\/div>\n<p>` : ''}\n    ${(o.intakes||[]).length ? `<\/p>\n<div style=\"margin-top:8px;font-size:12px;opacity:.8;\">\ud83d\udcc5 Intakes: ${(o.intakes||[]).join(' \u00b7 ')}<\/div>\n<p>` : ''}\n  <\/p><\/div>\n<p>` : ''}<\/p>\n<div class=\"card\">\n<div class=\"card-header\">\n<div class=\"card-icon\" style=\"background:#dbeafe;\">\ud83c\udf0d<\/div>\n<div class=\"card-title\">Country details<\/div>\n<p>      <button class=\"btn btn-primary btn-sm\" onclick=\"saveOverview('${id}')\">\ud83d\udcbe Save<\/button>\n    <\/div>\n<div class=\"field\" style=\"margin-bottom:14px\">\n<div class=\"label\">Cover image URL (for Why Study section)<\/div>\n<div style=\"display:flex;gap:8px\">\n        <input class=\"inp\" id=\"ov-img\" value=\"${esc(o.coverImage)}\" placeholder=\"Paste image URL here e.g. https:\/\/example.com\/spain.jpg\" style=\"flex:1\">\n        <button class=\"btn btn-sm\" onclick=\"previewImage('${id}')\">Preview<\/button>\n      <\/div>\n<p>      ${o.coverImage ? `<img decoding=\"async\" src=\"${esc(o.coverImage)}\" style=\"margin-top:8px;width:100%;max-height:140px;object-fit:cover;border-radius:8px;border:1px solid var(--border);\" onerror=\"this.style.display='none'\">` : ''}\n    <\/div>\n<div class=\"form-grid\" style=\"margin-bottom:14px\">\n<div class=\"field\">\n<div class=\"label\">Capital city<\/div>\n<p><input class=\"inp\" id=\"ov-capital\" value=\"${esc(o.capital)}\" placeholder=\"e.g. Madrid\"><\/div>\n<div class=\"field\">\n<div class=\"label\">Official language<\/div>\n<p><input class=\"inp\" id=\"ov-language\" value=\"${esc(o.language)}\" placeholder=\"e.g. Spanish\"><\/div>\n<div class=\"field\">\n<div class=\"label\">Official currency<\/div>\n<p><input class=\"inp\" id=\"ov-currency\" value=\"${esc(o.currency)}\" placeholder=\"e.g. EUR (\u20ac)\"><\/div>\n<div class=\"field\">\n<div class=\"label\">Population<\/div>\n<p><input class=\"inp\" id=\"ov-population\" value=\"${esc(o.population)}\" placeholder=\"e.g. 47 million\"><\/div>\n<div class=\"field\">\n<div class=\"label\">Tuition fee range<\/div>\n<p><input class=\"inp\" id=\"ov-tuition\" value=\"${esc(o.tuitionRange)}\" placeholder=\"e.g. \u20ac8,000 \u2013 \u20ac15,000 \/ year\"><\/div>\n<\/p><\/div>\n<div class=\"field\" style=\"margin-bottom:16px\">\n<div class=\"label\">Why study in this country?<\/div>\n<p>      <textarea class=\"inp\" id=\"ov-why\" placeholder=\"Describe why students should choose this country \u2014 highlight key benefits, lifestyle, career prospects...\">${esc(o.whyStudy)}<\/textarea>\n    <\/div>\n<div class=\"field\">\n<div class=\"label\" style=\"margin-bottom:8px\">Intake periods \u2014 click to toggle<\/div>\n<div class=\"intake-grid\" id=\"intake-grid\">${intakeHtml}<\/div>\n<\/p><\/div>\n<\/p><\/div>\n<p>`;\n}<\/p>\n<p>function toggleIntake(id, month, el) {\n  const d = getCountryData(id);\n  if (!d.overview.intakes) d.overview.intakes = [];\n  const idx = d.overview.intakes.indexOf(month);\n  if (idx >= 0) { d.overview.intakes.splice(idx, 1); el.classList.remove('active'); }\n  else { d.overview.intakes.push(month); el.classList.add('active'); }\n  ST.data[id] = d; saveToStorage();\n}<\/p>\n<p>function previewImage(id) {\n  const url = document.getElementById('ov-img')?.value?.trim();\n  if (!url) { showToast('Please enter an image URL first', 'error'); return; }\n  const d = getCountryData(id);\n  d.overview.coverImage = url;\n  ST.data[id] = d; saveToStorage();\n  renderTab();\n}<\/p>\n<p>function saveOverview(id) {\n  const d = getCountryData(id);\n  const intakes = d.overview.intakes || [];\n  d.overview = {\n    ...d.overview,\n    capital: val('ov-capital'), language: val('ov-language'),\n    currency: val('ov-currency'), population: val('ov-population'),\n    tuitionRange: val('ov-tuition'), whyStudy: val('ov-why'),\n    coverImage: val('ov-img'), intakes\n  };\n  ST.data[id] = d; saveToStorage();\n  const c = ST.countries.find(x => x.id === id);\n  document.getElementById('tp-sub').textContent = d.overview.capital ? `Capital: ${d.overview.capital}` : '';\n  showToast('Overview saved successfully \u2713', 'success');\n  renderTab();\n}<\/p>\n<p>\/\/ \u2500\u2500\u2500 REQUIREMENTS TAB \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction renderRequirements(d, id) {\n  const r = d.requirements;\n  const bmap = { yes:'badge-green', no:'badge-red', conditional:'badge-amber' };\n  return `<\/p>\n<div class=\"card\">\n<div class=\"card-header\">\n<div class=\"card-icon\" style=\"background:#dcfce7;\">\ud83d\udccb<\/div>\n<div class=\"card-title\">Entry requirements<\/div>\n<p>      <button class=\"btn btn-primary btn-sm\" onclick=\"saveRequirements('${id}')\">\ud83d\udcbe Save<\/button>\n    <\/div>\n<div class=\"form-grid\" style=\"margin-bottom:14px\">\n<div class=\"field\">\n<div class=\"label\">MOI accepted?<\/div>\n<p>        <select class=\"inp\" id=\"rq-moi\"><option value=\"\">Select...<\/option><option value=\"yes\"${r.moiAccepted==='yes'?' selected':''}>\u2705 Yes \u2013 MOI Accepted<\/option><option value=\"no\"${r.moiAccepted==='no'?' selected':''}>\u274c No \u2013 Not Accepted<\/option><option value=\"conditional\"${r.moiAccepted==='conditional'?' selected':''}>\u26a0\ufe0f Conditional<\/option><\/select>\n      <\/div>\n<div class=\"field\">\n<div class=\"label\">IELTS requirement<\/div>\n<p><input class=\"inp\" id=\"rq-ielts\" value=\"${esc(r.ielts)}\" placeholder=\"e.g. 6.0 overall, no band < 5.5\"><\/div>\n<div class=\"field\">\n<div class=\"label\">PTE requirement<\/div>\n<p><input class=\"inp\" id=\"rq-pte\" value=\"${esc(r.pte)}\" placeholder=\"e.g. 55 overall\"><\/div>\n<div class=\"field\">\n<div class=\"label\">Undergraduate minimum GPA \/ %<\/div>\n<p><input class=\"inp\" id=\"rq-ug\" value=\"${esc(r.ugMin)}\" placeholder=\"e.g. 2.8 GPA \/ 50%\"><\/div>\n<div class=\"field\">\n<div class=\"label\">Postgraduate minimum GPA \/ %<\/div>\n<p><input class=\"inp\" id=\"rq-pg\" value=\"${esc(r.pgMin)}\" placeholder=\"e.g. 3.0 GPA \/ 55%\"><\/div>\n<div class=\"field\">\n<div class=\"label\">Study gap accepted?<\/div>\n<p>        <select class=\"inp\" id=\"rq-gap\"><option value=\"yes\"${r.gapAccepted==='yes'?' selected':''}>Yes<\/option><option value=\"no\"${r.gapAccepted==='no'?' selected':''}>No<\/option><option value=\"conditional\"${r.gapAccepted==='conditional'?' selected':''}>Conditional<\/option><\/select>\n      <\/div>\n<div class=\"field\">\n<div class=\"label\">Maximum gap accepted (years)<\/div>\n<p><input class=\"inp\" id=\"rq-gapyrs\" value=\"${esc(r.gapYears)}\" placeholder=\"e.g. 5 years UG \/ 10 years PG\"><\/div>\n<\/p><\/div>\n<div class=\"field\">\n<div class=\"label\">Additional notes<\/div>\n<p>      <textarea class=\"inp\" id=\"rq-notes\" placeholder=\"Any other requirements, special conditions, or important notes...\">${esc(r.notes)}<\/textarea>\n    <\/div>\n<\/p><\/div>\n<div class=\"card\">\n<div class=\"card-header\">\n<div class=\"card-icon\" style=\"background:#fef3c7;\">\ud83d\udcca<\/div>\n<div class=\"card-title\">Requirements summary<\/div>\n<\/p><\/div>\n<div class=\"req-summary-grid\">\n<div class=\"req-summary-item\">\n<div class=\"req-summary-lbl\">MOI Status<\/div>\n<div class=\"req-summary-val\">${r.moiAccepted ? `<span class=\"badge ${bmap[r.moiAccepted]||'badge-gray'}\">${r.moiAccepted}<\/span>` : '\u2014'}<\/div>\n<\/div>\n<div class=\"req-summary-item\">\n<div class=\"req-summary-lbl\">IELTS<\/div>\n<div class=\"req-summary-val\" style=\"font-size:12px;\">${esc(r.ielts)||'\u2014'}<\/div>\n<\/div>\n<div class=\"req-summary-item\">\n<div class=\"req-summary-lbl\">PTE<\/div>\n<div class=\"req-summary-val\">${esc(r.pte)||'\u2014'}<\/div>\n<\/div>\n<div class=\"req-summary-item\">\n<div class=\"req-summary-lbl\">UG Minimum<\/div>\n<div class=\"req-summary-val\">${esc(r.ugMin)||'\u2014'}<\/div>\n<\/div>\n<div class=\"req-summary-item\">\n<div class=\"req-summary-lbl\">PG Minimum<\/div>\n<div class=\"req-summary-val\">${esc(r.pgMin)||'\u2014'}<\/div>\n<\/div>\n<div class=\"req-summary-item\">\n<div class=\"req-summary-lbl\">Study Gap<\/div>\n<div class=\"req-summary-val\">${r.gapAccepted ? `<span class=\"badge ${bmap[r.gapAccepted]||'badge-gray'}\">${r.gapAccepted}<\/span>` : '\u2014'} ${r.gapYears ? `<span style=\"font-size:11px;color:var(--text3)\">(${esc(r.gapYears)})<\/span>` : ''}<\/div>\n<\/div><\/div>\n<p>    ${r.notes ? `<\/p>\n<div style=\"margin-top:14px;padding:12px 14px;background:#f0f9ff;border-radius:8px;border-left:3px solid #0ea5e9;font-size:12px;color:var(--text2)\">\ud83d\udccc ${esc(r.notes)}<\/div>\n<p>` : ''}\n  <\/p><\/div>\n<p>`;\n}<\/p>\n<p>function saveRequirements(id) {\n  const d = getCountryData(id);\n  d.requirements = { moiAccepted: val('rq-moi'), ielts: val('rq-ielts'), pte: val('rq-pte'), ugMin: val('rq-ug'), pgMin: val('rq-pg'), gapAccepted: val('rq-gap'), gapYears: val('rq-gapyrs'), notes: val('rq-notes') };\n  ST.data[id] = d; saveToStorage();\n  showToast('Entry requirements saved \u2713', 'success');\n  renderTab();\n}<\/p>\n<p>\/\/ \u2500\u2500\u2500 UNIVERSITIES TAB \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction renderUniversities(d, id) {\n  const unis = d.universities || [];\n  return `<\/p>\n<div class=\"card\" style=\"padding:14px 20px\">\n<div style=\"display:flex;align-items:center;gap:10px\">\n<div style=\"flex:1\"><span class=\"card-title\">${unis.length} ${unis.length===1?'university':'universities'} listed<\/span><\/div>\n<p>      <button class=\"btn btn-primary\" onclick=\"openAddUniModal('${id}')\">\uff0b Add University<\/button>\n    <\/div>\n<\/p><\/div>\n<p>  ${unis.length === 0 ? `<\/p>\n<div class=\"card\">\n<div class=\"empty-state\">\n<div class=\"empty-icon\">\ud83c\udfdb\ufe0f<\/div>\n<div class=\"empty-title\">No universities yet<\/div>\n<div class=\"empty-sub\">Click \"Add University\" to add partner universities for this country.<\/div>\n<\/div>\n<\/div>\n<p>` : ''}\n  ${unis.map((u, i) => {\n    const initials = u.name ? u.name.split(' ').filter(w=>w).slice(0,2).map(w=>w[0]).join('').toUpperCase() : 'U';\n    const courseList = u.courses ? u.courses.split(',').map(c=>c.trim()).filter(Boolean) : [];\n    const typeColors = {\"Bachelor's\":'badge-blue',\"Master's\":'badge-purple','Both':'badge-teal','Medical':'badge-red','Pathway':'badge-amber'};\n    return `<\/p>\n<div class=\"uni-card\">\n<div class=\"uni-hdr\">\n<div class=\"uni-avatar\">${initials}<\/div>\n<div style=\"flex:1;min-width:0\">\n<div class=\"uni-name\">${esc(u.name)}<\/div>\n<div class=\"uni-location\">${u.location ? '\ud83d\udccd ' + esc(u.location) : ''}<\/div>\n<\/p><\/div>\n<p>        ${u.type ? `<span class=\"badge ${typeColors[u.type]||'badge-gray'}\">${esc(u.type)}<\/span>` : ''}<\/p>\n<div style=\"display:flex;gap:6px;margin-left:8px\">\n          <button class=\"btn btn-sm\" onclick=\"openEditUniModal('${id}',${i})\">\u270f\ufe0f Edit<\/button>\n          <button class=\"btn btn-danger btn-sm\" onclick=\"removeUni('${id}',${i})\">\u2715<\/button>\n        <\/div>\n<\/p><\/div>\n<div class=\"uni-meta-grid\">\n        ${u.duration ? `<\/p>\n<div class=\"uni-meta-item\">\n<div class=\"uni-meta-lbl\">Duration<\/div>\n<div class=\"uni-meta-val\">${esc(u.duration)}<\/div>\n<\/div>\n<p>` : ''}\n        ${u.fees ? `<\/p>\n<div class=\"uni-meta-item\">\n<div class=\"uni-meta-lbl\">Fees \/ Tuition<\/div>\n<div class=\"uni-meta-val\" style=\"color:var(--success)\">${esc(u.fees)}<\/div>\n<\/div>\n<p>` : ''}\n      <\/p><\/div>\n<p>      ${courseList.length ? `<\/p>\n<div class=\"uni-courses-wrap\">\n<div class=\"uni-courses-lbl\">Courses available<\/div>\n<div>${courseList.map(c=>`<span class=\"course-chip\">${esc(c)}<\/span>`).join('')}<\/div>\n<\/div>\n<p>` : ''}\n      ${u.notes ? `<\/p>\n<div class=\"uni-notes\">\u2139\ufe0f ${esc(u.notes)}<\/div>\n<p>` : ''}\n    <\/p><\/div>\n<p>`;\n  }).join('')}`;\n}<\/p>\n<p>function openAddUniModal(id, editIdx) {\n  const d = getCountryData(id);\n  const u = editIdx !== undefined ? d.universities[editIdx] : {};\n  const isEdit = editIdx !== undefined;\n  document.getElementById('modal-container').innerHTML = `<\/p>\n<div class=\"modal-overlay\" onclick=\"if(event.target===this)closeModal()\">\n<div class=\"modal\">\n<div class=\"modal-header\">\n<div class=\"modal-title\">${isEdit ? '\u270f\ufe0f Edit' : '\uff0b Add'} University<\/div>\n<p>        <button class=\"modal-close\" onclick=\"closeModal()\">\u2715<\/button>\n      <\/div>\n<div class=\"form-grid\" style=\"margin-bottom:14px\">\n<div class=\"field\">\n<div class=\"label\">University name *<\/div>\n<p><input class=\"inp\" id=\"uni-name\" value=\"${esc(u.name||'')}\" placeholder=\"e.g. University of Madrid\"><\/div>\n<div class=\"field\">\n<div class=\"label\">Location \/ City<\/div>\n<p><input class=\"inp\" id=\"uni-loc\" value=\"${esc(u.location||'')}\" placeholder=\"e.g. Madrid, Spain\"><\/div>\n<div class=\"field\">\n<div class=\"label\">Duration of courses<\/div>\n<p><input class=\"inp\" id=\"uni-dur\" value=\"${esc(u.duration||'')}\" placeholder=\"e.g. 3 years Bachelor's \/ 1.5 years Master's\"><\/div>\n<div class=\"field\">\n<div class=\"label\">Fees \/ Tuition<\/div>\n<p><input class=\"inp\" id=\"uni-fees\" value=\"${esc(u.fees||'')}\" placeholder=\"e.g. \u20ac9,800\/year\"><\/div>\n<div class=\"field\">\n<div class=\"label\">Program type<\/div>\n<p>          <select class=\"inp\" id=\"uni-type\"><option value=\"\">Select...<\/option><option value=\"Bachelor's\"${u.type===\"Bachelor's\"?' selected':''}>Bachelor's<\/option><option value=\"Master's\"${u.type===\"Master's\"?' selected':''}>Master's<\/option><option value=\"Both\"${u.type==='Both'?' selected':''}>Both<\/option><option value=\"Medical\"${u.type==='Medical'?' selected':''}>Medical<\/option><option value=\"Pathway\"${u.type==='Pathway'?' selected':''}>Pathway<\/option><\/select>\n        <\/div>\n<\/p><\/div>\n<div class=\"field\" style=\"margin-bottom:12px\">\n<div class=\"label\">Courses available (comma-separated)<\/div>\n<p><textarea class=\"inp\" id=\"uni-courses\" placeholder=\"e.g. Business Administration, Computer Science, Engineering, Law\">${esc(u.courses||'')}<\/textarea><\/div>\n<div class=\"field\">\n<div class=\"label\">Additional notes<\/div>\n<p><textarea class=\"inp\" id=\"uni-notes\" placeholder=\"Scholarship info, special requirements, ranking, highlights...\" style=\"min-height:60px\">${esc(u.notes||'')}<\/textarea><\/div>\n<div class=\"modal-footer\">\n        <button class=\"btn\" onclick=\"closeModal()\">Cancel<\/button>\n        <button class=\"btn btn-primary\" onclick=\"${isEdit ? `saveEditUni('${id}',${editIdx})` : `saveAddUni('${id}')`}\">${isEdit ? 'Save changes' : 'Add university'}<\/button>\n      <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<p>`;\n}\nfunction openEditUniModal(id, i) { openAddUniModal(id, i); }<\/p>\n<p>function saveAddUni(id) {\n  const name = val('uni-name');\n  if (!name.trim()) { showToast('University name is required', 'error'); return; }\n  const d = getCountryData(id);\n  if (!d.universities) d.universities = [];\n  d.universities.push({ name, location: val('uni-loc'), duration: val('uni-dur'), fees: val('uni-fees'), type: val('uni-type'), courses: val('uni-courses'), notes: val('uni-notes') });\n  ST.data[id] = d; saveToStorage(); closeModal();\n  showToast('University added \u2713', 'success');\n  renderTab(); renderSidebar(document.getElementById('sb-search').value);\n}<\/p>\n<p>function saveEditUni(id, i) {\n  const name = val('uni-name');\n  if (!name.trim()) { showToast('University name is required', 'error'); return; }\n  const d = getCountryData(id);\n  d.universities[i] = { name, location: val('uni-loc'), duration: val('uni-dur'), fees: val('uni-fees'), type: val('uni-type'), courses: val('uni-courses'), notes: val('uni-notes') };\n  ST.data[id] = d; saveToStorage(); closeModal();\n  showToast('University updated \u2713', 'success');\n  renderTab();\n}<\/p>\n<p>function removeUni(id, i) {\n  if (!confirm('Remove this university? This cannot be undone.')) return;\n  const d = getCountryData(id);\n  d.universities.splice(i, 1);\n  ST.data[id] = d; saveToStorage();\n  showToast('University removed', 'success');\n  renderTab(); renderSidebar(document.getElementById('sb-search').value);\n}<\/p>\n<p>\/\/ \u2500\u2500\u2500 CHECKLIST TAB \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction renderChecklist(d, id) {\n  const cl = d.checklist;\n  const sections = [\n    { key:'personal', label:'Personal Documents', icon:'\ud83d\udc64', color:'#dbeafe' },\n    { key:'academic', label:'Academic Documents', icon:'\ud83c\udf93', color:'#dcfce7' },\n    { key:'financial', label:'Financial Documents', icon:'\ud83d\udcb0', color:'#fef3c7' },\n    { key:'visa', label:'Visa Application', icon:'\ud83d\udccb', color:'#ede9fe' }\n  ];\n  const total = sections.reduce((a, s) => a + (cl[s.key]||[]).length, 0);\n  const done = sections.reduce((a, s) => a + (cl[s.key]||[]).filter(i => i.checked).length, 0);\n  const pct = total ? Math.round(done \/ total * 100) : 0;<\/p>\n<p>  return `<\/p>\n<div class=\"card\" style=\"padding:16px 20px\">\n<div style=\"display:flex;align-items:center;gap:12px;margin-bottom:10px\">\n<div style=\"flex:1\">\n<div class=\"card-title\">Document checklist progress<\/div>\n<div style=\"font-size:12px;color:var(--text3);margin-top:2px\">${done} of ${total} items completed<\/div>\n<\/div>\n<div style=\"font-size:22px;font-weight:700;color:${pct===100?'var(--success)':'var(--primary)'};\">${pct}%<\/div>\n<p>      <button class=\"btn btn-success btn-sm\" onclick=\"downloadChecklist('${id}')\">\u2b07 Download<\/button>\n    <\/div>\n<div class=\"prog-bar\">\n<div class=\"prog-fill\" style=\"width:${pct}%\"><\/div>\n<\/div><\/div>\n<p>  ${sections.map(s => {\n    const items = cl[s.key] || [];\n    const sdone = items.filter(i => i.checked).length;\n    return `<\/p>\n<div class=\"card\" style=\"padding:0;overflow:hidden\">\n<div class=\"check-section-hdr\" style=\"background:${s.color}20\">\n        <span style=\"font-size:16px\">${s.icon}<\/span><\/p>\n<div class=\"check-section-title\">${s.label}<\/div>\n<p>        <span class=\"check-section-count\">${sdone}\/${items.length}<\/span>\n      <\/div>\n<div class=\"check-items\">\n        ${items.length === 0 ? `<\/p>\n<div style=\"padding:14px;text-align:center;color:var(--text3);font-size:12px;\">No items yet. Add one below.<\/div>\n<p>` : ''}\n        ${items.map((item, i) => `<\/p>\n<div class=\"check-item${item.checked?' done':''}\">\n          <input type=\"checkbox\" class=\"check-cb\" ${item.checked?'checked':''} onchange=\"toggleCheck('${id}','${s.key}',${i})\">\n          <input class=\"check-text-input\" value=\"${esc(item.text)}\" onchange=\"updateCheckText('${id}','${s.key}',${i},this.value)\" onblur=\"updateCheckText('${id}','${s.key}',${i},this.value)\">\n          <button class=\"btn btn-danger btn-xs\" onclick=\"removeCheckItem('${id}','${s.key}',${i})\" title=\"Remove item\">\u2715<\/button>\n        <\/div>\n<p>`).join('')}\n      <\/p><\/div>\n<div class=\"add-item-row\">\n        <input class=\"add-item-inp\" type=\"text\" placeholder=\"Add new item and press Enter or click Add...\" id=\"new-${s.key}\" onkeydown=\"if(event.key==='Enter')addCheckItem('${id}','${s.key}')\">\n        <button class=\"btn btn-sm btn-primary\" onclick=\"addCheckItem('${id}','${s.key}')\">\uff0b Add<\/button>\n      <\/div>\n<\/p><\/div>\n<p>`;\n  }).join('')}`;\n}<\/p>\n<p>function toggleCheck(id, sec, i) {\n  const d = getCountryData(id); d.checklist[sec][i].checked = !d.checklist[sec][i].checked;\n  ST.data[id] = d; saveToStorage(); renderTab();\n}\nfunction addCheckItem(id, sec) {\n  const inp = document.getElementById('new-' + sec);\n  const text = inp.value.trim(); if (!text) return;\n  const d = getCountryData(id); d.checklist[sec].push({ text, checked: false });\n  ST.data[id] = d; saveToStorage(); renderTab();\n}\nfunction removeCheckItem(id, sec, i) {\n  const d = getCountryData(id); d.checklist[sec].splice(i, 1);\n  ST.data[id] = d; saveToStorage(); renderTab();\n}\nfunction updateCheckText(id, sec, i, v) {\n  const d = getCountryData(id); d.checklist[sec][i].text = v;\n  ST.data[id] = d; saveToStorage();\n}<\/p>\n<p>\/\/ \u2500\u2500\u2500 PROCESS TAB \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction renderProcess(d, id) {\n  const stages = d.process || [];\n  const done = stages.filter(s => (s.checklist||[]).length > 0 && (s.checklist||[]).every(i => i.checked)).length;<\/p>\n<p>  return `<\/p>\n<div class=\"card\" style=\"padding:16px 20px\">\n<div style=\"display:flex;align-items:center;gap:12px;margin-bottom:${stages.length?'10':'0'}px\">\n<div style=\"flex:1\">\n<div class=\"card-title\">Visa process stages<\/div>\n<div style=\"font-size:12px;color:var(--text3);margin-top:2px\">${done} of ${stages.length} stages completed<\/div>\n<\/div>\n<p>      <button class=\"btn btn-primary\" onclick=\"openAddStageModal('${id}')\">\uff0b Add Stage<\/button>\n    <\/div>\n<p>    ${stages.length ? `<\/p>\n<div class=\"prog-bar\">\n<div class=\"prog-fill\" style=\"width:${stages.length?Math.round(done\/stages.length*100):0}%\"><\/div>\n<\/div>\n<p>` : ''}\n  <\/p><\/div>\n<p>  ${stages.length === 0 ? `<\/p>\n<div class=\"card\">\n<div class=\"empty-state\">\n<div class=\"empty-icon\">\ud83d\uddc2\ufe0f<\/div>\n<div class=\"empty-title\">No stages defined yet<\/div>\n<div class=\"empty-sub\">Click \"+ Add Stage\" to build the visa process step by step.<\/div>\n<\/div>\n<\/div>\n<p>` : ''}<\/p>\n<p>  ${stages.map((st, si) => {\n    const col = STAGE_COLORS[si % STAGE_COLORS.length];\n    const sc = (st.checklist||[]).filter(i => i.checked).length;\n    const st2 = (st.checklist||[]).length;\n    const stPct = st2 ? Math.round(sc \/ st2 * 100) : 0;\n    const statusColors = { pending:'badge-gray', 'in-progress':'badge-amber', done:'badge-green' };\n    return `<\/p>\n<div class=\"stage-card\">\n<div class=\"stage-hdr\" onclick=\"toggleStageBody(${si})\">\n<div class=\"stage-num\" style=\"background:${col.bg};color:${col.text}\">${si+1}<\/div>\n<div class=\"stage-info\">\n<div class=\"stage-name\">${esc(st.name)}<\/div>\n<div class=\"stage-meta\">${st2 ? `${sc}\/${st2} checklist items \u00b7 ` : ''}${st.created||''}<\/div>\n<\/p><\/div>\n<p>        <span class=\"badge ${statusColors[st.status||'pending']||'badge-gray'}\">${(st.status||'pending').replace('-',' ')}<\/span><\/p>\n<div style=\"display:flex;gap:6px\">\n          <button class=\"btn btn-danger btn-xs\" onclick=\"event.stopPropagation();removeStage('${id}',${si})\">\u2715<\/button>\n        <\/div>\n<p>        <span class=\"stage-chevron\" id=\"chv-${si}\">\u25bc<\/span>\n      <\/div>\n<div class=\"stage-body\" id=\"sb-${si}\">\n<div class=\"form-grid\" style=\"margin:12px 0\">\n<div class=\"field\">\n<div class=\"label\">Stage name<\/div>\n<p><input class=\"inp\" value=\"${esc(st.name)}\" onchange=\"updateStageField('${id}',${si},'name',this.value)\"><\/div>\n<div class=\"field\">\n<div class=\"label\">Status<\/div>\n<p>            <select class=\"inp\" onchange=\"updateStageField('${id}',${si},'status',this.value)\"><option value=\"pending\"${(st.status||'pending')==='pending'?' selected':''}>\u23f3 Pending<\/option><option value=\"in-progress\"${st.status==='in-progress'?' selected':''}>\ud83d\udd04 In Progress<\/option><option value=\"done\"${st.status==='done'?' selected':''}>\u2705 Done<\/option><\/select>\n          <\/div>\n<\/p><\/div>\n<div class=\"field\" style=\"margin-bottom:14px\">\n<div class=\"label\">Description \/ notes<\/div>\n<p><textarea class=\"inp\" onchange=\"updateStageField('${id}',${si},'desc',this.value)\" placeholder=\"Describe what happens in this stage...\">${esc(st.desc||'')}<\/textarea><\/div>\n<div style=\"display:flex;align-items:center;justify-content:space-between;margin-bottom:8px\">\n<div class=\"label\">Stage checklist<\/div>\n<p>          <span style=\"font-size:11px;color:var(--text3)\">${sc}\/${st2} done \u00b7 ${stPct}%<\/span>\n        <\/div>\n<p>        ${(st.checklist||[]).map((item, ci) => `<\/p>\n<div class=\"check-item${item.checked?' done':''}\">\n          <input type=\"checkbox\" class=\"check-cb\" ${item.checked?'checked':''} onchange=\"toggleStageCheck('${id}',${si},${ci})\">\n          <input class=\"check-text-input\" value=\"${esc(item.text)}\" onchange=\"updateStageCheckText('${id}',${si},${ci},this.value)\">\n          <button class=\"btn btn-danger btn-xs\" onclick=\"removeStageCheck('${id}',${si},${ci})\">\u2715<\/button>\n        <\/div>\n<p>`).join('')}<\/p>\n<div class=\"add-item-row\" style=\"margin-top:4px\">\n          <input class=\"add-item-inp\" type=\"text\" placeholder=\"Add checklist item and press Enter...\" id=\"nsi-${si}\" onkeydown=\"if(event.key==='Enter')addStageCheck('${id}',${si})\">\n          <button class=\"btn btn-primary btn-sm\" onclick=\"addStageCheck('${id}',${si})\">\uff0b Add<\/button>\n        <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<p>`;\n  }).join('')}`;\n}<\/p>\n<p>function toggleStageBody(si) {\n  const body = document.getElementById('sb-' + si);\n  const chv = document.getElementById('chv-' + si);\n  const isOpen = body.classList.contains('open');\n  body.classList.toggle('open', !isOpen);\n  chv.classList.toggle('open', !isOpen);\n}<\/p>\n<p>function openAddStageModal(id) {\n  document.getElementById('modal-container').innerHTML = `<\/p>\n<div class=\"modal-overlay\" onclick=\"if(event.target===this)closeModal()\">\n<div class=\"modal\" style=\"max-width:440px\">\n<div class=\"modal-header\">\n<div class=\"modal-title\">\uff0b Add New Stage<\/div>\n<p>        <button class=\"modal-close\" onclick=\"closeModal()\">\u2715<\/button>\n      <\/div>\n<div class=\"field\" style=\"margin-bottom:12px\">\n<div class=\"label\">Stage name *<\/div>\n<p><input class=\"inp\" id=\"stage-name\" placeholder=\"e.g. Offer Letter, Visa Application, Biometrics...\"><\/div>\n<div class=\"field\" style=\"margin-bottom:12px\">\n<div class=\"label\">Description<\/div>\n<p><textarea class=\"inp\" id=\"stage-desc\" placeholder=\"What happens in this stage?\"><\/textarea><\/div>\n<div class=\"field\">\n<div class=\"label\">Initial status<\/div>\n<p>        <select class=\"inp\" id=\"stage-status\"><option value=\"pending\">\u23f3 Pending<\/option><option value=\"in-progress\">\ud83d\udd04 In Progress<\/option><option value=\"done\">\u2705 Done<\/option><\/select>\n      <\/div>\n<div class=\"modal-footer\">\n        <button class=\"btn\" onclick=\"closeModal()\">Cancel<\/button>\n        <button class=\"btn btn-primary\" onclick=\"saveAddStage('${id}')\">Add stage<\/button>\n      <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<p>`;\n  setTimeout(() => document.getElementById('stage-name')?.focus(), 100);\n}<\/p>\n<p>function saveAddStage(id) {\n  const name = val('stage-name').trim();\n  if (!name) { showToast('Stage name is required', 'error'); return; }\n  const d = getCountryData(id);\n  d.process.push({ name, desc: val('stage-desc'), status: val('stage-status'), checklist: [], created: new Date().toLocaleDateString('en-GB') });\n  ST.data[id] = d; saveToStorage(); closeModal();\n  showToast('Stage added \u2713', 'success'); renderTab();\n}<\/p>\n<p>function removeStage(id, si) {\n  if (!confirm('Remove this stage? This cannot be undone.')) return;\n  const d = getCountryData(id); d.process.splice(si, 1);\n  ST.data[id] = d; saveToStorage();\n  showToast('Stage removed', 'success'); renderTab();\n}\nfunction updateStageField(id, si, field, v) {\n  const d = getCountryData(id); d.process[si][field] = v;\n  ST.data[id] = d; saveToStorage();\n  if (field === 'name' || field === 'status') renderTab();\n}\nfunction toggleStageCheck(id, si, ci) {\n  const d = getCountryData(id); d.process[si].checklist[ci].checked = !d.process[si].checklist[ci].checked;\n  ST.data[id] = d; saveToStorage(); renderTab();\n}\nfunction addStageCheck(id, si) {\n  const inp = document.getElementById('nsi-' + si);\n  const text = inp?.value?.trim(); if (!text) return;\n  const d = getCountryData(id); d.process[si].checklist.push({ text, checked: false });\n  ST.data[id] = d; saveToStorage(); renderTab();\n}\nfunction removeStageCheck(id, si, ci) {\n  const d = getCountryData(id); d.process[si].checklist.splice(ci, 1);\n  ST.data[id] = d; saveToStorage(); renderTab();\n}\nfunction updateStageCheckText(id, si, ci, v) {\n  const d = getCountryData(id); d.process[si].checklist[ci].text = v;\n  ST.data[id] = d; saveToStorage();\n}<\/p>\n<p>\/\/ \u2500\u2500\u2500 ADD COUNTRY MODAL \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction openAddCountryModal() {\n  document.getElementById('modal-container').innerHTML = `<\/p>\n<div class=\"modal-overlay\" onclick=\"if(event.target===this)closeModal()\">\n<div class=\"modal\" style=\"max-width:400px\">\n<div class=\"modal-header\">\n<div class=\"modal-title\">\uff0b Add New Country<\/div>\n<p>        <button class=\"modal-close\" onclick=\"closeModal()\">\u2715<\/button>\n      <\/div>\n<div class=\"field\" style=\"margin-bottom:12px\">\n<div class=\"label\">Country name *<\/div>\n<p><input class=\"inp\" id=\"nc-name\" placeholder=\"e.g. Denmark\" autofocus><\/div>\n<div class=\"field\">\n<div class=\"label\">Flag emoji<\/div>\n<p><input class=\"inp\" id=\"nc-flag\" placeholder=\"\ud83c\udde9\ud83c\uddf0\" maxlength=\"4\"><\/div>\n<div class=\"modal-footer\">\n        <button class=\"btn\" onclick=\"closeModal()\">Cancel<\/button>\n        <button class=\"btn btn-primary\" onclick=\"saveNewCountry()\">Add country<\/button>\n      <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<p>`;\n  setTimeout(() => document.getElementById('nc-name')?.focus(), 100);\n}<\/p>\n<p>function saveNewCountry() {\n  const name = val('nc-name').trim();\n  if (!name) { showToast('Country name is required', 'error'); return; }\n  const id = name.toLowerCase().replace(\/[^a-z0-9]\/g, '_') + '_' + Date.now();\n  ST.countries.push({ id, name, flag: val('nc-flag') || '\ud83c\udf0d' });\n  saveToStorage(); closeModal();\n  showToast(`${name} added \u2713`, 'success');\n  renderSidebar(); selectCountry(id);\n}<\/p>\n<p>\/\/ \u2500\u2500\u2500 EXPORT CSV \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction exportCSV() {\n  const id = ST.sel;\n  const c = ST.countries.find(x => x.id === id);\n  const d = getCountryData(id);\n  const rows = [['Section', 'Category', 'Item', 'Status', 'Notes']];\n  const o = d.overview;\n  rows.push(['Overview', 'Country Info', 'Capital', o.capital, '']);\n  rows.push(['Overview', 'Country Info', 'Language', o.language, '']);\n  rows.push(['Overview', 'Country Info', 'Currency', o.currency, '']);\n  rows.push(['Overview', 'Country Info', 'Population', o.population, '']);\n  rows.push(['Overview', 'Country Info', 'Tuition Range', o.tuitionRange, '']);\n  rows.push(['Overview', 'Intakes', (o.intakes||[]).join(', '), '', '']);\n  const r = d.requirements;\n  rows.push(['Requirements', 'Entry', 'MOI Accepted', r.moiAccepted, '']);\n  rows.push(['Requirements', 'Entry', 'IELTS', r.ielts, '']);\n  rows.push(['Requirements', 'Entry', 'PTE', r.pte, '']);\n  rows.push(['Requirements', 'Entry', 'UG Minimum', r.ugMin, '']);\n  rows.push(['Requirements', 'Entry', 'PG Minimum', r.pgMin, '']);\n  rows.push(['Requirements', 'Entry', 'Gap Accepted', r.gapAccepted, r.gapYears]);\n  rows.push(['Requirements', 'Notes', r.notes, '', '']);\n  (d.universities||[]).forEach((u, i) => {\n    rows.push([`University ${i+1}`, u.name, u.location||'', u.fees||'', u.type||'']);\n    rows.push([`University ${i+1}`, 'Duration', u.duration||'', '', '']);\n    rows.push([`University ${i+1}`, 'Courses', u.courses||'', '', '']);\n    rows.push([`University ${i+1}`, 'Notes', u.notes||'', '', '']);\n  });\n  const secs = { personal:'Personal Documents', academic:'Academic Documents', financial:'Financial Documents', visa:'Visa Application' };\n  Object.entries(secs).forEach(([k, lbl]) => {\n    (d.checklist[k]||[]).forEach(item => rows.push(['Checklist', lbl, item.text, item.checked ? 'Done' : 'Pending', '']));\n  });\n  (d.process||[]).forEach((st, si) => {\n    rows.push([`Visa Process`, `Stage ${si+1}: ${st.name}`, st.desc||'', st.status||'', st.created||'']);\n    (st.checklist||[]).forEach(item => rows.push([`Visa Process`, `Stage ${si+1} Checklist`, item.text, item.checked ? 'Done' : 'Pending', '']));\n  });\n  const csv = rows.map(r => r.map(cell => `\"${String(cell||'').replace(\/\"\/g, '\"\"')}\"`).join(',')).join('\\n');\n  dlFile(csv, `${c.name}_data_${new Date().toISOString().split('T')[0]}.csv`, 'text\/csv');\n  showToast('Exported to CSV \u2713', 'success');\n}<\/p>\n<p>function downloadChecklist(id) {\n  const c = ST.countries.find(x => x.id === id);\n  const d = getCountryData(id);\n  const secs = { personal:'Personal Documents', academic:'Academic Documents', financial:'Financial Documents', visa:'Visa Application' };\n  let csv = `\"${c.name} \u2013 Document Checklist\"\\n\"Generated: ${new Date().toLocaleDateString()}\"\\n\\n`;\n  Object.entries(secs).forEach(([k, lbl]) => {\n    csv += `\"${lbl}\"\\n\"Item\",\"Status\"\\n`;\n    (d.checklist[k]||[]).forEach(item => { csv += `\"${item.text.replace(\/\"\/g,'\"\"')}\",\"${item.checked ? '\u2713 Done' : 'Pending'}\"\\n`; });\n    csv += '\\n';\n  });\n  dlFile(csv, `${c.name}_checklist.csv`, 'text\/csv');\n  showToast('Checklist downloaded \u2713', 'success');\n}<\/p>\n<p>function dlFile(content, filename, type) {\n  const a = document.createElement('a');\n  a.href = URL.createObjectURL(new Blob([content], { type }));\n  a.download = filename;\n  document.body.appendChild(a); a.click(); document.body.removeChild(a);\n}<\/p>\n<p>\/\/ \u2500\u2500\u2500 UTILS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction closeModal() { document.getElementById('modal-container').innerHTML = ''; }\nfunction val(id) { return document.getElementById(id)?.value || ''; }\nfunction esc(s) {\n  if (!s) return '';\n  return String(s).replace(\/&\/g,'&amp;').replace(\/<\/g,'&lt;').replace(\/>\/g,'&gt;').replace(\/\"\/g,'&quot;');\n}\nfunction showToast(msg, type = '') {\n  const t = document.createElement('div');\n  t.className = 'toast' + (type ? ' ' + type : '');\n  t.textContent = msg;\n  document.body.appendChild(t);\n  setTimeout(() => t.style.opacity = '0', 2000);\n  setTimeout(() => t.remove(), 2400);\n}<\/p>\n<p>\/\/ \u2500\u2500\u2500 INIT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nloadFromStorage();\nprefillAll();\nsaveToStorage();\nrenderSidebar();\n<\/script><br \/>\n<\/body><br \/>\n<\/html><\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-6","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/crm.whitepigeon.com.np\/index.php?rest_route=\/wp\/v2\/pages\/6","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/crm.whitepigeon.com.np\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/crm.whitepigeon.com.np\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/crm.whitepigeon.com.np\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/crm.whitepigeon.com.np\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6"}],"version-history":[{"count":4,"href":"https:\/\/crm.whitepigeon.com.np\/index.php?rest_route=\/wp\/v2\/pages\/6\/revisions"}],"predecessor-version":[{"id":11,"href":"https:\/\/crm.whitepigeon.com.np\/index.php?rest_route=\/wp\/v2\/pages\/6\/revisions\/11"}],"wp:attachment":[{"href":"https:\/\/crm.whitepigeon.com.np\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}