Thursday, 3 July 2025

Gemini - Landing Page

 







https://gemini.google.com/share/af539b040fda

Chat GPT

Create a prompt to build a full modern html landing page for a service called Finish Mode AI which helps business automate their operation using custom AI systems.

The design should include

A fixed header with navigation links (Features, Process, Pricing, Contact)

A hero-section with a strong headline, subheadline, and CTA button to book a Calendly call

Section for:

Features (with icons and descriptions)

Process (3-step transformation process)

Fully mobile responsive with media queries

Clean, well-commented CSS (either inline or internal)

Use Google fonts (Poppins & Open Sans) and Font Awesome icons

Use semantic HTML 5 structure

Include JavaScript for nav toggle, theme switcher, scroll animation, and Calendly theme sync

Also, make sure the theme is sleek and techy - dark mode by default with a toggle for light mode

Use navy, neon green, white, and slate colors. Avoid bloated frameworks. This should feel like  a modern SaaS site for hith -ticket clients.

Hasil Prompt

🌐 Prompt to Build a Modern HTML Landing Page:

Create a modern, mobile-responsive, single-page HTML5 landing page for a service called Finish Mode AI, which helps businesses automate their operations using custom AI systems. The design should appeal to high-ticket SaaS clients and feel sleek, tech-forward, and minimal.

Key Specifications:

  1. Color Palette:

    • Default theme: Dark Mode

    • Colors: Navy (#0a0f2c), Neon Green (#39ff14), White, and Slate (#94a3b8)

    • Include a toggle switch for switching between Dark Mode and Light Mode

  2. Typography:

    • Use Google Fonts: Poppins for headlines, Open Sans for body text

    • Font loading via <link> tag in <head>

  3. Header:

    • Fixed top navigation bar with logo placeholder and links: Features, Process, Pricing, Contact

    • Collapsible nav menu for mobile view (JavaScript toggle)

  4. Hero Section:

    • Strong headline: "Automate Everything with Finish Mode AI"

    • Subheadline: "Custom AI solutions tailored to your business ops."

    • CTA button: “Book a Free Call” — opens Calendly popup in a synced theme

  5. Features Section:

    • Grid layout (e.g. 3-4 icons per row on desktop, stacked on mobile)

    • Each feature includes a Font Awesome icon, title, and short description

    • Example features: Custom AI Bots, Workflow Automation, Cost Optimization, Data-Driven Insights

  6. Process Section:

    • Title: "Our 3-Step AI Transformation Process"

    • Each step includes a number, title, and short description (Step 1: Discover, Step 2: Design, Step 3: Deploy)

    • Use semantic <section>, <article>, <h2>, etc.

  7. Pricing Section:

    • Three pricing cards: Starter, Pro, Enterprise

    • Include price, short list of offerings, and CTA

  8. Contact Section:

    • Simple contact form (name, email, message) – functional logic not required

    • Social media/contact icons

  9. JavaScript Features:

    • Navigation toggle for mobile

    • Theme switcher (dark/light mode toggle)

    • Scroll-triggered animations (e.g. fade in from bottom)

    • Calendly integration with theme match

  10. Responsive Design:

    • Use media queries for responsiveness (mobile-first)

    • Avoid any frameworks (no Bootstrap or Tailwind)

  11. CSS:

    • Use internal or inline CSS, no external files

    • Clean, well-commented

    • Use CSS variables for color scheme

  12. Other:

    • Semantic HTML5 structure: <header>, <nav>, <section>, <footer>, etc.

    • Font Awesome for icons (via CDN)

    • Animate elements on scroll (basic fade/slide-in with JavaScript/CSS)

  13. Footer:

    • Include logo, brief slogan, and copyright

    • Navigation links repeated


GEMINI 


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Finish Mode AI - Automate Your Operations</title>
    <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@600;700&family=Open+Sans:wght@400;600&display=swap" rel="stylesheet">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
    <style>
        :root {
            --dark-navy: #0a0f2c;
            --neon-green: #39ff14;
            --white: #ffffff;
            --slate: #94a3b8;
            --background-dark: var(--dark-navy);
            --text-dark: var(--white);
            --secondary-text-dark: var(--slate);
            --card-background-dark: #1a203c;
            --button-background-dark: var(--neon-green);
            --button-text-dark: var(--dark-navy);

            --background-light: var(--white);
            --text-light: var(--dark-navy);
            --secondary-text-light: #4a5568;
            --card-background-light: #f0f4f8;
            --button-background-light: var(--dark-navy);
            --button-text-light: var(--white);
        }

        body {
            font-family: 'Open Sans', sans-serif;
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            background-color: var(--background-dark);
            color: var(--text-dark);
            transition: background-color 0.3s, color 0.3s;
        }

        body.light-mode {
            background-color: var(--background-light);
            color: var(--text-light);
        }

        h1, h2, h3, h4, h5, h6 {
            font-family: 'Poppins', sans-serif;
            color: var(--text-dark);
        }

        body.light-mode h1,
        body.light-mode h2,
        body.light-mode h3,
        body.light-mode h4,
        body.light-mode h5,
        body.light-mode h6 {
            color: var(--text-light);
        }

        /* Utility Classes */
        .container {
            max-width: 1200px;
            margin: 0 auto;
            padding: 0 20px;
        }

        .text-center {
            text-align: center;
        }

        .fade-in {
            opacity: 0;
            transform: translateY(20px);
            transition: opacity 0.6s ease-out, transform 0.6s ease-out;
        }

        .fade-in.appear {
            opacity: 1;
            transform: translateY(0);
        }

        /* Header */
        header {
            background-color: var(--background-dark);
            padding: 20px 0;
            position: fixed;
            width: 100%;
            top: 0;
            z-index: 1000;
            box-shadow: 0 2px 10px rgba(0,0,0,0.1);
        }
        body.light-mode header {
            background-color: var(--background-light);
            box-shadow: 0 2px 10px rgba(0,0,0,0.05);
        }

        .nav-container {
            display: flex;
            justify-content: space-between;
            align-items: center;
        }

        .logo {
            font-family: 'Poppins', sans-serif;
            font-size: 28px;
            font-weight: 700;
            color: var(--neon-green);
            text-decoration: none;
        }

        nav ul {
            list-style: none;
            margin: 0;
            padding: 0;
            display: flex;
            align-items: center;
        }

        nav ul li {
            margin-left: 30px;
        }

        nav ul li a {
            color: var(--slate);
            text-decoration: none;
            font-weight: 600;
            transition: color 0.3s;
        }

        nav ul li a:hover {
            color: var(--neon-green);
        }

        .nav-toggle {
            display: none;
            font-size: 28px;
            cursor: pointer;
            color: var(--white);
        }
        body.light-mode .nav-toggle {
            color: var(--dark-navy);
        }

        .theme-switch {
            width: 40px;
            height: 20px;
            background-color: var(--slate);
            border-radius: 10px;
            position: relative;
            cursor: pointer;
            margin-left: 20px;
            transition: background-color 0.3s;
        }

        .theme-switch.active {
            background-color: var(--neon-green);
        }

        .theme-switch::before {
            content: '';
            position: absolute;
            width: 16px;
            height: 16px;
            background-color: var(--white);
            border-radius: 50%;
            top: 2px;
            left: 2px;
            transition: transform 0.3s;
        }

        .theme-switch.active::before {
            transform: translateX(20px);
        }

        /* Mobile Nav */
        @media (max-width: 768px) {
            nav ul {
                display: none;
                flex-direction: column;
                position: absolute;
                top: 80px; /* Adjust based on header height */
                left: 0;
                width: 100%;
                background-color: var(--background-dark);
                box-shadow: 0 5px 10px rgba(0,0,0,0.2);
                padding: 20px 0;
            }
            body.light-mode nav ul {
                background-color: var(--background-light);
            }

            nav ul.active {
                display: flex;
            }

            nav ul li {
                margin: 10px 0;
                text-align: center;
            }

            .nav-toggle {
                display: block;
            }
        }

        /* Hero Section */
        #hero {
            padding: 150px 0 100px;
            min-height: 70vh;
            display: flex;
            align-items: center;
            justify-content: center;
            text-align: center;
            background-color: var(--background-dark);
            color: var(--text-dark);
            transition: background-color 0.3s, color 0.3s;
        }
        body.light-mode #hero {
            background-color: var(--background-light);
            color: var(--text-light);
        }

        #hero h1 {
            font-size: 60px;
            margin-bottom: 20px;
            line-height: 1.2;
            color: var(--neon-green);
        }

        #hero p {
            font-size: 24px;
            color: var(--slate);
            margin-bottom: 40px;
        }
        body.light-mode #hero p {
            color: var(--secondary-text-light);
        }

        .cta-button {
            background-color: var(--button-background-dark);
            color: var(--button-text-dark);
            padding: 18px 40px;
            border-radius: 50px;
            text-decoration: none;
            font-weight: 700;
            font-size: 20px;
            transition: background-color 0.3s, transform 0.2s;
            display: inline-block;
        }
        body.light-mode .cta-button {
            background-color: var(--button-background-light);
            color: var(--button-text-light);
        }

        .cta-button:hover {
            transform: translateY(-3px);
            opacity: 0.9;
        }

        /* Sections */
        section {
            padding: 80px 0;
        }

        section:nth-of-type(even) {
            background-color: var(--card-background-dark);
        }
        body.light-mode section:nth-of-type(even) {
            background-color: var(--card-background-light);
        }

        h2 {
            font-size: 48px;
            margin-bottom: 60px;
            text-align: center;
        }

        /* Features Section */
        #features .features-grid {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
            gap: 40px;
        }

        .feature-item {
            text-align: center;
            padding: 30px;
            background-color: var(--card-background-dark);
            border-radius: 12px;
            box-shadow: 0 4px 15px rgba(0,0,0,0.1);
            transition: transform 0.3s;
        }
        body.light-mode .feature-item {
            background-color: var(--card-background-light);
            box-shadow: 0 4px 15px rgba(0,0,0,0.05);
        }

        .feature-item:hover {
            transform: translateY(-5px);
        }

        .feature-item i {
            font-size: 60px;
            color: var(--neon-green);
            margin-bottom: 20px;
        }

        .feature-item h3 {
            font-size: 24px;
            margin-bottom: 15px;
            color: var(--text-dark);
        }
        body.light-mode .feature-item h3 {
            color: var(--text-light);
        }

        .feature-item p {
            color: var(--slate);
            line-height: 1.6;
        }
        body.light-mode .feature-item p {
            color: var(--secondary-text-light);
        }

        /* Process Section */
        #process .process-steps {
            display: flex;
            flex-wrap: wrap;
            justify-content: center;
            gap: 40px;
        }

        .process-step {
            background-color: var(--card-background-dark);
            padding: 40px;
            border-radius: 12px;
            text-align: center;
            max-width: 350px;
            box-shadow: 0 4px 15px rgba(0,0,0,0.1);
            transition: transform 0.3s;
        }
        body.light-mode .process-step {
            background-color: var(--card-background-light);
            box-shadow: 0 4px 15px rgba(0,0,0,0.05);
        }

        .process-step:hover {
            transform: translateY(-5px);
        }

        .process-step .step-number {
            font-size: 70px;
            font-weight: 700;
            color: var(--neon-green);
            margin-bottom: 15px;
            line-height: 1;
        }

        .process-step h3 {
            font-size: 28px;
            margin-bottom: 15px;
            color: var(--text-dark);
        }
        body.light-mode .process-step h3 {
            color: var(--text-light);
        }

        .process-step p {
            color: var(--slate);
            line-height: 1.6;
        }
        body.light-mode .process-step p {
            color: var(--secondary-text-light);
        }

        /* Pricing Section */
        #pricing .pricing-cards {
            display: flex;
            flex-wrap: wrap;
            justify-content: center;
            gap: 40px;
        }

        .pricing-card {
            background-color: var(--card-background-dark);
            padding: 40px;
            border-radius: 12px;
            text-align: center;
            max-width: 380px;
            box-shadow: 0 4px 15px rgba(0,0,0,0.1);
            border: 2px solid transparent;
            transition: border-color 0.3s, transform 0.3s;
        }
        body.light-mode .pricing-card {
            background-color: var(--card-background-light);
            box-shadow: 0 4px 15px rgba(0,0,0,0.05);
        }

        .pricing-card.highlight {
            border-color: var(--neon-green);
        }

        .pricing-card:hover {
            transform: translateY(-5px);
        }

        .pricing-card h3 {
            font-size: 32px;
            margin-bottom: 15px;
            color: var(--neon-green);
        }

        .pricing-card .price {
            font-size: 50px;
            font-weight: 700;
            margin-bottom: 20px;
            color: var(--text-dark);
        }
        body.light-mode .pricing-card .price {
            color: var(--text-light);
        }

        .pricing-card .price span {
            font-size: 24px;
            color: var(--slate);
            font-weight: 400;
        }
        body.light-mode .pricing-card .price span {
            color: var(--secondary-text-light);
        }

        .pricing-card ul {
            list-style: none;
            padding: 0;
            margin-bottom: 30px;
        }

        .pricing-card ul li {
            margin-bottom: 10px;
            color: var(--slate);
            font-size: 18px;
        }
        body.light-mode .pricing-card ul li {
            color: var(--secondary-text-light);
        }

        .pricing-card .cta-button {
            padding: 15px 30px;
            font-size: 18px;
        }

        /* Contact Section */
        #contact .contact-content {
            display: flex;
            flex-direction: column;
            align-items: center;
            gap: 40px;
        }

        .contact-form {
            background-color: var(--card-background-dark);
            padding: 40px;
            border-radius: 12px;
            box-shadow: 0 4px 15px rgba(0,0,0,0.1);
            max-width: 600px;
            width: 100%;
        }
        body.light-mode .contact-form {
            background-color: var(--card-background-light);
            box-shadow: 0 4px 15px rgba(0,0,0,0.05);
        }

        .contact-form label {
            display: block;
            margin-bottom: 10px;
            font-weight: 600;
            color: var(--text-dark);
        }
        body.light-mode .contact-form label {
            color: var(--text-light);
        }

        .contact-form input,
        .contact-form textarea {
            width: calc(100% - 20px);
            padding: 12px;
            margin-bottom: 20px;
            border: 1px solid var(--slate);
            border-radius: 8px;
            background-color: #1a203c; /* Specific for input fields in dark mode */
            color: var(--white);
            font-size: 16px;
        }
        body.light-mode .contact-form input,
        body.light-mode .contact-form textarea {
            background-color: var(--white);
            color: var(--dark-navy);
            border-color: #cbd5e0;
        }

        .contact-form textarea {
            resize: vertical;
            min-height: 120px;
        }

        .contact-form button {
            background-color: var(--neon-green);
            color: var(--dark-navy);
            padding: 15px 30px;
            border: none;
            border-radius: 50px;
            font-size: 18px;
            font-weight: 700;
            cursor: pointer;
            transition: background-color 0.3s, transform 0.2s;
        }
        body.light-mode .contact-form button {
            background-color: var(--dark-navy);
            color: var(--white);
        }

        .contact-form button:hover {
            transform: translateY(-3px);
            opacity: 0.9;
        }

        .social-icons {
            display: flex;
            gap: 25px;
            margin-top: 20px;
        }

        .social-icons a {
            color: var(--slate);
            font-size: 30px;
            transition: color 0.3s;
        }

        .social-icons a:hover {
            color: var(--neon-green);
        }

        /* Footer */
        footer {
            background-color: var(--dark-navy);
            color: var(--slate);
            padding: 60px 0;
            text-align: center;
        }
        body.light-mode footer {
            background-color: #e2e8f0;
            color: #4a5568;
        }

        footer .logo {
            font-size: 24px;
            margin-bottom: 15px;
            display: inline-block;
        }

        footer p {
            margin-bottom: 20px;
            font-size: 16px;
        }

        footer nav ul {
            display: flex;
            justify-content: center;
            gap: 25px;
            list-style: none;
            padding: 0;
            margin-top: 20px;
        }

        footer nav ul li a {
            color: var(--slate);
            text-decoration: none;
            font-weight: 600;
            transition: color 0.3s;
        }

        footer nav ul li a:hover {
            color: var(--neon-green);
        }

        /* Media Queries for Responsiveness */
        @media (max-width: 1024px) {
            #hero h1 {
                font-size: 50px;
            }

            #hero p {
                font-size: 20px;
            }

            h2 {
                font-size: 40px;
            }

            .feature-item, .process-step, .pricing-card {
                padding: 30px;
            }
        }

        @media (max-width: 768px) {
            .nav-container {
                padding: 0 20px;
            }

            #hero {
                padding: 120px 0 80px;
            }

            #hero h1 {
                font-size: 40px;
            }

            #hero p {
                font-size: 18px;
            }

            h2 {
                font-size: 36px;
                margin-bottom: 40px;
            }

            .features-grid, .process-steps, .pricing-cards {
                grid-template-columns: 1fr;
                gap: 30px;
            }

            .pricing-card {
                max-width: 90%;
            }

            .contact-form {
                padding: 30px;
            }

            footer nav ul {
                flex-direction: column;
                gap: 15px;
            }
        }

        @media (max-width: 480px) {
            .logo {
                font-size: 24px;
            }

            .nav-toggle {
                font-size: 24px;
            }

            #hero h1 {
                font-size: 32px;
            }

            #hero p {
                font-size: 16px;
            }

            .cta-button {
                padding: 15px 30px;
                font-size: 18px;
            }

            h2 {
                font-size: 30px;
            }

            .feature-item i {
                font-size: 50px;
            }

            .feature-item h3 {
                font-size: 20px;
            }

            .process-step .step-number {
                font-size: 60px;
            }

            .process-step h3 {
                font-size: 24px;
            }

            .pricing-card h3 {
                font-size: 28px;
            }

            .pricing-card .price {
                font-size: 40px;
            }

            .contact-form input,
            .contact-form textarea,
            .contact-form button {
                font-size: 16px;
            }

            .social-icons a {
                font-size: 26px;
            }
        }
    </style>
</head>
<body>
    <header>
        <div class="container nav-container">
            <a href="#" class="logo">Finish Mode AI</a>
            <nav>
                <ul id="nav-menu">
                    <li><a href="#features">Features</a></li>
                    <li><a href="#process">Process</a></li>
                    <li><a href="#pricing">Pricing</a></li>
                    <li><a href="#contact">Contact</a></li>
                    <li>
                        <div class="theme-switch" id="theme-toggle"></div>
                    </li>
                </ul>
            </nav>
            <div class="nav-toggle" id="mobile-nav-toggle">
                <i class="fas fa-bars"></i>
            </div>
        </div>
    </header>

    <main>
        <section id="hero" class="fade-in">
            <div class="container">
                <h1>Automate Everything with Finish Mode AI</h1>
                <p>Custom AI solutions tailored to your business ops.</p>
                <a href="https://calendly.com/your-calendly-link" target="_blank" class="cta-button calendly-link">Book a Free Call</a>
            </div>
        </section>

        ---

        <section id="features" class="fade-in">
            <div class="container text-center">
                <h2>Key Features</h2>
                <div class="features-grid">
                    <article class="feature-item">
                        <i class="fas fa-robot"></i>
                        <h3>Custom AI Bots</h3>
                        <p>Develop bespoke AI bots designed to handle specific tasks and workflows unique to your business.</p>
                    </article>
                    <article class="feature-item">
                        <i class="fas fa-cogs"></i>
                        <h3>Workflow Automation</h3>
                        <p>Streamline complex operational processes, reducing manual effort and increasing efficiency across departments.</p>
                    </article>
                    <article class="feature-item">
                        <i class="fas fa-chart-line"></i>
                        <h3>Cost Optimization</h3>
                        <p>Identify inefficiencies and automate tasks to significantly lower operational costs and improve your bottom line.</p>
                    </article>
                    <article class="feature-item">
                        <i class="fas fa-database"></i>
                        <h3>Data-Driven Insights</h3>
                        <p>Leverage AI to analyze vast datasets, providing actionable insights for strategic decision-making and growth.</p>
                    </article>
                    <article class="feature-item">
                        <i class="fas fa-shield-alt"></i>
                        <h3>Enhanced Security</h3>
                        <p>Implement AI-powered security protocols to protect sensitive data and ensure compliance.</p>
                    </article>
                    <article class="feature-item">
                        <i class="fas fa-headset"></i>
                        <h3>24/7 Support</h3>
                        <p>Benefit from continuous support and maintenance for your AI systems, ensuring uninterrupted operation.</p>
                    </article>
                </div>
            </div>
        </section>

        ---

        <section id="process" class="fade-in">
            <div class="container text-center">
                <h2>Our 3-Step AI Transformation Process</h2>
                <div class="process-steps">
                    <article class="process-step">
                        <div class="step-number">1</div>
                        <h3>Discover</h3>
                        <p>We begin with an in-depth analysis of your current operations, challenges, and goals to identify key automation opportunities.</p>
                    </article>
                    <article class="process-step">
                        <div class="step-number">2</div>
                        <h3>Design</h3>
                        <p>Our experts then design custom AI solutions, outlining the architecture, functionalities, and integration points tailored for your needs.</p>
                    </article>
                    <article class="process-step">
                        <div class="step-number">3</div>
                        <h3>Deploy</h3>
                        <p>Finally, we seamlessly integrate and deploy the AI systems, providing training and ongoing support to ensure optimal performance.</p>
                    </article>
                </div>
            </div>
        </section>

        ---

        <section id="pricing" class="fade-in">
            <div class="container text-center">
                <h2>Flexible Pricing Plans</h2>
                <div class="pricing-cards">
                    <article class="pricing-card">
                        <h3>Starter</h3>
                        <p class="price">$5,000<span>/project</span></p>
                        <ul>
                            <li>Basic AI Consultation</li>
                            <li>Single Workflow Automation</li>
                            <li>Standard Support</li>
                            <li>Initial Setup</li>
                        </ul>
                        <a href="https://calendly.com/your-calendly-link-starter" target="_blank" class="cta-button calendly-link">Get Started</a>
                    </article>
                    <article class="pricing-card highlight">
                        <h3>Pro</h3>
                        <p class="price">$15,000<span>/project</span></p>
                        <ul>
                            <li>Advanced AI Strategy</li>
                            <li>Multiple Workflow Automation</li>
                            <li>Priority Support</li>
                            <li>Data-Driven Insights</li>
                            <li>Custom AI Bot Development</li>
                        </ul>
                        <a href="https://calendly.com/your-calendly-link-pro" target="_blank" class="cta-button calendly-link">Choose Pro</a>
                    </article>
                    <article class="pricing-card">
                        <h3>Enterprise</h3>
                        <p class="price">Custom</p>
                        <ul>
                            <li>Comprehensive AI Integration</li>
                            <li>Unlimited Workflow Automation</li>
                            <li>Dedicated Account Manager</li>
                            <li>Ongoing Optimization</li>
                            <li>Full-Scale AI System Deployment</li>
                        </ul>
                        <a href="https://calendly.com/your-calendly-link-enterprise" target="_blank" class="cta-button calendly-link">Contact Sales</a>
                    </article>
                </div>
            </div>
        </section>

        ---

        <section id="contact" class="fade-in">
            <div class="container text-center">
                <h2>Get in Touch</h2>
                <div class="contact-content">
                    <form class="contact-form">
                        <label for="name">Name</label>
                        <input type="text" id="name" name="name" required>

                        <label for="email">Email</label>
                        <input type="email" id="email" name="email" required>

                        <label for="message">Message</label>
                        <textarea id="message" name="message" required></textarea>

                        <button type="submit">Send Message</button>
                    </form>
                    <div class="social-icons">
                        <a href="#"><i class="fab fa-linkedin"></i></a>
                        <a href="#"><i class="fab fa-twitter-square"></i></a>
                        <a href="#"><i class="fab fa-github-square"></i></a>
                    </div>
                </div>
            </div>
        </section>
    </main>

    <footer>
        <div class="container">
            <a href="#" class="logo">Finish Mode AI</a>
            <p>Automating your success with intelligent solutions.</p>
            <nav>
                <ul>
                    <li><a href="#features">Features</a></li>
                    <li><a href="#process">Process</a></li>
                    <li><a href="#pricing">Pricing</a></li>
                    <li><a href="#contact">Contact</a></li>
                </ul>
            </nav>
            <p>&copy; 2025 Finish Mode AI. All rights reserved.</p>
        </div>
    </footer>

    <script src="https://assets.calendly.com/assets/external/widget.js" type="text/javascript" async></script>
    <script>
        document.addEventListener('DOMContentLoaded', () => {
            // Mobile Navigation Toggle
            const mobileNavToggle = document.getElementById('mobile-nav-toggle');
            const navMenu = document.getElementById('nav-menu');

            mobileNavToggle.addEventListener('click', () => {
                navMenu.classList.toggle('active');
                mobileNavToggle.querySelector('i').classList.toggle('fa-bars');
                mobileNavToggle.querySelector('i').classList.toggle('fa-times');
            });

            // Theme Switcher
            const themeToggle = document.getElementById('theme-toggle');
            const body = document.body;

            // Check for saved theme preference or default to dark
            const savedTheme = localStorage.getItem('theme');
            if (savedTheme === 'light-mode') {
                body.classList.add('light-mode');
                themeToggle.classList.add('active');
            }

            themeToggle.addEventListener('click', () => {
                body.classList.toggle('light-mode');
                themeToggle.classList.toggle('active');

                // Save theme preference to localStorage
                if (body.classList.contains('light-mode')) {
                    localStorage.setItem('theme', 'light-mode');
                } else {
                    localStorage.setItem('theme', 'dark-mode');
                }
            });

            // Scroll-triggered animations
            const fadeInElements = document.querySelectorAll('.fade-in');

            const observerOptions = {
                root: null,
                rootMargin: '0px',
                threshold: 0.1
            };

            const observer = new IntersectionObserver((entries, observer) => {
                entries.forEach(entry => {
                    if (entry.isIntersecting) {
                        entry.target.classList.add('appear');
                        observer.unobserve(entry.target);
                    }
                });
            }, observerOptions);

            fadeInElements.forEach(element => {
                observer.observe(element);
            });

            // Calendly Integration (basic, just opens popup)
            const calendlyLinks = document.querySelectorAll('.calendly-link');
            calendlyLinks.forEach(link => {
                link.addEventListener('click', function(e) {
                    e.preventDefault();
                    Calendly.initPopupWidget({url: this.href});
                    return false;
                });
            });
        });
    </script>
</body>
</html>

Gemini - Code dan Spreadsheet




https://gemini.google.com/app/f77ddcb50af94215?hl=id

PROMPT

Buatkan sebuah aplikasi web pendaftaran sekolah sederhana berbasis HTML, CSS, dan JavaScript, dengan fitur sebagai berikut:

✅ Fitur Utama:

Formulir pendaftaran yang mencakup field berikut:

Nama Lengkap

NISN

Email

No. HP

Jenis Kelamin (Radio button: Laki-laki / Perempuan)

Pilihan Jurusan (Dropdown: RPL, TKJ, DKV, TBSM, Akuntansi)

Alamat Lengkap (Textarea)

Tombol Submit, yang jika diklik:

Validasi semua input tidak boleh kosong

Menyimpan data ke Google Spreadsheet melalui Google Apps Script Web Apps (POST ke URL)

Menampilkan notifikasi “Pendaftaran berhasil” tanpa reload halaman

Gunakan desain yang responsif dan bersih:

Styling dengan CSS sederhana (boleh pakai Bootstrap jika perlu)

Layout rapi dan ramah pengguna, gunakan font Google Fonts

Sertakan komentar dalam kode untuk memudahkan pengembangan lebih lanjut.

File yang dihasilkan:

index.html

style.css

script.js

Sertakan juga contoh Google Apps Script (Code.gs) yang menangani penyimpanan data ke Google Sheets:

Fungsi doPost(e) untuk menerima data dan menyimpannya ke spreadsheet

Spreadsheet memiliki header sesuai dengan field formulir

Sertakan instruksi singkat di dalam HTML dalam komentar:

👉 bagaimana cara menyebarkan Google Apps Script sebagai Web App agar form bisa digunakan.




PENJELASAN

Penjelasan:

  1. index.html:

    • Berisi struktur dasar formulir pendaftaran dengan semua field yang diminta.

    • Menggunakan Tailwind CSS (melalui CDN) untuk styling yang responsif dan bersih.

    • Menggunakan Google Fonts (Inter) untuk tipografi.

    • Terdapat area div dengan id="notification" yang akan digunakan untuk menampilkan pesan sukses atau error.

    • Sangat penting: Di dalam komentar HTML, saya telah menyertakan instruksi lengkap langkah demi langkah tentang cara menyebarkan (deploy) Google Apps Script sebagai Web App dan cara mendapatkan URL yang diperlukan.

  2. style.css:

    • File ini berisi gaya CSS kustom minimal, terutama untuk mengatur font body dan kelas notifikasi (.notification-success, .notification-error) yang akan digunakan oleh JavaScript. Sebagian besar styling dilakukan langsung dengan kelas Tailwind di HTML.

  3. script.js:

    • Menangani logika formulir.

    • Ketika formulir disubmit, ia akan:

      • Mencegah reload halaman (e.preventDefault()).

      • Melakukan validasi sisi klien untuk memastikan semua field yang wajib diisi tidak kosong.

      • Mengambil semua data formulir.

      • Menambahkan Tanggal Pendaftaran secara otomatis.

      • Mengirim data ke WEB_APP_URL (URL Google Apps Script Web App Anda) menggunakan fetch dengan metode POST.

      • Menampilkan notifikasi "Pendaftaran berhasil!" atau pesan error tanpa reload halaman.

      • Menonaktifkan tombol submit selama proses pengiriman data untuk mencegah pengiriman ganda.

    • Penting: Anda harus mengganti URL_WEB_APP_ANDA_DI_SINI dengan URL Web App Google Apps Script Anda setelah Anda menyebarkannya.

  4. Code.gs (Google Apps Script):

    • Ini adalah kode yang akan Anda tempelkan di editor Google Apps Script.

    • Fungsi doPost(e) adalah titik masuk utama ketika formulir mengirimkan data ke Web App.

    • Ia menerima data JSON dari permintaan POST.

    • Membuka Google Spreadsheet Anda (Anda perlu mengganti ID_SPREADSHEET_ANDA_DI_SINI atau memastikan nama spreadsheet sama).

    • Membaca header kolom dari baris pertama spreadsheet Anda.

    • Membangun baris baru berdasarkan data yang diterima dan urutan header.

    • Menambahkan baris baru ke sheet.

    • Mengembalikan respons JSON yang menunjukkan status sukses atau error.

Langkah-langkah Selanjutnya (Sesuai Instruksi di index.html):

  1. Buat Google Spreadsheet baru dan siapkan header kolomnya.

  2. Buka Google Apps Script dari Spreadsheet Anda.

  3. Salin dan tempel kode Code.gs ke editor Apps Script.

  4. Sangat penting: Ganti ID_SPREADSHEET_ANDA_DI_SINI di Code.gs dengan ID Spreadsheet Anda (dapat ditemukan di URL Spreadsheet, antara /d/ dan /edit). Atau, pastikan nama spreadsheet Anda persis sama dengan yang ada di Code.gs.

  5. Sebarkan (deploy) Apps Script sebagai Web App dengan akses "Anyone".

  6. Salin URL Web App yang dihasilkan.

  7. Tempelkan URL tersebut ke dalam script.js pada variabel WEB_APP_URL.

  8. Buka index.html di browser Anda dan uji aplikasinya!

Source Code

index.html


<!DOCTYPE html>
<html lang="id">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Pendaftaran Sekolah Online</title>
    <!-- Tailwind CSS CDN untuk styling responsif -->
    <script src="https://cdn.tailwindcss.com"></script>
    <!-- Google Fonts: Inter untuk tampilan yang bersih -->
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap" rel="stylesheet">
    <!-- Link ke file CSS kustom -->
    <link rel="stylesheet" href="style.css">
    
    <!--
    INSTRUKSI PENTING UNTUK GOOGLE APPS SCRIPT:
    
    1.  BUAT SPREADSHEET BARU DI GOOGLE DRIVE:
        Buka Google Drive Anda, klik "+ Baru" > "Google Spreadsheet".
        Beri nama spreadsheet Anda, misalnya "Data Pendaftaran Sekolah".
        Di baris pertama (header), masukkan nama kolom berikut (harus persis sama):
        Nama Lengkap, NISN, Email, No. HP, Jenis Kelamin, Pilihan Jurusan, Alamat Lengkap, Tanggal Pendaftaran
        
    2.  BUKA GOOGLE APPS SCRIPT:
        Di Google Spreadsheet Anda, pergi ke menu "Ekstensi" > "Apps Script".
        Ini akan membuka editor Apps Script di tab baru.
        
    3.  SALIN KODE Code.gs:
        Hapus semua kode yang ada di editor Apps Script (biasanya ada fungsi myFunction()).
        Salin dan tempel seluruh kode dari file Code.gs yang saya berikan ke editor Apps Script.
        
    4.  SIMPAN PROYEK APPS SCRIPT:
        Klik ikon disket (Save project) di toolbar atau tekan Ctrl + S (Cmd + S di Mac).
        Beri nama proyek Anda, misalnya "PendaftaranSekolahWebApp".
        
    5.  SEBARKAN (DEPLOY) SEBAGAI WEB APP:
        Di editor Apps Script, klik menu "Deploy" (Sebarkan) > "New deployment" (Deployment baru).
        Klik ikon roda gigi (Select type) dan pilih "Web app".
        
        Konfigurasi Deployment:
        - Description: (Opsional, misalnya "Form Pendaftaran Sekolah")
        - Execute as: "Me" (alamat email Anda)
        - Who has access: "Anyone" (Siapa saja) - PENTING agar formulir bisa diakses publik.
        
        Klik "Deploy" (Sebarkan).
        
    6.  OTORISASI AKSES:
        Anda mungkin akan diminta untuk mengotorisasi proyek. Ikuti langkah-langkahnya:
        - Klik "Authorize access".
        - Pilih akun Google Anda.
        - Klik "Advanced" (Lanjutan) > "Go to [Nama Proyek Anda] (unsafe)".
        - Klik "Allow" (Izinkan).
        
    7.  SALIN URL WEB APP:
        Setelah berhasil deploy, Anda akan melihat dialog "Deployment successful".
        Salin "Web app URL" yang diberikan. Ini adalah URL yang akan Anda gunakan di file script.js.
        
    8.  TEMPEL URL DI script.js:
        Buka file script.js Anda.
        Cari baris `const WEB_APP_URL = 'URL_WEB_APP_ANDA_DI_SINI';`
        Ganti 'URL_WEB_APP_ANDA_DI_SINI' dengan URL Web App yang baru saja Anda salin.
        
    9.  SELESAI!
        Sekarang Anda bisa membuka file index.html di browser Anda, mengisi formulir, dan data akan tersimpan otomatis ke Google Spreadsheet Anda.
    -->
</head>
<body class="bg-gray-100 font-inter text-gray-800">
    <div class="min-h-screen flex items-center justify-center p-4">
        <div class="bg-white p-8 rounded-lg shadow-xl w-full max-w-2xl border border-gray-200">
            <h1 class="text-3xl font-bold text-center text-indigo-700 mb-6">Pendaftaran Siswa Baru</h1>
            <p class="text-center text-gray-600 mb-8">Isi formulir di bawah ini untuk mendaftar ke sekolah kami.</p>

            <form id="registrationForm" class="space-y-6">
                <div>
                    <label for="namaLengkap" class="block text-sm font-medium text-gray-700 mb-1">Nama Lengkap</label>
                    <input type="text" id="namaLengkap" name="Nama Lengkap" required
                           class="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
                </div>

                <div>
                    <label for="nisn" class="block text-sm font-medium text-gray-700 mb-1">NISN</label>
                    <input type="text" id="nisn" name="NISN" required
                           class="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
                </div>

                <div>
                    <label for="email" class="block text-sm font-medium text-gray-700 mb-1">Email</label>
                    <input type="email" id="email" name="Email" required
                           class="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
                </div>

                <div>
                    <label for="noHp" class="block text-sm font-medium text-gray-700 mb-1">No. HP</label>
                    <input type="tel" id="noHp" name="No. HP" required
                           class="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
                </div>

                <div>
                    <label class="block text-sm font-medium text-gray-700 mb-2">Jenis Kelamin</label>
                    <div class="mt-1 flex space-x-4">
                        <label class="inline-flex items-center">
                            <input type="radio" name="Jenis Kelamin" value="Laki-laki" required
                                   class="form-radio h-4 w-4 text-indigo-600 transition duration-150 ease-in-out">
                            <span class="ml-2 text-gray-700">Laki-laki</span>
                        </label>
                        <label class="inline-flex items-center">
                            <input type="radio" name="Jenis Kelamin" value="Perempuan" required
                                   class="form-radio h-4 w-4 text-indigo-600 transition duration-150 ease-in-out">
                            <span class="ml-2 text-gray-700">Perempuan</span>
                        </label>
                    </div>
                </div>

                <div>
                    <label for="pilihanJurusan" class="block text-sm font-medium text-gray-700 mb-1">Pilihan Jurusan</label>
                    <select id="pilihanJurusan" name="Pilihan Jurusan" required
                            class="mt-1 block w-full pl-3 pr-10 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
                        <option value="">-- Pilih Jurusan --</option>
                        <option value="RPL">Rekayasa Perangkat Lunak (RPL)</option>
                        <option value="TKJ">Teknik Komputer dan Jaringan (TKJ)</option>
                        <option value="DKV">Desain Komunikasi Visual (DKV)</option>
                        <option value="TBSM">Teknik Bisnis Sepeda Motor (TBSM)</option>
                        <option value="Akuntansi">Akuntansi</option>
                    </select>
                </div>

                <div>
                    <label for="alamatLengkap" class="block text-sm font-medium text-gray-700 mb-1">Alamat Lengkap</label>
                    <textarea id="alamatLengkap" name="Alamat Lengkap" rows="4" required
                              class="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"></textarea>
                </div>

                <button type="submit"
                        class="w-full flex justify-center py-2 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 transition duration-150 ease-in-out">
                    Daftar Sekarang
                </button>
            </form>

            <!-- Area Notifikasi -->
            <div id="notification" class="mt-6 p-3 rounded-md text-center hidden" role="alert">
                <p id="notification-message" class="font-medium"></p>
            </div>
        </div>
    </div>

    <!-- Link ke file JavaScript kustom -->
    <script src="script.js"></script>
</body>
</html>

style.css

/* style.css */

/* Mengatur font dasar untuk seluruh body */
body {
    font-family: 'Inter', sans-serif;
}

/* Anda bisa menambahkan gaya kustom lainnya di sini jika diperlukan */
/* Contoh: */
/* .custom-button {
    background-color: #4CAF50;
    color: white;
    padding: 10px 20px;
    border-radius: 5px;
    cursor: pointer;
} */

/* Gaya untuk notifikasi sukses */
.notification-success {
    background-color: #d4edda; /* bg-green-100 */
    color: #155724; /* text-green-800 */
    border: 1px solid #c3e6cb; /* border-green-200 */
}

/* Gaya untuk notifikasi error */
.notification-error {
    background-color: #f8d7da; /* bg-red-100 */
    color: #721c24; /* text-red-800 */
    border: 1px solid #f5c6cb; /* border-red-200 */
}

script.js

// script.js

document.addEventListener('DOMContentLoaded', () => {
    // URL Web App Google Apps Script Anda
    // GANTI 'URL_WEB_APP_ANDA_DI_SINI' dengan URL yang Anda dapatkan setelah deploy Apps Script
    const WEB_APP_URL = 'URL_WEB_APP_ANDA_DI_SINI'; 

    const registrationForm = document.getElementById('registrationForm');
    const notificationDiv = document.getElementById('notification');
    const notificationMessage = document.getElementById('notification-message');

    // Fungsi untuk menampilkan notifikasi
    function showNotification(message, type) {
        notificationMessage.textContent = message;
        notificationDiv.classList.remove('hidden', 'notification-success', 'notification-error');
        if (type === 'success') {
            notificationDiv.classList.add('notification-success');
        } else if (type === 'error') {
            notificationDiv.classList.add('notification-error');
        }
        // Sembunyikan notifikasi setelah 5 detik
        setTimeout(() => {
            notificationDiv.classList.add('hidden');
        }, 5000);
    }

    // Event listener untuk submit formulir
    registrationForm.addEventListener('submit', async (e) => {
        e.preventDefault(); // Mencegah reload halaman

        // 1. Validasi Input Tidak Boleh Kosong
        let isValid = true;
        const formData = new FormData(registrationForm);
        const data = {};

        for (let [key, value] of formData.entries()) {
            // Trim whitespace dari input teks dan textarea
            if (typeof value === 'string') {
                value = value.trim();
            }
            if (!value) {
                isValid = false;
                // Anda bisa menambahkan feedback visual di sini, misalnya border merah pada input
                // console.error(`Input '${key}' tidak boleh kosong.`);
            }
            data[key] = value;
        }

        // Validasi khusus untuk radio button (Jenis Kelamin)
        const jenisKelaminSelected = document.querySelector('input[name="Jenis Kelamin"]:checked');
        if (!jenisKelaminSelected) {
            isValid = false;
            // console.error('Jenis Kelamin harus dipilih.');
        } else {
            data['Jenis Kelamin'] = jenisKelaminSelected.value;
        }

        // Validasi untuk dropdown (Pilihan Jurusan)
        if (!data['Pilihan Jurusan']) {
            isValid = false;
            // console.error('Pilihan Jurusan harus dipilih.');
        }

        if (!isValid) {
            showNotification('Mohon lengkapi semua field yang wajib diisi.', 'error');
            return; // Hentikan proses jika ada validasi yang gagal
        }

        // Tambahkan tanggal pendaftaran
        data['Tanggal Pendaftaran'] = new Date().toLocaleString('id-ID', {
            year: 'numeric',
            month: '2-digit',
            day: '2-digit',
            hour: '2-digit',
            minute: '2-digit',
            second: '2-digit'
        });

        // Tampilkan loading atau nonaktifkan tombol submit
        const submitButton = registrationForm.querySelector('button[type="submit"]');
        submitButton.textContent = 'Mengirim...';
        submitButton.disabled = true;
        submitButton.classList.add('opacity-50', 'cursor-not-allowed');

        try {
            // 2. Mengirim data ke Google Apps Script Web App
            const response = await fetch(WEB_APP_URL, {
                method: 'POST',
                mode: 'no-cors', // Penting untuk menghindari masalah CORS dengan Apps Script
                headers: {
                    'Content-Type': 'application/json',
                },
                body: JSON.stringify(data),
            });

            // Karena mode 'no-cors', kita tidak bisa membaca response.ok atau response.json()
            // Kita asumsikan sukses jika tidak ada error jaringan
            showNotification('Pendaftaran berhasil!', 'success');
            registrationForm.reset(); // Reset formulir setelah sukses
        } catch (error) {
            console.error('Error saat mengirim data:', error);
            showNotification('Terjadi kesalahan saat pendaftaran. Mohon coba lagi.', 'error');
        } finally {
            // Aktifkan kembali tombol submit
            submitButton.textContent = 'Daftar Sekarang';
            submitButton.disabled = false;
            submitButton.classList.remove('opacity-50', 'cursor-not-allowed');
        }
    });
});

Code.gs

// Code.gs

/**
 * Fungsi ini akan dieksekusi ketika ada permintaan POST ke Web App.
 * Data dari formulir HTML akan diterima di sini.
 * @param {Object} e - Objek event yang berisi data permintaan.
 */
function doPost(e) {
  // Pastikan permintaan memiliki konten
  if (typeof e !== 'undefined' && typeof e.postData !== 'undefined') {
    try {
      // Parsing data JSON dari body permintaan
      var data = JSON.parse(e.postData.contents);

      // Dapatkan spreadsheet aktif berdasarkan nama atau ID
      // GANTI 'Data Pendaftaran Sekolah' dengan nama spreadsheet Anda
      var spreadsheetId = 'ID_SPREADSHEET_ANDA_DI_SINI'; // Opsional: Ganti dengan ID Spreadsheet Anda untuk akses langsung
      var ss = SpreadsheetApp.openById(spreadsheetId) || SpreadsheetApp.openByName('Data Pendaftaran Sekolah');
      
      // Dapatkan sheet pertama (atau ganti dengan nama sheet Anda jika berbeda)
      var sheet = ss.getSheets()[0]; // Atau ss.getSheetByName('Nama Sheet Anda');

      // Dapatkan header kolom dari baris pertama
      var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];

      // Buat array untuk baris baru berdasarkan header
      var newRow = [];
      for (var i = 0; i < headers.length; i++) {
        var header = headers[i];
        // Pastikan key ada di data yang diterima, jika tidak, gunakan string kosong
        newRow.push(data[header] || ''); 
      }

      // Tambahkan baris baru ke sheet
      sheet.appendRow(newRow);

      // Kembalikan respons sukses
      return ContentService.createTextOutput(JSON.stringify({
        'status': 'success',
        'message': 'Data berhasil disimpan.'
      })).setMimeType(ContentService.MimeType.JSON);

    } catch (error) {
      // Tangani kesalahan jika parsing JSON gagal atau ada masalah lain
      Logger.log(error.toString()); // Log error untuk debugging di Apps Script
      return ContentService.createTextOutput(JSON.stringify({
        'status': 'error',
        'message': 'Terjadi kesalahan saat menyimpan data: ' + error.message
      })).setMimeType(ContentService.MimeType.JSON);
    }
  } else {
    // Jika tidak ada data POST
    return ContentService.createTextOutput(JSON.stringify({
      'status': 'error',
      'message': 'Tidak ada data yang diterima.'
    })).setMimeType(ContentService.MimeType.JSON);
  }
}

// Fungsi opsional untuk menguji doPost secara manual dari editor Apps Script
// function testDoPost() {
//   var mockEvent = {
//     postData: {
//       contents: JSON.stringify({
//         "Nama Lengkap": "Nama Uji Coba",
//         "NISN": "1234567890",
//         "Email": "uji@coba.com",
//         "No. HP": "081234567890",
//         "Jenis Kelamin": "Laki-laki",
//         "Pilihan Jurusan": "RPL",
//         "Alamat Lengkap": "Jl. Uji Coba No. 1, Kota Uji",
//         "Tanggal Pendaftaran": new Date().toLocaleString('id-ID')
//       }),
//       type: "application/json"
//     }
//   };
//   var response = doPost(mockEvent);
//   Logger.log(response.getContent());
// }


Wednesday, 2 July 2025

Membuat Aplikasi dengan Gemini

 















DT PLUSK - Panduan Magang

 







Referensi

Panduan Magang 1

Panduan Magang untuk Pengusaha

Panduan AI Untuk Penulisan Ilmiah

 






Refernsi

Panduan Chat GPT untuk penulisan ilmiah

Buku Onno Pegangan AI Untuk Guru


Code AI dan Spreadsheet

 










Promp 1

Buatkan prompt untuk membuat website pendaftaran sekolah dalam bentuk html, css, java script, untuk datanya disimpan di google sheet

Prompt 2 : Website Pendaftaran Sekolah (Data ke Google Sheets)

Buatkan sebuah aplikasi web pendaftaran sekolah sederhana berbasis HTML, CSS, dan JavaScript, dengan fitur sebagai berikut:

Fitur Utama:

  1. Formulir pendaftaran yang mencakup field berikut:

    • Nama Lengkap

    • NISN

    • Email

    • No. HP

    • Jenis Kelamin (Radio button: Laki-laki / Perempuan)

    • Pilihan Jurusan (Dropdown: RPL, TKJ, DKV, TBSM, Akuntansi)

    • Alamat Lengkap (Textarea)

  2. Tombol Submit, yang jika diklik:

    • Validasi semua input tidak boleh kosong

    • Menyimpan data ke Google Spreadsheet melalui Google Apps Script Web Apps (POST ke URL)

    • Menampilkan notifikasi “Pendaftaran berhasil” tanpa reload halaman

  3. Gunakan desain yang responsif dan bersih:

    • Styling dengan CSS sederhana (boleh pakai Bootstrap jika perlu)

    • Layout rapi dan ramah pengguna, gunakan font Google Fonts

  4. Sertakan komentar dalam kode untuk memudahkan pengembangan lebih lanjut.

  5. File yang dihasilkan:

    • index.html

    • style.css

    • script.js

  6. Sertakan juga contoh Google Apps Script (Code.gs) yang menangani penyimpanan data ke Google Sheets:

    • Fungsi doPost(e) untuk menerima data dan menyimpannya ke spreadsheet

    • Spreadsheet memiliki header sesuai dengan field formulir

  7. Sertakan instruksi singkat di dalam HTML dalam komentar:
    👉 bagaimana cara menyebarkan Google Apps Script sebagai Web App agar form bisa digunakan.

Index.html


<!DOCTYPE html>
<html lang="id">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
  <title>Form Pendaftaran Sekolah</title>
  <link rel="stylesheet" href="style.css"/>
  <link href="https://fonts.googleapis.com/css2?family=Poppins&display=swap" rel="stylesheet"/>
</head>
<body>
  <div class="container">
    <h2>Form Pendaftaran Sekolah</h2>
    <form id="formPendaftaran">
      <label>Nama Lengkap</label>
      <input type="text" name="nama" required />

      <label>NISN</label>
      <input type="text" name="nisn" required />

      <label>Email</label>
      <input type="email" name="email" required />

      <label>No. HP</label>
      <input type="text" name="hp" required />

      <label>Jenis Kelamin</label>
      <div class="radio-group">
        <label><input type="radio" name="gender" value="Laki-laki" required /> Laki-laki</label>
        <label><input type="radio" name="gender" value="Perempuan" required /> Perempuan</label>
      </div>

      <label>Jurusan</label>
      <select name="jurusan" required>
        <option value="">-- Pilih Jurusan --</option>
        <option value="RPL">RPL</option>
        <option value="TKJ">TKJ</option>
        <option value="DKV">DKV</option>
        <option value="TBSM">TBSM</option>
        <option value="Akuntansi">Akuntansi</option>
      </select>

      <label>Alamat Lengkap</label>
      <textarea name="alamat" rows="4" required></textarea>

      <button type="submit">Daftar</button>
    </form>

    <p id="notif" class="notif"></p>
  </div>

  <script src="script.js"></script>
</body>
</html>

<!--
👉 Cara menyambungkan ke Google Sheets:
1. Buat Google Spreadsheet dan beri header: Nama, NISN, Email, HP, Jenis Kelamin, Jurusan, Alamat
2. Di Google Apps Script (https://script.google.com), buat file baru, tempelkan isi `Code.gs` (di bawah).
3. Deploy sebagai Web App:
   - Klik Deploy > New Deployment
   - Pilih "Web App"
   - Isi nama, pilih "Anyone" untuk akses publik
   - Salin URL Web App → ganti ke dalam `script.js` (letakkan di variabel `scriptURL`)
-->

Style.css


body {
  font-family: 'Poppins', sans-serif;
  background: #f2f7ff;
  margin: 0;
  padding: 0;
}

.container {
  max-width: 500px;
  margin: 40px auto;
  background: white;
  padding: 30px;
  border-radius: 10px;
  box-shadow: 0 4px 12px rgba(0,0,0,0.1);
}

h2 {
  text-align: center;
  margin-bottom: 20px;
  color: #333;
}

form label {
  display: block;
  margin-top: 15px;
  font-weight: 600;
}

input[type="text"],
input[type="email"],
select,
textarea {
  width: 100%;
  padding: 10px;
  margin-top: 5px;
  border-radius: 5px;
  border: 1px solid #ccc;
}

.radio-group {
  display: flex;
  gap: 15px;
  margin-top: 5px;
}

button {
  margin-top: 20px;
  padding: 12px;
  width: 100%;
  background-color: #1e88e5;
  border: none;
  color: white;
  border-radius: 5px;
  font-size: 16px;
  cursor: pointer;
}

button:hover {
  background-color: #1565c0;
}

.notif {
  text-align: center;
  margin-top: 20px;
  color: green;
}


script.js


// Ganti URL di bawah dengan URL Web App kamu dari Google Apps Script
const scriptURL = 'https://script.google.com/macros/s/YOUR_SCRIPT_ID/exec';
const form = document.getElementById('formPendaftaran');
const notif = document.getElementById('notif');

form.addEventListener('submit', e => {
  e.preventDefault();

  // Validasi sederhana
  const data = new FormData(form);
  for (let [key, value] of data.entries()) {
    if (!value) {
      notif.textContent = "Semua field harus diisi.";
      notif.style.color = "red";
      return;
    }
  }

  fetch(scriptURL, { method: 'POST', body: data })
    .then(response => {
      notif.textContent = "Pendaftaran berhasil!";
      notif.style.color = "green";
      form.reset();
    })
    .catch(error => {
      notif.textContent = "Terjadi kesalahan, silakan coba lagi.";
      notif.style.color = "red";
      console.error('Error!', error.message);
    });
});


Code.gs


function doPost(e) {
  const ss = SpreadsheetApp.openById('SPREADSHEET_ID');
  const sheet = ss.getSheetByName('Sheet1');

  const data = [
    e.parameter.nama,
    e.parameter.nisn,
    e.parameter.email,
    e.parameter.hp,
    e.parameter.gender,
    e.parameter.jurusan,
    e.parameter.alamat
  ];

  sheet.appendRow(data);

  return ContentService
    .createTextOutput("Success")
    .setMimeType(ContentService.MimeType.TEXT);
}

Referensi

https://chatgpt.com/c/6864da4a-6a18-800e-9484-9dc96942d6dc

https://www.youtube.com/watch?v=KNC9AvsYuUg

Panduan Chat GPT untuk penulisan ilmiah

Buku Onno Pegangan AI Untuk Guru







Integrasi Canva AI dan Google Sheets

 













Prompt: Website Pendaftaran Sekolah (Data ke Google Sheets)

Buatkan sebuah aplikasi web pendaftaran sekolah sederhana berbasis HTML, CSS, dan JavaScript, dengan fitur sebagai berikut:

Fitur Utama:

  1. Formulir pendaftaran yang mencakup field berikut:

    • Nama Lengkap

    • NISN

    • Email

    • No. HP

    • Jenis Kelamin (Radio button: Laki-laki / Perempuan)

    • Pilihan Jurusan (Dropdown: RPL, TKJ, DKV, TBSM, Akuntansi)

    • Alamat Lengkap (Textarea)

  2. Tombol Submit, yang jika diklik:

    • Validasi semua input tidak boleh kosong

    • Menyimpan data ke Google Spreadsheet melalui Google Apps Script Web Apps (POST ke URL)

    • Menampilkan notifikasi “Pendaftaran berhasil” tanpa reload halaman

  3. Gunakan desain yang responsif dan bersih:

    • Styling dengan CSS sederhana (boleh pakai Bootstrap jika perlu)

    • Layout rapi dan ramah pengguna, gunakan font Google Fonts

  4. Sertakan komentar dalam kode untuk memudahkan pengembangan lebih lanjut.

  5. File yang dihasilkan:

    • index.html

    • style.css

    • script.js

  6. Sertakan juga contoh Google Apps Script (Code.gs) yang menangani penyimpanan data ke Google Sheets:

    • Fungsi doPost(e) untuk menerima data dan menyimpannya ke spreadsheet

    • Spreadsheet memiliki header sesuai dengan field formulir

  7. Sertakan instruksi singkat di dalam HTML dalam komentar:
    👉 bagaimana cara menyebarkan Google Apps Script sebagai Web App agar form bisa digunakan.


 

Bisnis Komoditas Buah -Sun Pride

  https://www.sunpride.co.id/ https://www.youtube.com/watch?v=o5efJ-Lljhc https://www.gunungsewu.com/businesses/food https://drive.google.co...