v0.80.0: the docs tree, the neutral Waymark split, and the cairn theme
The window since 0.79.0 — one coherent arc: the documentation tree rebuilt end to end, the pre-beta editor improvements, the Waymark template neutralized with the identity extracted as the cairn theme, the responsive hardening, and the naming settled.
Waymark starter components (showcase/template only; no consumer action)
- The starter template gains six content components, each a worked
defineComponentwith a
schema-driven picker form:icon(renders only names from the adapter's declared icon set,
loud failure on an unknown name),video(a zero-request static facade that links out;
in-page embedding would neediframethrough the sanitize floor and is deliberately not
done),pull-quote,cta, andfaq(nativedetails, markdown-capable answer slot). - The converter island demo is retired. Its replacement exemplar is an expiring-announcement
banner: frontmatter-date-driven, hides itself after expiry (checked at both build and
hydration), renders nothing on an invalid date. - Not shipped, recorded:
figureneeds no component (the engine owns:::figurenatively;
the name is reserved), andgallerywaits on the component-attribute image gap filed in
ROADMAP.
Changelog
All notable changes to this project are recorded here, most recent first.
Unreleased
Showcase (Waymark template; no consumer action)
- The starter template's default theme is neutral. The display face is Figtree, a humanist
sans matching the body's Source Sans 3, in place of the display serif Fraunces; the paper
ladder drops its warm hue tint for a clean near-white/near-black progression; and the
display type steps (h3throughh1) sit one step back on the scale. The three signature
prose gestures, the cairn-glyphhr, the diamondulbullet, and the margin-hanging
pull-quote, move behind an opt-in.prose[data-flourish]hook inprose.css, kept in place
for the planned cairn theme layer to re-enable with one attribute. - A design-review craft pass on the neutral template: the header and footer inner content now
caps at the same reading measure as the article and home body, so the chrome's left edge
lines up with the body copy instead of centering independently at a wider band; the uppercase
eyebrow label is dosed down to where it differentiates two sections on the same page (the
home's new "Latest"/"Archive" split) rather than repeating on every masthead; the home gives
its newest entry a lead treatment above a tightened archive index; and the styleguide now
demonstrates the full component kit (icon,cta,video,faq, and the realpull-quote
directive in place of a hand-styled paragraph), a lone FAQ renders in its own bordered
container, an empty callout points list no longer leaves a phantom gap, markdown nested in a
callout/alert/FAQ slot scales down instead of rendering at full display size, and the two
demo code samples are reworded to fit the column instead of clipping mid-word. - A viewport-extremes audit at 320px and 2560px: a markdown table used to satisfy its own
width: 100%by wrapping words inside a cell, breaking an inline code token like
[text](address)across lines at a narrow width. Every other hunted surface (the video
facade, the CTA button, FAQ, the banner island, image figures, code blocks, and the
tag-filter chips) held up at both extremes with no change needed. - That audit is now a permanent gate:
site-visual.spec.tsadds light-theme pixel baselines for
the home page and the reading-surface article at 320px and 2560px, plus one mid-width (1920px)
baseline on the article that pins the fluid root-scale clamp's active interpolation slope, not
just its floor and cap. - A follow-up a11y review of that audit's own fix found it fixed the 320px squeeze but broke
WCAG 1.3.1: puttingdisplay: block; overflow-x: autodirectly on the<table>strips its
row/cell roles from the accessibility tree in every current engine. Every rendered table now
sits inside a.table-scrollwrapper instead, a small rehype step in the showcase's own render
pipeline (table-scroll.ts, composed ontorenderMarkdown's output incairn.config.ts); the
wrapper carriesrole="region", atabindexand anaria-labelnaming the table, and the
scroll, while the table itself keepsdisplay: table. The same review flagged the footer nav
for WCAG 2.5.8: it now carries the sameflex-wrapand 44px-class tap targets the header nav
already had. The pixel baselines above are regenerated for both changes.
Editor
- Pasting rich text from Word, Google Docs, or a web page now converts headings, emphasis,
links, and lists to markdown instead of dropping all formatting; plain-text and image
paste are unchanged. - Component blocks open folded when an entry loads; the touch-to-unfold safety invariant is
unchanged. - The editor footer shows a live count of open check issues beside the word count (visible
counterpart of the screen-reader announcer). - The in-editor cheat-sheet lists undo and redo.
- Editor-facing vocabulary: the create dialog, rename dialog, and media forms say "Address"
(formerly "Slug"), and the admin sidebar's media item says "Library".
Fixed
examples/showcase/svelte.config.jsnow setscsrf: { checkOrigin: false }, matching the
deploy guide's instruction (cairn's guard owns admin CSRF).- The
media.upload_failedlog event's documented-but-never-populatedcodefield is
reconciled with the emitters.
Documentation
- The documentation tree rewritten end to end against the approved information
architecture: new front doors, the editor arm, 25 guides, a consolidated explanation arm,
reference restructures, and a rewritten ten-milestone tutorial with typechecked snippets.
No consumer action required. - New doc gates:
check:snippetstypechecks every fenced code block against the built
package; the suspended reference, signature, and link gates are re-enabled; a monthly
cloud drift routine samples published pages against the code
(docs/internal/docs-maintenance.mdrecords the system).
Editor experience
- The create dialog, the Change URL control, and the media library's asset metadata form now
label an entry or asset's URL field "Address" rather than "Slug", matching the vocabulary the
docs already used. The matching validation errors (an invalid value, a collision, a no-op
rename) read "address" instead of "slug" too. The stored field name and every internal
identifier stayslug; only the editor-facing copy changed. - Pasting rich text from Word, Google Docs, or a web page now converts its formatting to
markdown instead of dropping it: headings, bold and italic emphasis (including Google Docs'
style-attribute runs), links, and bulleted or numbered lists all arrive as the matching
marks. Anything else (a table, an image, code, a blockquote, strikethrough) degrades to its
plain text. Plain-text paste and image paste are unchanged. New dependencies:rehype-parse
andrehype-remark, both official unified.js packages already alongsiderehype-sanitize
andremark-rehype.
No consumer action required: the window contains no breaking changes.