About this snippet

Organize payment methods elegantly with a digital crypto wallet stack. Tap the deck to watch the cards slide down into a fully visible, beautifully spaced list for perfect readability.

Size
6.6 KB
Uses
HTML, CSS, JavaScript
Loads
Nothing external
Views
202
<div class="wallet-dashboard">
  <div class="header-text">
    <h2>Digital Vault</h2>
    <p>Tap the stack to expand your wallets.</p>
  </div>

  <div class="deck-container" id="card-deck">
    
    <!-- Card 1: Bitcoin -->
    <div class="crypto-card btc-card pos-1">
      <div class="card-glow"></div>
      <div class="card-inner">
        <div class="card-top">
          <span class="coin-name">Bitcoin</span>
          <!-- Accurate BTC Icon -->
          <svg viewBox="0 0 24 24" width="28" height="28" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
            <path d="M9 8h6a3 3 0 0 1 0 6H9"></path>
            <path d="M9 14h7a3 3 0 0 1 0 6H9"></path>
            <path d="M9 8v12"></path>
            <path d="M11 6v2"></path>
            <path d="M15 6v2"></path>
            <path d="M11 20v2"></path>
            <path d="M15 20v2"></path>
          </svg>
        </div>
        <div class="card-middle">
          <div class="balance">1.245 BTC</div>
          <div class="fiat">$82,450.00</div>
        </div>
        <div class="card-bottom">
          <span class="card-number">**** 3921</span>
          <span class="card-exp">12/28</span>
        </div>
      </div>
    </div>

    <!-- Card 2: Ethereum -->
    <div class="crypto-card eth-card pos-2">
      <div class="card-glow"></div>
      <div class="card-inner">
        <div class="card-top">
          <span class="coin-name">Ethereum</span>
          <!-- Accurate ETH Icon -->
          <svg viewBox="0 0 24 24" width="28" height="28" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
            <polygon points="12 2 7 12 12 16 17 12"></polygon>
            <polygon points="12 22 7 14 12 17 17 14"></polygon>
          </svg>
        </div>
        <div class="card-middle">
          <div class="balance">8.450 ETH</div>
          <div class="fiat">$29,320.00</div>
        </div>
        <div class="card-bottom">
          <span class="card-number">**** 8402</span>
          <span class="card-exp">09/27</span>
        </div>
      </div>
    </div>

    <!-- Card 3: Solana -->
    <div class="crypto-card sol-card pos-3">
      <div class="card-glow"></div>
      <div class="card-inner">
        <div class="card-top">
          <span class="coin-name">Solana</span>
          <!-- Accurate SOL Icon -->
          <svg viewBox="0 0 24 24" width="28" height="28" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
            <polygon points="5 8 9 4 19 4 15 8"></polygon>
            <polygon points="19 12 15 16 5 16 9 12"></polygon>
            <polygon points="5 20 9 16 19 16 15 20"></polygon>
          </svg>
        </div>
        <div class="card-middle">
          <div class="balance">142.00 SOL</div>
          <div class="fiat">$18,460.00</div>
        </div>
        <div class="card-bottom">
          <span class="card-number">**** 5519</span>
          <span class="card-exp">04/29</span>
        </div>
      </div>
    </div>
    
  </div>
</div>
*, *::before, *::after {
  box-sizing: border-box;
}

body {
  font-family: system-ui, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
  margin: 0;
  background: #020617;
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 100vh;
  /* Allow scrolling when cards expand */
  overflow-y: auto;
  padding: 40px 20px;
}

.wallet-dashboard {
  display: flex;
  flex-direction: column;
  align-items: center;
  width: 100%;
}

.header-text {
  text-align: center;
  margin-bottom: 50px;
  color: #f8fafc;
}

.header-text h2 {
  font-size: 2.5rem;
  margin: 0 0 10px 0;
  letter-spacing: -1px;
}

.header-text p {
  color: #94a3b8;
  margin: 0;
  font-size: 1.125rem;
}

.deck-container {
  position: relative;
  width: 320px;
  /* Height when closed, adjusts via JS when opened */
  height: 250px;
  cursor: pointer;
  transition: height 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
}

.crypto-card {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 200px;
  border-radius: 24px;
  padding: 2px;
  transition: transform 0.5s cubic-bezier(0.34, 1.56, 0.64, 1), box-shadow 0.5s ease, opacity 0.5s ease;
  will-change: transform;
}

.card-inner {
  background: rgba(15, 23, 42, 0.9);
  backdrop-filter: blur(20px);
  width: 100%;
  height: 100%;
  border-radius: 22px;
  padding: 24px;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  color: #ffffff;
  z-index: 2;
  position: relative;
}

.card-glow {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  border-radius: 24px;
  z-index: 1;
  opacity: 0.8;
}

.btc-card .card-glow { background: linear-gradient(135deg, #f59e0b, #ea580c); }
.eth-card .card-glow { background: linear-gradient(135deg, #8b5cf6, #4f46e5); }
.sol-card .card-glow { background: linear-gradient(135deg, #10b981, #0ea5e9); }

.card-top {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

.coin-name {
  font-size: 1.25rem;
  font-weight: 600;
  letter-spacing: 1px;
}

.card-middle {
  margin: 20px 0;
}

.balance {
  font-size: 2rem;
  font-weight: 800;
  margin-bottom: 4px;
  letter-spacing: -0.5px;
}

.fiat {
  font-size: 1rem;
  color: #94a3b8;
  font-weight: 500;
}

.card-bottom {
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-family: "Courier New", Courier, monospace;
  font-size: 1.1rem;
  color: #cbd5e1;
  letter-spacing: 2px;
}

/* Base Stacked State */
.pos-1 { z-index: 3; transform: translateY(0) scale(1); box-shadow: 0 10px 30px rgba(0,0,0,0.5); }
.pos-2 { z-index: 2; transform: translateY(16px) scale(0.95); opacity: 0.9; }
.pos-3 { z-index: 1; transform: translateY(32px) scale(0.9); opacity: 0.8; }

/* Expanded List State - 100% Visibility */
.deck-container.is-open .crypto-card {
  opacity: 1;
  box-shadow: 0 15px 35px rgba(0,0,0,0.4);
}

/* Card 1 stays at top */
.deck-container.is-open .pos-1 {
  transform: translateY(0) scale(1);
}

/* Card 2 drops down (200px height + 20px gap) */
.deck-container.is-open .pos-2 {
  transform: translateY(220px) scale(1);
}

/* Card 3 drops further down (440px total) */
.deck-container.is-open .pos-3 {
  transform: translateY(440px) scale(1);
}
const deck = document.getElementById("card-deck");

deck.addEventListener("click", function() {
  deck.classList.toggle("is-open");
  
  if (deck.classList.contains("is-open")) {
    /* Expand container height to fit all 3 cards (200px each + 20px gaps) */
    deck.style.height = "680px";
  } else {
    /* Collapse container height back to original */
    deck.style.height = "250px";
  }
});
Esc
↑↓ moveEnter select

Start from a template

Open an .html file, or HTML, CSS, JS, Markdown, Less or TypeScript files. You can also drop them here. Styles and scripts go into their panes.

Share

Source

Keyboard shortcuts

Save