Files
nebula/_migrate/transactions.html

992 lines
34 KiB
HTML

<!DOCTYPE html>
<!--
================================================================================
TEMPL MIGRATION GUIDE: transactions.html → views/transactions.templ
================================================================================
PAGE OVERVIEW:
- Transaction history with date-grouped list view
- Stats: Total Received, Total Sent, Swaps count, Gas Spent
- Multi-filter bar: Type, Asset, Account, Date range, Search
- Transaction rows with type icon, details, asset, amount, time, actions
- Pagination with page size selector
- Export functionality
MAIN TEMPL COMPONENT:
templ TransactionsPage(data TransactionsData) {
@layouts.DashboardLayout("transactions") {
@PageHeader("Transactions", "Activity history across all accounts")
@TransactionsStatsGrid(data.Stats)
@TransactionsCard(data.Groups, data.Filter, data.Pagination)
}
}
HTMX INTEGRATION:
- Filter dropdowns: hx-get="/transactions" hx-target="#tx-list" hx-include="[name^='filter']"
- Date range: hx-get="/transactions?from={date}&to={date}" hx-target="#tx-list"
- Search: hx-get="/transactions?search={query}" hx-trigger="keyup changed delay:300ms"
- Pagination: hx-get="/transactions?page=2" hx-target="#tx-list" hx-push-url="true"
- Page size: hx-get="/transactions?limit=25" hx-target="#tx-list"
- Export: hx-get="/api/transactions/export?format=csv" (triggers download)
- View on explorer: Client-side window.open()
- Copy hash: Client-side wa-copy-button
SUB-COMPONENTS TO EXTRACT:
- TransactionsStatsGrid(stats TxStats)
- TransactionsCard(groups []TxDateGroup, filter TxFilter, pagination Pagination)
- TransactionFilterBar(filter TxFilter)
- DateRangeFilter(from, to time.Time)
- TransactionDateGroup(date string, count int, txs []Transaction)
- TransactionRow(tx Transaction)
- TransactionIcon(txType string)
- TransactionAssetBadge(asset string, toAsset string)
- TransactionAmount(amount float64, usd float64, isPositive bool)
- TransactionTime(timestamp time.Time, status string)
- TransactionActions(hash string, explorerURL string)
- PaginationControls(pagination Pagination)
STATE/PROPS:
type TransactionsData struct {
Stats TxStats
Groups []TxDateGroup
Filter TxFilter
Pagination Pagination
}
type TxStats struct {
TotalReceived float64
ReceivedCount int
TotalSent float64
SentCount int
SwapCount int
SwapVolume float64
TotalGasSpent float64
}
type TxFilter struct {
Type string // "send", "receive", "swap", "approve", "contract"
Asset string
Account string
FromDate string
ToDate string
Search string
}
type TxDateGroup struct {
Date string
Count int
Transactions []Transaction
}
type Transaction struct {
Type string // "send", "receive", "swap", "approve", "contract"
Title string
Description string
Asset string
ToAsset string // For swaps
Amount float64
AmountUSD float64
IsPositive bool
Timestamp time.Time
Status string // "confirmed", "pending", "failed"
Hash string
ExplorerURL string
}
type Pagination struct {
Page int
Limit int
Total int
TotalPages int
}
HTMX PATTERNS:
// Multi-filter bar with combined include
<wa-select hx-get="/transactions"
hx-target="#tx-list"
hx-include="[name^='filter-']"
name="filter-type">
// Search with debounce
<wa-input hx-get="/transactions"
hx-trigger="keyup changed delay:300ms"
hx-target="#tx-list"
hx-include="[name^='filter-']"
name="filter-search">
// Date range picker
<wa-input type="date"
hx-get="/transactions"
hx-trigger="change"
hx-target="#tx-list"
hx-include="[name^='filter-']"
name="filter-from">
// Pagination with page size
<wa-select hx-get="/transactions"
hx-target="#tx-list"
hx-include="[name^='filter-']"
name="limit">
// Page number buttons
<button class="page-btn"
hx-get="/transactions?page=2"
hx-target="#tx-list"
hx-push-url="true">
// Export button (non-HTMX, download)
<wa-button onclick="window.location.href='/api/transactions/export?format=csv'">
================================================================================
-->
<html lang="en" class="wa-cloak">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Transactions - Sonr Motr Wallet</title>
<script src="https://cdn.sonr.org/wa/autoloader.js"></script>
<style>
:root {
--wa-color-primary: #17c2ff;
}
html, body {
min-height: 100%;
padding: 0;
margin: 0;
}
.dashboard-layout {
display: grid;
grid-template-columns: 240px 1fr;
min-height: 100vh;
}
@media (max-width: 768px) {
.dashboard-layout {
grid-template-columns: 1fr;
}
.sidebar {
display: none;
}
}
.sidebar {
border-right: 1px solid var(--wa-color-neutral-200);
padding: var(--wa-space-m);
background: var(--wa-color-surface);
}
.sidebar-header {
padding: var(--wa-space-s) var(--wa-space-xs);
margin-bottom: var(--wa-space-m);
}
.sidebar-nav {
list-style: none;
padding: 0;
margin: 0;
}
.sidebar-nav li {
margin-bottom: var(--wa-space-2xs);
}
.sidebar-nav a {
display: flex;
align-items: center;
gap: var(--wa-space-s);
padding: var(--wa-space-s) var(--wa-space-m);
border-radius: var(--wa-radius-m);
text-decoration: none;
color: var(--wa-color-neutral-700);
font-size: var(--wa-font-size-s);
transition: background 0.15s;
}
.sidebar-nav a:hover {
background: var(--wa-color-surface-alt);
}
.sidebar-nav a.active {
background: var(--wa-color-primary-subtle);
color: var(--wa-color-primary);
font-weight: 500;
}
.main-content {
padding: var(--wa-space-xl);
background: var(--wa-color-surface-alt);
overflow-y: auto;
}
.page-header {
margin-bottom: var(--wa-space-xl);
}
.stats-grid {
--min-column-size: 180px;
margin-bottom: var(--wa-space-xl);
}
.stat-card {
background: var(--wa-color-surface);
}
.filter-bar {
display: flex;
align-items: center;
gap: var(--wa-space-m);
margin-bottom: var(--wa-space-l);
flex-wrap: wrap;
}
.date-group {
margin-bottom: var(--wa-space-xl);
}
.date-group-header {
display: flex;
align-items: center;
gap: var(--wa-space-s);
padding: var(--wa-space-s) 0;
margin-bottom: var(--wa-space-s);
border-bottom: 1px solid var(--wa-color-neutral-200);
}
.date-group-header h3 {
margin: 0;
font-size: var(--wa-font-size-s);
font-weight: 600;
color: var(--wa-color-neutral-700);
}
.date-group-header .tx-count {
font-size: var(--wa-font-size-xs);
color: var(--wa-color-neutral-500);
}
.tx-row {
display: grid;
grid-template-columns: auto 1fr auto auto auto;
gap: var(--wa-space-m);
align-items: center;
padding: var(--wa-space-m);
background: var(--wa-color-surface);
border-radius: var(--wa-radius-m);
margin-bottom: var(--wa-space-s);
transition: box-shadow 0.15s;
}
.tx-row:hover {
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
}
.tx-icon {
width: 40px;
height: 40px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
}
.tx-icon.send {
background: var(--wa-color-danger-subtle);
color: var(--wa-color-danger);
}
.tx-icon.receive {
background: var(--wa-color-success-subtle);
color: var(--wa-color-success);
}
.tx-icon.swap {
background: var(--wa-color-primary-subtle);
color: var(--wa-color-primary);
}
.tx-icon.contract {
background: var(--wa-color-warning-subtle);
color: var(--wa-color-warning);
}
.tx-icon.approve {
background: var(--wa-color-neutral-100);
color: var(--wa-color-neutral-600);
}
.tx-details {
min-width: 0;
}
.tx-type {
font-weight: 500;
margin-bottom: 2px;
}
.tx-address {
font-family: var(--wa-font-mono);
font-size: var(--wa-font-size-xs);
color: var(--wa-color-neutral-500);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.tx-asset {
display: flex;
align-items: center;
gap: var(--wa-space-xs);
}
.tx-amount {
text-align: right;
}
.tx-amount .value {
font-weight: 500;
}
.tx-amount .usd {
font-size: var(--wa-font-size-xs);
color: var(--wa-color-neutral-500);
}
.tx-amount.positive .value { color: var(--wa-color-success); }
.tx-amount.negative .value { color: var(--wa-color-danger); }
.tx-time {
text-align: right;
min-width: 80px;
}
.tx-time .time {
font-size: var(--wa-font-size-s);
}
.tx-time .status {
font-size: var(--wa-font-size-xs);
}
.tx-actions {
display: flex;
gap: var(--wa-space-2xs);
}
.pagination {
display: flex;
align-items: center;
justify-content: space-between;
padding: var(--wa-space-m) 0;
margin-top: var(--wa-space-l);
border-top: 1px solid var(--wa-color-neutral-200);
}
.pagination-info {
font-size: var(--wa-font-size-s);
color: var(--wa-color-neutral-500);
}
.pagination-controls {
display: flex;
align-items: center;
gap: var(--wa-space-xs);
}
.page-numbers {
display: flex;
gap: var(--wa-space-2xs);
}
.page-btn {
min-width: 32px;
height: 32px;
display: flex;
align-items: center;
justify-content: center;
border-radius: var(--wa-radius-s);
font-size: var(--wa-font-size-s);
cursor: pointer;
border: 1px solid var(--wa-color-neutral-200);
background: var(--wa-color-surface);
color: var(--wa-color-neutral-700);
transition: all 0.15s;
}
.page-btn:hover {
background: var(--wa-color-surface-alt);
}
.page-btn.active {
background: var(--wa-color-primary);
border-color: var(--wa-color-primary);
color: white;
}
.page-btn:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.empty-state {
text-align: center;
padding: var(--wa-space-3xl);
color: var(--wa-color-neutral-500);
}
@media (max-width: 900px) {
.tx-row {
grid-template-columns: auto 1fr auto;
}
.tx-asset, .tx-time {
display: none;
}
}
</style>
</head>
<body>
<wa-page>
<div class="dashboard-layout">
<aside class="sidebar">
<div class="sidebar-header">
<div class="wa-cluster wa-gap-s">
<wa-avatar initials="S" style="--size: 32px; background: var(--wa-color-primary);"></wa-avatar>
<div class="wa-stack wa-gap-0">
<span class="wa-heading-s">Sonr Wallet</span>
<span class="wa-caption-xs" style="color: var(--wa-color-neutral-500);">sonr1x9f...7k2m</span>
</div>
</div>
</div>
<nav>
<ul class="sidebar-nav">
<li>
<a href="accounts.html">
<wa-icon name="wallet"></wa-icon>
Accounts
</a>
</li>
<li>
<a href="transactions.html" class="active">
<wa-icon name="arrow-right-arrow-left"></wa-icon>
Transactions
</a>
</li>
<li>
<a href="tokens.html">
<wa-icon name="coins"></wa-icon>
Tokens
</a>
</li>
<li>
<a href="nfts.html">
<wa-icon name="image"></wa-icon>
NFTs
</a>
</li>
<li>
<a href="activity.html">
<wa-icon name="chart-line"></wa-icon>
Activity
</a>
</li>
</ul>
</nav>
<wa-divider style="margin: var(--wa-space-l) 0;"></wa-divider>
<ul class="sidebar-nav">
<li>
<a href="connections.html">
<wa-icon name="plug"></wa-icon>
Connections
</a>
</li>
<li>
<a href="device.html">
<wa-icon name="mobile"></wa-icon>
Devices
</a>
</li>
<li>
<a href="service.html">
<wa-icon name="server"></wa-icon>
Services
</a>
</li>
<li>
<a href="settings.html">
<wa-icon name="gear"></wa-icon>
Settings
</a>
</li>
</ul>
</aside>
<main class="main-content">
<header class="page-header">
<div class="wa-flank">
<div class="wa-stack wa-gap-2xs">
<span class="wa-heading-xl">Transactions</span>
<span class="wa-caption-s" style="color: var(--wa-color-neutral-500);">Activity history across all connected accounts</span>
</div>
<div class="wa-cluster wa-gap-s">
<wa-button variant="neutral" appearance="outlined" size="small">
<wa-icon slot="start" name="arrow-down-to-line"></wa-icon>
Export
</wa-button>
</div>
</div>
</header>
<div class="wa-grid stats-grid">
<wa-card class="stat-card">
<div class="wa-stack wa-gap-3xs">
<span class="wa-caption-xs" style="color: var(--wa-color-neutral-500);">Total Received</span>
<span class="wa-heading-xl" style="color: var(--wa-color-success);">
+<wa-format-number type="currency" currency="USD" value="15420.50" lang="en-US"></wa-format-number>
</span>
<span class="wa-caption-xs" style="color: var(--wa-color-neutral-500);">42 transactions</span>
</div>
</wa-card>
<wa-card class="stat-card">
<div class="wa-stack wa-gap-3xs">
<span class="wa-caption-xs" style="color: var(--wa-color-neutral-500);">Total Sent</span>
<span class="wa-heading-xl" style="color: var(--wa-color-danger);">
-<wa-format-number type="currency" currency="USD" value="8234.18" lang="en-US"></wa-format-number>
</span>
<span class="wa-caption-xs" style="color: var(--wa-color-neutral-500);">28 transactions</span>
</div>
</wa-card>
<wa-card class="stat-card">
<div class="wa-stack wa-gap-3xs">
<span class="wa-caption-xs" style="color: var(--wa-color-neutral-500);">Swaps</span>
<span class="wa-heading-xl">12</span>
<span class="wa-caption-xs" style="color: var(--wa-color-neutral-500);">$4,892.00 volume</span>
</div>
</wa-card>
<wa-card class="stat-card">
<div class="wa-stack wa-gap-3xs">
<span class="wa-caption-xs" style="color: var(--wa-color-neutral-500);">Gas Spent</span>
<span class="wa-heading-xl">
<wa-format-number type="currency" currency="USD" value="127.45" lang="en-US"></wa-format-number>
</span>
<span class="wa-caption-xs" style="color: var(--wa-color-neutral-500);">All time</span>
</div>
</wa-card>
</div>
<wa-card>
<div class="filter-bar">
<wa-select placeholder="All Types" size="small" style="min-width: 140px;" clearable>
<wa-option value="send">
<wa-icon slot="prefix" name="arrow-up" style="color: var(--wa-color-danger);"></wa-icon>
Send
</wa-option>
<wa-option value="receive">
<wa-icon slot="prefix" name="arrow-down" style="color: var(--wa-color-success);"></wa-icon>
Receive
</wa-option>
<wa-option value="swap">
<wa-icon slot="prefix" name="arrow-right-arrow-left" style="color: var(--wa-color-primary);"></wa-icon>
Swap
</wa-option>
<wa-option value="approve">
<wa-icon slot="prefix" name="check"></wa-icon>
Approve
</wa-option>
<wa-option value="contract">
<wa-icon slot="prefix" name="file-code"></wa-icon>
Contract
</wa-option>
</wa-select>
<wa-select placeholder="All Assets" size="small" style="min-width: 140px;" clearable>
<wa-option value="eth">ETH</wa-option>
<wa-option value="snr">SNR</wa-option>
<wa-option value="usdc">USDC</wa-option>
<wa-option value="avax">AVAX</wa-option>
</wa-select>
<wa-select placeholder="All Accounts" size="small" style="min-width: 160px;" clearable>
<wa-option value="main">Main Wallet</wa-option>
<wa-option value="trading">Trading</wa-option>
<wa-option value="savings">Savings</wa-option>
</wa-select>
<wa-input type="date" size="small" style="width: 150px;" placeholder="From date"></wa-input>
<span style="color: var(--wa-color-neutral-400);"></span>
<wa-input type="date" size="small" style="width: 150px;" placeholder="To date"></wa-input>
<div style="flex: 1;"></div>
<wa-input placeholder="Search by hash or address..." size="small" style="width: 240px;">
<wa-icon slot="prefix" name="magnifying-glass"></wa-icon>
</wa-input>
</div>
<div class="date-group">
<div class="date-group-header">
<h3>Today</h3>
<span class="tx-count">3 transactions</span>
</div>
<div class="tx-row">
<div class="tx-icon receive">
<wa-icon name="arrow-down"></wa-icon>
</div>
<div class="tx-details">
<div class="tx-type">Received ETH</div>
<div class="tx-address">From: 0x742d...35Cb</div>
</div>
<div class="tx-asset">
<wa-avatar initials="E" style="--size: 24px; background: #627eea;"></wa-avatar>
<span>ETH</span>
</div>
<div class="tx-amount positive">
<div class="value">+0.25 ETH</div>
<div class="usd">$586.25</div>
</div>
<div class="tx-time">
<div class="time">2:34 PM</div>
<wa-badge variant="success" size="small">Confirmed</wa-badge>
</div>
<div class="tx-actions">
<wa-tooltip content="View on Explorer">
<wa-icon-button name="arrow-up-right-from-square" label="Explorer"></wa-icon-button>
</wa-tooltip>
<wa-copy-button value="0x8f4a2b1c9e3d5f7a0b2c4d6e8f0a1b3c5d7e9f0a1b2c3d4e5f6a7b8c9d0e1f2a" copy-label="Copy hash"></wa-copy-button>
</div>
</div>
<div class="tx-row">
<div class="tx-icon swap">
<wa-icon name="arrow-right-arrow-left"></wa-icon>
</div>
<div class="tx-details">
<div class="tx-type">Swapped SNR → USDC</div>
<div class="tx-address">via Uniswap V3</div>
</div>
<div class="tx-asset">
<wa-avatar initials="S" style="--size: 24px; background: linear-gradient(135deg, #17c2ff, #0090ff);"></wa-avatar>
<wa-icon name="arrow-right" style="font-size: 10px; color: var(--wa-color-neutral-400);"></wa-icon>
<wa-avatar initials="U" style="--size: 24px; background: #2775ca;"></wa-avatar>
</div>
<div class="tx-amount">
<div class="value">500 SNR → 248.50 USDC</div>
<div class="usd">$248.50</div>
</div>
<div class="tx-time">
<div class="time">11:22 AM</div>
<wa-badge variant="success" size="small">Confirmed</wa-badge>
</div>
<div class="tx-actions">
<wa-tooltip content="View on Explorer">
<wa-icon-button name="arrow-up-right-from-square" label="Explorer"></wa-icon-button>
</wa-tooltip>
<wa-copy-button value="0x7d3e2a1b8c4f6e0d9a5b7c3e1f8a2d4c6b0e9f7a1b2c3d4e5f6a7b8c9d0e1f2a" copy-label="Copy hash"></wa-copy-button>
</div>
</div>
<div class="tx-row">
<div class="tx-icon approve">
<wa-icon name="check"></wa-icon>
</div>
<div class="tx-details">
<div class="tx-type">Approved USDC</div>
<div class="tx-address">Spender: Uniswap V3 Router</div>
</div>
<div class="tx-asset">
<wa-avatar initials="U" style="--size: 24px; background: #2775ca;"></wa-avatar>
<span>USDC</span>
</div>
<div class="tx-amount">
<div class="value">Unlimited</div>
<div class="usd"></div>
</div>
<div class="tx-time">
<div class="time">11:20 AM</div>
<wa-badge variant="success" size="small">Confirmed</wa-badge>
</div>
<div class="tx-actions">
<wa-tooltip content="View on Explorer">
<wa-icon-button name="arrow-up-right-from-square" label="Explorer"></wa-icon-button>
</wa-tooltip>
<wa-copy-button value="0x1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b" copy-label="Copy hash"></wa-copy-button>
</div>
</div>
</div>
<div class="date-group">
<div class="date-group-header">
<h3>Yesterday</h3>
<span class="tx-count">2 transactions</span>
</div>
<div class="tx-row">
<div class="tx-icon send">
<wa-icon name="arrow-up"></wa-icon>
</div>
<div class="tx-details">
<div class="tx-type">Sent SNR</div>
<div class="tx-address">To: sonr1k4m...9p3q</div>
</div>
<div class="tx-asset">
<wa-avatar initials="S" style="--size: 24px; background: linear-gradient(135deg, #17c2ff, #0090ff);"></wa-avatar>
<span>SNR</span>
</div>
<div class="tx-amount negative">
<div class="value">-500 SNR</div>
<div class="usd">$250.00</div>
</div>
<div class="tx-time">
<div class="time">4:18 PM</div>
<wa-badge variant="success" size="small">Confirmed</wa-badge>
</div>
<div class="tx-actions">
<wa-tooltip content="View on Explorer">
<wa-icon-button name="arrow-up-right-from-square" label="Explorer"></wa-icon-button>
</wa-tooltip>
<wa-copy-button value="0x9f8e7d6c5b4a3f2e1d0c9b8a7f6e5d4c3b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e" copy-label="Copy hash"></wa-copy-button>
</div>
</div>
<div class="tx-row">
<div class="tx-icon receive">
<wa-icon name="arrow-down"></wa-icon>
</div>
<div class="tx-details">
<div class="tx-type">Received AVAX</div>
<div class="tx-address">From: 0xaBcD...1234</div>
</div>
<div class="tx-asset">
<wa-avatar initials="A" style="--size: 24px; background: #e84142;"></wa-avatar>
<span>AVAX</span>
</div>
<div class="tx-amount positive">
<div class="value">+10.00 AVAX</div>
<div class="usd">$281.50</div>
</div>
<div class="tx-time">
<div class="time">9:45 AM</div>
<wa-badge variant="success" size="small">Confirmed</wa-badge>
</div>
<div class="tx-actions">
<wa-tooltip content="View on Explorer">
<wa-icon-button name="arrow-up-right-from-square" label="Explorer"></wa-icon-button>
</wa-tooltip>
<wa-copy-button value="0x2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c" copy-label="Copy hash"></wa-copy-button>
</div>
</div>
</div>
<div class="date-group">
<div class="date-group-header">
<h3>January 1, 2026</h3>
<span class="tx-count">4 transactions</span>
</div>
<div class="tx-row">
<div class="tx-icon swap">
<wa-icon name="arrow-right-arrow-left"></wa-icon>
</div>
<div class="tx-details">
<div class="tx-type">Swapped ETH → USDC</div>
<div class="tx-address">via Uniswap V3</div>
</div>
<div class="tx-asset">
<wa-avatar initials="E" style="--size: 24px; background: #627eea;"></wa-avatar>
<wa-icon name="arrow-right" style="font-size: 10px; color: var(--wa-color-neutral-400);"></wa-icon>
<wa-avatar initials="U" style="--size: 24px; background: #2775ca;"></wa-avatar>
</div>
<div class="tx-amount">
<div class="value">0.5 ETH → 1,172.50 USDC</div>
<div class="usd">$1,172.50</div>
</div>
<div class="tx-time">
<div class="time">9:15 AM</div>
<wa-badge variant="success" size="small">Confirmed</wa-badge>
</div>
<div class="tx-actions">
<wa-tooltip content="View on Explorer">
<wa-icon-button name="arrow-up-right-from-square" label="Explorer"></wa-icon-button>
</wa-tooltip>
<wa-copy-button value="0x3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d" copy-label="Copy hash"></wa-copy-button>
</div>
</div>
<div class="tx-row">
<div class="tx-icon contract">
<wa-icon name="file-code"></wa-icon>
</div>
<div class="tx-details">
<div class="tx-type">Contract Interaction</div>
<div class="tx-address">Staking Contract: 0x5f3c...8a2b</div>
</div>
<div class="tx-asset">
<wa-avatar initials="S" style="--size: 24px; background: linear-gradient(135deg, #17c2ff, #0090ff);"></wa-avatar>
<span>SNR</span>
</div>
<div class="tx-amount negative">
<div class="value">-1,000 SNR</div>
<div class="usd">$500.00 staked</div>
</div>
<div class="tx-time">
<div class="time">8:30 AM</div>
<wa-badge variant="success" size="small">Confirmed</wa-badge>
</div>
<div class="tx-actions">
<wa-tooltip content="View on Explorer">
<wa-icon-button name="arrow-up-right-from-square" label="Explorer"></wa-icon-button>
</wa-tooltip>
<wa-copy-button value="0x4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e" copy-label="Copy hash"></wa-copy-button>
</div>
</div>
<div class="tx-row">
<div class="tx-icon send">
<wa-icon name="arrow-up"></wa-icon>
</div>
<div class="tx-details">
<div class="tx-type">Sent ETH</div>
<div class="tx-address">To: 0x9f8e...7d6c</div>
</div>
<div class="tx-asset">
<wa-avatar initials="E" style="--size: 24px; background: #627eea;"></wa-avatar>
<span>ETH</span>
</div>
<div class="tx-amount negative">
<div class="value">-0.15 ETH</div>
<div class="usd">$351.85</div>
</div>
<div class="tx-time">
<div class="time">7:22 AM</div>
<wa-badge variant="success" size="small">Confirmed</wa-badge>
</div>
<div class="tx-actions">
<wa-tooltip content="View on Explorer">
<wa-icon-button name="arrow-up-right-from-square" label="Explorer"></wa-icon-button>
</wa-tooltip>
<wa-copy-button value="0x5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f" copy-label="Copy hash"></wa-copy-button>
</div>
</div>
<div class="tx-row">
<div class="tx-icon receive">
<wa-icon name="arrow-down"></wa-icon>
</div>
<div class="tx-details">
<div class="tx-type">Received SNR</div>
<div class="tx-address">From: sonr1abc...xyz9 (Airdrop)</div>
</div>
<div class="tx-asset">
<wa-avatar initials="S" style="--size: 24px; background: linear-gradient(135deg, #17c2ff, #0090ff);"></wa-avatar>
<span>SNR</span>
</div>
<div class="tx-amount positive">
<div class="value">+2,500 SNR</div>
<div class="usd">$1,250.00</div>
</div>
<div class="tx-time">
<div class="time">12:00 AM</div>
<wa-badge variant="success" size="small">Confirmed</wa-badge>
</div>
<div class="tx-actions">
<wa-tooltip content="View on Explorer">
<wa-icon-button name="arrow-up-right-from-square" label="Explorer"></wa-icon-button>
</wa-tooltip>
<wa-copy-button value="0x6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a" copy-label="Copy hash"></wa-copy-button>
</div>
</div>
</div>
<div class="date-group">
<div class="date-group-header">
<h3>December 30, 2025</h3>
<span class="tx-count">1 transaction</span>
</div>
<div class="tx-row">
<div class="tx-icon receive">
<wa-icon name="arrow-down"></wa-icon>
</div>
<div class="tx-details">
<div class="tx-type">Received AVAX</div>
<div class="tx-address">From: 0xfEdC...bA98</div>
</div>
<div class="tx-asset">
<wa-avatar initials="A" style="--size: 24px; background: #e84142;"></wa-avatar>
<span>AVAX</span>
</div>
<div class="tx-amount positive">
<div class="value">+14.83 AVAX</div>
<div class="usd">$417.53</div>
</div>
<div class="tx-time">
<div class="time">4:48 PM</div>
<wa-badge variant="success" size="small">Confirmed</wa-badge>
</div>
<div class="tx-actions">
<wa-tooltip content="View on Explorer">
<wa-icon-button name="arrow-up-right-from-square" label="Explorer"></wa-icon-button>
</wa-tooltip>
<wa-copy-button value="0x7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b" copy-label="Copy hash"></wa-copy-button>
</div>
</div>
</div>
<div class="pagination">
<div class="pagination-info">
Showing <strong>1-10</strong> of <strong>82</strong> transactions
</div>
<div class="pagination-controls">
<wa-select value="10" size="small" style="width: 100px;">
<wa-option value="10">10 / page</wa-option>
<wa-option value="25">25 / page</wa-option>
<wa-option value="50">50 / page</wa-option>
<wa-option value="100">100 / page</wa-option>
</wa-select>
<div class="page-numbers">
<button class="page-btn" disabled>
<wa-icon name="chevron-left"></wa-icon>
</button>
<button class="page-btn active">1</button>
<button class="page-btn">2</button>
<button class="page-btn">3</button>
<span style="padding: 0 var(--wa-space-xs); color: var(--wa-color-neutral-400);">...</span>
<button class="page-btn">9</button>
<button class="page-btn">
<wa-icon name="chevron-right"></wa-icon>
</button>
</div>
</div>
</div>
</wa-card>
</main>
</div>
</wa-page>
<script>
document.querySelectorAll('.page-btn:not(:disabled)').forEach(btn => {
btn.addEventListener('click', function() {
document.querySelectorAll('.page-btn').forEach(b => b.classList.remove('active'));
if (!this.querySelector('wa-icon')) {
this.classList.add('active');
}
});
});
document.querySelectorAll('.sidebar-nav a').forEach(link => {
link.addEventListener('click', function(e) {
if (this.getAttribute('href') === '#') {
e.preventDefault();
}
});
});
</script>
</body>
</html>