From 292c33a767c5f39960432058f6134e2824566d93 Mon Sep 17 00:00:00 2001 From: Brandonma21 Date: Wed, 21 Oct 2026 10:08:32 +0200 Subject: [PATCH 1/3] design: culture-page - Add the Hero and Sections 1-4 patterns and the warm accent tokens (LSA-108) Patterns - Add Hero - Lede Actions Ticks (breadcrumb, eyebrow, H1, lede, buttons, daily/weekly/quarterly tick rows) - Add Section - Split Statement Words (three oversized words with coloured first letters) - Add Section - Split Sticky Intro Rows (sticky intro with outlined year, numbered rows, pill labels) - Add Section - Band Lanes (surface.card band, three ruled lanes, closing row with pill labels) - Add Section - Accent Card Grid (core values cards with accent top borders and hover lift) Styles - Add src/scss/structural/about-culture.scss for the tick marks, first-letter colours, sticky intro, outlined year, pill labels, lane stacking and card hover - Compile to assets/css/about-culture.css - Wire the bundle in package.json, inc/animations.php and functions.php Tokens - Add the warm-300 and warm-700 palette colours - Add custom.color.accent.warm (warm-700 in light, warm-300 in dark) - Add custom.color.surface.brand-strong (brand-600 in light, cta-600 in dark) for Section 7 Verification - Checked in the browser in light mode and at mobile width - Contrast checked in light and dark; dark mode not yet checked in the browser - JSON schema validation, SCSS lint and CSS build pass --- assets/css/about-culture.css | 1 + functions.php | 1 + inc/animations.php | 11 + package.json | 6 +- patterns/hero/hero-lede-actions-ticks.php | 107 ++++++++++ patterns/sections/accent-card-grid.php | 102 +++++++++ patterns/sections/band-lanes.php | 132 ++++++++++++ patterns/sections/split-statement-words.php | 72 +++++++ patterns/sections/split-sticky-intro-rows.php | 114 ++++++++++ src/scss/structural/about-culture.scss | 194 ++++++++++++++++++ styles/dark.json | 4 + theme.json | 14 ++ 12 files changed, 755 insertions(+), 3 deletions(-) create mode 100644 assets/css/about-culture.css create mode 100644 patterns/hero/hero-lede-actions-ticks.php create mode 100644 patterns/sections/accent-card-grid.php create mode 100644 patterns/sections/band-lanes.php create mode 100644 patterns/sections/split-statement-words.php create mode 100644 patterns/sections/split-sticky-intro-rows.php create mode 100644 src/scss/structural/about-culture.scss diff --git a/assets/css/about-culture.css b/assets/css/about-culture.css new file mode 100644 index 0000000..db32b26 --- /dev/null +++ b/assets/css/about-culture.css @@ -0,0 +1 @@ +.ls-rhythm-hero__title{max-width:11ch;text-wrap:balance}.ls-rhythm-ticks__marks{display:block;min-width:0;height:var(--wp--preset--spacing--30);color:var(--wp--custom--color--text--brand)}.ls-rhythm-ticks__marks--daily{background:repeating-linear-gradient(90deg, currentcolor 0 2px, transparent 2px 12px);opacity:.55}.ls-rhythm-ticks__marks--weekly{background:repeating-linear-gradient(90deg, currentcolor 0 3px, transparent 3px 84px);opacity:.8}.ls-rhythm-ticks__marks--quarterly{color:var(--wp--custom--color--accent--warm);background:repeating-linear-gradient(90deg, currentcolor 0 6px, transparent 6px 252px)}.ls-rhythm-ticks__label--end{text-align:right}@media(max-width: 781.98px){.ls-rhythm-ticks__label--end{display:none}}.ls-statement-word--brand::first-letter{color:var(--wp--custom--color--text--brand)}.ls-statement-word--warm::first-letter{color:var(--wp--custom--color--accent--warm)}.ls-statement-word--grow::first-letter{color:var(--wp--custom--color--phase--grow)}@media(min-width: 782px){.ls-sticky-intro{position:sticky;top:var(--wp--preset--spacing--100);align-self:flex-start}}.ls-outline-year{color:rgba(0,0,0,0);-webkit-text-stroke:2px var(--wp--custom--color--text--brand)}.ls-row-number{flex-shrink:0}.ls-chips,.ls-steps{display:flex;flex-wrap:wrap;gap:var(--wp--preset--spacing--10);margin:0;padding:0;list-style:none}.ls-chips li,.ls-steps li{margin:0;padding:var(--wp--preset--spacing--5) var(--wp--preset--spacing--10);font-family:var(--wp--preset--font-family--monospace);font-weight:var(--wp--custom--typography--font-weight--semibold);letter-spacing:var(--wp--custom--typography--letter-spacing--wide);text-transform:uppercase}.ls-chips li{border-radius:var(--wp--preset--border-radius--100);background:var(--wp--custom--color--surface--brand-light);color:var(--wp--custom--color--text--brand-strong)}.ls-steps{counter-reset:ls-step}.ls-steps li{display:flex;align-items:center;gap:var(--wp--preset--spacing--10);border:1px solid var(--wp--custom--color--border--card-strong);border-radius:var(--wp--preset--border-radius--500);color:var(--wp--custom--color--text--default);counter-increment:ls-step;text-transform:none}.ls-steps li::before{color:var(--wp--custom--color--text--brand);content:counter(ls-step)}@media(max-width: 781.98px){.ls-lanes__lane{padding-right:0 !important;padding-left:0 !important;border-left:0 !important;border-bottom:1px solid var(--wp--custom--color--border--card) !important}.ls-lanes__lane:last-child{border-bottom:0 !important}}.ls-accent-card{transition:transform var(--wp--custom--animation--duration--base) var(--wp--custom--animation--easing--emphasised),box-shadow var(--wp--custom--animation--duration--base) var(--wp--custom--animation--easing--emphasised)}.ls-accent-card:hover{transform:translateY(calc(var(--wp--preset--spacing--5) * -1));box-shadow:var(--wp--custom--shadow--elevation--200)}@media(prefers-reduced-motion: reduce){.ls-accent-card{transition:none}.ls-accent-card:hover{transform:none}} diff --git a/functions.php b/functions.php index f3917ea..f34ed02 100644 --- a/functions.php +++ b/functions.php @@ -96,6 +96,7 @@ function ls_theme_setup() { add_editor_style( 'assets/css/services-service-tiles.css' ); add_editor_style( 'assets/css/solutions-route-tiles.css' ); add_editor_style( 'assets/css/stat-feature-bento.css' ); + add_editor_style( 'assets/css/about-culture.css' ); add_editor_style( 'assets/css/services-delivery-numbers.css' ); add_editor_style( 'assets/css/corner-glow.css' ); add_editor_style( 'assets/css/snapshot-card.css' ); diff --git a/inc/animations.php b/inc/animations.php index 9465fe8..d3c5192 100644 --- a/inc/animations.php +++ b/inc/animations.php @@ -81,6 +81,7 @@ function ls_theme_get_bundle_render_markers() { 'services-service-tiles' => array( 'classes' => array( 'is-style-card-service-tile' ) ), 'solutions-route-tiles' => array( 'classes' => array( 'ls-route-tile' ) ), 'stat-feature-bento' => array( 'classes' => array( 'ls-stat-feature-card' ) ), + 'about-culture' => array( 'classes' => array( 'ls-rhythm-ticks', 'ls-statement-word', 'ls-sticky-intro', 'ls-outline-year', 'ls-chips', 'ls-steps', 'ls-lanes', 'ls-accent-card' ) ), 'services-delivery-numbers' => array( 'classes' => array( 'ls-delivery-stats-row' ) ), 'corner-glow' => array( 'classes' => array( 'ls-corner-glow' ) ), 'snapshot-card' => array( 'classes' => array( 'ls-snapshot-card' ) ), @@ -390,6 +391,16 @@ function ls_theme_get_effect_styles( $context = 'front' ) { return is_page( 'solutions' ); }, ), + 'about-culture' => array( + 'handle' => 'ls-theme-about-culture', + 'path' => 'assets/css/about-culture.css', + 'contexts' => array( 'front', 'editor' ), + // Scoped to the real About Culture page slug, same reasoning as stat-feature-bento + // above; the render_block marker detection covers the patterns placed elsewhere. + 'condition' => static function () { + return is_page( 'culture' ); + }, + ), 'services-delivery-numbers' => array( 'handle' => 'ls-theme-services-delivery-numbers', 'path' => 'assets/css/services-delivery-numbers.css', diff --git a/package.json b/package.json index 0334edd..09be292 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", - "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", + "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/about-culture.scss:assets/css/about-culture.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/about-culture.scss:assets/css/about-culture.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" + "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/about-culture.scss:assets/css/about-culture.css" }, "devDependencies": { "@axe-core/playwright": "^4.13.0", diff --git a/patterns/hero/hero-lede-actions-ticks.php b/patterns/hero/hero-lede-actions-ticks.php new file mode 100644 index 0000000..d0e9418 --- /dev/null +++ b/patterns/hero/hero-lede-actions-ticks.php @@ -0,0 +1,107 @@ + __( 'Daily', 'ls-theme' ), + 'ticks' => 'daily', + 'end' => __( 'Check-ins', 'ls-theme' ), + ), + array( + 'label' => __( 'Weekly', 'ls-theme' ), + 'ticks' => 'weekly', + 'end' => __( 'Goals', 'ls-theme' ), + ), + array( + 'label' => __( 'Quarterly', 'ls-theme' ), + 'ticks' => 'quarterly', + 'end' => __( 'Retreats', 'ls-theme' ), + ), +); +?> + +
+ + +
+ + + + + + +
+ + + +

+ +
+ + + +

+ + + +
+ + +
+ +

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

+ + + +
+ + + +

+ +
+ + +
+ +
+ +
+ diff --git a/patterns/sections/accent-card-grid.php b/patterns/sections/accent-card-grid.php new file mode 100644 index 0000000..009f11f --- /dev/null +++ b/patterns/sections/accent-card-grid.php @@ -0,0 +1,102 @@ + __( 'Curiosity', 'ls-theme' ), + 'label' => __( '& Continuous Learning', 'ls-theme' ), + 'text' => __( 'The tech landscape evolves rapidly. We actively encourage our team to experiment with new AI tools, block theme developments, and performance engineering practices.', 'ls-theme' ), + 'colour' => 'var(--wp--custom--color--text--brand)', + ), + array( + 'word' => __( 'Independence', 'ls-theme' ), + 'label' => __( '& Self-Motivation', 'ls-theme' ), + 'text' => __( 'We trust our team to manage their own time and choose the workspaces that suit them best, whether that’s a home office or a co-working space.', 'ls-theme' ), + 'colour' => $ls_accent_warm, + ), + array( + 'word' => __( 'Collaboration', 'ls-theme' ), + 'label' => __( '& Open Source', 'ls-theme' ), + 'text' => __( 'We believe in sharing our knowledge. Our team regularly contributes to WordPress Core, releases open-source plugins, and shares our design systems publicly on GitHub.', 'ls-theme' ), + 'colour' => 'var(--wp--custom--color--phase--grow)', + ), + array( + 'word' => __( 'Adaptability', 'ls-theme' ), + 'label' => __( '& AI Stewardship', 'ls-theme' ), + 'text' => __( 'As we integrate AI into our workflows, we are committed to using it responsibly, ensuring human oversight and maintaining strict data privacy standards.', 'ls-theme' ), + 'colour' => 'var(--wp--custom--color--phase--evolve)', + ), +); +?> + +
+ + +
+ + +
+ +
+ + + +

+ +
+ + + +

+ + + +

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

+ + + +

+ +
+ + + +

+ +
+ + +
+ +
+ +
+ diff --git a/patterns/sections/band-lanes.php b/patterns/sections/band-lanes.php new file mode 100644 index 0000000..27f6afa --- /dev/null +++ b/patterns/sections/band-lanes.php @@ -0,0 +1,132 @@ + __( 'Daily & Weekly', 'ls-theme' ), + 'title' => __( 'Rhythms', 'ls-theme' ), + 'text' => __( 'We use AI productivity tools to streamline our daily check-ins and weekly goals, automatically summarising meetings, tracking tasks, and surfacing critical insights so our team can focus on deep work.', 'ls-theme' ), + ), + array( + 'label' => __( 'Cross-Functional', 'ls-theme' ), + 'title' => __( 'Collaboration', 'ls-theme' ), + 'text' => __( 'Our designers and developers use AI coding assistants and remote design reviews to collaborate seamlessly across time zones, eliminating the traditional silos between design and development.', 'ls-theme' ), + ), + array( + 'label' => __( 'Asynchronous', 'ls-theme' ), + 'title' => __( 'Support', 'ls-theme' ), + 'text' => __( 'Internal AI chatbots help route information and answer questions asynchronously, allowing team members to work independently without being blocked by timezone differences.', 'ls-theme' ), + ), +); + +$ls_lane_labels = array( + __( 'Architecture', 'ls-theme' ), + __( 'Accessibility', 'ls-theme' ), + __( 'Design judgement', 'ls-theme' ), + __( 'Mentoring', 'ls-theme' ), +); +?> + +
+ + +
+ + +
+ +
+ + + +

+ +
+ + + +

+ + + +

+ +
+ + + +
+ $ls_lane ) : ?> + + +
+ +

+ + + +

+ + + +

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

+ +
+ + + +
+ +

+ + + +
+ +

+ + + +
    + + +
  • + + +
+ +
+ +
+ +
+ +
+ +
+ diff --git a/patterns/sections/split-statement-words.php b/patterns/sections/split-statement-words.php new file mode 100644 index 0000000..fb6bf80 --- /dev/null +++ b/patterns/sections/split-statement-words.php @@ -0,0 +1,72 @@ + __( 'Curiosity.', 'ls-theme' ), + 'modifier' => 'brand', + ), + array( + 'text' => __( 'Independence.', 'ls-theme' ), + 'modifier' => 'warm', + ), + array( + 'text' => __( 'Collaboration.', 'ls-theme' ), + 'modifier' => 'grow', + ), +); +?> + +
+ + +
+ + +
+ +
+ + + +

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

+ +
+ + + +

+ +
+ +
+ +
+ diff --git a/patterns/sections/split-sticky-intro-rows.php b/patterns/sections/split-sticky-intro-rows.php new file mode 100644 index 0000000..1670e76 --- /dev/null +++ b/patterns/sections/split-sticky-intro-rows.php @@ -0,0 +1,114 @@ + __( '01', 'ls-theme' ), + 'title' => __( 'What remote work means in practice', 'ls-theme' ), + 'text' => __( 'For us, remote work is not about everyone disappearing into their own corner. It depends on good documentation, clear project specs, agreed review points, and a rhythm that keeps work visible without filling the week with unnecessary meetings. LightSpeed’s public workflow material already points toward discovery workshops, content collection, Figma reviews, staging feedback and post-launch support as part of that operating model.', 'ls-theme' ), + 'list' => 'ls-steps', + 'labels' => array( + __( 'Discovery workshops', 'ls-theme' ), + __( 'Content collection', 'ls-theme' ), + __( 'Figma reviews', 'ls-theme' ), + __( 'Staging feedback', 'ls-theme' ), + __( 'Post-launch support', 'ls-theme' ), + ), + ), + array( + 'number' => __( '02', 'ls-theme' ), + 'title' => __( 'Independence with accountability', 'ls-theme' ), + 'text' => __( 'We value people who can manage their own time, communicate clearly, and move work forward without waiting to be chased. That independence matters, but so does accountability. Good remote culture depends on ownership, clarity and trust.', 'ls-theme' ), + 'list' => 'ls-chips', + 'labels' => array( + __( 'Ownership', 'ls-theme' ), + __( 'Clarity', 'ls-theme' ), + __( 'Trust', 'ls-theme' ), + ), + ), +); +?> + +
+ + +
+ + +
+ + +
+ + + +

+ +
+ + + +

+ + + +

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

+ + + +
+ +

+ + + +

+ + + +
    + + +
  • + + +
+ +
+ +
+ + +
+ +
+ +
+ +
+ diff --git a/src/scss/structural/about-culture.scss b/src/scss/structural/about-culture.scss new file mode 100644 index 0000000..181c61c --- /dev/null +++ b/src/scss/structural/about-culture.scss @@ -0,0 +1,194 @@ +/********** About Culture page patterns **********/ + +/* + * Shared by the About Culture patterns (Hero - Lede Actions Ticks, Section - Split Statement Words, + * Section - Split Sticky Intro Rows, Section - Dark Band Lanes, Section - Accent Card Grid). + * Surface, border, radius, spacing and type are block attributes in the patterns. What lives here + * is only what theme.json and block attributes cannot express. + */ + +// The orange accent (second value, "Independence") is the accent.warm semantic token: warm-700 in +// light mode and warm-300 in dark mode. +$accent-warm: var(--wp--custom--color--accent--warm); + +/* ---------- Hero - Lede Actions Ticks ---------- */ + +// JSON limitation: max-width in ch and text-wrap have no theme.json or heading-block key. +// They keep the large H1 breaking after "How we work". +.ls-rhythm-hero__title { + max-width: 11ch; + text-wrap: balance; +} + +// JSON limitation: repeating-linear-gradient tick marks and a fixed row height have no block +// support. The marks are decorative; the row labels beside them stay as real text. Tick widths +// and pitches are purely graphic and have no token equivalent. +.ls-rhythm-ticks__marks { + display: block; + min-width: 0; + height: var(--wp--preset--spacing--30); + color: var(--wp--custom--color--text--brand); +} + +.ls-rhythm-ticks__marks--daily { + background: repeating-linear-gradient(90deg, currentcolor 0 2px, transparent 2px 12px); + opacity: 0.55; +} + +.ls-rhythm-ticks__marks--weekly { + background: repeating-linear-gradient(90deg, currentcolor 0 3px, transparent 3px 84px); + opacity: 0.8; +} + +.ls-rhythm-ticks__marks--quarterly { + color: $accent-warm; + background: repeating-linear-gradient(90deg, currentcolor 0 6px, transparent 6px 252px); +} + +// JSON limitation: text-align is not a flex-child layout key; the right-hand label hugs the row end. +.ls-rhythm-ticks__label--end { + text-align: right; +} + +// JSON limitation: breakpoint overrides have no theme.json equivalent. The end label is dropped on +// narrow screens so the marks keep room; the row label still names the rhythm. +@media (max-width: 781.98px) { + .ls-rhythm-ticks__label--end { + display: none; + } +} + +/* ---------- Section - Split Statement Words ---------- */ + +// JSON limitation: ::first-letter has no theme.json key. Each word takes its own accent colour. +.ls-statement-word--brand::first-letter { + color: var(--wp--custom--color--text--brand); +} + +.ls-statement-word--warm::first-letter { + color: $accent-warm; +} + +.ls-statement-word--grow::first-letter { + color: var(--wp--custom--color--phase--grow); +} + +/* ---------- Section - Split Sticky Intro Rows ---------- */ + +// JSON limitation: position: sticky on a nested column child isn't a block support (core only +// offers sticky on top-level blocks) — see AGENTS.md Theme-First Approach. The intro stays in view +// while the rows scroll past on desktop, and returns to normal flow below the columns' stacking +// breakpoint. +.ls-sticky-intro { + @media (min-width: 782px) { + position: sticky; + top: var(--wp--preset--spacing--100); + align-self: flex-start; + } +} + +// JSON limitation: -webkit-text-stroke and a transparent fill have no theme.json key. The year is +// drawn as an outline in the brand colour. +.ls-outline-year { + color: transparent; + -webkit-text-stroke: 2px var(--wp--custom--color--text--brand); +} + +// JSON limitation: flex-shrink has no block key. Without it the long row text squeezes the +// fixed-width number column until the digits wrap. +.ls-row-number { + flex-shrink: 0; +} + +/* ---------- Pill labels (tinted tags and numbered steps) ---------- */ + +// JSON limitation: styling the
  • children of a list block, and CSS counters, have no +// theme.json key. A list reset is needed because the labels are pills, not bullets. +.ls-chips, +.ls-steps { + display: flex; + flex-wrap: wrap; + gap: var(--wp--preset--spacing--10); + margin: 0; + padding: 0; + list-style: none; + + li { + margin: 0; + padding: var(--wp--preset--spacing--5) var(--wp--preset--spacing--10); + font-family: var(--wp--preset--font-family--monospace); + font-weight: var(--wp--custom--typography--font-weight--semibold); + letter-spacing: var(--wp--custom--typography--letter-spacing--wide); + text-transform: uppercase; + } +} + +.ls-chips li { + border-radius: var(--wp--preset--border-radius--100); + background: var(--wp--custom--color--surface--brand-light); + color: var(--wp--custom--color--text--brand-strong); +} + +.ls-steps { + counter-reset: ls-step; + + li { + display: flex; + align-items: center; + gap: var(--wp--preset--spacing--10); + border: 1px solid var(--wp--custom--color--border--card-strong); + border-radius: var(--wp--preset--border-radius--500); + color: var(--wp--custom--color--text--default); + counter-increment: ls-step; + text-transform: none; + } + + li::before { + color: var(--wp--custom--color--text--brand); + content: counter(ls-step); + } +} + +/* ---------- Section - Band Lanes ---------- */ + +// JSON limitation: breakpoint overrides have no theme.json equivalent. Below the columns' +// stacking breakpoint the lanes sit one under another, so the side dividers become bottom +// dividers. !important is needed because the divider and padding are block attributes, which +// WordPress prints as inline styles. +@media (max-width: 781.98px) { + .ls-lanes__lane { + padding-right: 0 !important; + padding-left: 0 !important; + border-left: 0 !important; + border-bottom: 1px solid var(--wp--custom--color--border--card) !important; + } + + .ls-lanes__lane:last-child { + border-bottom: 0 !important; + } +} + +/* ---------- Section - Accent Card Grid ---------- */ + +// JSON limitation: :hover has no theme.json pseudo-state key for a block — see AGENTS.md +// Theme-First Approach. The cards lift on hover; reduced motion removes the movement. +.ls-accent-card { + transition: + transform var(--wp--custom--animation--duration--base) var(--wp--custom--animation--easing--emphasised), + box-shadow var(--wp--custom--animation--duration--base) var(--wp--custom--animation--easing--emphasised); + + &:hover { + transform: translateY(calc(var(--wp--preset--spacing--5) * -1)); + box-shadow: var(--wp--custom--shadow--elevation--200); + } +} + +@media (prefers-reduced-motion: reduce) { + .ls-accent-card { + transition: none; + + &:hover { + transform: none; + } + } +} diff --git a/styles/dark.json b/styles/dark.json index 6ec5884..271e731 100644 --- a/styles/dark.json +++ b/styles/dark.json @@ -28,6 +28,7 @@ "highlight-hover": "var:preset|color|neutral-200", "brand-light": "var:preset|color|brand-900", "brand": "var:preset|color|cta-500", + "brand-strong": "var:preset|color|cta-600", "cta-light": "var:preset|color|cta-900", "cta": "var:preset|color|accent-two-500", "accent-light": "var:preset|color|accent-900", @@ -88,6 +89,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 4990e4f..d983410 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" } ] }, @@ -545,6 +555,7 @@ "highlight-hover": "var:preset|color|neutral-200", "brand-light": "var:preset|color|brand-100", "brand": "var:preset|color|brand-500", + "brand-strong": "var:preset|color|brand-600", "cta-light": "var:preset|color|cta-100", "cta": "var:preset|color|cta-500", "accent-light": "var:preset|color|accent-100", @@ -610,6 +621,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 7df309967994472872e78ea175761f3435587089 Mon Sep 17 00:00:00 2001 From: Brandonma21 Date: Wed, 21 Oct 2026 11:31:24 +0200 Subject: [PATCH 2/3] design: culture-page - Link the AI workflow article from Band Lanes (LSA-108) Pattern - Add an arrow link under the workflow paragraph in Section - Band Lanes - Link to /ai-workflow/ through home_url(), matching the footer and mobile menu - Use the existing link-arrow-accent style and the link.accent colour token Co-Authored-By: Claude Sonnet 5.5 --- patterns/sections/band-lanes.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/patterns/sections/band-lanes.php b/patterns/sections/band-lanes.php index 27f6afa..48b00e5 100644 --- a/patterns/sections/band-lanes.php +++ b/patterns/sections/band-lanes.php @@ -4,7 +4,7 @@ * Slug: ls-theme/band-lanes * Categories: text * Block Types: core/pattern - * Description: A surface.card band that follows light and dark mode through surface, text and border tokens: a dot eyebrow, H2 and lede paragraph, then three ruled "lanes" side by side, each a mono kicker label, a large H3 and a paragraph, divided by hairlines, then a closing row with an H3 on the left and a paragraph plus a "More time for" row of pill labels on the right. The lane dividers are column borders; src/scss/structural/about-culture.scss only switches them from side dividers to stacked dividers on mobile and styles the pill labels (ls-chips). Authored for the About Culture page "The AI-Empowered Remote Workflow" section; edit the copy and labels after inserting. Falls back to core/columns and core/group because no semantic core block fits a lane. + * Description: A surface.card band that follows light and dark mode through surface, text and border tokens: a dot eyebrow, H2 and lede paragraph, then three ruled "lanes" side by side, each a mono kicker label, a large H3 and a paragraph, divided by hairlines, then a closing row with an H3 on the left and a paragraph, an arrow link to the AI workflow article and a "More time for" row of pill labels on the right. The lane dividers are column borders; src/scss/structural/about-culture.scss only switches them from side dividers to stacked dividers on mobile and styles the pill labels (ls-chips). Authored for the About Culture page "The AI-Empowered Remote Workflow" section; edit the copy and labels after inserting. Falls back to core/columns and core/group because no semantic core block fits a lane. * Keywords: band, lanes, columns, workflow, ai, culture, about, section * Viewport Width: 1280 * Inserter: true @@ -105,6 +105,10 @@

    + + + +
    From 2e5cffaa84b81d2206c7a5b625b133521619e98e Mon Sep 17 00:00:00 2001 From: Brandonma21 Date: Wed, 21 Oct 2026 12:11:07 +0200 Subject: [PATCH 3/3] fix: culture-page - Guard the hero breadcrumb on the block, not the function (LSA-108) Hero - Lede Actions Ticks - Check that the yoast-seo/breadcrumbs block is registered before outputting it - Replaces the function_exists( 'yoast_breadcrumb' ) check, which does not guarantee the block exists - Addresses the CodeRabbit review comment on PR #135 --- patterns/hero/hero-lede-actions-ticks.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/patterns/hero/hero-lede-actions-ticks.php b/patterns/hero/hero-lede-actions-ticks.php index d0e9418..404c811 100644 --- a/patterns/hero/hero-lede-actions-ticks.php +++ b/patterns/hero/hero-lede-actions-ticks.php @@ -36,7 +36,7 @@
    - + is_registered( 'yoast-seo/breadcrumbs' ) ) : ?>