Compare commits

...

2 Commits

Author SHA1 Message Date
72f0eab718 Script updates
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/deploy Pipeline was successful
2026-03-12 16:46:41 -03:00
beffd5f4e8 CSS and @font-face fixes 2026-03-12 16:31:58 -03:00
33 changed files with 133 additions and 91 deletions

View File

@@ -1,6 +1,6 @@
{ {
"name": "mifi-ventures-landing", "name": "mifi-ventures-landing",
"version": "4.0.1", "version": "4.0.2",
"private": true, "private": true,
"repository": "https://git.mifi.dev/mifi-ventures/landing.git", "repository": "https://git.mifi.dev/mifi-ventures/landing.git",
"packageManager": "pnpm@10.31.0+sha512.e3927388bfaa8078ceb79b748ffc1e8274e84d75163e67bc22e06c0d3aed43dd153151cbf11d7f8301ff4acb98c68bdc5cadf6989532801ffafe3b3e4a63c268", "packageManager": "pnpm@10.31.0+sha512.e3927388bfaa8078ceb79b748ffc1e8274e84d75163e67bc22e06c0d3aed43dd153151cbf11d7f8301ff4acb98c68bdc5cadf6989532801ffafe3b3e4a63c268",
@@ -12,11 +12,11 @@
"dev": "vite dev", "dev": "vite dev",
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
"format": "prettier --write \"src/**/*.{ts,js,svelte,css,json}\"", "format": "prettier --write \"src/**/*.{ts,js,svelte,css,json}\" \"static/**/*.{css,html,js}\"",
"lint": "eslint .", "lint": "eslint .",
"lint:fix": "eslint . --fix", "lint:fix": "eslint . --fix",
"lint:css": "stylelint \"src/**/*.css\" \"src/**/*.svelte\"", "lint:css": "stylelint \"src/**/*.css\" \"src/**/*.svelte\" \"static/**/*.css\"",
"lint:css:fix": "stylelint \"src/**/*.css\" \"src/**/*.svelte\" --fix", "lint:css:fix": "stylelint \"src/**/*.css\" \"src/**/*.svelte\" \"static/**/*.css\" --fix",
"preview": "serve dist -p 4173", "preview": "serve dist -p 4173",
"test": "vitest run", "test": "vitest run",
"test:unit": "vitest run", "test:unit": "vitest run",

View File

@@ -24,4 +24,5 @@ docker run --rm \
npx serve dist -p 4173 & npx serve dist -p 4173 &
sleep 2 sleep 2
pnpm exec playwright test pnpm exec playwright test
pnpm install --config.confirmModulesPurge=false
' '

View File

@@ -11,7 +11,9 @@ if [ -n "$CI" ]; then
fi fi
if command -v docker >/dev/null 2>&1; then if command -v docker >/dev/null 2>&1; then
exec bash "$(dirname "$0")/run-e2e-in-docker.sh" bash "$(dirname "$0")/run-e2e-in-docker.sh"
pnpm install --config.confirmModulesPurge=false
exit 0
fi fi
# No Docker: run in current environment (e.g. devcontainer; same image as CI) # No Docker: run in current environment (e.g. devcontainer; same image as CI)

View File

@@ -28,6 +28,7 @@ if command -v docker >/dev/null 2>&1; then
sleep 2 sleep 2
pnpm exec playwright test --update-snapshots pnpm exec playwright test --update-snapshots
' '
pnpm install --config.confirmModulesPurge=false
else else
echo "Updating snapshots in the current environment (matches CI when using the devcontainer)." echo "Updating snapshots in the current environment (matches CI when using the devcontainer)."
echo "" echo ""

View File

@@ -131,6 +131,42 @@
} }
} }
/* ========================================
Local Font Faces
======================================== */
@font-face {
font-family: Inter;
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('/assets/fonts/inter-v20-latin-regular.woff2') format('woff2');
}
@font-face {
font-family: Inter;
font-style: normal;
font-weight: 500;
font-display: swap;
src: url('/assets/fonts/inter-v20-latin-500.woff2') format('woff2');
}
@font-face {
font-family: Inter;
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('/assets/fonts/inter-v20-latin-700.woff2') format('woff2');
}
@font-face {
font-family: Fraunces;
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('/assets/fonts/fraunces-v38-latin-600.woff2') format('woff2');
}
/* ======================================== /* ========================================
Base Styles Base Styles
======================================== */ ======================================== */
@@ -178,6 +214,11 @@ body {
text-rendering: optimizeLegibility; text-rendering: optimizeLegibility;
} }
strong,
b {
font-weight: var(--font-weight-bold);
}
/* ======================================== /* ========================================
Skip Link (Accessibility) Skip Link (Accessibility)
======================================== */ ======================================== */

View File

@@ -47,13 +47,6 @@
type="font/woff2" type="font/woff2"
crossorigin="anonymous" crossorigin="anonymous"
/> />
<link
rel="preload"
href="/assets/fonts/fraunces-v38-latin-700.woff2"
as="font"
type="font/woff2"
crossorigin="anonymous"
/>
<link <link
rel="preload" rel="preload"
href="/assets/fonts/inter-v20-latin-regular.woff2" href="/assets/fonts/inter-v20-latin-regular.woff2"
@@ -61,13 +54,6 @@
type="font/woff2" type="font/woff2"
crossorigin="anonymous" crossorigin="anonymous"
/> />
<link
rel="preload"
href="/assets/fonts/inter-v20-latin-italic.woff2"
as="font"
type="font/woff2"
crossorigin="anonymous"
/>
<link <link
rel="preload" rel="preload"
href="/assets/fonts/inter-v20-latin-500.woff2" href="/assets/fonts/inter-v20-latin-500.woff2"
@@ -75,13 +61,6 @@
type="font/woff2" type="font/woff2"
crossorigin="anonymous" crossorigin="anonymous"
/> />
<link
rel="preload"
href="/assets/fonts/inter-v20-latin-600.woff2"
as="font"
type="font/woff2"
crossorigin="anonymous"
/>
<link <link
rel="preload" rel="preload"
href="/assets/fonts/inter-v20-latin-700.woff2" href="/assets/fonts/inter-v20-latin-700.woff2"

View File

@@ -50,7 +50,9 @@
<h2 id={`${section.id}-heading`}>{section.heading}</h2> <h2 id={`${section.id}-heading`}>{section.heading}</h2>
{#each section.body as para} {#each section.body as para}
<p> <p>
{#if section.id === 'contact' && para === 'legal@mifi.ventures'} {#if section.id === 'contact' && para === 'mifi Ventures LLC'}
<strong>{para}</strong>
{:else if section.id === 'contact' && para === 'legal@mifi.ventures'}
<a href="mailto:legal@mifi.ventures" <a href="mailto:legal@mifi.ventures"
>legal@mifi.ventures</a >legal@mifi.ventures</a
> >

View File

@@ -28,7 +28,9 @@
<h2 id={`${section.id}-heading`}>{section.heading}</h2> <h2 id={`${section.id}-heading`}>{section.heading}</h2>
{#each section.body as para} {#each section.body as para}
<p> <p>
{#if section.id === 'contact' && para === 'legal@mifi.ventures'} {#if section.id === 'contact' && para === 'mifi Ventures LLC'}
<strong>{para}</strong>
{:else if section.id === 'contact' && para === 'legal@mifi.ventures'}
<a href="mailto:legal@mifi.ventures" <a href="mailto:legal@mifi.ventures"
>legal@mifi.ventures</a >legal@mifi.ventures</a
> >

View File

@@ -1,20 +1,24 @@
<!DOCTYPE html> <!doctype html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1" />
<title>404 Not Found — mifi Ventures</title> <title>404 Not Found — mifi Ventures</title>
<meta name="theme-color" content="#0052cc" media="(prefers-color-scheme: light)"> <meta
<meta name="theme-color" content="#4da6ff" media="(prefers-color-scheme: dark)"> name="theme-color"
<link rel="icon" type="image/svg+xml" href="/favicon.svg"> content="#0052cc"
<link rel="stylesheet" href="/assets/error-pages.css"> media="(prefers-color-scheme: light)"
</head> />
<body class="error-page"> <meta name="theme-color" content="#4da6ff" media="(prefers-color-scheme: dark)" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="stylesheet" href="/assets/error-pages.css" />
</head>
<body class="error-page">
<main> <main>
<div class="emoji" aria-hidden="true">🔍</div> <div class="emoji" aria-hidden="true">🔍</div>
<h1>404 Not Found</h1> <h1>404 Not Found</h1>
<p>This page went off to find itself. Were not sure its coming back.</p> <p>This page went off to find itself. Were not sure its coming back.</p>
<p><a href="/">Back to mifi Ventures →</a></p> <p><a href="/">Back to mifi Ventures →</a></p>
</main> </main>
</body> </body>
</html> </html>

View File

@@ -1,20 +1,24 @@
<!DOCTYPE html> <!doctype html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1" />
<title>410 Gone — mifi Ventures</title> <title>410 Gone — mifi Ventures</title>
<meta name="theme-color" content="#0052cc" media="(prefers-color-scheme: light)"> <meta
<meta name="theme-color" content="#4da6ff" media="(prefers-color-scheme: dark)"> name="theme-color"
<link rel="icon" type="image/svg+xml" href="/favicon.svg"> content="#0052cc"
<link rel="stylesheet" href="/assets/error-pages.css"> media="(prefers-color-scheme: light)"
</head> />
<body class="error-page"> <meta name="theme-color" content="#4da6ff" media="(prefers-color-scheme: dark)" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="stylesheet" href="/assets/error-pages.css" />
</head>
<body class="error-page">
<main> <main>
<div class="emoji" aria-hidden="true">👋</div> <div class="emoji" aria-hidden="true">👋</div>
<h1>410 Gone</h1> <h1>410 Gone</h1>
<p>This page has left the building. Weve moved on—and so should you.</p> <p>This page has left the building. Weve moved on—and so should you.</p>
<p><a href="/">Back to mifi Ventures →</a></p> <p><a href="/">Back to mifi Ventures →</a></p>
</main> </main>
</body> </body>
</html> </html>

View File

@@ -32,22 +32,33 @@
} }
/* Local fonts — same paths as +layout.svelte preloads */ /* Local fonts — same paths as +layout.svelte preloads */
@font-face { @font-face {
font-family: 'Inter'; font-family: Inter;
font-style: normal; font-style: normal;
font-weight: 400; font-weight: 400;
font-display: swap; font-display: swap;
src: url('/assets/fonts/inter-v20-latin-regular.woff2') format('woff2'); src: url('/assets/fonts/inter-v20-latin-regular.woff2') format('woff2');
} }
@font-face { @font-face {
font-family: 'Inter'; font-family: Inter;
font-style: normal; font-style: normal;
font-weight: 500; font-weight: 500;
font-display: swap; font-display: swap;
src: url('/assets/fonts/inter-v20-latin-500.woff2') format('woff2'); src: url('/assets/fonts/inter-v20-latin-500.woff2') format('woff2');
} }
@font-face { @font-face {
font-family: 'Fraunces'; font-family: Inter;
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('/assets/fonts/inter-v20-latin-700.woff2') format('woff2');
}
@font-face {
font-family: Fraunces;
font-style: normal; font-style: normal;
font-weight: 600; font-weight: 600;
font-display: swap; font-display: swap;
@@ -67,15 +78,18 @@
color: var(--ep-text); color: var(--ep-text);
background-color: var(--ep-bg-alt); background-color: var(--ep-bg-alt);
} }
.error-page main { .error-page main {
text-align: center; text-align: center;
padding: 2rem 1.5rem; padding: 2rem 1.5rem;
max-width: 28rem; max-width: 28rem;
} }
.error-page .emoji { .error-page .emoji {
font-size: 4rem; font-size: 4rem;
margin-bottom: 0.5rem; margin-bottom: 0.5rem;
} }
.error-page h1 { .error-page h1 {
font-family: var(--ep-font-heading); font-family: var(--ep-font-heading);
font-size: 2rem; font-size: 2rem;
@@ -83,19 +97,23 @@
margin: 0 0 0.75rem; margin: 0 0 0.75rem;
color: var(--ep-text); color: var(--ep-text);
} }
.error-page p { .error-page p {
margin: 0 0 1.5rem; margin: 0 0 1.5rem;
color: var(--ep-text-secondary); color: var(--ep-text-secondary);
} }
.error-page a { .error-page a {
color: var(--ep-primary); color: var(--ep-primary);
font-weight: 500; font-weight: 500;
text-decoration: none; text-decoration: none;
} }
.error-page a:hover { .error-page a:hover {
color: var(--ep-primary-hover); color: var(--ep-primary-hover);
text-decoration: underline; text-decoration: underline;
} }
.error-page a:focus-visible { .error-page a:focus-visible {
outline: 2px solid var(--ep-primary); outline: 2px solid var(--ep-primary);
outline-offset: 2px; outline-offset: 2px;

View File

@@ -69,10 +69,7 @@
try { try {
var clarityScript = document.createElement('script'); var clarityScript = document.createElement('script');
clarityScript.defer = true; clarityScript.defer = true;
setScriptSrc( setScriptSrc(clarityScript, 'https://www.clarity.ms/tag/vuo5q3yf79?ref=bwt');
clarityScript,
'https://www.clarity.ms/tag/vuo5q3yf79?ref=bwt',
);
document.head.appendChild(clarityScript); document.head.appendChild(clarityScript);
} catch (e2) { } catch (e2) {
console.error('Failed to load Microsoft Clarity', e2); console.error('Failed to load Microsoft Clarity', e2);
@@ -142,4 +139,3 @@
init(); init();
} }
})(); })();

View File

@@ -1,8 +1,10 @@
window.dataLayer = window.dataLayer || []; window.dataLayer = window.dataLayer || [];
function gtag(){ window.dataLayer.push(arguments); } function gtag() {
window.dataLayer.push(arguments);
}
gtag("js", new Date()); gtag('js', new Date());
gtag("config", "G-36F29PDKRT", { gtag('config', 'G-36F29PDKRT', {
// optional, but often helpful: // optional, but often helpful:
anonymize_ip: true, anonymize_ip: true,
}); });

View File

@@ -1,8 +1,7 @@
const MOBILE_BREAKPOINT_PX = 768; const MOBILE_BREAKPOINT_PX = 768;
/** All focusable elements inside the menu (links). */ /** All focusable elements inside the menu (links). */
const getMenuFocusables = (menu) => const getMenuFocusables = (menu) => menu.querySelectorAll('a[href]');
menu.querySelectorAll('a[href]');
const mobileMenuHelper = () => { const mobileMenuHelper = () => {
const mobileMenu = document.getElementById('nav-menu'); const mobileMenu = document.getElementById('nav-menu');
@@ -15,10 +14,7 @@ const mobileMenuHelper = () => {
const syncMenuAriaHidden = () => { const syncMenuAriaHidden = () => {
if (isMobile()) { if (isMobile()) {
const hidden = !mobileMenuToggle.checked; const hidden = !mobileMenuToggle.checked;
mobileMenu.setAttribute( mobileMenu.setAttribute('aria-hidden', hidden ? 'true' : 'false');
'aria-hidden',
hidden ? 'true' : 'false',
);
// inert removes the subtree from the a11y tree and makes descendants non-focusable // inert removes the subtree from the a11y tree and makes descendants non-focusable
if (hidden) { if (hidden) {
mobileMenu.setAttribute('inert', ''); mobileMenu.setAttribute('inert', '');

View File

@@ -1,9 +1,6 @@
// Umami: safe track (no-op if script blocked or not loaded) // Umami: safe track (no-op if script blocked or not loaded)
function umamiTrack(name, data) { function umamiTrack(name, data) {
if ( if (typeof window.umami !== 'undefined' && typeof window.umami.track === 'function') {
typeof window.umami !== 'undefined' &&
typeof window.umami.track === 'function'
) {
if (data != null) window.umami.track(name, data); if (data != null) window.umami.track(name, data);
else window.umami.track(name); else window.umami.track(name);
} }

View File

@@ -39,7 +39,6 @@ describe('cookie-consent.js', () => {
dom = createBannerDOM(); dom = createBannerDOM();
const code = readFileSync(SCRIPT_PATH, 'utf8'); const code = readFileSync(SCRIPT_PATH, 'utf8');
// eslint-disable-next-line no-eval
eval(code); eval(code);
document.dispatchEvent(new Event('DOMContentLoaded')); document.dispatchEvent(new Event('DOMContentLoaded'));
}); });
@@ -62,7 +61,6 @@ describe('cookie-consent.js', () => {
const appendChildSpy = vi.spyOn(document.head, 'appendChild'); const appendChildSpy = vi.spyOn(document.head, 'appendChild');
const code = readFileSync(SCRIPT_PATH, 'utf8'); const code = readFileSync(SCRIPT_PATH, 'utf8');
// eslint-disable-next-line no-eval
eval(code); eval(code);
document.dispatchEvent(new Event('DOMContentLoaded')); document.dispatchEvent(new Event('DOMContentLoaded'));
@@ -82,7 +80,6 @@ describe('cookie-consent.js', () => {
const appendChildSpy = vi.spyOn(document.head, 'appendChild'); const appendChildSpy = vi.spyOn(document.head, 'appendChild');
const code = readFileSync(SCRIPT_PATH, 'utf8'); const code = readFileSync(SCRIPT_PATH, 'utf8');
// eslint-disable-next-line no-eval
eval(code); eval(code);
document.dispatchEvent(new Event('DOMContentLoaded')); document.dispatchEvent(new Event('DOMContentLoaded'));

Binary file not shown.

Before

Width:  |  Height:  |  Size: 554 KiB

After

Width:  |  Height:  |  Size: 419 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 571 KiB

After

Width:  |  Height:  |  Size: 609 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 784 KiB

After

Width:  |  Height:  |  Size: 565 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 801 KiB

After

Width:  |  Height:  |  Size: 844 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 397 KiB

After

Width:  |  Height:  |  Size: 296 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 398 KiB

After

Width:  |  Height:  |  Size: 429 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 805 KiB

After

Width:  |  Height:  |  Size: 582 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 817 KiB

After

Width:  |  Height:  |  Size: 871 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 927 KiB

After

Width:  |  Height:  |  Size: 680 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 941 KiB

After

Width:  |  Height:  |  Size: 1009 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 703 KiB

After

Width:  |  Height:  |  Size: 543 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 695 KiB

After

Width:  |  Height:  |  Size: 746 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 886 KiB

After

Width:  |  Height:  |  Size: 632 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 891 KiB

After

Width:  |  Height:  |  Size: 960 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 494 KiB

After

Width:  |  Height:  |  Size: 357 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 506 KiB

After

Width:  |  Height:  |  Size: 532 KiB