diff --git a/src/app/globals.css b/src/app/globals.css index 366502e..c9ec0ec 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -901,7 +901,9 @@ body { width falls below 1536px). Match the home breakpoint instead. */ @media (max-width: 840px) { .custom-standard-hero-container { - padding: 10px 10px 10px 10px !important; + /* No top gap on mobile: the hero card sits flush to the top so the floating + navbar rests directly on the hero instead of leaving a band above it. */ + padding: 0 10px 10px 10px !important; } .custom-standard-hero-card { height: 600px !important; @@ -910,3 +912,22 @@ body { } } +/* Consistent flush hero across every page on mobile/tablet — the floating navbar + (position:absolute; top:5px) should rest directly on the hero with no band + above it. Home / How It Works / Solutions share .elementor-element-741f56c; + MileTruth uses .miletruth-hero-container. (About / Contact / Blog already use + .custom-standard-hero-container, handled above.) */ +@media (max-width: 1024px) { + /* The e-con applies top padding via the --padding-top / --padding-block-start + vars (site.css sets them to 10px at a higher specificity), so override the + vars — not just padding-top — to actually zero the gap. */ + .elementor-element.elementor-element-741f56c { + --padding-top: 0px !important; + --padding-block-start: 0px !important; + padding-top: 0 !important; + } + .miletruth-hero-container { + margin-top: 0 !important; + } +} + diff --git a/src/components/layout/Footer.tsx b/src/components/layout/Footer.tsx index a073a4b..63ba852 100644 --- a/src/components/layout/Footer.tsx +++ b/src/components/layout/Footer.tsx @@ -130,7 +130,12 @@ export default function Footer() {
-
Call Center
+
+ + Call Center +
@@ -142,7 +147,13 @@ export default function Footer() {
-
Our Location
+
+ + Our Location +
@@ -158,7 +169,13 @@ export default function Footer() {
-
Email
+
+ + Email +
@@ -172,7 +189,16 @@ export default function Footer() {
-
Social network
+
+ + Social network +
@@ -521,6 +547,97 @@ export default function Footer() { width: 25px; height: 25px; } + + /* Compact footer link columns on phones (<=480px). The kit only sets + column --width at min-width:481px, so below that all four blocks + fall back to 100% and stack into one very tall column. Put the + logo+social full-width on top, then lay the three link groups out + in a 2-up grid (matching the tablet 47% intent) so the footer is + roughly half as tall. */ + /* Inline icon beside each contact label (Call Center / Our Location / + Email / Social network). */ + .elementor-6585 .dm-foot-label { + display: inline-flex !important; + align-items: center; + gap: 8px; + } + .elementor-6585 .dm-foot-label .dm-foot-ic { + flex: 0 0 auto; + color: #C01227; + } + + /* ── Compact mobile contact footer (<=600px) ── + On phones the upper contact section stacked into one very tall + column with 50px margins between every block. Tighten the heading, + collapse those stack margins, and pair Email + Social side-by-side + (both are short) so the footer is far shorter without losing the + full-width address readability. */ + @media (max-width: 600px) { + /* Trim the band's oversized top/bottom padding on phones. */ + .elementor-6585 .elementor-element.elementor-element-b29b8fc > .e-con-inner { + padding-top: 40px !important; + padding-bottom: 40px !important; + } + .elementor-6585 .elementor-element.elementor-element-687d944 .logico-title { + font-size: clamp(24px, 6.6vw, 32px) !important; + line-height: 1.2 !important; + } + .elementor-6585 .dm-foot-label .dm-foot-ic { width: 14px; height: 14px; } + /* The Call Center / Our Location group carries a 10px side padding + the Email / Social group doesn't, leaving its labels indented + 10px out of line with everything else — zero it so all four + contact blocks share the same left edge as the heading. */ + .elementor-6585 .elementor-element.elementor-element-2631b42 { + padding-left: 0 !important; + padding-right: 0 !important; + } + /* All four contact blocks stack in one left-aligned column with a + consistent gap (Social network sits below Email). */ + .elementor-6585 .elementor-element.elementor-element-2631b42, + .elementor-6585 .elementor-element.elementor-element-f5d8e63, + .elementor-6585 .elementor-element.elementor-element-645be8d, + .elementor-6585 .elementor-element.elementor-element-9ba4b82 { + margin-top: 22px !important; + } + .elementor-6585 .elementor-element.elementor-element-645be8d > .e-con-inner { + flex-direction: column !important; + gap: 0 !important; + align-items: stretch !important; + } + .elementor-6585 .elementor-element.elementor-element-a96d151, + .elementor-6585 .elementor-element.elementor-element-9ba4b82 { + width: 100% !important; + } + } + + @media (max-width: 480px) { + .elementor-6585 .elementor-element.elementor-element-3f1ba7a { + display: flex !important; + flex-direction: row !important; + flex-wrap: wrap !important; + gap: 36px 16px !important; + } + .elementor-6585 .elementor-element.elementor-element-64e2e81 { + flex: 0 0 100% !important; + width: 100% !important; + } + .elementor-6585 .elementor-element.elementor-element-5b73dd3, + .elementor-6585 .elementor-element.elementor-element-451f15c, + .elementor-6585 .elementor-element.elementor-element-44a1f5d { + flex: 1 1 calc(50% - 8px) !important; + width: calc(50% - 8px) !important; + min-width: 0 !important; + } + /* Allow long links (e.g. "Women entrepreneurship") to wrap inside + the narrow columns instead of overflowing. */ + .elementor-6585 .logico-custom-menu-widget li a { + white-space: normal !important; + } + /* Trim the large social-icons top gap so the brand block stays tight. */ + .elementor-6585 .elementor-element.elementor-element-e4e6486 > .elementor-widget-container { + margin-top: 24px !important; + } + } `, }} /> diff --git a/src/components/layout/Header.tsx b/src/components/layout/Header.tsx index adbd3e9..f8c21f7 100644 --- a/src/components/layout/Header.tsx +++ b/src/components/layout/Header.tsx @@ -550,6 +550,17 @@ export default function Header() { #masthead .menu-trigger { display: block !important; } + + /* Sticky header on scroll for mobile/tablet too — the desktop + rule lived only in the min-width:1025px block, so on phones the + absolutely-positioned navbar scrolled away with the page. Pin it + to the top once scrolled past 50px, matching desktop behaviour. */ + #masthead .elementor-element.elementor-element-466de1b.dm-header-scrolled { + position: fixed !important; + top: 0 !important; + left: 0 !important; + right: 0 !important; + } } @media (max-width: 480px) { @@ -571,6 +582,34 @@ export default function Header() { display: block !important; } } + + /* The bundled 'fontello' subset is missing the search (\\e85c) and + close (\\e845) glyphs, so those two icons render as empty tofu + boxes. Replace them with inline SVGs via CSS masks so they paint + in the current text colour (matching the working cart/user icons) + and respond to hover. */ + #masthead .header-icon.search-link .search-trigger-icon::before, + #masthead .header-icon.menu-close .menu-close-icon::before { + content: "" !important; + display: block; + width: 1em; + height: 1em; + background-color: currentColor; + -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-position: center; + -webkit-mask-size: contain; + mask-size: contain; + } + #masthead .header-icon.search-link .search-trigger-icon::before { + -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round'%3E%3Ccircle cx='11' cy='11' r='7'/%3E%3Cline x1='16.5' y1='16.5' x2='21' y2='21'/%3E%3C/svg%3E"); + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round'%3E%3Ccircle cx='11' cy='11' r='7'/%3E%3Cline x1='16.5' y1='16.5' x2='21' y2='21'/%3E%3C/svg%3E"); + } + #masthead .header-icon.menu-close .menu-close-icon::before { + -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round'%3E%3Cline x1='5' y1='5' x2='19' y2='19'/%3E%3Cline x1='19' y1='5' x2='5' y2='19'/%3E%3C/svg%3E"); + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round'%3E%3Cline x1='5' y1='5' x2='19' y2='19'/%3E%3Cline x1='19' y1='5' x2='5' y2='19'/%3E%3C/svg%3E"); + } `, }} /> diff --git a/src/components/layout/LoadingScreen.tsx b/src/components/layout/LoadingScreen.tsx index c5e018c..78dd48a 100644 --- a/src/components/layout/LoadingScreen.tsx +++ b/src/components/layout/LoadingScreen.tsx @@ -79,11 +79,10 @@ export default function LoadingScreen() { Doormile
@@ -100,8 +99,8 @@ export default function LoadingScreen() { will-change: opacity; } .dm-loader.is-hiding { opacity: 0; pointer-events: none; } - .dm-loader__pulse { animation: dmLoaderPulse 1.5s linear infinite; } - .dm-loader__logo { width: clamp(140px, 18vw, 200px); height: auto; } + .dm-loader__pulse { animation: dmLoaderPulse 1.5s linear infinite; display: grid; place-items: center; } + .dm-loader__logo { display: block; margin: 0 auto; width: clamp(120px, 32vw, 180px); height: auto; } @keyframes dmLoaderPulse { 50% { transform: scale(0.85); } 100% { transform: scale(1); } diff --git a/src/components/optimization/OptimizationSection.tsx b/src/components/optimization/OptimizationSection.tsx index 0d96b38..f4724e9 100644 --- a/src/components/optimization/OptimizationSection.tsx +++ b/src/components/optimization/OptimizationSection.tsx @@ -1011,7 +1011,9 @@ const styles = ` .dm-opt-mobile { position: relative; - margin: 0 10px; + /* Top gap separates this card from the hero stats bar above; sides stay 10px + and bottom stays flush so the Performance card butts against it below. */ + margin: 16px 10px 0; padding: 24px 13px 22px; display: flex; flex-direction: column; diff --git a/src/components/sections/CompetitiveEdge.tsx b/src/components/sections/CompetitiveEdge.tsx index 706a109..ead04e8 100644 --- a/src/components/sections/CompetitiveEdge.tsx +++ b/src/components/sections/CompetitiveEdge.tsx @@ -498,26 +498,79 @@ export default function CompetitiveEdge() { .moat-heading { font-size: 1.8rem; } + } - /* Capability Matrix table gains responsive horizontal swipe scrolls */ + /* On phones the 5-column table can't fit, so transform each row into a + stacked card: capability as the card title, then one "label: value" + line per competitor. Column labels are injected via nth-of-type so no + markup changes are needed (every row has the same column order). */ + @media (max-width: 600px) { .table-wrapper { - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; + background: transparent; + border: none; + box-shadow: none; + border-radius: 0; + overflow: visible; } - - .comparison-table { - min-width: 720px; /* Forces optimal reading width swipe trail */ + .comparison-table { min-width: 0; width: 100%; } + .comparison-table thead { display: none; } + .comparison-table tbody, + .comparison-table tr, + .comparison-table td { display: block; width: auto; } + + .comparison-table tr { + background: #ffffff; + border: 1px solid rgba(0,0,0,0.07); + border-radius: 16px; + padding: 6px 16px 8px; + margin-bottom: 14px; + box-shadow: 0 8px 24px rgba(0,0,0,0.04); } - .comparison-table th, - .comparison-table td { - padding: 16px 18px; - font-size: 0.9rem; + /* Capability = card title (icon + name), no label */ + .comparison-table td.capability-cell { + display: flex; + justify-content: flex-start; + gap: 12px; + font-size: 1.02rem; + padding: 12px 0 12px; + border-bottom: 1.5px solid #eef0f4; + margin-bottom: 4px; } - .capability-cell { - font-size: 0.98rem; + /* Value cells = "Label .... value" rows */ + .comparison-table td:not(.capability-cell) { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + padding: 10px 0; + border-bottom: 1px solid #f4f5f7; + font-size: 0.95rem; + text-align: right; + } + .comparison-table tr td:last-child { border-bottom: none; } + + .comparison-table td.col-highlight::before { content: "Doormile"; } + .comparison-table td:nth-of-type(3)::before { content: "Aggregators"; } + .comparison-table td:nth-of-type(4)::before { content: "Local Couriers"; } + .comparison-table td:nth-of-type(5)::before { content: "Software Platforms"; } + .comparison-table td:not(.capability-cell)::before { + font-weight: 700; + font-size: 0.72rem; + letter-spacing: 0.05em; + text-transform: uppercase; + color: #8a8f9d; + flex: 0 0 auto; + } + + /* Neutralise the desktop highlight column styling inside the card */ + .comparison-table td.col-highlight { + background: transparent !important; + border-left: none; + border-right: none; + animation: none !important; + color: inherit !important; } } `}} /> diff --git a/src/components/sections/ContactsHero.tsx b/src/components/sections/ContactsHero.tsx index c2f4120..0a0942f 100644 --- a/src/components/sections/ContactsHero.tsx +++ b/src/components/sections/ContactsHero.tsx @@ -7,7 +7,7 @@ export default function ContactsHero() {