2
0
Files
gitcaddy-server/templates/pages/minimalist-docs.tmpl
GitCaddy 7e7a413b78 Fix editorconfig issues and home.tmpl pinned org display format
- Fix home.tmpl to properly show promotional content when selected
- Fix line endings and indentation in all templates
- Fix locale file line endings

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 08:40:02 +00:00

812 lines
17 KiB
Handlebars
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{{template "pages/base_head" .}}
<style>
@import url('https://fonts.googleapis.com/css2?family=Source+Serif+4:wght@400;500;600;700&family=Source+Code+Pro:wght@400;500&display=swap');
:root {
--md-bg: #fcfcfc;
--md-text: #171717;
--md-muted: #525252;
--md-light: #737373;
--md-border: #e5e5e5;
--md-accent: {{if .Config.Theme.PrimaryColor}}{{.Config.Theme.PrimaryColor}}{{else}}#171717{{end}};
}
.md-page {
min-height: 100vh;
background: var(--md-bg);
color: var(--md-text);
font-family: 'Source Serif 4', Georgia, serif;
line-height: 1.7;
}
.md-nav {
padding: 24px 48px;
display: flex;
align-items: center;
justify-content: space-between;
border-bottom: 1px solid var(--md-border);
}
.md-nav-brand {
font-weight: 700;
font-size: 20px;
color: var(--md-text);
letter-spacing: -0.02em;
text-decoration: none;
}
.md-nav-links {
display: flex;
align-items: center;
gap: 32px;
}
.md-nav-link {
color: var(--md-muted);
text-decoration: none;
font-size: 15px;
transition: color 0.2s ease;
}
.md-nav-link:hover {
color: var(--md-text);
}
.md-btn-text {
display: inline-flex;
align-items: center;
gap: 6px;
color: var(--md-muted);
font-family: 'Source Serif 4', Georgia, serif;
font-weight: 500;
font-size: 16px;
text-decoration: none;
background: none;
border: none;
cursor: pointer;
transition: color 0.2s ease;
}
.md-btn-text:hover {
color: var(--md-text);
}
.md-btn-primary {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 14px 28px;
background: var(--md-text);
color: var(--md-bg);
font-family: 'Source Serif 4', Georgia, serif;
font-weight: 500;
font-size: 16px;
border-radius: 4px;
text-decoration: none;
transition: all 0.2s ease;
}
.md-btn-primary:hover {
background: #404040;
}
.md-hero {
max-width: 720px;
margin: 0 auto;
padding: 120px 24px 80px;
}
.md-hero h1 {
font-size: 52px;
font-weight: 600;
line-height: 1.2;
margin-bottom: 24px;
letter-spacing: -0.02em;
color: var(--md-text);
}
.md-hero-sub {
font-size: 21px;
color: var(--md-muted);
line-height: 1.7;
margin-bottom: 36px;
}
.md-hero-ctas {
display: flex;
gap: 16px;
align-items: center;
margin-bottom: 64px;
}
.md-install-cmd {
display: inline-flex;
align-items: center;
gap: 12px;
padding: 12px 20px;
background: #f5f5f5;
border-radius: 4px;
font-family: 'Source Code Pro', monospace;
font-size: 15px;
color: var(--md-muted);
border: 1px solid var(--md-border);
cursor: pointer;
transition: all 0.2s ease;
}
.md-install-cmd:hover {
border-color: #d4d4d4;
background: #f0f0f0;
}
.md-code-block {
background: #1a1a1a;
border-radius: 6px;
padding: 28px;
font-family: 'Source Code Pro', monospace;
font-size: 14px;
line-height: 1.7;
overflow-x: auto;
position: relative;
}
.md-code-block code {
color: #e5e5e5;
white-space: pre;
}
.md-copy-btn {
position: absolute;
top: 16px;
right: 16px;
width: 36px;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
background: rgba(255,255,255,0.05);
border: 1px solid rgba(255,255,255,0.1);
border-radius: 6px;
color: #737373;
cursor: pointer;
transition: all 0.2s ease;
}
.md-copy-btn:hover {
background: rgba(255,255,255,0.1);
color: #e5e5e5;
}
.md-divider {
height: 1px;
background: var(--md-border);
max-width: 720px;
margin: 80px auto;
}
.md-stats {
max-width: 720px;
margin: 0 auto;
padding: 0 24px;
}
.md-stats-inner {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 48px;
text-align: center;
}
.md-stat-value {
font-size: 32px;
font-weight: 600;
color: var(--md-text);
letter-spacing: -0.02em;
}
.md-stat-label {
font-size: 14px;
color: var(--md-light);
margin-top: 4px;
}
.md-section {
max-width: 720px;
margin: 0 auto;
padding: 0 24px 80px;
}
.md-section-title {
font-size: 32px;
font-weight: 600;
margin-bottom: 32px;
letter-spacing: -0.02em;
}
.md-value-item {
display: flex;
align-items: baseline;
gap: 12px;
margin-bottom: 12px;
}
.md-value-bullet {
width: 6px;
height: 6px;
background: var(--md-text);
border-radius: 50%;
flex-shrink: 0;
margin-top: 10px;
}
.md-value-title {
font-weight: 500;
color: var(--md-text);
}
.md-value-desc {
color: var(--md-light);
}
.md-accordion {
border-top: 1px solid var(--md-border);
}
.md-accordion-item {
border-bottom: 1px solid var(--md-border);
padding: 24px 0;
}
.md-accordion-header {
display: flex;
justify-content: space-between;
align-items: center;
cursor: pointer;
background: none;
border: none;
width: 100%;
text-align: left;
font-family: 'Source Serif 4', Georgia, serif;
}
.md-accordion-title {
font-size: 20px;
font-weight: 500;
color: var(--md-text);
transition: color 0.2s ease;
}
.md-accordion-header:hover .md-accordion-title {
color: var(--md-muted);
}
.md-accordion-icon {
width: 24px;
height: 24px;
color: var(--md-light);
transition: transform 0.3s ease;
font-size: 24px;
font-weight: 300;
line-height: 1;
}
.md-accordion-content {
display: none;
padding-top: 16px;
font-size: 17px;
line-height: 1.7;
color: var(--md-muted);
}
.md-accordion-item.open .md-accordion-content {
display: block;
}
.md-pricing {
max-width: 960px;
margin: 0 auto;
padding: 80px 24px;
border-top: 1px solid var(--md-border);
}
.md-pricing-title {
font-size: 32px;
font-weight: 600;
text-align: center;
margin-bottom: 48px;
letter-spacing: -0.02em;
}
.md-pricing-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 24px;
}
.md-pricing-card {
border: 1px solid var(--md-border);
border-radius: 8px;
padding: 32px;
background: white;
position: relative;
}
.md-pricing-card.featured {
border-color: var(--md-text);
box-shadow: 0 4px 24px rgba(0,0,0,0.08);
}
.md-pricing-featured-badge {
position: absolute;
top: -12px;
left: 50%;
transform: translateX(-50%);
background: var(--md-text);
color: white;
font-size: 12px;
font-weight: 500;
padding: 4px 12px;
border-radius: 12px;
text-transform: uppercase;
letter-spacing: 0.05em;
}
.md-pricing-name {
font-size: 18px;
font-weight: 600;
margin-bottom: 8px;
}
.md-pricing-price {
font-size: 36px;
font-weight: 600;
margin-bottom: 4px;
letter-spacing: -0.02em;
}
.md-pricing-period {
font-size: 14px;
color: var(--md-light);
margin-bottom: 24px;
}
.md-pricing-features {
list-style: none;
padding: 0;
margin: 0 0 24px;
}
.md-pricing-features li {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 0;
font-size: 15px;
color: var(--md-muted);
}
.md-pricing-features li::before {
content: "✓";
color: var(--md-text);
font-weight: 600;
}
.md-pricing-cta {
display: block;
width: 100%;
padding: 12px 24px;
text-align: center;
border: 1px solid var(--md-border);
border-radius: 4px;
font-family: 'Source Serif 4', Georgia, serif;
font-weight: 500;
font-size: 15px;
color: var(--md-text);
text-decoration: none;
transition: all 0.2s ease;
}
.md-pricing-cta:hover {
background: var(--md-text);
color: white;
border-color: var(--md-text);
}
.md-pricing-card.featured .md-pricing-cta {
background: var(--md-text);
color: white;
border-color: var(--md-text);
}
.md-pricing-card.featured .md-pricing-cta:hover {
background: #404040;
}
.md-testimonial-section {
border-top: 1px solid var(--md-border);
border-bottom: 1px solid var(--md-border);
padding: 80px 0;
margin: 80px 0;
}
.md-testimonial-inner {
max-width: 720px;
margin: 0 auto;
padding: 0 24px;
}
.md-testimonial-quote {
font-size: 28px;
line-height: 1.5;
color: var(--md-text);
margin-bottom: 24px;
font-style: italic;
}
.md-testimonial-author {
font-weight: 500;
color: var(--md-muted);
}
.md-testimonial-role {
color: var(--md-light);
}
.md-used-by {
max-width: 720px;
margin: 0 auto;
padding: 0 24px 80px;
}
.md-used-by-label {
font-size: 14px;
color: #a3a3a3;
margin-bottom: 20px;
text-transform: uppercase;
letter-spacing: 0.05em;
}
.md-used-by-logos {
display: flex;
gap: 32px;
flex-wrap: wrap;
}
.md-used-by-item {
font-size: 15px;
color: #a3a3a3;
font-weight: 500;
}
.md-cta-section {
max-width: 720px;
margin: 0 auto;
padding: 80px 24px;
text-align: center;
border-top: 1px solid var(--md-border);
}
.md-cta-section h2 {
font-size: 36px;
font-weight: 600;
margin-bottom: 24px;
letter-spacing: -0.02em;
}
.md-footer {
padding: 32px 48px;
border-top: 1px solid var(--md-border);
display: flex;
justify-content: space-between;
align-items: center;
}
.md-footer-copyright {
font-size: 14px;
color: #a3a3a3;
}
.md-footer-links {
display: flex;
gap: 24px;
}
.md-footer-link {
color: var(--md-light);
text-decoration: none;
font-size: 14px;
transition: color 0.2s ease;
}
.md-footer-link:hover {
color: var(--md-text);
}
.md-footer-social {
display: flex;
gap: 16px;
}
.md-footer-social a {
color: var(--md-light);
transition: color 0.2s ease;
}
.md-footer-social a:hover {
color: var(--md-text);
}
@media (max-width: 768px) {
.md-nav { padding: 16px 24px; }
.md-nav-links { gap: 16px; }
.md-hero { padding: 80px 24px 60px; }
.md-hero h1 { font-size: 36px; }
.md-hero-sub { font-size: 18px; }
.md-hero-ctas { flex-direction: column; align-items: flex-start; }
.md-stats-inner { grid-template-columns: 1fr; gap: 24px; }
.md-section-title { font-size: 28px; }
.md-testimonial-quote { font-size: 22px; }
.md-cta-section h2 { font-size: 28px; }
.md-footer { flex-direction: column; gap: 16px; text-align: center; padding: 24px; }
}
</style>
<div class="md-page">
<!-- Navigation -->
<nav class="md-nav">
<a href="/" class="md-nav-brand">{{if .Config.Brand.Name}}{{.Config.Brand.Name}}{{else}}{{.Repository.Name}}{{end}}</a>
<div class="md-nav-links">
{{if .Config.Footer.Links}}
{{range .Config.Footer.Links}}
<a href="{{.URL}}" class="md-nav-link">{{.Label}}</a>
{{end}}
{{else}}
<a href="{{.Repository.Link}}/wiki" class="md-nav-link">Docs</a>
<a href="{{.Repository.Link}}" class="md-nav-link">API</a>
{{end}}
{{if .Config.ValueProps}}<a href="#why" class="md-nav-link">Why</a>{{end}}
{{if .Config.Features}}<a href="#features" class="md-nav-link">Features</a>{{end}}
{{if .Config.Pricing.Plans}}<a href="#pricing" class="md-nav-link">Pricing</a>{{end}}
<a href="{{.Repository.Link}}" class="md-btn-text">
<img src="/assets/img/gitcaddy-icon.svg" width="18" height="18" alt="GitCaddy">
Repository
</a>
</div>
</nav>
<!-- Hero Section (Left Aligned) -->
<section class="md-hero">
<h1>{{if .Config.Hero.Headline}}{{.Config.Hero.Headline}}{{else}}{{.Repository.Name}}{{end}}</h1>
<p class="md-hero-sub">{{if .Config.Hero.Subheadline}}{{.Config.Hero.Subheadline}}{{else}}{{.Repository.Description}}{{end}}</p>
<div class="md-hero-ctas">
{{if .Config.Hero.PrimaryCTA.Label}}
<a href="{{.Config.Hero.PrimaryCTA.URL}}" class="md-btn-primary">
{{.Config.Hero.PrimaryCTA.Label}}
{{svg "octicon-arrow-right" 16}}
</a>
{{else}}
<a href="{{.Repository.Link}}" class="md-btn-primary">
Get Started
{{svg "octicon-arrow-right" 16}}
</a>
{{end}}
</div>
{{if .Config.Hero.CodeExample}}
<div class="md-code-block">
<button class="md-copy-btn" onclick="navigator.clipboard.writeText(document.getElementById('code-example').textContent)">
{{svg "octicon-copy" 16}}
</button>
<code id="code-example">{{.Config.Hero.CodeExample}}</code>
</div>
{{end}}
</section>
{{if or .Config.Stats (gt .NumStars 0)}}
<div class="md-divider"></div>
<!-- Stats -->
<section class="md-stats">
<div class="md-stats-inner">
{{if .Config.Stats}}
{{range .Config.Stats}}
<div>
<div class="md-stat-value">{{.Value}}</div>
<div class="md-stat-label">{{.Label}}</div>
</div>
{{end}}
{{else}}
<div>
<div class="md-stat-value">{{.NumStars}}</div>
<div class="md-stat-label">Stars</div>
</div>
<div>
<div class="md-stat-value">{{.NumForks}}</div>
<div class="md-stat-label">Forks</div>
</div>
{{if .LatestRelease}}
<div>
<div class="md-stat-value">v{{.LatestRelease.TagName}}</div>
<div class="md-stat-label">Latest</div>
</div>
{{end}}
{{end}}
</div>
</section>
<div class="md-divider"></div>
{{end}}
<!-- Value Props (Bullet Points) -->
{{if .Config.ValueProps}}
<section class="md-section" id="why">
<h2 class="md-section-title">{{if .Config.Brand.Name}}Why {{.Config.Brand.Name}}{{else}}Why Choose Us{{end}}</h2>
{{range .Config.ValueProps}}
<div class="md-value-item">
<div class="md-value-bullet"></div>
<div>
<span class="md-value-title">{{.Title}}</span>
<span class="md-value-desc"> — {{.Description}}</span>
</div>
</div>
{{end}}
</section>
{{end}}
<!-- Features Accordion (+/-) -->
{{if .Config.Features}}
<section class="md-section" id="features">
<h2 class="md-section-title">Features</h2>
<div class="md-accordion">
{{range $i, $f := .Config.Features}}
<div class="md-accordion-item" data-index="{{$i}}">
<button class="md-accordion-header" onclick="toggleAccordion(this)">
<span class="md-accordion-title">{{$f.Title}}</span>
<span class="md-accordion-icon">+</span>
</button>
<div class="md-accordion-content">
{{$f.Description}}
</div>
</div>
{{end}}
</div>
</section>
{{end}}
<!-- Pricing Section -->
{{if .Config.Pricing.Plans}}
<section class="md-pricing" id="pricing">
<h2 class="md-pricing-title">{{if .Config.Pricing.Headline}}{{.Config.Pricing.Headline}}{{else}}Pricing{{end}}</h2>
<div class="md-pricing-grid">
{{range .Config.Pricing.Plans}}
<div class="md-pricing-card{{if .Featured}} featured{{end}}">
{{if .Featured}}<span class="md-pricing-featured-badge">Popular</span>{{end}}
<div class="md-pricing-name">{{.Name}}</div>
<div class="md-pricing-price">{{.Price}}</div>
<div class="md-pricing-period">{{.Period}}</div>
{{if .Features}}
<ul class="md-pricing-features">
{{range .Features}}
<li>{{.}}</li>
{{end}}
</ul>
{{end}}
<a href="#" class="md-pricing-cta">{{if .CTA}}{{.CTA}}{{else}}Get Started{{end}}</a>
</div>
{{end}}
</div>
</section>
{{end}}
<!-- Testimonial -->
{{if .Config.SocialProof.Testimonials}}
<section class="md-testimonial-section">
<div class="md-testimonial-inner">
<div class="md-testimonials-container">
{{range .Config.SocialProof.Testimonials}}
<div class="md-testimonial-item" style="display: none;">
<blockquote class="md-testimonial-quote">"{{.Quote}}"</blockquote>
<div>
<span class="md-testimonial-author">{{.Author}}</span>
<span class="md-testimonial-role"> · {{.Role}}</span>
</div>
</div>
{{end}}
</div>
</div>
</section>
<script>
(function() {
var items = document.querySelectorAll(".md-testimonial-item");
if (items.length > 0) {
var idx = Math.floor(Math.random() * items.length);
items[idx].style.display = "block";
}
})();
</script>
{{end}}
<!-- Used By -->
{{if .Config.SocialProof.Logos}}
<section class="md-used-by">
<p class="md-used-by-label">Used by</p>
<div class="md-used-by-logos">
{{range .Config.SocialProof.Logos}}
<span class="md-used-by-item">{{.}}</span>
{{end}}
</div>
</section>
{{end}}
<!-- CTA Section -->
{{if .Config.CTASection.Headline}}
<section class="md-cta-section">
<h2>{{.Config.CTASection.Headline}}</h2>
{{if .Config.CTASection.Subheadline}}
<button class="md-install-cmd" style="margin-bottom: 32px; font-size: 18px; padding: 16px 28px;" onclick="navigator.clipboard.writeText('{{.Config.CTASection.Subheadline}}')">
<span style="color: #a3a3a3;">$</span>
{{.Config.CTASection.Subheadline}}
{{svg "octicon-copy" 14}}
</button>
{{end}}
{{if .Config.CTASection.Button.Label}}
<div>
<a href="{{.Config.CTASection.Button.URL}}" class="md-btn-primary">
{{.Config.CTASection.Button.Label}}
{{svg "octicon-arrow-right" 16}}
</a>
</div>
{{end}}
</section>
{{end}}
<!-- Footer -->
<footer class="md-footer">
<span class="md-footer-copyright">{{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>
{{if .Config.Footer.Social}}
<div class="md-footer-social">
{{range .Config.Footer.Social}}
<a href="{{.URL}}" title="{{.Platform}}">
{{if eq .Platform "twitter"}}{{svg "octicon-mention" 18}}
{{else if eq .Platform "github"}}{{svg "octicon-mark-github" 18}}
{{else if eq .Platform "discord"}}{{svg "octicon-comment-discussion" 18}}
{{else if eq .Platform "linkedin"}}{{svg "octicon-briefcase" 18}}
{{else if eq .Platform "youtube"}}{{svg "octicon-video" 18}}
{{else}}{{svg "octicon-link-external" 18}}{{end}}
</a>
{{end}}
</div>
{{end}}
<div class="md-footer-links">
{{if .Config.Footer.Links}}
{{range .Config.Footer.Links}}
<a href="{{.URL}}" class="md-footer-link">{{.Label}}</a>
{{end}}
{{else}}
<a href="{{.Repository.Link}}" class="md-footer-link">Repository</a>
<a href="{{.Repository.Link}}/wiki" class="md-footer-link">Documentation</a>
{{end}}
</div>
</footer>
</div>
<script>
function toggleAccordion(header) {
var item = header.parentElement;
var wasOpen = item.classList.contains('open');
// Close all
document.querySelectorAll('.md-accordion-item').forEach(function(el) {
el.classList.remove('open');
el.querySelector('.md-accordion-icon').textContent = '+';
});
// Open clicked if it was closed
if (!wasOpen) {
item.classList.add('open');
item.querySelector('.md-accordion-icon').textContent = '';
}
}
</script>
{{template "pages/base_footer" .}}