v0.78.2: editor popover + a11y, Library upload, native template
Four held passes roll into this patch: the editor's suggestion popover and accessibility model, the Media Library's direct upload, and the starter template's native re-expression. No public-API or behavior change requires consumer action.
Editor: cairn-native suggestion popover
The spellcheck and objective-error suggestion popover is now cairn's own recipe DOM, rendered through CodeMirror's public showTooltip facet instead of the skinned @codemirror/lint tooltip. It matches the admin design language (the Warm Stone surface, DaisyUI buttons, the body face) and gains the keyboard and screen-reader path it never had: the popover appears when the caret enters a flagged word without stealing focus, a polite live region announces it, Alt-Enter moves focus into the popover, and Escape returns focus to the editor. The misspelling underline keeps its locked amber color, now tuned for weight and offset. A check:cm-internals gate holds the editor theme's coupling to CodeMirror's internal classes at a by-name floor, so a future CodeMirror major stays cheap to absorb.
Editor: accessibility hardening
A debounced, polite live region speaks a settled summary of the document's diagnostics ("2 spelling suggestions, 1 style issue"), so an author knows issues exist without hunting for them. F8 and Shift-F8 jump the caret to the next or previous flagged range and land in the existing popover, bound through CodeMirror's own exported nextDiagnostic / previousDiagnostic commands. The directive-fold control now carries aria-expanded alongside a state-neutral name, so a screen reader hears the fold state instead of a verb-shaped label. The editing surface itself (.cm-content) carries an accessible name, "Markdown source", closing a WCAG 4.1.2 gap the surface had from the start. Every addition is on by default with no new prop.
Media Library: direct upload
The Library's two Upload buttons and a drop target that accepts a file anywhere on the page now open the same name-and-describe capture the editor's insert flow uses, then store the file and commit its record to main in one step, so a new image appears in the Library without opening a post first. Upload is single-file for now, and a re-upload of identical bytes is a no-op. A freshly uploaded image is unreferenced until you place it, so its where-used reads "No references found" until then.
Starter template: native re-expression
The showcase starter template is re-expressed in the same native DaisyUI 5.6 and Tailwind 4 idiom as the admin. Its design-scale tokens moved into Tailwind's @theme namespaces (--text-step-*, --spacing-*, --color-muted), its chrome folded onto named utilities, and its bespoke custom surface reached the same zero floor the admin holds, gated by check:custom-surface on both trees. The developer-facing role vocabulary is now published as the versioned seam in docs/internal/admin-design-system.md. The template governs newly scaffolded sites.
Full detail in CHANGELOG.md under 0.78.2.