Merge nucleic/mellow-umber-tapir-3e0n into main
Mirrored from corpo 0d273c8.
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 302 KiB After Width: | Height: | Size: 301 KiB |
+17
-12
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
This card is a portrait of the page it links to, so every value here is lifted
|
This card is a portrait of the page it links to, so every value here is lifted
|
||||||
from src/pages/index.astro rather than invented: the --paper ground, the two
|
from src/pages/index.astro rather than invented: the --paper ground, the two
|
||||||
diagonal green ambient washes, the grain that keeps them from banding, Archivo
|
diagonal green ambient washes, the grain that keeps them from banding, Public Sans
|
||||||
for the statement, JetBrains Mono for the footer, and the 100deg
|
for the statement, JetBrains Mono for the footer, and the 100deg
|
||||||
#cdead9 -> #2f8f5c signature on "future." Change the site's palette or hero and
|
#cdead9 -> #2f8f5c signature on "future." Change the site's palette or hero and
|
||||||
this file has to follow, or the card goes stale again.
|
this file has to follow, or the card goes stale again.
|
||||||
@@ -20,11 +20,10 @@
|
|||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<style>
|
<style>
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Archivo';
|
font-family: 'Public Sans';
|
||||||
src: url('../public/fonts/archivo.woff2') format('woff2');
|
src: url('../public/fonts/public-sans.woff2') format('woff2');
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 100 900;
|
font-weight: 100 900;
|
||||||
font-stretch: 62% 125%;
|
|
||||||
font-display: block;
|
font-display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,7 +54,7 @@
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
background-color: var(--paper);
|
background-color: var(--paper);
|
||||||
color: var(--secondary);
|
color: var(--secondary);
|
||||||
font-family: 'Archivo', sans-serif;
|
font-family: 'Public Sans', sans-serif;
|
||||||
-webkit-font-smoothing: antialiased;
|
-webkit-font-smoothing: antialiased;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -162,12 +161,16 @@
|
|||||||
line-height: 1.05;
|
line-height: 1.05;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* margin-left is the site's optical inset: the R carries a left side bearing,
|
/* margin-left is the site's optical inset: the S carries a left side bearing,
|
||||||
so the box has to hang 0.078em outside the padding for the printed edge of
|
so the box has to hang 0.05em outside the padding for the printed edge of
|
||||||
the headline to land on it. */
|
the headline to land on it. Per glyph, not per font — re-measure with the
|
||||||
|
site's value if the first word of the headline changes.
|
||||||
|
|
||||||
|
The size is 0.95x the Archivo-era 132px for the same reason the site's clamp
|
||||||
|
is: Public Sans prints a taller cap at a given font-size. */
|
||||||
.statement {
|
.statement {
|
||||||
margin-left: -0.078em;
|
margin-left: -0.05em;
|
||||||
font-size: 132px;
|
font-size: 125px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
letter-spacing: -0.03em;
|
letter-spacing: -0.03em;
|
||||||
line-height: 0.98;
|
line-height: 0.98;
|
||||||
@@ -179,9 +182,11 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Line two is locked to line one in em, exactly as on the site, so the
|
/* Line two is locked to line one in em, exactly as on the site, so the
|
||||||
composition holds at whatever size the headline ends up. */
|
composition holds at whatever size the headline ends up. The card has room
|
||||||
|
to spare at 1200px; this tracks the site's value so the two compositions
|
||||||
|
stay the same picture, not because the card needs the slack. */
|
||||||
.statement .line-runs {
|
.statement .line-runs {
|
||||||
margin-left: 2.2em;
|
margin-left: 2.1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.statement .that {
|
.statement .that {
|
||||||
|
|||||||
@@ -45,10 +45,11 @@ const problems = await page.evaluate(() => {
|
|||||||
const height = 630;
|
const height = 630;
|
||||||
|
|
||||||
// The statement hangs its box outside the padding by a deliberate optical inset,
|
// The statement hangs its box outside the padding by a deliberate optical inset,
|
||||||
// so the R's printed edge — not its box — lands on the padding. That slack is a
|
// so the S's printed edge — not its box — lands on the padding. That slack is a
|
||||||
// CONSTANT on purpose: reading it back off the element under test would let any
|
// CONSTANT on purpose: reading it back off the element under test would let any
|
||||||
// margin-left, however wrong, widen the very bound meant to catch it.
|
// margin-left, however wrong, widen the very bound meant to catch it. 0.05em at
|
||||||
const opticalSlack = 12;
|
// 125px is 6.25px; the 2px over that is rounding room, not licence to drift.
|
||||||
|
const opticalSlack = 8;
|
||||||
|
|
||||||
const found = [];
|
const found = [];
|
||||||
const label = (element) => element.className || element.tagName;
|
const label = (element) => element.className || element.tagName;
|
||||||
|
|||||||
+12
-8
@@ -16,7 +16,7 @@ const description = 'The page you requested does not exist.';
|
|||||||
<link rel="icon" href="/blakeslee-icon.svg" type="image/svg+xml" sizes="any" />
|
<link rel="icon" href="/blakeslee-icon.svg" type="image/svg+xml" sizes="any" />
|
||||||
<link
|
<link
|
||||||
rel="preload"
|
rel="preload"
|
||||||
href="/fonts/archivo.woff2"
|
href="/fonts/public-sans.woff2"
|
||||||
as="font"
|
as="font"
|
||||||
type="font/woff2"
|
type="font/woff2"
|
||||||
crossorigin
|
crossorigin
|
||||||
@@ -34,12 +34,13 @@ const description = 'The page you requested does not exist.';
|
|||||||
</html>
|
</html>
|
||||||
|
|
||||||
<style is:global>
|
<style is:global>
|
||||||
|
/* Keep this in step with index.astro: each page declares its own face, so a swap
|
||||||
|
that misses this file leaves 404 silently rendering in system-ui. */
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Archivo';
|
font-family: 'Public Sans';
|
||||||
src: url('/fonts/archivo.woff2') format('woff2');
|
src: url('/fonts/public-sans.woff2') format('woff2');
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 100 900;
|
font-weight: 100 900;
|
||||||
font-stretch: 62% 125%;
|
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,7 +79,7 @@ const description = 'The page you requested does not exist.';
|
|||||||
min-height: 100svh;
|
min-height: 100svh;
|
||||||
color: var(--ink);
|
color: var(--ink);
|
||||||
background-color: var(--paper);
|
background-color: var(--paper);
|
||||||
font-family: 'Archivo', system-ui, sans-serif;
|
font-family: 'Public Sans', system-ui, sans-serif;
|
||||||
-webkit-font-smoothing: antialiased;
|
-webkit-font-smoothing: antialiased;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -109,9 +110,12 @@ const description = 'The page you requested does not exist.';
|
|||||||
|
|
||||||
.code {
|
.code {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
font-size: clamp(4rem, 18vw, 10rem);
|
/* 0.95x the Archivo-era clamp (4rem/18vw/10rem), matching the homepage headline:
|
||||||
font-weight: 700;
|
Public Sans prints a taller cap at the same font-size. The 115% font-stretch
|
||||||
font-stretch: 115%;
|
that used to widen this numeral is gone with Archivo's wdth axis — weight 800
|
||||||
|
gives the figure back the presence the extra width was carrying. */
|
||||||
|
font-size: clamp(3.8rem, 17.1vw, 9.5rem);
|
||||||
|
font-weight: 800;
|
||||||
letter-spacing: -0.02em;
|
letter-spacing: -0.02em;
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
}
|
}
|
||||||
|
|||||||
+65
-23
@@ -35,7 +35,7 @@ const socialImage = new URL('/og.png?v=3', Astro.site);
|
|||||||
<link rel="icon" href="/blakeslee-icon.svg" type="image/svg+xml" sizes="any" />
|
<link rel="icon" href="/blakeslee-icon.svg" type="image/svg+xml" sizes="any" />
|
||||||
<link
|
<link
|
||||||
rel="preload"
|
rel="preload"
|
||||||
href="/fonts/archivo.woff2"
|
href="/fonts/public-sans.woff2"
|
||||||
as="font"
|
as="font"
|
||||||
type="font/woff2"
|
type="font/woff2"
|
||||||
crossorigin
|
crossorigin
|
||||||
@@ -212,12 +212,13 @@ const socialImage = new URL('/og.png?v=3', Astro.site);
|
|||||||
</html>
|
</html>
|
||||||
|
|
||||||
<style is:global>
|
<style is:global>
|
||||||
|
/* No wdth axis, unlike the Archivo this replaced — Public Sans ships weight only.
|
||||||
|
Any font-stretch declaration is therefore inert here, so there are none left. */
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Archivo';
|
font-family: 'Public Sans';
|
||||||
src: url('/fonts/archivo.woff2') format('woff2');
|
src: url('/fonts/public-sans.woff2') format('woff2');
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 100 900;
|
font-weight: 100 900;
|
||||||
font-stretch: 62% 125%;
|
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -275,7 +276,7 @@ const socialImage = new URL('/og.png?v=3', Astro.site);
|
|||||||
order — body's background first, then its negative-z children above it. */
|
order — body's background first, then its negative-z children above it. */
|
||||||
isolation: isolate;
|
isolation: isolate;
|
||||||
background-color: var(--paper);
|
background-color: var(--paper);
|
||||||
font-family: 'Archivo', system-ui, sans-serif;
|
font-family: 'Public Sans', system-ui, sans-serif;
|
||||||
-webkit-font-smoothing: antialiased;
|
-webkit-font-smoothing: antialiased;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -513,8 +514,21 @@ const socialImage = new URL('/og.png?v=3', Astro.site);
|
|||||||
}
|
}
|
||||||
|
|
||||||
main {
|
main {
|
||||||
|
/* overflow-y: auto computes overflow-x to auto as well, so this scroller clips
|
||||||
|
horizontally at its own padding box — and the headline deliberately hangs left
|
||||||
|
of that edge by --optical-inset, plus another 0.045em at the far end of the
|
||||||
|
drift. That hang was getting shaved off flat (the "S" of "Solving" lost 4px of
|
||||||
|
its bowls). Padding moves the clip edge outward and the equal negative margin
|
||||||
|
puts the content box back where it was, so the layout is untouched and only the
|
||||||
|
clip moves. Comfortably more than the ~0.05em of hang at the largest headline,
|
||||||
|
and comfortably less than --edge, so the slack always lands inside the shell's
|
||||||
|
own inset rather than off the window. */
|
||||||
|
--clip-slack: 0.75rem;
|
||||||
|
|
||||||
display: grid;
|
display: grid;
|
||||||
min-height: 0;
|
min-height: 0;
|
||||||
|
margin-inline: calc(-1 * var(--clip-slack));
|
||||||
|
padding-inline: var(--clip-slack);
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
/* none, not contain: contain only stops the gesture chaining to the document, it
|
/* none, not contain: contain only stops the gesture chaining to the document, it
|
||||||
leaves this scroller its own rubber-band. Overscrolling past the top drags the
|
leaves this scroller its own rubber-band. Overscrolling past the top drags the
|
||||||
@@ -629,18 +643,26 @@ const socialImage = new URL('/og.png?v=3', Astro.site);
|
|||||||
}
|
}
|
||||||
|
|
||||||
.statement {
|
.statement {
|
||||||
/* Optical, not metric: the R carries a left side bearing, so a box that starts on
|
/* Optical, not metric: the S carries a left side bearing, so a box that starts on
|
||||||
the grid line prints ~0.078em to the right of it. The mission copy below opens
|
the grid line prints ~0.054em to the right of it. The mission copy below opens
|
||||||
on a W, whose diagonal reaches the origin with no bearing at all, so the two
|
on a W whose bearing is a tenth of that at its much smaller size, so the two
|
||||||
only look aligned once the headline is pulled back by that much. Measured off
|
only look aligned once the headline is pulled back by the difference. Kept in em
|
||||||
rendered pixels, not the font metrics, and kept in em so it holds across the
|
so it holds across the whole font-size clamp.
|
||||||
whole font-size clamp. */
|
|
||||||
--optical-inset: 0.078em;
|
THIS VALUE IS PER GLYPH, NOT PER FONT. It was 0.078em while line one opened on
|
||||||
|
an R (bearing 0.076em); reusing that figure for the S over-pulled the headline
|
||||||
|
by 4px and the scroller clipped the bowls flat. Re-measure whenever the first
|
||||||
|
word of the headline changes. */
|
||||||
|
--optical-inset: 0.05em;
|
||||||
|
|
||||||
display: grid;
|
display: grid;
|
||||||
justify-items: start;
|
justify-items: start;
|
||||||
margin: 0 0 0 calc(-1 * var(--optical-inset));
|
margin: 0 0 0 calc(-1 * var(--optical-inset));
|
||||||
font-size: clamp(3.2rem, min(9vw, 18vh), 8.25rem);
|
/* 0.95x the Archivo-era clamp (3.2/9vw/18vh/8.25rem). Public Sans sets a cap
|
||||||
|
height of 0.723em against Archivo's 0.686em, so the same font-size would print
|
||||||
|
a 5% larger headline and invalidate the wrap thresholds and the 2.2em indent
|
||||||
|
below. Scaling the clamp keeps the printed composition where it was tuned. */
|
||||||
|
font-size: clamp(3.04rem, min(8.55vw, 17.1vh), 7.84rem);
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
letter-spacing: -0.03em;
|
letter-spacing: -0.03em;
|
||||||
line-height: 0.98;
|
line-height: 0.98;
|
||||||
@@ -668,8 +690,21 @@ const socialImage = new URL('/og.png?v=3', Astro.site);
|
|||||||
animation-delay: 320ms;
|
animation-delay: 320ms;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* The indent is in em of the headline, so it holds at every step of the clamp —
|
||||||
|
but it is also what line two has to pay for out of the same column, and it was
|
||||||
|
set at the edge of what that column can afford. Sweeping the indent against the
|
||||||
|
rendered row count, the largest that still keeps "the future." on one row was
|
||||||
|
2.20-2.24em between 1000px and 1440px under the Archivo this replaced: 2.2em
|
||||||
|
had, at 1440x900, exactly zero slack. Public Sans sets that lowercase ~2.5%
|
||||||
|
wider at the same printed cap height, which moved the ceiling to 2.19em and
|
||||||
|
dropped the phrase onto two rows at 1100 and 1280.
|
||||||
|
|
||||||
|
2.1em is the same composition a hair tighter, with ~0.09em (about 10px at a
|
||||||
|
1280px viewport) of real headroom at the narrowest point instead of a rounding
|
||||||
|
error. Sweep it again — the ceiling, not just the current line count — before
|
||||||
|
changing the headline copy or the face. */
|
||||||
.line-runs {
|
.line-runs {
|
||||||
margin-left: 2.2em;
|
margin-left: 2.1em;
|
||||||
animation-delay: 480ms;
|
animation-delay: 480ms;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -695,10 +730,10 @@ const socialImage = new URL('/og.png?v=3', Astro.site);
|
|||||||
animation: drift-right 12s 1.35s ease-in-out backwards;
|
animation: drift-right 12s 1.35s ease-in-out backwards;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Deliberately wrappable. There is ~5% of slack between "that runs." and the card
|
/* Deliberately wrappable, so "the future." breaking in two is a graceful failure
|
||||||
at every width, so the pair only ever separates when the type has been scaled
|
rather than type running under the card. It is not meant to happen at a plain
|
||||||
past what the column can hold — at which point two short lines inside the
|
desktop width, though — that is the indent above being overspent, not this rule
|
||||||
column beat one long line across the card.
|
working. Check the indent's measured ceiling before accepting a break here.
|
||||||
|
|
||||||
The resting offset is a 2D translate, and there used to be a ::after here that
|
The resting offset is a 2D translate, and there used to be a ::after here that
|
||||||
swept a light across the phrase by laying a second -webkit-background-clip: text
|
swept a light across the phrase by laying a second -webkit-background-clip: text
|
||||||
@@ -726,7 +761,14 @@ const socialImage = new URL('/og.png?v=3', Astro.site);
|
|||||||
}
|
}
|
||||||
|
|
||||||
.mission {
|
.mission {
|
||||||
max-width: 29rem;
|
/* Two lines, always — the mission is a couplet and a third line breaks the
|
||||||
|
balance against the headline beside it. Public Sans sets ~4.7% wider than the
|
||||||
|
Archivo this replaced, which pushed the second break past the old 29rem by a
|
||||||
|
single pixel: the two-line window at the top of the font-size clamp is
|
||||||
|
465-894px, and 29rem is 464. 30.5rem clears the floor by ~23px, about a word
|
||||||
|
and a half of headroom, without approaching the far edge. Re-measure this
|
||||||
|
window, not just the line count, if the copy or the face changes. */
|
||||||
|
max-width: 30.5rem;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
color: var(--secondary);
|
color: var(--secondary);
|
||||||
font-size: clamp(0.95rem, 1.25vw, 1.14rem);
|
font-size: clamp(0.95rem, 1.25vw, 1.14rem);
|
||||||
@@ -1121,7 +1163,7 @@ const socialImage = new URL('/og.png?v=3', Astro.site);
|
|||||||
}
|
}
|
||||||
|
|
||||||
.statement {
|
.statement {
|
||||||
font-size: clamp(2.9rem, 14vw, 5.5rem);
|
font-size: clamp(2.76rem, 13.3vw, 5.23rem);
|
||||||
}
|
}
|
||||||
|
|
||||||
.line-runs {
|
.line-runs {
|
||||||
@@ -1224,7 +1266,7 @@ const socialImage = new URL('/og.png?v=3', Astro.site);
|
|||||||
}
|
}
|
||||||
|
|
||||||
.statement {
|
.statement {
|
||||||
font-size: clamp(2.5rem, 13.5vw, 4.2rem);
|
font-size: clamp(2.38rem, 12.83vw, 3.99rem);
|
||||||
letter-spacing: -0.025em;
|
letter-spacing: -0.025em;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1242,7 +1284,7 @@ const socialImage = new URL('/og.png?v=3', Astro.site);
|
|||||||
}
|
}
|
||||||
|
|
||||||
.statement {
|
.statement {
|
||||||
font-size: clamp(2.25rem, min(9vw, 15vh), 8.25rem);
|
font-size: clamp(2.14rem, min(8.55vw, 14.25vh), 7.84rem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1265,7 +1307,7 @@ const socialImage = new URL('/og.png?v=3', Astro.site);
|
|||||||
the phone size at 721px and approaches the normal desktop size at 1000px. */
|
the phone size at 721px and approaches the normal desktop size at 1000px. */
|
||||||
@media (min-width: 721px) and (max-width: 999px) {
|
@media (min-width: 721px) and (max-width: 999px) {
|
||||||
.statement {
|
.statement {
|
||||||
font-size: clamp(3.2rem, calc(12.5vw - 2.4rem), 5.45rem);
|
font-size: clamp(3.04rem, calc(11.88vw - 2.28rem), 5.18rem);
|
||||||
}
|
}
|
||||||
|
|
||||||
.technology-stack {
|
.technology-stack {
|
||||||
|
|||||||
Reference in New Issue
Block a user