PageSourceSearch

https://codehouse.pk/portfolio/

html codehouse.pk collected 2026-10-08 17:38:16 UTC 22,618 bytes, 231 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en" data-theme="dark">
3<head>
4<meta charset="utf-8">
5<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
6<title>Portfolio — Shopify Themes & Stores by Codehouse, Pakistan</title>
7<meta name="description" content="See Shopify themes, store designs, apps, checkout, cart and ERP projects built by Codehouse — a Shopify studio in Karachi, Pakistan.">
8<link rel="canonical" href="https://codehouse.pk/portfolio/">
9<meta property="og:title" content="Portfolio — Shopify Themes & Stores by Codehouse, Pakistan">
10<meta property="og:description" content="See Shopify themes, store designs, apps, checkout, cart and ERP projects built by Codehouse — a Shopify studio in Karachi, Pakistan.">
11<meta property="og:url" content="https://codehouse.pk/portfolio/">
12<meta property="og:type" content="website">
13<meta name="twitter:title" content="Portfolio — Shopify Themes & Stores by Codehouse, Pakistan">
14<meta name="twitter:description" content="See Shopify themes, store designs, apps, checkout, cart and ERP projects built by Codehouse — a Shopify studio in Karachi, Pakistan.">
15<link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
16<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">
17<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1">
18<meta name="theme-color" content="#0a0a14">
19<meta name="author" content="Codehouse">
20<meta property="og:site_name" content="Codehouse">
21<meta property="og:locale" content="en_US">
22<meta property="og:image" content="https://codehouse.pk/assets/og-image.jpg">
23<meta property="og:image:width" content="1200">
24<meta property="og:image:height" content="630">
25<meta property="og:image:alt" content="Codehouse — Shopify experts and custom development, Karachi, Pakistan">
26<meta name="twitter:card" content="summary_large_image">
27<meta name="twitter:image" content="https://codehouse.pk/assets/og-image.jpg">
28<link rel="icon" href="/favicon.ico" sizes="48x48">
29<link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon/favicon-32.png">
30<link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon/favicon-16.png">
31<link rel="apple-touch-icon" sizes="180x180" href="/assets/favicon/apple-touch-icon.png">
32<link rel="manifest" href="/site.webmanifest">
33<script>try{var t=localStorage.getItem('ch-theme');if(t)document.documentElement.setAttribute('data-theme',t)}catch(e){}</script>
33
34<link rel="stylesheet" href="/assets/css/layout.css?v=20261008">
35<style>
36:root{--g:#7c6cff;--g2:#3d70cb;--bg:#0a0a14;--bg2:#15132a;--tx:#f5f5fb;--mu:#9797a8;--bd:rgba(255,255,255,.1);--card:rgba(255,255,255,.04);--nav:rgba(10,10,20,.72);--sh:0 20px 60px rgba(0,0,0,.5)}
37[data-theme=light]{--bg:#fafaff;--bg2:#f2f0fb;--tx:#0b0b14;--mu:#5f5f6b;--bd:rgba(0,0,0,.1);--card:rgba(255,255,255,.75);--nav:rgba(255,255,255,.8);--sh:0 20px 60px rgba(70,60,180,.15);--g:#6d5ae0}
38*{box-sizing:border-box;margin:0;padding:0}html{scroll-behavior:smooth}
39body{font-family:'Plus Jakarta Sans',system-ui,-apple-system,Segoe UI,Arial,sans-serif;background:var(--bg);color:var(--tx);line-height:1.6;overflow-x:hidden;transition:background .4s,color .4s}
40a{color:inherit;text-decoration:none}img,svg{max-width:100%}
41.wrap{max-width:1440px;margin:0 auto;padding:0 24px}section{position:relative;padding:110px 0;overflow:hidden}
42h1,h2,h3{letter-spacing:-.03em;line-height:1.05}
43h2{font-size:clamp(34px,5.4vw,72px);font-weight:800}.g{color:var(--g)}
44.pill{display:inline-flex;align-items:center;gap:8px;border:1px solid var(--bd);border-radius:99px;padding:8px 16px;font-size:12px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--g);background:var(--card)}
45.pill:before{content:"";width:7px;height:7px;border-radius:50%;background:var(--g);box-shadow:0 0 10px var(--g);animation:pulse 2s infinite}
46@keyframes pulse{50%{opacity:.3}}
47.btn{display:inline-flex;align-items:center;gap:8px;padding:14px 26px;border-radius:99px;font-weight:700;font-size:15px;border:1px solid var(--bd);position:relative;overflow:hidden;transition:transform .25s,box-shadow .25s;cursor:pointer;font-family:inherit;color:var(--tx);background:var(--card)}
48.btn:hover{transform:translateY(-3px)}
49.btn.p{background:linear-gradient(135deg,#9c8cff,var(--g2));color:#fff;border:0;box-shadow:0 10px 30px rgba(124,108,255,.35)}
50.btn.p:after{content:"";position:absolute;top:0;left:-80%;width:50%;height:100%;background:linear-gradient(90deg,transparent,rgba(255,255,255,.6),transparent);transform:skewX(-20deg);transition:left .6s}
51.btn.p:hover:after{left:130%}
52.rv{opacity:0;transform:translateY(40px);transition:opacity .8s,transform .8s cubic-bezier(.2,.7,.2,1)}.rv.in{opacity:1;transform:none}
53.bgfx{position:absolute;inset:0;z-index:0;pointer-events:none;overflow:hidden}.wrap{position:relative;z-index:1}
54
55/* hero */
56.hero{min-height:100vh;display:flex;align-items:center;padding:150px 0 90px}
57#cv{position:absolute;inset:0;width:100%;height:100%}
58.blob{position:absolute;width:520px;height:520px;border-radius:50%;background:radial-gradient(circle,rgba(124,108,255,.28),transparent 65%);filter:blur(30px);left:var(--mx,60%);top:var(--my,30%);transform:translate(-50%,-50%);transition:left .6s ease-out,top .6s ease-out}
59.hero h1{font-size:clamp(42px,7.4vw,104px);font-weight:800;margin:22px 0}
60.hero p.lead{max-width:600px;color:var(--mu);font-size:18px;margin-bottom:34px}
61.trust{display:flex;flex-wrap:wrap;gap:12px;margin-top:40px}
62.tb{display:flex;align-items:center;gap:10px;padding:12px 18px;border:1px solid var(--bd);border-radius:16px;background:var(--card);backdrop-filter:blur(10px);font-size:14px;font-weight:600;transition:transform .3s,border-color .3s}
63.tb:hover{transform:translateY(-4px);border-color:var(--g)}.tb small{display:block;color:var(--mu);font-weight:500;font-size:12px}.tb .st{color:var(--g);font-size:18px}
64.tb i{width:30px;height:30px;border-radius:8px;background:var(--g);color:#fff;display:grid;place-items:center;font-style:normal;font-weight:800}
65/* marquee */
66.mq{padding:26px 0;border-block:1px solid var(--bd);background:var(--bg2);overflow:hidden;white-space:nowrap}
67.mq div{display:inline-block;animation:mq 30s linear infinite;font-size:28px;font-weight:800;letter-spacing:-.02em;color:var(--mu)}.mq span{color:var(--g);margin:0 26px}
68@keyframes mq{to{transform:translateX(-50%)}}
69/* floating services */
70.fl{position:relative;height:640px;margin-top:50px}
71.chip{position:absolute;display:flex;align-items:center;gap:10px;padding:14px 22px;border-radius:99px;background:var(--card);border:1px solid var(--bd);backdrop-filter:blur(12px);font-weight:700;box-shadow:var(--sh);white-space:nowrap;animation:fy 6s ease-in-out infinite;transition:border-color .3s,background .3s}
72.chip:hover{border-color:var(--g);background:rgba(124,108,255,.15)}
73.chip em{font-style:normal;width:34px;height:34px;border-radius:50%;background:var(--g);color:#fff;display:grid;place-items:center;font-size:16px}
74.pl{position:absolute;will-change:transform;transition:transform .25s ease-out}
75@keyframes fy{50%{transform:translateY(-22px) rotate(1.5deg)}}
76.core{position:absolute;left:50%;top:50%;width:170px;height:170px;margin:-85px;border-radius:50%;background:radial-gradient(circle,#9c8cff,var(--g2));display:grid;place-items:center;color:#fff;font-weight:800;text-align:center;box-shadow:0 0 90px rgba(124,108,255,.55);animation:pulse2 3s infinite}
77@keyframes pulse2{50%{box-shadow:0 0 150px rgba(124,108,255,.8)}}
78@media(max-width:760px){.fl{height:auto;display:flex;flex-wrap:wrap;gap:12px;justify-content:center}.chip,.pl,.core{position:static;animation:none;margin:0;transform:none!important}.core{display:none}}
79/* portfolio */
80.pf{display:grid;grid-template-columns:repeat(2,1fr);gap:40px;margin-top:70px}
81@media(max-width:860px){.pf{grid-template-columns:1fr}}
82.fr{border:1px solid var(--bd);border-radius:26px;background:var(--card);padding:0;overflow:hidden;box-shadow:var(--sh);transition:transform .4s}
83.fr:hover{transform:translateY(-8px)}
84.bar{display:flex;align-items:center;gap:8px;padding:14px 16px}.bar i{width:12px;height:12px;border-radius:50%}
85.bar i:nth-child(1){background:#ff5f57}.bar i:nth-child(2){background:#febc2e}.bar i:nth-child(3){background:#28c840}
86.url{flex:1;margin-left:10px;padding:6px 14px;border-radius:99px;background:var(--bg);border:1px solid var(--bd);font-size:12px;color:var(--mu)}
87.vp{height:420px;overflow:hidden;position:relative;background:#fff;color:#111}
88.pg{transition:transform 5s cubic-bezier(.4,0,.2,1)}.fr:hover .pg{transform:translateY(calc(-100% + 420px))}
89.hv{position:absolute;left:50%;bottom:16px;transform:translateX(-50%);background:#fff;color:#111;border-radius:99px;padding:8px 16px;font-size:13px;font-weight:600;box-shadow:0 6px 24px rgba(0,0,0,.25);z-index:3;transition:opacity .3s}.fr:hover .hv{opacity:0}
90.ft{display:flex;justify-content:space-between;align-items:center;margin-top:20px}.ft h3{font-size:32px}
91.tag{border:1px solid var(--g);color:var(--g);border-radius:99px;padding:7px 16px;font-size:13px;font-weight:600;background:rgba(124,108,255,.08)}
92.mk-h{height:210px;display:flex;flex-direction:column;justify-content:center;padding:0 34px;font-weight:800;font-size:26px;line-height:1.1}
93.mk-r{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;padding:18px}.mk-r b{height:130px;border-radius:12px;display:block}
94/* stats & why */
95.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:20px;margin-top:60px}@media(max-width:800px){.stats{grid-template-columns:repeat(2,1fr)}}
96.stat{padding:30px;border:1px solid var(--bd);border-radius:24px;background:var(--card);text-align:center}.stat b{display:block;font-size:52px;color:var(--g);font-weight:800;letter-spacing:-.03em}.stat span{color:var(--mu);font-weight:600}
97.grid3{display:grid;grid-template-columns:repeat(3,1fr);gap:22px;margin-top:60px}@media(max-width:900px){.grid3{grid-template-columns:1fr}}
98.cd{padding:32px;border:1px solid var(--bd);border-radius:24px;background:var(--card);position:relative;overflow:hidden;transition:transform .35s,border-color .35s}
99.cd:before{content:"";position:absolute;inset:0;background:radial-gradient(300px circle at var(--cx,50%) var(--cy,0),rgba(124,108,255,.2),transparent 60%);opacity:0;transition:opacity .3s}
100.cd:hover{transform:translateY(-8px);border-color:var(--g)}.cd:hover:before{opacity:1}
101.cd>*{position:relative}.cd .n{color:var(--g);font-weight:800;font-size:14px;letter-spacing:.1em}.cd h3{font-size:24px;margin:14px 0 10px}.cd p{color:var(--mu)}
102.grid{position:absolute;inset:-50% 0;background-image:linear-gradient(var(--bd) 1px,transparent 1px),linear-gradient(90deg,var(--bd) 1px,transparent 1px);background-size:60px 60px;mask-image:radial-gradient(ellipse at center,#000,transparent 70%);-webkit-mask-image:radial-gradient(ellipse at center,#000,transparent 70%)}
103.scan{position:absolute;left:0;right:0;height:2px;background:linear-gradient(90deg,transparent,var(--g),transparent);animation:sc 6s linear infinite}@keyframes sc{from{top:-5%}to{top:105%}}
104.orb{position:absolute;border-radius:50%;filter:blur(60px);background:rgba(124,108,255,.22);animation:fy 9s ease-in-out infinite}
105.cta{--bg:#0a0a14;--bg2:#15132a;--tx:#f5f5fb;--mu:#9797a8;--bd:rgba(255,255,255,.1);--card:rgba(255,255,255,.04);--g:#7c6cff;--g2:#3d70cb;background:var(--bg);color:var(--tx);text-align:center}.cta h2{margin:22px 0 34px}.cta .btn{margin:6px}
106
107@media(prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}.rv{opacity:1;transform:none}}
108
109/* ---- subpage extras ---- */
110.ph{padding-top:150px}
111.crumb{color:var(--mu);font-size:14px;margin-bottom:20px}
112.crumb a{color:var(--mu)}.crumb a:hover{color:var(--g)}
113.ph h1{font-size:clamp(36px,5.6vw,66px);font-weight:800;letter-spacing:-.03em;line-height:1.06;margin:18px 0}
114.lede{max-width:640px;color:var(--mu);font-size:18px;margin-top:6px}
115.herow{display:flex;gap:14px;flex-wrap:wrap;margin-top:30px}
116.pgrid{display:grid;grid-template-columns:repeat(2,1fr);gap:30px;margin-top:46px}
117@media(max-width:860px){.pgrid{grid-template-columns:1fr}}
118.pcard{border:1px solid var(--bd);border-radius:26px;overflow:hidden;background:var(--card);box-shadow:var(--sh);transition:transform .4s,border-color .4s;display:block}
119.pcard:hover{transform:translateY(-8px);border-color:var(--g)}
120.pmedia{height:190px;position:relative;display:flex;align-items:flex-end;padding:18px}
121.pmedia.a{background:linear-gradient(135deg,#7c6cff,#241f52)}
122.pmedia.b{background:linear-gradient(135deg,#f4b400,#5c4400)}
123.pmedia.c{background:linear-gradient(135deg,#6366f1,#1b1b3a)}
124.pmedia.d{background:linear-gradient(135deg,#e9c9c0,#7a2f2f)}
125.pmedia.e{background:linear-gradient(135deg,#3d70cb,#0a1830)}
126.pmedia.f{background:linear-gradient(135deg,#9797a8,#27242f)}
127.ptag{padding:6px 14px;border-radius:99px;background:rgba(0,0,0,.35);backdrop-filter:blur(6px);font-size:12px;font-weight:700;color:#fff}
128.pbody{padding:26px}
129.pbody .cat{color:var(--g);font-weight:700;font-size:11.5px;letter-spacing:.1em;text-transform:uppercase}
130.pbody h3{font-size:23px;margin:10px 0 8px}
131.pbody p{color:var(--mu);font-size:14.5px;line-height:1.6}
132.filters{display:flex;flex-wrap:wrap;gap:10px;margin:46px 0 0}
133.fbtn{padding:10px 18px;border-radius:99px;border:1px solid var(--bd);background:var(--card);font-weight:600;font-size:13.5px;cursor:pointer;font-family:inherit;color:var(--tx);transition:.25s}
134.fbtn.on,.fbtn:hover{border-color:var(--g);color:var(--g)}
135.faq{border:1px solid var(--bd);border-radius:18px;background:var(--card);overflow:hidden;margin-bottom:14px}
136.faq summary{padding:20px 24px;cursor:pointer;font-weight:700;font-size:15.5px;list-style:none;display:flex;justify-content:space-between;align-items:center;gap:16px}
137.faq summary::-webkit-details-marker{display:none}
138.faq summary:after{content:"+";font-size:22px;color:var(--g);transition:transform .3s;flex:none;line-height:1}
139.faq[open] summary:after{transform:rotate(45deg)}
140.faq p{padding:0 24px 22px;color:var(--mu);line-height:1.7;font-size:14.5px}
141.chgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-top:10px}
142@media(max-width:860px){.chgrid{grid-template-columns:1fr}}
143.chan{display:flex;flex-direction:column;gap:8px;padding:24px;border:1px solid var(--bd);border-radius:20px;background:var(--card);transition:transform .3s,border-color .3s}
144.chan:hover{transform:translateY(-6px);border-color:var(--g)}
145.chan .ic{font-size:24px}
146.chan h4{font-size:16px}
147.chan span{color:var(--mu);font-size:13.5px}
148.split{display:grid;grid-template-columns:1fr .75fr;gap:50px;align-items:start;margin-top:50px}
149@media(max-width:860px){.split{grid-template-columns:1fr}}
150.fgrid{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-top:24px}
151@media(max-width:560px){.fgrid{grid-template-columns:1fr}}
152.fw{display:flex;flex-direction:column;gap:8px}
153.fw.full{grid-column:1/-1}
154.fw label{font-size:12.5px;font-weight:700;color:var(--mu);letter-spacing:.03em}
155.fw input,.fw select,.fw textarea{padding:14px 16px;border-radius:12px;border:1px solid var(--bd);background:var(--bg);color:var(--tx);font-family:inherit;font-size:14.5px}
156.fw textarea{min-height:120px;resize:vertical}
157.fw input:focus,.fw select:focus,.fw textarea:focus{outline:none;border-color:var(--g)}
158.okbox{display:none;margin-top:20px;padding:16px 20px;border-radius:14px;background:rgba(124,108,255,.12);border:1px solid var(--g);color:var(--g);font-weight:600;font-size:14.5px}
159.okbox.on{display:block}
160.note{margin-top:16px;color:var(--mu);font-size:13.5px}
161.infobox{border-radius:26px;border:1px solid var(--bd);background:var(--card);padding:32px;box-shadow:var(--sh)}
162.infobox h3{font-size:20px;margin:14px 0 4px}
163.infobox .row{display:flex;justify-content:space-between;padding:12px 0;border-top:1px solid var(--bd);font-size:14px}
164.infobox .row b{font-weight:800}
165.avail{display:inline-flex;align-items:center;gap:8px;margin-top:22px;font-size:12px;font-weight:700;letter-spacing:.06em;color:var(--g)}
166.avail i{width:7px;height:7px;border-radius:50%;background:var(--g);box-shadow:0 0 10px var(--g);animation:pulse 2s infinite}
167.chk{margin:22px 0 8px;display:flex;flex-direction:column;gap:13px;max-width:560px}
168.chk li{list-style:none;display:flex;gap:12px;align-items:flex-start;color:var(--mu);line-height:1.6;font-size:15.5px}
169.chk li:before{content:"✓";color:var(--g);font-weight:800;flex:none}
170.svc-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:22px;margin-top:50px}
171@media(max-width:900px){.svc-grid{grid-template-columns:1fr}}
172.svc-card{padding:30px 28px;border:1px solid var(--bd);border-radius:22px;background:var(--card);transition:transform .3s,border-color .3s;display:block}
173.svc-card:hover{transform:translateY(-6px);border-color:var(--g)}
174.svc-card .ic{width:46px;height:46px;border-radius:14px;background:rgba(124,108,255,.14);color:var(--g);display:grid;place-items:center;font-weight:800;margin-bottom:16px}
175.svc-card h3{font-size:19px;margin-bottom:10px}
176.svc-card p{color:var(--mu);font-size:14.5px;line-height:1.6}
177.svc-card span.go{display:inline-block;margin-top:16px;color:var(--g);font-weight:700;font-size:13.5px}
178
179</style>
180<script type="application/ld+json">{"@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [{"@type": "ListItem", "position": 1, "name": "Home", "item": "https://codehouse.pk/"}, {"@type": "ListItem", "position": 2, "name": "Portfolio", "item": "https://codehouse.pk/portfolio/"}]}</script>
180
181</head>
182<body>
183<script src="/assets/js/header.js?v=20261008"></script>
183
184
185<section class="ph" style="padding-bottom:20px"><div class="wrap">
186<div class="crumb rv"><a href="/">Home</a> / <span>Portfolio</span></div>
187<span class="pill rv">Selected work</span>
188<h1 class="rv">Work we're proud<br>to <span class="g">sign.</span></h1>
189<p class="lede rv">Real projects across theme development, design, apps, checkout, cart and ERP — clean code, documented, and handed over fully owned.</p>
190</div></section>
191
192<section style="padding-top:0"><div class="wrap">
193<div class="filters rv" id="filters"><button class="fbtn on" data-f="all">All Work</button><button class="fbtn" data-f="theme">Custom Theme</button><button class="fbtn" data-f="design">Store Design</button><button class="fbtn" data-f="app">Shopify App</button><button class="fbtn" data-f="checkout">Checkout</button><button class="fbtn" data-f="cart">Custom Cart</button><button class="fbtn" data-f="erp">CRM / ERP</button></div>
194<div class="pgrid" id="pgrid">
195<div class="pcard rv" data-cat="theme"><div class="pmedia a"><span class="ptag">Custom Theme</span></div>
196<div class="pbody"><span class="cat">Shopify Theme Development · 2025</span><h3>Kaizen Motors</h3><p>Performance electric bikes for riders who expect more. Full custom Shopify 2.0 theme with custom filtering and a built-in test-ride booking flow.</p></div></div><div class="pcard rv" data-cat="design"><div class="pmedia d"><span class="ptag">Store Design</span></div>
197<div class="pbody"><span class="cat">Shopify Store Design · 2025</span><h3>Khamila Luna</h3><p>Small-batch bath & body brand. Pixel-perfect Figma-to-Shopify conversion with a soft, editorial storefront.</p></div></div><div class="pcard rv" data-cat="app"><div class="pmedia c"><span class="ptag">Shopify App</span></div>
198<div class="pbody"><span class="cat">Shopify App Development · 2025</span><h3>Nexus — ERP Sync App</h3><p>Custom Remix app syncing orders and inventory between Shopify and an external ERP, with a full merchant dashboard.</p></div></div><div class="pcard rv" data-cat="checkout"><div class="pmedia b"><span class="ptag">Checkout</span></div>
199<div class="pbody"><span class="cat">Custom Checkout · 2024</span><h3>Monument Supply Co.</h3><p>Checkout UI extensions adding express pay and a validated discount flow — cut abandoned attempts at the last step.</p></div></div><div class="pcard rv" data-cat="cart"><div class="pmedia e"><span class="ptag">Custom Cart</span></div>
200<div class="pbody"><span class="cat">Custom Cart · 2024</span><h3>Harbor & Reed</h3><p>Slide-out cart drawer with a free-shipping bar and a cross-sell row pulled from real order history.</p></div></div><div class="pcard rv" data-cat="erp"><div class="pmedia f"><span class="ptag">CRM / ERP</span></div>
201<div class="pbody"><span class="cat">CRM / ERP Systems · 2024</span><h3>Monument Portal</h3><p>Laravel distributor portal serving 50+ wholesale accounts across three cities, with order approvals and pricing tiers.</p></div></div>
202</div>
203<div class="rv" style="text-align:center;margin-top:50px">
204<p style="color:var(--mu);margin-bottom:20px">More projects available on request — including work under NDA.</p>
205<a class="btn" href="/contact/">Ask About Our Work</a>
206</div>
207</div></section>
208
209<section class="cta"><div class="bgfx"><div class="grid"></div><div class="orb" style="width:480px;height:480px;left:50%;top:20%;margin-left:-240px"></div></div>
210<div class="wrap"><span class="pill">Let's build</span><h2 class="rv">Your project could<br>be <span class="g">next.</span></h2><a class="btn p" href="/contact/">Start a Project →</a> <a class="btn" href="mailto:[email protected]">✉ [email protected]</a></div></section>
211
212<script src="/assets/js/footer.js?v=20261008"></script>
vendor: 1 bytes, line 212
212
213<script src="/assets/js/layout.js?v=20261008"></script>
213
214
215<script>
216
217(function(){
218var $=function(s){return document.querySelector(s)},R=document.documentElement;
219document.querySelectorAll('.cd').forEach(function(c){c.addEventListener('mousemove',function(e){var r=c.getBoundingClientRect();c.style.setProperty('--cx',e.clientX-r.left+'px');c.style.setProperty('--cy',e.clientY-r.top+'px')})});
220var io=new IntersectionObserver(function(es){es.forEach(function(e){if(e.isIntersecting){e.target.classList.add('in');var n=e.target.querySelector&&e.target.querySelector('[data-n]');if(n&&!n.done){n.done=1;var t=+n.dataset.n,d=+n.dataset.d||0,s=n.dataset.s||'',st=performance.now();(function f(now){var k=Math.min((now-st)/1400,1);n.textContent=(t*k).toFixed(d)+s;if(k<1)requestAnimationFrame(f)})(st)}io.unobserve(e.target)}})},{threshold:.15});
221document.querySelectorAll('.rv').forEach(function(e){io.observe(e)});
222
223
224document.querySelectorAll('.fbtn').forEach(function(b){b.addEventListener('click',function(){document.querySelectorAll('.fbtn').forEach(function(x){x.classList.remove('on')});b.classList.add('on');var f=b.dataset.f;document.querySelectorAll('.pcard').forEach(function(c){c.style.display=(f==='all'||c.dataset.cat===f)?'':'none'})})});
225
226
227
228})();
229</script>
229
230</body>
231</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.