  <style>

  /* mononoki regular */
  @font-face {
    font-family: "Mononoki";
    src: url("../assets/fonts/mononoki/MononokiNerdFontMono-Regular.woff2") format("woff2");
    font-weight: 400;
    font-style: normal;
    font-display: swap;
  }

  /* mononoki bold (optional) */
  @font-face {
    font-family: "Mononoki";
    src: url("../assets/fonts/mononoki/MononokiNerdFontMono-Bold.woff2") format("woff2");
    font-weight: 700;
    font-style: normal;
    font-display: swap;
  }

  /* caskaydia regular */
  @font-face {
    font-family: "Caskaydia";
    src: url("../assets/fonts/caskaydia/CaskaydiaCoveNerdFontMono-Regular.woff2") format("woff2");
    font-weight: 400;
    font-style: normal;
    font-display: swap;
  }

  html {
    height: 100%;
    scroll-behavior: smooth;
    overflow-y: scroll;
  }

  html,
  body {
    -ms-overflow-style: none;
    scrollbar-width: none;
  }

  html::-webkit-scrollbar,
  body::-webkit-scrollbar {
    width: 0;
    height: 0;
  }

  body::after {
    content: "";
    position: fixed;
    inset: 0;
    pointer-events: none;
    z-index: 0;
    background:
      url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 120 120'>\<filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/>\<feColorMatrix type='saturate' values='0'/>\</filter><rect width='120' height='120' filter='url(%23n)' opacity='0.12'/></svg>") repeat;
    mix-blend-mode: soft-light;
    opacity: 0.4;
  }

  @media (prefers-reduced-motion: reduce) {
    body::after {
      opacity: 0.32;
    }
  }

  .projects {
    overflow-y: auto;
    -ms-overflow-style: none;
    scrollbar-width: none;
  }

  .projects::-webkit-scrollbar {
    width: 0;
    height: 0;
  }

  #fireflies {
    position: fixed;
    inset: 0;
    pointer-events: none;
    z-index: 3;
  }

  #fireflies .firefly {
    --s: 3px;
    --alpha: .55;
    --move: 12s;
    --twinkle: 6s;
    --delay: 0s;
    --delay2: 0s;
    --x: 50vw;
    --y: 50vh;
    --dx: 40px;
    --dy: -30px;

    position: absolute;
    left: 0;
    top: 0;
    width: var(--s);
    height: var(--s);
    border-radius: 50%;
    opacity: 0;
    transform: translate(var(--x), var(--y));
    will-change: transform, opacity, filter;

    background: radial-gradient(circle closest-side,
        rgba(255, 245, 190, .90) 0%,
        rgba(255, 228, 140, .35) 60%,
        rgba(255, 228, 140, 0.00) 70%);
    filter: drop-shadow(0 0 2px rgba(255, 235, 170, .35)) blur(0.2px) saturate(110%);

    animation:
      ff-in .7s ease-out forwards,
      ff-drift var(--move) ease-in-out var(--delay) alternate infinite,
      ff-twinklke var(--twinkle) ease-in-out var(--delay2) infinite;
  }

  @keyframes ff-in {
    to {
      opacity: var(--alpha);
    }
  }

  @keyframes ff-drift {
    from {
      transform: translate(calc(var(--x)), calc(var(--y)));
    }

    to {
      transform: translate(calc(var(--x) + var(--dx)), calc(var(--y) + var(--dy)));
    }
  }

  @keyframes ff-twinklke {
    0% {
      opacity: calc(var(--alpha) * .75);
      filter: drop-shadow(0 0 1.5px rgba(255, 235, 170, .25));
    }

    50% {
      opacity: calc(var(--alpha) * 1.00);
      filter: drop-shadow(0 0 2.5px rgba(255, 235, 170, .35));
    }

    100% {
      opacity: calc(var(--alpha) * .70);
      filter: drop-shadow(0 0 1.2px rgba(255, 235, 170, .20));
    }
  }

  #fireflies .firefly.is-fading {
    animation: ff-out .6s ease-in forwards;
  }

  @keyframes ff-out {
    to {
      opacity: 0;
    }
  }

  #fireflies .firefly::after {
    content: "";
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
    width: calc(var(--s) * 6);
    height: calc(var(--s) * 6);
    pointer-events: none;
    border-radius: 50%;
    background: radial-gradient(closest-side,
        rgba(255, 240, 180, .22) 0%,
        rgba(255, 240, 180, .10) 55%,
        rgba(255, 240, 180, 0) 100%);
    filter: blur(2px);
    mix-blend-mode: screen;
    opacity: .85;
    animation: ff-twinklke var(--twinkle) ease-in-out var(--delay2) infinite;
  }

  @media (prefers-reduced-motion: reduce) {
    #fireflies .firefly {
      animation: ff-in .4s ease-out forwards;
    }
  }

  body {
    height: 100%;
    margin: 0;
    font-family: 'Caskaydia';
    line-height: 1.6;
    color: var(--ctp-text);
    background-color: var(--ctp-base);
  }

  h1 {
    color: var(--ctp-text);
    font-size: 2.5em;
    margin-bottom: 0.2em;
  }

  h2 {
    color: var(--ctp-subtext0);
    margin-top: 2em;
    font-size: 1.8em;
  }

  h3 {
    color: var(--ctp-subtext1);
    margin-top: 0;
    font-size: 1.2em;
  }

  a {
    color: var(--ctp-lavender);
  }

  a:hover {
    text-decoration: none;
  }

  ul {
    list-style: none;
    padding: 0;
  }

  li {
    margin-bottom: 1.2em;
  }

  * {
    box-sizing: border-box;
  }

  :root {
    cursor: crosshair;
    --cursorX: 50vw;
    --cursorY: 50vh;
    --cursorX2: 50vw;
    --cursorY2: 50vh;
    --r1: 24vmax;
    --r2: 32vmax;
    --animationDuration: 10s;
    --animationDelay: 15s;
  }

  :root[data-theme="macchiato"] {
    --ctp-rosewater: #f4dbd6;
    --ctp-flamingo: #f0c6c6;
    --ctp-pink: #f5bde6;
    --ctp-mauve: #c6a0f6;
    --ctp-red: #ed8796;
    --ctp-maroon: #ee99a0;
    --ctp-peach: #f5a97f;
    --ctp-yellow: #eed49f;
    --ctp-green: #a6da95;
    --ctp-teal: #8bd5ca;
    --ctp-sky: #91d7e3;
    --ctp-sapphire: #7dc4e4;
    --ctp-blue: #8aadf4;
    --ctp-lavender: #b7bdf8;
    --ctp-text: #cad3f5;
    --ctp-subtext1: #b8c0e0;
    --ctp-subtext0: #a5adcb;
    --ctp-overlay2: #939ab7;
    --ctp-overlay1: #8087a2;
    --ctp-overlay0: #6e738d;
    --ctp-surface2: #5b6078;
    --ctp-surface1: #494d64;
    --ctp-surface0: #363a4f;
    --ctp-base: #24273a;
    --ctp-mantle: #1e2030;
    --ctp-crust: #181926;
  }

  @property --r1 {
    syntax: '<length-percentage>';
    inherits: false;
    initial-value: 16vmax;
  }

  @property --r2 {
    syntax: '<length-percentage>';
    inherits: false;
    initial-value: 32vmax;
  }

  .scroll-section {
    scroll-snap-align: start;
    display: flex;
    flex-direction: column;
    justify-content: center;
    padding: 80px 40px;
    background-color: var(--ctp-base);
  }

  .social-bottom-row {
    justify-items: start;
  }

  .credits {
    font-size: 0.7em;
    color: var(--ctp-subtext1);
  }

  .social-cta-row {
    display: flex;
    gap: 12px;
    justify-content: center;
    /* or flex-start if you prefer left-aligned */
    margin-top: 16px;
  }

  /* optional small variant */
  .btn-cta.btn-cta--sm {
    padding: .45rem .75rem;
    font-size: .9rem;
  }

  .hero-stack {
    display: flex;
    flex-direction: column;
    align-items: start;
    justify-content: space-between;
    height: 80vh;
    text-align: center;
  }

  .hello-text-stack {
    display: flex;
    flex-direction: row;
    align-items: start;
    justify-content: left;
  }

  .hidden {
    display: none;
  }

  .text-stack {
    display: flex;
    flex-direction: column;
    text-align: left;
    align-items: start;
  }

  .hello-text {
    font-family: 'Caskaydia', monospace;
    font-size: 1em;
    color: var(--ctp-text);
    margin-top: 0;
    margin-bottom: 0;
    margin-right: 8px;
  }

  .hello-text.terminal::before {
    content: ">";
    display: inline-block;
    margin-inline-end: 1ch;
    color: var(--ctp-subtext0);
    user-select: none;
    pointer-events: none;
  }

  .hello-text-animated {
    font-family: 'Caskaydia', monospace;
    font-size: 1em;
    color: var(--ctp-text);
    margin-top: 0;
    margin-bottom: 0;
  }

  #typingTop {
    white-space: pre;
  }

  #typingTop::after {
    content: "";
    display: inline-block;
    width: 1ch;
    height: 1em;
    background: var(--ctp-text);
    vertical-align: -0.1em;
  }

  #typingTop[data-cursor="solid"]::after {
    opacity: 1;
    animation: none;
  }

  #typingTop[data-cursor="blink"]::after {
    animation: blink 1s steps(1, end) infinite;
  }

  #typingTop[data-cursor="hidden"]::after {
    content: none;
  }

  @supports not (height: 1lh) {
    #typingTop::after {
      height: 1em;
    }
  }

  .cursor {
    display: inline-block;
    width: 1ch;
    height: 1em;
    background: var(--ctp-text);
    vertical-align: -0.1em;
    /*margin-top: 0;*/
    /*margin-bottom: 0;*/
    /*margin-right: 8px;*/
  }

  .cursor.solid {
    opacity: 1;
    font-family: 'Caskaydia', monospace;
    font-size: 1em;
    color: var(--ctp-text);
    margin-top: 0;
    margin-bottom: 0;
    margin-right: 8px;
  }

  @keyframes blink {

    0%,
    49% {
      opacity: 1;
    }

    50%,
    100% {
      opacity: 0;
    }
  }

  .cursor.blink {
    animation: blink 1s step-end infinite;
  }

  @media (prefers-reduced-motion: reduce) {
    .cursor.blink {
      animation: none;
    }
  }

  .intro-text {
    font-family: 'Caskaydia';
    font-size: 1.5em;
    margin: 0.4em 0;
    color: var(--ctp-subtext0);
  }

  .name-text {
    font-family: 'Caskaydia';
    font-size: 3.2em;
    margin: 0.3em 0;
    color: var(--ctp-subtext0);
  }

  .tagline-text {
    font-family: 'Caskaydia';
    font-size: 1.2em;
    margin: 0.4em 0;
    color: var(--ctp-subtext0);
  }

  .scroll-section--hero {
    position: relative;
  }

  .live-demos {
    grid-area: live-demos;
  }

  .source-code-only {
    grid-area: source-code;
    align-self: end;
  }

  .resume-section {
    grid-area: resume;
    align-self: start;
  }


  .project-title {
    font-weight: 700;
    margin: 16px;
    color: var(--ctp-text);
  }

  .project-title a {
    color: inherit;
    text-decoration: none;
  }

  .project-date {
    font-size: 0.85rem;
    font-style: italic;
    color: #aaa;
    margin: -0.25rem 16px 0.5rem 16px;
  }

  .project-card p {
    margin-left: 16px;
    margin-right: 16px;
  }

  .project-card-bottom-row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.75em;
  }


  .tech-chips {
    display: flex;
    flex-wrap: wrap;
    gap: .45rem;
    margin: .25rem 0 0;
    padding: 0;
    list-style: none;
  }

  .tech-chips--dot li {
    display: inline-flex;
    align-items: center;
    gap: .4rem;
    padding: .18rem .5rem .18rem .4rem;
    border: 1px solid var(--ctp-surface1);
    border-radius: 8px;
    font-size: .82rem;
    color: var(--ctp-text);
  }

  .tech-chips--dot li::before {
    content: "";
    width: .5rem;
    height: .5rem;
    border-radius: 50%;
    background: #7c74ff;
  }

  .tech-chips--dot li[data-cat="lang"]::before {
    background: var(--ctp-yellow);
  }

  .tech-chips--dot li[data-cat="fw"]::before {
    background: var(--ctp-mauve);
  }

  .tech-chips--dot li[data-cat="db"]::before {
    background: var(--ctp-maroon);
  }

  .tech-chips--dot li[data-cat="devops"]::before {
    background: var(--ctp-green);
  }

  @property --sweep {
    syntax: '<angle>';
    inherits: false;
    initial-value: 0turn;
  }

  .project-card {
    position: relative;
    padding: 16px;
    display: grid;
    grid-template-rows: auto auto 1fr auto;
    gap: .5rem;
    width: 100%;
    min-height: 132px;
    background:
      linear-gradient(var(--ctp-surface0), var(--ctp-surface0)) padding-box,
      conic-gradient(from var(--sweep),
        transparent 0 72%,
        var(--ctp-blue) 78%,
        /* bright arc */
        transparent 84% 100%) border-box;
    background-clip: padding-box, border-box;
    border-radius: 2px;
    border: 2px solid transparent;
    color: var(--ctp-text);
    opacity: 0.8;
    text-decoration: none;
    overflow: hidden;
    transition: box-shadow .15s linear;
  }

  .project-card:hover {
    transform: scale(1.02);
    animation: border-sweep 1.6s linear infinite;
    box-shadow: 0 0 10px color-mix(in srgb, var(--ctp-blue) 35%, transparent);
  }

  @keyframes border-sweep {
    to {
      --sweep: 1turn;
    }
  }

  .project-card-overlay {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: linear-gradient(rgba(18, 16, 16, 0) 50%, rgba(0, 0, 0, 0.25) 50%),
      linear-gradient(90deg,
        rgba(255, 0, 0, 0.06),
        rgba(0, 255, 0, 0.02),
        rgba(0, 0, 255, 0.06));
    background-size: 100% 4px, 30px 100%;
    z-index: 1;
    animation: crt-flicker 100ms infinite;
  }

  .project-card-overlay:after {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: rgb(255, 255, 255);
    background: radial-gradient(circle,
        rgba(255, 255, 255, 0) 70%,
        rgba(0, 0, 0, 1) 100%);
    z-index: 2;
  }

  @keyframes crt-flicker {
    0% {
      transform: translateY(1px);
    }

    100% {
      transform: translateY(0px);
    }
  }

  /* the button */
  .btn-cta {
    --jump: 6px;
    font-family: "VT323", monospace;
    font-weight: 800;
    font-style: normal;
    font-size: 1.2em;
    position: relative;
    z-index: 1;
    /* above the block */
    display: inline-flex;
    gap: .5rem;
    align-items: center;
    padding: .55rem .9rem;
    border-radius: 2px;
    background: var(--ctp-blue);
    color: var(--ctp-base);
    border: 2px solid transparent;
    transform: translate(0, 0);
    text-decoration: none;
    transition: none;
    cursor: pointer;
  }

  .btn-cta i {
    line-height: 1;
    font-size: 1.05em;
  }

  .app-store-cta {
    --jump: 6px;
  }

  .app-store-cta:hover {
    transform: translate(calc(-1*var(--jump)), calc(-1*var(--jump)));
  }

  .btn-cta:hover {
    transform: translate(calc(-1*var(--jump)), calc(-1*var(--jump)));
    background-color: var(--ctp-teal);
    box-shadow: var(--jump) var(--jump) 0 0 var(--ctp-text);
    border-color: var(--ctp-text);
  }

  /* hover: move the button; reveal the block */
  /* optional press feel */
  .btn-cta:active {
    transform: translate(calc(-.5*var(--jump)), calc(-.5*var(--jump)));
  }

  .btn-cta.btn-store {
    display: inline-grid;
    grid-auto-flow: column;
    grid-auto-columns: auto 1fr;
    align-items: center;
    column-gap: .6rem;
    padding: .55rem .8rem;

    background: var(--ctp-crust);
    color: var(--ctp-text);
    border: 1px solid var(--ctp-surface1);
    border-radius: 8px;
    text-decoration: none;
    min-height: 44px;
    line-height: 1;
  }

  .btn-cta.btn-store:hover {
    background: var(--ctp-surface1);
    border-color: var(--ctp-text);
    box-shadow: 0 0 0 0;
  }

  .btn-cta .fa-brands.fa-apple {
    width: 22px;
    height: 22px;
    display: block;
    fill: currentColor;
  }

  .btn-cta .silly-oslo {
    width: 33px;
    height: 33px;
    display: block;
    background-image: url('../assets/images/silly_oslo.png');
    background-size: contain;
    background-repeat: no-repeat;
    background-position: center;
  }

  .btn-cta .store-copy {
    display: grid;
    line-height: 1.05;
    min-width: 78px;
  }

  .btn-cta .store-top {
    font-size: .72rem;
    letter-spacing: .015rem;
    opacity: .85;
  }

  .btn-cta .store-bottom {
    font-size: 1.12rem;
    font-weight: 700;
    letter-spacing: .01em;
  }

  .resume-grid {
    display: flex;
    flex-wrap: wrap;
    gap: 20px;
    margin-top: 20px;
  }

  .ripple-wrapper {
    position: relative;
    display: block;
    z-index: 1;
  }


  /* 2-column shell */
  .layout {
    display: grid;
    grid-template-columns: 40vw 60vw;
    gap: 0;
    align-items: start;
  }

  /* Right column: its own scroll view */
  .projects {
    position: sticky;
    /* keep it visible while the page scrolls */
    top: 2rem;
    max-height: calc(100dvh - 2rem);
    overflow-y: auto;
    margin-top: 4rem;
    padding-right: .5rem;
    /* room for scrollbar */
    padding-left: .5rem;
    /* room for scrollbar */
    border-radius: 2px;
    margin-right: 3rem;
    margin-left: 3rem;
    scrollbar-gutter: stable both-edges;
    scrollbar-gutter: stable both-edges;
    /* scroll-snap-type: y proximity; nice snap between cards (optional) */
  }

  /* Group headers that stay visible at the top of the inner scroll */
  .group-title {
    position: sticky;
    top: 0;
    padding: .5rem 0;
    background: #16161a;
    /* match your page bg so it doesn’t look transparent */
    z-index: 1;
  }

  /* Stack cards inside each group */
  .cards {
    display: grid;
    gap: 1rem;
    margin: 0 0 2rem 0;
    padding: 0;
    list-style: none;
  }

  .card {
    border: 1px solid #2a2a2f;
    border-radius: 2px;
    padding: 1rem;
    background: var(--ctp-base);
  }

  /* spacing utilities (Tailwind-ish) */
  :root {
    --space-12: 3rem;
    /* 48px */
    /* add more if you want: --space-8:2rem; --space-6:1.5rem; ... */
  }

  .mb-12 {
    margin-bottom: var(--space-12) !important;
  }

  .rail {
    position: sticky;
    top: 24px;
    max-height: calc(100dvh - 24px);
    overflow: auto;
  }

  .rail-title {
    position: sticky;
    top: 0;
    background: var(--ctp-base);
    margin: 0 0 1rem 0;
    border-bottom: 1px solid var(--ctp-surface1);
    padding: .5rem 0;
    color: var(--ctp-text);
    z-index: 2;
  }

  .rail-list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
  }

  .rail-card {
    padding: 0;
    border: 1px solid #2a2a2f;
    border-radius: 2px;
    background: #1e1f23;
  }

  .rail-card a {
    color: inherit;
    text-decoration: none;
    display: block;
  }

  .actions {
    display: flex;
    justify-content: flex-end;
  }

  @media (prefers-reduced-motion: reduce) {
    body::before {
      animation: none;
    }
  }

  @keyframes ripple {
    to {
      width: 200%;
      height: 200%;
      opacity: 0;
    }
  }

  @media (max-width: 960px) {
    .layout {
      grid-template-columns: 1fr;
      row-gap: 2rem;
      margin: 0 auto;
      padding-inline: 16px;
    }

    .projects {
      position: static;
      max-height: none;
      margin: 0;
      padding: 0;
    }

    .scroll-section {
      padding: 48px 16px;
    }

    .hero-stack {
      height: auto;
      gap: 12px;
      align-items: flex-start;
      text-align: left;
    }

    .name-text {
      font-size: clamp(2rem, 5vw, 3rem);
    }

    .tagline-text {
      font-size: clamp(1rem, 3.5vw, 1.25rem);
    }

    .hello-text {
      line-height: 1;
      font-size: 1rem;
    }

    .social-cta-row {
      justify-content: flex-start;
      flex-wrap: wrap;
      gap: 8px;
    }

    .btn-cta {
      font-size: 1rem;
      padding: .5rem .8rem;
    }

    .project-card-bottom-row {
      display: grid;
      grid-template-columns: minmax(0, 1fr) max-content;
      align-items: center;
      gap: .5rem;
    }

    .project-card-bottom-row .tech-chips {
      margin: 0;
      min-width: 0;
    }

    .project-card-bottom-row .btn-store {
      justify-self: end;
    }

    .project-card-bottom-row img {
      height: 32px;
      width: auto;
      display: block;
    }

    img {
      max-width: 100%;
      height: auto;
    }
  }

  @media (max-width: 520px) {
    .btn-cta {
      width: 100%;
      justify-content: center;
    }

    .tech-chips {
      gap: .35rem;
    }

    .tech-chips--dot li {
      font-size: .78rem;
      padding: .16rem .45rem .16rem .38rem;
    }

    .btn-cta.btn-store {
      width: 100%;
      justify-content: center;
      column-gap: .5rem;
    }

    .btn-cta .fa-brands.fa-apple {
      width: 20px;
      height: 20px;
    }

    .btn-cta .silly-oslo {
      width: 30px;
      height: 30px;
      background-image: url('../assets/images/silly_oslo.png');
      background-size: contain;
      background-repeat: no-repeat;
      background-position: center;
    }

    .btn-cta .store-bottom {
      font-size: 1.05rem;
    }
  }

  @media (hover:hover) and (pointer:fine) {
    .project-card {
      transform-style: preserve-3d;
      transition: transform 0.12s ease;
    }

    .btn-cta:hover {
      transform: translate(calc(-1*var(--jump)), calc(-1*var(--jump)));
      background-color: var(--ctp-teal);
      box-shadow: var(--jump) var(--jump) 0 0 var(--ctp-text);
      border-color: var(--ctp-text);
    }

    .project-card:hover {
      transform: translate(1.02);
      /* translateY(-2px) perspective(800px) rotateX(1deg) rotateY(0.8deg); */
      animation: border-sweep 1.6s linear infinite;
      box-shadow: 0 0 10px color-mix(in srgb, var(--ctp-blue) 35%, transparent);
    }
  }

  @media (max-width: 640px),
  (prefers-reduced-motion: reduce) {
    #fireflies {
      display: none;
    }
  }

  </style>
