Jumat, 06 Februari 2026

Build Html konversi ke SPA

 







  • Landing page publikbuildHtml

  • Aplikasi internal → SPA

  • Proyek serius → Hybrid

  • UI modern (React) → Client-heavy

  • Google Sheets tool → Embedded




Berikut VERSI SPA TANPA RELOAD untuk Landing Page Lembaga Kursus Digital Skills menggunakan Google Apps Script.
Arsitektur ini paling rapi & scalable, cocok untuk dikembangkan jadi form pendaftaran, dashboard, LMS, atau CRM.

⚠️ Catatan penting
SPA ≠ buildHtml tunggal.
Untuk SPA yang benar (tanpa reload), buildHtml digantikan oleh shell index.html + loader konten via google.script.run.
Ini adalah best practice GAS SPA (dipakai di production).

├── code.gs

├── index.html

├── css.html

├── js.html

├── page_home.html

├── page_program.html

├── page_about.html

├── page_register.html


code.gs

function doGet() {
  return HtmlService.createTemplateFromFile('index')
    .evaluate()
    .setTitle('Digital Skills Academy')
    .setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL)
    .addMetaTag('viewport', 'width=device-width, initial-scale=1');
}

function include(file) {
  return HtmlService.createHtmlOutputFromFile(file).getContent();
}

// API SPA
function loadPage(page) {
  return HtmlService.createHtmlOutputFromFile('page_' + page).getContent();
}

 index.html

<!DOCTYPE html>
<html lang="id">
<head>
  <base target="_top">
  <?!= include('css'); ?>
</head>
<body>

<nav class="navbar navbar-expand-lg navbar-dark bg-dark fixed-top">
  <div class="container">
    <a class="navbar-brand fw-bold" href="#" onclick="loadPage('home')">
      Digital Skills Academy
    </a>
    <ul class="navbar-nav ms-auto">
      <li class="nav-item"><a class="nav-link" href="#" onclick="loadPage('home')">Home</a></li>
      <li class="nav-item"><a class="nav-link" href="#" onclick="loadPage('program')">Program</a></li>
      <li class="nav-item"><a class="nav-link" href="#" onclick="loadPage('about')">Tentang</a></li>
      <li class="nav-item">
        <a class="btn btn-success btn-sm ms-2" href="#" onclick="loadPage('register')">
          Daftar
        </a>
      </li>
    </ul>
  </div>
</nav>

<div id="app" class="container-fluid p-0" style="margin-top:70px">
  <!-- SPA CONTENT -->
</div>

<?!= include('js'); ?>
</body>
</html>

css.html

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">

<style>
  body { font-family: 'Segoe UI', system-ui, sans-serif; }
  .hero {
    background: linear-gradient(135deg,#0d6efd,#6f42c1);
    color: #fff;
    padding: 90px 20px;
    text-align: center;
  }
  .section { padding: 70px 20px; }
  .card:hover {
    transform: translateY(-6px);
    transition: .3s;
  }
</style>

 js.html

<script>
function loadPage(page) {
  document.getElementById('app').innerHTML = `
    <div class="text-center py-5">
      <div class="spinner-border text-primary"></div>
    </div>
  `;

  google.script.run
    .withSuccessHandler(function(html) {
      document.getElementById('app').innerHTML = html;
      history.pushState({page: page}, "", "#" + page);
    })
    .loadPage(page);
}

// BACK / FORWARD SUPPORT
window.onpopstate = function(e) {
  if (e.state && e.state.page) loadPage(e.state.page);
};

// LOAD DEFAULT
document.addEventListener("DOMContentLoaded", () => {
  const page = location.hash.replace('#','') || 'home';
  loadPage(page);
});
</script>

 page_home.html

<section class="hero">
  <h1 class="fw-bold">Upgrade Skill Digitalmu untuk Masa Depan</h1>
  <p class="lead">
    Kursus digital skills berbasis industri & portofolio
  </p>
  <button class="btn btn-light btn-lg me-2" onclick="loadPage('program')">
    Lihat Program
  </button>
  <button class="btn btn-outline-light btn-lg" onclick="loadPage('register')">
    Daftar Sekarang
  </button>
</section>

 page_program.html

<section class="section container">
  <h2 class="fw-bold text-center mb-5">Program Kursus</h2>
  <div class="row g-4">
    <div class="col-md-4">
      <div class="card p-3">
        <h5>Web Development</h5>
        <p>Membangun website & aplikasi modern</p>
      </div>
    </div>
    <div class="col-md-4">
      <div class="card p-3">
        <h5>Digital Marketing</h5>
        <p>Strategi pemasaran berbasis data</p>
      </div>
    </div>
    <div class="col-md-4">
      <div class="card p-3">
        <h5>UI / UX Design</h5>
        <p>Desain produk digital profesional</p>
      </div>
    </div>
  </div>
</section>

 page_about.html

<section class="section container text-center">
  <h2 class="fw-bold mb-4">Tentang Lembaga</h2>
  <p>
    Lembaga kursus yang fokus pada digital skills, kesiapan kerja,
    dan sertifikasi berbasis kebutuhan industri.
  </p>
</section>

 page_register.html

<section class="section container">
  <h2 class="fw-bold mb-4">Form Pendaftaran</h2>
  <form>
    <input class="form-control mb-2" placeholder="Nama Lengkap">
    <input class="form-control mb-2" placeholder="Email">
    <input class="form-control mb-2" placeholder="No WhatsApp">
    <button class="btn btn-success">Kirim Pendaftaran</button>
  </form>
</section>

 


Tidak ada komentar:

Posting Komentar

Google Apps Script Beginner

  https://www.youtube.com/watch?v=YVGZI6IEN3I&list=PL_xiAt6o4ZXwYTKr7G6R_ajM7C7UZ32fB&index=8