2
0
Files
gitcaddy-server/templates/pages/architecture-deep-dive.tmpl
logikonline f3eba7dd34 feat(pages): add 5 new landing page templates
Add Documentation First, Developer Tool, Visual Showcase, CLI Terminal, and Architecture Deep Dive templates. Brings total templates to 9. Each template has unique design language and target audience: Documentation First for docs-heavy projects, Developer Tool for technical products, Visual Showcase for design/media projects, CLI Terminal for command-line tools, Architecture Deep Dive for technical deep-dives. Updates template display names for clarity.
2026-03-16 22:18:53 -04:00

1540 lines
47 KiB
Handlebars

{{template "pages/base_head" .}}
<style>
@import url('https://fonts.googleapis.com/css2?family=Barlow+Condensed:wght@300;400;500;600;700&family=Barlow:wght@300;400;500;600;700&display=swap');
:root {
--ad-bg: #0d1b2a;
--ad-surface: #112240;
--ad-elevated: #1a3158;
--ad-text: #ccd6e0;
--ad-muted: #6b829c;
--ad-dim: #1e3a5f;
--ad-accent: {{if .Config.Theme.PrimaryColor}}{{.Config.Theme.PrimaryColor}}{{else}}#4cc9f0{{end}};
--ad-accent-dark: {{if .Config.Theme.AccentColor}}{{.Config.Theme.AccentColor}}{{else}}#f48c06{{end}};
--ad-glow: color-mix(in srgb, var(--ad-accent) 15%, transparent);
--ad-glow-strong: color-mix(in srgb, var(--ad-accent) 40%, transparent);
}
html {
scroll-behavior: smooth;
}
html, body.pages-body {
overflow-x: hidden;
background: var(--ad-bg) !important;
}
/* Blueprint grid pattern */
.ad-page::before {
content: "";
position: fixed;
inset: 0;
background:
repeating-linear-gradient(
0deg,
transparent,
transparent 39px,
rgba(76, 201, 240, 0.04) 39px,
rgba(76, 201, 240, 0.04) 40px
),
repeating-linear-gradient(
90deg,
transparent,
transparent 39px,
rgba(76, 201, 240, 0.04) 39px,
rgba(76, 201, 240, 0.04) 40px
);
pointer-events: none;
z-index: 0;
}
.ad-page {
position: relative;
min-height: 100vh;
background: var(--ad-bg);
color: var(--ad-text);
font-family: 'Barlow', -apple-system, sans-serif;
-webkit-font-smoothing: antialiased;
}
/* Reveal animation system */
.ad-reveal {
opacity: 0;
transform: translateY(24px);
transition: opacity 0.6s linear, transform 0.6s linear;
}
.ad-reveal.visible {
opacity: 1;
transform: translateY(0);
}
.ad-reveal-delay-1 { transition-delay: 0.1s; }
.ad-reveal-delay-2 { transition-delay: 0.2s; }
.ad-reveal-delay-3 { transition-delay: 0.3s; }
.ad-reveal-delay-4 { transition-delay: 0.4s; }
/* Navigation */
.ad-nav {
position: fixed;
top: 0;
left: 0;
right: 0;
padding: 0 40px;
height: 60px;
display: flex;
align-items: center;
justify-content: space-between;
background: rgba(13, 27, 42, 0.92);
backdrop-filter: blur(16px) saturate(180%);
-webkit-backdrop-filter: blur(16px) saturate(180%);
border-bottom: 1px solid var(--ad-dim);
z-index: 100;
transition: background 0.3s ease;
}
.ad-nav-brand {
display: flex;
align-items: center;
gap: 10px;
text-decoration: none;
color: inherit;
}
.ad-nav-logo {
width: 30px;
height: 30px;
background: var(--ad-accent);
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 0 16px var(--ad-glow);
transition: box-shadow 0.3s ease;
}
.ad-nav-brand:hover .ad-nav-logo {
box-shadow: 0 0 28px var(--ad-glow-strong);
}
.ad-nav-name {
font-family: 'Barlow Condensed', sans-serif;
font-weight: 600;
font-size: 16px;
letter-spacing: 0.06em;
text-transform: uppercase;
}
.ad-nav-links {
display: flex;
align-items: center;
gap: 4px;
}
.ad-nav-link {
color: var(--ad-muted);
text-decoration: none;
font-family: 'Barlow Condensed', sans-serif;
font-size: 13px;
font-weight: 500;
padding: 8px 12px;
border-radius: 4px;
transition: all 0.2s ease;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.ad-nav-link:hover {
color: var(--ad-text);
background: rgba(76, 201, 240, 0.06);
}
.ad-nav-cta {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 7px 14px;
background: rgba(76, 201, 240, 0.08);
border: 1px solid var(--ad-dim);
color: var(--ad-accent);
font-family: 'Barlow Condensed', sans-serif;
font-size: 12px;
font-weight: 600;
border-radius: 4px;
text-decoration: none;
text-transform: uppercase;
letter-spacing: 0.1em;
transition: all 0.2s ease;
}
.ad-nav-cta:hover {
background: rgba(76, 201, 240, 0.15);
border-color: var(--ad-accent);
}
/* Mobile menu toggle */
.ad-menu-toggle {
display: none;
background: none;
border: none;
color: var(--ad-muted);
cursor: pointer;
padding: 8px;
}
/* Buttons */
.ad-btn-primary {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 12px 28px;
background: var(--ad-accent);
color: #0d1b2a;
font-family: 'Barlow Condensed', sans-serif;
font-weight: 700;
font-size: 13px;
border-radius: 4px;
text-decoration: none;
transition: all 0.2s linear;
border: none;
cursor: pointer;
letter-spacing: 0.1em;
text-transform: uppercase;
box-shadow: 0 0 0 0 var(--ad-glow);
}
.ad-btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 6px 24px var(--ad-glow-strong), 0 0 0 1px var(--ad-accent);
}
.ad-btn-secondary {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 12px 28px;
background: transparent;
color: var(--ad-accent);
font-family: 'Barlow Condensed', sans-serif;
font-weight: 600;
font-size: 13px;
border-radius: 4px;
text-decoration: none;
border: 1px solid var(--ad-accent);
transition: all 0.2s linear;
letter-spacing: 0.1em;
text-transform: uppercase;
}
.ad-btn-secondary:hover {
background: rgba(76, 201, 240, 0.08);
border-color: var(--ad-accent);
box-shadow: 0 0 16px var(--ad-glow);
}
/* Hero Section */
.ad-hero {
position: relative;
min-height: 100vh;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 140px 40px 100px;
text-align: center;
}
.ad-hero-content {
position: relative;
z-index: 1;
max-width: 840px;
}
/* Thin horizontal rules as dividers */
.ad-hero-rule {
width: 120px;
height: 1px;
background: var(--ad-accent);
margin: 0 auto 32px;
opacity: 0.4;
}
/* Badge */
.ad-badge {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 5px 14px;
background: rgba(76, 201, 240, 0.06);
border: 1px solid rgba(76, 201, 240, 0.15);
border-radius: 2px;
font-family: 'Barlow Condensed', sans-serif;
font-size: 12px;
font-weight: 600;
color: var(--ad-accent);
margin-bottom: 32px;
letter-spacing: 0.12em;
text-transform: uppercase;
}
.ad-badge-dot {
width: 6px;
height: 6px;
background: var(--ad-accent);
border-radius: 50%;
animation: ad-pulse 2s linear infinite;
box-shadow: 0 0 8px var(--ad-glow-strong);
}
@keyframes ad-pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.3; }
}
.ad-hero h1 {
font-family: 'Barlow Condensed', sans-serif;
font-size: clamp(44px, 7vw, 80px);
font-weight: 700;
line-height: 1.0;
margin-bottom: 24px;
letter-spacing: 0.04em;
text-transform: uppercase;
background: linear-gradient(180deg, #ffffff 0%, #6b829c 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.ad-hero-sub {
font-size: clamp(16px, 2vw, 19px);
color: var(--ad-muted);
line-height: 1.7;
margin-bottom: 40px;
max-width: 560px;
margin-left: auto;
margin-right: auto;
font-weight: 400;
}
.ad-hero-ctas {
display: flex;
gap: 12px;
justify-content: center;
margin-bottom: 48px;
}
/* Code block — instrument readout style */
.ad-code-block {
display: inline-flex;
align-items: center;
gap: 16px;
padding: 14px 20px;
background: var(--ad-surface);
border: 1px solid var(--ad-dim);
border-radius: 2px;
font-family: 'Barlow', monospace;
font-size: 13px;
max-width: 480px;
margin: 0 auto;
position: relative;
overflow: hidden;
}
.ad-code-block::before {
content: "";
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 3px;
background: var(--ad-accent);
}
.ad-code-prompt {
color: var(--ad-accent);
font-weight: 600;
user-select: none;
font-family: 'Barlow Condensed', sans-serif;
letter-spacing: 0.05em;
}
.ad-code-block code {
color: var(--ad-text);
flex: 1;
text-align: left;
}
.ad-copy-btn {
display: flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
background: rgba(76, 201, 240, 0.06);
border: 1px solid var(--ad-dim);
border-radius: 2px;
color: var(--ad-muted);
cursor: pointer;
transition: all 0.2s ease;
flex-shrink: 0;
}
.ad-copy-btn:hover {
background: rgba(76, 201, 240, 0.12);
color: var(--ad-accent);
}
/* Stats section — instrument readout */
.ad-stats {
padding: 56px 40px;
border-top: 1px solid var(--ad-dim);
border-bottom: 1px solid var(--ad-dim);
background: var(--ad-surface);
}
.ad-stats-inner {
display: flex;
justify-content: center;
align-items: center;
max-width: 800px;
margin: 0 auto;
flex-wrap: wrap;
gap: 0;
}
.ad-stat-item {
text-align: center;
padding: 0 40px;
position: relative;
}
.ad-stat-item:not(:last-child)::after {
content: "";
position: absolute;
right: 0;
top: 50%;
transform: translateY(-50%);
width: 1px;
height: 40px;
background: var(--ad-dim);
}
.ad-stat-value {
font-family: 'Barlow Condensed', sans-serif;
font-size: 32px;
font-weight: 700;
color: var(--ad-accent);
letter-spacing: 0.02em;
}
.ad-stat-label {
font-family: 'Barlow Condensed', sans-serif;
font-size: 11px;
color: var(--ad-muted);
margin-top: 6px;
text-transform: uppercase;
letter-spacing: 0.14em;
font-weight: 500;
}
/* Downloads section */
.ad-downloads {
padding: 80px 40px;
position: relative;
}
.ad-downloads-inner {
max-width: 800px;
margin: 0 auto;
text-align: center;
}
.ad-downloads h2 {
font-family: 'Barlow Condensed', sans-serif;
font-size: clamp(24px, 3vw, 32px);
font-weight: 700;
margin-bottom: 8px;
letter-spacing: 0.04em;
text-transform: uppercase;
}
.ad-downloads p {
color: var(--ad-muted);
margin-bottom: 24px;
font-size: 15px;
}
.ad-downloads-grid {
display: flex;
flex-wrap: wrap;
gap: 10px;
justify-content: center;
}
.ad-download-item {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 10px 18px;
background: var(--ad-surface);
border: 1px solid var(--ad-dim);
border-radius: 2px;
color: var(--ad-text);
text-decoration: none;
font-size: 13px;
transition: all 0.2s linear;
clip-path: polygon(12px 0, 100% 0, 100% 100%, 0 100%, 0 12px);
}
.ad-download-item:hover {
background: var(--ad-elevated);
border-color: var(--ad-accent);
box-shadow: inset 0 0 20px rgba(76, 201, 240, 0.05);
}
.ad-download-size {
font-size: 11px;
color: var(--ad-muted);
font-family: 'Barlow Condensed', sans-serif;
letter-spacing: 0.05em;
}
/* Section styles */
.ad-features {
padding: 120px 40px;
position: relative;
}
.ad-features-inner {
max-width: 1100px;
margin: 0 auto;
}
.ad-section-label {
font-family: 'Barlow Condensed', sans-serif;
font-size: 12px;
font-weight: 600;
color: var(--ad-accent-dark);
text-transform: uppercase;
letter-spacing: 0.18em;
margin-bottom: 16px;
text-align: center;
}
.ad-section-header {
text-align: center;
margin-bottom: 64px;
}
.ad-section-header h2 {
font-family: 'Barlow Condensed', sans-serif;
font-size: clamp(28px, 4vw, 44px);
font-weight: 700;
margin-bottom: 16px;
letter-spacing: 0.04em;
text-transform: uppercase;
}
.ad-section-header p {
font-size: 16px;
color: var(--ad-muted);
max-width: 480px;
margin: 0 auto;
font-weight: 400;
}
.ad-features-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 16px;
}
/* Cards with sharp top-left corner cut */
.ad-feature-card {
padding: 32px;
background: var(--ad-surface);
border: 1px solid var(--ad-dim);
border-radius: 0;
transition: all 0.3s linear;
position: relative;
overflow: hidden;
clip-path: polygon(20px 0, 100% 0, 100% 100%, 0 100%, 0 20px);
}
.ad-feature-card::before {
content: "";
position: absolute;
top: 0;
left: 20px;
right: 0;
height: 1px;
background: linear-gradient(90deg, var(--ad-accent), transparent 70%);
opacity: 0;
transition: opacity 0.3s linear;
}
.ad-feature-card:hover {
background: var(--ad-elevated);
border-color: rgba(76, 201, 240, 0.2);
box-shadow: inset 0 0 30px rgba(76, 201, 240, 0.04);
}
.ad-feature-card:hover::before {
opacity: 0.7;
}
.ad-feature-icon {
width: 40px;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
background: rgba(76, 201, 240, 0.08);
border: 1px solid rgba(76, 201, 240, 0.15);
border-radius: 2px;
color: var(--ad-accent);
margin-bottom: 20px;
}
.ad-feature-title {
font-family: 'Barlow Condensed', sans-serif;
font-size: 17px;
font-weight: 600;
color: #e0e8f0;
margin-bottom: 8px;
letter-spacing: 0.03em;
text-transform: uppercase;
}
.ad-feature-desc {
font-size: 14px;
color: var(--ad-muted);
line-height: 1.65;
font-weight: 400;
}
/* Social proof */
.ad-social-proof {
padding: 100px 40px;
background: var(--ad-surface);
border-top: 1px solid var(--ad-dim);
border-bottom: 1px solid var(--ad-dim);
}
.ad-social-proof-inner {
max-width: 1100px;
margin: 0 auto;
}
.ad-logos {
display: flex;
justify-content: center;
gap: 48px;
margin-bottom: 64px;
flex-wrap: wrap;
}
.ad-logo-item {
padding: 10px 20px;
font-family: 'Barlow Condensed', sans-serif;
font-size: 13px;
font-weight: 500;
color: var(--ad-dim);
letter-spacing: 0.1em;
text-transform: uppercase;
transition: color 0.3s ease;
}
.ad-logo-item:hover {
color: var(--ad-muted);
}
.ad-testimonial {
background: var(--ad-bg);
border: 1px solid var(--ad-dim);
border-radius: 0;
padding: 48px;
max-width: 680px;
margin: 0 auto;
position: relative;
clip-path: polygon(16px 0, 100% 0, 100% 100%, 0 100%, 0 16px);
}
.ad-testimonial::before {
content: "";
position: absolute;
inset: -1px;
background: linear-gradient(135deg, rgba(76, 201, 240, 0.1), transparent 60%);
z-index: -1;
pointer-events: none;
}
.ad-testimonial-quote {
font-size: 19px;
line-height: 1.7;
color: #e0e8f0;
margin-bottom: 28px;
font-weight: 400;
font-style: italic;
}
.ad-testimonial-author {
font-family: 'Barlow Condensed', sans-serif;
font-weight: 600;
color: var(--ad-text);
font-size: 15px;
letter-spacing: 0.04em;
text-transform: uppercase;
}
.ad-testimonial-role {
font-size: 13px;
color: var(--ad-muted);
}
/* Pricing */
.ad-pricing {
padding: 120px 40px;
}
.ad-pricing-inner {
max-width: 1100px;
margin: 0 auto;
}
.ad-pricing-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 16px;
margin-top: 64px;
}
.ad-pricing-card {
background: var(--ad-surface);
border: 1px solid var(--ad-dim);
border-radius: 0;
padding: 36px;
position: relative;
transition: all 0.3s linear;
clip-path: polygon(16px 0, 100% 0, 100% 100%, 0 100%, 0 16px);
}
.ad-pricing-card:hover {
border-color: rgba(76, 201, 240, 0.25);
box-shadow: inset 0 0 30px rgba(76, 201, 240, 0.04);
}
.ad-pricing-card.featured {
border-color: rgba(76, 201, 240, 0.3);
background: linear-gradient(180deg, rgba(76, 201, 240, 0.06) 0%, var(--ad-surface) 100%);
}
.ad-pricing-badge {
position: absolute;
top: -11px;
left: 50%;
transform: translateX(-50%);
padding: 4px 14px;
background: var(--ad-accent);
color: #0d1b2a;
font-family: 'Barlow Condensed', sans-serif;
font-size: 11px;
font-weight: 700;
border-radius: 2px;
text-transform: uppercase;
letter-spacing: 0.1em;
}
.ad-pricing-name {
font-family: 'Barlow Condensed', sans-serif;
font-size: 18px;
font-weight: 600;
color: #e0e8f0;
margin-bottom: 8px;
letter-spacing: 0.04em;
text-transform: uppercase;
}
.ad-pricing-price {
font-family: 'Barlow Condensed', sans-serif;
font-size: 48px;
font-weight: 700;
color: var(--ad-text);
line-height: 1;
margin-bottom: 4px;
letter-spacing: -0.01em;
}
.ad-pricing-period {
font-size: 13px;
color: var(--ad-muted);
margin-bottom: 28px;
}
.ad-pricing-features {
list-style: none;
padding: 0;
margin: 0 0 32px 0;
}
.ad-pricing-features li {
padding: 10px 0;
border-bottom: 1px solid var(--ad-dim);
font-size: 13px;
color: var(--ad-muted);
display: flex;
align-items: center;
gap: 10px;
}
.ad-pricing-features li::before {
content: "//";
font-family: 'Barlow Condensed', sans-serif;
color: var(--ad-accent);
font-size: 12px;
font-weight: 700;
flex-shrink: 0;
letter-spacing: -0.05em;
}
.ad-pricing-features li:last-child {
border-bottom: none;
}
.ad-pricing-cta {
display: block;
width: 100%;
padding: 12px 24px;
text-align: center;
background: rgba(76, 201, 240, 0.06);
color: var(--ad-accent);
font-family: 'Barlow Condensed', sans-serif;
font-weight: 600;
font-size: 13px;
border-radius: 2px;
text-decoration: none;
border: 1px solid var(--ad-dim);
transition: all 0.2s linear;
letter-spacing: 0.1em;
text-transform: uppercase;
}
.ad-pricing-cta:hover {
background: rgba(76, 201, 240, 0.12);
border-color: var(--ad-accent);
}
.ad-pricing-card.featured .ad-pricing-cta {
background: var(--ad-accent);
color: #0d1b2a;
border: none;
font-weight: 700;
}
.ad-pricing-card.featured .ad-pricing-cta:hover {
transform: translateY(-2px);
box-shadow: 0 6px 24px var(--ad-glow-strong);
}
/* CTA section */
.ad-cta-section {
padding: 120px 40px;
text-align: center;
position: relative;
}
.ad-cta-section::before {
content: "";
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
width: 120%;
height: 60%;
background: radial-gradient(ellipse at center bottom, var(--ad-glow) 0%, transparent 60%);
pointer-events: none;
}
.ad-cta-inner {
max-width: 600px;
margin: 0 auto;
position: relative;
z-index: 1;
}
.ad-cta-section h2 {
font-family: 'Barlow Condensed', sans-serif;
font-size: clamp(28px, 4vw, 44px);
font-weight: 700;
margin-bottom: 16px;
letter-spacing: 0.04em;
text-transform: uppercase;
}
.ad-cta-section p {
font-size: 16px;
color: var(--ad-muted);
margin-bottom: 36px;
font-weight: 400;
}
/* Blog content markdown styles */
.ad-blog-content h1, .ad-blog-content h2, .ad-blog-content h3, .ad-blog-content h4 {
color: var(--ad-text); font-family: 'Barlow Condensed', sans-serif; margin: 1.5em 0 0.5em; text-transform: uppercase; letter-spacing: 0.03em;
}
.ad-blog-content h2 { font-size: 1.5em; border-bottom: 1px solid var(--ad-dim); padding-bottom: 8px; }
.ad-blog-content h3 { font-size: 1.25em; }
.ad-blog-content a { color: var(--ad-accent); text-decoration: underline; }
.ad-blog-content a:hover { opacity: 0.8; }
.ad-blog-content code { background: var(--ad-elevated); padding: 2px 6px; border-radius: 2px; font-family: monospace; font-size: 0.9em; }
.ad-blog-content pre { background: var(--ad-surface); border: 1px solid var(--ad-dim); border-radius: 2px; padding: 16px; overflow-x: auto; margin: 16px 0; }
.ad-blog-content pre code { background: none; padding: 0; }
.ad-blog-content blockquote { border-left: 3px solid var(--ad-accent); padding-left: 16px; color: var(--ad-muted); margin: 16px 0; font-style: italic; }
.ad-blog-content img { max-width: 100%; border-radius: 4px; margin: 16px 0; }
.ad-blog-content ul, .ad-blog-content ol { padding-left: 24px; margin: 12px 0; }
.ad-blog-content li { margin: 4px 0; }
.ad-blog-content table { border-collapse: collapse; width: 100%; margin: 16px 0; }
.ad-blog-content th, .ad-blog-content td { border: 1px solid var(--ad-dim); padding: 8px 12px; text-align: left; }
.ad-blog-content th { background: var(--ad-surface); font-weight: 600; }
.ad-blog-content hr { border: none; border-top: 1px solid var(--ad-dim); margin: 24px 0; }
/* Footer */
.ad-footer {
padding: 32px 40px;
border-top: 1px solid var(--ad-dim);
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
gap: 24px;
}
.ad-footer-brand {
display: flex;
align-items: center;
gap: 8px;
}
.ad-footer-logo {
width: 22px;
height: 22px;
background: rgba(76, 201, 240, 0.12);
border-radius: 2px;
display: flex;
align-items: center;
justify-content: center;
}
.ad-footer-text {
font-size: 13px;
color: var(--ad-dim);
}
.ad-footer-links {
display: flex;
gap: 24px;
flex-wrap: wrap;
}
.ad-footer-link {
color: var(--ad-muted);
text-decoration: none;
font-family: 'Barlow Condensed', sans-serif;
font-size: 13px;
letter-spacing: 0.06em;
text-transform: uppercase;
transition: color 0.2s ease;
}
.ad-footer-link:hover {
color: var(--ad-text);
}
.ad-footer-social {
display: flex;
gap: 12px;
}
.ad-footer-social a {
color: var(--ad-dim);
transition: color 0.2s ease;
padding: 4px;
}
.ad-footer-social a:hover {
color: var(--ad-accent);
}
/* Responsive */
@media (max-width: 768px) {
.ad-nav { padding: 0 20px; }
.ad-nav-links { display: none; }
.ad-menu-toggle { display: flex; }
.ad-hero { padding: 120px 24px 80px; }
.ad-hero-ctas { flex-direction: column; align-items: center; }
.ad-btn-primary, .ad-btn-secondary { width: 100%; justify-content: center; }
.ad-features, .ad-social-proof, .ad-cta-section, .ad-pricing { padding: 80px 24px; }
.ad-stats { padding: 48px 24px; }
.ad-stat-item { padding: 16px 24px; }
.ad-stat-item:not(:last-child)::after { display: none; }
.ad-stats-inner { flex-direction: column; }
.ad-features-grid { grid-template-columns: 1fr; }
.ad-footer { flex-direction: column; text-align: center; padding: 24px; }
.ad-testimonial { padding: 32px 24px; }
.ad-code-block { font-size: 12px; }
}
@media (max-width: 480px) {
.ad-hero h1 { font-size: 36px; }
.ad-section-header h2 { font-size: 28px; }
.ad-pricing-price { font-size: 36px; }
}
</style>
<div class="ad-page">
<!-- Navigation -->
<nav class="ad-nav">
<a href="/" class="ad-nav-brand">
{{if .LogoURL}}
<img src="{{.LogoURL}}" alt="{{.Config.Brand.Name}}" style="height: 30px; border-radius: 2px;">
{{else}}
<div class="ad-nav-logo">
{{svg "octicon-cpu" 14}}
</div>
{{end}}
<span class="ad-nav-name">{{if .Config.Brand.Name}}{{.Config.Brand.Name}}{{else}}{{.Repository.Name}}{{end}}</span>
</a>
<div class="ad-nav-links">
{{range .Config.Footer.Links}}
<a href="{{.URL}}" class="ad-nav-link">{{.Label}}</a>
{{end}}
{{if .Config.Navigation.ShowDocs}}<a href="{{.RepoURL}}/wiki" class="ad-nav-link">Docs</a>{{end}}
{{if .Config.Navigation.ShowAPI}}<a href="{{.RepoURL}}/swagger" class="ad-nav-link">API</a>{{end}}
{{if .Config.Navigation.ShowReleases}}<a href="{{.RepoURL}}/releases" class="ad-nav-link">Releases</a>{{end}}
{{if .Config.Navigation.ShowIssues}}<a href="{{.RepoURL}}/issues" class="ad-nav-link">Issues</a>{{end}}
{{if .Config.ValueProps}}<a href="#value-props" class="ad-nav-link">Value Props</a>{{end}}
{{if .Config.Features}}<a href="#features" class="ad-nav-link">Features</a>{{end}}
{{if .Config.Pricing.Plans}}<a href="#pricing" class="ad-nav-link">Pricing</a>{{end}}
{{if .Config.Blog.Enabled}}<a href="{{if .BlogBaseURL}}{{.BlogBaseURL}}{{else}}#blog{{end}}" class="ad-nav-link">Blog</a>{{end}}
{{if .Config.Gallery.Enabled}}<a href="#gallery" class="ad-nav-link">Gallery</a>{{end}}
{{if .Config.Navigation.ShowRepository}}
<a href="{{.RepoURL}}" class="ad-nav-cta">
<img src="/assets/img/gitcaddy-icon.svg" width="16" height="16" alt="GitCaddy">
Repository
</a>
{{end}}
{{if .LangSwitcherEnabled}}
<div class="pages-lang-switcher">
<button class="pages-lang-btn" onclick="this.nextElementSibling.classList.toggle('open')">
{{svg "octicon-globe" 14}} {{index $.LanguageNames .ActiveLang}}
</button>
<div class="pages-lang-dropdown">
{{range .AvailableLanguages}}
<a href="?lang={{.}}" class="pages-lang-option{{if eq . $.ActiveLang}} active{{end}}">{{index $.LanguageNames .}}</a>
{{end}}
</div>
</div>
{{end}}
</div>
<button class="ad-menu-toggle" onclick="this.parentElement.querySelector('.ad-nav-links').style.display=this.parentElement.querySelector('.ad-nav-links').style.display==='flex'?'none':'flex'">
{{svg "octicon-three-bars" 20}}
</button>
</nav>
{{if .PageIsBlogDetail}}
<!-- Blog Detail View -->
<section class="ad-hero" style="padding-top: 120px; min-height: auto;">
<div class="ad-hero-content" style="max-width: 800px;">
{{if .BlogPost.FeaturedImage}}
<div style="margin: 0 auto 32px; overflow: hidden; clip-path: polygon(16px 0, 100% 0, 100% 100%, 0 100%, 0 16px);">
<img src="{{.BlogPost.FeaturedImage.DownloadURL}}" alt="{{.BlogPost.Title}}" style="width: 100%; max-height: 400px; object-fit: cover; display: block;">
</div>
{{end}}
<h1 style="font-size: 36px; margin-bottom: 8px;">{{.BlogPost.Title}}</h1>
{{if .BlogPost.Subtitle}}<p style="font-size: 1.2rem; color: var(--ad-muted); margin-bottom: 24px;">{{.BlogPost.Subtitle}}</p>{{end}}
<div style="display: flex; align-items: center; gap: 12px; margin-bottom: 48px; font-size: 13px; color: var(--ad-muted); font-family: 'Barlow Condensed', sans-serif; letter-spacing: 0.06em; text-transform: uppercase;">
{{if .BlogPost.Author}}<span>{{.BlogPost.Author.DisplayName}}</span><span>&middot;</span>{{end}}
<span>{{DateUtils.AbsoluteShort .BlogPost.CreatedUnix}}</span>
{{if .BlogTags}}<span>&middot;</span>{{range .BlogTags}}<span style="background: rgba(76, 201, 240, 0.08); border: 1px solid var(--ad-dim); padding: 2px 8px; border-radius: 2px; font-size: 11px;">{{.}}</span> {{end}}{{end}}
</div>
<div class="markup ad-blog-content" style="color: var(--ad-text); line-height: 1.8; font-size: 18px; text-align: left;">
{{.BlogRenderedContent}}
</div>
<div style="margin-top: 48px; padding-top: 24px; border-top: 1px solid var(--ad-dim);">
<a href="{{.BlogBaseURL}}" class="ad-btn-secondary" data-cta="secondary" style="text-decoration: none;">
{{svg "octicon-arrow-left" 16}} Back to Blog
</a>
</div>
</div>
</section>
{{else if .PageIsBlogList}}
<!-- Blog List View -->
<section class="ad-features" style="padding-top: 120px;">
<div class="ad-features-inner">
<div class="ad-section-header ad-reveal">
<div class="ad-section-label">Blog</div>
<h2>{{if .Config.Blog.Headline}}{{.Config.Blog.Headline}}{{else}}All Posts{{end}}</h2>
{{if .Config.Blog.Subheadline}}<p>{{.Config.Blog.Subheadline}}</p>{{end}}
</div>
<div class="ad-features-grid">
{{range .BlogListPosts}}
<a href="{{$.BlogBaseURL}}/{{.ID}}" class="ad-feature-card ad-reveal" style="text-decoration: none; color: inherit; display: flex; flex-direction: column;">
{{if .FeaturedImage}}
<div style="margin: -32px -32px 20px -32px; overflow: hidden;">
<img src="{{.FeaturedImage.DownloadURL}}" alt="{{.Title}}" style="width: 100%; height: 180px; object-fit: cover; display: block;">
</div>
{{end}}
<h3 class="ad-feature-title">{{.Title}}</h3>
{{if and $.Config.Blog.ShowExcerpt .Subtitle}}
<p class="ad-feature-desc">{{.Subtitle}}</p>
{{end}}
<div style="margin-top: auto; padding-top: 16px; font-size: 11px; color: var(--ad-muted); font-family: 'Barlow Condensed', sans-serif; letter-spacing: 0.08em; text-transform: uppercase;">
{{if .Author}}{{.Author.DisplayName}} &middot; {{end}}{{DateUtils.AbsoluteShort .CreatedUnix}}
</div>
</a>
{{end}}
</div>
{{if gt .BlogListTotal 9}}
<div style="text-align: center; margin-top: 48px;">
{{template "base/paginate" .}}
</div>
{{end}}
</div>
</section>
{{else}}
<!-- Hero Section -->
<section class="ad-hero">
<div class="ad-hero-content">
<div class="ad-badge ad-reveal visible">
<span class="ad-badge-dot"></span>
{{if .LatestRelease}}v{{.LatestReleaseTag}} released{{else}}Open Source{{end}}
</div>
<div class="ad-hero-rule ad-reveal visible ad-reveal-delay-1"></div>
<h1 class="ad-reveal visible ad-reveal-delay-1">{{if .Config.Hero.Headline}}{{.Config.Hero.Headline}}{{else}}{{.Repository.Name}}{{end}}</h1>
<p class="ad-hero-sub ad-reveal visible ad-reveal-delay-2">
{{if .Config.Hero.Subheadline}}{{.Config.Hero.Subheadline}}{{else}}{{.Repository.Description}}{{end}}
</p>
<div class="ad-hero-ctas ad-reveal visible ad-reveal-delay-3">
{{if .Config.Hero.PrimaryCTA.Label}}
<a href="{{.Config.Hero.PrimaryCTA.URL}}" class="ad-btn-primary" data-cta="primary">
{{.Config.Hero.PrimaryCTA.Label}}
{{svg "octicon-arrow-right" 16}}
</a>
{{else}}
<a href="{{.RepoURL}}" class="ad-btn-primary" data-cta="primary">
Get Started
{{svg "octicon-arrow-right" 16}}
</a>
{{end}}
{{if .Config.Hero.SecondaryCTA.Label}}
<a href="{{.Config.Hero.SecondaryCTA.URL}}" class="ad-btn-secondary" data-cta="secondary">
<img src="/assets/img/gitcaddy-icon.svg" width="16" height="16" alt="GitCaddy">
{{.Config.Hero.SecondaryCTA.Label}}
</a>
{{else}}
<a href="{{.RepoURL}}" class="ad-btn-secondary" data-cta="secondary">
<img src="/assets/img/gitcaddy-icon.svg" width="16" height="16" alt="GitCaddy">
View Source
</a>
{{end}}
</div>
{{if .Config.Hero.CodeExample}}
<div class="ad-code-block ad-reveal visible ad-reveal-delay-4">
<span class="ad-code-prompt">$</span>
<code id="install-cmd">{{.Config.Hero.CodeExample}}</code>
<button class="ad-copy-btn" onclick="navigator.clipboard.writeText(document.getElementById('install-cmd').textContent)">
{{svg "octicon-copy" 14}}
</button>
</div>
{{end}}
</div>
</section>
<!-- Stats Section -->
{{if or .Config.Stats (gt .NumStars 0)}}
<section class="ad-stats">
<div class="ad-stats-inner ad-reveal">
{{if .Config.Stats}}
{{range .Config.Stats}}
<div class="ad-stat-item">
<div class="ad-stat-value">{{.Value}}</div>
<div class="ad-stat-label">{{.Label}}</div>
</div>
{{end}}
{{else}}
<div class="ad-stat-item">
<div class="ad-stat-value">{{.NumStars}}</div>
<div class="ad-stat-label">Stars</div>
</div>
<div class="ad-stat-item">
<div class="ad-stat-value">{{.NumForks}}</div>
<div class="ad-stat-label">Forks</div>
</div>
{{if .LatestRelease}}
<div class="ad-stat-item">
<div class="ad-stat-value">v{{.LatestReleaseTag}}</div>
<div class="ad-stat-label">Latest</div>
</div>
{{end}}
{{end}}
</div>
</section>
{{end}}
<!-- Downloads Section -->
{{if and .PublicReleases .LatestRelease .LatestRelease.Attachments}}
<section class="ad-downloads">
<div class="ad-downloads-inner ad-reveal">
<h2>Download v{{.LatestReleaseTag}}</h2>
<p>Get the latest release</p>
{{$windowsFiles := newSlice}}{{$macosFiles := newSlice}}{{$linuxFiles := newSlice}}{{$androidFiles := newSlice}}{{$iosFiles := newSlice}}{{$otherFiles := newSlice}}
{{range $att := .LatestRelease.Attachments}}
{{$name := StringUtils.ToLower $att.Name}}
{{if or (StringUtils.Contains $name "android") (StringUtils.HasSuffix $name ".apk") (StringUtils.HasSuffix $name ".aab") (StringUtils.HasSuffix $name ".xapk")}}
{{$androidFiles = Append $androidFiles $att}}
{{else if or (StringUtils.Contains $name "ios") (StringUtils.Contains $name "iphone") (StringUtils.Contains $name "ipad") (StringUtils.HasSuffix $name ".ipa")}}
{{$iosFiles = Append $iosFiles $att}}
{{else if or (StringUtils.Contains $name "windows") (StringUtils.Contains $name "win64") (StringUtils.Contains $name "win32") (StringUtils.Contains $name "-win.") (StringUtils.Contains $name "_win.") (StringUtils.Contains $name "-win-") (StringUtils.Contains $name "_win_") (StringUtils.HasSuffix $name ".exe") (StringUtils.HasSuffix $name ".msi") (StringUtils.HasSuffix $name ".msix") (StringUtils.HasSuffix $name ".msixbundle") (StringUtils.HasSuffix $name ".appx") (StringUtils.HasSuffix $name ".appxbundle")}}
{{$windowsFiles = Append $windowsFiles $att}}
{{else if or (StringUtils.Contains $name "darwin") (StringUtils.Contains $name "macos") (StringUtils.Contains $name "-mac.") (StringUtils.Contains $name "_mac.") (StringUtils.Contains $name "-mac-") (StringUtils.Contains $name "_mac_") (StringUtils.Contains $name "osx") (StringUtils.HasSuffix $name ".dmg") (StringUtils.HasSuffix $name ".pkg")}}
{{$macosFiles = Append $macosFiles $att}}
{{else if or (StringUtils.Contains $name "linux") (StringUtils.Contains $name "-lin.") (StringUtils.Contains $name "_lin.") (StringUtils.Contains $name "-lin-") (StringUtils.Contains $name "_lin_") (StringUtils.HasSuffix $name ".deb") (StringUtils.HasSuffix $name ".rpm") (StringUtils.HasSuffix $name ".appimage") (StringUtils.HasSuffix $name ".flatpak") (StringUtils.HasSuffix $name ".snap")}}
{{$linuxFiles = Append $linuxFiles $att}}
{{else}}
{{$otherFiles = Append $otherFiles $att}}
{{end}}
{{end}}
{{if $windowsFiles}}
<div style="margin-bottom: 24px;">
<h4 style="display: flex; align-items: center; gap: 8px; margin-bottom: 12px; font-size: 13px; color: var(--ad-muted); font-family: 'Barlow Condensed', sans-serif; letter-spacing: 0.12em; text-transform: uppercase;">{{svg "octicon-device-desktop" 16}} Windows</h4>
<div class="ad-downloads-grid">
{{range $windowsFiles}}<a href="{{$.RepoURL}}/releases/download/{{$.LatestRelease.TagName}}/{{.Name}}" class="ad-download-item">{{svg "octicon-download" 16}} {{.Name}} <span class="ad-download-size">{{FileSize .Size}}</span></a>{{end}}
</div>
</div>
{{end}}
{{if $macosFiles}}
<div style="margin-bottom: 24px;">
<h4 style="display: flex; align-items: center; gap: 8px; margin-bottom: 12px; font-size: 13px; color: var(--ad-muted); font-family: 'Barlow Condensed', sans-serif; letter-spacing: 0.12em; text-transform: uppercase;">{{svg "octicon-device-desktop" 16}} macOS</h4>
<div class="ad-downloads-grid">
{{range $macosFiles}}<a href="{{$.RepoURL}}/releases/download/{{$.LatestRelease.TagName}}/{{.Name}}" class="ad-download-item">{{svg "octicon-download" 16}} {{.Name}} <span class="ad-download-size">{{FileSize .Size}}</span></a>{{end}}
</div>
</div>
{{end}}
{{if $linuxFiles}}
<div style="margin-bottom: 24px;">
<h4 style="display: flex; align-items: center; gap: 8px; margin-bottom: 12px; font-size: 13px; color: var(--ad-muted); font-family: 'Barlow Condensed', sans-serif; letter-spacing: 0.12em; text-transform: uppercase;">{{svg "octicon-terminal" 16}} Linux</h4>
<div class="ad-downloads-grid">
{{range $linuxFiles}}<a href="{{$.RepoURL}}/releases/download/{{$.LatestRelease.TagName}}/{{.Name}}" class="ad-download-item">{{svg "octicon-download" 16}} {{.Name}} <span class="ad-download-size">{{FileSize .Size}}</span></a>{{end}}
</div>
</div>
{{end}}
{{if not $.HideMobileReleases}}
{{if $androidFiles}}
<div style="margin-bottom: 24px;">
<h4 style="display: flex; align-items: center; gap: 8px; margin-bottom: 12px; font-size: 13px; color: var(--ad-muted); font-family: 'Barlow Condensed', sans-serif; letter-spacing: 0.12em; text-transform: uppercase;">{{svg "octicon-device-mobile" 16}} Android</h4>
<div class="ad-downloads-grid">
{{range $androidFiles}}<a href="{{$.RepoURL}}/releases/download/{{$.LatestRelease.TagName}}/{{.Name}}" class="ad-download-item">{{svg "octicon-download" 16}} {{.Name}} <span class="ad-download-size">{{FileSize .Size}}</span></a>{{end}}
</div>
</div>
{{end}}
{{if $iosFiles}}
<div style="margin-bottom: 24px;">
<h4 style="display: flex; align-items: center; gap: 8px; margin-bottom: 12px; font-size: 13px; color: var(--ad-muted); font-family: 'Barlow Condensed', sans-serif; letter-spacing: 0.12em; text-transform: uppercase;">{{svg "octicon-device-mobile" 16}} iOS</h4>
<div class="ad-downloads-grid">
{{range $iosFiles}}<a href="{{$.RepoURL}}/releases/download/{{$.LatestRelease.TagName}}/{{.Name}}" class="ad-download-item">{{svg "octicon-download" 16}} {{.Name}} <span class="ad-download-size">{{FileSize .Size}}</span></a>{{end}}
</div>
</div>
{{end}}
{{end}}
{{if or $.GooglePlayID $.AppStoreID}}
<div style="margin-bottom: 24px;">
<h4 style="display: flex; align-items: center; gap: 8px; margin-bottom: 12px; font-size: 13px; color: var(--ad-muted); font-family: 'Barlow Condensed', sans-serif; letter-spacing: 0.12em; text-transform: uppercase;">{{svg "octicon-device-mobile" 16}} App Stores</h4>
<div style="display: flex; gap: 12px; flex-wrap: wrap;">
{{if $.GooglePlayID}}
<a href="https://play.google.com/store/apps/details?id={{$.GooglePlayID}}" target="_blank" rel="noopener" class="ad-download-item" style="display: inline-flex; align-items: center; gap: 10px; clip-path: none;">
<svg viewBox="0 0 24 24" width="20" height="20" fill="currentColor"><path d="M3.609 1.814L13.792 12 3.61 22.186a.996.996 0 0 1-.61-.92V2.734a1 1 0 0 1 .609-.92zm10.89 10.893l2.302 2.302-10.937 6.333 8.635-8.635zm3.199-1.4l2.834 1.64a1 1 0 0 1 0 1.726l-2.834 1.64-2.635-2.636 2.635-2.37zM5.864 2.658L16.8 9.99l-2.302 2.302-8.635-8.635z"/></svg>
Google Play
</a>
{{end}}
{{if $.AppStoreID}}
<a href="https://apps.apple.com/app/{{$.AppStoreID}}" target="_blank" rel="noopener" class="ad-download-item" style="display: inline-flex; align-items: center; gap: 10px; clip-path: none;">
<svg viewBox="0 0 24 24" width="20" height="20" fill="currentColor"><path d="M18.71 19.5c-.83 1.24-1.71 2.45-3.05 2.47-1.34.03-1.77-.79-3.29-.79-1.53 0-2 .77-3.27.82-1.31.05-2.3-1.32-3.14-2.53C4.25 17 2.94 12.45 4.7 9.39c.87-1.52 2.43-2.48 4.12-2.51 1.28-.02 2.5.87 3.29.87.78 0 2.26-1.07 3.8-.91.65.03 2.47.26 3.64 1.98-.09.06-2.17 1.28-2.15 3.81.03 3.02 2.65 4.03 2.68 4.04-.03.07-.42 1.44-1.38 2.83M13 3.5c.73-.83 1.94-1.46 2.94-1.5.13 1.17-.34 2.35-1.04 3.19-.69.85-1.83 1.51-2.95 1.42-.15-1.15.41-2.35 1.05-3.11z"/></svg>
App Store
</a>
{{end}}
</div>
</div>
{{end}}
{{if $otherFiles}}
<div style="margin-bottom: 24px;">
<h4 style="display: flex; align-items: center; gap: 8px; margin-bottom: 12px; font-size: 13px; color: var(--ad-muted); font-family: 'Barlow Condensed', sans-serif; letter-spacing: 0.12em; text-transform: uppercase;">{{svg "octicon-file" 16}} Other</h4>
<div class="ad-downloads-grid">
{{range $otherFiles}}<a href="{{$.RepoURL}}/releases/download/{{$.LatestRelease.TagName}}/{{.Name}}" class="ad-download-item">{{svg "octicon-download" 16}} {{.Name}} <span class="ad-download-size">{{FileSize .Size}}</span></a>{{end}}
</div>
</div>
{{end}}
</div>
</section>
{{end}}
<!-- Value Props Section -->
{{if .Config.ValueProps}}
<section class="ad-features" id="value-props">
<div class="ad-features-inner">
<div class="ad-section-header ad-reveal">
<div class="ad-section-label">Systems Analysis</div>
<h2>{{if .Config.Brand.Name}}Why {{.Config.Brand.Name}}?{{else}}Why Choose Us{{end}}</h2>
<p>Everything you need to get started quickly.</p>
</div>
<div class="ad-features-grid">
{{range .Config.ValueProps}}
<div class="ad-feature-card ad-reveal">
<div class="ad-feature-icon">
{{svg (printf "octicon-%s" (or .Icon "check")) 20}}
</div>
<h3 class="ad-feature-title">{{.Title}}</h3>
<p class="ad-feature-desc">{{.Description}}</p>
</div>
{{end}}
</div>
</div>
</section>
{{end}}
<!-- Features Section -->
{{if .Config.Features}}
<section class="ad-features" id="features" style="padding-top: 40px;">
<div class="ad-features-inner">
<div class="ad-section-header ad-reveal">
<div class="ad-section-label">Technical Specifications</div>
<h2>Features</h2>
<p>Powerful capabilities at your fingertips.</p>
</div>
<div class="ad-features-grid">
{{range .Config.Features}}
<div class="ad-feature-card ad-reveal">
<div class="ad-feature-icon">
{{svg (printf "octicon-%s" (or .Icon "zap")) 20}}
</div>
<h3 class="ad-feature-title">{{.Title}}</h3>
<p class="ad-feature-desc">{{.Description}}</p>
</div>
{{end}}
</div>
</div>
</section>
{{end}}
<!-- Social Proof -->
{{if or .Config.SocialProof.Logos .Config.SocialProof.Testimonials}}
<section class="ad-social-proof">
<div class="ad-social-proof-inner">
{{if .Config.SocialProof.Logos}}
<div class="ad-logos ad-reveal">
{{range .Config.SocialProof.Logos}}
<div class="ad-logo-item">{{.}}</div>
{{end}}
</div>
{{end}}
{{if .Config.SocialProof.Testimonials}}
<div class="ad-testimonials-container">
{{range .Config.SocialProof.Testimonials}}
<div class="ad-testimonial ad-reveal" style="display: none;">
<p class="ad-testimonial-quote">"{{.Quote}}"</p>
<div>
<div class="ad-testimonial-author">{{.Author}}</div>
<div class="ad-testimonial-role">{{.Role}}</div>
</div>
</div>
{{end}}
</div>
<script>
(function() {
var testimonials = document.querySelectorAll(".ad-testimonial");
if (testimonials.length > 0) {
var idx = Math.floor(Math.random() * testimonials.length);
testimonials[idx].style.display = "block";
}
})();
</script>
{{end}}
</div>
</section>
{{end}}
<!-- Pricing Section -->
{{if .Config.Pricing.Plans}}
<section class="ad-pricing" id="pricing">
<div class="ad-pricing-inner">
<div class="ad-section-header ad-reveal">
<div class="ad-section-label">Resource Allocation</div>
<h2>{{if .Config.Pricing.Headline}}{{.Config.Pricing.Headline}}{{else}}Pricing{{end}}</h2>
<p>{{if .Config.Pricing.Subheadline}}{{.Config.Pricing.Subheadline}}{{else}}Choose the plan that works for you{{end}}</p>
</div>
<div class="ad-pricing-grid">
{{range .Config.Pricing.Plans}}
<div class="ad-pricing-card{{if .Featured}} featured{{end}} ad-reveal">
{{if .Featured}}<span class="ad-pricing-badge">Popular</span>{{end}}
<div class="ad-pricing-name">{{.Name}}</div>
<div class="ad-pricing-price">{{.Price}}</div>
<div class="ad-pricing-period">{{.Period}}</div>
{{if .Features}}
<ul class="ad-pricing-features">
{{range .Features}}<li>{{.}}</li>{{end}}
</ul>
{{end}}
<a href="#" class="ad-pricing-cta">{{if .CTA}}{{.CTA}}{{else}}Get Started{{end}}</a>
</div>
{{end}}
</div>
</div>
</section>
{{end}}
<!-- CTA Section -->
{{if .Config.CTASection.Headline}}
<section class="ad-cta-section">
<div class="ad-cta-inner ad-reveal">
<h2>{{.Config.CTASection.Headline}}</h2>
{{if .Config.CTASection.Subheadline}}
<p>{{.Config.CTASection.Subheadline}}</p>
{{end}}
<a href="{{if .Config.CTASection.Button.URL}}{{.Config.CTASection.Button.URL}}{{else}}{{.RepoURL}}{{end}}" class="ad-btn-primary" data-cta="primary" style="padding: 14px 32px; font-size: 14px;">
{{if .Config.CTASection.Button.Label}}{{.Config.CTASection.Button.Label}}{{else}}Get Started{{end}}
{{svg "octicon-arrow-right" 16}}
</a>
</div>
</section>
{{end}}
<!-- Blog Section -->
{{if and .Config.Blog.Enabled .BlogPosts}}
<section class="ad-features" id="blog" style="border-top: 1px solid var(--ad-dim);">
<div class="ad-features-inner">
<div class="ad-section-header ad-reveal">
<div class="ad-section-label">Dispatches</div>
<h2>{{if .Config.Blog.Headline}}{{.Config.Blog.Headline}}{{else}}Latest Posts{{end}}</h2>
{{if .Config.Blog.Subheadline}}<p>{{.Config.Blog.Subheadline}}</p>{{end}}
</div>
<div class="ad-features-grid">
{{range .BlogPosts}}
<a href="{{$.BlogBaseURL}}/{{.ID}}" class="ad-feature-card ad-reveal" style="text-decoration: none; color: inherit; display: flex; flex-direction: column;">
{{if .FeaturedImage}}
<div style="margin: -32px -32px 20px -32px; overflow: hidden;">
<img src="{{.FeaturedImage.DownloadURL}}" alt="{{.Title}}" style="width: 100%; height: 180px; object-fit: cover; display: block;">
</div>
{{end}}
<h3 class="ad-feature-title">{{.Title}}</h3>
{{if and $.Config.Blog.ShowExcerpt .Subtitle}}
<p class="ad-feature-desc">{{.Subtitle}}</p>
{{end}}
<div style="margin-top: auto; padding-top: 16px; font-size: 11px; color: var(--ad-muted); font-family: 'Barlow Condensed', sans-serif; letter-spacing: 0.08em; text-transform: uppercase;">
{{if .Author}}{{.Author.DisplayName}}{{end}} · {{DateUtils.AbsoluteShort .CreatedUnix}}
</div>
</a>
{{end}}
</div>
{{if .Config.Blog.CTAButton.Label}}
<div style="text-align: center; margin-top: 48px;" class="ad-reveal">
<a href="{{if .Config.Blog.CTAButton.URL}}{{.Config.Blog.CTAButton.URL}}{{else}}{{.BlogBaseURL}}{{end}}" class="ad-btn-secondary" data-cta="secondary">
{{.Config.Blog.CTAButton.Label}}
{{svg "octicon-arrow-right" 16}}
</a>
</div>
{{end}}
</div>
</section>
{{end}}
<!-- Gallery Section -->
{{if and .Config.Gallery.Enabled .GalleryImages}}
<section class="ad-features" id="gallery" style="border-top: 1px solid var(--ad-dim);">
<div class="ad-features-inner">
<div class="ad-section-header ad-reveal">
<div class="ad-section-label">Visual Index</div>
<h2>{{if .Config.Gallery.Headline}}{{.Config.Gallery.Headline}}{{else}}Gallery{{end}}</h2>
{{if .Config.Gallery.Subheadline}}<p>{{.Config.Gallery.Subheadline}}</p>{{end}}
</div>
<div style="display: grid; grid-template-columns: repeat({{if .Config.Gallery.Columns}}{{.Config.Gallery.Columns}}{{else}}3{{end}}, 1fr); gap: 16px;">
{{range .GalleryImages}}
<div class="ad-feature-card ad-reveal" style="padding: 0; overflow: hidden;">
<a href="{{.URL}}" class="pages-gallery-trigger" data-src="{{.URL}}" data-caption="{{if .Caption}}{{.Caption}}{{else}}{{.Name}}{{end}}" style="display: block; cursor: pointer;">
<img src="{{.URL}}" alt="{{if .Caption}}{{.Caption}}{{else}}{{.Name}}{{end}}" style="width: 100%; height: 220px; object-fit: cover; display: block;">
</a>
{{if .Caption}}
<div style="padding: 16px 20px; font-size: 12px; color: var(--ad-muted); font-family: 'Barlow Condensed', sans-serif; letter-spacing: 0.06em; text-transform: uppercase;">{{.Caption}}</div>
{{end}}
</div>
{{end}}
</div>
</div>
</section>
{{end}}
{{end}}{{/* end PageIsBlogDetail / PageIsBlogList / else */}}
<!-- Footer -->
<footer class="ad-footer">
<div class="ad-footer-brand">
<div class="ad-footer-logo">{{svg "octicon-cpu" 12}}</div>
<span class="ad-footer-text">{{if .Config.Footer.Copyright}}{{.Config.Footer.Copyright}}{{else}}&copy; <script>document.write(new Date().getFullYear())</script> {{if .Config.Brand.Name}}{{.Config.Brand.Name}}{{else}}{{.Repository.Name}}{{end}}{{end}}</span>
</div>
{{if .Config.Footer.Social}}
<div class="ad-footer-social">
{{range .Config.Footer.Social}}
<a href="{{.URL}}" title="{{.Platform}}">
{{if eq .Platform "twitter"}}{{svg "octicon-mention" 16}}
{{else if eq .Platform "bluesky"}}{{svg "octicon-cloud" 16}}
{{else if eq .Platform "github"}}{{svg "octicon-mark-github" 16}}
{{else if eq .Platform "discord"}}{{svg "octicon-comment-discussion" 16}}
{{else if eq .Platform "linkedin"}}{{svg "octicon-briefcase" 16}}
{{else if eq .Platform "youtube"}}{{svg "octicon-video" 16}}
{{else if eq .Platform "instagram"}}{{svg "octicon-device-camera" 16}}
{{else if eq .Platform "facebook"}}{{svg "octicon-people" 16}}
{{else if eq .Platform "substack"}}{{svg "octicon-note" 16}}
{{else if eq .Platform "threads"}}{{svg "octicon-share" 16}}
{{else if eq .Platform "tiktok"}}{{svg "octicon-play" 16}}
{{else if eq .Platform "reddit"}}{{svg "octicon-hash" 16}}
{{else if eq .Platform "mastodon"}}{{svg "octicon-megaphone" 16}}
{{else if eq .Platform "twitch"}}{{svg "octicon-broadcast" 16}}
{{else if eq .Platform "rss"}}{{svg "octicon-rss" 16}}
{{else}}{{svg "octicon-link-external" 16}}{{end}}
</a>
{{end}}
</div>
{{end}}
<div class="ad-footer-links">
{{range .Config.Footer.Links}}
<a href="{{.URL}}" class="ad-footer-link">{{.Label}}</a>
{{end}}
{{if .Config.Navigation.ShowRepository}}<a href="{{.RepoURL}}" class="ad-footer-link">Repository</a>{{end}}
{{if .Config.Navigation.ShowDocs}}<a href="{{.RepoURL}}/wiki" class="ad-footer-link">Documentation</a>{{end}}
{{if .Config.Navigation.ShowReleases}}<a href="{{.RepoURL}}/releases" class="ad-footer-link">Releases</a>{{end}}
{{if .Config.Navigation.ShowIssues}}<a href="{{.RepoURL}}/issues" class="ad-footer-link">Issues</a>{{end}}
</div>
</footer>
</div>
<!-- Scroll reveal observer -->
<script>
(function() {
var reveals = document.querySelectorAll('.ad-reveal:not(.visible)');
if (!reveals.length) return;
var observer = new IntersectionObserver(function(entries) {
entries.forEach(function(entry) {
if (entry.isIntersecting) {
entry.target.classList.add('visible');
observer.unobserve(entry.target);
}
});
}, { threshold: 0.1, rootMargin: '0px 0px -40px 0px' });
reveals.forEach(function(el) { observer.observe(el); });
})();
</script>
{{template "pages/base_footer" .}}