Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
17b6306
Match progressrail.com homepage more closely
samshao Aug 13, 2026
6887e53
header: fix desktop grid collapsing to 3 rows, match nav casing/searc…
samshao Aug 13, 2026
e8b84b0
header: move language switcher to nav-links row, tighten nav spacing
samshao Aug 13, 2026
5820cf3
header: fix invisible globe icon, language link styling, nav-item pad…
samshao Aug 13, 2026
a2c3612
header: fix nav-link font, replace chevron hack with a real icon
samshao Aug 13, 2026
e20e7c8
header: fix logo size, chevron size/color-sync, add missing Careers s…
samshao Aug 13, 2026
2dc25d5
header: fix hover underline and add missing background on nav items
samshao Aug 13, 2026
8274c72
header: use the source's actual chevron path (mark was reading too sm…
samshao Aug 13, 2026
70cdfa4
hero: fix heading size/weight/margin and CTA button styling to match …
samshao Aug 13, 2026
05a1c84
pr-hero: vertically center content instead of top-padding it
samshao Aug 13, 2026
46fff68
cta buttons: add the min-width:200px the source uses for in-content CTAs
samshao Aug 14, 2026
5330788
fix header and hero heights to match the source (128px / 350px)
samshao Aug 14, 2026
1ece11f
pr-jump-nav: rewrite link styling and layout to match the source prec…
samshao Aug 14, 2026
f34f710
pr-jump-nav: fix height/gap to match source, fix broken anchor naviga…
samshao Aug 14, 2026
1dc0637
pr-jump-nav: full-bleed bar, correct divider color, working "Featured…
samshao Aug 14, 2026
46d1479
pr-jump-nav: fix scrollspy off-by-one — clicking a link activated the…
samshao Aug 14, 2026
aeefa6d
pr-jump-nav: scrollspy threshold was too narrow for ordinary scrolling
samshao Aug 14, 2026
40a610d
pr-cards: match source's fonts, card height, and Learn More styling
samshao Aug 14, 2026
e3b64e8
pr-cards: chevron should sit next to the label, not pushed to the car…
samshao Aug 14, 2026
442af18
pr-teaser: match source's fonts, panel size, and — importantly — width
samshao Aug 14, 2026
d51b3f6
fix "PROGRESS RAIL" heading/underline/copy size — a site-wide root cause
samshao Aug 14, 2026
bcf2ad0
styles: indent default-content body copy 35px to match source
samshao Aug 14, 2026
c21fadb
pr-hero, pr-teaser: add missing dark gradient overlay, fix teaser lay…
samshao Aug 14, 2026
98fa127
pr-teaser: fix title/description/button position (align-items vs just…
samshao Aug 14, 2026
befcbfc
styles: fix section vertical spacing (64px, not 40px)
samshao Aug 14, 2026
fec14ac
styles: add top margin between stacked block wrappers within a section
samshao Aug 14, 2026
a3af09b
pr-columns: add missing 64px padding around each row's text panel
samshao Aug 14, 2026
be197da
pr-columns: fix image column width (true 50/50 grid, not flex:1)
samshao Aug 14, 2026
7ace42c
pr-columns: fix image column height (was inflating rows via image asp…
samshao Aug 14, 2026
e66e9e8
pr-video: fix width (1070px content-width, not the boilerplate's 900px)
samshao Aug 14, 2026
02939fc
footer: full rebuild to match source (light theme, accordion nav, ico…
samshao Aug 14, 2026
a26c422
footer: fix content-column width (1140px, not the boilerplate's 1200px)
samshao Aug 14, 2026
5a3c009
footer: top-align nav columns, right-align social icon row
samshao Aug 14, 2026
2974b93
footer: grid layout with proper row gaps + distinct copyright background
samshao Aug 14, 2026
0716e3d
footer: full-bleed gray background, center-align copyright row
samshao Aug 14, 2026
dbaa022
pr-jump-nav: fix scrollspy picking the wrong link on tall viewports
samshao Aug 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .mcp.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"mcpServers": {
"chrome-devtools": {
"command": "npx",
"args": ["-y", "chrome-devtools-mcp@1.6.0", "--headless", "--isolated"]
}
}
}
262 changes: 203 additions & 59 deletions blocks/footer/footer.css
Original file line number Diff line number Diff line change
@@ -1,105 +1,249 @@
/* ===== Progress Rail footer — light gray bg, dark nav text, blue legal
links. Verified directly against the source via getComputedStyle:
contrary to an earlier (wrong, unverified) assumption, this is NOT a
dark/white-text footer — background is a flat #ccc throughout, and
both the nav links and headings render in the page's own dark text
color, not white.

The gray lives on the outer <footer> element (full viewport width),
not on the block itself — verified via getBoundingClientRect: the
source's own outer footer wrapper spans the full 1600px viewport with
the gray background, while its inner `.footer.block` (background:
transparent) is just the centered/padded 1140px content column. */
footer {
background-color: var(--brand-dark, #131313);
color: #fff;
font-size: var(--body-font-size-xs, 14px);
background-color: #ccc;
}

footer .footer > div {
margin: auto;
max-width: 1200px;
padding: 40px 24px 24px;
/* the block itself is the grid container (verified: the source's own
`.footer.block` stacks its three sections — nav, social, copyright —
as named grid rows with a 24px row gap), so the three sections are
appended as its direct children in footer.js rather than nested in an
extra wrapper div. */
footer .footer {
display: grid;
grid-template-areas: 'nav' 'social' 'copyright';
grid-template-columns: 1fr;
gap: 24px;
max-width: 1140px;
margin: 0 auto;
padding: 32px;
color: var(--text-color);
font-size: 14px;
}

footer .footer p {
margin: 0;
}

@media (width >= 900px) {
footer .footer > div {
padding: 40px 32px 24px;
}
}

/* ===== Progress Rail footer branding — dark bg, white uppercase nav ===== */
/* links */
footer a:any-link {
color: #fff;
color: var(--text-color);
text-decoration: none;
}

footer a:any-link:hover {
color: var(--brand-yellow, #ffcd11);
footer a:hover {
color: var(--brand-yellow-hover, #e6b800);
text-decoration: underline;
}

/* ===== nav columns — each category is a native <details>/<summary>
accordion (collapsible on mobile, forced open and non-interactive at
desktop via the media query below — matches the source, which does the
same rather than using a heading + always-visible list). ===== */
footer .footer-nav {
grid-area: nav;
}

/* column headings — white, bold, uppercase */
footer .footer h3 {
margin: 0 0 12px;
color: #fff;
footer .footer-nav .columns > div {
display: grid;
grid-template-columns: 1fr;
gap: 20px 24px;

/* the generic .columns block centers items vertically at >=900px
(blocks/columns/columns.css) — verified against the source that
footer categories are top-aligned instead, so a shorter column
(e.g. "Supply Chain", 3 links) doesn't have its heading pulled down
to the vertical center of a taller neighbor (e.g. "Company", 5). */
align-items: start;
}

footer .footer-nav .columns > div > div {
min-width: 0;
}

footer .footer-nav details > summary {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
padding: 16.8px 0;
list-style: none;
cursor: pointer;
font-family: var(--heading-font-family);
font-size: 14px;
font-weight: 700;
font-weight: 400;
text-transform: uppercase;
letter-spacing: 0.4px;
}

footer .footer ul {
footer .footer-nav details > summary::-webkit-details-marker {
display: none;
}

footer .footer-nav details > summary .icon-chevron {
flex: none;
height: 14px;
width: 14px;
transition: transform 0.2s ease;
}

footer .footer-nav details[open] > summary .icon-chevron {
transform: rotate(180deg);
}

footer .footer-nav ul {
list-style: none;
margin: 0;
padding: 0;
padding: 0 0 4px;
}

footer .footer li {
margin: 0 0 8px;
line-height: 1.4;
footer .footer-nav li {
padding: 5.6px 0;
line-height: 1.6;
}

/* columns block → responsive grid of link columns */
footer .columns > div {
display: grid;
grid-template-columns: 1fr;
gap: 28px 24px;
@media (width >= 600px) {
footer .footer-nav .columns > div {
grid-template-columns: repeat(3, 1fr);
}
}

footer .columns > div > div {
min-width: 0;
@media (width >= 900px) {
/* at desktop every category stays permanently expanded, so the chevron
(a mobile collapse affordance) and the click-to-toggle interaction
it represents are both switched off. */
footer .footer-nav details > summary {
cursor: default;
pointer-events: none;
}

footer .footer-nav details > summary .icon-chevron {
display: none;
}
}

/* legal / copyright row (loose links in the default-content-wrapper) */
footer .default-content-wrapper > p:last-child {
@media (width >= 1200px) {
footer .footer-nav .columns > div {
grid-template-columns: repeat(6, 1fr);
gap: 16px;
}
}

/* ===== social icon row — a second, icon-only rendering of the same
links as the nav's own "Social Media" column (verified against the
source: both exist side by side). ===== */
footer .footer-social {
grid-area: social;
}

footer .footer-social ul {
display: flex;
flex-wrap: wrap;
justify-content: flex-end;
gap: 14px;
list-style: none;
margin: 0;
padding: 0;
}

footer .footer-social a {
display: flex;
align-items: center;
gap: 6px 14px;
margin-top: 28px;
padding-top: 18px;
border-top: 1px solid rgb(255 255 255 / 20%);
justify-content: center;
height: 44px;
width: 44px;
}

footer .footer-social .icon {
display: block;
height: 24px;
width: 24px;
}

footer .footer-social .icon svg {
display: block;
height: 100%;
width: 100%;
}

footer .default-content-wrapper > p:last-child a:any-link {
/* ===== legal / copyright row — a plain list, not a paragraph (the
source's own markup), with a literal "|" separator generated between
items rather than typed into the content, and its own blue link color
distinct from the rest of the footer's dark text.

It also sits on a distinct white background, not the footer's own
gray — verified via getComputedStyle(el, '::after'): the source gives
this row a full-viewport-width white rectangle behind it (a
`calc(50% - 50vw)` full-bleed technique, escaping the footer's own
padded/centered column), extending from its own top edge down through
its 32px of padding-top plus another 32px below it. ===== */
footer .footer-copyright {
grid-area: copyright;
position: relative;
color: rgb(255 255 255 / 85%);
font-size: 13px;
isolation: isolate;
padding-top: 32px;
color: #2679b8;
}

footer .default-content-wrapper > p:last-child a + a::before {
footer .footer-copyright::after {
content: '';
position: absolute;
left: -8px;
top: 50%;
transform: translateY(-50%);
width: 1px;
height: 12px;
background-color: rgb(255 255 255 / 30%);
top: 0;
left: calc(50% - 50vw);
bottom: -32px;
z-index: -1;
width: 100vw;
background-color: var(--background-color);
}

@media (width >= 600px) {
footer .columns > div {
grid-template-columns: repeat(3, 1fr);
}
footer .footer-copyright ul {
display: flex;
flex-wrap: wrap;
justify-content: center;
list-style: none;
margin: 0;
padding: 0;
font-size: 14px;
}

@media (width >= 900px) {
footer .columns > div {
grid-template-columns: repeat(6, 1fr);
gap: 32px 24px;
}
footer .footer-copyright li {
margin: 0;
}

footer .footer-copyright li:not(:first-child)::before {
content: '|';
margin: 0 8px;
color: #555;
}

footer .footer-copyright a,
footer .footer-copyright button {
color: inherit;
}

/* the cookie-preference control is a <button>, not a link — strip its
native chrome so it reads identically to the links beside it */
footer .footer-copyright button {
appearance: none;
border: 0;
background: none;
padding: 0;
font: inherit;
cursor: pointer;
}

footer .footer-copyright a:hover,
footer .footer-copyright button:hover {
color: var(--link-hover-color);
text-decoration: underline;
}
Loading