sqzass.git

sqzass

~ A static site generator written in Rust
git clone https://github.com/debuman/sqzass.git
commit 5b57171dc97d571b6c02a510c366e8189f35f4b0
parent 510888c280b2ac030376d6cc8d7c49c4fb2e64a2
Author: sqzer <110329244+sqzer-x@users.noreply.github.com>
Date: Fri, 31 Jul 2026 16:31:18 +0900

랜딩 푸터를 docs와 같은 colophon으로 통일한다

푸터는 사이트 어디서나 같은 물건으로 보여야 한다. 두 벌을 두면 반드시
어긋나므로 마크업을 partials/colophon.html 하나로 빼서 base.html과
landing.html이 같은 파일을 include한다. docs 쪽 렌더 출력은 변경 전과
byte-identical함을 확인했다.

스타일은 main.css의 .colophon 블록을 landing.css의 토큰으로 옮겨 적었다.
docs의 회색 두 단(ink-2/ink-3)은 랜딩 팔레트에 --muted 하나뿐이라 한 단으로
눕는 것이 유일한 차이다. 한국어 예외(h2에 모노·대문자 미적용)와 모바일 1열
붕괴도 docs와 같은 계약을 따른다.

landing 전용이던 foot_line 키와 죽은 셀렉터(.foot [data-reveal])는 지운다.

Diffstat:
Mdocs/content/_index.ko.md | 1-
Mdocs/content/_index.md | 1-
Mdocs/static/css/landing.css | 60+++++++++++++++++++++++++++++++++++++++++++++++++++++-------
Mdocs/static/js/landing.js | 2+-
Mdocs/templates/base.html | 44+-------------------------------------------
Mdocs/templates/landing.html | 17++---------------
Adocs/templates/partials/colophon.html | 46++++++++++++++++++++++++++++++++++++++++++++++
7 files changed, 103 insertion(+), 68 deletion(-)

diff --git a/docs/content/_index.ko.md b/docs/content/_index.ko.md
@@ -21,7 +21,6 @@ bench_more = "전체 수치와 측정 방법 →"
 zero_label = "같은 입력을 두 번 빌드했을 때 생기는 바이트 차이입니다. push마다 CI가 두 번 빌드해서 비교합니다."
 
 foot_benchmark = "벤치마크"
-foot_line = "천 페이지를 25밀리초로 쥐어짜는, Rust로 만든 정적 사이트 생성기."
 
 [[extra.bench]]
 label = "1,000페이지, 최소 마크다운"
diff --git a/docs/content/_index.md b/docs/content/_index.md
@@ -21,7 +21,6 @@ bench_more = "Full numbers and methodology →"
 zero_label = "bytes of difference between two builds of the same input — checked in CI on every push"
 
 foot_benchmark = "Benchmark"
-foot_line = "A static site generator in Rust that squeezes a thousand pages into 25 ms."
 
 [[extra.bench]]
 label = "1,000 pages, minimal markdown"
diff --git a/docs/static/css/landing.css b/docs/static/css/landing.css
@@ -367,17 +367,62 @@ main { display: block; }
 .inst-copy.is-done .i-copy { display: none; }
 .inst-copy.is-done .i-check { display: block; color: var(--accent-ink); }
 
-/* ── 푸터 ── */
-.foot { border-top: 1px solid var(--line); padding-block: 2.4rem 3.2rem; }
-.foot-in { display: grid; gap: 1rem; }
-.foot-nav { display: flex; flex-wrap: wrap; gap: 1.35rem; font-weight: 600; font-size: 0.92rem; }
-.foot-nav a { color: var(--muted); }
-.foot-nav a:hover { color: var(--accent-ink); text-decoration: none; }
-.foot p { margin: 0; color: var(--muted); font-size: 0.9rem; }
+/* ── 푸터 — docs와 같은 colophon. 마크업은 partials/colophon.html 하나를
+   양쪽이 include하고, 여기서는 main.css의 .colophon 블록을 랜딩의 토큰
+   (--line·--text·--muted·--wrap)으로 옮겨 적는다. 값의 근거는 main.css 쪽
+   주석에 있다. docs의 회색 두 단(ink-2/ink-3)은 랜딩엔 --muted 하나라
+   한 단으로 눕는다. */
+.colophon {
+  border-top: 1px solid var(--line);
+  max-width: var(--wrap);
+  margin: 0 auto;
+  padding: 2.5rem clamp(1.25rem, 4vw, 2.5rem) 3.5rem;
+  font-size: 0.8125rem;
+}
+.colophon-grid {
+  display: grid;
+  grid-template-columns: minmax(0, 20rem) repeat(2, minmax(0, 9rem));
+  justify-content: start;
+  gap: clamp(1.5rem, 5vw, 4rem);
+}
+.colophon-mark {
+  display: inline-flex;
+  align-items: center;
+  gap: 0.5rem;
+  font-family: var(--mono);
+  font-size: 1.0625rem;
+  font-weight: 600;
+  letter-spacing: -0.03em;
+  color: var(--muted);
+}
+.colophon-mark:hover { color: var(--text); text-decoration: none; }
+.colophon-brand img { width: 1.7rem; height: 1.7rem; opacity: 0.6; }
+:root[data-theme="dark"] .colophon-brand img { filter: invert(1); }
+.colophon-brand p { margin: 0.6rem 0 0; max-width: 24rem; color: var(--muted); line-height: 1.6; }
+.colophon h2 {
+  margin: 0 0 0.7rem;
+  font-family: var(--mono);
+  font-size: 0.72rem;
+  font-weight: 500;
+  letter-spacing: 0.08em;
+  text-transform: uppercase;
+  color: var(--muted);
+}
+.colophon ul { list-style: none; margin: 0; padding: 0; }
+.colophon li + li { margin-top: 0.4rem; }
+.colophon a { color: var(--muted); transition: color 0.14s ease; }
+.colophon a:hover { color: var(--accent-ink); text-decoration: underline; }
+.colophon-note {
+  margin: 2.5rem 0 0;
+  padding-top: 1.25rem;
+  border-top: 1px solid var(--line);
+  color: var(--muted);
+}
 
 /* ── 한국어: 자간·모노·대문자 장치를 한글에 적용하지 않는다 ── */
 html[lang="ko"] .display { letter-spacing: 0; }
 html[lang="ko"] .kicker { font-family: var(--sans); font-size: 0.85rem; }
+html[lang="ko"] .colophon h2 { font-family: var(--sans); letter-spacing: -0.01em; text-transform: none; }
 html[lang="ko"] h1, html[lang="ko"] h2, html[lang="ko"] h3 { word-break: keep-all; }
 html[lang="ko"] .sub, html[lang="ko"] .note { word-break: keep-all; }
 
@@ -386,6 +431,7 @@ html[lang="ko"] .sub, html[lang="ko"] .note { word-break: keep-all; }
   .bento { grid-template-columns: repeat(2, 1fr); }
   .t-bench { grid-column: span 2; }
   .nav-links > a:first-child { display: none; }
+  .colophon-grid { grid-template-columns: minmax(0, 1fr); gap: 2rem; }
 }
 @media (max-width: 42rem) {
   .bento { grid-template-columns: 1fr; }
diff --git a/docs/static/js/landing.js b/docs/static/js/landing.js
@@ -60,7 +60,7 @@
   }
 
   /* 벤토 타일: 뷰포트에 들어올 때 한 번씩 */
-  document.querySelectorAll(".bento-wrap [data-reveal], .foot [data-reveal]").forEach(function (el) {
+  document.querySelectorAll(".bento-wrap [data-reveal]").forEach(function (el) {
     el.style.opacity = "0";
     M.inView(
       el,
diff --git a/docs/templates/base.html b/docs/templates/base.html
@@ -152,49 +152,7 @@
   {%- endif %}
 </div>
 
-<footer class="colophon">
-  <div class="colophon-grid">
-    <div class="colophon-brand">
-      <a class="colophon-mark" href="{{ home }}">
-        <img src="{{ asset("images/logo.png") }}" alt="" width="121" height="120">
-        <span>{{ site.title }}</span>
-      </a>
-      {#- site.description은 사이트에 하나뿐이라 언어를 타지 않는다. 한국어
-          페이지에 영어 한 줄이 남는 자리라서 i18n에서 가져온다. #}
-      <p>{{ t("tagline") }}</p>
-    </div>
-
-    {#- 문서 갈래는 넣지 않는다. 상단바가 sticky라 화면에서 사라지지 않고,
-        사이드바에도 있다. 같은 목록을 세 번째로 두는 건 채우는 것이지
-        보태는 것이 아니다. #}
-    <div>
-      <h2>{{ t("footer_project") }}</h2>
-      <ul>
-        <li><a href="https://github.com/sqzer-x/sqzass">GitHub</a></li>
-        <li><a href="https://github.com/sqzer-x/sqzass/releases">{{ t("footer_releases") }}</a></li>
-        <li><a href="https://github.com/sqzer-x/sqzass/issues">{{ t("footer_issues") }}</a></li>
-        <li><a href="https://github.com/sqzer-x/sqzass/blob/main/LICENSE">MIT</a></li>
-      </ul>
-    </div>
-
-    {#- 이 빌드가 실제로 내보낸 파일들. 자기 자신을 빌드하는 도구의 문서라서
-        여기 링크가 곧 증거가 된다 — 문서가 "이런 걸 만듭니다"라고 말한 것을
-        눌러서 확인할 수 있다. #}
-    <div>
-      <h2>{{ t("footer_this_build") }}</h2>
-      <ul>
-        <li><a href="{{ site.base_path }}/sitemap.xml">sitemap.xml</a></li>
-        <li><a href="{{ site.base_path }}/robots.txt">robots.txt</a></li>
-        <li><a href="{{ site.base_path }}/llms.txt">llms.txt</a></li>
-        {%- if site.search %}
-        <li><a href="{{ site.search }}">{{ t("footer_search_index") }}</a></li>
-        {%- endif %}
-      </ul>
-    </div>
-  </div>
-
-  <p class="colophon-note">{{ t("built_with") }}</p>
-</footer>
+{%- include "partials/colophon.html" %}
 
 {%- if site.search %}
 <dialog id="search-dialog" class="search-dialog" aria-label="{{ t("search_the_docs") }}">
diff --git a/docs/templates/landing.html b/docs/templates/landing.html
@@ -141,21 +141,8 @@
     </div>
   </section>
 
-  <footer class="foot">
-    <div class="inner foot-in">
-      <nav class="foot-nav">
-        <a href="{{ home }}start/">{{ t("documentation") }}</a>
-        <a href="{{ home }}benchmark/">{{ page.extra.foot_benchmark }}</a>
-        <a href="https://github.com/sqzer-x/sqzass/releases">{{ t("footer_releases") }}</a>
-        <a href="https://github.com/sqzer-x/sqzass/issues">{{ t("footer_issues") }}</a>
-        <a href="https://github.com/sqzer-x/sqzass">GitHub</a>
-        {%- for lang in page.translations %}
-        <a href="{{ lang.url }}" hreflang="{{ lang.code }}">{{ lang.name }}</a>
-        {%- endfor %}
-      </nav>
-      <p>{{ page.extra.foot_line }} · MIT</p>
-    </div>
-  </footer>
 </main>
+
+{%- include "partials/colophon.html" %}
 </body>
 </html>
diff --git a/docs/templates/partials/colophon.html b/docs/templates/partials/colophon.html
@@ -0,0 +1,46 @@
+{#- 사이트 푸터. base.html(docs)과 landing.html이 같은 파일을 include한다 —
+    푸터는 사이트 어디서나 같은 물건으로 보여야 하고, 두 벌을 두면 반드시
+    어긋난다. 스타일은 각 시트(main.css / landing.css)의 .colophon 블록이 진다. #}
+<footer class="colophon">
+  <div class="colophon-grid">
+    <div class="colophon-brand">
+      <a class="colophon-mark" href="{{ home }}">
+        <img src="{{ asset("images/logo.png") }}" alt="" width="121" height="120">
+        <span>{{ site.title }}</span>
+      </a>
+      {#- site.description은 사이트에 하나뿐이라 언어를 타지 않는다. 한국어
+          페이지에 영어 한 줄이 남는 자리라서 i18n에서 가져온다. #}
+      <p>{{ t("tagline") }}</p>
+    </div>
+
+    {#- 문서 갈래는 넣지 않는다. 상단바가 sticky라 화면에서 사라지지 않고,
+        사이드바에도 있다. 같은 목록을 세 번째로 두는 건 채우는 것이지
+        보태는 것이 아니다. #}
+    <div>
+      <h2>{{ t("footer_project") }}</h2>
+      <ul>
+        <li><a href="https://github.com/sqzer-x/sqzass">GitHub</a></li>
+        <li><a href="https://github.com/sqzer-x/sqzass/releases">{{ t("footer_releases") }}</a></li>
+        <li><a href="https://github.com/sqzer-x/sqzass/issues">{{ t("footer_issues") }}</a></li>
+        <li><a href="https://github.com/sqzer-x/sqzass/blob/main/LICENSE">MIT</a></li>
+      </ul>
+    </div>
+
+    {#- 이 빌드가 실제로 내보낸 파일들. 자기 자신을 빌드하는 도구의 문서라서
+        여기 링크가 곧 증거가 된다 — 문서가 "이런 걸 만듭니다"라고 말한 것을
+        눌러서 확인할 수 있다. #}
+    <div>
+      <h2>{{ t("footer_this_build") }}</h2>
+      <ul>
+        <li><a href="{{ site.base_path }}/sitemap.xml">sitemap.xml</a></li>
+        <li><a href="{{ site.base_path }}/robots.txt">robots.txt</a></li>
+        <li><a href="{{ site.base_path }}/llms.txt">llms.txt</a></li>
+        {%- if site.search %}
+        <li><a href="{{ site.search }}">{{ t("footer_search_index") }}</a></li>
+        {%- endif %}
+      </ul>
+    </div>
+  </div>
+
+  <p class="colophon-note">{{ t("built_with") }}</p>
+</footer>