1<!DOCTYPE html> 2<html lang="en"> 3 4<head> 5 <meta charset="UTF-8" /> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 7 8 <!-- Anti-FOUC: set theme class synchronously before React hydrates (default: dark) --> 9
9<script> 10 (function() { 11 var stored = localStorage.getItem('theme'); 12 if (stored !== 'light') { 13 document.documentElement.classList.add('dark'); 14 } else { 15 document.documentElement.classList.remove('dark'); 16 } 17 })(); 18 </script>
18 19 20 <!-- Google Tag Manager --> 21
21<script>
vendor: 426 bytes, lines 21-28
21(function (w, d, s, l, i) { 22 w[l] = w[l] || []; w[l].push({ 23 'gtm.start': 24 new Date().getTime(), event: 'gtm.js' 25 }); var f = d.getElementsByTagName(s)[0], 26 j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : ''; j.async = true; j.src = 27 'https://www.googletagmanager.com/gtm.js?id=' + i + dl; f.parentNode.insertBefore(j, f); 28 })(window, document, 'script', 'dataLayer', '
28GTM-N8R29DPK
vendor: 3 bytes, line 28
28');
28</script>
28 29 <!-- End Google Tag Manager --> 30 31 <link rel="icon" type="image/svg+xml" href="/favicon.svg" /> 32 <!-- Preload Hero LCP Image for instant discovery --> 33 <link rel="preload" as="image" href="/images/profile-picture.webp" type="image/webp" fetchpriority="high" /> 34 35 <title>Gaviru Bihan | Developer, SEO Enthusiast & Writer</title> 36 <meta name="description" content="Gaviru Bihan â Developer, SEO Enthusiast, and Tech Writer. Founder of Neovise and CIS Undergraduate at Sabaragamuwa University of Sri Lanka." /> 37 <meta name="keywords" content="Gaviru Bihan, Web Developer, SEO Enthusiast, Technical Writer, Neovise, Android Wedakarayo, Sri Lanka Developer, Ghost CMS, React Developer" /> 38 <meta name="theme-color" content="#0A0E14" /> 39 <link rel="canonical" href="https://gaviru.vercel.app/" /> 40 41 <!-- Open Graph / Facebook / WhatsApp / LinkedIn / Discord --> 42 <meta property="og:type" content="website" /> 43 <meta property="og:site_name" content="Gaviru Bihan" /> 44 <meta property="og:url" content="https://gaviru.vercel.app/" /> 45 <meta property="og:title" content="Gaviru Bihan | Developer, SEO Enthusiast & Writer" /> 46 <meta property="og:description" content="Gaviru Bihan â Developer, SEO Enthusiast, and Tech Writer. Founder of Neovise and CIS Undergraduate at Sabaragamuwa University of Sri Lanka." /> 47 <meta property="og:image" content="https://gaviru.vercel.app/images/Site-Preview.webp" /> 48 <meta property="og:image:secure_url" content="https://gaviru.vercel.app/images/Site-Preview.webp" /> 49 <meta property="og:image:type" content="image/webp" /> 50 <meta property="og:image:width" content="1200" /> 51 <meta property="og:image:height" content="675" /> 52 <meta property="og:image:alt" content="Gaviru Bihan - Portfolio Preview" /> 53 54 <!-- Twitter / X Cards --> 55 <meta name="twitter:card" content="summary_large_image" /> 56 <meta name="twitter:url" content="https://gaviru.vercel.app/" /> 57 <meta name="twitter:title" content="Gaviru Bihan | Developer, SEO Enthusiast & Writer" /> 58 <meta name="twitter:description" content="Gaviru Bihan â Developer, SEO Enthusiast, and Tech Writer. Founder of Neovise and CIS Undergraduate at Sabaragamuwa University of Sri Lanka." /> 59 <meta name="twitter:image" content="https://gaviru.vercel.app/images/Site-Preview.webp" /> 60 <meta name="twitter:image:alt" content="Gaviru Bihan - Portfolio Preview" /> 61 62 <!-- Fonts: Inter Tight (display/hero), Inter (body), JetBrains Mono, Noto Sans Sinhala --> 63 <link rel="preconnect" href="https://fonts.googleapis.com"> 64 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 65 <link 66 href="https://fonts.googleapis.com/css2?family=Inter+Tight:ital,wght@0,400;0,500;0,600;0,700;0,800;1,400&family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600;700&family=Noto+Sans+Sinhala:wght@400;500;600;700&display=swap" 67 rel="stylesheet"> 68 69 <!-- Tailwind CSS CDN --> 70
70<script src="https://cdn.tailwindcss.com"></script>
70 71
71<script> 72 tailwind.config = { 73 darkMode: 'class', 74 theme: { 75 extend: { 76 fontFamily: { 77 sans: ['Inter', 'Noto Sans Sinhala', 'sans-serif'], 78 display: ['Inter Tight', 'Inter', 'sans-serif'], 79 mono: ['JetBrains Mono', 'Courier New', 'monospace'], 80 sinhala: ['Inter', 'Noto Sans Sinhala', 'sans-serif'], 81 }, 82 colors: { 83 base: 'var(--bg-base)', 84 surface: 'var(--bg-surface)', 85 'surface-2': 'var(--bg-surface-2)', 86 'border-subtle': 'var(--border-subtle)', 87 'border-medium': 'var(--border-medium)', 88 'text-primary': 'var(--text-primary)', 89 'text-secondary': 'var(--text-secondary)', 90 'text-tertiary': 'var(--text-tertiary)', 91 'accent-primary': 'var(--accent-primary)', 92 'accent-primary-hover': 'var(--accent-primary-hover)', 93 'accent-secondary': 'var(--accent-secondary)', 94 'accent-success': 'var(--accent-success)', 95 'accent-warn': 'var(--accent-warn)', 96 'accent-danger': 'var(--accent-danger)', 97 border: { 98 subtle: 'var(--border-subtle)', 99 medium: 'var(--border-medium)', 100 }, 101 text: { 102 primary: 'var(--text-primary)', 103 secondary: 'var(--text-secondary)', 104 tertiary: 'var(--text-tertiary)', 105 }, 106 accent: { 107 primary: 'var(--accent-primary)', 108 secondary: 'var(--accent-secondary)', 109 success: 'var(--accent-success)', 110 warn: 'var(--accent-warn)', 111 danger: 'var(--accent-danger)', 112 }, 113 }, 114 borderRadius: { 115 sm: 'var(--radius-sm)', 116 md: 'var(--radius-md)', 117 lg: 'var(--radius-lg)', 118 xl: 'var(--radius-xl)', 119 '2xl': 'var(--radius-2xl)', 120 }, 121 transitionDuration: { 122 fast: '150ms', 123 base: '200ms', 124 slow: '300ms', 125 }, 126 maxWidth: { 127 portfolio: 'var(--max-width)', 128 }, 129 }, 130 }, 131 } 132 </script>
132 133 134 <!-- Portfolio Design System --> 135
135<script type="importmap"> 136{ 137 "imports": { 138 "react": "https://aistudiocdn.com/react@^19.1.1", 139 "react-dom/": "https://aistudiocdn.com/react-dom@^19.1.1/", 140 "react/": "https://aistudiocdn.com/react@^19.1.1/", 141 "react-icons/": "https://aistudiocdn.com/react-icons@^5.5.0/", 142 "react-icons": "https://aistudiocdn.com/react-icons@^5.5.0", 143 "framer-motion": "https://aistudiocdn.com/framer-motion@^12.23.12", 144 "@emailjs/browser": "https://aistudiocdn.com/@emailjs/browser@^4.4.1", 145 "react-type-animation": "https://aistudiocdn.com/react-type-animation@^3.2.0" 146 } 147} 148</script>
148 149
149<script type="module" crossorigin src="/assets/index-tb-WYDuQ.js"></script>
149 150 <link rel="stylesheet" crossorigin href="/assets/index-CbZC-qcV.css"> 151</head> 152 153<body> 154 <!-- Google Tag Manager (noscript) -->
vendor: 70 bytes, lines 154-155
154 155 <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
155GTM-N8R29DPK
vendor: 91 bytes, lines 155-157
155" height="0" width="0" 156 style="display:none;visibility:hidden"></iframe></noscript> 157
157<!-- End Google Tag Manager (noscript) --> 158 <div id="root"></div> 159 160</body> 161 162</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.