Auto commit: 2026-04-23T10:05:35.493Z

This commit is contained in:
Flatlogic Bot 2026-04-23 10:05:35 +00:00
parent dfa6602800
commit 452e0ce2c0
3 changed files with 1262 additions and 510 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,39 +1,122 @@
document.addEventListener('DOMContentLoaded', () => {
const chatForm = document.getElementById('chat-form');
const chatInput = document.getElementById('chat-input');
const chatMessages = document.getElementById('chat-messages');
const toastElement = document.getElementById('pageToast');
const toastBody = document.getElementById('pageToastBody');
const pageToast = toastElement ? new bootstrap.Toast(toastElement, { delay: 2200 }) : null;
const appendMessage = (text, sender) => {
const msgDiv = document.createElement('div');
msgDiv.classList.add('message', sender);
msgDiv.textContent = text;
chatMessages.appendChild(msgDiv);
chatMessages.scrollTop = chatMessages.scrollHeight;
const showToast = (message) => {
if (!pageToast || !toastBody || !message) return;
toastBody.textContent = message;
pageToast.show();
};
chatForm.addEventListener('submit', async (e) => {
e.preventDefault();
const message = chatInput.value.trim();
if (!message) return;
appendMessage(message, 'visitor');
chatInput.value = '';
try {
const response = await fetch('api/chat.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ message })
});
const data = await response.json();
// Artificial delay for realism
setTimeout(() => {
appendMessage(data.reply, 'bot');
}, 500);
} catch (error) {
console.error('Error:', error);
appendMessage("Sorry, something went wrong. Please try again.", 'bot');
}
document.querySelectorAll('[data-toast-message]').forEach((link) => {
link.addEventListener('click', () => showToast(link.getAttribute('data-toast-message')));
});
const revealItems = document.querySelectorAll('.reveal');
if ('IntersectionObserver' in window && revealItems.length) {
const revealObserver = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
entry.target.classList.add('is-visible');
revealObserver.unobserve(entry.target);
}
});
}, { threshold: 0.16 });
revealItems.forEach((item) => revealObserver.observe(item));
} else {
revealItems.forEach((item) => item.classList.add('is-visible'));
}
const filterButtons = document.querySelectorAll('.btn-filter');
const galleryItems = document.querySelectorAll('.gallery-item');
const filterStatus = document.getElementById('filterStatus');
filterButtons.forEach((button) => {
button.addEventListener('click', () => {
const filter = button.dataset.filter || 'all';
filterButtons.forEach((btn) => btn.classList.remove('active'));
button.classList.add('active');
let visibleCount = 0;
galleryItems.forEach((item) => {
const matches = filter === 'all' || item.dataset.era === filter;
item.classList.toggle('is-hidden', !matches);
if (matches) visibleCount += 1;
});
const statusText = filter === 'all'
? `Showing all ${visibleCount} images.`
: `Showing ${visibleCount} ${filter} image${visibleCount === 1 ? '' : 's'}.`;
if (filterStatus) filterStatus.textContent = statusText;
showToast(statusText);
});
});
const galleryModal = document.getElementById('galleryModal');
if (galleryModal) {
const modalLabel = document.getElementById('galleryModalLabel');
const modalMeta = document.getElementById('galleryModalMeta');
const modalImage = document.getElementById('galleryModalImage');
const modalCaption = document.getElementById('galleryModalCaption');
galleryModal.addEventListener('show.bs.modal', (event) => {
const trigger = event.relatedTarget;
if (!trigger) return;
const title = trigger.getAttribute('data-title') || 'Gallery image';
const eraLabel = trigger.getAttribute('data-era-label') || 'Archive';
const year = trigger.getAttribute('data-year') || '';
const caption = trigger.getAttribute('data-caption') || '';
const image = trigger.getAttribute('data-image') || '';
const alt = trigger.getAttribute('data-alt') || title;
if (modalLabel) modalLabel.textContent = title;
if (modalMeta) modalMeta.textContent = `${eraLabel} · ${year}`;
if (modalCaption) modalCaption.textContent = caption;
if (modalImage) {
modalImage.src = image;
modalImage.alt = alt;
}
});
}
const sections = document.querySelectorAll('main section[id]');
const navLinks = document.querySelectorAll('#mainNav .nav-link');
const setActiveLink = () => {
let currentId = '';
sections.forEach((section) => {
const top = section.getBoundingClientRect().top;
if (top <= 140) currentId = section.id;
});
navLinks.forEach((link) => {
const href = link.getAttribute('href');
link.classList.toggle('active', href === `#${currentId}`);
});
};
setActiveLink();
document.addEventListener('scroll', setActiveLink, { passive: true });
const parallaxItems = document.querySelectorAll('[data-parallax]');
if (parallaxItems.length && !window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
const updateParallax = () => {
parallaxItems.forEach((item) => {
const rect = item.getBoundingClientRect();
const centerOffset = (window.innerHeight * 0.5 - rect.top) / window.innerHeight;
const depth = item.dataset.parallax === 'media' ? 16 : 10;
const translateY = Math.max(-depth, Math.min(depth, centerOffset * depth));
item.style.transform = `translate3d(0, ${translateY}px, 0)`;
});
};
updateParallax();
window.addEventListener('scroll', updateParallax, { passive: true });
window.addEventListener('resize', updateParallax);
}
});

547
index.php
View File

@ -1,150 +1,429 @@
<?php
declare(strict_types=1);
@ini_set('display_errors', '1');
@error_reporting(E_ALL);
@date_default_timezone_set('UTC');
$phpVersion = PHP_VERSION;
$now = date('Y-m-d H:i:s');
$projectName = $_SERVER['PROJECT_NAME'] ?? "Arnold Schwarzenegger Career";
$projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? "A public landing page tracing Arnold Schwarzenegger's rise from bodybuilding icon to movie star and governor.";
$projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? '';
$assetVersion = (string) max(
@filemtime(__DIR__ . '/assets/css/custom.css') ?: time(),
@filemtime(__DIR__ . '/assets/js/main.js') ?: time()
);
$currentYear = date('Y');
$galleryItems = [
[
'era' => 'bodybuilding',
'year' => '1974',
'title' => "Prime competition form",
'caption' => "A defining bodybuilding-era image from the run that made him one of the sport's most recognizable figures.",
'image' => 'https://upload.wikimedia.org/wikipedia/commons/0/05/Arnold_Schwarzenegger_1974.jpg',
'alt' => 'Arnold Schwarzenegger posing during his bodybuilding career in 1974.'
],
[
'era' => 'acting',
'year' => '2003',
'title' => "Cannes red carpet presence",
'caption' => 'An image from Cannes that reflects the global star power he carried well beyond action cinema.',
'image' => 'https://upload.wikimedia.org/wikipedia/commons/e/ed/Arnold_Schwarzenegger_2003.jpg',
'alt' => 'Arnold Schwarzenegger at the 2003 Cannes Film Festival.'
],
[
'era' => 'politics',
'year' => '2004',
'title' => "Governor-era portrait",
'caption' => "A formal public image from the period when he served as California's 38th governor.",
'image' => 'https://upload.wikimedia.org/wikipedia/commons/b/bb/Arnold_Schwarzenegger_2004-01-30.jpg',
'alt' => 'Arnold Schwarzenegger during his time as governor of California.'
],
[
'era' => 'acting',
'year' => '2017',
'title' => "Festival circuit return",
'caption' => "A later public appearance that reinforces how durable his public image remained decades after the first breakthrough.",
'image' => 'https://upload.wikimedia.org/wikipedia/commons/c/cc/Arnold_Schwarzenegger_2012.jpg',
'alt' => 'Arnold Schwarzenegger at a public appearance in 2012.'
],
[
'era' => 'legacy',
'year' => '2019',
'title' => "Public figure, decades later",
'caption' => "A contemporary portrait that captures the elder-statesman phase of his public life.",
'image' => 'https://upload.wikimedia.org/wikipedia/commons/6/6e/Arnold_Schwarzenegger-2019.jpg',
'alt' => 'Arnold Schwarzenegger in 2019.'
],
[
'era' => 'politics',
'year' => '2003',
'title' => "Service and visibility",
'caption' => "An image from a military support context, reflecting the civic and ceremonial side of his public role.",
'image' => 'https://upload.wikimedia.org/wikipedia/commons/b/b3/Arnold_Schwarzenegger_Enduring_Freedom.jpg',
'alt' => 'Arnold Schwarzenegger visiting service members during a public service event.'
],
];
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>New Style</title>
<?php
// Read project preview data from environment
$projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? '';
$projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? '';
?>
<?php if ($projectDescription): ?>
<!-- Meta description -->
<meta name="description" content='<?= htmlspecialchars($projectDescription) ?>' />
<!-- Open Graph meta tags -->
<meta property="og:description" content="<?= htmlspecialchars($projectDescription) ?>" />
<!-- Twitter meta tags -->
<meta property="twitter:description" content="<?= htmlspecialchars($projectDescription) ?>" />
<?php endif; ?>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title><?= htmlspecialchars($projectName) ?></title>
<meta name="description" content="<?= htmlspecialchars($projectDescription) ?>">
<meta name="theme-color" content="#111315">
<meta property="og:title" content="<?= htmlspecialchars($projectName) ?>">
<meta property="og:description" content="<?= htmlspecialchars($projectDescription) ?>">
<meta property="twitter:description" content="<?= htmlspecialchars($projectDescription) ?>">
<?php if ($projectImageUrl): ?>
<!-- Open Graph image -->
<meta property="og:image" content="<?= htmlspecialchars($projectImageUrl) ?>" />
<!-- Twitter image -->
<meta property="twitter:image" content="<?= htmlspecialchars($projectImageUrl) ?>" />
<meta property="og:image" content="<?= htmlspecialchars($projectImageUrl) ?>">
<meta property="twitter:image" content="<?= htmlspecialchars($projectImageUrl) ?>">
<?php endif; ?>
<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;700&display=swap" rel="stylesheet">
<style>
:root {
--bg-color-start: #6a11cb;
--bg-color-end: #2575fc;
--text-color: #ffffff;
--card-bg-color: rgba(255, 255, 255, 0.01);
--card-border-color: rgba(255, 255, 255, 0.1);
}
body {
margin: 0;
font-family: 'Inter', sans-serif;
background: linear-gradient(45deg, var(--bg-color-start), var(--bg-color-end));
color: var(--text-color);
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
text-align: center;
overflow: hidden;
position: relative;
}
body::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><path d="M-10 10L110 10M10 -10L10 110" stroke-width="1" stroke="rgba(255,255,255,0.05)"/></svg>');
animation: bg-pan 20s linear infinite;
z-index: -1;
}
@keyframes bg-pan {
0% { background-position: 0% 0%; }
100% { background-position: 100% 100%; }
}
main {
padding: 2rem;
}
.card {
background: var(--card-bg-color);
border: 1px solid var(--card-border-color);
border-radius: 16px;
padding: 2rem;
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.1);
}
.loader {
margin: 1.25rem auto 1.25rem;
width: 48px;
height: 48px;
border: 3px solid rgba(255, 255, 255, 0.25);
border-top-color: #fff;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.hint {
opacity: 0.9;
}
.sr-only {
position: absolute;
width: 1px; height: 1px;
padding: 0; margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap; border: 0;
}
h1 {
font-size: 3rem;
font-weight: 700;
margin: 0 0 1rem;
letter-spacing: -1px;
}
p {
margin: 0.5rem 0;
font-size: 1.1rem;
}
code {
background: rgba(0,0,0,0.2);
padding: 2px 6px;
border-radius: 4px;
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
}
footer {
position: absolute;
bottom: 1rem;
font-size: 0.8rem;
opacity: 0.7;
}
</style>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="/assets/css/custom.css?v=<?= rawurlencode($assetVersion) ?>">
</head>
<body>
<main>
<div class="card">
<h1>Analyzing your requirements and generating your website…</h1>
<div class="loader" role="status" aria-live="polite" aria-label="Applying initial changes">
<span class="sr-only">Loading…</span>
<body class="page-cinematic" data-bs-spy="scroll" data-bs-target="#mainNav" data-bs-root-margin="0px 0px -40%" tabindex="0">
<header class="site-header sticky-top border-bottom border-secondary-subtle">
<nav id="mainNav" class="navbar navbar-expand-lg navbar-dark">
<div class="container">
<a class="navbar-brand d-flex align-items-center gap-2" href="#top">
<span class="brand-mark">AS</span>
<span>
<span class="brand-title d-block">Arnold Schwarzenegger</span>
<span class="brand-subtitle d-block">Career landing page</span>
</span>
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav ms-auto align-items-lg-center gap-lg-2">
<li class="nav-item"><a class="nav-link" href="#story">Story</a></li>
<li class="nav-item"><a class="nav-link" href="#timeline">Timeline</a></li>
<li class="nav-item"><a class="nav-link" href="#moments">Moments</a></li>
<li class="nav-item"><a class="nav-link" href="#gallery">Gallery</a></li>
<li class="nav-item"><a class="nav-link" href="#quotes">Quotes</a></li>
</ul>
</div>
</div>
<p class="hint"><?= ($_SERVER['HTTP_HOST'] ?? '') === 'appwizzy.com' ? 'AppWizzy' : 'Flatlogic' ?> AI is collecting your requirements and applying the first changes.</p>
<p class="hint">This page will update automatically as the plan is implemented.</p>
<p>Runtime: PHP <code><?= htmlspecialchars($phpVersion) ?></code> — UTC <code><?= htmlspecialchars($now) ?></code></p>
</div>
</nav>
</header>
<main id="top">
<section class="hero-section hero-stage section-shell">
<div class="container">
<div class="row align-items-center g-4 g-xl-5">
<div class="col-lg-7">
<div class="hero-copy reveal" data-parallax="copy">
<div class="scene-label">Cinematic profile</div>
<div class="eyebrow">Public editorial landing page</div>
<h1 class="display-hero">A career built in three unmistakable acts.</h1>
<p class="hero-lead">From elite bodybuilding to blockbuster cinema to the governor's office, Arnold Schwarzenegger's career stands out because each chapter felt larger than the one before it.</p>
<div class="hero-roles" aria-label="Career roles">
<span>Athlete</span>
<span>Actor</span>
<span>Governor</span>
</div>
<div class="hero-actions d-flex flex-wrap gap-2">
<a class="btn btn-accent" href="#timeline" data-toast-message="Jumped to the career timeline.">Explore the timeline</a>
<a class="btn btn-outline-light" href="#gallery" data-toast-message="Opening the photo-rich section next.">Browse the gallery</a>
</div>
<div class="hero-meta row row-cols-1 row-cols-sm-3 g-3 mt-1">
<div class="col">
<div class="stat-card">
<span class="stat-value">7</span>
<span class="stat-label">Mr. Olympia titles</span>
</div>
</div>
<div class="col">
<div class="stat-card">
<span class="stat-value">3</span>
<span class="stat-label">Career eras</span>
</div>
</div>
<div class="col">
<div class="stat-card">
<span class="stat-value">20032011</span>
<span class="stat-label">Governor of California</span>
</div>
</div>
</div>
<div class="hero-marquee" aria-hidden="true">
<span>Discipline</span>
<span>Reinvention</span>
<span>Screen myth</span>
<span>Executive power</span>
</div>
</div>
</div>
<div class="col-lg-5">
<div class="hero-media reveal reveal-delay-1" data-parallax="media">
<div class="media-frame">
<div class="media-frame-badge">Featured portrait</div>
<img
src="https://upload.wikimedia.org/wikipedia/commons/6/6e/Arnold_Schwarzenegger-2019.jpg"
class="img-fluid"
alt="Arnold Schwarzenegger in a contemporary portrait."
width="900"
height="1200"
loading="eager"
>
</div>
<div class="image-caption">Later-career portrait steady, recognizable, and still unmistakably cinematic.</div>
<div class="hero-floating-note">
<span class="floating-kicker">Three acts</span>
<strong>Bodybuilding Hollywood California statehouse</strong>
</div>
</div>
</div>
</div>
</div>
</section>
<section id="story" class="section-shell section-border-top">
<div class="container">
<div class="section-heading reveal">
<div class="eyebrow">Overview</div>
<h2>Why this career arc still feels singular.</h2>
<p>Arnold Schwarzenegger's public image works because it never stayed fixed. He emerged as a bodybuilding phenomenon, crossed into Hollywood at full scale, then converted celebrity into an executive political role.</p>
</div>
<div class="row g-4 align-items-stretch">
<div class="col-lg-7 reveal">
<article class="content-panel h-100">
<h3>Three chapters, one through-line</h3>
<p>The through-line is discipline. In bodybuilding, it meant obsessive repetition and visual presence. In film, it became physical charisma and instantly readable screen identity. In politics, it turned into a different kind of public performance: broad messaging, visibility, and executive symbolism.</p>
<p class="mb-0">This landing page is designed as a clean, scroll-first story: fewer distractions, stronger typography, restrained color, and image-led pacing.</p>
</article>
</div>
<div class="col-lg-5 reveal reveal-delay-1">
<aside class="content-panel h-100">
<div class="list-label">Fast read</div>
<ul class="detail-list list-unstyled mb-0">
<li><span>Bodybuilding</span><strong>Mr. Universe at 20, then seven Olympia titles</strong></li>
<li><span>Acting</span><strong>From cult appearances to action-star permanence</strong></li>
<li><span>Politics</span><strong>California governor with a highly visible public brand</strong></li>
<li><span>Legacy</span><strong>Still active in media, fitness, and civic advocacy</strong></li>
</ul>
</aside>
</div>
</div>
</div>
</section>
<section id="timeline" class="section-shell section-border-top">
<div class="container">
<div class="section-heading reveal">
<div class="eyebrow">Timeline</div>
<h2>A compressed career timeline.</h2>
<p>The page highlights the milestones most visitors care about first: arrival, breakthrough, cultural dominance, and reinvention.</p>
</div>
<div class="timeline-grid">
<article class="timeline-card reveal">
<div class="timeline-year">19681975</div>
<h3>Bodybuilding dominance</h3>
<p>He moved from Austria to the United States, became the youngest Mr. Universe at age 20, and built a run that culminated in seven Mr. Olympia victories.</p>
<ul>
<li>Rapid rise through international competition</li>
<li>Visual identity tied to discipline and spectacle</li>
<li><em>Pumping Iron</em> helped widen his audience</li>
</ul>
</article>
<article class="timeline-card reveal reveal-delay-1">
<div class="timeline-year">19762002</div>
<h3>Hollywood scale</h3>
<p>He converted physique into screen presence, then screen presence into a durable action-movie persona that became global pop culture.</p>
<ul>
<li><em>Conan the Barbarian</em> announced him as a leading man</li>
<li><em>The Terminator</em> made the persona unforgettable</li>
<li>Comedy and family films broadened the image</li>
</ul>
</article>
<article class="timeline-card reveal reveal-delay-2">
<div class="timeline-year">2003today</div>
<h3>Politics, advocacy, and legacy</h3>
<p>His election as California's 38th governor marked a rare shift from entertainment fame to statewide executive power, later followed by a return to media and public advocacy.</p>
<ul>
<li>Governor of California from 2003 to 2011</li>
<li>Fitness, climate, and civic messaging remain part of the brand</li>
<li>Public legacy now spans sport, entertainment, and politics</li>
</ul>
</article>
</div>
</div>
</section>
<section id="moments" class="section-shell section-border-top">
<div class="container">
<div class="section-heading reveal">
<div class="eyebrow">Signature moments</div>
<h2>Milestones that define the public narrative.</h2>
<p>Rather than listing everything, this section isolates the moments that best explain why the career still reads as unusually expansive.</p>
</div>
<div class="row g-3 g-lg-4">
<div class="col-md-6 col-xl-3 reveal">
<article class="moment-card h-100">
<div class="moment-kicker">Sport</div>
<h3>Mr. Universe at 20</h3>
<p>Early proof of exceptional ambition and stage presence.</p>
</article>
</div>
<div class="col-md-6 col-xl-3 reveal reveal-delay-1">
<article class="moment-card h-100">
<div class="moment-kicker">Film</div>
<h3>Action-star permanence</h3>
<p>Blockbuster roles turned a niche celebrity into a mass-market icon.</p>
</article>
</div>
<div class="col-md-6 col-xl-3 reveal reveal-delay-2">
<article class="moment-card h-100">
<div class="moment-kicker">Award</div>
<h3>Golden Globe win</h3>
<p><em>Stay Hungry</em> signaled early crossover potential in film.</p>
</article>
</div>
<div class="col-md-6 col-xl-3 reveal reveal-delay-3">
<article class="moment-card h-100">
<div class="moment-kicker">Public office</div>
<h3>Governor of California</h3>
<p>A rare leap from celebrity scale to executive political office.</p>
</article>
</div>
</div>
</div>
</section>
<section id="gallery" class="section-shell section-border-top">
<div class="container">
<div class="section-heading reveal">
<div class="eyebrow">Gallery</div>
<h2>Browse the career through images.</h2>
<p>Use the filters to move between bodybuilding, acting, politics, and the broader legacy chapter. Each card opens a larger image view.</p>
</div>
<div class="gallery-toolbar reveal">
<div class="btn-group flex-wrap" role="group" aria-label="Filter gallery by era">
<button type="button" class="btn btn-filter active" data-filter="all">All</button>
<button type="button" class="btn btn-filter" data-filter="bodybuilding">Bodybuilding</button>
<button type="button" class="btn btn-filter" data-filter="acting">Acting</button>
<button type="button" class="btn btn-filter" data-filter="politics">Politics</button>
<button type="button" class="btn btn-filter" data-filter="legacy">Legacy</button>
</div>
<div class="filter-status" id="filterStatus" aria-live="polite">Showing all 6 images.</div>
</div>
<div class="row g-3 g-lg-4" id="galleryGrid">
<?php foreach ($galleryItems as $item): ?>
<div class="col-sm-6 col-xl-4 gallery-item reveal" data-era="<?= htmlspecialchars($item['era']) ?>">
<button
type="button"
class="gallery-card text-start"
data-bs-toggle="modal"
data-bs-target="#galleryModal"
data-title="<?= htmlspecialchars($item['title']) ?>"
data-era-label="<?= htmlspecialchars(ucfirst($item['era'])) ?>"
data-year="<?= htmlspecialchars($item['year']) ?>"
data-caption="<?= htmlspecialchars($item['caption']) ?>"
data-image="<?= htmlspecialchars($item['image']) ?>"
data-alt="<?= htmlspecialchars($item['alt']) ?>"
>
<div class="gallery-image-wrap">
<img
src="<?= htmlspecialchars($item['image']) ?>"
alt="<?= htmlspecialchars($item['alt']) ?>"
class="gallery-image"
width="900"
height="1100"
loading="lazy"
>
</div>
<div class="gallery-body">
<div class="gallery-meta">
<span><?= htmlspecialchars(ucfirst($item['era'])) ?></span>
<span><?= htmlspecialchars($item['year']) ?></span>
</div>
<h3><?= htmlspecialchars($item['title']) ?></h3>
<p><?= htmlspecialchars($item['caption']) ?></p>
</div>
</button>
</div>
<?php endforeach; ?>
</div>
</div>
</section>
<section id="quotes" class="section-shell section-border-top">
<div class="container">
<div class="section-heading reveal">
<div class="eyebrow">Notable quotes</div>
<h2>Lines people still associate with the persona.</h2>
<p>Some lines became larger than the films themselves, helping cement the screen character and public mythology.</p>
</div>
<div class="row g-3 g-lg-4">
<div class="col-lg-4 reveal">
<blockquote class="quote-card h-100">
<p>“I'll be back.</p>
<footer> Screen line that became part of pop culture shorthand</footer>
</blockquote>
</div>
<div class="col-lg-4 reveal reveal-delay-1">
<blockquote class="quote-card h-100">
<p>“Strength does not come from winning.</p>
<footer> A line often linked to his discipline-first public image</footer>
</blockquote>
</div>
<div class="col-lg-4 reveal reveal-delay-2">
<blockquote class="quote-card h-100">
<p>“What is the point of being on this Earth if you are going to be like everyone else?</p>
<footer> A quote that mirrors the scale of his career ambitions</footer>
</blockquote>
</div>
</div>
</div>
</section>
</main>
<footer>
Page updated: <?= htmlspecialchars($now) ?> (UTC)
<footer class="site-footer section-border-top">
<div class="container d-flex flex-column flex-lg-row justify-content-between gap-3 align-items-lg-center">
<div>
<div class="footer-title">Arnold Schwarzenegger career landing page</div>
<p class="footer-copy mb-0">A clean, image-forward one-page experience designed for quick scrolling and clear storytelling.</p>
</div>
<a class="btn btn-sm btn-outline-light" href="#top" data-toast-message="Returned to the top of the page.">Back to top</a>
</div>
</footer>
<div class="modal fade" id="galleryModal" tabindex="-1" aria-labelledby="galleryModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-xl modal-dialog-scrollable">
<div class="modal-content gallery-modal-content">
<div class="modal-header border-secondary-subtle">
<div>
<div class="modal-eyebrow" id="galleryModalMeta">Image detail</div>
<h2 class="modal-title fs-4" id="galleryModalLabel">Gallery image</h2>
</div>
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="row g-4 align-items-start">
<div class="col-lg-7">
<div class="modal-image-frame">
<img id="galleryModalImage" src="" alt="" class="img-fluid" width="1200" height="1400">
</div>
</div>
<div class="col-lg-5">
<div class="modal-copy">
<p id="galleryModalCaption" class="mb-0"></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="toast-container position-fixed bottom-0 end-0 p-3">
<div id="pageToast" class="toast text-bg-dark border border-secondary-subtle" role="status" aria-live="polite" aria-atomic="true">
<div class="toast-body" id="pageToastBody">Section updated.</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
<script src="/assets/js/main.js?v=<?= rawurlencode($assetVersion) ?>" defer></script>
</body>
</html>