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 d99a963..70a8e96 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 1084fd2..20472c0 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' ) ), @@ -392,6 +393,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 e4dd637..752935e 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-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/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-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 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-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..404c811 --- /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' ), + ), +); +?> + +
+ + +
+ + is_registered( 'yoast-seo/breadcrumbs' ) ) : ?> + + + + +
+ + + +

+ +
+ + + +

+ + + +
+ + +
+ +

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

+ + + +
+ + + +

+ +
+ + +
+ +
+ +
+ 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..48b00e5 --- /dev/null +++ b/patterns/sections/band-lanes.php @@ -0,0 +1,136 @@ + __( '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 b1969a0..1d1d329 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 452072e..b87bb90 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" },