www.git

www

~ Personal site — projects, posts, about. Built with sqzass.
git clone https://github.com/debuman/www.git
commit 0b80e405218460c411cd54951263d6172600e860
parent dc6e1b2b71cefc9d93fa9b88c9f2d68a35d450e9
Author: sqzer <110329244+sqzer-x@users.noreply.github.com>
Date: Tue, 4 Aug 2026 18:28:11 +0900

Light by default, one accent, English chrome in both languages

The accent is #e4a242 in both themes now. It loses contrast on the light
surface, which is a real cost and worth naming: it is only ever used on hover,
focus and the current item, and every one of those places also changes
something structural — an underline, a border, the tick under a nav item — so
nothing on this site is carried by that colour alone. Where the accent becomes a
background rather than ink, --on-accent holds the dark ink that sits on top of
it; ::selection was painting near-white text on orange in the light theme.

Light is the default now. It was only ever dark because the reference was.

Korean keeps English chrome. Navigation, footer, controls and door links stay in
English in both languages; what translates is what you came to read — titles,
descriptions, prose. Section labels come from i18n by matching the URL rather
than from the section title, because a section title is content and follows the
page language. Unknown sections fall back to their title.

That also shrinks the Korean typographic reset from eighteen selectors to eight.
It exists to undo letter-spacing, uppercase and monospace where Hangul appears;
chrome that is now always English needs none of it, and leaving it on made the
nav lowercase on Korean pages only.

Diffstat:
Mi18n/en.toml | 4++++
Mi18n/ko.toml | 97++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
Mstatic/css/main.css | 31+++++++++++++++----------------
Mstatic/fonts/display-kr.woff2 | 0binary
Mtemplates/base.html | 7++++---
Mtemplates/partials/footer.html | 3++-
Atemplates/partials/nav.html | 9+++++++++
7 files changed, 88 insertion(+), 63 deletion(-)

diff --git a/i18n/en.toml b/i18n/en.toml
@@ -12,6 +12,10 @@ search_hint     = "Type to search"
 search_empty    = "Nothing matches that."
 search_results  = "Results"
 
+nav_posts    = "Posts"
+nav_projects = "Projects"
+nav_about    = "About"
+
 all_posts    = "All posts"
 all_projects = "All projects"
 writing      = "Writing"
diff --git a/i18n/ko.toml b/i18n/ko.toml
@@ -1,48 +1,59 @@
 # 템플릿이 공급하는 문자열. 본문은 content/ 에 있다.
 # 한쪽 언어에 키가 없으면 빌드 에러다 — 기본 언어로 떨어뜨리면 한국어 페이지에
 # 영어 라벨이 섞여 나가고, 그건 읽는 사람에게만 보이고 고치는 사람에게는 안 보인다.
-
-skip_to_content = "본문으로 건너뛰기"
-menu            = "메뉴"
-close           = "닫기"
-theme           = "테마"
-search          = "검색"
-search_the_site = "사이트 검색"
-search_hint     = "검색어를 입력하세요"
-search_empty    = "일치하는 것이 없습니다."
-search_results  = "검색 결과"
-
-all_posts    = "글 전체"
-all_projects = "프로젝트 전체"
-writing      = "글"
-recent       = "최근"
-selected     = "골라 둔 것"
-
-previous     = "이전"
-next         = "다음"
-back         = "돌아가기"
-published    = "발행"
-updated      = "갱신"
-on_this_page = "이 페이지"
-breadcrumb   = "현재 위치"
-home         = "홈"
-
-website      = "웹사이트"
-source       = "소스"
-docs         = "문서"
-repository   = "저장소"
-status       = "상태"
-language     = "언어"
-archived     = "보관됨"
-active       = "유지 중"
-
-copy         = "복사"
-copied       = "복사됨"
-
-elsewhere    = "다른 곳"
-
-feed         = "피드"
-sitemap      = "사이트맵"
-
+#
+# **크롬은 두 언어가 같다.** 내비, 푸터, 컨트롤 라벨은 한국어 페이지에서도 영어로
+# 둔다. 번역되는 것은 읽으러 온 것 — 제목, 설명, 본문 — 뿐이다. 여기 영어가
+# 반복되는 것은 빠뜨린 게 아니라 그 결정이다.
+#
+# 예외는 404 다. 그건 라벨이 아니라 읽는 사람에게 건네는 문장이라 번역한다.
+
+skip_to_content = "Skip to content"
+menu            = "Menu"
+close           = "Close"
+theme           = "Theme"
+search          = "Search"
+search_the_site = "Search the site"
+search_hint     = "Type to search"
+search_empty    = "Nothing matches that."
+search_results  = "Results"
+
+nav_posts    = "Posts"
+nav_projects = "Projects"
+nav_about    = "About"
+
+all_posts    = "All posts"
+all_projects = "All projects"
+writing      = "Writing"
+recent       = "Recent"
+selected     = "Selected"
+
+previous     = "Previous"
+next         = "Next"
+back         = "Back"
+published    = "Published"
+updated      = "Updated"
+on_this_page = "On this page"
+breadcrumb   = "You are here"
+home         = "Home"
+
+website      = "Website"
+source       = "Source"
+docs         = "Documentation"
+repository   = "Repository"
+status       = "Status"
+language     = "Language"
+archived     = "Archived"
+active       = "Active"
+
+copy         = "Copy"
+copied       = "Copied"
+
+elsewhere    = "Elsewhere"
+
+feed         = "Feed"
+sitemap      = "Sitemap"
+
+# 404 는 라벨이 아니라 문장이다. 길을 잃은 사람에게 건네는 말이라 번역한다.
 not_found_title = "이 페이지는 없습니다"
 not_found_body  = "주소가 틀렸거나, 페이지가 옮겨 가면서 안내를 남기지 않았습니다. 이 사이트에 있는 것은 전부 검색 한 번 거리에 있습니다."
diff --git a/static/css/main.css b/static/css/main.css
@@ -83,6 +83,10 @@
      가져오는 것과 같은 규칙이고, 차가운 바닥과는 보색이라 손이 닿는 자리가
      확실히 뜬다. 니어블랙 대비 9.07:1. */
   --accent: #e4a242;
+  /* 액센트 위에 얹히는 잉크. 액센트가 밝은 주황이라 두 테마 모두 어둡다 —
+     ::selection 처럼 액센트가 배경이 되는 자리에서 --bg 를 쓰면 라이트에서
+     흰 글자가 주황 위에 놓여 읽히지 않는다. */
+  --on-accent: #14140f;
 
   /* 선화 마크는 순수 흑 아니면 순수 백이다. 중간 회색은 비활성으로 읽힌다. */
   --mark-ink: #ffffff;
@@ -132,9 +136,11 @@
   --rule-3: #bac0be;
 
   --ink-rgb: 14, 18, 17;
-  /* 같은 색상(36°)에서 명도만 내린다. 니어블랙에서 9:1 인 주황이 니어화이트
-     에서는 1.9:1 로 무너진다. 이 값은 5.2:1. */
-  --accent: #935f10;
+  /* 액센트는 두 테마가 같다. 밝은 바닥에서 대비가 낮아지지만, 이 색은
+     평상시에 나오지 않고 hover·focus·현재 위치에만 쓰이며 그 자리에는 늘
+     상태 변화가 함께 있다(밑줄, 테두리, 눈금). 색 하나로만 뜻을 전하는
+     자리는 없다. */
+  --accent: #e4a242;
   --mark-ink: #000000;
 }
 
@@ -167,7 +173,7 @@ img { max-width: 100%; height: auto; }
 a { color: inherit; text-decoration: none; }
 
 :focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; border-radius: 2px; }
-::selection { background: var(--accent); color: var(--bg); }
+::selection { background: var(--accent); color: var(--on-accent); }
 
 * { scrollbar-width: thin; scrollbar-color: var(--rule-2) transparent; }
 ::-webkit-scrollbar { width: 8px; height: 8px; }
@@ -1074,25 +1080,18 @@ html[lang="ko"] [data-tooltip]::after { letter-spacing: 0; text-transform: none;
 /* 한국어는 라틴 타이포 장치 셋을 깨뜨린다. letter-spacing 은 음절 블록을 벌리고,
    text-transform 은 아무 일도 하지 않으며, monospace 는 한글이 프로포셔널로
    폴백하는데 공백만 mono 폭이라 어절 사이가 두 배로 벌어진다.
-   구조는 크기·굵기·색으로도 읽히고 그쪽은 도움이 필요 없다. */
+
+   여기 걸리는 것은 **한국어가 들어가는 자리만**이다. 크롬(내비·푸터·컨트롤·
+   문 링크)은 두 언어에서 영어로 고정이므로 대문자와 자간을 그대로 둔다 —
+   되돌리면 한국어 페이지에서만 라벨이 소문자로 나와 두 언어가 달라 보인다. */
 html[lang="ko"] .eyebrow,
 html[lang="ko"] .fact-label,
-html[lang="ko"] .toc-label,
-html[lang="ko"] .pager-dir,
 html[lang="ko"] .prose th,
 html[lang="ko"] .crumbs,
 html[lang="ko"] .palette-crumb,
-html[lang="ko"] .colophon-nav a,
-html[lang="ko"] .colophon-note,
-html[lang="ko"] .nav a,
-html[lang="ko"] .chip,
 html[lang="ko"] .btn,
-html[lang="ko"] .door,
-html[lang="ko"] .room-door,
 html[lang="ko"] .back,
-html[lang="ko"] .badges li,
-html[lang="ko"] .lang,
-html[lang="ko"] .tile-meta {
+html[lang="ko"] .badges li {
   font-family: var(--sans);
   letter-spacing: 0;
   text-transform: none;
diff --git a/static/fonts/display-kr.woff2 b/static/fonts/display-kr.woff2
Binary files differ.
diff --git a/templates/base.html b/templates/base.html
@@ -9,11 +9,12 @@
 {#- 서브경로에 올라갈 수도 있으므로 손으로 쓰는 링크에는 base_path를 붙인다.
     페이지 URL들은 이미 이 접두사를 품고 있어서 손댈 필요가 없다. #}
 {%- set home = site.base_path ~ ("/ko/" if ko else "/") %}
+{% from "partials/nav.html" import nav_label %}
 <!doctype html>
 {#- 기본값을 여기 적는다. prefers-color-scheme 에 맡기지 않는 이유는 생성된
     하이라이트 스타일시트가 같은 [data-theme] 을 보기 때문이다. 둘이 서로 다른
-    근거로 결정하면 라이트 OS 를 쓰는 사람이 어두운 페이지에 밝은 코드를 본다. #}
-<html lang="{{ page.language }}" data-theme="dark">
+    근거로 결정하면 한쪽이 어두운 페이지에 밝은 코드를 낸다. #}
+<html lang="{{ page.language }}" data-theme="light">
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1">
@@ -82,7 +83,7 @@
 
     <nav class="nav" aria-label="{{ t("menu") }}">
       {%- for s in site.sections %}
-      <a href="{{ s.url }}"{% if page.url == s.url or (page.section and page.section.url == s.url) %} aria-current="true"{% endif %}>{{ s.title }}</a>
+      <a href="{{ s.url }}"{% if page.url == s.url or (page.section and page.section.url == s.url) %} aria-current="true"{% endif %}>{{ nav_label(s, home) }}</a>
       {%- endfor %}
     </nav>
 
diff --git a/templates/partials/footer.html b/templates/partials/footer.html
@@ -9,11 +9,12 @@
 {%- set ko = page.language == "ko" %}
 {%- set home = site.base_path ~ ("/ko/" if ko else "/") %}
 {% from "partials/icons.html" import i_github, i_instagram %}
+{% from "partials/nav.html" import nav_label %}
 <footer class="colophon">
   <div class="colophon-in">
     <nav class="colophon-nav" aria-label="{{ t("menu") }}">
       {%- for s in site.sections %}
-      <a href="{{ s.url }}">{{ s.title }}</a>
+      <a href="{{ s.url }}">{{ nav_label(s, home) }}</a>
       {%- endfor %}
       {%- if site.feed %}
       <a href="{{ site.feed }}">{{ t("feed") }}</a>
diff --git a/templates/partials/nav.html b/templates/partials/nav.html
@@ -0,0 +1,9 @@
+{#- 갈래 라벨. site.sections 의 제목은 콘텐츠(각 언어의 _index.md)라 한국어
+    페이지에서 한국어가 된다. 크롬은 두 언어가 같아야 하므로 URL 로 골라 i18n 에서
+    가져온다 — 알려진 세 갈래 밖은 섹션 제목으로 떨어진다. #}
+{% macro nav_label(s, home) -%}
+{%- if s.url == home ~ "posts/" %}{{ t("nav_posts") }}
+{%- elif s.url == home ~ "projects/" %}{{ t("nav_projects") }}
+{%- elif s.url == home ~ "about/" %}{{ t("nav_about") }}
+{%- else %}{{ s.title }}{% endif %}
+{%- endmacro %}