From d7850466eb9e9eca5cd3df1f07a8884979eef391 Mon Sep 17 00:00:00 2001 From: Brandonma21 Date: Wed, 21 Oct 2026 15:45:59 +0200 Subject: [PATCH 1/4] design: careers-page - Add the Hero and Sections 1-4 patterns and the warm accent tokens (LSA-197) Patterns - Add Hero - Lede Wide Photo with breadcrumb, eyebrow, H1 and a wide team photo - Add Section - Statement Lede for the "Shape the Future" intro - Add Section - Split Text Pair Statement with the struck-through and highlighted closing line - Add Section - Numbered Bento Cards for "Who thrives here" - Add Section - Split Intro Staggered Icon Cards for "Growth and Upskilling" Styles - Add the about-careers SCSS bundle with the statement measure and the mobile reflow - Wire the bundle in package.json, inc/animations.php and functions.php - Add the compiled about-careers.css Tokens - Add accent.warm with warm-300 and warm-700 palette colours in theme.json and dark.json - Keep the values identical to the Culture page tokens so the two branches reconcile Context - Link the hero team photo from the DEV media library, as the About team cards do - Patterns follow light and dark mode through existing semantic tokens - Remaining sections 6-12 follow on a stacked branch --- assets/css/about-careers.css | 1 + functions.php | 1 + inc/animations.php | 12 ++ package.json | 6 +- patterns/hero/hero-lede-wide-photo.php | 60 ++++++++ patterns/sections/numbered-bento-cards.php | 129 ++++++++++++++++++ .../split-intro-staggered-icon-cards.php | 108 +++++++++++++++ .../sections/split-text-pair-statement.php | 75 ++++++++++ patterns/sections/statement-lede.php | 46 +++++++ src/scss/structural/about-careers.scss | 76 +++++++++++ styles/dark.json | 3 + theme.json | 13 ++ 12 files changed, 527 insertions(+), 3 deletions(-) create mode 100644 assets/css/about-careers.css create mode 100644 patterns/hero/hero-lede-wide-photo.php create mode 100644 patterns/sections/numbered-bento-cards.php create mode 100644 patterns/sections/split-intro-staggered-icon-cards.php create mode 100644 patterns/sections/split-text-pair-statement.php create mode 100644 patterns/sections/statement-lede.php create mode 100644 src/scss/structural/about-careers.scss diff --git a/assets/css/about-careers.css b/assets/css/about-careers.css new file mode 100644 index 0000000..b2ad4f3 --- /dev/null +++ b/assets/css/about-careers.css @@ -0,0 +1 @@ +.wp-block-heading.ls-careers-statement{max-width:18ch;text-wrap:balance}.ls-careers-goal{text-wrap:balance}@media(max-width: 781.98px){.ls-careers-hero__photo img{aspect-ratio:16/10 !important}.ls-bento.wp-block-group{grid-template-columns:repeat(2, minmax(0, 1fr))}.ls-bento>.ls-bento__card{grid-column:span 1}.ls-bento>.ls-bento__card:last-child{grid-column:span 2}.ls-stairs__card{min-height:0 !important}}@media(max-width: 599.98px){.ls-bento.wp-block-group{grid-template-columns:minmax(0, 1fr)}.ls-bento>.ls-bento__card,.ls-bento>.ls-bento__card:last-child{grid-column:auto}.ls-bento__card{min-height:0 !important}.ls-bento>.ls-bento__card:last-child{align-items:flex-start;flex-direction:column}} diff --git a/functions.php b/functions.php index d99a963..9d9fc86 100644 --- a/functions.php +++ b/functions.php @@ -129,6 +129,7 @@ function ls_theme_setup() { add_editor_style( 'assets/css/hero-split-form.css' ); add_editor_style( 'assets/css/scroll-timeline.css' ); add_editor_style( 'assets/css/details-card-grid.css' ); + add_editor_style( 'assets/css/about-careers.css' ); } add_action( 'after_setup_theme', 'ls_theme_setup' ); diff --git a/inc/animations.php b/inc/animations.php index 1084fd2..5d10610 100644 --- a/inc/animations.php +++ b/inc/animations.php @@ -114,6 +114,7 @@ function ls_theme_get_bundle_render_markers() { 'legal-page' => array( 'classes' => array( 'ls-page-hero', 'ls-legal-toc', 'ls-legal-body', 'ls-related-trust-grid' ) ), 'hero-split-form' => array( 'classes' => array( 'ls-hero-form-intro' ) ), 'scroll-timeline' => array( 'classes' => array( 'ls-scroll-timeline' ) ), + 'about-careers' => array( 'classes' => array( 'ls-careers-hero', 'ls-careers-statement', 'ls-careers-goal', 'ls-bento', 'ls-stairs' ) ), 'details-card-grid' => array( 'classes' => array( 'ls-year-card' ) ), ); } @@ -732,6 +733,17 @@ function ls_theme_get_effect_styles( $context = 'front' ) { return is_page( 'about/history' ); }, ), + 'about-careers' => array( + 'handle' => 'ls-theme-about-careers', + 'path' => 'assets/css/about-careers.css', + 'contexts' => array( 'front', 'editor' ), + // The About Careers page patterns: the statement measure, the bento and staircase reflow and + // the hero photo crop on small screens. The render-marker fallback loads it wherever the + // patterns render. + 'condition' => static function () { + return is_page( 'about/careers' ); + }, + ), ); /** diff --git a/package.json b/package.json index e4dd637..9ac21f6 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,8 @@ "description": "LightSpeed Theme is a custom WordPress block theme built by LightSpeed for fast, accessible, maintainable websites using the WordPress Site Editor and block editor.", "type": "module", "scripts": { - "build:css": "sass --no-source-map --no-charset --style=compressed src/scss/animations.scss:assets/css/animations.css src/scss/gsap-animations.scss:assets/css/gsap-animations.css src/scss/structural/taxonomy-filter.scss:assets/css/taxonomy-filter.css src/scss/structural/work-project-card.scss:assets/css/work-project-card.css src/scss/structural/work-archive-sections.scss:assets/css/work-archive-sections.css src/scss/structural/card-shells.scss:assets/css/card-shells.css src/scss/structural/cta-buttons.scss:assets/css/cta-buttons.css src/scss/structural/home-hero.scss:assets/css/home-hero.css src/scss/structural/work-hero.scss:assets/css/work-hero.css src/scss/structural/work-single-hero.scss:assets/css/work-single-hero.css src/scss/structural/blog-hero.scss:assets/css/blog-hero.css src/scss/structural/blog-all-articles.scss:assets/css/blog-all-articles.css src/scss/structural/blog-writing-cta.scss:assets/css/blog-writing-cta.css src/scss/structural/faq.scss:assets/css/faq.css src/scss/structural/links.scss:assets/css/links.css src/scss/structural/button-secondary.scss:assets/css/button-secondary.css src/scss/structural/featured-work.scss:assets/css/featured-work.css src/scss/structural/where-to-fit.scss:assets/css/where-to-fit.css src/scss/structural/homepage-cta.scss:assets/css/homepage-cta.css src/scss/structural/stats-bar.scss:assets/css/stats-bar.css src/scss/structural/homepage-card-rows.scss:assets/css/homepage-card-rows.css src/scss/structural/homepage-why-lightspeed.scss:assets/css/homepage-why-lightspeed.css src/scss/structural/search-results.scss:assets/css/search-results.css src/scss/structural/search-hero.scss:assets/css/search-hero.css src/scss/structural/services-hero.scss:assets/css/services-hero.css src/scss/structural/solutions-hero.scss:assets/css/solutions-hero.css src/scss/structural/services-linked-decisions.scss:assets/css/services-linked-decisions.css src/scss/structural/services-service-clusters.scss:assets/css/services-service-clusters.css src/scss/structural/services-service-tiles.scss:assets/css/services-service-tiles.css src/scss/structural/solutions-route-tiles.scss:assets/css/solutions-route-tiles.css src/scss/structural/stat-feature-bento.scss:assets/css/stat-feature-bento.css src/scss/structural/services-delivery-numbers.scss:assets/css/services-delivery-numbers.css src/scss/structural/corner-glow.scss:assets/css/corner-glow.css src/scss/structural/image-captions.scss:assets/css/image-captions.css src/scss/structural/phase-hero.scss:assets/css/phase-hero.css src/scss/structural/button-phase.scss:assets/css/button-phase.css src/scss/structural/phase-journey-nav.scss:assets/css/phase-journey-nav.css src/scss/structural/phase-services-in-phase.scss:assets/css/phase-services-in-phase.css src/scss/structural/phase-cta.scss:assets/css/phase-cta.css src/scss/structural/phase-delivery-numbers.scss:assets/css/phase-delivery-numbers.css src/scss/structural/phase-common-services.scss:assets/css/phase-common-services.css src/scss/structural/phase-support-focus.scss:assets/css/phase-support-focus.css src/scss/structural/phase-faq.scss:assets/css/phase-faq.css src/scss/structural/phase-where-to-go-next.scss:assets/css/phase-where-to-go-next.css src/scss/structural/tick-phase.scss:assets/css/tick-phase.css src/scss/structural/service-case-study.scss:assets/css/service-case-study.css src/scss/structural/solutions-case-study.scss:assets/css/solutions-case-study.css src/scss/structural/split-header-icon-card-grid.scss:assets/css/split-header-icon-card-grid.css src/scss/structural/solutions-split-faq.scss:assets/css/solutions-split-faq.css src/scss/structural/snapshot-card.scss:assets/css/snapshot-card.css src/scss/structural/legal-page.scss:assets/css/legal-page.css src/scss/structural/hero-split-form.scss:assets/css/hero-split-form.css src/scss/structural/hero-gradient-title.scss:assets/css/hero-gradient-title.css src/scss/structural/phase-link-card-grid.scss:assets/css/phase-link-card-grid.css src/scss/structural/scroll-timeline.scss:assets/css/scroll-timeline.css src/scss/structural/details-card-grid.scss:assets/css/details-card-grid.css", - "build:css:dev": "sass --no-source-map --no-charset --style=expanded src/scss/animations.scss:assets/css/animations.css src/scss/gsap-animations.scss:assets/css/gsap-animations.css src/scss/structural/taxonomy-filter.scss:assets/css/taxonomy-filter.css src/scss/structural/work-project-card.scss:assets/css/work-project-card.css src/scss/structural/work-archive-sections.scss:assets/css/work-archive-sections.css src/scss/structural/card-shells.scss:assets/css/card-shells.css src/scss/structural/cta-buttons.scss:assets/css/cta-buttons.css src/scss/structural/home-hero.scss:assets/css/home-hero.css src/scss/structural/work-hero.scss:assets/css/work-hero.css src/scss/structural/work-single-hero.scss:assets/css/work-single-hero.css src/scss/structural/blog-hero.scss:assets/css/blog-hero.css src/scss/structural/blog-all-articles.scss:assets/css/blog-all-articles.css src/scss/structural/blog-writing-cta.scss:assets/css/blog-writing-cta.css src/scss/structural/faq.scss:assets/css/faq.css src/scss/structural/links.scss:assets/css/links.css src/scss/structural/button-secondary.scss:assets/css/button-secondary.css src/scss/structural/featured-work.scss:assets/css/featured-work.css src/scss/structural/where-to-fit.scss:assets/css/where-to-fit.css src/scss/structural/homepage-cta.scss:assets/css/homepage-cta.css src/scss/structural/stats-bar.scss:assets/css/stats-bar.css src/scss/structural/homepage-card-rows.scss:assets/css/homepage-card-rows.css src/scss/structural/homepage-why-lightspeed.scss:assets/css/homepage-why-lightspeed.css src/scss/structural/search-results.scss:assets/css/search-results.css src/scss/structural/search-hero.scss:assets/css/search-hero.css src/scss/structural/services-hero.scss:assets/css/services-hero.css src/scss/structural/solutions-hero.scss:assets/css/solutions-hero.css src/scss/structural/services-linked-decisions.scss:assets/css/services-linked-decisions.css src/scss/structural/services-service-clusters.scss:assets/css/services-service-clusters.css src/scss/structural/services-service-tiles.scss:assets/css/services-service-tiles.css src/scss/structural/solutions-route-tiles.scss:assets/css/solutions-route-tiles.css src/scss/structural/stat-feature-bento.scss:assets/css/stat-feature-bento.css src/scss/structural/services-delivery-numbers.scss:assets/css/services-delivery-numbers.css src/scss/structural/corner-glow.scss:assets/css/corner-glow.css src/scss/structural/image-captions.scss:assets/css/image-captions.css src/scss/structural/phase-hero.scss:assets/css/phase-hero.css src/scss/structural/button-phase.scss:assets/css/button-phase.css src/scss/structural/phase-journey-nav.scss:assets/css/phase-journey-nav.css src/scss/structural/phase-services-in-phase.scss:assets/css/phase-services-in-phase.css src/scss/structural/phase-cta.scss:assets/css/phase-cta.css src/scss/structural/phase-delivery-numbers.scss:assets/css/phase-delivery-numbers.css src/scss/structural/phase-common-services.scss:assets/css/phase-common-services.css src/scss/structural/phase-support-focus.scss:assets/css/phase-support-focus.css src/scss/structural/phase-faq.scss:assets/css/phase-faq.css src/scss/structural/phase-where-to-go-next.scss:assets/css/phase-where-to-go-next.css src/scss/structural/tick-phase.scss:assets/css/tick-phase.css src/scss/structural/service-case-study.scss:assets/css/service-case-study.css src/scss/structural/solutions-case-study.scss:assets/css/solutions-case-study.css src/scss/structural/split-header-icon-card-grid.scss:assets/css/split-header-icon-card-grid.css src/scss/structural/solutions-split-faq.scss:assets/css/solutions-split-faq.css src/scss/structural/snapshot-card.scss:assets/css/snapshot-card.css src/scss/structural/legal-page.scss:assets/css/legal-page.css src/scss/structural/hero-split-form.scss:assets/css/hero-split-form.css src/scss/structural/hero-gradient-title.scss:assets/css/hero-gradient-title.css src/scss/structural/phase-link-card-grid.scss:assets/css/phase-link-card-grid.css src/scss/structural/scroll-timeline.scss:assets/css/scroll-timeline.css src/scss/structural/details-card-grid.scss:assets/css/details-card-grid.css", + "build:css": "sass --no-source-map --no-charset --style=compressed src/scss/animations.scss:assets/css/animations.css src/scss/gsap-animations.scss:assets/css/gsap-animations.css src/scss/structural/taxonomy-filter.scss:assets/css/taxonomy-filter.css src/scss/structural/work-project-card.scss:assets/css/work-project-card.css src/scss/structural/work-archive-sections.scss:assets/css/work-archive-sections.css src/scss/structural/card-shells.scss:assets/css/card-shells.css src/scss/structural/cta-buttons.scss:assets/css/cta-buttons.css src/scss/structural/home-hero.scss:assets/css/home-hero.css src/scss/structural/work-hero.scss:assets/css/work-hero.css src/scss/structural/work-single-hero.scss:assets/css/work-single-hero.css src/scss/structural/blog-hero.scss:assets/css/blog-hero.css src/scss/structural/blog-all-articles.scss:assets/css/blog-all-articles.css src/scss/structural/blog-writing-cta.scss:assets/css/blog-writing-cta.css src/scss/structural/faq.scss:assets/css/faq.css src/scss/structural/links.scss:assets/css/links.css src/scss/structural/button-secondary.scss:assets/css/button-secondary.css src/scss/structural/featured-work.scss:assets/css/featured-work.css src/scss/structural/where-to-fit.scss:assets/css/where-to-fit.css src/scss/structural/homepage-cta.scss:assets/css/homepage-cta.css src/scss/structural/stats-bar.scss:assets/css/stats-bar.css src/scss/structural/homepage-card-rows.scss:assets/css/homepage-card-rows.css src/scss/structural/homepage-why-lightspeed.scss:assets/css/homepage-why-lightspeed.css src/scss/structural/search-results.scss:assets/css/search-results.css src/scss/structural/search-hero.scss:assets/css/search-hero.css src/scss/structural/services-hero.scss:assets/css/services-hero.css src/scss/structural/solutions-hero.scss:assets/css/solutions-hero.css src/scss/structural/services-linked-decisions.scss:assets/css/services-linked-decisions.css src/scss/structural/services-service-clusters.scss:assets/css/services-service-clusters.css src/scss/structural/services-service-tiles.scss:assets/css/services-service-tiles.css src/scss/structural/solutions-route-tiles.scss:assets/css/solutions-route-tiles.css src/scss/structural/stat-feature-bento.scss:assets/css/stat-feature-bento.css src/scss/structural/services-delivery-numbers.scss:assets/css/services-delivery-numbers.css src/scss/structural/corner-glow.scss:assets/css/corner-glow.css src/scss/structural/image-captions.scss:assets/css/image-captions.css src/scss/structural/phase-hero.scss:assets/css/phase-hero.css src/scss/structural/button-phase.scss:assets/css/button-phase.css src/scss/structural/phase-journey-nav.scss:assets/css/phase-journey-nav.css src/scss/structural/phase-services-in-phase.scss:assets/css/phase-services-in-phase.css src/scss/structural/phase-cta.scss:assets/css/phase-cta.css src/scss/structural/phase-delivery-numbers.scss:assets/css/phase-delivery-numbers.css src/scss/structural/phase-common-services.scss:assets/css/phase-common-services.css src/scss/structural/phase-support-focus.scss:assets/css/phase-support-focus.css src/scss/structural/phase-faq.scss:assets/css/phase-faq.css src/scss/structural/phase-where-to-go-next.scss:assets/css/phase-where-to-go-next.css src/scss/structural/tick-phase.scss:assets/css/tick-phase.css src/scss/structural/service-case-study.scss:assets/css/service-case-study.css src/scss/structural/solutions-case-study.scss:assets/css/solutions-case-study.css src/scss/structural/split-header-icon-card-grid.scss:assets/css/split-header-icon-card-grid.css src/scss/structural/solutions-split-faq.scss:assets/css/solutions-split-faq.css src/scss/structural/snapshot-card.scss:assets/css/snapshot-card.css src/scss/structural/legal-page.scss:assets/css/legal-page.css src/scss/structural/hero-split-form.scss:assets/css/hero-split-form.css src/scss/structural/hero-gradient-title.scss:assets/css/hero-gradient-title.css src/scss/structural/phase-link-card-grid.scss:assets/css/phase-link-card-grid.css src/scss/structural/scroll-timeline.scss:assets/css/scroll-timeline.css src/scss/structural/details-card-grid.scss:assets/css/details-card-grid.css src/scss/structural/about-careers.scss:assets/css/about-careers.css", + "build:css:dev": "sass --no-source-map --no-charset --style=expanded src/scss/animations.scss:assets/css/animations.css src/scss/gsap-animations.scss:assets/css/gsap-animations.css src/scss/structural/taxonomy-filter.scss:assets/css/taxonomy-filter.css src/scss/structural/work-project-card.scss:assets/css/work-project-card.css src/scss/structural/work-archive-sections.scss:assets/css/work-archive-sections.css src/scss/structural/card-shells.scss:assets/css/card-shells.css src/scss/structural/cta-buttons.scss:assets/css/cta-buttons.css src/scss/structural/home-hero.scss:assets/css/home-hero.css src/scss/structural/work-hero.scss:assets/css/work-hero.css src/scss/structural/work-single-hero.scss:assets/css/work-single-hero.css src/scss/structural/blog-hero.scss:assets/css/blog-hero.css src/scss/structural/blog-all-articles.scss:assets/css/blog-all-articles.css src/scss/structural/blog-writing-cta.scss:assets/css/blog-writing-cta.css src/scss/structural/faq.scss:assets/css/faq.css src/scss/structural/links.scss:assets/css/links.css src/scss/structural/button-secondary.scss:assets/css/button-secondary.css src/scss/structural/featured-work.scss:assets/css/featured-work.css src/scss/structural/where-to-fit.scss:assets/css/where-to-fit.css src/scss/structural/homepage-cta.scss:assets/css/homepage-cta.css src/scss/structural/stats-bar.scss:assets/css/stats-bar.css src/scss/structural/homepage-card-rows.scss:assets/css/homepage-card-rows.css src/scss/structural/homepage-why-lightspeed.scss:assets/css/homepage-why-lightspeed.css src/scss/structural/search-results.scss:assets/css/search-results.css src/scss/structural/search-hero.scss:assets/css/search-hero.css src/scss/structural/services-hero.scss:assets/css/services-hero.css src/scss/structural/solutions-hero.scss:assets/css/solutions-hero.css src/scss/structural/services-linked-decisions.scss:assets/css/services-linked-decisions.css src/scss/structural/services-service-clusters.scss:assets/css/services-service-clusters.css src/scss/structural/services-service-tiles.scss:assets/css/services-service-tiles.css src/scss/structural/solutions-route-tiles.scss:assets/css/solutions-route-tiles.css src/scss/structural/stat-feature-bento.scss:assets/css/stat-feature-bento.css src/scss/structural/services-delivery-numbers.scss:assets/css/services-delivery-numbers.css src/scss/structural/corner-glow.scss:assets/css/corner-glow.css src/scss/structural/image-captions.scss:assets/css/image-captions.css src/scss/structural/phase-hero.scss:assets/css/phase-hero.css src/scss/structural/button-phase.scss:assets/css/button-phase.css src/scss/structural/phase-journey-nav.scss:assets/css/phase-journey-nav.css src/scss/structural/phase-services-in-phase.scss:assets/css/phase-services-in-phase.css src/scss/structural/phase-cta.scss:assets/css/phase-cta.css src/scss/structural/phase-delivery-numbers.scss:assets/css/phase-delivery-numbers.css src/scss/structural/phase-common-services.scss:assets/css/phase-common-services.css src/scss/structural/phase-support-focus.scss:assets/css/phase-support-focus.css src/scss/structural/phase-faq.scss:assets/css/phase-faq.css src/scss/structural/phase-where-to-go-next.scss:assets/css/phase-where-to-go-next.css src/scss/structural/tick-phase.scss:assets/css/tick-phase.css src/scss/structural/service-case-study.scss:assets/css/service-case-study.css src/scss/structural/solutions-case-study.scss:assets/css/solutions-case-study.css src/scss/structural/split-header-icon-card-grid.scss:assets/css/split-header-icon-card-grid.css src/scss/structural/solutions-split-faq.scss:assets/css/solutions-split-faq.css src/scss/structural/snapshot-card.scss:assets/css/snapshot-card.css src/scss/structural/legal-page.scss:assets/css/legal-page.css src/scss/structural/hero-split-form.scss:assets/css/hero-split-form.css src/scss/structural/hero-gradient-title.scss:assets/css/hero-gradient-title.css src/scss/structural/phase-link-card-grid.scss:assets/css/phase-link-card-grid.css src/scss/structural/scroll-timeline.scss:assets/css/scroll-timeline.css src/scss/structural/details-card-grid.scss:assets/css/details-card-grid.css src/scss/structural/about-careers.scss:assets/css/about-careers.css", "schema:validate": "node theme-utils.mjs validate-schema", "theme:validate": "node theme-utils.mjs validate-theme", "patterns:escape": "node theme-utils.mjs escape-patterns", @@ -16,7 +16,7 @@ "lint": "npm run lint:json", "lint:json": "node --input-type=module --eval \"import { readFileSync } from 'fs'; import { glob } from 'glob'; const files = await glob(['theme.json', 'styles/**/*.json']); let ok = true; for (const f of files) { try { JSON.parse(readFileSync(f, 'utf8')); } catch (e) { console.error('Invalid JSON:', f, e.message); ok = false; } } if (ok) console.log('All JSON files are valid.'); else process.exit(1);\"", "lint:scss": "stylelint \"src/scss/**/*.scss\"", - "watch:css": "sass --watch --no-source-map --no-charset --style=expanded src/scss/animations.scss:assets/css/animations.css src/scss/gsap-animations.scss:assets/css/gsap-animations.css src/scss/structural/taxonomy-filter.scss:assets/css/taxonomy-filter.css src/scss/structural/work-project-card.scss:assets/css/work-project-card.css src/scss/structural/work-archive-sections.scss:assets/css/work-archive-sections.css src/scss/structural/card-shells.scss:assets/css/card-shells.css src/scss/structural/cta-buttons.scss:assets/css/cta-buttons.css src/scss/structural/home-hero.scss:assets/css/home-hero.css src/scss/structural/work-hero.scss:assets/css/work-hero.css src/scss/structural/work-single-hero.scss:assets/css/work-single-hero.css src/scss/structural/blog-hero.scss:assets/css/blog-hero.css src/scss/structural/blog-all-articles.scss:assets/css/blog-all-articles.css src/scss/structural/blog-writing-cta.scss:assets/css/blog-writing-cta.css src/scss/structural/faq.scss:assets/css/faq.css src/scss/structural/links.scss:assets/css/links.css src/scss/structural/button-secondary.scss:assets/css/button-secondary.css src/scss/structural/featured-work.scss:assets/css/featured-work.css src/scss/structural/where-to-fit.scss:assets/css/where-to-fit.css src/scss/structural/homepage-cta.scss:assets/css/homepage-cta.css src/scss/structural/stats-bar.scss:assets/css/stats-bar.css src/scss/structural/homepage-card-rows.scss:assets/css/homepage-card-rows.css src/scss/structural/homepage-why-lightspeed.scss:assets/css/homepage-why-lightspeed.css src/scss/structural/search-results.scss:assets/css/search-results.css src/scss/structural/search-hero.scss:assets/css/search-hero.css src/scss/structural/services-hero.scss:assets/css/services-hero.css src/scss/structural/solutions-hero.scss:assets/css/solutions-hero.css src/scss/structural/services-linked-decisions.scss:assets/css/services-linked-decisions.css src/scss/structural/services-service-clusters.scss:assets/css/services-service-clusters.css src/scss/structural/services-service-tiles.scss:assets/css/services-service-tiles.css src/scss/structural/solutions-route-tiles.scss:assets/css/solutions-route-tiles.css src/scss/structural/stat-feature-bento.scss:assets/css/stat-feature-bento.css src/scss/structural/services-delivery-numbers.scss:assets/css/services-delivery-numbers.css src/scss/structural/corner-glow.scss:assets/css/corner-glow.css src/scss/structural/image-captions.scss:assets/css/image-captions.css src/scss/structural/phase-hero.scss:assets/css/phase-hero.css src/scss/structural/button-phase.scss:assets/css/button-phase.css src/scss/structural/phase-journey-nav.scss:assets/css/phase-journey-nav.css src/scss/structural/phase-services-in-phase.scss:assets/css/phase-services-in-phase.css src/scss/structural/phase-cta.scss:assets/css/phase-cta.css src/scss/structural/phase-delivery-numbers.scss:assets/css/phase-delivery-numbers.css src/scss/structural/phase-common-services.scss:assets/css/phase-common-services.css src/scss/structural/phase-support-focus.scss:assets/css/phase-support-focus.css src/scss/structural/phase-faq.scss:assets/css/phase-faq.css src/scss/structural/phase-where-to-go-next.scss:assets/css/phase-where-to-go-next.css src/scss/structural/tick-phase.scss:assets/css/tick-phase.css src/scss/structural/service-case-study.scss:assets/css/service-case-study.css src/scss/structural/solutions-case-study.scss:assets/css/solutions-case-study.css src/scss/structural/split-header-icon-card-grid.scss:assets/css/split-header-icon-card-grid.css src/scss/structural/solutions-split-faq.scss:assets/css/solutions-split-faq.css src/scss/structural/snapshot-card.scss:assets/css/snapshot-card.css src/scss/structural/legal-page.scss:assets/css/legal-page.css src/scss/structural/hero-split-form.scss:assets/css/hero-split-form.css src/scss/structural/hero-gradient-title.scss:assets/css/hero-gradient-title.css src/scss/structural/phase-link-card-grid.scss:assets/css/phase-link-card-grid.css src/scss/structural/scroll-timeline.scss:assets/css/scroll-timeline.css src/scss/structural/details-card-grid.scss:assets/css/details-card-grid.css" + "watch:css": "sass --watch --no-source-map --no-charset --style=expanded src/scss/animations.scss:assets/css/animations.css src/scss/gsap-animations.scss:assets/css/gsap-animations.css src/scss/structural/taxonomy-filter.scss:assets/css/taxonomy-filter.css src/scss/structural/work-project-card.scss:assets/css/work-project-card.css src/scss/structural/work-archive-sections.scss:assets/css/work-archive-sections.css src/scss/structural/card-shells.scss:assets/css/card-shells.css src/scss/structural/cta-buttons.scss:assets/css/cta-buttons.css src/scss/structural/home-hero.scss:assets/css/home-hero.css src/scss/structural/work-hero.scss:assets/css/work-hero.css src/scss/structural/work-single-hero.scss:assets/css/work-single-hero.css src/scss/structural/blog-hero.scss:assets/css/blog-hero.css src/scss/structural/blog-all-articles.scss:assets/css/blog-all-articles.css src/scss/structural/blog-writing-cta.scss:assets/css/blog-writing-cta.css src/scss/structural/faq.scss:assets/css/faq.css src/scss/structural/links.scss:assets/css/links.css src/scss/structural/button-secondary.scss:assets/css/button-secondary.css src/scss/structural/featured-work.scss:assets/css/featured-work.css src/scss/structural/where-to-fit.scss:assets/css/where-to-fit.css src/scss/structural/homepage-cta.scss:assets/css/homepage-cta.css src/scss/structural/stats-bar.scss:assets/css/stats-bar.css src/scss/structural/homepage-card-rows.scss:assets/css/homepage-card-rows.css src/scss/structural/homepage-why-lightspeed.scss:assets/css/homepage-why-lightspeed.css src/scss/structural/search-results.scss:assets/css/search-results.css src/scss/structural/search-hero.scss:assets/css/search-hero.css src/scss/structural/services-hero.scss:assets/css/services-hero.css src/scss/structural/solutions-hero.scss:assets/css/solutions-hero.css src/scss/structural/services-linked-decisions.scss:assets/css/services-linked-decisions.css src/scss/structural/services-service-clusters.scss:assets/css/services-service-clusters.css src/scss/structural/services-service-tiles.scss:assets/css/services-service-tiles.css src/scss/structural/solutions-route-tiles.scss:assets/css/solutions-route-tiles.css src/scss/structural/stat-feature-bento.scss:assets/css/stat-feature-bento.css src/scss/structural/services-delivery-numbers.scss:assets/css/services-delivery-numbers.css src/scss/structural/corner-glow.scss:assets/css/corner-glow.css src/scss/structural/image-captions.scss:assets/css/image-captions.css src/scss/structural/phase-hero.scss:assets/css/phase-hero.css src/scss/structural/button-phase.scss:assets/css/button-phase.css src/scss/structural/phase-journey-nav.scss:assets/css/phase-journey-nav.css src/scss/structural/phase-services-in-phase.scss:assets/css/phase-services-in-phase.css src/scss/structural/phase-cta.scss:assets/css/phase-cta.css src/scss/structural/phase-delivery-numbers.scss:assets/css/phase-delivery-numbers.css src/scss/structural/phase-common-services.scss:assets/css/phase-common-services.css src/scss/structural/phase-support-focus.scss:assets/css/phase-support-focus.css src/scss/structural/phase-faq.scss:assets/css/phase-faq.css src/scss/structural/phase-where-to-go-next.scss:assets/css/phase-where-to-go-next.css src/scss/structural/tick-phase.scss:assets/css/tick-phase.css src/scss/structural/service-case-study.scss:assets/css/service-case-study.css src/scss/structural/solutions-case-study.scss:assets/css/solutions-case-study.css src/scss/structural/split-header-icon-card-grid.scss:assets/css/split-header-icon-card-grid.css src/scss/structural/solutions-split-faq.scss:assets/css/solutions-split-faq.css src/scss/structural/snapshot-card.scss:assets/css/snapshot-card.css src/scss/structural/legal-page.scss:assets/css/legal-page.css src/scss/structural/hero-split-form.scss:assets/css/hero-split-form.css src/scss/structural/hero-gradient-title.scss:assets/css/hero-gradient-title.css src/scss/structural/phase-link-card-grid.scss:assets/css/phase-link-card-grid.css src/scss/structural/scroll-timeline.scss:assets/css/scroll-timeline.css src/scss/structural/details-card-grid.scss:assets/css/details-card-grid.css src/scss/structural/about-careers.scss:assets/css/about-careers.css" }, "devDependencies": { "@axe-core/playwright": "^4.13.0", diff --git a/patterns/hero/hero-lede-wide-photo.php b/patterns/hero/hero-lede-wide-photo.php new file mode 100644 index 0000000..9132dee --- /dev/null +++ b/patterns/hero/hero-lede-wide-photo.php @@ -0,0 +1,60 @@ + + +
+ + +
+ + +
+ + is_registered( 'yoast-seo/breadcrumbs' ) ) : ?> + + + + +
+ + + +

+ +
+ + + +

+ + + +
+ +

+ +
+ +
+ + + +
<?php echo esc_attr__( 'The LightSpeed team together', 'ls-theme' ); ?>
+ +
+ +
+ diff --git a/patterns/sections/numbered-bento-cards.php b/patterns/sections/numbered-bento-cards.php new file mode 100644 index 0000000..7a0283d --- /dev/null +++ b/patterns/sections/numbered-bento-cards.php @@ -0,0 +1,129 @@ + '01', + 'text' => __( 'Modern WordPress developers', 'ls-theme' ), + 'colour' => 'var(--wp--custom--color--text--brand)', + 'span' => 4, + 'size' => '600', + ), + array( + 'number' => '02', + 'text' => __( 'Block-theme and plugin builders', 'ls-theme' ), + 'colour' => 'var(--wp--custom--color--accent--warm)', + 'span' => 2, + 'size' => '400', + ), + array( + 'number' => '03', + 'text' => __( 'Designers who think in systems, not just screens', 'ls-theme' ), + 'colour' => 'var(--wp--custom--color--phase--grow)', + 'span' => 2, + 'size' => '400', + ), + array( + 'number' => '04', + 'text' => __( 'People comfortable with async work', 'ls-theme' ), + 'colour' => 'var(--wp--custom--color--phase--evolve)', + 'span' => 2, + 'size' => '400', + ), + array( + 'number' => '05', + 'text' => __( 'People who can work independently without disappearing', 'ls-theme' ), + 'colour' => 'var(--wp--custom--color--accent--warm)', + 'span' => 2, + 'size' => '400', + ), + array( + 'number' => '06', + 'text' => __( 'People who are curious about AI-assisted workflows but still care about judgment, craft and review', 'ls-theme' ), + 'colour' => 'var(--wp--custom--color--text--brand)', + 'span' => 6, + 'size' => '400', + ), +); +?> + +
+ + +
+ + +
+ + +
+ + + +

+ +
+ + + +

+ +
+ + + +
+ + 'article', + 'className' => 'is-style-card-plain ls-bento__card', + 'style' => array( + 'layout' => array( 'columnSpan' => $ls_bento_card['span'] ), + 'spacing' => array( 'blockGap' => 'var:preset|spacing|40' ), + ), + 'layout' => array( + 'type' => 'flex', + 'orientation' => $ls_bento_is_wide ? 'horizontal' : 'vertical', + 'flexWrap' => 'nowrap', + ), + ); + $ls_bento_min_height = $ls_bento_is_wide ? '0px' : '200px'; + + $ls_bento_attrs['style']['dimensions'] = array( 'minHeight' => $ls_bento_min_height ); + if ( $ls_bento_is_wide ) { + $ls_bento_attrs['layout']['verticalAlignment'] = 'center'; + } else { + $ls_bento_attrs['layout']['verticalAlignment'] = 'space-between'; + } + ?> + +
+ +

+ + + +

+ +
+ + +
+ +
+ +
+ diff --git a/patterns/sections/split-intro-staggered-icon-cards.php b/patterns/sections/split-intro-staggered-icon-cards.php new file mode 100644 index 0000000..07144a4 --- /dev/null +++ b/patterns/sections/split-intro-staggered-icon-cards.php @@ -0,0 +1,108 @@ + 'users-three', + 'title' => __( 'AI Study Groups & Hackathons', 'ls-theme' ), + 'description' => __( 'Dedicated time to experiment with new AI capabilities, APIs, and prompt engineering.', 'ls-theme' ), + 'height' => '260px', + ), + array( + 'icon' => 'graduation-cap', + 'title' => __( 'Mentorship', 'ls-theme' ), + 'description' => __( 'We actively support junior developers through structured internships and senior mentorship.', 'ls-theme' ), + 'height' => '340px', + ), + array( + 'icon' => 'book', + 'title' => __( 'Continuous Learning Allowances', 'ls-theme' ), + 'description' => __( 'We provide resources to help you master GitHub, Copilot, and modern block theme practices.', 'ls-theme' ), + 'height' => '420px', + ), +); +?> + +
+ + +
+ + +
+ + +
+ + + +

+ +
+ + + +

+ + + +
+ +

+ + + +

+ +
+ +
+ + + +
+ + + +
+ +
+ +
+ +
+ + + +
+ +

+ + + +

+ +
+ +
+ +
+ + +
+ +
+ +
+ diff --git a/patterns/sections/split-text-pair-statement.php b/patterns/sections/split-text-pair-statement.php new file mode 100644 index 0000000..97c8317 --- /dev/null +++ b/patterns/sections/split-text-pair-statement.php @@ -0,0 +1,75 @@ + __( 'Why join LightSpeed', 'ls-theme' ), + 'text' => __( 'LightSpeed is not trying to build a culture around noise. We care about doing good work, improving over time, and using modern tools in ways that make the team stronger. If you like clean systems, practical delivery and open-source values, you will probably feel more at home here than in a company chasing hype.', 'ls-theme' ), + ), + array( + 'heading' => __( 'How we work', 'ls-theme' ), + 'text' => __( 'We are a remote-first team, and have been since 2014. That means flexible schedules, but it also means clear expectations. We document work, define review points, rely on shared tools, and expect people to communicate well.', 'ls-theme' ), + ), +); + +$ls_goal_html = sprintf( + /* translators: 1: struck-through phrase, 2: highlighted phrase. */ + esc_html__( 'The goal is not %1$s. The goal is %2$s.', 'ls-theme' ), + '' . esc_html__( 'constant visibility', 'ls-theme' ) . '', + '' . esc_html__( 'dependable progress', 'ls-theme' ) . '' +); +?> + +
+ + +
+ + +
+ + + +
+ + +
+ + + +

+ +
+ + + +

+ +
+ + +
+ + + +
+ +

+ +
+ +
+ +
+ diff --git a/patterns/sections/statement-lede.php b/patterns/sections/statement-lede.php new file mode 100644 index 0000000..1678353 --- /dev/null +++ b/patterns/sections/statement-lede.php @@ -0,0 +1,46 @@ + + +
+ + +
+ + +
+ + + +

+ +
+ + + +

+ + + +
+ +

+ +
+ +
+ +
+ diff --git a/src/scss/structural/about-careers.scss b/src/scss/structural/about-careers.scss new file mode 100644 index 0000000..6b19824 --- /dev/null +++ b/src/scss/structural/about-careers.scss @@ -0,0 +1,76 @@ +/********** About Careers (About Careers page patterns) **********/ + +/* + * Everything the block attributes can express (type, colours, spacing, the Card - Plain shells, the + * bento grid and its column spans, the staircase of card heights and the icon wells) is authored in + * the pattern files. This file owns only what JSON cannot: a measure in ch, text-wrap, inline-style + * overrides on small screens and the grid reflow. The mobile rules use WordPress's own breakpoints + * (781.98px for the columns stacking, 599.98px for the small-screen step). + */ + +// JSON limitation: max-width in ch and text-wrap have no heading-block key. They keep the very large +// statement breaking onto short lines. The extra class lifts it above core's constrained-layout +// max-width rule, which loads later at equal specificity — see AGENTS.md Theme-First Approach +.wp-block-heading.ls-careers-statement { + max-width: 18ch; + text-wrap: balance; +} + +// JSON limitation: text-wrap has no paragraph-block key — see AGENTS.md Theme-First Approach +.ls-careers-goal { + text-wrap: balance; +} + +@media (max-width: 781.98px) { + // JSON limitation: the image block prints its aspect ratio as an inline style, and breakpoint + // overrides have no theme.json equivalent, so the banner crop needs !important to change on + // small screens — see AGENTS.md Theme-First Approach + .ls-careers-hero__photo img { + aspect-ratio: 16 / 10 !important; + } + + // JSON limitation: a core grid has one column count for every width, and the child column spans + // are generated single-class rules; the two-class selectors here override both at the stacking + // breakpoint — see AGENTS.md Theme-First Approach + .ls-bento.wp-block-group { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .ls-bento > .ls-bento__card { + grid-column: span 1; + } + + .ls-bento > .ls-bento__card:last-child { + grid-column: span 2; + } + + // JSON limitation: the cards' minimum heights are inline styles, so dropping them where the + // columns stack needs !important — see AGENTS.md Theme-First Approach + .ls-stairs__card { + min-height: 0 !important; + } +} + +@media (max-width: 599.98px) { + .ls-bento.wp-block-group { + grid-template-columns: minmax(0, 1fr); + } + + .ls-bento > .ls-bento__card, + .ls-bento > .ls-bento__card:last-child { + grid-column: auto; + } + + // JSON limitation: inline min-height needs !important to drop on small screens — see AGENTS.md + // Theme-First Approach + .ls-bento__card { + min-height: 0 !important; + } + + // JSON limitation: the full-width card's row layout is a generated container class, so turning it + // into a column on small screens needs a breakpoint rule — see AGENTS.md Theme-First Approach + .ls-bento > .ls-bento__card:last-child { + align-items: flex-start; + flex-direction: column; + } +} diff --git a/styles/dark.json b/styles/dark.json index b1969a0..37cafa7 100644 --- a/styles/dark.json +++ b/styles/dark.json @@ -88,6 +88,9 @@ "evolve-on-dark": "var:preset|color|phase-six", "evolve-on-dark-card": "var:preset|color|phase-six-light" }, + "accent": { + "warm": "var:preset|color|warm-300" + }, "status": { "success": "var:preset|color|success-foreground" }, diff --git a/theme.json b/theme.json index 452072e..6a886a9 100644 --- a/theme.json +++ b/theme.json @@ -502,6 +502,16 @@ "name": "Phase Six Light", "slug": "phase-six-light", "color": "#A3A5FB" + }, + { + "name": "Warm 300", + "slug": "warm-300", + "color": "#FDBA74" + }, + { + "name": "Warm 700", + "slug": "warm-700", + "color": "#C2410C" } ] }, @@ -610,6 +620,9 @@ "evolve-on-dark": "var:preset|color|phase-six", "evolve-on-dark-card": "var:preset|color|phase-six-mid" }, + "accent": { + "warm": "var:preset|color|warm-700" + }, "status": { "success": "var:preset|color|success-strong" }, From 1c50ad6206834c3d743262044db33f5ff848af0f Mon Sep 17 00:00:00 2001 From: Brandonma21 Date: Wed, 21 Oct 2026 15:49:53 +0200 Subject: [PATCH 2/4] design: careers-page - Turn the Careers hero into a split with the team photo on the right (LSA-197) Hero - Replace Hero - Lede Wide Photo with Hero - Split Photo - Put the eyebrow, H1 and lede on the left and the team photo on the right - Show the photo at its natural 3:2 ratio so it is no longer stretched or cropped Cleanup - Remove the unused hero photo crop rule from about-careers.scss - Drop the hero class from the about-careers marker list in inc/animations.php - Rebuild about-careers.css --- assets/css/about-careers.css | 2 +- inc/animations.php | 7 ++- patterns/hero/hero-lede-wide-photo.php | 60 ---------------------- patterns/hero/hero-split-photo.php | 69 ++++++++++++++++++++++++++ src/scss/structural/about-careers.scss | 7 --- 5 files changed, 73 insertions(+), 72 deletions(-) delete mode 100644 patterns/hero/hero-lede-wide-photo.php create mode 100644 patterns/hero/hero-split-photo.php diff --git a/assets/css/about-careers.css b/assets/css/about-careers.css index b2ad4f3..019f086 100644 --- a/assets/css/about-careers.css +++ b/assets/css/about-careers.css @@ -1 +1 @@ -.wp-block-heading.ls-careers-statement{max-width:18ch;text-wrap:balance}.ls-careers-goal{text-wrap:balance}@media(max-width: 781.98px){.ls-careers-hero__photo img{aspect-ratio:16/10 !important}.ls-bento.wp-block-group{grid-template-columns:repeat(2, minmax(0, 1fr))}.ls-bento>.ls-bento__card{grid-column:span 1}.ls-bento>.ls-bento__card:last-child{grid-column:span 2}.ls-stairs__card{min-height:0 !important}}@media(max-width: 599.98px){.ls-bento.wp-block-group{grid-template-columns:minmax(0, 1fr)}.ls-bento>.ls-bento__card,.ls-bento>.ls-bento__card:last-child{grid-column:auto}.ls-bento__card{min-height:0 !important}.ls-bento>.ls-bento__card:last-child{align-items:flex-start;flex-direction:column}} +.wp-block-heading.ls-careers-statement{max-width:18ch;text-wrap:balance}.ls-careers-goal{text-wrap:balance}@media(max-width: 781.98px){.ls-bento.wp-block-group{grid-template-columns:repeat(2, minmax(0, 1fr))}.ls-bento>.ls-bento__card{grid-column:span 1}.ls-bento>.ls-bento__card:last-child{grid-column:span 2}.ls-stairs__card{min-height:0 !important}}@media(max-width: 599.98px){.ls-bento.wp-block-group{grid-template-columns:minmax(0, 1fr)}.ls-bento>.ls-bento__card,.ls-bento>.ls-bento__card:last-child{grid-column:auto}.ls-bento__card{min-height:0 !important}.ls-bento>.ls-bento__card:last-child{align-items:flex-start;flex-direction:column}} diff --git a/inc/animations.php b/inc/animations.php index 5d10610..ca043aa 100644 --- a/inc/animations.php +++ b/inc/animations.php @@ -114,7 +114,7 @@ function ls_theme_get_bundle_render_markers() { 'legal-page' => array( 'classes' => array( 'ls-page-hero', 'ls-legal-toc', 'ls-legal-body', 'ls-related-trust-grid' ) ), 'hero-split-form' => array( 'classes' => array( 'ls-hero-form-intro' ) ), 'scroll-timeline' => array( 'classes' => array( 'ls-scroll-timeline' ) ), - 'about-careers' => array( 'classes' => array( 'ls-careers-hero', 'ls-careers-statement', 'ls-careers-goal', 'ls-bento', 'ls-stairs' ) ), + 'about-careers' => array( 'classes' => array( 'ls-careers-statement', 'ls-careers-goal', 'ls-bento', 'ls-stairs' ) ), 'details-card-grid' => array( 'classes' => array( 'ls-year-card' ) ), ); } @@ -737,9 +737,8 @@ function ls_theme_get_effect_styles( $context = 'front' ) { 'handle' => 'ls-theme-about-careers', 'path' => 'assets/css/about-careers.css', 'contexts' => array( 'front', 'editor' ), - // The About Careers page patterns: the statement measure, the bento and staircase reflow and - // the hero photo crop on small screens. The render-marker fallback loads it wherever the - // patterns render. + // The About Careers page patterns: the statement measure and the bento and staircase reflow on + // small screens. The render-marker fallback loads it wherever the patterns render. 'condition' => static function () { return is_page( 'about/careers' ); }, diff --git a/patterns/hero/hero-lede-wide-photo.php b/patterns/hero/hero-lede-wide-photo.php deleted file mode 100644 index 9132dee..0000000 --- a/patterns/hero/hero-lede-wide-photo.php +++ /dev/null @@ -1,60 +0,0 @@ - - -
- - -
- - -
- - is_registered( 'yoast-seo/breadcrumbs' ) ) : ?> - - - - -
- - - -

- -
- - - -

- - - -
- -

- -
- -
- - - -
<?php echo esc_attr__( 'The LightSpeed team together', 'ls-theme' ); ?>
- -
- -
- diff --git a/patterns/hero/hero-split-photo.php b/patterns/hero/hero-split-photo.php new file mode 100644 index 0000000..d00a9ff --- /dev/null +++ b/patterns/hero/hero-split-photo.php @@ -0,0 +1,69 @@ + + +
+ + +
+ + is_registered( 'yoast-seo/breadcrumbs' ) ) : ?> + + + + +
+ + +
+ + +
+ + + +

+ +
+ + + +

+ + + +
+ +

+ +
+ +
+ + + +
+ +
<?php echo esc_attr__( 'The LightSpeed team together', 'ls-theme' ); ?>
+ +
+ +
+ +
+ +
+ diff --git a/src/scss/structural/about-careers.scss b/src/scss/structural/about-careers.scss index 6b19824..e517d76 100644 --- a/src/scss/structural/about-careers.scss +++ b/src/scss/structural/about-careers.scss @@ -22,13 +22,6 @@ } @media (max-width: 781.98px) { - // JSON limitation: the image block prints its aspect ratio as an inline style, and breakpoint - // overrides have no theme.json equivalent, so the banner crop needs !important to change on - // small screens — see AGENTS.md Theme-First Approach - .ls-careers-hero__photo img { - aspect-ratio: 16 / 10 !important; - } - // JSON limitation: a core grid has one column count for every width, and the child column spans // are generated single-class rules; the two-class selectors here override both at the stacking // breakpoint — see AGENTS.md Theme-First Approach From a08488cf2a367cceba3ce008735fc1403769efa2 Mon Sep 17 00:00:00 2001 From: Brandonma21 Date: Wed, 21 Oct 2026 15:56:03 +0200 Subject: [PATCH 3/4] design: careers-page - Put each goal sentence on its own line and make the Growth cards equal height (LSA-197) Statement - Let the closing goal statement span the full width instead of an 800px box - Break the line between the two sentences so each sits on its own line Growth cards - Replace the staggered columns with a three-column grid so the cards share one height - Rename Section - Split Intro Staggered Icon Cards to Section - Intro Icon Card Trio - Remove the staircase marker class and the mobile min-height reset Cleanup - Update the about-careers marker list in inc/animations.php - Rebuild about-careers.css --- assets/css/about-careers.css | 2 +- inc/animations.php | 5 +- ...con-cards.php => intro-icon-card-trio.php} | 62 ++++++++----------- .../sections/split-text-pair-statement.php | 6 +- src/scss/structural/about-careers.scss | 8 +-- 5 files changed, 34 insertions(+), 49 deletions(-) rename patterns/sections/{split-intro-staggered-icon-cards.php => intro-icon-card-trio.php} (52%) diff --git a/assets/css/about-careers.css b/assets/css/about-careers.css index 019f086..603f1b2 100644 --- a/assets/css/about-careers.css +++ b/assets/css/about-careers.css @@ -1 +1 @@ -.wp-block-heading.ls-careers-statement{max-width:18ch;text-wrap:balance}.ls-careers-goal{text-wrap:balance}@media(max-width: 781.98px){.ls-bento.wp-block-group{grid-template-columns:repeat(2, minmax(0, 1fr))}.ls-bento>.ls-bento__card{grid-column:span 1}.ls-bento>.ls-bento__card:last-child{grid-column:span 2}.ls-stairs__card{min-height:0 !important}}@media(max-width: 599.98px){.ls-bento.wp-block-group{grid-template-columns:minmax(0, 1fr)}.ls-bento>.ls-bento__card,.ls-bento>.ls-bento__card:last-child{grid-column:auto}.ls-bento__card{min-height:0 !important}.ls-bento>.ls-bento__card:last-child{align-items:flex-start;flex-direction:column}} +.wp-block-heading.ls-careers-statement{max-width:18ch;text-wrap:balance}.ls-careers-goal{text-wrap:balance}@media(max-width: 781.98px){.ls-bento.wp-block-group{grid-template-columns:repeat(2, minmax(0, 1fr))}.ls-bento>.ls-bento__card{grid-column:span 1}.ls-bento>.ls-bento__card:last-child{grid-column:span 2}}@media(max-width: 599.98px){.ls-bento.wp-block-group{grid-template-columns:minmax(0, 1fr)}.ls-bento>.ls-bento__card,.ls-bento>.ls-bento__card:last-child{grid-column:auto}.ls-bento__card{min-height:0 !important}.ls-bento>.ls-bento__card:last-child{align-items:flex-start;flex-direction:column}} diff --git a/inc/animations.php b/inc/animations.php index ca043aa..f76463f 100644 --- a/inc/animations.php +++ b/inc/animations.php @@ -114,7 +114,7 @@ function ls_theme_get_bundle_render_markers() { 'legal-page' => array( 'classes' => array( 'ls-page-hero', 'ls-legal-toc', 'ls-legal-body', 'ls-related-trust-grid' ) ), 'hero-split-form' => array( 'classes' => array( 'ls-hero-form-intro' ) ), 'scroll-timeline' => array( 'classes' => array( 'ls-scroll-timeline' ) ), - 'about-careers' => array( 'classes' => array( 'ls-careers-statement', 'ls-careers-goal', 'ls-bento', 'ls-stairs' ) ), + 'about-careers' => array( 'classes' => array( 'ls-careers-statement', 'ls-careers-goal', 'ls-bento' ) ), 'details-card-grid' => array( 'classes' => array( 'ls-year-card' ) ), ); } @@ -737,8 +737,7 @@ function ls_theme_get_effect_styles( $context = 'front' ) { 'handle' => 'ls-theme-about-careers', 'path' => 'assets/css/about-careers.css', 'contexts' => array( 'front', 'editor' ), - // The About Careers page patterns: the statement measure and the bento and staircase reflow on - // small screens. The render-marker fallback loads it wherever the patterns render. + // The About Careers page patterns: the statement measure and the bento reflow on small screens. The render-marker fallback loads it wherever the patterns render. 'condition' => static function () { return is_page( 'about/careers' ); }, diff --git a/patterns/sections/split-intro-staggered-icon-cards.php b/patterns/sections/intro-icon-card-trio.php similarity index 52% rename from patterns/sections/split-intro-staggered-icon-cards.php rename to patterns/sections/intro-icon-card-trio.php index 07144a4..2db61d6 100644 --- a/patterns/sections/split-intro-staggered-icon-cards.php +++ b/patterns/sections/intro-icon-card-trio.php @@ -1,35 +1,32 @@ 'users-three', 'title' => __( 'AI Study Groups & Hackathons', 'ls-theme' ), 'description' => __( 'Dedicated time to experiment with new AI capabilities, APIs, and prompt engineering.', 'ls-theme' ), - 'height' => '260px', ), array( 'icon' => 'graduation-cap', 'title' => __( 'Mentorship', 'ls-theme' ), 'description' => __( 'We actively support junior developers through structured internships and senior mentorship.', 'ls-theme' ), - 'height' => '340px', ), array( 'icon' => 'book', 'title' => __( 'Continuous Learning Allowances', 'ls-theme' ), 'description' => __( 'We provide resources to help you master GitHub, Copilot, and modern block theme practices.', 'ls-theme' ), - 'height' => '420px', ), ); ?> @@ -70,38 +67,33 @@ - -
- - - -
- -
- -
- -
- + +
+ + +
+ +
+ +
+ - -
- -

- + +
+ +

+ - -

- -
- -
+ +

+ +
-
- + +
- + diff --git a/patterns/sections/split-text-pair-statement.php b/patterns/sections/split-text-pair-statement.php index 97c8317..d307242 100644 --- a/patterns/sections/split-text-pair-statement.php +++ b/patterns/sections/split-text-pair-statement.php @@ -24,8 +24,8 @@ ); $ls_goal_html = sprintf( - /* translators: 1: struck-through phrase, 2: highlighted phrase. */ - esc_html__( 'The goal is not %1$s. The goal is %2$s.', 'ls-theme' ), + /* translators: 1: struck-through phrase, 2: highlighted phrase. The line break between the two sentences is intentional. */ + __( 'The goal is not %1$s.
The goal is %2$s.', 'ls-theme' ), '' . esc_html__( 'constant visibility', 'ls-theme' ) . '', '' . esc_html__( 'dependable progress', 'ls-theme' ) . '' ); @@ -62,7 +62,7 @@ - +

diff --git a/src/scss/structural/about-careers.scss b/src/scss/structural/about-careers.scss index e517d76..99a6aad 100644 --- a/src/scss/structural/about-careers.scss +++ b/src/scss/structural/about-careers.scss @@ -2,7 +2,7 @@ /* * Everything the block attributes can express (type, colours, spacing, the Card - Plain shells, the - * bento grid and its column spans, the staircase of card heights and the icon wells) is authored in + * bento grid and its column spans and the icon wells) is authored in * the pattern files. This file owns only what JSON cannot: a measure in ch, text-wrap, inline-style * overrides on small screens and the grid reflow. The mobile rules use WordPress's own breakpoints * (781.98px for the columns stacking, 599.98px for the small-screen step). @@ -36,12 +36,6 @@ .ls-bento > .ls-bento__card:last-child { grid-column: span 2; } - - // JSON limitation: the cards' minimum heights are inline styles, so dropping them where the - // columns stack needs !important — see AGENTS.md Theme-First Approach - .ls-stairs__card { - min-height: 0 !important; - } } @media (max-width: 599.98px) { From 4d9f1c0a503f675415996313f52b8897bc8e7205 Mon Sep 17 00:00:00 2001 From: Brandonma21 Date: Thu, 22 Oct 2026 08:05:13 +0200 Subject: [PATCH 4/4] fix: careers-page - Pick the bento's wide and feature cards by class and fill the two-column gap (LSA-197) Bento reflow - Make the first card span a full row between 600px and 782px so the final row no longer leaves an empty cell Selectors - Add ls-bento__card--wide and ls-bento__card--feature classes in Numbered Bento Cards - Use the classes instead of :last-child for the two-column span and the mobile column layout - Rebuild about-careers.css --- assets/css/about-careers.css | 2 +- patterns/sections/numbered-bento-cards.php | 12 +++++++++--- src/scss/structural/about-careers.scss | 11 ++++++++--- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/assets/css/about-careers.css b/assets/css/about-careers.css index 603f1b2..0327391 100644 --- a/assets/css/about-careers.css +++ b/assets/css/about-careers.css @@ -1 +1 @@ -.wp-block-heading.ls-careers-statement{max-width:18ch;text-wrap:balance}.ls-careers-goal{text-wrap:balance}@media(max-width: 781.98px){.ls-bento.wp-block-group{grid-template-columns:repeat(2, minmax(0, 1fr))}.ls-bento>.ls-bento__card{grid-column:span 1}.ls-bento>.ls-bento__card:last-child{grid-column:span 2}}@media(max-width: 599.98px){.ls-bento.wp-block-group{grid-template-columns:minmax(0, 1fr)}.ls-bento>.ls-bento__card,.ls-bento>.ls-bento__card:last-child{grid-column:auto}.ls-bento__card{min-height:0 !important}.ls-bento>.ls-bento__card:last-child{align-items:flex-start;flex-direction:column}} +.wp-block-heading.ls-careers-statement{max-width:18ch;text-wrap:balance}.ls-careers-goal{text-wrap:balance}@media(max-width: 781.98px){.ls-bento.wp-block-group{grid-template-columns:repeat(2, minmax(0, 1fr))}.ls-bento>.ls-bento__card{grid-column:span 1}.ls-bento>.ls-bento__card--feature,.ls-bento>.ls-bento__card--wide{grid-column:span 2}}@media(max-width: 599.98px){.ls-bento.wp-block-group{grid-template-columns:minmax(0, 1fr)}.ls-bento>.ls-bento__card,.ls-bento>.ls-bento__card--feature,.ls-bento>.ls-bento__card--wide{grid-column:auto}.ls-bento__card{min-height:0 !important}.ls-bento>.ls-bento__card--wide{align-items:flex-start;flex-direction:column}} diff --git a/patterns/sections/numbered-bento-cards.php b/patterns/sections/numbered-bento-cards.php index 7a0283d..109a23a 100644 --- a/patterns/sections/numbered-bento-cards.php +++ b/patterns/sections/numbered-bento-cards.php @@ -86,10 +86,16 @@
'article', - 'className' => 'is-style-card-plain ls-bento__card', + 'className' => 'is-style-card-plain ls-bento__card' . $ls_bento_modifier, 'style' => array( 'layout' => array( 'columnSpan' => $ls_bento_card['span'] ), 'spacing' => array( 'blockGap' => 'var:preset|spacing|40' ), @@ -110,7 +116,7 @@ } ?> -
+

diff --git a/src/scss/structural/about-careers.scss b/src/scss/structural/about-careers.scss index 99a6aad..21e6994 100644 --- a/src/scss/structural/about-careers.scss +++ b/src/scss/structural/about-careers.scss @@ -33,7 +33,11 @@ grid-column: span 1; } - .ls-bento > .ls-bento__card:last-child { + // The feature card takes a full row here, so the four two-column cards after it fill two whole rows + // and the wide card closes the grid without leaving an empty cell. The cards are picked by class, + // not position, so reordering or deleting a card in the editor does not move the spans. + .ls-bento > .ls-bento__card--feature, + .ls-bento > .ls-bento__card--wide { grid-column: span 2; } } @@ -44,7 +48,8 @@ } .ls-bento > .ls-bento__card, - .ls-bento > .ls-bento__card:last-child { + .ls-bento > .ls-bento__card--feature, + .ls-bento > .ls-bento__card--wide { grid-column: auto; } @@ -56,7 +61,7 @@ // JSON limitation: the full-width card's row layout is a generated container class, so turning it // into a column on small screens needs a breakpoint rule — see AGENTS.md Theme-First Approach - .ls-bento > .ls-bento__card:last-child { + .ls-bento > .ls-bento__card--wide { align-items: flex-start; flex-direction: column; }