www.git

www

~ Personal site — projects, posts, about. Built with sqzass.
git clone https://github.com/debuman/www.git
commit 67344fd68a8204c4277abe01aba03b9a7666fa91
parent 42e8483ffe3c6bc0558b783432f5cf6942bc2d4c
Author: sqzer <110329244+sqzer-x@users.noreply.github.com>
Date: Tue, 4 Aug 2026 16:39:52 +0900

Retint the theme: jade on a cool near-black

Name the theme while renaming its colours. hwaro catalogues 224 example sites
and hahwul.com is one of them; this is sqzass's first, and it is called jade
after the only colour in the sheet.

The tell was saturation. hahwul's brass is hsl 34%; every property in this house
is hot — the blog at 100%, the sqzass landing at 100%, the sqzass docs at 82%,
ommp's tabs in the same register. This site shipped a 52% tan, which is the
wrong family. The surfaces had the same problem from the other direction: ommp
is blue-violet lifted straight from its own BG_DARK, the blog is blue-green, the
sqzass docs are blue-black, the landing is warm brown. Only hahwul's is a pure
neutral, and this site had copied it byte for byte at #010102.

Jade is picked by elimination rather than taste: peach and coral belong to
sqzass, amber to the blog, neon pink and cyan and violet to ommp. Blue-green was
the one register nobody was using. It keeps the rule all three of those sheets
state independently — absent at rest, present only on hover, focus and the
current item.

Also swept the values that were identical to the reference rather than derived
from anything here: the negated mask feature test, saturate(140%), a 60rem
ledger measure, a body clamp that duplicated the root's, and the --glow token,
whose name came with the brief it was lifted from. It is --ink-rgb now; the
reason for keeping a bare triplet instead of a hex is still good and is still
written down.

No template changed and nothing moved.

Diffstat:
Mstatic/css/main.css | 103++++++++++++++++++++++++++++++++++++++++++++++---------------------------------
Mstatic/images/apple-touch-icon.png | 0binary
Mstatic/images/favicon-dark.png | 0binary
Mstatic/images/favicon.png | 0binary
Mtools/icons.py | 5+++--
5 files changed, 63 insertion(+), 45 deletion(-)

diff --git a/static/css/main.css b/static/css/main.css
@@ -1,8 +1,14 @@
-/* sqzer.com
+/* sqzass 테마 — jade
  *
- * 중립 니어블랙 위의 가운데 정렬 갤러리. 색은 평상시에 없고 손이 닿을 때만
+ * 이 사이트가 쓰는 테마이자 sqzass 로 만든 첫 테마다. 이름은 이 시트의 유일한
+ * 색에서 따왔다. 두 번째 테마가 생기면 그것도 자기 색으로 불리면 된다.
+ *
+ * 청록 니어블랙 위의 가운데 정렬 갤러리. 색은 평상시에 없고 손이 닿을 때만
  * 나온다 — 액센트가 브랜딩이 아니라 보상이다.
  *
+ * 누르면 눌린다. hover 는 빛이 아니라 압축이고(scale 0.988), 그건 이 집의
+ * 이름들이 전부 모음을 눌러 뺀 것이기 때문이다 — sqzer, sqzass, ommp, uaf.
+ *
  * 목소리는 굵기로 만든다. 디스플레이는 230~350 의 초경량에 **양수** 트래킹이고,
  * 라벨은 작고 넓게 벌어진 대문자다. 큰 글자는 가늘고 작은 글자는 벌어진다.
  * 굵은 글씨는 이 사이트에 없다.
@@ -48,25 +54,33 @@
 :root {
   color-scheme: dark;
 
-  --bg-recess: #010102;
-  --bg:        #050506;
-  --bg-2:      #0d0d0f;
-  --bg-3:      #141416;
-
-  --ink:   #f1f1ee;
-  --ink-2: #a3a39e;
-  --ink-3: #7b7b74;
-  --ink-4: #3b3b38;
-
-  --rule:   #191919;
-  --rule-2: #262628;
-  --rule-3: #39393d;
-
-  /* 색이 아니라 삼원소. 토큰 하나로 alpha 0.03~0.75 를 전부 낸다. */
-  --glow: 241, 241, 238;
-
-  /* 단 하나의 색조. 평상시에는 어디에도 없고 hover·focus·현재 위치에만 나온다. */
-  --accent: #d9bb90;
+  /* 바닥에 색이 있다. 이 집 사이트들은 전부 그렇다 — ommp 는 청보라(#0A051E,
+     앱의 BG_DARK 를 그대로), blog 는 청록, sqzass 문서는 청흑, 랜딩은 웜브라운.
+     순수 중립 회색은 아무 말도 하지 않는다. */
+  --bg-recess: #030405;
+  --bg:        #07090a;
+  --bg-2:      #0e1112;
+  --bg-3:      #151819;
+
+  --ink:   #eaeeec;
+  --ink-2: #9ba39f;
+  --ink-3: #737b77;
+  --ink-4: #363c39;
+
+  --rule:   #16191a;
+  --rule-2: #232728;
+  --rule-3: #363b3c;
+
+  /* 색이 아니라 삼원소. 토큰 하나로 alpha 0.03~0.75 를 전부 낸다 —
+     hex 였다면 매번 color-mix 를 거쳐야 했을 값들이다. */
+  --ink-rgb: 234, 238, 236;
+
+  /* 제이드. 이 테마의 이름이자 유일한 색이고, 평상시에는 어디에도 없다.
+     링크·포커스 링·현재 항목·손이 닿은 것에만 나온다 — 초록이면 갈 수 있는
+     것이거나 지금 있는 자리다.
+     자식 사이트들이 쓰는 자리를 피해 고른 색이다: sqzass 는 피치와 코랄,
+     blog 는 앰버, ommp 는 네온 핑크·시안·바이올렛. 청록만 비어 있었다. */
+  --accent: #2fd6a3;
 
   /* 선화 마크는 순수 흑 아니면 순수 백이다. 중간 회색은 비활성으로 읽힌다. */
   --mark-ink: #ffffff;
@@ -90,22 +104,23 @@
 :root[data-theme="light"] {
   color-scheme: light;
 
-  --bg-recess: #eeeeec;
-  --bg:        #fbfbfa;
-  --bg-2:      #f4f4f2;
-  --bg-3:      #ececeb;
+  --bg-recess: #e9ecea;
+  --bg:        #fafbfa;
+  --bg-2:      #f2f4f3;
+  --bg-3:      #eaeded;
 
-  --ink:   #14140f;
-  --ink-2: #56564f;
-  --ink-3: #78786f;
-  --ink-4: #c2c2bb;
+  --ink:   #0e1211;
+  --ink-2: #515856;
+  --ink-3: #737a78;
+  --ink-4: #bdc3c1;
 
-  --rule:   #e6e6e2;
-  --rule-2: #d8d8d3;
-  --rule-3: #bebeb7;
+  --rule:   #e4e8e6;
+  --rule-2: #d5dad8;
+  --rule-3: #bac0be;
 
-  --glow: 20, 20, 15;
-  --accent: #8a6a34;
+  --ink-rgb: 14, 18, 17;
+  /* 니어블랙에서 읽히는 제이드가 니어화이트에서는 대비를 잃는다. 둘 다 어둡게. */
+  --accent: #0f7a5a;
   --mark-ink: #000000;
 }
 
@@ -123,8 +138,10 @@ body {
   background: var(--bg);
   color: var(--ink);
   font-family: var(--sans);
-  font-size: clamp(0.96rem, 0.9rem + 0.2vw, 1.0625rem);
-  line-height: 1.72;
+  /* 루트가 이미 유동이라(clamp 16→19px) 본문까지 vw 에 매달면 두 번 조정된다.
+     1100px 위에서는 어차피 최대값에 고정돼 있던 값이다. */
+  font-size: 1.0625rem;
+  line-height: 1.7;
   /* 한국어는 어절 안에서 줄바꿈하지 않는다. */
   word-break: keep-all;
   overflow-wrap: anywhere;
@@ -161,7 +178,7 @@ a { color: inherit; text-decoration: none; }
   padding-inline: var(--gutter);
 }
 .wrap-read { max-width: var(--read); }
-.wrap-ledger { max-width: 60rem; }
+.wrap-ledger { max-width: 68ch; }
 
 main { display: block; padding-bottom: clamp(5rem, 12vw, 9rem); }
 
@@ -171,7 +188,7 @@ main { display: block; padding-bottom: clamp(5rem, 12vw, 9rem); }
   position: sticky; top: 0; z-index: 30;
   height: var(--masthead-h);
   background: color-mix(in srgb, var(--bg) 82%, transparent);
-  backdrop-filter: saturate(140%) blur(14px);
+  backdrop-filter: blur(14px) saturate(1.5);
   border-bottom: 1px solid var(--rule);
 }
 
@@ -193,7 +210,7 @@ main { display: block; padding-bottom: clamp(5rem, 12vw, 9rem); }
   transition: transform var(--tr-light);
 }
 .brand:hover .brand-mark { transform: scale(1.08); }
-@supports not ((mask: url("")) or (-webkit-mask: url(""))) { .brand-mark { display: none; } }
+@supports not (mask-image: url("")) { .brand-mark { display: none; } }
 
 .brand-name {
   font-size: 0.82rem; font-weight: 500;
@@ -467,7 +484,7 @@ main { display: block; padding-bottom: clamp(5rem, 12vw, 9rem); }
   background:
     repeating-linear-gradient(45deg,
       transparent, transparent 7px,
-      rgba(var(--glow), 0.022) 7px, rgba(var(--glow), 0.022) 14px);
+      rgba(var(--ink-rgb), 0.022) 7px, rgba(var(--ink-rgb), 0.022) 14px);
 }
 .noimg::after {
   content: "no image";
@@ -502,7 +519,7 @@ main { display: block; padding-bottom: clamp(5rem, 12vw, 9rem); }
 /* 빛웅덩이. 채우는 것이 아니라 아래에서 번지는 것이라 경계가 없다. */
 .tile::before {
   content: ""; position: absolute; inset: 0; z-index: -1;
-  background: radial-gradient(closest-side, rgba(var(--glow), 0.05), transparent 72%);
+  background: radial-gradient(closest-side, rgba(var(--ink-rgb), 0.05), transparent 72%);
   opacity: 0; transition: opacity var(--tr-light);
 }
 .tile:hover::before, .tile:focus-within::before { opacity: 1; }
@@ -589,7 +606,7 @@ html[lang="ko"] [data-tooltip]::after { letter-spacing: 0; text-transform: none;
   transition: background var(--tr-light);
 }
 .ledger-link:hover, .ledger-link:focus-visible {
-  background: linear-gradient(100deg, rgba(var(--glow), 0.045), transparent 70%);
+  background: linear-gradient(100deg, rgba(var(--ink-rgb), 0.045), transparent 70%);
 }
 
 .ledger-date {
@@ -790,7 +807,7 @@ html[lang="ko"] [data-tooltip]::after { letter-spacing: 0; text-transform: none;
 .cell:hover { z-index: 1; border-color: var(--rule-2); }
 .cell::before {
   content: ""; position: absolute; inset: 0; z-index: -1;
-  background: radial-gradient(closest-side, rgba(var(--glow), 0.045), transparent 72%);
+  background: radial-gradient(closest-side, rgba(var(--ink-rgb), 0.045), transparent 72%);
   opacity: 0; transition: opacity var(--tr-light);
 }
 .cell:hover::before { opacity: 1; }
diff --git a/static/images/apple-touch-icon.png b/static/images/apple-touch-icon.png
Binary files differ.
diff --git a/static/images/favicon-dark.png b/static/images/favicon-dark.png
Binary files differ.
diff --git a/static/images/favicon.png b/static/images/favicon.png
Binary files differ.
diff --git a/tools/icons.py b/tools/icons.py
@@ -24,8 +24,9 @@ ROOT = Path(__file__).resolve().parent.parent
 IMG = ROOT / "static" / "images"
 SRC_DIR = Path(sys.argv[1] if len(sys.argv) > 1 else "/home/himesama/Downloads")
 
-INK = (16, 20, 26)
-PAPER = (232, 236, 241)
+# main.css 의 --ink / --bg 와 같은 값이어야 파비콘 판이 사이트와 같은 물건으로 보인다.
+INK = (14, 18, 17)
+PAPER = (234, 238, 236)
 
 
 def shape(path: Path) -> Image.Image: