-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstyle.css
More file actions
354 lines (326 loc) · 12 KB
/
Copy pathstyle.css
File metadata and controls
354 lines (326 loc) · 12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
/* ============================================================
Filippo Ugolini — shared stylesheet
Display & body: Zilla Slab (body at weight 500)
Labels/nav: JetBrains Mono
Chinese rain: FangSong Rain (subset)
Color: pale ivory paper, deep ink-blue, garnet accent.
============================================================ */
@font-face {
font-family: "FangSong Rain";
font-style: normal; font-weight: 400; font-display: swap;
src: url("/assets/fonts/fangsong-rain-subset.woff2") format("woff2");
}
/* Zilla Slab and JetBrains Mono are self-hosted (woff2 in /assets/fonts). */
@font-face {
font-family: "Zilla Slab";
font-style: normal; font-weight: 500; font-display: swap;
src: url("/assets/fonts/zilla-slab-v12-latin-500.woff2") format("woff2");
}
@font-face {
font-family: "Zilla Slab";
font-style: normal; font-weight: 600; font-display: swap;
src: url("/assets/fonts/zilla-slab-v12-latin-600.woff2") format("woff2");
}
@font-face {
font-family: "Zilla Slab";
font-style: normal; font-weight: 700; font-display: swap;
src: url("/assets/fonts/zilla-slab-v12-latin-700.woff2") format("woff2");
}
@font-face {
font-family: "JetBrains Mono";
font-style: normal; font-weight: 400; font-display: swap;
src: url("/assets/fonts/jetbrains-mono-v24-latin-regular.woff2") format("woff2");
}
@font-face {
font-family: "JetBrains Mono";
font-style: normal; font-weight: 500; font-display: swap;
src: url("/assets/fonts/jetbrains-mono-v24-latin-500.woff2") format("woff2");
}
:root {
--paper: #f7f4ec;
--ink: #15243b;
--ink-soft: #3a4a63;
--garnet: #6e1f23;
--rule: #d9d2c2;
--muted: #6b6359;
--max: 52rem;
}
* { box-sizing: border-box; }
/* Page cross-fade is currently disabled. To re-enable, uncomment the line
below (it must stay at the top level — never inside a media query). */
/* @view-transition { navigation: auto; } */
::view-transition-group(root) { background: var(--paper); }
::view-transition-old(root),
::view-transition-new(root) { animation-duration: 0.7s; }
html { font-size: 19px; }
body {
margin: 0;
background: var(--paper);
color: var(--ink);
font-family: "Zilla Slab", Georgia, serif;
font-weight: 500;
line-height: 1.6;
-webkit-font-smoothing: antialiased;
}
.wrap { max-width: var(--max); margin: 0 auto; padding: 0 1.5rem; }
/* ---------- Header / nav ---------- */
.site-header {
position: relative;
z-index: 1;
min-height: 4.6rem; /* reserve the header's height so injecting it
later via JS doesn't push the page down */
}
.site-header::before {
content: "";
position: absolute; inset: 0; z-index: -1;
background: var(--paper);
-webkit-mask: linear-gradient(to bottom, #000 0, #000 calc(100% - 40px), transparent 100%);
mask: linear-gradient(to bottom, #000 0, #000 calc(100% - 40px), transparent 100%);
}
.site-header .wrap {
display: flex; align-items: baseline; justify-content: space-between;
padding: 1.4rem 1.5rem; flex-wrap: wrap; gap: 0.6rem;
}
.site-name {
font-family: "Zilla Slab", serif; font-weight: 700;
font-size: 1.3rem; letter-spacing: -0.01em;
color: var(--ink); text-decoration: none; border: none;
}
.site-nav {
display: flex; gap: 1.6rem;
font-family: "JetBrains Mono", monospace;
font-size: 0.8rem; letter-spacing: 0.04em; text-transform: lowercase;
}
.site-nav a {
position: relative; color: var(--ink-soft); text-decoration: none;
border: none; padding-bottom: 4px; transition: color .18s;
}
.site-nav a::after {
content: ""; position: absolute; left: 0; bottom: 0;
height: 2px; width: 0; background: var(--garnet);
transition: width .25s ease;
}
.site-nav a:hover { color: var(--ink); }
.site-nav a:hover::after { width: 100%; }
.site-nav a[aria-current="page"] { color: var(--ink); }
.site-nav a[aria-current="page"]::after { width: 100%; background: var(--ink); }
/* ---------- Type scale ---------- */
h1 {
font-family: "Zilla Slab", serif; font-weight: 700;
font-size: clamp(2.2rem, 5vw, 3.1rem); line-height: 1.08;
letter-spacing: -0.015em; margin: 0 0 0.7rem;
}
h2 {
font-family: "Zilla Slab", serif; font-weight: 600;
font-size: 1.55rem; letter-spacing: -0.01em; margin: 2.6rem 0 0.8rem;
}
p { margin: 0 0 1.1rem; }
a {
color: var(--garnet); text-decoration: none;
border-bottom: 1px solid rgba(110,31,35,.35); transition: border-color .18s;
}
a:hover { border-bottom-color: var(--garnet); }
.eyebrow {
font-family: "JetBrains Mono", monospace;
font-size: 0.72rem; letter-spacing: 0.18em; text-transform: uppercase;
color: var(--garnet); margin-bottom: 1.3rem; display: block;
}
main { padding: 0 0 1rem; }
.lead { font-size: 1.2rem; font-weight: 500; }
.muted { color: var(--ink-soft); }
ul.clean { padding-left: 1.1rem; }
ul.clean li { margin-bottom: 0.5rem; }
/* ---------- Content panels floating above the rain ---------- */
/* Single vertical fade only. A second axis would need mask-composite,
which flashes black on Firefox under View Transitions — so we don't. */
.panel { position: relative; padding: 3.4rem 4rem; }
.panel::before {
content: "";
position: absolute;
inset: 0;
z-index: -1;
background: var(--paper);
-webkit-mask: linear-gradient(to bottom, transparent 0, #000 48px, #000 calc(100% - 48px), transparent 100%);
mask: linear-gradient(to bottom, transparent 0, #000 48px, #000 calc(100% - 48px), transparent 100%);
}
/* ---------- HERO ---------- */
.hero { position: relative; }
.page-rain {
position: fixed;
background: transparent;
top: 0; left: 0; right: 0;
width: 100%; height: 100vh;
z-index: -1;
pointer-events: none;
}
.hero-inner {
display: grid;
grid-template-columns: 1fr 220px;
gap: 2.5rem;
align-items: center;
padding-top: 3.5rem; padding-bottom: 3.5rem;
}
.hero-text h1 { color: var(--ink); }
/* Single mono line under the lead: where I am right now. Edited by hand
in index.html — keep it to one sentence's worth of clauses. */
.now {
font-family: "JetBrains Mono", monospace;
font-size: 0.72rem; letter-spacing: 0.04em; line-height: 1.9;
color: var(--muted);
margin: 1.5rem 0 0;
padding-top: 0.9rem;
border-top: 1px solid var(--rule);
}
.hero-photo {
position: relative;
aspect-ratio: 3 / 4;
background: #e7e0d0;
border-radius: 8px;
overflow: hidden;
}
.hero-photo img {
width: 100%; height: 100%; object-fit: cover; display: block;
}
.hero-photo .photo-placeholder {
display: none;
}
.hero-photo.is-empty img { display: none; }
.hero-photo.is-empty .photo-placeholder {
display: flex; align-items: center; justify-content: center;
position: absolute; inset: 0;
font-family: "JetBrains Mono", monospace; font-size: 0.65rem;
letter-spacing: 0.1em; text-transform: uppercase; color: #9a9183;
}
/* ---------- SECTION INDEX ---------- */
.index { margin-top: 1rem; padding-bottom: 1rem; }
.index a.row {
display: block; padding: 1.3rem 0; border-bottom: 1px solid var(--rule);
color: var(--ink); border-bottom-color: var(--rule);
}
.index a.row:first-child { border-top: 1px solid var(--rule); }
.index a.row:hover { background: rgba(21,36,59,.025); }
.index .row-title {
font-family: "Zilla Slab", serif; font-weight: 600; font-size: 1.25rem;
margin-bottom: 0.25rem;
}
.index .row-title .arrow { color: var(--garnet); }
.index .row-desc { color: var(--ink-soft); font-size: 1rem; font-weight: 400; }
/* ---------- SELECTED WORK ---------- */
.works { margin-top: 1rem; }
.work-list { list-style: none; margin: 0; padding: 0; }
.work-list li { margin-bottom: 1.5rem; }
.work-list li:last-child { margin-bottom: 0; }
.work-head {
display: flex; justify-content: space-between; align-items: baseline;
gap: 1rem; flex-wrap: wrap;
}
.work-title {
font-family: "Zilla Slab", serif; font-weight: 600;
font-size: 1.05rem; color: var(--ink);
}
.work-meta {
font-family: "JetBrains Mono", monospace; font-size: 0.72rem;
letter-spacing: 0.03em; color: var(--muted); white-space: nowrap;
}
.work-desc { color: var(--ink-soft); font-size: 0.95rem; margin-top: 0.15rem; }
code, pre { font-family: "JetBrains Mono", monospace; font-size: 0.85em; }
/* ---------- CV page ---------- */
body[data-page="cv"] h2 {
border-bottom: 1px solid var(--rule);
padding-bottom: 0.5rem;
}
.cv-entry { margin-bottom: 1.3rem; }
.cv-entry:last-child { margin-bottom: 0; }
.cv-entry-head {
display: flex; justify-content: space-between; align-items: baseline;
gap: 1rem; flex-wrap: wrap;
}
.cv-role {
font-family: "Zilla Slab", serif; font-weight: 600;
font-size: 1.05rem; color: var(--ink);
}
.cv-date {
font-family: "JetBrains Mono", monospace; font-size: 0.76rem;
letter-spacing: 0.03em; color: var(--muted); white-space: nowrap;
}
.cv-org { color: var(--ink-soft); font-size: 0.95rem; margin-top: 0.15rem; }
.cv-detail { color: var(--ink-soft); font-size: 0.9rem; margin-top: 0.35rem; }
.cv-table {
width: 100%; border-collapse: collapse;
margin: 0.6rem 0 1.6rem; font-size: 0.92rem;
}
.cv-table tr:nth-child(odd) { background: rgba(21,36,59,.04); }
.cv-table th, .cv-table td { padding: 0.6rem 0.9rem; font-weight: 500; }
.cv-table th {
font-family: "Zilla Slab", serif; font-weight: 600;
color: var(--ink); width: 40%; text-align: left;
}
.cv-table td {
font-family: "JetBrains Mono", monospace; font-size: 0.8rem;
letter-spacing: 0.02em; color: var(--ink-soft); text-align: right;
}
/* ---------- FOOTER ---------- */
.site-footer {
position: relative;
z-index: 1;
min-height: 3rem; /* reserve footer height to avoid layout shift */
margin-top: 4rem;
padding: 2rem 0 3rem;
font-family: "JetBrains Mono", monospace;
font-size: 0.78rem; letter-spacing: 0.03em; color: var(--muted);
}
.site-footer::before {
content: "";
position: absolute; inset: 0; z-index: -1;
background: var(--paper);
-webkit-mask: linear-gradient(to top, #000 0, #000 calc(100% - 40px), transparent 100%);
mask: linear-gradient(to top, #000 0, #000 calc(100% - 40px), transparent 100%);
}
.site-footer .wrap { padding: 0 1.5rem; text-align: center; }
.site-footer a { color: var(--muted); border: none; }
.site-footer a:hover { color: var(--ink); }
.copyleft { display: inline-block; }
/* ---------- Inner pages content width ---------- */
main.page-body { padding-top: 3.5rem; }
/* ---------- Responsive ---------- */
@media (max-width: 46rem) {
.hero-inner { grid-template-columns: 1fr; }
.hero-photo { max-width: 200px; }
/* Match .wrap's horizontal padding exactly, so the home page lines up
with the header and every inner page instead of keeping .panel's
desktop-sized 4rem side padding. */
.panel { padding-left: 1.5rem; padding-right: 1.5rem; }
}
@media (max-width: 34rem) {
.site-header .wrap { flex-direction: column; align-items: flex-start; }
}
/* Injected header/footer fade in (set by include.js) */
#site-header, #site-footer { opacity: 0; transition: opacity .22s ease; }
#site-header.ready, #site-footer.ready { opacity: 1; }
/* ---------- Entrance cascade (on page load only) ----------
Direct children of the content column rise gently into place,
one after another. Plays once on load. Duration 0.8s — slower
than the previous 0.6s; delays widened to match. */
@keyframes rise {
from { opacity: 0; transform: translateY(14px); }
to { opacity: 1; transform: translateY(0); }
}
main .wrap > *,
.hero-inner > * {
animation: rise 0.8s cubic-bezier(.22,.61,.36,1) backwards;
}
main .wrap > *:nth-child(1), .hero-inner > *:nth-child(1) { animation-delay: .06s; }
main .wrap > *:nth-child(2), .hero-inner > *:nth-child(2) { animation-delay: .17s; }
main .wrap > *:nth-child(3), .hero-inner > *:nth-child(3) { animation-delay: .28s; }
main .wrap > *:nth-child(4) { animation-delay: .39s; }
main .wrap > *:nth-child(5) { animation-delay: .50s; }
main .wrap > *:nth-child(6) { animation-delay: .61s; }
main .wrap > *:nth-child(7) { animation-delay: .72s; }
main .wrap > *:nth-child(8) { animation-delay: .83s; }
main .wrap > *:nth-child(n+9) { animation-delay: .94s; }
/* ---------- Reduced motion ---------- */
@media (prefers-reduced-motion: reduce) {
* { transition: none !important; }
#site-header, #site-footer { opacity: 1; transition: none; }
main .wrap > *, .hero-inner > * { animation: none; }
}