Build Services page: service tiles section (LS-1598) - #54
Open
brandonmarshal wants to merge 6 commits into
Open
Conversation
- Add patterns/sections/services-service-tiles.php: "Fourteen
services. One delivery model." — 14 service cards in a bento grid
(Discovery through AI), each card a single stretched link to its
service page, with an icon well, index number, kicker line and
description
- Add styles/sections/cards/card-service-tile.json: new shared card
shell, modelled on Card - Category's shell but flatter, with an
index-number slot Card - Category doesn't have
- Add src/scss/structural/services-service-tiles.scss for the hover
border-color swap, wired into build/enqueue like the other sections
Bug fix
- blockGap on each row only set the horizontal ("left") component, so
the vertical gap when columns stack on mobile/tablet fell back to
WordPress's default instead of the intended value, producing
inconsistent spacing between cards
- Fixed by using a single blockGap value per row, applying uniformly
to both axes — verified consistent card-to-card spacing at mobile
width, bento layout unchanged on desktop
brandonmarshal
force-pushed
the
feature/ls-1598-services-page-batch-2
branch
from
September 10, 2026 12:51
6247dac to
fdfb013
Compare
brandonmarshal
changed the base branch from
feature/ls-1598-build-services-page
to
feature/ls-3229-icon-block-services
September 10, 2026 12:51
brandonmarshal
added this pull request to stack #52
September 10, 2026 12:52
There was a problem hiding this comment.
🟡 Changes recommended
Address the unconditional CSS enqueue and preserve AI/SEO capitalization in CTA labels.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
Adds the Services page’s 14-card bento grid with responsive layouts, shared styling, and asset integration.
Changes:
- Adds the service-tile pattern and card style.
- Adds hover styling, build/enqueue wiring, and editor support.
- Updates compiled CSS and changelog, including mobile spacing fixes.
File summaries
| File | Summary |
|---|---|
styles/sections/cards/card-service-tile.json |
Defines the shared service-tile card shell. |
src/scss/structural/services-service-tiles.scss |
Adds tile hover styling. |
patterns/sections/services-service-tiles.php |
Adds 14 service cards; CTA capitalization for AI/SEO needs correction. Moderate, 2 votes. |
package.json |
Wires the stylesheet into build and watch scripts. |
inc/animations.php |
Registers asset loading; frontend CSS currently lacks a reliable page condition. Moderate, 3 votes. |
functions.php |
Adds editor stylesheet loading. |
CHANGELOG.md |
Documents the section and spacing fix. |
assets/css/services-service-tiles.css |
Provides the compiled tile styles. |
Review details
Files not reviewed (1)
- assets/css/services-service-tiles.css: Generated file
Suppressed comments (2)
patterns/sections/services-service-tiles.php:137
- Please emit the native
core/iconblock here with thelightspeed/{name}slugs already used by the Services patterns, rather than reintroducingoutermost/icon-blockplus inline SVG.CHANGELOG.md:27-30records that this third-party/raw-SVG approach was migrated away, andservices-hero.php:163plusservices-service-clusters.php:109show the supported form. As written, these tiles depend on the removed Services icon-block path and duplicate the service-icon map (the AI icon already differs), so icons can be missing or inconsistent.
<!-- wp:outermost/icon-block {"iconName":"","width":"18px"} -->
<div class="wp-block-outermost-icon-block"><div class="icon-container" style="width:18px;transform:rotate(0deg) scaleX(1) scaleY(1)"><?php echo $ls_tile['icon']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Static, developer-authored Phosphor icon markup, not user input. ?></div></div>
<!-- /wp:outermost/icon-block -->
patterns/sections/services-service-tiles.php:134
ls-icon-well-brandis styled bywork-archive-sections.css(src/scss/structural/work-archive-sections.scss:23-33), but that bundle's front-end condition only covers the home page, project archive and search (inc/animations.php:248-250). On a Services page this marker is detected during body rendering and the CSS is printed in the footer, so these new icon wells can appear unstyled and then visibly restyle after first paint. Load the shared icon-well rules in the head for this page, or move them into a bundle already loaded there.
<!-- wp:group {"className":"ls-icon-well-brand"} -->
<div class="wp-block-group ls-icon-well-brand">
- Files reviewed: 7/8 changed files
- Comments generated: 2
- Review effort level: Lite
💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Bug fix
- services-service-tiles.php: preserve "AI"/"SEO" capitalization in
the "Read about..." CTA text instead of lower-casing every label
- services-service-tiles.php: migrate icons from outermost/icon-block
+ inline SVG to core/icon (lightspeed/{slug}), matching the format
already used by every sibling Services section on this branch
- inc/animations.php: add a Services-page condition to the shared
icon-well bundle and to the service-tiles bundle itself, so both
load in <head> instead of only being caught by the render_block/
footer fallback
Setup - Run specify init with the Copilot integration, adding skills under .github/skills/ - Add the Claude integration alongside it under .claude/skills/ - Add shared .specify/ scripts and templates powering both Context - One-time direct commit to develop per request Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Context - Populate .specify/memory/constitution.md (v1.2.0) from AGENTS.md and established project conventions — theme-first styling, reuse before create, token parity, core blocks first, accessibility/security non-negotiables, validation before done, PHP minimalism - Add repo-local and global WordPress dev skills as a reference list for future planning - Add specs/001-services-page/: spec, plan, research, data-model, quickstart, tasks, and requirements/content-ux checklists for the 3 remaining Services page sections (Entry Points, Delivery by the Numbers, closing CTA) Bug fix - Regenerated research/data-model/quickstart/tasks/checklist, which had gone stale against an earlier, superseded scope - Applied /speckit-analyze remediation: added Principle VII to the plan's constitution gate, an explicit non-duplication check to tasks.md, and Service Tile to spec.md's Key Entities
7 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds the Services page's "Fourteen services. One delivery model." section: a 14-card bento grid (Discovery through AI) below the existing hero, linked-decisions, and service-clusters sections. Each card is a single stretched link to its individual
/services/{slug}/page, with an icon well, index number, kicker line and description.Stacked on #51 — this branch is
feature/ls-1598-services-page-batch-2, based offfeature/ls-1598-build-services-pagerather thandevelop, and is intended to merge into that branch once #51 lands.Section pattern
patterns/sections/services-service-tiles.php: eyebrow/heading/intro pair plus the 14-card grid, built as fourwp:columnsrows (4/4/2/4 cards) — row 3 is the only asymmetric row, with Training and Support each at 50% width. Icons reuse the exact same 14 service→icon mapping already established inservices-hero.php.styles/sections/cards/card-service-tile.json: new shared card shell, modelled on Card - Category's shell (position/overflow/content-flex/stretched-link/focus-visible + hover border-color swap recipe) but flatter — no default shadow, tighter padding, and an index-number slot Card - Category doesn't have.src/scss/structural/services-service-tiles.scss: only the hover border-color swap (a:hover/:focus-withinstate with no theme.json pseudo-state key for an arbitraryis-stylevariant).package.json(build:css/build:css:dev/watch:css),inc/animations.php(render-marker detection + conditional editor/front-end enqueue), andfunctions.php(add_editor_style).Fixed during review
blockGaporiginally only set the horizontal ("left") component. On mobile/tablet, oncewp:columnsstacks vertically, the vertical gap between stacked cards has no explicit value and falls back to WordPress's own default instead of the intended spacing — producing visibly inconsistent gaps between cards. Fixed by settingblockGapto a single value per row so it applies uniformly to both axes, verified consistent at mobile width with no change to the desktop bento layout.Investigated and not used
layout:{"type":"grid","columnCount":4}with per-cardcolumnSpan) to get a single blockGap value governing all spacing natively. This technically fixed the spacing issue but produced a broken/overlapping layout at narrower viewports in real testing, so it was reverted in favor of the simplerwp:columnsfix above, which reuses WordPress's own proven column-stacking behavior already used successfully by every other section on this page.Test plan
npm run schema:validate— all JSON files pass, including the newcard-service-tile.jsonnpm run patterns:escape— only the expected phpcs-ignored static-SVG echo (same accepted pattern asservices-hero.php/services-service-clusters.php)npm run security:scan— cleanphp -l— no syntax errorsvendor/bin/phpcs --standard=WordPresson the new pattern file — cleannpm run lint:json— all JSON validStacks on #51 (LS-1598).