From 3e41a13a789e7b2c0089ffe3d8f0a1ef32bb437f Mon Sep 17 00:00:00 2001 From: Sam Shao Date: Sun, 9 Aug 2026 18:08:01 -0700 Subject: [PATCH] Add footer-legal block for fortinet.com's second (gray) footer section MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fortinet.com's footer has a whole section below the main black footer that this site didn't have at all: a light-gray strip (bg #e6e6e6, measured directly from .footer-row.copyrights) with a sponsor/partner badge row, a copyright line, an extended legal-links row, a tagline, and an "Also of Interest" links row. New block, not just more content in the existing footer block, since this section is a real markup/style if — full-bleed light gray rather than the black footer's centered-on-black columns, and needs its own section-level override of the generic centered "footer .footer > div" padding rule (matching the same full-bleed-override pattern already used in cards-panel.css). decorate() classifies each authored row by what it actually contains (images+links → badge row, text starting "Copyright" → copyright line, text containing "Also of Interest" → that row, 2+ links → the legal-links row, otherwise → tagline) rather than depending on a fixed row order, so an author isn't locked into an exact sequence. Self-hosted all 7 badge images (the Fortinet wordmark + 6 sponsor logos: Founders Cup, FC Barcelona, DP World Tour, PGA Tour Americas, Juventus, Romain Attanasio) from fortinet.com's own DAM, matching the same fetch-and-inline pattern used for carousel-story-dots.svg and the cards-trust watermarks. Badge order/spacing verified against fortinet.com's real x-positions — the wordmark sits well apart from the sponsor-badge cluster after it (margin-right:auto on just that first item), not an equal gap between every badge. Tested by injecting the block's expected authored markup directly into the live footer and running decorate() on it (the real /footer content lives in a connected CMS document, not this repo, and drafts/ pages don't apply to header/footer — both load from that same real content path regardless of which page you're viewing). Verified at 390px and 1464px widths against fortinet.com directly. The actual footer document still needs this block's markup added to render on the live site — see the content draft shared separately for the exact authored content (badges, copyright, legal links, tagline, "Also of Interest") to paste in, plus how to invoke a "Footer Legal" block section. Co-Authored-By: Claude Sonnet 5 --- blocks/footer-legal/footer-legal.css | 109 +++++++++++++++++++++++++++ blocks/footer-legal/footer-legal.js | 69 +++++++++++++++++ icons/footer-badge-attanasio.jpg | Bin 0 -> 5902 bytes icons/footer-badge-barcelona.png | Bin 0 -> 1383 bytes icons/footer-badge-european-tour.png | Bin 0 -> 1918 bytes icons/footer-badge-founders-cup.png | Bin 0 -> 2469 bytes icons/footer-badge-juventus.png | Bin 0 -> 882 bytes icons/footer-badge-pga-americas.png | Bin 0 -> 2594 bytes icons/footer-logo.svg | 1 + 9 files changed, 179 insertions(+) create mode 100644 blocks/footer-legal/footer-legal.css create mode 100644 blocks/footer-legal/footer-legal.js create mode 100644 icons/footer-badge-attanasio.jpg create mode 100644 icons/footer-badge-barcelona.png create mode 100644 icons/footer-badge-european-tour.png create mode 100644 icons/footer-badge-founders-cup.png create mode 100644 icons/footer-badge-juventus.png create mode 100644 icons/footer-badge-pga-americas.png create mode 100644 icons/footer-logo.svg diff --git a/blocks/footer-legal/footer-legal.css b/blocks/footer-legal/footer-legal.css new file mode 100644 index 0000000..8800473 --- /dev/null +++ b/blocks/footer-legal/footer-legal.css @@ -0,0 +1,109 @@ +/* footer-legal — fortinet.com's second footer section (light gray), below + the main black footer: sponsor/partner badges, copyright, an extended + legal-links row, a tagline, and "Also of Interest" links. Measured + directly from fortinet.com's own .footer-row.copyrights. + + This block's own .section wrapper inherits the generic "footer .footer > + div" rule from footer.css (1240px max-width, centered, 48/24/32px + padding) — right for the black footer's columns, but this section is + full-bleed light gray on the source, not centered on white. Overridden + below via the auto-generated {blockname}-container class, with the same + 1240px centering re-applied one level in on .footer-legal itself instead. */ +footer .footer-legal-container { + max-width: none; + margin: 0; + padding: 0; + background-color: #e6e6e6; +} + +footer .footer-legal { + max-width: var(--content-max-width, 1240px); + margin: 0 auto; + padding: 30px 24px 24px; + color: #000; + font-size: 15px; +} + +footer .footer-legal > div { + margin: 0 0 20px; +} + +/* Sponsor/partner badge row */ +footer .footer-legal-badges ul { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 24px 32px; + margin: 0 0 30px; + padding: 0; + list-style: none; +} + +footer .footer-legal-badges li { + display: flex; + align-items: center; +} + +/* The wordmark (first badge) sits well apart from the sponsor-badge cluster + after it on the source (a ~200px gap vs ~15-30px between the sponsor + badges themselves) — margin-right:auto pushes just this one item away + from the rest, which then keep their own small shared gap from the ul + above, rather than every item getting the same wide gap. */ +footer .footer-legal-badges li:first-child { + margin-right: auto; +} + +/* Fortinet wordmark (first badge) renders noticeably larger than the + sponsor badges after it on the source (194x22 vs ~120x35) — img itself + carries the real aspect ratio, height just caps it to match. */ +footer .footer-legal-badges img { + display: block; + height: 35px; + width: auto; +} + +footer .footer-legal-badges li:first-child img { + height: 22px; +} + +footer .footer-legal-copyright { + margin-bottom: 12px; +} + +/* Legal links row — plain black text/links separated by literal " | " + typed in the source doc (matching the pipe-separated convention already + used for the "Terms of Services / Privacy Policy" line and elsewhere on + this page), not list markup — an author can add/remove links without + touching this block's code. */ +footer .footer-legal-links { + margin-bottom: 20px; +} + +footer .footer-legal-copyright, +footer .footer-legal-links, +footer .footer-legal-tagline { + color: #000; +} + +footer .footer-legal a { + color: #000; +} + +footer .footer-legal-tagline { + margin-bottom: 12px; + font-size: 13px; +} + +footer .footer-legal-also-of-interest { + font-size: 13px; + color: #555; +} + +footer .footer-legal-also-of-interest-label { + font-weight: 700; + margin-right: 4px; +} + +footer .footer-legal-also-of-interest a { + color: #555; +} diff --git a/blocks/footer-legal/footer-legal.js b/blocks/footer-legal/footer-legal.js new file mode 100644 index 0000000..e423382 --- /dev/null +++ b/blocks/footer-legal/footer-legal.js @@ -0,0 +1,69 @@ +import { moveInstrumentation } from '../../scripts/scripts.js'; + +/** + * fortinet.com's footer has a second, visually distinct section below the + * main black footer (light gray, .footer-row.copyrights on the source): + * a row of sponsorship badge images, a copyright line, an extended legal + * links row, a tagline, and an "Also of Interest" links row. Authored here + * as one row per part (in that order) rather than needing named markers — + * each row is classified by what it actually contains (images vs. text + * starting with "Copyright" vs. "Also of Interest" vs. a plain link row vs. + * plain text), so the author doesn't need to remember a rigid row order. + * @param {Element} block The footer-legal block element + */ +export default function decorate(block) { + [...block.children].forEach((row) => { + // Rows may be authored as a single cell (row > div > content) or with + // content directly in the row — flatten either into the row itself so + // classification below doesn't need to care which. + const cells = [...row.children]; + if (cells.length === 1 && cells[0].tagName === 'DIV') { + const cell = cells[0]; + moveInstrumentation(cell, row); + while (cell.firstElementChild) row.append(cell.firstElementChild); + cell.remove(); + } + + const text = row.textContent.trim(); + const images = row.querySelectorAll('picture, img'); + const links = row.querySelectorAll('a'); + + if (images.length && links.length) { + row.classList.add('footer-legal-badges'); + // Each linked badge becomes its own list item, for flex/gap layout + // and so screen readers announce a count ("list of 7 items") instead + // of a wall of unrelated links. + const ul = document.createElement('ul'); + row.querySelectorAll('p').forEach((p) => { + const li = document.createElement('li'); + moveInstrumentation(p, li); + while (p.firstChild) li.append(p.firstChild); + ul.append(li); + p.remove(); + }); + row.append(ul); + } else if (/^Copyright/i.test(text)) { + row.classList.add('footer-legal-copyright'); + } else if (/Also of Interest/i.test(text)) { + row.classList.add('footer-legal-also-of-interest'); + // Split the leading label ("Also of Interest:") from the links after + // it so each can be styled on its own — the label is bold/dimmer on + // the source, not just plain running text. + const firstNode = row.firstChild; + if (firstNode?.nodeType === Node.TEXT_NODE) { + const [label, ...rest] = firstNode.textContent.split(':'); + if (rest.length) { + const labelSpan = document.createElement('span'); + labelSpan.className = 'footer-legal-also-of-interest-label'; + labelSpan.textContent = `${label}:`; + firstNode.textContent = rest.join(':'); + row.prepend(labelSpan); + } + } + } else if (links.length >= 2) { + row.classList.add('footer-legal-links'); + } else { + row.classList.add('footer-legal-tagline'); + } + }); +} diff --git a/icons/footer-badge-attanasio.jpg b/icons/footer-badge-attanasio.jpg new file mode 100644 index 0000000000000000000000000000000000000000..18a950beda303109e5236b135dc256020d2d4e58 GIT binary patch literal 5902 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�t31{$waqgu3MaDnYG$Zd;C&m0{Y7FZe`+XRQcCgt_JZCECCG>NzvHy~ z*km!09Ewz?5ja^b#!NIN4B2WM9B=oxR2#DiNz?dcSRMmi5hR&Ak|jDcUlzQ{!*pe! zNXsQ}aaka z2nq#7Vc10wPYtKFz)~U%0y*XXSA?N3P(Lf46{AZljg4qKR2M|x3B6tvwMezH=|M&r5gB%G~tP=@z zU$-^970BriJx!#k$= zqxH@BP^DdifWvcJuWX0p-M#UtKADnB2Zz#0Jq@i&v0&fWFhuECT6eBxjE7Ar@OCds z&;lbByLfSvvXqou1^37wM>4{RKx2?>1t+C5HND{fRq#agC(hA=x7@|E1! zj$2TK#PS=feSpcRW^^guDupQ~^FE67I|!(3Zfk0pev@zR2~R(_SspEwde;?l|0z?{ zxpdAnCC#hJIU7i76;Ht7X#5p2W^u=<8R^UZ;W`QGkwjE?$N8f?7tD^X=tV`f%5&8v(V1=ZJxE3Xk7MWt(u!=l{0ppBQTm`;vX{Fjs~(FOBa z+Mk8_YS^NFa%tkz0fT(Iz&Zu>!?jp$lj}x$Ug1TMqE9LIPYRUc9v{vX&30UtZA&8b zRAxxzjb!Ox&ehX!bYmDQpqLlG@!|~P3rkJzeH<_ybjX=26lZzrBqvQOMj5NvS@>Wp zA708fd((1Tv=Tnl9I~~1eVhJy`s4Q4%CqSwfd<Bf+)&hNbNjFa5^G zY_!|17q^8s#F1(DuB6W>6_5zbAsqfpqp34Zt&DBYZ$pOXaolAkdyuLo>_UynxM|up z026gJaAD`5&DS;j3)C1@yx+JZWJmJBP~XG3U?lv%*=)Vi=kYErrYHo+}y2($A?s;os(J3OASZ#50D-!%Xb^p_xtYD z(zdqzg8&Zww}n~pz5_(9Y<SaW+QlW^!piDffyMB*Wyb_(Rt2oz^wvYOqjX24z+uhUq$7cRIt>h3n{vVuZ*eFG1 c%sRPr7WvRCb6M&Ta?%M5^-WN(b@37Z1NCoSb^rhX literal 0 HcmV?d00001 diff --git a/icons/footer-badge-founders-cup.png b/icons/footer-badge-founders-cup.png new file mode 100644 index 0000000000000000000000000000000000000000..128c37cc514d68291a961ea57cfb844736e77249 GIT binary patch literal 2469 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 P{Lh*iQ4A{#oTL5=+Mo;V literal 0 HcmV?d00001 diff --git a/icons/footer-badge-juventus.png b/icons/footer-badge-juventus.png new file mode 100644 index 0000000000000000000000000000000000000000..84175b0e6213770afe43de8e04e48c8bb9eb3c24 GIT binary patch literal 882 zcmeAS@N?(olHy`uVBq!ia0vp^Wk9UV!3<(q@udSPmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs1s;*b3=DinK$vl=HlH+5a7BPmh^u>n50D7~tZZx?92_hxEKoipBZR@s z%zRr_9LxrZv=$cL)0F};7#SIvm{^2_gn$ZwTs?7+8dg@;+v*ZP1``t#kc6;-DuL`f zDiRQL?&!+hRuKgX0>Ld!=|={NOiau`qd*p^N!(JGyrU|9M^pNirqnHU5s)D&qUi^( zHUU{?B|(0{3}05wQ<4-g*<5tHQG4l*qv@;?*-4Q+a$W4t^il$B&rN+d)z#$5FU7aj z9u9my3FfDABC1ODXPQdh2f9ko)5S3);_%z)okfcr1lneEHa9G4(B_g5oL1qQyvhCZ zzx-{s>~7w^kHS>8Zv7W}?a$>eA5O}wWw`T&UwiG@W!oon8Z2mw7pxASt$t@E^Mioo zIKl4t9#i%p*TWHO^UdGBQ=Scj(VTp{-?G_-f`s;Y^cLEZ&hKmWebYJJx*tRQ}Qj@zvg{R6kWYNGZg$!jPI zUetTEVS{kV$@L;(5!Q!WHnd6Ys@+t5X}kV`YvI=tCD^`1ayxTw>v^_gX;8cJL(#B% zvyZWUpYb;Dx9nZ-Yt!0(2O0W^cc;%(>TRCMVQoCIw&$r(c1i1x_{6CeCw7Wnn!M&} z^XG`Y+I|V?9~H0JAKJE5sY0f|{)9-TOo{7`12$IurNIk-uw2`~w{cc^Qtt72=DfD& zt3{T@-S#+hxblrl*ZzJ{_J)1+vu8b2{C54GU)?{6u+{(duAK^0%djdq_R9O9|KBb8 zR}QsVDoGf-nSZ$HP!g8IS(~bRtV#EBRG??#QR#?zf_^Gr1U?&=>i+0?w4=XQwkqsQ z=CvO=`lrrPv*meZ8LDD(bdE?xU;OLI-@k a>KV)$@+IaNh_nNf7lWs(pUXO@geCw81xZ){ literal 0 HcmV?d00001 diff --git a/icons/footer-badge-pga-americas.png b/icons/footer-badge-pga-americas.png new file mode 100644 index 0000000000000000000000000000000000000000..1699cd10559ab43937071b13413240139796cdc1 GIT binary patch literal 2594 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 Ef+PD0lK=n! literal 0 HcmV?d00001 diff --git a/icons/footer-logo.svg b/icons/footer-logo.svg new file mode 100644 index 0000000..16a16ec --- /dev/null +++ b/icons/footer-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file