{"id":11671,"date":"2026-04-01T06:39:28","date_gmt":"2026-04-01T05:39:28","guid":{"rendered":"https:\/\/salomons.coach\/?page_id=11671"},"modified":"2026-05-02T15:19:55","modified_gmt":"2026-05-02T14:19:55","slug":"cross-cultural-leadership-compass","status":"publish","type":"page","link":"https:\/\/salomons.coach\/en\/cross-cultural-leadership-compass\/","title":{"rendered":"Cross-Cultural Leadership Compass"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"11671\" class=\"elementor elementor-11671\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4f8e109 e-con-full e-flex e-con e-parent\" data-id=\"4f8e109\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-303c0ce elementor-widget__width-inherit elementor-widget elementor-widget-html\" data-id=\"303c0ce\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n<meta charset=\"UTF-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n<title>Cross-Cultural Leadership Compass \u2014 Salomons.Coach<\/title>\r\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Cormorant+Garamond:ital,wght@0,300;0,400;0,600;1,300&family=IBM+Plex+Sans:wght@300;400;500;600&display=swap\" rel=\"stylesheet\">\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/Chart.js\/4.4.1\/chart.umd.min.js\"><\/script>\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/html2canvas\/1.4.1\/html2canvas.min.js\"><\/script>\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jspdf\/2.5.1\/jspdf.umd.min.js\"><\/script>\r\n<style>\r\n:root {\r\n  --navy: #08152a;\r\n  --navy-card: #0d1e38;\r\n  --navy-lift: #112244;\r\n  --gold: #c9a84c;\r\n  --gold-light: #e8c870;\r\n  --teal: #2a9d8f;\r\n  --teal-light: #3dbdad;\r\n  --text: #e8edf4;\r\n  --muted: rgba(232,237,244,0.50);\r\n  --border: rgba(201,168,76,0.14);\r\n  --ff-display: 'Cormorant Garamond', Georgia, serif;\r\n  --ff-body: 'IBM Plex Sans', system-ui, sans-serif;\r\n}\r\n*{margin:0;padding:0;box-sizing:border-box;}\r\nhtml{scroll-behavior:smooth;}\r\nbody{\r\n  background:var(--navy);\r\n  color:var(--text);\r\n  font-family:var(--ff-body);\r\n  font-size:13.5px;\r\n  line-height:1.6;\r\n  min-height:100vh;\r\n}\r\nbody::before{\r\n  content:'';position:fixed;inset:0;pointer-events:none;z-index:0;\r\n  background:\r\n    radial-gradient(ellipse 60% 50% at 15% 10%, rgba(201,168,76,.05) 0%, transparent 70%),\r\n    radial-gradient(ellipse 50% 60% at 85% 90%, rgba(42,157,143,.05) 0%, transparent 70%);\r\n  \/* Disabled when embedded in WordPress \u2014 compass-shell::before handles it *\/\r\n}\r\n\/* \u2500\u2500 Compass shell \u2014 owns its own dark background regardless of WP theme \u2500\u2500 *\/\r\n.compass-shell{\r\n  background:var(--navy);\r\n  color:var(--text);\r\n  font-family:var(--ff-body);\r\n  font-size:13.5px;\r\n  line-height:1.6;\r\n  border-radius:12px;\r\n  overflow:hidden;\r\n  position:relative;\r\n}\r\n.compass-shell::before{\r\n  content:'';position:absolute;inset:0;pointer-events:none;z-index:0;\r\n  background:\r\n    radial-gradient(ellipse 60% 50% at 15% 10%, rgba(201,168,76,.05) 0%, transparent 70%),\r\n    radial-gradient(ellipse 50% 60% at 85% 90%, rgba(42,157,143,.05) 0%, transparent 70%);\r\n}\r\n.wrap{max-width:880px;margin:0 auto;padding:44px 20px 60px;position:relative;z-index:1;}\r\n\r\n\/* \u2500\u2500 Header \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\nheader{text-align:center;margin-bottom:44px;}\r\n.brand-tag{\r\n  font-size:10px;font-weight:500;letter-spacing:3px;text-transform:uppercase;\r\n  color:var(--gold);margin-bottom:14px;opacity:.85;\r\n}\r\nheader h1{\r\n  font-family:var(--ff-display);font-size:44px;font-weight:300;\r\n  color:var(--text);line-height:1.1;margin-bottom:10px;\r\n  letter-spacing:-.3px;\r\n}\r\nheader h1 em{font-style:italic;color:var(--gold-light);}\r\nheader p{color:var(--muted);font-size:12.5px;font-weight:300;letter-spacing:.3px;}\r\n\r\n\/* \u2500\u2500 Selector \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n.selector{\r\n  display:grid;grid-template-columns:1fr 44px 1fr;\r\n  gap:12px;align-items:end;margin-bottom:34px;\r\n}\r\n.sel-wrap{}\r\n.sel-label{\r\n  font-size:10px;font-weight:500;letter-spacing:2px;\r\n  text-transform:uppercase;margin-bottom:7px;\r\n  display:flex;align-items:center;gap:7px;\r\n}\r\n.sel-label.a{color:var(--gold);}\r\n.sel-label.b{color:var(--teal);}\r\n.dot{width:7px;height:7px;border-radius:50%;display:inline-block;}\r\n.dot.a{background:var(--gold);}\r\n.dot.b{background:var(--teal);}\r\nselect{\r\n  width:100%;padding:12px 36px 12px 14px;\r\n  background:var(--navy-card);\r\n  border:1px solid var(--border);\r\n  border-radius:7px;\r\n  color:var(--text);\r\n  font-family:var(--ff-body);font-size:14.5px;\r\n  cursor:pointer;appearance:none;-webkit-appearance:none;\r\n  background-image:url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='10' height='7' viewBox='0 0 10 7'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%23c9a84c' stroke-width='1.5' fill='none' stroke-linecap='round' stroke-linejoin='round'\/%3E%3C\/svg%3E\");\r\n  background-repeat:no-repeat;background-position:right 13px center;\r\n  outline:none;transition:border-color .2s;\r\n}\r\nselect:focus{border-color:var(--gold);}\r\nselect option{background:#0d1e38;}\r\n.vs{\r\n  font-family:var(--ff-display);font-size:22px;font-weight:300;\r\n  color:var(--muted);text-align:center;padding-bottom:2px;\r\n}\r\n\r\n\/* \u2500\u2500 Tabs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n.tabs{\r\n  display:flex;border-bottom:1px solid rgba(201,168,76,.14);\r\n  margin-bottom:30px;overflow-x:auto;gap:0;\r\n}\r\n.tab{\r\n  padding:11px 18px;background:none;border:none;\r\n  border-bottom:2px solid transparent;color:var(--muted);\r\n  font-family:var(--ff-body);font-size:11px;font-weight:500;\r\n  letter-spacing:1.6px;text-transform:uppercase;cursor:pointer;\r\n  white-space:nowrap;margin-bottom:-1px;transition:all .2s;\r\n}\r\n.tab:hover{color:var(--text);}\r\n.tab.on{color:var(--gold);border-bottom-color:var(--gold);}\r\n\r\n\/* \u2500\u2500 Panels \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n.panel{display:none;}\r\n.panel.on{display:block;animation:fadeIn .3s ease;}\r\n@keyframes fadeIn{from{opacity:0;transform:translateY(6px);}to{opacity:1;transform:translateY(0);}}\r\n\r\n\/* \u2500\u2500 Section header \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n.sec-head{\r\n  display:flex;justify-content:space-between;align-items:flex-start;\r\n  margin-bottom:22px;padding-bottom:14px;\r\n  border-bottom:1px solid var(--border);\r\n}\r\n.sec-title{font-family:var(--ff-display);font-size:24px;font-weight:400;color:var(--text);}\r\n.sec-sub{font-size:11px;color:var(--muted);margin-top:3px;}\r\n.fw-badge{\r\n  font-size:9px;font-weight:500;letter-spacing:1.5px;text-transform:uppercase;\r\n  padding:4px 9px;border-radius:4px;\r\n  border:1px solid rgba(201,168,76,.28);color:var(--gold);\r\n  white-space:nowrap;margin-top:3px;\r\n}\r\n\r\n\/* \u2500\u2500 Insight card \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n.insight{\r\n  background:rgba(201,168,76,.055);border:1px solid rgba(201,168,76,.2);\r\n  border-radius:8px;padding:15px 18px;margin-bottom:22px;\r\n  display:flex;align-items:flex-start;gap:13px;\r\n}\r\n.insight-icon{font-size:18px;flex-shrink:0;margin-top:1px;}\r\n.insight-lbl{font-size:9.5px;font-weight:500;letter-spacing:1.8px;text-transform:uppercase;color:var(--gold);margin-bottom:3px;}\r\n.insight-txt{font-size:12.5px;color:var(--text);line-height:1.5;}\r\n\r\n\/* \u2500\u2500 Country names bar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n.names{\r\n  display:flex;justify-content:space-between;\r\n  margin-bottom:14px;padding:0 2px;\r\n}\r\n.name-a{font-family:var(--ff-display);font-size:20px;font-weight:400;color:var(--gold-light);}\r\n.name-b{font-family:var(--ff-display);font-size:20px;font-weight:400;color:var(--teal-light);}\r\n\r\n\/* \u2500\u2500 Bar chart rows \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n.dims{}\r\n.dim-row{padding:13px 0;border-bottom:1px solid rgba(255,255,255,.04);}\r\n.dim-row:last-child{border:none;}\r\n.dim-top{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:9px;}\r\n.dim-name{font-size:13px;font-weight:400;color:var(--text);}\r\n.dim-abbr{font-size:10px;color:var(--muted);margin-left:5px;}\r\n.uniq{\r\n  font-size:8.5px;padding:1.5px 6px;border-radius:3px;margin-left:6px;\r\n  background:rgba(42,157,143,.14);color:var(--teal);\r\n  border:1px solid rgba(42,157,143,.28);letter-spacing:.5px;\r\n  vertical-align:middle;\r\n}\r\n.gap-badge{\r\n  font-size:10.5px;font-weight:500;padding:2px 9px;border-radius:10px;\r\n}\r\n.gap-badge.small{background:rgba(42,157,143,.13);color:var(--teal);}\r\n.gap-badge.moderate{background:rgba(201,168,76,.13);color:var(--gold);}\r\n.gap-badge.large{background:rgba(210,80,80,.13);color:#e07878;}\r\n\r\n.bar-line{display:grid;grid-template-columns:18px 1fr 38px;align-items:center;gap:10px;margin-bottom:5px;}\r\n.bar-let{font-size:9.5px;font-weight:600;}\r\n.bar-let.a{color:var(--gold);}\r\n.bar-let.b{color:var(--teal);}\r\n.bar-track{background:rgba(255,255,255,.06);border-radius:3px;height:6px;overflow:hidden;}\r\n.bar-fill{height:100%;border-radius:3px;transition:width .7s cubic-bezier(.4,0,.2,1);}\r\n.bar-fill.a{background:linear-gradient(90deg,var(--gold),var(--gold-light));}\r\n.bar-fill.b{background:linear-gradient(90deg,var(--teal),var(--teal-light));}\r\n.bar-num{font-size:12.5px;font-weight:500;text-align:right;}\r\n.bar-num.a{color:var(--gold);}\r\n.bar-num.b{color:var(--teal);}\r\n\r\n\/* \u2500\u2500 WVS Quadrant \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n.quad-wrap{\r\n  background:rgba(255,255,255,.025);border:1px solid rgba(255,255,255,.07);\r\n  border-radius:10px;padding:22px 20px;margin-bottom:22px;\r\n}\r\n.quad-title{\r\n  font-family:var(--ff-display);font-size:17px;font-weight:400;\r\n  color:var(--gold-light);margin-bottom:16px;text-align:center;\r\n}\r\n#wvs-svg{width:100%;max-width:520px;display:block;margin:0 auto;}\r\n\r\n\/* \u2500\u2500 Schwartz Radar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n.radar-wrap{\r\n  background:rgba(255,255,255,.025);border:1px solid rgba(255,255,255,.07);\r\n  border-radius:10px;padding:22px 20px;margin-bottom:22px;\r\n}\r\n#schwartz-canvas{max-width:460px;margin:0 auto;display:block;}\r\n\r\n\/* \u2500\u2500 Convergence \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n.conv-grid{display:flex;flex-direction:column;gap:11px;}\r\n.conv-row{\r\n  background:rgba(255,255,255,.025);border:1px solid rgba(255,255,255,.07);\r\n  border-radius:8px;padding:16px 18px;\r\n  display:grid;grid-template-columns:1fr auto;gap:16px;align-items:center;\r\n}\r\n.conv-left{}\r\n.conv-theme{font-size:13.5px;font-weight:500;color:var(--text);}\r\n.conv-sub{font-size:11px;color:var(--muted);margin-top:2px;margin-bottom:9px;}\r\n.conv-sigs{display:flex;gap:7px;flex-wrap:wrap;}\r\n.csig{\r\n  font-size:9.5px;font-weight:500;letter-spacing:.8px;\r\n  padding:3px 9px;border-radius:10px;text-transform:uppercase;\r\n}\r\n.csig.large{background:rgba(210,80,80,.13);color:#e07878;border:1px solid rgba(210,80,80,.28);}\r\n.csig.moderate{background:rgba(201,168,76,.13);color:var(--gold);border:1px solid rgba(201,168,76,.28);}\r\n.csig.small{background:rgba(42,157,143,.1);color:var(--teal);border:1px solid rgba(42,157,143,.26);}\r\n.tl{\r\n  width:38px;height:38px;border-radius:50%;flex-shrink:0;\r\n  display:flex;align-items:center;justify-content:center;font-size:16px;\r\n}\r\n.tl.red{background:rgba(210,80,80,.18);border:1px solid rgba(210,80,80,.38);}\r\n.tl.amber{background:rgba(201,168,76,.18);border:1px solid rgba(201,168,76,.38);}\r\n.tl.green{background:rgba(42,157,143,.18);border:1px solid rgba(42,157,143,.38);}\r\n.tl.grey{background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.12);}\r\n\r\n\/* \u2500\u2500 No 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 *\/\r\n.no-data{text-align:center;padding:36px;color:var(--muted);font-size:13px;}\r\n\r\n\/* \u2500\u2500 Footer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\nfooter{\r\n  margin-top:52px;padding-top:26px;\r\n  border-top:1px solid rgba(255,255,255,.06);text-align:center;\r\n}\r\n.foot-brand{\r\n  font-family:var(--ff-display);font-size:18px;font-weight:400;\r\n  color:var(--gold);margin-bottom:10px;\r\n}\r\n.attr{font-size:10.5px;color:var(--muted);line-height:1.8;font-weight:300;}\r\n\r\n\/* \u2500\u2500 Download Button \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n.dl-bar{\r\n  margin-top:28px;padding-top:20px;\r\n  border-top:1px solid rgba(255,255,255,.06);\r\n  display:flex;justify-content:flex-end;align-items:center;gap:12px;\r\n}\r\n.dl-note{font-size:11px;color:var(--muted);font-weight:300;}\r\n.dl-btn{\r\n  display:inline-flex;align-items:center;gap:8px;\r\n  padding:10px 20px;border-radius:7px;cursor:pointer;\r\n  background:transparent;\r\n  border:1px solid rgba(201,168,76,.5);\r\n  color:var(--gold);\r\n  font-family:var(--ff-body);font-size:12px;font-weight:500;\r\n  letter-spacing:.6px;\r\n  transition:all .2s;\r\n  text-decoration:none;\r\n}\r\n.dl-btn:hover{background:rgba(201,168,76,.1);border-color:var(--gold);}\r\n.dl-btn:active{transform:scale(.98);}\r\n.dl-btn.loading{opacity:.6;pointer-events:none;}\r\n.dl-btn svg{width:14px;height:14px;flex-shrink:0;}\r\n.dl-btn .spinner{\r\n  width:14px;height:14px;border-radius:50%;\r\n  border:2px solid rgba(201,168,76,.3);\r\n  border-top-color:var(--gold);\r\n  animation:spin .7s linear infinite;flex-shrink:0;\r\n}\r\n@keyframes spin{to{transform:rotate(360deg);}}\r\n\r\n\/* \u2500\u2500 Summary Radar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n.summary-wrap{\r\n  background:var(--navy-card);\r\n  border:1px solid rgba(255,255,255,.08);\r\n  border-radius:12px;\r\n  padding:22px 20px 16px;\r\n  margin-bottom:28px;\r\n  position:relative;\r\n}\r\n.summary-wrap::before{\r\n  content:'';position:absolute;inset:0;border-radius:12px;\r\n  background:radial-gradient(ellipse 80% 60% at 50% 50%, rgba(201,168,76,.03) 0%, transparent 70%);\r\n  pointer-events:none;\r\n}\r\n.summary-head{\r\n  display:flex;justify-content:space-between;align-items:center;\r\n  margin-bottom:14px;\r\n}\r\n.summary-title{\r\n  font-size:10px;font-weight:500;letter-spacing:2px;text-transform:uppercase;\r\n  color:var(--gold);\r\n}\r\n.summary-legend{display:flex;gap:18px;align-items:center;}\r\n.leg-item{display:flex;align-items:center;gap:7px;font-size:12px;}\r\n.leg-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0;}\r\n.leg-dot.a{background:var(--gold);}\r\n.leg-dot.b{background:var(--teal);}\r\n.leg-name{color:var(--muted);font-weight:300;}\r\n.summary-note{\r\n  font-size:10px;color:var(--muted);text-align:center;\r\n  margin-top:8px;font-weight:300;letter-spacing:.3px;\r\n}\r\n#summary-canvas{max-width:500px;margin:0 auto;display:block;}\r\n\r\n@media(max-width:600px){\r\n  header h1{font-size:30px;}\r\n  .selector{grid-template-columns:1fr;gap:6px;}\r\n  .vs{display:none;}\r\n  .conv-row{grid-template-columns:1fr;}\r\n  .tab{padding:10px 11px;font-size:10px;letter-spacing:1px;}\r\n  #summary-canvas{max-width:100%;}\r\n}\r\n\r\n\/* \u2500\u2500 Leadership Analysis Section \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n.la-section{\r\n  margin-top:44px;\r\n  border-top:1px solid rgba(201,168,76,.2);\r\n  padding-top:36px;\r\n}\r\n.la-head{\r\n  display:flex;justify-content:space-between;align-items:flex-start;\r\n  margin-bottom:6px;\r\n}\r\n.la-title{\r\n  font-family:var(--ff-display);font-size:28px;font-weight:300;\r\n  color:var(--text);\r\n}\r\n.la-title em{font-style:italic;color:var(--gold-light);}\r\n.la-sub{font-size:12px;color:var(--muted);margin-bottom:22px;font-weight:300;}\r\n.la-pair{\r\n  font-size:11px;color:var(--muted);\r\n  padding:4px 10px;border:1px solid var(--border);border-radius:4px;\r\n  margin-top:4px;white-space:nowrap;\r\n}\r\n.la-loading{\r\n  display:flex;align-items:center;gap:12px;\r\n  padding:28px;background:var(--navy-card);border:1px solid var(--border);\r\n  border-radius:10px;margin-bottom:20px;\r\n  font-size:13px;color:var(--muted);\r\n}\r\n.la-spinner{\r\n  width:18px;height:18px;border-radius:50%;flex-shrink:0;\r\n  border:2px solid rgba(201,168,76,.2);\r\n  border-top-color:var(--gold);\r\n  animation:spin .8s linear infinite;\r\n}\r\n.la-frame{\r\n  background:var(--navy-card);\r\n  border:1px solid rgba(255,255,255,.07);\r\n  border-radius:10px;\r\n  overflow:hidden;\r\n}\r\n.la-dim{\r\n  padding:16px 20px;\r\n  border-bottom:1px solid rgba(255,255,255,.04);\r\n  cursor:default;\r\n  transition:background .15s;\r\n}\r\n.la-dim:last-child{border-bottom:none;}\r\n.la-dim:hover{background:rgba(255,255,255,.02);}\r\n.la-dim-head{\r\n  display:flex;justify-content:space-between;align-items:center;\r\n  margin-bottom:6px;\r\n}\r\n.la-dim-num{\r\n  font-size:9px;font-weight:600;letter-spacing:1.5px;color:var(--gold);\r\n  margin-right:8px;\r\n}\r\n.la-dim-name{font-size:13.5px;font-weight:500;color:var(--text);}\r\n.la-wc{\r\n  font-size:10px;color:var(--muted);white-space:nowrap;\r\n  padding:2px 8px;border-radius:10px;\r\n  border:1px solid rgba(255,255,255,.08);\r\n}\r\n.la-preview{\r\n  font-size:12.5px;color:var(--muted);line-height:1.65;\r\n  font-weight:300;\r\n}\r\n.la-preview strong{color:var(--text);font-weight:500;}\r\n.la-preview em{color:var(--gold-light);font-style:italic;}\r\n.la-skel{\r\n  height:12px;background:rgba(255,255,255,.05);\r\n  border-radius:4px;margin-bottom:6px;\r\n  animation:skelPulse 1.4s ease-in-out infinite;\r\n}\r\n.la-skel:last-child{width:65%;margin-bottom:0;}\r\n@keyframes skelPulse{\r\n  0%,100%{opacity:.4;}50%{opacity:.9;}\r\n}\r\n.la-actions{\r\n  display:flex;gap:12px;flex-wrap:wrap;\r\n  margin-top:24px;align-items:center;\r\n}\r\n.la-btn-primary{\r\n  display:inline-flex;align-items:center;gap:8px;\r\n  padding:11px 22px;border-radius:7px;cursor:pointer;\r\n  background:var(--gold);border:none;\r\n  color:#08152a;\r\n  font-family:var(--ff-body);font-size:13px;font-weight:600;\r\n  letter-spacing:.3px;transition:all .2s;\r\n}\r\n.la-btn-primary:hover{background:var(--gold-light);transform:translateY(-1px);}\r\n.la-btn-primary svg{width:15px;height:15px;flex-shrink:0;}\r\n.la-btn-secondary{\r\n  display:inline-flex;align-items:center;gap:8px;\r\n  padding:11px 20px;border-radius:7px;cursor:pointer;\r\n  background:transparent;\r\n  border:1px solid rgba(42,157,143,.5);color:var(--teal-light);\r\n  font-family:var(--ff-body);font-size:12.5px;font-weight:500;\r\n  transition:all .2s;\r\n}\r\n.la-btn-secondary:hover{background:rgba(42,157,143,.08);border-color:var(--teal);}\r\n.la-note{font-size:11px;color:var(--muted);font-weight:300;margin-top:2px;}\r\n.la-error{\r\n  padding:16px 20px;background:rgba(210,80,80,.07);\r\n  border:1px solid rgba(210,80,80,.2);border-radius:8px;\r\n  font-size:12.5px;color:#e07878;\r\n}\r\n\r\n\/* \u2500\u2500 Paygate 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 *\/\r\n.pg-overlay{\r\n  position:fixed;inset:0;z-index:1000;\r\n  background:rgba(8,21,42,.88);\r\n  backdrop-filter:blur(6px);\r\n  display:flex;align-items:center;justify-content:center;\r\n  padding:20px;\r\n}\r\n.pg-overlay.hidden{display:none;}\r\n.pg-modal{\r\n  background:var(--navy-card);\r\n  border:1px solid rgba(201,168,76,.25);\r\n  border-radius:14px;\r\n  padding:36px 36px 28px;\r\n  max-width:480px;width:100%;\r\n  position:relative;\r\n  animation:fadeIn .25s ease;\r\n}\r\n.pg-close{\r\n  position:absolute;top:16px;right:18px;\r\n  background:none;border:none;cursor:pointer;\r\n  color:var(--muted);font-size:20px;line-height:1;\r\n  transition:color .15s;\r\n}\r\n.pg-close:hover{color:var(--text);}\r\n.pg-logo{\r\n  font-family:var(--ff-display);font-size:16px;\r\n  color:var(--gold);margin-bottom:20px;font-weight:400;\r\n}\r\n.pg-title{\r\n  font-family:var(--ff-display);font-size:26px;font-weight:300;\r\n  color:var(--text);margin-bottom:6px;line-height:1.2;\r\n}\r\n.pg-title em{font-style:italic;color:var(--gold-light);}\r\n.pg-sub{font-size:12.5px;color:var(--muted);margin-bottom:24px;line-height:1.6;}\r\n.pg-features{list-style:none;margin-bottom:24px;}\r\n.pg-features li{\r\n  padding:8px 0;border-bottom:1px solid rgba(255,255,255,.05);\r\n  font-size:12.5px;color:var(--text);\r\n  display:flex;align-items:center;gap:10px;\r\n}\r\n.pg-features li:last-child{border:none;}\r\n.pg-features li::before{\r\n  content:'';width:6px;height:6px;border-radius:50%;\r\n  background:var(--gold);flex-shrink:0;\r\n}\r\n.pg-price{\r\n  display:flex;align-items:baseline;gap:6px;margin-bottom:6px;\r\n}\r\n.pg-amount{\r\n  font-family:var(--ff-display);font-size:36px;font-weight:300;color:var(--gold);\r\n}\r\n.pg-currency{font-size:18px;color:var(--gold);font-family:var(--ff-display);}\r\n.pg-per{font-size:12px;color:var(--muted);}\r\n.pg-vat{font-size:11px;color:var(--muted);margin-bottom:20px;}\r\n.pg-cta{\r\n  width:100%;padding:13px;border-radius:8px;\r\n  background:var(--gold);border:none;cursor:pointer;\r\n  color:#08152a;font-family:var(--ff-body);font-size:14px;font-weight:600;\r\n  transition:all .2s;margin-bottom:12px;\r\n}\r\n.pg-cta:hover{background:var(--gold-light);}\r\n.pg-legal{font-size:10.5px;color:var(--muted);text-align:center;line-height:1.6;}\r\n\r\n@media(max-width:600px){\r\n  .la-actions{flex-direction:column;align-items:stretch;}\r\n  .la-btn-primary,.la-btn-secondary{justify-content:center;}\r\n  .pg-modal{padding:28px 20px 22px;}\r\n}\r\n\r\n\/* \u2500\u2500 Intake Form \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n.intake-wrap{\r\n  background:var(--navy-card);\r\n  border:1px solid rgba(201,168,76,.2);\r\n  border-radius:12px;\r\n  padding:28px 28px 22px;\r\n  margin-bottom:28px;\r\n}\r\n.intake-intro{\r\n  font-family:var(--ff-display);font-size:20px;font-weight:300;\r\n  color:var(--text);margin-bottom:6px;line-height:1.3;\r\n}\r\n.intake-intro em{font-style:italic;color:var(--gold-light);}\r\n.intake-why{\r\n  font-size:12px;color:var(--muted);font-weight:300;\r\n  margin-bottom:22px;line-height:1.6;\r\n}\r\n.intake-grid{\r\n  display:grid;grid-template-columns:1fr 1fr;gap:14px;\r\n  margin-bottom:14px;\r\n}\r\n.intake-field{}\r\n.intake-label{\r\n  font-size:10px;font-weight:500;letter-spacing:1.8px;\r\n  text-transform:uppercase;color:var(--gold);\r\n  margin-bottom:6px;display:block;\r\n}\r\n.intake-select,.intake-textarea{\r\n  width:100%;padding:10px 34px 10px 12px;\r\n  background:rgba(255,255,255,.04);\r\n  border:1px solid rgba(255,255,255,.1);\r\n  border-radius:7px;color:var(--text);\r\n  font-family:var(--ff-body);font-size:13.5px;\r\n  outline:none;transition:border-color .2s;\r\n  appearance:none;-webkit-appearance:none;\r\n  background-image:url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='10' height='7' viewBox='0 0 10 7'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%23c9a84c' stroke-width='1.5' fill='none' stroke-linecap='round' stroke-linejoin='round'\/%3E%3C\/svg%3E\");\r\n  background-repeat:no-repeat;background-position:right 12px center;\r\n}\r\n.intake-select:focus,.intake-textarea:focus{border-color:rgba(201,168,76,.5);}\r\n.intake-select option{background:#0d1e38;}\r\n.intake-field.full{grid-column:1\/-1;}\r\n.intake-textarea{\r\n  resize:vertical;min-height:72px;padding:10px 12px;\r\n  background-image:none;line-height:1.5;\r\n}\r\n.intake-apply{\r\n  margin-top:16px;display:flex;align-items:center;gap:12px;\r\n}\r\n.intake-btn{\r\n  padding:9px 20px;border-radius:7px;\r\n  background:rgba(201,168,76,.15);border:1px solid rgba(201,168,76,.4);\r\n  color:var(--gold);font-family:var(--ff-body);font-size:12.5px;\r\n  font-weight:500;cursor:pointer;transition:all .2s;\r\n}\r\n.intake-btn:hover{background:rgba(201,168,76,.25);}\r\n.intake-hint{font-size:11px;color:var(--muted);font-weight:300;}\r\n.intake-done{\r\n  display:inline-flex;align-items:center;gap:6px;\r\n  font-size:12px;color:var(--teal);\r\n  opacity:0;transition:opacity .4s;\r\n}\r\n.intake-done.show{opacity:1;}\r\n@media(max-width:600px){\r\n  .intake-grid{grid-template-columns:1fr;}\r\n  .intake-field.full{grid-column:1;}\r\n}\r\n<\/style>\r\n<\/head>\r\n<body>\r\n<div class=\"compass-shell\">\r\n<div class=\"wrap\">\r\n\r\n<header>\r\n  <div class=\"brand-tag\">Salomons.Coach \u00b7 Leadership Intelligence<\/div>\r\n  <h1>Cross-Cultural <em>Leadership Compass<\/em><\/h1>\r\n  <p>Hofstede &nbsp;\u00b7&nbsp; GLOBE &nbsp;\u00b7&nbsp; World Values Survey &nbsp;\u00b7&nbsp; Schwartz &nbsp;\u2014 four frameworks, one view<\/p>\r\n<\/header>\r\n\r\n<div class=\"selector\">\r\n  <div class=\"sel-wrap\">\r\n    <div class=\"sel-label a\"><span class=\"dot a\"><\/span>Country A<\/div>\r\n    <select id=\"selA\" onchange=\"render()\"><\/select>\r\n  <\/div>\r\n  <div class=\"vs\">vs<\/div>\r\n  <div class=\"sel-wrap\">\r\n    <div class=\"sel-label b\"><span class=\"dot b\"><\/span>Country B<\/div>\r\n    <select id=\"selB\" onchange=\"render()\"><\/select>\r\n  <\/div>\r\n<\/div>\r\n\r\n<div class=\"tabs\">\r\n  <button class=\"tab on\" onclick=\"switchTab('hofstede',this)\">Hofstede<\/button>\r\n  <button class=\"tab\" onclick=\"switchTab('globe',this)\">GLOBE<\/button>\r\n  <button class=\"tab\" onclick=\"switchTab('wvs',this)\">WVS<\/button>\r\n  <button class=\"tab\" onclick=\"switchTab('schwartz',this)\">Schwartz<\/button>\r\n  <button class=\"tab\" onclick=\"switchTab('conv',this)\">Convergence<\/button>\r\n<\/div>\r\n\r\n<!-- Summary Radar -->\r\n<div class=\"summary-wrap\">\r\n  <div class=\"summary-head\">\r\n    <span class=\"summary-title\">Cultural Profile Summary &nbsp;&#xB7;&nbsp; All Four Frameworks<\/span>\r\n    <div class=\"summary-legend\">\r\n      <div class=\"leg-item\"><span class=\"leg-dot a\"><\/span><span class=\"leg-name\" id=\"sum-nameA\">Country A<\/span><\/div>\r\n      <div class=\"leg-item\"><span class=\"leg-dot b\"><\/span><span class=\"leg-name\" id=\"sum-nameB\">Country B<\/span><\/div>\r\n    <\/div>\r\n  <\/div>\r\n  <canvas id=\"summary-canvas\" height=\"420\"><\/canvas>\r\n  <div class=\"summary-note\">Nine convergence themes &nbsp;&#xB7;&nbsp; Composite scores across Hofstede, GLOBE, WVS &amp; Schwartz &nbsp;&#xB7;&nbsp; 0&#x2013;100 scale<\/div>\r\n<\/div>\r\n\r\n<!-- Hofstede -->\r\n<div id=\"p-hofstede\" class=\"panel on\">\r\n  <div class=\"sec-head\">\r\n    <div><div class=\"sec-title\">Hofstede's Cultural Dimensions<\/div>\r\n    <div class=\"sec-sub\">Six dimensions &nbsp;\u00b7&nbsp; 80 countries &nbsp;\u00b7&nbsp; Values-based model &nbsp;\u00b7&nbsp; 1967\u20132010<\/div><\/div>\r\n    <span class=\"fw-badge\">1 of 4<\/span>\r\n  <\/div>\r\n  <div id=\"h-insight\" class=\"insight\"><\/div>\r\n  <div class=\"names\"><span id=\"h-nA\" class=\"name-a\"><\/span><span id=\"h-nB\" class=\"name-b\"><\/span><\/div>\r\n  <div id=\"h-bars\" class=\"dims\"><\/div>\r\n  <div class=\"dl-bar\">\r\n    <span class=\"dl-note\">PDF includes radar summary + Hofstede analysis<\/span>\r\n    <button class=\"dl-btn\" id=\"dl-hofstede\" onclick=\"downloadPDF('hofstede')\"><svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M8 1v9M8 10l-3-3M8 10l3-3M2 12v1a1 1 0 001 1h10a1 1 0 001-1v-1\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span>Download PDF<\/span><\/button>\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- GLOBE -->\r\n<div id=\"p-globe\" class=\"panel\">\r\n  <div class=\"sec-head\">\r\n    <div><div class=\"sec-title\">GLOBE Study<\/div>\r\n    <div class=\"sec-sub\">Nine dimensions &nbsp;\u00b7&nbsp; 62 societies &nbsp;\u00b7&nbsp; Leadership effectiveness &nbsp;\u00b7&nbsp; 1994\u20132004<\/div><\/div>\r\n    <span class=\"fw-badge\">2 of 4<\/span>\r\n  <\/div>\r\n  <div id=\"g-insight\" class=\"insight\"><\/div>\r\n  <div class=\"names\"><span id=\"g-nA\" class=\"name-a\"><\/span><span id=\"g-nB\" class=\"name-b\"><\/span><\/div>\r\n  <div id=\"g-bars\" class=\"dims\"><\/div>\r\n  <div class=\"dl-bar\">\r\n    <span class=\"dl-note\">PDF includes radar summary + GLOBE analysis<\/span>\r\n    <button class=\"dl-btn\" id=\"dl-globe\" onclick=\"downloadPDF('globe')\"><svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M8 1v9M8 10l-3-3M8 10l3-3M2 12v1a1 1 0 001 1h10a1 1 0 001-1v-1\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span>Download PDF<\/span><\/button>\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- WVS -->\r\n<div id=\"p-wvs\" class=\"panel\">\r\n  <div class=\"sec-head\">\r\n    <div><div class=\"sec-title\">World Values Survey<\/div>\r\n    <div class=\"sec-sub\">Inglehart-Welzel Cultural Map &nbsp;\u00b7&nbsp; Wave 7 (2017\u20132022) &nbsp;\u00b7&nbsp; 87 countries<\/div><\/div>\r\n    <span class=\"fw-badge\">3 of 4<\/span>\r\n  <\/div>\r\n  <div id=\"w-insight\" class=\"insight\"><\/div>\r\n  <div class=\"quad-wrap\">\r\n    <div class=\"quad-title\">Inglehart-Welzel Cultural Map<\/div>\r\n    <svg id=\"wvs-svg\" viewBox=\"0 0 520 460\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><\/svg>\r\n  <\/div>\r\n  <div id=\"w-bars\" class=\"dims\"><\/div>\r\n  <div class=\"dl-bar\">\r\n    <span class=\"dl-note\">PDF includes radar summary + WVS analysis<\/span>\r\n    <button class=\"dl-btn\" id=\"dl-wvs\" onclick=\"downloadPDF('wvs')\"><svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M8 1v9M8 10l-3-3M8 10l3-3M2 12v1a1 1 0 001 1h10a1 1 0 001-1v-1\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span>Download PDF<\/span><\/button>\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- Schwartz -->\r\n<div id=\"p-schwartz\" class=\"panel\">\r\n  <div class=\"sec-head\">\r\n    <div><div class=\"sec-title\">Schwartz Cultural Value Orientations<\/div>\r\n    <div class=\"sec-sub\">Seven dimensions &nbsp;\u00b7&nbsp; 80 countries &nbsp;\u00b7&nbsp; ESS-validated for Europe<\/div><\/div>\r\n    <span class=\"fw-badge\">4 of 4<\/span>\r\n  <\/div>\r\n  <div id=\"s-insight\" class=\"insight\"><\/div>\r\n  <div class=\"radar-wrap\">\r\n    <canvas id=\"schwartz-canvas\" height=\"380\"><\/canvas>\r\n    <div style=\"display:flex;align-items:flex-start;gap:10px;margin-top:14px;padding:11px 14px;background:rgba(42,157,143,.07);border:1px solid rgba(42,157,143,.22);border-radius:7px;\">\r\n      <span style=\"font-size:15px;flex-shrink:0;line-height:1.4;color:var(--teal);\">&#x2605;<\/span>\r\n      <div>\r\n        <div style=\"font-size:9.5px;font-weight:500;letter-spacing:1.6px;text-transform:uppercase;color:var(--teal);margin-bottom:3px;\">Unique to Schwartz<\/div>\r\n        <div style=\"font-size:12px;color:rgba(232,237,244,.75);line-height:1.55;\"><strong style=\"color:var(--text);font-weight:500;\">Intellectual Autonomy, Affective Autonomy, Egalitarianism<\/strong> and <strong style=\"color:var(--text);font-weight:500;\">Harmony<\/strong> have no direct equivalent in Hofstede or GLOBE. They represent genuinely new signal not captured by either framework, and are often the most diagnostically valuable dimensions for leadership coaching.<\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n  <div id=\"s-bars\" class=\"dims\"><\/div>\r\n  <div class=\"dl-bar\">\r\n    <span class=\"dl-note\">PDF includes radar summary + Schwartz analysis<\/span>\r\n    <button class=\"dl-btn\" id=\"dl-schwartz\" onclick=\"downloadPDF('schwartz')\"><svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M8 1v9M8 10l-3-3M8 10l3-3M2 12v1a1 1 0 001 1h10a1 1 0 001-1v-1\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span>Download PDF<\/span><\/button>\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- Convergence -->\r\n<div id=\"p-conv\" class=\"panel\">\r\n  <div class=\"sec-head\">\r\n    <div><div class=\"sec-title\">Cross-Framework Convergence<\/div>\r\n    <div class=\"sec-sub\">Where all four frameworks agree &nbsp;\u00b7&nbsp; The highest-confidence coaching signals<\/div><\/div>\r\n    <span class=\"fw-badge\">All 4<\/span>\r\n  <\/div>\r\n  <div id=\"c-insight\" class=\"insight\"><\/div>\r\n  <div id=\"c-grid\" class=\"conv-grid\"><\/div>\r\n  <div class=\"dl-bar\">\r\n    <span class=\"dl-note\">PDF includes radar summary + Convergence analysis<\/span>\r\n    <button class=\"dl-btn\" id=\"dl-conv\" onclick=\"downloadPDF('conv')\"><svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M8 1v9M8 10l-3-3M8 10l3-3M2 12v1a1 1 0 001 1h10a1 1 0 001-1v-1\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span>Download PDF<\/span><\/button>\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- \u2550\u2550 Intake Form \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\r\n<div class=\"intake-wrap\" id=\"intake-wrap\">\r\n  <div class=\"intake-intro\">Tell us about <em>your situation<\/em><\/div>\r\n  <div class=\"intake-why\">The leadership implications below are shaped by your specific context &mdash; not just the country pair. A few questions help us make the analysis personally relevant to you.<\/div>\r\n\r\n  <div class=\"intake-grid\">\r\n\r\n    <div class=\"intake-field\">\r\n      <label class=\"intake-label\" for=\"intake-bg\">Your cultural background<\/label>\r\n      <select class=\"intake-select\" id=\"intake-bg\">\r\n        <option value=\"\">Select your home culture&hellip;<\/option>\r\n        <option value=\"AR\">Argentina<\/option><option value=\"AT\">Austria<\/option>\r\n        <option value=\"AU\">Australia<\/option><option value=\"BE\">Belgium<\/option>\r\n        <option value=\"BR\">Brazil<\/option><option value=\"CA\">Canada<\/option>\r\n        <option value=\"CH\">Switzerland<\/option><option value=\"CL\">Chile<\/option>\r\n        <option value=\"CN\">China<\/option><option value=\"CO\">Colombia<\/option>\r\n        <option value=\"CZ\">Czech Republic<\/option><option value=\"DE\">Germany<\/option>\r\n        <option value=\"DK\">Denmark<\/option><option value=\"ES\">Spain<\/option>\r\n        <option value=\"FI\">Finland<\/option><option value=\"FR\">France<\/option>\r\n        <option value=\"GB\">United Kingdom<\/option><option value=\"GR\">Greece<\/option>\r\n        <option value=\"HK\">Hong Kong<\/option><option value=\"HU\">Hungary<\/option>\r\n        <option value=\"IE\">Ireland<\/option><option value=\"IL\">Israel<\/option>\r\n        <option value=\"IN\">India<\/option><option value=\"IT\">Italy<\/option>\r\n        <option value=\"JP\">Japan<\/option><option value=\"KR\">South Korea<\/option>\r\n        <option value=\"MX\">Mexico<\/option><option value=\"NL\">Netherlands<\/option>\r\n        <option value=\"NO\">Norway<\/option><option value=\"NZ\">New Zealand<\/option>\r\n        <option value=\"PL\">Poland<\/option><option value=\"PT\">Portugal<\/option>\r\n        <option value=\"RU\">Russia<\/option><option value=\"SA\">Saudi Arabia<\/option>\r\n        <option value=\"SE\">Sweden<\/option><option value=\"SG\">Singapore<\/option>\r\n        <option value=\"TR\">Turkey<\/option><option value=\"TW\">Taiwan<\/option>\r\n        <option value=\"US\">United States<\/option><option value=\"ZA\">South Africa<\/option>\r\n        <option value=\"other\">Other \/ Mixed<\/option>\r\n      <\/select>\r\n    <\/div>\r\n\r\n    <div class=\"intake-field\">\r\n      <label class=\"intake-label\" for=\"intake-working\">Culture you are working in<\/label>\r\n      <select class=\"intake-select\" id=\"intake-working\">\r\n        <option value=\"\">Where are you operating now&hellip;<\/option>\r\n        <option value=\"AR\">Argentina<\/option><option value=\"AT\">Austria<\/option>\r\n        <option value=\"AU\">Australia<\/option><option value=\"BE\">Belgium<\/option>\r\n        <option value=\"BR\">Brazil<\/option><option value=\"CA\">Canada<\/option>\r\n        <option value=\"CH\">Switzerland<\/option><option value=\"CL\">Chile<\/option>\r\n        <option value=\"CN\">China<\/option><option value=\"CO\">Colombia<\/option>\r\n        <option value=\"CZ\">Czech Republic<\/option><option value=\"DE\">Germany<\/option>\r\n        <option value=\"DK\">Denmark<\/option><option value=\"ES\">Spain<\/option>\r\n        <option value=\"FI\">Finland<\/option><option value=\"FR\">France<\/option>\r\n        <option value=\"GB\">United Kingdom<\/option><option value=\"GR\">Greece<\/option>\r\n        <option value=\"HK\">Hong Kong<\/option><option value=\"HU\">Hungary<\/option>\r\n        <option value=\"IE\">Ireland<\/option><option value=\"IL\">Israel<\/option>\r\n        <option value=\"IN\">India<\/option><option value=\"IT\">Italy<\/option>\r\n        <option value=\"JP\">Japan<\/option><option value=\"KR\">South Korea<\/option>\r\n        <option value=\"MX\">Mexico<\/option><option value=\"NL\">Netherlands<\/option>\r\n        <option value=\"NO\">Norway<\/option><option value=\"NZ\">New Zealand<\/option>\r\n        <option value=\"PL\">Poland<\/option><option value=\"PT\">Portugal<\/option>\r\n        <option value=\"RU\">Russia<\/option><option value=\"SA\">Saudi Arabia<\/option>\r\n        <option value=\"SE\">Sweden<\/option><option value=\"SG\">Singapore<\/option>\r\n        <option value=\"TR\">Turkey<\/option><option value=\"TW\">Taiwan<\/option>\r\n        <option value=\"US\">United States<\/option><option value=\"ZA\">South Africa<\/option>\r\n        <option value=\"mixed\">Mixed \/ Global<\/option>\r\n      <\/select>\r\n    <\/div>\r\n\r\n    <div class=\"intake-field\">\r\n      <label class=\"intake-label\" for=\"intake-role\">Your leadership role<\/label>\r\n      <select class=\"intake-select\" id=\"intake-role\">\r\n        <option value=\"\">What best describes your role&hellip;<\/option>\r\n        <option value=\"exec\">C-suite \/ Executive (CEO, CFO, COO, CTO&hellip;)<\/option>\r\n        <option value=\"director\">Director \/ VP \/ Senior Manager<\/option>\r\n        <option value=\"manager\">Team or Project Manager<\/option>\r\n        <option value=\"lead\">Team Lead \/ Senior Individual Contributor<\/option>\r\n        <option value=\"consultant\">Consultant \/ Coach \/ Advisor<\/option>\r\n        <option value=\"hr\">HR \/ Talent \/ L&amp;D Professional<\/option>\r\n        <option value=\"individual\">Individual Contributor<\/option>\r\n      <\/select>\r\n    <\/div>\r\n\r\n    <div class=\"intake-field\">\r\n      <label class=\"intake-label\" for=\"intake-situation\">What brings you here<\/label>\r\n      <select class=\"intake-select\" id=\"intake-situation\">\r\n        <option value=\"\">Your current situation&hellip;<\/option>\r\n        <option value=\"new_role\">Starting a new role in a different culture<\/option>\r\n        <option value=\"new_team\">A new team member joining from another culture<\/option>\r\n        <option value=\"managing\">Managing a multicultural or cross-border team<\/option>\r\n        <option value=\"project\">International project or collaboration<\/option>\r\n        <option value=\"merger\">M&amp;A, joint venture or organisational integration<\/option>\r\n        <option value=\"negotiation\">Negotiation or partnership across cultures<\/option>\r\n        <option value=\"coaching\">Coaching or developing a cross-cultural leader<\/option>\r\n        <option value=\"preparation\">Preparing for an international assignment<\/option>\r\n        <option value=\"curiosity\">Research, learning or general interest<\/option>\r\n      <\/select>\r\n    <\/div>\r\n\r\n    <div class=\"intake-field\">\r\n      <label class=\"intake-label\" for=\"intake-gender\">Gender dynamic in your context<\/label>\r\n      <select class=\"intake-select\" id=\"intake-gender\">\r\n        <option value=\"\">Not particularly relevant&hellip;<\/option>\r\n        <option value=\"woman_male_dom\">I&rsquo;m a woman in a male-dominated context<\/option>\r\n        <option value=\"man_female_dom\">I&rsquo;m a man in a female-dominated context<\/option>\r\n        <option value=\"other_gender\">Other gender dynamic applies<\/option>\r\n      <\/select>\r\n    <\/div>\r\n\r\n    <div class=\"intake-field full\">\r\n      <label class=\"intake-label\" for=\"intake-challenge\">Your specific challenge (optional)<\/label>\r\n      <textarea class=\"intake-textarea\" id=\"intake-challenge\"\r\n        placeholder=\"What is the most pressing leadership challenge you are facing in this cross-cultural context? The more specific you are, the more targeted the analysis below will be.\"><\/textarea>\r\n    <\/div>\r\n\r\n  <\/div>\r\n\r\n  <div class=\"intake-apply\">\r\n    <button class=\"intake-btn\" onclick=\"applyIntake()\">Apply my context &rarr;<\/button>\r\n    <span class=\"intake-hint\">Shapes the leadership analysis below<\/span>\r\n    <span class=\"intake-done\" id=\"intake-done\">&#10003; Context applied<\/span>\r\n  <\/div>\r\n<\/div>\r\n\r\n\r\n<!-- \u2550\u2550 Leadership Analysis Section \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\r\n<div class=\"la-section\" id=\"la-section\">\r\n\r\n  <div class=\"la-head\">\r\n    <div>\r\n      <div class=\"la-title\">Leadership <em>Implications<\/em><\/div>\r\n      <div class=\"la-sub\">AI analysis across all four frameworks &nbsp;\u00b7&nbsp; Eleven leadership dimensions &nbsp;\u00b7&nbsp; Based on live framework scores<\/div>\r\n    <\/div>\r\n    <div class=\"la-pair\" id=\"la-pair\">Netherlands vs Germany<\/div>\r\n  <\/div>\r\n\r\n  <div id=\"la-loading\" class=\"la-loading\" style=\"display:none;\">\r\n    <div class=\"la-spinner\"><\/div>\r\n    <span id=\"la-loading-msg\">Analysing framework data across 11 leadership dimensions&hellip;<\/span>\r\n  <\/div>\r\n\r\n  <div id=\"la-error\" class=\"la-error\" style=\"display:none;\"><\/div>\r\n\r\n  <div id=\"la-frame\" class=\"la-frame\" style=\"display:none;\"><\/div>\r\n\r\n  <div class=\"la-actions\" id=\"la-actions\" style=\"display:none;\">\r\n    <div>\r\n      <button class=\"la-btn-primary\" id=\"la-btn-full\" onclick=\"showPaygate()\">\r\n        <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M8 1v9M8 10l-3-3M8 10l3-3M2 12v1a1 1 0 001 1h10a1 1 0 001-1v-1\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\r\n        <span id=\"la-btn-full-label\">Download full report<\/span>\r\n      <\/button>\r\n      <div class=\"la-note\" id=\"la-btn-note\">Complete cross-cultural leadership guide for this country pair<\/div>\r\n    <\/div>\r\n    <button class=\"la-btn-secondary\" onclick=\"downloadExampleReport()\">\r\n      <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><rect x=\"3\" y=\"1\" width=\"10\" height=\"14\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.4\"\/><path d=\"M6 5h4M6 8h4M6 11h2\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\"\/><\/svg>\r\n      Download example report\r\n    <\/button>\r\n  <\/div>\r\n\r\n<\/div><!-- \/la-section -->\r\n\r\n<!-- \u2550\u2550 Paygate Modal \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\r\n<div class=\"pg-overlay hidden\" id=\"pg-overlay\" onclick=\"if(event.target===this)closePaygate()\">\r\n  <div class=\"pg-modal\">\r\n    <button class=\"pg-close\" onclick=\"closePaygate()\">&times;<\/button>\r\n    <div class=\"pg-logo\">Salomons.Coach<\/div>\r\n    <div class=\"pg-title\">Full Leadership <em>Report<\/em><\/div>\r\n    <div class=\"pg-sub\" id=\"pg-sub\">A complete cross-cultural leadership guide for your country pair \u2014 executive-ready, evidence-based, immediately actionable.<\/div>\r\n    <ul class=\"pg-features\">\r\n      <li>11 leadership dimensions analysed in full depth<\/li>\r\n      <li>Day-to-day scenario guidance per dimension<\/li>\r\n      <li>Concrete recommendations with action steps<\/li>\r\n      <li>Grounded in Hofstede, GLOBE, WVS &amp; Schwartz<\/li>\r\n      <li>Professional PDF, ready to share or print<\/li>\r\n    <\/ul>\r\n    <div class=\"pg-price\">\r\n      <span class=\"pg-currency\">&euro;<\/span>\r\n      <span class=\"pg-amount\">49<\/span>\r\n      <span class=\"pg-per\">per report<\/span>\r\n    <\/div>\r\n    <div class=\"pg-vat\">Excl. VAT &nbsp;\u00b7&nbsp; Instant PDF download after payment<\/div>\r\n    <button class=\"pg-cta\" onclick=\"handlePayment()\">Proceed to payment &rarr;<\/button>\r\n    <div class=\"pg-legal\">\r\n      Secure payment &nbsp;\u00b7&nbsp; J.K. Salomons Holding B.V.<br>\r\n      Questions? <a href=\"mailto:jan@salomons.coach\" style=\"color:var(--gold);\">jan@salomons.coach<\/a>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<footer>\r\n  <div class=\"foot-brand\">Salomons.Coach<\/div>\r\n  <div class=\"attr\">\r\n    Hofstede: Hofstede Insights \u00b7 hofstede-insights.com &nbsp;|&nbsp;\r\n    GLOBE: House et al. (2004). Culture, Leadership, and Organizations. Sage.<br>\r\n    WVS: Haerpfer et al. (2022). World Values Survey Wave 7. doi:10.14281\/18241.20 &nbsp;|&nbsp;\r\n    Schwartz: Schwartz (2006). Comparative Sociology 5(2\u20133). ESS europeansocialsurvey.org<br><br>\r\n    Country scores are national averages \u2014 not individual predictions. Use as calibration, not characterisation.<br>\r\n    Tool by J.K. Salomons Holding B.V. &nbsp;\u00b7&nbsp; Jan Salomons &nbsp;\u00b7&nbsp; HBR Advisory Council &nbsp;\u00b7&nbsp; salomons.coach\r\n  <\/div>\r\n<\/footer>\r\n\r\n<\/div><!-- \/wrap -->\r\n<\/div><!-- \/compass-shell -->\r\n\r\n<script>\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ DIMENSION DEFINITIONS\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\nconst H_DIMS = [\r\n  {key:'PDI', name:'Power\\nDistance',        desc:'Acceptance of unequal power distribution in institutions and organisations'},\r\n  {key:'IDV', name:'Individualism',          desc:'Degree to which individuals are integrated into groups vs. acting independently'},\r\n  {key:'MAS', name:'Masculinity',            desc:'Distribution of roles between genders; achievement and success vs. care and quality of life'},\r\n  {key:'UAI', name:'Uncertainty\\nAvoidance',  desc:'Tolerance for ambiguity and unstructured situations; need for rules'},\r\n  {key:'LTO', name:'Long-Term\\nOrientation',  desc:'Pragmatic future-orientation vs. normative preservation of the past'},\r\n  {key:'IVR', name:'Indulgence',             desc:'Degree to which people allow gratification of basic human desires'}\r\n];\r\n\r\nconst G_DIMS = [\r\n  {key:'PO',  name:'Performance\\nOrientation', desc:'Encouragement of innovation, high standards, and performance improvement'},\r\n  {key:'AS',  name:'Assertiveness',           desc:'Degree to which people are assertive and confrontational in social relationships'},\r\n  {key:'FO',  name:'Future\\nOrientation',      desc:'Planning, investing in the future, and delaying gratification'},\r\n  {key:'HO',  name:'Humane\\nOrientation',      desc:'Fairness, altruism, generosity, and caring for others'},\r\n  {key:'IC',  name:'Institutional\\nCollectivism', desc:'Encouragement of collective action and collective distribution of resources'},\r\n  {key:'IGC', name:'In-Group\\nCollectivism',   desc:'Pride, loyalty, and cohesiveness in organisations and families'},\r\n  {key:'GE',  name:'Gender\\nEgalitarianism',   desc:'Degree to which gender inequality is minimised'},\r\n  {key:'PD',  name:'Power\\nDistance',          desc:'Degree to which less powerful members accept and expect unequal power'},\r\n  {key:'UA',  name:'Uncertainty\\nAvoidance',   desc:'Reliance on social norms, rules, and procedures to alleviate unpredictability'}\r\n];\r\n\r\nconst W_DIMS = [\r\n  {key:'ts',  name:'Traditional \/\\nSecular-Rational', desc:'Authority from religion\/tradition vs. rational-legal process and expert legitimacy'},\r\n  {key:'ss',  name:'Survival \/\\nSelf-Expression',     desc:'Economic\/physical security vs. voice, tolerance, and subjective wellbeing'},\r\n  {key:'ic',  name:'Institutional\\nConfidence',        desc:'Trust in government, courts, police, and parliament'}\r\n];\r\n\r\nconst S_DIMS = [\r\n  {key:'emb',  name:'Embeddedness',          unique:false, desc:'Deriving meaning from participation in the group; shared goals and identity'},\r\n  {key:'hier', name:'Hierarchy',             unique:false, desc:'Legitimacy of unequal distribution of power, roles, and resources'},\r\n  {key:'mast', name:'Mastery',               unique:false, desc:'Getting ahead through active self-assertion; ambition, success, and daring'},\r\n  {key:'ia',   name:'Intellectual\\nAutonomy', unique:true,  desc:'Cultural encouragement of independent thought, curiosity, and creativity'},\r\n  {key:'aa',   name:'Affective\\nAutonomy',    unique:true,  desc:'Cultural legitimacy of pursuing pleasurable and stimulating experience'},\r\n  {key:'egal', name:'Egalitarianism',        unique:true,  desc:'Transcending self-interest for voluntary commitment to others\\' welfare'},\r\n  {key:'harm', name:'Harmony',               unique:true,  desc:'Fitting into the natural and social order; accepting rather than changing the world'}\r\n];\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ COUNTRY DATA\r\n\/\/ Hofstede h:[PDI,IDV,MAS,UAI,LTO,IVR]\r\n\/\/ GLOBE g:[PO,AS,FO,HO,IC,IGC,GE,PD,UA] raw 1-7\r\n\/\/ WVS w:[trad_sec,surv_self,inst_conf] 0-100\r\n\/\/ Schwartz s:[emb,hier,mast,ia,aa,egal,harm] 0-100\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\nconst C = {\r\n\"AR\":{name:\"Argentina\",     h:[49,46,56,86,20,62], g:[3.65,4.22,3.08,3.99,3.66,5.51,3.49,5.64,3.65], w:[50,54,20], s:[48,46,56,56,62,58,50]},\r\n\"AT\":{name:\"Austria\",       h:[11,55,79,70,60,63], g:[4.44,4.62,4.46,3.72,4.30,4.85,3.09,4.95,5.16], w:[76,80,50], s:[32,24,50,74,66,72,58]},\r\n\"AU\":{name:\"Australia\",     h:[36,90,61,51,21,71], g:[4.36,4.28,4.09,4.28,4.29,4.17,3.40,4.74,4.39], w:[56,86,52], s:[26,22,64,74,74,66,48]},\r\n\"BE\":{name:\"Belgium\",       h:[65,75,54,94,82,57], g:[4.07,4.30,3.95,3.32,4.03,4.24,3.44,4.69,4.56], w:[76,80,40], s:[30,22,46,74,68,74,58]},\r\n\"BR\":{name:\"Brazil\",        h:[69,38,49,76,44,59], g:[4.03,4.20,3.81,3.66,3.83,5.18,3.31,5.33,3.60], w:[42,54,24], s:[56,54,58,50,64,54,52]},\r\n\"CA\":{name:\"Canada\",        h:[39,80,52,48,36,68], g:[4.49,4.05,4.44,4.49,4.38,4.26,3.70,4.82,4.58], w:[58,86,48], s:[26,20,60,74,72,68,52]},\r\n\"CH\":{name:\"Switzerland\",   h:[34,68,70,58,74,66], g:[4.94,3.47,4.73,3.60,4.43,3.97,3.50,4.90,5.37], w:[74,86,68], s:[26,20,50,76,66,76,62]},\r\n\"CL\":{name:\"Chile\",         h:[63,23,28,86,31,68], g:[3.60,3.95,3.47,3.54,3.94,5.51,3.27,5.48,3.71], w:[54,56,28], s:[52,48,54,54,60,56,52]},\r\n\"CN\":{name:\"China\",         h:[80,20,66,30,87,24], g:[4.45,3.76,3.75,4.36,4.77,5.80,3.05,5.04,4.94], w:[70,40,82], s:[78,66,68,44,42,48,66]},\r\n\"CO\":{name:\"Colombia\",      h:[67,13,64,80,13,83], g:[3.94,4.20,3.56,3.72,3.85,5.71,3.16,5.56,3.74], w:[40,46,26], s:[58,52,58,48,60,52,50], est:true},\r\n\"CZ\":{name:\"Czech Republic\",h:[57,58,57,74,70,29], g:[4.05,4.20,3.69,3.28,4.63,3.78,4.44,5.47,3.64], w:[86,74,40], s:[44,38,50,64,60,60,54]},\r\n\"DE\":{name:\"Germany\",       h:[35,67,66,65,83,40], g:[4.25,4.55,4.27,3.40,3.79,3.79,3.10,5.25,5.22], w:[78,78,54], s:[30,22,52,76,66,74,58]},\r\n\"DK\":{name:\"Denmark\",       h:[18,74,16,23,35,70], g:[4.22,3.80,4.44,4.44,4.80,3.53,3.93,3.89,5.22], w:[84,92,76], s:[16,12,38,84,76,90,68]},\r\n\"ES\":{name:\"Spain\",         h:[57,51,42,86,48,44], g:[4.01,4.42,3.51,3.32,3.85,5.45,3.01,5.52,3.97], w:[74,70,34], s:[40,28,44,68,72,68,60]},\r\n\"FI\":{name:\"Finland\",       h:[33,63,26,59,38,57], g:[3.81,3.74,4.24,4.00,4.63,3.90,3.87,4.89,5.02], w:[88,90,70], s:[22,14,44,80,70,86,66]},\r\n\"FR\":{name:\"France\",        h:[68,71,43,86,63,48], g:[4.11,4.13,3.48,3.40,3.93,4.37,3.64,5.28,4.43], w:[66,74,38], s:[34,28,48,72,68,70,54]},\r\n\"GB\":{name:\"United Kingdom\",h:[35,89,66,35,51,69], g:[4.08,4.15,4.28,3.72,4.27,4.08,3.67,5.15,4.65], w:[60,80,44], s:[30,26,58,72,70,68,52]},\r\n\"GR\":{name:\"Greece\",        h:[60,35,57,100,45,50],g:[3.20,4.58,3.40,3.55,3.25,5.27,3.30,5.40,3.39], w:[60,66,28], s:[48,36,48,62,62,60,54]},\r\n\"HK\":{name:\"Hong Kong\",     h:[68,25,57,29,61,17], g:null,                                             w:[74,64,28], s:[66,54,60,54,50,52,62]},\r\n\"HU\":{name:\"Hungary\",       h:[46,80,88,82,58,31], g:[3.43,4.60,3.21,3.35,3.53,5.24,4.08,5.56,3.12], w:[66,56,42], s:[52,42,52,60,56,56,52]},\r\n\"IE\":{name:\"Ireland\",       h:[28,70,68,35,24,65], g:[4.36,3.94,3.98,4.96,4.64,4.96,3.49,5.10,4.30], w:[56,76,46], s:[36,24,50,70,70,70,56]},\r\n\"IL\":{name:\"Israel\",        h:[13,54,47,81,38,57], g:[4.08,4.23,4.11,4.18,4.71,4.70,3.19,4.73,4.01], w:[60,70,42], s:[38,34,70,68,64,62,46]},\r\n\"IN\":{name:\"India\",         h:[77,48,56,40,51,26], g:[4.25,3.73,4.19,4.57,4.38,5.92,2.56,5.47,4.15], w:[38,34,62], s:[76,70,64,44,44,46,58]},\r\n\"IT\":{name:\"Italy\",         h:[50,76,70,75,61,30], g:[4.10,4.07,3.58,3.63,3.68,4.94,3.24,5.43,3.79], w:[66,68,32], s:[42,32,46,66,68,64,56]},\r\n\"JP\":{name:\"Japan\",         h:[54,46,95,92,88,42], g:[4.22,3.59,4.29,4.30,5.19,4.63,3.19,5.11,4.33], w:[92,70,44], s:[74,56,44,54,44,62,80]},\r\n\"KR\":{name:\"South Korea\",   h:[60,18,39,85,100,29],g:[4.55,4.40,3.97,3.81,5.20,5.54,2.50,5.61,3.55], w:[74,60,38], s:[70,60,58,50,46,52,68]},\r\n\"MX\":{name:\"Mexico\",        h:[81,30,69,82,24,97], g:[4.10,4.24,3.87,3.98,4.06,5.71,3.10,5.22,4.18], w:[46,48,28], s:[58,52,62,48,58,52,46]},\r\n\"NL\":{name:\"Netherlands\",   h:[38,80,14,53,67,68], g:[4.32,3.70,4.61,3.86,4.46,3.70,3.55,4.11,4.70], w:[80,86,58], s:[28,18,46,78,72,80,62]},\r\n\"NO\":{name:\"Norway\",        h:[31,69,8,50,35,55],  g:[3.74,3.59,4.56,4.65,4.65,3.60,3.89,4.82,5.44], w:[86,90,74], s:[18,14,40,82,74,88,70]},\r\n\"NZ\":{name:\"New Zealand\",   h:[22,79,58,49,33,75], g:[4.28,3.42,4.28,4.32,4.81,4.00,3.22,4.89,4.76], w:[54,86,56], s:[24,20,60,74,72,68,52]},\r\n\"PL\":{name:\"Poland\",        h:[68,60,64,93,38,29], g:[4.42,4.06,3.11,3.40,4.53,5.52,4.11,5.10,3.62], w:[46,60,44], s:[56,44,54,58,54,56,52]},\r\n\"PT\":{name:\"Portugal\",      h:[63,27,31,99,28,33], g:[3.60,3.40,3.71,3.91,4.10,5.51,3.66,5.44,4.50], w:[60,66,36], s:[44,34,42,64,64,64,60]},\r\n\"RU\":{name:\"Russia\",        h:[93,39,36,95,81,20], g:[3.39,3.68,3.07,3.94,4.50,5.63,3.35,5.52,2.88], w:[70,30,48], s:[64,56,60,50,46,46,44]},\r\n\"SA\":{name:\"Saudi Arabia\",  h:[95,25,60,80,36,52], g:[3.76,3.92,4.11,4.61,3.94,5.35,2.96,5.32,3.90], w:[26,24,72], s:[78,72,54,36,36,38,54], est:true},\r\n\"SE\":{name:\"Sweden\",        h:[31,71,5,29,53,78],  g:[3.72,3.38,4.39,4.10,5.22,3.66,3.84,4.85,5.32], w:[90,94,72], s:[16,12,38,84,76,90,72]},\r\n\"SG\":{name:\"Singapore\",     h:[74,20,48,8,72,46],  g:[4.90,4.17,5.07,4.10,4.90,5.64,3.70,4.99,5.31], w:[66,56,74], s:[62,52,64,58,52,54,58], est:true},\r\n\"TR\":{name:\"Turkey\",        h:[66,37,45,85,46,49], g:[3.83,4.53,3.74,3.94,4.03,5.88,2.89,5.57,3.63], w:[48,34,44], s:[66,58,56,48,50,50,56]},\r\n\"TW\":{name:\"Taiwan\",        h:[58,17,45,69,93,49], g:[4.11,3.92,3.96,4.11,4.59,5.59,3.18,5.18,4.34], w:[76,68,46], s:[68,58,54,52,48,54,70]},\r\n\"US\":{name:\"United States\", h:[40,91,62,46,26,68], g:[4.49,4.32,4.15,4.17,4.20,4.25,3.34,4.88,4.15], w:[46,74,36], s:[30,26,72,70,72,60,42]},\r\n\"ZA\":{name:\"South Africa\",  h:[49,65,63,49,34,63], g:[4.11,4.05,3.62,3.92,4.51,4.71,3.50,4.96,4.06], w:[38,44,26], s:[60,54,60,52,54,52,52]}\r\n};\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ UTILITIES\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\nconst gNorm = v => Math.round((v - 1) \/ 6 * 100);\r\nconst absDiff = (a,b) => Math.abs(a - b);\r\nconst magClass = d => d >= 30 ? 'large' : d >= 15 ? 'moderate' : 'small';\r\nconst magLabel = d => d >= 30 ? 'Large gap' : d >= 15 ? 'Moderate gap' : 'Small gap';\r\n\r\nfunction insightHTML(dimName, gapVal, nameA, nameB) {\r\n  const m = magClass(gapVal);\r\n  const icons = {large:'\u26a0', moderate:'\u26a1', small:'\u2713'};\r\n  const labels = {large:'High-Priority Friction', moderate:'Notable Difference', small:'Low Friction'};\r\n  return `<div class=\"insight-icon\">${icons[m]}<\/div>\r\n  <div><div class=\"insight-lbl\">${labels[m]}<\/div>\r\n  <div class=\"insight-txt\">Largest gap: <strong>${dimName}<\/strong> (\u0394${gapVal}) between ${nameA} and ${nameB}<\/div><\/div>`;\r\n}\r\n\r\nfunction barHTML(sA, sB, name, abbr, unique) {\r\n  const d = absDiff(sA, sB);\r\n  const m = magClass(d);\r\n  const uq = unique ? '<span class=\"uniq\">Unique<\/span>' : '';\r\n  const ab = abbr ? `<span class=\"dim-abbr\">${abbr}<\/span>` : '';\r\n  return `<div class=\"dim-row\">\r\n    <div class=\"dim-top\">\r\n      <div><span class=\"dim-name\">${name}<\/span>${ab}${uq}<\/div>\r\n      <span class=\"gap-badge ${m}\">\u0394 ${d}<\/span>\r\n    <\/div>\r\n    <div class=\"bar-line\">\r\n      <span class=\"bar-let a\">A<\/span>\r\n      <div class=\"bar-track\"><div class=\"bar-fill a\" style=\"width:${sA}%\"><\/div><\/div>\r\n      <span class=\"bar-num a\">${sA}<\/span>\r\n    <\/div>\r\n    <div class=\"bar-line\">\r\n      <span class=\"bar-let b\">B<\/span>\r\n      <div class=\"bar-track\"><div class=\"bar-fill b\" style=\"width:${sB}%\"><\/div><\/div>\r\n      <span class=\"bar-num b\">${sB}<\/span>\r\n    <\/div>\r\n  <\/div>`;\r\n}\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ RENDER FUNCTIONS\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\nfunction renderHofstede(cA, cB) {\r\n  document.getElementById('h-nA').textContent = cA.name;\r\n  document.getElementById('h-nB').textContent = cB.name;\r\n  let html = '', maxG = 0, maxN = '';\r\n  H_DIMS.forEach((d,i) => {\r\n    const sA = cA.h[i], sB = cB.h[i], g = absDiff(sA,sB);\r\n    if (g > maxG) { maxG = g; maxN = d.name; }\r\n    html += barHTML(sA, sB, d.name, d.key, false);\r\n  });\r\n  document.getElementById('h-bars').innerHTML = html;\r\n  document.getElementById('h-insight').innerHTML = insightHTML(maxN, maxG, cA.name, cB.name);\r\n}\r\n\r\nfunction renderGLOBE(cA, cB) {\r\n  document.getElementById('g-nA').textContent = cA.name;\r\n  document.getElementById('g-nB').textContent = cB.name;\r\n  if (!cA.g || !cB.g) {\r\n    document.getElementById('g-bars').innerHTML = '<div class=\"no-data\">GLOBE data not available for one or both selected countries.<\/div>';\r\n    document.getElementById('g-insight').innerHTML = '<div class=\"insight-icon\">\u2014<\/div><div><div class=\"insight-lbl\">No data<\/div><div class=\"insight-txt\">GLOBE data unavailable for this country pair.<\/div><\/div>';\r\n    return;\r\n  }\r\n  let html = '', maxG = 0, maxN = '';\r\n  G_DIMS.forEach((d,i) => {\r\n    const sA = gNorm(cA.g[i]), sB = gNorm(cB.g[i]), g = absDiff(sA,sB);\r\n    if (g > maxG) { maxG = g; maxN = d.name; }\r\n    html += barHTML(sA, sB, d.name, d.key, false);\r\n  });\r\n  document.getElementById('g-bars').innerHTML = html;\r\n  document.getElementById('g-insight').innerHTML = insightHTML(maxN, maxG, cA.name, cB.name);\r\n}\r\n\r\nfunction renderWVS(cA, cB) {\r\n  \/\/ Bars\r\n  let html = '', maxG = 0, maxN = '';\r\n  W_DIMS.forEach((d,i) => {\r\n    const sA = cA.w[i], sB = cB.w[i], g = absDiff(sA,sB);\r\n    if (g > maxG) { maxG = g; maxN = d.name; }\r\n    html += barHTML(sA, sB, d.name, null, false);\r\n  });\r\n  document.getElementById('w-bars').innerHTML = html;\r\n  document.getElementById('w-insight').innerHTML = insightHTML(maxN, maxG, cA.name, cB.name);\r\n  \/\/ Quadrant\r\n  renderQuadrant(cA, cB);\r\n}\r\n\r\nfunction renderQuadrant(cA, cB) {\r\n  const svg = document.getElementById('wvs-svg');\r\n  const x1=70, x2=470, y1=50, y2=420;\r\n  const pw=x2-x1, ph=y2-y1;\r\n  const mx=x1+pw\/2, my=y1+ph\/2;\r\n\r\n  const px = (ss) => x1 + (ss\/100)*pw;\r\n  const py = (ts) => y2 - (ts\/100)*ph;\r\n\r\n  const posA = { x: px(cA.w[1]), y: py(cA.w[0]) };\r\n  const posB = { x: px(cB.w[1]), y: py(cB.w[0]) };\r\n\r\n  \/\/ Label offset logic: push labels away from dot, avoid overlap\r\n  function labelAnchor(x) { return x > mx ? 'start' : 'end'; }\r\n  function lx(x) { return x > mx ? x+13 : x-13; }\r\n\r\n  let out = '';\r\n  \/\/ Grid\r\n  [.25,.5,.75].forEach(t => {\r\n    const gx = x1+t*pw, gy = y1+t*ph;\r\n    out += `<line x1=\"${gx}\" y1=\"${y1}\" x2=\"${gx}\" y2=\"${y2}\" stroke=\"rgba(255,255,255,.05)\" stroke-width=\"1\"\/>`;\r\n    out += `<line x1=\"${x1}\" y1=\"${gy}\" x2=\"${x2}\" y2=\"${gy}\" stroke=\"rgba(255,255,255,.05)\" stroke-width=\"1\"\/>`;\r\n  });\r\n  \/\/ Axes\r\n  out += `<line x1=\"${mx}\" y1=\"${y1}\" x2=\"${mx}\" y2=\"${y2}\" stroke=\"rgba(255,255,255,.18)\" stroke-width=\"1\"\/>`;\r\n  out += `<line x1=\"${x1}\" y1=\"${my}\" x2=\"${x2}\" y2=\"${my}\" stroke=\"rgba(255,255,255,.18)\" stroke-width=\"1\"\/>`;\r\n  \/\/ Axis labels\r\n  out += `<text x=\"${x1-6}\" y=\"${my+4}\" text-anchor=\"end\" fill=\"rgba(232,237,244,.45)\" font-size=\"11\" font-family=\"IBM Plex Sans\">Survival<\/text>`;\r\n  out += `<text x=\"${x2+6}\" y=\"${my+4}\" text-anchor=\"start\" fill=\"rgba(232,237,244,.45)\" font-size=\"11\" font-family=\"IBM Plex Sans\">Self-Expression<\/text>`;\r\n  out += `<text x=\"${mx}\" y=\"${y1-10}\" text-anchor=\"middle\" fill=\"rgba(232,237,244,.45)\" font-size=\"11\" font-family=\"IBM Plex Sans\">Secular-Rational<\/text>`;\r\n  out += `<text x=\"${mx}\" y=\"${y2+18}\" text-anchor=\"middle\" fill=\"rgba(232,237,244,.45)\" font-size=\"11\" font-family=\"IBM Plex Sans\">Traditional<\/text>`;\r\n  \/\/ Quadrant labels\r\n  out += `<text x=\"${x1+8}\" y=\"${y1+18}\" fill=\"rgba(255,255,255,.09)\" font-size=\"10\" font-family=\"IBM Plex Sans\">Secular \/ Survival<\/text>`;\r\n  out += `<text x=\"${x2-8}\" y=\"${y1+18}\" text-anchor=\"end\" fill=\"rgba(255,255,255,.09)\" font-size=\"10\" font-family=\"IBM Plex Sans\">Secular \/ Self-Expression<\/text>`;\r\n  out += `<text x=\"${x1+8}\" y=\"${y2-8}\" fill=\"rgba(255,255,255,.09)\" font-size=\"10\" font-family=\"IBM Plex Sans\">Traditional \/ Survival<\/text>`;\r\n  out += `<text x=\"${x2-8}\" y=\"${y2-8}\" text-anchor=\"end\" fill=\"rgba(255,255,255,.09)\" font-size=\"10\" font-family=\"IBM Plex Sans\">Traditional \/ Self-Expression<\/text>`;\r\n  \/\/ Connecting line\r\n  out += `<line x1=\"${posA.x}\" y1=\"${posA.y}\" x2=\"${posB.x}\" y2=\"${posB.y}\" stroke=\"rgba(255,255,255,.18)\" stroke-width=\"1.5\" stroke-dasharray=\"5,4\"\/>`;\r\n  \/\/ Dots\r\n  out += `<circle cx=\"${posA.x}\" cy=\"${posA.y}\" r=\"9\" fill=\"#c9a84c\" opacity=\".88\"\/>`;\r\n  out += `<circle cx=\"${posB.x}\" cy=\"${posB.y}\" r=\"9\" fill=\"#2a9d8f\" opacity=\".88\"\/>`;\r\n  \/\/ Labels\r\n  out += `<text x=\"${lx(posA.x)}\" y=\"${posA.y+4}\" text-anchor=\"${labelAnchor(posA.x)}\" fill=\"#c9a84c\" font-size=\"12\" font-weight=\"600\" font-family=\"IBM Plex Sans\">${cA.name}<\/text>`;\r\n  out += `<text x=\"${lx(posB.x)}\" y=\"${posB.y+4}\" text-anchor=\"${labelAnchor(posB.x)}\" fill=\"#2a9d8f\" font-size=\"12\" font-weight=\"600\" font-family=\"IBM Plex Sans\">${cB.name}<\/text>`;\r\n\r\n  svg.innerHTML = out;\r\n}\r\n\r\nlet radarChart = null;\r\nlet summaryChart = null;\r\nfunction renderSchwartz(cA, cB) {\r\n  const canvas = document.getElementById('schwartz-canvas');\r\n\r\n  \/\/ Bars\r\n  let html = '', maxG = 0, maxN = '';\r\n  S_DIMS.forEach((d,i) => {\r\n    const sA = cA.s[i], sB = cB.s[i], g = absDiff(sA,sB);\r\n    if (g > maxG) { maxG = g; maxN = d.name; }\r\n    html += barHTML(sA, sB, d.name, null, d.unique);\r\n  });\r\n  document.getElementById('s-bars').innerHTML = html;\r\n  let est = cA.est || cB.est;\r\n  let insightSuffix = est ? ' <span style=\"opacity:.6;font-size:11px\">(one or more scores are regional estimates)<\/span>' : '';\r\n  document.getElementById('s-insight').innerHTML = insightHTML(maxN, maxG, cA.name, cB.name) + insightSuffix;\r\n\r\n  \/\/ Radar\r\n  if (radarChart) { radarChart.destroy(); radarChart = null; }\r\n  radarChart = new Chart(canvas, {\r\n    type: 'radar',\r\n    data: {\r\n      labels: S_DIMS.map(d => d.name),\r\n      datasets: [\r\n        { label: cA.name, data: cA.s,\r\n          borderColor:'#c9a84c', backgroundColor:'rgba(201,168,76,.10)',\r\n          borderWidth:2, pointBackgroundColor:'#c9a84c', pointRadius:4, pointHoverRadius:6 },\r\n        { label: cB.name, data: cB.s,\r\n          borderColor:'#2a9d8f', backgroundColor:'rgba(42,157,143,.10)',\r\n          borderWidth:2, pointBackgroundColor:'#2a9d8f', pointRadius:4, pointHoverRadius:6 }\r\n      ]\r\n    },\r\n    options: {\r\n      responsive:true,\r\n      scales:{ r:{\r\n        min:0, max:100,\r\n        ticks:{ display:false, stepSize:25 },\r\n        grid:{ color:'rgba(255,255,255,.08)' },\r\n        angleLines:{ color:'rgba(255,255,255,.08)' },\r\n        pointLabels:{\r\n            color:'rgba(232,237,244,.72)',\r\n            font:{ family:'IBM Plex Sans', size:10 },\r\n            padding: 12,\r\n            callback: function(label) { return wrapLabel(label, 13); }\r\n          }\r\n      }},\r\n      plugins:{\r\n        legend:{ labels:{ color:'rgba(232,237,244,.8)', font:{ family:'IBM Plex Sans', size:12 }, padding:18 }},\r\n        tooltip:{ backgroundColor:'rgba(8,21,42,.95)', titleColor:'#e8edf4', bodyColor:'rgba(232,237,244,.7)',\r\n          borderColor:'rgba(201,168,76,.3)', borderWidth:1 }\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ CONVERGENCE\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\nconst THEMES = [\r\n  { name:'Power & Authority',\r\n    sub:'Acceptance of hierarchical inequality in organisations and society',\r\n    dims:[\r\n      { fw:'Hofstede', label:'PDI', fn: c => c.h[0] },\r\n      { fw:'GLOBE',    label:'Power Distance', fn: c => c.g ? gNorm(c.g[7]) : null },\r\n      { fw:'WVS',      label:'Traditional\/Secular (inv)', fn: c => 100 - c.w[0] },\r\n      { fw:'Schwartz', label:'Hierarchy', fn: c => c.s[1] }\r\n    ]},\r\n  { name:'Individual vs. Collective',\r\n    sub:'Degree to which individuals derive identity and meaning from the group',\r\n    dims:[\r\n      { fw:'Hofstede', label:'IDV (inv)', fn: c => 100 - c.h[1] },\r\n      { fw:'GLOBE',    label:'In-Group Collectivism', fn: c => c.g ? gNorm(c.g[5]) : null },\r\n      { fw:'Schwartz', label:'Embeddedness', fn: c => c.s[0] }\r\n    ]},\r\n  { name:'Achievement & Mastery',\r\n    sub:'Drive for performance, active self-assertion, and changing the environment',\r\n    dims:[\r\n      { fw:'Hofstede', label:'MAS', fn: c => c.h[2] },\r\n      { fw:'GLOBE',    label:'Performance Orientation', fn: c => c.g ? gNorm(c.g[0]) : null },\r\n      { fw:'Schwartz', label:'Mastery', fn: c => c.s[2] }\r\n    ]},\r\n  { name:'Uncertainty & Structure',\r\n    sub:'Need for rules, procedures, and avoidance of ambiguity',\r\n    dims:[\r\n      { fw:'Hofstede', label:'UAI', fn: c => c.h[3] },\r\n      { fw:'GLOBE',    label:'Uncertainty Avoidance', fn: c => c.g ? gNorm(c.g[8]) : null }\r\n    ]},\r\n  { name:'Future Orientation',\r\n    sub:'Planning ahead, delaying gratification, and investing in the future',\r\n    dims:[\r\n      { fw:'Hofstede', label:'LTO', fn: c => c.h[4] },\r\n      { fw:'GLOBE',    label:'Future Orientation', fn: c => c.g ? gNorm(c.g[2]) : null }\r\n    ]},\r\n  { name:'Voice & Intellectual Autonomy',\r\n    sub:'Safety to speak up; cultural value of independent thought and curiosity',\r\n    dims:[\r\n      { fw:'WVS',      label:'Self-Expression', fn: c => c.w[1] },\r\n      { fw:'Schwartz', label:'Intellectual Autonomy \u2605', fn: c => c.s[3] }\r\n    ]},\r\n  { name:'Social Care & Egalitarianism',\r\n    sub:'Concern for others\\' welfare; fairness, generosity, and human orientation',\r\n    dims:[\r\n      { fw:'GLOBE',    label:'Humane Orientation', fn: c => c.g ? gNorm(c.g[3]) : null },\r\n      { fw:'Schwartz', label:'Egalitarianism \u2605', fn: c => c.s[5] }\r\n    ]},\r\n  { name:'Harmony',\r\n    sub:'Fitting into the social and natural order \u2014 unique to Schwartz, absent from Hofstede & GLOBE',\r\n    dims:[\r\n      { fw:'Schwartz', label:'Harmony \u2605', fn: c => c.s[6] }\r\n    ]},\r\n  { name:'Institutional Trust',\r\n    sub:'Trust in government, courts, and major institutions \u2014 unique to WVS',\r\n    dims:[\r\n      { fw:'WVS', label:'Institutional Confidence \u2605', fn: c => c.w[2] }\r\n    ]}\r\n];\r\n\r\nfunction renderConvergence(cA, cB) {\r\n  let maxTheme = '', maxGap = 0;\r\n  const rows = [];\r\n\r\n  THEMES.forEach(theme => {\r\n    const sigs = [];\r\n    let totalGap = 0, count = 0, maxThemeGap = 0, maxThemeDimLabel = '';\r\n\r\n    theme.dims.forEach(d => {\r\n      const vA = d.fn(cA), vB = d.fn(cB);\r\n      if (vA == null || vB == null) return;\r\n      const g = absDiff(vA, vB);\r\n      const m = magClass(g);\r\n      sigs.push('<span class=\"csig ' + m + '\">' + d.fw + ': ' + d.label + ' \\u0394' + g + '<\/span>');\r\n      totalGap += g;\r\n      count++;\r\n      if (g > maxThemeGap) { maxThemeGap = g; maxThemeDimLabel = d.label; }\r\n    });\r\n\r\n    if (count === 0) return;\r\n\r\n    if (maxThemeGap > maxGap) { maxGap = maxThemeGap; maxTheme = theme.name + ' \\u2014 ' + maxThemeDimLabel; }\r\n\r\n    rows.push({ maxThemeGap, theme, sigs });\r\n  });\r\n\r\n  \/\/ Sort by biggest individual delta, highest first\r\n  rows.sort((a, b) => b.maxThemeGap - a.maxThemeGap);\r\n\r\n  const html = rows.map(function(r) {\r\n    const tl = r.maxThemeGap >= 30 ? {cls:'red', icon:'\u26a0'} :\r\n               r.maxThemeGap >= 15 ? {cls:'amber', icon:'\u26a1'} :\r\n                                     {cls:'green', icon:'\u2713'};\r\n    return '<div class=\"conv-row\"><div class=\"conv-left\">' +\r\n      '<div class=\"conv-theme\">' + r.theme.name + '<\/div>' +\r\n      '<div class=\"conv-sub\">' + r.theme.sub + '<\/div>' +\r\n      '<div class=\"conv-sigs\">' + r.sigs.join('') + '<\/div>' +\r\n      '<\/div><div class=\"tl ' + tl.cls + '\">' + tl.icon + '<\/div><\/div>';\r\n  }).join('');\r\n\r\n  document.getElementById('c-grid').innerHTML = html;\r\n  document.getElementById('c-insight').innerHTML = insightHTML(maxTheme, maxGap, cA.name, cB.name);\r\n}\r\n\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ SUMMARY RADAR \u2014 dimensions of the active tab\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\nlet activeTab = 'hofstede'; \/\/ tracks current tab\r\n\r\n\/\/ Per-framework axis definitions\r\nconst RADAR_CONFIGS = {\r\n\r\n  hofstede: {\r\n    note: 'Hofstede \u00b7 Six cultural dimensions \u00b7 0\u2013100 scale',\r\n    axes: H_DIMS.map((d, i) => ({\r\n      label: d.name,\r\n      fnA: c => c.h[i],\r\n      fnB: c => c.h[i]\r\n    }))\r\n  },\r\n\r\n  globe: {\r\n    note: 'GLOBE \u00b7 Nine societal practice dimensions \u00b7 Normalised to 0\u2013100',\r\n    axes: G_DIMS.map((d, i) => ({\r\n      label: d.name,\r\n      fnA: c => c.g ? gNorm(c.g[i]) : null,\r\n      fnB: c => c.g ? gNorm(c.g[i]) : null\r\n    }))\r\n  },\r\n\r\n  wvs: {\r\n    note: 'World Values Survey \u00b7 Three dimensions \u00b7 Wave 7 (2017\u20132022) \u00b7 0\u2013100 scale',\r\n    axes: W_DIMS.map((d, i) => ({\r\n      label: d.name,\r\n      fnA: c => c.w[i],\r\n      fnB: c => c.w[i]\r\n    }))\r\n  },\r\n\r\n  schwartz: {\r\n    note: 'Schwartz \u00b7 Seven cultural value orientations \u00b7 0\u2013100 scale',\r\n    axes: S_DIMS.map((d, i) => ({\r\n      label: d.name + (d.unique ? ' \u2605' : ''),\r\n      fnA: c => c.s[i],\r\n      fnB: c => c.s[i]\r\n    }))\r\n  },\r\n\r\n  conv: {\r\n    note: 'Convergence \u00b7 Nine themes \u00b7 Composite scores across all four frameworks',\r\n    axes: [\r\n      { label: 'Power &\\nAuthority',        fnA: c => avg([c.h[0], c.g?gNorm(c.g[7]):null, 100-c.w[0], c.s[1]]) },\r\n      { label: 'Individual vs\\nCollective', fnA: c => avg([100-c.h[1], c.g?gNorm(c.g[5]):null, c.s[0]]) },\r\n      { label: 'Achievement\\n& Mastery',    fnA: c => avg([c.h[2], c.g?gNorm(c.g[0]):null, c.s[2]]) },\r\n      { label: 'Uncertainty\\n& Structure',  fnA: c => avg([c.h[3], c.g?gNorm(c.g[8]):null]) },\r\n      { label: 'Future\\nOrientation',       fnA: c => avg([c.h[4], c.g?gNorm(c.g[2]):null]) },\r\n      { label: 'Voice &\\nAutonomy',         fnA: c => avg([c.w[1], c.s[3]]) },\r\n      { label: 'Social Care &\\nEgal.',      fnA: c => avg([c.g?gNorm(c.g[3]):null, c.s[5]]) },\r\n      { label: 'Harmony',                    fnA: c => c.s[6] },\r\n      { label: 'Institutional\\nTrust',      fnA: c => c.w[2] }\r\n    ].map(a => ({ label: a.label, fnA: a.fnA, fnB: a.fnA }))\r\n  }\r\n};\r\n\r\nfunction avg(vals) {\r\n  const v = vals.filter(x => x !== null && x !== undefined);\r\n  if (!v.length) return 0;\r\n  return Math.round(v.reduce((a,b) => a+b, 0) \/ v.length);\r\n}\r\n\r\n\/\/ Universal label wrapper \u2014 splits on \\n then word-wraps at maxChars\r\nfunction wrapLabel(str, maxChars) {\r\n  maxChars = maxChars || 13;\r\n  const lines = [];\r\n  str.split('\\n').forEach(function(segment) {\r\n    const words = segment.split(' ');\r\n    let line = '';\r\n    words.forEach(function(w) {\r\n      if ((line + (line ? ' ' : '') + w).length > maxChars && line) {\r\n        lines.push(line);\r\n        line = w;\r\n      } else {\r\n        line = line ? line + ' ' + w : w;\r\n      }\r\n    });\r\n    if (line) lines.push(line);\r\n  });\r\n  return lines.length === 1 ? lines[0] : lines;\r\n}\r\n\r\nfunction renderSummaryRadar(cA, cB) {\r\n  document.getElementById('sum-nameA').textContent = cA.name;\r\n  document.getElementById('sum-nameB').textContent = cB.name;\r\n\r\n  const cfg = RADAR_CONFIGS[activeTab];\r\n  if (!cfg) return;\r\n\r\n  \/\/ Update note text\r\n  document.querySelector('.summary-note').textContent = cfg.note;\r\n\r\n  const labels  = cfg.axes.map(a => a.label);\r\n  const scoresA = cfg.axes.map(a => { const v = a.fnA(cA); return v === null || v === undefined ? 0 : v; });\r\n  const scoresB = cfg.axes.map(a => { const v = a.fnB(cB); return v === null || v === undefined ? 0 : v; });\r\n\r\n  const canvas = document.getElementById('summary-canvas');\r\n  if (summaryChart) { summaryChart.destroy(); summaryChart = null; }\r\n\r\n  summaryChart = new Chart(canvas, {\r\n    type: 'radar',\r\n    data: {\r\n      labels,\r\n      datasets: [\r\n        {\r\n          label: cA.name,\r\n          data: scoresA,\r\n          borderColor: '#c9a84c',\r\n          backgroundColor: 'rgba(201,168,76,.12)',\r\n          borderWidth: 2.5,\r\n          pointBackgroundColor: '#c9a84c',\r\n          pointBorderColor: '#08152a',\r\n          pointBorderWidth: 2,\r\n          pointRadius: 5,\r\n          pointHoverRadius: 7,\r\n          tension: 0.1\r\n        },\r\n        {\r\n          label: cB.name,\r\n          data: scoresB,\r\n          borderColor: '#2a9d8f',\r\n          backgroundColor: 'rgba(42,157,143,.12)',\r\n          borderWidth: 2.5,\r\n          pointBackgroundColor: '#2a9d8f',\r\n          pointBorderColor: '#08152a',\r\n          pointBorderWidth: 2,\r\n          pointRadius: 5,\r\n          pointHoverRadius: 7,\r\n          tension: 0.1\r\n        }\r\n      ]\r\n    },\r\n    options: {\r\n      responsive: true,\r\n      animation: { duration: 400 },\r\n      layout: { padding: { top: 22, bottom: 22, left: 22, right: 22 } },\r\n      scales: {\r\n        r: {\r\n          min: 0, max: 100,\r\n          ticks: {\r\n            display: true,\r\n            stepSize: 25,\r\n            color: 'rgba(232,237,244,.25)',\r\n            font: { family: 'IBM Plex Sans', size: 9 },\r\n            backdropColor: 'transparent'\r\n          },\r\n          grid:        { color: 'rgba(255,255,255,.07)' },\r\n          angleLines:  { color: 'rgba(255,255,255,.10)' },\r\n          pointLabels: {\r\n            color: 'rgba(232,237,244,.72)',\r\n            font: { family: 'IBM Plex Sans', size: 10 },\r\n            padding: 14,\r\n            callback: function(label) { return wrapLabel(label, 13); }\r\n          }\r\n        }\r\n      },\r\n      plugins: {\r\n        legend: { display: false },\r\n        tooltip: {\r\n          backgroundColor: 'rgba(8,21,42,.96)',\r\n          titleColor: '#e8edf4',\r\n          bodyColor: 'rgba(232,237,244,.75)',\r\n          borderColor: 'rgba(201,168,76,.3)',\r\n          borderWidth: 1,\r\n          padding: 10,\r\n          callbacks: {\r\n            label: function(ctx) {\r\n              const gap = Math.abs(scoresA[ctx.dataIndex] - scoresB[ctx.dataIndex]);\r\n              return ' ' + ctx.dataset.label + ': ' + ctx.raw + '  (\u0394' + gap + ')';\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ PDF DOWNLOAD - fully data-driven, no html2canvas for text\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\n\/\/ \u2500\u2500 Colour palette (dark on white) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nconst PDF = {\r\n  \/\/ Layout\r\n  PW: 210, PH: 297,\r\n  ML: 14, MR: 14, MT: 14, MB: 40,\r\n  \/\/ Colours\r\n  WHITE:   [255,255,255],\r\n  BGLIGHT: [242,245,249],\r\n  BGCARD:  [248,250,253],\r\n  NAVY:    [10, 22, 40],\r\n  DARK:    [20, 40, 80],\r\n  MID:     [44, 95,138],\r\n  MUTED:   [90,120,155],\r\n  GOLD:    [122, 82,  0],\r\n  GOLDBDR: [201,168, 76],\r\n  TEAL:    [ 12,104, 96],\r\n  TEALBDR: [ 42,157,143],\r\n  RED:     [139, 26, 26],\r\n  REDBG:   [253,234,234],\r\n  REDBDR:  [192, 48, 48],\r\n  AMBG:    [253,243,224],\r\n  AMBDR:   [192,128,  0],\r\n  AMBER:   [122, 69,  0],\r\n  GRMBG:   [232,245,244],\r\n  GRMBDR:  [ 12,104, 96],\r\n};\r\n\r\n\/\/ \u2500\u2500 Safe string - strips chars outside Latin-1 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction safeStr(s) {\r\n  return String(s).replace(\/[^\\x00-\\xFF]\/g, '-');\r\n}\r\n\r\n\/\/ \u2500\u2500 jsPDF helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction pdfSetup() {\r\n  const { jsPDF } = window.jspdf;\r\n  const pdf = new jsPDF({ orientation:'p', unit:'mm', format:'a4' });\r\n  const CW = PDF.PW - PDF.ML - PDF.MR;\r\n  return { pdf, CW };\r\n}\r\n\r\nfunction fill(pdf, rgb) { pdf.setFillColor(rgb[0],rgb[1],rgb[2]); }\r\nfunction stroke(pdf, rgb, lw) {\r\n  pdf.setDrawColor(rgb[0],rgb[1],rgb[2]);\r\n  if (lw !== undefined) pdf.setLineWidth(lw);\r\n}\r\nfunction txt(pdf, rgb, sz, bold) {\r\n  pdf.setTextColor(rgb[0],rgb[1],rgb[2]);\r\n  pdf.setFontSize(sz);\r\n  pdf.setFont('helvetica', bold ? 'bold' : 'normal');\r\n}\r\n\r\n\/\/ \u2500\u2500 Header (drawn once per page) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction pdfHeader(pdf, CW) {\r\n  fill(pdf, PDF.BGLIGHT); pdf.rect(0, 0, PDF.PW, 23, 'F');\r\n  stroke(pdf, PDF.GOLDBDR, 0.6); pdf.line(0, 23, PDF.PW, 23);\r\n  txt(pdf, PDF.GOLD, 9, true);\r\n  pdf.text('SALOMONS.COACH', PDF.ML, 10);\r\n  txt(pdf, PDF.DARK, 7, false);\r\n  pdf.text('CROSS-CULTURAL LEADERSHIP COMPASS', PDF.ML, 17);\r\n  const d = new Date().toLocaleDateString('en-GB',{day:'2-digit',month:'short',year:'numeric'});\r\n  txt(pdf, PDF.MID, 7, false);\r\n  pdf.text(d, PDF.PW - PDF.MR, 10, {align:'right'});\r\n  txt(pdf, PDF.GOLD, 7, false);\r\n  pdf.text('salomons.coach', PDF.PW - PDF.MR, 17, {align:'right'});\r\n}\r\n\r\n\/\/ \u2500\u2500 Footer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction pdfFooter(pdf, nameA, nameB) {\r\n  const fy = PDF.PH - PDF.MB;\r\n  const year = new Date().getFullYear();\r\n  fill(pdf, PDF.BGLIGHT); pdf.rect(0, fy-2, PDF.PW, PDF.MB+2, 'F');\r\n  stroke(pdf, PDF.GOLDBDR, 0.4); pdf.line(0, fy-2, PDF.PW, fy-2);\r\n  txt(pdf, PDF.NAVY, 8, true);  pdf.text('Salomons.Coach', PDF.ML, fy+5); \/\/ brand name - ASCII safe\r\n  txt(pdf, PDF.DARK, 8, false); pdf.text('-  Cross-Cultural Leadership Compass', PDF.ML+32, fy+5);\r\n  txt(pdf, PDF.GOLD, 8, true);\r\n  pdf.textWithLink('www.salomons.coach', PDF.PW-PDF.MR, fy+5, {align:'right', url:'https:\/\/salomons.coach'});\r\n  txt(pdf, PDF.DARK, 7, false);\r\n  pdf.text(safeStr(nameA)+' x '+safeStr(nameB)+'  -  Country scores are national averages - not individual predictions.', PDF.ML, fy+12);\r\n  txt(pdf, PDF.MID, 6.5, false);\r\n  pdf.text('Sources: Hofstede Insights  -  GLOBE: House et al. (2004)  -  WVS Wave 7 (2022)  -  Schwartz (2006), Comparative Sociology', PDF.ML, fy+19);\r\n  txt(pdf, PDF.NAVY, 7, true);\r\n  pdf.text('(c) '+year+' J.K. Salomons Holding B.V.  -  All rights reserved.', PDF.ML, fy+26);\r\n  txt(pdf, PDF.MID, 6.5, false);\r\n  pdf.text('Reproduction requires written permission from J.K. Salomons Holding B.V. Generated at salomons.coach.', PDF.ML, fy+33);\r\n}\r\n\r\n\/\/ \u2500\u2500 Title block \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction pdfTitle(pdf, CW, nameA, nameB, frameworkLabel) {\r\n  let y = 31;\r\n  txt(pdf, PDF.NAVY, 16, true);\r\n  pdf.text(safeStr(nameA) + '  x  ' + safeStr(nameB), PDF.ML, y); y += 7;\r\n  txt(pdf, PDF.MID, 10, false);\r\n  pdf.text(frameworkLabel, PDF.ML, y); y += 5;\r\n  stroke(pdf, PDF.GOLDBDR, 0.35); pdf.line(PDF.ML, y, PDF.PW-PDF.MR, y); y += 7;\r\n  return y;\r\n}\r\n\r\n\/\/ \u2500\u2500 Insight card \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction pdfInsight(pdf, CW, y, icon, label, text) {\r\n  \/\/ Strip non-Latin1 chars from text for safe rendering\r\n  const safeText = text.replace(\/[^\\x00-\\xFF]\/g, '?');\r\n  const safeIcon = icon.replace(\/[^\\x00-\\xFF]\/g, '');\r\n  const safeLbl  = label.replace(\/[^\\x00-\\xFF]\/g, '').toUpperCase();\r\n\r\n  \/\/ Measure text height first\r\n  txt(pdf, PDF.NAVY, 8, false);\r\n  const lines = pdf.splitTextToSize((safeIcon ? safeIcon+'  ' : '') + safeText, CW - 8);\r\n  const textH = lines.length * 4.5;\r\n  const h = Math.max(16, 8 + textH + 3);\r\n\r\n  fill(pdf, [253,248,238]); stroke(pdf, PDF.GOLDBDR, 0.4);\r\n  pdf.roundedRect(PDF.ML, y, CW, h, 1.5, 1.5, 'FD');\r\n\r\n  txt(pdf, PDF.GOLD, 7.5, true);\r\n  pdf.text(safeLbl, PDF.ML+4, y+5.5);\r\n\r\n  txt(pdf, PDF.NAVY, 8, false);\r\n  pdf.text(lines, PDF.ML+4, y+11);\r\n\r\n  return y + h + 4;\r\n}\r\n\r\n\/\/ \u2500\u2500 Country name bar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction pdfNames(pdf, CW, y, nameA, nameB) {\r\n  txt(pdf, PDF.GOLD, 13, true); pdf.text(safeStr(nameA), PDF.ML, y);\r\n  txt(pdf, PDF.TEAL, 13, true); pdf.text(safeStr(nameB), PDF.PW-PDF.MR, y, {align:'right'});\r\n  return y + 6;\r\n}\r\n\r\n\/\/ \u2500\u2500 Single dimension bar row \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction pdfBarRow(pdf, CW, y, name, abbr, sA, sB, unique) {\r\n  const ROW_H = 17;\r\n  const BAR_Y_A = y + 5;\r\n  const BAR_Y_B = y + 10;\r\n  const BAR_H = 3.5;\r\n  const LABEL_W = 52;\r\n  const BAR_X = PDF.ML + LABEL_W + 2;\r\n  const BAR_W = CW - LABEL_W - 22;\r\n  const NUM_X = BAR_X + BAR_W + 2;\r\n\r\n  \/\/ Separator line\r\n  stroke(pdf, [220,228,238], 0.2); pdf.line(PDF.ML, y, PDF.PW-PDF.MR, y);\r\n\r\n  \/\/ Dimension name\r\n  txt(pdf, PDF.NAVY, 8, false);\r\n  const label = name + (abbr ? ' ('+abbr+')' : '') + (unique ? ' *' : '');\r\n  pdf.text(label, PDF.ML, y + 7);\r\n\r\n  \/\/ Gap badge\r\n  const gap = Math.abs(sA - sB);\r\n  const [bgRgb, fgRgb, bdrRgb] = gap >= 30\r\n    ? [PDF.REDBG, PDF.RED, PDF.REDBDR]\r\n    : gap >= 15\r\n    ? [PDF.AMBG, PDF.AMBER, PDF.AMBDR]\r\n    : [PDF.GRMBG, PDF.TEAL, PDF.GRMBDR];\r\n  const badgeW = 16, badgeH = 5, badgeX = PDF.PW - PDF.MR - badgeW;\r\n  fill(pdf, bgRgb); stroke(pdf, bdrRgb, 0.25);\r\n  pdf.roundedRect(badgeX, y+2.5, badgeW, badgeH, 1, 1, 'FD');\r\n  txt(pdf, fgRgb, 6.5, true);\r\n  pdf.text(gap, badgeX + badgeW\/2, y+6.3, {align:'center'});\r\n\r\n  \/\/ Bar track A\r\n  fill(pdf, [220,228,238]); pdf.rect(BAR_X, BAR_Y_A, BAR_W, BAR_H, 'F');\r\n  fill(pdf, [201,168,76]);  pdf.rect(BAR_X, BAR_Y_A, BAR_W * sA\/100, BAR_H, 'F');\r\n  txt(pdf, PDF.GOLD, 7, true); pdf.text('A', BAR_X - 4, BAR_Y_A + 3, {align:'right'});\r\n  txt(pdf, PDF.GOLD, 7.5, true); pdf.text(String(sA), NUM_X, BAR_Y_A + 3);\r\n\r\n  \/\/ Bar track B\r\n  fill(pdf, [220,228,238]); pdf.rect(BAR_X, BAR_Y_B, BAR_W, BAR_H, 'F');\r\n  fill(pdf, [42,157,143]);  pdf.rect(BAR_X, BAR_Y_B, BAR_W * sB\/100, BAR_H, 'F');\r\n  txt(pdf, PDF.TEAL, 7, true); pdf.text('B', BAR_X - 4, BAR_Y_B + 3, {align:'right'});\r\n  txt(pdf, PDF.TEAL, 7.5, true); pdf.text(String(sB), NUM_X, BAR_Y_B + 3);\r\n\r\n  return y + ROW_H;\r\n}\r\n\r\n\/\/ \u2500\u2500 Convergence row \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction pdfConvRow(pdf, CW, y, theme, sub, sigs, maxGap) {\r\n  const H = 18 + (Math.ceil(sigs.length \/ 3) * 5);\r\n  \/\/ tlColor = RGB array for stroke\/fill; tlSymbol = ASCII char shown inside circle\r\n  const [bgRgb, tlColor, tlSymbol] = maxGap >= 30\r\n    ? [PDF.REDBG,  PDF.REDBDR, '!']\r\n    : maxGap >= 15\r\n    ? [PDF.AMBG,   PDF.AMBDR,  '~']\r\n    : [[235,248,246], PDF.GRMBDR, 'v'];\r\n  const tlTextColor = maxGap >= 30 ? PDF.RED : maxGap >= 15 ? PDF.AMBER : PDF.TEAL;\r\n\r\n  \/\/ Row background\r\n  fill(pdf, bgRgb); stroke(pdf, [210,220,232], 0.2);\r\n  pdf.roundedRect(PDF.ML, y, CW, H, 1.5, 1.5, 'FD');\r\n\r\n  \/\/ Traffic light circle\r\n  fill(pdf, [255,255,255]); stroke(pdf, tlColor, 0.4);\r\n  pdf.circle(PDF.PW - PDF.MR - 5, y + H\/2, 4, 'FD');\r\n  txt(pdf, tlTextColor, 9, true);\r\n  pdf.text(tlSymbol, PDF.PW - PDF.MR - 5, y + H\/2 + 2, {align:'center'});\r\n\r\n  \/\/ Theme title\r\n  txt(pdf, PDF.NAVY, 8.5, true);\r\n  pdf.text(theme, PDF.ML + 3, y + 6);\r\n\r\n  \/\/ Sub label\r\n  txt(pdf, PDF.MID, 7, false);\r\n  pdf.text(sub, PDF.ML + 3, y + 11);\r\n\r\n  \/\/ Sig pills\r\n  let sx = PDF.ML + 3, sy = y + 15;\r\n  sigs.forEach(function(s) {\r\n    const [bgS, fgS] = s.sev === 'large'    ? [PDF.REDBG, PDF.RED]\r\n                     : s.sev === 'moderate' ? [PDF.AMBG, PDF.AMBER]\r\n                     : [PDF.GRMBG, PDF.TEAL];\r\n    const pillW = Math.min(pdf.getStringUnitWidth(s.label)*7\/pdf.internal.scaleFactor + 4, 58);\r\n    if (sx + pillW > PDF.PW - PDF.MR - 14) { sx = PDF.ML + 3; sy += 5; }\r\n    fill(pdf, bgS); stroke(pdf, fgS, 0.2);\r\n    pdf.roundedRect(sx, sy, pillW, 4, 1, 1, 'FD');\r\n    txt(pdf, fgS, 5.5, false);\r\n    pdf.text(s.label, sx + pillW\/2, sy + 3, {align:'center'});\r\n    sx += pillW + 2;\r\n  });\r\n\r\n  return y + H + 3;\r\n}\r\n\r\n\/\/ \u2500\u2500 Radar canvas capture \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nasync function pdfRadar(pdf, CW, y) {\r\n  const canvas = document.getElementById('summary-canvas');\r\n  if (!canvas || !summaryChart) return y;\r\n\r\n  try {\r\n    \/\/ \u2500\u2500 Step 1: capture current chart data \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n    const origData = summaryChart.data;\r\n    const origOpts = summaryChart.options;\r\n    const labels   = origData.labels;\r\n    const dsA      = origData.datasets[0];\r\n    const dsB      = origData.datasets[1];\r\n    const cfg      = RADAR_CONFIGS[activeTab];\r\n\r\n    \/\/ \u2500\u2500 Step 2: rebuild chart with light-theme colours \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n    summaryChart.destroy();\r\n    summaryChart = null;\r\n\r\n    const lightChart = new Chart(canvas, {\r\n      type: 'radar',\r\n      data: {\r\n        labels,\r\n        datasets: [\r\n          {\r\n            label: dsA.label,\r\n            data: dsA.data,\r\n            borderColor: '#7a5200',\r\n            backgroundColor: 'rgba(122,82,0,.10)',\r\n            borderWidth: 2.5,\r\n            pointBackgroundColor: '#7a5200',\r\n            pointBorderColor: '#ffffff',\r\n            pointBorderWidth: 1.5,\r\n            pointRadius: 4,\r\n            tension: 0.1\r\n          },\r\n          {\r\n            label: dsB.label,\r\n            data: dsB.data,\r\n            borderColor: '#0c6860',\r\n            backgroundColor: 'rgba(12,104,96,.10)',\r\n            borderWidth: 2.5,\r\n            pointBackgroundColor: '#0c6860',\r\n            pointBorderColor: '#ffffff',\r\n            pointBorderWidth: 1.5,\r\n            pointRadius: 4,\r\n            tension: 0.1\r\n          }\r\n        ]\r\n      },\r\n      options: {\r\n        responsive: false,\r\n        animation: false,\r\n        layout: { padding: { top: 28, bottom: 28, left: 28, right: 28 } },\r\n        scales: {\r\n          r: {\r\n            min: 0, max: 100,\r\n            ticks: {\r\n              display: true,\r\n              stepSize: 25,\r\n              color: '#4a6e8a',\r\n              font: { family: 'Arial', size: 9 },\r\n              backdropColor: 'rgba(242,245,249,0.8)'\r\n            },\r\n            grid:       { color: 'rgba(0,0,0,.12)' },\r\n            angleLines: { color: 'rgba(0,0,0,.18)' },\r\n            pointLabels: {\r\n              color: '#0a1628',\r\n              font: { family: 'Arial', size: 10, weight: '600' },\r\n              padding: 14,\r\n              callback: function(label) { return wrapLabel(label, 13); }\r\n            }\r\n          }\r\n        },\r\n        plugins: {\r\n          legend: { display: false },\r\n          tooltip: { enabled: false }\r\n        }\r\n      }\r\n    });\r\n\r\n    \/\/ \u2500\u2500 Step 3: paint white background onto a new canvas \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n    await new Promise(r => setTimeout(r, 120)); \/\/ let Chart.js render\r\n    const offscreen = document.createElement('canvas');\r\n    offscreen.width  = canvas.width;\r\n    offscreen.height = canvas.height;\r\n    const ctx = offscreen.getContext('2d');\r\n    ctx.fillStyle = '#ffffff';\r\n    ctx.fillRect(0, 0, offscreen.width, offscreen.height);\r\n    ctx.drawImage(canvas, 0, 0);\r\n\r\n    \/\/ \u2500\u2500 Step 4: add legend manually \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n    const legY = offscreen.height - 22;\r\n    const legX = offscreen.width \/ 2 - 80;\r\n    ctx.font = 'bold 13px Arial';\r\n    ctx.fillStyle = '#7a5200';\r\n    ctx.beginPath(); ctx.arc(legX, legY, 5, 0, Math.PI*2); ctx.fill();\r\n    ctx.fillText(dsA.label, legX + 10, legY + 4);\r\n    ctx.fillStyle = '#0c6860';\r\n    ctx.beginPath(); ctx.arc(legX + 100, legY, 5, 0, Math.PI*2); ctx.fill();\r\n    ctx.fillText(dsB.label, legX + 110, legY + 4);\r\n\r\n    const img = offscreen.toDataURL('image\/png');\r\n\r\n    \/\/ \u2500\u2500 Step 5: restore dark chart \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n    lightChart.destroy();\r\n    const cA = C[document.getElementById('selA').value];\r\n    const cB = C[document.getElementById('selB').value];\r\n    renderSummaryRadar(cA, cB);\r\n\r\n    \/\/ \u2500\u2500 Step 6: add to PDF - fill full content width \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n    const aspect = offscreen.height \/ offscreen.width;\r\n    const rW = CW;                  \/\/ always fill the content width\r\n    const rH = rW * aspect;         \/\/ height from natural aspect ratio\r\n    const rX = PDF.ML;\r\n\r\n    stroke(pdf, [200,215,230], 0.3);\r\n    pdf.roundedRect(PDF.ML, y-1, CW, rH+4, 2, 2, 'D');\r\n    pdf.addImage(img, 'PNG', rX, y, rW, rH);\r\n    txt(pdf, PDF.MUTED, 6.5, false);\r\n    pdf.text('Cultural Profile Radar  -  ' + (cfg ? cfg.note : 'All four frameworks'), PDF.ML+CW\/2, y+rH+5, {align:'center'});\r\n    return y + rH + 10;\r\n\r\n  } catch(e) {\r\n    console.warn('Radar capture failed:', e);\r\n    return y;\r\n  }\r\n}\r\n\r\n\/\/ \u2500\u2500 Page break helper \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction checkPageBreak(pdf, y, needed, nameA, nameB, CW) {\r\n  if (y + needed > PDF.PH - PDF.MB - 4) {\r\n    pdfFooter(pdf, nameA, nameB);\r\n    pdf.addPage();\r\n    fill(pdf, PDF.WHITE); pdf.rect(0,0,PDF.PW,PDF.PH,'F');\r\n    pdfHeader(pdf, CW);\r\n    return PDF.MT + 14;\r\n  }\r\n  return y;\r\n}\r\n\r\n\/\/ \u2500\u2500 MAIN DOWNLOAD FUNCTION \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nasync function downloadPDF(tabId) {\r\n  const btn = document.getElementById('dl-' + tabId);\r\n  const btnSpan = btn.querySelector('span');\r\n  const btnIcon = btn.querySelector('svg');\r\n  btn.classList.add('loading');\r\n  btnSpan.textContent = 'Generating\\u2026';\r\n  if (btnIcon) btnIcon.style.display = 'none';\r\n  const spinner = document.createElement('div');\r\n  spinner.className = 'spinner';\r\n  btn.insertBefore(spinner, btn.firstChild);\r\n\r\n  await new Promise(r => setTimeout(r, 60));\r\n\r\n  try {\r\n    const { pdf, CW } = pdfSetup();\r\n    const kA = document.getElementById('selA').value;\r\n    const kB = document.getElementById('selB').value;\r\n    const cA = C[kA], cB = C[kB];\r\n    const nameA = cA.name, nameB = cB.name;\r\n\r\n    const TAB_LABELS = {\r\n      hofstede: \"Hofstede's Cultural Dimensions\",\r\n      globe:    'GLOBE Study - Nine Societal Practice Dimensions',\r\n      wvs:      'World Values Survey - Inglehart-Welzel Cultural Map',\r\n      schwartz: 'Schwartz Cultural Value Orientations',\r\n      conv:     'Cross-Framework Convergence'\r\n    };\r\n\r\n    \/\/ \u2500\u2500 Page background + header \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n    fill(pdf, PDF.WHITE); pdf.rect(0,0,PDF.PW,PDF.PH,'F');\r\n    pdfHeader(pdf, CW);\r\n\r\n    let y = pdfTitle(pdf, CW, nameA, nameB, TAB_LABELS[tabId] || tabId);\r\n\r\n    \/\/ \u2500\u2500 Radar from canvas \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n    y = await pdfRadar(pdf, CW, y);\r\n\r\n    \/\/ Separator\r\n    stroke(pdf, [210,220,232], 0.25);\r\n    pdf.line(PDF.ML, y, PDF.PW-PDF.MR, y); y += 6;\r\n\r\n    \/\/ \u2500\u2500 Framework label strip \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n    fill(pdf, PDF.BGCARD); stroke(pdf, [210,220,232], 0.2);\r\n    pdf.roundedRect(PDF.ML, y, CW, 8, 1, 1, 'FD');\r\n    txt(pdf, PDF.GOLD, 7, true);\r\n    pdf.text((TAB_LABELS[tabId]||tabId).toUpperCase(), PDF.ML + CW\/2, y+5.5, {align:'center'});\r\n    y += 12;\r\n\r\n    \/\/ \u2500\u2500 Country names \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n    y = pdfNames(pdf, CW, y, nameA, nameB);\r\n\r\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n    \/\/ PER-TAB CONTENT\r\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\n    if (tabId === 'hofstede') {\r\n      \/\/ Insight card\r\n      let maxG = 0, maxN = '';\r\n      H_DIMS.forEach((d,i) => { const g = Math.abs(cA.h[i]-cB.h[i]); if(g>maxG){maxG=g;maxN=d.key+' - '+d.name.replace('\\n',' ');} });\r\n      const mLbl = maxG>=30?'High-Priority Friction':maxG>=15?'Notable Difference':'Small Difference';\r\n      y = pdfInsight(pdf, CW, y, maxG>=30?'(!)':'(~)', mLbl, 'Largest gap: '+maxN+' (D'+maxG+') between '+nameA+' and '+nameB);\r\n\r\n      H_DIMS.forEach((d,i) => {\r\n        y = checkPageBreak(pdf, y, 20, nameA, nameB, CW);\r\n        y = pdfBarRow(pdf, CW, y, d.name.replace('\\n',' '), d.key, cA.h[i], cB.h[i], false);\r\n      });\r\n\r\n    } else if (tabId === 'globe') {\r\n      if (!cA.g || !cB.g) {\r\n        txt(pdf, PDF.MID, 9, false);\r\n        pdf.text('GLOBE data not available for one or both selected countries.', PDF.ML, y+8);\r\n      } else {\r\n        let maxG = 0, maxN = '';\r\n        G_DIMS.forEach((d,i) => { const g = Math.abs(gNorm(cA.g[i])-gNorm(cB.g[i])); if(g>maxG){maxG=g;maxN=d.key+' - '+d.name.replace('\\n',' ');} });\r\n        const mLbl = maxG>=30?'High-Priority Friction':maxG>=15?'Notable Difference':'Small Difference';\r\n        y = pdfInsight(pdf, CW, y, maxG>=30?'(!)':'(~)', mLbl, 'Largest gap: '+maxN+' (D'+maxG+') between '+nameA+' and '+nameB);\r\n        G_DIMS.forEach((d,i) => {\r\n          y = checkPageBreak(pdf, y, 20, nameA, nameB, CW);\r\n          y = pdfBarRow(pdf, CW, y, d.name.replace('\\n',' '), d.key, gNorm(cA.g[i]), gNorm(cB.g[i]), false);\r\n        });\r\n      }\r\n\r\n    } else if (tabId === 'wvs') {\r\n      let maxG = 0, maxN = '';\r\n      W_DIMS.forEach((d,i) => { const g = Math.abs(cA.w[i]-cB.w[i]); if(g>maxG){maxG=g;maxN=d.name.replace('\\n',' ');} });\r\n      y = pdfInsight(pdf, CW, y, maxG>=30?'(!)':'(~)', maxG>=30?'High-Priority Friction':'Notable Difference',\r\n        'Largest gap: '+maxN+' (D'+maxG+') between '+nameA+' and '+nameB);\r\n\r\n      \/\/ WVS quadrant positions as text summary\r\n      const qLabels = ['Traditional\/Secular','Survival\/Self-Expression','Institutional Confidence'];\r\n      const qDesc = ['0=Traditional, 100=Secular-Rational','0=Survival, 100=Self-Expression','0=Low trust, 100=High trust'];\r\n      fill(pdf, PDF.BGCARD); stroke(pdf, [210,220,232], 0.25);\r\n      pdf.roundedRect(PDF.ML, y, CW, 28, 1.5, 1.5, 'FD');\r\n      txt(pdf, PDF.GOLD, 7.5, true); pdf.text('Inglehart-Welzel Positions', PDF.ML+3, y+6);\r\n      W_DIMS.forEach((d,i) => {\r\n        const gap = Math.abs(cA.w[i]-cB.w[i]);\r\n        const gapCol = gap>=30 ? PDF.RED : gap>=15 ? PDF.AMBER : PDF.TEAL;\r\n        txt(pdf, PDF.NAVY, 7.5, true); pdf.text(d.name.replace('\\n',' ')+':', PDF.ML+3, y+12+(i*6));\r\n        txt(pdf, PDF.GOLD, 7.5, false); pdf.text(nameA+': '+cA.w[i], PDF.ML+55, y+12+(i*6));\r\n        txt(pdf, PDF.TEAL, 7.5, false); pdf.text(nameB+': '+cB.w[i], PDF.ML+80, y+12+(i*6));\r\n        txt(pdf, gapCol, 7.5, true);   pdf.text(gap, PDF.ML+105, y+12+(i*6));\r\n        txt(pdf, PDF.MUTED, 6.5, false); pdf.text('('+qDesc[i]+')', PDF.ML+115, y+12+(i*6));\r\n      });\r\n      y += 34;\r\n\r\n      W_DIMS.forEach((d,i) => {\r\n        y = checkPageBreak(pdf, y, 20, nameA, nameB, CW);\r\n        y = pdfBarRow(pdf, CW, y, d.name.replace('\\n',' '), null, cA.w[i], cB.w[i], false);\r\n      });\r\n\r\n    } else if (tabId === 'schwartz') {\r\n      let maxG = 0, maxN = '';\r\n      S_DIMS.forEach((d,i) => { const g = Math.abs(cA.s[i]-cB.s[i]); if(g>maxG){maxG=g;maxN=d.name.replace('\\n',' ');} });\r\n      y = pdfInsight(pdf, CW, y, maxG>=30?'(!)':'(~)', maxG>=30?'High-Priority Friction':'Notable Difference',\r\n        'Largest gap: '+maxN+' (D'+maxG+'). * = unique dimension with no Hofstede\/GLOBE equivalent.');\r\n\r\n      S_DIMS.forEach((d,i) => {\r\n        y = checkPageBreak(pdf, y, 20, nameA, nameB, CW);\r\n        y = pdfBarRow(pdf, CW, y, d.name.replace('\\n',' '), null, cA.s[i], cB.s[i], d.unique);\r\n      });\r\n\r\n      \/\/ Unique dimension legend\r\n      y = checkPageBreak(pdf, y, 18, nameA, nameB, CW);\r\n      fill(pdf, [232,248,246]); stroke(pdf, PDF.GRMBDR, 0.3);\r\n      pdf.roundedRect(PDF.ML, y, CW, 14, 1.5, 1.5, 'FD');\r\n      txt(pdf, PDF.TEAL, 7, true);\r\n      pdf.text('\\u2605 UNIQUE TO SCHWARTZ', PDF.ML+3, y+5.5);\r\n      txt(pdf, PDF.NAVY, 7, false);\r\n      pdf.text('Intellectual Autonomy, Affective Autonomy, Egalitarianism and Harmony have no equivalent in Hofstede or GLOBE.', PDF.ML+3, y+11);\r\n      y += 18;\r\n\r\n    } else if (tabId === 'conv') {\r\n      \/\/ Sort themes by maxGap descending (same logic as renderConvergence)\r\n      const convRows = [];\r\n      THEMES.forEach(function(theme) {\r\n        let maxThemeGap = 0, totalGap = 0, count = 0;\r\n        const sigs = [];\r\n        theme.dims.forEach(function(d) {\r\n          const vA = d.fn(cA), vB = d.fn(cB);\r\n          if (vA==null||vB==null) return;\r\n          const g = absDiff(vA,vB);\r\n          const sev = g>=30?'large':g>=15?'moderate':'small';\r\n          sigs.push({label: d.fw+': '+d.label+' D'+g, sev});\r\n          totalGap += g; count++;\r\n          if (g > maxThemeGap) maxThemeGap = g;\r\n        });\r\n        if (!count) return;\r\n        convRows.push({theme, sigs, maxThemeGap});\r\n      });\r\n      convRows.sort((a,b) => b.maxThemeGap - a.maxThemeGap);\r\n\r\n      \/\/ Insight\r\n      if (convRows.length) {\r\n        const top = convRows[0];\r\n        y = pdfInsight(pdf, CW, y, top.maxThemeGap>=30?'(!)':'(~)',\r\n          top.maxThemeGap>=30?'Highest-Priority Gap':'Key Finding',\r\n          'Highest gap cluster: '+safeStr(top.theme.name)+' (D'+top.maxThemeGap+') - '+top.sigs.length+' framework signal(s)');\r\n      }\r\n\r\n      convRows.forEach(function(row) {\r\n        const needed = 22 + Math.ceil(row.sigs.length\/3)*5;\r\n        y = checkPageBreak(pdf, y, needed, nameA, nameB, CW);\r\n        y = pdfConvRow(pdf, CW, y, safeStr(row.theme.name), safeStr(row.theme.sub), row.sigs, row.maxThemeGap);\r\n      });\r\n    }\r\n\r\n    \/\/ \u2500\u2500 Final footer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n    pdfFooter(pdf, nameA, nameB);\r\n\r\n    const fname = 'compass-'+kA.toLowerCase()+'-'+kB.toLowerCase()+'-'+tabId+'.pdf';\r\n    pdf.save(fname);\r\n\r\n  } catch(err) {\r\n    console.error('PDF error:', err);\r\n    alert('PDF generation failed: ' + err.message);\r\n  } finally {\r\n    btn.classList.remove('loading');\r\n    btn.querySelector('.spinner')?.remove();\r\n    btnSpan.textContent = 'Download PDF';\r\n    if (btnIcon) btnIcon.style.display = '';\r\n  }\r\n}\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ MAIN RENDER + INIT\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\nfunction render() {\r\n  const kA = document.getElementById('selA').value;\r\n  const kB = document.getElementById('selB').value;\r\n  const cA = C[kA], cB = C[kB];\r\n  renderHofstede(cA, cB);\r\n  renderGLOBE(cA, cB);\r\n  renderWVS(cA, cB);\r\n  renderSchwartz(cA, cB);\r\n  renderConvergence(cA, cB);\r\n  renderSummaryRadar(cA, cB);\r\n  renderLeadershipAnalysis(kA, kB);\r\n}\r\n\r\nfunction switchTab(id, btn) {\r\n  document.querySelectorAll('.panel').forEach(p => p.classList.remove('on'));\r\n  document.querySelectorAll('.tab').forEach(t => t.classList.remove('on'));\r\n  document.getElementById('p-'+id).classList.add('on');\r\n  btn.classList.add('on');\r\n  activeTab = id;\r\n  const kA = document.getElementById('selA').value;\r\n  const kB = document.getElementById('selB').value;\r\n  renderSummaryRadar(C[kA], C[kB]);\r\n}\r\n\r\nfunction init() {\r\n  const selA = document.getElementById('selA');\r\n  const selB = document.getElementById('selB');\r\n  const sorted = Object.entries(C).sort((a,b) => a[1].name.localeCompare(b[1].name));\r\n  sorted.forEach(([k,v]) => {\r\n    selA.innerHTML += `<option value=\"${k}\">${v.name}<\/option>`;\r\n    selB.innerHTML += `<option value=\"${k}\">${v.name}<\/option>`;\r\n  });\r\n  \/\/ Default: Netherlands vs Germany\r\n  selA.value = 'NL';\r\n  selB.value = 'DE';\r\n  render();\r\n}\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ LEADERSHIP ANALYSIS \u2014 AI-powered, 11 dimensions\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\nconst LA_DIMS = [\r\n  { id:'exec_summary',   num:'01', name:'Executive Summary',          fullWords: 520 },\r\n  { id:'top5_gaps',      num:'02', name:'Top 5 High-Priority Gaps',   fullWords: 680 },\r\n  { id:'relationships',  num:'03', name:'Building Professional Relationships', fullWords: 620 },\r\n  { id:'team_building',  num:'04', name:'Team Building',              fullWords: 580 },\r\n  { id:'chairing',       num:'05', name:'Chairing Meetings',          fullWords: 510 },\r\n  { id:'attending',      num:'06', name:'Attending Meetings',         fullWords: 490 },\r\n  { id:'managing_up',    num:'07', name:'Managing Up',                fullWords: 560 },\r\n  { id:'managing_down',  num:'08', name:'Managing Down',              fullWords: 575 },\r\n  { id:'peers',          num:'09', name:'Dealing with Peers',         fullWords: 530 },\r\n  { id:'communication',  num:'10', name:'Communication',              fullWords: 650 },\r\n  { id:'trust',          num:'11', name:'Trust',                      fullWords: 595 },\r\n];\r\n\r\nconst TOTAL_WORDS = LA_DIMS.reduce((s,d) => s+d.fullWords, 0);\r\nconst EST_PAGES   = Math.round(TOTAL_WORDS \/ 450);\r\n\r\n\/\/ Cache: key = \"kA-kB\"\r\nconst laCache = {};\r\nlet laCurrentKey = '';\r\n\r\nfunction buildFrameworkSummary(cA, cB) {\r\n  const gNorm = v => Math.round((v - 1) \/ 6 * 100);\r\n  const lines = [];\r\n  lines.push('HOFSTEDE (0-100 scale):');\r\n  const hKeys = ['PDI','IDV','MAS','UAI','LTO','IVR'];\r\n  hKeys.forEach((k,i) => lines.push(`  ${k}: ${cA.name}=${cA.h[i]}, ${cB.name}=${cB.h[i]}, gap=${Math.abs(cA.h[i]-cB.h[i])}`));\r\n  lines.push('GLOBE (normalised 0-100):');\r\n  const gKeys = ['PO','AS','FO','HO','IC','IGC','GE','PD','UA'];\r\n  if (cA.g && cB.g) {\r\n    gKeys.forEach((k,i) => lines.push(`  ${k}: ${cA.name}=${gNorm(cA.g[i])}, ${cB.name}=${gNorm(cB.g[i])}, gap=${Math.abs(gNorm(cA.g[i])-gNorm(cB.g[i]))}`));\r\n  } else {\r\n    lines.push('  (GLOBE data not available for one country)');\r\n  }\r\n  lines.push('WVS Wave 7 (0-100):');\r\n  const wKeys = ['Traditional\/Secular','Survival\/Self-Expression','Institutional Confidence'];\r\n  wKeys.forEach((k,i) => lines.push(`  ${k}: ${cA.name}=${cA.w[i]}, ${cB.name}=${cB.w[i]}, gap=${Math.abs(cA.w[i]-cB.w[i])}`));\r\n  lines.push('SCHWARTZ (0-100):');\r\n  const sKeys = ['Embeddedness','Hierarchy','Mastery','Intellectual Autonomy','Affective Autonomy','Egalitarianism','Harmony'];\r\n  sKeys.forEach((k,i) => lines.push(`  ${k}: ${cA.name}=${cA.s[i]}, ${cB.name}=${cB.s[i]}, gap=${Math.abs(cA.s[i]-cB.s[i])}`));\r\n  return lines.join('\\n');\r\n}\r\n\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ INTAKE \u2014 personal context\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\nconst intake = {\r\n  bg:'', working:'', role:'', situation:'', challenge:'',\r\n};\r\n\r\nconst ROLE_LABELS = {\r\n  exec:'as a C-suite leader', director:'as a director',\r\n  manager:'as a manager', lead:'as a team lead',\r\n  consultant:'as a consultant or coach', hr:'in an HR or talent role',\r\n  individual:'as an individual contributor',\r\n};\r\nconst SITUATION_LABELS = {\r\n  new_role:'starting a new role in a different culture',\r\n  new_team:'welcoming a new colleague from another culture',\r\n  managing:'managing across cultural boundaries',\r\n  project:'working on an international project',\r\n  merger:'navigating a cross-cultural integration',\r\n  negotiation:'building a cross-cultural partnership',\r\n  coaching:'coaching a cross-cultural leader',\r\n  preparation:'preparing for an international assignment',\r\n  curiosity:'exploring cross-cultural leadership',\r\n};\r\n\r\nfunction applyIntake() {\r\n  intake.bg        = document.getElementById('intake-bg').value;\r\n  intake.working   = document.getElementById('intake-working').value;\r\n  intake.role      = document.getElementById('intake-role').value;\r\n  intake.situation = document.getElementById('intake-situation').value;\r\n  intake.gender    = document.getElementById('intake-gender').value;\r\n  intake.challenge = document.getElementById('intake-challenge').value.trim();\r\n  Object.keys(laCache).forEach(k => delete laCache[k]);\r\n  const done = document.getElementById('intake-done');\r\n  done.classList.add('show');\r\n  setTimeout(() => done.classList.remove('show'), 2500);\r\n  const kA = document.getElementById('selA').value;\r\n  const kB = document.getElementById('selB').value;\r\n  renderLeadershipAnalysis(kA, kB);\r\n}\r\n\r\nfunction intakeContext(nameA, nameB) {\r\n  const parts = [];\r\n  const roleLbl = intake.role ? ROLE_LABELS[intake.role] : '';\r\n  const sitLbl  = intake.situation ? SITUATION_LABELS[intake.situation] : '';\r\n  const bgName  = intake.bg && C[intake.bg] ? C[intake.bg].name : '';\r\n  const wkName  = intake.working && C[intake.working] ? C[intake.working].name : '';\r\n  if (bgName) parts.push('You are coming from a ' + bgName + ' professional background');\r\n  else parts.push('You are exploring the ' + nameA + '\u2013' + nameB + ' gap');\r\n  if (roleLbl) parts.push(roleLbl);\r\n  if (sitLbl)  parts.push(sitLbl);\r\n  if (wkName && wkName !== bgName) parts.push('in a ' + wkName + ' context');\r\n  if (intake.gender === 'woman_male_dom') parts.push('navigating a gender dynamic as a woman in a male-dominated context');\r\n  if (intake.gender === 'man_female_dom') parts.push('navigating a gender dynamic as a man in a female-dominated context');\r\n  return parts.join(', ') + '.';\r\n}\r\n\r\nfunction readerDirection(kA, kB) {\r\n  const bg = intake.bg, wk = intake.working;\r\n  if (bg === kA || wk === kB) return 'AtoB';\r\n  if (bg === kB || wk === kA) return 'BtoA';\r\n  return 'both';\r\n}\r\n\r\n\/\/ \u2500\u2500 Score-based analysis engine \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\/\/ Generates leadership dimension previews directly from framework scores.\r\n\/\/ No API call required \u2014 deterministic, instant, works on any hosting.\r\n\r\nfunction scoreGap(a, b) { return Math.abs(a - b); }\r\nfunction gn(v) { return Math.round((v - 1) \/ 6 * 100); } \/\/ GLOBE normalise\r\nfunction mag(gap) { return gap >= 30 ? 'large' : gap >= 15 ? 'moderate' : 'small'; }\r\n\r\nfunction pick(gap, large, moderate, small) {\r\n  return gap >= 30 ? large : gap >= 15 ? moderate : small;\r\n}\r\n\r\n\/\/ Returns a short text block from a menu of options keyed by gap magnitude\r\nfunction sentence(parts) { return parts.join(' '); }\r\n\r\nasync function generateLeadershipAnalysis(kA, kB) {\r\n  const cacheKey = kA + '-' + kB;\r\n  if (laCache[cacheKey]) return laCache[cacheKey];\r\n\r\n  const cA = C[kA], cB = C[kB];\r\n  const nA = cA.name, nB = cB.name;\r\n\r\n  \/\/ Key gaps\r\n  const PDI  = scoreGap(cA.h[0], cB.h[0]);\r\n  const IDV  = scoreGap(cA.h[1], cB.h[1]);\r\n  const MAS  = scoreGap(cA.h[2], cB.h[2]);\r\n  const UAI  = scoreGap(cA.h[3], cB.h[3]);\r\n  const LTO  = scoreGap(cA.h[4], cB.h[4]);\r\n  const IVR  = scoreGap(cA.h[5], cB.h[5]);\r\n  const EMB  = scoreGap(cA.s[0], cB.s[0]); \/\/ Schwartz Embeddedness\r\n  const HIER = scoreGap(cA.s[1], cB.s[1]); \/\/ Schwartz Hierarchy\r\n  const IA   = scoreGap(cA.s[3], cB.s[3]); \/\/ Intellectual Autonomy\r\n  const EGAL = scoreGap(cA.s[5], cB.s[5]); \/\/ Egalitarianism\r\n  const HARM = scoreGap(cA.s[6], cB.s[6]); \/\/ Harmony\r\n  const WTS  = scoreGap(cA.w[0], cB.w[0]); \/\/ WVS Traditional\/Secular\r\n  const WSE  = scoreGap(cA.w[1], cB.w[1]); \/\/ WVS Self-Expression\r\n  const WIC  = scoreGap(cA.w[2], cB.w[2]); \/\/ WVS Institutional Confidence\r\n\r\n  const gGE  = cA.g && cB.g ? scoreGap(gn(cA.g[6]), gn(cB.g[6])) : 0; \/\/ Gender Egalitarianism\r\n  const gAS  = cA.g && cB.g ? scoreGap(gn(cA.g[1]), gn(cB.g[1])) : 0; \/\/ Assertiveness\r\n\r\n  \/\/ Which culture is higher on key dimensions\r\n  const moreHier    = cA.h[0] > cB.h[0] ? nA : nB;\r\n  const lessHier    = moreHier === nA ? nB : nA;\r\n  const moreIndiv   = cA.h[1] > cB.h[1] ? nA : nB;\r\n  const moreMasc    = cA.h[2] > cB.h[2] ? nA : nB;\r\n  const moreUAI     = cA.h[3] > cB.h[3] ? nA : nB;\r\n  const moreSelfExp = cA.w[1] > cB.w[1] ? nA : nB;\r\n  const moreEgal    = cA.s[5] > cB.s[5] ? nA : nB;\r\n  const moreTrust   = cA.w[2] > cB.w[2] ? nA : nB;\r\n\r\n  \/\/ Collect the 5 biggest gaps with names\r\n  const allGaps = [\r\n    { name: 'Masculinity (Hofstede)', gap: MAS },\r\n    { name: 'Indulgence (Hofstede)', gap: IVR },\r\n    { name: 'Uncertainty Avoidance (Hofstede)', gap: UAI },\r\n    { name: 'Egalitarianism (Schwartz)', gap: EGAL },\r\n    { name: 'Harmony (Schwartz)', gap: HARM },\r\n    { name: 'Self-Expression (WVS)', gap: WSE },\r\n    { name: 'Institutional Confidence (WVS)', gap: WIC },\r\n    { name: 'Intellectual Autonomy (Schwartz)', gap: IA },\r\n    { name: 'Power Distance (Hofstede)', gap: PDI },\r\n    { name: 'Individualism (Hofstede)', gap: IDV },\r\n    { name: 'Embeddedness (Schwartz)', gap: EMB },\r\n    { name: 'Traditional\/Secular (WVS)', gap: WTS },\r\n    { name: 'Long-Term Orientation (Hofstede)', gap: LTO },\r\n  ].sort((a,b) => b.gap - a.gap);\r\n\r\n  const top5 = allGaps.slice(0,5);\r\n  const top5text = top5.map((g,i) => `${i+1}. ${g.name} (gap: ${g.gap})`).join('; ');\r\n  const biggestGap = top5[0];\r\n\r\n  \/\/ Personal context from intake\r\n  const ctx       = intakeContext(nA, nB);\r\n  const direction = readerDirection(kA, kB);\r\n  const bgName    = intake.bg && C[intake.bg] ? C[intake.bg].name : '';\r\n  const roleLbl   = intake.role ? ROLE_LABELS[intake.role] : '';\r\n  const sitLbl    = intake.situation ? SITUATION_LABELS[intake.situation] : '';\r\n  \/\/ \"You\" = the reader; \"your culture\" = their background; \"their culture\" = the other\r\n  const yourCulture  = direction === 'AtoB' ? nA : direction === 'BtoA' ? nB : nA;\r\n  const theirCulture = direction === 'AtoB' ? nB : direction === 'BtoA' ? nA : nB;\r\n  const cacheKey2    = kA + '-' + kB + '-' + intake.bg + '-' + intake.role + '-' + intake.situation;\r\n\r\n  const result = {\r\n\r\n    exec_summary: sentence([\r\n      ctx ? ctx + ' ' : '',\r\n      pick(MAS, 'The most important thing to know before you go further: ' + yourCulture + ' and ' + theirCulture + ' define what leadership is \\u2018for\\u2019 in fundamentally different ways',\r\n        'You are entering a cultural context where professional values differ in ways that matter for your daily leadership,',\r\n        'You are working with a cultural profile that shares many professional fundamentals with yours \u2014 the differences are real but navigable.'),\r\n      pick(MAS, '. A Masculinity gap of ' + MAS + ' points means performance, achievement and ambition are weighted very differently on either side. This plays out in every meeting, every performance conversation, and every decision about what gets recognised.',\r\n        ' The Masculinity gap (' + MAS + ' points) means performance culture needs some recalibration.',\r\n        ''),\r\n      ' The ' + biggestGap.name + ' gap (' + biggestGap.gap + ' points) is your highest-priority signal across all four frameworks.',\r\n      roleLbl ? ' ' + yourCulture.split(' ')[0] + ' professionals ' + roleLbl + ' will feel this most in ' +\r\n        (intake.role === 'exec' ? 'board-level decision-making and stakeholder trust.' :\r\n         intake.role === 'manager' ? 'team motivation, feedback conversations, and performance reviews.' :\r\n         intake.role === 'consultant' ? 'client relationship-building and proposal framing.' :\r\n         'day-to-day collaboration and communication.') : ''\r\n    ]),\r\n\r\n    top5_gaps: sentence([\r\n      'Across all four frameworks, your five highest-priority friction points are: ' + top5text + '.',\r\n      ' Here is what makes ' + biggestGap.name + ' (' + biggestGap.gap + ' points) the dominant gap for you: ',\r\n      pick(MAS, moreMasc + ' professional culture treats performance and visible achievement as the primary leadership currency. ' + (moreMasc === nA ? nB : nA) + ' culture is organised around collective wellbeing and quality of life. These are not stylistic preferences you can adapt around \u2014 they are different answers to the question of what leadership is for. Every performance conversation, recognition decision and accountability moment is shaped by this gap.',\r\n        'Performance culture differs enough (MAS ' + MAS + ') that your default approach to accountability and recognition will need deliberate adjustment.',\r\n        'Your cultural profiles are broadly aligned on most leadership fundamentals. The gaps are real but navigable with moderate recalibration.')\r\n    ]),\r\n\r\n    relationships: sentence([\r\n      pick(EMB, 'The relationship-building gap is one of the most immediately practical differences you will encounter. ',\r\n        'Relationship norms are meaningfully different \u2014 your default approach will need recalibration. ',\r\n        'Both cultures approach professional relationships in broadly compatible ways. '),\r\n      pick(WIC, 'Institutional Confidence (WVS gap: ' + WIC + ' points) means you and your ' + theirCulture + ' counterparts enter professional settings with very different baseline levels of trust in organisations and roles. ' + moreTrust + ' professionals extend trust to the institution; ' + (moreTrust === nA ? nB : nA) + ' professionals require trust to be earned through personal credibility. This is not a preference \u2014 it is a different architecture for how safe it feels to rely on someone you do not know well.',\r\n        'Your and their trust in institutions differs (WVS gap: ' + WIC + ') \u2014 one side extends professional trust more readily through role and credential, the other needs personal track record first.',\r\n        'Both cultures show comparable institutional confidence.'),\r\n      ' ' + pick(EGAL, 'The Egalitarianism gap (' + EGAL + ' points) adds a further layer: how much collective care and mutual obligation you each expect in a professional relationship. In ' + moreEgal + ' culture, a colleague who does not show genuine interest in your welfare outside the task is experienced as cold. In ' + (moreEgal === nA ? nB : nA) + ' culture, the same person is simply being professional.',\r\n        'Egalitarianism gap (' + EGAL + '): expectations of mutual care in professional relationships differ.',\r\n        '')\r\n    ]),\r\n\r\n    team_building: sentence([\r\n      pick(IDV, 'Building a team that spans ' + nA + ' and ' + nB + ' culture means building two cohesion systems simultaneously \u2014 and not confusing them. ',\r\n        'Team cohesion norms differ. What feels like genuine team spirit to one side may feel performative to the other. ',\r\n        'Both cultures share broadly similar team cohesion norms, which gives you a solid foundation. '),\r\n      pick(EMB, 'The Embeddedness gap (' + EMB + ' points) is the most practically significant: ' + (cA.s[0] > cB.s[0] ? nA : nB) + ' professionals derive significantly more of their identity and motivation from group membership. A team-building approach that feels natural and energising to them may feel invasive or time-wasting to their ' + (cA.s[0] > cB.s[0] ? nB : nA) + ' colleagues. Design both: relational rituals for one, functional clarity for the other.',\r\n        'Embeddedness gap (' + EMB + '): how much identity comes from group membership differs \u2014 team rituals need dual calibration.',\r\n        ''),\r\n      ' ' + pick(MAS, 'The MAS gap of ' + MAS + ' is the most directly actionable for team design: ' + moreMasc + ' team members are energised by individual achievement recognition, visible performance, and stretch goals. ' + (moreMasc === nA ? nB : nA) + ' colleagues are energised by collective success, quality of working life, and being genuinely seen as people, not just performers. One motivation system will fail half your team.',\r\n        'Motivation design needs dual calibration (MAS gap: ' + MAS + ').',\r\n        '')\r\n    ]),\r\n\r\n    chairing: sentence([\r\n      pick(UAI, `Chairing a meeting across the ${nA}-${nB} gap requires managing two different concepts of what a meeting is for.`,\r\n        `Meeting facilitation needs some adaptation across this cultural pair.`,\r\n        `Both cultures share broadly compatible meeting expectations.`),\r\n      `${moreUAI} professionals expect ${pick(UAI, 'tight agendas, documented decisions, and clear accountability \u2014 meetings without these feel unresolved.', 'structured agendas and clear outputs.', 'organised but flexible discussion.')}`,\r\n      pick(PDI, `The Power Distance gap (${PDI}) affects who speaks, when, and how challenge is expressed \u2014 a chair from ${moreHier} culture may inadvertently suppress contributions from team members accustomed to ${lessHier} norms of open, flat dialogue.`,\r\n        `Hierarchy norms (PDI gap: ${PDI}) influence how openly participants challenge proposals in the room.`,\r\n        `Both cultures share broadly egalitarian meeting norms.`)\r\n    ]),\r\n\r\n    attending: sentence([\r\n      `As an attendee, a ${nA} professional in a ${nB}-run meeting faces a primary calibration challenge around`,\r\n      pick(WSE, 'voice and challenge norms \u2014 the gap in WVS Self-Expression scores (' + WSE + ' points) means one culture expects active, often direct challenge as a sign of engagement, while the other may interpret the same behaviour as disruptive.', 'how actively to voice disagreement (' + 'WSE gap: ' + WSE + ').', 'communication register.'),\r\n      pick(PDI, `The Power Distance gap (${PDI}) also shapes when it is appropriate to speak relative to seniority \u2014 ${moreHier} professionals may hold back waiting for senior cues that ${lessHier} culture does not send.`,\r\n        `Seniority cues in meetings differ (PDI: ${PDI}).`,\r\n        '')\r\n    ]),\r\n\r\n    managing_up: sentence([\r\n      `Managing up across the ${nA}-${nB} gap means navigating`,\r\n      pick(PDI, `a significant power distance difference (${PDI} points). ${moreHier} seniors expect deference, formality, and well-prepared proposals. ${lessHier} seniors may expect direct challenge and informal pre-alignment.`,\r\n        `different authority expectations (PDI gap: ${PDI}).`,\r\n        `broadly compatible authority relationships.`),\r\n      pick(UAI, `The UAI gap of ${UAI} affects how decisions are proposed upward \u2014 ${moreUAI} superiors expect comprehensive documentation and risk analysis before any recommendation reaches them. Presenting a half-formed idea will undermine credibility rapidly.`,\r\n        `Documentation standards and risk framing need adaptation when proposing upward.`,\r\n        `Proposal styles are broadly compatible across this pair.`),\r\n      intake.gender === 'woman_male_dom'\r\n        ? `As a woman operating in a male-dominated context, cultural deference and gender-role expectations can compound each other: what reads as cultural respect in your background may reinforce gender bias in your current context. The most effective response is not to manage the bias but to render it irrelevant \u2014 by being so directly credible and technically precise that the alternative reading simply does not gain purchase.`\r\n        : intake.gender === 'man_female_dom'\r\n        ? `As a man operating in a female-dominated or highly gender-egalitarian context, authority assumptions that feel normal may read as overreach. A high Egalitarianism environment expects authority to be earned through demonstrated shared purpose, not signalled through role or assertion.`\r\n        : ''\r\n    ]),\r\n\r\n    managing_down: sentence([\r\n      pick(MAS, `The MAS gap of ${MAS} is the defining challenge of managing down in this pairing.`,\r\n        `Performance management across this pair requires careful calibration.`,\r\n        `Managing down is broadly compatible across this cultural pair.`),\r\n      pick(MAS, `${moreMasc} managers are wired to drive performance through stretch targets, visible accountability, and direct feedback. In ${moreMasc === nA ? nB : nA} culture, the same behaviours suppress candour, reduce psychological safety, and produce compliance without commitment.`,\r\n        `Direct performance feedback and accountability framing will need cultural adjustment.`,\r\n        ''),\r\n      `The Schwartz Egalitarianism gap (${EGAL}) ${pick(EGAL, `also matters: ${moreEgal} team members expect managers to demonstrate genuine concern for individual welfare as a condition of authority \u2014 performance-only leadership loses legitimacy rapidly.`, 'also signals different expectations about manager care for team members.', 'is small.')}`\r\n    ]),\r\n\r\n    peers: sentence([\r\n      pick(gAS, `The GLOBE Assertiveness gap (${gAS} points) is the primary friction point in peer relationships.`,\r\n        `Assertiveness norms differ in peer interactions (GLOBE gap: ${gAS}).`,\r\n        `Peer interaction styles are broadly compatible.`),\r\n      pick(gAS, `Peers from the more assertive culture will read directness as professionalism. Peers from the less assertive culture will read the same directness as aggression or disrespect. Both are responding rationally to their cultural default \u2014 but the collision can feel personal.`,\r\n        `Direct challenge between peers is read differently across this cultural pair.`,\r\n        ''),\r\n      pick(EGAL, `The Egalitarianism gap (${EGAL}) also affects peer collaboration: ${moreEgal} professionals expect collective input and shared credit. ${moreEgal === nA ? nB : nA} professionals may be more comfortable with individual ownership and visible contribution.`,\r\n        `Credit and ownership norms between peers differ (Egalitarianism gap: ${EGAL}).`,\r\n        `Peer collaboration norms are broadly aligned.`),\r\n      intake.gender === 'woman_male_dom'\r\n        ? `In peer dynamics, the GLOBE Gender Egalitarianism dimension is directly relevant: where the gap is large, technical credibility established early and explicitly is the most reliable path to peer standing. Indirect signalling of competence is more likely to be misread across both the cultural and gender lens simultaneously.`\r\n        : ''\r\n    ]),\r\n\r\n    communication: sentence([\r\n      pick(WSE, `Communication across the ${nA}-${nB} gap involves navigating a ${WSE}-point Self-Expression gap \u2014 one of the most immediate daily friction sources.`,\r\n        `Communication styles differ meaningfully (WVS Self-Expression gap: ${WSE}).`,\r\n        `Communication styles are broadly compatible.`),\r\n      pick(WSE, `${moreSelfExp} professionals expect direct, explicit communication and interpret indirectness as evasion or incompetence. The less expressive culture may use implicit signals, contextual cues, and understatement that the other side simply does not register.`,\r\n        `Directness calibration is needed \u2014 what reads as efficient in one culture reads as blunt in the other.`,\r\n        ''),\r\n      pick(IA, `The Schwartz Intellectual Autonomy gap (${IA}) also shapes how ideas are communicated \u2014 ${cA.s[3] > cB.s[3] ? nA : nB} professionals expect curiosity, challenge, and independent framing. ${cA.s[3] > cB.s[3] ? nB : nA} professionals may expect more deference to established frameworks.`,\r\n        `How ideas are argued and challenged differs (Intellectual Autonomy gap: ${IA}).`,\r\n        `Both cultures share strong norms around direct, competence-based communication.`)\r\n    ]),\r\n\r\n    trust: sentence([\r\n      pick(WIC, `Trust in this pairing operates on structurally different foundations.`,\r\n        `Trust-building norms differ between ${nA} and ${nB}.`,\r\n        `Both cultures build trust through broadly compatible mechanisms.`),\r\n      pick(WIC, `${moreTrust} professionals extend trust to institutional roles \u2014 a manager is trusted because of their position and the organisation's credibility. ${moreTrust === nA ? nB : nA} professionals build trust through personal reliability demonstrated over time. These are not compatible defaults \u2014 they must be named and negotiated explicitly.`,\r\n        `${moreTrust} professionals extend more institutional trust; ${moreTrust === nA ? nB : nA} require personal track record.`,\r\n        `Both cultures blend institutional and personal trust in comparable proportions.`),\r\n      pick(EMB, `The Embeddedness gap (${EMB}) adds a relational trust dimension \u2014 in high-embeddedness culture, trust is inseparable from group membership and shared identity. A newcomer from outside the group starts with a significant trust deficit that competence alone cannot close.`,\r\n        `Group membership affects how quickly outsiders are trusted (Embeddedness gap: ${EMB}).`,\r\n        ``)\r\n    ])\r\n  };\r\n\r\n  laCache[cacheKey] = result;\r\n  return result;\r\n}\r\n\r\nfunction renderLeadershipSkeleton() {\r\n  const frame = document.getElementById('la-frame');\r\n  frame.style.display = 'block';\r\n  frame.innerHTML = LA_DIMS.map(d => `\r\n    <div class=\"la-dim\">\r\n      <div class=\"la-dim-head\">\r\n        <div><span class=\"la-dim-num\">${d.num}<\/span><span class=\"la-dim-name\">${d.name}<\/span><\/div>\r\n        <span class=\"la-wc\">~${d.fullWords} words<\/span>\r\n      <\/div>\r\n      <div class=\"la-skel\" style=\"width:100%\"><\/div>\r\n      <div class=\"la-skel\" style=\"width:88%\"><\/div>\r\n      <div class=\"la-skel\"><\/div>\r\n    <\/div>`).join('');\r\n}\r\n\r\nfunction renderLeadershipContent(previews, nameA, nameB) {\r\n  const frame = document.getElementById('la-frame');\r\n\r\n  \/\/ Build personal context header\r\n  const ctxParts = [];\r\n  if (intake.bg && C[intake.bg]) ctxParts.push(C[intake.bg].name + ' background');\r\n  if (intake.role && ROLE_LABELS[intake.role]) ctxParts.push(ROLE_LABELS[intake.role]);\r\n  if (intake.situation && SITUATION_LABELS[intake.situation]) ctxParts.push(SITUATION_LABELS[intake.situation]);\r\n\r\n  const ctxHeader = ctxParts.length\r\n    ? '<div style=\"padding:12px 18px;background:rgba(201,168,76,.06);border-bottom:1px solid rgba(201,168,76,.15);font-size:11.5px;color:rgba(232,237,244,.65);font-weight:300;\">'\r\n      + '<strong style=\"color:var(--gold);font-weight:500;\">Your context:<\/strong> '\r\n      + ctxParts.join(' \u00b7 ')\r\n      + (intake.challenge ? ' \u00b7 ' + intake.challenge.slice(0,80) + (intake.challenge.length > 80 ? '\u2026' : '') : '')\r\n      + '<\/div>'\r\n    : '';\r\n\r\n  frame.innerHTML = ctxHeader + LA_DIMS.map(d => {\r\n    const text = previews[d.id] || '';\r\n    const wc = text.split(\/\\s+\/).filter(Boolean).length;\r\n    return `<div class=\"la-dim\">\r\n      <div class=\"la-dim-head\">\r\n        <div><span class=\"la-dim-num\">${d.num}<\/span><span class=\"la-dim-name\">${d.name}<\/span><\/div>\r\n        <span class=\"la-wc\">${wc} words preview &nbsp;(full: ~${d.fullWords} words)<\/span>\r\n      <\/div>\r\n      <div class=\"la-preview\">${text}<\/div>\r\n    <\/div>`;\r\n  }).join('');\r\n\r\n  \/\/ Update button label\r\n  document.getElementById('la-btn-full-label').textContent =\r\n    `Download full report (~${EST_PAGES} pages)`;\r\n  document.getElementById('la-btn-note').textContent =\r\n    `Complete ${nameA} \u00d7 ${nameB} leadership guide \u00b7 ~${TOTAL_WORDS.toLocaleString()} words`;\r\n}\r\n\r\nfunction renderLeadershipAnalysis(kA, kB) {\r\n  laCurrentKey = kA + '-' + kB;\r\n  const cA = C[kA], cB = C[kB];\r\n\r\n  document.getElementById('la-pair').textContent = cA.name + ' vs ' + cB.name;\r\n  document.getElementById('la-error').style.display = 'none';\r\n  document.getElementById('la-actions').style.display = 'none';\r\n  document.getElementById('la-loading').style.display = 'none';\r\n  document.getElementById('la-frame').style.display = 'block';\r\n\r\n  try {\r\n    const previews = generateLeadershipAnalysis(kA, kB);\r\n    \/\/ generateLeadershipAnalysis is now synchronous \u2014 returns result directly\r\n    const result = previews.then ? previews : Promise.resolve(previews);\r\n    result.then(function(data) {\r\n      renderLeadershipContent(data, cA.name, cB.name);\r\n      document.getElementById('la-actions').style.display = 'flex';\r\n      document.getElementById('pg-sub').textContent =\r\n        'A complete cross-cultural leadership guide for ' + cA.name + ' \u00d7 ' + cB.name +\r\n        ' \u2014 executive-ready, evidence-based, immediately actionable.';\r\n    });\r\n  } catch(err) {\r\n    console.error('Leadership analysis error:', err);\r\n    const errEl = document.getElementById('la-error');\r\n    errEl.style.display = 'block';\r\n    errEl.textContent = 'Analysis could not be generated. Please try again.';\r\n    document.getElementById('la-actions').style.display = 'flex';\r\n  }\r\n}\r\n\r\n\/\/ \u2500\u2500 Paygate \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction showPaygate() {\r\n  document.getElementById('pg-overlay').classList.remove('hidden');\r\n  document.body.style.overflow = 'hidden';\r\n}\r\nfunction closePaygate() {\r\n  document.getElementById('pg-overlay').classList.add('hidden');\r\n  document.body.style.overflow = '';\r\n}\r\n\r\n\/\/ \u2500\u2500 Route to WooCommerce checkout with country pair encoded \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\/\/ PAYGATE CONFIGURATION\r\n\/\/ Set COMPASS_PRODUCT_ID to your WooCommerce product ID once installed.\r\n\/\/ The plugin auto-creates the product \u2014 find the ID in WooCommerce > Products.\r\n\/\/ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nconst COMPASS_PRODUCT_ID_FALLBACK = '11665';  \/\/ WooCommerce product ID\r\n\r\nfunction handlePayment() {\r\n  const kA = document.getElementById('selA').value;\r\n  const kB = document.getElementById('selB').value;\r\n\r\n  \/\/ Serialise intake data for URL transport (JSON \u2192 base64)\r\n  const intakePayload = btoa(JSON.stringify({\r\n    bg:        intake.bg,\r\n    working:   intake.working,\r\n    role:      (function(){var s=document.getElementById('intake-role');return s&&s.selectedIndex>0?s.options[s.selectedIndex].text:(intake.role||'');})(),\r\n    situation: (function(){var s=document.getElementById('intake-situation');return s&&s.selectedIndex>0?s.options[s.selectedIndex].text:(intake.situation||'');})(),\r\n    challenge: intake.challenge.slice(0, 500)\r\n  }));\r\n\r\n  \/\/ Build the country + intake query string (no leading & \u2014 we add separator below)\r\n  const compassParams = 'compass_pA=' + encodeURIComponent(kA)\r\n    + '&compass_pB=' + encodeURIComponent(kB)\r\n    + '&compass_tab=conv'\r\n    + '&compass_intake=' + encodeURIComponent(intakePayload);\r\n\r\n  \/\/ Determine base URL:\r\n  \/\/ 1. WordPress plugin injects COMPASS_CHECKOUT_BASE (most reliable)\r\n  \/\/ 2. Fallback: direct add-to-cart URL using the product ID constant above\r\n  const productId = (window.COMPASS_PRODUCT_ID || COMPASS_PRODUCT_ID_FALLBACK || '').toString().trim();\r\n\r\n  let baseUrl;\r\n  if (window.COMPASS_CHECKOUT_BASE) {\r\n    \/\/ Injected by WordPress plugin \u2014 already includes ?add-to-cart=ID\r\n    baseUrl = window.COMPASS_CHECKOUT_BASE;\r\n  } else if (productId) {\r\n    \/\/ Product ID known \u2014 build direct add-to-cart URL\r\n    baseUrl = 'https:\/\/salomons.coach\/checkout\/?add-to-cart=' + productId;\r\n  } else {\r\n    \/\/ No product ID yet \u2014 send to the shop page with a note\r\n    \/\/ Remove this branch once the plugin is installed and ID is set above\r\n    alert(\r\n      'Payment setup is not yet complete.\\n\\n' +\r\n      'Steps to activate:\\n' +\r\n      '1. Install compass-paygate.php on salomons.coach\\n' +\r\n      '2. Find the auto-created product ID in WooCommerce > Products\\n' +\r\n      '3. Paste the ID into COMPASS_PRODUCT_ID_FALLBACK in compass.html\\n\\n' +\r\n      'Contact jan@salomons.coach for assistance.'\r\n    );\r\n    return;\r\n  }\r\n\r\n  \/\/ Append compass params \u2014 handle whether base already has ? or not\r\n  const separator = baseUrl.includes('?') ? '&' : '?';\r\n  const finalUrl  = baseUrl + separator + 'empty_cart=yes&' + compassParams;\r\n\r\n  closePaygate();\r\n  window.location.href = finalUrl;\r\n}\r\n\r\ndocument.addEventListener('keydown', e => {\r\n  if (e.key === 'Escape') closePaygate();\r\n});\r\n\r\n\/\/ \u2500\u2500 Token validation on page load \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\/\/ When a customer returns via the email download link:\r\n\/\/ salomons.coach\/compass\/?compass_token=xxx&pA=NL&pB=DE\r\n\/\/ We validate the token via WP REST, set the country pair,\r\n\/\/ and auto-trigger the PDF download.\r\n\r\nasync function checkDownloadToken() {\r\n  const params = new URLSearchParams(window.location.search);\r\n  const token  = params.get('compass_token');\r\n  const pA     = params.get('pA');\r\n  const pB     = params.get('pB');\r\n\r\n  if (!token || !pA || !pB) return; \/\/ not a token URL\r\n\r\n  \/\/ Show a token status bar above the tool\r\n  const bar = document.createElement('div');\r\n  bar.id = 'token-bar';\r\n  bar.style.cssText = [\r\n    'position:fixed;top:0;left:0;right:0;z-index:500;',\r\n    'background:#08152a;border-bottom:2px solid #c9a84c;',\r\n    'padding:12px 20px;text-align:center;',\r\n    'font-family:IBM Plex Sans,sans-serif;font-size:13px;color:#e8edf4;'\r\n  ].join('');\r\n  bar.innerHTML = '<span id=\"token-msg\">Validating your download link\u2026<\/span>';\r\n  document.body.prepend(bar);\r\n\r\n  function setTokenMsg(msg, color) {\r\n    const el = document.getElementById('token-msg');\r\n    if (el) { el.textContent = msg; el.style.color = color || '#e8edf4'; }\r\n  }\r\n\r\n  try {\r\n    \/\/ Use WP REST endpoint if available (on WordPress), else skip\r\n    const validateUrl = window.COMPASS_VALIDATE_URL\r\n      || '\/wp-json\/compass\/v1\/validate';\r\n\r\n    const res = await fetch(validateUrl + '?token=' + encodeURIComponent(token), {\r\n      headers: window.COMPASS_REST_NONCE\r\n        ? { 'X-WP-Nonce': window.COMPASS_REST_NONCE }\r\n        : {}\r\n    });\r\n\r\n    if (!res.ok) throw new Error('Network error ' + res.status);\r\n    const data = await res.json();\r\n\r\n    if (!data.valid) {\r\n      const reasons = {\r\n        expired:   'This download link has expired. Please contact jan@salomons.coach.',\r\n        exhausted: 'This download link has been used the maximum number of times.',\r\n        not_found: 'This download link is not valid. Please check your email.'\r\n      };\r\n      setTokenMsg(reasons[data.reason] || 'Invalid download link.', '#e07878');\r\n      return;\r\n    }\r\n\r\n    \/\/ Token valid \u2014 restore country pair + intake, generate full report\r\n    const rPA = data.pA || pA.toUpperCase();\r\n    const rPB = data.pB || pB.toUpperCase();\r\n\r\n    if (C[rPA] && C[rPB]) {\r\n      \/\/ Restore country pair\r\n      document.getElementById('selA').value = rPA;\r\n      document.getElementById('selB').value = rPB;\r\n\r\n      \/\/ Restore intake data if present in token response\r\n      if (data.intake) {\r\n        try {\r\n          const saved = JSON.parse(atob(data.intake));\r\n          intake.bg        = saved.bg        || '';\r\n          intake.working   = saved.working   || '';\r\n          intake.role      = saved.role      || '';\r\n          intake.situation = saved.situation || '';\r\n          intake.challenge = saved.challenge || '';\r\n          \/\/ Pre-fill form fields\r\n          ['bg','working','role','situation'].forEach(f => {\r\n            const el = document.getElementById('intake-' + f);\r\n            if (el && intake[f]) el.value = intake[f];\r\n          });\r\n          const ch = document.getElementById('intake-challenge');\r\n          if (ch) ch.value = intake.challenge;\r\n        } catch(e) { console.warn('Could not restore intake:', e); }\r\n      }\r\n\r\n      render();\r\n\r\n      setTokenMsg(\r\n        'Preparing your personalised ' + C[rPA].name + ' \u00d7 ' + C[rPB].name +\r\n        ' report\u2026 this takes a few seconds.',\r\n        '#c9a84c'\r\n      );\r\n\r\n      setTimeout(async () => {\r\n        try {\r\n          await generateFullReport(rPA, rPB);\r\n          setTokenMsg(\r\n            'Download complete. ' +\r\n            (data.uses_left > 0 ? data.uses_left + ' download(s) remaining on this link.' : 'No downloads remaining on this link.'),\r\n            '#2a9d8f'\r\n          );\r\n          \/\/ Clean token from URL without reload\r\n          const clean = window.location.pathname;\r\n          history.replaceState({}, '', clean);\r\n        } catch(e) {\r\n          setTokenMsg('Download failed. Please try the link again or contact jan@salomons.coach.', '#e07878');\r\n        }\r\n      }, 800);\r\n    } else {\r\n      setTokenMsg('Country pair not found in tool data. Please contact jan@salomons.coach.', '#e07878');\r\n    }\r\n\r\n  } catch(err) {\r\n    console.error('Token validation error:', err);\r\n    \/\/ Silently fail \u2014 user may be previewing the tool standalone\r\n    bar.style.display = 'none';\r\n  }\r\n}\r\n\r\n\/\/ \u2500\u2500 Example report \u2014 triggers PDF for DE vs NL \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction downloadExampleReport() {\r\n  const origA = document.getElementById('selA').value;\r\n  const origB = document.getElementById('selB').value;\r\n  \/\/ Temporarily set to DE\/NL, generate convergence PDF, restore\r\n  document.getElementById('selA').value = 'NL';\r\n  document.getElementById('selB').value = 'DE';\r\n  render(); \/\/ update charts to NL\/DE\r\n  setTimeout(() => {\r\n    downloadPDF('conv').then(() => {\r\n      \/\/ Restore original selection after download initiated\r\n      document.getElementById('selA').value = origA;\r\n      document.getElementById('selB').value = origB;\r\n      render();\r\n    });\r\n  }, 200);\r\n}\r\n\r\n\r\nasync function generateFullReport(kA, kB) {\r\n  const { jsPDF } = window.jspdf;\r\n  const cA = C[kA], cB = C[kB];\r\n  const nA = cA.name, nB = cB.name;\r\n  const previews = await generateLeadershipAnalysis(kA, kB);\r\n  const pdf = new jsPDF({ orientation:'p', unit:'mm', format:'a4' });\r\n  const PW=210,PH=297,ML=16,MR=16,MT=14,MB=40,CW=PW-ML-MR;\r\n  const year = new Date().getFullYear();\r\n  const W=[255,255,255],BGL=[242,245,249],BGC=[248,250,253],NAV=[10,22,40],DRK=[20,40,80];\r\n  const MID=[44,95,138],MUT=[90,120,155],GLD=[122,82,0],GBD=[201,168,76],TEL=[12,104,96];\r\n  const RED=[139,26,26];\r\n  let pageNum=1,y=0;\r\n  function f(r){pdf.setFillColor(r[0],r[1],r[2]);}\r\n  function s(r,w){pdf.setDrawColor(r[0],r[1],r[2]);if(w!==undefined)pdf.setLineWidth(w);}\r\n  function t(r,sz,bold){pdf.setTextColor(r[0],r[1],r[2]);pdf.setFontSize(sz);pdf.setFont('helvetica',bold?'bold':'normal');}\r\n  function safeStr(str){return String(str||'').replace(\/[^\\x00-\\xFF]\/g,'-');}\r\n\r\n  function drawHeader(){\r\n    f(BGL);pdf.rect(0,0,PW,23,'F');\r\n    s(GBD,0.5);pdf.line(0,23,PW,23);\r\n    t(GLD,9,true);pdf.text('SALOMONS.COACH',ML,10);\r\n    t(DRK,7,false);pdf.text('CROSS-CULTURAL LEADERSHIP COMPASS',ML,17);\r\n    const d=new Date().toLocaleDateString('en-GB',{day:'2-digit',month:'short',year:'numeric'});\r\n    t(MUT,7,false);pdf.text(d,PW-MR,10,{align:'right'});\r\n    t(GLD,7,false);pdf.text('salomons.coach',PW-MR,17,{align:'right'});\r\n  }\r\n\r\n  function drawFooter(){\r\n    const fy=PH-MB;\r\n    f(BGL);pdf.rect(0,fy-2,PW,MB+2,'F');\r\n    s(GBD,0.4);pdf.line(0,fy-2,PW,fy-2);\r\n    t(NAV,8,true);pdf.text('Salomons.Coach',ML,fy+5);\r\n    t(DRK,8,false);pdf.text('- Cross-Cultural Leadership Compass',ML+32,fy+5);\r\n    t(GLD,8,true);pdf.textWithLink('www.salomons.coach',PW-MR,fy+5,{align:'right',url:'https:\/\/salomons.coach'});\r\n    t(DRK,7,false);pdf.text(safeStr(nA)+' x '+safeStr(nB)+'  -  Country scores are national averages.',ML,fy+12);\r\n    t(MUT,6.5,false);pdf.text('Hofstede Insights - GLOBE (House et al. 2004) - WVS Wave 7 (2022) - Schwartz (2006)',ML,fy+19);\r\n    t(NAV,7,true);pdf.text('(c) '+year+' J.K. Salomons Holding B.V. - All rights reserved.',ML,fy+26);\r\n    t(MUT,6.5,false);pdf.text('Page '+pageNum+' - Personalised report generated by the Cross-Cultural Leadership Compass',ML,fy+33);\r\n  }\r\n\r\n  function newPage(){drawFooter();pdf.addPage();pageNum++;f(W);pdf.rect(0,0,PW,PH,'F');drawHeader();y=MT+14;}\r\n  function checkY(n){if(y+n>PH-MB-4)newPage();}\r\n\r\n  \/\/ Cover\r\n  f(W);pdf.rect(0,0,PW,PH,'F');drawHeader();\r\n  f(NAV);pdf.rect(0,35,PW,55,'F');\r\n  s(GBD,0.5);pdf.line(0,90,PW,90);\r\n  t(GBD,9,true);pdf.text('LEADERSHIP REPORT',ML,47);\r\n  t(W,20,true);pdf.text(safeStr(nA)+' x '+safeStr(nB),ML,58);\r\n  t([180,200,220],10,false);pdf.text('Cross-Cultural Leadership Compass - Four-Framework Analysis',ML,67);\r\n\r\n  y=98;\r\n  const ctxLines=[];\r\n  if(intake.bg&&C[intake.bg])ctxLines.push('Your background: '+C[intake.bg].name);\r\n  if(intake.working&&C[intake.working])ctxLines.push('Working context: '+C[intake.working].name);\r\n  if(intake.role&&ROLE_LABELS[intake.role])ctxLines.push('Your role: '+ROLE_LABELS[intake.role]);\r\n  if(intake.situation&&SITUATION_LABELS[intake.situation])ctxLines.push('Your situation: '+SITUATION_LABELS[intake.situation]);\r\n  const GENDER_LABELS = {'woman_male_dom':'Woman in male-dominated context','man_female_dom':'Man in female-dominated context','other_gender':'Gender dynamic applies'};\r\n  if(intake.gender&&GENDER_LABELS[intake.gender])ctxLines.push('Gender dynamic: '+GENDER_LABELS[intake.gender]);\r\n  if(intake.challenge)ctxLines.push('Your challenge: '+intake.challenge.slice(0,120));\r\n\r\n  if(ctxLines.length){\r\n    f(BGC);s([210,220,232],0.3);\r\n    pdf.roundedRect(ML,y,CW,8+ctxLines.length*6,2,2,'FD');\r\n    t(GLD,7,true);pdf.text('PERSONALISED FOR YOUR CONTEXT',ML+4,y+5.5);\r\n    t(NAV,8,false);\r\n    ctxLines.forEach(function(l,i){pdf.text(safeStr(l),ML+4,y+12+i*6);});\r\n    y+=16+ctxLines.length*6;\r\n  }\r\n\r\n  y+=8;\r\n  t(MUT,7.5,false);\r\n  pdf.text('This report covers 11 leadership dimensions: Executive Summary - Top 5 Gaps - Relationships - Team Building -',ML,y);y+=5;\r\n  pdf.text('Chairing Meetings - Attending Meetings - Managing Up - Managing Down - Peers - Communication - Trust.',ML,y);y+=5;\r\n  pdf.text('Includes full framework scores appendix.',ML,y);\r\n  drawFooter();\r\n\r\n  \/\/ Content pages\r\n  pdf.addPage();pageNum++;f(W);pdf.rect(0,0,PW,PH,'F');drawHeader();y=MT+14;\r\n\r\n  const SEC={exec_summary:'Executive Summary',top5_gaps:'Top 5 High-Priority Gaps',\r\n    relationships:'Building Professional Relationships',team_building:'Team Building',\r\n    chairing:'Chairing Meetings',attending:'Attending Meetings',managing_up:'Managing Up',\r\n    managing_down:'Managing Down',peers:'Dealing with Peers',communication:'Communication',trust:'Trust'};\r\n\r\n  LA_DIMS.forEach(function(dim,idx){\r\n    const preview=previews[dim.id]||'';\r\n    checkY(30);\r\n    f(BGL);s([210,220,232],0.2);pdf.roundedRect(ML,y,CW,9,1.5,1.5,'FD');\r\n    t(GLD,7.5,true);pdf.text(dim.num,ML+3,y+6);\r\n    t(NAV,9,true);pdf.text(SEC[dim.id]||dim.name,ML+14,y+6);\r\n    t(MUT,7,false);pdf.text('~'+dim.fullWords+' words in full report',PW-MR,y+6,{align:'right'});\r\n    y+=13;\r\n    checkY(20);\r\n    const lines=pdf.splitTextToSize(safeStr(preview),CW-12);\r\n    const tH=lines.length*4.8;\r\n    checkY(tH+10);\r\n    f([253,248,238]);s(GBD,0.3);pdf.roundedRect(ML,y,CW,tH+8,1.5,1.5,'FD');\r\n    t(NAV,8,false);pdf.text(lines,ML+4,y+6);\r\n    y+=tH+12;\r\n    y+=10;\r\n    if(idx<LA_DIMS.length-1){s([220,228,238],0.2);pdf.line(ML,y,PW-MR,y);y+=8;}\r\n  });\r\n\r\n  \/\/ Scores appendix\r\n  newPage();\r\n  t(GLD,7.5,true);pdf.text('APPENDIX - FRAMEWORK SCORES',ML,y);y+=8;\r\n  t(NAV,13,true);pdf.text(safeStr(nA)+' x '+safeStr(nB)+': Data Foundation',ML,y);y+=8;\r\n  s(GBD,0.35);pdf.line(ML,y,PW-MR,y);y+=8;\r\n\r\n  const gn=v=>Math.round((v-1)\/6*100);\r\n  const scoreRows=[\r\n    ['Hofstede','Power Distance (PDI)',cA.h[0],cB.h[0]],\r\n    ['Hofstede','Individualism (IDV)',cA.h[1],cB.h[1]],\r\n    ['Hofstede','Masculinity (MAS)',cA.h[2],cB.h[2]],\r\n    ['Hofstede','Uncertainty Avoidance (UAI)',cA.h[3],cB.h[3]],\r\n    ['Hofstede','Long-Term Orientation (LTO)',cA.h[4],cB.h[4]],\r\n    ['Hofstede','Indulgence (IVR)',cA.h[5],cB.h[5]],\r\n  ];\r\n  if(cA.g&&cB.g){\r\n    [['PO','Performance Orientation',0],['AS','Assertiveness',1],['FO','Future Orientation',2],\r\n     ['HO','Humane Orientation',3],['IGC','In-Group Collectivism',5],['PD','Power Distance',7],\r\n     ['UA','Uncertainty Avoidance',8]].forEach(function(g){\r\n      scoreRows.push(['GLOBE',g[1]+' ('+g[0]+')',gn(cA.g[g[2]]),gn(cB.g[g[2]])]);\r\n    });\r\n  }\r\n  [['Traditional\/Secular',0],['Survival\/Self-Expression',1],['Institutional Confidence',2]].forEach(function(w){\r\n    scoreRows.push(['WVS',w[0],cA.w[w[1]],cB.w[w[1]]]);\r\n  });\r\n  [['Embeddedness',0],['Hierarchy',1],['Mastery',2],['Intellectual Autonomy',3],\r\n   ['Affective Autonomy',4],['Egalitarianism',5],['Harmony',6]].forEach(function(sw){\r\n    scoreRows.push(['Schwartz',sw[0],cA.s[sw[1]],cB.s[sw[1]]]);\r\n  });\r\n\r\n  const COLS=[0.13,0.37,0.12,0.12,0.13,0.13].map(r=>r*CW);\r\n  function tRow(fw,dim,a,b,gap,hdr){\r\n    checkY(7);\r\n    const fill=hdr?[232,237,244]:[255,255,255];\r\n    const g=typeof gap==='number'?gap:0;\r\n    const dCol=g>=30?RED:g>=15?[192,120,0]:TEL;\r\n    f(fill);s([210,218,228],0.15);\r\n    let x=ML;\r\n    [[fw,0],[dim,1],[String(a),2],[String(b),3],[hdr?'Gap':'D'+g,4]].forEach(function(cell,i){\r\n      pdf.rect(x,y,COLS[i],6.5,'FD');\r\n      t(hdr?NAV:(i===2?[122,82,0]:i===3?TEL:i===4?dCol:[50,70,100]),hdr?6.5:7,hdr);\r\n      pdf.text(safeStr(cell[0]),x+1.5,y+4.5,{maxWidth:COLS[i]-3});\r\n      x+=COLS[i];\r\n    });\r\n    y+=6.5;\r\n  }\r\n  tRow('Framework','Dimension',safeStr(nA),safeStr(nB),'',true);\r\n  scoreRows.forEach(function(row){\r\n    const gap=Math.abs(Number(row[2])-Number(row[3]));\r\n    tRow(row[0],row[1],row[2],row[3],gap,false);\r\n  });\r\n\r\n  drawFooter();\r\n  const fname='compass-'+kA.toLowerCase()+'-'+kB.toLowerCase()+'-'+Date.now()+'.pdf';\r\n  pdf.save(fname);\r\n}\r\n\r\ninit();\r\ncheckDownloadToken();\r\n<\/script>\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Cross-Cultural Leadership Compass \u2014 Salomons.Coach Salomons.Coach \u00b7 Leadership Intelligence Cross-Cultural Leadership Compass Hofstede &nbsp;\u00b7&nbsp; GLOBE &nbsp;\u00b7&nbsp; World Values Survey &nbsp;\u00b7&nbsp; Schwartz &nbsp;\u2014 four frameworks, one view Country A vs Country B Hofstede GLOBE WVS Schwartz Convergence Cultural Profile Summary &nbsp;&#xB7;&nbsp; [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"rs_blank_template":"","rs_page_bg_color":"","slide_template_v7":"","_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"class_list":["post-11671","page","type-page","status-publish","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO Pro 4.9.7.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Cross-Cultural Leadership Compass \u2014 Salomons.Coach Salomons.Coach \u00b7 Leadership Intelligence Cross-Cultural Leadership Compass Hofstede \u00b7 GLOBE \u00b7 World Values Survey \u00b7 Schwartz \u2014 four frameworks, one view Country A vs Country B Hofstede GLOBE WVS Schwartz Convergence Cultural Profile Summary \u00b7 All Four Frameworks Country A Country B Nine convergence themes \u00b7 Composite scores across Hofstede,\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"google-site-verification\" content=\"-O4Usq8B4QhcjoRwcNVgdzzVlQNLiDAw2Hy2bNYQhTk\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/salomons.coach\/en\/cross-cultural-leadership-compass\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO Pro (AIOSEO) 4.9.7.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_GB\" \/>\n\t\t<meta property=\"og:site_name\" content=\"salomons.coach - Leadership Development &amp; Coaching\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Cross-Cultural Leadership Compass - salomons.coach\" \/>\n\t\t<meta property=\"og:description\" content=\"Cross-Cultural Leadership Compass \u2014 Salomons.Coach Salomons.Coach \u00b7 Leadership Intelligence Cross-Cultural Leadership Compass Hofstede \u00b7 GLOBE \u00b7 World Values Survey \u00b7 Schwartz \u2014 four frameworks, one view Country A vs Country B Hofstede GLOBE WVS Schwartz Convergence Cultural Profile Summary \u00b7 All Four Frameworks Country A Country B Nine convergence themes \u00b7 Composite scores across Hofstede,\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/salomons.coach\/en\/cross-cultural-leadership-compass\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/salomons.coach\/wp-content\/uploads\/2024\/06\/FS1904_JanXLGrowth_216-Jan-Salomons-no-background.png\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/salomons.coach\/wp-content\/uploads\/2024\/06\/FS1904_JanXLGrowth_216-Jan-Salomons-no-background.png\" \/>\n\t\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t\t<meta property=\"og:image:height\" content=\"683\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-04-01T05:39:28+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-05-02T14:19:55+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Jan.salomons.75\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:site\" content=\"@salomons_coach\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Cross-Cultural Leadership Compass - salomons.coach\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Cross-Cultural Leadership Compass \u2014 Salomons.Coach Salomons.Coach \u00b7 Leadership Intelligence Cross-Cultural Leadership Compass Hofstede \u00b7 GLOBE \u00b7 World Values Survey \u00b7 Schwartz \u2014 four frameworks, one view Country A vs Country B Hofstede GLOBE WVS Schwartz Convergence Cultural Profile Summary \u00b7 All Four Frameworks Country A Country B Nine convergence themes \u00b7 Composite scores across Hofstede,\" \/>\n\t\t<meta name=\"twitter:creator\" content=\"@salomons_coach\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/salomons.coach\/wp-content\/uploads\/2024\/06\/FS1904_JanXLGrowth_216-Jan-Salomons-no-background.png\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/salomons.coach\\\/en\\\/cross-cultural-leadership-compass\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/salomons.coach\\\/en#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/salomons.coach\\\/en\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/salomons.coach\\\/en\\\/cross-cultural-leadership-compass\\\/#listItem\",\"name\":\"Cross-Cultural Leadership Compass\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/salomons.coach\\\/en\\\/cross-cultural-leadership-compass\\\/#listItem\",\"position\":2,\"name\":\"Cross-Cultural Leadership Compass\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/salomons.coach\\\/en#listItem\",\"name\":\"Home\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/salomons.coach\\\/en\\\/#organization\",\"name\":\"salomons.coach Leadership Development & Coaching salomons.coach\",\"description\":\"Leadership Development & Coaching leadership development and coaching, change, culture, operations excellence\",\"url\":\"https:\\\/\\\/salomons.coach\\\/en\\\/\",\"email\":\"jan@salomons.coach\",\"telephone\":\"+31653897567\",\"foundingDate\":\"2018-06-01\",\"numberOfEmployees\":{\"@type\":\"QuantitativeValue\",\"minValue\":0,\"maxValue\":10},\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/salomons.coach\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/Logo-salomons.coach_.png\",\"@id\":\"https:\\\/\\\/salomons.coach\\\/en\\\/cross-cultural-leadership-compass\\\/#organizationLogo\",\"width\":369,\"height\":152},\"image\":{\"@id\":\"https:\\\/\\\/salomons.coach\\\/en\\\/cross-cultural-leadership-compass\\\/#organizationLogo\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/Jan.salomons.75\",\"https:\\\/\\\/x.com\\\/@salomons_coach\",\"https:\\\/\\\/www.instagram.com\\\/salomons.coach\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/jansalomons\"],\"address\":{\"@id\":\"https:\\\/\\\/salomons.coach\\\/en\\\/#postaladdress\",\"@type\":\"PostalAddress\",\"streetAddress\":\"Jonathan 4\",\"postalCode\":\"6662 JK\",\"addressLocality\":\"Elst\",\"addressRegion\":\"Gelderland\",\"addressCountry\":\"NL\"},\"vatID\":\"NL858997198B01\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/salomons.coach\\\/en\\\/cross-cultural-leadership-compass\\\/#webpage\",\"url\":\"https:\\\/\\\/salomons.coach\\\/en\\\/cross-cultural-leadership-compass\\\/\",\"name\":\"Cross-Cultural Leadership Compass - salomons.coach\",\"description\":\"Cross-Cultural Leadership Compass \\u2014 Salomons.Coach Salomons.Coach \\u00b7 Leadership Intelligence Cross-Cultural Leadership Compass Hofstede \\u00b7 GLOBE \\u00b7 World Values Survey \\u00b7 Schwartz \\u2014 four frameworks, one view Country A vs Country B Hofstede GLOBE WVS Schwartz Convergence Cultural Profile Summary \\u00b7 All Four Frameworks Country A Country B Nine convergence themes \\u00b7 Composite scores across Hofstede,\",\"inLanguage\":\"en-GB\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/salomons.coach\\\/en\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/salomons.coach\\\/en\\\/cross-cultural-leadership-compass\\\/#breadcrumblist\"},\"datePublished\":\"2026-04-01T06:39:28+01:00\",\"dateModified\":\"2026-05-02T15:19:55+01:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/salomons.coach\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/salomons.coach\\\/en\\\/\",\"name\":\"salomons.coach\",\"alternateName\":\"salomons.coach\",\"description\":\"Leadership Development & Coaching\",\"inLanguage\":\"en-GB\",\"publisher\":{\"@id\":\"https:\\\/\\\/salomons.coach\\\/en\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO Pro -->\r\n\t\t<title>Cross-Cultural Leadership Compass - salomons.coach<\/title>\n\n","aioseo_head_json":{"title":"Cross-Cultural Leadership Compass - salomons.coach","description":"Cross-Cultural Leadership Compass \u2014 Salomons.Coach Salomons.Coach \u00b7 Leadership Intelligence Cross-Cultural Leadership Compass Hofstede \u00b7 GLOBE \u00b7 World Values Survey \u00b7 Schwartz \u2014 four frameworks, one view Country A vs Country B Hofstede GLOBE WVS Schwartz Convergence Cultural Profile Summary \u00b7 All Four Frameworks Country A Country B Nine convergence themes \u00b7 Composite scores across Hofstede,","canonical_url":"https:\/\/salomons.coach\/en\/cross-cultural-leadership-compass\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"google-site-verification":"-O4Usq8B4QhcjoRwcNVgdzzVlQNLiDAw2Hy2bNYQhTk","miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BreadcrumbList","@id":"https:\/\/salomons.coach\/en\/cross-cultural-leadership-compass\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/salomons.coach\/en#listItem","position":1,"name":"Home","item":"https:\/\/salomons.coach\/en","nextItem":{"@type":"ListItem","@id":"https:\/\/salomons.coach\/en\/cross-cultural-leadership-compass\/#listItem","name":"Cross-Cultural Leadership Compass"}},{"@type":"ListItem","@id":"https:\/\/salomons.coach\/en\/cross-cultural-leadership-compass\/#listItem","position":2,"name":"Cross-Cultural Leadership Compass","previousItem":{"@type":"ListItem","@id":"https:\/\/salomons.coach\/en#listItem","name":"Home"}}]},{"@type":"Organization","@id":"https:\/\/salomons.coach\/en\/#organization","name":"salomons.coach Leadership Development & Coaching salomons.coach","description":"Leadership Development & Coaching leadership development and coaching, change, culture, operations excellence","url":"https:\/\/salomons.coach\/en\/","email":"jan@salomons.coach","telephone":"+31653897567","foundingDate":"2018-06-01","numberOfEmployees":{"@type":"QuantitativeValue","minValue":0,"maxValue":10},"logo":{"@type":"ImageObject","url":"https:\/\/salomons.coach\/wp-content\/uploads\/2024\/06\/Logo-salomons.coach_.png","@id":"https:\/\/salomons.coach\/en\/cross-cultural-leadership-compass\/#organizationLogo","width":369,"height":152},"image":{"@id":"https:\/\/salomons.coach\/en\/cross-cultural-leadership-compass\/#organizationLogo"},"sameAs":["https:\/\/www.facebook.com\/Jan.salomons.75","https:\/\/x.com\/@salomons_coach","https:\/\/www.instagram.com\/salomons.coach\/","https:\/\/www.linkedin.com\/in\/jansalomons"],"address":{"@id":"https:\/\/salomons.coach\/en\/#postaladdress","@type":"PostalAddress","streetAddress":"Jonathan 4","postalCode":"6662 JK","addressLocality":"Elst","addressRegion":"Gelderland","addressCountry":"NL"},"vatID":"NL858997198B01"},{"@type":"WebPage","@id":"https:\/\/salomons.coach\/en\/cross-cultural-leadership-compass\/#webpage","url":"https:\/\/salomons.coach\/en\/cross-cultural-leadership-compass\/","name":"Cross-Cultural Leadership Compass - salomons.coach","description":"Cross-Cultural Leadership Compass \u2014 Salomons.Coach Salomons.Coach \u00b7 Leadership Intelligence Cross-Cultural Leadership Compass Hofstede \u00b7 GLOBE \u00b7 World Values Survey \u00b7 Schwartz \u2014 four frameworks, one view Country A vs Country B Hofstede GLOBE WVS Schwartz Convergence Cultural Profile Summary \u00b7 All Four Frameworks Country A Country B Nine convergence themes \u00b7 Composite scores across Hofstede,","inLanguage":"en-GB","isPartOf":{"@id":"https:\/\/salomons.coach\/en\/#website"},"breadcrumb":{"@id":"https:\/\/salomons.coach\/en\/cross-cultural-leadership-compass\/#breadcrumblist"},"datePublished":"2026-04-01T06:39:28+01:00","dateModified":"2026-05-02T15:19:55+01:00"},{"@type":"WebSite","@id":"https:\/\/salomons.coach\/en\/#website","url":"https:\/\/salomons.coach\/en\/","name":"salomons.coach","alternateName":"salomons.coach","description":"Leadership Development & Coaching","inLanguage":"en-GB","publisher":{"@id":"https:\/\/salomons.coach\/en\/#organization"}}]},"og:locale":"en_GB","og:site_name":"salomons.coach - Leadership Development &amp; Coaching","og:type":"article","og:title":"Cross-Cultural Leadership Compass - salomons.coach","og:description":"Cross-Cultural Leadership Compass \u2014 Salomons.Coach Salomons.Coach \u00b7 Leadership Intelligence Cross-Cultural Leadership Compass Hofstede \u00b7 GLOBE \u00b7 World Values Survey \u00b7 Schwartz \u2014 four frameworks, one view Country A vs Country B Hofstede GLOBE WVS Schwartz Convergence Cultural Profile Summary \u00b7 All Four Frameworks Country A Country B Nine convergence themes \u00b7 Composite scores across Hofstede,","og:url":"https:\/\/salomons.coach\/en\/cross-cultural-leadership-compass\/","og:image":"https:\/\/salomons.coach\/wp-content\/uploads\/2024\/06\/FS1904_JanXLGrowth_216-Jan-Salomons-no-background.png","og:image:secure_url":"https:\/\/salomons.coach\/wp-content\/uploads\/2024\/06\/FS1904_JanXLGrowth_216-Jan-Salomons-no-background.png","og:image:width":1024,"og:image:height":683,"article:published_time":"2026-04-01T05:39:28+00:00","article:modified_time":"2026-05-02T14:19:55+00:00","article:publisher":"https:\/\/www.facebook.com\/Jan.salomons.75","twitter:card":"summary_large_image","twitter:site":"@salomons_coach","twitter:title":"Cross-Cultural Leadership Compass - salomons.coach","twitter:description":"Cross-Cultural Leadership Compass \u2014 Salomons.Coach Salomons.Coach \u00b7 Leadership Intelligence Cross-Cultural Leadership Compass Hofstede \u00b7 GLOBE \u00b7 World Values Survey \u00b7 Schwartz \u2014 four frameworks, one view Country A vs Country B Hofstede GLOBE WVS Schwartz Convergence Cultural Profile Summary \u00b7 All Four Frameworks Country A Country B Nine convergence themes \u00b7 Composite scores across Hofstede,","twitter:creator":"@salomons_coach","twitter:image":"https:\/\/salomons.coach\/wp-content\/uploads\/2024\/06\/FS1904_JanXLGrowth_216-Jan-Salomons-no-background.png"},"aioseo_meta_data":{"post_id":"11671","title":null,"description":null,"keywords":null,"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"WebPage","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"seo_analyzer_scan_date":"2026-05-02 14:34:05","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":"0","open_ai":null,"ai":{"faqs":[],"keyPoints":[],"titles":[],"descriptions":[],"socialPosts":{"email":[],"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"created":"2026-04-01 05:11:33","updated":"2026-05-02 14:36:10"},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t<a href=\"https:\/\/salomons.coach\/en\" title=\"Home\">Home<\/a>\n<\/span><span class=\"aioseo-breadcrumb-separator\">\u00bb<\/span><span class=\"aioseo-breadcrumb\">\n\tCross-Cultural Leadership Compass\n<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/salomons.coach\/en"},{"label":"Cross-Cultural Leadership Compass","link":"https:\/\/salomons.coach\/en\/cross-cultural-leadership-compass\/"}],"_links":{"self":[{"href":"https:\/\/salomons.coach\/en\/wp-json\/wp\/v2\/pages\/11671","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/salomons.coach\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/salomons.coach\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/salomons.coach\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/salomons.coach\/en\/wp-json\/wp\/v2\/comments?post=11671"}],"version-history":[{"count":42,"href":"https:\/\/salomons.coach\/en\/wp-json\/wp\/v2\/pages\/11671\/revisions"}],"predecessor-version":[{"id":12415,"href":"https:\/\/salomons.coach\/en\/wp-json\/wp\/v2\/pages\/11671\/revisions\/12415"}],"wp:attachment":[{"href":"https:\/\/salomons.coach\/en\/wp-json\/wp\/v2\/media?parent=11671"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}