:root{--bg-base: #F7F8FA;--bg-surface: #FFFFFF;--bg-surface-2: #F0F2F5;--border-subtle: #E4E7EC;--border-medium: #CBD0DA;--border-strong: #C9CFDA;--text-primary: #0F141C;--text-secondary: #5B6472;--text-tertiary: #9AA5B5;--accent-primary: #2563EB;--accent-primary-hover: #1D4ED8;--accent-primary-glow: rgba(37, 99, 235, .15);--accent-secondary: #6D28D9;--accent-secondary-glow: rgba(109, 40, 217, .12);--accent-success: #059669;--accent-warn: #D97706;--accent-danger: #DC2626;--text-display: clamp(3rem, 9vw, 6.5rem);--text-display-leading: .98;--text-display-tracking: -.03em;--text-h2: clamp(1.5rem, 4vw, 2.5rem);--text-h3: 1.125rem;--text-body: 1rem;--text-small: .875rem;--text-xs: .75rem;--section-py: clamp(3.5rem, 8vw, 8rem);--container-px: clamp(1rem, 5vw, 3rem);--max-width: 1200px;--radius-sm: 4px;--radius-md: 8px;--radius-lg: 12px;--radius-xl: 16px;--radius-2xl: 24px;--transition-fast: .15s ease-out;--transition-base: .2s ease-out;--transition-slow: .3s ease-out;--shadow-sm: 0 1px 3px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.04);--shadow-md: 0 4px 12px rgba(0,0,0,.08), 0 2px 4px rgba(0,0,0,.04);--shadow-lg: 0 10px 30px rgba(0,0,0,.1), 0 4px 8px rgba(0,0,0,.05);--shadow-xl: 0 20px 50px rgba(0,0,0,.12)}.dark{--bg-base: #0A0E14;--bg-surface: #111721;--bg-surface-2: #171F2C;--border-subtle: #232C3B;--border-medium: #2E3A4E;--border-strong: #35404F;--text-primary: #EDEFF3;--text-secondary: #9AA5B5;--text-tertiary: #5C6779;--accent-primary: #3B9EFF;--accent-primary-hover: #60B4FF;--accent-primary-glow: rgba(59, 158, 255, .15);--accent-secondary: #7C5CFF;--accent-secondary-glow: rgba(124, 92, 255, .12);--accent-success: #34D399;--accent-warn: #F5A623;--accent-danger: #F87171;--shadow-sm: 0 0 0 1px var(--border-subtle);--shadow-md: 0 0 0 1px var(--border-subtle), 0 4px 12px rgba(0,0,0,.3);--shadow-lg: 0 0 0 1px var(--border-subtle), 0 10px 30px rgba(0,0,0,.4);--shadow-xl: 0 0 0 1px var(--border-subtle), 0 20px 50px rgba(0,0,0,.5)}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html{scroll-padding-top:80px;-webkit-text-size-adjust:100%}body{font-family:Inter,Noto Sans Sinhala,sans-serif;font-size:var(--text-body);line-height:1.6;color:var(--text-primary);background-color:var(--bg-base);transition:background-color .3s ease,color .3s ease;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body:before{content:"";position:fixed;top:0;right:0;bottom:0;left:0;z-index:0;pointer-events:none;opacity:.025;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E");background-repeat:repeat;background-size:128px 128px}#root{position:relative;z-index:1;overflow-x:hidden}.page-loader{position:fixed;top:0;right:0;bottom:0;left:0;z-index:99999;background-color:var(--bg-base);display:flex;align-items:center;justify-content:center;transition:opacity .45s ease;pointer-events:none}.page-loader-inner{display:flex;flex-direction:column;align-items:center;gap:20px}.page-loader-logo{font-family:JetBrains Mono,Fira Code,monospace;font-size:clamp(1rem,3vw,1.25rem);font-weight:600;letter-spacing:.04em;color:var(--text-primary)}.page-loader-cursor{color:var(--accent-primary);animation:cursor-blink 1s step-end infinite}.page-loader-track{width:clamp(160px,30vw,260px);height:1px;background-color:var(--border-subtle);position:relative;overflow:hidden}.page-loader-bar{position:absolute;top:0;right:0;bottom:0;left:0;background-color:var(--accent-primary);transform-origin:left center;transform:scaleX(0);will-change:transform}.page-loader-pct{font-family:JetBrains Mono,Fira Code,monospace;font-size:11px;font-weight:500;letter-spacing:.08em;color:var(--text-tertiary);width:3ch;text-align:right;align-self:flex-end}.font-display{font-family:Inter Tight,Inter,sans-serif;letter-spacing:-.02em}.font-mono{font-family:JetBrains Mono,Courier New,monospace}.font-sinhala{font-family:Inter,Noto Sans Sinhala,sans-serif}.text-display{font-size:var(--text-display);font-weight:700;letter-spacing:var(--text-display-tracking);line-height:var(--text-display-leading)}.text-h2{font-size:var(--text-h2);font-weight:600;letter-spacing:-.01em;line-height:1.2}.text-h3{font-size:var(--text-h3);font-weight:600;line-height:1.3}.text-primary,.text-text-primary,[class*="text-[var(--text-primary)]"],[class*="text-[color:var(--text-primary)]"]{color:var(--text-primary)!important}.text-secondary,.text-text-secondary,[class*="text-[var(--text-secondary)]"],[class*="text-[color:var(--text-secondary)]"]{color:var(--text-secondary)!important}.text-tertiary,.text-text-tertiary,[class*="text-[var(--text-tertiary)]"],[class*="text-[color:var(--text-tertiary)]"]{color:var(--text-tertiary)!important}.text-accent,.text-accent-primary,[class*="text-[var(--accent-primary)]"],[class*="text-[color:var(--accent-primary)]"]{color:var(--accent-primary)!important}.text-accent-secondary,[class*="text-[var(--accent-secondary)]"],[class*="text-[color:var(--accent-secondary)]"]{color:var(--accent-secondary)!important}.text-accent-success,[class*="text-[var(--accent-success)]"]{color:var(--accent-success)!important}.text-accent-warn,[class*="text-[var(--accent-warn)]"]{color:var(--accent-warn)!important}.text-accent-danger,[class*="text-[var(--accent-danger)]"]{color:var(--accent-danger)!important}.bg-base,[class*="bg-[var(--bg-base)]"]{background-color:var(--bg-base)!important}.bg-surface,[class*="bg-[var(--bg-surface)]"]{background-color:var(--bg-surface)!important}.bg-surface-2,[class*="bg-[var(--bg-surface-2)]"]{background-color:var(--bg-surface-2)!important}.border-subtle,[class*="border-[var(--border-subtle)]"]{border-color:var(--border-subtle)!important}.border-medium,[class*="border-[var(--border-medium)]"]{border-color:var(--border-medium)!important}.surface-soft{background-color:var(--bg-surface);border:1px solid var(--border-subtle);border-radius:var(--radius-xl)}.surface-sharp{background-color:var(--bg-surface);border:1px solid var(--border-strong);border-radius:0}.surface-ghost{background-color:transparent;border:none}.container-portfolio{max-width:var(--max-width);margin:0 auto;padding:0 var(--container-px)}.section-py{padding-top:var(--section-py);padding-bottom:var(--section-py)}.section-base{background-color:var(--bg-base)}.section-surface{background-color:var(--bg-surface)}.section-border-top{border-top:1px solid var(--border-subtle)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;font-size:.9375rem;font-weight:600;padding:.75rem 1.5rem;border-radius:var(--radius-lg);border:1px solid transparent;cursor:pointer;transition:all var(--transition-base);white-space:nowrap;text-decoration:none;position:relative;overflow:hidden}.btn:focus-visible{outline:2px solid var(--accent-primary);outline-offset:3px}.btn-primary{background-color:var(--accent-primary);color:#fff;border-color:var(--accent-primary)}.btn-primary:hover{background-color:var(--accent-primary-hover);border-color:var(--accent-primary-hover);transform:translateY(-1px);box-shadow:0 8px 20px var(--accent-primary-glow)}.btn-primary:active{transform:translateY(0)}.btn-ghost{background-color:transparent;color:var(--text-primary);border-color:var(--border-medium)}.btn-ghost:hover{background-color:var(--bg-surface-2);border-color:var(--border-medium);transform:translateY(-1px)}.card{background-color:var(--bg-surface);border:1px solid var(--border-subtle);border-radius:var(--radius-xl);transition:all var(--transition-slow);box-shadow:var(--shadow-sm)}.card:hover{box-shadow:var(--shadow-md);border-color:var(--border-medium)}.card-glass{background-color:color-mix(in srgb,var(--bg-surface) 80%,transparent);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid var(--border-subtle);border-radius:var(--radius-xl);box-shadow:inset 0 1px #ffffff0a}.skill-chip{display:inline-flex;align-items:center;gap:.375rem;padding:.4rem .875rem;background-color:var(--bg-surface-2);border:1px solid var(--border-subtle);border-radius:var(--radius-md);font-family:JetBrains Mono,monospace;font-size:.8125rem;color:var(--text-secondary);transition:all var(--transition-base);cursor:default}.skill-chip.tier-familiar{opacity:.55}.skill-chip:hover{border-color:var(--accent-primary);color:var(--accent-primary);background-color:var(--accent-primary-glow);transform:translateY(-2px)}.tech-chip{display:inline-flex;align-items:center;padding:.2rem .55rem;background-color:var(--bg-surface-2);border:1px solid var(--border-subtle);border-radius:var(--radius-sm);font-family:JetBrains Mono,monospace;font-size:.7rem;color:var(--text-tertiary);letter-spacing:.02em}.badge{display:inline-flex;align-items:center;gap:.25rem;padding:.2rem .6rem;border-radius:999px;font-size:.75rem;font-weight:600;letter-spacing:.01em}.badge-live{background-color:#34d3991f;color:var(--accent-success);border:1px solid rgba(52,211,153,.25)}.badge-dev{background-color:#f5a6231f;color:var(--accent-warn);border:1px solid rgba(245,166,35,.25)}.badge-team{background-color:#7c5cff1f;color:var(--accent-secondary);border:1px solid rgba(124,92,255,.25)}.badge-case{background-color:var(--accent-primary-glow);color:var(--accent-primary);border:1px solid rgba(59,158,255,.25)}.section-label{display:inline-flex;align-items:center;gap:.5rem;font-family:JetBrains Mono,monospace;font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.1em;color:var(--accent-primary);margin-bottom:.75rem}.section-label:before{content:"";display:block;width:20px;height:1px;background-color:var(--accent-primary)}.nav-link{position:relative;padding:.375rem 0;font-size:.9375rem;font-weight:500;color:var(--text-secondary);text-decoration:none;transition:color var(--transition-base)}.nav-link:after{content:"";position:absolute;bottom:-2px;left:0;width:0;height:1px;background-color:var(--accent-primary);transition:width var(--transition-base)}.nav-link:hover{color:var(--text-primary)}.nav-link:hover:after,.nav-link.active:after{width:100%}.nav-link.active{color:var(--accent-primary)}@keyframes cursor-blink{0%,to{opacity:1}50%{opacity:0}}.cursor-blink{animation:cursor-blink 1.1s step-end infinite;color:var(--accent-primary);font-weight:300}@keyframes pulse-dot{0%,to{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(.85)}}.pulse-dot{display:inline-block;width:7px;height:7px;border-radius:50%;background-color:var(--accent-success);animation:pulse-dot 2s ease-in-out infinite;flex-shrink:0}.hero-dot-grid{background-image:radial-gradient(circle,var(--border-subtle) 1px,transparent 1px);background-size:28px 28px}.portrait-glow{position:absolute;top:-20%;right:-20%;bottom:-20%;left:-20%;background:radial-gradient(circle,var(--accent-primary-glow) 0%,transparent 70%);border-radius:50%;pointer-events:none}@keyframes border-rotate{0%{--angle: 0deg}to{--angle: 360deg}}@keyframes bounce-down{0%,to{transform:translateY(0);opacity:.6}50%{transform:translateY(6px);opacity:1}}.scroll-cue{animation:bounce-down 2s ease-in-out infinite}.floating-badge{background-color:var(--bg-surface);border:1px solid var(--border-subtle);border-radius:var(--radius-lg);padding:.5rem .875rem;box-shadow:var(--shadow-md);font-size:.8125rem;font-weight:600;color:var(--text-primary);display:flex;align-items:center;gap:.5rem;white-space:nowrap}.skill-category-label{font-family:JetBrains Mono,monospace;font-size:.7rem;font-weight:700;text-transform:uppercase;letter-spacing:.12em;color:var(--text-tertiary);margin-bottom:.75rem;padding-bottom:.5rem;border-bottom:1px solid var(--border-subtle)}.skill-category-infra .skill-chip:hover{border-color:var(--accent-secondary);color:var(--accent-secondary);background-color:var(--accent-secondary-glow)}.project-featured{display:grid;grid-template-columns:1fr 1fr;gap:0;background-color:var(--bg-surface);border:1px solid var(--border-strong);border-radius:0;overflow:hidden;transition:all var(--transition-slow)}.project-featured:hover{border-color:var(--accent-primary);box-shadow:0 0 0 1px var(--accent-primary),var(--shadow-lg);transform:translateY(-3px)}@media (max-width: 767px){.project-featured{grid-template-columns:1fr;grid-template-rows:auto auto}.project-featured>*:first-child{order:2}.project-featured>*:last-child{order:1}}.project-card-lift{transition:transform var(--transition-slow),box-shadow var(--transition-slow),border-color var(--transition-slow)}.project-card-lift:hover{transform:translateY(-4px);box-shadow:var(--shadow-lg);border-color:var(--border-medium)}.browser-frame{background-color:var(--bg-surface-2);border-radius:var(--radius-lg) var(--radius-lg) 0 0;border:1px solid var(--border-subtle);border-bottom:none;overflow:hidden}.browser-frame-bar{display:flex;align-items:center;gap:6px;padding:8px 12px;background-color:var(--bg-surface-2);border-bottom:1px solid var(--border-subtle)}.browser-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}.browser-dot-red{background-color:#ff5f57}.browser-dot-yellow{background-color:#ffbd2e}.browser-dot-green{background-color:#28ca41}.browser-url-bar{flex:1;height:20px;background-color:var(--bg-base);border-radius:var(--radius-sm);border:1px solid var(--border-subtle);display:flex;align-items:center;padding:0 8px;font-family:JetBrains Mono,monospace;font-size:.65rem;color:var(--text-tertiary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.browser-image{width:100%;display:block;object-fit:cover;aspect-ratio:16/9;transition:transform .5s ease-out}.dark .browser-image{filter:brightness(.88) saturate(.92)}.browser-image-wrap{overflow:hidden;border:1px solid var(--border-subtle);border-top:none;border-radius:0 0 var(--radius-lg) var(--radius-lg)}.project-card:hover .browser-image{transform:scale(1.04)}.article-card{background-color:var(--bg-surface);border:1px solid var(--border-subtle);border-radius:var(--radius-xl);overflow:hidden;transition:all var(--transition-slow)}.article-card:hover{border-color:var(--border-medium);box-shadow:var(--shadow-md);transform:translateY(-3px)}.article-image-wrap{aspect-ratio:3/2;overflow:hidden;background-color:var(--bg-surface-2)}.article-image-wrap img{width:100%;height:100%;object-fit:cover;transition:transform .5s ease-out}.article-card:hover .article-image-wrap img{transform:scale(1.06)}.lang-badge{display:inline-flex;align-items:center;padding:.15rem .5rem;border-radius:var(--radius-sm);font-family:JetBrains Mono,monospace;font-size:.65rem;font-weight:700;letter-spacing:.05em;border:1px solid}.lang-badge-en{background-color:var(--accent-primary-glow);color:var(--accent-primary);border-color:#3b9eff4d}.lang-badge-si{background-color:var(--accent-secondary-glow);color:var(--accent-secondary);border-color:#7c5cff4d}.testimonial-card{background-color:transparent;border:none;border-radius:0;padding:2rem 1.5rem;position:relative;transition:all var(--transition-slow);overflow:hidden}.testimonial-card:before{content:"“";position:absolute;top:-.5rem;left:.75rem;font-size:8rem;font-family:Georgia,serif;font-weight:700;line-height:1;color:var(--border-subtle);opacity:.8;pointer-events:none;-webkit-user-select:none;user-select:none}.testimonial-card:hover{transform:translateY(-3px)}.avatar-initials{width:40px;height:40px;border-radius:50%;background-color:var(--accent-primary-glow);border:1px solid var(--accent-primary);display:flex;align-items:center;justify-content:center;font-family:JetBrains Mono,monospace;font-size:.75rem;font-weight:700;color:var(--accent-primary);flex-shrink:0}.input-float-wrap{position:relative}.input-float{width:100%;padding:1.125rem 1rem .625rem;background-color:var(--bg-surface-2);border:1px solid var(--border-subtle);border-radius:var(--radius-lg);font-family:Inter,sans-serif;font-size:var(--text-body);color:var(--text-primary);outline:none;transition:border-color var(--transition-base),box-shadow var(--transition-base);resize:vertical}.input-float::placeholder{color:transparent}.input-float:focus{border-color:var(--accent-primary);box-shadow:0 0 0 3px var(--accent-primary-glow)}.input-float.error{border-color:var(--accent-danger);box-shadow:0 0 0 3px #dc26261a}.input-float-label{position:absolute;top:1rem;left:1rem;font-size:var(--text-body);color:var(--text-tertiary);pointer-events:none;transition:all var(--transition-base);transform-origin:left top;background:transparent}.input-float:focus~.input-float-label,.input-float:not(:placeholder-shown)~.input-float-label{top:.35rem;font-size:.7rem;color:var(--accent-primary);font-weight:600;letter-spacing:.02em}.contact-info-row{display:flex;align-items:center;gap:1rem;padding:.875rem 1rem;border:1px solid var(--border-subtle);border-radius:var(--radius-lg);background-color:var(--bg-surface-2);text-decoration:none;color:var(--text-secondary);transition:all var(--transition-base)}.contact-info-row:hover{border-color:var(--accent-primary);background-color:var(--accent-primary-glow);color:var(--accent-primary);transform:translate(4px)}.contact-info-icon{width:36px;height:36px;display:flex;align-items:center;justify-content:center;border-radius:var(--radius-md);background-color:var(--bg-surface);border:1px solid var(--border-subtle);color:var(--accent-primary);flex-shrink:0;font-size:1rem;transition:all var(--transition-base)}.contact-info-row:hover .contact-info-icon{background-color:var(--accent-primary);border-color:var(--accent-primary);color:#fff}.footer-social-link{width:38px;height:38px;display:flex;align-items:center;justify-content:center;border-radius:var(--radius-md);border:1px solid var(--border-subtle);color:var(--text-tertiary);background-color:var(--bg-surface-2);font-size:1.1rem;transition:all var(--transition-base);text-decoration:none}.footer-social-link:hover{border-color:var(--accent-primary);color:var(--accent-primary);background-color:var(--accent-primary-glow);transform:translateY(-2px)}.stat-card{background-color:var(--bg-surface-2);border:1px solid var(--border-subtle);border-radius:var(--radius-lg);padding:1rem 1.25rem;display:flex;flex-direction:column;gap:.25rem;transition:all var(--transition-base)}.stat-card:hover{border-color:var(--accent-primary);background-color:var(--accent-primary-glow)}.stat-label{font-family:JetBrains Mono,monospace;font-size:.7rem;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:var(--text-tertiary)}.stat-value{font-size:.9375rem;font-weight:600;color:var(--text-primary)}.affil-btn{display:inline-flex;align-items:center;gap:.45rem;padding:.4rem .9rem;font-size:.875rem;font-weight:600;border-radius:var(--radius-md);text-decoration:none;transition:all var(--transition-base);border:1px solid transparent;cursor:pointer;line-height:1.4}.affil-btn-neovise{background-color:#2ec4b614;border-color:#2ec4b666;color:#0b8075}.dark .affil-btn-neovise{background-color:#2ec4b61f;border-color:#2ec4b673;color:#2ec4b6}.affil-btn-neovise:hover{background-color:#2ec4b629;border-color:#2ec4b6;color:#086b62;box-shadow:0 4px 14px #2ec4b640}.dark .affil-btn-neovise:hover{background-color:#2ec4b638;border-color:#2ec4b6;color:#5eead4;box-shadow:0 4px 16px #2ec4b659}.affil-btn-android{background-color:#22c55e14;border-color:#22c55e66;color:#15803d}.dark .affil-btn-android{background-color:#22c55e1f;border-color:#22c55e73;color:#22c55e}.affil-btn-android:hover{background-color:#22c55e29;border-color:#22c55e;color:#166534;box-shadow:0 4px 14px #22c55e40}.dark .affil-btn-android:hover{background-color:#22c55e38;border-color:#22c55e;color:#4ade80;box-shadow:0 4px 16px #22c55e59}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:var(--bg-base)}::-webkit-scrollbar-thumb{background:var(--border-medium);border-radius:999px}::-webkit-scrollbar-thumb:hover{background:var(--text-tertiary)}:focus-visible{outline:2px solid var(--accent-primary);outline-offset:3px;border-radius:var(--radius-sm)}@media (hover: hover) and (pointer: fine){html,body,*{cursor:none!important}input,textarea,select{cursor:text!important}input[type=checkbox],input[type=radio],input[type=range],button,a,[role=button]{cursor:none!important}}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}html{scroll-behavior:auto}.pulse-dot,.cursor-blink{animation:none}}@media (max-width: 768px){:root{--section-py: 3.5rem}}@supports (padding: env(safe-area-inset-left)){.container-portfolio{padding-left:max(var(--container-px),env(safe-area-inset-left));padding-right:max(var(--container-px),env(safe-area-inset-right))}}@media (max-width: 768px){.btn{min-height:44px;padding:.6875rem 1.25rem;font-size:.9375rem}.skill-chip{font-size:.75rem;padding:.3rem .6rem}.contact-info-row{min-height:52px}.footer-social-link{width:44px;height:44px}}
