feat(web): tane.comunes.org landing + localized app screenshots

- Hugo site (site/): EN/ES intro + legal (generated from docs/legal), an
  ES/EN About page from docs/{que-es-tane,what-is-tane}.md, seed-green theme,
  responsive header, store-badge placeholders, multi-stage Hugo->nginx image.
- Golden screenshot harness (test/screenshots/): en,es,fr,de,pt,ja + RTL demo,
  real fonts via DejaVu Sans + FontManifest; skip-by-default tag so CI stays
  green. collect_screenshots.sh feeds site/ and fastlane phoneScreenshots.
- Drop editorial notes from the public explainer.
This commit is contained in:
vjrj 2026-07-15 02:08:40 +02:00
parent bbf2e97027
commit 8dce6f7027
117 changed files with 1958 additions and 4 deletions

7
site/layouts/404.html Normal file
View file

@ -0,0 +1,7 @@
{{ define "main" }}
<section class="doc">
<h1>404</h1>
<p class="lead">This page could not be found.</p>
<p class="crumb"><a href="{{ "/" | relLangURL }}">← {{ T "backToHome" }}</a></p>
</section>
{{ end }}

View file

@ -0,0 +1,14 @@
<!doctype html>
<html lang="{{ .Site.Language.LanguageCode }}" dir="{{ or .Site.Language.LanguageDirection "ltr" }}">
<head>
{{ partial "head.html" . }}
</head>
<body>
<a class="skip-link" href="#main">{{ T "skipToContent" }}</a>
{{ partial "header.html" . }}
<main id="main">
{{ block "main" . }}{{ end }}
</main>
{{ partial "footer.html" . }}
</body>
</html>

View file

@ -0,0 +1,15 @@
{{ define "main" }}
<section class="doc doc-list">
<h1>{{ .Title }}</h1>
<p class="lead">{{ T "legalIntro" }}</p>
<ul class="legal-index">
{{ range .Pages.ByWeight }}
<li>
<a href="{{ .RelPermalink }}">{{ .Title }}</a>
{{ with .Description }}<span class="desc">{{ . }}</span>{{ end }}
</li>
{{ end }}
</ul>
<p class="crumb"><a href="{{ "/" | relLangURL }}">← {{ T "backToHome" }}</a></p>
</section>
{{ end }}

View file

@ -0,0 +1,10 @@
{{ define "main" }}
<article class="doc">
{{ if eq .Section "legal" }}<p class="crumb"><a href="{{ "/legal/" | relLangURL }}">{{ T "navLegal" }}</a></p>{{ end }}
<h1>{{ .Title }}</h1>
<div class="doc-body">
{{ .Content }}
</div>
<p class="crumb"><a href="{{ "/" | relLangURL }}">← {{ T "backToHome" }}</a></p>
</article>
{{ end }}

53
site/layouts/index.html Normal file
View file

@ -0,0 +1,53 @@
{{ define "main" }}
{{ $lang := .Site.Language.Lang }}
<section class="hero">
<div class="hero-copy">
<h1>{{ .Params.hero.title }}</h1>
<p class="tagline">{{ .Params.hero.tagline }}</p>
<p class="lead">{{ .Params.hero.lead }}</p>
{{ .Content }}
{{ partial "store-badges.html" . }}
</div>
{{ $shot := resources.Get (printf "screenshots/%s/inventory.png" $lang) }}
{{ with $shot }}
<div class="hero-shot">
<div class="phone"><img src="{{ .RelPermalink }}" alt="Tane inventory" loading="eager" /></div>
</div>
{{ end }}
</section>
<section class="pillars">
{{ range .Params.pillars }}
<article class="pillar">
<div class="pillar-icon" aria-hidden="true">{{ .icon }}</div>
<h2>{{ .title }}</h2>
<p>{{ .body }}</p>
</article>
{{ end }}
</section>
{{ $screens := slice "home" "inventory" "market" "calendar" "detail" }}
<section class="shots">
<h2>{{ T "screenshotsTitle" }}</h2>
<div class="shot-row">
{{ range $s := $screens }}
{{ $img := resources.Get (printf "screenshots/%s/%s.png" $lang $s) }}
{{ with $img }}
<div class="phone"><img src="{{ .RelPermalink }}" alt="Tane {{ $s }}" loading="lazy" /></div>
{{ end }}
{{ end }}
</div>
</section>
<section class="values">
<h2>{{ .Params.values.title }}</h2>
<ul>
{{ range .Params.values.points }}<li>{{ . }}</li>{{ end }}
</ul>
</section>
<section class="get-it" id="get">
<h2>{{ T "getItTitle" }}</h2>
{{ partial "store-badges.html" . }}
</section>
{{ end }}

View file

@ -0,0 +1,16 @@
<footer class="site-footer">
<div class="foot-inner">
<nav class="foot-legal">
{{ range (where .Site.Pages "Section" "legal") }}
{{ if .IsPage }}<a href="{{ .RelPermalink }}">{{ .Title }}</a>{{ end }}
{{ end }}
</nav>
<p class="foot-note">{{ T "footerFreeSoftware" }}</p>
<p class="foot-note">
{{ T "footerPublishedBy" }}
<a href="{{ .Site.Params.publisherURL }}">{{ .Site.Params.publisher }}</a>
· {{ T "footerContact" }}:
<a href="mailto:{{ .Site.Params.email }}">{{ .Site.Params.email }}</a>
</p>
</div>
</footer>

View file

@ -0,0 +1,16 @@
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>{{ .Title }} · {{ .Site.Title }}</title>
<meta name="description" content="{{ with .Description }}{{ . }}{{ else }}{{ .Site.Params.description }}{{ end }}" />
<meta name="theme-color" content="#2F7D34" />
<link rel="icon" href="/favicon.png" type="image/png" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
{{ range .AllTranslations }}
<link rel="alternate" hreflang="{{ .Language.LanguageCode }}" href="{{ .Permalink }}" />
{{ end }}
<meta property="og:title" content="{{ .Title }}" />
<meta property="og:description" content="{{ with .Description }}{{ . }}{{ else }}{{ .Site.Params.description }}{{ end }}" />
<meta property="og:type" content="website" />
<meta property="og:image" content="/apple-touch-icon.png" />
{{ $css := resources.Get "css/main.css" | minify | fingerprint }}
<style>{{ $css.Content | safeCSS }}</style>

View file

@ -0,0 +1,11 @@
<header class="site-header">
<a class="brand" href="{{ "/" | relLangURL }}">
<img src="/logo.png" alt="Tane" width="36" height="36" />
<span>Tane</span>
</a>
<nav class="site-nav">
{{ with .Site.GetPage "/about" }}<a href="{{ .RelPermalink }}">{{ T "navAbout" }}</a>{{ end }}
<a href="{{ "/legal/" | relLangURL }}">{{ T "navLegal" }}</a>
{{ partial "lang-switch.html" . }}
</nav>
</header>

View file

@ -0,0 +1,16 @@
{{- /* Links to this page in the other language; falls back to that language's home. */ -}}
<span class="lang-switch">
{{- range .Site.Languages -}}
{{- $lang := . -}}
{{- if eq $lang.Lang $.Site.Language.Lang -}}
<span class="lang current" aria-current="true">{{ $lang.LanguageName }}</span>
{{- else -}}
{{- $target := "" -}}
{{- range $.AllTranslations -}}
{{- if eq .Language.Lang $lang.Lang -}}{{- $target = .RelPermalink -}}{{- end -}}
{{- end -}}
{{- if not $target -}}{{- $target = ($lang.Lang | printf "/%s/" | relURL) -}}{{- end -}}
<a class="lang" href="{{ $target }}" lang="{{ $lang.LanguageCode }}">{{ $lang.LanguageName }}</a>
{{- end -}}
{{- end -}}
</span>

View file

@ -0,0 +1,12 @@
{{- /* Renders store links only when configured, so nothing broken shows pre-launch. */ -}}
<div class="store-badges">
{{- with .Site.Params.playStoreURL -}}
<a class="badge" href="{{ . }}">Google Play</a>
{{- end -}}
{{- with .Site.Params.fdroidURL -}}
<a class="badge" href="{{ . }}">F-Droid</a>
{{- end -}}
{{- if and (not .Site.Params.playStoreURL) (not .Site.Params.fdroidURL) -}}
<p class="coming-soon">{{ T "getItComingSoon" }}</p>
{{- end -}}
</div>