/* =========================================================================
   Drip Create — WordPress bridge styles.
   Loads AFTER _v2-source.css (enqueued separately in functions.php — no
   @import, so caching/minify plugins can't strip the layout). These rules
   adapt the ported editorial CSS to WordPress block markup.
   The font CSS variables live in fonts.css so they're defined before
   _v2-source.css consumes them.
   ========================================================================= */

/* -------------------------------------------------------------------------
   WordPress bridge: the source markup wrapped everything in <div class="v2">.
   In WP the <main class="v2"> carries that scope, and block wrappers add
   .wp-block-* classes. These rules neutralise default block spacing/centering
   so the editorial layout reads the same as the Next.js build.
   ------------------------------------------------------------------------- */
.v2 .wp-block-group,
.v2 .wp-block-columns,
.v2 .wp-block-column { margin-block: 0; }

/* The page renders through core's post-content block, which wraps everything in
   .entry-content (a flow-layout container). Make sure that wrapper and <main>
   impose no width cap / padding / gap, so our full-bleed sections span edge to
   edge exactly as they did when rendered directly. */
.v2 > .entry-content,
.v2.wp-block-post-content,
.v2 .entry-content.wp-block-post-content {
  max-width: none;
  width: 100%;
  margin: 0;
  padding: 0;
  gap: 0;
}
.v2 > .entry-content > * { max-width: none; }

/* -------------------------------------------------------------------------
   Reconcile WordPress's automatic block-layout with the editorial v2 design.

   The PREVIOUS approach (zeroing has-global-padding and stripping
   is-layout-constrained margins) was WRONG: the v2 sections set their OWN
   horizontal padding (e.g. .v2-projects { padding:120px 40px }), and the page
   uses useRootPaddingAwareAlignments, so killing the padding mechanism left the
   content slammed against the left edge. We now let the v2 sections own their
   width + padding, and only stop core's CONSTRAINED layout from capping their
   width — without touching padding. Scope is .v2 so the editor chrome is safe.
   ------------------------------------------------------------------------- */

/* The v2 sections are full-bleed: let them ignore the contentSize/wideSize cap
   and the root-padding mechanism, but KEEP each section's own padding (set in
   _v2-source.css). We override max-width + auto-centre margins only. */
.v2 .is-layout-constrained {
  max-width: none;
}
.v2 .is-layout-constrained > *,
.v2 .is-layout-constrained > .alignwide,
.v2 .is-layout-constrained > .alignfull {
  max-width: none;
  margin-left: 0;
  margin-right: 0;
}
/* Root-padding-aware alignments add var(--wp--style--root--padding-*) to
   constrained sections. The v2 sections already carry their own side padding,
   so neutralise the ADDED root padding to avoid doubling it — but only on the
   section wrappers (which carry a v2 class), never the inner content blocks. */
.v2 .wp-block-group.has-global-padding {
  padding-left: 0;
  padding-right: 0;
}
/* core injects a default vertical block-gap on flow wrappers; the v2 sections
   manage their own vertical rhythm, so zero the injected default. */
.v2 .is-layout-flow {
  --wp--style--block-gap: 0;
}

/* The hero is a wp:group (layout:default → is-layout-flow). Core's flow layout
   overrode the .v2-hero flex, so justify-content:flex-end was lost and the
   topline/headline bunched at the TOP instead of sitting at the bottom of the
   100vh hero (the "spacing too tight" vs the Next build). Re-assert the column
   flex on the higher-specificity .wp-block-group selector so it wins. */
.v2-hero.wp-block-group {
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  min-height: 100vh;
}
.v2-hero-inner.wp-block-group { max-width: none; }
/* The topline + foot are wp:group flex rows; core's is-layout-flex forces
   align-items:center and injects its own gap, which shifts the hero's vertical
   spacing vs the Next build. Re-assert their intended flex on .wp-block-group. */
.v2-hero-topline.wp-block-group {
  align-items: baseline;
  margin-bottom: 28px;
  gap: 12px;
}
.v2-hero-foot.wp-block-group {
  align-items: flex-end;
  margin-top: 36px;
  gap: 32px;
}

/* -------------------------------------------------------------------------
   Headings. WordPress applies theme.json's global heading styles to EVERY
   h1–h6 (the elements.heading cascade — Gutenberg #42082), which fought the
   per-element v2 rules; the intro statement in particular wants the BODY font,
   not display. We removed the global heading typography from theme.json, so the
   baseline below restores the display-font defaults ONLY inside .v2 (scoped so
   it never touches editor/admin chrome). Specific .v2-* rules in _v2-source.css
   override font-family / size where needed (e.g. .v2-intro-statement uses body).
   ------------------------------------------------------------------------- */
.v2 :is(h1, h2, h3, h4, h5, h6) {
  font-family: var(--font-display);
  font-weight: 400;
  letter-spacing: -0.02em;
  line-height: 0.85;
  text-transform: uppercase;
  color: var(--off-white);
}
.v2 .v2-intro-statement {
  font-family: var(--font-body);
  line-height: 1.18;
  text-transform: none;
}
/* The closing CTA band has a LIGHT (#fafafa) background, so its heading is dark.
   The .v2 h1–h6 baseline above (color: off-white) loads after _v2-source.css and
   matches at equal specificity, which turned "LET'S BUILD" near-white on white.
   Re-assert the CTA's intended dark text + acid "together". */
.v2 .v2-cta h2 { color: #0a0a0a; }
.v2 .v2-cta h2 em { color: #9bd400; }

/* Safety net: if the editor ever re-adds a core font-size preset (which ships
   with !important and would override the v2 sizes), re-assert the intended size
   on the combined selector. Patterns no longer set fontSize, so normally inert. */
.v2 .v2-hero-headline[class*="has-"] { font-size: clamp(64px, 13.5vw, 230px) !important; }
.v2 .v2-intro-statement[class*="has-"] { font-size: clamp(28px, 4.4vw, 64px) !important; }
.v2 .v2-section-title[class*="has-"] { font-size: clamp(40px, 7vw, 120px) !important; }
.v2 .v2-about-title[class*="has-"] { font-size: clamp(56px, 8vw, 130px) !important; }
.v2 .v2-pkg-title[class*="has-"] { font-size: clamp(48px, 7vw, 110px) !important; }
.v2 .v2-so-title[class*="has-"],
.v2 .v2-contact-title[class*="has-"] { font-size: clamp(44px, 6vw, 96px) !important; }
.v2 .v2-team-name[class*="has-"] { font-size: 34px !important; }
.v2 .v2-cta h2[class*="has-"] { font-size: clamp(56px, 14vw, 260px) !important; }

/* The headline wraps each word in <span class="block"> to stack on its own line;
   core leaves the span inline, so re-assert block display for our hero/title spans. */
.v2 .block { display: block; }

/* core columns → our two-column grids keep their custom gaps from the source */
.v2 .wp-block-columns { gap: 40px; }

/* -------------------------------------------------------------------------
   Nav: the header part is a wp:group with is-layout-flex. Core's flex layout
   injects its own gap and can shift the three columns, so re-assert the v2-nav
   intent and keep the stamp's two lines right-aligned and stacked. The nav uses
   mix-blend-mode:difference (no solid background — it inverts against the hero),
   which is by design; we only fix the spacing/alignment that core perturbs.
   ------------------------------------------------------------------------- */
.v2-nav.wp-block-group {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 200;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
  padding: 18px 40px;
  height: auto;
  min-height: 0;
  margin: 0;
  color: #fff;
  /* Solid pure-black bar (opaque, no gradient/blur). This is the rule that
     actually renders (.v2-nav.wp-block-group beats plain .v2-nav and loads later),
     so the background lives here. Solid black also gives iOS Safari's translucent
     toolbar a black surface to tint from. Extended under the notch/status bar. */
  background: #000;
  padding-top: calc(18px + env(safe-area-inset-top, 0px));
}
.v2-nav .wp-block-site-logo img { height: 28px; width: auto; }

/* nav links in the centre — simple linked paragraphs styled as the menu */
.v2-nav-center.wp-block-group { gap: 28px; flex-wrap: nowrap; }
.v2-nav-item { font-family: var(--font-mono); font-size: 12px; letter-spacing: 0.14em; text-transform: uppercase; margin: 0; }
.v2-nav-item a { color: inherit; text-decoration: none; }
.v2-nav-item a:hover { color: var(--acid); }

/* the stamp: two stacked mono lines, right-aligned at the nav's right edge */
.v2-nav-stamp.wp-block-group {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 2px;
  text-align: right;
}
.v2-nav-stamp .mono { margin: 0; }

/* Mobile nav (≤900px): hide the desktop centre links + stamp and show a hamburger
   that opens a full-screen menu panel. Core's is-layout-flex keeps re-applying
   display:flex to the wp:group nav-center, so the hide needs the higher-specificity
   .wp-block-group selector + !important to win. */

/* burger button — hidden on desktop, shown on mobile */
.v2-nav-burger {
  display: none;
  flex-direction: column;
  justify-content: center;
  gap: 5px;
  width: 40px;
  height: 40px;
  padding: 8px;
  margin: 0;
  background: transparent;
  border: none;
  cursor: pointer;
  z-index: 210;
}
.v2-nav-burger span {
  display: block;
  width: 24px;
  height: 2px;
  background: var(--off-white);
  border-radius: 2px;
  transition: transform 0.3s ease, opacity 0.2s ease;
}
.v2-nav-burger[aria-expanded="true"] span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.v2-nav-burger[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
.v2-nav-burger[aria-expanded="true"] span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

/* full-screen mobile menu panel */
.v2-mobile-menu {
  position: fixed;
  inset: 0;
  z-index: 205;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  justify-content: center;
  gap: 8px;
  padding: 100px 32px 48px;
  background: var(--black);
  opacity: 0;
  visibility: hidden;
  transform: translateY(-8px);
  transition: opacity 0.32s ease, transform 0.32s ease, visibility 0s linear 0.32s;
}
.v2-mobile-menu.is-open {
  opacity: 1;
  visibility: visible;
  transform: none;
  transition: opacity 0.32s ease, transform 0.32s ease;
}
/* explicit × close button, top-right of the open menu */
.v2-mobile-menu-close {
  position: absolute;
  top: 22px;
  right: 24px;
  width: 44px;
  height: 44px;
  padding: 0;
  background: transparent;
  border: none;
  cursor: pointer;
  z-index: 2;
}
.v2-mobile-menu-close span {
  position: absolute;
  top: 50%;
  left: 50%;
  width: 26px;
  height: 2px;
  background: var(--off-white);
  border-radius: 2px;
}
.v2-mobile-menu-close span:nth-child(1) { transform: translate(-50%, -50%) rotate(45deg); }
.v2-mobile-menu-close span:nth-child(2) { transform: translate(-50%, -50%) rotate(-45deg); }
.v2-mobile-menu-close:active span { background: var(--acid); }

.v2-mobile-menu-links { display: flex; flex-direction: column; gap: 4px; }
.v2-mobile-menu-links a {
  font-family: var(--font-display);
  text-transform: uppercase;
  font-size: clamp(40px, 13vw, 72px);
  line-height: 1.04;
  letter-spacing: -0.01em;
  color: var(--off-white);
  text-decoration: none;
  transition: color 0.2s ease;
}
.v2-mobile-menu-links a:active,
.v2-mobile-menu-links a:hover { color: var(--acid); }
.v2-mobile-menu-cta {
  margin-top: 28px;
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-family: var(--font-mono);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  background: var(--acid);
  color: #0a0a0a;
  padding: 16px 26px;
  border-radius: 999px;
  text-decoration: none;
}
.v2-mobile-menu-stamp {
  margin-top: 28px;
  font-size: 11px;
  letter-spacing: 0.16em;
  color: var(--muted);
}

@media (max-width: 900px) {
  .v2-nav-center.wp-block-group { display: none !important; }
  .v2-nav-stamp.wp-block-group { display: none !important; }
  .v2-nav-burger { display: flex; }
}
/* keep the menu itself hidden above the mobile breakpoint regardless */
@media (min-width: 901px) {
  .v2-mobile-menu, .v2-nav-burger { display: none !important; }
}
/* lock body scroll while the menu is open */
.v2-menu-lock { overflow: hidden; }

/* (The GROWTH word now uses the full .v2-growth-wrap liquid-fill structure from
   _v2-source.css, driven by the --grow-fill scroll var in app.js — the old
   static .v2-growth gradient span was replaced in the about pattern.) */

/* CTA corner tiles get their video injected by app.js; keep them framed */
.v2-cta-tile video { width: 100%; height: 100%; object-fit: cover; display: block; }

/* shortcode-rendered contact form inherits the form styling from the source */
.v2-contact-form-col .v2-form { width: 100%; }

/* reduced-motion: the source already handles reveals; ensure videos don't autoplay */
@media (prefers-reduced-motion: reduce) {
	.v2-cta-tile video, .v2-vmarquee video { animation: none !important; }
}

/* =========================================================================
   PROSE LAYER (1.0.25) — ordinary page / post content.
   page.html + single.html wrap content in <main class="v2">, so the editorial
   `.v2 *{margin:0;padding:0}` reset and the uppercase display-font headings hit
   PLAIN content too (bare paragraphs lose spacing, lists lose their bullets and
   indent, headings collapse to line-height:0.85). These rules restore a readable
   reading rhythm — while keeping the dark brand canvas + brand fonts — for
   standard blocks that are NOT part of a bespoke `.v2-*` section (those keep
   their own layout untouched). Scoped with a child combinator from the
   post-content flow (`.entry-content > *`) so nested content inside the
   pattern-built home/packages sections is never affected.

   Each rule carries a SECOND selector targeting the block-editor canvas root
   (`.editor-styles-wrapper .is-root-container > *`) so plain pages read the same
   while editing. That selector is inert on the front end (the class only exists
   in the editor) and, after editor-v2.css is regenerated, the `.entry-content`
   selector is the inert one — so the correct half is live in each context.
   ========================================================================= */

/* readable column + vertical rhythm for top-level plain blocks */
.v2 .entry-content > p:not([class*="v2-"]),
.v2 .entry-content > ul:not([class*="v2-"]),
.v2 .entry-content > ol:not([class*="v2-"]),
.v2 .entry-content > blockquote:not([class*="v2-"]),
.v2 .entry-content > figure:not([class*="v2-"]),
.v2 .entry-content > pre:not([class*="v2-"]),
.v2 .entry-content > table:not([class*="v2-"]),
.v2 .entry-content > h1:not([class*="v2-"]),
.v2 .entry-content > h2:not([class*="v2-"]),
.v2 .entry-content > h3:not([class*="v2-"]),
.v2 .entry-content > h4:not([class*="v2-"]),
.v2 .entry-content > h5:not([class*="v2-"]),
.v2 .entry-content > h6:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > p:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > ul:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > ol:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > blockquote:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > figure:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > pre:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > table:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > h1:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > h2:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > h3:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > h4:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > h5:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > h6:not([class*="v2-"]) {
  max-width: 820px;
  margin-left: auto;
  margin-right: auto;
}

/* body paragraphs */
.v2 .entry-content > p:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > p:not([class*="v2-"]) {
  font-family: var(--font-body);
  font-size: 1.05rem;
  line-height: 1.7;
  color: var(--off-white);
  text-transform: none;
  letter-spacing: normal;
  margin-bottom: 1.25em;
}

/* headings: keep the brand display font + uppercase, but restore usable sizes,
   line-height and spacing (the .v2 baseline crushes them to line-height:0.85) */
.v2 .entry-content > :is(h1,h2,h3,h4,h5,h6):not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > :is(h1,h2,h3,h4,h5,h6):not([class*="v2-"]) {
  line-height: 1.06;
  margin-top: 1.4em;
  margin-bottom: 0.5em;
}
.v2 .entry-content > h1:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > h1:not([class*="v2-"]) { font-size: clamp(2.4rem, 5vw, 3.4rem); }
.v2 .entry-content > h2:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > h2:not([class*="v2-"]) { font-size: clamp(1.9rem, 4vw, 2.6rem); }
.v2 .entry-content > h3:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > h3:not([class*="v2-"]) { font-size: clamp(1.5rem, 3vw, 2rem); }
.v2 .entry-content > h4:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > h4:not([class*="v2-"]) { font-size: 1.4rem; }
.v2 .entry-content > h5:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > h5:not([class*="v2-"]) { font-size: 1.15rem; }
.v2 .entry-content > h6:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > h6:not([class*="v2-"]) { font-size: 1rem; letter-spacing: 0.06em; }

/* links inside plain content */
.v2 .entry-content > p:not([class*="v2-"]) a,
.v2 .entry-content > ul:not([class*="v2-"]) a,
.v2 .entry-content > ol:not([class*="v2-"]) a,
.v2 .entry-content > blockquote:not([class*="v2-"]) a,
.editor-styles-wrapper .is-root-container > p:not([class*="v2-"]) a,
.editor-styles-wrapper .is-root-container > ul:not([class*="v2-"]) a,
.editor-styles-wrapper .is-root-container > ol:not([class*="v2-"]) a,
.editor-styles-wrapper .is-root-container > blockquote:not([class*="v2-"]) a {
  color: var(--acid);
  text-decoration: underline;
  text-underline-offset: 3px;
}

/* lists: restore markers + indentation + item spacing */
.v2 .entry-content > ul:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > ul:not([class*="v2-"]) {
  list-style: disc;
  padding-left: 1.4em;
  margin-bottom: 1.25em;
  font-family: var(--font-body);
  color: var(--off-white);
  line-height: 1.7;
}
.v2 .entry-content > ol:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > ol:not([class*="v2-"]) {
  list-style: decimal;
  padding-left: 1.5em;
  margin-bottom: 1.25em;
  font-family: var(--font-body);
  color: var(--off-white);
  line-height: 1.7;
}
.v2 .entry-content > ul:not([class*="v2-"]) li,
.v2 .entry-content > ol:not([class*="v2-"]) li,
.editor-styles-wrapper .is-root-container > ul:not([class*="v2-"]) li,
.editor-styles-wrapper .is-root-container > ol:not([class*="v2-"]) li {
  margin-bottom: 0.45em;
  padding: revert;
}
.v2 .entry-content > ul:not([class*="v2-"]) ul,
.v2 .entry-content > ol:not([class*="v2-"]) ol,
.editor-styles-wrapper .is-root-container > ul:not([class*="v2-"]) ul,
.editor-styles-wrapper .is-root-container > ol:not([class*="v2-"]) ol {
  margin: 0.4em 0 0.4em 0;
}

/* blockquote */
.v2 .entry-content > blockquote:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > blockquote:not([class*="v2-"]) {
  border-left: 3px solid var(--acid);
  padding: 0.2em 0 0.2em 1.2em;
  margin-bottom: 1.25em;
  color: #cfcfcf;
  font-family: var(--font-body);
  font-size: 1.15rem;
  line-height: 1.6;
}

/* code + pre */
.v2 .entry-content > p:not([class*="v2-"]) code,
.v2 .entry-content > ul:not([class*="v2-"]) code,
.v2 .entry-content > ol:not([class*="v2-"]) code,
.editor-styles-wrapper .is-root-container > p:not([class*="v2-"]) code,
.editor-styles-wrapper .is-root-container > ul:not([class*="v2-"]) code,
.editor-styles-wrapper .is-root-container > ol:not([class*="v2-"]) code {
  font-family: var(--font-mono);
  font-size: 0.9em;
  background: var(--zinc);
  padding: 0.12em 0.4em;
  border-radius: 4px;
}
.v2 .entry-content > pre:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > pre:not([class*="v2-"]) {
  font-family: var(--font-mono);
  background: var(--zinc);
  border: 1px solid var(--line);
  border-radius: 8px;
  padding: 1em 1.2em;
  overflow: auto;
  margin-bottom: 1.25em;
  line-height: 1.5;
}

/* images / figures */
.v2 .entry-content > figure:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > figure:not([class*="v2-"]) {
  margin-bottom: 1.5em;
}
.v2 .entry-content > figure:not([class*="v2-"]) img,
.editor-styles-wrapper .is-root-container > figure:not([class*="v2-"]) img {
  max-width: 100%;
  height: auto;
  border-radius: 6px;
}
.v2 .entry-content > figure:not([class*="v2-"]) figcaption,
.editor-styles-wrapper .is-root-container > figure:not([class*="v2-"]) figcaption {
  font-family: var(--font-mono);
  font-size: 12px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--muted);
  margin-top: 0.6em;
}

/* horizontal rule */
.v2 .entry-content > hr:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > hr:not([class*="v2-"]) {
  border: 0;
  border-top: 1px solid var(--line);
  margin: 2.4em auto;
  max-width: 820px;
}

/* simple table styling */
.v2 .entry-content > figure:not([class*="v2-"]) table,
.v2 .entry-content > table:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > figure:not([class*="v2-"]) table,
.editor-styles-wrapper .is-root-container > table:not([class*="v2-"]) {
  width: 100%;
  border-collapse: collapse;
  font-family: var(--font-body);
  color: var(--off-white);
  margin-bottom: 1.5em;
}
.v2 .entry-content > table:not([class*="v2-"]) :is(th,td),
.editor-styles-wrapper .is-root-container > table:not([class*="v2-"]) :is(th,td) {
  border: 1px solid var(--line);
  padding: 0.6em 0.8em;
  text-align: left;
}
/* PROSE LAYER END */


/* =========================================================================
   PROSE LAYER v2 (1.0.37) — core-block coverage + nested content + measure.
   Complements the theme.json brand defaults for core blocks: keeps them within
   the reading measure on plain pages and restores spacing for content nested
   inside a Group/Columns (which the `.v2 *{margin:0}` reset zeroes and the
   top-level prose rules don't reach). Scoped to the post-content flow and to
   blocks that are NOT bespoke .v2-* sections, so pattern pages are untouched.
   ========================================================================= */

/* newly branded core blocks share the 820px reading measure at top level */
.v2 .entry-content > .wp-block-quote:not([class*="v2-"]),
.v2 .entry-content > .wp-block-pullquote:not([class*="v2-"]),
.v2 .entry-content > .wp-block-code:not([class*="v2-"]),
.v2 .entry-content > .wp-block-preformatted:not([class*="v2-"]),
.v2 .entry-content > .wp-block-table:not([class*="v2-"]),
.v2 .entry-content > .wp-block-separator:not([class*="v2-"]),
.v2 .entry-content > .wp-block-buttons:not([class*="v2-"]),
.v2 .entry-content > .wp-block-list:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > .wp-block-quote:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > .wp-block-pullquote:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > .wp-block-code:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > .wp-block-preformatted:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > .wp-block-table:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > .wp-block-separator:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > .wp-block-buttons:not([class*="v2-"]),
.editor-styles-wrapper .is-root-container > .wp-block-list:not([class*="v2-"]) {
  max-width: 820px;
  margin-left: auto;
  margin-right: auto;
}

/* nested plain content: spacing inside a top-level non-.v2 block (Group, Columns…) */
.v2 .entry-content > :not([class*="v2-"]) :where(p, ul, ol, blockquote, pre, figure, table),
.editor-styles-wrapper .is-root-container > :not([class*="v2-"]) :where(p, ul, ol, blockquote, pre, figure, table) {
  margin-bottom: 1.1em;
}
.v2 .entry-content > :not([class*="v2-"]) :where(h1, h2, h3, h4, h5, h6),
.editor-styles-wrapper .is-root-container > :not([class*="v2-"]) :where(h1, h2, h3, h4, h5, h6) {
  margin-top: 1.4em;
  margin-bottom: 0.5em;
  line-height: 1.06;
}
.v2 .entry-content > :not([class*="v2-"]) :where(ul, ol),
.editor-styles-wrapper .is-root-container > :not([class*="v2-"]) :where(ul, ol) {
  padding-left: 1.4em;
}
.v2 .entry-content > :not([class*="v2-"]) li,
.editor-styles-wrapper .is-root-container > :not([class*="v2-"]) li {
  margin-bottom: 0.4em;
  list-style: revert;
}
.v2 .entry-content > :not([class*="v2-"]) a,
.editor-styles-wrapper .is-root-container > :not([class*="v2-"]) a {
  color: var(--acid);
  text-decoration: underline;
  text-underline-offset: 3px;
}
/* PROSE LAYER v2 END */

/* =========================================================================
   UTILITY TEMPLATES (1.0.50) — single post, 404, search.
   The `.v2 .is-layout-constrained > * { max-width:none }` rule above (needed so
   the bespoke full-bleed .v2-* sections span edge to edge) also strips the width
   cap from ordinary blog/utility content — so the blog FEATURED image (which sits
   OUTSIDE .entry-content, beyond the prose layer's reach) and the 404 search box
   ran full width. Re-impose a readable measure on those templates via the
   WordPress body classes, plus a global image safety cap. Scoped so the
   pattern/section pages are untouched.
   ========================================================================= */

/* Width overflow safety everywhere (harmless to the cover-fit .v2-* media). */
.v2 img,
.v2 video { max-width: 100%; }

/* Proportional height for ORDINARY CONTENT media only. The bespoke .v2-* sections
   (CTA corner tiles, project thumbs/inline, video marquee, team portraits) rely on
   height:100% + object-fit:cover to fill their frames — a global `height:auto`
   (same specificity, loaded later than _v2-source.css) was overriding that and
   letterboxing them. Content images are core blocks / single-post / 404 / search,
   never the .v2-* components, so scope height:auto to those and leave the
   components alone. */
body.single .v2 img,
body.single .v2 video,
body.error404 .v2 img,
body.search .v2 img,
.v2 .wp-block-image img,
.v2 .wp-block-post-featured-image img { height: auto; }

/* Blog single: featured image + all top-level content to a left-aligned measure
   (aligns under the left-aligned post title). */
body.single .v2 .wp-block-post-featured-image,
body.single .v2 .entry-content > *:not([class*="v2-"]) {
  max-width: 820px;
  margin-left: 0;
  margin-right: auto;
}

/* 404 + search: keep the content column readable and left-aligned rather than
   letting the search box / results stretch edge to edge. Padding stays from the
   template (10rem/8rem top-bottom, 40px sides). */
body.error404 .v2.is-layout-constrained > *,
body.search .v2.is-layout-constrained > * {
  max-width: 760px;
  margin-left: 0;
  margin-right: 0;
}
        