Rebuild static/dist/theme.css to reflect the text-25px → text-24px
fix in views/blocks/services-list/services-list.css. The
.services-list__heading rule now resolves cleanly in Tailwind v4.
Co-Authored-By: Claude <noreply@anthropic.com>
The text-25px literal is not a registered token in the project's
typography scale (--text-*). Replace with the closest existing
token, text-24px, to satisfy Tailwind v4 @apply resolution.
Co-Authored-By: Claude <noreply@anthropic.com>
Lists every published page on the site that has hero_style = 'default' and
is not a Services descendant. Those are the pages whose visible hero
behavior changes when isServicesDescendant() is enabled.
Runs from the WordPress root via:
php bin/check-affected-pages.php
The script bootstraps wp-load.php, queries WP_Query for all 'page'
posts, filters by the ACF 'hero_style' meta, then defers the ancestor
check to CWC\isServicesDescendant() (the same helper the gate uses) so
the output matches runtime behavior. Operator should run this before
enabling the gate on a real site.
isServicesDescendant() gates the inner-page hero on being a Services
descendant. The existing inner-page.spec.js fixtures (sample-page, etc.)
are not Services descendants, so without the bypass the hero would not
render in tests and the suite would fail.
The constant CWC_TEST_BYPASS_HERO_GATE was added in lib/extras.php for
exactly this case, but the dev site's wp-config.php is operator-managed
and cannot be modified by the theme. This note records the single line
the operator needs to add to wp-config.php, plus the rationale and a
production warning.
SVGs loaded via <img src> cannot inherit currentColor from the parent
document, so the .contact-info__icon { color: ... } rule had no effect and
the icons rendered in the SVG's own default color (black).
Bake the stroke color in directly: stroke="#8FC9E6" (CWC Blue 03). The
final user-provided SVGs will replace these placeholders later, so this is
the minimal change to make the icons visible in the brand color today.
- contact-info.php was calling esc_attr() on the output of
blockWrapperAttributes(), which returns a full attribute string.
esc_attr() turned the wrapping quotes into " so the class
attribute rendered literally as class="contact-info ...".
Switched to wp_kses_post() to match the pattern used by every
other block template in the project.
- contact-info.css: .gfield_required used --color-cwc-orange-01
(#e15747, 3.71:1 on white) which fails WCAG 2 AA. Swapped to the
project's --color-secondary-accessible token (#c43c2b) so the
required marker is brand-aligned and meets the 4.5:1 minimum.
- Regenerated static/dist/theme.css to match.
- styles/blocks/page-hero.css:
- .page-hero__vector: width is now 100% (was clamp(28rem, 60vw, 56rem))
so the orange linework spans the full width of the hero. The SVG
scales proportionally (1920x489 viewBox).
- .page-hero__media: added top: clamp(2rem, 4vw, 4rem) so the image
has visible top padding inside the hero (in addition to overflowing
the bottom). Reduced right offset to clamp(0.5rem, 2vw, 2rem) so
the image sits closer to the right edge. Width is 'auto' with
max-width: clamp(20rem, 30vw, 28rem) so the image's natural aspect
ratio (490x613 portrait) is preserved.
- views/partials/page-hero.php: .page-hero__content is now 'container
mx-auto px-0!' so the breadcrumbs, H1, and intro sit flush left at
x=0, matching the logo's left edge (which is also at x=0 thanks to
the header's px-0! override on its container).
Co-Authored-By: Claude <noreply@anthropic.com>
- views/partials/page-hero.php: removed the page-intro partial call. The
intro is now rendered inline as a single .page-hero__intro div
containing the editor-supplied intro text only (no hard-coded
heading). The H1 is rendered with a dedicated .page-hero__heading
class for typography control. Breadcrumbs + H1 + intro are in a
single .page-hero__content container.
- views/partials/page-intro.php: deleted (no longer used).
- styles/blocks/page-hero.css: rewritten layout. The hero has a min-height
of clamp(31rem, 38vw, 36rem). .page-hero__media is a foreground
absolutely-positioned img on the right (no mask, no cover, no
object-fit), with bottom: -10% so the image's bottom hangs over
the bottom edge of the hero. The vector is positioned at
bottom: clamp(1.5rem, 4vw, 3rem) with some spacing from the bottom
edge, full-width on the left. Both elements stay above the content
layer (z-index 10) and below the breadcrumb/title text. The H1 uses
Quincy serif at clamp(2.5rem, 6vw, 4.5rem). The intro text is
capped at 36rem to sit alongside the H1 without spanning the full
hero width.
- tests/inner-page.spec.js: removed the now-obsolete
.page-hero__intro-heading / .page-hero__intro-text assertions (the
intro is a single text block now).
Co-Authored-By: Claude <noreply@anthropic.com>
- Goal: hero is now a blue-to-teal gradient (not a flat dark color) and the
intro block lives inside the hero composition (not as a separate page
section).
- Architecture: reduced from 3-part (hero / intro / body) to 2-part
(hero / body) since the intro is now embedded in the hero.
- Hero Partial: dropped the bg-dark utility (gradient is set in CSS), the
hero image is anchored to the right with a left-to-right fade, and the
vector is full-width anchored to the bottom at z-index 2.
- Hero Partial CSS: the file is at styles/blocks/page-hero.css (not
views/partials/page-hero.css). Updated the rules to match the new
gradient + image right-side + vector bottom-center + intro grid layout.
- Intro Partial: rewritten as a fragment for embedding inside the hero
(two-column heading + body grid) rather than a centered standalone
section. Partial is loaded by page-hero.php, not page.php.
- page.php Wiring: no longer loads the page-intro partial directly; the
partial is loaded by page-hero.php.
- Error Handling, Verification, and Acceptance Criteria: updated to
match the new structure (no empty .page-intro wrapper check; intro is
a descendant of the hero; gradient + image-right + vector-bottom-center
expectations).
Co-Authored-By: Claude <noreply@anthropic.com>
- styles/blocks/page-hero.css: add blue-to-teal gradient to .page-hero (matches
homepage-hero). Fix image mask direction (right-to-left fade) so the image
is visible on the right and fades to transparent on the left. Reposition
the vector to span the full bottom of the hero at z-index 2 (above the
media layer, below content). Add .page-hero__intro and .page-hero__intro-inner
grid rules for the new two-column heading + body block.
- views/partials/page-hero.php: drop bg-dark / bg-cover / bg-no-repeat
utilities (the gradient comes from CSS now). Simplify the heading render.
Load the page-intro partial inside .page-hero__content, below the heading.
- views/partials/page-intro.php: rewrite as a fragment for embedding inside
the hero - a two-column heading (hard-coded 'Our Work') + body grid.
Returns early when the intro field is empty.
- page.php: remove the page-intro partial call (it's now loaded from
page-hero.php).
- tests/inner-page.spec.js: switch the selector from .page-intro to
.page-hero__intro. Update the order assertions to verify the intro is
a descendant of the hero (not a sibling below it).
Co-Authored-By: Claude <noreply@anthropic.com>
Defines the inner page layout: dark hero with background image and decorative
vector (driven by two new fields on the existing Page Heading ACF group), a
centered narrow intro section underneath (driven by the existing Intro field),
and the standard the_content body.
The mockup's bottom dark block is the existing site footer, not a new CTA. No
new ACF blocks are introduced; the layout reuses the existing Page Heading meta
box and the page-hero partial that header.php already loads.
Co-Authored-By: Claude <noreply@anthropic.com>