www.git

www

~ Personal site — projects, posts, about. Built with sqzass.
git clone https://github.com/debuman/www.git
commit 53a51e97f8ed015e7d5ad0e1afc2ef3ab36e50b8
parent de7ce867449aeb946b35c6cbf08b2fb90a750182
Author: sqzer <110329244+sqzer-x@users.noreply.github.com>
Date: Wed, 5 Aug 2026 18:00:45 +0900

The featured card fills its own box

Measured against the reference at 1440: their text block occupies 70% of the
label half with 64px of air above and below. Ours occupied 37%, with 96px. The
complaint was that our box is not roomy, and the cause was the opposite of what
that sounds like — three short lines stranded in the middle of a much taller
rectangle. More padding alone would have made it worse.

Four things fill it. The block gets a fourth line, "Read post", underlined like
the doors elsewhere on this page, which gives the type a bottom edge instead of
leaving the description hanging in mid-air. The title steps up to 2.35rem and
takes text-wrap: pretty rather than balance, because balance minimises line
count and line count is where a text block gets its mass. Internal gaps go 0.6
to 1.15rem and padding to 3.4vw, which is the reference's 43px at this width.
The block is 198px now against 184 before, and it is anchored rather than
floating.

The writing room widens from the reading measure to the full one. The card was
950px while the project grid directly beneath it was 1235 — the narrowest block
on the page, overhung by 142px on each side, which reads as pinched whatever its
padding says. Both are 1235 now. The reading measure was the right container for
a ledger of prose and the wrong one for a two-column picture card; the ledger
keeps it on /posts/.

The media's min-height goes. It was clamp(11rem, 20vw, 15rem) and it never once
bound: the width and height attributes already state 16:9, so that ratio is the
row's floor at every width, and the label wins whenever it is taller. A rule
that cannot fire is worse than no rule, because the next person reads it as the
thing controlling the height.

Two things I looked at and did not do. Narrowing the project grid to match the
card instead drops it from three columns to two and doubles the section's
height. And the label's air grows with the card — 100px each side at 1235
against 61 at 950 — which is the price of the wider card; it reads as margin
rather than void because the block beneath it is anchored and the picture beside
it is large, but it is a real trade and a longer title is what would close it.

Diffstat:
Mi18n/en.toml | 1+
Mi18n/ko.toml | 1+
Mstatic/css/main.css | 29+++++++++++++++++++++++------
Mstatic/fonts/display-kr.woff2 | 0binary
Mtemplates/home.html | 5++++-
5 files changed, 29 insertion(+), 7 deletion(-)

diff --git a/i18n/en.toml b/i18n/en.toml
@@ -17,6 +17,7 @@ nav_projects = "Projects"
 nav_about    = "About"
 
 all_posts    = "All posts"
+read_post    = "Read post"
 all_projects = "All projects"
 writing      = "Writing"
 recent       = "Recent"
diff --git a/i18n/ko.toml b/i18n/ko.toml
@@ -23,6 +23,7 @@ nav_projects = "Projects"
 nav_about    = "About"
 
 all_posts    = "All posts"
+read_post    = "Read post"
 all_projects = "All projects"
 writing      = "Writing"
 recent       = "Recent"
diff --git a/static/css/main.css b/static/css/main.css
@@ -764,8 +764,10 @@ html[lang="ko"] [data-tooltip]::after { letter-spacing: 0; text-transform: none;
    없다. */
 .feature-media {
   display: block; margin: 0;
+  /* 높이 바닥을 따로 두지 않는다. width/height 속성이 16:9 를 알려 주므로 그
+     비율이 그대로 행 높이의 바닥이 되고, 라벨이 더 길면 라벨이 이긴다. 예전의
+     clamp 는 어느 폭에서도 이 값을 넘지 못해서 아무 일도 하지 않았다. */
   width: 100%; height: 100%;
-  min-height: clamp(11rem, 20vw, 15rem);
   object-fit: cover;
   border-right: 1px solid var(--rule);
   background: var(--bg-3);
@@ -773,8 +775,8 @@ html[lang="ko"] [data-tooltip]::after { letter-spacing: 0; text-transform: none;
 
 .feature-label {
   display: flex; flex-direction: column; justify-content: center;
-  gap: 0.6rem; min-width: 0;
-  padding: clamp(1.25rem, 2.5vw, 2rem);
+  gap: 1.15rem; min-width: 0;
+  padding: clamp(1.5rem, 3.4vw, 3.2rem);
 }
 .feature-date {
   font-family: var(--mono); font-size: 0.7rem;
@@ -784,12 +786,27 @@ html[lang="ko"] [data-tooltip]::after { letter-spacing: 0; text-transform: none;
 .feature:hover .feature-date { color: var(--accent); }
 .feature-title {
   margin: 0;
-  font-size: clamp(1.25rem, 1.05rem + 0.85vw, 1.75rem);
+  font-size: clamp(1.4rem, 1.15rem + 1.35vw, 2.35rem);
   font-weight: var(--w-section); letter-spacing: var(--track-air); line-height: 1.2;
-  color: var(--ink-2); transition: color var(--tr-ink); text-wrap: balance;
+  color: var(--ink-2); transition: color var(--tr-ink);
+  /* balance 가 아니라 pretty 다. balance 는 줄 수를 최소로 맞추려 해서 제목이
+     한 줄에 붙는데, 이 덩이의 무게는 제목이 두 줄로 앉을 때 나온다. */
+  text-wrap: pretty;
 }
 .feature:hover .feature-title { color: var(--ink); }
-.feature-desc { margin: 0; max-width: 38ch; font-size: 0.92rem; color: var(--ink-3); text-wrap: pretty; }
+.feature-desc { margin: 0; max-width: 38ch; font-size: 0.96rem; color: var(--ink-3); text-wrap: pretty; }
+
+/* 글 덩이의 아래 끝. 문(.door)과 같은 물건이다 — 밑줄 그은 마이크로캡스.
+   align-self 가 없으면 flex 열에서 가로로 늘어나 밑줄이 라벨 폭을 가로지른다. */
+.feature-cta {
+  align-self: start;
+  padding-bottom: 0.3rem;
+  font-size: 0.7rem; letter-spacing: 0.22em; text-transform: uppercase;
+  color: var(--ink-3);
+  border-bottom: 1px solid var(--rule-2);
+  transition: color var(--tr-ink), border-color var(--tr-ink);
+}
+.feature:hover .feature-cta { color: var(--ink-2); border-bottom-color: var(--accent); }
 
 /* 좁아지면 그림이 위로 올라간다. 옆으로 두면 두 칸 다 못 쓸 만큼 좁아진다. */
 @media (max-width: 46rem) {
diff --git a/static/fonts/display-kr.woff2 b/static/fonts/display-kr.woff2
Binary files differ.
diff --git a/templates/home.html b/templates/home.html
@@ -27,7 +27,7 @@
     뿐이라 두 곳을 따로 관리하지 않는다. #}
 {%- for s in site.sections %}
 {%- if s.url == home ~ "posts/" and s.pages %}
-<section class="room wrap wrap-ledger">
+<section class="room wrap">
   <div class="room-head"><h2>{{ t("writing") }}</h2></div>
 
   {%- for p in s.pages %}
@@ -52,6 +52,9 @@
       {%- if p.description %}
       <p class="feature-desc">{{ p.description }}</p>
       {%- endif %}
+      {#- 네 번째 줄. 카드가 링크라는 건 커서가 알려 주지만, 글 덩이에 아래 끝이
+          있어야 라벨이 반쪽 안에 떠 있지 않고 앉는다. #}
+      <span class="feature-cta">{{ t("read_post") }}</span>
     </div>
   </a>
   {%- endif %}