Files
nebula/_migrate/connections.html

861 lines
33 KiB
HTML
Raw Permalink Normal View History

<!DOCTYPE html>
<!--
================================================================================
TEMPL MIGRATION GUIDE: connections.html → views/connections.templ
================================================================================
PAGE OVERVIEW:
- Connected apps management with detailed analytics cards
- Stats: Connected Apps count, Signatures (30d), Transactions (30d), Last Activity
- App cards showing session activity %, signatures, permission usage, scopes
- Manage dialog for editing permissions
- Disconnect confirmation dialog
MAIN TEMPL COMPONENT:
templ ConnectionsPage(data ConnectionsData) {
@layouts.DashboardLayout("connections") {
@PageHeader("Connections", "Manage applications connected to your wallet")
@ConnectionsStatsGrid(data.Stats)
@ConnectedAppsGrid(data.Apps)
}
@ManageConnectionDialog()
@DisconnectConfirmDialog()
}
HTMX INTEGRATION:
- Disconnect app: hx-delete="/api/connections/{app.ID}" hx-target="closest .app-card" hx-swap="delete"
- Manage dialog: hx-get="/connections/{app.ID}/manage" hx-target="#manage-dialog-content"
- Update permissions: hx-post="/api/connections/{app.ID}/permissions" hx-include="[name^='scope-']"
- Revoke OAuth client: hx-delete="/api/oauth/clients/{clientID}" hx-target="closest .oauth-client-card"
- Stats refresh: hx-get="/api/connections/stats" hx-trigger="every 60s" hx-target="#stats-grid"
SUB-COMPONENTS TO EXTRACT:
- ConnectionsStatsGrid(stats ConnectionStats)
- ConnectedAppsGrid(apps []ConnectedApp)
- ConnectedAppCard(app ConnectedApp)
- AppHeader(app AppInfo, showDetails bool)
- SessionActivityRing(percent int, trend string, trendValue string)
- SignatureCount(count int, status string)
- PermissionUsage(used int, total int)
- AppMetadata(connectedAt time.Time, lastUsed time.Time, txCount int)
- ScopeTagList(scopes []Scope)
- ScopeTag(scope Scope)
- ManageConnectionDialog(app ConnectedApp)
- PermissionCheckbox(scope Scope, enabled bool)
- DisconnectConfirmDialog(appName string)
STATE/PROPS:
type ConnectionsData struct {
Stats ConnectionStats
Apps []ConnectedApp
}
type ConnectionStats struct {
ConnectedApps int
Signatures30d int
Transactions30d int
LastActivity time.Time
}
type ConnectedApp struct {
ID string
Name string
Domain string
LogoColor string
IconName string
IsVerified bool
SessionActivity int // Percentage
ActivityTrend string // "up", "down"
TrendValue string // "+15%", "-5%"
SignatureCount int
Status string // "active", "idle"
PermissionsUsed int
PermissionsTotal int
ConnectedAt time.Time
LastUsed time.Time
TxApproved int
Scopes []Scope
}
type Scope struct {
Name string // "wallet:read", "wallet:sign", etc.
Type string // "read", "write", "sign"
Description string
Enabled bool
}
HTMX PATTERNS:
// App card with expand/manage
<wa-button hx-get="/connections/{app.ID}/manage"
hx-target="#manage-dialog-content"
hx-swap="innerHTML"
onclick="document.getElementById('manage-dialog').open = true">
// Disconnect with confirmation
<wa-button hx-delete="/api/connections/{app.ID}"
hx-target="closest .app-card"
hx-swap="delete"
hx-confirm="Disconnect {app.Name}?">
// Permission toggle in manage dialog
<wa-checkbox hx-post="/api/connections/{app.ID}/scopes"
hx-include="this"
hx-target="#permission-status"
name="scope-wallet:read">
// Revoke all permissions (disconnect via dialog)
<wa-button hx-delete="/api/connections/{app.ID}"
hx-target="#manage-dialog"
hx-swap="innerHTML"
hx-on::after-request="document.getElementById('manage-dialog').open = false">
// Activity stats auto-refresh
<div id="stats-grid"
hx-get="/api/connections/stats"
hx-trigger="every 60s"
hx-swap="innerHTML">
================================================================================
-->
<html lang="en" class="wa-cloak">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Connections - 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);
}
.apps-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: var(--wa-space-l);
}
@media (max-width: 1200px) {
.apps-grid {
grid-template-columns: 1fr;
}
}
.app-card {
background: var(--wa-color-surface);
}
.app-header {
display: flex;
align-items: center;
gap: var(--wa-space-m);
}
.app-logo {
width: 48px;
height: 48px;
border-radius: var(--wa-radius-m);
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.app-name-row {
display: flex;
align-items: center;
gap: var(--wa-space-2xs);
}
.verified-badge {
color: var(--wa-color-primary);
}
.scope-tag {
display: inline-flex;
align-items: center;
gap: var(--wa-space-2xs);
padding: var(--wa-space-2xs) var(--wa-space-xs);
background: var(--wa-color-surface-alt);
border-radius: var(--wa-radius-s);
font-size: var(--wa-font-size-xs);
color: var(--wa-color-neutral-600);
}
.scope-tag.read {
background: var(--wa-color-success-subtle);
color: var(--wa-color-success);
}
.scope-tag.write {
background: var(--wa-color-warning-subtle);
color: var(--wa-color-warning);
}
.scope-tag.sign {
background: var(--wa-color-primary-subtle);
color: var(--wa-color-primary);
}
.empty-state {
text-align: center;
padding: var(--wa-space-3xl) var(--wa-space-xl);
color: var(--wa-color-neutral-500);
}
.stats-grid {
--min-column-size: 220px;
margin-bottom: var(--wa-space-xl);
}
.stat-card {
background: var(--wa-color-surface);
}
</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">
<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" class="active">
<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">Connections</span>
<span class="wa-caption-s" style="color: var(--wa-color-neutral-500);">Manage applications connected to your wallet</span>
</div>
<wa-button variant="neutral" appearance="outlined" size="small">
<wa-icon slot="start" name="shield-check"></wa-icon>
Security Settings
</wa-button>
</div>
</header>
<div class="wa-grid stats-grid">
<wa-card class="stat-card">
<div class="wa-flank">
<wa-avatar shape="rounded" style="background: var(--wa-color-primary-subtle);">
<wa-icon slot="icon" name="plug" style="color: var(--wa-color-primary);"></wa-icon>
</wa-avatar>
<div class="wa-stack wa-gap-3xs">
<span class="wa-caption-xs" style="color: var(--wa-color-neutral-500);">Connected Apps</span>
<span class="wa-heading-2xl">4</span>
</div>
</div>
</wa-card>
<wa-card class="stat-card">
<div class="wa-flank">
<wa-avatar shape="rounded" style="background: var(--wa-color-success-subtle);">
<wa-icon slot="icon" name="signature" style="color: var(--wa-color-success);"></wa-icon>
</wa-avatar>
<div class="wa-stack wa-gap-3xs">
<span class="wa-caption-xs" style="color: var(--wa-color-neutral-500);">Signatures (30d)</span>
<span class="wa-heading-2xl">47</span>
</div>
</div>
</wa-card>
<wa-card class="stat-card">
<div class="wa-flank">
<wa-avatar shape="rounded" style="background: var(--wa-color-warning-subtle);">
<wa-icon slot="icon" name="paper-plane" style="color: var(--wa-color-warning);"></wa-icon>
</wa-avatar>
<div class="wa-stack wa-gap-3xs">
<span class="wa-caption-xs" style="color: var(--wa-color-neutral-500);">Transactions (30d)</span>
<span class="wa-heading-2xl">12</span>
</div>
</div>
</wa-card>
<wa-card class="stat-card">
<div class="wa-flank">
<wa-avatar shape="rounded" style="background: var(--wa-color-neutral-100);">
<wa-icon slot="icon" name="clock" style="color: var(--wa-color-neutral-600);"></wa-icon>
</wa-avatar>
<div class="wa-stack wa-gap-3xs">
<span class="wa-caption-xs" style="color: var(--wa-color-neutral-500);">Last Activity</span>
<span class="wa-heading-2xl">2h ago</span>
</div>
</div>
</wa-card>
</div>
<div class="apps-grid">
<wa-card class="app-card" style="max-width: 100%;">
<div slot="header" class="wa-split">
<div class="app-header">
<div class="app-logo" style="background: linear-gradient(135deg, #ff007a, #ff5ca0);">
<wa-icon name="arrows-rotate" style="color: white; font-size: 24px;"></wa-icon>
</div>
<div class="wa-stack wa-gap-0">
<div class="app-name-row">
<h3 class="wa-heading-l">Uniswap</h3>
<wa-icon name="badge-check" variant="solid" class="verified-badge"></wa-icon>
</div>
<span class="wa-caption-s" style="color: var(--wa-color-neutral-500);">app.uniswap.org</span>
</div>
</div>
<wa-button appearance="plain" size="small">
<wa-icon id="uniswap-btn" name="chevron-right" label="View Details"></wa-icon>
</wa-button>
<wa-tooltip for="uniswap-btn">View Details</wa-tooltip>
</div>
<div class="wa-stack wa-gap-xl">
<div class="wa-split wa-align-items-stretch">
<article class="wa-stack wa-align-items-start wa-gap-xs">
<h4 class="wa-caption-m">Session Activity</h4>
<div class="wa-cluster wa-heading-3xl">
<wa-progress-ring value="78" style="--size: 1em; --track-width: 0.125em"></wa-progress-ring>
<span>78%</span>
</div>
<wa-badge appearance="filled outlined" variant="success">
<wa-icon name="arrow-up"></wa-icon> up from 65%
</wa-badge>
</article>
<article class="wa-stack wa-gap-xs wa-align-items-end">
<h4 class="wa-caption-m">Total Signatures</h4>
<span class="wa-heading-3xl">23</span>
<wa-badge appearance="filled outlined" variant="success">
<wa-icon name="sparkles"></wa-icon> Active
</wa-badge>
</article>
</div>
<wa-divider></wa-divider>
<article class="wa-stack wa-gap-xl">
<div class="wa-stack wa-gap-xs">
<h4 class="wa-caption-m">Permission Usage</h4>
<div class="wa-split">
<span class="wa-heading-3xl">3</span>
<span class="wa-caption-l">of 4 scopes</span>
</div>
<wa-progress-bar value="75" label="Permissions used"></wa-progress-bar>
</div>
<dl class="wa-stack wa-caption-s">
<div class="wa-cluster">
<dt>Connected</dt>
<dd>Dec 15, 2025</dd>
</div>
<div class="wa-cluster">
<dt>Last Used</dt>
<dd>2 hours ago</dd>
</div>
<div class="wa-cluster">
<dt>Transactions</dt>
<dd>8 approved</dd>
</div>
</dl>
</article>
<div class="wa-cluster wa-gap-xs" style="flex-wrap: wrap;">
<span class="scope-tag read"><wa-icon name="eye" style="font-size: 12px;"></wa-icon> wallet:read</span>
<span class="scope-tag sign"><wa-icon name="pen-nib" style="font-size: 12px;"></wa-icon> wallet:sign</span>
<span class="scope-tag write"><wa-icon name="paper-plane" style="font-size: 12px;"></wa-icon> wallet:transact</span>
</div>
</div>
<div slot="footer" class="wa-cluster wa-gap-s" style="justify-content: flex-end;">
<wa-button variant="danger" appearance="plain" size="small">Disconnect</wa-button>
<wa-button variant="neutral" appearance="outlined" size="small">Manage</wa-button>
</div>
</wa-card>
<wa-card class="app-card" style="max-width: 100%;">
<div slot="header" class="wa-split">
<div class="app-header">
<div class="app-logo" style="background: linear-gradient(135deg, #627eea, #4c63d2);">
<wa-icon name="sailboat" style="color: white; font-size: 24px;"></wa-icon>
</div>
<div class="wa-stack wa-gap-0">
<div class="app-name-row">
<h3 class="wa-heading-l">OpenSea</h3>
<wa-icon name="badge-check" variant="solid" class="verified-badge"></wa-icon>
</div>
<span class="wa-caption-s" style="color: var(--wa-color-neutral-500);">opensea.io</span>
</div>
</div>
<wa-button appearance="plain" size="small">
<wa-icon id="opensea-btn" name="chevron-right" label="View Details"></wa-icon>
</wa-button>
<wa-tooltip for="opensea-btn">View Details</wa-tooltip>
</div>
<div class="wa-stack wa-gap-xl">
<div class="wa-split wa-align-items-stretch">
<article class="wa-stack wa-align-items-start wa-gap-xs">
<h4 class="wa-caption-m">Session Activity</h4>
<div class="wa-cluster wa-heading-3xl">
<wa-progress-ring value="45" style="--size: 1em; --track-width: 0.125em"></wa-progress-ring>
<span>45%</span>
</div>
<wa-badge appearance="filled outlined" variant="danger">
<wa-icon name="arrow-down"></wa-icon> down from 62%
</wa-badge>
</article>
<article class="wa-stack wa-gap-xs wa-align-items-end">
<h4 class="wa-caption-m">Total Signatures</h4>
<span class="wa-heading-3xl">15</span>
<wa-badge appearance="filled outlined" variant="neutral">
<wa-icon name="clock"></wa-icon> Idle
</wa-badge>
</article>
</div>
<wa-divider></wa-divider>
<article class="wa-stack wa-gap-xl">
<div class="wa-stack wa-gap-xs">
<h4 class="wa-caption-m">Permission Usage</h4>
<div class="wa-split">
<span class="wa-heading-3xl">2</span>
<span class="wa-caption-l">of 3 scopes</span>
</div>
<wa-progress-bar value="66" label="Permissions used"></wa-progress-bar>
</div>
<dl class="wa-stack wa-caption-s">
<div class="wa-cluster">
<dt>Connected</dt>
<dd>Nov 28, 2025</dd>
</div>
<div class="wa-cluster">
<dt>Last Used</dt>
<dd>3 days ago</dd>
</div>
<div class="wa-cluster">
<dt>Transactions</dt>
<dd>2 approved</dd>
</div>
</dl>
</article>
<div class="wa-cluster wa-gap-xs" style="flex-wrap: wrap;">
<span class="scope-tag read"><wa-icon name="eye" style="font-size: 12px;"></wa-icon> wallet:read</span>
<span class="scope-tag sign"><wa-icon name="pen-nib" style="font-size: 12px;"></wa-icon> wallet:sign</span>
</div>
</div>
<div slot="footer" class="wa-cluster wa-gap-s" style="justify-content: flex-end;">
<wa-button variant="danger" appearance="plain" size="small">Disconnect</wa-button>
<wa-button variant="neutral" appearance="outlined" size="small">Manage</wa-button>
</div>
</wa-card>
<wa-card class="app-card" style="max-width: 100%;">
<div slot="header" class="wa-split">
<div class="app-header">
<div class="app-logo" style="background: linear-gradient(135deg, #1db954, #169c46);">
<wa-icon name="leaf" style="color: white; font-size: 24px;"></wa-icon>
</div>
<div class="wa-stack wa-gap-0">
<div class="app-name-row">
<h3 class="wa-heading-l">Aave</h3>
<wa-icon name="badge-check" variant="solid" class="verified-badge"></wa-icon>
</div>
<span class="wa-caption-s" style="color: var(--wa-color-neutral-500);">app.aave.com</span>
</div>
</div>
<wa-button appearance="plain" size="small">
<wa-icon id="aave-btn" name="chevron-right" label="View Details"></wa-icon>
</wa-button>
<wa-tooltip for="aave-btn">View Details</wa-tooltip>
</div>
<div class="wa-stack wa-gap-xl">
<div class="wa-split wa-align-items-stretch">
<article class="wa-stack wa-align-items-start wa-gap-xs">
<h4 class="wa-caption-m">Session Activity</h4>
<div class="wa-cluster wa-heading-3xl">
<wa-progress-ring value="92" style="--size: 1em; --track-width: 0.125em"></wa-progress-ring>
<span>92%</span>
</div>
<wa-badge appearance="filled outlined" variant="success">
<wa-icon name="arrow-up"></wa-icon> up from 88%
</wa-badge>
</article>
<article class="wa-stack wa-gap-xs wa-align-items-end">
<h4 class="wa-caption-m">Total Signatures</h4>
<span class="wa-heading-3xl">5</span>
<wa-badge appearance="filled outlined" variant="success">
<wa-icon name="sparkles"></wa-icon> Active
</wa-badge>
</article>
</div>
<wa-divider></wa-divider>
<article class="wa-stack wa-gap-xl">
<div class="wa-stack wa-gap-xs">
<h4 class="wa-caption-m">Permission Usage</h4>
<div class="wa-split">
<span class="wa-heading-3xl">4</span>
<span class="wa-caption-l">of 4 scopes</span>
</div>
<wa-progress-bar value="100" label="Permissions used"></wa-progress-bar>
</div>
<dl class="wa-stack wa-caption-s">
<div class="wa-cluster">
<dt>Connected</dt>
<dd>Jan 2, 2026</dd>
</div>
<div class="wa-cluster">
<dt>Last Used</dt>
<dd>1 hour ago</dd>
</div>
<div class="wa-cluster">
<dt>Transactions</dt>
<dd>2 approved</dd>
</div>
</dl>
</article>
<div class="wa-cluster wa-gap-xs" style="flex-wrap: wrap;">
<span class="scope-tag read"><wa-icon name="eye" style="font-size: 12px;"></wa-icon> wallet:read</span>
<span class="scope-tag read"><wa-icon name="user" style="font-size: 12px;"></wa-icon> profile</span>
<span class="scope-tag sign"><wa-icon name="pen-nib" style="font-size: 12px;"></wa-icon> wallet:sign</span>
<span class="scope-tag write"><wa-icon name="paper-plane" style="font-size: 12px;"></wa-icon> wallet:transact</span>
</div>
</div>
<div slot="footer" class="wa-cluster wa-gap-s" style="justify-content: flex-end;">
<wa-button variant="danger" appearance="plain" size="small">Disconnect</wa-button>
<wa-button variant="neutral" appearance="outlined" size="small">Manage</wa-button>
</div>
</wa-card>
<wa-card class="app-card" style="max-width: 100%;">
<div slot="header" class="wa-split">
<div class="app-header">
<div class="app-logo" style="background: linear-gradient(135deg, #f7931a, #ff9500);">
<wa-icon name="cube" style="color: white; font-size: 24px;"></wa-icon>
</div>
<div class="wa-stack wa-gap-0">
<div class="app-name-row">
<h3 class="wa-heading-l">Example DApp</h3>
</div>
<span class="wa-caption-s" style="color: var(--wa-color-neutral-500);">example-dapp.io</span>
</div>
</div>
<wa-button appearance="plain" size="small">
<wa-icon id="example-btn" name="chevron-right" label="View Details"></wa-icon>
</wa-button>
<wa-tooltip for="example-btn">View Details</wa-tooltip>
</div>
<div class="wa-stack wa-gap-xl">
<div class="wa-split wa-align-items-stretch">
<article class="wa-stack wa-align-items-start wa-gap-xs">
<h4 class="wa-caption-m">Session Activity</h4>
<div class="wa-cluster wa-heading-3xl">
<wa-progress-ring value="12" style="--size: 1em; --track-width: 0.125em"></wa-progress-ring>
<span>12%</span>
</div>
<wa-badge appearance="filled outlined" variant="danger">
<wa-icon name="arrow-down"></wa-icon> down from 35%
</wa-badge>
</article>
<article class="wa-stack wa-gap-xs wa-align-items-end">
<h4 class="wa-caption-m">Total Signatures</h4>
<span class="wa-heading-3xl">4</span>
<wa-badge appearance="filled outlined" variant="warning">
<wa-icon name="triangle-alert"></wa-icon> Unverified
</wa-badge>
</article>
</div>
<wa-divider></wa-divider>
<article class="wa-stack wa-gap-xl">
<div class="wa-stack wa-gap-xs">
<h4 class="wa-caption-m">Permission Usage</h4>
<div class="wa-split">
<span class="wa-heading-3xl">1</span>
<span class="wa-caption-l">of 2 scopes</span>
</div>
<wa-progress-bar value="50" label="Permissions used"></wa-progress-bar>
</div>
<dl class="wa-stack wa-caption-s">
<div class="wa-cluster">
<dt>Connected</dt>
<dd>Dec 20, 2025</dd>
</div>
<div class="wa-cluster">
<dt>Last Used</dt>
<dd>2 weeks ago</dd>
</div>
<div class="wa-cluster">
<dt>Transactions</dt>
<dd>0 approved</dd>
</div>
</dl>
</article>
<div class="wa-cluster wa-gap-xs" style="flex-wrap: wrap;">
<span class="scope-tag read"><wa-icon name="eye" style="font-size: 12px;"></wa-icon> wallet:read</span>
<span class="scope-tag sign"><wa-icon name="pen-nib" style="font-size: 12px;"></wa-icon> wallet:sign</span>
</div>
</div>
<div slot="footer" class="wa-cluster wa-gap-s" style="justify-content: flex-end;">
<wa-button variant="danger" appearance="plain" size="small">Disconnect</wa-button>
<wa-button variant="neutral" appearance="outlined" size="small">Manage</wa-button>
</div>
</wa-card>
</div>
</main>
</div>
<wa-dialog label="Manage Connection" id="manage-dialog" style="--width: 480px;">
<div class="wa-stack wa-gap-l">
<div class="app-header" style="padding: var(--wa-space-m); background: var(--wa-color-surface-alt); border-radius: var(--wa-radius-m);">
<div class="app-logo" style="background: linear-gradient(135deg, #ff007a, #ff5ca0);">
<wa-icon name="arrows-rotate" style="color: white; font-size: 24px;"></wa-icon>
</div>
<div class="wa-stack wa-gap-0">
<div class="app-name-row">
<span class="wa-heading-m">Uniswap</span>
<wa-icon name="badge-check" variant="solid" class="verified-badge"></wa-icon>
</div>
<span class="wa-caption-s" style="color: var(--wa-color-neutral-500);">app.uniswap.org</span>
</div>
</div>
<div class="wa-stack wa-gap-s">
<span class="wa-heading-s">Permissions</span>
<wa-checkbox checked>
<div class="wa-stack wa-gap-0">
<span>View wallet address</span>
<span class="wa-caption-s" style="color: var(--wa-color-neutral-500);">wallet:read</span>
</div>
</wa-checkbox>
<wa-checkbox checked>
<div class="wa-stack wa-gap-0">
<span>Request signatures</span>
<span class="wa-caption-s" style="color: var(--wa-color-neutral-500);">wallet:sign</span>
</div>
</wa-checkbox>
<wa-checkbox checked>
<div class="wa-stack wa-gap-0">
<span>Request transactions</span>
<span class="wa-caption-s" style="color: var(--wa-color-neutral-500);">wallet:transact</span>
</div>
</wa-checkbox>
</div>
<wa-callout variant="neutral">
<wa-icon slot="icon" name="circle-info"></wa-icon>
<span class="wa-caption-s">Changes will take effect immediately. The app may need to reconnect.</span>
</wa-callout>
</div>
<div slot="footer" class="wa-flank" style="width: 100%;">
<wa-button variant="danger" appearance="outlined">
<wa-icon slot="start" name="plug"></wa-icon>
Disconnect
</wa-button>
<div style="flex: 1;"></div>
<wa-button variant="neutral" appearance="outlined" data-dialog="close">Cancel</wa-button>
<wa-button variant="brand">Save Changes</wa-button>
</div>
</wa-dialog>
<wa-dialog label="Disconnect App" id="disconnect-dialog" style="--width: 400px;">
<div class="wa-stack wa-gap-l" style="text-align: center;">
<wa-icon name="plug" style="font-size: 48px; color: var(--wa-color-danger);"></wa-icon>
<div class="wa-stack wa-gap-xs">
<span class="wa-heading-m">Disconnect Uniswap?</span>
<span class="wa-caption-m" style="color: var(--wa-color-neutral-500);">
This will revoke all permissions. You'll need to reconnect to use the app with your wallet.
</span>
</div>
</div>
<div slot="footer" class="wa-cluster wa-gap-s" style="justify-content: center; width: 100%;">
<wa-button variant="neutral" appearance="outlined" data-dialog="close">Cancel</wa-button>
<wa-button variant="danger">Disconnect</wa-button>
</div>
</wa-dialog>
</wa-page>
<script>
const manageDialog = document.getElementById('manage-dialog');
const disconnectDialog = document.getElementById('disconnect-dialog');
document.querySelectorAll('wa-button[variant="neutral"][appearance="outlined"]').forEach(btn => {
if (btn.textContent.trim() === 'Manage') {
btn.addEventListener('click', () => {
manageDialog.open = true;
});
}
});
document.querySelectorAll('wa-button[variant="danger"][appearance="plain"]').forEach(btn => {
if (btn.textContent.trim() === 'Disconnect') {
btn.addEventListener('click', () => {
disconnectDialog.open = true;
});
}
});
document.querySelectorAll('.sidebar-nav a').forEach(link => {
link.addEventListener('click', function(e) {
if (this.getAttribute('href') === '#') {
e.preventDefault();
}
document.querySelectorAll('.sidebar-nav a').forEach(l => l.classList.remove('active'));
this.classList.add('active');
});
});
</script>
</body>
</html>