careersgateway/src/templates.js
King Omar e7af09275a Add admin panel, announcements/specials system, homepage popup
- /admin: password-protected admin login (8-hour session cookie)
- /admin/dashboard: full inquiries table + announcement management
- Announcements: create promos with title, body, optional CTA button,
  optional expiry date; toggle active/inactive; delete
- Homepage: queries active non-expired announcement from D1 and renders
  a dismissible orange banner (localStorage persists per-announcement)
- D1 migration 004_announcements.sql: announcements table + index

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 15:00:16 +10:00

1034 lines
72 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const CSS = `
*{box-sizing:border-box;margin:0;padding:0}
body{font-family:'Segoe UI',Arial,sans-serif;color:#1a2744;background:#f8faff}
a{color:#1a5bb8;text-decoration:none}
a:hover{text-decoration:underline}
/* NAV */
nav{background:#fff;box-shadow:0 2px 8px rgba(0,0,0,.08);position:sticky;top:0;z-index:100}
.nav-inner{max-width:1200px;margin:0 auto;padding:0 24px;display:flex;align-items:center;justify-content:space-between;height:68px}
.nav-logo{display:flex;align-items:center;gap:10px}
.nav-logo span{color:#1a5bb8}
.nav-links{display:flex;gap:28px;align-items:center;list-style:none}
.nav-links a{font-size:.95rem;color:#1a2744;font-weight:500}
.nav-links a:hover{color:#1a5bb8;text-decoration:none}
.nav-cta{background:#1a5bb8;color:#fff!important;padding:9px 22px;border-radius:6px;font-weight:600!important}
.nav-cta:hover{background:#154fa0;text-decoration:none!important}
.nav-user{display:flex;align-items:center;gap:16px;font-size:.9rem}
/* HERO */
.hero{background:linear-gradient(135deg,#1a2744 0%,#1a5bb8 100%);color:#fff;padding:80px 24px;text-align:center}
.hero h1{font-size:2.8rem;font-weight:800;margin-bottom:16px;line-height:1.2}
.hero p{font-size:1.2rem;opacity:.9;max-width:600px;margin:0 auto 32px}
.hero-btns{display:flex;gap:16px;justify-content:center;flex-wrap:wrap}
.btn{display:inline-block;padding:13px 30px;border-radius:8px;font-weight:700;font-size:1rem;cursor:pointer;border:none;transition:.2s}
.btn-white{background:#fff;color:#1a5bb8}
.btn-white:hover{background:#e8f0fe;text-decoration:none}
.btn-outline{border:2px solid #fff;color:#fff;background:transparent}
.btn-outline:hover{background:rgba(255,255,255,.12);text-decoration:none}
.btn-primary{background:#1a5bb8;color:#fff}
.btn-primary:hover{background:#154fa0;text-decoration:none}
.btn-success{background:#16a34a;color:#fff}
.btn-success:hover{background:#15803d;text-decoration:none}
/* SECTIONS */
section{padding:64px 24px}
.container{max-width:1200px;margin:0 auto}
.section-title{font-size:2rem;font-weight:700;text-align:center;margin-bottom:12px;color:#1a2744}
.section-sub{text-align:center;color:#64748b;font-size:1.05rem;margin-bottom:48px}
/* SERVICES GRID */
.services-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:24px}
.service-card{background:#fff;border-radius:12px;padding:28px;box-shadow:0 2px 12px rgba(0,0,0,.06);transition:.2s;border:1px solid #e8f0fe}
.service-card:hover{transform:translateY(-3px);box-shadow:0 8px 24px rgba(26,91,184,.12)}
.service-icon{font-size:2rem;margin-bottom:12px}
.service-card h3{font-size:1.1rem;font-weight:700;margin-bottom:8px;color:#1a2744}
.service-card p{font-size:.9rem;color:#64748b;line-height:1.6}
.service-link{display:inline-block;margin-top:14px;font-size:.9rem;font-weight:600;color:#1a5bb8}
/* STATS */
.stats-bar{background:#1a5bb8;color:#fff;padding:40px 24px}
.stats-inner{max-width:1200px;margin:0 auto;display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:24px;text-align:center}
.stat-num{font-size:2.2rem;font-weight:800}
.stat-label{font-size:.9rem;opacity:.85;margin-top:4px}
/* WHY US */
.why-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:20px}
.why-card{background:#fff;border-radius:10px;padding:24px;border-left:4px solid #1a5bb8;box-shadow:0 2px 8px rgba(0,0,0,.05)}
.why-card h4{font-weight:700;margin-bottom:8px;color:#1a2744}
.why-card p{font-size:.9rem;color:#64748b}
/* TESTIMONIALS */
.testi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:24px}
.testi-card{background:#fff;border-radius:12px;padding:28px;box-shadow:0 2px 12px rgba(0,0,0,.06)}
.stars{color:#f59e0b;font-size:1.1rem;margin-bottom:12px}
.testi-text{color:#374151;font-style:italic;line-height:1.7;margin-bottom:16px}
.testi-name{font-weight:700;color:#1a2744}
/* FORMS */
.form-card{background:#fff;border-radius:16px;padding:40px;max-width:520px;margin:0 auto;box-shadow:0 4px 24px rgba(0,0,0,.08)}
.form-card h2{font-size:1.6rem;font-weight:700;margin-bottom:8px;text-align:center}
.form-card .sub{text-align:center;color:#64748b;margin-bottom:28px;font-size:.95rem}
.form-group{margin-bottom:18px}
.form-group label{display:block;font-weight:600;font-size:.9rem;margin-bottom:6px;color:#1a2744}
.form-group input,.form-group select,.form-group textarea{width:100%;padding:11px 14px;border:1.5px solid #d1d9e8;border-radius:8px;font-size:.95rem;transition:.2s;background:#fafbff}
.form-group input:focus,.form-group select:focus,.form-group textarea:focus{outline:none;border-color:#1a5bb8;background:#fff}
.form-group textarea{resize:vertical;min-height:100px}
.form-row{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.form-submit{width:100%;padding:13px;background:#1a5bb8;color:#fff;border:none;border-radius:8px;font-size:1rem;font-weight:700;cursor:pointer;transition:.2s;margin-top:8px}
.form-submit:hover{background:#154fa0}
.form-footer{text-align:center;margin-top:20px;font-size:.9rem;color:#64748b}
.alert{padding:12px 16px;border-radius:8px;margin-bottom:18px;font-size:.9rem}
.alert-success{background:#dcfce7;color:#16a34a;border:1px solid #bbf7d0}
.alert-error{background:#fee2e2;color:#dc2626;border:1px solid #fecaca}
.alert-info{background:#dbeafe;color:#1d4ed8;border:1px solid #bfdbfe}
/* COURSE SEARCH */
.search-bar{background:#fff;border-radius:12px;padding:28px;box-shadow:0 2px 12px rgba(0,0,0,.06);margin-bottom:32px}
.search-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px;align-items:end}
.search-grid .btn{padding:11px 24px;font-size:.95rem}
.results-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px}
.results-count{font-size:.95rem;color:#64748b}
.course-card{background:#fff;border-radius:10px;padding:22px;box-shadow:0 2px 8px rgba(0,0,0,.05);margin-bottom:16px;border:1px solid #e8f0fe;display:flex;justify-content:space-between;align-items:flex-start;gap:16px;flex-wrap:wrap}
.course-info h3{font-size:1.05rem;font-weight:700;color:#1a2744;margin-bottom:6px}
.course-meta{display:flex;gap:12px;flex-wrap:wrap;margin-top:8px}
.badge{display:inline-block;padding:3px 10px;border-radius:20px;font-size:.8rem;font-weight:600}
.badge-blue{background:#dbeafe;color:#1d4ed8}
.badge-green{background:#dcfce7;color:#166534}
.badge-gray{background:#f3f4f6;color:#374151}
.course-actions{display:flex;flex-direction:column;gap:8px;min-width:160px}
.btn-sm{padding:8px 16px;font-size:.85rem;border-radius:6px}
/* DASHBOARD */
.dash-grid{display:grid;grid-template-columns:240px 1fr;gap:28px;align-items:start}
.dash-sidebar{background:#fff;border-radius:12px;padding:24px;box-shadow:0 2px 8px rgba(0,0,0,.05)}
.dash-user{text-align:center;margin-bottom:24px;padding-bottom:20px;border-bottom:1px solid #e8f0fe}
.dash-avatar{width:64px;height:64px;background:#1a5bb8;border-radius:50%;display:flex;align-items:center;justify-content:center;color:#fff;font-size:1.6rem;font-weight:700;margin:0 auto 12px}
.dash-nav{list-style:none}
.dash-nav li{margin-bottom:4px}
.dash-nav a{display:block;padding:10px 14px;border-radius:8px;font-size:.95rem;color:#374151;font-weight:500;transition:.15s}
.dash-nav a:hover,.dash-nav a.active{background:#dbeafe;color:#1a5bb8;text-decoration:none}
.dash-main{display:flex;flex-direction:column;gap:24px}
.dash-card{background:#fff;border-radius:12px;padding:28px;box-shadow:0 2px 8px rgba(0,0,0,.05)}
.dash-card h3{font-size:1.1rem;font-weight:700;margin-bottom:18px;color:#1a2744;padding-bottom:12px;border-bottom:1px solid #e8f0fe}
.inquiry-row{padding:14px 0;border-bottom:1px solid #f1f5f9;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:8px}
.inquiry-row:last-child{border-bottom:none}
.inquiry-info{font-size:.9rem;color:#374151}
.inquiry-date{font-size:.8rem;color:#94a3b8}
/* FOOTER */
footer{background:#1a2744;color:#cbd5e1;padding:48px 24px 24px}
.footer-inner{max-width:1200px;margin:0 auto}
.footer-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:32px;margin-bottom:40px}
.footer-col h4{color:#fff;font-weight:700;margin-bottom:16px}
.footer-col ul{list-style:none}
.footer-col ul li{margin-bottom:8px}
.footer-col ul li a{color:#94a3b8;font-size:.9rem}
.footer-col ul li a:hover{color:#fff;text-decoration:none}
.footer-contact{font-size:.9rem;line-height:1.8;color:#94a3b8}
.footer-bottom{border-top:1px solid #2d3d5a;padding-top:20px;text-align:center;font-size:.85rem;color:#64748b}
/* KONPARE WIDGET */
.widget-wrap{background:#fff;border-radius:12px;box-shadow:0 2px 16px rgba(0,0,0,.1);overflow:hidden;position:relative}
.widget-wrap iframe{width:100%;border:none;height:820px;display:block}
.widget-fs-btn{position:absolute;top:10px;right:10px;z-index:10;background:rgba(0,0,0,.55);color:#fff;border:none;border-radius:6px;padding:6px 12px;font-size:.8rem;font-weight:600;cursor:pointer;display:flex;align-items:center;gap:6px;backdrop-filter:blur(4px);transition:.2s}
.widget-fs-btn:hover{background:rgba(0,0,0,.75)}
/* Fullscreen overlay mode */
.widget-overlay{display:none;position:fixed;inset:0;z-index:9999;background:#000;flex-direction:column}
.widget-overlay.active{display:flex}
.widget-overlay iframe{flex:1;width:100%;border:none}
.widget-overlay-bar{background:#1a2744;padding:10px 16px;display:flex;align-items:center;justify-content:space-between;flex-shrink:0}
.widget-overlay-bar span{color:#fff;font-weight:600;font-size:.9rem}
.widget-overlay-close{background:#dc2626;color:#fff;border:none;border-radius:6px;padding:6px 14px;font-size:.85rem;font-weight:700;cursor:pointer}
/* Native fullscreen styles */
#konpare-frame:fullscreen{width:100vw;height:100vh}
#konpare-frame:-webkit-full-screen{width:100vw;height:100vh}
@media(max-width:768px){
.hero h1{font-size:1.9rem}
.nav-links{display:none}
.dash-grid{grid-template-columns:1fr}
.form-row{grid-template-columns:1fr}
.course-card{flex-direction:column}
.course-actions{flex-direction:row;min-width:auto}
}
`;
const BASE_URL = 'https://careersgateway.com.au';
const DEFAULT_IMAGE = 'https://careersgateway.com.au/wp-content/uploads/2025/06/pexels-photo-1236421-1236421-scaled.jpg';
const SITE_NAME = 'Careers Gateway Australia';
function announcementBanner(ann) {
if (!ann) return '';
return `
<div id="cg-ann" style="background:linear-gradient(90deg,#ff6b00,#e63900);color:#fff;padding:0;overflow:hidden;position:relative;z-index:99">
<div style="max-width:1200px;margin:0 auto;padding:14px 24px;display:flex;align-items:center;gap:16px;flex-wrap:wrap">
<span style="font-size:1.3rem">🎉</span>
<div style="flex:1;min-width:200px">
<strong style="font-size:1rem">${esc(ann.title)}</strong>
<span style="margin-left:10px;font-size:.9rem;opacity:.92">${esc(ann.body)}</span>
</div>
${ann.cta_label && ann.cta_url ? `<a href="${esc(ann.cta_url)}" style="background:#fff;color:#e63900;font-weight:700;padding:8px 20px;border-radius:6px;font-size:.9rem;white-space:nowrap;text-decoration:none" onmouseover="this.style.background='#fff3ee'" onmouseout="this.style.background='#fff'">${esc(ann.cta_label)}</a>` : ''}
<button onclick="dismissAnn(${ann.id})" aria-label="Dismiss" style="background:rgba(255,255,255,.25);border:none;color:#fff;width:28px;height:28px;border-radius:50%;font-size:1.1rem;cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0;line-height:1">×</button>
</div>
</div>
<script>
(function(){
var k='cg-ann-dismissed-${ann.id}';
if(localStorage.getItem(k)){document.getElementById('cg-ann').style.display='none';}
})();
function dismissAnn(id){
localStorage.setItem('cg-ann-dismissed-'+id,'1');
var el=document.getElementById('cg-ann');
if(el){el.style.transition='max-height .3s,opacity .3s';el.style.maxHeight='0';el.style.opacity='0';setTimeout(function(){el.style.display='none';},350);}
}
</script>`;
}
function layout(title, body, user = null, extraHead = '', meta = {}, announcement = null) {
const fullTitle = `${title}${SITE_NAME}`;
const description = meta.description || 'Your trusted partner for education, migration, recruitment, and career services in Australia. Search CRICOS courses, get expert visa advice, and more.';
const image = meta.image || DEFAULT_IMAGE;
const url = meta.url ? `${BASE_URL}${meta.url}` : BASE_URL;
const type = meta.type || 'website';
const navUser = user
? `<div class="nav-user"><span>Hi, <strong>${esc(user.full_name.split(' ')[0])}</strong></span><a href="/dashboard" class="btn btn-primary btn-sm" style="padding:7px 16px;font-size:.85rem">Dashboard</a><a href="/logout" style="font-size:.85rem;color:#64748b">Logout</a></div>`
: `<div class="nav-user"><a href="/login">Login</a><a href="/register" class="btn btn-primary btn-sm" style="padding:7px 16px;font-size:.85rem">Register</a></div>`;
return `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>${esc(fullTitle)}</title>
<meta name="description" content="${esc(description)}">
<link rel="canonical" href="${esc(url)}">
<!-- Open Graph -->
<meta property="og:type" content="${esc(type)}">
<meta property="og:site_name" content="${esc(SITE_NAME)}">
<meta property="og:title" content="${esc(fullTitle)}">
<meta property="og:description" content="${esc(description)}">
<meta property="og:image" content="${esc(image)}">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:url" content="${esc(url)}">
<meta property="og:locale" content="en_AU">
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="${esc(fullTitle)}">
<meta name="twitter:description" content="${esc(description)}">
<meta name="twitter:image" content="${esc(image)}">
<meta name="twitter:site" content="@careersgateway">
<link rel="icon" type="image/png" sizes="32x32" href="https://careersgateway.com.au/wp-content/uploads/2025/06/cropped-Screenshot-2025-06-15-at-1.59.23_PM-300x159-removebg-preview-32x32.png">
<link rel="apple-touch-icon" sizes="180x180" href="https://careersgateway.com.au/wp-content/uploads/2025/06/cropped-Screenshot-2025-06-15-at-1.59.23_PM-300x159-removebg-preview-180x180.png">
<style>${CSS}</style>
${extraHead}
</head>
<body>
<nav>
<div class="nav-inner">
<a href="/" class="nav-logo"><img src="https://careersgateway.com.au/wp-content/uploads/2025/06/cropped-Screenshot-2025-06-15-at-1.59.23_PM-300x159-removebg-preview-192x192.png" alt="Careers Gateway" style="height:44px;width:auto;display:block"></a>
<ul class="nav-links">
<li><a href="/">Home</a></li>
<li><a href="/courses">Find Courses</a></li>
<li><a href="/services">Services</a></li>
<li><a href="/health-insurance">Health Insurance</a></li>
<li><a href="/contact">Contact</a></li>
<li><a href="/courses" class="nav-cta">Search CRICOS</a></li>
</ul>
<div style="display:flex;align-items:center;gap:12px">
<a href="https://www.instagram.com/careersgatewayaus/" target="_blank" rel="noopener" aria-label="Instagram" style="display:flex;align-items:center;color:#1a2744;transition:.15s" onmouseover="this.style.color='#E1306C'" onmouseout="this.style.color='#1a2744'">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zM12 0C8.741 0 8.333.014 7.053.072 2.695.272.273 2.69.073 7.052.014 8.333 0 8.741 0 12c0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98C8.333 23.986 8.741 24 12 24c3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98C15.668.014 15.259 0 12 0zm0 5.838a6.162 6.162 0 100 12.324 6.162 6.162 0 000-12.324zM12 16a4 4 0 110-8 4 4 0 010 8zm6.406-11.845a1.44 1.44 0 100 2.881 1.44 1.44 0 000-2.881z"/></svg>
</a>
<a href="https://www.facebook.com/profile.php?id=61576746571629" target="_blank" rel="noopener" aria-label="Facebook" style="display:flex;align-items:center;color:#1a2744;transition:.15s" onmouseover="this.style.color='#1877F2'" onmouseout="this.style.color='#1a2744'">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><path d="M24 12.073C24 5.41 18.627 0 12 0S0 5.41 0 12.073C0 18.1 4.388 23.094 10.125 24v-8.437H7.078v-3.49h3.047v-2.66c0-3.025 1.792-4.697 4.533-4.697 1.312 0 2.686.236 2.686.236v2.97h-1.513c-1.491 0-1.956.93-1.956 1.886v2.265h3.328l-.532 3.49h-2.796V24C19.612 23.094 24 18.1 24 12.073z"/></svg>
</a>
${navUser}
</div>
</div>
</nav>
${announcementBanner(announcement)}
${body}
<!-- WhatsApp floating button -->
<a href="https://wa.me/61405580047?text=Hi%20Careers%20Gateway%2C%20I%27d%20like%20to%20enquire%20about%20your%20services."
target="_blank" rel="noopener"
aria-label="Chat on WhatsApp"
style="position:fixed;bottom:24px;right:24px;z-index:999;width:58px;height:58px;background:#25D366;border-radius:50%;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 16px rgba(37,211,102,.45);transition:.2s"
onmouseover="this.style.transform='scale(1.1)'" onmouseout="this.style.transform='scale(1)'">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="30" height="30" fill="#fff">
<path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z"/>
</svg>
</a>
<footer>
<div class="footer-inner">
<div class="footer-grid">
<div class="footer-col">
<img src="https://careersgateway.com.au/wp-content/uploads/2025/06/cropped-Screenshot-2025-06-15-at-1.59.23_PM-300x159-removebg-preview-192x192.png" alt="Careers Gateway" style="height:40px;width:auto;margin-bottom:14px;filter:brightness(0) invert(1)"><br>
<p class="footer-contact">Your trusted partner for education, migration, and career services in Australia.<br><br>
📍 Sydney, NSW<br>📞 <a href="tel:+61283850414" style="color:#94a3b8">+61 2 8385 0414</a><br>📱 <a href="tel:+61405580047" style="color:#94a3b8">+61 405 580 047</a><br>✉️ contact@careersgateway.com.au</p>
<div style="display:flex;gap:14px;margin-top:16px">
<a href="https://www.instagram.com/careersgatewayaus/" target="_blank" rel="noopener" aria-label="Instagram"
style="width:36px;height:36px;background:#E1306C;border-radius:8px;display:flex;align-items:center;justify-content:center;transition:.15s"
onmouseover="this.style.opacity='.8'" onmouseout="this.style.opacity='1'">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="#fff"><path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zM12 0C8.741 0 8.333.014 7.053.072 2.695.272.273 2.69.073 7.052.014 8.333 0 8.741 0 12c0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98C8.333 23.986 8.741 24 12 24c3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98C15.668.014 15.259 0 12 0zm0 5.838a6.162 6.162 0 100 12.324 6.162 6.162 0 000-12.324zM12 16a4 4 0 110-8 4 4 0 010 8zm6.406-11.845a1.44 1.44 0 100 2.881 1.44 1.44 0 000-2.881z"/></svg>
</a>
<a href="https://www.facebook.com/profile.php?id=61576746571629" target="_blank" rel="noopener" aria-label="Facebook"
style="width:36px;height:36px;background:#1877F2;border-radius:8px;display:flex;align-items:center;justify-content:center;transition:.15s"
onmouseover="this.style.opacity='.8'" onmouseout="this.style.opacity='1'">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="#fff"><path d="M24 12.073C24 5.41 18.627 0 12 0S0 5.41 0 12.073C0 18.1 4.388 23.094 10.125 24v-8.437H7.078v-3.49h3.047v-2.66c0-3.025 1.792-4.697 4.533-4.697 1.312 0 2.686.236 2.686.236v2.97h-1.513c-1.491 0-1.956.93-1.956 1.886v2.265h3.328l-.532 3.49h-2.796V24C19.612 23.094 24 18.1 24 12.073z"/></svg>
</a>
<a href="https://wa.me/61405580047" target="_blank" rel="noopener" aria-label="WhatsApp"
style="width:36px;height:36px;background:#25D366;border-radius:8px;display:flex;align-items:center;justify-content:center;transition:.15s"
onmouseover="this.style.opacity='.8'" onmouseout="this.style.opacity='1'">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="#fff"><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z"/></svg>
</a>
</div>
</div>
<div class="footer-col">
<h4>Services</h4>
<ul>
<li><a href="/services/education">Education & Visa</a></li>
<li><a href="/services/migration">Migration Services</a></li>
<li><a href="/services/recruitment">Recruitment & Labour Hire</a></li>
<li><a href="/services/rpl">RPL Assessment</a></li>
<li><a href="/services/skills">Skills Assessment</a></li>
<li><a href="/health-insurance">OSHC/OVHC Insurance</a></li>
</ul>
</div>
<div class="footer-col">
<h4>Quick Links</h4>
<ul>
<li><a href="/courses">CRICOS Course Search</a></li>
<li><a href="/register">Create Account</a></li>
<li><a href="/contact">Book Consultation</a></li>
<li><a href="https://careersgateway.com.au">Main Website</a></li>
</ul>
</div>
</div>
<div class="footer-bottom">
© ${new Date().getFullYear()} Careers Gateway Australia. All rights reserved. |
<a href="https://careersgateway.com.au" style="color:#94a3b8">careersgateway.com.au</a>
</div>
</div>
</footer>
</body></html>`;
}
function esc(str) {
return String(str || '').replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;');
}
function homePage(user, announcement = null) {
return layout('Your Gateway to Success', `
<div class="hero" style="padding:0;overflow:hidden">
<div class="container" style="display:grid;grid-template-columns:1fr 420px;align-items:center;min-height:480px;padding:0 24px;gap:0">
<div style="padding:64px 0 64px">
<h1 style="font-size:2.8rem;font-weight:800;line-height:1.2;margin-bottom:16px">Your Gateway to<br>Success in Australia 🇦🇺</h1>
<p style="font-size:1.15rem;opacity:.9;max-width:520px;margin-bottom:32px;line-height:1.7">Guiding individuals and businesses through education, migration, and career pathways with certified, multilingual professionals.</p>
<div class="hero-btns" style="justify-content:flex-start">
<a href="/courses" class="btn btn-white">🔍 Search CRICOS Courses</a>
<a href="/contact" class="btn btn-outline">Book Free Consultation</a>
</div>
</div>
<div style="align-self:stretch;overflow:hidden;display:flex;align-items:flex-end;justify-content:center">
<img src="https://careersgateway.com.au/wp-content/uploads/2025/06/image-removebg-preview.png" alt="Careers Gateway consultant" style="height:420px;width:auto;object-fit:contain;display:block;margin-bottom:0">
</div>
</div>
<style>@media(max-width:768px){.hero .container{grid-template-columns:1fr!important;text-align:center}.hero .container>div:last-child{display:none!important}.hero-btns{justify-content:center!important}}</style>
</div>
<div class="stats-bar">
<div class="stats-inner">
<div><div class="stat-num">5,000+</div><div class="stat-label">Clients Helped</div></div>
<div><div class="stat-num">98%</div><div class="stat-label">Success Rate</div></div>
<div><div class="stat-num">15+</div><div class="stat-label">Years Experience</div></div>
<div><div class="stat-num">1,500+</div><div class="stat-label">CRICOS Institutions</div></div>
</div>
</div>
<section style="background:#fff">
<div class="container">
<h2 class="section-title">Our Services</h2>
<p class="section-sub">Comprehensive support for every stage of your Australian journey</p>
<div class="services-grid">
${[
['🎓','Education & Visa Services','Expert guidance on student visas, course selection, and institution enrolment through CRICOS-registered providers.','/services/education','https://careersgateway.com.au/wp-content/uploads/2025/06/pexels-photo-1236421-1236421-752x1024.jpg'],
['🌏','Migration Services','Skilled migration, family visas, employer nominations, and permanent residency pathways.','/services/migration','https://careersgateway.com.au/wp-content/uploads/elementor/thumbs/Migration-future-australia-r7jqyjculu61ydzz94zwmky24oekes2taopx24hd3c.png'],
['💼','Recruitment & Labour Hire','Connecting skilled professionals with Australian employers. RPL-recognised workforce solutions.','/services/recruitment','https://careersgateway.com.au/wp-content/uploads/2025/07/mentor-3512369_1280.jpg'],
['📋','RPL Assessment','Recognition of Prior Learning for tradespeople, nurses, engineers, and other professionals.','/services/rpl','https://careersgateway.com.au/wp-content/uploads/elementor/thumbs/RPL-r8449cmkno5if890q65m2xlkoc0jqxjasoh58up5zc.png'],
['✅','Skills Assessment','Formal skills assessments for visa and registration purposes across multiple industry bodies.','/services/skills','https://careersgateway.com.au/wp-content/uploads/elementor/thumbs/PR-Australia-r7jqpvafkuauvul9ve3rmrp0wr4pf9nxfs4pq9c2h4.png'],
['🏥','Health Insurance (OSHC/OVHC)','Compare and buy Overseas Student Health Cover and Overseas Visitor Health Cover instantly.','/health-insurance','https://careersgateway.com.au/wp-content/uploads/elementor/thumbs/pexels-photo-7163956-7163956-scaled-r7fvhsbi458lc1m0wz89g7f03sdjg52qxlmabibvpc.jpg'],
['💰','Easy Tax Return','Simple, fast Australian tax returns for international students and working holiday visa holders.','/services/tax','https://careersgateway.com.au/wp-content/uploads/2025/06/pexels-photo-1236421-1236421-220x300.jpg'],
['❤️','Aged Care Services','Placement and support services for aged care pathways and qualifications.','/services/aged-care','https://careersgateway.com.au/wp-content/uploads/2025/06/pixlr-image-generator-6852721300106a49ef49034b-300x300.jpg'],
].map(([icon,title,desc,link,img]) => `
<div class="service-card" style="padding:0;overflow:hidden">
<div style="height:160px;overflow:hidden;background:#e8f0fe">
<img src="${img}" alt="${title}" style="width:100%;height:100%;object-fit:cover;display:block" loading="lazy">
</div>
<div style="padding:22px">
<div class="service-icon">${icon}</div>
<h3>${title}</h3>
<p>${desc}</p>
<a href="${link}" class="service-link">Learn more →</a>
</div>
</div>
`).join('')}
</div>
</div>
</section>
<section style="background:#f0f6ff">
<div class="container">
<h2 class="section-title">Find Your Course</h2>
<p class="section-sub">Search thousands of CRICOS-registered courses from Australian institutions</p>
<form action="/courses" method="GET" style="background:#fff;border-radius:12px;padding:32px;box-shadow:0 2px 12px rgba(0,0,0,.06);max-width:800px;margin:0 auto">
<div class="search-grid">
<div class="form-group" style="margin:0">
<label>Course Name</label>
<input type="text" name="courseName" placeholder="e.g. Bachelor of Nursing">
</div>
<div class="form-group" style="margin:0">
<label>State</label>
<select name="state">
<option value="">All States</option>
<option>NSW</option><option>VIC</option><option>QLD</option>
<option>WA</option><option>SA</option><option>TAS</option>
<option>ACT</option><option>NT</option>
</select>
</div>
<div class="form-group" style="margin:0">
<label>Course Level</label>
<select name="courseLevel">
<option value="">All Levels</option>
<option value="1">Bachelor Degree</option>
<option value="2">Master Degree</option>
<option value="3">Doctoral Degree</option>
<option value="4">Diploma</option>
<option value="5">Certificate</option>
<option value="6">Advanced Diploma</option>
<option value="7">Graduate Certificate</option>
<option value="8">Graduate Diploma</option>
</select>
</div>
<div style="display:flex;align-items:flex-end">
<button type="submit" class="btn btn-primary" style="width:100%;padding:11px">🔍 Search</button>
</div>
</div>
</form>
</div>
</section>
<section>
<div class="container">
<h2 class="section-title">Why Choose Us?</h2>
<p class="section-sub">Five reasons thousands trust Careers Gateway</p>
<div class="why-grid">
${[
['🏅','MARA Registered Agents','All migration advice from registered MARA agents — fully compliant and trustworthy.'],
['🌐','Multilingual Support','We speak your language. Services available in English, Hindi, Nepali, and more.'],
['🔄','End-to-End Service','From course selection to visa lodgement to arrival — one team, the whole journey.'],
['📊','Proven Track Record','98% success rate across thousands of student and migration visa applications.'],
['💡','Transparent Pricing','No hidden fees. Clear, upfront pricing with written agreements for all services.'],
].map(([icon,title,desc]) => `
<div class="why-card">
<h4>${icon} ${title}</h4>
<p>${desc}</p>
</div>
`).join('')}
</div>
</div>
</section>
<section style="background:#f0f6ff">
<div class="container">
<div style="display:grid;grid-template-columns:340px 1fr;gap:48px;align-items:center">
<div>
<img src="https://careersgateway.com.au/wp-content/uploads/elementor/thumbs/career-bijendra-sir-r7juads0rjdgs6e5oqchau1e6jow26qbi4k3ky7bwy.jpg" alt="Bijendra Shrestha — CEO, Careers Gateway" style="width:100%;border-radius:16px;box-shadow:0 8px 32px rgba(26,91,184,.15);display:block">
</div>
<div>
<div style="color:#1a5bb8;font-weight:700;font-size:.9rem;text-transform:uppercase;letter-spacing:1px;margin-bottom:12px">Message from Our CEO</div>
<h2 style="font-size:1.8rem;font-weight:800;color:#1a2744;margin-bottom:16px;line-height:1.3">Committed to Your<br>Australian Success</h2>
<p style="color:#374151;line-height:1.8;font-size:1rem;margin-bottom:12px">"At Careers Gateway, we believe every person deserves honest, expert guidance on their Australian journey — whether that's finding the right course, securing a visa, or building a career."</p>
<p style="color:#374151;line-height:1.8;font-size:1rem;margin-bottom:24px">"Our team of certified professionals is multilingual, experienced, and genuinely invested in your success. We don't just process paperwork — we walk the journey with you."</p>
<div style="font-weight:700;color:#1a2744">Bijendra Shrestha</div>
<div style="color:#64748b;font-size:.9rem">CEO & Founder, Careers Gateway Australia</div>
</div>
</div>
<style>@media(max-width:768px){.ceo-grid{grid-template-columns:1fr!important}}</style>
</div>
</section>
<section style="background:#fff">
<div class="container">
<h2 class="section-title">What Our Clients Say</h2>
<p class="section-sub">Real stories from real people</p>
<div class="testi-grid">
${[
['Priya S.','Sydney','Careers Gateway made my student visa process so easy. They found me the perfect nursing course and handled everything. Couldn\'t recommend them more highly!','https://careersgateway.com.au/wp-content/uploads/2025/06/d2b9123d-49a5-4e9e-b39d-b2ab74381797-150x150.jpeg'],
['Raj M.','Melbourne','From RPL assessment to skills recognition — the team was professional and quick. I got my qualification recognised within 3 months.','https://careersgateway.com.au/wp-content/uploads/2025/06/fb1ff635-d713-4dff-8262-995ea063c13d-150x150.jpeg'],
['Anita K.','Brisbane','The migration team helped my whole family get permanent residency. They were patient, thorough, and available whenever we needed them.','https://careersgateway.com.au/wp-content/uploads/2025/06/pixlr-image-generator-6852721300106a49ef49034b-300x300.jpg'],
].map(([name,city,text,photo]) => `
<div class="testi-card">
<div style="display:flex;align-items:center;gap:12px;margin-bottom:14px">
<img src="${photo}" alt="${name}" style="width:48px;height:48px;border-radius:50%;object-fit:cover">
<div>
<div class="testi-name">${name}</div>
<div style="color:#94a3b8;font-size:.85rem">${city}</div>
</div>
</div>
<div class="stars">★★★★★</div>
<p class="testi-text">"${text}"</p>
</div>
`).join('')}
</div>
</div>
</section>
<section style="background:#f8faff">
<div class="container">
<h2 class="section-title">Latest News & Insights</h2>
<p class="section-sub">Stay informed about Australian migration, education, and career developments</p>
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:24px">
${[
['How RPL Can Fast-Track Your PR Path','Recognition of Prior Learning is one of the fastest routes to Australian permanent residency for skilled tradespeople.','/services/rpl','https://careersgateway.com.au/wp-content/uploads/2025/07/RPL.png'],
['Australian Migration Rules Mid-2025','Key changes to skilled migration, student visas, and employer nominations you need to know about.','/services/migration','https://careersgateway.com.au/wp-content/uploads/elementor/thumbs/PR-Australia-r7jqpvafkuauvul9ve3rmrp0wr4pf9nxfs4pq9c2h4.png'],
['Scholarships for International Students','2025 scholarship opportunities at Australian universities for international students.','/courses','https://careersgateway.com.au/wp-content/uploads/elementor/thumbs/mentor-3512369_1280-r843m5xw2sew1hxg45cwks8966alvphnlx5z352rgo.jpg'],
['Beware of Migration Scams','How to identify dodgy migration agents and protect yourself from visa fraud in Australia.','/contact','https://careersgateway.com.au/wp-content/uploads/elementor/thumbs/compressed_fraud_image_under_2mb-r7jridq6vxbz216bdpsd9kodliliwqutcwixsf25qg.jpg'],
['Future of Australian Migration','What changes are coming to Australian migration policy over the next 5 years.','/services/migration','https://careersgateway.com.au/wp-content/uploads/elementor/thumbs/Migration-future-australia-r7jqyjculu61ydzz94zwmky24oekes2taopx24hd3c.png'],
['Navigating PR Pathways','Your complete guide to Australian permanent residency — pathways, timelines, and requirements.','/services/migration','https://careersgateway.com.au/wp-content/uploads/elementor/thumbs/PR-Australia-r7jqpvafkuauvul9ve3rmrp0wr4pf9nxfs4pq9c2h4.png'],
].map(([title,excerpt,link,img]) => `
<a href="${link}" style="text-decoration:none;color:inherit">
<div style="background:#fff;border-radius:12px;overflow:hidden;box-shadow:0 2px 8px rgba(0,0,0,.06);transition:.2s;height:100%" onmouseover="this.style.transform='translateY(-3px)';this.style.boxShadow='0 8px 24px rgba(26,91,184,.12)'" onmouseout="this.style.transform='';this.style.boxShadow='0 2px 8px rgba(0,0,0,.06)'">
<div style="height:160px;overflow:hidden;background:#e8f0fe">
<img src="${img}" alt="${title}" style="width:100%;height:100%;object-fit:cover;display:block" loading="lazy">
</div>
<div style="padding:18px">
<h4 style="font-weight:700;font-size:.95rem;color:#1a2744;margin-bottom:8px;line-height:1.4">${title}</h4>
<p style="font-size:.85rem;color:#64748b;line-height:1.6">${excerpt}</p>
<div style="margin-top:12px;font-size:.85rem;font-weight:600;color:#1a5bb8">Read more →</div>
</div>
</div>
</a>
`).join('')}
</div>
</div>
</section>
<section style="background:linear-gradient(135deg,#1a2744,#1a5bb8);color:#fff;text-align:center">
<div class="container">
<h2 style="font-size:2rem;font-weight:800;margin-bottom:12px">Ready to Start Your Journey?</h2>
<p style="opacity:.9;margin-bottom:32px;font-size:1.1rem">Book a free consultation with our experts today</p>
<div style="display:flex;gap:16px;justify-content:center;flex-wrap:wrap">
<a href="/register" class="btn btn-white">Create Free Account</a>
<a href="/contact" class="btn btn-outline">Book Consultation</a>
</div>
</div>
</section>
`, user, '', { url: '/', description: 'Careers Gateway Australia — your trusted partner for education, migration, recruitment, RPL, and visa services. Search 26,000+ CRICOS courses and book a free consultation.', image: 'https://careersgateway.com.au/wp-content/uploads/2025/06/pexels-photo-1236421-1236421-scaled.jpg' }, announcement);
}
function coursesPage(user, results, params, fromCache, error, savedCode = '') {
const hasSearch = Object.values(params).some(v => v);
const stateOptions = ['NSW','VIC','QLD','WA','SA','TAS','ACT','NT'];
const levelOptions = [['1','Bachelor Degree'],['2','Master Degree'],['3','Doctoral Degree'],['4','Diploma'],['5','Certificate'],['6','Advanced Diploma'],['7','Graduate Certificate'],['8','Graduate Diploma']];
// Build the back URL (current search) so save redirects back here
const backUrl = '/courses?' + Object.entries(params).filter(([,v])=>v).map(([k,v])=>`${k}=${encodeURIComponent(v)}`).join('&');
const courseMeta = { url: '/courses', description: 'Search 26,000+ CRICOS-registered courses from Australian universities and colleges. Filter by state, level, and field of study. Free account required to view results.', image: 'https://careersgateway.com.au/wp-content/uploads/2025/06/pexels-photo-1236421-1236421-scaled.jpg' };
return layout('CRICOS Course Search', `
<section style="background:linear-gradient(135deg,#1a2744,#1a5bb8);padding:40px 24px;color:#fff;text-align:center">
<div class="container">
<h1 style="font-size:2rem;font-weight:800;margin-bottom:8px">🔍 CRICOS Course Search</h1>
<p style="opacity:.9">Search thousands of courses from CRICOS-registered Australian institutions</p>
</div>
</section>
<section>
<div class="container">
${savedCode ? `
<div style="background:#dcfce7;border:1px solid #bbf7d0;border-radius:10px;padding:14px 18px;margin-bottom:20px;display:flex;align-items:center;gap:12px">
<span style="font-size:1.3rem">✅</span>
<div>
<strong style="color:#166534">Course saved to your dashboard!</strong>
<span style="color:#166534;font-size:.9rem;margin-left:8px">View all saved courses in your <a href="/dashboard" style="color:#15803d;font-weight:700">dashboard</a>.</span>
</div>
</div>` : ''}
<form action="/courses" method="GET" class="search-bar">
<div class="search-grid">
<div class="form-group" style="margin:0">
<label>Course Name</label>
<input type="text" name="courseName" placeholder="e.g. Bachelor of Nursing" value="${esc(params.courseName||'')}">
</div>
<div class="form-group" style="margin:0">
<label>CRICOS Code</label>
<input type="text" name="cricosCode" placeholder="e.g. 093765C" value="${esc(params.cricosCode||'')}">
</div>
<div class="form-group" style="margin:0">
<label>State</label>
<select name="state">
<option value="">All States</option>
${stateOptions.map(s => `<option value="${s}"${params.state===s?' selected':''}>${s}</option>`).join('')}
</select>
</div>
<div class="form-group" style="margin:0">
<label>Course Level</label>
<select name="courseLevel">
<option value="">All Levels</option>
${levelOptions.map(([v,l]) => `<option value="${v}"${params.courseLevel===v?' selected':''}>${l}</option>`).join('')}
</select>
</div>
<div style="display:flex;align-items:flex-end;gap:8px">
<button type="submit" class="btn btn-primary" style="flex:1;padding:11px">🔍 Search</button>
<a href="/courses" class="btn" style="padding:11px 14px;background:#f1f5f9;color:#374151">Clear</a>
</div>
</div>
</form>
${!hasSearch ? `
<div style="text-align:center;padding:60px 20px;color:#64748b">
<div style="font-size:3rem;margin-bottom:16px">🎓</div>
<h3 style="font-size:1.3rem;margin-bottom:8px;color:#1a2744">Search CRICOS-Registered Courses</h3>
<p>Enter a course name, state, or level above to find courses from Australian institutions</p>
</div>
` : error ? `
<div class="alert alert-error">Unable to fetch CRICOS data right now. Please try again shortly.</div>
` : results.length === 0 ? `
<div style="text-align:center;padding:60px 20px;color:#64748b">
<div style="font-size:3rem;margin-bottom:16px">🔎</div>
<h3 style="font-size:1.3rem;margin-bottom:8px;color:#1a2744">No courses found</h3>
<p>Try broadening your search — use fewer keywords or remove filters</p>
</div>
` : `
${!user ? `
<div class="results-header">
<div class="results-count"><strong>${results.length}</strong> courses found</div>
</div>
<div style="position:relative">
${results.slice(0,3).map(c => `
<div class="course-card" style="filter:blur(5px);user-select:none;pointer-events:none">
<div class="course-info">
<h3>${esc(c.courseName || 'Course')}</h3>
<div style="color:#64748b;font-size:.9rem;margin-bottom:6px">${esc(c.provider || '')}</div>
<div class="course-meta">
${c.cricosCode ? `<span class="badge badge-blue">CRICOS: ${esc(c.cricosCode)}</span>` : ''}
${c.level ? `<span class="badge badge-gray">${esc(c.level)}</span>` : ''}
${(c.city || c.state) ? `<span class="badge badge-gray">📍 ${esc([c.city,c.state].filter(Boolean).join(', '))}</span>` : ''}
${c.durationWeeks ? `<span class="badge badge-gray">⏱ ${esc(String(c.durationWeeks))} weeks</span>` : ''}
${c.tuitionFee ? `<span class="badge badge-green">💰 ${esc(c.tuitionFee)}</span>` : ''}
</div>
</div>
<div class="course-actions">
<span class="btn btn-primary btn-sm">Book Consultation</span>
</div>
</div>
`).join('')}
<div style="position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:linear-gradient(to bottom,rgba(248,250,255,0) 0%,rgba(248,250,255,.92) 30%,rgba(248,250,255,1) 100%)">
<div style="text-align:center;padding:32px;max-width:480px">
<div style="font-size:2.5rem;margin-bottom:12px">🔓</div>
<h3 style="font-size:1.4rem;font-weight:800;color:#1a2744;margin-bottom:10px">Create a free account to view all ${results.length} courses</h3>
<p style="color:#64748b;margin-bottom:24px;line-height:1.6">Register in 30 seconds to access full course details, save favourites, and book consultations with our expert advisors.</p>
<div style="display:flex;gap:12px;justify-content:center;flex-wrap:wrap">
<a href="/register?redirect=/courses%3F${encodeURIComponent(Object.entries(params).filter(([,v])=>v).map(([k,v])=>k+'='+encodeURIComponent(v)).join('&'))}" class="btn btn-primary" style="padding:12px 28px">Create Free Account</a>
<a href="/login?redirect=/courses%3F${encodeURIComponent(Object.entries(params).filter(([,v])=>v).map(([k,v])=>k+'='+encodeURIComponent(v)).join('&'))}" class="btn" style="padding:12px 28px;background:#fff;color:#1a5bb8;border:2px solid #1a5bb8">Login</a>
</div>
<div style="margin-top:16px;font-size:.85rem;color:#94a3b8">Free forever · No credit card required</div>
</div>
</div>
</div>
` : `
<div class="results-header">
<div class="results-count"><strong>${results.length}</strong> courses found ${fromCache ? '<span style="color:#94a3b8;font-size:.8rem">(cached)</span>' : ''}</div>
</div>
${results.map(c => `
<div class="course-card">
<div class="course-info">
<h3>${esc(c.courseName || 'Course')}</h3>
<div style="color:#64748b;font-size:.9rem;margin-bottom:6px">${esc(c.provider || '')}</div>
<div class="course-meta">
${c.cricosCode ? `<span class="badge badge-blue">CRICOS: ${esc(c.cricosCode)}</span>` : ''}
${c.level ? `<span class="badge badge-gray">${esc(c.level)}</span>` : ''}
${(c.city || c.state) ? `<span class="badge badge-gray">📍 ${esc([c.city,c.state].filter(Boolean).join(', '))}</span>` : ''}
${c.durationWeeks ? `<span class="badge badge-gray">⏱ ${esc(String(c.durationWeeks))} weeks</span>` : ''}
${c.tuitionFee ? `<span class="badge badge-green">💰 ${esc(c.tuitionFee)}</span>` : ''}
${c.vetCode ? `<span class="badge badge-gray">VET: ${esc(c.vetCode)}</span>` : ''}
</div>
</div>
<div class="course-actions">
<a href="/contact?course=${encodeURIComponent(c.courseName||'')}&code=${encodeURIComponent(c.cricosCode||'')}&provider=${encodeURIComponent(c.provider||'')}" class="btn btn-primary btn-sm">Book Consultation</a>
${c.cricosCode === savedCode
? `<span class="btn btn-sm" style="background:#dcfce7;color:#166534;text-align:center;cursor:default">✅ Saved</span>`
: `<a href="/dashboard/save?code=${encodeURIComponent(c.cricosCode||'')}&name=${encodeURIComponent(c.courseName||'')}&provider=${encodeURIComponent(c.provider||'')}&back=${encodeURIComponent(backUrl)}" class="btn btn-sm" style="background:#f0f6ff;color:#1a5bb8;text-align:center">💾 Save</a>`
}
</div>
</div>
`).join('')}
`}
`}
<div style="margin-top:32px;padding:20px;background:#f0f6ff;border-radius:10px;text-align:center">
<p style="color:#1a2744;font-weight:600;margin-bottom:8px">Need help choosing the right course?</p>
<p style="color:#64748b;font-size:.9rem;margin-bottom:14px">Our education advisors speak your language and know the Australian system inside out</p>
<a href="/contact" class="btn btn-primary">Book Free Consultation</a>
</div>
</div>
</section>
`, user, '', courseMeta);
}
function registerPage(error, values = {}) {
return layout('Create Account', `
<section style="padding:60px 24px;background:#f0f6ff;min-height:80vh">
<div class="form-card">
<h2>Create Your Account</h2>
<p class="sub">Track courses, save inquiries, and get personalised support</p>
${error ? `<div class="alert alert-error">${esc(error)}</div>` : ''}
<form method="POST" action="/register">
<div class="form-row">
<div class="form-group">
<label>Full Name *</label>
<input type="text" name="full_name" required placeholder="Your full name" value="${esc(values.full_name||'')}">
</div>
<div class="form-group">
<label>Phone *</label>
<input type="tel" name="phone" required placeholder="+61 4XX XXX XXX" value="${esc(values.phone||'')}">
</div>
</div>
<div class="form-group">
<label>Email Address *</label>
<input type="email" name="email" required placeholder="you@example.com" value="${esc(values.email||'')}">
</div>
<div class="form-group">
<label>Password *</label>
<input type="password" name="password" required placeholder="Minimum 8 characters" minlength="8">
</div>
<div class="form-group">
<label>Confirm Password *</label>
<input type="password" name="confirm_password" required placeholder="Repeat your password">
</div>
<button type="submit" class="form-submit">Create Account</button>
</form>
<div class="form-footer">Already have an account? <a href="/login">Login here</a></div>
</div>
</section>
`, null, '', { url: '/register', description: 'Create a free Careers Gateway account to access CRICOS course search, save favourites, and book consultations with our expert advisors.' });
}
function loginPage(error, redirect = '') {
return layout('Login', `
<section style="padding:60px 24px;background:#f0f6ff;min-height:80vh">
<div class="form-card">
<h2>Welcome Back</h2>
<p class="sub">Login to your Careers Gateway account</p>
${error ? `<div class="alert alert-error">${esc(error)}</div>` : ''}
<form method="POST" action="/login">
<input type="hidden" name="redirect" value="${esc(redirect)}">
<div class="form-group">
<label>Email Address</label>
<input type="email" name="email" required placeholder="you@example.com" autofocus>
</div>
<div class="form-group">
<label>Password</label>
<input type="password" name="password" required placeholder="Your password">
</div>
<button type="submit" class="form-submit">Login</button>
</form>
<div class="form-footer">Don't have an account? <a href="/register">Register free</a></div>
</div>
</section>
`, null, '', { url: '/login', description: 'Login to your Careers Gateway account to access CRICOS course search, saved courses, and your consultation history.' });
}
function dashboardPage(user, inquiries) {
const initials = user.full_name.split(' ').map(w => w[0]).join('').toUpperCase().slice(0,2);
return layout('Dashboard', `
<section style="padding:40px 24px;min-height:80vh">
<div class="container">
<div class="dash-grid">
<div class="dash-sidebar">
<div class="dash-user">
<div class="dash-avatar">${esc(initials)}</div>
<div style="font-weight:700;color:#1a2744">${esc(user.full_name)}</div>
<div style="font-size:.85rem;color:#94a3b8;margin-top:4px">${esc(user.email)}</div>
</div>
<ul class="dash-nav">
<li><a href="/dashboard" class="active">📊 Overview</a></li>
<li><a href="/courses">🔍 Search Courses</a></li>
<li><a href="/contact">📝 New Inquiry</a></li>
<li><a href="/health-insurance">🏥 Health Insurance</a></li>
<li><a href="/dashboard/profile">👤 My Profile</a></li>
<li><a href="/logout" style="color:#dc2626">🚪 Logout</a></li>
</ul>
</div>
<div class="dash-main">
<div class="dash-card">
<h3>Welcome back, ${esc(user.full_name.split(' ')[0])}! 👋</h3>
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:16px">
<div style="background:#f0f6ff;border-radius:8px;padding:16px;text-align:center">
<div style="font-size:1.8rem;font-weight:700;color:#1a5bb8">${inquiries.length}</div>
<div style="font-size:.85rem;color:#64748b;margin-top:4px">Inquiries</div>
</div>
<div style="background:#f0fdf4;border-radius:8px;padding:16px;text-align:center">
<div style="font-size:1.8rem;font-weight:700;color:#16a34a">${inquiries.filter(i=>i.kondesk_sent).length}</div>
<div style="font-size:.85rem;color:#64748b;margin-top:4px">Processed</div>
</div>
</div>
</div>
<div class="dash-card">
<h3>My Inquiries</h3>
${inquiries.length === 0 ? `
<div style="text-align:center;padding:30px 0;color:#94a3b8">
<div style="font-size:2rem;margin-bottom:10px">📋</div>
<p>No inquiries yet. <a href="/contact">Book a consultation</a> or <a href="/courses">search courses</a>.</p>
</div>
` : inquiries.map(i => `
<div class="inquiry-row">
<div>
<div class="inquiry-info"><strong>${esc(i.service||'General Inquiry')}</strong>${i.cricos_course_name ? `${esc(i.cricos_course_name)}` : ''}</div>
${i.cricos_provider ? `<div style="font-size:.85rem;color:#64748b">${esc(i.cricos_provider)}</div>` : ''}
<div class="inquiry-date">${new Date(i.created_at).toLocaleDateString('en-AU',{day:'numeric',month:'short',year:'numeric'})}</div>
</div>
<span class="badge ${i.kondesk_sent ? 'badge-green' : 'badge-gray'}">${i.kondesk_sent ? '✓ Processing' : 'Received'}</span>
</div>
`).join('')}
</div>
<div class="dash-card">
<h3>Quick Actions</h3>
<div style="display:flex;gap:12px;flex-wrap:wrap">
<a href="/courses" class="btn btn-primary btn-sm">🔍 Find Courses</a>
<a href="/contact" class="btn btn-sm" style="background:#f0f6ff;color:#1a5bb8">📝 Book Consultation</a>
<a href="/health-insurance" class="btn btn-sm" style="background:#f0fdf4;color:#16a34a">🏥 OSHC Insurance</a>
</div>
</div>
</div>
</div>
</div>
</section>
`, user, '', { url: '/dashboard', description: 'Your Careers Gateway dashboard — manage course inquiries, saved courses, and your profile.' });
}
function contactPage(user, params = {}, success = false, error = '') {
const services = ['Education & Visa Services','Migration Services','Recruitment & Labour Hire','RPL Assessment','Skills Assessment','Health Insurance (OSHC/OVHC)','Easy Tax Return','Aged Care Services','Course Inquiry','General Inquiry'];
return layout('Contact & Book Consultation', `
<section style="background:linear-gradient(135deg,#1a2744,#1a5bb8);padding:40px 24px;color:#fff;text-align:center">
<div class="container">
<h1 style="font-size:2rem;font-weight:800;margin-bottom:8px">Book a Free Consultation</h1>
<p style="opacity:.9">Our team will get back to you within 24 hours</p>
</div>
</section>
<section style="padding:48px 24px">
<div class="container" style="max-width:900px">
<div style="display:grid;grid-template-columns:1fr 340px;gap:32px;align-items:start" class="contact-layout">
<div class="form-card" style="max-width:none">
<h2 style="text-align:left">Send Us a Message</h2>
<p class="sub" style="text-align:left">Fill in your details and we'll be in touch soon</p>
${success ? '<div class="alert alert-success">✅ Your inquiry has been submitted! Our team will contact you within 24 hours.</div>' : ''}
${error ? `<div class="alert alert-error">${esc(error)}</div>` : ''}
${params.course ? `<div class="alert alert-info">🎓 <strong>${esc(params.course)}</strong>${params.code ? ` (CRICOS: ${esc(params.code)})` : ''}${esc(params.provider||'')}</div>` : ''}
<form method="POST" action="/contact">
<input type="hidden" name="cricos_course" value="${esc(params.course||'')}">
<input type="hidden" name="cricos_code" value="${esc(params.code||'')}">
<input type="hidden" name="cricos_provider" value="${esc(params.provider||'')}">
<div class="form-row">
<div class="form-group">
<label>Full Name *</label>
<input type="text" name="full_name" required placeholder="Your full name" value="${esc(user?.full_name||'')}">
</div>
<div class="form-group">
<label>Phone</label>
<input type="tel" name="phone" placeholder="+61 4XX XXX XXX" value="${esc(user?.phone||'')}">
</div>
</div>
<div class="form-group">
<label>Email *</label>
<input type="email" name="email" required placeholder="you@example.com" value="${esc(user?.email||'')}">
</div>
<div class="form-group">
<label>Service Interested In</label>
<select name="service">
${services.map(s => `<option value="${s}"${(params.course && s==='Course Inquiry')||(!params.course && s==='General Inquiry')?' selected':''}>${s}</option>`).join('')}
</select>
</div>
<div class="form-group">
<label>Message</label>
<textarea name="message" placeholder="Tell us about your situation and what you're looking to achieve in Australia..."></textarea>
</div>
<button type="submit" class="form-submit">Send Inquiry →</button>
</form>
</div>
<div>
<div style="background:#fff;border-radius:12px;padding:24px;box-shadow:0 2px 8px rgba(0,0,0,.05);margin-bottom:20px">
<h4 style="font-weight:700;margin-bottom:16px;color:#1a2744">📞 Contact Details</h4>
<div style="font-size:.9rem;line-height:2;color:#374151">
<div>📍 Sydney, NSW, Australia</div>
<div>📞 <a href="tel:+61283850414">+61 2 8385 0414</a></div>
<div>📱 <a href="tel:+61405580047">+61 405 580 047</a></div>
<div>✉️ <a href="mailto:contact@careersgateway.com.au">contact@careersgateway.com.au</a></div>
<div>🕐 MonFri: 9am6pm AEST</div>
</div>
</div>
<div style="background:#f0f6ff;border-radius:12px;padding:20px">
<h4 style="font-weight:700;margin-bottom:10px;color:#1a2744">✅ What Happens Next</h4>
<ol style="padding-left:18px;font-size:.9rem;color:#374151;line-height:2">
<li>We receive your inquiry</li>
<li>A specialist is assigned</li>
<li>You're contacted within 24h</li>
<li>Free initial consultation</li>
</ol>
</div>
</div>
</div>
</div>
</section>
<style>.contact-layout{grid-template-columns:1fr 340px}@media(max-width:768px){.contact-layout{grid-template-columns:1fr}}</style>
`, user, '', { url: '/contact', description: 'Book a free consultation with Careers Gateway. Our certified experts can help with education, visa, migration, RPL, and skills assessment in Australia.', image: 'https://careersgateway.com.au/wp-content/uploads/elementor/thumbs/career-bijendra-sir-r7juads0rjdgs6e5oqchau1e6jow26qbi4k3ky7bwy.jpg' });
}
function healthInsurancePage(user, konpareKey) {
return layout('Health Insurance — OSHC & OVHC', `
<div style="background:linear-gradient(135deg,#064e3b,#059669);padding:48px 24px;color:#fff;overflow:hidden;position:relative">
<div style="position:absolute;right:0;top:0;bottom:0;width:400px;overflow:hidden;opacity:.25">
<img src="https://careersgateway.com.au/wp-content/uploads/elementor/thumbs/pexels-photo-7163956-7163956-scaled-r7fvhsbi458lc1m0wz89g7f03sdjg52qxlmabibvpc.jpg" style="width:100%;height:100%;object-fit:cover" alt="">
</div>
<div class="container" style="position:relative;text-align:center">
<h1 style="font-size:2rem;font-weight:800;margin-bottom:8px">🏥 Health Insurance for Students & Visitors</h1>
<p style="opacity:.9">Compare and buy OSHC & OVHC policies instantly through our Konpare-powered portal</p>
</div>
</div>
<section>
<div class="container">
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:20px;margin-bottom:40px">
${[
['🏥','OSHC','Overseas Student Health Cover','Required for all international student visa holders in Australia'],
['🌏','OVHC','Overseas Visitors Health Cover','For visitors, working holiday makers, and sponsored workers'],
['💊','Cover Includes','Hospital, GP, Prescriptions','Plus emergency ambulance in most policies'],
['⚡','Instant','Online Purchase','Get your certificate of insurance immediately'],
].map(([icon,short,title,desc]) => `
<div style="background:#fff;border-radius:10px;padding:20px;box-shadow:0 2px 8px rgba(0,0,0,.05);border-top:3px solid #059669">
<div style="font-size:1.5rem;margin-bottom:8px">${icon}</div>
<div style="font-size:.75rem;font-weight:700;color:#059669;text-transform:uppercase;letter-spacing:.5px">${short}</div>
<h4 style="font-weight:700;margin:6px 0;color:#1a2744">${title}</h4>
<p style="font-size:.85rem;color:#64748b">${desc}</p>
</div>
`).join('')}
</div>
<div style="display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:12px;margin-bottom:16px">
<h2 style="font-size:1.5rem;font-weight:700;color:#1a2744;margin:0">Compare & Buy Now</h2>
<div style="display:flex;gap:10px;align-items:center">
<span style="font-size:.85rem;color:#64748b">Having trouble? Try</span>
<a href="https://cga.konpare.online/" target="_blank" rel="noopener"
style="font-size:.85rem;font-weight:600;color:#059669;border:1px solid #059669;padding:5px 12px;border-radius:6px;text-decoration:none">
Open in new tab ↗
</a>
</div>
</div>
<div class="widget-wrap">
<button class="widget-fs-btn" onclick="openWidgetFullscreen()" title="Fullscreen">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M8 3H5a2 2 0 00-2 2v3m18 0V5a2 2 0 00-2-2h-3m0 18h3a2 2 0 002-2v-3M3 16v3a2 2 0 002 2h3"/></svg>
Fullscreen
</button>
<iframe
id="konpare-frame"
src="https://cga.konpare.online/"
title="OSHC OVHC Health Insurance Comparison"
allow="payment; fullscreen"
allowfullscreen
loading="lazy">
</iframe>
</div>
<div style="margin-top:16px;padding:16px 20px;background:#f0fdf4;border-radius:10px;display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:10px">
<p style="color:#166534;font-size:.88rem;margin:0">🔒 Secure payments powered by Konpare. Policies from all major Australian health insurers.</p>
<button onclick="openWidgetFullscreen()" style="background:#059669;color:#fff;border:none;border-radius:6px;padding:8px 16px;font-size:.85rem;font-weight:700;cursor:pointer;white-space:nowrap">
⛶ Full Screen
</button>
</div>
</div>
</section>
<!-- Fullscreen overlay -->
<div class="widget-overlay" id="widget-overlay">
<div class="widget-overlay-bar">
<span>🏥 Konpare — OSHC &amp; OVHC Health Insurance</span>
<button class="widget-overlay-close" onclick="closeWidgetFullscreen()">✕ Close Fullscreen</button>
</div>
<iframe src="https://cga.konpare.online/" title="OSHC OVHC" allow="payment" allowfullscreen></iframe>
</div>
<script>
function openWidgetFullscreen() {
const frame = document.getElementById('konpare-frame');
// Try native fullscreen first
const req = frame.requestFullscreen || frame.webkitRequestFullscreen || frame.mozRequestFullScreen;
if (req) {
req.call(frame).catch(() => showOverlay());
} else {
showOverlay();
}
}
function showOverlay() {
const overlay = document.getElementById('widget-overlay');
overlay.classList.add('active');
document.body.style.overflow = 'hidden';
}
function closeWidgetFullscreen() {
document.getElementById('widget-overlay').classList.remove('active');
document.body.style.overflow = '';
}
// Close overlay on Escape
document.addEventListener('keydown', e => { if (e.key === 'Escape') closeWidgetFullscreen(); });
// Exit native fullscreen handler
document.addEventListener('fullscreenchange', () => {
if (!document.fullscreenElement) document.body.style.overflow = '';
});
</script>
`, user, '', { url: '/health-insurance', description: 'Compare and buy OSHC and OVHC health insurance for international students and visitors in Australia. Powered by Konpare — instant online purchase.', image: 'https://careersgateway.com.au/wp-content/uploads/elementor/thumbs/pexels-photo-7163956-7163956-scaled-r7fvhsbi458lc1m0wz89g7f03sdjg52qxlmabibvpc.jpg' });
}
function servicesPage(user, service) {
const pages = {
education: { title: 'Education & Visa Services', icon: '🎓', desc: 'We help international students find and enrol in CRICOS-registered courses at Australian universities, TAFE colleges, and private providers. Our education counsellors assess your academic background, career goals, and visa eligibility to recommend the best pathway for you.', items: ['CRICOS course selection and application','Student visa (subclass 500) lodgement','Enrolment support and CoE assistance','Pre-departure briefings','Airport pickup and arrival support'] },
migration: { title: 'Migration Services', icon: '🌏', desc: 'Our MARA-registered migration agents provide expert advice on all Australian visa subclasses. From skilled migration to family reunification, we handle your case end-to-end.', items: ['Skilled Independent (189, 190, 491)','Employer Nomination Scheme (186, 187)','Family visas (309, 100, 820, 801)','Partner and spouse visas','Bridging and tourist visas'] },
recruitment: { title: 'Recruitment & Labour Hire', icon: '💼', desc: 'We connect skilled professionals with Australian employers across healthcare, construction, IT, and hospitality sectors.', items: ['Job placement for skilled migrants','Labour hire for construction and agriculture','Healthcare and nursing recruitment','Resume and interview preparation','Work rights advice'] },
rpl: { title: 'RPL Assessment', icon: '📋', desc: 'Recognition of Prior Learning (RPL) lets you convert your overseas work experience into Australian qualifications without re-studying.', items: ['Trade qualifications (Certificate III/IV)','Healthcare and nursing qualifications','Engineering and IT assessments','Portfolio preparation support','Fast-track pathways available'] },
skills: { title: 'Skills Assessment', icon: '✅', desc: 'Formal skills assessments required for skilled migration visas, assessed by bodies such as Engineers Australia, TRA, VETASSESS, ANMAC, and more.', items: ['Engineers Australia','Trades Recognition Australia (TRA)','VETASSESS (professional occupations)','ANMAC (nursing and midwifery)','AIM, CPAA, CPA Australia'] },
tax: { title: 'Easy Tax Return', icon: '💰', desc: 'Quick, affordable Australian tax returns for international students and working holiday visa holders.', items: ['Tax file number (TFN) applications','Annual tax return lodgement','Working holiday tax refunds','HECS/HELP debt queries','Superannuation withdrawals on departure'] },
'aged-care': { title: 'Aged Care Services', icon: '❤️', desc: 'Pathways into Australia\'s growing aged care sector, including qualification recognition and job placement.', items: ['Certificate III in Individual Support','AHPRA registration assistance','Job placement in aged care facilities','Visa pathways for aged care workers','Ongoing compliance support'] },
};
const page = pages[service];
if (!page) return null;
return layout(page.title, `
<section style="background:linear-gradient(135deg,#1a2744,#1a5bb8);padding:48px 24px;color:#fff;text-align:center">
<div class="container">
<div style="font-size:3rem;margin-bottom:12px">${page.icon}</div>
<h1 style="font-size:2rem;font-weight:800;margin-bottom:8px">${page.title}</h1>
</div>
</section>
<section>
<div class="container" style="max-width:900px">
<div style="display:grid;grid-template-columns:1fr 320px;gap:32px;align-items:start">
<div>
<p style="font-size:1.05rem;color:#374151;line-height:1.8;margin-bottom:28px">${page.desc}</p>
<h3 style="font-size:1.15rem;font-weight:700;margin-bottom:16px;color:#1a2744">What's Included</h3>
<ul style="list-style:none;display:flex;flex-direction:column;gap:10px">
${page.items.map(item => `<li style="display:flex;align-items:flex-start;gap:10px;font-size:.95rem;color:#374151"><span style="color:#1a5bb8;font-weight:700;margin-top:1px">✓</span>${item}</li>`).join('')}
</ul>
</div>
<div>
<div class="form-card" style="max-width:none;padding:28px">
<h3 style="font-size:1.1rem;font-weight:700;margin-bottom:16px;text-align:center">Get Started Today</h3>
<p style="font-size:.9rem;color:#64748b;text-align:center;margin-bottom:20px">Book a free initial consultation with one of our ${page.title} specialists</p>
<a href="/contact?service=${encodeURIComponent(page.title)}" class="btn btn-primary" style="display:block;text-align:center;padding:13px">Book Free Consultation</a>
<div style="text-align:center;margin-top:16px;font-size:.85rem;color:#94a3b8">No obligation · Response within 24h</div>
</div>
</div>
</div>
</div>
</section>
`, user, '', { url: `/services/${service}`, description: page.desc, image: DEFAULT_IMAGE });
}
export { layout, esc, homePage, coursesPage, registerPage, loginPage, dashboardPage, contactPage, healthInsurancePage, servicesPage };