2026-05-17 22:45:45 +12:00
<!DOCTYPE html>
< html lang = "en" >
< head >
< meta charset = "UTF-8" >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
< title > Lean 101 — Smarter Improvement Solutions</ title >
< link rel = "preconnect" href = "https://api.fontshare.com" >
< link href = "https://api.fontshare.com/v2/css?f[]=general-sans@400,500,600,700&display=swap" rel = "stylesheet" >
< style >
: root {
--blue : #0070c7 ;
--blue-deep : #005aa3 ;
--orange : #ec8b33 ;
--charcoal : #565656 ;
--grey : #efefef ;
--grey-soft : #f6f7f9 ;
--ink : #1a1a1a ;
--white : #ffffff ;
}
* { margin : 0 ; padding : 0 ; box-sizing : border-box ; }
html { scroll-behavior : smooth ; }
body {
font-family : 'General Sans' , - apple-system , BlinkMacSystemFont , sans-serif ;
color : var ( -- ink );
background : var ( -- white );
font-weight : 400 ;
line-height : 1.5 ;
-webkit- font-smoothing : antialiased ;
-moz- osx-font-smoothing : grayscale ;
}
img { max-width : 100 % ; display : block ; }
/* ───────── NAV ───────── */
. nav {
position : sticky ;
top : 0 ;
z-index : 100 ;
background : rgba ( 255 , 255 , 255 , 0.92 );
backdrop-filter : saturate ( 180 % ) blur ( 20 px );
-webkit- backdrop-filter : saturate ( 180 % ) blur ( 20 px );
border-bottom : 1 px solid rgba ( 0 , 0 , 0 , 0.08 );
}
. nav-inner {
max-width : 1100 px ;
margin : 0 auto ;
padding : 0 28 px ;
height : 68 px ;
display : flex ;
align-items : center ;
justify-content : space-between ;
}
. nav-logo {
display : flex ;
align-items : center ;
text-decoration : none ;
}
. nav-logo img {
height : 44 px ;
width : 44 px ;
object-fit : contain ;
}
. nav-links {
display : flex ;
gap : 30 px ;
list-style : none ;
margin : 0 ;
padding : 0 ;
}
. nav-links > li { position : relative ; }
. nav-links > li > a {
color : var ( -- ink );
text-decoration : none ;
font-size : 14 px ;
font-weight : 500 ;
opacity : 0.85 ;
transition : opacity 0.2 s ;
display : inline-flex ;
align-items : center ;
padding : 6 px 0 ;
}
. nav-links > li > a : hover { opacity : 1 ; }
/* Active-page indicator — small accent underline below current page link */
. nav-links > li > a . current {
opacity : 1 ;
position : relative ;
}
. nav-links > li > a . current :: after {
content : '' ;
position : absolute ;
left : 0 ;
right : 0 ;
bottom : -4 px ;
height : 2 px ;
border-radius : 2 px ;
background : var ( -- accent , var ( -- blue ));
}
/* Chevron button — separate from the link, click-only behaviour */
. nav-chevron {
background : transparent ;
border : 0 ;
padding : 6 px 4 px ;
margin : 0 0 0 2 px ;
cursor : pointer ;
color : var ( -- ink );
opacity : 0.6 ;
display : inline-flex ;
align-items : center ;
transition : opacity 0.2 s , transform 0.2 s ease ;
}
. nav-chevron : hover { opacity : 1 ; }
. nav-chevron svg { display : block ; width : 11 px ; height : 11 px ; }
. nav-chevron [ aria-expanded = "true" ] {
opacity : 1 ;
transform : rotate ( 180 deg );
}
/* ───── Mega-panel ───── */
. nav-panel-wrap {
position : absolute ;
top : 100 % ;
left : 50 % ;
transform : translateX ( -50 % );
padding-top : 14 px ;
opacity : 0 ;
visibility : hidden ;
transition : opacity 0.2 s ease , visibility 0.2 s ;
z-index : 200 ;
}
. nav-panel-wrap . is-open {
opacity : 1 ;
visibility : visible ;
}
. nav-panel {
background : var ( -- white );
border : 1 px solid rgba ( 0 , 0 , 0 , 0.06 );
border-radius : 14 px ;
padding : 28 px ;
box-shadow : 0 24 px 60 px -16 px rgba ( 0 , 0 , 0 , 0.20 ),
0 6 px 16 px -6 px rgba ( 0 , 0 , 0 , 0.08 );
list-style : none ;
margin : 0 ;
display : grid ;
gap : 28 px ;
width : max-content ;
max-width : min ( 960 px , calc ( 100 vw - 56 px ));
transform : translateY ( -6 px );
transition : transform 0.2 s ease ;
}
. nav-panel-wrap . is-open . nav-panel { transform : translateY ( 0 ); }
. nav-panel . is-services {
grid-template-columns : repeat ( 3 , minmax ( 180 px , 1 fr ));
min-width : 640 px ;
}
. nav-panel . is-resources {
grid-template-columns : repeat ( 4 , minmax ( 160 px , 1 fr ));
min-width : 760 px ;
}
. nav-panel-col { display : flex ; flex-direction : column ; gap : 6 px ; }
. nav-panel-col > a ,
. nav-panel-col-head {
text-decoration : none ;
color : var ( -- ink );
}
. nav-panel-col-head {
font-size : 14 px ;
font-weight : 600 ;
letter-spacing : -0.005 em ;
color : var ( -- ink );
transition : color 0.15 s ease ;
}
a . nav-panel-col-head : hover { color : var ( -- blue ); }
. nav-panel-col-desc {
font-size : 13 px ;
line-height : 1.5 ;
color : rgba ( 86 , 86 , 86 , 0.85 );
margin : 0 ;
}
. nav-panel-col-link {
margin-top : 4 px ;
font-size : 12.5 px ;
font-weight : 500 ;
color : var ( -- blue );
display : inline-flex ;
align-items : center ;
gap : 4 px ;
text-decoration : none ;
transition : gap 0.15 s ease ;
}
. nav-panel-col-link : hover { gap : 8 px ; }
. nav-panel-col-tag {
display : inline-block ;
margin-top : 4 px ;
font-size : 10.5 px ;
font-weight : 600 ;
letter-spacing : 0.08 em ;
text-transform : uppercase ;
color : rgba ( 86 , 86 , 86 , 0.65 );
}
. nav-cta {
background : var ( -- ink );
color : white ;
padding : 9 px 18 px ;
border-radius : 999 px ;
font-size : 13 px ;
font-weight : 500 ;
text-decoration : none ;
transition : background 0.2 s , transform 0.2 s ;
}
. nav-cta : hover {
background : var ( -- blue - deep );
transform : translateY ( -1 px );
}
/* ─── Hamburger button (mobile only) ─── */
. nav-hamburger {
display : none ;
background : transparent ;
border : 1 px solid rgba ( 0 , 0 , 0 , 0.12 );
border-radius : 10 px ;
padding : 8 px ;
cursor : pointer ;
color : var ( -- ink );
transition : background 0.2 s , border-color 0.2 s ;
margin-left : 12 px ;
}
. nav-hamburger : hover {
background : var ( -- grey - soft );
border-color : rgba ( 0 , 0 , 0 , 0.2 );
}
. nav-hamburger svg { display : block ; width : 22 px ; height : 22 px ; }
/* ─── Mobile menu (full-screen takeover) ─── */
. nav-drawer-overlay {
position : fixed ;
inset : 0 ;
background : transparent ;
opacity : 0 ;
pointer-events : none ;
z-index : 99 ;
}
. nav-drawer-overlay . is-open { pointer-events : auto ; }
. nav-drawer {
position : fixed ;
inset : 0 ;
width : 100 % ;
height : 100 vh ;
background : var ( -- white );
transform : translateY ( -100 % );
transition : transform 0.4 s cubic-bezier ( 0.2 , 0.8 , 0.2 , 1 );
z-index : 100 ;
display : flex ;
flex-direction : column ;
overflow-y : auto ;
}
. nav-drawer . is-open { transform : translateY ( 0 ); }
. nav-drawer-head {
display : flex ;
justify-content : space-between ;
align-items : center ;
padding : 20 px 28 px ;
border-bottom : 1 px solid rgba ( 0 , 0 , 0 , 0.06 );
}
. nav-drawer-head img { height : 30 px ; width : auto ; }
. nav-drawer-close {
background : transparent ;
border : 1 px solid rgba ( 0 , 0 , 0 , 0.1 );
border-radius : 10 px ;
padding : 10 px ;
cursor : pointer ;
color : var ( -- ink );
transition : background 0.2 s , border-color 0.2 s ;
}
. nav-drawer-close : hover {
background : var ( -- grey - soft );
border-color : rgba ( 0 , 0 , 0 , 0.2 );
}
. nav-drawer-close svg { display : block ; width : 20 px ; height : 20 px ; }
. nav-drawer-body {
padding : 36 px 28 px 28 px ;
flex : 1 ;
display : flex ;
flex-direction : column ;
}
. nav-drawer ul {
list-style : none ;
padding : 0 ;
margin : 0 ;
}
. nav-drawer-item {
display : block ;
padding : 18 px 0 ;
color : var ( -- ink );
text-decoration : none ;
font-size : 26 px ;
font-weight : 600 ;
letter-spacing : -0.02 em ;
border-bottom : 1 px solid rgba ( 0 , 0 , 0 , 0.06 );
transition : color 0.15 s , padding-left 0.2 s ease ;
}
. nav-drawer-item : hover { color : var ( -- blue ); padding-left : 6 px ; }
. nav-drawer-group-label {
display : block ;
padding : 28 px 0 12 px ;
color : var ( -- charcoal );
font-size : 11 px ;
font-weight : 600 ;
letter-spacing : 0.12 em ;
text-transform : uppercase ;
opacity : 0.7 ;
border-bottom : 1 px solid rgba ( 0 , 0 , 0 , 0.06 );
}
. nav-drawer-subitem {
display : block ;
padding : 16 px 0 16 px 14 px ;
color : var ( -- ink );
text-decoration : none ;
font-size : 18 px ;
font-weight : 500 ;
border-bottom : 1 px solid rgba ( 0 , 0 , 0 , 0.04 );
border-left : 3 px solid transparent ;
transition : color 0.15 s , border-left-color 0.2 s ease , padding-left 0.2 s ease ;
}
. nav-drawer-subitem : hover {
color : var ( -- blue );
border-left-color : var ( -- blue );
padding-left : 20 px ;
}
. nav-drawer-subitem . coaching : hover {
color : var ( -- orange );
border-left-color : var ( -- orange );
}
. nav-drawer-foot {
padding : 24 px 28 px 32 px ;
border-top : 1 px solid rgba ( 0 , 0 , 0 , 0.06 );
}
. nav-drawer-cta {
display : block ;
text-align : center ;
background : var ( -- blue );
color : var ( -- white );
padding : 16 px 22 px ;
border-radius : 999 px ;
font-size : 16 px ;
font-weight : 500 ;
text-decoration : none ;
transition : background 0.2 s ;
}
. nav-drawer-cta : hover { background : var ( -- blue - deep ); }
. nav-drawer-subitem . current {
color : var ( -- blue );
border-left-color : var ( -- blue );
padding-left : 20 px ;
}
. nav-drawer-subitem . coaching . current {
color : var ( -- orange );
border-left-color : var ( -- orange );
}
body . nav-drawer-locked { overflow : hidden ; }
@ media ( max-width : 720px ) {
. nav-links { display : none ; }
. nav-cta { display : none ; }
. nav-hamburger { display : inline-flex ; align-items : center ; justify-content : center ; }
}
/* ───────── HERO ───────── */
. hero {
padding : 80 px 28 px 100 px ;
text-align : center ;
background : linear-gradient ( 180 deg , #fafbfc 0 % , #ffffff 100 % );
}
. hero-eyebrow {
display : inline-block ;
color : var ( -- blue );
font-size : 14 px ;
font-weight : 600 ;
letter-spacing : 0.02 em ;
margin-bottom : 20 px ;
}
. hero h1 {
font-size : clamp ( 40 px , 7 vw , 84 px );
font-weight : 600 ;
letter-spacing : -0.035 em ;
line-height : 1.02 ;
margin-bottom : 22 px ;
max-width : 1000 px ;
margin-left : auto ;
margin-right : auto ;
}
. hero h1 em {
font-style : normal ;
background : linear-gradient ( 90 deg , var ( -- blue ) 0 % , var ( -- orange ) 100 % );
-webkit- background-clip : text ;
background-clip : text ;
-webkit- text-fill-color : transparent ;
color : transparent ;
}
. hero-sub {
font-size : clamp ( 17 px , 2 vw , 22 px );
color : var ( -- charcoal );
max-width : 700 px ;
margin : 0 auto 36 px ;
line-height : 1.45 ;
}
. hero-ctas {
display : flex ;
gap : 14 px ;
justify-content : center ;
flex-wrap : wrap ;
}
. btn {
display : inline-flex ;
align-items : center ;
gap : 6 px ;
padding : 14 px 26 px ;
border-radius : 999 px ;
font-size : 15 px ;
font-weight : 500 ;
text-decoration : none ;
transition : all 0.2 s ;
border : none ;
cursor : pointer ;
}
. btn-primary {
background : var ( -- blue );
color : white ;
}
. btn-primary : hover { background : var ( -- blue - deep ); }
. btn-secondary {
background : transparent ;
color : var ( -- ink );
border : 1 px solid rgba ( 0 , 0 , 0 , 0.15 );
}
. btn-secondary : hover { background : rgba ( 0 , 0 , 0 , 0.04 ); }
. btn-arrow { transition : transform 0.2 s ; }
. btn : hover . btn-arrow { transform : translateX ( 3 px ); }
/* hero visual — 3 metrics stacked on right */
. hero-visual {
max-width : 1100 px ;
margin : 64 px auto 0 ;
aspect-ratio : 16 / 9 ;
border-radius : 24 px ;
overflow : hidden ;
position : relative ;
box-shadow : 0 30 px 80 px -30 px rgba ( 0 , 112 , 199 , 0.25 );
background : var ( -- grey );
}
. hero-visual img {
width : 100 % ;
height : 100 % ;
object-fit : cover ;
}
/* Stats sit BELOW the hero photo in a 2x2 grid card panel */
. hero-stats {
max-width : 1100 px ;
margin : 22 px auto 0 ;
display : grid ;
grid-template-columns : 1 fr 1 fr ;
gap : 14 px ;
}
. hero-stat {
background : var ( -- white );
border : 1 px solid rgba ( 0 , 0 , 0 , 0.06 );
border-radius : 16 px ;
padding : 22 px 28 px ;
box-shadow : 0 6 px 22 px -10 px rgba ( 0 , 0 , 0 , 0.08 );
display : flex ;
flex-direction : column ;
align-items : center ;
text-align : center ;
gap : 6 px ;
transition : transform 0.3 s ease , box-shadow 0.3 s ease ;
}
. hero-stat : hover {
transform : translateY ( -3 px );
box-shadow : 0 14 px 36 px -14 px rgba ( 0 , 112 , 199 , 0.18 );
}
. hero-stat-num {
font-size : 32 px ;
font-weight : 600 ;
letter-spacing : -0.02 em ;
}
. hero-stat-num . up { color : var ( -- blue ); }
. hero-stat-num . warn { color : var ( -- orange ); }
. hero-stat-num . morale { color : var ( -- blue ); }
. hero-stat-label {
font-size : 12 px ;
color : var ( -- charcoal );
text-transform : uppercase ;
letter-spacing : 0.06 em ;
font-weight : 500 ;
}
@ media ( max-width : 720px ) {
/* Mobile hero photo — slightly portrait for proper height */
. hero-visual {
aspect-ratio : 4 / 5 ;
margin-top : 40 px ;
border-radius : 18 px ;
}
. hero-stats {
grid-template-columns : 1 fr 1 fr ;
gap : 10 px ;
margin-top : 16 px ;
}
. hero-stat {
padding : 16 px 18 px ;
}
. hero-stat-num { font-size : 24 px ; }
. hero-stat-label { font-size : 10 px ; }
}
@ media ( max-width : 460px ) {
. hero-visual {
aspect-ratio : 3 / 4 ;
}
. hero-stat { padding : 14 px 12 px ; }
. hero-stat-num { font-size : 22 px ; }
}
/* ───────── SECTION SHELL ───────── */
. section { padding : 140 px 28 px ; }
. section-inner {
max-width : 1200 px ;
margin : 0 auto ;
}
. section-eyebrow {
color : var ( -- blue );
font-size : 14 px ;
font-weight : 600 ;
letter-spacing : 0.04 em ;
text-transform : uppercase ;
margin-bottom : 16 px ;
}
. section-title {
font-size : clamp ( 34 px , 5 vw , 56 px );
font-weight : 600 ;
letter-spacing : -0.025 em ;
line-height : 1.05 ;
margin-bottom : 20 px ;
max-width : 820 px ;
}
. section-lede {
font-size : clamp ( 17 px , 1.6 vw , 20 px );
color : var ( -- charcoal );
max-width : 680 px ;
line-height : 1.5 ;
}
/* ───────── SERVICES ───────── */
. services-head {
text-align : center ;
margin-bottom : 64 px ;
}
. services-head . section-title { margin-left : auto ; margin-right : auto ; }
. services-head . section-lede { margin-left : auto ; margin-right : auto ; }
. services-grid {
display : grid ;
grid-template-columns : repeat ( 3 , 1 fr );
gap : 20 px ;
}
@ media ( max-width : 980px ) {
. services-grid { grid-template-columns : 1 fr ; }
}
. service-card {
border-radius : 24 px ;
overflow : hidden ;
position : relative ;
transition : transform 0.4 s cubic-bezier ( 0.2 , 0.8 , 0.2 , 1 );
background : var ( -- grey );
display : flex ;
flex-direction : column ;
}
. service-card : hover { transform : translateY ( -6 px ); }
. service-card : hover . service-img img { transform : scale ( 1.05 ); }
. service-img {
aspect-ratio : 16 / 10 ;
overflow : hidden ;
background : var ( -- charcoal );
position : relative ;
}
. service-img img {
width : 100 % ;
height : 100 % ;
object-fit : cover ;
transition : transform 0.6 s cubic-bezier ( 0.2 , 0.8 , 0.2 , 1 );
}
. service-img :: after {
content : '' ;
position : absolute ;
inset : 0 ;
background : linear-gradient ( 180 deg , rgba ( 0 , 0 , 0 , 0 ) 50 % , rgba ( 0 , 0 , 0 , 0.25 ) 100 % );
pointer-events : none ;
}
. service-tag {
position : absolute ;
top : 18 px ;
left : 18 px ;
background : rgba ( 255 , 255 , 255 , 0.92 );
backdrop-filter : blur ( 6 px );
color : var ( -- blue );
padding : 6 px 12 px ;
border-radius : 999 px ;
font-size : 11 px ;
font-weight : 600 ;
letter-spacing : 0.06 em ;
text-transform : uppercase ;
z-index : 2 ;
}
. service-tag . orange { color : var ( -- orange ); }
. service-tag . charcoal { color : var ( -- charcoal ); }
. service-body {
padding : 32 px ;
flex : 1 ;
display : flex ;
flex-direction : column ;
gap : 12 px ;
}
. service-title {
font-size : 26 px ;
font-weight : 600 ;
letter-spacing : -0.02 em ;
line-height : 1.15 ;
margin-bottom : 4 px ;
}
. service-desc {
font-size : 15 px ;
line-height : 1.55 ;
color : var ( -- charcoal );
}
. service-link {
color : var ( -- blue );
text-decoration : none ;
font-size : 14 px ;
font-weight : 600 ;
margin-top : 18 px ;
display : inline-flex ;
align-items : center ;
gap : 6 px ;
transition : gap 0.2 s ease , color 0.2 s ease ;
align-self : flex-start ;
}
. service-link . orange { color : var ( -- orange ); }
. service-link svg {
width : 16 px ;
height : 16 px ;
transition : transform 0.2 s ease ;
}
. service-card : hover . service-link {
gap : 10 px ;
}
. service-card : hover . service-link svg {
transform : translateX ( 2 px );
}
/* ───────── PROCESS / HOW IT WORKS — horizontal flow with arrows ───────── */
. process { background : var ( -- grey - soft ); }
. process . section-title { color : var ( -- ink ); }
. flow {
margin-top : 70 px ;
display : grid ;
grid-template-columns : 1 fr auto 1 fr auto 1 fr auto 1 fr ;
align-items : stretch ;
gap : 0 ;
max-width : 1300 px ;
margin-left : auto ;
margin-right : auto ;
}
. flow-step {
background : var ( -- white );
border : 1 px solid rgba ( 0 , 0 , 0 , 0.07 );
border-radius : 18 px ;
padding : 32 px 28 px ;
display : flex ;
flex-direction : column ;
box-shadow : 0 4 px 16 px -8 px rgba ( 0 , 0 , 0 , 0.06 );
transition : transform 0.3 s ease , box-shadow 0.3 s ease , border-color 0.3 s ease ;
position : relative ;
border-top : 3 px solid var ( -- accent , var ( -- blue ));
}
/* Per-step accent: alternating blue/orange.
Note: cards sit at positions 1,3,5,7 in the .flow container — arrows are at 2,4,6.
Using nth-child to target the actual position so the alternation works. */
. flow-step : nth-child ( 1 ) { --accent : var ( -- blue ); --accent-shadow : rgba ( 0 , 112 , 199 , 0.22 ); }
. flow-step : nth-child ( 3 ) { --accent : var ( -- orange ); --accent-shadow : rgba ( 236 , 139 , 51 , 0.22 ); }
. flow-step : nth-child ( 5 ) { --accent : var ( -- blue ); --accent-shadow : rgba ( 0 , 112 , 199 , 0.22 ); }
. flow-step : nth-child ( 7 ) { --accent : var ( -- orange ); --accent-shadow : rgba ( 236 , 139 , 51 , 0.22 ); }
. flow-step : hover {
transform : translateY ( -6 px );
box-shadow : 0 22 px 50 px -22 px var ( -- accent - shadow );
border-color : var ( -- accent );
border-top-color : var ( -- accent );
}
. flow-step-label {
font-size : 12 px ;
font-weight : 600 ;
letter-spacing : 0.14 em ;
color : var ( -- accent );
margin-bottom : 8 px ;
text-transform : uppercase ;
}
. flow-step-title {
font-size : 24 px ;
font-weight : 600 ;
margin-bottom : 14 px ;
letter-spacing : -0.02 em ;
color : var ( -- ink );
line-height : 1.15 ;
}
. flow-step-desc {
color : var ( -- charcoal );
font-size : 14.5 px ;
line-height : 1.6 ;
margin-bottom : 16 px ;
flex : 1 ;
}
. flow-step-outcome {
color : var ( -- accent );
font-size : 13.5 px ;
line-height : 1.5 ;
font-style : italic ;
padding-top : 14 px ;
border-top : 1 px solid rgba ( 0 , 0 , 0 , 0.07 );
font-weight : 500 ;
}
/* Arrow connectors between cards */
. flow-arrow {
display : flex ;
align-items : center ;
justify-content : center ;
width : 44 px ;
color : rgba ( 0 , 0 , 0 , 0.18 );
transition : color 0.3 s ease , transform 0.3 s ease ;
}
. flow-arrow svg {
width : 28 px ;
height : 28 px ;
}
/* Subtle colour transition: blue → blue/orange mix → orange */
. flow-arrow : nth-child ( 2 ) { color : var ( -- blue ); opacity : 0.5 ; }
. flow-arrow : nth-child ( 4 ) { color : #b08a6b ; opacity : 0.6 ; }
. flow-arrow : nth-child ( 6 ) { color : var ( -- orange ); opacity : 0.6 ; }
/* Tablet: 2x2 grid, arrows redirect appropriately */
@ media ( max-width : 1100px ) {
. flow {
grid-template-columns : 1 fr 1 fr ;
grid-template-rows : auto auto auto ;
gap : 20 px ;
}
. flow-step : nth-child ( 1 ) { grid-column : 1 ; grid-row : 1 ; }
. flow-step : nth-child ( 3 ) { grid-column : 2 ; grid-row : 1 ; }
. flow-step : nth-child ( 5 ) { grid-column : 1 ; grid-row : 3 ; }
. flow-step : nth-child ( 7 ) { grid-column : 2 ; grid-row : 3 ; }
/* Hide horizontal arrows in tablet, simplify */
. flow-arrow { display : none ; }
}
/* Mobile: single column stacked, arrows below each card */
@ media ( max-width : 600px ) {
. flow {
grid-template-columns : 1 fr ;
grid-template-rows : auto ;
gap : 12 px ;
}
. flow-step : nth-child ( 1 ),
. flow-step : nth-child ( 3 ),
. flow-step : nth-child ( 5 ),
. flow-step : nth-child ( 7 ) {
grid-column : 1 ;
grid-row : auto ;
}
. flow-arrow {
display : flex ;
width : 100 % ;
transform : rotate ( 90 deg );
margin : -4 px 0 ;
}
. flow-arrow svg { width : 24 px ; height : 24 px ; }
}
/* ───────── PARTNERSHIP RAIL beneath the 4-step flow ───────── */
/* The four steps are cycles within an ongoing partnership. The rail spans
the full row beneath the cards as a continuous gradient line — no panel
box. The line itself carries the meaning. A faint top-border above
the rail visually delineates it from the cards above. */
. flow-wrap {
position : relative ;
}
. partnership-rail {
margin-top : 60 px ;
padding-top : 36 px ;
/* Soft top border above the rail — separates rail from cards */
border-top : 1 px dashed rgba ( 0 , 0 , 0 , 0.1 );
position : relative ;
}
/* The continuous "rail" line — full-width gradient, blue → orange */
. partnership-rail-line {
position : relative ;
height : 4 px ;
background : linear-gradient ( 90 deg , var ( -- blue ) 0 % , var ( -- orange ) 100 % );
border-radius : 4 px ;
margin : 0 14 px ;
}
/* Markers at each end of the line — circular, white-bordered */
. partnership-rail-marker {
position : absolute ;
top : -7 px ;
width : 18 px ;
height : 18 px ;
border-radius : 50 % ;
background : var ( -- white );
box-shadow : 0 4 px 12 px -2 px rgba ( 0 , 0 , 0 , 0.15 );
}
. partnership-rail-marker-start {
left : -9 px ;
border : 3 px solid var ( -- blue );
}
. partnership-rail-marker-end {
right : -9 px ;
border : 3 px solid var ( -- orange );
}
. partnership-rail-content {
display : grid ;
grid-template-columns : auto 1 fr ;
gap : 24 px ;
align-items : center ;
margin-top : 24 px ;
padding : 0 14 px ;
}
@ media ( max-width : 720px ) {
. partnership-rail-content {
grid-template-columns : 1 fr ;
gap : 14 px ;
}
}
. partnership-rail-label {
display : inline-block ;
background : linear-gradient ( 135 deg , var ( -- blue ), var ( -- orange ));
color : var ( -- white );
padding : 8 px 18 px ;
border-radius : 999 px ;
font-size : 12 px ;
font-weight : 600 ;
letter-spacing : 0.08 em ;
text-transform : uppercase ;
white-space : nowrap ;
align-self : center ;
box-shadow : 0 6 px 16 px -4 px rgba ( 0 , 112 , 199 , 0.25 );
}
. partnership-rail-content p {
font-size : 15 px ;
line-height : 1.6 ;
color : var ( -- charcoal );
margin : 0 ;
}
. partnership-rail-content p em {
font-style : italic ;
color : var ( -- ink );
font-weight : 500 ;
padding-right : 0.06 em ;
}
/* ───────── OUTCOMES — APPLE-STYLE HORIZONTAL CAROUSEL ───────── */
/* Replaces the old 5-column grid with a horizontally-scrollable rail.
Cards snap into place; navigation via touch-swipe or prev/next buttons.
Mirrors the Apple iPhone "Why Apple" carousel pattern. */
. outcomes-head {
display : grid ;
grid-template-columns : 1 fr auto ;
align-items : end ;
margin-bottom : 40 px ;
gap : 24 px ;
text-align : left ;
}
. outcomes-head . section-title {
margin-left : 0 ;
margin-right : 0 ;
max-width : 720 px ;
}
. outcomes-head . section-lede {
margin-left : 0 ;
margin-right : 0 ;
margin-top : 12 px ;
max-width : 600 px ;
}
. outcomes-head-text { /* left column wrapper */ }
/* Right column: small contextual link, like "Shop iPhone >" on Apple */
. outcomes-head-link {
color : var ( -- blue );
font-size : 15 px ;
font-weight : 500 ;
text-decoration : none ;
display : inline-flex ;
align-items : center ;
gap : 4 px ;
white-space : nowrap ;
padding-bottom : 4 px ;
transition : gap 0.25 s ease ;
}
. outcomes-head-link : hover {
gap : 8 px ;
}
. outcomes-head-link svg {
width : 16 px ;
height : 16 px ;
}
/* The carousel rail — horizontally scrollable, snaps cards into place */
. levers-carousel-wrap {
position : relative ;
/* Pull the rail to the section's full inner width so cards can peek
at the right edge without padding cutting them off. */
margin : 0 -28 px ;
padding : 0 28 px ;
}
. levers-rail {
display : grid ;
grid-auto-flow : column ;
grid-auto-columns : calc (( 100 % - 36 px ) / 3 ); /* 3 visible + small peek */
gap : 18 px ;
overflow-x : auto ;
scroll-snap-type : x mandatory ;
scroll-padding-left : 0 ;
/* Hide scrollbar but keep scrolling functional */
scrollbar-width : none ;
-ms- overflow-style : none ;
padding-bottom : 12 px ; /* space for hover lift shadows */
}
. levers-rail :: -webkit-scrollbar { display : none ; }
@ media ( max-width : 1100px ) {
. levers-rail { grid-auto-columns : calc (( 100 % - 18 px ) / 2 - 9 px ); } /* 2 visible */
}
@ media ( max-width : 720px ) {
. levers-rail { grid-auto-columns : 78 % ; } /* 1 + clear peek */
. outcomes-head { grid-template-columns : 1 fr ; gap : 12 px ; }
}
@ media ( max-width : 460px ) {
. levers-rail { grid-auto-columns : 84 % ; }
}
. lever {
background : var ( -- white );
border : 1 px solid rgba ( 0 , 0 , 0 , 0.06 );
border-radius : 22 px ;
padding : 32 px 30 px 28 px ;
position : relative ;
overflow : hidden ;
transition : transform 0.4 s cubic-bezier ( 0.2 , 0.8 , 0.2 , 1 ), box-shadow 0.3 s ease , border-color 0.3 s ease ;
display : flex ;
flex-direction : column ;
scroll-snap-align : start ;
box-shadow : 0 6 px 24 px -10 px rgba ( 0 , 0 , 0 , 0.12 );
min-height : 420 px ;
}
. lever : hover {
transform : translateY ( -4 px );
box-shadow : 0 22 px 50 px -22 px rgba ( 0 , 0 , 0 , 0.22 );
border-color : rgba ( 0 , 0 , 0 , 0.1 );
}
. lever : nth-child ( 1 ) { --accent : var ( -- blue ); }
. lever : nth-child ( 2 ) { --accent : var ( -- orange ); }
. lever : nth-child ( 3 ) { --accent : var ( -- blue ); }
. lever : nth-child ( 4 ) { --accent : var ( -- orange ); }
. lever : nth-child ( 5 ) { --accent : var ( -- blue ); }
. lever-eyebrow {
font-size : 13 px ;
font-weight : 500 ;
color : var ( -- charcoal );
margin-bottom : 14 px ;
letter-spacing : -0.005 em ;
}
. lever-title {
font-size : 26 px ;
font-weight : 600 ;
letter-spacing : -0.02 em ;
color : var ( -- ink );
margin-bottom : 14 px ;
line-height : 1.18 ;
}
. lever-desc {
color : var ( -- charcoal );
font-size : 14.5 px ;
line-height : 1.55 ;
margin-bottom : 20 px ;
}
/* Visual area at the bottom of the card — illustration + chevron */
. lever-visual {
margin-top : auto ;
height : 140 px ;
display : flex ;
align-items : center ;
justify-content : center ;
color : var ( -- accent );
position : relative ;
}
. lever-visual svg {
max-width : 100 % ;
max-height : 100 % ;
}
/* Prev/Next navigation — bottom-right of the section, matches Apple */
. levers-nav {
display : flex ;
justify-content : flex-end ;
gap : 10 px ;
margin-top : 24 px ;
}
. levers-nav-btn {
width : 44 px ;
height : 44 px ;
border-radius : 50 % ;
border : none ;
background : rgba ( 0 , 0 , 0 , 0.06 );
color : var ( -- ink );
cursor : pointer ;
display : flex ;
align-items : center ;
justify-content : center ;
transition : background 0.2 s ease , color 0.2 s ease ;
}
. levers-nav-btn : hover : not ( : disabled ) {
background : rgba ( 0 , 0 , 0 , 0.12 );
}
. levers-nav-btn : disabled {
opacity : 0.35 ;
cursor : not-allowed ;
}
. levers-nav-btn svg { width : 16 px ; height : 16 px ; }
/* Pagination dots — small visual indicator of current scroll position */
. levers-dots {
display : flex ;
justify-content : center ;
gap : 8 px ;
margin-top : 18 px ;
}
. levers-dot {
width : 6 px ;
height : 6 px ;
border-radius : 50 % ;
background : rgba ( 0 , 0 , 0 , 0.18 );
transition : background 0.2 s ease , width 0.2 s ease ;
}
. levers-dot . is-active {
background : var ( -- ink );
width : 18 px ;
border-radius : 999 px ;
}
@ media ( max-width : 720px ) {
. levers-dots { display : flex ; }
}
@ media ( min-width : 721px ) {
. levers-dots { display : none ; } /* prev/next buttons handle this on desktop */
}
/* ───────── WHY US ───────── */
. whyus { background : var ( -- grey ); }
. whyus-layout {
display : grid ;
grid-template-columns : 5 fr 7 fr ;
gap : 60 px ;
align-items : start ;
}
@ media ( max-width : 880px ) {
. whyus-layout { grid-template-columns : 1 fr ; gap : 32 px ; }
}
. whyus-list {
list-style : none ;
display : flex ;
flex-direction : column ;
gap : 16 px ;
}
. whyus-item {
background : white ;
border-radius : 16 px ;
padding : 24 px 28 px ;
display : flex ;
gap : 18 px ;
align-items : flex-start ;
}
. whyus-icon {
flex-shrink : 0 ;
width : 44 px ;
height : 44 px ;
border-radius : 12 px ;
background : rgba ( 0 , 112 , 199 , 0.1 );
color : var ( -- blue );
display : flex ;
align-items : center ;
justify-content : center ;
}
. whyus-icon svg { width : 22 px ; height : 22 px ; }
. whyus-icon . orange {
background : rgba ( 236 , 139 , 51 , 0.12 );
color : var ( -- orange );
}
. whyus-text h4 {
font-size : 17 px ;
font-weight : 600 ;
margin-bottom : 4 px ;
letter-spacing : -0.01 em ;
}
. whyus-text p {
font-size : 15 px ;
color : var ( -- charcoal );
line-height : 1.5 ;
}
/* ───────── CTA ───────── */
. cta-wrap {
padding : 80 px 28 px 110 px ;
background : var ( -- white );
}
. cta-card {
max-width : 1200 px ;
margin : 0 auto ;
background : linear-gradient ( 135 deg , #1a2230 0 % , #1a1a1a 60 % , #2a1f1a 100 % );
border-radius : 28 px ;
padding : 90 px 60 px ;
text-align : center ;
position : relative ;
overflow : hidden ;
color : white ;
}
. cta-card :: before {
content : '' ;
position : absolute ;
top : -30 % ;
left : -10 % ;
width : 60 % ;
height : 160 % ;
background : radial-gradient ( ellipse , rgba ( 0 , 112 , 199 , 0.22 ), transparent 65 % );
pointer-events : none ;
}
. cta-card :: after {
content : '' ;
position : absolute ;
bottom : -30 % ;
right : -10 % ;
width : 60 % ;
height : 160 % ;
background : radial-gradient ( ellipse , rgba ( 236 , 139 , 51 , 0.18 ), transparent 65 % );
pointer-events : none ;
}
. cta-inner {
position : relative ;
z-index : 2 ;
max-width : 760 px ;
margin : 0 auto ;
}
. cta-card h2 {
font-size : clamp ( 36 px , 5 vw , 60 px );
font-weight : 600 ;
letter-spacing : -0.03 em ;
line-height : 1.05 ;
margin-bottom : 18 px ;
}
. cta-card h2 em {
font-style : italic ;
font-weight : 500 ;
color : var ( -- orange );
margin-right : 0.12 em ;
}
. cta-card p {
font-size : 17 px ;
color : rgba ( 255 , 255 , 255 , 0.78 );
margin-bottom : 36 px ;
line-height : 1.55 ;
}
. cta-flow {
display : flex ;
gap : 20 px ;
justify-content : center ;
margin-bottom : 40 px ;
flex-wrap : wrap ;
}
. cta-flow-step {
display : flex ;
align-items : center ;
gap : 10 px ;
color : rgba ( 255 , 255 , 255 , 0.85 );
font-size : 14 px ;
font-weight : 500 ;
}
. cta-flow-step . num {
width : 26 px ;
height : 26 px ;
border-radius : 50 % ;
background : rgba ( 255 , 255 , 255 , 0.1 );
border : 1 px solid rgba ( 255 , 255 , 255 , 0.2 );
display : inline-flex ;
align-items : center ;
justify-content : center ;
font-size : 12 px ;
font-weight : 600 ;
color : var ( -- orange );
}
. cta-flow-arrow {
color : rgba ( 255 , 255 , 255 , 0.3 );
font-size : 14 px ;
}
@ media ( max-width : 720px ) {
. cta-card { padding : 60 px 28 px ; }
. cta-flow-arrow { display : none ; }
. cta-flow { flex-direction : column ; align-items : center ; gap : 12 px ; }
}
. btn-on-dark {
background : var ( -- blue );
color : white ;
box-shadow : 0 12 px 32 px -8 px rgba ( 0 , 112 , 199 , 0.5 );
}
. btn-on-dark : hover { background : var ( -- blue - deep ); }
. btn-ghost-dark {
background : transparent ;
color : white ;
border : 1 px solid rgba ( 255 , 255 , 255 , 0.25 );
}
. btn-ghost-dark : hover { background : rgba ( 255 , 255 , 255 , 0.06 ); border-color : rgba ( 255 , 255 , 255 , 0.4 ); }
/* ───────── FOOTER ───────── */
. footer {
background : var ( -- ink );
color : white ;
padding : 60 px 28 px 28 px ;
}
. footer-inner {
max-width : 1200 px ;
margin : 0 auto ;
}
. footer-grid {
display : grid ;
grid-template-columns : 1.6 fr 1 fr 1 fr 1 fr 1 fr ;
gap : 40 px ;
margin-bottom : 48 px ;
}
@ media ( max-width : 720px ) {
. footer-grid { grid-template-columns : 1 fr 1 fr ; }
}
. footer-brand img {
max-height : 56 px ;
width : auto ;
margin-bottom : 18 px ;
}
. footer-brand p {
font-size : 14 px ;
color : rgba ( 255 , 255 , 255 , 0.6 );
line-height : 1.55 ;
max-width : 280 px ;
}
. footer-col h5 {
font-size : 13 px ;
font-weight : 600 ;
text-transform : uppercase ;
letter-spacing : 0.05 em ;
margin-bottom : 16 px ;
color : rgba ( 255 , 255 , 255 , 0.5 );
}
. footer-col ul {
list-style : none ;
display : flex ;
flex-direction : column ;
gap : 10 px ;
}
. footer-col a {
color : rgba ( 255 , 255 , 255 , 0.85 );
text-decoration : none ;
font-size : 14 px ;
transition : color 0.2 s ;
}
. footer-col a : hover { color : var ( -- orange ); }
. footer-bottom {
border-top : 1 px solid rgba ( 255 , 255 , 255 , 0.1 );
padding-top : 24 px ;
display : flex ;
justify-content : space-between ;
align-items : center ;
font-size : 13 px ;
color : rgba ( 255 , 255 , 255 , 0.5 );
flex-wrap : wrap ;
gap : 12 px ;
}
/* fade-in on scroll */
@ media ( prefers-reduced-motion : no-preference ) {
. reveal {
opacity : 0 ;
transform : translateY ( 20 px );
transition : opacity 0.8 s ease , transform 0.8 s ease ;
}
. reveal . in {
opacity : 1 ;
transform : translateY ( 0 );
}
}
/* Mobile: dial back the bumped section padding so phones don't waste space */
@ media ( max-width : 720px ) {
. section { padding : 80 px 22 px ; }
}
</ style >
2026-05-20 23:09:07 +12:00
<!-- Google tag (gtag.js) -->
< script async src = "https://www.googletagmanager.com/gtag/js?id=G-Z5JJBS491H" ></ script >
< script >
window . dataLayer = window . dataLayer || [];
function gtag (){ dataLayer . push ( arguments );}
gtag ( 'js' , new Date ());
gtag ( 'config' , 'G-Z5JJBS491H' );
</ script >
2026-05-17 22:45:45 +12:00
</ head >
< body >
<!-- ───── NAV ───── -->
< nav class = "nav" aria-label = "Primary" >
< div class = "nav-inner" >
< a href = "#" class = "nav-logo" aria-label = "Lean 101 home" >
< img src = "assets/lean101-isotipo.png" alt = "Lean 101" >
</ a >
< ul class = "nav-links" >
< li >< a href = "#" class = "current" > Home</ a ></ li >
< li class = "has-panel" >
< a href = "#services" > Services</ a >
< button class = "nav-chevron" type = "button" aria-haspopup = "true" aria-expanded = "false" aria-controls = "nav-panel-services" aria-label = "Open Services menu" data-panel-trigger = "services" >
< svg viewBox = "0 0 12 12" fill = "none" stroke = "currentColor" stroke-width = "1.6" stroke-linecap = "round" stroke-linejoin = "round" aria-hidden = "true" >< polyline points = "3 4.5 6 8 9 4.5" /></ svg >
</ button >
< div class = "nav-panel-wrap" id = "nav-panel-services" data-panel = "services" role = "region" aria-label = "Services menu" >
< div class = "nav-panel is-services" >
< div class = "nav-panel-col" >
< a href = "services/consulting.html" class = "nav-panel-col-head" > Process Excellence</ a >
< p class = "nav-panel-col-desc" > Diagnosing where work breaks down, designing the fix, and embedding the change with you.</ p >
< a href = "services/consulting.html" class = "nav-panel-col-link" > Learn more < span aria-hidden = "true" > →</ span ></ a >
</ div >
< div class = "nav-panel-col" >
< a href = "services/coaching.html" class = "nav-panel-col-head" > Coaching & Training</ a >
< p class = "nav-panel-col-desc" > Building the capability for your team to lead improvement themselves.</ p >
< a href = "services/coaching.html" class = "nav-panel-col-link" > Learn more < span aria-hidden = "true" > →</ span ></ a >
</ div >
< div class = "nav-panel-col" >
< a href = "services/digital-solutions.html" class = "nav-panel-col-head" > Digital Solutions</ a >
< p class = "nav-panel-col-desc" > Custom dashboards, web apps and automation, built for your specific work.</ p >
< a href = "services/digital-solutions.html" class = "nav-panel-col-link" > Learn more < span aria-hidden = "true" > →</ span ></ a >
</ div >
</ div >
</ div >
</ li >
< li class = "has-panel" >
< a href = "resources/index.html" > Resources</ a >
< button class = "nav-chevron" type = "button" aria-haspopup = "true" aria-expanded = "false" aria-controls = "nav-panel-resources" aria-label = "Open Resources menu" data-panel-trigger = "resources" >
< svg viewBox = "0 0 12 12" fill = "none" stroke = "currentColor" stroke-width = "1.6" stroke-linecap = "round" stroke-linejoin = "round" aria-hidden = "true" >< polyline points = "3 4.5 6 8 9 4.5" /></ svg >
</ button >
< div class = "nav-panel-wrap" id = "nav-panel-resources" data-panel = "resources" role = "region" aria-label = "Resources menu" >
< div class = "nav-panel is-resources" >
< div class = "nav-panel-col" >
< a href = "resources/index.html#principles" class = "nav-panel-col-head" > Principles</ a >
< p class = "nav-panel-col-desc" > The why of Lean — the philosophy underneath the methods.</ p >
< span class = "nav-panel-col-tag" > Coming soon</ span >
</ div >
< div class = "nav-panel-col" >
< a href = "resources/index.html#techniques" class = "nav-panel-col-head" > Techniques</ a >
< p class = "nav-panel-col-desc" > The how of Lean — specific methods explained in plain terms.</ p >
< span class = "nav-panel-col-tag" > Coming soon</ span >
</ div >
< div class = "nav-panel-col" >
< a href = "resources/index.html#reading" class = "nav-panel-col-head" > Reading</ a >
< p class = "nav-panel-col-desc" > Summaries of the books and articles that shaped how we think.</ p >
< span class = "nav-panel-col-tag" > Coming soon</ span >
</ div >
< div class = "nav-panel-col" >
< a href = "resources/index.html#templates" class = "nav-panel-col-head" > Templates</ a >
< p class = "nav-panel-col-desc" > Worksheets, checklists and audits you can download and use.</ p >
< span class = "nav-panel-col-tag" > Coming soon</ span >
</ div >
</ div >
</ div >
</ li >
< li >< a href = "#contact" > Contact</ a ></ li >
</ ul >
< a href = "#contact" class = "nav-cta" > Let’ s Talk</ a >
<!-- Hamburger menu button — mobile only -->
< button class = "nav-hamburger" type = "button" aria-label = "Open menu" aria-expanded = "false" aria-controls = "nav-drawer" >
< svg viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "2" stroke-linecap = "round" stroke-linejoin = "round" >
< line x1 = "3" y1 = "6" x2 = "21" y2 = "6" />
< line x1 = "3" y1 = "12" x2 = "21" y2 = "12" />
< line x1 = "3" y1 = "18" x2 = "21" y2 = "18" />
</ svg >
</ button >
</ div >
</ nav >
<!-- Mobile drawer + overlay -->
< div class = "nav-drawer-overlay" data-drawer-overlay aria-hidden = "true" ></ div >
< aside class = "nav-drawer" id = "nav-drawer" aria-label = "Mobile navigation" aria-hidden = "true" >
< div class = "nav-drawer-head" >
< img src = "assets/lean101-logotipo.png" alt = "Lean 101" >
< button class = "nav-drawer-close" type = "button" aria-label = "Close menu" >
< svg viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "2" stroke-linecap = "round" stroke-linejoin = "round" >
< line x1 = "18" y1 = "6" x2 = "6" y2 = "18" />
< line x1 = "6" y1 = "6" x2 = "18" y2 = "18" />
</ svg >
</ button >
</ div >
< nav class = "nav-drawer-body" >
< ul >
< li >< a class = "nav-drawer-item" href = "#" > Home</ a ></ li >
< li >< span class = "nav-drawer-group-label" > Services</ span ></ li >
< li >< a class = "nav-drawer-subitem" href = "services/consulting.html" > Process Excellence</ a ></ li >
< li >< a class = "nav-drawer-subitem coaching" href = "services/coaching.html" > Coaching & Training</ a ></ li >
< li >< a class = "nav-drawer-subitem" href = "services/digital-solutions.html" > Digital Solutions</ a ></ li >
< li >< span class = "nav-drawer-group-label" > Resources</ span ></ li >
< li >< a class = "nav-drawer-subitem" href = "resources/index.html#principles" > Principles</ a ></ li >
< li >< a class = "nav-drawer-subitem" href = "resources/index.html#techniques" > Techniques</ a ></ li >
< li >< a class = "nav-drawer-subitem" href = "resources/index.html#reading" > Reading</ a ></ li >
< li >< a class = "nav-drawer-subitem" href = "resources/index.html#templates" > Templates</ a ></ li >
< li >< a class = "nav-drawer-item" href = "#contact" > Contact</ a ></ li >
</ ul >
</ nav >
< div class = "nav-drawer-foot" >
< a href = "#contact" class = "nav-drawer-cta" > Let’ s Talk</ a >
</ div >
</ aside >
<!-- ───── HERO ───── -->
< header class = "hero" >
< span class = "hero-eyebrow" > Smarter Improvement Solutions</ span >
< h1 >
Continuous improvement,< br >
< em > made simple.</ em >
</ h1 >
< p class = "hero-sub" >
Practical consulting, coaching and analytics to help businesses eliminate waste,
improve performance, and build a culture that keeps improving — long after we've gone.
</ p >
< div class = "hero-ctas" >
< a href = "#contact" class = "btn btn-primary" >
Let’ s Talk < span class = "btn-arrow" > →</ span >
</ a >
< a href = "#process" class = "btn btn-secondary" > See how it works</ a >
</ div >
<!-- Hero photo, then stats panel below it (matches live website layout) -->
< div class = "hero-visual" >
< img src = "https://images.unsplash.com/photo-1542744173-8e7e53415bb0?auto=format&fit=crop&w=1600&q=80" alt = "Team collaborating on a process improvement workshop" >
</ div >
< div class = "hero-stats" >
< div class = "hero-stat" >
< div class = "hero-stat-label" > Efficiency</ div >
< div class = "hero-stat-num up" data-target = "35" data-prefix = "+" data-suffix = "%" > +35%</ div >
</ div >
< div class = "hero-stat" >
< div class = "hero-stat-label" > Cost savings</ div >
< div class = "hero-stat-num warn" data-target = "27" data-prefix = "− " data-suffix = "%" > − 27%</ div >
</ div >
< div class = "hero-stat" >
< div class = "hero-stat-label" > Lead time</ div >
< div class = "hero-stat-num warn" data-target = "44" data-prefix = "− " data-suffix = "%" > − 44%</ div >
</ div >
< div class = "hero-stat" >
< div class = "hero-stat-label" > Engagement</ div >
< div class = "hero-stat-num morale" data-target = "41" data-prefix = "+" data-suffix = "%" > +41%</ div >
</ div >
</ div >
</ header >
<!-- ───── SERVICES ───── -->
< section class = "section" id = "services" >
< div class = "section-inner" >
< div class = "services-head" >
< div class = "section-eyebrow" > What we do</ div >
< h2 class = "section-title" > Three services. One outcome: improvement that lasts.</ h2 >
< p class = "section-lede" >
Frameworks aren't the goal — results are. Every engagement combines
consulting, capability building, and digital solutions — sized to what your team can sustain.
</ p >
</ div >
< div class = "services-grid" >
< article class = "service-card" >
< div class = "service-img" >
< span class = "service-tag" > Consulting</ span >
< img src = "https://images.unsplash.com/photo-1517245386807-bb43f82c33c4?auto=format&fit=crop&w=900&q=80" alt = "Consultant mapping out a process on a whiteboard" >
</ div >
< div class = "service-body" >
< h3 class = "service-title" > Process Excellence & Transformation</ h3 >
< p class = "service-desc" >
We diagnose where work is breaking down, design optimised processes, and
run the change with you — not just for you.
</ p >
< a href = "services/consulting.html" class = "service-link" >
Learn more
< svg viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "2.2" stroke-linecap = "round" stroke-linejoin = "round" >< path d = "M5 12h14" />< path d = "m13 6 6 6-6 6" /></ svg >
</ a >
</ div >
</ article >
< article class = "service-card" >
< div class = "service-img" >
< span class = "service-tag orange" > Coaching & Training</ span >
< img src = "https://images.unsplash.com/photo-1543269865-cbf427effbad?auto=format&fit=crop&w=900&q=80" alt = "Coach working with a small team in a workshop setting" >
</ div >
< div class = "service-body" >
< h3 class = "service-title" > Building capability and culture</ h3 >
< p class = "service-desc" >
Tailored coaching and bespoke training that turns Lean theory into everyday
practice. Your team owns the improvement.
</ p >
< a href = "services/coaching.html" class = "service-link orange" >
Learn more
< svg viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "2.2" stroke-linecap = "round" stroke-linejoin = "round" >< path d = "M5 12h14" />< path d = "m13 6 6 6-6 6" /></ svg >
</ a >
</ div >
</ article >
< article class = "service-card" >
< div class = "service-img" >
< span class = "service-tag charcoal" > Digital Solutions</ span >
< img src = "https://images.unsplash.com/photo-1551434678-e076c223a692?auto=format&fit=crop&w=900&q=80" alt = "Custom software being developed on a laptop" >
</ div >
< div class = "service-body" >
< h3 class = "service-title" > Custom apps, dashboards & automation</ h3 >
< p class = "service-desc" >
From Power BI dashboards to custom web apps that replace clunky spreadsheets — we build tailored software that streamlines your operations and makes data work for you.
</ p >
< a href = "services/digital-solutions.html" class = "service-link" >
Learn more
< svg viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "2.2" stroke-linecap = "round" stroke-linejoin = "round" >< path d = "M5 12h14" />< path d = "m13 6 6 6-6 6" /></ svg >
</ a >
</ div >
</ article >
</ div >
</ div >
</ section >
<!-- ───── PROCESS / HOW IT WORKS ───── -->
< section class = "section process" id = "process" >
< div class = "section-inner" >
< div class = "services-head" >
< div class = "section-eyebrow" > How it works</ div >
< h2 class = "section-title" > A clear path from waste to flow.</ h2 >
< p class = "section-lede" >
Every engagement runs four cycles — adapted to your scale, industry and team capability. The cycles repeat as the business evolves; what stays constant is the partnership underneath.
</ p >
</ div >
< div class = "flow-wrap" >
< div class = "flow" >
< div class = "flow-step" >
< div class = "flow-step-label" > Step 01</ div >
< h3 class = "flow-step-title" > Diagnose</ h3 >
< p class = "flow-step-desc" >
Process mapping, audits and a maturity assessment. We walk your operation alongside you, talk to the people doing the work, and quantify where the friction sits.
</ p >
< div class = "flow-step-outcome" >
By the end: a clear map of where time, quality and cost are leaking — and which fix moves the dial first.
</ div >
</ div >
< div class = "flow-arrow" aria-hidden = "true" >
< svg viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "2" stroke-linecap = "round" stroke-linejoin = "round" >< path d = "M5 12h14" />< path d = "m13 6 6 6-6 6" /></ svg >
</ div >
< div class = "flow-step" >
< div class = "flow-step-label" > Step 02</ div >
< h3 class = "flow-step-title" > Design & pilot</ h3 >
< p class = "flow-step-desc" >
We co-design the future state with your team, then run a focused pilot in one area. Real data, real people, real results — before we touch the rest of the business.
</ p >
< div class = "flow-step-outcome" >
By the end: a proven future state, validated with hard data on a focused pilot.
</ div >
</ div >
< div class = "flow-arrow" aria-hidden = "true" >
< svg viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "2" stroke-linecap = "round" stroke-linejoin = "round" >< path d = "M5 12h14" />< path d = "m13 6 6 6-6 6" /></ svg >
</ div >
< div class = "flow-step" >
< div class = "flow-step-label" > Step 03</ div >
< h3 class = "flow-step-title" > Roll out</ h3 >
< p class = "flow-step-desc" >
Once the pilot proves the gains, we scale the approach across other teams, sites or business units — adapted to each context, with the same disciplined method.
</ p >
< div class = "flow-step-outcome" >
By the end: the gains scaled across teams, sites or business units — same method, each context.
</ div >
</ div >
< div class = "flow-arrow" aria-hidden = "true" >
< svg viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "2" stroke-linecap = "round" stroke-linejoin = "round" >< path d = "M5 12h14" />< path d = "m13 6 6 6-6 6" /></ svg >
</ div >
< div class = "flow-step" >
< div class = "flow-step-label" > Step 04</ div >
< h3 class = "flow-step-title" > Sustain</ h3 >
< p class = "flow-step-desc" >
Coaching, dashboards and train-the-trainer programs so the improvement becomes how your team operates — without us in the room.
</ p >
< div class = "flow-step-outcome" >
By the end: the improvement runs without us — your team owns it, the data proves it.
</ div >
</ div >
</ div >
<!-- Partnership rail: continuous line beneath the 4 steps. The four cycles happen *during* the partnership. -->
< div class = "partnership-rail" aria-label = "Continuous partnership underlying the four-step cycle" >
< div class = "partnership-rail-line" >
< span class = "partnership-rail-marker partnership-rail-marker-start" aria-hidden = "true" ></ span >
< span class = "partnership-rail-marker partnership-rail-marker-end" aria-hidden = "true" ></ span >
</ div >
< div class = "partnership-rail-content" >
< span class = "partnership-rail-label" > The Partnership</ span >
< p > The four-step cycle happens < em > inside</ em > an ongoing partnership. We stay alongside you across cycles — same team, same methods, learning your business as it evolves. Continuous improvement, made continuous.</ p >
</ div >
</ div >
</ div >
</ div >
</ section >
<!-- ───── OUTCOMES / FIVE LEVERS — Apple-style carousel ───── -->
< section class = "section outcomes" >
< div class = "section-inner" >
< div class = "outcomes-head" >
< div class = "outcomes-head-text" >
< div class = "section-eyebrow" > What good looks like</ div >
< h2 class = "section-title" > The five things continuous improvement moves.</ h2 >
< p class = "section-lede" >
Industry benchmarks for organisations that commit to a structured improvement program. Whatever your industry, these are the levers that shift.
</ p >
</ div >
< a href = "#contact" class = "outcomes-head-link" >
Let’ s Talk
< svg viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "2" stroke-linecap = "round" stroke-linejoin = "round" >< path d = "M5 12h14" />< path d = "m13 6 6 6-6 6" /></ svg >
</ a >
</ div >
< div class = "levers-carousel-wrap" >
< div class = "levers-rail" data-levers-rail >
<!-- 01 — Cycle time -->
< article class = "lever" >
< div class = "lever-eyebrow" > Cycle time</ div >
< h3 class = "lever-title" > Get work through faster.</ h3 >
< p class = "lever-desc" > Fewer hand-offs, less waiting, shorter lead times — without adding headcount or overtime.</ p >
< div class = "lever-visual" aria-hidden = "true" >
<!-- Stylised "fast clock" illustration: clock face with motion arcs -->
< svg viewBox = "0 0 200 140" xmlns = "http://www.w3.org/2000/svg" >
< defs >
< linearGradient id = "lev1grad" x1 = "0" y1 = "0" x2 = "1" y2 = "1" >
< stop offset = "0" stop-color = "#0070c7" />
< stop offset = "1" stop-color = "#005aa3" />
</ linearGradient >
</ defs >
<!-- Motion arcs -->
< path d = "M 30 70 Q 30 35, 75 35" stroke = "#0070c7" stroke-width = "2" stroke-linecap = "round" fill = "none" opacity = "0.25" />
< path d = "M 22 70 Q 22 28, 75 28" stroke = "#0070c7" stroke-width = "2" stroke-linecap = "round" fill = "none" opacity = "0.4" />
<!-- Clock face -->
< circle cx = "120" cy = "70" r = "48" fill = "url(#lev1grad)" />
< circle cx = "120" cy = "70" r = "48" fill = "none" stroke = "#0070c7" stroke-width = "1" opacity = "0.2" />
<!-- Hour and minute hands pointing toward 2 o'clock to suggest motion -->
< line x1 = "120" y1 = "70" x2 = "120" y2 = "40" stroke = "white" stroke-width = "3" stroke-linecap = "round" />
< line x1 = "120" y1 = "70" x2 = "142" y2 = "78" stroke = "white" stroke-width = "3" stroke-linecap = "round" />
< circle cx = "120" cy = "70" r = "4" fill = "white" />
</ svg >
</ div >
</ article >
<!-- 02 — Quality -->
< article class = "lever" >
< div class = "lever-eyebrow" > Quality</ div >
< h3 class = "lever-title" > Fewer errors. Less rework.</ h3 >
< p class = "lever-desc" > Defects fixed at the source, not at the end. Customers stay, costs drop, your team stops firefighting.</ p >
< div class = "lever-visual" aria-hidden = "true" >
<!-- Shield with checkmark - quality / protection -->
< svg viewBox = "0 0 200 140" xmlns = "http://www.w3.org/2000/svg" >
< defs >
< linearGradient id = "lev2grad" x1 = "0" y1 = "0" x2 = "0" y2 = "1" >
< stop offset = "0" stop-color = "#ec8b33" />
< stop offset = "1" stop-color = "#d97520" />
</ linearGradient >
</ defs >
<!-- Shield -->
< path d = "M 100 18 L 60 35 L 60 78 Q 60 110, 100 122 Q 140 110, 140 78 L 140 35 Z" fill = "url(#lev2grad)" />
<!-- Checkmark -->
< polyline points = "78,72 94,88 124,58" stroke = "white" stroke-width = "6" stroke-linecap = "round" stroke-linejoin = "round" fill = "none" />
</ svg >
</ div >
</ article >
<!-- 03 — Cost -->
< article class = "lever" >
< div class = "lever-eyebrow" > Cost</ div >
< h3 class = "lever-title" > Eliminate waste — savings drop straight through.</ h3 >
< p class = "lever-desc" > Cut from how the work is done, not from headcount. Margin returns to the line, not to the spreadsheet.</ p >
< div class = "lever-visual" aria-hidden = "true" >
<!-- Downward bar chart: bars getting shorter -->
< svg viewBox = "0 0 200 140" xmlns = "http://www.w3.org/2000/svg" >
< defs >
< linearGradient id = "lev3grad" x1 = "0" y1 = "0" x2 = "0" y2 = "1" >
< stop offset = "0" stop-color = "#0070c7" />
< stop offset = "1" stop-color = "#005aa3" />
</ linearGradient >
</ defs >
<!-- Bars descending left to right -->
< rect x = "40" y = "30" width = "22" height = "92" rx = "4" fill = "url(#lev3grad)" />
< rect x = "70" y = "50" width = "22" height = "72" rx = "4" fill = "url(#lev3grad)" opacity = "0.85" />
< rect x = "100" y = "68" width = "22" height = "54" rx = "4" fill = "url(#lev3grad)" opacity = "0.7" />
< rect x = "130" y = "84" width = "22" height = "38" rx = "4" fill = "url(#lev3grad)" opacity = "0.55" />
<!-- Down arrow indicator -->
< path d = "M 168 35 L 168 75 M 158 65 L 168 78 L 178 65" stroke = "#ec8b33" stroke-width = "3" stroke-linecap = "round" stroke-linejoin = "round" fill = "none" />
</ svg >
</ div >
</ article >
<!-- 04 — Morale -->
< article class = "lever" >
< div class = "lever-eyebrow" > Morale</ div >
< h3 class = "lever-title" > Engagement and retention follow.</ h3 >
< p class = "lever-desc" > When people fix the things that frustrate them, they stay, they refer, they bring their best work — every day.</ p >
< div class = "lever-visual" aria-hidden = "true" >
<!-- Three connected people / nodes - team -->
< svg viewBox = "0 0 200 140" xmlns = "http://www.w3.org/2000/svg" >
< defs >
< linearGradient id = "lev4grad" x1 = "0" y1 = "0" x2 = "1" y2 = "1" >
< stop offset = "0" stop-color = "#ec8b33" />
< stop offset = "1" stop-color = "#d97520" />
</ linearGradient >
</ defs >
<!-- Connecting lines first (behind nodes) -->
< line x1 = "60" y1 = "80" x2 = "100" y2 = "50" stroke = "#ec8b33" stroke-width = "2" opacity = "0.4" stroke-linecap = "round" />
< line x1 = "100" y1 = "50" x2 = "140" y2 = "80" stroke = "#ec8b33" stroke-width = "2" opacity = "0.4" stroke-linecap = "round" />
< line x1 = "60" y1 = "80" x2 = "140" y2 = "80" stroke = "#ec8b33" stroke-width = "2" opacity = "0.4" stroke-linecap = "round" />
<!-- Three person nodes (head + body) -->
< g >
< circle cx = "100" cy = "42" r = "11" fill = "url(#lev4grad)" />
< path d = "M 87 70 Q 87 56, 100 56 Q 113 56, 113 70 Z" fill = "url(#lev4grad)" />
</ g >
< g opacity = "0.85" >
< circle cx = "60" cy = "72" r = "9" fill = "url(#lev4grad)" />
< path d = "M 49 96 Q 49 84, 60 84 Q 71 84, 71 96 Z" fill = "url(#lev4grad)" />
</ g >
< g opacity = "0.85" >
< circle cx = "140" cy = "72" r = "9" fill = "url(#lev4grad)" />
< path d = "M 129 96 Q 129 84, 140 84 Q 151 84, 151 96 Z" fill = "url(#lev4grad)" />
</ g >
</ svg >
</ div >
</ article >
<!-- 05 — Safety -->
< article class = "lever" >
< div class = "lever-eyebrow" > Safety</ div >
< h3 class = "lever-title" > Standard work reduces incidents.</ h3 >
< p class = "lever-desc" > Visual controls, predictable processes, fewer unknowns. Protecting your people and your uptime — both at once.</ p >
< div class = "lever-visual" aria-hidden = "true" >
<!-- Hexagon (echoing isotipo) with safety cross / check pattern -->
< svg viewBox = "0 0 200 140" xmlns = "http://www.w3.org/2000/svg" >
< defs >
< linearGradient id = "lev5grad" x1 = "0" y1 = "0" x2 = "0" y2 = "1" >
< stop offset = "0" stop-color = "#0070c7" />
< stop offset = "1" stop-color = "#005aa3" />
</ linearGradient >
</ defs >
<!-- Outer hexagon — echoes the isotipo motif -->
< polygon points = "100,20 150,48 150,92 100,120 50,92 50,48" fill = "url(#lev5grad)" />
<!-- Inner concentric hexagon for depth -->
< polygon points = "100,38 134,57 134,83 100,102 66,83 66,57" fill = "none" stroke = "white" stroke-width = "2" opacity = "0.3" />
<!-- Plus / cross symbol — safety/protection -->
< rect x = "93" y = "56" width = "14" height = "28" rx = "2" fill = "white" />
< rect x = "86" y = "63" width = "28" height = "14" rx = "2" fill = "white" />
</ svg >
</ div >
</ article >
</ div >
<!-- Pagination dots (mobile only) -->
< div class = "levers-dots" data-levers-dots aria-hidden = "true" >
< span class = "levers-dot is-active" ></ span >
< span class = "levers-dot" ></ span >
< span class = "levers-dot" ></ span >
< span class = "levers-dot" ></ span >
< span class = "levers-dot" ></ span >
</ div >
<!-- Prev/Next navigation -->
< div class = "levers-nav" >
< button class = "levers-nav-btn" type = "button" data-levers-prev aria-label = "Previous outcome" disabled >
< svg viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "2.5" stroke-linecap = "round" stroke-linejoin = "round" >< path d = "m15 18-6-6 6-6" /></ svg >
</ button >
< button class = "levers-nav-btn" type = "button" data-levers-next aria-label = "Next outcome" >
< svg viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "2.5" stroke-linecap = "round" stroke-linejoin = "round" >< path d = "m9 18 6-6-6-6" /></ svg >
</ button >
</ div >
</ div >
</ div >
</ section >
<!-- ───── WHY LEAN 101 — reframed around partnership ───── -->
< section class = "section whyus" id = "why" >
< div class = "section-inner" >
< div class = "whyus-layout" >
< div >
< div class = "section-eyebrow" > Why Lean 101</ div >
< h2 class = "section-title" > One framework. Customised to your business.</ h2 >
< p class = "section-lede" >
Lean 101 is a one-on-one partnership. We bring globally recognised
frameworks — Lean, Six Sigma, continuous improvement best practice —
and adapt them to how < em > your</ em > business actually runs. Every company,
every industry is different, so we work alongside you to solve the
problems that matter to you — not deliver a generic playbook.
</ p >
</ div >
< ul class = "whyus-list" >
< li class = "whyus-item" >
< div class = "whyus-icon" >
< svg viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "2" stroke-linecap = "round" stroke-linejoin = "round" >< circle cx = "12" cy = "12" r = "10" />< path d = "M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20" />< path d = "M2 12h20" /></ svg >
</ div >
< div class = "whyus-text" >
< h4 > Globally recognised frameworks, practically applied</ h4 >
< p > Lean, Six Sigma, and continuous improvement best practice — adapted to how your business actually runs, not lifted from a generic playbook.</ p >
</ div >
</ li >
< li class = "whyus-item" >
< div class = "whyus-icon" >
< svg viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "2" stroke-linecap = "round" stroke-linejoin = "round" >< path d = "M21.3 15.3a2.4 2.4 0 0 1 0 3.4l-2.6 2.6a2.4 2.4 0 0 1-3.4 0L2.7 8.7a2.4 2.4 0 0 1 0-3.4l2.6-2.6a2.4 2.4 0 0 1 3.4 0Z" />< path d = "m14.5 12.5 2-2" />< path d = "m11.5 9.5 2-2" />< path d = "m8.5 6.5 2-2" />< path d = "m17.5 15.5 2-2" /></ svg >
</ div >
< div class = "whyus-text" >
< h4 > Customised to each business, not off the shelf</ h4 >
< p > Every business is different. Focused coaching, a single process redesign, or full transformation — we shape the engagement around your priorities, capacity, and budget.</ p >
</ div >
</ li >
< li class = "whyus-item" >
< div class = "whyus-icon" >
< svg viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "2" stroke-linecap = "round" stroke-linejoin = "round" >< path d = "M22 10v6M2 10l10-5 10 5-10 5z" />< path d = "M6 12v5c3 3 9 3 12 0v-5" /></ svg >
</ div >
< div class = "whyus-text" >
< h4 > We build capability, not dependency</ h4 >
< p > Our success metric is the day you no longer need us. Train-the-trainer, embedded dashboards, and clear playbooks make the improvement stick.</ p >
</ div >
</ li >
< li class = "whyus-item" >
< div class = "whyus-icon" >
< svg viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "2" stroke-linecap = "round" stroke-linejoin = "round" >< line x1 = "12" x2 = "12" y1 = "20" y2 = "10" />< line x1 = "18" x2 = "18" y1 = "20" y2 = "4" />< line x1 = "6" x2 = "6" y1 = "20" y2 = "16" /></ svg >
</ div >
< div class = "whyus-text" >
< h4 > Data-led from day one</ h4 >
< p > Power BI dashboards and automated reporting come standard. You see what's working, what isn't, and what to do next — in real time.</ p >
</ div >
</ li >
</ ul >
</ div >
</ div >
</ section >
2026-05-20 23:09:07 +12:00
<!-- ───── CTA ───── -->
2026-05-17 22:45:45 +12:00
< section class = "cta-wrap" id = "contact" >
< div class = "cta-card" >
< div class = "cta-inner" >
< h2 > Let's find < em > your</ em > first improvement.</ h2 >
< p > Tell us a little about your business and what you're looking to improve. We'll get back to you to talk through whether — and how — we can help.</ p >
2026-05-20 23:09:07 +12:00
< div class = "hero-ctas" >
< a href = "#" class = "btn btn-on-dark" >
Let’ s Talk < span class = "btn-arrow" > →</ span >
</ a >
</ div >
2026-05-17 22:45:45 +12:00
</ div >
</ div >
</ section >
<!-- ───── FOOTER — orange Logotipo (no tagline), tagline removed ───── -->
< footer class = "footer" >
< div class = "footer-inner" >
< div class = "footer-grid" >
< div class = "footer-brand" >
< img src = "assets/lean101-logotipo.png" alt = "Lean 101" >
< p > For businesses that want change to last.</ p >
</ div >
< div class = "footer-col" >
< h5 > Services</ h5 >
< ul >
< li >< a href = "services/consulting.html" > Process Excellence</ a ></ li >
< li >< a href = "services/coaching.html" > Coaching & Training</ a ></ li >
< li >< a href = "services/digital-solutions.html" > Digital Solutions</ a ></ li >
</ ul >
</ div >
< div class = "footer-col" >
< h5 > Resources</ h5 >
< ul >
< li >< a href = "resources/index.html#principles" > Principles</ a ></ li >
< li >< a href = "resources/index.html#techniques" > Techniques</ a ></ li >
< li >< a href = "resources/index.html#reading" > Reading</ a ></ li >
< li >< a href = "resources/index.html#templates" > Templates</ a ></ li >
</ ul >
</ div >
< div class = "footer-col" >
< h5 > Company</ h5 >
< ul >
< li >< a href = "#why" > About</ a ></ li >
< li >< a href = "#process" > Approach</ a ></ li >
< li >< a href = "#contact" > Contact</ a ></ li >
</ ul >
</ div >
< div class = "footer-col" >
< h5 > Connect</ h5 >
< ul >
< li >< a href = "#" > LinkedIn</ a ></ li >
< li >< a href = "mailto:hello@lean-101.com" > Email</ a ></ li >
</ ul >
</ div >
</ div >
< div class = "footer-bottom" >
< span > © 2026 Lean 101. All rights reserved.</ span >
< span > Based in Melbourne, working worldwide.</ span >
</ div >
</ div >
</ footer >
< script >
// ─── Reveal-on-scroll for sections ───
const observer = new IntersectionObserver (( entries ) => {
entries . forEach ( e => {
if ( e . isIntersecting ) {
e . target . classList . add ( 'in' );
observer . unobserve ( e . target );
}
});
}, { threshold : 0.1 });
document . querySelectorAll ( '.section, .hero-visual, .cta-wrap' ). forEach ( el => {
el . classList . add ( 'reveal' );
observer . observe ( el );
});
// ─── Number counter animation for hero stats ───
// Counts up from 0 to the target value once the stats panel scrolls into view.
// Uses ease-out so it slows toward the end, ~1.5s total.
// Respects prefers-reduced-motion: skips animation, shows final value immediately.
const prefersReducedMotion = window . matchMedia ( '(prefers-reduced-motion: reduce)' ). matches ;
function animateCounter ( el ) {
const target = parseFloat ( el . dataset . target );
const prefix = el . dataset . prefix || '' ;
const suffix = el . dataset . suffix || '' ;
if ( isNaN ( target )) return ;
if ( prefersReducedMotion ) {
el . textContent = ` ${ prefix }${ target }${ suffix } ` ;
return ;
}
const duration = 1500 ; // ms
const start = performance . now ();
function step ( now ) {
const elapsed = now - start ;
const t = Math . min ( elapsed / duration , 1 );
// Ease-out cubic: fast start, slow finish
const eased = 1 - Math . pow ( 1 - t , 3 );
const current = Math . round ( target * eased );
el . textContent = ` ${ prefix }${ current }${ suffix } ` ;
if ( t < 1 ) {
requestAnimationFrame ( step );
} else {
// Snap to exact final value
el . textContent = ` ${ prefix }${ target }${ suffix } ` ;
}
}
// Start at 0
el . textContent = ` ${ prefix } 0 ${ suffix } ` ;
requestAnimationFrame ( step );
}
// Watch for the stats panel entering viewport, then animate all stats once.
const statsPanel = document . querySelector ( '.hero-stats' );
if ( statsPanel ) {
const statsObserver = new IntersectionObserver (( entries ) => {
entries . forEach ( entry => {
if ( entry . isIntersecting ) {
const stats = entry . target . querySelectorAll ( '.hero-stat-num[data-target]' );
stats . forEach ( animateCounter );
statsObserver . unobserve ( entry . target );
}
});
}, { threshold : 0.4 });
statsObserver . observe ( statsPanel );
}
// ─── Mobile drawer (hamburger menu) ───
const drawer = document . querySelector ( '.nav-drawer' );
const overlay = document . querySelector ( '[data-drawer-overlay]' );
const hamburger = document . querySelector ( '.nav-hamburger' );
const drawerClose = document . querySelector ( '.nav-drawer-close' );
function openDrawer () {
if ( ! drawer ) return ;
drawer . classList . add ( 'is-open' );
drawer . setAttribute ( 'aria-hidden' , 'false' );
overlay . classList . add ( 'is-open' );
overlay . setAttribute ( 'aria-hidden' , 'false' );
hamburger . setAttribute ( 'aria-expanded' , 'true' );
document . body . classList . add ( 'nav-drawer-locked' );
}
function closeDrawer () {
if ( ! drawer ) return ;
drawer . classList . remove ( 'is-open' );
drawer . setAttribute ( 'aria-hidden' , 'true' );
overlay . classList . remove ( 'is-open' );
overlay . setAttribute ( 'aria-hidden' , 'true' );
hamburger . setAttribute ( 'aria-expanded' , 'false' );
document . body . classList . remove ( 'nav-drawer-locked' );
}
if ( hamburger ) hamburger . addEventListener ( 'click' , openDrawer );
if ( drawerClose ) drawerClose . addEventListener ( 'click' , closeDrawer );
if ( overlay ) overlay . addEventListener ( 'click' , closeDrawer );
document . addEventListener ( 'keydown' , ( e ) => {
if ( e . key === 'Escape' && drawer && drawer . classList . contains ( 'is-open' )) {
closeDrawer ();
}
});
document . querySelectorAll ( '.nav-drawer a' ). forEach ( link => {
link . addEventListener ( 'click' , closeDrawer );
});
// ─── Desktop mega-panels (Services / Resources) ───
// Click-only behaviour: chevron toggles its panel, clicking outside or
// pressing Escape closes any open panel. Clicking the link text itself
// (not the chevron) navigates as normal — chevron is a separate trigger.
const panelTriggers = document . querySelectorAll ( '[data-panel-trigger]' );
const panels = document . querySelectorAll ( '[data-panel]' );
function closeAllPanels () {
panels . forEach ( p => p . classList . remove ( 'is-open' ));
panelTriggers . forEach ( t => t . setAttribute ( 'aria-expanded' , 'false' ));
}
panelTriggers . forEach ( trigger => {
trigger . addEventListener ( 'click' , ( e ) => {
e . preventDefault ();
e . stopPropagation ();
const name = trigger . dataset . panelTrigger ;
const panel = document . querySelector ( `[data-panel=" ${ name } "]` );
if ( ! panel ) return ;
const isOpen = panel . classList . contains ( 'is-open' );
closeAllPanels ();
if ( ! isOpen ) {
panel . classList . add ( 'is-open' );
trigger . setAttribute ( 'aria-expanded' , 'true' );
}
});
});
// Click outside any panel closes panels
document . addEventListener ( 'click' , ( e ) => {
if ( ! e . target . closest ( '.has-panel' )) {
closeAllPanels ();
}
});
// Escape closes panels
document . addEventListener ( 'keydown' , ( e ) => {
if ( e . key === 'Escape' ) closeAllPanels ();
});
// Clicking a link inside a panel closes it (so navigation feels clean)
document . querySelectorAll ( '.nav-panel a' ). forEach ( link => {
link . addEventListener ( 'click' , closeAllPanels );
});
// ─── Outcomes carousel: prev/next nav, dots, disable at edges ───
const rail = document . querySelector ( '[data-levers-rail]' );
const prevBtn = document . querySelector ( '[data-levers-prev]' );
const nextBtn = document . querySelector ( '[data-levers-next]' );
const dotsContainer = document . querySelector ( '[data-levers-dots]' );
const dots = dotsContainer ? dotsContainer . querySelectorAll ( '.levers-dot' ) : [];
if ( rail && prevBtn && nextBtn ) {
// Get the width of one card + gap, used as scroll step
function cardStep () {
const firstCard = rail . querySelector ( '.lever' );
if ( ! firstCard ) return 320 ;
const style = getComputedStyle ( rail );
const gap = parseFloat ( style . columnGap || style . gap || 18 );
return firstCard . getBoundingClientRect (). width + gap ;
}
function updateState () {
// Disable prev when at the start
const atStart = rail . scrollLeft <= 4 ;
// Disable next when at (or very near) the end
const atEnd = rail . scrollLeft + rail . clientWidth >= rail . scrollWidth - 4 ;
prevBtn . disabled = atStart ;
nextBtn . disabled = atEnd ;
// Update dots — find the card index closest to current scroll position
if ( dots . length > 0 ) {
const step = cardStep ();
const idx = Math . round ( rail . scrollLeft / step );
dots . forEach (( dot , i ) => {
dot . classList . toggle ( 'is-active' , i === Math . min ( idx , dots . length - 1 ));
});
}
}
prevBtn . addEventListener ( 'click' , () => {
rail . scrollBy ({ left : - cardStep (), behavior : 'smooth' });
});
nextBtn . addEventListener ( 'click' , () => {
rail . scrollBy ({ left : cardStep (), behavior : 'smooth' });
});
// Throttle scroll handler with requestAnimationFrame so it stays smooth
let rafPending = false ;
rail . addEventListener ( 'scroll' , () => {
if ( ! rafPending ) {
rafPending = true ;
requestAnimationFrame (() => {
updateState ();
rafPending = false ;
});
}
});
// Update on resize too — card width depends on viewport
window . addEventListener ( 'resize' , updateState );
// Initial state
updateState ();
}
</ script >
</ body >
</ html >