Skip to content

Add Groups theme#1699

Draft
dd32 wants to merge 97 commits into
WordPress:productionfrom
dd32:add/claude/groups-site-theme
Draft

Add Groups theme#1699
dd32 wants to merge 97 commits into
WordPress:productionfrom
dd32:add/claude/groups-site-theme

Conversation

@dd32
Copy link
Copy Markdown
Member

@dd32 dd32 commented Apr 9, 2026

No description provided.

dd32 and others added 16 commits April 9, 2026 13:58
Net-new theme `groups-site` (renamed from upstream Vibed Groups copy):
heavily reworked to use the wporg color palette + EB Garamond/Inter,
GatherPress integration via custom PHP patterns instead of the
client-hydrated `gatherpress/events-list` block, expanded card grids on
the events archive, RSVP-response avatars styled as a hover-expand row,
and template-hierarchy filters that route gatherpress_event/venue posts
to the theme templates.

Net-new mu-plugin `wporg-groups-frontend`: front-end React modal that
lets meetup organizers create and edit GatherPress events without ever
seeing wp-admin. Uses the inline @wordpress/block-editor for the
description field, autosaves drafts every 5s, prompts before discarding
unsaved input, includes a featured-image picker via wp.media. Backed by
custom REST endpoints under /wporg-groups/v1/ that wrap
Event::save_datetimes() + the venue taxonomy assignment.

Infra: nginx rewrites + sunrise-events.php + sunrise.php to route
/group/<slug>/ URLs on the events network to the right subsite blog.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The plugin was being included from wcorg_include_individual_mu_plugins()
which loads on every network. Now that production has a dedicated groups/
network folder (added in WordPress#1694), drop the unconditional include and add a
one-line stub at mu-plugins/groups/wporg-groups-frontend.php that defers
to the existing plugin folder. The stub is picked up by
wcorg_include_network_only_plugins() so the front-end editor only loads
when SITE_ID_CURRENT_SITE === GROUPS_NETWORK_ID.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace the legacy WPorg_Groups_Frontend / Groups_Site namespaces with the
WordCamp\Groups\Frontend and WordCamp\Groups\Site hierarchies, give every
PHP file in the theme and mu-plugin a real namespace declaration, and
prefer `use` imports over fully-qualified function/class names.

  - mu-plugin: WPorg_Groups_Frontend           -> WordCamp\Groups\Frontend
              WPorg_Groups_Frontend\Modal       -> WordCamp\Groups\Frontend\Modal
              WPorg_Groups_Frontend\REST        -> WordCamp\Groups\Frontend\REST
              WPorg_Groups_Frontend\Defaults    -> WordCamp\Groups\Frontend\Defaults
              WPorg_Groups_Frontend\Capabilities -> WordCamp\Groups\Frontend\Capabilities
  - theme:    Groups_Site                       -> WordCamp\Groups\Site
              Groups_Site\Event_Cards           -> WordCamp\Groups\Site\Event_Cards
  - theme functions.php gains a namespace and drops the `groups_site_`
    function-name prefix; hook callbacks now use __NAMESPACE__.
  - Pattern files each get a per-file namespace under
    WordCamp\Groups\Site\Patterns\*. Card-rendering patterns import
    `Event_Query` and `render_event_cards` via `use`, instead of writing
    fully-qualified calls inline.
  - manage-event-cta / edit-event-link import the capability check via
    `use function` and drop the `function_exists()` guard — the
    wporg-groups-frontend mu-plugin is loaded on the groups network, so
    the function is always available when these patterns render.
  - groups/wporg-groups-frontend.php loader stub gets a
    WordCamp\Groups\Loader namespace.
  - @Package docblocks updated across PHP, JS, and CSS to match.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Theme.json schema version stays at 3 (unchanged in 6.9), so the only
change is the `$schema` URL. Picks up the new validation surface area
6.9 added without altering any existing settings or styles.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…r/footer

Mirror the wporg-events-2023 setup so individual Group sites inherit the
shared wporg parent theme and get the standard wordpress.org global header
and footer wrapped around the site's own local navigation and community
callout.

  - style.css gains `Template: wporg-parent-2021`, making this a true child
    theme. `Requires at least` bumped to 6.9 alongside the theme.json
    schema bump in the previous commit.
  - functions.php enqueue chains the parent stylesheet + wporg global font
    stack as deps for the theme stylesheet, matching wporg-events-2023.
  - parts/header.html prepends `<!-- wp:wporg/global-header /-->` above
    the existing skip-link + site-title + page-list nav block, so the
    wordpress.org chrome sits on top of the local nav.
  - parts/footer.html keeps the "Bring WordPress to your community" callout
    but replaces the hand-rolled footer link list with
    `<!-- wp:wporg/global-footer /-->`, again matching wporg-events-2023.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Re-runs `mysqldump` against the local docker DB to capture the state needed
for the groups network theme work. The new dump:

  - adds network 4 to `wc_site` (`events.wordpress.test`, `/group/`)
  - adds the network root placeholder blog 52 (`/group/`) on site_id 4
  - moves blog 51 (`/group/sunshine-coast-qld/`) from site_id 2 → 4
  - seeds minimal `wc_sitemeta` for site_id 4 (site_name, admin_email,
    admin_user_id, registration, subdomain_install, blog_upload_space,
    fileupload_maxk, upload_filetypes, wpmu_upgrade_site, site_admins,
    `active_sitewide_plugins` with gatherpress)
  - sets `wc_51_options.template` to `wporg-parent-2021` so the now-child
    `groups-site` theme resolves to its parent
  - adds 6 new gatherpress events on blog 51 (4 upcoming + 2 past) so the
    theme's `upcoming-events-cards` and archive cards have realistic
    content; new posts are linked to the existing Salty Spaces venue

Format change: the dump is now in mysqldump multi-line INSERT format
(one row per line) instead of the previous single-line format. This is
just a `mysqldump` default and makes future diffs much easier to read.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The local-header bar (site-title + page-list navigation) was duplicating
the site-title already present in the front-page hero and adding visual
clutter below the wporg global header.

  - parts/header.html now contains only the wporg/global-header block.
  - front-page.html gains a new `.groups-site-local-nav` strip between the
    hero and the main content area, containing the page-list navigation.
  - custom.css replaces the old `.groups-site-local-header` sticky rules
    with lighter `.groups-site-local-nav` styles (link transitions + active
    page highlight). The sticky positioning and backdrop-filter are dropped
    since the nav no longer sits at the top of the viewport.

Inner-page templates (single-event, archive-event, etc.) currently have
no local navigation — that can be addressed in a follow-up once the
desired inner-page layout is decided.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add a `header-inner` template part that includes the wporg global header
followed by the site-title + page-list navigation bar. All inner-page
templates (single-event, archive-event, single-venue, 404, search, index)
now use `header-inner`; the front page keeps the global-header-only
`header` part since its hero already contains the site title.

CSS for `.groups-site-local-header` is restored alongside the
`.groups-site-local-nav` rules (the two are used in different contexts).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The wporg/global-header block declares `"color": { "link": false }` in
its block.json supports. Without the Gutenberg plugin, WP core skips
generating the wp-elements inline styles for link colors inside the
header, breaking the visual appearance. Activating Gutenberg on the
groups network (alongside GatherPress) restores the element styles and
provides the enhanced navigation view module.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The outline "About this group" button in the hero has blueberry-1 text on
a blueberry-1 border. On hover the theme.json button :hover style applies
a deep-blueberry background, but the text stays blueberry-1 — nearly
invisible. Add a CSS rule that flips text to white and border to
deep-blueberry on hover for outline buttons inside the hero.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace the custom .groups-site-local-header group with the shared
wporg/local-navigation-bar block from the wporg-mu-plugins. This gives
inner pages the same sticky breadcrumb-style site-title + navigation bar
that events.wordpress.org uses, with consistent padding, font sizing, and
sticky positioning provided by the block's own stylesheet.

The old .groups-site-local-header CSS rules are dropped since the block
handles its own styling.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The textColor attribute generates a `has-blueberry-1-color` class that WP
renders with `!important`, preventing any CSS hover override. Switch from
`textColor` (preset class) to `style.color.text` (inline style) so the
color can be overridden by the existing hover rule in custom.css.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove the `has-display-contents` class from the local-navigation-bar
block. The parent theme (wporg-parent-2021) defines
`.has-display-contents { display: contents; }` which prevents
`position: sticky` from working because the element no longer generates
a box. The events-2023 theme uses this class for its specific layout
context where the nav bar children need to participate directly in the
parent flex container, but the groups-site inner-page layout does not
need this — the nav bar should be a normal sticky flex container.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The nav bar was inside the <header> template-part wrapper, which limited
its sticky positioning to the header element bounds. When the header
scrolled out of view, the nav bar went with it.

Fix: extract the local-navigation-bar into a pattern (local-navigation)
and reference it directly in each inner-page template AFTER the header
template-part, so it becomes a direct child of wp-site-blocks and can
stick against the viewport.

Also removes the now-redundant header-inner template part — all pages
use the same header (global-header only), with inner pages adding the
local-navigation pattern separately.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The parent theme uses charcoal-0 (#1a1919) for body text and 400 font-
weight for navigation/site-title. The groups-site theme was using
charcoal-1 (#1e1e1e) and font-weight 500, creating a visible mismatch
with the global header chrome.

  - Add charcoal-0 to the palette
  - Switch body text, heading, site-title, navigation, and post-title
    colors from charcoal-1 to charcoal-0
  - Change core/navigation and core/site-title fontWeight from 500 to 400

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Two fixes:

1. Pattern references (wp:pattern slug groups-site/local-navigation) were
   silently producing empty output. Replace with the local-navigation-bar
   block markup inlined directly in each template. Remove the now-unused
   patterns/local-navigation.php file.

2. The theme.json fontFace entries for Inter and EB Garamond were
   re-declaring @font-face via Google Fonts CDN, conflicting with the
   parent theme wporg-global-fonts stylesheet which loads the same fonts
   from local woff2 files. The duplicate declarations caused subtle font-
   weight rendering differences. Remove fontFace arrays and align the
   fontFamily fallback strings with the parent theme values.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@dd32 dd32 self-assigned this Apr 9, 2026
@dd32 dd32 added [Component] Themes & Customization Custom WC Themes, compatibility with core themes, and theme-adjacent customizations to sites [Type] Enhancement [Component] Groups labels Apr 9, 2026
dd32 and others added 10 commits April 9, 2026 19:08
The core/site-title block had explicit fontFamily (EB Garamond),
fontSize (heading-5), and fontWeight (400) set in theme.json. These
overrode the parent theme defaults and made the site-title in the
local-navigation-bar render in a serif font at a larger size than the
events.wordpress.org header uses. Remove the typography properties so the
site-title inherits from the parent theme (Inter, body size).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The inline style from the block markup sets color:var(--wp--preset--
color--blueberry-1) which has higher specificity than the CSS hover rule.
Add !important to the hover color so white text wins over the inline
blueberry-1 on the deep-blueberry hover background (was 1.37:1 contrast,
now meets WCAG AA).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add a site-title + page-list navigation bar between the global header and
the hero content, sharing the hero blueberry-4 background so they read as
one continuous section. The old white nav bar that sat below the hero is
removed.

The hero padding-top is reduced from spacing-70 to spacing-60 to account
for the header bar above it, keeping the overall visual weight similar.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace the custom groups-site-hero-header group with the shared
wporg/local-navigation-bar block using blueberry-4 background so it
merges visually into the hero. This gives the front page the same
sticky behavior, WP logo on scroll, and proper horizontal alignment
that inner pages already have.

Remove the now-unused .groups-site-hero-header CSS rules.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove the two-column hero layout (text + explicit image column) and
replace with a single-column text layout over a CSS background image.
The image is right-aligned and fades to the blueberry-4 background via
a linear-gradient overlay (solid at 0-45%, transparent at 70%), keeping
the left-side text fully readable.

On mobile (<781px) the background image is hidden entirely so the hero
is a clean solid-color block with text only.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace the fixed 2-column (archive) / 3-column (front page) grid with
a single `repeat(auto-fill, minmax(280px, 1fr))` rule. Cards now tile
to fill the available width naturally — typically 3-4 per row on wide
screens, 2 on medium, 1 on mobile — without separate compact/expanded
media query overrides.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The previous dump had double-encoded UTF-8 emoji because the mysql CLI
seed commands were run without --default-character-set=utf8mb4. This
re-export starts from the clean production dump, re-applies all groups
network seeding (network 4, blog 52, blog 51 migration, events, plugin
activation) with the correct charset on every mysql invocation, then
re-exports with mysqldump --default-character-set=utf8mb4.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove the "← All events" back-link pattern from the single-event
template — the sticky local-navigation-bar header already provides
navigation context. Reduce main padding-top from spacing-50 to
spacing-10 so the featured image sits closer to the header.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The generic single-segment rewrite rules in the `if (!-e)` block were
matching /group/slug/wp-login.php before the events-specific two-segment
rules could fire. The single-segment capture grabbed the first segment
and rewrote to /sunshine-coast-qld/wp-login.php — a nonexistent path.

Fix: add two-segment rewrites at the top of the `if (!-e)` block so
paths like /group/slug/wp-login.php, /group/slug/wp-admin/*, and
/group/slug/xmlrpc.php are correctly stripped to their wp-* targets
before the single-segment rules get a chance to mangle them.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The modal was enqueuing wp-edit-blocks, wp-block-editor,
wp-reset-editor-styles, wp-block-library, and wp-format-library globally
on every front-end page for logged-in editors. These editor stylesheets
set body-level font-family, background-color, and other resets that
override the theme styles, making the page look different when logged in.

Only wp-components is needed for the modal UI (Modal, TextControl,
Button, etc). The block editor JS dependencies still load the editor
functionality — they just no longer bring along the global CSS overrides.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
dd32 and others added 30 commits April 22, 2026 11:45
Replace PHP event card patterns with native WordPress Query Loop
blocks. This eliminates Site Editor validation errors caused by
server-rendered PHP output inside block templates.

Add two new server-rendered blocks for use inside Query Loop:
- wporg/event-rsvp-count: displays "N going" for an event
- wporg/event-venue-name: displays venue name with location icon

Templates now use core/query with postType=gatherpress_event,
core/post-template for the grid layout, and standard blocks
(post-title, post-featured-image, post-excerpt, gatherpress/
event-date) alongside the new custom blocks.

The PHP patterns and render_event_cards() helper are no longer
used by templates but kept for backwards compatibility.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add pre_get_posts filter that joins the GatherPress events table and
orders by datetime_start_gmt when gatherpress_event_order query var
is set.

Add query_loop_block_query_vars filter that automatically sets event
ordering and upcoming-only filtering for any Query Loop block that
queries gatherpress_event post type.

Events on the front page and archive now show in chronological order
by event start date (not post creation date), with past events
filtered out.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Use ServerSideRender in the edit function so the blocks show their
actual server-rendered output in the Site Editor instead of static
placeholder text.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Override the block editor layout default link underline for the
site-title block. The theme.json textDecoration:none setting is
overridden by the editor's .block-editor-block-list__layout a rule.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace the hero section group block with a core/cover block so
organisers can change the background image and overlay color directly
in the Site Editor. The cover block natively supports:
- Background image upload/replace
- Overlay color with opacity
- Focal point adjustment
- Min-height

The cover block itself is locked (no move/remove) but its settings
panel is accessible for customisation. Inner blocks (text, buttons,
membership) remain editable.

Remove the old .groups-site-hero CSS since the cover block handles
its own background styling.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace placeholder text with a description and "Open Site Editor"
button that links to /wp-admin/site-editor.php.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Use admin_url() via localized script config so the Site Editor link
points to the correct per-site wp-admin on multisite installs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace static archive template with search bar, time filter
(Upcoming/Past/All), result count, and paginated Query Loop.

Uses wporg/query-filter block for the time filter dropdown with
options registered via wporg_query_filter_options_event_time hook.
The query_loop_block_query_vars filter reads the event_time parameter
to toggle between upcoming-only, past-only, and all events.

Add gatherpress_past_only query var support in pre_get_posts filter
for filtering to past events via the GatherPress events table.

Add event_time as an allowed query var.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Use the view-all-events-link pattern which resolves the URL via
home_url() instead of a hardcoded path that breaks on multisite.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
When searching on the events archive (?s=&event_time=), WordPress
treated the URL as a search query and loaded search.html instead of
the archive template. Fix with two changes:

1. Rewrite the core/search block form action to submit to the events
   archive URL with a hidden event_time=all field, so searches stay
   on the archive page.

2. Force the main query to stay as an archive (not search) when
   event_time parameter is present, so the archive template loads
   and the Query Loop handles the search via query_loop_block_query_vars.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Register _event_speakers post meta (array of user IDs) on events.

New wporg/event-speakers block displays speakers on the single event
page with avatar, name, "Speaker" badge, and bio excerpt. Uses
ServerSideRender for editor preview.

Event editor form gets a FormTokenField for selecting speakers from
group members via autocomplete. Selected speakers are saved as post
meta after the event is created/updated.

Speakers block added to single-event template below the title,
locked to prevent removal.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New wporg/my-events block shows members their upcoming RSVPed events
on the front page. Queries RSVP comments by the current user, filters
to attending status and upcoming events only, displays as a compact
list with date and title linking to the event page.

Only renders for logged-in group members with active RSVPs. Hidden
for visitors and members with no upcoming RSVPs.

Added to the front page template between the events section and the
about section.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Rename $post to $event_post to avoid the WordPress globals override
lint error.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Rewrite responsive.css with proper breakpoints:

Mobile (≤781px):
- Event cards: single column grid
- Members grid: single column
- Event layout: stacked (sidebar below content)
- RSVP modal: full-screen with no border-radius
- Archive filters: stack vertically
- Membership block: stack vertically
- Cover hero: auto min-height

Tablet (481-781px):
- Event cards: 2-column grid
- Members grid: 2-column

Desktop (1024px+):
- Sticky sidebar with z-index for modal overlay

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
GatherPress reorganized classes into subdirectories:
- GatherPress\Core\Event -> GatherPress\Core\Event\Event
- GatherPress\Core\Rsvp -> GatherPress\Core\Rsvp\Rsvp
- GatherPress\Core\Venue -> GatherPress\Core\Venue\Venue
- GatherPress\Core\Event_Setup -> GatherPress\Core\Event\Setup
- GatherPress\Core\Event_Query -> GatherPress\Core\Blocks\Event_Query

While backwards-compat aliases exist in GatherPress, we update to
use the canonical class names directly to avoid relying on aliases.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
GatherPress latest develop changed venue storage from a single JSON
meta (gatherpress_venue_information) to individual meta keys
(gatherpress_address, gatherpress_phone, gatherpress_website,
gatherpress_latitude, gatherpress_longitude).

Update venue editor load/save to use the new individual meta keys.
Update venues tab list to read gatherpress_address directly.
Update tweaks mu-plugin venue block filter to read
gatherpress_access_requirements meta directly.

Add CSS for clickable event cards in Query Loop — post-title link
stretches over the entire card via ::after pseudo-element, with
hover state (border color change, shadow, lift).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Set z-index:0 on the featured image so the post-title ::after
overlay (z-index:1) sits above it, making the entire card including
the thumbnail clickable.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The venue map was overflowing its container. Add max-width and
overflow:hidden to keep it within the info card bounds.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Set z-index:0 on all card children except the post-title so the
title link ::after overlay (z-index:1) sits above everything.
Add cursor:pointer on the card container for visual feedback.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The Site Editor canvas uses contentSize as its default width. At
680px the editor looked cramped and did not match the front-end
appearance. Since this is an events site (not a blog), matching
contentSize to wideSize gives a WYSIWYG experience in the editor.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New block renders a page's content by slug, with an "Edit this
content" link for organisers. In the Site Editor, it uses
ServerSideRender to show the live page content, and the inspector
panel lets you set the page slug.

If the page does not exist, organisers see a "Create page" button.

Replace post-content on the front page template with
wporg/page-content slug="about" so the About section pulls from a
dedicated About page rather than the front page's own post_content.

Couldn't find a Gutenberg issue for Query Loop slug filtering —
this is a gap in core that would eliminate the need for this block.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New page template with:
- Global header + navigation bar (locked)
- Blueberry-4 hero area with page title
- Featured image support with rounded corners
- Content area at 768px width for readability
- Matching the archive template header style

Pages were previously falling back to index.html which showed
a blog post listing instead of page content.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace z-index approach with pointer-events: none on all card
children, re-enabling only on the title link. This ensures clicks
on the featured image (and anywhere else on the card) pass through
to the title link ::after overlay regardless of stacking contexts.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
pointer-events:none on descendants killed the title link too.
Instead, put the post-title at z-index:2 (above the ::after
overlay at z-index:1) so it remains clickable, while the overlay
covers everything else including the featured image.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add isLink:true to post-featured-image blocks in the front page and
archive templates. This wraps the image in an <a> tag natively,
making it clickable without relying on ::after z-index tricks that
fail due to stacking context issues with aspect-ratio/border-radius.

Remove the z-index workaround on post-title that was trying to fix
the same problem.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add tabindex="-1" to the featured image link in event card grids
via render_block filter. The title link already provides keyboard
access — a second tab stop on the image is redundant.

Only applies on non-singular pages (archives, front page) where
cards appear in grids.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Rename $page to $target_page.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

[Component] Groups [Component] Themes & Customization Custom WC Themes, compatibility with core themes, and theme-adjacent customizations to sites [Type] Enhancement

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants