/* Small additions on top of the prototype CSS — only what's needed
 * to swap React state-driven props for vanilla-JS class toggles.
 */

/* Star fill: React passed `fill="currentColor"` per-star.
 * In static markup we just toggle .is-on. */
.rs-star { fill: none; }
.rs-star.is-on { fill: currentColor; }

/* Same idea for the "muted" before-rating star row used in testimonials */
.testi-stars.muted-star .rs-star { color: var(--ink-subtle); }

/* Contact-form success state: keep hidden until JS reveals it.
 * The base `.contact-success` rule sets display:flex which overrides
 * the HTML `hidden` attribute — re-assert hidden's intent here. */
.contact-success[hidden] { display: none !important; }
.contact-form.is-success .contact-success[hidden] { display: none !important; }

/* WordPress core blocks reset (only when used inside Page editor for subpages) */
.sub-prose .alignwide { margin-left: 0; margin-right: 0; }
.sub-prose figure { margin: 24px 0; }
.sub-prose figure img { max-width: 100%; height: auto; border-radius: var(--radius); }
.sub-prose code {
  background: var(--surface-2);
  border: 1px solid var(--border);
  padding: 1px 6px;
  border-radius: 4px;
  font-family: var(--font-mono);
  font-size: 13px;
}
.sub-prose pre {
  background: var(--surface-2);
  border: 1px solid var(--border);
  padding: 14px 16px;
  border-radius: var(--radius);
  overflow: auto;
  font-family: var(--font-mono);
  font-size: 13px;
}
.sub-prose hr {
  border: 0;
  border-top: 1px solid var(--border);
  margin: 32px 0;
}

/* Pricing meta lines (vanilla-JS swaps text via data-attrs) */
.price-card[data-flat-fee="true"] .price-unit::after { content: ""; }

/* Skip-to-content (a11y) */
.skip-link {
  position: absolute;
  left: -9999px;
  top: auto;
  w