Code injection
Restyle Meridian with CSS in Ghost's Code injection box — every section and component has a stable data-* handle that survives theme updates.
Want to nudge a colour, hide a section, or tighten some spacing without forking the theme? Meridian gives every major part of the page a stable handle you can target with a few lines of CSS. You paste that CSS once into Ghost's Code Injection and it sticks, even when you update the theme.
No theme editing required
Everything on this page is done through Ghost Admin → Settings → Code injection. You don't edit theme files, and you don't rebuild anything. Code Injection survives theme updates, which is exactly why it's the safe place for custom CSS. (Editing the theme files directly is not safe: your changes are erased the next time you upload a new meridian.zip.)
The naming convention
Meridian labels its building blocks with a small, predictable set of HTML attributes — a naming convention you can reason about. Once you know the four words below, you can usually guess the hook for something instead of looking it up:
data-regionmarks a big structural area, like the site header, the article body, or the homepage hero. There's usually one of each per page.data-componentmarks a reusable unit that can appear many times, like a post card, a story link in a rail, or the pagination bar.data-varianttells apart flavours of the same component — for example a post card rendered as the bigheroversus a compactdenselist item.data-partmarks a piece inside a component or region: thetitle,kicker,excerpt,meta(byline/date),image, orread-time. These names are the same everywhere, so the headline of any story preview is[data-part="title"], whether it's an<h1>or a<p>. A few parts live outside story previews:rank(the position number in numbered rails),logo(the brand logo image), andwordmark(the home link that wraps the logo, or the site title when there's no logo). One marks image-less video stories:video-badge(the small Video label).data-layoutis a fifth, rarer word: it marks an arrangement that cuts across components. Today it has one value,text, stamped on any post card, story card or section row rendered as a text card, so one selector finds every text card on the page. Pictured cards carry nodata-layout.
| Attribute | Means | How many | Example values |
|---|---|---|---|
data-region | a structural area | ~one per page | site-header, post-body, most-read-rail, lead-story, comments |
data-component | a repeating unit | many | post-card, story-link, story-card, pagination, newsletter-cta |
data-variant | a flavour of its host | paired | hero, dense, compact, editorial, next |
data-part | a piece inside the host | many | title, kicker, excerpt, meta, image, read-time, rank, logo, wordmark, video-badge |
data-layout | an arrangement across hosts | rare | text |
You compose these by nesting — region, then component (with its variant), then part — and you can scope the whole thing to one page type with a Ghost body class (shown in the next section).
To target any of them, use an attribute selector in CSS:
<style>
/* A structural region */
[data-region="post-body"] { font-size: 1.05rem; }
/* Every post card on the site */
[data-component="post-card"] { /* ... */ }
/* Only the hero-style post card */
[data-component="post-card"][data-variant="hero"] { /* ... */ }
/* The headline inside any post card, whatever element it uses */
[data-component="post-card"] [data-part="title"] { /* ... */ }
</style>What not to target
Meridian uses other data-* attributes internally (they wire up JavaScript or belong to Ghost itself) and those are not part of this styling API. Only the five above (data-region, data-component, data-variant, data-part, data-layout) are a promise. Leave the rest alone, because they can change or disappear in any update:
- Theme machinery (drives Meridian's own scripts):
data-breaking-ticker,data-ticker-*,data-header-nav,data-nav-*,data-primary-nav,data-drawer-nav-*,data-footer-nav-*,data-post-toolbar,data-reading-progress,data-toc-mount,data-favicon-fallback, and the like. - Page state on
<html>:data-color-scheme,data-palette,data-font-size. For dark-mode tweaks, use the.darkclass instead (shown later). - Ghost & libraries (owned by Ghost, not the theme):
data-portal,data-members-*,data-ghost-search,data-pswp-*.
A quick test: if the name reads like the four-word grammar — an area, a unit, a flavour, or a piece — it's fair game. If it reads like a wiring label (-toolbar, -mount, -track, portal), don't style against it.
Scope a change to one kind of page
Ghost adds a class to the <body> of every page that tells you what kind of page it is: home-template, post-template, page-template, tag-template and author-template (plus paged on pages 2, 3, and so on). The 404 page gets no template class, so scope a change there with its own hooks, [data-region="error-hero"] and [data-region="error-browse"]. Combine a body class with a hook to scope a change to just one place:
<style>
/* The hero headline, but only on the homepage */
.home-template [data-component="post-card"][data-variant="hero"] h1 { /* ... */ }
/* Pagination, but only on tag archives */
.tag-template [data-component="pagination"] { /* ... */ }
</style>Reach the elements inside a region
The hooks mark the containers. To style something inside one, add a selector after the hook. For the parts of a story preview, prefer the data-part hook over a bare element selector — the heading level varies between layouts, but the part name doesn't:
<style>
[data-component="post-card"] [data-part="title"] { letter-spacing: -0.01em; } /* card headlines */
[data-component="post-card"] [data-part="image"] { border-radius: 4px; } /* card images */
[data-component="post-card"] [data-part="meta"] time { font-style: italic; } /* the date line */
</style>Inside the article body, Meridian renders the content Ghost's editor produces, which already has its own stable classes. Target those directly under [data-region="post-body"]:
<style>
[data-region="post-body"] .kg-image-card { /* images */ }
[data-region="post-body"] .kg-button-card { /* buttons */ }
[data-region="post-body"] blockquote { /* pull-quotes */ }
</style>Targeting parts of a story
Every story preview — the linked headline blocks in feeds, rails, grids, carousels, and "more to read" lists — is built from the same handful of parts, each with a data-part hook:
| Part | Hook | What it is |
|---|---|---|
| Title | [data-part="title"] | the headline link |
| Kicker | [data-part="kicker"] | the small primary-tag label above the title |
| Excerpt | [data-part="excerpt"] | the short summary / dek |
| Meta | [data-part="meta"] | the byline and/or date line |
| Image | [data-part="image"] | the thumbnail <figure> |
| Read time | [data-part="read-time"] | the "5 min read" label inside the meta line |
| Video badge | [data-part="video-badge"] | the small Video label on a #video story that has no picture |
Because the names never change, you can restyle a part everywhere it appears with a single rule — no matter which heading level or element the layout happens to use:
<style>
/* Every story headline on the site */
[data-part="title"] { font-variation-settings: "wght" 620; }
</style>…or scope it to one region. To recolour just the headlines in the homepage "More to read" rail, combine the region with the part:
<style>
[data-region="most-read-rail"] [data-part="title"] {
color: var(--color-accent-readable);
}
</style>(--color-accent-readable is your accent, with its lightness kept within a per-mode limit so it always reads as text; --color-accent is the exact colour, for fills. See Brand & colours below.)
Not every preview has every part — a text-only rail row has no image or excerpt — but when a part is present, it always carries the same hook.
A few parts live outside story previews, for the same convenience: [data-part="rank"] is the position number in numbered rails (the "More to read" list, some section rows), while [data-part="logo"] (the brand logo image) and [data-part="wordmark"] (the home link around the logo, or the site title when there's no logo) appear in the masthead, the Compact header, and the hamburger menu. The menu is its own region ([data-region="menu"]), so you can size each place's logo on its own (see the logo snippets below).
Hook reference
Every targetable part of Meridian, grouped by where it lives. Pair any of these with a body class above to scope it to one page type.
Site-wide chrome
| Part of the page | Selector |
|---|---|
| Breaking-news ticker | [data-component="breaking-ticker"] |
| Site header (both styles) | [data-region="site-header"] |
| Editorial header only | [data-region="site-header"][data-variant="editorial"] |
| Compact header only | [data-region="site-header"][data-variant="compact"] |
| Masthead / nameplate (Editorial header only) | [data-region="masthead"] |
| Brand logo image | [data-part="logo"] |
| Home link around the logo or site title (wordmark) | [data-part="wordmark"] |
| Hamburger menu (off-canvas) | [data-region="menu"] |
| Primary sections nav (Editorial header only) | [data-region="primary-nav"] |
| Sign in / Subscribe links (Editorial header only) | [data-component="auth-links"] |
| Reading-progress bar | [data-component="reading-progress"] |
| Footer | [data-region="site-footer"] |
| Footer brand column | [data-component="footer-brand"] |
| Footer link columns | [data-region="footer-nav"] |
Footer legal links (pages tagged #footer-legal-link) | [data-component="legal-links"] |
| Footer copyright row | [data-region="footer-legal"] |
| Advertisement slot (any) | [data-component="ad-slot"] |
| A specific ad position | [data-component="ad-slot"][data-variant="leaderboard"] (also in-feed, billboard, in-article, post-footer, anchor for the mobile anchor, and default as the fallback) |
| Bold section divider (the heavy 3px rule between sections) | [data-component="divider"][data-variant="section"] |
Homepage
| Part of the page | Selector |
|---|---|
| Front grid wrapper | [data-region="home-grid"] |
| Lead story column | [data-region="lead-story"] |
| Sub-leads under the lead | [data-region="sub-leads"] |
| Secondary stories column | [data-region="secondary-stories"] |
| Editor's note box | [data-component="editors-note"] |
| "More to read" rail | [data-region="most-read-rail"] |
| Home hero widget card | [data-component="home-hero-widget"] (content inside is [data-part="body"]) |
| Editor's Picks carousel | [data-component="editors-picks"] |
| A homepage section row | [data-component="section-row"] |
| Carousel-style section row | [data-component="section-row"][data-variant="carousel"] |
| Feature-rail section row | [data-component="section-row"][data-variant="feature-rail"] |
| Tag-columns section row | [data-component="section-row"][data-variant="tag-columns"] |
| Sections page (topic hubs) | [data-region="sections-page"] |
| "From the archive" tail | [data-region="archive-tail"] |
Posts & pages
| Part of the page | Selector |
|---|---|
| Whole article | [data-region="post"] |
| Static page | [data-region="page"] |
| Post header block | [data-region="post-header"] |
| Default (centered) post header only | [data-region="post-header"]:not([data-variant]) |
Split-duo header, image right (#hero-split-right) | [data-region="post-header"][data-variant="split-right"] |
Split-duo header, image left (#hero-split-left) | [data-region="post-header"][data-variant="split-left"] |
Slideshow header (#hero-slideshow) | [data-region="post-header"][data-variant="slideshow"] |
| Byline + date line | [data-region="post-meta"] |
| Feature image | [data-region="feature-image"] |
| Feature-image caption (posts, pages & cards) | [data-component="image-caption"] |
| Article body | [data-region="post-body"] |
| Article action toolbar | [data-component="article-toolbar"] |
| Reader-preferences panel | [data-component="reader-panel"] |
| Sticky bar (after scroll) | [data-component="sticky-bar"] |
| Table of contents | [data-component="table-of-contents"] |
| Author card | [data-region="author-card"] |
| A single author block | [data-component="author"] |
| End-of-article "preferred source" card | [data-component="preferred-source-cta"] |
| End-of-article newsletter signup ("sign-off") | [data-component="newsletter-cta"][data-variant="sign-off"] |
| Comments section | [data-region="comments"] |
| Previous / next links | [data-component="post-navigation"] |
| Breadcrumb | [data-component="breadcrumb"] |
| Static page header | [data-region="page-header"] |
Recommendation rails (below a post)
| Part of the page | Selector |
|---|---|
| Latest articles | [data-component="latest-articles"] |
| Related coverage | [data-component="related-coverage"] |
| You may be interested in | [data-component="you-may-like"] |
| From this writer | [data-component="from-this-writer"] |
| Ghost recommendations | [data-component="recommendations"] |
Post cards
A post card is the linked story preview that appears in feeds, rails, and grids. Target all of them with [data-component="post-card"], or one style with a data-variant:
| Card style | Selector | Where it shows |
|---|---|---|
| Hero | [data-component="post-card"][data-variant="hero"] | Homepage lead story |
| Hero (split) | [data-component="post-card"][data-variant="hero-split"] | Top of archive pages |
| Feed | [data-component="post-card"][data-variant="feed"] | Default grid card |
| Horizontal | [data-component="post-card"][data-variant="horizontal"] | Wide image-left rows |
| Grid | [data-component="post-card"][data-variant="grid"] | Image-top cards in the homepage grid carousels (3- and 4-column) |
| Dense | [data-component="post-card"][data-variant="dense"] | Text-only rail items |
| Dense + thumb | [data-component="post-card"][data-variant="dense-thumb"] | Rail items with a thumbnail |
| Thumb row | [data-component="post-card"][data-variant="thumb-row"] | Recommendation grids |
Text cards
A story with no feature image renders as a text card. Text cards keep every hook above and add data-layout="text" on the card's root, so one selector reaches all of them; pictured cards carry no data-layout.
| What | Selector |
|---|---|
| Every text card, whatever component it is | [data-layout="text"] |
| A text card of one style | [data-component="post-card"][data-variant="feed"][data-layout="text"] |
| A section row rendered in the text fallback | [data-component="section-row"][data-layout="text"] |
| Only the pictured cards | [data-component="post-card"]:not([data-layout]) |
The Video label on an image-less #video story | [data-part="video-badge"] |
In a row of pictured cards a text card stretches to the row and its summary fills the space (the theme measures how many whole lines fit). That machinery uses its own names (data-text-fill, text-fill-excerpt, --text-fill-lines, --text-fill-min), which are not styling hooks: style the summary through [data-layout="text"] [data-part="excerpt"] instead.
The rule at the top (or start) of a text card is a border. Some card styles draw it on the card's root and others on the card's link (Dense + thumb, Thumb row, Grid, Editor's Picks and the asymmetric section row), and some cards also have a hairline along the bottom. Recolour only the top and start edges on both, so the hairlines keep their colour:
<style>
/* Accent-coloured rule on every text card */
[data-layout="text"],
[data-layout="text"] > a {
border-top-color: var(--color-accent);
border-inline-start-color: var(--color-accent);
}
</style>Other story previews & their parts
Not every story preview is a post card. Compact list rows and a few hand-built cards carry their own component hook, and every preview exposes the same parts:
| Hook | Selector | Where it shows |
|---|---|---|
| Story link | [data-component="story-link"] | compact text rows in rails, related coverage, recommendations, and the "more to read" rail |
| Story card | [data-component="story-card"] | hand-built cards: Editor's Picks, and the stories in the feature package, feature rail, briefing, asymmetric, opinion and tag-column section rows |
| Previous / next link | [data-component="post-nav-link"] | the links below a post (data-variant="next" and data-variant="prev") |
| Story part | [data-part="title"] | the headline of any preview (also kicker, excerpt, meta, image, read-time) |
Archives, members & CTAs
| Part of the page | Selector |
|---|---|
| Archive header | [data-region="archive-header"] |
| Desk filter chips | [data-component="archive-filters"] (the chips are an <ul> of <li> links inside it) |
| Author archive header | [data-region="author-header"] |
| A post grid row | [data-component="post-grid"] (variants two-up, three-up, four-up) |
| Pagination bar | [data-component="pagination"] |
| Newsletter signup | [data-component="newsletter-cta"] |
| Membership band | [data-component="membership-cta"]: variants priced (paid plans on sale), free (the free signup form) and signin (the sign-in prompt); see who sees which |
| Membership band plan row | [data-component="membership-cta"] [data-component="plan-row"] — variants free / paid; the highlighted plan carries data-featured="true" |
| Membership band billing switch | [data-component="membership-cta"] [data-component="billing-toggle"] |
| Member CTA (signed-out) | [data-component="member-cta"][data-variant="signup"] |
| 404 hero | [data-region="error-hero"] |
| 404 browse suggestions | [data-region="error-browse"] |
Membership page
The Membership page — the page at the URL join — ships two layouts, and both expose these hooks.
| Part of the page | Selector |
|---|---|
| The whole page | [data-region="membership"] (variants rate-card, order-form) |
| Headline, excerpt and issue line | [data-component="membership-hero"] |
| Monthly / Yearly switch | [data-component="billing-toggle"] |
| The rates section | [data-component="rate-card"] |
| The row of plan columns | [data-component="tier-grid"] |
| One plan column | [data-component="tier-card"] (variants free, paid) |
| The order form | [data-component="join-card"] |
| One row in the plan picker | [data-component="plan-row"] (variants free, paid) |
| The order summary panel | [data-component="order-summary"] |
| The reassurance line under the plans | [data-component="trust-strip"] |
| The highlighted plan | [data-featured="true"] |
| Price, trial line, benefits, button | [data-part="price"], [data-part="trial"], [data-part="benefits"], [data-part="cta"] |
| The "Billed … yearly · save N%" line | [data-part="billing-note"] |
| One plan's panel in the order summary | [data-part="summary-panel"] |
| "Most popular" stamp | [data-part="stamp"] |
Scope to one layout
[data-region="membership"] matches whichever layout is in use. Add [data-variant="rate-card"] or [data-variant="order-form"] to target just one.
Common snippets
Paste any of these into Settings → Code injection → Site Header and click Save. They're grouped by what they change; click a snippet to expand it. Mix and match — keep the ones you want and delete the rest.
Check the settings first
Many look-and-feel choices are built into Meridian, so you don't need CSS for them: accent colour and heading/body fonts live in Ghost's Settings → Design & branding (see Brand), and Meridian adds its own Font heading and Font body theme settings, while default light/dark mode, background palette, header style, single-author bylines, the breaking-news ticker, and ads are theme settings (see Site-wide settings). Reach for Code injection only for tweaks the settings don't cover.
Brand & colours
Typography
To switch the heading or body typeface, use the font settings in Design & branding or Meridian's Font heading and Font body settings in Site-wide settings rather than CSS.
Header, logo & navigation
Hiding things
Layout & spacing
Dark mode
Mobile
Need something else? See the full handle reference above, or the Sections and Membership CTA guides for component context.
Targeting with JavaScript
The same handles work from JavaScript, which you can add in Settings → Code injection → Site Footer:
<script>
document.querySelectorAll('[data-component="post-card"]').forEach((card) => {
// do something with each card
});
</script>Running a script on every page
While a reader watches a video, Meridian's persistent player loads the next pages without a full reload, so a script that only runs at page load would miss them. Listen for meridian:load instead of DOMContentLoaded. It fires for every page a reader is shown, once the theme has set the page up:
- the first load;
- each soft navigation while the player is engaged;
- a page the browser restores from its back/forward cache when the reader presses Back or Forward.
meridian:unload fires when that page goes away (a soft navigation replaces it, the reader leaves, or the browser puts it into the back/forward cache), so each meridian:load is followed by one meridian:unload. Set things up in one and tear them down in the other:
<script>
let observer;
document.addEventListener('meridian:load', (event) => {
// event.detail.initial: true on the first page load
// event.detail.restored: true when the browser restored the page from its back/forward cache
// event.detail.path: the page's path
observer = new IntersectionObserver((entries) => { /* … */ });
document.querySelectorAll('[data-component="post-card"]').forEach((card) => observer.observe(card));
});
document.addEventListener('meridian:unload', () => {
observer?.disconnect();
});
</script>A restored page still holds everything your script added to it last time, so if your handler changes the page itself (inserts an element, adds a class), check first whether the change is already there.
A listener added in Site Footer always sees the first meridian:load: the theme fires it after its own scripts have run. A third event, meridian:pageview, fires after each soft navigation, so analytics can count the pages the player loaded. All three are a supported part of Meridian, like the handles.
These handles are a promise
The data-region, data-component, data-variant, data-part and data-layout names on this page, the accent variables and the lifecycle events are a supported part of Meridian. We treat renaming or removing one as a breaking change, called out in the changelog, so the CSS you write today keeps working.
If you customised 1.10
Updating from 1.10 keeps every data-region, data-component, data-variant, data-part and data-layout value, every component class (.btn, .archive-chip, .chip-live and the rest) and every CSS variable name, so CSS written against them keeps working. Four kinds of customisation are worth a look.
Markup that changed shape
A rule written against a handle keeps matching. A rule that reaches past the handle to a bare element, a direct-child step (>) or an ARIA role may need its tail updated:
| What | 1.10 | 1.11 |
|---|---|---|
| Footer menu wrapper | div[data-footer-nav-target] | nav[data-footer-nav-target]; select it as [data-region="footer-nav"] |
| Footer column heading | a <button> at the top of each column | an <h2> per column, holding the toggle button on phones and the label (or link) from 640px up |
| Footer column links | nav[aria-label] > ul inside each column | a ul inside each column, labelled by its heading |
| Drawer section headings | h3 | h2 |
| Editorial section bar (desktop) | ul[data-primary-nav] | a new list inside [data-region="primary-nav"]; select the bar through that hook. ul[data-primary-nav] is now only the phone strip |
| A dropdown arrow's name | "Politics submenu" | "More in Politics" on the Editorial desktop bar. The phone strips still say "Politics submenu", and a Compact bar dropdown is still one button named after its section ("Politics") |
| Compact header's More panel | div[data-more-panel] with role="menu", wrapping [data-more-content] | ul[data-more-panel], a plain list |
| Desk chips | div[role="group"] > a.archive-chip | ul > li > a.archive-chip; wrap anything you insert in an <li> |
| Breadcrumb | nav > a and nav > span | nav > ol > li, with aria-current="page" on the last crumb |
| Article toolbar | nav[data-post-toolbar] | div[data-post-toolbar] |
| Sticky article bar | nav#sticky-article-bar | div#sticky-article-bar; [data-component="sticky-bar"] is unchanged |
| Share menu | links in #share-panel nav, and #share-panel had role="dialog" | links in #share-panel ul > li; #share-panel a still matches |
| Article More menu | [role="menu"] and [role="menuitem"] | #more-panel ul > li, with no menu roles |
The footer column ids (footer-col-0, footer-col-1, …) count columns, so they shift by one when rows placed before your first heading become a Quick Links column. They were never a handle; select columns through [data-region="footer-nav"] instead.
Variables whose values changed
The names are all still there. These now hold different values, mostly to clear WCAG AA contrast:
| Variable | 1.10 | 1.11 |
|---|---|---|
--color-ink-mute | #6b6a62 on Newsprint, Mist, Stone and Press; #8e8b80 in dark mode | Newsprint #66655e, Mist #62615a, Stone #5b5a53, Press #66665e; dark mode Mist #969387, Stone #99968a. Mono is unchanged. |
--color-ink-faint | #767468 (Mono #6e6e6e); #8a877c in dark mode | Newsprint #6a685d, Mist #676559, Stone #5f5d52, Press #6b695e, Mono #6c6b6b; dark mode Mist #928f83, Stone #959186 |
--color-prose-captions, --color-prose-invert-captions, and --color-grey-500 in dark mode (it is not set in light mode, in either version) | --color-ink-mute | still --color-ink-mute, so they move with it |
--color-prose-counters | a fixed #6b6a62 | --color-ink-mute |
--color-prose-links, --color-prose-code, --color-prose-invert-code | the exact accent | --color-accent-readable |
--color-accent-contrast | Ghost's black-or-white pick | a measured black-or-white pick, in browsers with relative colour syntax |
A rule of yours that sets any of these still wins, as it did in 1.10.
Classes that left the stylesheet
Meridian's stylesheet holds only the utility classes its own templates use, so the set changes from release to release; the supported styling API is the handles, the component classes and the variables on this page. If an HTML card or a snippet of yours used one of these 1.10 classes, it no longer has an effect:
text-accent, !text-accent, hover:text-accent, group-hover:text-accent, text-accent-safe, bg-accent-safe, bg-accent-on-dark, border-accent-safe, border-accent-safe/50, border-accent-on-dark, accent-accent-safe, accent-accent-on-dark, decoration-accent/30, hover:bg-accent-ink, hover:border-accent, hover:border-accent-ink, focus:border-accent, focus:outline-accent, focus-visible:outline-accent, focus-visible:ring-accent, selection:bg-accent, selection:text-paper, btn-tertiary, border-l-[3px], md:border-l, md:pl-10, md:px-2, md:py-1, px-[9px], py-[5px], ring-1, ring-rule, dark:bg-paper-3, sm:cursor-default, sm:pointer-events-none.
For accent text, use style="color: var(--color-accent-readable)" or a rule of your own; for anything else, write the CSS in Site Header against a handle.
Scripts
A script that ran once at page load keeps working. To also cover the pages the video player loads, and pages restored when a reader presses Back, move it to meridian:load (see Running a script on every page).
Troubleshooting
Find the handle for anything on the page
Not sure which hook to use? Right-click the thing you want to style and choose Inspect. In the panel that opens, look for the nearest tag with a data-region or data-component attribute — that's your selector.
My CSS isn't taking effect
Meridian's own styles are sometimes more specific than a plain selector. If your rule is being ignored, make the selector more specific (for example, lead with a page class like .post-template ...) or, as a last resort, add !important to the property. Also double-check you wrapped the CSS in <style> tags inside the Site Header box.
The snippet looks broken after pasting
Some editors silently turn straight quotes (") into "smart quotes" (" and "), which CSS doesn't understand. If a snippet stops working after you copied it from a document or chat, retype the quotes, or paste into a plain-text editor first so the quotes stay straight.
See also: Social Links for adding more social icons, and For developers if you'd rather fork the theme and edit the source.
Printing
Meridian ships a print-editorial layout — a cover masthead, running headers, and a source colophon — reachable from the article action toolbar.
Troubleshooting
Quick fixes for common Meridian issues — uploads not applying, hidden settings, empty section rows, the breaking ticker, ads, CTAs, and the mini player.