Converti chill-theme en dossier classique

This commit is contained in:
Boris Waaub
2026-01-28 09:40:37 +01:00
parent 577786f22d
commit cc60b64505
118 changed files with 11868 additions and 1 deletions
@@ -0,0 +1,118 @@
<!DOCTYPE html>
<html lang="{{ .Site.LanguageCode | default "en" }}" class="h-full">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Google Tag Manager -->
{{ partial "google-tag-manager" . }}
<!-- Google Analytics -->
{{ partial "google-analytics" . }}
<!-- Title -->
<title>{{ if .IsHome }}{{ .Site.Title }}{{ else }}{{ .Title }} | {{ .Site.Title }}{{ end }}</title>
<!-- Meta Tags -->
<meta name="description" content="{{ with .Description }}{{ . }}{{ else }}{{ with .Site.Params.description }}{{ . }}{{ end }}{{ end }}">
<meta name="author" content="{{ .Site.Params.author | default .Site.Title }}">
<meta name="robots" content="{{ with .Params.robots }}{{ . }}{{ else }}index, follow{{ end }}">
<!-- Open Graph -->
<meta property="og:title" content="{{ if .IsHome }}{{ .Site.Title }}{{ else }}{{ .Title }} | {{ .Site.Title }}{{ end }}">
<meta property="og:description" content="{{ with .Description }}{{ . }}{{ else }}{{ with .Site.Params.description }}{{ . }}{{ end }}{{ end }}">
<meta property="og:type" content="{{ if .IsHome }}website{{ else }}article{{ end }}">
<meta property="og:url" content="{{ .Permalink }}">
<meta property="og:site_name" content="{{ .Site.Title }}">
{{ with .Params.image }}
<meta property="og:image" content="{{ . | absURL }}">
{{ else }}
{{ with .Site.Params.image }}
<meta property="og:image" content="{{ . | absURL }}">
{{ end }}
{{ end }}
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="{{ if .IsHome }}{{ .Site.Title }}{{ else }}{{ .Title }} | {{ .Site.Title }}{{ end }}">
<meta name="twitter:description" content="{{ with .Description }}{{ . }}{{ else }}{{ with .Site.Params.description }}{{ . }}{{ end }}{{ end }}">
{{ with .Site.Params.twitter }}
<meta name="twitter:site" content="@{{ . }}">
{{ end }}
{{ with .Params.image }}
<meta name="twitter:image" content="{{ . | absURL }}">
{{ else }}
{{ with .Site.Params.image }}
<meta property="twitter:image" content="{{ . | absURL }}">
{{ end }}
{{ end }}
<!-- Favicon -->
<link rel="icon" type="image/x-icon" href="{{ "images/favicon.ico" | relURL }}">
<!-- Canonical URL -->
<link rel="canonical" href="{{ .Permalink }}">
<!-- Fonts -->
<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;500;600;700&family=Plus+Jakarta+Sans:wght@600;700;800&display=swap" rel="stylesheet">
<!-- Main CSS -->
<link rel="stylesheet" href="{{ "css/style.css" | relURL }}">
<!-- Additional Meta Tags from Front Matter -->
{{ with .Params.customMeta }}
{{ range . }}
<meta {{ range $key, $value := . }} {{ $key }}="{{ $value }}"{{ end }}>
{{ end }}
{{ end }}
<!-- Custom Head Content -->
{{ partial "custom-head" . }}
</head>
<body class="min-h-screen flex flex-col">
<!-- Google Tag Manager (noscript) -->
{{ if and hugo.IsProduction .Site.Params.googleTagManager }}
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id={{ .Site.Params.googleTagManager }}"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
{{ end }}
<!-- End Google Tag Manager (noscript) -->
<!-- Header -->
<div class="fixed top-0 left-0 right-0 z-50">
{{ partial "header" . }}
</div>
<!-- Main Content -->
<div class="pt-20">
{{ block "main" . }}{{ end }}
</div>
<!-- Footer -->
{{ partial "footer" . }}
<!-- Language Preference Script -->
{{ if .Site.IsMultiLingual }}
{{ if .Site.Params.visitorapi_pid }}
<script>
// Inject VisitorAPI project ID from Hugo config
window.HUGO_VISITOR_API_PID = "{{ .Site.Params.visitorapi_pid }}";
</script>
{{ end }}
<script src="{{ "js/language-preference.js" | relURL }}"></script>
{{ end }}
<!-- Mobile Menu Script -->
<script>
const mobileMenuButton = document.getElementById('mobile-menu-button');
if (mobileMenuButton) {
mobileMenuButton.addEventListener('click', function() {
const mobileMenu = document.getElementById('mobile-menu');
if (mobileMenu) {
mobileMenu.classList.toggle('hidden');
}
});
}
</script>
</body>
</html>
@@ -0,0 +1,115 @@
{{ define "main" }}
<div class="bg-gray-50">
<!-- Hero Section -->
<div class="bg-gradient-to-r from-primary-600 to-primary-700">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-24">
<div class="text-center">
<h1 class="text-4xl font-bold text-white mb-6">{{ .Title }}</h1>
<p class="text-xl text-white max-w-2xl mx-auto leading-relaxed">{{ .Description }}</p>
</div>
</div>
</div>
<!-- Team Culture Section -->
{{ with .Params.culture_section }}
<div class="bg-white py-16">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="bg-gray-50 rounded-xl shadow-sm p-8 lg:p-12">
<div class="grid lg:grid-cols-2 gap-12 items-center">
<div>
<h2 class="text-3xl font-bold text-gray-900 mb-6">{{ .title }}</h2>
<div class="space-y-6">
{{ range .values }}
<div class="flex items-start">
<div class="flex-shrink-0">
<div class="flex items-center justify-center h-12 w-12 rounded-md bg-primary-600 text-white">
{{ .icon }}
</div>
</div>
<div class="ml-4">
<h3 class="text-xl font-semibold text-gray-900">{{ .title }}</h3>
<p class="mt-2 text-gray-600">{{ .description }}</p>
</div>
</div>
{{ end }}
</div>
</div>
<div class="relative">
<img src="{{ .image }}" alt="{{ .image_alt }}" class="rounded-lg shadow-xl">
<div class="absolute -bottom-4 -right-4 bg-white rounded-lg shadow-lg px-6 py-4">
<p class="text-gray-900 font-semibold">{{ .image_caption }}</p>
</div>
</div>
</div>
</div>
</div>
</div>
{{ end }}
<!-- Benefits Section -->
{{ with .Params.benefits_section }}
<div class="bg-white py-16">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<h2 class="text-3xl font-bold text-gray-900 text-center mb-12">{{ .title }}</h2>
<div class="grid md:grid-cols-3 gap-8">
{{ range .benefits }}
<div class="bg-gray-50 rounded-lg p-6 hover:shadow-md transition-shadow duration-200">
<div class="text-2xl mb-4">{{ .icon }}</div>
<h3 class="text-xl font-semibold text-gray-900 mb-2">{{ .title }}</h3>
<p class="text-gray-600">{{ .description }}</p>
</div>
{{ end }}
</div>
</div>
</div>
{{ end }}
<!-- Open Positions Section -->
{{ with .Params.positions_section }}
<div class="bg-white py-16">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="bg-gray-50 rounded-xl shadow-sm p-8 lg:p-12">
<div class="text-center mb-12">
<h2 class="text-3xl font-bold text-gray-900 mb-4">{{ .title }}</h2>
<p class="text-lg text-gray-600 max-w-2xl mx-auto">Join our team and help shape the future of SaaS. We're always looking for talented individuals who share our passion for innovation.</p>
</div>
<div class="grid gap-6 md:grid-cols-2 lg:grid-cols-3">
{{ range where $.Site.RegularPages "Section" "jobs" }}
<a href="{{ .RelPermalink }}" class="group">
<div class="h-full bg-white rounded-lg shadow-sm group-hover:shadow-md transition-all duration-200 overflow-hidden border border-gray-100 group-hover:border-primary-100">
<div class="p-6">
<div class="flex items-center justify-between mb-4">
<h3 class="text-xl font-semibold text-gray-900 group-hover:text-primary-600 transition-colors duration-200">{{ .Title }}</h3>
<span class="flex items-center justify-center w-8 h-8 rounded-full bg-primary-50 text-primary-600 group-hover:bg-primary-100 transition-colors duration-200">
</span>
</div>
<div class="flex items-center text-gray-600 text-sm mb-4 space-x-4">
{{ with .Params.location }}
<span class="flex items-center">
<span class="mr-2">📍</span>
{{ . }}
</span>
{{ end }}
{{ with .Params.type }}
<span class="flex items-center">
<span class="mr-2">💼</span>
{{ . }}
</span>
{{ end }}
</div>
<p class="text-gray-600 mb-4 line-clamp-2">{{ .Description | default .Summary }}</p>
<div class="text-primary-600 font-medium group-hover:text-primary-700 transition-colors duration-200">
{{ $.Params.positions_section.view_position_text }} →
</div>
</div>
</div>
</a>
{{ end }}
</div>
</div>
</div>
</div>
{{ end }}
</div>
{{ end }}
@@ -0,0 +1,6 @@
{{ define "main" }}
<article class="post">
<!-- Hero section will be rendered by the hero shortcode -->
{{ .Content }}
</article>
{{ end }}
@@ -0,0 +1,76 @@
{{ define "main" }}
<article class="feature-page" style="--badge-color: {{ .Params.badgeColor }}">
<!-- Hero Section -->
<div class="relative isolate overflow-hidden">
<style>
.badge {
background-color: color-mix(in srgb, var(--badge-color) 10%, transparent);
color: var(--badge-color);
}
.gradient-bg {
background-image: linear-gradient(180deg, color-mix(in srgb, var(--badge-color) 5%, white), white);
}
</style>
<div class="absolute inset-x-0 top-0 h-96 gradient-bg opacity-75"></div>
<div class="relative pt-24 pb-16 sm:pt-32">
<div class="mx-auto max-w-7xl px-6 lg:px-8">
<div class="mx-auto max-w-2xl text-center">
{{ with .Params.badge }}
<div class="mb-6">
<span class="badge inline-flex items-center rounded-full px-4 py-1.5 text-sm font-medium">
{{ . }}
</span>
</div>
{{ end }}
<h1 class="text-4xl font-bold tracking-tight text-gray-900 sm:text-6xl">{{ .Title }}</h1>
<p class="mt-6 text-lg leading-8 text-gray-600">{{ .Description }}</p>
</div>
</div>
</div>
</div>
<!-- Main Content -->
<div class="mx-auto max-w-7xl px-6 lg:px-8">
<!-- Key Features Grid -->
{{ if .Params.features }}
<div class="mx-auto mt-16 max-w-2xl sm:mt-20 lg:mt-24 lg:max-w-none">
<div class="grid max-w-xl grid-cols-1 gap-x-8 gap-y-16 lg:max-w-none lg:grid-cols-2 xl:grid-cols-4">
{{ range .Params.features }}
<div class="flex flex-col bg-white rounded-2xl shadow-sm ring-1 ring-gray-200 p-8">
<dt class="text-lg font-semibold leading-7 text-gray-900">
{{ .title }}
</dt>
<dd class="mt-4 flex flex-auto flex-col text-base leading-7 text-gray-600">
<p class="flex-auto">{{ .description }}</p>
</dd>
</div>
{{ end }}
</div>
</div>
{{ end }}
<!-- Content Section -->
<div class="prose prose-lg mx-auto mt-16 pb-24">
{{ .Content }}
</div>
<!-- Demo Section -->
{{ if .Params.demo }}
<div class="bg-gray-50 -mx-6 px-6 py-24 sm:py-32">
<div class="mx-auto max-w-2xl lg:text-center">
<h2 class="text-3xl font-bold tracking-tight text-gray-900 sm:text-4xl">{{ i18n "seeItInAction" }}</h2>
<p class="mt-6 text-lg leading-8 text-gray-600">{{ .Params.demo.description }}</p>
</div>
<div class="mt-16 flex justify-center">
<div class="relative rounded-xl bg-white p-8 shadow-2xl ring-1 ring-gray-200">
<img src="{{ .Params.demo.image }}" alt="Demo" class="rounded-lg">
</div>
</div>
</div>
{{ end }}
</div>
<!-- Global CTA -->
{{ partial "components/cta.html" . }}
</article>
{{ end }}
@@ -0,0 +1,51 @@
{{ define "main" }}
<div class="bg-gray-50 min-h-screen">
<!-- Job Header -->
<div class="bg-gradient-to-r from-primary-600 to-primary-700">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-16">
<div class="text-center">
<h1 class="text-3xl font-bold text-white mb-6">{{ .Title }}</h1>
<div class="flex items-center justify-center text-white space-x-8 text-lg">
{{ with .Params.location }}
<span class="flex items-center">
<span class="mr-2">📍</span>
{{ . }}
</span>
{{ end }}
{{ with .Params.type }}
<span class="flex items-center">
<span class="mr-2">💼</span>
{{ . }}
</span>
{{ end }}
{{ with .Params.salary }}
<span class="flex items-center">
<span class="mr-2">💰</span>
{{ . }}
</span>
{{ end }}
</div>
</div>
</div>
</div>
<!-- Job Content -->
<div class="bg-white py-16">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="bg-gray-50 rounded-xl shadow-sm p-8 lg:p-12">
<div class="prose prose-lg max-w-none">
<div class="text-gray-600 text-lg mb-8">{{ .Description }}</div>
{{ .Content }}
</div>
</div>
<div class="mt-8 text-center">
<a href="/careers" class="inline-flex items-center text-primary-600 hover:text-primary-700">
<span class="mr-2"></span>
View All Positions
</a>
</div>
</div>
</div>
</div>
{{ end }}
@@ -0,0 +1,70 @@
{{ define "main" }}
<div class="container mx-auto px-4 py-12">
<div class="max-w-7xl mx-auto">
{{ if .IsHome }}
<h1 class="text-4xl font-bold mb-8">{{ .Site.Title }}</h1>
{{ else if eq .Section "blog" }}
<h1 class="text-4xl font-bold mb-8">{{ .Site.Params.blog.title }}</h1>
{{ with .Site.Params.blog.subtitle }}
<div class="text-xl text-gray-600 mb-8">{{ . }}</div>
{{ end }}
{{ else }}
<h1 class="text-4xl font-bold mb-8">{{ .Title }}</h1>
{{ with .Description }}
<div class="text-xl text-gray-600 mb-8">{{ . }}</div>
{{ end }}
{{ end }}
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
{{ $paginator := .Paginate .Pages }}
{{ range $paginator.Pages }}
{{ partial "post-card.html" . }}
{{ end }}
</div>
{{ $paginator := .Paginate .Pages }}
{{ if gt $paginator.TotalPages 1 }}
<nav class="mt-12 flex justify-between items-center">
{{ if $paginator.HasPrev }}
<a href="{{ $paginator.Prev.URL }}"
class="inline-flex items-center px-4 py-2 bg-primary-600 text-white rounded-lg hover:bg-primary-700 transition-colors duration-200">
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 19l-7-7m0 0l7-7m-7 7h18"></path>
</svg>
{{ i18n "previous" }}
</a>
{{ else }}
<div></div>
{{ end }}
<div class="flex space-x-2">
{{ range $paginator.Pagers }}
{{ if eq . $paginator }}
<span class="px-4 py-2 bg-primary-600 text-white rounded-lg">
{{ .PageNumber }}
</span>
{{ else }}
<a href="{{ .URL }}"
class="px-4 py-2 bg-gray-100 text-gray-700 rounded-lg hover:bg-gray-200 transition-colors duration-200">
{{ .PageNumber }}
</a>
{{ end }}
{{ end }}
</div>
{{ if $paginator.HasNext }}
<a href="{{ $paginator.Next.URL }}"
class="inline-flex items-center px-4 py-2 bg-primary-600 text-white rounded-lg hover:bg-primary-700 transition-colors duration-200">
{{ i18n "next" }}
<svg class="w-5 h-5 ml-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 5l7 7m0 0l-7 7m7-7H3"></path>
</svg>
</a>
{{ else }}
<div></div>
{{ end }}
</nav>
{{ end }}
</div>
</div>
{{ end }}
@@ -0,0 +1,12 @@
{{ define "main" }}
<div class="container mx-auto px-4 py-8 mb-12 flex-1">
<h1 class="text-4xl font-bold text-center mb-5">{{ .Title }}</h1>
{{ with .Params.description }}
<p class="text-center font-light text-gray-500 sm:text-xl">{{ . }}</p>
{{ end }}
<div class="!max-w-none">
{{ .Content }}
</div>
</div>
{{ end }}
@@ -0,0 +1,8 @@
{{ define "main" }}
<div class="container mx-auto px-4 py-8 mb-12 flex-1">
<h1 class="text-4xl font-bold text-center mb-12">{{ .Title }}</h1>
<div class="prose prose-lg !max-w-none">
{{ .Content }}
</div>
</div>
{{ end }}
@@ -0,0 +1,86 @@
{{ define "main" }}
<div class="container mx-auto px-4 py-12">
<!-- Two Column Layout for Content and Sidebar -->
<div class="flex flex-col lg:flex-row gap-8 mb-12">
<!-- Main Content -->
<article class="flex-1">
<header class="mb-8">
{{ with .Params.categories }}
<div class="mb-4">
{{ range . }}
<a href="{{ "/categories/" | relLangURL }}{{ . | urlize }}"
class="inline-block px-3 py-1 text-sm font-medium text-primary-600 bg-primary-50 rounded-full hover:bg-primary-100 mr-2">
{{ . }}
</a>
{{ end }}
</div>
{{ end }}
<h1 class="text-4xl font-bold mb-4">{{ .Title }}</h1>
{{ partial "post-meta.html" . }}
</header>
{{ with .Params.featured_image }}
<div class="mb-8">
<img src="{{ . }}"
alt="{{ $.Title }}"
class="w-full h-auto rounded-lg"
loading="lazy">
</div>
{{ end }}
<div class="prose prose-lg max-w-none">
{{ .Content }}
</div>
</article>
<!-- Sidebar -->
<aside class="lg:w-80 xl:w-96">
{{ partial "sidebar.html" . }}
</aside>
</div>
<!-- Full-width Navigation Section -->
<nav class="border-t border-gray-200 mt-12 pt-8">
<div class="flex justify-between items-center">
{{ with .PrevInSection }}
<a href="{{ .RelPermalink }}"
class="group flex items-center">
<svg class="w-5 h-5 mr-2 text-gray-600 group-hover:text-primary-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 19l-7-7m0 0l7-7m-7 7h18"></path>
</svg>
<div>
<div class="text-sm text-gray-600">{{ i18n "previousPost" $ }}</div>
<div class="font-medium group-hover:text-primary-600">{{ .Title }}</div>
</div>
</a>
{{ else }}
<div></div>
{{ end }}
{{ with .NextInSection }}
<a href="{{ .RelPermalink }}"
class="group flex items-center text-right">
<div>
<div class="text-sm text-gray-600">{{ i18n "nextPost" $ }}</div>
<div class="font-medium group-hover:text-primary-600">{{ .Title }}</div>
</div>
<svg class="w-5 h-5 ml-2 text-gray-600 group-hover:text-primary-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 5l7 7m0 0l-7 7m7-7H3"></path>
</svg>
</a>
{{ else }}
<div></div>
{{ end }}
</div>
</nav>
<!-- Full-width CTA Section -->
{{ if and .Site.Params.blog.cta.enable .Site.Params.cta.enable }}
<div class="mt-16">
{{ partial "components/cta.html" . }}
</div>
{{ end }}
</div>
{{ end }}