Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
66640fa535
|
|||
|
5e0e211f80
|
|||
|
d66e9f7cb8
|
|||
|
39ba54e254
|
|||
|
56b5740393
|
|||
|
3a94a50def
|
|||
|
1349488827
|
@@ -3,7 +3,7 @@
|
|||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"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.29.3+sha512.498e1fb4cca5aa06c1dcf2611e6fafc50972ffe7189998c409e90de74566444298ffe43e6cd2acdc775ba1aa7cc5e092a8b7054c811ba8c5770f84693d33d2dc",
|
"packageManager": "pnpm@10.30.0+sha512.2b5753de015d480eeb88f5b5b61e0051f05b4301808a82ec8b840c9d2adf7748eb352c83f5c1593ca703ff1017295bc3fdd3119abb9686efc96b9fcb18200937",
|
||||||
"description": "mifi Ventures landing site — SvelteKit static build with critical CSS inlining",
|
"description": "mifi Ventures landing site — SvelteKit static build with critical CSS inlining",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ set -e
|
|||||||
SCRIPT_DIR="${BASH_SOURCE%/*}"
|
SCRIPT_DIR="${BASH_SOURCE%/*}"
|
||||||
PROJECT_ROOT="${SCRIPT_DIR}/.."
|
PROJECT_ROOT="${SCRIPT_DIR}/.."
|
||||||
cd "$PROJECT_ROOT"
|
cd "$PROJECT_ROOT"
|
||||||
|
PROJECT_ROOT="$(pwd)"
|
||||||
|
|
||||||
if command -v docker >/dev/null 2>&1; then
|
if command -v docker >/dev/null 2>&1; then
|
||||||
PLAYWRIGHT_IMAGE="${PLAYWRIGHT_IMAGE:-mcr.microsoft.com/playwright:v1.58.0-noble}"
|
PLAYWRIGHT_IMAGE="${PLAYWRIGHT_IMAGE:-mcr.microsoft.com/playwright:v1.58.0-noble}"
|
||||||
|
|||||||
@@ -16,6 +16,8 @@
|
|||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
aria-label="LinkedIn profile (opens in new tab)"
|
aria-label="LinkedIn profile (opens in new tab)"
|
||||||
|
data-umami-event="footer link"
|
||||||
|
data-umami-event-label="linkedin"
|
||||||
>
|
>
|
||||||
<LinkedInIcon size={15} />
|
<LinkedInIcon size={15} />
|
||||||
LinkedIn
|
LinkedIn
|
||||||
@@ -27,6 +29,8 @@
|
|||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
aria-label="GitHub profile (opens in new tab)"
|
aria-label="GitHub profile (opens in new tab)"
|
||||||
|
data-umami-event="footer link"
|
||||||
|
data-umami-event-label="github"
|
||||||
>
|
>
|
||||||
<GithubIcon size={15} />
|
<GithubIcon size={15} />
|
||||||
GitHub
|
GitHub
|
||||||
|
|||||||
@@ -19,6 +19,8 @@
|
|||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
aria-label="Schedule a 30-minute intro call (opens in new tab)"
|
aria-label="Schedule a 30-minute intro call (opens in new tab)"
|
||||||
|
data-umami-event="schedule call"
|
||||||
|
data-umami-event-location="hero section"
|
||||||
>
|
>
|
||||||
Schedule a 30-minute intro call
|
Schedule a 30-minute intro call
|
||||||
<ExternalLinkIcon aria-label="Opens in new tab" size={17} />
|
<ExternalLinkIcon aria-label="Opens in new tab" size={17} />
|
||||||
@@ -28,6 +30,8 @@
|
|||||||
class="btn btn-secondary icon-button"
|
class="btn btn-secondary icon-button"
|
||||||
download
|
download
|
||||||
aria-label="Download Mike Fitzpatrick's resume as PDF"
|
aria-label="Download Mike Fitzpatrick's resume as PDF"
|
||||||
|
data-umami-event="download resume"
|
||||||
|
data-umami-event-location="hero section"
|
||||||
>
|
>
|
||||||
Download resume
|
Download resume
|
||||||
<FiletypePdfIcon aria-label="PDF format file" size={17} />
|
<FiletypePdfIcon aria-label="PDF format file" size={17} />
|
||||||
|
|||||||
@@ -42,20 +42,45 @@
|
|||||||
</span>
|
</span>
|
||||||
<ul class="nav-list">
|
<ul class="nav-list">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="#what-we-do" class="nav-link">Services</a>
|
<a
|
||||||
|
href="#what-we-do"
|
||||||
|
class="nav-link"
|
||||||
|
data-umami-event="navigation"
|
||||||
|
data-umami-event-label="services">Services</a
|
||||||
|
>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="#impact" class="nav-link">Impact</a>
|
<a
|
||||||
|
href="#impact"
|
||||||
|
class="nav-link"
|
||||||
|
data-umami-event="navigation"
|
||||||
|
data-umami-event-label="impact">Impact</a
|
||||||
|
>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="#how-we-work" class="nav-link">Process</a>
|
<a
|
||||||
|
href="#how-we-work"
|
||||||
|
class="nav-link"
|
||||||
|
data-umami-event="navigation"
|
||||||
|
data-umami-event-label="process">Process</a
|
||||||
|
>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="#schedule" class="nav-link">Contact</a>
|
<a
|
||||||
|
href="#schedule"
|
||||||
|
class="nav-link"
|
||||||
|
data-umami-event="navigation"
|
||||||
|
data-umami-event-label="contact">Contact</a
|
||||||
|
>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="nav-item nav-back-to-top">
|
<div class="nav-item nav-back-to-top">
|
||||||
<a href="#header" class="nav-link">Back to top</a>
|
<a
|
||||||
|
href="#header"
|
||||||
|
class="nav-link"
|
||||||
|
data-umami-event="navigation"
|
||||||
|
data-umami-event-label="back to top">Back to top</a
|
||||||
|
>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
|
|||||||
@@ -16,6 +16,8 @@
|
|||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
aria-label="Schedule a 30-minute intro call (opens in new tab)"
|
aria-label="Schedule a 30-minute intro call (opens in new tab)"
|
||||||
|
data-umami-event="schedule call"
|
||||||
|
data-umami-event-location="schedule section"
|
||||||
>
|
>
|
||||||
Schedule a 30-minute intro call
|
Schedule a 30-minute intro call
|
||||||
<ExternalLinkIcon aria-label="Opens in new tab" size={17} />
|
<ExternalLinkIcon aria-label="Opens in new tab" size={17} />
|
||||||
|
|||||||
@@ -30,6 +30,12 @@
|
|||||||
<!-- Google tag (gtag.js) -->
|
<!-- Google tag (gtag.js) -->
|
||||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-36F29PDKRT"></script>
|
<script async src="https://www.googletagmanager.com/gtag/js?id=G-36F29PDKRT"></script>
|
||||||
<script defer src="/assets/js/ga-init.js"></script>
|
<script defer src="/assets/js/ga-init.js"></script>
|
||||||
|
<script
|
||||||
|
defer
|
||||||
|
src="https://analytics.mifi.holdings/script.js"
|
||||||
|
data-website-id="72ac01ce-e7fc-4582-8593-703f15add8d5"
|
||||||
|
></script>
|
||||||
|
<script defer src="/assets/js/umami-helper.js"></script>
|
||||||
|
|
||||||
<title>{merged.title}</title>
|
<title>{merged.title}</title>
|
||||||
<meta name="description" content={merged.description ?? ''} />
|
<meta name="description" content={merged.description ?? ''} />
|
||||||
@@ -143,5 +149,15 @@
|
|||||||
<script src="/assets/js/mobile-menu-helper.js" defer></script>
|
<script src="/assets/js/mobile-menu-helper.js" defer></script>
|
||||||
</svelte:head>
|
</svelte:head>
|
||||||
|
|
||||||
<a href="#main" class="skip-link">Skip to main content</a>
|
<a href="#main" class="skip-link" data-umami-event="skip to main content"
|
||||||
|
>Skip to main content</a
|
||||||
|
>
|
||||||
{@render children()}
|
{@render children()}
|
||||||
|
<img
|
||||||
|
src="https://analytics.mifi.holdings/p/wQ9GYnLIg"
|
||||||
|
alt=""
|
||||||
|
width="1"
|
||||||
|
height="1"
|
||||||
|
role="presentation"
|
||||||
|
loading="eager"
|
||||||
|
/>
|
||||||
|
|||||||
28
static/assets/js/umami-helper.js
Normal file
28
static/assets/js/umami-helper.js
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
// Umami: safe track (no-op if script blocked or not loaded)
|
||||||
|
function umamiTrack(name, data) {
|
||||||
|
if (
|
||||||
|
typeof window.umami !== 'undefined' &&
|
||||||
|
typeof window.umami.track === 'function'
|
||||||
|
) {
|
||||||
|
if (data != null) window.umami.track(name, data);
|
||||||
|
else window.umami.track(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Umami: scroll depth (25%, 50%, 75%, 100%) – once per milestone
|
||||||
|
const scrollMilestones = new Set();
|
||||||
|
function onScroll() {
|
||||||
|
const doc = document.documentElement;
|
||||||
|
const scrollTop = doc.scrollTop || document.body.scrollTop;
|
||||||
|
const scrollHeight =
|
||||||
|
(doc.scrollHeight || document.body.scrollHeight) - window.innerHeight;
|
||||||
|
if (scrollHeight <= 0) return;
|
||||||
|
const pct = Math.round((scrollTop / scrollHeight) * 100);
|
||||||
|
for (const m of [25, 50, 75, 100]) {
|
||||||
|
if (pct >= m && !scrollMilestones.has(m)) {
|
||||||
|
scrollMilestones.add(m);
|
||||||
|
umamiTrack('scroll-depth', { depth: String(m) });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
window.addEventListener('scroll', onScroll, { passive: true });
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 577 KiB After Width: | Height: | Size: 577 KiB |
Reference in New Issue
Block a user