Open demo

CSS code

HTML
<div class="nn"><span class="lbl">Synthwave stage with an extruded neon title</span>
<section class="nn-stage" aria-labelledby="nn-title">
  <div class="nn-sun" aria-hidden="true"></div>
  <div class="nn-floor" aria-hidden="true"></div>
  <div class="nn-copy">
    <p class="nn-kicker">Synth night</p>
    <h2 class="nn-title" id="nn-title">Afterglow</h2>
    <p class="nn-when">Warehouse 9 · 21 June · doors 22:00</p>
    <a class="nn-cta" href="#">Get tickets<span class="sr-only"> for Afterglow</span></a>
  </div>
</section></div>

<div class="duo nn">
  <div><span class="lbl">Layered card that tilts on hover and focus</span>
  <div class="nn-tilt">
    <article class="nn-card" aria-labelledby="nn-pass">
      <span class="nn-badge" style="--z:50px">Members</span>
      <h3 id="nn-pass" style="--z:34px">Night Pass</h3>
      <p class="nn-price" style="--z:60px">€12 <small>a month</small></p>
      <ul class="nn-list" style="--z:24px"><li>Entry to every Saturday show</li><li>Skip the queue before midnight</li><li>Two guest passes a month</li></ul>
      <button class="nn-join" type="button" style="--z:40px">Join Night Pass</button>
    </article>
  </div></div>

  <div><span class="lbl">Wireframe cube that turns on hover and focus</span>
  <article class="nn-brand" aria-labelledby="nn-vector">
    <div class="nn-scene" aria-hidden="true"><div class="nn-cube"><i></i><i></i><i></i><i></i><i></i><i></i></div></div>
    <div>
      <h3 id="nn-vector">Vector Labs</h3>
      <p>Open-source tools for 3D on the web. 4,200 stars, 61 contributors.</p>
      <a href="#">Read the docs<span class="sr-only"> for Vector Labs</span></a>
    </div>
  </article></div>
</div>
CSS
/* Neon 3D for dark interfaces: a synthwave stage with a perspective grid floor and an extruded neon title, a layered card that
   tilts on hover or keyboard focus, and a wireframe cube that turns a quarter when its card is hovered or focused.
   Nothing moves on its own; under prefers-reduced-motion the hover and focus states change without transitions. */
.nn{--nn-pink:#f0abfc;--nn-magenta:#e879f9;--nn-cyan:#67e8f9;--nn-ink:#f5f3ff;--nn-muted:#c4b5fd;color:var(--nn-ink)}
.nn :where(h2,h3,p,ul){margin:0;padding:0;list-style:none}
.nn a:focus-visible,.nn button:focus-visible{outline:3px solid var(--nn-cyan);outline-offset:4px}
.nn .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}

/* A. synthwave stage */
.nn-stage{position:relative;display:grid;justify-items:center;align-content:start;min-height:380px;padding:40px 20px 0;border-radius:22px;overflow:hidden;text-align:center;
  background:linear-gradient(180deg,#0b0620 0%,#2e1065 50%,#0b0620 58%);background-color:#0b0620;box-shadow:0 0 0 1px rgba(232,121,249,.25)}
.nn-sun{position:absolute;left:50%;top:84px;width:190px;height:190px;margin-left:-95px;border-radius:50%;background:linear-gradient(#fde047,#fb7185 55%,#c026d3);
  -webkit-mask-image:linear-gradient(#000 52%,transparent 52% 56%,#000 56% 64%,transparent 64% 69%,#000 69% 76%,transparent 76% 82%,#000 82%);
  mask-image:linear-gradient(#000 52%,transparent 52% 56%,#000 56% 64%,transparent 64% 69%,#000 69% 76%,transparent 76% 82%,#000 82%);filter:drop-shadow(0 0 30px rgba(251,113,133,.6))}
.nn-floor{position:absolute;left:-50%;right:-50%;top:58%;height:100%;transform-origin:50% 0;transform:perspective(260px) rotateX(64deg);
  background:linear-gradient(var(--nn-magenta) 2px,transparent 2px) 0 0/64px 44px,linear-gradient(90deg,var(--nn-magenta) 2px,transparent 2px) 0 0/64px 44px;
  -webkit-mask-image:linear-gradient(transparent,#000 22%);mask-image:linear-gradient(transparent,#000 22%);filter:drop-shadow(0 0 6px var(--nn-magenta))}
.nn-copy{position:relative;display:grid;justify-items:center;gap:10px}
.nn-kicker{font-size:.74rem;font-weight:800;letter-spacing:.32em;text-transform:uppercase;color:var(--nn-cyan)}
.nn-title{font-family:"Arial Black","Helvetica Neue",Arial,sans-serif;font-weight:900;font-size:clamp(2.6rem,10vw,4.6rem);line-height:1;letter-spacing:.04em;color:#fff;
  text-shadow:0 0 4px var(--nn-pink),0 1px 0 #d946ef,0 2px 0 #c026d3,0 3px 0 #a21caf,0 4px 0 #86198f,0 5px 0 #701a75,0 6px 0 #581c5f,0 0 22px var(--nn-magenta),0 0 46px #c026d3}
.nn-when{padding:6px 14px;border-radius:999px;background:rgba(11,6,32,.82);font-size:.88rem;color:#f5d0fe;box-shadow:0 0 0 1px rgba(232,121,249,.3)}
.nn-cta{display:inline-block;margin:150px 0 34px;padding:12px 22px;border-radius:12px;border:2px solid var(--nn-cyan);background:#082f49;color:#ecfeff;font-weight:800;text-decoration:none;
  box-shadow:0 6px 0 #0e7490,0 0 22px rgba(103,232,249,.45),inset 0 0 12px rgba(103,232,249,.25);transition:transform .12s,box-shadow .12s}
.nn-cta:hover{box-shadow:0 6px 0 #0e7490,0 0 34px rgba(103,232,249,.7),inset 0 0 14px rgba(103,232,249,.35)}
.nn-cta:active{transform:translateY(5px);box-shadow:0 1px 0 #0e7490,0 0 18px rgba(103,232,249,.45),inset 0 0 12px rgba(103,232,249,.25)}

/* B. layered card: the planes sit at different translateZ depths and the card tilts on hover or focus-within */
.nn-tilt{perspective:900px}
.nn-card{position:relative;display:grid;gap:14px;padding:26px;border-radius:20px;border:1px solid rgba(103,232,249,.55);background:#0d0b22;
  box-shadow:0 0 0 1px rgba(103,232,249,.15),0 0 34px -6px rgba(34,211,238,.45),inset 0 0 40px rgba(34,211,238,.08);
  transform-style:preserve-3d;transition:transform .6s cubic-bezier(.3,.8,.25,1)}
.nn-tilt:hover .nn-card,.nn-tilt:focus-within .nn-card{transform:rotateX(9deg) rotateY(-15deg)}
.nn-card > *{transform:translateZ(var(--z,0))}
.nn-badge{justify-self:start;padding:5px 11px;border-radius:999px;border:1px solid var(--nn-magenta);color:#f5d0fe;font-size:.72rem;font-weight:800;letter-spacing:.18em;text-transform:uppercase;box-shadow:0 0 14px rgba(232,121,249,.5)}
.nn-card h3{font-size:1.3rem;font-weight:800}
.nn-price{font-size:2.6rem;font-weight:900;letter-spacing:-.02em;color:#fff;text-shadow:0 0 18px rgba(103,232,249,.7)}
.nn-price small{font-size:.95rem;font-weight:600;color:var(--nn-muted);text-shadow:none}
.nn-list{display:grid;gap:8px;font-size:.92rem;color:#ddd6fe}
.nn-list li{display:flex;gap:10px;align-items:center}
.nn-list li::before{content:"";width:8px;height:8px;border-radius:2px;background:var(--nn-cyan);box-shadow:0 0 8px var(--nn-cyan)}
.nn-join{padding:12px 18px;border:0;border-radius:12px;background:linear-gradient(90deg,#c026d3,#7c3aed);color:#fff;font:inherit;font-weight:800;cursor:pointer;box-shadow:0 0 24px rgba(192,38,211,.55)}
.nn-join:hover{background:linear-gradient(90deg,#a21caf,#6d28d9)}

/* C. wireframe cube beside a link card */
.nn-brand{position:relative;display:grid;grid-template-columns:auto 1fr;align-items:center;gap:26px;padding:26px;border-radius:20px;background:#0d0b22;box-shadow:0 0 0 1px rgba(196,181,253,.2)}
.nn-scene{display:grid;place-items:center;width:130px;height:130px;perspective:700px}
.nn-cube{--s:78px;position:relative;width:var(--s);height:var(--s);transform-style:preserve-3d;transform:rotateX(-24deg) rotateY(38deg);transition:transform 1s cubic-bezier(.3,.8,.25,1)}
.nn-cube i{position:absolute;inset:0;border:2px solid var(--nn-cyan);border-radius:4px;background:rgba(34,211,238,.06);box-shadow:0 0 12px rgba(34,211,238,.8),inset 0 0 12px rgba(34,211,238,.45)}
.nn-cube i:nth-child(1){transform:translateZ(calc(var(--s) / 2))}
.nn-cube i:nth-child(2){transform:rotateY(180deg) translateZ(calc(var(--s) / 2))}
.nn-cube i:nth-child(3){transform:rotateY(90deg) translateZ(calc(var(--s) / 2))}
.nn-cube i:nth-child(4){transform:rotateY(-90deg) translateZ(calc(var(--s) / 2))}
.nn-cube i:nth-child(5){transform:rotateX(90deg) translateZ(calc(var(--s) / 2));border-color:var(--nn-magenta);box-shadow:0 0 12px rgba(232,121,249,.8),inset 0 0 12px rgba(232,121,249,.45)}
.nn-cube i:nth-child(6){transform:rotateX(-90deg) translateZ(calc(var(--s) / 2))}
.nn-brand:hover .nn-cube,.nn-brand:focus-within .nn-cube{transform:rotateX(-24deg) rotateY(128deg)}
.nn-brand h3{font-size:1.15rem;font-weight:800}
.nn-brand p{margin-top:6px;font-size:.9rem;line-height:1.5;color:#ddd6fe}
.nn-brand a{display:inline-block;margin-top:12px;color:var(--nn-cyan);font-weight:800;font-size:.9rem;text-decoration:none}
.nn-brand a:hover{text-decoration:underline}
@media (max-width:420px){.nn-brand{grid-template-columns:1fr;justify-items:start}}

@media (prefers-reduced-motion:reduce){
  .nn-cta,.nn-card,.nn-cube{transition:none}
}

Bootstrap 5 code

Requires: Bootstrap 5.3.8 CSS

HTML
<div class="nn"><span class="lbl">Synthwave stage with an extruded neon title</span>
<section class="nn-stage" aria-labelledby="nn-title">
  <div class="nn-sun" aria-hidden="true"></div>
  <div class="nn-floor" aria-hidden="true"></div>
  <div class="nn-copy">
    <p class="nn-kicker">Synth night</p>
    <h2 class="nn-title" id="nn-title">Afterglow</h2>
    <p class="nn-when">Warehouse 9 · 21 June · doors 22:00</p>
    <a class="btn nn-cta" href="#">Get tickets<span class="visually-hidden"> for Afterglow</span></a>
  </div>
</section></div>

<div class="row row-cols-1 row-cols-md-2 duo nn">
  <div class="col"><span class="lbl">Layered card that tilts on hover and focus</span>
  <div class="nn-tilt">
    <article class="card nn-card" aria-labelledby="nn-pass">
      <span class="badge rounded-pill nn-badge" style="--z:50px">Members</span>
      <h3 id="nn-pass" style="--z:34px">Night Pass</h3>
      <p class="nn-price" style="--z:60px">€12 <small>a month</small></p>
      <ul class="nn-list list-unstyled mb-0" style="--z:24px"><li>Entry to every Saturday show</li><li>Skip the queue before midnight</li><li>Two guest passes a month</li></ul>
      <button class="btn nn-join" type="button" style="--z:40px">Join Night Pass</button>
    </article>
  </div></div>

  <div class="col"><span class="lbl">Wireframe cube that turns on hover and focus</span>
  <article class="card nn-brand" aria-labelledby="nn-vector"><div class="card-body">
    <div class="nn-scene" aria-hidden="true"><div class="nn-cube"><i></i><i></i><i></i><i></i><i></i><i></i></div></div>
    <div>
      <h3 id="nn-vector">Vector Labs</h3>
      <p>Open-source tools for 3D on the web. 4,200 stars, 61 contributors.</p>
      <a class="card-link" href="#">Read the docs<span class="visually-hidden"> for Vector Labs</span></a>
    </div>
  </div></article></div>
</div>
CSS
/* Neon 3D for dark interfaces, on Bootstrap .card, .badge and .btn in data-bs-theme="dark": a synthwave stage with a perspective grid floor and an extruded neon title, a layered card that
   tilts on hover or keyboard focus, and a wireframe cube that turns a quarter when its card is hovered or focused.
   Nothing moves on its own; under prefers-reduced-motion the hover and focus states change without transitions. */
.nn{--nn-pink:#f0abfc;--nn-magenta:#e879f9;--nn-cyan:#67e8f9;--nn-ink:#f5f3ff;--nn-muted:#c4b5fd;color:var(--nn-ink)}
.nn :where(h2,h3,p,ul){margin:0;padding:0;list-style:none}
.nn a:focus-visible,.nn .btn:focus-visible{outline:3px solid var(--nn-cyan);outline-offset:4px}

/* A. synthwave stage */
.nn-stage{position:relative;display:grid;justify-items:center;align-content:start;min-height:380px;padding:40px 20px 0;border-radius:22px;overflow:hidden;text-align:center;
  background:linear-gradient(180deg,#0b0620 0%,#2e1065 50%,#0b0620 58%);background-color:#0b0620;box-shadow:0 0 0 1px rgba(232,121,249,.25)}
.nn-sun{position:absolute;left:50%;top:84px;width:190px;height:190px;margin-left:-95px;border-radius:50%;background:linear-gradient(#fde047,#fb7185 55%,#c026d3);
  -webkit-mask-image:linear-gradient(#000 52%,transparent 52% 56%,#000 56% 64%,transparent 64% 69%,#000 69% 76%,transparent 76% 82%,#000 82%);
  mask-image:linear-gradient(#000 52%,transparent 52% 56%,#000 56% 64%,transparent 64% 69%,#000 69% 76%,transparent 76% 82%,#000 82%);filter:drop-shadow(0 0 30px rgba(251,113,133,.6))}
.nn-floor{position:absolute;left:-50%;right:-50%;top:58%;height:100%;transform-origin:50% 0;transform:perspective(260px) rotateX(64deg);
  background:linear-gradient(var(--nn-magenta) 2px,transparent 2px) 0 0/64px 44px,linear-gradient(90deg,var(--nn-magenta) 2px,transparent 2px) 0 0/64px 44px;
  -webkit-mask-image:linear-gradient(transparent,#000 22%);mask-image:linear-gradient(transparent,#000 22%);filter:drop-shadow(0 0 6px var(--nn-magenta))}
.nn-copy{position:relative;display:grid;justify-items:center;gap:10px}
.nn-kicker{font-size:.74rem;font-weight:800;letter-spacing:.32em;text-transform:uppercase;color:var(--nn-cyan)}
.nn-title{font-family:"Arial Black","Helvetica Neue",Arial,sans-serif;font-weight:900;font-size:clamp(2.6rem,10vw,4.6rem);line-height:1;letter-spacing:.04em;color:#fff;
  text-shadow:0 0 4px var(--nn-pink),0 1px 0 #d946ef,0 2px 0 #c026d3,0 3px 0 #a21caf,0 4px 0 #86198f,0 5px 0 #701a75,0 6px 0 #581c5f,0 0 22px var(--nn-magenta),0 0 46px #c026d3}
.nn-when{padding:6px 14px;border-radius:999px;background:rgba(11,6,32,.82);font-size:.88rem;color:#f5d0fe;box-shadow:0 0 0 1px rgba(232,121,249,.3)}
.nn-cta{--bs-btn-padding-x:22px;--bs-btn-padding-y:12px;--bs-btn-font-weight:800;--bs-btn-border-radius:12px;--bs-btn-border-width:2px;--bs-btn-border-color:var(--nn-cyan);--bs-btn-bg:#082f49;--bs-btn-color:#ecfeff;
  --bs-btn-hover-bg:#082f49;--bs-btn-hover-color:#ecfeff;--bs-btn-hover-border-color:var(--nn-cyan);--bs-btn-active-bg:#082f49;--bs-btn-active-color:#ecfeff;--bs-btn-active-border-color:var(--nn-cyan);margin:150px 0 34px;
  box-shadow:0 6px 0 #0e7490,0 0 22px rgba(103,232,249,.45),inset 0 0 12px rgba(103,232,249,.25);transition:transform .12s,box-shadow .12s}
.nn-cta:hover{box-shadow:0 6px 0 #0e7490,0 0 34px rgba(103,232,249,.7),inset 0 0 14px rgba(103,232,249,.35)}
.nn-cta:active,.btn.nn-cta:first-child:active{transform:translateY(5px);box-shadow:0 1px 0 #0e7490,0 0 18px rgba(103,232,249,.45),inset 0 0 12px rgba(103,232,249,.25)}

/* B. layered card: the planes sit at different translateZ depths and the card tilts on hover or focus-within */
.nn-tilt{perspective:900px}
.nn-card{--bs-card-bg:#0d0b22;--bs-card-border-color:rgba(103,232,249,.55);--bs-card-border-radius:20px;--bs-card-color:var(--nn-ink);display:grid;gap:14px;padding:26px;
  box-shadow:0 0 0 1px rgba(103,232,249,.15),0 0 34px -6px rgba(34,211,238,.45),inset 0 0 40px rgba(34,211,238,.08);
  transform-style:preserve-3d;transition:transform .6s cubic-bezier(.3,.8,.25,1)}
.nn-tilt:hover .nn-card,.nn-tilt:focus-within .nn-card{transform:rotateX(9deg) rotateY(-15deg)}
.nn-card > *{transform:translateZ(var(--z,0))}
.nn-badge{--bs-badge-padding-x:11px;--bs-badge-padding-y:5px;--bs-badge-font-size:.72rem;--bs-badge-font-weight:800;--bs-badge-color:#f5d0fe;justify-self:start;border:1px solid var(--nn-magenta);letter-spacing:.18em;text-transform:uppercase;box-shadow:0 0 14px rgba(232,121,249,.5)}
.nn-card h3{font-size:1.3rem;font-weight:800}
.nn-price{font-size:2.6rem;font-weight:900;letter-spacing:-.02em;color:#fff;text-shadow:0 0 18px rgba(103,232,249,.7)}
.nn-price small{font-size:.95rem;font-weight:600;color:var(--nn-muted);text-shadow:none}
.nn-list{display:grid;gap:8px;font-size:.92rem;color:#ddd6fe}
.nn-list li{display:flex;gap:10px;align-items:center}
.nn-list li::before{content:"";width:8px;height:8px;border-radius:2px;background:var(--nn-cyan);box-shadow:0 0 8px var(--nn-cyan)}
.nn-join{--bs-btn-padding-y:12px;--bs-btn-font-weight:800;--bs-btn-border-radius:12px;--bs-btn-border-width:0;--bs-btn-color:#fff;--bs-btn-hover-color:#fff;--bs-btn-active-color:#fff;
  background:linear-gradient(90deg,#c026d3,#7c3aed);box-shadow:0 0 24px rgba(192,38,211,.55)}
.nn-join:hover,.nn-join:active{background:linear-gradient(90deg,#a21caf,#6d28d9)}

/* C. wireframe cube beside a link card */
.nn-brand{--bs-card-bg:#0d0b22;--bs-card-border-color:rgba(196,181,253,.2);--bs-card-border-radius:20px;--bs-card-color:var(--nn-ink)}
.nn-brand .card-body{display:grid;grid-template-columns:auto 1fr;align-items:center;gap:26px;padding:26px}
.nn-scene{display:grid;place-items:center;width:130px;height:130px;perspective:700px}
.nn-cube{--s:78px;position:relative;width:var(--s);height:var(--s);transform-style:preserve-3d;transform:rotateX(-24deg) rotateY(38deg);transition:transform 1s cubic-bezier(.3,.8,.25,1)}
.nn-cube i{position:absolute;inset:0;border:2px solid var(--nn-cyan);border-radius:4px;background:rgba(34,211,238,.06);box-shadow:0 0 12px rgba(34,211,238,.8),inset 0 0 12px rgba(34,211,238,.45)}
.nn-cube i:nth-child(1){transform:translateZ(calc(var(--s) / 2))}
.nn-cube i:nth-child(2){transform:rotateY(180deg) translateZ(calc(var(--s) / 2))}
.nn-cube i:nth-child(3){transform:rotateY(90deg) translateZ(calc(var(--s) / 2))}
.nn-cube i:nth-child(4){transform:rotateY(-90deg) translateZ(calc(var(--s) / 2))}
.nn-cube i:nth-child(5){transform:rotateX(90deg) translateZ(calc(var(--s) / 2));border-color:var(--nn-magenta);box-shadow:0 0 12px rgba(232,121,249,.8),inset 0 0 12px rgba(232,121,249,.45)}
.nn-cube i:nth-child(6){transform:rotateX(-90deg) translateZ(calc(var(--s) / 2))}
.nn-brand:hover .nn-cube,.nn-brand:focus-within .nn-cube{transform:rotateX(-24deg) rotateY(128deg)}
.nn-brand h3{font-size:1.15rem;font-weight:800}
.nn-brand p{margin-top:6px;font-size:.9rem;line-height:1.5;color:#ddd6fe}
.nn-brand .card-link{display:inline-block;margin-top:12px;color:var(--nn-cyan);font-weight:800;font-size:.9rem;text-decoration:none}
.nn-brand .card-link:hover{text-decoration:underline}
@media (max-width:420px){.nn-brand .card-body{grid-template-columns:1fr;justify-items:start}}

@media (prefers-reduced-motion:reduce){
  .nn-cta,.nn-card,.nn-cube{transition:none}
}

Tailwind 4 code

Requires: Tailwind CSS 4

HTML
<div class="text-[#f5f3ff]"><span class="mb-[18px] block text-[.72rem] tracking-[.12em] text-[#a5a0c4] uppercase">Synthwave stage with an extruded neon title</span>
<section class="relative grid min-h-[380px] content-start justify-items-center overflow-hidden rounded-[22px] bg-[#0b0620] bg-[linear-gradient(180deg,#0b0620_0%,#2e1065_50%,#0b0620_58%)] px-5 pt-10 text-center shadow-[0_0_0_1px_rgba(232,121,249,.25)]" aria-labelledby="nnw-title">
  <div class="absolute top-[84px] left-1/2 -ml-[95px] size-[190px] rounded-full bg-[linear-gradient(#fde047,#fb7185_55%,#c026d3)] drop-shadow-[0_0_30px_rgba(251,113,133,.6)] [mask-image:linear-gradient(#000_52%,transparent_52%_56%,#000_56%_64%,transparent_64%_69%,#000_69%_76%,transparent_76%_82%,#000_82%)]" aria-hidden="true"></div>
  <div class="nn-grid absolute top-[58%] -right-1/2 -left-1/2 h-full origin-top drop-shadow-[0_0_6px_#e879f9] [mask-image:linear-gradient(transparent,#000_22%)] [transform:perspective(260px)_rotateX(64deg)]" aria-hidden="true"></div>
  <div class="relative grid justify-items-center gap-2.5">
    <p class="text-[.74rem] font-extrabold tracking-[.32em] text-[#67e8f9] uppercase">Synth night</p>
    <h2 class="font-['Arial_Black','Helvetica_Neue',Arial,sans-serif] text-[clamp(2.6rem,10vw,4.6rem)] leading-none font-black tracking-[.04em] text-white [text-shadow:0_0_4px_#f0abfc,0_1px_0_#d946ef,0_2px_0_#c026d3,0_3px_0_#a21caf,0_4px_0_#86198f,0_5px_0_#701a75,0_6px_0_#581c5f,0_0_22px_#e879f9,0_0_46px_#c026d3]" id="nnw-title">Afterglow</h2>
    <p class="rounded-full bg-[rgba(11,6,32,.82)] px-3.5 py-1.5 text-[.88rem] text-[#f5d0fe] shadow-[0_0_0_1px_rgba(232,121,249,.3)]">Warehouse 9 · 21 June · doors 22:00</p>
    <a class="mt-[150px] mb-[34px] inline-block rounded-xl border-2 border-[#67e8f9] bg-[#082f49] px-[22px] py-3 font-extrabold text-[#ecfeff] no-underline shadow-[0_6px_0_#0e7490,0_0_22px_rgba(103,232,249,.45),inset_0_0_12px_rgba(103,232,249,.25)] transition-[translate,box-shadow] duration-[120ms] hover:shadow-[0_6px_0_#0e7490,0_0_34px_rgba(103,232,249,.7),inset_0_0_14px_rgba(103,232,249,.35)] focus-visible:outline-3 focus-visible:outline-offset-4 focus-visible:outline-[#67e8f9] active:translate-y-[5px] active:shadow-[0_1px_0_#0e7490,0_0_18px_rgba(103,232,249,.45),inset_0_0_12px_rgba(103,232,249,.25)] motion-reduce:transition-none" href="#">Get tickets<span class="sr-only"> for Afterglow</span></a>
  </div>
</section></div>

<div class="grid grid-cols-[repeat(auto-fit,minmax(min(100%,320px),1fr))] gap-10 text-[#f5f3ff]">
  <div><span class="mb-[18px] block text-[.72rem] tracking-[.12em] text-[#a5a0c4] uppercase">Layered card that tilts on hover and focus</span>
  <div class="group perspective-[900px]">
    <article class="relative grid gap-3.5 rounded-[20px] border border-[rgba(103,232,249,.55)] bg-[#0d0b22] p-[26px] shadow-[0_0_0_1px_rgba(103,232,249,.15),0_0_34px_-6px_rgba(34,211,238,.45),inset_0_0_40px_rgba(34,211,238,.08)] transition-transform duration-600 ease-[cubic-bezier(.3,.8,.25,1)] transform-3d group-focus-within:[transform:rotateX(9deg)_rotateY(-15deg)] group-hover:[transform:rotateX(9deg)_rotateY(-15deg)] motion-reduce:transition-none" aria-labelledby="nnw-pass">
      <span class="justify-self-start rounded-full border border-[#e879f9] px-[11px] py-[5px] text-[.72rem] font-extrabold tracking-[.18em] text-[#f5d0fe] uppercase shadow-[0_0_14px_rgba(232,121,249,.5)] [transform:translateZ(50px)]">Members</span>
      <h3 class="text-[1.3rem] font-extrabold [transform:translateZ(34px)]" id="nnw-pass">Night Pass</h3>
      <p class="text-[2.6rem] font-black tracking-[-.02em] text-white [text-shadow:0_0_18px_rgba(103,232,249,.7)] [transform:translateZ(60px)]">€12 <small class="text-[.95rem] font-semibold text-[#c4b5fd] [text-shadow:none]">a month</small></p>
      <ul class="grid gap-2 text-[.92rem] text-[#ddd6fe] [transform:translateZ(24px)]"><li class="flex items-center gap-2.5 before:size-2 before:rounded-[2px] before:bg-[#67e8f9] before:shadow-[0_0_8px_#67e8f9] before:content-['']">Entry to every Saturday show</li><li class="flex items-center gap-2.5 before:size-2 before:rounded-[2px] before:bg-[#67e8f9] before:shadow-[0_0_8px_#67e8f9] before:content-['']">Skip the queue before midnight</li><li class="flex items-center gap-2.5 before:size-2 before:rounded-[2px] before:bg-[#67e8f9] before:shadow-[0_0_8px_#67e8f9] before:content-['']">Two guest passes a month</li></ul>
      <button class="cursor-pointer rounded-xl bg-[linear-gradient(90deg,#c026d3,#7c3aed)] px-[18px] py-3 font-extrabold text-white shadow-[0_0_24px_rgba(192,38,211,.55)] [transform:translateZ(40px)] hover:bg-[linear-gradient(90deg,#a21caf,#6d28d9)] focus-visible:outline-3 focus-visible:outline-offset-4 focus-visible:outline-[#67e8f9]" type="button">Join Night Pass</button>
    </article>
  </div></div>

  <div><span class="mb-[18px] block text-[.72rem] tracking-[.12em] text-[#a5a0c4] uppercase">Wireframe cube that turns on hover and focus</span>
  <article class="group relative grid grid-cols-[auto_1fr] items-center gap-[26px] rounded-[20px] bg-[#0d0b22] p-[26px] shadow-[0_0_0_1px_rgba(196,181,253,.2)] max-[420px]:grid-cols-1 max-[420px]:justify-items-start" aria-labelledby="nnw-vector">
    <div class="grid size-[130px] place-items-center perspective-[700px]" aria-hidden="true"><div class="relative size-(--s) transition-transform duration-1000 ease-[cubic-bezier(.3,.8,.25,1)] transform-3d [--s:78px] [transform:rotateX(-24deg)_rotateY(38deg)] group-focus-within:[transform:rotateX(-24deg)_rotateY(128deg)] group-hover:[transform:rotateX(-24deg)_rotateY(128deg)] motion-reduce:transition-none"><i class="absolute inset-0 rounded-[4px] border-2 border-[#67e8f9] bg-[rgba(34,211,238,.06)] shadow-[0_0_12px_rgba(34,211,238,.8),inset_0_0_12px_rgba(34,211,238,.45)] [transform:translateZ(calc(var(--s)/2))]"></i><i class="absolute inset-0 rounded-[4px] border-2 border-[#67e8f9] bg-[rgba(34,211,238,.06)] shadow-[0_0_12px_rgba(34,211,238,.8),inset_0_0_12px_rgba(34,211,238,.45)] [transform:rotateY(180deg)_translateZ(calc(var(--s)/2))]"></i><i class="absolute inset-0 rounded-[4px] border-2 border-[#67e8f9] bg-[rgba(34,211,238,.06)] shadow-[0_0_12px_rgba(34,211,238,.8),inset_0_0_12px_rgba(34,211,238,.45)] [transform:rotateY(90deg)_translateZ(calc(var(--s)/2))]"></i><i class="absolute inset-0 rounded-[4px] border-2 border-[#67e8f9] bg-[rgba(34,211,238,.06)] shadow-[0_0_12px_rgba(34,211,238,.8),inset_0_0_12px_rgba(34,211,238,.45)] [transform:rotateY(-90deg)_translateZ(calc(var(--s)/2))]"></i><i class="absolute inset-0 rounded-[4px] border-2 border-[#67e8f9] bg-[rgba(34,211,238,.06)] shadow-[0_0_12px_rgba(34,211,238,.8),inset_0_0_12px_rgba(34,211,238,.45)] [transform:rotateX(90deg)_translateZ(calc(var(--s)/2))] border-[#e879f9]! shadow-[0_0_12px_rgba(232,121,249,.8),inset_0_0_12px_rgba(232,121,249,.45)]!"></i><i class="absolute inset-0 rounded-[4px] border-2 border-[#67e8f9] bg-[rgba(34,211,238,.06)] shadow-[0_0_12px_rgba(34,211,238,.8),inset_0_0_12px_rgba(34,211,238,.45)] [transform:rotateX(-90deg)_translateZ(calc(var(--s)/2))]"></i></div></div>
    <div>
      <h3 class="text-[1.15rem] font-extrabold" id="nnw-vector">Vector Labs</h3>
      <p class="mt-1.5 text-[.9rem] leading-normal text-[#ddd6fe]">Open-source tools for 3D on the web. 4,200 stars, 61 contributors.</p>
      <a class="mt-3 inline-block text-[.9rem] font-extrabold text-[#67e8f9] no-underline hover:underline focus-visible:outline-3 focus-visible:outline-offset-4 focus-visible:outline-[#67e8f9]" href="#">Read the docs<span class="sr-only"> for Vector Labs</span></a>
    </div>
  </article></div>
</div>
CSS
/* The neon grid floor of the stage, drawn as two repeating line gradients on a plane tipped back with perspective. */
@utility nn-grid{background:linear-gradient(#e879f9 2px,transparent 2px) 0 0/64px 44px,linear-gradient(90deg,#e879f9 2px,transparent 2px) 0 0/64px 44px}

About this set

Neon 3D for dark interfaces, in three variants. The synthwave stage is an event hero with a striped sunset sun, a glowing grid floor tipped back with perspective, an extruded neon title and a cyan Get tickets button that sinks when pressed. The layered card is a Night Pass membership card whose badge, price, list and button sit at different depths with translateZ; on hover or keyboard focus it tilts to a fixed angle, so the layers separate. The wireframe cube is a brand card with a cube drawn from six transparent faces with glowing edges, which turns a quarter when the card is hovered or a link inside it is focused. Nothing moves on its own: every movement is a transition into a hover or focus state, and under prefers-reduced-motion those states apply without the transition. The glows are box-shadows and text-shadows in the accent colours, and the text colours are checked for contrast on the near-black ground. Use the stage for event and launch pages, the card for pricing and the cube as a logo mark beside a product link.

What’s included

  • Perspective grid floor and striped sun behind an extruded neon title
  • Layered membership card that tilts on hover and keyboard focus
  • Glowing wireframe cube that turns a quarter on hover or focus
  • No continuous animation; nothing moves until hovered or focused
  • Bootstrap version runs in data-bs-theme="dark"

Accessibility

Headings, prices and links are real text with contrast checked on the dark ground, and the sun, grid and cube are aria-hidden decoration. Focus inside the layered card or the brand card triggers the same tilt and turn as hover, and every link and button shows a 3px cyan focus outline. Transitions are removed under prefers-reduced-motion.

Customise it

The neon colours are --nn-pink, --nn-magenta and --nn-cyan on .nn; the grid cell is the 64px by 44px background size on .nn-floor and its angle the rotateX(64deg). Card depths are the --z values on each layer. In Tailwind the grid lives in the nn-grid utility and the rest in arbitrary values.