Hook reference

Every data-region, data-component, data-variant, and data-part hook Enova ships, in lookup tables — header, sidebars, posts, archives, and errors.

Every handle Enova ships, grouped by where it lives on the page. Compose them as region → component[variant] → part. New to the system? Start with the Code injection overview, and grab ready-made CSS from Common snippets.

Site-wide chrome

HookWhat it is
[data-region="site-header"]The sticky top header bar
[data-region="masthead"]The logo + menu-toggle cluster (left of the header)
[data-part="wordmark"]The brand link wrapping the logo or site title
[data-part="logo"]The brand logo image (and the text fallback when there's no logo)
[data-component="auth-links"]A Sign in / Join cluster. Matches two places: see the note below
[data-component="auth-links"]:not([data-variant])The Sign in / Join cluster in the header (desktop and tablet)
[data-component="auth-links"][data-variant="sidebar"]The membership block at the bottom of the mobile menu: Join now and Sign in, or, for signed-in readers, their email linking to their account
[data-component="auth-links"][data-variant="sidebar"] [data-part="avatar"]The reader's profile picture in that block
[data-region="primary-nav"]The horizontal nav (Top bar navigation mode only)
[data-region="site-footer"]The footer
[data-component="footer-brand"]The footer brand block (logo, description, social)
[data-region="footer-nav"]The footer navigation columns
[data-region="footer-legal"]The copyright / colophon row
[data-component="social-links"]A social-icon cluster
[data-component="reading-progress"]The scroll-to-top progress button (posts)

Auth links appear twice

[data-component="auth-links"] matches both the header cluster and the membership block in the mobile menu. Scope your rule to the one you mean: add :not([data-variant]) for the header only, or [data-variant="sidebar"] for the mobile menu only. A bare rule such as [data-component="auth-links"] { display: none } hides both, which leaves phone readers with no way to sign in or join.

HookWhat it is
[data-region="start-sidebar"]The left navigation sidebar (inner content — safe to style)
[data-region="sidebar-nav"]The navigation block inside the left sidebar
[data-region="end-sidebar"]The right sidebar (inner content — safe to style)
[data-component="sidebar-widget"]Any card in the right sidebar (see variants below)
[data-component="sidebar-widget"][data-variant="about"]The publication "about" card
…[data-variant="featured"]The Featured posts widget
…[data-variant="recent"]The Recent posts widget
…[data-variant="popular-tags"]The Popular Tags widget
…[data-variant="top-authors"]The Top Authors widget
…[data-variant="newsletter"]The newsletter signup widget
…[data-variant="recommended"]The Recommendations widget
…[data-variant="related"]The Related posts widget (posts only)
…[data-variant="house-ad"]The house ad card (renders a published page slugged house-ad)
…[data-variant="sponsors"]The sponsors logo grid (renders a published page slugged sponsors)
…[data-variant="donate"]The reader-funded donate card (renders a published page slugged donate)
…[data-variant="custom"]A custom widget card (see the custom widget guide)
…[data-variant="custom"][data-widget-source="page"]A custom widget built from a page tagged #sidebar-widget
…[data-variant="custom"][data-widget-source="post"]A custom widget a single post defined in its own Code injection
…[data-variant="custom"] [data-part="body"]The content area inside a custom widget
…[data-variant="post-nav"]The Previous / Next card (posts only)
[data-region="end-sidebar"] [data-component="post-nav-link"]One row of that card: add [data-variant="prev"] or [data-variant="next"] to pick a side
[data-component="table-of-contents"][data-variant="sidebar"]The sticky table of contents in the right sidebar

Post navigation appears twice

[data-component="post-nav-link"] matches both the sidebar card and the band under the article. Scope your rule to the one you mean: prefix it with [data-region="end-sidebar"] for the sidebar card, or [data-region="post"] for the band.

Homepage & feeds

HookWhat it is
[data-region="hero"]The homepage hero band
[data-region="hero"][data-variant="featured"]Featured-posts carousel hero
…[data-variant="email"]Email-subscription hero
…[data-variant="cta"]Call-to-action hero
…[data-variant="bio"]Author-bio hero
[data-region="home-feed"]The tabbed feed wrapper on the homepage
[data-region="post-feed"]The post grid/list itself

Posts & pages

HookWhat it is
[data-region="post"] / [data-region="page"]The article root
[data-region="post-header"] / [data-region="page-header"]The title block above the content
[data-region="post-header"][data-variant="split-right"]Split hero — text left, portrait image right (opt-in with the #hero-split-right tag)
[data-region="post-header"][data-variant="split-left"]Split hero — portrait image left, text right (#hero-split-left)
[data-region="post-header"][data-variant="cinematic"]Cinematic hero — full-bleed image with the title overlaid in white (#hero-cinematic)
[data-region="post-header"][data-variant="immersive"]Immersive hero — full-browser-width image with the title overlaid; rendered above the sidebars (#hero-immersive)
[data-region="post-meta"]The author / date / read-time / comments bar
[data-part="comments-count"]The comments count link in the post-meta bar (jumps to comments)
[data-component="social-share"]The Share control in the post-meta bar
[data-region="feature-image"]The post or page feature image
[data-region="post-body"]The article body (also covers pages)
[data-region="post-body"][data-variant="dropcap"]Lead paragraph with an enlarged serif initial (opt-in with the #dropcap tag)
[data-region="comments"]The comments section
[data-component="table-of-contents"][data-variant="inline"]The collapsible in-article table of contents
[data-component="member-cta"][data-variant="signup"]The members-only paywall (signed-out)
[data-component="member-cta"][data-variant="upgrade"]The members-only paywall (signed-in, needs upgrade)
[data-region="post"] [data-component="post-nav-link"]Previous / next links in the band under the article: add [data-variant="prev"] or [data-variant="next"] to pick a side. Without the [data-region="post"] prefix this also matches the sidebar card
[data-component="newsletter-cta"]Any newsletter signup surface: the small forms (footer + sidebar) and the end-of-article CTA band below. Use the variant to target just one
[data-component="newsletter-cta"][data-variant="post"]The end-of-article CTA band. Renders only when a published page slugged newsletter-cta exists
[data-part="eyebrow"]The small uppercase label above the CTA headline
[data-part="lede"]The short line under the CTA headline
[data-part="body"]Where your newsletter-cta page body renders: value props, a signed note, or a row of reader faces
[data-part="pitch"]Everything shown before signup. Hidden once the confirmation takes over
[data-part="form"]The subscribe form. It wraps the whole CTA so the confirmation can replace the panel
[data-part="hint"]The fine-print line under the subscribe field
[data-part="success"]The full-panel "check your inbox" confirmation

The newsletter CTA sizes itself to the column

The end-of-article band is a container query container named nlcta, so its subscribe field and headline respond to the width of the article column rather than the browser window. That means they stay correct whether a reader has both sidebars open or closed. You can use the same handle in Code injection, for example @container nlcta (min-width: 40rem) { … }, to retune the band only when the column is wide.

Post hero layouts

Every post uses the centered header by default. You can give one post a different hero with an internal tag — #hero-split-right, #hero-split-left, #hero-cinematic, or #hero-immersive — set up in Editorial conventions. Each layout exposes a [data-region="post-header"][data-variant="…"] hook above, so you can fine-tune it from Code injection. The split layouts respond to the article column width, so they stay side-by-side on wide columns and stack neatly when a sidebar narrows the space; the immersive hero spans the full browser width above the sidebars.

Dropcap

The #dropcap internal tag opens a post or page with an elegant oversized initial on the first paragraph — set up in Editorial conventions. Fine-tune it from Code injection via the [data-region="post-body"][data-variant="dropcap"] hook above (the ::first-letter pseudo-element carries the styling).

Membership page

The dedicated Membership page (the page at slug join) ships two layouts — a comparison grid and a "Join" card — and both expose these hooks.

HookWhat it is
[data-region="membership"]The membership / join page wrapper
[data-component="membership-hero"]The hero — title, subtitle, billing toggle (grid layout)
[data-component="billing-toggle"]The Monthly / Yearly billing toggle
[data-component="tier-grid"]The tier comparison grid (grid layout)
[data-component="tier-card"]A tier card — [data-variant="free"] / [data-variant="paid"]; the highlighted plan also carries [data-featured="true"]
[data-component="join-card"]The "Join" conversion card (the #compact-tier-picker layout)
[data-component="plan-row"]A selectable plan row in the Join card's picker — [data-variant="free"] / [data-variant="paid"]; [data-featured="true"] on the highlighted row
[data-component="order-summary"]The live order-summary panel in the Join card
[data-part="price"]A formatted tier price
[data-part="benefits"]A tier's benefits list

Story previews & their parts

These repeat across cards, rails, and lists. The part names are uniform, so one rule reaches them everywhere.

HookWhat it is
[data-component="post-card"]A feed post card ([data-variant="grid"] or [data-variant="list"])
[data-component="story-link"]A compact text/thumbnail row (sidebar widgets, recommendations)
[data-component="recommendations"]The recommendations list
[data-part="title"]The headline of any preview
[data-part="kicker"]The primary-tag label above a headline
[data-part="excerpt"]The summary text
[data-part="meta"]The byline / date row
[data-part="image"]The preview's image
[data-part="author"]The author name link
[data-part="date"]The published date
[data-part="read-time"]The "N min read" label

Archives & errors

HookWhat it is
[data-region="archive-header"][data-variant="tag"]The tag-archive header
[data-region="archive-header"][data-variant="author"]The author-archive header
[data-region="archive-header"][data-variant="tags"]The Tags Archive directory heading (note the plural)
[data-region="archive-header"][data-variant="authors"]The Authors Archive directory heading
[data-part="cover"]The archive cover image
[data-region="error"][data-variant="404"]The 404 (page not found) error page body
[data-region="error"][data-variant="generic"]Every other error page body (500s and friends)

Enova has no breadcrumb bar

Unlike some themes, Enova doesn't render a visible breadcrumb trail (it ships breadcrumbs as invisible SEO metadata only), so there's no breadcrumb hook to style.

Newsletter archive

HookWhat it is
[data-region="newsletter-archive"]The whole archive page wrapper
[data-region="archive-hero"]The archive hero
[data-component="archive-ledger"]The hero's "ledger" stat card
[data-region="archive-feed"]The list of issues
[data-region="archive-empty"]The empty / coming-soon state
[data-component="year-rail"]The floating year jump-rail
[data-component="newsletter-card"]An issue card — variants list, magazine, compact, timeline, timeline-compact

Tags & Authors archives

The two directory pages from Tags & Authors Archives. Both share a wrapper, so use the variant to target one.

HookWhat it is
[data-region="archive-index"]The whole directory page wrapper
[data-region="archive-index"][data-variant="tags"]The Tags Archive only
[data-region="archive-index"][data-variant="authors"]The Authors Archive only
[data-component="tag-spotlight"]The featured-topics row above the tags directory
…[data-variant="featured"]That row when you curated it by tagging the archive page
…[data-variant="popular"]That row when it falls back to your six most-used tags
[data-component="tag-spotlight-card"]One card in that row
[data-component="archive-controls"]The search box and sort toggle
[data-component="archive-jump-bar"]The sticky letter bar (tags only)
[data-part="list"]The directory list itself
[data-component="tag-row"]One row of the tags directory
[data-part="badge"]The post-count pill on a tag row
[data-part="group-label"]The letter shown in the margin at the start of a group
[data-component="author-card"]One card in the authors directory
[data-part="avatar"]The author's photo, or the initial shown in its place
[data-part="bio"]The author's bio line
[data-part="location"]The author's location line
[data-region="archive-empty"]The "nothing found" state (shared with the newsletter archive)

Style the letter, not the grouping

[data-part="group-label"] is safe to restyle: change its colour, size, or the space it occupies. Avoid display: none on it, though. The letters are what screen readers announce as the section headings for each group, so hiding them removes that structure. To turn grouping off entirely, readers already have the Most posts sort.

Two states worth knowing

The page wrapper carries data-grouped="true" while letter grouping is on (it flips to false under Most posts sorting), and data-filtering="true" while a reader is searching. Both are read-only markers you can select on, for example [data-archive-index][data-filtering="true"] [data-component="tag-spotlight"] { opacity: .4 } to fade the featured row during a search.

Post counts

Any post count above 999 is written with your language's thousands separator, so a big topic reads 1,234 posts rather than 1234 posts. It's applied on tag and author page headers, the Popular Tags and Top Authors sidebar widgets, both directory pages, the featured-topics row, and the newsletter archive's issue counter.

HookWhat it is
[data-format-count]An element whose number gets separators. Read-only marker you can select on

The separator follows your site language: 1,234 in English, 1.234 in German, 1 234 in French. Counts of 999 or less are left exactly as they are.

Select it, don't remove it

[data-format-count] is a functional marker the theme's own script reads, so use it to select an element (for example [data-format-count] { font-variant-numeric: tabular-nums }) rather than adding or removing it in your own markup.

These handles are a promise

Every hook on this page is a stable, documented API. We treat renaming or removing one as a breaking change and call it out in the changelog — so a rule you write today keeps working through theme updates.