The theme that shipped in the first cut was quiet to a fault: outside
the hero, its pages fell back to ruled prose. This revision gives the
theme a constructive vocabulary and tightens the site integration
around it.
Theme (grid.md, rewritten):
- A marks kit: period square, 3px bar, register crosshair, quarter-disc,
stepped bars, dot module, border arrows, 45-degree diagonal, and giant
cropped numerals, all locked to the column tracks.
- The plate: at most one full-bleed flooded band per page as the poster
moment, rails continuing across it.
- A signal-ink axis: one ink per page, signal red (default), ultramarine,
or surface-only signal yellow; two pages in a run never share the ink.
- Section-object law: a band that is only prose has failed the theme.
- Asymmetric occupancy (prose capped at 6 of 12 columns) and structural
whitespace; grid-snapped hover geometry and an optional ticker.
Site:
- grid-01 example replaced with signal, a Basel poster festival page
built on the revised theme; thumb regenerated at the 1400-wide
full-page convention (the first cut shipped a 1600x1000 viewport crop
that broke the hover scroll).
- Grid tokens: serif slot resolves to the grotesk (the theme has no
serif), doubled comment opener fixed, description updated.
- Landing: grid headings follow the theme's lowercase display voice;
hero copy updated to the signal-ink language.
- main.js: grid added to THEME_GENRES (missing in the first cut).
Consistency sweep the first cut missed:
- custom-theme.md catalog lists still said 20 themes; now 21 with Grid.
- components.css banner comment still said 20 themes.
Swiss neo-grotesque systems design: a near-white cool sheet with the
twelve-column hairline grid painted behind the content rather than implied,
one heavy Archivo run lowercase and slammed left, and exactly one signal red
used as a geometric mark. It fills the editorial cluster's neo-grotesque slot,
which until now was serif-led on every one of its members.
Skill side: the theme spec, and the catalog count from twenty to twenty-one in
the four places SKILL.md states it.
Site side: the token block, the switcher entry, the twenty-first dropdown dot,
Archivo added to the font load, the Buro Grid example page with its thumbnail,
and an entry in the theme contact sheet.
Not added to scroll-demos.json on purpose. Grid's motion is near-zero by
design, no reveals and no parallax, so a scroll recording would be an empty
file advertising something the theme refuses to do.
README carries the new count only, no new section.
Swapped in the new Open Graph image (2400x1260), keeping the OG-hallmark.png
filename so the meta tags, the README banner, and the deployed URL all stay
valid; updated the height meta to match.
Refreshed the "Different briefs, different shapes" gallery to the worked
examples we actually ship now: the four new themes (Bubble, Distil, Cold Snap,
Cinder), the Custom and newly generated pages (Mend Assembly, Hollowback Apiary,
Off-Register, Press Quaternary), and four originals (Tally, Wayfare, NAJM,
Hyperlane). Dropped the retired examples, reworded the intro, and added eight
new hero shots.
Theme picker: Hum is now theme 01, with the rest renumbered 02-20. The ordinal
reads off the registry index, so switching, cycling, and the "NN / 20" readout
all stay correct.
Theme numbers: each picker swatch now carries an explicit number colour that
contrasts with its own background, instead of inheriting the active theme's ink.
Dark swatches (Midnight, Terminal, Manifesto, Aurora, Lumen) get a light number
rather than a near-invisible dark one. All twenty clear AA (min 10:1).
Worked Examples: moved the first three carousel cards (Cobalt, Carnival, Lumen)
to the end so the page leads with Hum.
Bumped the asset cache-bust.
Carnival: fixed the three palette drops whose second accent failed contrast,
tightened the display tracking, and added section-rhythm, alignment, and
drop-selection guidance so the theme lands well-aligned and readable by
default. Lightened and tightened the Carnival headers on the landing.
Anti-slop guards (skill references): heading-to-body alignment coherence as a
principle rather than a rigid rule; centered overlays and command palettes must
center via their container; and a hero headline is never only a number, a lead
figure always pairs with words.
Worked Examples: added three generated pages to the landing carousel, a
small-batch honey farm, a risograph print fair, and an experimental type
studio, after fixing their nav centering and section alignment.
Media: removed the Soroe example card along with the unused scroll-videos,
poster stills, and orphaned thumbnails it left behind, and bumped the asset
cache-bust so the restyled CSS reloads.
Replace the carousel's inconsistent scroll-videos with one CSS image hover-scroll
across all twelve cards. Each thumb is a tall full-page screenshot that pans top
to bottom on hover, with a per-card duration scaled to page height so they all
move at the same brisk, readable pace; captured Retina-sharp at 1400px wide.
Touch and reduced-motion get a static crop. Drop the Slow Pour card.
Bump the version to v1.1 on the landing (banner + footer), package.json, SKILL.md,
and the preview-block examples.
Give the five image cards (the four new themes and the Mend Assembly) a
hover-scroll: each thumb is now a tall full-page screenshot, and CSS pans
object-position top to bottom on hover so the page scrolls itself. No video,
no JS, GPU-light; touch and reduced-motion get a static top crop. Cache-bust
the regenerated thumbs.
Trim the README Custom section to the single Mend Assembly feature (matching
the landing) and de-dash the whole README. Fix three pre-existing dead doc
links in the component cookbook (floating-nav, custom-craft, hero-enrichment
were linked without the ../ that reaches the references root).
Swap the Hum carousel card from Sprout (hum-02) to Bubble (hum-07), the
guided sourdough Narrative Workflow build. Keep only one custom example in
the showcase, the Mend Assembly repair-cafe poster; the other bespoke pages
stay in the repo but off the landing. Untrack hum-02 so only featured builds
ship, refresh the scroll-demos manifest, and bump the cache version.
Merge the clear duplicates (gradient text into the gradient gate, macrostructure-
repeat into the structural-fingerprint gate, the overflow-x:clip mandate into the
horizontal-scroll gate, emoji-icon into the icon-libraries gate), collapse the five
contrast gates to two, the five input-state gates to one, and the four hero gates to
two. No coverage lost. Renumber 1–57 and update every gate-number and gate-total
reference across SKILL.md, the reference docs, the landing copy, and the example builds.
Adds Carnival, Lumen, Hum, and Cobalt to the catalogue (now 20 themes),
each with its own tokens block, hero archetype, landing copy, and spec doc.
Introduces Custom as a first-class route: when a brief carries real
creative intent, Hallmark designs the whole page from first principles —
palette, type, and structure — rather than recolouring a catalogue theme.
Ships five worked custom examples and a README section.
Rewrites the per-theme landing copy and reconciles every catalogue count
across the site and the skill (20 themes · 21 macrostructures · 50
component archetypes · 70 slop-test gates). Drops the last competitor
references from the CSS comments, fixes the genre rosters, and ignores
the local example explorations so only the featured builds ship.
Codex enforces a 1024-char cap on the frontmatter description; ours was 1813,
causing "invalid description: exceeds maximum length of 1024 characters" on
load. Rewrote to 927 chars, lossless on routing signals — all five fire
triggers, all three don't-fire conditions, and the decisive heuristic are
preserved. Stripped duplicate verb listings, parenthetical examples on each
trigger, and padding prose.
README + site install panes now document `~/.codex/skills/hallmark/` (personal)
and `.codex/skills/hallmark/` (project-scoped) for Codex, replacing the prior
"manual / git clone" placeholder.
- docs/screenshots/hero-*.jpg: 8 fresh hero-only captures of each worked example (1440×900 via Chrome headless on the local dev server). Replaces the mid-video stills in _tests/_thumbs/*-still.jpg which had video-player overlay and cropped headlines. Each is unique — no duplicates. README "Different briefs, different shapes" section now uses these and each thumbnail is a clickable link to the live deployed example.
- site/index.html: the Study verb's brief-pill swapped from "/hallmark study this landing page" to "/hallmark study together.ai · or paste a screenshot" so URL mode is visually concrete next to the lede that already names both modes. One-line change.
- ROADMAP.md: new "Now — actively working on" section at the top. N.1 covers tightening the existing 22 themes + adding 4–6 new distinct ones + lowering the bar to route to custom. N.2 covers first-class Nanobanana image generation + a new image-led theme (working title: Plate) + token discipline for generated stills.
Each .ex-card div is now an <a target="_blank" rel="noopener"> wrapping the same content. The hover-play video, prompt line, and .ex-card styles all work unchanged (the class already had color: inherit + focus-visible). Added one CSS line — text-decoration: none on .ex-card — so the <a> doesn't underline the card.
Linked destinations:
- examples/tally/ — SaaS, modern-minimal (from /Users/youssef/test-hallmark-9)
- examples/wayfare/ — travel booking, atmospheric (from test-hallmark-12)
- _tests/09-slow-pour/ — small-batch coffee subscription (already in site)
- examples/bananastudio/ — creative studio with playful motion (from test-hallmark-6)
- _tests/06-anya-portfolio/ — software architect personal site (already in site)
- examples/najm/ — Moroccan fashion (from test-hallmark-7)
- _tests/11-soroe-ceramics/ — small ceramics studio (already in site)
- examples/hyperlane/ — developer infrastructure (from test-hallmark-15)
site/examples/ adds ~308 KB total across the 5 copied projects. The other 3 already live under site/_tests/ so no copying needed for them.
After a study diagnosis, the user can now say "lock the DNA" to write
a portable design.md from the extracted DNA — same format as the
default verb's lock-the-system flow, seeded from the studied source.
URL mode populates exact tokens + fonts; image mode populates
estimated bands + candidate fonts. URL-mode emission asks the user
to attest the source is theirs or a public reference for their own
brand — third-party URLs are refused at the emission step even when
the diagnosis itself was allowed. Image mode emits without asking.
Updates skill protocol, design-md trigger list, public verb table,
README comparison, and the site's Study row.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Banner Install hover-stick:
- Smooth-scroll on a sticky banner can leave the cursor over the
pill after click; Safari/Chrome occasionally keep :hover stuck
even after the pointer moves away.
- Scope the hover rule to (hover: hover) and (pointer: fine) so a
touch tap never sticks the inverted state.
- Add :focus:not(:focus-visible) reset so synthesised mouse-focus
doesn't keep the inverted look either.
- Add a JS click handler that blur()s the pill and toggles
pointer-events for one frame, forcing the browser to release any
sticky :hover/:focus state.
Atelier hero header:
- Quote copy: "Restraint, repeated, becomes a signature." → "A
workshop, not a template." Shorter, declarative, fits Atelier's
workshop voice.
- Override the hero quote to use the upright display face
(var(--font-display), normal style, --display-weight 900),
matching the "Atelier" wordmark in the banner and every section
title. Italic var(--font-serif) was making the header read as a
pull-quote rather than the page's primary statement; Atelier's
voice is declarative, not quoted.
With / Without rename:
- Section 06 label "Before / After" → "With / Without". Both panels
exist now (Sonnet 4.6 alone vs Sonnet 4.6 + Hallmark) — there is
no temporal before/after, only a presence/absence comparison.
- HTML comment updated to match.
Diptych screenshot centring:
- .ba__frame img object-position: top left → center. The full hero
composition reads inside the 16:10 frame instead of clipping to
the top-left corner. Other diptychs (.diptych__half, .brief-output)
intentionally stay top-aligned — they're page screenshots where
the masthead matters; the .ba__frame is hero-only.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The shared prompt in the Before/After Hallmark gallery used the old
Quiet Hour natural-wine brief — stale now that the before/after
thumbs were swapped to the DevForge dev-conference landing pages.
Updated the prompt to match the new content.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Hero install copy button:
- On coarse-pointer (touch) devices the copy button sits visible at
all times. With its absolute right-aligned position it overlapped
the npx command text on narrow viewports — most visible on
Specimen but applied to every theme using .code.
- Below 45rem, drop the absolute positioning and let the button flow
as a full-width row beneath the command (GitHub / Vercel / npmjs
pattern). The command keeps its horizontal scroll for long URLs.
Banner GitHub star spacing on mobile:
- The star uses a negative inline-start margin (-0.75rem) tuned for
the install/star pair on desktop. On mobile the install link is
hidden, so that same margin pulls the star too close to the
wordmark.
- Below 50rem, loosen the start margin to -0.25rem (+8 px breathing
room from the wordmark, matching the requested gap).
Specimen eyebrow:
- Drop " · Powered by Together AI" from the Specimen hero eyebrow
copy. The Together AI credit lives in the footer; repeating it in
the hero made the lede read like a sponsorship banner.
Footer bottom spacing:
- .page added padding-block-end: var(--space-4xl) (10 rem ≈ 160 px),
and .foot--colophon added another --space-2xl (4 rem ≈ 64 px) of
internal bottom padding. Combined ≈ 224 px of empty space below
"Made by Together AI" on every theme.
- Drop the page-wrapper bottom padding to 0 — the colophon owns its
own end-spacing.
- Cap the colophon's own bottom padding at --space-md (16 px) on
desktop and mobile. The credit line now hugs ≤ 20 px from the
viewport bottom.
Stale stats in footer (caught while in there):
- 23 themes → 22 (Pastel removed earlier).
- 60 slop-test gates → 65 (caught up to slop-test.md's actual count).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Repo handover prep. Replaces:
- github.com/Luffixos/hallmark → github.com/nutlope/hallmark
(banner star link, footer link, JS REPO constant for star count)
- npx skills add hallmark → npx skills add nutlope/hallmark
(README install section, four install panes in site/index.html)
No skill internals touched — SKILL.md and references/ unchanged.
The local installed skill at ~/.claude/skills/hallmark/ continues
to work; the URL change is content-only.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Slack and most OG scrapers silently drop relative og:image paths.
Switched og:image + twitter:image to the deployed absolute URL,
added og:url, og:site_name, image:type/width/height, and a secure_url
twin so every scraper has what it needs to render a large-image card.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
· Examples-rail order: SaaS → wayfare → slow-pour → BananaStudio (moved
from 1st to 4th) → tracejam → anya-loop video (was static) → Najm-loop
(was Foundry static) → Soroe-loop (was Cohort static). Five videos +
three statics now. Five MP4s re-encoded to web (CRF 23–27, +faststart,
no audio).
· Audit demo: swapped the gradient slop placeholder for the new
audit-example.png. Caption removed (no longer reads as "actual slop").
· Redesign uractivation video: dropped data-hover-play so it autoplays
on every device (was hover-only on desktop).
· Footer: "Powered by" → "Made by" (re: the Together AI credit). Base
credit line now left-aligned across all viewports.
· Section labels: forced single-column section heads in every theme via
`.section__head, [data-theme] .section__head { grid-template-columns:
1fr !important }`. Linen + Almanac left-gutter overrides removed —
every section reads label-above-title now.
· Section pulls: deleted every `<a class="section__pull">` ("See the
verbs", "Read the rules", etc.) plus 67 lines of associated CSS. The
banner already provides Install + GitHub; no per-section nav needed.
· Per-theme demo captions ("Lap 1", "Plate I", "Frame 01", etc.)
removed — they appeared in the wrong section ("Lap 1" showed under
Study) and added clutter.
· Display max font sizes tightened across every theme token. Largest
caps were 13rem (Manifesto Anton) → 9rem; multiple 7.5–8rem caps
pulled down to 6.25–6.5rem. Skill-side typography.md now emits
`clamp(2.75rem, 5vw + 1rem, 5.25rem)` as the default --text-display.
· New section: Before / After Hallmark, after Foundations.
Same prompt ("/hallmark build a landing page for The Quiet Hour — a
weekly natural-wine dispatch from Lisbon") run two ways:
- Sonnet 4.6 alone → gradient AI slop (before-quiet-hour.png)
- Sonnet 4.6 + Hallmark → editorial dispatch (after-quiet-hour.png)
Hairline-framed panels with mono prompt at top, italic-serif captions.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
· Examples cards: dropped 01–08 numbers, dropped Banana Studio / Modern SaaS /
etc. titles + subheaders, dropped the 5-row hover trail popover. Each card
now shows a single mono line: "$ /hallmark build <prompt>". Removed the
"Open any card →" hint from the section intro.
· Replaced cards 03 (Maple) + 04 (Meridian) with the new wayfare-loop.mp4
+ slow-pour-loop.mp4 videos. Re-encoded all four MP4s for web (CRF 23,
+faststart, no audio). wayfare downscaled from 4K to 1080p (9.3 MB → 2 MB).
· Audit demo: swapped the inline CSS gradient slop card for a static
audit-slop.png (1024×640 capture of the same card). Cleaner DOM, same
visual. Caption "Specimen — actual AI slop, untouched" stays.
· Redesign demo: before = example-redesign-uractivation.png, after =
uractivation-after-loop.mp4 (looped video). Diptych CSS extended to
style <video> identically to <img>.
· Hover-play behaviour: videos with data-hover-play start paused on
hover-capable devices (desktop) and only play while hovered/focused.
On touch devices (no hover), the autoplay attribute keeps them
looping continuously — pages read as moving showcases on mobile.
· Specimen: section-pull CTAs ("Read the rules", "See named tells")
now flush left like every other CTA on that theme. Override only on
[data-theme="specimen"]; other themes keep right-aligned pulls.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
· Footer: stripped Ft1–Ft4 archetypes (.foot--masthead, .foot--inline,
.foot--index, .foot--dense) + their helper classes (.foot__tagline,
.foot__links, .foot__powered, .foot__col-head, .foot__wordmark-small,
.foot__sep, .foot__credits) — every theme uses .foot--colophon now.
· Hero: dropped H6 Photographic, H7 Clipped, H8 Specimen archetype
blocks (404 lines of CSS) plus per-theme overrides on .hero__photo,
.hero__photo-grid, .hero__mock, .hero--clipped — no theme references
any of these archetypes after the recent reroutes.
· Templates: removed `<template id="section-04-archive-without-with">`,
`<template id="section-05-archive-foundations-tabs">` (revertibility
archives — superseded), and the three dead hero templates.
· Local fonts: deleted site/fonts/the-future-*.woff2 (8 files) and the
empty site/fonts/ directory. Geist + Geist Mono cover all type roles.
· Media: dropped the unprocessed BananaStudio-example.mp4, Podcast-example.mp4,
SaaS-example.mp4 — only the -loop.mp4 versions are referenced.
· main.js: removed buildDenseColophon() helper (dense colophon never
rendered after the unified footer rework).
Total: ~930 lines removed. No visual regression.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
· Footer rewritten as an editorial colophon: massive Hallmark wordmark
on a baseline-aligned masthead row + 3-column meta grid (Currently In /
In the Catalog / Read or take a copy) + centered powered-by line.
Generous whitespace, hairline-divided stat rows, theme-aware via tokens.
Specificity bumped (.foot.foot--colophon) so the new grid layout beats
the legacy .foot { grid-template-columns: 1fr auto } from sections.css.
· Reverted hero moments per request: dropped the SPECIMEN ℋ glyph,
Garden leaf, Linen woven dot grid, Salon fleuron, Almanac date stamp,
and the Coral solid accent block + Violet alternating section tint.
· Brutal hero archetype: photographic → marquee. Removed the 6-image
gallery + the related photo-grid CSS overrides.
· Bloom hero: centered (text-align + margin-inline auto on display/lede,
justify-self center on CTA). Other Bloom sections stay left-aligned.
· Examples cards: <a href> → <div>, dropped the "Open ↗" labels +
ex-card__open CSS, removed hover-transform/scale rules. Cards are now
visual-only — the trail popover still appears on hover but no click.
· Theme dropdown: 22px colored squares replaced with 34px tiles that
show the theme's # in mono inside, theme accent stripe along bottom.
Re-ordered to match the THEMES object order (specimen=01,
midnight=02, brutal=03, … editorial=23) so the indicator's "N / 23"
matches the dropdown position.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
· Removed the 4 .skill-row__num spans (I/II/III/IV) from index.html.
· Collapsed .skill-row__head from 4rem 1fr two-column grid to single
column — section labels, verb headings, and body content all hang
from the same left content edge now.
· Dropped the 4rem padding-inline-start from .skill-row__body and
.skill-row__body--full so demo content aligns with the verb title
above it (was previously indented to clear the numeral gutter).
· Removed the .skill-row__num base + per-theme override blocks from
sections.css since the markup no longer exists.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
· Audit slop card now wears a "Specimen — actual AI slop, untouched"
caption above it (mono caps, theme-coloured) so the gradient reads as
a quoted artifact, not a card competing with the page.
· Dark / charged themes (midnight, manifesto, halo, aurora, riso, terminal,
brutal) tint the slop card via filter saturate(0.55) brightness(0.82).
The card still reads as AI slop — purpose retained — but no longer wins
the visual contest.
· .brief-output now responds to theme. Hard-edge group (brutal/manifesto/
terminal/newsprint/editorial) → 0 radius, heavier border. Slight-radius
(sport/almanac/garden/halo/violet/studio) → 4–6px. Soft-card (quiet/
coral/aurora/pastel/plume/bloom) → 8–14px with optional accent shadow.
Riso → duotone 3px-offset accent shadow. Midnight → inset glow ring.
Halo → amber glow halo. Aurora → accent glow.
· Editorial-register themes (atelier, salon, almanac, studio, sport) get
a small label above each demo: "Plate I", "Specimen — i", "Fig. 01 —
2026 ed.", "Frame 01", "Lap 1". Same media, theme-aware foundry plate.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace The Future + The Future Mono everywhere with Geist + Geist Mono — both
local fonts had a single-storey hooked "a" by design, not by faux italic. Strip
the @font-face declarations + preload links. Halo dropdown z-index leak fixed.
Editorial hero proof block strips down to just the CTA. Atelier + Salon now
left-aligned. Skill-row / hero / examples ledes unified to roman serif (italic
removed from every body / lede / intro role to kill the curly italic "a").
Refine verb removed everywhere: SKILL.md, README, landing site, references.
Ask-questions discipline strengthened — Step 1 now always asks, optional answers.
Build subsection wires Podcast loop video; Study uses Calendly screenshot with
re-written DNA fields; Worked-examples 1+2 use Banana Studio + Modern SaaS
loops in place of static thumbs. Landing-page rebrand reverted everywhere.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The font I should have removed three asks ago is **IBM Plex Sans**.
Distinctive double-storey lowercase "a" with a curly tail that
the user keeps flagging as unreadable. Used in four themes —
all replaced:
newsprint label : "Inter", "The Future"
manifesto body : "Inter", "Public Sans", "The Future"
linen display : "Hanken Grotesk", "Inter"
linen body : "Hanken Grotesk", "Inter"
almanac display : "Hanken Grotesk", "Inter"
almanac body : "Hanken Grotesk", "Inter", "The Future"
Hanken Grotesk added to the Google Fonts stylesheet (was only in
fallback chains, not actually loaded). Inter was already loaded.
MANIFESTO HERO LINE-HEIGHT — Anton is a tall narrow condensed
display face. At the default 1.02 tight line-height, "THE / DESIGN
/ SKILL." stacked with no breathing room. Bumped to 1.05 for the
manifesto hero display only — gives the multi-line headline visual
rhythm without going soft.
GITHUB STAR BUTTON — three changes:
· **Icon colour** → `#f5b300` (golden yellow, GitHub-star canon)
instead of the active theme's accent. The star is a brand mark,
theme-independent. Stays yellow on hover too.
· **Default count** "0" instead of "—" placeholder. The fetch
still runs in the background (cached 1h); on success the count
updates. On failure the "0" stays put.
· **Closer to Install** — `margin-inline-start: calc(-1 *
var(--space-md) + 0.25rem)` pulls the star back against the
banner's flex gap so the two read as a paired CTA. Other banner
spacing untouched.
Mobile: at <50rem the Install pill hides (existing rule); the
star stays visible and takes the CTA role. At <36rem the star's
internal padding tightens further. No layout shift.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The default Specimen and the two themes that previously used the
fake-browser-dashboard mockup (Plume + Halo) now each get a
distinctive hero composition that delivers a real "wow" moment.
· **Specimen → hero-specimen.** Two-column. Left keeps the copy
block (eyebrow, H1, lede, install). Right is a foundry-style
typographic plate: a giant italic Fraunces ℋ (Script Capital H,
U+210B) at clamp(12rem, 24vw, 22rem), positioned with intentional
asymmetric placement on a bordered card, with a "PLATE 01" label
top-left and a mono spec strip ("Fraunces · italic · 144pt /
display optical · ss01") at the bottom. Reads as a real foundry's
specimen sheet — the truest possible hero for an opinionated-
typography skill.
· **Plume → hero-bloom.** Two-column. Right is a layered painterly
composition: a soft warm-rose watercolor wash (inline SVG with a
radial gradient + organic path), an oversized italic "Hallmark."
in Newsreader at clamp(4rem, 9vw, 7.5rem) layered on top of the
wash, plus three small geometric accents (a thin vertical line, a
filled ink dot, an outlined circle). No SaaS chrome. Painterly +
editorial.
· **Halo → hero-orbit.** Two-column. Right is concentric rings + a
glowing centre dot. Five SVG circles of varying stroke width
(thinnest outer, thickest inner), centre dot in --color-accent
with a soft amber box-shadow glow, an accent tick mark on the
outermost ring's top, a thin rule + small spec strip
("HALO · WORKSHOP") at the bottom. The whole ring set rotates
via @keyframes orbit-spin 80s linear infinite — almost
imperceptible, gives the page life. Stops under
prefers-reduced-motion.
Theme remap (one file, three lines in main.js ARCHETYPES):
specimen: marquee → specimen
plume: clipped → bloom
halo: clipped → orbit
The original hero-marquee and hero-clipped templates are
untouched. Pastel still uses clipped. Reversion is one line per
theme — flip the ARCHETYPES entry back.
All three new heroes:
- 2-column at desktop, single-column stack at <60rem
- Pure CSS + inline SVG, no JS
- Theme-aware (currentColor, accent token, mono/serif fallbacks)
- ~270 LOC of CSS across all three, ~95 LOC of HTML templates
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Six items in one pass:
· **Bricolage Grotesque removed** entirely. Distinctive italic-a
forms (curl ear) read as "weird" at section-title scale across
several themes. Replaced per-theme with cleaner alternatives:
Sport → Inter Tight (italic). Riso → Space Grotesk. Almanac →
IBM Plex Sans. Plume → Geist. Manifesto's display fallback
chain swapped Bricolage out for Space Grotesk. Google Fonts
stylesheet URL updated — Bricolage dropped, Space Grotesk and
Anton (italic axis) added.
· **Section heads restructured.** Was: 10rem | 1fr two-column with
the section label ("04 / ANTI-PATTERNS") on the left and the
title on the right. Problem: at narrow widths (and on themes
that override to 6rem | 1fr like Sport), the label was forced
to wrap mid-word ("ANTI-/PATTERNS") and the title felt squeezed.
Now: single-column. Label stacks ABOVE the title with a small
gap. Label gets `white-space: nowrap` so it never breaks. Title
font-size grows from `clamp(2rem, 3vw + 1rem, 3rem)` to
`clamp(2rem, 4vw + 0.5rem, 3.5rem)` since it has full row width.
Sport's per-theme override (was 6rem | 1fr) now also 1fr.
· **Foundations card strokes — fixed.** The gap-as-border pattern
(gap: 0.5px, parent bg showing through) sub-pixel-rounded
inconsistently — col 2/3 boundaries dropped on some themes.
Replaced with explicit 1px right + bottom borders on each card,
plus left + top on the parent. Every divider now renders crisp
at every theme + viewport. Atelier/Salon use a dashed bottom
rule instead, no vertical dividers (matches their borderless
card aesthetic).
· **Worked examples — full bleed to viewport edges.** The rail had
`margin-inline: calc(-1 * var(--page-gutter))` which only
escaped the page gutter, not the page max-width. On wide
desktops the rail still capped at 76rem. Now uses
`width: 100vw; margin-inline: calc(50% - 50vw)` so cards extend
flush to the viewport edges no matter how wide the screen.
Internal scroll-padding still snaps the first/last card cleanly.
· **Study brief pill** — "Paste a design you admire." → "/hallmark
study this landing page". Reads as the actual command the user
would type, matches the Build row's brief style.
· **GitHub star button** added to the nav. Sits beside Install,
styled as an inverse pill (ink fill, accent star, paper text).
Live star count fetched from the GitHub API on first paint,
cached in localStorage for 1h to avoid rate-limit. Falls back
to "★" if the request fails. Counts ≥1000 render as "1.2k" etc.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Big polish pass after user feedback. Breakdown:
CHAPTER RAIL — removed entirely. The sticky left-rail outline added
last pass competed with content rather than helping. HTML, CSS, JS
observer all stripped. Page reads cleaner without it.
SECTION TITLES — shorter, declarative, fits every theme without
two-line wraps:
· 02: "Different briefs. Different bones." → "Worked examples."
· 03: "Five things Hallmark does. One ruleset underneath." → "What it does."
· 05: "Five things Hallmark holds the line on." → "Foundations."
· 06: "One command. Works in every harness." → "Install."
SECTION 03 — every row at the same density.
Build: title now shows `Build (default)` with the `(default)` set
in italic muted serif. Signals users don't actually type `build`.
Study: was a 2-card study-grid (Tide + Tracejam, image + 10-row
DNA each). Compacted to a Build-shaped layout — single example
(brief pill → arrow → Tide thumb on left, 10-field DNA list on
right). Mirrors Build's shape so the section reads at one rhythm
instead of one row dominating.
Audit: full rebuild. The verb-audit.png slop screenshot replaced
with a CSS-only inline slop hero (purple-pink gradient, centered,
Inter family, ✨ sparkle badge, gradient pill CTA) that visibly
embodies every AI tell. Right side dropped the 4-row info panel
for a 5-row checklist: ✗ <problem> → <fix>. Each row names a
specific tell and its Hallmark answer. Reads as "what's wrong /
what to do." Drops the now-redundant audit-flag overlay.
Refine + Redesign: dropped the right-column structured info panel
entirely. The diptych (before/after) now spans full skill-row
body width, each thumbnail roughly doubled in size. New
.skill-row__body--full modifier handles the layout. The
Invocation/Preserves/Touches/Returns lines were redundant given
the lede already says it.
SECTION 05 — Foundations. Replaced the 5-radio-tab pattern with
8 compact cards in a 4×2 desktop grid. Each card: a hand-drawn
SVG icon (~48px, monoline, currentColor stroke for theme-aware
inheritance), a one-word title, a single-line description.
The eight: Type (paired Aa serif + Aa sans), Colour (4 dots),
Space (ruler tick marks), Motion (curve arrow), Voice (4 quote
marks), Layout (2 asymmetric rectangles), Hierarchy (3 bars
decreasing), Restraint (single dot in square).
Responsive: 4×2 ≥60rem → 2×4 ≥36rem → 1×8 mobile. Old radio-tab
markup preserved verbatim inside <template id="section-05-archive
-foundations-tabs"> for one-tag revertibility (same pattern as
Section 04's archived Without/With).
FOOTER — was 64ch (~600px) max-width single column. Reads as a
small floating block on a 1440px desktop. Replaced with a 3-column
flex layout: wordmark left, prose centre (set / catalog / credit
paragraphs), links + 2026 year stamp right. Spans full page width.
Stacks single-column on mobile. `display: flex !important` because
the parent .foot rule (display: grid) was winning the cascade and
overriding even an equal-specificity later declaration.
EASTER EGG — the "1.0× in 3.2s" counter line is gone (the user
didn't actually count clicks, the line claimed false precision).
Header reads `$ hallmark.observe()` (cleaner CLI feel). Punchlines
expanded with new lines — "theme connoisseur." / "easy on the
keys." / "speed-run noted." / "calm down, designer." / "showing
off, are we?" Animation rebuilt — arrival fades + scales (1.015 →
1) over 420ms with cubic-bezier(0.16, 1, 0.3, 1) curve, the
underlying page slightly recedes (scale 0.985 + 2px blur) via a
body.easter-open class so the easter feels like a brief teleport.
Exit mirrors with a 360ms ease-in. Reduced-motion: opacity-only.
FAVICON — unchanged from prior pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Three phases of editorial-spine moves landed together:
PHASE C — Pacing.
· End-of-section pull-arrows. Each major section now closes with a
small italic-serif arrow link pulling the eye to the next
section: "See the verbs →" (after Section 02), "See the named
tells →" (after 03), "Read the rules →" (after the new 04),
"Install in your editor →" (after 05). Hairline rule above each
arrow. Hover nudges the arrow forward, recolours to accent.
Theme-aware: editorial themes get italic serif; brutal /
manifesto / sport / terminal etc. switch to body sans uppercase.
· Mid-scroll typographic interlude between Sections III and IV.
Single declarative phrase set in the active theme's display
face on a contrasting paper band: "The page is the demo."
("The page" in italic accent, rest in roman ink). Full-bleed,
centred, generous padding. Pure type, zero motion. Resets
attention before the anti-patterns section.
PHASE D — Slop, by name.
· Replaced Section 04 (Without/With) with a new Anti-patterns
section. Five named tells, each shown as: a number (mono), the
tell's name in italic display with a strike-through (the slop,
visually struck), a description (italic serif muted), and then
the Hallmark fix in clean ink with an accent label. Side-by-
side typography so the contrast IS the design.
The five tells: purple-gradient hero, Inter-as-display, centred
everything, icon-tile feature card, the AI nav.
· Original Section 04 markup preserved verbatim inside a
<template id="section-04-archive-without-with"> wrapper. The
template element doesn't render but keeps the content in the
file for revertibility. To restore the original section: change
the opening <template> to <section class="section reveal"
style="--i:3" aria-labelledby="s4"> and the closing </template>
to </section>, then delete the new Anti-patterns section. (The
archived content uses the vs--notes / vs__panel--dash etc class
names which contain "--" sequences invalid inside HTML
comments, hence the template wrapper instead.)
PHASE E — Chapter rail.
· New <aside class="chapter-rail"> pinned to the left margin on
viewports ≥80rem (1280px). Lists II Examples · III Skills · IV
Anti-patterns · V Foundations · VI Install. Italic serif Roman
numeral + small-caps mono name. Hidden below 80rem so it never
competes with content on narrower screens.
· IntersectionObserver in main.js tracks the topmost visible
section and adds .is-current to the matching link. Active link
brightens to ink colour with accent numeral; inactive links
fade to rule-2 muted. Smooth (one CSS-token transition).
Net editorial gravity:
Banner → 01/23 indicator + dropdown (clean chrome)
Section 02 → "Different briefs. Different bones." + larger cards
Section 03 → unchanged (already strong)
Mid-scroll → "The page is the demo." interlude
Section 04 → Anti-patterns ("Slop, by name.") replacing W/W
Pull-arrows between every section
Chapter rail on wide screens
Footer → colophon (publisher's signature page)
Files changed: index.html (markup) · components.css (chapter rail
+ anti-patterns + interlude theme overrides) · sections.css
(anti-patterns layout + pull-arrow + interlude) · main.js
(chapter rail observer).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The 23-dot strip that occupied half the banner is gone. In its
place: a single text indicator reading "01 / 23 — Specimen" set
in the active theme's display face, with a small caret. Click to
open a compact 6×4 grid of color swatches (no theme names — the
dropdown is deliberately minimal). Outside-click and Escape
close. Theme selection closes and applies in one motion.
Banner before:
HALLMARK V1.0 | INSTALL | marquee · specimen · enrich-A
| (spacer) | Specimen · editorial | [• • • • • × 23 dots]
| shuffle | T
Banner after:
HALLMARK V1.0 | INSTALL | (spacer) | 01 / 23 — Specimen ▾
| shuffle | T
Mobile: ordinal hides at <44rem, theme name + caret remain.
Below 26rem the theme name itself collapses; the caret stays as
a control.
Footer — replaced four archetypes (masthead/inline/index/dense)
with a single colophon ("Ft5"). All 23 themes now use it. The
publisher's signature page traditionally doesn't change across
volumes; structural variety lives in the body, not in the
publisher's mark. Theme variation is now purely typographic
re-rendering.
Colophon block:
Hallmark · v1.0
Set in Fraunces (display), The Future (body), and The Future
Mono (label). Currently rendered in <Specimen>.
Twenty-three named themes across four genres. Twenty-one
macrostructures. Forty component archetypes. Sixty slop-test
gates plus a six-axis pre-emit critique.
Built v1.0 in 2026. Powered by Together AI. MIT licensed.
Source · Install · Top
Old footer templates and CSS are kept in place but no theme
references them — fully dormant. Easy to revert one or restore
specific archetypes later.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
· Remove .banner__stamp ("marquee · specimen · enrich-A") from the
nav header. The live-stamp annotation was clutter — every visitor
saw it, almost none read it. Drop the markup, the CSS block, and
the JS query references. setPressed() is now leaner.
· Add favicon.svg — italic Fraunces "H" on warm-cream square,
inverted automatically under prefers-color-scheme: dark. Linked
in <head> via <link rel="icon" type="image/svg+xml">.
· Section 02 (Examples) — title "Eight briefs. Eight different
shapes." → "Different briefs. Different bones." Tighter, more
declarative, leans into the structural-variety claim. Card size
bumped from flex 0 0 32rem → clamp(32rem, 60vw, 44rem) on
desktop so each card carries more visual weight; mobile bumped
26rem and 84vw. examples-rail gets symmetric scroll-padding-
inline plus a flex 0 0 var(--page-gutter) ::after spacer so the
last card snaps clean to the gutter instead of being cropped by
the bleed margin on the right.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Section 03 ships as the five-skills showcase (Build · Study · Audit ·
Refine · Redesign), each row with its own structurally-distinct demo.
SKILL.md and references — new disciplines that hold across every verb:
· Pre-emit self-critique on six axes (Philosophy · Hierarchy · Execution
· Specificity · Restraint · Variety) — anything <3 triggers revision
· Honest copy — no fabricated metrics, real numbers or labelled
placeholder, never invent "+47% conversion"
· Locked tokens — no mid-render colour or font-family improvisation
· Re-drawn UI chrome forbidden — never hand-build fake browser bars,
phone frames, code-block windows, IDE chrome
· Clickable text never wraps to two lines on shrink
Slop test grows from 55 to 60 gates (gates 56–60). Pre-emit critique
block sits above the gate sweep. anti-patterns.md gains five new named
entries; responsive.md gains "Clickable text — never wraps" with the
4-step fix order.
Site:
· Studio photographic hero — empty 3x3 placeholder grid replaced with
a 3x2 showcase of six real Hallmark output thumbnails (Static Hour,
NAJM, Tally hero, Nexus, Tracejam, Tally process)
· Studio — strip "· selected work" suffix from section labels
(::after rule removed) and from hero eyebrow COPY
· FAQ section dropped from landing page · CSS removed · Install
renumbered 07 → 06, footer reveal index 7 → 6
· Section 03 Row I (Build) demo swaps Tide → Static Hour
· README — concise intro paragraph, hero showcase swapped to four
new outputs (Static Hour, NAJM, Tally hero, Nexus)
Version bumped to 1.0.0 across package.json, SKILL.md, banner, footer,
JS captions, and the artifact stamp string.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Removed the gallery and all 5 before/after test fixtures + thumbnails. Hallmark's
typography-only outputs read as visually quieter than Sonnet's defaults — by design
(decoration must earn its place), but it makes for an unflattering side-by-side at
first glance. Bad marketing surface even if the discipline is right.
- Reverted site/index.html Section 03 → restored the Study section.
- Reverted site/css/sections.css → removed the .ba__ block.
- Deleted site/_tests/before-after/ entirely (5 briefs × 2 outputs + 10 thumbnails + capture script).
Replaces the Study section with a 5-brief comparison gallery built on real headless
`claude -p` runs:
- 5 fresh briefs (Tide coffee · Streak habits · Lattice studio · Loom indie game · Anchor SaaS).
- BEFORE: Hallmark moved out of ~/.claude/skills/, ran `claude -p --model sonnet`.
- AFTER: Hallmark restored, same prompt prefixed with "Use the Hallmark skill at SKILL.md".
- Both sets of HTML committed under site/_tests/before-after/0X/{before,after}/index.html
so the source is browsable.
- 1280×800 thumbnails captured with headless Chrome (script: site/_tests/before-after/_capture.sh).
- Stripped preamble leaks where the model added commentary above <!doctype>.
Section 03 markup mirrors the W/W and Foundations radio+sibling pattern:
- 5 hidden radios, tab strip, side-by-side BEFORE | AFTER below.
- Brief text shown above each comparison.
- Each thumbnail links to the live HTML; Hallmark stamp summarised in caption meta.
- Mobile: tabs scroll horizontally, columns stack.
The five AFTER outputs span 5 different macrostructures (Long Document, Bento Grid,
Marquee Hero ×2, Stat-Led), 5 different themes (Linen, Pastel, Atelier, Bloom, Quiet),
3 different navs (N5, N7, N9), and 4 different footers (Ft5, Ft6, Ft7, Ft8) — actual
diversity, not faked.
Site:
- Section 04 W/W gap fix: .section gets position:relative, .vs-toggle__input goes position:absolute (top:0, left:0). The hidden radio inputs no longer take grid slots — eliminates the ~36rem of phantom gap that was accumulating between section header and toggle, most visible on Specimen.
- Section 05 Foundations refactor: 5 stacked cards → vertical list + active panel. Click a name (01 Type · 02 Colour · 03 Space · 04 Motion · 05 Voice), the right panel updates. Pure CSS via 5 radios + sibling selectors. Section now fits in ~720 px on desktop. Mobile collapses to accordion via grid `order:`.
- Theme polish:
- Pastel: cool tilt (paper oklch 96% 0.022 285 → 98% 0.008 240); lower-chroma indigo accent. Removes overlap with Plume's warm-cream.
- Studio: portfolio rhythm — section-label gains "· selected work" suffix; hero photo crops 16/7; example-card names italicised; quote block bumped to 4.75rem display.
- Atelier: sketchbook signals — italic optical-size 144 + soft 70 on display; old-style figures in body; "· plate" suffix on section-label; tabular nums on numerals only; "see plate" prefix on example-card open links.
- Sport: scoreboard register — tabular numerals across stat / num / step / dna__v / vs-toggle__num; section-numeral becomes a leaderboard cell with thin top-border + accent tint; sharper sweep easing (cubic-bezier(0.86, 0, 0.07, 1)); hero qualifier set in mono uppercase.
Skill:
- New § "When the brief is a component, not a page" sits before Design flow in SKILL.md. Detects single-component briefs (button / input / card / modal / dropdown / etc.), runs a slimmed flow that keeps pre-flight + genre + theme + 2+1 fonts + state discipline + slop test, but skips macrostructure / enrichment / project-memory append. Outputs the component artifact PLUS an 8-state demo wrapper (.preview.html) so the user sees default · hover · focus · active · disabled · loading · error · success at a glance. Stamps with `component:` prefix to opt out of page diversification rules.
- Contrast & readability gates 46–50 added to slop-test.md (universal, all genres):
- 46 body text < 4.5:1 contrast
- 47 large text / icons / focus rings < 3:1 contrast
- 48 button text colour ≈ background fill (the black-on-black canary)
- 49 --color-accent used as fill but --color-accent-ink missing
- 50 dark surface inheriting the page-default ink colour (ink-on-ink in flipped sections)
- New "Contrast discipline" subsection in interaction-and-states.md with APCA / WCAG computation rules + the surface-flip rule (any background override must also state color).
- Slop-test count 45 → 50 across SKILL.md, slop-test.md, custom-theme.md, redesign.md, README, site copy fixtures.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Themes:
- Coral (modern-minimal) — warm-grey paper, single coral accent, Geist + General Sans pair, pill CTAs. The "Stripe-not-Linear" register.
- Violet (modern-minimal) — near-white + near-black, single quiet violet accent, tight Geist. The Linear voice without copying it.
- Aurora (atmospheric) — dark cool canvas with two cool blooms (cyan top-right, teal-green bottom-left), Sentient body, single cyan accent. The dev-tool-after-dark register.
- Halo (atmospheric) — neutral charcoal canvas with a single warm-amber bloom positioned ONLY around the hero (fixed-attached pseudo-element clipped to top 80vh). Below the hero the page is content-led — less Suno, more "tool you actually work in."
- Plume (playful) — warm cream paper with alternating tinted bands on sections, soft rose accent, hover-lift on cards, friendly motion. Closer to actual playful than Pastel's post-Linear-soft.
Catalog totals: editorial 12 · modern-minimal 3 · atmospheric 5 · playful 2 = 22 themes. Banner picker, THEMES, ARCHETYPES, COPY, and THEME_GENRES maps all updated. README cluster list reorganised by genre.
Study gallery:
- Replaced <video> with <img> in all 4 cards (videos deferred until production-ready). Existing test-page thumbnails serve as the visual; tiles 03 and 04 keep the data-user-content placeholder + DNA scaffold for the user to fill later.
- CSS .study-card__video class kept alongside new .study-card__img selector so the future video swap is one-line.
Theme-count refs (17 → 22) updated across SKILL.md, README, index.html, main.js, T-tooltip, easter-egg punchlines.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>